diff --git a/client/dist/assets/css/app.062c7a27.css b/client/dist/assets/css/app.0d94d05f.css similarity index 80% rename from client/dist/assets/css/app.062c7a27.css rename to client/dist/assets/css/app.0d94d05f.css index e185e2d0..f5593dc6 100644 --- a/client/dist/assets/css/app.062c7a27.css +++ b/client/dist/assets/css/app.0d94d05f.css @@ -1 +1 @@ -@font-face{font-family:Noto Sans JP Caption;font-weight:400;src:url(https://cdn.jsdelivr.net/npm/noto-sans-japanese@1.0.0/fonts/NotoSansJP-Medium.woff2) format("woff2")}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v34/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4uaVIGxA.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v34/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVI.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:700;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:700;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}html{overflow-y:auto!important;touch-action:manipulation}body .v-application{min-height:100vh;min-height:100dvh;font-family:YakuHanJPs,Open Sans,Hiragino Sans,Noto Sans JP,sans-serif;font-weight:500;overflow-x:clip;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@supports(-webkit-touch-callout:none){body .v-application{min-height:-webkit-fill-available;font-family:YakuHanJPs,"Open Sans (for iOS Safari)",Hiragino Sans,Noto Sans JP,sans-serif;font-weight:400}}body .v-application .v-application--wrap{min-height:100%!important}body main{display:flex;width:100%;min-height:100%}body header+main{padding-top:65px!important}@media(max-width:1000px)and (max-height:450px){body header+main{padding-top:0!important;padding-left:env(safe-area-inset-left)!important;padding-right:env(safe-area-inset-right)!important}}@media(max-width:600px)and (min-height:450.01px){body header+main{padding-top:0!important;padding-bottom:calc(env(safe-area-inset-bottom) + 56px)!important}}body .route-container{height:100%;background:var(--v-background-base)}.v-btn{letter-spacing:0!important;text-transform:none!important}@media(max-width:600px)and (min-height:450.01px){.v-snack{padding-bottom:56px!important}}.v-snack .v-btn__content{color:var(--v-primary-lighten1);letter-spacing:.3}.v-snack .error .v-btn__content,.v-snack .info .v-btn__content,.v-snack .success .v-btn__content,.v-snack .warning .v-btn__content{color:var(--v-text-base);letter-spacing:.3}.v-snack:not(.v-snack--absolute){height:100dvh!important}@media(max-width:600px)and (min-height:450.01px){.v-dialog{margin:24px 6px!important}.v-dialog--fullscreen{margin:0!important}}.v-popper--theme-tooltip .v-popper__inner{display:inline-block;padding:4px 10px;border-radius:4px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:12px;font-family:YakuHanJPs,Open Sans,Hiragino Sans,Noto Sans JP,sans-serif;font-weight:500;opacity:.9;line-height:22px}.v-popper--theme-tooltip .v-popper__arrow-container{display:none}@media(hover:none){:hover:before{background-color:transparent!important}}::-moz-selection{background-color:#e64f9780}::selection{background-color:#e64f9780}.decorate-symbol{display:inline-flex;justify-content:center;align-items:center;position:relative;padding:0 3px;margin-left:2.5px;margin-right:2.5px;border-radius:4px;color:var(--v-text-base);background:var(--v-primary-base);font-size:.94em}*{scrollbar-color:var(--v-gray-base) var(--v-background-base);scrollbar-width:thin}::-webkit-scrollbar{width:7px;height:7px}::-webkit-scrollbar-track{background:var(--v-background-base)}::-webkit-scrollbar-thumb{background:var(--v-background-lighten2)}::-webkit-scrollbar-thumb:hover{background:var(--v-gray-base)}@media(max-width:600px)and (min-height:450.01px){.v-menu__content .v-list{background-color:var(--v-background-lighten1)!important}}.v-menu__content::-webkit-scrollbar{width:12px;height:12px}.v-menu__content::-webkit-scrollbar-thumb{border:solid 3.5px var(--v-background-base)}.v-card__text{font-weight:inherit!important}.v-enter-active,.v-leave-active{transition:opacity .25s}.v-enter,.v-leave-to{opacity:0}.v-enter-active.route-container{position:fixed;top:0;left:0;right:0}.cursor-pointer{cursor:pointer}.w-25{width:25%}.w-50{width:50%}.w-75{width:75%}.w-100{width:100%}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.header[data-v-84897154]{position:fixed;display:flex;align-items:center;width:100%;height:65px;padding:4px 16px;background:var(--v-background-base);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);z-index:10}@media(max-width:1000px)and (max-height:450px){.header[data-v-84897154]{width:210px;height:48px;justify-content:center}}@media(max-width:680px)and (max-height:450px){.header[data-v-84897154]{width:190px}}@media(max-width:600px)and (min-height:450.01px){.header[data-v-84897154]{display:none}}@media(max-width:1000px)and (max-height:450px){.header .spacer[data-v-84897154]{display:none}}.header .konomitv-logo[data-v-84897154]{display:block;padding:12px 8px;border-radius:8px}@media(max-width:1000px)and (max-height:450px){.header .konomitv-logo[data-v-84897154]{margin:0!important}}.header .konomitv-logo__image[data-v-84897154]{display:block}@media(max-width:1000px)and (max-height:450px){.header .konomitv-logo__image[data-v-84897154]{height:19.5px}}.bottom-navigation-container[data-v-3df53df3]{display:none;position:fixed;bottom:0;z-index:8}@media(max-width:600px)and (min-height:450.01px){.bottom-navigation-container[data-v-3df53df3]{display:flex;padding-bottom:env(safe-area-inset-bottom);box-sizing:content-box}}.bottom-navigation-container .v-btn.bottom-navigation-button[data-v-3df53df3]{color:var(--v-text-darken1)!important;font-weight:700}.bottom-navigation-container .v-btn.bottom-navigation-button.v-btn--active[data-v-3df53df3]{color:var(--v-primary-base)!important}.navigation-container[data-v-5b40940b]{flex-shrink:0;width:220px;background:var(--v-background-lighten1)}@media(max-width:1000px)and (max-height:450px){.navigation-container[data-v-5b40940b]{width:210px}}@media(max-width:680px)and (max-height:450px){.navigation-container[data-v-5b40940b]{width:190px}}@media(max-width:600px)and (min-height:450.01px){.navigation-container[data-v-5b40940b]{display:none}}.navigation-container .navigation[data-v-5b40940b]{position:fixed;width:220px;top:65px;left:0;bottom:-100px;padding-bottom:100px;background:var(--v-background-lighten1);z-index:1}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation[data-v-5b40940b]{top:48px;width:210px}}@media(max-width:680px)and (max-height:450px){.navigation-container .navigation[data-v-5b40940b]{width:190px}}.navigation-container .navigation .navigation-scroll[data-v-5b40940b]{display:flex;flex-direction:column;height:100%;padding:22px 12px;overflow-y:auto}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll[data-v-5b40940b]{padding:10px 12px}}@media(max-width:680px)and (max-height:450px){.navigation-container .navigation .navigation-scroll[data-v-5b40940b]{padding:10px 8px}}.navigation-container .navigation .navigation-scroll[data-v-5b40940b]::-webkit-scrollbar-track{background:var(--v-background-lighten1)}.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]{display:flex;align-items:center;flex-shrink:0;height:52px;padding-left:16px;margin-top:4px;border-radius:11px;font-size:16px;color:var(--v-text-base);transition:background-color .15s;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]{height:40px;padding-left:12px;border-radius:9px;font-size:15px}}.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]:hover{background:var(--v-background-lighten2)}.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]:first-of-type{margin-top:0}.navigation-container .navigation .navigation-scroll .navigation__link--active[data-v-5b40940b]{color:var(--v-primary-base);background:#5b2d3c}.navigation-container .navigation .navigation-scroll .navigation__link--active[data-v-5b40940b]:hover{background:#5b2d3c}.navigation-container .navigation .navigation-scroll .navigation__link--highlight[data-v-5b40940b]{color:var(--v-secondary-lighten1)}.navigation-container .navigation .navigation-scroll .navigation__link--version[data-v-5b40940b]{font-size:15px}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll .navigation__link--version[data-v-5b40940b]{font-size:14.5px}}.navigation-container .navigation .navigation-scroll .navigation__link .navigation__link-icon[data-v-5b40940b]{margin-right:14px}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll .navigation__link .navigation__link-icon[data-v-5b40940b]{margin-right:10px}.login-container-wrapper[data-v-851c3dec]{padding:20px!important;margin-bottom:0!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper[data-v-851c3dec]{margin-bottom:0!important}}.login-container-wrapper .login-container[data-v-851c3dec]{border-radius:11px}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container[data-v-851c3dec]{padding:24px!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container[data-v-851c3dec]{padding:32px 20px!important;margin-left:12px!important;margin-right:12px!important}}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container .login__logo[data-v-851c3dec]{padding-top:4px!important;padding-bottom:8px!important}.login-container-wrapper .login-container .login__logo .v-image[data-v-851c3dec]{max-width:200px!important}.login-container-wrapper .login-container .login__logo h4[data-v-851c3dec]{margin-top:16px!important;font-size:19px!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container .login__logo[data-v-851c3dec]{padding-top:4px!important;padding-bottom:12px!important}.login-container-wrapper .login-container .login__logo .v-image[data-v-851c3dec]{max-width:200px!important}.login-container-wrapper .login-container .login__logo h4[data-v-851c3dec]{margin-top:24px!important;font-size:19px!important}}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container .v-input[data-v-851c3dec]{margin-top:24px!important;font-size:14px!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container .v-input[data-v-851c3dec]{margin-top:32px!important;font-size:16px!important}}.login-container-wrapper .login-container .login-button[data-v-851c3dec]{border-radius:7px;margin-top:48px!important;font-size:18px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container .login-button[data-v-851c3dec]{height:44px!important;margin-top:24px!important;font-size:16px}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container .login-button[data-v-851c3dec]{height:50px!important;margin-top:32px!important;font-size:15.5px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){h1[data-v-1310cfee]{font-size:24px!important}}@media(max-width:1000px)and (max-height:450px){h1[data-v-1310cfee]{font-size:24px!important}}@media(max-width:600px)and (min-height:450.01px){h1[data-v-1310cfee]{font-size:24px!important;text-align:center}}@media(max-width:1000px)and (max-height:450px){span[data-v-1310cfee]{font-size:15px!important}}@media(max-width:600px)and (min-height:450.01px){span[data-v-1310cfee]{font-size:14px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper[data-v-6533f3d0]{padding:20px!important;margin-bottom:0!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper[data-v-6533f3d0]{margin-bottom:0!important}}.register-container-wrapper .register-container[data-v-6533f3d0]{border-radius:11px}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container[data-v-6533f3d0]{padding:24px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container[data-v-6533f3d0]{padding:32px 20px!important;margin-left:12px!important;margin-right:12px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .register__logo[data-v-6533f3d0]{padding-top:4px!important;padding-bottom:8px!important}.register-container-wrapper .register-container .register__logo .v-image[data-v-6533f3d0]{max-width:200px!important}.register-container-wrapper .register-container .register__logo h4[data-v-6533f3d0]{margin-top:16px!important;font-size:19px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .register__logo[data-v-6533f3d0]{padding-top:4px!important;padding-bottom:12px!important}.register-container-wrapper .register-container .register__logo .v-image[data-v-6533f3d0]{max-width:200px!important}.register-container-wrapper .register-container .register__logo h4[data-v-6533f3d0]{margin-top:24px!important;font-size:19px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]{margin-top:0!important;font-size:14px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]{margin-top:2px!important;font-size:16px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]:first-child{margin-top:24px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]:first-child{margin-top:32px!important}}.register-container-wrapper .register-container .register-button[data-v-6533f3d0]{border-radius:7px;margin-top:18px!important;font-size:18px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .register-button[data-v-6533f3d0]{height:44px!important;margin-top:0!important;font-size:16px}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .register-button[data-v-6533f3d0]{height:50px!important;margin-top:2px!important;font-size:15.5px}}.settings-container[data-v-7802007e]{width:100%;min-width:0}@media(max-width:1000px)and (max-height:450px){.settings-container[data-v-7802007e]{padding:16px 20px!important}}@media(max-width:680px)and (max-height:450px){.settings-container[data-v-7802007e]{padding:16px 16px!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container[data-v-7802007e]{padding:0 0!important}}.settings-container .settings-navigation[data-v-7802007e]{position:sticky;top:85px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings-navigation[data-v-7802007e]{display:none}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings-navigation[data-v-7802007e]{display:none}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings-navigation[data-v-7802007e]{display:none}}.settings-container .settings-navigation .v-list-item--link[data-v-7802007e],.settings-container .settings-navigation .v-list-item--link[data-v-7802007e]:before{border-radius:11px!important}.settings-container .settings[data-v-7802007e]{width:100%;min-width:0;border-radius:11px!important;background-color:var(--v-background-lighten1)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e]{margin-left:0!important;padding-top:20px!important;padding-left:20px!important;padding-right:20px!important}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e]{padding:20px!important;margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e]{margin-left:0!important;padding-top:60px!important;padding-left:16px!important;padding-right:16px!important;border-radius:0!important;background-color:var(--v-background-base)}}.settings-container .settings[data-v-7802007e] .settings__heading{display:flex;align-items:center;font-size:22px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading{font-size:20px}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading{position:fixed;top:0;left:0;right:0;height:60px;padding:16px;border-radius:0;background:var(--v-background-lighten1);box-shadow:0 3px 14px 2px rgba(0,0,0,.12);z-index:5}}.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:none;position:relative;left:-6px;padding:6px;border-radius:50%;color:var(--v-text-base)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:flex}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:flex}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:flex}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg{display:none}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg{display:none}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg{display:none}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg+span{margin-left:0!important}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg+span{margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg+span{margin-left:0!important}}.settings-container .settings[data-v-7802007e] .settings__content{margin-top:24px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content{margin-top:16px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item{display:flex;position:relative;flex-direction:column;margin-top:24px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item{margin-top:16px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--sync-disabled .settings__item-heading{padding-right:8px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--sync-disabled .settings__item-heading:after{content:"デバイス間同期無効";display:flex;align-items:center;flex-shrink:0;position:relative;right:-8px;padding:2px 4px;margin-left:auto;border-radius:4px;background:var(--v-background-lighten2);font-size:11px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch{margin-right:62px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch .settings__item-heading{width:calc(100% + 62px)}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch .settings__item-heading,.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch .settings__item-label{cursor:pointer}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--disabled{opacity:.5}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-heading{display:flex;align-items:center;color:var(--v-text-base);font-size:16.5px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item-heading{font-size:15px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-label{margin-top:8px;color:var(--v-text-darken1);font-size:13.5px;line-height:1.6}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item-label{font-size:11px;line-height:1.7}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-form{margin-top:14px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item-form{font-size:13.5px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-switch{align-items:center;position:absolute;top:0;right:-74px;bottom:0;margin-top:0}.settings-container .settings[data-v-7802007e] .settings__content .settings__item p{margin-bottom:8px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item p:last-of-type{margin-bottom:0}.settings-container .settings[data-v-7802007e] .settings__content .settings__save-button{height:45px;background:var(--v-background-lighten2);font-size:15.5px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__save-button{height:40px;padding:0 12px;font-size:14px}}.settings__content[data-v-3ec6610e]{opacity:1;transition:opacity .4s}.settings__content--loading[data-v-3ec6610e]{opacity:0}@media(max-width:600px)and (min-height:450.01px){.settings__conflict-dialog .v-btn[data-v-3ec6610e]{height:50px!important;text-align:left}}.settings__conflict-dialog .v-btn br.smartphone-vertical-only[data-v-3ec6610e]{display:none}@media(max-width:600px)and (min-height:450.01px){.settings__conflict-dialog .v-btn br.smartphone-vertical-only[data-v-3ec6610e]{display:inline}}.account[data-v-3ec6610e]{display:flex;align-items:center;height:130px;padding:18px 20px;border-radius:15px;background:var(--v-background-lighten2)}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px}}@media(max-width:1000px)and (max-height:450px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px;border-radius:10px}}@media(max-width:600px)and (min-height:450.01px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px 12px;border-radius:10px}}.account-wrapper[data-v-3ec6610e]{display:flex;align-items:center;min-width:0;height:94px}@media(max-width:1000px)and (max-height:450px){.account-wrapper[data-v-3ec6610e]{height:80px}}@media(max-width:600px)and (min-height:450.01px){.account-wrapper[data-v-3ec6610e]{height:70px}}.account__icon[data-v-3ec6610e]{flex-shrink:0;min-width:94px;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));image-rendering:-webkit-optimize-contrast}@media(max-width:1000px)and (max-height:450px){.account__icon[data-v-3ec6610e]{min-width:80px}}@media(max-width:600px)and (min-height:450.01px){.account__icon[data-v-3ec6610e]{min-width:70px}}.account__info[data-v-3ec6610e]{display:flex;flex-direction:column;min-width:0;margin-left:20px;margin-right:12px}@media(max-width:600px)and (min-height:450.01px){.account__info[data-v-3ec6610e]{margin-left:12px!important;margin-right:0!important}}.account__info-name[data-v-3ec6610e]{display:inline-flex;align-items:center;height:33px}.account__info-name-text[data-v-3ec6610e]{display:inline-block;font-size:23px;color:var(--v-text-base);font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.account__info-name-text[data-v-3ec6610e]{font-size:21px}}@media(max-width:600px)and (min-height:450.01px){.account__info-name-text[data-v-3ec6610e]{font-size:20px}}.account__info-admin[data-v-3ec6610e]{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:52px;height:28px;margin-left:10px;border-radius:5px;background:var(--v-secondary-base);font-size:14px;font-weight:500;line-height:2}@media(max-width:1000px)and (max-height:450px){.account__info-admin[data-v-3ec6610e]{width:45px;height:24px;border-radius:4px;font-size:11.5px}}@media(max-width:600px)and (min-height:450.01px){.account__info-admin[data-v-3ec6610e]{width:45px;height:24px;border-radius:4px;font-size:11.5px}}.account__info-id[data-v-3ec6610e]{display:inline-block;margin-top:2px;color:var(--v-text-darken1);font-size:16px}@media(max-width:1000px)and (max-height:450px){.account__info-id[data-v-3ec6610e]{font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.account__info-id[data-v-3ec6610e]{font-size:14.5px}}.account__login[data-v-3ec6610e]{border-radius:7px;font-size:16px;letter-spacing:0}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account__login[data-v-3ec6610e]{height:50px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account__login[data-v-3ec6610e]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.account__login[data-v-3ec6610e]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.account__login[data-v-3ec6610e]{height:42px!important;margin-top:16px;margin-right:auto;font-size:14.5px}}.account-register[data-v-3ec6610e]{display:flex;flex-direction:column;margin-top:28px}.account-register__heading[data-v-3ec6610e]{font-size:21px;font-weight:700;text-align:center;font-feature-settings:"palt" 1;letter-spacing:.04em}@media(max-width:1000px)and (max-height:450px){.account-register__heading[data-v-3ec6610e]{font-size:19px}}@media(max-width:600px)and (min-height:450.01px){.account-register__heading[data-v-3ec6610e]{font-size:18px}}.account-register__feature[data-v-3ec6610e]{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:18px;grid-column-gap:16px;margin-top:28px}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}@media(max-width:1000px)and (max-height:450px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}@media(max-width:600px)and (min-height:450.01px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}.account-register__feature .account-feature[data-v-3ec6610e]{display:flex;align-items:center}.account-register__feature .account-feature__icon[data-v-3ec6610e]{width:46px;height:46px;flex-shrink:0;margin-right:16px;color:var(--v-secondary-lighten1)}.account-register__feature .account-feature__info[data-v-3ec6610e]{display:flex;flex-direction:column}.account-register__feature .account-feature__info-heading[data-v-3ec6610e]{font-size:15px}.account-register__feature .account-feature__info-text[data-v-3ec6610e]{margin-top:3px;color:var(--v-text-darken1);font-size:12.5px;line-height:1.65}.account-register__description[data-v-3ec6610e]{margin-top:32px;font-size:15px;line-height:1.7;text-align:center}.account-register__description br.smartphone-vertical-only[data-v-3ec6610e]{display:none}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account-register__description[data-v-3ec6610e]{font-size:12.5px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account-register__description[data-v-3ec6610e]{font-size:10.5px}}@media(max-width:1000px)and (max-height:450px){.account-register__description[data-v-3ec6610e]{font-size:12.5px}}@media(max-width:680px)and (max-height:450px){.account-register__description[data-v-3ec6610e]{font-size:10.5px}}@media(max-width:600px)and (min-height:450.01px){.account-register__description[data-v-3ec6610e]{font-size:12.5px}.account-register__description br.smartphone-vertical-only[data-v-3ec6610e]{display:inline}}.account-register__button[data-v-3ec6610e]{margin-top:24px;margin-left:auto;margin-right:auto;border-radius:7px;font-size:16px;letter-spacing:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account-register__button[data-v-3ec6610e]{height:42px!important;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.account-register__button[data-v-3ec6610e]{height:42px!important;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.account-register__button[data-v-3ec6610e]{max-width:210px!important;height:42px!important;font-size:15px}}.settings-container[data-v-51859415]{width:100%;min-width:0}@media(max-width:1000px)and (max-height:450px){.settings-container[data-v-51859415]{padding:16px 20px!important}}@media(max-width:680px)and (max-height:450px){.settings-container[data-v-51859415]{padding:16px 16px!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container[data-v-51859415]{padding:16px 16px!important}}.settings-container .settings-navigation[data-v-51859415]{transform:none!important;visibility:visible!important}.settings-container .settings-navigation .settings-navigation-version[data-v-51859415]{display:none}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings-navigation .settings-navigation-version[data-v-51859415]{display:flex}}.settings-container .settings-navigation .settings-navigation-version--highlight[data-v-51859415]{color:var(--v-secondary-lighten1)}@media(max-width:1000px)and (max-height:450px){.settings-container .settings-navigation h1[data-v-51859415]{font-size:22px!important}.settings-container .settings-navigation .v-navigation-drawer__content .v-list[data-v-51859415]{margin-top:12px!important;padding:0!important}}.settings-container .settings-navigation .v-list-item--link[data-v-51859415],.settings-container .settings-navigation .v-list-item--link[data-v-51859415]:before{background:var(--v-background-lighten1);border-radius:6px!important;margin-top:6px!important;margin-bottom:0!important}.settings-container .settings-navigation .v-list-item--link[data-v-51859415]:first-of-type{margin-top:0!important}.settings-container .settings-navigation .v-list-item__icon[data-v-51859415]{margin:14px 0!important;margin-right:16px!important}@media(max-width:600px)and (min-height:450.01px){.comment-mute-settings .v-card__title[data-v-2cd59ba0],.comment-mute-settings>div[data-v-2cd59ba0]{padding-left:12px!important;padding-right:12px!important}}.settings__item[data-v-2cd59ba0]{display:flex;position:relative;flex-direction:column;margin-top:24px}@media(max-width:1000px)and (max-height:450px){.settings__item[data-v-2cd59ba0]{margin-top:16px}}.settings__item--switch[data-v-2cd59ba0]{margin-right:62px}.settings__item-heading[data-v-2cd59ba0]{display:flex;align-items:center;color:var(--v-text-base);font-size:16.5px}@media(max-width:1000px)and (max-height:450px){.settings__item-heading[data-v-2cd59ba0]{font-size:15px}}.settings__item-label[data-v-2cd59ba0]{margin-top:8px;color:var(--v-text-darken1);font-size:13.5px;line-height:1.6}@media(max-width:1000px)and (max-height:450px){.settings__item-label[data-v-2cd59ba0]{font-size:11px;line-height:1.7}}.settings__item-form[data-v-2cd59ba0]{margin-top:14px}@media(max-width:1000px)and (max-height:450px){.settings__item-form[data-v-2cd59ba0]{font-size:13.5px}}.settings__item-switch[data-v-2cd59ba0]{align-items:center;position:absolute;top:0;right:-74px;bottom:0;margin-top:0}.settings__item p[data-v-2cd59ba0]{margin-bottom:8px}.settings__item p[data-v-2cd59ba0]:last-of-type{margin-bottom:0}.muted-comment-items[data-v-2cd59ba0]{display:flex;flex-direction:column;margin-top:8px}.muted-comment-items .muted-comment-item[data-v-2cd59ba0]{display:flex;align-items:center;padding:6px 0;border-bottom:1px solid var(--v-background-lighten2);transition:background-color .15s ease}.muted-comment-items .muted-comment-item[data-v-2cd59ba0]:last-of-type{border-bottom:none}.muted-comment-items .muted-comment-item__input[data-v-2cd59ba0]{font-size:14px}.muted-comment-items .muted-comment-item__match-type[data-v-2cd59ba0]{max-width:150px;margin-left:12px;font-size:14px}@media(max-width:600px)and (min-height:450.01px){.muted-comment-items .muted-comment-item__match-type[data-v-2cd59ba0]{max-width:115px}}.muted-comment-items .muted-comment-item__delete-button[data-v-2cd59ba0]{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin-left:6px;border-radius:5px;outline:none;cursor:pointer}.settings__content[data-v-3ff16abd]{opacity:1;transition:opacity .4s}.settings__content--loading[data-v-3ff16abd]{opacity:0}.niconico-account[data-v-3ff16abd]{display:flex;align-items:center;height:120px;padding:20px;border-radius:15px;background:var(--v-background-lighten2)}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px}.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:16px!important;margin-right:0!important}.niconico-account .niconico-account-wrapper .niconico-account__info-name-text[data-v-3ff16abd]{font-size:18.5px}.niconico-account .niconico-account-wrapper .niconico-account__info-description[data-v-3ff16abd]{font-size:13.5px}}@media(max-width:1000px)and (max-height:450px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px;border-radius:10px}.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-right:0!important}}@media(max-width:680px)and (max-height:450px){.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:16px!important}.niconico-account .niconico-account-wrapper .niconico-account__info-name-text[data-v-3ff16abd]{font-size:18px}.niconico-account .niconico-account-wrapper .niconico-account__info-description[data-v-3ff16abd]{font-size:13px}}@media(max-width:600px)and (min-height:450.01px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px 12px;border-radius:10px}.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:12px!important;margin-right:0!important}.niconico-account .niconico-account-wrapper .niconico-account__info-name-text[data-v-3ff16abd]{font-size:17px}.niconico-account .niconico-account-wrapper .niconico-account__info-description[data-v-3ff16abd]{font-size:13px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.niconico-account--anonymous .niconico-account__login[data-v-3ff16abd]{margin-top:12px}}@media(max-width:1000px)and (max-height:450px){.niconico-account--anonymous .niconico-account__login[data-v-3ff16abd]{margin-top:12px}}@media(max-width:680px)and (max-height:450px){.niconico-account--anonymous .niconico-account-wrapper svg[data-v-3ff16abd]{display:none}.niconico-account--anonymous .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.niconico-account--anonymous[data-v-3ff16abd]{padding-top:20px}.niconico-account--anonymous .niconico-account__login[data-v-3ff16abd]{margin-top:16px}.niconico-account--anonymous .niconico-account-wrapper svg[data-v-3ff16abd]{display:none}.niconico-account--anonymous .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:0!important;margin-right:0!important}}.niconico-account-wrapper[data-v-3ff16abd]{display:flex;align-items:center;min-width:0;height:80px}@media(max-width:600px)and (min-height:450.01px){.niconico-account-wrapper[data-v-3ff16abd]{height:60px}}.niconico-account__icon[data-v-3ff16abd]{flex-shrink:0;min-width:80px;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));image-rendering:-webkit-optimize-contrast}@media(max-width:600px)and (min-height:450.01px){.niconico-account__icon[data-v-3ff16abd]{width:60px;min-width:60px;height:60px}}.niconico-account__info[data-v-3ff16abd]{display:flex;flex-direction:column;min-width:0;margin-left:20px;margin-right:16px}.niconico-account__info-name[data-v-3ff16abd]{display:inline-flex;align-items:center;height:33px}@media(max-width:600px)and (min-height:450.01px){.niconico-account__info-name[data-v-3ff16abd]{height:auto}}.niconico-account__info-name-text[data-v-3ff16abd]{display:inline-block;font-size:20px;color:var(--v-text-base);font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.niconico-account__info-description[data-v-3ff16abd]{display:inline-block;margin-top:4px;color:var(--v-text-darken1);font-size:14px}.niconico-account__login[data-v-3ff16abd]{border-radius:7px;font-size:16px;letter-spacing:0}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.niconico-account__login[data-v-3ff16abd]{height:50px!important;margin-top:12px;margin-right:auto}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.niconico-account__login[data-v-3ff16abd]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.niconico-account__login[data-v-3ff16abd]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.niconico-account__login[data-v-3ff16abd]{height:42px!important;margin-top:16px;margin-right:auto;font-size:14.5px}}.settings__content[data-v-61fbe4ed]{opacity:1;transition:opacity .4s}.settings__content--loading[data-v-61fbe4ed]{opacity:0}.twitter-accounts[data-v-61fbe4ed]{display:flex;flex-direction:column;padding:20px 20px;border-radius:15px;background:var(--v-background-lighten2)}@media(max-width:1000px)and (max-height:450px){.twitter-accounts[data-v-61fbe4ed]{padding:16px 20px;border-radius:10px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts[data-v-61fbe4ed]{padding:16px 12px;border-radius:10px}}.twitter-accounts__heading[data-v-61fbe4ed]{display:flex;align-items:center;font-size:18px;font-weight:700}.twitter-accounts__guide[data-v-61fbe4ed]{display:flex;align-items:center}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-accounts__guide .text-h6[data-v-61fbe4ed]{font-size:19px!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts__guide .text-h6[data-v-61fbe4ed]{font-size:17px!important}}@media(max-width:680px)and (max-height:450px){.twitter-accounts__guide svg[data-v-61fbe4ed]{display:none}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts__guide svg[data-v-61fbe4ed]{display:none}}@media(max-width:680px)and (max-height:450px){.twitter-accounts__guide svg+div[data-v-61fbe4ed]{margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts__guide svg+div[data-v-61fbe4ed]{margin-left:0!important}}.twitter-accounts .twitter-account[data-v-61fbe4ed]{display:flex;align-items:center;margin-top:20px}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account[data-v-61fbe4ed]{margin-top:16px}}.twitter-accounts .twitter-account__icon[data-v-61fbe4ed]{flex-shrink:0;width:70px;height:70px;margin-right:16px;border-radius:50%;-o-object-fit:cover;object-fit:cover;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));image-rendering:-webkit-optimize-contrast}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__icon[data-v-61fbe4ed]{width:52px;height:52px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__icon[data-v-61fbe4ed]{width:48px;height:48px;margin-right:10px}}.twitter-accounts .twitter-account__info[data-v-61fbe4ed]{display:flex;flex-direction:column;min-width:0;margin-right:16px}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__info[data-v-61fbe4ed]{margin-right:10px}}.twitter-accounts .twitter-account__info-name[data-v-61fbe4ed]{display:inline-flex;align-items:center}.twitter-accounts .twitter-account__info-name-text[data-v-61fbe4ed]{display:inline-block;color:var(--v-text-base);font-size:20px;font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__info-name-text[data-v-61fbe4ed]{font-size:18px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__info-name-text[data-v-61fbe4ed]{font-size:16px}}.twitter-accounts .twitter-account__info-screen-name[data-v-61fbe4ed]{display:inline-block;color:var(--v-text-darken1);font-size:16px}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__info-screen-name[data-v-61fbe4ed]{font-size:14px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__info-screen-name[data-v-61fbe4ed]{font-size:13.5px}}.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{margin-top:20px;margin-left:auto;margin-right:auto;border-radius:7px;font-size:15px;letter-spacing:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{height:42px!important;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{height:42px!important;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{height:42px!important;font-size:14.5px}}.twitter-accounts .twitter-account__logout[data-v-61fbe4ed]{background:var(--v-gray-base);border-radius:7px;font-size:15px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__logout[data-v-61fbe4ed]{width:116px!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__logout[data-v-61fbe4ed]{width:100px!important;height:48px!important;border-radius:5px;font-size:14px}.twitter-accounts .twitter-account__logout svg[data-v-61fbe4ed]{width:20px;margin-right:4px!important}}.channels-container.channels-container--home .v-tabs-bar{height:54px;background:linear-gradient(to bottom,var(--v-background-base) calc(100% - 3px),var(--v-background-lighten1) 3px)}@media(max-width:1000px)and (max-height:450px){.channels-container.channels-container--home .v-tabs-bar{height:46px}}.channels-container.channels-container--home .v-tabs-slider-wrapper{height:3px!important;transition:left .3s cubic-bezier(.25,.8,.5,1)}.channels-container.channels-container--home .v-window__container{min-height:calc(100vh - 180px);min-height:calc(100dvh - 180px)}@media(hover:none){.channels-container.channels-container--home .v-window__container{min-height:auto}}.channels-container.channels-container--home.channels-container--loading .v-tabs-slider-wrapper{transition:none!important}.channels-container[data-v-b22adce6]{display:flex;flex-direction:column;width:100%;margin-left:21px;margin-right:21px;opacity:1;transition:opacity .2s}@media(max-width:600px)and (min-height:450.01px){.channels-container[data-v-b22adce6]{margin-left:0;margin-right:0}}.channels-container--loading[data-v-b22adce6]{opacity:0}.channels-container .channels-tab[data-v-b22adce6]{position:sticky;flex:none;top:65px;padding-top:2px;padding-bottom:12px;background:var(--v-background-base);z-index:1}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab[data-v-b22adce6]{top:0;padding-top:0;padding-bottom:8px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-tab[data-v-b22adce6]{top:0;padding-top:0;padding-bottom:10px}}.channels-container .channels-tab .channels-tab__item[data-v-b22adce6]{width:98px;padding:0;color:var(--v-text-base)!important;font-size:16px;text-transform:none}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab .channels-tab__item[data-v-b22adce6]{font-size:15px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-tab .channels-tab__item[data-v-b22adce6]{width:auto;font-size:15px}}.channels-container .channels-list[data-v-b22adce6]{padding-bottom:20px;background:transparent!important;overflow:inherit}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list[data-v-b22adce6]{padding-bottom:12px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list[data-v-b22adce6]{padding-left:8px;padding-right:8px;padding-bottom:12px}}.channels-container .channels-list .channels[data-v-b22adce6]{display:grid;grid-template-columns:repeat(auto-fit,minmax(365px,1fr));grid-row-gap:12px;grid-column-gap:16px;justify-content:center;background:var(--v-background-base);will-change:transform}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-row-gap:10px;grid-template-columns:1fr}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-row-gap:8px;grid-template-columns:1fr}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-row-gap:10px;grid-template-columns:1fr}}@media(hover:none){.channels-container .channels-list .channels[data-v-b22adce6]{content-visibility:auto;contain-intrinsic-height:2000px}}@media(min-width:1630px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-template-columns:repeat(auto-fit,445px)}}.channels-container .channels-list .channels.channels--length-0.channels--tab-ピン留め[data-v-b22adce6]{display:flex;min-height:calc(100vh - 180px);min-height:calc(100dvh - 180px)}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels.channels--length-0.channels--tab-ピン留め[data-v-b22adce6]{min-height:calc(100vh - 66px);min-height:calc(100dvh - 66px)}}@media(min-width:1008px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:calc(50% + 8px)}}@media(min-width:1389px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:calc(66.66667% + 10.66667px)}}@media(min-width:1630px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:922px}}@media(min-width:2090px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:1383px}}@media(min-width:1389px){.channels-container .channels-list .channels.channels--length-2[data-v-b22adce6]{margin-right:calc(33.33333% + 5.33333px)}}@media(min-width:1630px){.channels-container .channels-list .channels.channels--length-2[data-v-b22adce6]{margin-right:461px}}@media(min-width:2090px){.channels-container .channels-list .channels.channels--length-2[data-v-b22adce6]{margin-right:922px}.channels-container .channels-list .channels.channels--length-3[data-v-b22adce6]{margin-right:461px}}.channels-container .channels-list .channels .channel[data-v-b22adce6]{display:flex;flex-direction:column;position:relative;height:270px;padding:18px 20px;padding-bottom:19px;border-radius:14px;color:var(--v-text-base);background:var(--v-background-lighten1);transition:background-color .15s;overflow:hidden;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;content-visibility:auto;contain-intrinsic-height:233px}@media(max-width:1007.9px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{height:auto}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{padding:14px 16px;padding-top:12px;height:auto;border-radius:11px;contain-intrinsic-height:162.25px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{padding:12px 14px;padding-top:10px;height:auto;border-radius:11px;contain-intrinsic-height:125px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{padding:12px 14px;padding-top:10px;height:auto;border-radius:11px;contain-intrinsic-height:162.25px}}.channels-container .channels-list .channels .channel[data-v-b22adce6]:hover{background:var(--v-background-lighten2)}@media(hover:none){.channels-container .channels-list .channels .channel[data-v-b22adce6]:hover{background:var(--v-background-lighten1)}}.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{display:flex;height:44px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{height:40px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{height:29px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{height:40px}}.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{display:inline-block;flex-shrink:0;width:80px;height:44px;border-radius:5px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{width:69px;height:40px;border-radius:4px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{width:54px;height:29px;border-radius:4px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{width:69px;height:40px;border-radius:4px}}.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{display:flex;flex-direction:column;margin-left:16px;width:100%;min-width:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{margin-left:14px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{align-items:center;flex-direction:row;margin-left:12px;margin-right:6px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{margin-left:14px}}.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{flex-shrink:0;font-size:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{font-size:15.5px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{font-size:15px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{font-size:15.5px}}.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{display:flex;position:relative;top:-1.5px;flex-shrink:0;align-items:center;margin-top:2px;font-size:12px;color:var(--v-text-darken1)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{margin-top:2px;font-size:11px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{margin-top:3px;margin-left:auto;font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{margin-top:2px;font-size:11px}}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force[data-v-b22adce6],.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers[data-v-b22adce6]{display:flex;align-items:center}@media(max-width:680px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-status-force span[data-v-b22adce6]:nth-child(2),.channels-container .channels-list .channels .channel .channel__broadcaster-status-force span[data-v-b22adce6]:nth-child(4),.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers span[data-v-b22adce6]:nth-child(2),.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers span[data-v-b22adce6]:nth-child(4){display:none}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers[data-v-b22adce6]{margin-left:8px!important}}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force--festival[data-v-b22adce6]{color:#e7556e}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force--so-many[data-v-b22adce6]{color:#e76b55}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force--many[data-v-b22adce6]{color:#e7a355}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]{display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;top:-5px;right:-5px;width:34px;height:34px;padding:4px;color:var(--v-text-darken1);border-radius:50%;transition:color .15s ease,background-color .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]{top:-1px}}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit;background-color:currentColor;color:inherit;opacity:0;transition:opacity .2s cubic-bezier(.4,0,.6,1);pointer-events:none}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]:hover{color:var(--v-text-base)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]:hover:before{opacity:.15}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]{color:var(--v-primary-base)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]:hover{color:var(--v-primary-lighten1)}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]{color:var(--v-secondary-lighten2)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]:hover{color:var(--v-secondary-lighten3)}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]{color:var(--v-secondary-lighten2)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]:hover{color:var(--v-secondary-lighten3)}}.channels-container .channels-list .channels .channel .channel__program-present[data-v-b22adce6]{display:flex;flex-direction:column}.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{margin-top:14px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{display:flex;flex-direction:column;margin-top:8px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{display:flex;align-items:center;margin-top:8px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{display:flex;flex-direction:column;margin-top:8px}}.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{display:-webkit-box;font-size:16px;font-weight:700;font-feature-settings:"palt" 1;letter-spacing:.07em;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{font-size:14px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{font-size:14px;-webkit-line-clamp:1}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{font-size:14px;-webkit-line-clamp:1}}.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{margin-top:4px;color:var(--v-text-darken1);font-size:13.5px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{flex-shrink:0;margin-top:2px;font-size:13px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{flex-shrink:0;margin-top:0;margin-left:auto;padding-left:10px;font-size:12px}}@media(max-width:680px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{font-size:11px;padding-left:6px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{flex-shrink:0;margin-top:1px;font-size:12px}}.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{display:-webkit-box;margin-top:6px;color:var(--v-text-darken1);font-size:10.5px;line-height:175%;overflow-wrap:break-word;font-feature-settings:"palt" 1;letter-spacing:.07em;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{margin-top:4px;font-size:11px;line-height:155%;-webkit-line-clamp:2}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{margin-top:3px;font-size:10px;line-height:160%;-webkit-line-clamp:2}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{margin-top:4px;font-size:10px;line-height:155%;-webkit-line-clamp:2}}.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{display:flex;flex-direction:column;color:var(--v-text-base);font-size:12.5px}@media(max-width:1007.9px){.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{margin-top:6px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{flex-direction:row;margin-top:4px;font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{margin-top:4px;font-size:12px}}.channels-container .channels-list .channels .channel .channel__program-following-title[data-v-b22adce6]{display:flex;align-items:center;min-width:0}.channels-container .channels-list .channels .channel .channel__program-following-title-decorate[data-v-b22adce6]{flex-shrink:0;font-weight:700}.channels-container .channels-list .channels .channel .channel__program-following-title-icon[data-v-b22adce6]{flex-shrink:0;margin-left:3px}.channels-container .channels-list .channels .channel .channel__program-following-title-text[data-v-b22adce6]{margin-left:2px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{color:var(--v-text-darken1)}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{flex-shrink:0;margin-left:auto;padding-left:8px;font-size:11.5px}}@media(max-width:680px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{font-size:11px;padding-left:6px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{flex-shrink:0;font-size:11.5px}}.channels-container .channels-list .channels .channel .channel__progressbar[data-v-b22adce6]{position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--v-gray-base)}.channels-container .channels-list .channels .channel .channel__progressbar-progress[data-v-b22adce6]{height:4px;background:var(--v-primary-base);transition:width .3s}.channels-container .pinned-container br[data-v-b22adce6]{display:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .pinned-container h2[data-v-b22adce6]{font-size:21px!important}.channels-container .pinned-container div[data-v-b22adce6]{font-size:12.5px!important;text-align:center}}@media(max-width:1000px)and (max-height:450px){.channels-container .pinned-container[data-v-b22adce6]{padding-top:12px}.channels-container .pinned-container h2[data-v-b22adce6]{font-size:21px!important}.channels-container .pinned-container div[data-v-b22adce6]{font-size:13px!important;text-align:center}.channels-container .pinned-container div .mt-4[data-v-b22adce6]{margin-top:12px!important}.channels-container .pinned-container div svg[data-v-b22adce6]{width:16px}}@media(max-width:680px)and (max-height:450px){.channels-container .pinned-container h2[data-v-b22adce6]{font-size:16px!important}.channels-container .pinned-container div[data-v-b22adce6]{font-size:10.5px!important}.channels-container .pinned-container div .mt-4[data-v-b22adce6]{margin-top:8px!important}}@media(max-width:600px)and (min-height:450.01px){.channels-container .pinned-container[data-v-b22adce6]{min-height:calc(100vh - 132px);min-height:calc(100dvh - 132px);padding-top:12px}.channels-container .pinned-container br[data-v-b22adce6]{display:inline}.channels-container .pinned-container h2[data-v-b22adce6]{font-size:22px!important;text-align:center}.channels-container .pinned-container div[data-v-b22adce6]{font-size:15px!important;text-align:center}.channels-container .pinned-container div .mt-4[data-v-b22adce6]{margin-top:8px!important}.channels-container .pinned-container div svg[data-v-b22adce6]{width:20px}}.channels-container.channels-container--watch .v-tabs-bar{height:42px;background:linear-gradient(to bottom,var(--v-background-base) calc(100% - 3px),var(--v-background-lighten1) 3px)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container.channels-container--watch .v-tabs-bar{height:50px}}@media(max-width:1000px)and (max-height:450px){.channels-container.channels-container--watch .v-tabs-bar{height:44px}}@media(max-width:600px)and (min-height:450.01px){.channels-container.channels-container--watch .v-tabs-bar{height:46px}}.channels-container.channels-container--watch .v-tabs-bar .v-slide-group__next,.channels-container.channels-container--watch .v-tabs-bar .v-slide-group__prev{flex:auto!important;min-width:28px!important}.channels-container.channels-container--watch .v-tabs-slider-wrapper{height:3px!important;transition:left .3s cubic-bezier(.25,.8,.5,1)}.channels-container[data-v-1773876a]{display:flex;flex-direction:column}.channels-container .channels-tab[data-v-1773876a]{position:sticky;flex:none;top:0;padding-left:16px;padding-right:16px;padding-bottom:14px;background:var(--v-background-base);z-index:1}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-tab[data-v-1773876a]{padding-left:24px;padding-right:24px;padding-bottom:10px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab[data-v-1773876a]{padding-bottom:8px;margin-top:0}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-tab[data-v-1773876a]{padding-bottom:8px;margin-top:0}}.channels-container .channels-tab .channels-tab__item[data-v-1773876a]{min-width:72px!important;padding:0 8px;color:var(--v-text-base)!important;font-size:15px;text-transform:none}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab .channels-tab__item[data-v-1773876a]{font-size:14.5px}}.channels-container .channels-list-container[data-v-1773876a]{overflow-y:auto}.channels-container .channels-list-container .channels-list[data-v-1773876a]{padding-left:16px;padding-right:10px;padding-bottom:16px;background:transparent!important;overflow:visible!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list-container .channels-list[data-v-1773876a]{padding-left:24px;padding-right:24px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list[data-v-1773876a]{padding-bottom:12px}}.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{display:flex;justify-content:center;flex-direction:column;will-change:transform}@media(hover:none){.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{content-visibility:auto;contain-intrinsic-size:319.3px 2000px}}@media(hover:none)and (max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{contain-intrinsic-size:277.3px 2000px}}@media(min-width:1630px){.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{grid-template-columns:repeat(auto-fit,445px)}}.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]{display:flex;flex-direction:column;position:relative;margin-top:12px;padding:10px 12px 14px 12px;border-radius:10px;color:var(--v-text-base);background:var(--v-background-lighten1);transition:background-color .15s;overflow:hidden;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;content-visibility:auto;contain-intrinsic-size:295.3px 137.3px}.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]:first-of-type{margin-top:0}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]{margin-top:8px;padding:8px 12px 12px 12px;border-radius:8px;contain-intrinsic-size:253.3px 107.2px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]{margin-top:8px;padding:8px 12px 12px 12px;border-radius:8px;contain-intrinsic-size:253.3px 107.2px}}.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]:hover{background:var(--v-background-lighten2)}@media(hover:none){.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]:hover{background:var(--v-background-lighten1)}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster[data-v-1773876a]{display:flex;height:28px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster[data-v-1773876a]{height:24px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-1773876a]{display:inline-block;flex-shrink:0;width:48px;height:100%;border-radius:4px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-1773876a]{width:46px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-content[data-v-1773876a]{display:flex;align-items:center;margin-left:12px;width:100%;min-width:0}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-content[data-v-1773876a]{margin-left:8px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-name[data-v-1773876a]{font-size:14.5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-name[data-v-1773876a]{font-size:13.5px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-name[data-v-1773876a]{font-size:13.5px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force[data-v-1773876a]{display:flex;align-items:center;flex-shrink:0;margin-top:2px;margin-left:auto;padding-left:6px;font-size:12px;color:var(--v-text-darken1)}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force--festival[data-v-1773876a]{color:#e7556e}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force--so-many[data-v-1773876a]{color:#e76b55}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force--many[data-v-1773876a]{color:#e7a355}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present[data-v-1773876a]{display:flex;flex-direction:column}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-title[data-v-1773876a]{display:-webkit-box;margin-top:8px;font-size:13.5px;font-weight:700;font-feature-settings:"palt" 1;letter-spacing:.07em;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-title[data-v-1773876a]{margin-top:5px;font-size:12.5px;-webkit-line-clamp:1}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-title[data-v-1773876a]{margin-top:5px;font-size:12.5px;-webkit-line-clamp:1}}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-time[data-v-1773876a]{margin-top:4px;color:var(--v-text-darken1);font-size:11.5px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-time[data-v-1773876a]{margin-top:1px;font-size:10px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-time[data-v-1773876a]{margin-top:1px;font-size:10px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following[data-v-1773876a]{display:flex;flex-direction:column;margin-top:4px;color:var(--v-text-darken1);font-size:11.5px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following[data-v-1773876a]{margin-top:2px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following[data-v-1773876a]{margin-top:2px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title[data-v-1773876a]{display:flex;align-items:center}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title-decorate[data-v-1773876a]{flex-shrink:0}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title-icon[data-v-1773876a]{flex-shrink:0;margin-left:3px}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title-text[data-v-1773876a]{margin-left:2px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-time[data-v-1773876a]{margin-top:1px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-time[data-v-1773876a]{font-size:10px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-time[data-v-1773876a]{font-size:10px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__progressbar[data-v-1773876a]{position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--v-gray-base)}.channels-container .channels-list-container .channels-list .channels .channel .channel__progressbar-progress[data-v-1773876a]{height:4px;background:var(--v-primary-base);transition:width .3s}.comment-container[data-v-df07fabe]{display:flex;flex-direction:column}.comment-container .comment-header[data-v-df07fabe]{display:flex;align-items:center;flex-shrink:0;width:100%;height:26px;padding-left:16px;padding-right:16px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header[data-v-df07fabe]{margin-top:20px;padding-left:24px;padding-right:24px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-header[data-v-df07fabe]{margin-top:12px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-header[data-v-df07fabe]{margin-top:14px}}.comment-container .comment-header__title[data-v-df07fabe]{display:flex;align-items:center;font-size:18.5px;font-weight:700;line-height:145%}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header__title[data-v-df07fabe]{font-size:19px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-header__title[data-v-df07fabe]{font-size:16.5px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-header__title[data-v-df07fabe]{font-size:17px}}.comment-container .comment-header__title-icon[data-v-df07fabe]{margin-bottom:-3px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header__title-icon[data-v-df07fabe]{width:24px;height:24px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-header__title-icon[data-v-df07fabe]{height:17.5px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-header__title-icon[data-v-df07fabe]{height:18px}}.comment-container .comment-header__title-text[data-v-df07fabe]{margin-left:12px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header__title-text[data-v-df07fabe]{margin-left:16px}}.comment-container .comment-header__button[data-v-df07fabe]{display:flex;align-items:center;height:26px;padding:0 9px;border-radius:4px;background:var(--v-background-lighten3);font-size:11px;line-height:1.8;letter-spacing:0}.comment-container .comment-list-wrapper[data-v-df07fabe]{position:relative;width:100%;height:100%;min-height:0;margin-top:16px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-list-wrapper[data-v-df07fabe]{margin-top:20px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-list-wrapper[data-v-df07fabe]{margin-top:12px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-list-wrapper[data-v-df07fabe]{margin-top:14px}}.comment-container .comment-list-wrapper .comment-list-dropdown[data-v-df07fabe]{display:inline-block;position:absolute;top:var(--comment-list-dropdown-top,0);right:16px;border-radius:4px;overflow-x:hidden;overflow-y:auto;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);opacity:0;visibility:hidden;transition:opacity .15s ease,visibility .15s ease;z-index:8}.comment-container .comment-list-wrapper .comment-list-dropdown--display[data-v-df07fabe]{opacity:1;visibility:visible}.comment-container .comment-list-wrapper .comment-list-cover[data-v-df07fabe]{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:7}.comment-container .comment-list-wrapper .comment-list-cover--display[data-v-df07fabe]{display:block}.comment-container .comment-list-wrapper .comment-list[data-v-df07fabe]{width:100%;height:100%;padding-left:16px;padding-right:10px;padding-bottom:12px;overflow-y:scroll!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-list-wrapper .comment-list[data-v-df07fabe]{padding-left:24px;padding-right:18px;padding-bottom:0}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-list-wrapper .comment-list[data-v-df07fabe]{padding-bottom:0}}.comment-container .comment-list-wrapper .comment-list .comment[data-v-df07fabe]{display:flex;position:relative;align-items:center;min-height:28px;padding-top:6px;word-break:break-all}.comment-container .comment-list-wrapper .comment-list .comment--my-post[data-v-df07fabe]{color:var(--v-secondary-lighten2)}.comment-container .comment-list-wrapper .comment-list .comment__text[data-v-df07fabe]{font-size:13px}.comment-container .comment-list-wrapper .comment-list .comment__time[data-v-df07fabe]{flex-shrink:0;margin-left:auto;padding-left:8px;color:var(--v-text-darken1);font-size:13px}.comment-container .comment-list-wrapper .comment-list .comment__icon[data-v-df07fabe]{width:20px;height:20px;margin-left:8px;border-radius:5px;color:var(--v-text-base);cursor:pointer}.comment-container .comment-list-wrapper .comment-announce[data-v-df07fabe]{display:flex;align-items:center;justify-content:center;flex-direction:column;position:absolute;top:0;left:0;width:100%;height:100%;padding-left:12px;padding-right:12px}.comment-container .comment-list-wrapper .comment-announce__heading[data-v-df07fabe]{font-size:20px;font-weight:700}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-list-wrapper .comment-announce__heading[data-v-df07fabe]{font-size:16px}}.comment-container .comment-list-wrapper .comment-announce__text[data-v-df07fabe]{margin-top:12px;color:var(--v-text-darken1);font-size:13.5px;text-align:center}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-list-wrapper .comment-announce__text[data-v-df07fabe]{font-size:12px}}.comment-container .comment-scroll-button[data-v-df07fabe]{display:flex;align-items:center;justify-content:center;position:absolute;left:0;right:0;bottom:22px;width:42px;height:42px;margin:0 auto;border-radius:50%;background:var(--v-primary-base);transition:background-color .15s,opacity .3s,visibility .3s;visibility:hidden;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}.comment-container .comment-scroll-button--display[data-v-df07fabe]{opacity:1;visibility:visible}.program-container[data-v-710b8382]{padding-left:16px;padding-right:16px;overflow-y:auto}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container[data-v-710b8382]{padding-left:24px;padding-right:24px}}.program-container .program-broadcaster[data-v-710b8382]{display:none;align-items:center;min-width:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster[data-v-710b8382]{display:flex;margin-top:20px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-broadcaster[data-v-710b8382]{display:flex;margin-top:16px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-broadcaster[data-v-710b8382]{display:flex;margin-top:16px}}.program-container .program-broadcaster__icon[data-v-710b8382]{display:inline-block;flex-shrink:0;width:43px;height:24px;border-radius:3px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster__icon[data-v-710b8382]{width:58px;height:32px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-broadcaster__icon[data-v-710b8382]{width:42px;height:23.5px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-broadcaster__icon[data-v-710b8382]{width:58px;height:32px}}.program-container .program-broadcaster__number[data-v-710b8382]{flex-shrink:0;margin-left:12px;font-size:16.5px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster__number[data-v-710b8382]{margin-left:16px;font-size:19px}}.program-container .program-broadcaster__name[data-v-710b8382]{margin-left:5px;font-size:16.5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster__name[data-v-710b8382]{margin-left:8px;font-size:19px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-broadcaster__name[data-v-710b8382]{font-size:18px}}.program-container .program-info .program-info__title[data-v-710b8382]{font-size:22px;font-weight:700;line-height:145%;font-feature-settings:"palt" 1;letter-spacing:.05em}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-info .program-info__title[data-v-710b8382]{margin-top:16px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__title[data-v-710b8382]{margin-top:10px;font-size:18px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-info .program-info__title[data-v-710b8382]{margin-top:16px;font-size:19px}}.program-container .program-info .program-info__time[data-v-710b8382]{margin-top:8px;color:var(--v-text-darken1);font-size:14px}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__time[data-v-710b8382]{font-size:13px}}.program-container .program-info .program-info__description[data-v-710b8382]{margin-top:12px;color:var(--v-text-darken1);font-size:12px;line-height:168%;overflow-wrap:break-word;font-feature-settings:"palt" 1;letter-spacing:.08em}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__description[data-v-710b8382]{margin-top:8px;font-size:11px}}.program-container .program-info .program-info__genre-container[data-v-710b8382]{display:flex;flex-wrap:wrap;margin-top:10px}.program-container .program-info .program-info__genre-container .program-info__genre[data-v-710b8382]{display:inline-block;font-size:10.5px;padding:3px;margin-top:4px;margin-right:4px;border-radius:4px;background:var(--v-background-lighten2)}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__genre-container .program-info__genre[data-v-710b8382]{font-size:9px}}.program-container .program-info .program-info__next[data-v-710b8382]{display:flex;align-items:center;margin-top:18px;color:var(--v-text-base);font-size:14px;font-weight:700}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__next[data-v-710b8382]{margin-top:14px;font-size:13px}}.program-container .program-info .program-info__next-decorate[data-v-710b8382]{flex-shrink:0}.program-container .program-info .program-info__next-icon[data-v-710b8382]{flex-shrink:0;margin-left:3px;font-size:15px}.program-container .program-info .program-info__next-title[data-v-710b8382]{display:-webkit-box;margin-top:2px;color:var(--v-text-base);font-size:14px;font-weight:700;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__next-title[data-v-710b8382]{font-size:13px}}.program-container .program-info .program-info__next-time[data-v-710b8382]{margin-top:3px;color:var(--v-text-darken1);font-size:13.5px}.program-container .program-info .program-info__status[data-v-710b8382]{display:flex;align-items:center;margin-top:16px;font-size:14px;color:var(--v-text-darken1)}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__status[data-v-710b8382]{margin-top:10px;font-size:12px}}.program-container .program-info .program-info__status-force[data-v-710b8382],.program-container .program-info .program-info__status-viewers[data-v-710b8382]{display:flex;align-items:center}.program-container .program-info .program-info__status-force--festival[data-v-710b8382]{color:#e7556e}.program-container .program-info .program-info__status-force--so-many[data-v-710b8382]{color:#e76b55}.program-container .program-info .program-info__status-force--many[data-v-710b8382]{color:#e7a355}.program-container .program-detail-container[data-v-710b8382]{margin-top:24px;margin-bottom:24px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-detail-container[data-v-710b8382]{margin-top:20px;margin-bottom:20px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-detail-container[data-v-710b8382]{margin-top:20px;margin-bottom:16px}}.program-container .program-detail-container .program-detail[data-v-710b8382]{margin-top:16px}.program-container .program-detail-container .program-detail .program-detail__heading[data-v-710b8382]{font-size:18px}@media(max-width:1000px)and (max-height:450px){.program-container .program-detail-container .program-detail .program-detail__heading[data-v-710b8382]{font-size:16px}}.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382]{margin-top:8px;color:var(--v-text-darken1);font-size:12px;line-height:168%;overflow-wrap:break-word;white-space:pre-wrap;font-feature-settings:"palt" 1;letter-spacing:.08em}@media(max-width:1000px)and (max-height:450px){.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382]{font-size:11px}}.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382] a:link,.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382] a:visited{color:var(--v-primary-lighten1);text-underline-offset:3px}.remote-control-container[data-v-b659b524]{display:grid;place-items:center;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(30,19,16,.5);transition:opacity .2s,visibility .2s;overflow-y:scroll;opacity:0;visibility:hidden;z-index:5}.remote-control-container--showing[data-v-b659b524]{opacity:1;visibility:visible}.remote-control-container .remote-control[data-v-b659b524]{position:relative;width:234px;height:514px;padding:24px 16px;margin:0 auto;border-radius:8px;background:var(--v-background-base);-webkit-user-select:none;-moz-user-select:none;user-select:none}.remote-control-container .remote-control .remote-control__close[data-v-b659b524]{position:absolute!important;top:10px;right:10px;width:36px;height:36px;z-index:2}.remote-control-container .remote-control .remote-control-data-broadcasting[data-v-b659b524]{position:relative;opacity:1;transition:opacity .2s ease}.remote-control-container .remote-control .remote-control-data-broadcasting--disabled[data-v-b659b524],.remote-control-container .remote-control .remote-control-data-broadcasting--loading[data-v-b659b524]{opacity:.4;pointer-events:none}.remote-control-container .remote-control .remote-control-data-broadcasting--loading .remote-control__loading[data-v-b659b524]{opacity:1!important;visibility:visible!important}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__loading[data-v-b659b524]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--v-gray-base);filter:drop-shadow(0 0 3px rgba(0,0,0,.3));opacity:0;visibility:hidden;transition:opacity .2s cubic-bezier(.4,.38,.49,.94),visibility .2s cubic-bezier(.4,.38,.49,.94);will-change:opacity;z-index:3}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key[data-v-b659b524]{display:grid;grid-template-columns:1fr 90px 1fr;grid-template-rows:1fr 90px 1fr;width:160px;height:160px;margin-left:auto;margin-right:auto;border-radius:50%;background:var(--v-background-lighten1);overflow:hidden}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button[data-v-b659b524]{display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:14px;font-weight:700;outline:none}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-up[data-v-b659b524]{grid-column:2;grid-row:1;padding-top:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-left[data-v-b659b524]{grid-column:1;grid-row:2;padding-left:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-select[data-v-b659b524]{grid-column:2;grid-row:2;border-radius:50%;background:var(--v-background-base)}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-right[data-v-b659b524]{grid-column:3;grid-row:2;padding-right:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-down[data-v-b659b524]{grid-column:2;grid-row:3;padding-bottom:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key[data-v-b659b524]{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:35px 35px;gap:8px;width:200px;margin-top:12px;margin-left:auto;margin-right:auto}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key button[data-v-b659b524]{display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:15px;font-weight:700;outline:none}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key button.remote-control-button-data[data-v-b659b524]{grid-column:1/3;grid-row:1}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key button.remote-control-button-back[data-v-b659b524]{grid-column:3/5;grid-row:1}.remote-control-container .remote-control .remote-control__number-key[data-v-b659b524]{display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:44px 44px 44px 44px;gap:8px;width:200px;margin-top:16px;margin-left:auto;margin-right:auto}.remote-control-container .remote-control .remote-control__number-key button[data-v-b659b524]{display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:26px;font-weight:700;outline:none}@media(max-width:1000px)and (max-height:450px){.zoom-capture-modal-container.v-dialog{width:auto!important;max-width:auto!important;aspect-ratio:16/9}}.zoom-capture-modal[data-v-51116497]{position:relative}.zoom-capture-modal__image[data-v-51116497]{display:block;width:100%;border-radius:11px}.zoom-capture-modal__download[data-v-51116497]{display:flex;position:absolute;align-items:center;justify-content:center;right:22px;bottom:20px;width:80px;height:80px;border-radius:50%;color:var(--v-text-base);filter:drop-shadow(0 0 4.5px rgba(0,0,0,.9))}.twitter-container[data-v-51116497]{display:flex;flex-direction:column;position:relative;padding-bottom:8px}@media(max-width:600px)and (min-height:450.01px){.twitter-container[data-v-51116497]{padding-bottom:0}}.twitter-container.watch-panel__content--active[data-v-51116497]{content-visibility:visible!important}.twitter-container.watch-panel__content--active .tab-container .tab-content--active[data-v-51116497]{opacity:1;visibility:visible}@media(hover:none){.twitter-container.watch-panel__content--active .tab-container .tab-content--active[data-v-51116497]{content-visibility:auto}}.twitter-container .tab-container[data-v-51116497]{position:relative;flex-grow:1;min-height:0}.twitter-container .tab-container .tab-content[data-v-51116497]{position:absolute;width:100%;height:100%;transition:opacity .2s,visibility .2s;opacity:0;visibility:hidden;overflow-y:scroll}.twitter-container .tab-container .tab-content[data-v-51116497]::-webkit-scrollbar{width:6px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content[data-v-51116497]{padding-top:16px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content[data-v-51116497]{padding-top:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-container .tab-content[data-v-51116497]{padding-top:8px}}@media(hover:none){.twitter-container .tab-container .tab-content[data-v-51116497]{transition:none;content-visibility:hidden}}.twitter-container .tab-container .tab-content .captures[data-v-51116497]{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:12px;grid-column-gap:12px;padding-left:12px;padding-right:6px;max-height:100%}@supports(-webkit-touch-callout:none){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{padding-right:12px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{grid-template-columns:1fr 1fr 1fr;padding-left:24px;padding-right:24px;grid-row-gap:10px;grid-column-gap:16px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{grid-row-gap:8px;grid-column-gap:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{grid-template-columns:1fr 1fr 1fr;grid-row-gap:10px;grid-column-gap:10px}}.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{position:relative;height:82px;border-radius:11px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;content-visibility:auto}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{height:90px;border-radius:9px}.twitter-container .tab-container .tab-content .captures .capture .capture__image[data-v-51116497]{-o-object-fit:cover;object-fit:cover}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{height:74px;border-radius:9px}.twitter-container .tab-container .tab-content .captures .capture .capture__image[data-v-51116497]{-o-object-fit:cover;object-fit:cover}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{height:82px;border-radius:9px}.twitter-container .tab-container .tab-content .captures .capture .capture__image[data-v-51116497]{-o-object-fit:cover;object-fit:cover}}.twitter-container .tab-container .tab-content .captures .capture__image[data-v-51116497]{display:block;width:100%;height:100%}.twitter-container .tab-container .tab-content .captures .capture__zoom[data-v-51116497]{display:flex;align-items:center;justify-content:center;position:absolute;top:1px;right:3px;width:38px;height:38px;border-radius:50%;filter:drop-shadow(0 0 2.5px rgba(0,0,0,.9));cursor:pointer}.twitter-container .tab-container .tab-content .captures .capture__disabled-cover[data-v-51116497],.twitter-container .tab-container .tab-content .captures .capture__selected-number[data-v-51116497]{display:none;align-items:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(30,19,16,.5)}.twitter-container .tab-container .tab-content .captures .capture__selected-number[data-v-51116497]{font-size:38px;text-shadow:0 0 2.5px rgba(0,0,0,.9)}.twitter-container .tab-container .tab-content .captures .capture__selected-checkmark[data-v-51116497]{display:none;position:absolute;top:6px;left:7px;width:20px;height:20px;color:var(--v-primary-base)}.twitter-container .tab-container .tab-content .captures .capture__selected-border[data-v-51116497]{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:11px;border:4px solid var(--v-primary-base)}.twitter-container .tab-container .tab-content .captures .capture__focused-border[data-v-51116497]{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:11px;border:4px solid var(--v-secondary-base)}.twitter-container .tab-container .tab-content .captures .capture--selected .capture__selected-border[data-v-51116497],.twitter-container .tab-container .tab-content .captures .capture--selected .capture__selected-checkmark[data-v-51116497],.twitter-container .tab-container .tab-content .captures .capture--selected .capture__selected-number[data-v-51116497]{display:flex}.twitter-container .tab-container .tab-content .captures .capture--focused .capture__focused-border[data-v-51116497]{display:block}.twitter-container .tab-container .tab-content .captures .capture--disabled[data-v-51116497]{cursor:auto}.twitter-container .tab-container .tab-content .captures .capture--disabled .capture__disabled-cover[data-v-51116497]{display:block}.twitter-container .tab-container .tab-content .capture-announce[data-v-51116497]{display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%;padding-left:12px;padding-right:5px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content .capture-announce[data-v-51116497]{padding-left:24px;padding-right:24px}}.twitter-container .tab-container .tab-content .capture-announce__heading[data-v-51116497]{font-size:20px;font-weight:700}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .capture-announce__heading[data-v-51116497]{font-size:16px}}.twitter-container .tab-container .tab-content .capture-announce__text[data-v-51116497]{margin-top:12px;color:var(--v-text-darken1);font-size:13.5px;text-align:center}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .capture-announce__text[data-v-51116497]{font-size:12px}}.twitter-container .tab-button-container[data-v-51116497]{display:flex;flex-shrink:0;-moz-column-gap:7px;column-gap:7px;height:40px;margin-left:12px;margin-right:12px;padding-top:8px;padding-bottom:6px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-button-container[data-v-51116497]{height:40px;margin-left:24px;margin-right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-button-container[data-v-51116497]{height:38px;margin-left:8px;margin-right:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-button-container[data-v-51116497]{height:38px}}.twitter-container .tab-button-container .tab-button[data-v-51116497]{display:flex;align-items:center;justify-content:center;flex:1;background:var(--v-background-lighten2);border-radius:7px;font-size:11px;transition:background-color .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-button-container .tab-button[data-v-51116497]{font-size:11.5px;border-radius:7px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-button-container .tab-button[data-v-51116497]{font-size:10.5px;border-radius:6px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-button-container .tab-button[data-v-51116497]{font-size:10.5px;border-radius:6px}}.twitter-container .tab-button-container .tab-button--active[data-v-51116497]{background:var(--v-twitter-base)}.twitter-container .tab-button-container .tab-button__text[data-v-51116497]{margin-left:4px;margin-right:2px;line-height:2}.twitter-container .tweet-form[data-v-51116497]{display:flex;position:relative;flex-direction:column;flex-shrink:0;height:136px;margin-left:12px;margin-right:12px;border-radius:12px;border-bottom-left-radius:7px;border-bottom-right-radius:7px;background:var(--v-background-lighten1);transition:box-shadow .09s ease}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form[data-v-51116497]{margin-left:24px;margin-right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form[data-v-51116497]{height:96px;margin-left:8px;margin-right:8px;border-radius:6px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form[data-v-51116497]{height:96px;border-radius:6px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}}.twitter-container .tweet-form--focused[data-v-51116497]{box-shadow:0 0 0 3.5px rgba(79,130,230,.6)}.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{position:relative;bottom:calc(env(keyboard-inset-height, 0px) - 77px)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 40px)!important}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 34px)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 90px)!important}}.twitter-container .tweet-form__hashtag[data-v-51116497]{display:block;position:relative;height:19px;margin-top:12px;margin-left:12px;margin-right:12px}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag[data-v-51116497]{height:16px;margin-top:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag[data-v-51116497]{height:16px;margin-top:8px}}.twitter-container .tweet-form__hashtag-form[data-v-51116497]{display:block;width:calc(100% - 24px);height:100%;flex-grow:1;font-size:12.5px;color:var(--v-twitter-lighten2);outline:none}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(100% - 22px);font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(100% - 22px);font-size:12px}}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(133.3% - 32px);height:25.328px;font-size:16px;transform:scale(.75);transform-origin:0 0}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(133.3% - 32px);height:25.328px;font-size:16px;transform:scale(.75);transform-origin:0 0}}}.twitter-container .tweet-form__hashtag-form[data-v-51116497]::-moz-placeholder{color:rgba(65,165,241,.6)}.twitter-container .tweet-form__hashtag-form[data-v-51116497]::placeholder{color:rgba(65,165,241,.6)}.twitter-container .tweet-form__hashtag-list-button[data-v-51116497]{display:flex;position:absolute;align-items:center;justify-content:center;top:-8px;right:-8px;width:34px;height:34px;padding:6px;border-radius:50%;color:var(--v-twitter-lighten2);cursor:pointer}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag-list-button[data-v-51116497]{right:-11px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag-list-button[data-v-51116497]{right:-11px}}.twitter-container .tweet-form__textarea[data-v-51116497]{display:block;flex-grow:1;margin-top:8px;margin-left:12px;margin-right:12px;font-size:12.5px;color:var(--v-text-base);word-break:break-all;resize:none;outline:none}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__textarea[data-v-51116497]{margin-top:6px;font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__textarea[data-v-51116497]{margin-top:6px;font-size:12px}}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__textarea[data-v-51116497]{position:absolute;top:24px;left:-2px;min-width:calc(128% - 25px);min-height:34px;font-size:16px;transform:scale(.78125);transform-origin:0 0}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__textarea[data-v-51116497]{position:absolute;top:24px;left:-2px;min-width:calc(128% - 25px);min-height:34px;font-size:16px;transform:scale(.78125);transform-origin:0 0}}}.twitter-container .tweet-form__textarea[data-v-51116497]::-moz-placeholder{color:var(--v-text-darken2)}.twitter-container .tweet-form__textarea[data-v-51116497]::placeholder{color:var(--v-text-darken2)}.twitter-container .tweet-form__control[data-v-51116497]{display:flex;align-items:center;height:32px;margin-top:6px}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control[data-v-51116497]{height:26px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control[data-v-51116497]{height:26px}}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control[data-v-51116497]{margin-top:auto}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control[data-v-51116497]{margin-top:auto}}}.twitter-container .tweet-form__control .account-button[data-v-51116497]{display:flex;align-items:center;width:183px;height:100%;border-radius:7px;font-size:13px;color:var(--v-text-base);background:var(--v-background-lighten2);-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .account-button[data-v-51116497]{width:200px;border-radius:5px;font-size:11.5px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .account-button[data-v-51116497]{width:156px;border-radius:5px;font-size:11px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .account-button[data-v-51116497]{width:auto;flex-grow:1;border-radius:5px;font-size:11.5px}}.twitter-container .tweet-form__control .account-button--no-login .account-button__screen-name[data-v-51116497]{font-weight:500}.twitter-container .tweet-form__control .account-button--no-login .account-button__menu[data-v-51116497]{display:none}.twitter-container .tweet-form__control .account-button__icon[data-v-51116497]{display:block;width:32px;height:100%;border-radius:7px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2))}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .account-button__icon[data-v-51116497]{width:26px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .account-button__icon[data-v-51116497]{width:26px}}.twitter-container .tweet-form__control .account-button__screen-name[data-v-51116497]{flex-grow:1;line-height:2;text-align:center;font-weight:700}.twitter-container .tweet-form__control .account-button__menu[data-v-51116497]{margin-right:4px}.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{display:flex;align-items:center;justify-content:center;flex-direction:column;flex-grow:1;row-gap:.5px;font-size:10px;color:var(--v-text-darken1);-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{flex-grow:1;flex-direction:row;width:auto}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{font-size:9px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{flex-grow:unset;flex-direction:row;width:88px}}.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]{display:flex;align-items:center;justify-content:center}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]:nth-child(2){margin-left:28px;padding-right:3px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]:nth-child(2){margin-top:-2.5px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]:nth-child(2){margin-left:6px}}.twitter-container .tweet-form__control .limit-meter__content svg[data-v-51116497]{width:14px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter__content svg[data-v-51116497]{width:16px;height:16px}}.twitter-container .tweet-form__control .limit-meter__content span[data-v-51116497]{width:16px;margin-left:5px;text-align:center;font-weight:700}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter__content span[data-v-51116497]{width:25px;margin-left:8px;font-size:15px}}.twitter-container .tweet-form__control .limit-meter__content--yellow[data-v-51116497]{color:var(--v-warning-base)}.twitter-container .tweet-form__control .limit-meter__content--red[data-v-51116497]{color:var(--v-error-base)}.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{display:flex;align-items:center;justify-content:center;width:94px;height:100%;border-radius:7px;font-size:12.5px;line-height:2;color:var(--v-text-base);background:var(--v-twitter-base);-webkit-user-select:none;-moz-user-select:none;user-select:none;outline:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{width:200px;border-radius:5px;font-size:11.8px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{width:86px;border-radius:5px;font-size:11.8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{width:100px;border-radius:5px;font-size:11.8px}}.twitter-container .tweet-form__control .tweet-button[disabled][data-v-51116497]{opacity:.7;cursor:auto}.twitter-container .hashtag-list[data-v-51116497]{position:absolute;left:12px;right:12px;bottom:149px;max-height:calc(100vh - 239px);max-height:calc(100dvh - 239px);padding:12px 4px;padding-bottom:10px;border-radius:7px;-webkit-clip-path:inset(0 0 0 0 round 7px);clip-path:inset(0 0 0 0 round 7px);background:var(--v-background-lighten2);box-shadow:0 3px 4px rgba(0,0,0,.53);transition:opacity .15s ease,visibility .15s ease;opacity:0;visibility:hidden;overflow-y:auto;z-index:2}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .hashtag-list[data-v-51116497]{left:24px;right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list[data-v-51116497]{left:8px;right:8px;bottom:110px;max-height:calc(100vh - 152px);max-height:calc(100dvh - 152px);padding:6px 4px;border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list[data-v-51116497]{bottom:102px;max-height:calc(100% - 110px);padding:8px 4px;border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}.twitter-container .hashtag-list--display[data-v-51116497]{opacity:1;visibility:visible}.twitter-container .hashtag-list--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 74px)!important;max-height:calc(100vh - env(keyboard-inset-height, 0px) - 16px)!important;max-height:calc(100dvh - env(keyboard-inset-height, 0px) - 16px)!important}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 26px)!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 90px)!important;max-height:calc(100% - env(keyboard-inset-height, 0px) + 82px)!important}}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar{width:4px}}.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar-track{background:var(--v-background-lighten2)}.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar-thumb,.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar-thumb:hover{background:var(--v-gray-base)}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar{width:.1px;-webkit-appearance:none}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar{width:.1px;-webkit-appearance:none}}}.twitter-container .hashtag-list .hashtag-heading[data-v-51116497]{display:flex;align-items:center;font-weight:700;padding-left:8px;padding-right:4px}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list .hashtag-heading[data-v-51116497]{padding-left:4px;padding-right:2px}}.twitter-container .hashtag-list .hashtag-heading__text[data-v-51116497]{display:flex;align-items:center;flex-grow:1;font-size:14px}.twitter-container .hashtag-list .hashtag-heading__add-button[data-v-51116497]{display:flex;align-items:center;font-size:13px;padding:4px 8px;border-radius:5px;outline:none;cursor:pointer}.twitter-container .hashtag-list .hashtag-container[data-v-51116497]{display:flex;flex-direction:column}.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]{display:flex;position:relative!important;align-items:center;padding-top:1.5px;padding-bottom:1.5px;padding-left:8px;padding-right:4px;border-radius:7px;transition:background-color .15s ease;cursor:pointer}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]{padding-top:0;padding-bottom:0;padding-left:4px;padding-right:2px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]{padding-top:0;padding-bottom:0}}.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:first-of-type{margin-top:6px}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:first-of-type{margin-top:0}}.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:hover{background:hsla(0,0%,100%,.1)}@media(hover:none){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:hover{background:transparent}}.twitter-container .hashtag-list .hashtag-container .hashtag--editing[data-v-51116497]:hover{background:transparent}.twitter-container .hashtag-list .hashtag-container .hashtag--editing .hashtag__input[data-v-51116497]{box-shadow:0 0 0 3.5px rgba(79,130,230,.6);cursor:text}.twitter-container .hashtag-list .hashtag-container .hashtag__input[data-v-51116497]{display:block;flex-grow:1;border-radius:2px;color:var(--v-twitter-lighten2);opacity:1;outline:none;cursor:pointer;transition:box-shadow .09s ease;margin-right:4px;font-size:12.5px}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list .hashtag-container .hashtag__input[data-v-51116497]{position:absolute!important;left:-26px!important;width:calc(100% - 6px);margin-right:0;font-size:16px;transform:scale(.78125)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag__input[data-v-51116497]{position:absolute!important;left:-26px!important;width:calc(100% - 21px);margin-right:0;font-size:16px;transform:scale(.78125)}}}.twitter-container .hashtag-list .hashtag-container .hashtag__edit-button[data-v-51116497]{margin-left:auto}.twitter-container .hashtag-list .hashtag-container .hashtag__delete-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__edit-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__sort-handle[data-v-51116497]{display:flex;align-items:center;justify-content:center;width:19px;height:27px;border-radius:5px;outline:none;cursor:pointer}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag__delete-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__edit-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__sort-handle[data-v-51116497]{width:25px}}.twitter-container .hashtag-list .hashtag-container .hashtag__sort-handle[data-v-51116497]{cursor:move}.twitter-container .twitter-account-list[data-v-51116497]{position:absolute;left:12px;right:12px;bottom:48px;max-height:calc(100vh - 137px);max-height:calc(100dvh - 137px);border-radius:7px;-webkit-clip-path:inset(0 0 0 0 round 7px);clip-path:inset(0 0 0 0 round 7px);background:var(--v-background-lighten2);box-shadow:0 3px 4px rgba(0,0,0,.53);transition:opacity .15s ease,visibility .15s ease;opacity:0;visibility:hidden;overflow-y:auto;z-index:3}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .twitter-account-list[data-v-51116497]{left:24px;right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list[data-v-51116497]{left:8px;right:8px;bottom:40px;max-height:calc(100vh - 82px);max-height:calc(100dvh - 82px);border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list[data-v-51116497]{bottom:32px;max-height:calc(100% - 40px);border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}.twitter-container .twitter-account-list--display[data-v-51116497]{opacity:1;visibility:visible}.twitter-container .twitter-account-list[data-v-51116497]::-webkit-scrollbar-track{background:var(--v-background-lighten2)}.twitter-container .twitter-account-list[data-v-51116497]::-webkit-scrollbar-thumb,.twitter-container .twitter-account-list[data-v-51116497]::-webkit-scrollbar-thumb:hover{background:var(--v-gray-base)}.twitter-container .twitter-account-list .twitter-account[data-v-51116497]{display:flex;align-items:center;padding:12px 12px;border-radius:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account[data-v-51116497]{padding:8px 12px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account[data-v-51116497]{padding:8px 12px}}.twitter-container .twitter-account-list .twitter-account__icon[data-v-51116497]{display:block;width:50px;height:50px;border-radius:50%}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account__icon[data-v-51116497]{width:36px;height:36px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account__icon[data-v-51116497]{width:36px;height:36px}}.twitter-container .twitter-account-list .twitter-account__info[data-v-51116497]{display:flex;flex-direction:column;flex-grow:1;min-width:0;margin-left:12px}.twitter-container .twitter-account-list .twitter-account__name[data-v-51116497]{font-size:17px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account__name[data-v-51116497]{font-size:14px;line-height:1.3}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account__name[data-v-51116497]{font-size:14px;line-height:1.3}}.twitter-container .twitter-account-list .twitter-account__screen-name[data-v-51116497]{color:var(--v-text-darken1);font-size:14px}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account__screen-name[data-v-51116497]{font-size:13px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account__screen-name[data-v-51116497]{font-size:13px}}.twitter-container .twitter-account-list .twitter-account__check[data-v-51116497]{flex-shrink:0;color:var(--v-twitter-lighten1)}.watch-player__dplayer svg circle,.watch-player__dplayer svg path{fill:var(--v-text-base)!important}.watch-player__dplayer .dplayer-video-wrap{background:transparent!important}.watch-player__dplayer .dplayer-video-wrap .dplayer-video-wrap-aspect{transition:opacity .2s cubic-bezier(.4,.38,.49,.94);opacity:1}.watch-player__dplayer .dplayer-video-wrap .dplayer-danmaku{max-width:100%;max-height:calc(100% - var(--comment-area-vertical-margin, 0px));aspect-ratio:var(--comment-area-aspect-ratio,16/9);transition:max-height .5s cubic-bezier(.42,.19,.53,.87),aspect-ratio .5s cubic-bezier(.42,.19,.53,.87);will-change:aspect-ratio;overflow:hidden}.watch-player__dplayer .dplayer-video-wrap .dplayer-bml-browser{display:block;position:absolute;width:var(--bml-browser-width,960px);height:var(--bml-browser-height,540px);color:#000;overflow:hidden;transform-origin:center;transform:scale(var(--bml-browser-scale-factor-width,1),var(--bml-browser-scale-factor-height,1));aspect-ratio:16/9}.watch-player__dplayer .dplayer-video-wrap .dplayer-danloading,.watch-player__dplayer .dplayer-video-wrap .dplayer-loading-icon{display:none!important}.watch-player__dplayer .dplayer-controller-mask{height:82px!important;background:linear-gradient(180deg,transparent,#000000cf)!important;opacity:0!important;visibility:hidden;transition:opacity .3s ease,visibility .3s ease!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller-mask{height:66px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller-mask{height:66px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller-mask{height:66px!important}}.watch-player__dplayer .dplayer-controller{padding-left:86px!important;padding-bottom:6px!important;transition:opacity .3s ease,visibility .3s ease;opacity:0!important;visibility:hidden}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller{padding-left:18px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller{padding-left:18px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller{padding-left:18px!important}}.watch-player__dplayer .dplayer-controller .dplayer-live-badge,.watch-player__dplayer .dplayer-controller .dplayer-time{color:var(--v-text-base)!important}.watch-player__dplayer .dplayer-controller .dplayer-volume-bar{background:var(--v-text-base)!important}.watch-player__dplayer .dplayer-controller .dplayer-icons{bottom:auto!important}.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:22px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:11px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:11px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:11px!important}}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-in-icon{display:none!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-pip-icon:after{left:25%}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon:after{left:-20%}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-pip-icon:after{left:25%}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon:after{left:-20%}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-pip-icon:after{left:25%}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon:after{left:-20%}}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-capture-icon,.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-capture-icon{transition:background-color .08s ease;border-radius:6px}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-capture-icon.dplayer-capturing,.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-capture-icon.dplayer-capturing{background:var(--v-secondary-lighten1)}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-capture-icon.dplayer-capturing .dplayer-icon-content,.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-capture-icon.dplayer-capturing .dplayer-icon-content{opacity:1}.watch-player__dplayer .dplayer-controller .dplayer-comment-box{transition:opacity .3s ease,visibility .3s ease!important}.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-setting-icon{z-index:5}.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input{transition:box-shadow .09s ease;-moz-appearance:none;appearance:none;-webkit-appearance:none}.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input:focus{box-shadow:0 0 0 3.5px rgba(79,130,230,.6)}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input{width:114.2857%!important;height:114.2857%!important;font-size:16px!important;transform:scale(.875);transform-origin:0 0}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input{width:114.2857%!important;height:114.2857%!important;font-size:16px!important;transform:scale(.875);transform-origin:0 0}}}.watch-player__dplayer .dplayer-notice{padding:16px 22px!important;margin-right:30px;border-radius:4px!important;font-size:15px!important;line-height:1.6}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-notice{top:auto;left:16px!important;padding:12px 16px!important;margin-right:16px;font-size:13.5px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-notice{padding:12px 16px!important;margin-right:16px;font-size:13.5px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-notice{top:auto;left:16px!important;padding:12px 16px!important;margin-right:16px;font-size:13.5px!important}}.watch-player__dplayer .dplayer-info-panel{transition:top .3s,left .3s}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-setting-box{height:calc(100% - 60px)!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-setting-box{height:calc(100% - 60px)!important}}.watch-player__dplayer .dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-item--disabled{pointer-events:none}.watch-player__dplayer .dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-item--disabled .dplayer-label{color:#aaa}.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-title{color:var(--v-text-base)}.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-size span,.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-type span{border:1px solid --v-text-base}.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-size input:checked+span,.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:var(--v-text-base)}.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:98px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:18px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:18px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:18px!important}}.watch-player__dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller{transform:none!important}.watch-player--loading .dplayer-video-wrap-aspect{opacity:0!important}:root .dplayer-icon:hover .dplayer-icon-content,_::-webkit-full-page-media,_:future{opacity:.8!important}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask{opacity:1!important;visibility:visible!important}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:88px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:16px}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:98px;bottom:62px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px;bottom:62px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px;bottom:62px!important}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{top:82px;left:98px}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{left:16px}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:88px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:16px}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-mobile .dplayer-mobile-icon-wrap{opacity:.7!important;visibility:visible!important}.watch-container:not(.watch-container--control-display) .watch-player__dplayer .dplayer-danmaku{max-height:100%!important;aspect-ratio:16/9!important}.watch-container:not(.watch-container--control-display) .watch-player__dplayer .dplayer-notice{bottom:20px!important}.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-controller{padding-left:20px!important}.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:30px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:16px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:16px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:16px!important}}.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:20px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:16px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:16px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:16px!important}}.watch-container.watch-container--fullscreen .watch-header__back-icon{display:none!important}.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:30px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px!important}}.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-controller-mask{position:absolute;bottom:env(keyboard-inset-height,0)!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-controller-mask{bottom:0!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-controller-mask{bottom:0!important}}.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-icons.dplayer-comment-box{position:absolute;bottom:calc(env(keyboard-inset-height, 0px) + 4px)!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-icons.dplayer-comment-box{bottom:6px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-icons.dplayer-comment-box{bottom:6px!important}}.shortcut-key[data-v-040fbec5]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;min-width:32px;min-height:28px;padding:3px 8px;border-radius:5px;background-color:var(--v-background-lighten2);font-size:14.5px;text-align:center}.shortcut-key-plus[data-v-040fbec5]{display:inline-block;margin:0 5px;flex-shrink:0}.route-container[data-v-040fbec5]{height:100vh!important;height:100dvh!important;background:var(--v-black-base)!important;overflow:hidden}@supports(-webkit-touch-callout:none){.route-container[data-v-040fbec5]{height:-webkit-fill-available!important}}.watch-container[data-v-040fbec5]{display:flex;width:calc(100% + 352px);height:100%;transition:width .4s cubic-bezier(.26,.68,.55,.99)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container[data-v-040fbec5]{flex-direction:column;width:100%}}@media(max-width:1000px)and (max-height:450px){.watch-container[data-v-040fbec5]{width:calc(100% + 310px)}}@media(max-width:600px)and (min-height:450.01px){.watch-container[data-v-040fbec5]{flex-direction:column;width:100%;padding-bottom:56px}}.watch-container.watch-container--control-display .watch-content[data-v-040fbec5]{cursor:auto!important}.watch-container.watch-container--control-display .watch-header[data-v-040fbec5],.watch-container.watch-container--control-display .watch-navigation[data-v-040fbec5],.watch-container.watch-container--control-display .watch-player__button[data-v-040fbec5]{opacity:1!important;visibility:visible!important}.watch-container.watch-container--panel-display[data-v-040fbec5]{width:100%}.watch-container.watch-container--panel-display .switch-button-panel .switch-button-icon[data-v-040fbec5]{color:var(--v-primary-base)}@media(hover:none){.watch-container.watch-container--panel-display .watch-panel[data-v-040fbec5]{content-visibility:auto}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container[data-v-040fbec5]{width:100%}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px)and (hover:none){.watch-container .watch-panel[data-v-040fbec5]{content-visibility:auto}}@media(max-width:600px)and (min-height:450.01px){.watch-container[data-v-040fbec5]{width:100%}}@media(max-width:600px)and (min-height:450.01px)and (hover:none){.watch-container .watch-panel[data-v-040fbec5]{content-visibility:auto}}.watch-container.watch-container--fullscreen .watch-navigation[data-v-040fbec5]{display:none}.watch-container.watch-container--fullscreen .watch-content .watch-header[data-v-040fbec5]{padding-left:30px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen .watch-content .watch-header[data-v-040fbec5]{padding-left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen .watch-content .watch-header[data-v-040fbec5]{padding-left:16px}}.watch-container .watch-navigation[data-v-040fbec5]{display:flex;flex-direction:column;position:fixed;width:68px;top:0;left:0;bottom:-100px;padding:18px 8px 122px;background:#2f221f80;transition:opacity .3s,visibility .3s;opacity:0;visibility:hidden;z-index:10}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-navigation[data-v-040fbec5]{display:none}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation[data-v-040fbec5]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-navigation[data-v-040fbec5]{display:none}}.watch-container .watch-navigation .watch-navigation__icon[data-v-040fbec5]{display:flex;justify-content:center;align-items:center;height:52px;margin-bottom:17px;border-radius:11px;font-size:16px;color:var(--v-text-base);transition:background-color .15s;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__icon[data-v-040fbec5]{height:32px;border-radius:10px}.watch-container .watch-navigation div.spacer[data-v-040fbec5]{display:none}}.watch-container .watch-navigation .watch-navigation__link[data-v-040fbec5]{display:flex;justify-content:center;align-items:center;height:52px;border-radius:11px;font-size:16px;color:var(--v-text-base);transition:background-color .15s;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__link[data-v-040fbec5]{height:44px;border-radius:10px}.watch-container .watch-navigation .watch-navigation__link[data-v-040fbec5]:last-child,.watch-container .watch-navigation .watch-navigation__link[data-v-040fbec5]:nth-last-child(2){display:none}}.watch-container .watch-navigation .watch-navigation__link[data-v-040fbec5]:hover{background:#433532a0}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__link-icon[data-v-040fbec5]{width:26px;height:26px}}.watch-container .watch-navigation .watch-navigation__link--active[data-v-040fbec5]{color:var(--v-primary-base);background:#433532a0}.watch-container .watch-navigation .watch-navigation__link+.watch-navigation__link[data-v-040fbec5]{margin-top:4px}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__link+.watch-navigation__link[data-v-040fbec5]{margin-top:auto}}.watch-container .watch-content[data-v-040fbec5]{display:flex;position:relative;width:100%;cursor:none}.watch-container .watch-content .watch-header[data-v-040fbec5]{display:flex;align-items:center;position:absolute;top:0;left:0;width:100%;height:82px;padding-left:98px;padding-right:30px;background:linear-gradient(180deg,#000000cf,transparent);transition:opacity .3s,visibility .3s;opacity:0;visibility:hidden;z-index:5}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header[data-v-040fbec5]{height:66px;padding-left:16px;padding-right:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header[data-v-040fbec5]{padding-left:84px;padding-right:16px;height:66px;padding-left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header[data-v-040fbec5]{display:none;height:50px;padding-left:16px;padding-right:16px}}.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-040fbec5]{display:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-040fbec5]{display:flex;position:relative!important;align-items:center;justify-content:center;flex-shrink:0;width:40px;height:40px;left:-6px;padding:6px;margin-right:2px;border-radius:50%;color:var(--v-text-base)}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-040fbec5]{display:flex;position:relative!important;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;left:-6px;padding:6px;margin-right:2px;border-radius:50%;color:var(--v-text-base)}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-040fbec5]{display:flex;position:relative!important;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;left:-6px;padding:6px;margin-right:2px;border-radius:50%;color:var(--v-text-base)}}.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-040fbec5]{display:inline-block;flex-shrink:0;width:64px;height:36px;border-radius:5px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-040fbec5]{width:48px;height:28px;border-radius:4px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-040fbec5]{width:48px;height:28px;border-radius:4px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-040fbec5]{display:none}}.watch-container .watch-content .watch-header .watch-header__program-title[data-v-040fbec5]{margin-left:18px;font-size:18px;font-weight:700;font-feature-settings:"palt" 1;letter-spacing:.05em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header .watch-header__program-title[data-v-040fbec5]{margin-left:12px;font-size:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__program-title[data-v-040fbec5]{margin-left:12px;font-size:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__program-title[data-v-040fbec5]{margin-left:0;font-size:16px}}.watch-container .watch-content .watch-header .watch-header__program-time[data-v-040fbec5]{flex-shrink:0;margin-left:16px;font-size:15px;font-weight:600}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__program-time[data-v-040fbec5]{margin-left:8px;font-size:14px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__program-time[data-v-040fbec5]{margin-left:8px;font-size:14px}}.watch-container .watch-content .watch-header .watch-header__now[data-v-040fbec5]{flex-shrink:0;margin-left:16px;font-size:13px;font-weight:600}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__now[data-v-040fbec5]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__now[data-v-040fbec5]{display:none}}.watch-container .watch-content .watch-player[data-v-040fbec5]{display:flex;position:relative;width:100%;height:100%;background-size:contain;background-position:50%}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player[data-v-040fbec5]{aspect-ratio:16/9}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player[data-v-040fbec5]{aspect-ratio:16/9}}.watch-container .watch-content .watch-player .watch-player__background-wrapper[data-v-040fbec5]{position:absolute;top:0;left:0;width:100%;height:100%}.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background[data-v-040fbec5]{position:relative;top:50%;left:50%;max-height:100%;aspect-ratio:16/9;transform:translate(-50%,-50%);background-blend-mode:overlay;background-color:rgba(14,14,18,.35);background-size:cover;background-image:none;opacity:0;visibility:hidden;transition:opacity .4s cubic-bezier(.4,.38,.49,.94),visibility .4s cubic-bezier(.4,.38,.49,.94);will-change:opacity}.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background--display[data-v-040fbec5]{opacity:1;visibility:visible}.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-040fbec5]{display:inline-block;position:absolute;height:34px;right:56px;bottom:44px;filter:drop-shadow(0 0 5px var(--v-black-base))}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-040fbec5]{height:30px;right:34px;bottom:30px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-040fbec5]{height:25px;right:30px;bottom:24px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-040fbec5]{height:22px;right:30px;bottom:24px}}.watch-container .watch-content .watch-player .watch-player__buffering[data-v-040fbec5]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--v-background-lighten3);filter:drop-shadow(0 0 3px rgba(0,0,0,.3));opacity:0;visibility:hidden;transition:opacity .2s cubic-bezier(.4,.38,.49,.94),visibility .2s cubic-bezier(.4,.38,.49,.94);will-change:opacity;z-index:3}.watch-container .watch-content .watch-player .watch-player__buffering--display[data-v-040fbec5]{opacity:1;visibility:visible}.watch-container .watch-content .watch-player .watch-player__dplayer[data-v-040fbec5]{width:100%}.watch-container .watch-content .watch-player .watch-player__button[data-v-040fbec5]{display:flex;justify-content:space-around;flex-direction:column;position:absolute;top:50%;right:28px;height:190px;transform:translateY(-50%);opacity:0;visibility:hidden;transition:opacity .3s,visibility .3s}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player .watch-player__button[data-v-040fbec5]{right:15px;height:128px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__button[data-v-040fbec5]{right:15px;height:155px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button[data-v-040fbec5]{right:15px;height:100px}}.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-040fbec5]{display:flex;justify-content:center;align-items:center;width:48px;height:48px;color:var(--v-text-base);background:#2f221fc0;border-radius:7px;transition:background-color .15s;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-040fbec5]{width:38px;height:38px;border-radius:5px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-040fbec5]{width:38px;height:38px;border-radius:5px}}.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-040fbec5]:hover{background:#2f221ff0}@media(hover:none){.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-040fbec5]:hover{background:#2f221fc0}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__button .switch-button svg[data-v-040fbec5]{height:27px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button svg[data-v-040fbec5]{height:27px}}.watch-container .watch-content .watch-player .watch-player__button .switch-button .switch-button-icon[data-v-040fbec5]{position:relative}.watch-container .watch-content .watch-player .watch-player__button .switch-button-up>.switch-button-icon[data-v-040fbec5]{top:6px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button-panel[data-v-040fbec5]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button-panel[data-v-040fbec5]{display:none}}.watch-container .watch-content .watch-player .watch-player__button .switch-button-panel>.switch-button-icon[data-v-040fbec5]{top:1.5px;transition:color .4s cubic-bezier(.26,.68,.55,.99)}.watch-container .watch-content .watch-player .watch-player__button .switch-button-down>.switch-button-icon[data-v-040fbec5]{bottom:4px}.watch-container .watch-panel[data-v-040fbec5]{display:flex;flex-direction:column;flex-shrink:0;width:352px;height:100%;background:var(--v-background-base)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel[data-v-040fbec5]{width:100%;height:auto;flex-grow:1}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel[data-v-040fbec5]{width:310px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel[data-v-040fbec5]{width:100%;height:auto;flex-grow:1}}@media(hover:none){.watch-container .watch-panel[data-v-040fbec5]{content-visibility:hidden}}.watch-container .watch-panel .watch-panel__header[data-v-040fbec5]{display:flex;align-items:center;flex-shrink:0;width:100%;height:70px;padding-left:16px;padding-right:16px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__header[data-v-040fbec5]{display:none}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__header[data-v-040fbec5]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__header[data-v-040fbec5]{display:none}}.watch-container .watch-panel .watch-panel__header .panel-close-button[data-v-040fbec5]{display:flex;position:relative;align-items:center;flex-shrink:0;left:-4px;height:35px;padding:0 4px;border-radius:5px;font-size:16px;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}.watch-container .watch-panel .watch-panel__header .panel-close-button__icon[data-v-040fbec5]{position:relative;left:-4px}.watch-container .watch-panel .watch-panel__header .panel-close-button__text[data-v-040fbec5]{font-weight:700}.watch-container .watch-panel .watch-panel__header .panel-broadcaster[data-v-040fbec5]{display:flex;align-items:center;min-width:0;margin-left:16px}.watch-container .watch-panel .watch-panel__header .panel-broadcaster__icon[data-v-040fbec5]{display:inline-block;flex-shrink:0;width:43px;height:24px;border-radius:3px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover;-webkit-user-select:none;-moz-user-select:none;user-select:none}.watch-container .watch-panel .watch-panel__header .panel-broadcaster__number[data-v-040fbec5]{flex-shrink:0;margin-left:8px;font-size:16px}.watch-container .watch-panel .watch-panel__header .panel-broadcaster__name[data-v-040fbec5]{margin-left:5px;font-size:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__header .panel-broadcaster__name[data-v-040fbec5]{font-size:14px}}.watch-container .watch-panel .watch-panel__content-container[data-v-040fbec5]{position:relative;height:100%}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content[data-v-040fbec5]{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--v-background-base);transition:opacity .2s,visibility .2s;opacity:0;visibility:hidden}@media(hover:none){.watch-container .watch-panel .watch-panel__content-container .watch-panel__content[data-v-040fbec5]{transition:none;content-visibility:hidden}}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content--active[data-v-040fbec5]{opacity:1;visibility:visible;content-visibility:auto}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content-remocon-button[data-v-040fbec5]{display:flex;align-items:center;justify-content:center;position:absolute;right:16px;bottom:16px;width:48px;height:48px;border-radius:50%;background:var(--v-background-lighten1);outline:none;transition:opacity .2s,visibility .2s;opacity:0;visibility:hidden}@media(hover:none){.watch-container .watch-panel .watch-panel__content-container .watch-panel__content-remocon-button[data-v-040fbec5]{transition:none}}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content-remocon-button--active[data-v-040fbec5]{opacity:1;visibility:visible}.watch-container .watch-panel .watch-panel__navigation[data-v-040fbec5]{display:flex;align-items:center;justify-content:space-evenly;flex-shrink:0;height:77px;background:var(--v-background-lighten1)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation[data-v-040fbec5]{height:48px;background:var(--v-background-base)}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__navigation[data-v-040fbec5]{height:34px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation[data-v-040fbec5]{height:44px;background:var(--v-background-base)}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-040fbec5]{display:flex;justify-content:center;align-items:center;flex-direction:column;width:77px;height:56px;padding:6px 0;border-radius:5px;color:var(--v-text-base);box-sizing:content-box;transition:color .3s;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-040fbec5]{width:100px;height:40px;padding:5px 0;box-sizing:border-box}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-040fbec5]{height:34px;padding:5px 0;box-sizing:border-box}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-040fbec5]{height:34px;padding:5px 0;box-sizing:border-box}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active .panel-navigation-button__icon[data-v-040fbec5],.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active[data-v-040fbec5]{color:var(--v-primary-base)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active[data-v-040fbec5]{background:#5b2d3c}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active[data-v-040fbec5]{background:#5b2d3c}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__icon[data-v-040fbec5]{height:34px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__icon[data-v-040fbec5]{color:var(--v-text-base)}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__icon[data-v-040fbec5]{color:var(--v-text-base)}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-040fbec5]{margin-top:5px;font-size:13px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-040fbec5]{display:none}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-040fbec5]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-040fbec5]{display:none}} \ No newline at end of file +@font-face{font-family:Noto Sans JP Caption;font-weight:400;src:url(https://cdn.jsdelivr.net/npm/noto-sans-japanese@1.0.0/fonts/NotoSansJP-Medium.woff2) format("woff2")}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v34/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4uaVIGxA.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v34/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVI.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:700;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:"Open Sans (for iOS Safari)";font-style:normal;font-weight:700;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v34/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}html{overflow-y:auto!important;touch-action:manipulation}body .v-application{min-height:100vh;min-height:100dvh;font-family:YakuHanJPs,Open Sans,Hiragino Sans,Noto Sans JP,sans-serif;font-weight:500;overflow-x:clip;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@supports(-webkit-touch-callout:none){body .v-application{min-height:-webkit-fill-available;font-family:YakuHanJPs,"Open Sans (for iOS Safari)",Hiragino Sans,Noto Sans JP,sans-serif;font-weight:400}}body .v-application .v-application--wrap{min-height:100%!important}body main{display:flex;width:100%;min-height:100%}body header+main{padding-top:65px!important}@media(max-width:1000px)and (max-height:450px){body header+main{padding-top:0!important;padding-left:env(safe-area-inset-left)!important;padding-right:env(safe-area-inset-right)!important}}@media(max-width:600px)and (min-height:450.01px){body header+main{padding-top:0!important;padding-bottom:calc(env(safe-area-inset-bottom) + 56px)!important}}body .route-container{height:100%;background:var(--v-background-base)}.v-btn{letter-spacing:0!important;text-transform:none!important}@media(max-width:600px)and (min-height:450.01px){.v-snack{padding-bottom:56px!important}}.v-snack .v-btn__content{color:var(--v-primary-lighten1);letter-spacing:.3}.v-snack .error .v-btn__content,.v-snack .info .v-btn__content,.v-snack .success .v-btn__content,.v-snack .warning .v-btn__content{color:var(--v-text-base);letter-spacing:.3}.v-snack:not(.v-snack--absolute){height:100dvh!important}@media(max-width:600px)and (min-height:450.01px){.v-dialog{margin:24px 6px!important}.v-dialog--fullscreen{margin:0!important}}.v-popper--theme-tooltip .v-popper__inner{display:inline-block;padding:4px 10px;border-radius:4px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:12px;font-family:YakuHanJPs,Open Sans,Hiragino Sans,Noto Sans JP,sans-serif;font-weight:500;opacity:.9;line-height:22px}.v-popper--theme-tooltip .v-popper__arrow-container{display:none}@media(hover:none){:hover:before{background-color:transparent!important}}::-moz-selection{background-color:#e64f9780}::selection{background-color:#e64f9780}.decorate-symbol{display:inline-flex;justify-content:center;align-items:center;position:relative;padding:0 3px;margin-left:2.5px;margin-right:2.5px;border-radius:4px;color:var(--v-text-base);background:var(--v-primary-base);font-size:.94em}*{scrollbar-color:var(--v-gray-base) var(--v-background-base);scrollbar-width:thin}::-webkit-scrollbar{width:7px;height:7px}::-webkit-scrollbar-track{background:var(--v-background-base)}::-webkit-scrollbar-thumb{background:var(--v-background-lighten2)}::-webkit-scrollbar-thumb:hover{background:var(--v-gray-base)}@media(max-width:600px)and (min-height:450.01px){.v-menu__content .v-list{background-color:var(--v-background-lighten1)!important}}.v-menu__content::-webkit-scrollbar{width:12px;height:12px}.v-menu__content::-webkit-scrollbar-thumb{border:solid 3.5px var(--v-background-base)}.v-card__text{font-weight:inherit!important}.v-enter-active,.v-leave-active{transition:opacity .25s}.v-enter,.v-leave-to{opacity:0}.v-enter-active.route-container{position:fixed;top:0;left:0;right:0}.cursor-pointer{cursor:pointer}.w-25{width:25%}.w-50{width:50%}.w-75{width:75%}.w-100{width:100%}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.header[data-v-84897154]{position:fixed;display:flex;align-items:center;width:100%;height:65px;padding:4px 16px;background:var(--v-background-base);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);z-index:10}@media(max-width:1000px)and (max-height:450px){.header[data-v-84897154]{width:210px;height:48px;justify-content:center}}@media(max-width:680px)and (max-height:450px){.header[data-v-84897154]{width:190px}}@media(max-width:600px)and (min-height:450.01px){.header[data-v-84897154]{display:none}}@media(max-width:1000px)and (max-height:450px){.header .spacer[data-v-84897154]{display:none}}.header .konomitv-logo[data-v-84897154]{display:block;padding:12px 8px;border-radius:8px}@media(max-width:1000px)and (max-height:450px){.header .konomitv-logo[data-v-84897154]{margin:0!important}}.header .konomitv-logo__image[data-v-84897154]{display:block}@media(max-width:1000px)and (max-height:450px){.header .konomitv-logo__image[data-v-84897154]{height:19.5px}}.bottom-navigation-container[data-v-3df53df3]{display:none;position:fixed;bottom:0;z-index:8}@media(max-width:600px)and (min-height:450.01px){.bottom-navigation-container[data-v-3df53df3]{display:flex;padding-bottom:env(safe-area-inset-bottom);box-sizing:content-box}}.bottom-navigation-container .v-btn.bottom-navigation-button[data-v-3df53df3]{color:var(--v-text-darken1)!important;font-weight:700}.bottom-navigation-container .v-btn.bottom-navigation-button.v-btn--active[data-v-3df53df3]{color:var(--v-primary-base)!important}.navigation-container[data-v-5b40940b]{flex-shrink:0;width:220px;background:var(--v-background-lighten1)}@media(max-width:1000px)and (max-height:450px){.navigation-container[data-v-5b40940b]{width:210px}}@media(max-width:680px)and (max-height:450px){.navigation-container[data-v-5b40940b]{width:190px}}@media(max-width:600px)and (min-height:450.01px){.navigation-container[data-v-5b40940b]{display:none}}.navigation-container .navigation[data-v-5b40940b]{position:fixed;width:220px;top:65px;left:0;bottom:-100px;padding-bottom:100px;background:var(--v-background-lighten1);z-index:1}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation[data-v-5b40940b]{top:48px;width:210px}}@media(max-width:680px)and (max-height:450px){.navigation-container .navigation[data-v-5b40940b]{width:190px}}.navigation-container .navigation .navigation-scroll[data-v-5b40940b]{display:flex;flex-direction:column;height:100%;padding:22px 12px;overflow-y:auto}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll[data-v-5b40940b]{padding:10px 12px}}@media(max-width:680px)and (max-height:450px){.navigation-container .navigation .navigation-scroll[data-v-5b40940b]{padding:10px 8px}}.navigation-container .navigation .navigation-scroll[data-v-5b40940b]::-webkit-scrollbar-track{background:var(--v-background-lighten1)}.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]{display:flex;align-items:center;flex-shrink:0;height:52px;padding-left:16px;margin-top:4px;border-radius:11px;font-size:16px;color:var(--v-text-base);transition:background-color .15s;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]{height:40px;padding-left:12px;border-radius:9px;font-size:15px}}.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]:hover{background:var(--v-background-lighten2)}.navigation-container .navigation .navigation-scroll .navigation__link[data-v-5b40940b]:first-of-type{margin-top:0}.navigation-container .navigation .navigation-scroll .navigation__link--active[data-v-5b40940b]{color:var(--v-primary-base);background:#5b2d3c}.navigation-container .navigation .navigation-scroll .navigation__link--active[data-v-5b40940b]:hover{background:#5b2d3c}.navigation-container .navigation .navigation-scroll .navigation__link--highlight[data-v-5b40940b]{color:var(--v-secondary-lighten1)}.navigation-container .navigation .navigation-scroll .navigation__link--version[data-v-5b40940b]{font-size:15px}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll .navigation__link--version[data-v-5b40940b]{font-size:14.5px}}.navigation-container .navigation .navigation-scroll .navigation__link .navigation__link-icon[data-v-5b40940b]{margin-right:14px}@media(max-width:1000px)and (max-height:450px){.navigation-container .navigation .navigation-scroll .navigation__link .navigation__link-icon[data-v-5b40940b]{margin-right:10px}.login-container-wrapper[data-v-851c3dec]{padding:20px!important;margin-bottom:0!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper[data-v-851c3dec]{margin-bottom:0!important}}.login-container-wrapper .login-container[data-v-851c3dec]{border-radius:11px}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container[data-v-851c3dec]{padding:24px!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container[data-v-851c3dec]{padding:32px 20px!important;margin-left:12px!important;margin-right:12px!important}}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container .login__logo[data-v-851c3dec]{padding-top:4px!important;padding-bottom:8px!important}.login-container-wrapper .login-container .login__logo .v-image[data-v-851c3dec]{max-width:200px!important}.login-container-wrapper .login-container .login__logo h4[data-v-851c3dec]{margin-top:16px!important;font-size:19px!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container .login__logo[data-v-851c3dec]{padding-top:4px!important;padding-bottom:12px!important}.login-container-wrapper .login-container .login__logo .v-image[data-v-851c3dec]{max-width:200px!important}.login-container-wrapper .login-container .login__logo h4[data-v-851c3dec]{margin-top:24px!important;font-size:19px!important}}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container .v-input[data-v-851c3dec]{margin-top:24px!important;font-size:14px!important}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container .v-input[data-v-851c3dec]{margin-top:32px!important;font-size:16px!important}}.login-container-wrapper .login-container .login-button[data-v-851c3dec]{border-radius:7px;margin-top:48px!important;font-size:18px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.login-container-wrapper .login-container .login-button[data-v-851c3dec]{height:44px!important;margin-top:24px!important;font-size:16px}}@media(max-width:600px)and (min-height:450.01px){.login-container-wrapper .login-container .login-button[data-v-851c3dec]{height:50px!important;margin-top:32px!important;font-size:15.5px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){h1[data-v-1310cfee]{font-size:24px!important}}@media(max-width:1000px)and (max-height:450px){h1[data-v-1310cfee]{font-size:24px!important}}@media(max-width:600px)and (min-height:450.01px){h1[data-v-1310cfee]{font-size:24px!important;text-align:center}}@media(max-width:1000px)and (max-height:450px){span[data-v-1310cfee]{font-size:15px!important}}@media(max-width:600px)and (min-height:450.01px){span[data-v-1310cfee]{font-size:14px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper[data-v-6533f3d0]{padding:20px!important;margin-bottom:0!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper[data-v-6533f3d0]{margin-bottom:0!important}}.register-container-wrapper .register-container[data-v-6533f3d0]{border-radius:11px}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container[data-v-6533f3d0]{padding:24px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container[data-v-6533f3d0]{padding:32px 20px!important;margin-left:12px!important;margin-right:12px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .register__logo[data-v-6533f3d0]{padding-top:4px!important;padding-bottom:8px!important}.register-container-wrapper .register-container .register__logo .v-image[data-v-6533f3d0]{max-width:200px!important}.register-container-wrapper .register-container .register__logo h4[data-v-6533f3d0]{margin-top:16px!important;font-size:19px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .register__logo[data-v-6533f3d0]{padding-top:4px!important;padding-bottom:12px!important}.register-container-wrapper .register-container .register__logo .v-image[data-v-6533f3d0]{max-width:200px!important}.register-container-wrapper .register-container .register__logo h4[data-v-6533f3d0]{margin-top:24px!important;font-size:19px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]{margin-top:0!important;font-size:14px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]{margin-top:2px!important;font-size:16px!important}}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]:first-child{margin-top:24px!important}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .v-input[data-v-6533f3d0]:first-child{margin-top:32px!important}}.register-container-wrapper .register-container .register-button[data-v-6533f3d0]{border-radius:7px;margin-top:18px!important;font-size:18px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.register-container-wrapper .register-container .register-button[data-v-6533f3d0]{height:44px!important;margin-top:0!important;font-size:16px}}@media(max-width:600px)and (min-height:450.01px){.register-container-wrapper .register-container .register-button[data-v-6533f3d0]{height:50px!important;margin-top:2px!important;font-size:15.5px}}.settings-container[data-v-7802007e]{width:100%;min-width:0}@media(max-width:1000px)and (max-height:450px){.settings-container[data-v-7802007e]{padding:16px 20px!important}}@media(max-width:680px)and (max-height:450px){.settings-container[data-v-7802007e]{padding:16px 16px!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container[data-v-7802007e]{padding:0 0!important}}.settings-container .settings-navigation[data-v-7802007e]{position:sticky;top:85px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings-navigation[data-v-7802007e]{display:none}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings-navigation[data-v-7802007e]{display:none}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings-navigation[data-v-7802007e]{display:none}}.settings-container .settings-navigation .v-list-item--link[data-v-7802007e],.settings-container .settings-navigation .v-list-item--link[data-v-7802007e]:before{border-radius:11px!important}.settings-container .settings[data-v-7802007e]{width:100%;min-width:0;border-radius:11px!important;background-color:var(--v-background-lighten1)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e]{margin-left:0!important;padding-top:20px!important;padding-left:20px!important;padding-right:20px!important}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e]{padding:20px!important;margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e]{margin-left:0!important;padding-top:60px!important;padding-left:16px!important;padding-right:16px!important;border-radius:0!important;background-color:var(--v-background-base)}}.settings-container .settings[data-v-7802007e] .settings__heading{display:flex;align-items:center;font-size:22px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading{font-size:20px}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading{position:fixed;top:0;left:0;right:0;height:60px;padding:16px;border-radius:0;background:var(--v-background-lighten1);box-shadow:0 3px 14px 2px rgba(0,0,0,.12);z-index:5}}.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:none;position:relative;left:-6px;padding:6px;border-radius:50%;color:var(--v-text-base)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:flex}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:flex}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button{display:flex}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg{display:none}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg{display:none}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg{display:none}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg+span{margin-left:0!important}}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg+span{margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings[data-v-7802007e] .settings__heading .settings__back-button+svg+span{margin-left:0!important}}.settings-container .settings[data-v-7802007e] .settings__content{margin-top:24px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content{margin-top:16px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item{display:flex;position:relative;flex-direction:column;margin-top:24px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item{margin-top:16px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--sync-disabled .settings__item-heading{padding-right:8px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--sync-disabled .settings__item-heading:after{content:"デバイス間同期無効";display:flex;align-items:center;flex-shrink:0;position:relative;right:-8px;padding:2px 4px;margin-left:auto;border-radius:4px;background:var(--v-background-lighten2);font-size:11px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch{margin-right:62px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch .settings__item-heading{width:calc(100% + 62px)}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch .settings__item-heading,.settings-container .settings[data-v-7802007e] .settings__content .settings__item--switch .settings__item-label{cursor:pointer}.settings-container .settings[data-v-7802007e] .settings__content .settings__item--disabled{opacity:.5}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-heading{display:flex;align-items:center;color:var(--v-text-base);font-size:16.5px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item-heading{font-size:15px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-label{margin-top:8px;color:var(--v-text-darken1);font-size:13.5px;line-height:1.6}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item-label{font-size:11px;line-height:1.7}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-form{margin-top:14px}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__item-form{font-size:13.5px}}.settings-container .settings[data-v-7802007e] .settings__content .settings__item-switch{align-items:center;position:absolute;top:0;right:-74px;bottom:0;margin-top:0}.settings-container .settings[data-v-7802007e] .settings__content .settings__item p{margin-bottom:8px}.settings-container .settings[data-v-7802007e] .settings__content .settings__item p:last-of-type{margin-bottom:0}.settings-container .settings[data-v-7802007e] .settings__content .settings__save-button{height:45px;background:var(--v-background-lighten2);font-size:15.5px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.settings-container .settings[data-v-7802007e] .settings__content .settings__save-button{height:40px;padding:0 12px;font-size:14px}}.settings__content[data-v-3ec6610e]{opacity:1;transition:opacity .4s}.settings__content--loading[data-v-3ec6610e]{opacity:0}@media(max-width:600px)and (min-height:450.01px){.settings__conflict-dialog .v-btn[data-v-3ec6610e]{height:50px!important;text-align:left}}.settings__conflict-dialog .v-btn br.smartphone-vertical-only[data-v-3ec6610e]{display:none}@media(max-width:600px)and (min-height:450.01px){.settings__conflict-dialog .v-btn br.smartphone-vertical-only[data-v-3ec6610e]{display:inline}}.account[data-v-3ec6610e]{display:flex;align-items:center;height:130px;padding:18px 20px;border-radius:15px;background:var(--v-background-lighten2)}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px}}@media(max-width:1000px)and (max-height:450px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px;border-radius:10px}}@media(max-width:600px)and (min-height:450.01px){.account[data-v-3ec6610e]{align-items:normal;flex-direction:column;height:auto;padding:16px 12px;border-radius:10px}}.account-wrapper[data-v-3ec6610e]{display:flex;align-items:center;min-width:0;height:94px}@media(max-width:1000px)and (max-height:450px){.account-wrapper[data-v-3ec6610e]{height:80px}}@media(max-width:600px)and (min-height:450.01px){.account-wrapper[data-v-3ec6610e]{height:70px}}.account__icon[data-v-3ec6610e]{flex-shrink:0;min-width:94px;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));image-rendering:-webkit-optimize-contrast}@media(max-width:1000px)and (max-height:450px){.account__icon[data-v-3ec6610e]{min-width:80px}}@media(max-width:600px)and (min-height:450.01px){.account__icon[data-v-3ec6610e]{min-width:70px}}.account__info[data-v-3ec6610e]{display:flex;flex-direction:column;min-width:0;margin-left:20px;margin-right:12px}@media(max-width:600px)and (min-height:450.01px){.account__info[data-v-3ec6610e]{margin-left:12px!important;margin-right:0!important}}.account__info-name[data-v-3ec6610e]{display:inline-flex;align-items:center;height:33px}.account__info-name-text[data-v-3ec6610e]{display:inline-block;font-size:23px;color:var(--v-text-base);font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.account__info-name-text[data-v-3ec6610e]{font-size:21px}}@media(max-width:600px)and (min-height:450.01px){.account__info-name-text[data-v-3ec6610e]{font-size:20px}}.account__info-admin[data-v-3ec6610e]{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:52px;height:28px;margin-left:10px;border-radius:5px;background:var(--v-secondary-base);font-size:14px;font-weight:500;line-height:2}@media(max-width:1000px)and (max-height:450px){.account__info-admin[data-v-3ec6610e]{width:45px;height:24px;border-radius:4px;font-size:11.5px}}@media(max-width:600px)and (min-height:450.01px){.account__info-admin[data-v-3ec6610e]{width:45px;height:24px;border-radius:4px;font-size:11.5px}}.account__info-id[data-v-3ec6610e]{display:inline-block;margin-top:2px;color:var(--v-text-darken1);font-size:16px}@media(max-width:1000px)and (max-height:450px){.account__info-id[data-v-3ec6610e]{font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.account__info-id[data-v-3ec6610e]{font-size:14.5px}}.account__login[data-v-3ec6610e]{border-radius:7px;font-size:16px;letter-spacing:0}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account__login[data-v-3ec6610e]{height:50px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account__login[data-v-3ec6610e]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.account__login[data-v-3ec6610e]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.account__login[data-v-3ec6610e]{height:42px!important;margin-top:16px;margin-right:auto;font-size:14.5px}}.account-register[data-v-3ec6610e]{display:flex;flex-direction:column;margin-top:28px}.account-register__heading[data-v-3ec6610e]{font-size:21px;font-weight:700;text-align:center;font-feature-settings:"palt" 1;letter-spacing:.04em}@media(max-width:1000px)and (max-height:450px){.account-register__heading[data-v-3ec6610e]{font-size:19px}}@media(max-width:600px)and (min-height:450.01px){.account-register__heading[data-v-3ec6610e]{font-size:18px}}.account-register__feature[data-v-3ec6610e]{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:18px;grid-column-gap:16px;margin-top:28px}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}@media(max-width:1000px)and (max-height:450px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}@media(max-width:600px)and (min-height:450.01px){.account-register__feature[data-v-3ec6610e]{grid-template-columns:1fr}}.account-register__feature .account-feature[data-v-3ec6610e]{display:flex;align-items:center}.account-register__feature .account-feature__icon[data-v-3ec6610e]{width:46px;height:46px;flex-shrink:0;margin-right:16px;color:var(--v-secondary-lighten1)}.account-register__feature .account-feature__info[data-v-3ec6610e]{display:flex;flex-direction:column}.account-register__feature .account-feature__info-heading[data-v-3ec6610e]{font-size:15px}.account-register__feature .account-feature__info-text[data-v-3ec6610e]{margin-top:3px;color:var(--v-text-darken1);font-size:12.5px;line-height:1.65}.account-register__description[data-v-3ec6610e]{margin-top:32px;font-size:15px;line-height:1.7;text-align:center}.account-register__description br.smartphone-vertical-only[data-v-3ec6610e]{display:none}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.account-register__description[data-v-3ec6610e]{font-size:12.5px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account-register__description[data-v-3ec6610e]{font-size:10.5px}}@media(max-width:1000px)and (max-height:450px){.account-register__description[data-v-3ec6610e]{font-size:12.5px}}@media(max-width:680px)and (max-height:450px){.account-register__description[data-v-3ec6610e]{font-size:10.5px}}@media(max-width:600px)and (min-height:450.01px){.account-register__description[data-v-3ec6610e]{font-size:12.5px}.account-register__description br.smartphone-vertical-only[data-v-3ec6610e]{display:inline}}.account-register__button[data-v-3ec6610e]{margin-top:24px;margin-left:auto;margin-right:auto;border-radius:7px;font-size:16px;letter-spacing:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.account-register__button[data-v-3ec6610e]{height:42px!important;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.account-register__button[data-v-3ec6610e]{height:42px!important;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.account-register__button[data-v-3ec6610e]{max-width:210px!important;height:42px!important;font-size:15px}}.settings-container[data-v-51859415]{width:100%;min-width:0}@media(max-width:1000px)and (max-height:450px){.settings-container[data-v-51859415]{padding:16px 20px!important}}@media(max-width:680px)and (max-height:450px){.settings-container[data-v-51859415]{padding:16px 16px!important}}@media(max-width:600px)and (min-height:450.01px){.settings-container[data-v-51859415]{padding:16px 16px!important}}.settings-container .settings-navigation[data-v-51859415]{transform:none!important;visibility:visible!important}.settings-container .settings-navigation .settings-navigation-version[data-v-51859415]{display:none}@media(max-width:600px)and (min-height:450.01px){.settings-container .settings-navigation .settings-navigation-version[data-v-51859415]{display:flex}}.settings-container .settings-navigation .settings-navigation-version--highlight[data-v-51859415]{color:var(--v-secondary-lighten1)}@media(max-width:1000px)and (max-height:450px){.settings-container .settings-navigation h1[data-v-51859415]{font-size:22px!important}.settings-container .settings-navigation .v-navigation-drawer__content .v-list[data-v-51859415]{margin-top:12px!important;padding:0!important}}.settings-container .settings-navigation .v-list-item--link[data-v-51859415],.settings-container .settings-navigation .v-list-item--link[data-v-51859415]:before{background:var(--v-background-lighten1);border-radius:6px!important;margin-top:6px!important;margin-bottom:0!important}.settings-container .settings-navigation .v-list-item--link[data-v-51859415]:first-of-type{margin-top:0!important}.settings-container .settings-navigation .v-list-item__icon[data-v-51859415]{margin:14px 0!important;margin-right:16px!important}@media(max-width:600px)and (min-height:450.01px){.comment-mute-settings .v-card__title[data-v-2cd59ba0],.comment-mute-settings>div[data-v-2cd59ba0]{padding-left:12px!important;padding-right:12px!important}}.settings__item[data-v-2cd59ba0]{display:flex;position:relative;flex-direction:column;margin-top:24px}@media(max-width:1000px)and (max-height:450px){.settings__item[data-v-2cd59ba0]{margin-top:16px}}.settings__item--switch[data-v-2cd59ba0]{margin-right:62px}.settings__item-heading[data-v-2cd59ba0]{display:flex;align-items:center;color:var(--v-text-base);font-size:16.5px}@media(max-width:1000px)and (max-height:450px){.settings__item-heading[data-v-2cd59ba0]{font-size:15px}}.settings__item-label[data-v-2cd59ba0]{margin-top:8px;color:var(--v-text-darken1);font-size:13.5px;line-height:1.6}@media(max-width:1000px)and (max-height:450px){.settings__item-label[data-v-2cd59ba0]{font-size:11px;line-height:1.7}}.settings__item-form[data-v-2cd59ba0]{margin-top:14px}@media(max-width:1000px)and (max-height:450px){.settings__item-form[data-v-2cd59ba0]{font-size:13.5px}}.settings__item-switch[data-v-2cd59ba0]{align-items:center;position:absolute;top:0;right:-74px;bottom:0;margin-top:0}.settings__item p[data-v-2cd59ba0]{margin-bottom:8px}.settings__item p[data-v-2cd59ba0]:last-of-type{margin-bottom:0}.muted-comment-items[data-v-2cd59ba0]{display:flex;flex-direction:column;margin-top:8px}.muted-comment-items .muted-comment-item[data-v-2cd59ba0]{display:flex;align-items:center;padding:6px 0;border-bottom:1px solid var(--v-background-lighten2);transition:background-color .15s ease}.muted-comment-items .muted-comment-item[data-v-2cd59ba0]:last-of-type{border-bottom:none}.muted-comment-items .muted-comment-item__input[data-v-2cd59ba0]{font-size:14px}.muted-comment-items .muted-comment-item__match-type[data-v-2cd59ba0]{max-width:150px;margin-left:12px;font-size:14px}@media(max-width:600px)and (min-height:450.01px){.muted-comment-items .muted-comment-item__match-type[data-v-2cd59ba0]{max-width:115px}}.muted-comment-items .muted-comment-item__delete-button[data-v-2cd59ba0]{display:flex;align-items:center;justify-content:center;width:40px;height:40px;margin-left:6px;border-radius:5px;outline:none;cursor:pointer}.settings__content[data-v-3ff16abd]{opacity:1;transition:opacity .4s}.settings__content--loading[data-v-3ff16abd]{opacity:0}.niconico-account[data-v-3ff16abd]{display:flex;align-items:center;height:120px;padding:20px;border-radius:15px;background:var(--v-background-lighten2)}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px}.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:16px!important;margin-right:0!important}.niconico-account .niconico-account-wrapper .niconico-account__info-name-text[data-v-3ff16abd]{font-size:18.5px}.niconico-account .niconico-account-wrapper .niconico-account__info-description[data-v-3ff16abd]{font-size:13.5px}}@media(max-width:1000px)and (max-height:450px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px;border-radius:10px}.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-right:0!important}}@media(max-width:680px)and (max-height:450px){.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:16px!important}.niconico-account .niconico-account-wrapper .niconico-account__info-name-text[data-v-3ff16abd]{font-size:18px}.niconico-account .niconico-account-wrapper .niconico-account__info-description[data-v-3ff16abd]{font-size:13px}}@media(max-width:600px)and (min-height:450.01px){.niconico-account[data-v-3ff16abd]{align-items:normal;flex-direction:column;height:auto;padding:16px 12px;border-radius:10px}.niconico-account .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:12px!important;margin-right:0!important}.niconico-account .niconico-account-wrapper .niconico-account__info-name-text[data-v-3ff16abd]{font-size:17px}.niconico-account .niconico-account-wrapper .niconico-account__info-description[data-v-3ff16abd]{font-size:13px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.niconico-account--anonymous .niconico-account__login[data-v-3ff16abd]{margin-top:12px}}@media(max-width:1000px)and (max-height:450px){.niconico-account--anonymous .niconico-account__login[data-v-3ff16abd]{margin-top:12px}}@media(max-width:680px)and (max-height:450px){.niconico-account--anonymous .niconico-account-wrapper svg[data-v-3ff16abd]{display:none}.niconico-account--anonymous .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.niconico-account--anonymous[data-v-3ff16abd]{padding-top:20px}.niconico-account--anonymous .niconico-account__login[data-v-3ff16abd]{margin-top:16px}.niconico-account--anonymous .niconico-account-wrapper svg[data-v-3ff16abd]{display:none}.niconico-account--anonymous .niconico-account-wrapper .niconico-account__info[data-v-3ff16abd]{margin-left:0!important;margin-right:0!important}}.niconico-account-wrapper[data-v-3ff16abd]{display:flex;align-items:center;min-width:0;height:80px}@media(max-width:600px)and (min-height:450.01px){.niconico-account-wrapper[data-v-3ff16abd]{height:60px}}.niconico-account__icon[data-v-3ff16abd]{flex-shrink:0;min-width:80px;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));image-rendering:-webkit-optimize-contrast}@media(max-width:600px)and (min-height:450.01px){.niconico-account__icon[data-v-3ff16abd]{width:60px;min-width:60px;height:60px}}.niconico-account__info[data-v-3ff16abd]{display:flex;flex-direction:column;min-width:0;margin-left:20px;margin-right:16px}.niconico-account__info-name[data-v-3ff16abd]{display:inline-flex;align-items:center;height:33px}@media(max-width:600px)and (min-height:450.01px){.niconico-account__info-name[data-v-3ff16abd]{height:auto}}.niconico-account__info-name-text[data-v-3ff16abd]{display:inline-block;font-size:20px;color:var(--v-text-base);font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.niconico-account__info-description[data-v-3ff16abd]{display:inline-block;margin-top:4px;color:var(--v-text-darken1);font-size:14px}.niconico-account__login[data-v-3ff16abd]{border-radius:7px;font-size:16px;letter-spacing:0}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.niconico-account__login[data-v-3ff16abd]{height:50px!important;margin-top:12px;margin-right:auto}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.niconico-account__login[data-v-3ff16abd]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.niconico-account__login[data-v-3ff16abd]{height:42px!important;margin-top:8px;margin-right:auto;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.niconico-account__login[data-v-3ff16abd]{height:42px!important;margin-top:16px;margin-right:auto;font-size:14.5px}}.settings__content[data-v-61fbe4ed]{opacity:1;transition:opacity .4s}.settings__content--loading[data-v-61fbe4ed]{opacity:0}.twitter-accounts[data-v-61fbe4ed]{display:flex;flex-direction:column;padding:20px 20px;border-radius:15px;background:var(--v-background-lighten2)}@media(max-width:1000px)and (max-height:450px){.twitter-accounts[data-v-61fbe4ed]{padding:16px 20px;border-radius:10px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts[data-v-61fbe4ed]{padding:16px 12px;border-radius:10px}}.twitter-accounts__heading[data-v-61fbe4ed]{display:flex;align-items:center;font-size:18px;font-weight:700}.twitter-accounts__guide[data-v-61fbe4ed]{display:flex;align-items:center}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-accounts__guide .text-h6[data-v-61fbe4ed]{font-size:19px!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts__guide .text-h6[data-v-61fbe4ed]{font-size:17px!important}}@media(max-width:680px)and (max-height:450px){.twitter-accounts__guide svg[data-v-61fbe4ed]{display:none}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts__guide svg[data-v-61fbe4ed]{display:none}}@media(max-width:680px)and (max-height:450px){.twitter-accounts__guide svg+div[data-v-61fbe4ed]{margin-left:0!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts__guide svg+div[data-v-61fbe4ed]{margin-left:0!important}}.twitter-accounts .twitter-account[data-v-61fbe4ed]{display:flex;align-items:center;margin-top:20px}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account[data-v-61fbe4ed]{margin-top:16px}}.twitter-accounts .twitter-account__icon[data-v-61fbe4ed]{flex-shrink:0;width:70px;height:70px;margin-right:16px;border-radius:50%;-o-object-fit:cover;object-fit:cover;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));image-rendering:-webkit-optimize-contrast}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__icon[data-v-61fbe4ed]{width:52px;height:52px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__icon[data-v-61fbe4ed]{width:48px;height:48px;margin-right:10px}}.twitter-accounts .twitter-account__info[data-v-61fbe4ed]{display:flex;flex-direction:column;min-width:0;margin-right:16px}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__info[data-v-61fbe4ed]{margin-right:10px}}.twitter-accounts .twitter-account__info-name[data-v-61fbe4ed]{display:inline-flex;align-items:center}.twitter-accounts .twitter-account__info-name-text[data-v-61fbe4ed]{display:inline-block;color:var(--v-text-base);font-size:20px;font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__info-name-text[data-v-61fbe4ed]{font-size:18px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__info-name-text[data-v-61fbe4ed]{font-size:16px}}.twitter-accounts .twitter-account__info-screen-name[data-v-61fbe4ed]{display:inline-block;color:var(--v-text-darken1);font-size:16px}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__info-screen-name[data-v-61fbe4ed]{font-size:14px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__info-screen-name[data-v-61fbe4ed]{font-size:13.5px}}.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{margin-top:20px;margin-left:auto;margin-right:auto;border-radius:7px;font-size:15px;letter-spacing:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{height:42px!important;font-size:14.5px}}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{height:42px!important;font-size:14.5px}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__login[data-v-61fbe4ed]{height:42px!important;font-size:14.5px}}.twitter-accounts .twitter-account__logout[data-v-61fbe4ed]{background:var(--v-gray-base);border-radius:7px;font-size:15px;letter-spacing:0}@media(max-width:1000px)and (max-height:450px){.twitter-accounts .twitter-account__logout[data-v-61fbe4ed]{width:116px!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-accounts .twitter-account__logout[data-v-61fbe4ed]{width:100px!important;height:48px!important;border-radius:5px;font-size:14px}.twitter-accounts .twitter-account__logout svg[data-v-61fbe4ed]{width:20px;margin-right:4px!important}}.channels-container.channels-container--home .v-tabs-bar{height:54px;background:linear-gradient(to bottom,var(--v-background-base) calc(100% - 3px),var(--v-background-lighten1) 3px)}@media(max-width:1000px)and (max-height:450px){.channels-container.channels-container--home .v-tabs-bar{height:46px}}.channels-container.channels-container--home .v-tabs-slider-wrapper{height:3px!important;transition:left .3s cubic-bezier(.25,.8,.5,1)}.channels-container.channels-container--home .v-window__container{min-height:calc(100vh - 180px);min-height:calc(100dvh - 180px)}@media(hover:none){.channels-container.channels-container--home .v-window__container{min-height:auto}}.channels-container.channels-container--home.channels-container--loading .v-tabs-slider-wrapper{transition:none!important}.channels-container[data-v-b22adce6]{display:flex;flex-direction:column;width:100%;margin-left:21px;margin-right:21px;opacity:1;transition:opacity .2s}@media(max-width:600px)and (min-height:450.01px){.channels-container[data-v-b22adce6]{margin-left:0;margin-right:0}}.channels-container--loading[data-v-b22adce6]{opacity:0}.channels-container .channels-tab[data-v-b22adce6]{position:sticky;flex:none;top:65px;padding-top:2px;padding-bottom:12px;background:var(--v-background-base);z-index:1}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab[data-v-b22adce6]{top:0;padding-top:0;padding-bottom:8px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-tab[data-v-b22adce6]{top:0;padding-top:0;padding-bottom:10px}}.channels-container .channels-tab .channels-tab__item[data-v-b22adce6]{width:98px;padding:0;color:var(--v-text-base)!important;font-size:16px;text-transform:none}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab .channels-tab__item[data-v-b22adce6]{font-size:15px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-tab .channels-tab__item[data-v-b22adce6]{width:auto;font-size:15px}}.channels-container .channels-list[data-v-b22adce6]{padding-bottom:20px;background:transparent!important;overflow:inherit}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list[data-v-b22adce6]{padding-bottom:12px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list[data-v-b22adce6]{padding-left:8px;padding-right:8px;padding-bottom:12px}}.channels-container .channels-list .channels[data-v-b22adce6]{display:grid;grid-template-columns:repeat(auto-fit,minmax(365px,1fr));grid-row-gap:12px;grid-column-gap:16px;justify-content:center;background:var(--v-background-base);will-change:transform}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-row-gap:10px;grid-template-columns:1fr}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-row-gap:8px;grid-template-columns:1fr}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-row-gap:10px;grid-template-columns:1fr}}@media(hover:none){.channels-container .channels-list .channels[data-v-b22adce6]{content-visibility:auto;contain-intrinsic-height:2000px}}@media(min-width:1630px){.channels-container .channels-list .channels[data-v-b22adce6]{grid-template-columns:repeat(auto-fit,445px)}}.channels-container .channels-list .channels.channels--length-0.channels--tab-ピン留め[data-v-b22adce6]{display:flex;min-height:calc(100vh - 180px);min-height:calc(100dvh - 180px)}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels.channels--length-0.channels--tab-ピン留め[data-v-b22adce6]{min-height:calc(100vh - 66px);min-height:calc(100dvh - 66px)}}@media(min-width:1008px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:calc(50% + 8px)}}@media(min-width:1389px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:calc(66.66667% + 10.66667px)}}@media(min-width:1630px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:922px}}@media(min-width:2090px){.channels-container .channels-list .channels.channels--length-1[data-v-b22adce6]{margin-right:1383px}}@media(min-width:1389px){.channels-container .channels-list .channels.channels--length-2[data-v-b22adce6]{margin-right:calc(33.33333% + 5.33333px)}}@media(min-width:1630px){.channels-container .channels-list .channels.channels--length-2[data-v-b22adce6]{margin-right:461px}}@media(min-width:2090px){.channels-container .channels-list .channels.channels--length-2[data-v-b22adce6]{margin-right:922px}.channels-container .channels-list .channels.channels--length-3[data-v-b22adce6]{margin-right:461px}}.channels-container .channels-list .channels .channel[data-v-b22adce6]{display:flex;flex-direction:column;position:relative;height:270px;padding:18px 20px;padding-bottom:19px;border-radius:14px;color:var(--v-text-base);background:var(--v-background-lighten1);transition:background-color .15s;overflow:hidden;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;content-visibility:auto;contain-intrinsic-height:233px}@media(max-width:1007.9px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{height:auto}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{padding:14px 16px;padding-top:12px;height:auto;border-radius:11px;contain-intrinsic-height:162.25px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{padding:12px 14px;padding-top:10px;height:auto;border-radius:11px;contain-intrinsic-height:125px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel[data-v-b22adce6]{padding:12px 14px;padding-top:10px;height:auto;border-radius:11px;contain-intrinsic-height:162.25px}}.channels-container .channels-list .channels .channel[data-v-b22adce6]:hover{background:var(--v-background-lighten2)}@media(hover:none){.channels-container .channels-list .channels .channel[data-v-b22adce6]:hover{background:var(--v-background-lighten1)}}.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{display:flex;height:44px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{height:40px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{height:29px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster[data-v-b22adce6]{height:40px}}.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{display:inline-block;flex-shrink:0;width:80px;height:44px;border-radius:5px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{width:69px;height:40px;border-radius:4px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{width:54px;height:29px;border-radius:4px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-b22adce6]{width:69px;height:40px;border-radius:4px}}.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{display:flex;flex-direction:column;margin-left:16px;width:100%;min-width:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{margin-left:14px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{align-items:center;flex-direction:row;margin-left:12px;margin-right:6px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-content[data-v-b22adce6]{margin-left:14px}}.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{flex-shrink:0;font-size:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{font-size:15.5px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{font-size:15px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-name[data-v-b22adce6]{font-size:15.5px}}.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{display:flex;position:relative;top:-1.5px;flex-shrink:0;align-items:center;margin-top:2px;font-size:12px;color:var(--v-text-darken1)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{margin-top:2px;font-size:11px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{margin-top:3px;margin-left:auto;font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-status[data-v-b22adce6]{margin-top:2px;font-size:11px}}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force[data-v-b22adce6],.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers[data-v-b22adce6]{display:flex;align-items:center}@media(max-width:680px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-status-force span[data-v-b22adce6]:nth-child(2),.channels-container .channels-list .channels .channel .channel__broadcaster-status-force span[data-v-b22adce6]:nth-child(4),.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers span[data-v-b22adce6]:nth-child(2),.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers span[data-v-b22adce6]:nth-child(4){display:none}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-status-viewers[data-v-b22adce6]{margin-left:8px!important}}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force--festival[data-v-b22adce6]{color:#e7556e}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force--so-many[data-v-b22adce6]{color:#e76b55}.channels-container .channels-list .channels .channel .channel__broadcaster-status-force--many[data-v-b22adce6]{color:#e7a355}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]{display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;top:-5px;right:-5px;width:34px;height:34px;padding:4px;color:var(--v-text-darken1);border-radius:50%;transition:color .15s ease,background-color .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]{top:-1px}}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit;background-color:currentColor;color:inherit;opacity:0;transition:opacity .2s cubic-bezier(.4,0,.6,1);pointer-events:none}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]:hover{color:var(--v-text-base)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin[data-v-b22adce6]:hover:before{opacity:.15}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]{color:var(--v-primary-base)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]:hover{color:var(--v-primary-lighten1)}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]{color:var(--v-secondary-lighten2)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]:hover{color:var(--v-secondary-lighten3)}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]{color:var(--v-secondary-lighten2)}.channels-container .channels-list .channels .channel .channel__broadcaster-pin--pinned[data-v-b22adce6]:hover{color:var(--v-secondary-lighten3)}}.channels-container .channels-list .channels .channel .channel__program-present[data-v-b22adce6]{display:flex;flex-direction:column}.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{margin-top:14px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{display:flex;flex-direction:column;margin-top:8px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{display:flex;align-items:center;margin-top:8px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-title-wrapper[data-v-b22adce6]{display:flex;flex-direction:column;margin-top:8px}}.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{display:-webkit-box;font-size:16px;font-weight:700;font-feature-settings:"palt" 1;letter-spacing:.07em;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{font-size:14px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{font-size:14px;-webkit-line-clamp:1}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-title[data-v-b22adce6]{font-size:14px;-webkit-line-clamp:1}}.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{margin-top:4px;color:var(--v-text-darken1);font-size:13.5px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{flex-shrink:0;margin-top:2px;font-size:13px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{flex-shrink:0;margin-top:0;margin-left:auto;padding-left:10px;font-size:12px}}@media(max-width:680px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{font-size:11px;padding-left:6px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-time[data-v-b22adce6]{flex-shrink:0;margin-top:1px;font-size:12px}}.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{display:-webkit-box;margin-top:6px;color:var(--v-text-darken1);font-size:10.5px;line-height:175%;overflow-wrap:break-word;font-feature-settings:"palt" 1;letter-spacing:.07em;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{margin-top:4px;font-size:11px;line-height:155%;-webkit-line-clamp:2}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{margin-top:3px;font-size:10px;line-height:160%;-webkit-line-clamp:2}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-present-description[data-v-b22adce6]{margin-top:4px;font-size:10px;line-height:155%;-webkit-line-clamp:2}}.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{display:flex;flex-direction:column;color:var(--v-text-base);font-size:12.5px}@media(max-width:1007.9px){.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{margin-top:6px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{flex-direction:row;margin-top:4px;font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-following[data-v-b22adce6]{margin-top:4px;font-size:12px}}.channels-container .channels-list .channels .channel .channel__program-following-title[data-v-b22adce6]{display:flex;align-items:center;min-width:0}.channels-container .channels-list .channels .channel .channel__program-following-title-decorate[data-v-b22adce6]{flex-shrink:0;font-weight:700}.channels-container .channels-list .channels .channel .channel__program-following-title-icon[data-v-b22adce6]{flex-shrink:0;margin-left:3px}.channels-container .channels-list .channels .channel .channel__program-following-title-text[data-v-b22adce6]{margin-left:2px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{color:var(--v-text-darken1)}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{flex-shrink:0;margin-left:auto;padding-left:8px;font-size:11.5px}}@media(max-width:680px)and (max-height:450px){.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{font-size:11px;padding-left:6px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list .channels .channel .channel__program-following-time[data-v-b22adce6]{flex-shrink:0;font-size:11.5px}}.channels-container .channels-list .channels .channel .channel__progressbar[data-v-b22adce6]{position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--v-gray-base)}.channels-container .channels-list .channels .channel .channel__progressbar-progress[data-v-b22adce6]{height:4px;background:var(--v-primary-base);transition:width .3s}.channels-container .pinned-container br[data-v-b22adce6]{display:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .pinned-container h2[data-v-b22adce6]{font-size:21px!important}.channels-container .pinned-container div[data-v-b22adce6]{font-size:12.5px!important;text-align:center}}@media(max-width:1000px)and (max-height:450px){.channels-container .pinned-container[data-v-b22adce6]{padding-top:12px}.channels-container .pinned-container h2[data-v-b22adce6]{font-size:21px!important}.channels-container .pinned-container div[data-v-b22adce6]{font-size:13px!important;text-align:center}.channels-container .pinned-container div .mt-4[data-v-b22adce6]{margin-top:12px!important}.channels-container .pinned-container div svg[data-v-b22adce6]{width:16px}}@media(max-width:680px)and (max-height:450px){.channels-container .pinned-container h2[data-v-b22adce6]{font-size:16px!important}.channels-container .pinned-container div[data-v-b22adce6]{font-size:10.5px!important}.channels-container .pinned-container div .mt-4[data-v-b22adce6]{margin-top:8px!important}}@media(max-width:600px)and (min-height:450.01px){.channels-container .pinned-container[data-v-b22adce6]{min-height:calc(100vh - 132px);min-height:calc(100dvh - 132px);padding-top:12px}.channels-container .pinned-container br[data-v-b22adce6]{display:inline}.channels-container .pinned-container h2[data-v-b22adce6]{font-size:22px!important;text-align:center}.channels-container .pinned-container div[data-v-b22adce6]{font-size:15px!important;text-align:center}.channels-container .pinned-container div .mt-4[data-v-b22adce6]{margin-top:8px!important}.channels-container .pinned-container div svg[data-v-b22adce6]{width:20px}}.channels-container.channels-container--watch .v-tabs-bar{height:42px;background:linear-gradient(to bottom,var(--v-background-base) calc(100% - 3px),var(--v-background-lighten1) 3px)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container.channels-container--watch .v-tabs-bar{height:50px}}@media(max-width:1000px)and (max-height:450px){.channels-container.channels-container--watch .v-tabs-bar{height:44px}}@media(max-width:600px)and (min-height:450.01px){.channels-container.channels-container--watch .v-tabs-bar{height:46px}}.channels-container.channels-container--watch .v-tabs-bar .v-slide-group__next,.channels-container.channels-container--watch .v-tabs-bar .v-slide-group__prev{flex:auto!important;min-width:28px!important}.channels-container.channels-container--watch .v-tabs-slider-wrapper{height:3px!important;transition:left .3s cubic-bezier(.25,.8,.5,1)}.channels-container[data-v-1773876a]{display:flex;flex-direction:column}.channels-container .channels-tab[data-v-1773876a]{position:sticky;flex:none;top:0;padding-left:16px;padding-right:16px;padding-bottom:14px;background:var(--v-background-base);z-index:1}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-tab[data-v-1773876a]{padding-left:24px;padding-right:24px;padding-bottom:10px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab[data-v-1773876a]{padding-bottom:8px;margin-top:0}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-tab[data-v-1773876a]{padding-bottom:8px;margin-top:0}}.channels-container .channels-tab .channels-tab__item[data-v-1773876a]{min-width:72px!important;padding:0 8px;color:var(--v-text-base)!important;font-size:15px;text-transform:none}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-tab .channels-tab__item[data-v-1773876a]{font-size:14.5px}}.channels-container .channels-list-container[data-v-1773876a]{overflow-y:auto}.channels-container .channels-list-container .channels-list[data-v-1773876a]{padding-left:16px;padding-right:10px;padding-bottom:16px;background:transparent!important;overflow:visible!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.channels-container .channels-list-container .channels-list[data-v-1773876a]{padding-left:24px;padding-right:24px}}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list[data-v-1773876a]{padding-bottom:12px}}.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{display:flex;justify-content:center;flex-direction:column;will-change:transform}@media(hover:none){.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{content-visibility:auto;contain-intrinsic-size:319.3px 2000px}}@media(hover:none)and (max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{contain-intrinsic-size:277.3px 2000px}}@media(min-width:1630px){.channels-container .channels-list-container .channels-list .channels[data-v-1773876a]{grid-template-columns:repeat(auto-fit,445px)}}.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]{display:flex;flex-direction:column;position:relative;margin-top:12px;padding:10px 12px 14px 12px;border-radius:10px;color:var(--v-text-base);background:var(--v-background-lighten1);transition:background-color .15s;overflow:hidden;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;content-visibility:auto;contain-intrinsic-size:295.3px 137.3px}.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]:first-of-type{margin-top:0}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]{margin-top:8px;padding:8px 12px 12px 12px;border-radius:8px;contain-intrinsic-size:253.3px 107.2px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]{margin-top:8px;padding:8px 12px 12px 12px;border-radius:8px;contain-intrinsic-size:253.3px 107.2px}}.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]:hover{background:var(--v-background-lighten2)}@media(hover:none){.channels-container .channels-list-container .channels-list .channels .channel[data-v-1773876a]:hover{background:var(--v-background-lighten1)}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster[data-v-1773876a]{display:flex;height:28px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster[data-v-1773876a]{height:24px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-1773876a]{display:inline-block;flex-shrink:0;width:48px;height:100%;border-radius:4px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-icon[data-v-1773876a]{width:46px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-content[data-v-1773876a]{display:flex;align-items:center;margin-left:12px;width:100%;min-width:0}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-content[data-v-1773876a]{margin-left:8px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-name[data-v-1773876a]{font-size:14.5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-name[data-v-1773876a]{font-size:13.5px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-name[data-v-1773876a]{font-size:13.5px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force[data-v-1773876a]{display:flex;align-items:center;flex-shrink:0;margin-top:2px;margin-left:auto;padding-left:6px;font-size:12px;color:var(--v-text-darken1)}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force--festival[data-v-1773876a]{color:#e7556e}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force--so-many[data-v-1773876a]{color:#e76b55}.channels-container .channels-list-container .channels-list .channels .channel .channel__broadcaster-force--many[data-v-1773876a]{color:#e7a355}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present[data-v-1773876a]{display:flex;flex-direction:column}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-title[data-v-1773876a]{display:-webkit-box;margin-top:8px;font-size:13.5px;font-weight:700;font-feature-settings:"palt" 1;letter-spacing:.07em;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-title[data-v-1773876a]{margin-top:5px;font-size:12.5px;-webkit-line-clamp:1}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-title[data-v-1773876a]{margin-top:5px;font-size:12.5px;-webkit-line-clamp:1}}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-time[data-v-1773876a]{margin-top:4px;color:var(--v-text-darken1);font-size:11.5px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-time[data-v-1773876a]{margin-top:1px;font-size:10px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-present-time[data-v-1773876a]{margin-top:1px;font-size:10px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following[data-v-1773876a]{display:flex;flex-direction:column;margin-top:4px;color:var(--v-text-darken1);font-size:11.5px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following[data-v-1773876a]{margin-top:2px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following[data-v-1773876a]{margin-top:2px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title[data-v-1773876a]{display:flex;align-items:center}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title-decorate[data-v-1773876a]{flex-shrink:0}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title-icon[data-v-1773876a]{flex-shrink:0;margin-left:3px}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-title-text[data-v-1773876a]{margin-left:2px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-time[data-v-1773876a]{margin-top:1px}@media(max-width:1000px)and (max-height:450px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-time[data-v-1773876a]{font-size:10px}}@media(max-width:600px)and (min-height:450.01px){.channels-container .channels-list-container .channels-list .channels .channel .channel__program-following-time[data-v-1773876a]{font-size:10px}}.channels-container .channels-list-container .channels-list .channels .channel .channel__progressbar[data-v-1773876a]{position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--v-gray-base)}.channels-container .channels-list-container .channels-list .channels .channel .channel__progressbar-progress[data-v-1773876a]{height:4px;background:var(--v-primary-base);transition:width .3s}.comment-container[data-v-df07fabe]{display:flex;flex-direction:column}.comment-container .comment-header[data-v-df07fabe]{display:flex;align-items:center;flex-shrink:0;width:100%;height:26px;padding-left:16px;padding-right:16px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header[data-v-df07fabe]{margin-top:20px;padding-left:24px;padding-right:24px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-header[data-v-df07fabe]{margin-top:12px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-header[data-v-df07fabe]{margin-top:14px}}.comment-container .comment-header__title[data-v-df07fabe]{display:flex;align-items:center;font-size:18.5px;font-weight:700;line-height:145%}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header__title[data-v-df07fabe]{font-size:19px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-header__title[data-v-df07fabe]{font-size:16.5px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-header__title[data-v-df07fabe]{font-size:17px}}.comment-container .comment-header__title-icon[data-v-df07fabe]{margin-bottom:-3px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header__title-icon[data-v-df07fabe]{width:24px;height:24px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-header__title-icon[data-v-df07fabe]{height:17.5px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-header__title-icon[data-v-df07fabe]{height:18px}}.comment-container .comment-header__title-text[data-v-df07fabe]{margin-left:12px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-header__title-text[data-v-df07fabe]{margin-left:16px}}.comment-container .comment-header__button[data-v-df07fabe]{display:flex;align-items:center;height:26px;padding:0 9px;border-radius:4px;background:var(--v-background-lighten3);font-size:11px;line-height:1.8;letter-spacing:0}.comment-container .comment-list-wrapper[data-v-df07fabe]{position:relative;width:100%;height:100%;min-height:0;margin-top:16px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-list-wrapper[data-v-df07fabe]{margin-top:20px}}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-list-wrapper[data-v-df07fabe]{margin-top:12px}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-list-wrapper[data-v-df07fabe]{margin-top:14px}}.comment-container .comment-list-wrapper .comment-list-dropdown[data-v-df07fabe]{display:inline-block;position:absolute;top:var(--comment-list-dropdown-top,0);right:16px;border-radius:4px;overflow-x:hidden;overflow-y:auto;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);opacity:0;visibility:hidden;transition:opacity .15s ease,visibility .15s ease;z-index:8}.comment-container .comment-list-wrapper .comment-list-dropdown--display[data-v-df07fabe]{opacity:1;visibility:visible}.comment-container .comment-list-wrapper .comment-list-cover[data-v-df07fabe]{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:7}.comment-container .comment-list-wrapper .comment-list-cover--display[data-v-df07fabe]{display:block}.comment-container .comment-list-wrapper .comment-list[data-v-df07fabe]{width:100%;height:100%;padding-left:16px;padding-right:10px;padding-bottom:12px;overflow-y:scroll!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.comment-container .comment-list-wrapper .comment-list[data-v-df07fabe]{padding-left:24px;padding-right:18px;padding-bottom:0}}@media(max-width:600px)and (min-height:450.01px){.comment-container .comment-list-wrapper .comment-list[data-v-df07fabe]{padding-bottom:0}}.comment-container .comment-list-wrapper .comment-list .comment[data-v-df07fabe]{display:flex;position:relative;align-items:center;min-height:28px;padding-top:6px;word-break:break-all}.comment-container .comment-list-wrapper .comment-list .comment--my-post[data-v-df07fabe]{color:var(--v-secondary-lighten2)}.comment-container .comment-list-wrapper .comment-list .comment__text[data-v-df07fabe]{font-size:13px}.comment-container .comment-list-wrapper .comment-list .comment__time[data-v-df07fabe]{flex-shrink:0;margin-left:auto;padding-left:8px;color:var(--v-text-darken1);font-size:13px}.comment-container .comment-list-wrapper .comment-list .comment__icon[data-v-df07fabe]{width:20px;height:20px;margin-left:8px;border-radius:5px;color:var(--v-text-base);cursor:pointer}.comment-container .comment-list-wrapper .comment-announce[data-v-df07fabe]{display:flex;align-items:center;justify-content:center;flex-direction:column;position:absolute;top:0;left:0;width:100%;height:100%;padding-left:12px;padding-right:12px}.comment-container .comment-list-wrapper .comment-announce__heading[data-v-df07fabe]{font-size:20px;font-weight:700}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-list-wrapper .comment-announce__heading[data-v-df07fabe]{font-size:16px}}.comment-container .comment-list-wrapper .comment-announce__text[data-v-df07fabe]{margin-top:12px;color:var(--v-text-darken1);font-size:13.5px;text-align:center}@media(max-width:1000px)and (max-height:450px){.comment-container .comment-list-wrapper .comment-announce__text[data-v-df07fabe]{font-size:12px}}.comment-container .comment-scroll-button[data-v-df07fabe]{display:flex;align-items:center;justify-content:center;position:absolute;left:0;right:0;bottom:22px;width:42px;height:42px;margin:0 auto;border-radius:50%;background:var(--v-primary-base);transition:background-color .15s,opacity .3s,visibility .3s;visibility:hidden;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}.comment-container .comment-scroll-button--display[data-v-df07fabe]{opacity:1;visibility:visible}.program-container[data-v-710b8382]{padding-left:16px;padding-right:16px;overflow-y:auto}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container[data-v-710b8382]{padding-left:24px;padding-right:24px}}.program-container .program-broadcaster[data-v-710b8382]{display:none;align-items:center;min-width:0}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster[data-v-710b8382]{display:flex;margin-top:20px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-broadcaster[data-v-710b8382]{display:flex;margin-top:16px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-broadcaster[data-v-710b8382]{display:flex;margin-top:16px}}.program-container .program-broadcaster__icon[data-v-710b8382]{display:inline-block;flex-shrink:0;width:43px;height:24px;border-radius:3px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster__icon[data-v-710b8382]{width:58px;height:32px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-broadcaster__icon[data-v-710b8382]{width:42px;height:23.5px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-broadcaster__icon[data-v-710b8382]{width:58px;height:32px}}.program-container .program-broadcaster__number[data-v-710b8382]{flex-shrink:0;margin-left:12px;font-size:16.5px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster__number[data-v-710b8382]{margin-left:16px;font-size:19px}}.program-container .program-broadcaster__name[data-v-710b8382]{margin-left:5px;font-size:16.5px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-broadcaster__name[data-v-710b8382]{margin-left:8px;font-size:19px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-broadcaster__name[data-v-710b8382]{font-size:18px}}.program-container .program-info .program-info__title[data-v-710b8382]{font-size:22px;font-weight:700;line-height:145%;font-feature-settings:"palt" 1;letter-spacing:.05em}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-info .program-info__title[data-v-710b8382]{margin-top:16px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__title[data-v-710b8382]{margin-top:10px;font-size:18px}}@media(max-width:600px)and (min-height:450.01px){.program-container .program-info .program-info__title[data-v-710b8382]{margin-top:16px;font-size:19px}}.program-container .program-info .program-info__time[data-v-710b8382]{margin-top:8px;color:var(--v-text-darken1);font-size:14px}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__time[data-v-710b8382]{font-size:13px}}.program-container .program-info .program-info__description[data-v-710b8382]{margin-top:12px;color:var(--v-text-darken1);font-size:12px;line-height:168%;overflow-wrap:break-word;font-feature-settings:"palt" 1;letter-spacing:.08em}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__description[data-v-710b8382]{margin-top:8px;font-size:11px}}.program-container .program-info .program-info__genre-container[data-v-710b8382]{display:flex;flex-wrap:wrap;margin-top:10px}.program-container .program-info .program-info__genre-container .program-info__genre[data-v-710b8382]{display:inline-block;font-size:10.5px;padding:3px;margin-top:4px;margin-right:4px;border-radius:4px;background:var(--v-background-lighten2)}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__genre-container .program-info__genre[data-v-710b8382]{font-size:9px}}.program-container .program-info .program-info__next[data-v-710b8382]{display:flex;align-items:center;margin-top:18px;color:var(--v-text-base);font-size:14px;font-weight:700}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__next[data-v-710b8382]{margin-top:14px;font-size:13px}}.program-container .program-info .program-info__next-decorate[data-v-710b8382]{flex-shrink:0}.program-container .program-info .program-info__next-icon[data-v-710b8382]{flex-shrink:0;margin-left:3px;font-size:15px}.program-container .program-info .program-info__next-title[data-v-710b8382]{display:-webkit-box;margin-top:2px;color:var(--v-text-base);font-size:14px;font-weight:700;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__next-title[data-v-710b8382]{font-size:13px}}.program-container .program-info .program-info__next-time[data-v-710b8382]{margin-top:3px;color:var(--v-text-darken1);font-size:13.5px}.program-container .program-info .program-info__status[data-v-710b8382]{display:flex;align-items:center;margin-top:16px;font-size:14px;color:var(--v-text-darken1)}@media(max-width:1000px)and (max-height:450px){.program-container .program-info .program-info__status[data-v-710b8382]{margin-top:10px;font-size:12px}}.program-container .program-info .program-info__status-force[data-v-710b8382],.program-container .program-info .program-info__status-viewers[data-v-710b8382]{display:flex;align-items:center}.program-container .program-info .program-info__status-force--festival[data-v-710b8382]{color:#e7556e}.program-container .program-info .program-info__status-force--so-many[data-v-710b8382]{color:#e76b55}.program-container .program-info .program-info__status-force--many[data-v-710b8382]{color:#e7a355}.program-container .program-detail-container[data-v-710b8382]{margin-top:24px;margin-bottom:24px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.program-container .program-detail-container[data-v-710b8382]{margin-top:20px;margin-bottom:20px}}@media(max-width:1000px)and (max-height:450px){.program-container .program-detail-container[data-v-710b8382]{margin-top:20px;margin-bottom:16px}}.program-container .program-detail-container .program-detail[data-v-710b8382]{margin-top:16px}.program-container .program-detail-container .program-detail .program-detail__heading[data-v-710b8382]{font-size:18px}@media(max-width:1000px)and (max-height:450px){.program-container .program-detail-container .program-detail .program-detail__heading[data-v-710b8382]{font-size:16px}}.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382]{margin-top:8px;color:var(--v-text-darken1);font-size:12px;line-height:168%;overflow-wrap:break-word;white-space:pre-wrap;font-feature-settings:"palt" 1;letter-spacing:.08em}@media(max-width:1000px)and (max-height:450px){.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382]{font-size:11px}}.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382] a:link,.program-container .program-detail-container .program-detail .program-detail__text[data-v-710b8382] a:visited{color:var(--v-primary-lighten1);text-underline-offset:3px}.remote-control-container[data-v-b659b524]{display:grid;place-items:center;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(30,19,16,.5);transition:opacity .2s,visibility .2s;overflow-y:scroll;opacity:0;visibility:hidden;z-index:5}.remote-control-container--showing[data-v-b659b524]{opacity:1;visibility:visible}.remote-control-container .remote-control[data-v-b659b524]{position:relative;width:234px;height:514px;padding:24px 16px;margin:0 auto;border-radius:8px;background:var(--v-background-base);-webkit-user-select:none;-moz-user-select:none;user-select:none}.remote-control-container .remote-control .remote-control__close[data-v-b659b524]{position:absolute!important;top:10px;right:10px;width:36px;height:36px;z-index:2}.remote-control-container .remote-control .remote-control-data-broadcasting[data-v-b659b524]{position:relative;opacity:1;transition:opacity .2s ease}.remote-control-container .remote-control .remote-control-data-broadcasting--disabled[data-v-b659b524],.remote-control-container .remote-control .remote-control-data-broadcasting--loading[data-v-b659b524]{opacity:.4;pointer-events:none}.remote-control-container .remote-control .remote-control-data-broadcasting--loading .remote-control__loading[data-v-b659b524]{opacity:1!important;visibility:visible!important}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__loading[data-v-b659b524]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--v-gray-base);filter:drop-shadow(0 0 3px rgba(0,0,0,.3));opacity:0;visibility:hidden;transition:opacity .2s cubic-bezier(.4,.38,.49,.94),visibility .2s cubic-bezier(.4,.38,.49,.94);will-change:opacity;z-index:3}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key[data-v-b659b524]{display:grid;grid-template-columns:1fr 90px 1fr;grid-template-rows:1fr 90px 1fr;width:160px;height:160px;margin-left:auto;margin-right:auto;border-radius:50%;background:var(--v-background-lighten1);overflow:hidden}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button[data-v-b659b524]{display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:14px;font-weight:700;outline:none}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-up[data-v-b659b524]{grid-column:2;grid-row:1;padding-top:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-left[data-v-b659b524]{grid-column:1;grid-row:2;padding-left:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-select[data-v-b659b524]{grid-column:2;grid-row:2;border-radius:50%;background:var(--v-background-base)}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-right[data-v-b659b524]{grid-column:3;grid-row:2;padding-right:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__directional-key button.remote-control-button-down[data-v-b659b524]{grid-column:2;grid-row:3;padding-bottom:4px}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key[data-v-b659b524]{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:35px 35px;gap:8px;width:200px;margin-top:12px;margin-left:auto;margin-right:auto}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key button[data-v-b659b524]{display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:15px;font-weight:700;outline:none}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key button.remote-control-button-data[data-v-b659b524]{grid-column:1/3;grid-row:1}.remote-control-container .remote-control .remote-control-data-broadcasting .remote-control__control-key button.remote-control-button-back[data-v-b659b524]{grid-column:3/5;grid-row:1}.remote-control-container .remote-control .remote-control__number-key[data-v-b659b524]{display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:44px 44px 44px 44px;gap:8px;width:200px;margin-top:16px;margin-left:auto;margin-right:auto}.remote-control-container .remote-control .remote-control__number-key button[data-v-b659b524]{display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--v-background-lighten1);color:var(--v-text-base);font-size:26px;font-weight:700;outline:none}@media(max-width:1000px)and (max-height:450px){.zoom-capture-modal-container.v-dialog{width:auto!important;max-width:auto!important;aspect-ratio:16/9}}.zoom-capture-modal[data-v-51116497]{position:relative}.zoom-capture-modal__image[data-v-51116497]{display:block;width:100%;border-radius:11px}.zoom-capture-modal__download[data-v-51116497]{display:flex;position:absolute;align-items:center;justify-content:center;right:22px;bottom:20px;width:80px;height:80px;border-radius:50%;color:var(--v-text-base);filter:drop-shadow(0 0 4.5px rgba(0,0,0,.9))}.twitter-container[data-v-51116497]{display:flex;flex-direction:column;position:relative;padding-bottom:8px}@media(max-width:600px)and (min-height:450.01px){.twitter-container[data-v-51116497]{padding-bottom:0}}.twitter-container.watch-panel__content--active[data-v-51116497]{content-visibility:visible!important}.twitter-container.watch-panel__content--active .tab-container .tab-content--active[data-v-51116497]{opacity:1;visibility:visible}@media(hover:none){.twitter-container.watch-panel__content--active .tab-container .tab-content--active[data-v-51116497]{content-visibility:auto}}.twitter-container .tab-container[data-v-51116497]{position:relative;flex-grow:1;min-height:0}.twitter-container .tab-container .tab-content[data-v-51116497]{position:absolute;width:100%;height:100%;transition:opacity .2s,visibility .2s;opacity:0;visibility:hidden;overflow-y:scroll}.twitter-container .tab-container .tab-content[data-v-51116497]::-webkit-scrollbar{width:6px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content[data-v-51116497]{padding-top:16px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content[data-v-51116497]{padding-top:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-container .tab-content[data-v-51116497]{padding-top:8px}}@media(hover:none){.twitter-container .tab-container .tab-content[data-v-51116497]{transition:none;content-visibility:hidden}}.twitter-container .tab-container .tab-content .captures[data-v-51116497]{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:12px;grid-column-gap:12px;padding-left:12px;padding-right:6px;max-height:100%}@supports(-webkit-touch-callout:none){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{padding-right:12px}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{grid-template-columns:1fr 1fr 1fr;padding-left:24px;padding-right:24px;grid-row-gap:10px;grid-column-gap:16px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{grid-row-gap:8px;grid-column-gap:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-container .tab-content .captures[data-v-51116497]{grid-template-columns:1fr 1fr 1fr;grid-row-gap:10px;grid-column-gap:10px}}.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{position:relative;height:82px;border-radius:11px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer;content-visibility:auto}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{height:90px;border-radius:9px}.twitter-container .tab-container .tab-content .captures .capture .capture__image[data-v-51116497]{-o-object-fit:cover;object-fit:cover}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{height:74px;border-radius:9px}.twitter-container .tab-container .tab-content .captures .capture .capture__image[data-v-51116497]{-o-object-fit:cover;object-fit:cover}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-container .tab-content .captures .capture[data-v-51116497]{height:82px;border-radius:9px}.twitter-container .tab-container .tab-content .captures .capture .capture__image[data-v-51116497]{-o-object-fit:cover;object-fit:cover}}.twitter-container .tab-container .tab-content .captures .capture__image[data-v-51116497]{display:block;width:100%;height:100%}.twitter-container .tab-container .tab-content .captures .capture__zoom[data-v-51116497]{display:flex;align-items:center;justify-content:center;position:absolute;top:1px;right:3px;width:38px;height:38px;border-radius:50%;filter:drop-shadow(0 0 2.5px rgba(0,0,0,.9));cursor:pointer}.twitter-container .tab-container .tab-content .captures .capture__disabled-cover[data-v-51116497],.twitter-container .tab-container .tab-content .captures .capture__selected-number[data-v-51116497]{display:none;align-items:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(30,19,16,.5)}.twitter-container .tab-container .tab-content .captures .capture__selected-number[data-v-51116497]{font-size:38px;text-shadow:0 0 2.5px rgba(0,0,0,.9)}.twitter-container .tab-container .tab-content .captures .capture__selected-checkmark[data-v-51116497]{display:none;position:absolute;top:6px;left:7px;width:20px;height:20px;color:var(--v-primary-base)}.twitter-container .tab-container .tab-content .captures .capture__selected-border[data-v-51116497]{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:11px;border:4px solid var(--v-primary-base)}.twitter-container .tab-container .tab-content .captures .capture__focused-border[data-v-51116497]{display:none;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:11px;border:4px solid var(--v-secondary-base)}.twitter-container .tab-container .tab-content .captures .capture--selected .capture__selected-border[data-v-51116497],.twitter-container .tab-container .tab-content .captures .capture--selected .capture__selected-checkmark[data-v-51116497],.twitter-container .tab-container .tab-content .captures .capture--selected .capture__selected-number[data-v-51116497]{display:flex}.twitter-container .tab-container .tab-content .captures .capture--focused .capture__focused-border[data-v-51116497]{display:block}.twitter-container .tab-container .tab-content .captures .capture--disabled[data-v-51116497]{cursor:auto}.twitter-container .tab-container .tab-content .captures .capture--disabled .capture__disabled-cover[data-v-51116497]{display:block}.twitter-container .tab-container .tab-content .capture-announce[data-v-51116497]{display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%;padding-left:12px;padding-right:5px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-container .tab-content .capture-announce[data-v-51116497]{padding-left:24px;padding-right:24px}}.twitter-container .tab-container .tab-content .capture-announce__heading[data-v-51116497]{font-size:20px;font-weight:700}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .capture-announce__heading[data-v-51116497]{font-size:16px}}.twitter-container .tab-container .tab-content .capture-announce__text[data-v-51116497]{margin-top:12px;color:var(--v-text-darken1);font-size:13.5px;text-align:center}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-container .tab-content .capture-announce__text[data-v-51116497]{font-size:12px}}.twitter-container .tab-button-container[data-v-51116497]{display:flex;flex-shrink:0;-moz-column-gap:7px;column-gap:7px;height:40px;margin-left:12px;margin-right:12px;padding-top:8px;padding-bottom:6px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-button-container[data-v-51116497]{height:40px;margin-left:24px;margin-right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-button-container[data-v-51116497]{height:38px;margin-left:8px;margin-right:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-button-container[data-v-51116497]{height:38px}}.twitter-container .tab-button-container .tab-button[data-v-51116497]{display:flex;align-items:center;justify-content:center;flex:1;background:var(--v-background-lighten2);border-radius:7px;font-size:11px;transition:background-color .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tab-button-container .tab-button[data-v-51116497]{font-size:11.5px;border-radius:7px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tab-button-container .tab-button[data-v-51116497]{font-size:10.5px;border-radius:6px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tab-button-container .tab-button[data-v-51116497]{font-size:10.5px;border-radius:6px}}.twitter-container .tab-button-container .tab-button--active[data-v-51116497]{background:var(--v-twitter-base)}.twitter-container .tab-button-container .tab-button__text[data-v-51116497]{margin-left:4px;margin-right:2px;line-height:2}.twitter-container .tweet-form[data-v-51116497]{display:flex;position:relative;flex-direction:column;flex-shrink:0;height:136px;margin-left:12px;margin-right:12px;border-radius:12px;border-bottom-left-radius:7px;border-bottom-right-radius:7px;background:var(--v-background-lighten1);transition:box-shadow .09s ease}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form[data-v-51116497]{margin-left:24px;margin-right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form[data-v-51116497]{height:96px;margin-left:8px;margin-right:8px;border-radius:6px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form[data-v-51116497]{height:96px;border-radius:6px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}}.twitter-container .tweet-form--focused[data-v-51116497]{box-shadow:0 0 0 3.5px rgba(79,130,230,.6)}.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{position:relative;bottom:calc(env(keyboard-inset-height, 0px) - 77px)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 40px)!important}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 34px)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 90px)!important}}.twitter-container .tweet-form__hashtag[data-v-51116497]{display:block;position:relative;height:19px;margin-top:12px;margin-left:12px;margin-right:12px}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag[data-v-51116497]{height:16px;margin-top:8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag[data-v-51116497]{height:16px;margin-top:8px}}.twitter-container .tweet-form__hashtag-form[data-v-51116497]{display:block;width:calc(100% - 24px);height:100%;flex-grow:1;font-size:12.5px;color:var(--v-twitter-lighten2);outline:none}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(100% - 22px);font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(100% - 22px);font-size:12px}}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(133.3% - 32px);height:25.328px;font-size:16px;transform:scale(.75);transform-origin:0 0}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag-form[data-v-51116497]{width:calc(133.3% - 32px);height:25.328px;font-size:16px;transform:scale(.75);transform-origin:0 0}}}.twitter-container .tweet-form__hashtag-form[data-v-51116497]::-moz-placeholder{color:rgba(65,165,241,.6)}.twitter-container .tweet-form__hashtag-form[data-v-51116497]::placeholder{color:rgba(65,165,241,.6)}.twitter-container .tweet-form__hashtag-list-button[data-v-51116497]{display:flex;position:absolute;align-items:center;justify-content:center;top:-8px;right:-8px;width:34px;height:34px;padding:6px;border-radius:50%;color:var(--v-twitter-lighten2);cursor:pointer}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__hashtag-list-button[data-v-51116497]{right:-11px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__hashtag-list-button[data-v-51116497]{right:-11px}}.twitter-container .tweet-form__textarea[data-v-51116497]{display:block;flex-grow:1;margin-top:8px;margin-left:12px;margin-right:12px;font-size:12.5px;color:var(--v-text-base);word-break:break-all;resize:none;outline:none}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__textarea[data-v-51116497]{margin-top:6px;font-size:12px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__textarea[data-v-51116497]{margin-top:6px;font-size:12px}}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__textarea[data-v-51116497]{position:absolute;top:24px;left:-2px;min-width:calc(128% - 25px);min-height:34px;font-size:16px;transform:scale(.78125);transform-origin:0 0}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__textarea[data-v-51116497]{position:absolute;top:24px;left:-2px;min-width:calc(128% - 25px);min-height:34px;font-size:16px;transform:scale(.78125);transform-origin:0 0}}}.twitter-container .tweet-form__textarea[data-v-51116497]::-moz-placeholder{color:var(--v-text-darken2)}.twitter-container .tweet-form__textarea[data-v-51116497]::placeholder{color:var(--v-text-darken2)}.twitter-container .tweet-form__control[data-v-51116497]{display:flex;align-items:center;height:32px;margin-top:6px}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control[data-v-51116497]{height:26px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control[data-v-51116497]{height:26px}}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control[data-v-51116497]{margin-top:auto}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control[data-v-51116497]{margin-top:auto}}}.twitter-container .tweet-form__control .account-button[data-v-51116497]{display:flex;align-items:center;width:183px;height:100%;border-radius:7px;font-size:13px;color:var(--v-text-base);background:var(--v-background-lighten2);-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .account-button[data-v-51116497]{width:200px;border-radius:5px;font-size:11.5px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .account-button[data-v-51116497]{width:156px;border-radius:5px;font-size:11px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .account-button[data-v-51116497]{width:auto;flex-grow:1;border-radius:5px;font-size:11.5px}}.twitter-container .tweet-form__control .account-button--no-login .account-button__screen-name[data-v-51116497]{font-weight:500}.twitter-container .tweet-form__control .account-button--no-login .account-button__menu[data-v-51116497]{display:none}.twitter-container .tweet-form__control .account-button__icon[data-v-51116497]{display:block;width:32px;height:100%;border-radius:7px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2))}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .account-button__icon[data-v-51116497]{width:26px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .account-button__icon[data-v-51116497]{width:26px}}.twitter-container .tweet-form__control .account-button__screen-name[data-v-51116497]{flex-grow:1;line-height:2;text-align:center;font-weight:700}.twitter-container .tweet-form__control .account-button__menu[data-v-51116497]{margin-right:4px}.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{display:flex;align-items:center;justify-content:center;flex-direction:column;flex-grow:1;row-gap:.5px;font-size:10px;color:var(--v-text-darken1);-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{flex-grow:1;flex-direction:row;width:auto}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{font-size:9px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .limit-meter[data-v-51116497]{flex-grow:unset;flex-direction:row;width:88px}}.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]{display:flex;align-items:center;justify-content:center}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]:nth-child(2){margin-left:28px;padding-right:3px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]:nth-child(2){margin-top:-2.5px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .limit-meter__content[data-v-51116497]:nth-child(2){margin-left:6px}}.twitter-container .tweet-form__control .limit-meter__content svg[data-v-51116497]{width:14px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter__content svg[data-v-51116497]{width:16px;height:16px}}.twitter-container .tweet-form__control .limit-meter__content span[data-v-51116497]{width:16px;margin-left:5px;text-align:center;font-weight:700}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .limit-meter__content span[data-v-51116497]{width:25px;margin-left:8px;font-size:15px}}.twitter-container .tweet-form__control .limit-meter__content--yellow[data-v-51116497]{color:var(--v-warning-base)}.twitter-container .tweet-form__control .limit-meter__content--red[data-v-51116497]{color:var(--v-error-base)}.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{display:flex;align-items:center;justify-content:center;width:94px;height:100%;border-radius:7px;font-size:12.5px;line-height:2;color:var(--v-text-base);background:var(--v-twitter-base);-webkit-user-select:none;-moz-user-select:none;user-select:none;outline:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{width:200px;border-radius:5px;font-size:11.8px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{width:86px;border-radius:5px;font-size:11.8px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .tweet-form__control .tweet-button[data-v-51116497]{width:100px;border-radius:5px;font-size:11.8px}}.twitter-container .tweet-form__control .tweet-button[disabled][data-v-51116497]{opacity:.7;cursor:auto}.twitter-container .hashtag-list[data-v-51116497]{position:absolute;left:12px;right:12px;bottom:149px;max-height:calc(100vh - 239px);max-height:calc(100dvh - 239px);padding:12px 4px;padding-bottom:10px;border-radius:7px;-webkit-clip-path:inset(0 0 0 0 round 7px);clip-path:inset(0 0 0 0 round 7px);background:var(--v-background-lighten2);box-shadow:0 3px 4px rgba(0,0,0,.53);transition:opacity .15s ease,visibility .15s ease;opacity:0;visibility:hidden;overflow-y:auto;z-index:2}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .hashtag-list[data-v-51116497]{left:24px;right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list[data-v-51116497]{left:8px;right:8px;bottom:110px;max-height:calc(100vh - 152px);max-height:calc(100dvh - 152px);padding:6px 4px;border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list[data-v-51116497]{bottom:102px;max-height:calc(100% - 110px);padding:8px 4px;border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}.twitter-container .hashtag-list--display[data-v-51116497]{opacity:1;visibility:visible}.twitter-container .hashtag-list--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 74px)!important;max-height:calc(100vh - env(keyboard-inset-height, 0px) - 16px)!important;max-height:calc(100dvh - env(keyboard-inset-height, 0px) - 16px)!important}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 26px)!important}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list--virtual-keyboard-display[data-v-51116497]{bottom:calc(env(keyboard-inset-height, 0px) - 90px)!important;max-height:calc(100% - env(keyboard-inset-height, 0px) + 82px)!important}}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar{width:4px}}.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar-track{background:var(--v-background-lighten2)}.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar-thumb,.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar-thumb:hover{background:var(--v-gray-base)}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar{width:.1px;-webkit-appearance:none}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list[data-v-51116497]::-webkit-scrollbar{width:.1px;-webkit-appearance:none}}}.twitter-container .hashtag-list .hashtag-heading[data-v-51116497]{display:flex;align-items:center;font-weight:700;padding-left:8px;padding-right:4px}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list .hashtag-heading[data-v-51116497]{padding-left:4px;padding-right:2px}}.twitter-container .hashtag-list .hashtag-heading__text[data-v-51116497]{display:flex;align-items:center;flex-grow:1;font-size:14px}.twitter-container .hashtag-list .hashtag-heading__add-button[data-v-51116497]{display:flex;align-items:center;font-size:13px;padding:4px 8px;border-radius:5px;outline:none;cursor:pointer}.twitter-container .hashtag-list .hashtag-container[data-v-51116497]{display:flex;flex-direction:column}.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]{display:flex;position:relative!important;align-items:center;padding-top:1.5px;padding-bottom:1.5px;padding-left:8px;padding-right:4px;border-radius:7px;transition:background-color .15s ease;cursor:pointer}@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]{padding-top:0;padding-bottom:0;padding-left:4px;padding-right:2px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]{padding-top:0;padding-bottom:0}}.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:first-of-type{margin-top:6px}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:first-of-type{margin-top:0}}.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:hover{background:hsla(0,0%,100%,.1)}@media(hover:none){.twitter-container .hashtag-list .hashtag-container .hashtag[data-v-51116497]:hover{background:transparent}}.twitter-container .hashtag-list .hashtag-container .hashtag--editing[data-v-51116497]:hover{background:transparent}.twitter-container .hashtag-list .hashtag-container .hashtag--editing .hashtag__input[data-v-51116497]{box-shadow:0 0 0 3.5px rgba(79,130,230,.6);cursor:text}.twitter-container .hashtag-list .hashtag-container .hashtag__input[data-v-51116497]{display:block;flex-grow:1;border-radius:2px;color:var(--v-twitter-lighten2);opacity:1;outline:none;cursor:pointer;transition:box-shadow .09s ease;margin-right:4px;font-size:12.5px}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.twitter-container .hashtag-list .hashtag-container .hashtag__input[data-v-51116497]{position:absolute!important;left:-26px!important;width:calc(100% - 6px);margin-right:0;font-size:16px;transform:scale(.78125)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag__input[data-v-51116497]{position:absolute!important;left:-26px!important;width:calc(100% - 21px);margin-right:0;font-size:16px;transform:scale(.78125)}}}.twitter-container .hashtag-list .hashtag-container .hashtag__edit-button[data-v-51116497]{margin-left:auto}.twitter-container .hashtag-list .hashtag-container .hashtag__delete-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__edit-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__sort-handle[data-v-51116497]{display:flex;align-items:center;justify-content:center;width:19px;height:27px;border-radius:5px;outline:none;cursor:pointer}@media(max-width:600px)and (min-height:450.01px){.twitter-container .hashtag-list .hashtag-container .hashtag__delete-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__edit-button[data-v-51116497],.twitter-container .hashtag-list .hashtag-container .hashtag__sort-handle[data-v-51116497]{width:25px}}.twitter-container .hashtag-list .hashtag-container .hashtag__sort-handle[data-v-51116497]{cursor:move}.twitter-container .twitter-account-list[data-v-51116497]{position:absolute;left:12px;right:12px;bottom:48px;max-height:calc(100vh - 137px);max-height:calc(100dvh - 137px);border-radius:7px;-webkit-clip-path:inset(0 0 0 0 round 7px);clip-path:inset(0 0 0 0 round 7px);background:var(--v-background-lighten2);box-shadow:0 3px 4px rgba(0,0,0,.53);transition:opacity .15s ease,visibility .15s ease;opacity:0;visibility:hidden;overflow-y:auto;z-index:3}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.twitter-container .twitter-account-list[data-v-51116497]{left:24px;right:24px}}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list[data-v-51116497]{left:8px;right:8px;bottom:40px;max-height:calc(100vh - 82px);max-height:calc(100dvh - 82px);border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list[data-v-51116497]{bottom:32px;max-height:calc(100% - 40px);border-radius:6px;-webkit-clip-path:inset(0 0 0 0 round 6px);clip-path:inset(0 0 0 0 round 6px)}}.twitter-container .twitter-account-list--display[data-v-51116497]{opacity:1;visibility:visible}.twitter-container .twitter-account-list[data-v-51116497]::-webkit-scrollbar-track{background:var(--v-background-lighten2)}.twitter-container .twitter-account-list[data-v-51116497]::-webkit-scrollbar-thumb,.twitter-container .twitter-account-list[data-v-51116497]::-webkit-scrollbar-thumb:hover{background:var(--v-gray-base)}.twitter-container .twitter-account-list .twitter-account[data-v-51116497]{display:flex;align-items:center;padding:12px 12px;border-radius:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account[data-v-51116497]{padding:8px 12px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account[data-v-51116497]{padding:8px 12px}}.twitter-container .twitter-account-list .twitter-account__icon[data-v-51116497]{display:block;width:50px;height:50px;border-radius:50%}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account__icon[data-v-51116497]{width:36px;height:36px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account__icon[data-v-51116497]{width:36px;height:36px}}.twitter-container .twitter-account-list .twitter-account__info[data-v-51116497]{display:flex;flex-direction:column;flex-grow:1;min-width:0;margin-left:12px}.twitter-container .twitter-account-list .twitter-account__name[data-v-51116497]{font-size:17px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account__name[data-v-51116497]{font-size:14px;line-height:1.3}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account__name[data-v-51116497]{font-size:14px;line-height:1.3}}.twitter-container .twitter-account-list .twitter-account__screen-name[data-v-51116497]{color:var(--v-text-darken1);font-size:14px}@media(max-width:1000px)and (max-height:450px){.twitter-container .twitter-account-list .twitter-account__screen-name[data-v-51116497]{font-size:13px}}@media(max-width:600px)and (min-height:450.01px){.twitter-container .twitter-account-list .twitter-account__screen-name[data-v-51116497]{font-size:13px}}.twitter-container .twitter-account-list .twitter-account__check[data-v-51116497]{flex-shrink:0;color:var(--v-twitter-lighten1)}.watch-player__dplayer svg circle,.watch-player__dplayer svg path{fill:var(--v-text-base)!important}.watch-player__dplayer .dplayer-video-wrap{background:transparent!important}.watch-player__dplayer .dplayer-video-wrap .dplayer-video-wrap-aspect{transition:opacity .2s cubic-bezier(.4,.38,.49,.94);opacity:1}.watch-player__dplayer .dplayer-video-wrap .dplayer-danmaku{max-width:100%;max-height:calc(100% - var(--comment-area-vertical-margin, 0px));aspect-ratio:var(--comment-area-aspect-ratio,16/9);transition:max-height .5s cubic-bezier(.42,.19,.53,.87),aspect-ratio .5s cubic-bezier(.42,.19,.53,.87);will-change:aspect-ratio;overflow:hidden}.watch-player__dplayer .dplayer-video-wrap .dplayer-bml-browser{display:block;position:absolute;width:var(--bml-browser-width,960px);height:var(--bml-browser-height,540px);color:#000;overflow:hidden;transform-origin:center;transform:scale(var(--bml-browser-scale-factor-width,1),var(--bml-browser-scale-factor-height,1));aspect-ratio:16/9}.watch-player__dplayer .dplayer-video-wrap .dplayer-danloading,.watch-player__dplayer .dplayer-video-wrap .dplayer-loading-icon{display:none!important}.watch-player__dplayer .dplayer-controller-mask{height:82px!important;background:linear-gradient(180deg,transparent,#000000cf)!important;opacity:0!important;visibility:hidden;transition:opacity .3s ease,visibility .3s ease!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller-mask{height:66px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller-mask{height:66px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller-mask{height:66px!important}}.watch-player__dplayer .dplayer-controller{padding-left:86px!important;padding-bottom:6px!important;transition:opacity .3s ease,visibility .3s ease;opacity:0!important;visibility:hidden}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller{padding-left:18px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller{padding-left:18px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller{padding-left:18px!important}}.watch-player__dplayer .dplayer-controller .dplayer-live-badge,.watch-player__dplayer .dplayer-controller .dplayer-time{color:var(--v-text-base)!important}.watch-player__dplayer .dplayer-controller .dplayer-volume-bar{background:var(--v-text-base)!important}.watch-player__dplayer .dplayer-controller .dplayer-icons{bottom:auto!important}.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:22px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:11px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:11px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:11px!important}}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-in-icon{display:none!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-pip-icon:after{left:25%}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon:after{left:-20%}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-pip-icon:after{left:25%}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon:after{left:-20%}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-pip-icon:after{left:25%}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon:after{left:-20%}}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-capture-icon,.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-capture-icon{transition:background-color .08s ease;border-radius:6px}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-capture-icon.dplayer-capturing,.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-capture-icon.dplayer-capturing{background:var(--v-secondary-lighten1)}.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-capture-icon.dplayer-capturing .dplayer-icon-content,.watch-player__dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-capture-icon.dplayer-capturing .dplayer-icon-content{opacity:1}.watch-player__dplayer .dplayer-controller .dplayer-comment-box{transition:opacity .3s ease,visibility .3s ease!important}.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-setting-icon{z-index:5}.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input{transition:box-shadow .09s ease;-moz-appearance:none;appearance:none;-webkit-appearance:none}.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input:focus{box-shadow:0 0 0 3.5px rgba(79,130,230,.6)}@supports(-webkit-touch-callout:none){@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input{width:114.2857%!important;height:114.2857%!important;font-size:16px!important;transform:scale(.875);transform-origin:0 0}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-controller .dplayer-comment-box .dplayer-comment-input{width:114.2857%!important;height:114.2857%!important;font-size:16px!important;transform:scale(.875);transform-origin:0 0}}}.watch-player__dplayer .dplayer-notice{padding:16px 22px!important;margin-right:30px;border-radius:4px!important;font-size:15px!important;line-height:1.6}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-notice{top:auto;left:16px!important;padding:12px 16px!important;margin-right:16px;font-size:13.5px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer .dplayer-notice{padding:12px 16px!important;margin-right:16px;font-size:13.5px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-notice{top:auto;left:16px!important;padding:12px 16px!important;margin-right:16px;font-size:13.5px!important}}.watch-player__dplayer .dplayer-info-panel{transition:top .3s,left .3s}.watch-player__dplayer .dplayer-setting-box{z-index:10!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer .dplayer-setting-box{height:calc(100% - 60px)!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer .dplayer-setting-box{height:calc(100% - 60px)!important}}.watch-player__dplayer .dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-item--disabled{pointer-events:none}.watch-player__dplayer .dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-item--disabled .dplayer-label{color:#aaa}.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-title{color:var(--v-text-base)}.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-size span,.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-type span{border:1px solid --v-text-base}.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-size input:checked+span,.watch-player__dplayer .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:var(--v-text-base)}.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:98px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:18px!important}}@media(max-width:1000px)and (max-height:450px){.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:18px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:18px!important}}.watch-player__dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller{transform:none!important}.watch-player--loading .dplayer-video-wrap-aspect{opacity:0!important}:root .dplayer-icon:hover .dplayer-icon-content,_::-webkit-full-page-media,_:future{opacity:.8!important}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask{opacity:1!important;visibility:visible!important}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:88px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller .dplayer-comment-box,.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-controller-mask .dplayer-comment-box{left:16px}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:98px;bottom:62px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px;bottom:62px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px;bottom:62px!important}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{top:82px;left:98px}@media(min-width:1000.01px)and (max-width:1264px)and (max-height:850px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-info-panel{left:16px}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:88px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-comment-setting-box{left:16px}}.watch-container.watch-container--control-display .watch-player__dplayer .dplayer-mobile .dplayer-mobile-icon-wrap{opacity:.7!important;visibility:visible!important}.watch-container:not(.watch-container--control-display) .watch-player__dplayer .dplayer-danmaku{max-height:100%!important;aspect-ratio:16/9!important}.watch-container:not(.watch-container--control-display) .watch-player__dplayer .dplayer-notice{bottom:20px!important}.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-controller{padding-left:20px!important}.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:30px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:16px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:16px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer.dplayer-mobile .dplayer-controller{padding-left:16px!important}}.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:20px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:16px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:16px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-box,.watch-container.watch-container--fullscreen .watch-player__dplayer .dplayer-comment-setting-box{left:16px!important}}.watch-container.watch-container--fullscreen .watch-header__back-icon{display:none!important}.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:30px!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px!important}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-info-panel,.watch-container.watch-container--fullscreen.watch-container--control-display .watch-player__dplayer .dplayer-notice{left:16px!important}}.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-controller-mask{position:absolute;bottom:env(keyboard-inset-height,0)!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-controller-mask{bottom:0!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-controller-mask{bottom:0!important}}.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-icons.dplayer-comment-box{position:absolute;bottom:calc(env(keyboard-inset-height, 0px) + 4px)!important}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-icons.dplayer-comment-box{bottom:6px!important}}@media(max-width:600px)and (min-height:450.01px){.watch-player.watch-player--virtual-keyboard-display .watch-player__dplayer .dplayer-icons.dplayer-comment-box{bottom:6px!important}}.shortcut-key[data-v-0dd9e1f3]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;min-width:32px;min-height:28px;padding:3px 8px;border-radius:5px;background-color:var(--v-background-lighten2);font-size:14.5px;text-align:center}.shortcut-key-plus[data-v-0dd9e1f3]{display:inline-block;margin:0 5px;flex-shrink:0}.route-container[data-v-0dd9e1f3]{height:100vh!important;height:100dvh!important;background:var(--v-black-base)!important;overflow:hidden}@supports(-webkit-touch-callout:none){.route-container[data-v-0dd9e1f3]{height:-webkit-fill-available!important}}.watch-container[data-v-0dd9e1f3]{display:flex;width:calc(100% + 352px);height:100%;transition:width .4s cubic-bezier(.26,.68,.55,.99)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container[data-v-0dd9e1f3]{flex-direction:column;width:100%}}@media(max-width:1000px)and (max-height:450px){.watch-container[data-v-0dd9e1f3]{width:calc(100% + 310px)}}@media(max-width:600px)and (min-height:450.01px){.watch-container[data-v-0dd9e1f3]{flex-direction:column;width:100%;padding-bottom:56px}}.watch-container.watch-container--control-display .watch-content[data-v-0dd9e1f3]{cursor:auto!important}.watch-container.watch-container--control-display .watch-header[data-v-0dd9e1f3],.watch-container.watch-container--control-display .watch-navigation[data-v-0dd9e1f3],.watch-container.watch-container--control-display .watch-player__button[data-v-0dd9e1f3]{opacity:1!important;visibility:visible!important}.watch-container.watch-container--panel-display[data-v-0dd9e1f3]{width:100%}.watch-container.watch-container--panel-display .switch-button-panel .switch-button-icon[data-v-0dd9e1f3]{color:var(--v-primary-base)}@media(hover:none){.watch-container.watch-container--panel-display .watch-panel[data-v-0dd9e1f3]{content-visibility:auto}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container[data-v-0dd9e1f3]{width:100%}}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px)and (hover:none){.watch-container .watch-panel[data-v-0dd9e1f3]{content-visibility:auto}}@media(max-width:600px)and (min-height:450.01px){.watch-container[data-v-0dd9e1f3]{width:100%}}@media(max-width:600px)and (min-height:450.01px)and (hover:none){.watch-container .watch-panel[data-v-0dd9e1f3]{content-visibility:auto}}.watch-container.watch-container--fullscreen .watch-navigation[data-v-0dd9e1f3]{display:none}.watch-container.watch-container--fullscreen .watch-content .watch-header[data-v-0dd9e1f3]{padding-left:30px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container.watch-container--fullscreen .watch-content .watch-header[data-v-0dd9e1f3]{padding-left:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container.watch-container--fullscreen .watch-content .watch-header[data-v-0dd9e1f3]{padding-left:16px}}.watch-container .watch-navigation[data-v-0dd9e1f3]{display:flex;flex-direction:column;position:fixed;width:68px;top:0;left:0;bottom:-100px;padding:18px 8px 122px;background:#2f221f80;transition:opacity .3s,visibility .3s;opacity:0;visibility:hidden;z-index:10}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-navigation[data-v-0dd9e1f3]{display:none}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation[data-v-0dd9e1f3]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-navigation[data-v-0dd9e1f3]{display:none}}.watch-container .watch-navigation .watch-navigation__icon[data-v-0dd9e1f3]{display:flex;justify-content:center;align-items:center;height:52px;margin-bottom:17px;border-radius:11px;font-size:16px;color:var(--v-text-base);transition:background-color .15s;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__icon[data-v-0dd9e1f3]{height:32px;border-radius:10px}.watch-container .watch-navigation div.spacer[data-v-0dd9e1f3]{display:none}}.watch-container .watch-navigation .watch-navigation__link[data-v-0dd9e1f3]{display:flex;justify-content:center;align-items:center;height:52px;border-radius:11px;font-size:16px;color:var(--v-text-base);transition:background-color .15s;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__link[data-v-0dd9e1f3]{height:44px;border-radius:10px}.watch-container .watch-navigation .watch-navigation__link[data-v-0dd9e1f3]:last-child,.watch-container .watch-navigation .watch-navigation__link[data-v-0dd9e1f3]:nth-last-child(2){display:none}}.watch-container .watch-navigation .watch-navigation__link[data-v-0dd9e1f3]:hover{background:#433532a0}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__link-icon[data-v-0dd9e1f3]{width:26px;height:26px}}.watch-container .watch-navigation .watch-navigation__link--active[data-v-0dd9e1f3]{color:var(--v-primary-base);background:#433532a0}.watch-container .watch-navigation .watch-navigation__link+.watch-navigation__link[data-v-0dd9e1f3]{margin-top:4px}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-navigation .watch-navigation__link+.watch-navigation__link[data-v-0dd9e1f3]{margin-top:auto}}.watch-container .watch-content[data-v-0dd9e1f3]{display:flex;position:relative;width:100%;cursor:none}.watch-container .watch-content .watch-header[data-v-0dd9e1f3]{display:flex;align-items:center;position:absolute;top:0;left:0;width:100%;height:82px;padding-left:98px;padding-right:30px;background:linear-gradient(180deg,#000000cf,transparent);transition:opacity .3s,visibility .3s;opacity:0;visibility:hidden;z-index:5}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header[data-v-0dd9e1f3]{height:66px;padding-left:16px;padding-right:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header[data-v-0dd9e1f3]{padding-left:84px;padding-right:16px;height:66px;padding-left:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header[data-v-0dd9e1f3]{display:none;height:50px;padding-left:16px;padding-right:16px}}.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-0dd9e1f3]{display:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-0dd9e1f3]{display:flex;position:relative!important;align-items:center;justify-content:center;flex-shrink:0;width:40px;height:40px;left:-6px;padding:6px;margin-right:2px;border-radius:50%;color:var(--v-text-base)}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-0dd9e1f3]{display:flex;position:relative!important;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;left:-6px;padding:6px;margin-right:2px;border-radius:50%;color:var(--v-text-base)}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__back-icon[data-v-0dd9e1f3]{display:flex;position:relative!important;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;left:-6px;padding:6px;margin-right:2px;border-radius:50%;color:var(--v-text-base)}}.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-0dd9e1f3]{display:inline-block;flex-shrink:0;width:64px;height:36px;border-radius:5px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-0dd9e1f3]{width:48px;height:28px;border-radius:4px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-0dd9e1f3]{width:48px;height:28px;border-radius:4px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__broadcaster[data-v-0dd9e1f3]{display:none}}.watch-container .watch-content .watch-header .watch-header__program-title[data-v-0dd9e1f3]{margin-left:18px;font-size:18px;font-weight:700;font-feature-settings:"palt" 1;letter-spacing:.05em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-header .watch-header__program-title[data-v-0dd9e1f3]{margin-left:12px;font-size:16px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__program-title[data-v-0dd9e1f3]{margin-left:12px;font-size:16px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__program-title[data-v-0dd9e1f3]{margin-left:0;font-size:16px}}.watch-container .watch-content .watch-header .watch-header__program-time[data-v-0dd9e1f3]{flex-shrink:0;margin-left:16px;font-size:15px;font-weight:600}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__program-time[data-v-0dd9e1f3]{margin-left:8px;font-size:14px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__program-time[data-v-0dd9e1f3]{margin-left:8px;font-size:14px}}.watch-container .watch-content .watch-header .watch-header__now[data-v-0dd9e1f3]{flex-shrink:0;margin-left:16px;font-size:13px;font-weight:600}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-header .watch-header__now[data-v-0dd9e1f3]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-header .watch-header__now[data-v-0dd9e1f3]{display:none}}.watch-container .watch-content .watch-player[data-v-0dd9e1f3]{display:flex;position:relative;width:100%;height:100%;background-size:contain;background-position:50%}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player[data-v-0dd9e1f3]{aspect-ratio:16/9}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player[data-v-0dd9e1f3]{aspect-ratio:16/9}}.watch-container .watch-content .watch-player .watch-player__background-wrapper[data-v-0dd9e1f3]{position:absolute;top:0;left:0;width:100%;height:100%}.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background[data-v-0dd9e1f3]{position:relative;top:50%;left:50%;max-height:100%;aspect-ratio:16/9;transform:translate(-50%,-50%);background-blend-mode:overlay;background-color:rgba(14,14,18,.35);background-size:cover;background-image:none;opacity:0;visibility:hidden;transition:opacity .4s cubic-bezier(.4,.38,.49,.94),visibility .4s cubic-bezier(.4,.38,.49,.94);will-change:opacity}.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background--display[data-v-0dd9e1f3]{opacity:1;visibility:visible}.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-0dd9e1f3]{display:inline-block;position:absolute;height:34px;right:56px;bottom:44px;filter:drop-shadow(0 0 5px var(--v-black-base))}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-0dd9e1f3]{height:30px;right:34px;bottom:30px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-0dd9e1f3]{height:25px;right:30px;bottom:24px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__background-wrapper .watch-player__background .watch-player__background-logo[data-v-0dd9e1f3]{height:22px;right:30px;bottom:24px}}.watch-container .watch-content .watch-player .watch-player__buffering[data-v-0dd9e1f3]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--v-background-lighten3);filter:drop-shadow(0 0 3px rgba(0,0,0,.3));opacity:0;visibility:hidden;transition:opacity .2s cubic-bezier(.4,.38,.49,.94),visibility .2s cubic-bezier(.4,.38,.49,.94);will-change:opacity;z-index:3}.watch-container .watch-content .watch-player .watch-player__buffering--display[data-v-0dd9e1f3]{opacity:1;visibility:visible}.watch-container .watch-content .watch-player .watch-player__dplayer[data-v-0dd9e1f3]{width:100%}.watch-container .watch-content .watch-player .watch-player__button[data-v-0dd9e1f3]{display:flex;justify-content:space-around;flex-direction:column;position:absolute;top:50%;right:28px;height:190px;transform:translateY(-50%);opacity:0;visibility:hidden;transition:opacity .3s,visibility .3s}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player .watch-player__button[data-v-0dd9e1f3]{right:15px;height:128px}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__button[data-v-0dd9e1f3]{right:15px;height:155px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button[data-v-0dd9e1f3]{right:15px;height:100px}}.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-0dd9e1f3]{display:flex;justify-content:center;align-items:center;width:48px;height:48px;color:var(--v-text-base);background:#2f221fc0;border-radius:7px;transition:background-color .15s;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-0dd9e1f3]{width:38px;height:38px;border-radius:5px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-0dd9e1f3]{width:38px;height:38px;border-radius:5px}}.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-0dd9e1f3]:hover{background:#2f221ff0}@media(hover:none){.watch-container .watch-content .watch-player .watch-player__button .switch-button[data-v-0dd9e1f3]:hover{background:#2f221fc0}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-content .watch-player .watch-player__button .switch-button svg[data-v-0dd9e1f3]{height:27px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button svg[data-v-0dd9e1f3]{height:27px}}.watch-container .watch-content .watch-player .watch-player__button .switch-button .switch-button-icon[data-v-0dd9e1f3]{position:relative}.watch-container .watch-content .watch-player .watch-player__button .switch-button-up>.switch-button-icon[data-v-0dd9e1f3]{top:6px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button-panel[data-v-0dd9e1f3]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-content .watch-player .watch-player__button .switch-button-panel[data-v-0dd9e1f3]{display:none}}.watch-container .watch-content .watch-player .watch-player__button .switch-button-panel>.switch-button-icon[data-v-0dd9e1f3]{top:1.5px;transition:color .4s cubic-bezier(.26,.68,.55,.99)}.watch-container .watch-content .watch-player .watch-player__button .switch-button-down>.switch-button-icon[data-v-0dd9e1f3]{bottom:4px}.watch-container .watch-panel[data-v-0dd9e1f3]{display:flex;flex-direction:column;flex-shrink:0;width:352px;height:100%;background:var(--v-background-base)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel[data-v-0dd9e1f3]{width:100%;height:auto;flex-grow:1}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel[data-v-0dd9e1f3]{width:310px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel[data-v-0dd9e1f3]{width:100%;height:auto;flex-grow:1}}@media(hover:none){.watch-container .watch-panel[data-v-0dd9e1f3]{content-visibility:hidden}}.watch-container .watch-panel .watch-panel__header[data-v-0dd9e1f3]{display:flex;align-items:center;flex-shrink:0;width:100%;height:70px;padding-left:16px;padding-right:16px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__header[data-v-0dd9e1f3]{display:none}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__header[data-v-0dd9e1f3]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__header[data-v-0dd9e1f3]{display:none}}.watch-container .watch-panel .watch-panel__header .panel-close-button[data-v-0dd9e1f3]{display:flex;position:relative;align-items:center;flex-shrink:0;left:-4px;height:35px;padding:0 4px;border-radius:5px;font-size:16px;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}.watch-container .watch-panel .watch-panel__header .panel-close-button__icon[data-v-0dd9e1f3]{position:relative;left:-4px}.watch-container .watch-panel .watch-panel__header .panel-close-button__text[data-v-0dd9e1f3]{font-weight:700}.watch-container .watch-panel .watch-panel__header .panel-broadcaster[data-v-0dd9e1f3]{display:flex;align-items:center;min-width:0;margin-left:16px}.watch-container .watch-panel .watch-panel__header .panel-broadcaster__icon[data-v-0dd9e1f3]{display:inline-block;flex-shrink:0;width:43px;height:24px;border-radius:3px;background:linear-gradient(150deg,var(--v-gray-base),var(--v-background-lighten2));-o-object-fit:cover;object-fit:cover;-webkit-user-select:none;-moz-user-select:none;user-select:none}.watch-container .watch-panel .watch-panel__header .panel-broadcaster__number[data-v-0dd9e1f3]{flex-shrink:0;margin-left:8px;font-size:16px}.watch-container .watch-panel .watch-panel__header .panel-broadcaster__name[data-v-0dd9e1f3]{margin-left:5px;font-size:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__header .panel-broadcaster__name[data-v-0dd9e1f3]{font-size:14px}}.watch-container .watch-panel .watch-panel__content-container[data-v-0dd9e1f3]{position:relative;height:100%}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content[data-v-0dd9e1f3]{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--v-background-base);transition:opacity .2s,visibility .2s;opacity:0;visibility:hidden}@media(hover:none){.watch-container .watch-panel .watch-panel__content-container .watch-panel__content[data-v-0dd9e1f3]{transition:none;content-visibility:hidden}}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content--active[data-v-0dd9e1f3]{opacity:1;visibility:visible;content-visibility:auto}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content-remocon-button[data-v-0dd9e1f3]{display:flex;align-items:center;justify-content:center;position:absolute;right:16px;bottom:16px;width:48px;height:48px;border-radius:50%;background:var(--v-background-lighten1);outline:none;transition:opacity .2s,visibility .2s;opacity:0;visibility:hidden}@media(hover:none){.watch-container .watch-panel .watch-panel__content-container .watch-panel__content-remocon-button[data-v-0dd9e1f3]{transition:none}}.watch-container .watch-panel .watch-panel__content-container .watch-panel__content-remocon-button--active[data-v-0dd9e1f3]{opacity:1;visibility:visible}.watch-container .watch-panel .watch-panel__navigation[data-v-0dd9e1f3]{display:flex;align-items:center;justify-content:space-evenly;flex-shrink:0;height:77px;background:var(--v-background-lighten1)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation[data-v-0dd9e1f3]{height:48px;background:var(--v-background-base)}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__navigation[data-v-0dd9e1f3]{height:34px}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation[data-v-0dd9e1f3]{height:44px;background:var(--v-background-base)}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-0dd9e1f3]{display:flex;justify-content:center;align-items:center;flex-direction:column;width:77px;height:56px;padding:6px 0;border-radius:5px;color:var(--v-text-base);box-sizing:content-box;transition:color .3s;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-0dd9e1f3]{width:100px;height:40px;padding:5px 0;box-sizing:border-box}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-0dd9e1f3]{height:34px;padding:5px 0;box-sizing:border-box}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button[data-v-0dd9e1f3]{height:34px;padding:5px 0;box-sizing:border-box}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active .panel-navigation-button__icon[data-v-0dd9e1f3],.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active[data-v-0dd9e1f3]{color:var(--v-primary-base)}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active[data-v-0dd9e1f3]{background:#5b2d3c}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button--active[data-v-0dd9e1f3]{background:#5b2d3c}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__icon[data-v-0dd9e1f3]{height:34px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__icon[data-v-0dd9e1f3]{color:var(--v-text-base)}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__icon[data-v-0dd9e1f3]{color:var(--v-text-base)}}.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-0dd9e1f3]{margin-top:5px;font-size:13px}@media(min-width:600.1px)and (max-width:850px)and (min-height:850.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-0dd9e1f3]{display:none}}@media(max-width:1000px)and (max-height:450px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-0dd9e1f3]{display:none}}@media(max-width:600px)and (min-height:450.01px){.watch-container .watch-panel .watch-panel__navigation .panel-navigation-button__text[data-v-0dd9e1f3]{display:none}} \ No newline at end of file diff --git a/client/dist/assets/js/app.ed6e0fd9.js b/client/dist/assets/js/app.86789222.js similarity index 77% rename from client/dist/assets/js/app.ed6e0fd9.js rename to client/dist/assets/js/app.86789222.js index e11a06b5..235792ca 100644 --- a/client/dist/assets/js/app.ed6e0fd9.js +++ b/client/dist/assets/js/app.86789222.js @@ -1,2 +1,2 @@ -(function(){var t={32729:function(t,e,s){"use strict";var i=s(62856),a=s(96086),n=s(52803),r=s(77738),o=s(20144),l=s(54801),c=s(61797),_=s.n(c),d=s(43726),u=function(){var t=this,e=t._self._c;return e(d.Z,{attrs:{id:"app"}},[e("transition",[e("router-view")],1)],1)},m=[],p=s(1001),h={},g=(0,p.Z)(h,u,m,!1,null,null,null),v=g.exports,f=s(56975),w=f.Z.extend({render(t){return t("transition",{props:{name:this.computedTransition},on:{beforeEnter:this.onBeforeTransition,afterEnter:this.onAfterTransition,enterCancelled:this.onTransitionCancelled,beforeLeave:this.onBeforeTransition,afterLeave:this.onAfterTransition,leaveCancelled:this.onTransitionCancelled,enter:this.onEnter}},[this.genWindowItem()])}}),y=s(96150),b=s(48131),C=(s(57658),s(20286)),k=C.Z.extend({data(){return{items:[]}},methods:{register(t){const e=this.items[this.internalIndex];this.items.push(t),this.items.sort(((t,e)=>{const s=this.$slots.default.findIndex((e=>t.$vnode.key===e.key)),i=this.$slots.default.findIndex((t=>e.$vnode.key===t.key));return s-i})),t.$on("change",(()=>this.onClick(t))),this.mandatory&&!this.selectedValues.length&&this.updateMandatory(),this.updateItem(t,this.items.indexOf(t)),void 0!==e&&this.updateInternalValue(this.items.indexOf(e))},unregister(t){const e=this.items[this.internalIndex];this.constructor.super.options.methods.unregister.call(this,t),void 0!==e&&this.updateInternalValue(this.items.indexOf(e))}}}),x=y.Z.extend({methods:{genBar(t,e){const s={style:{height:(0,b.kb)(this.height)},props:{activeClass:this.activeClass,centerActive:this.centerActive,dark:this.dark,light:this.light,mandatory:!this.optional,mobileBreakpoint:this.mobileBreakpoint,nextIcon:this.nextIcon,prevIcon:this.prevIcon,showArrows:this.showArrows,value:this.internalValue},on:{"call:slider":this.callSlider,change:t=>{this.internalValue=t}},ref:"items"};return this.setTextColor(this.computedColor,s),this.setBackgroundColor(this.backgroundColor,s),this.$createElement(k,s,[this.genSlider(e),t])}}}),S=s(71550),O=S.Z.extend({data(){return{items:[]}},methods:{register(t){const e=this.items[this.internalIndex];this.items.push(t),this.items.sort(((t,e)=>{const s=this.$slots.default.findIndex((e=>t.$vnode.key===e.key)),i=this.$slots.default.findIndex((t=>e.$vnode.key===t.key));return s-i})),t.$on("change",(()=>this.onClick(t))),this.mandatory&&!this.selectedValues.length&&this.updateMandatory(),this.updateItem(t,this.items.indexOf(t)),void 0!==e&&this.items.indexOf(e)!==this.internalValue&&this.updateInternalValue(this.items.indexOf(e))},unregister(t){const e=this.items[this.internalIndex];this.constructor.super.options.methods.unregister.call(this,t),void 0!==e&&this.updateInternalValue(this.items.indexOf(e))},updateReverse(t,e){const s=this.items.length,i=s-1;return s<=2?t":">"};return t.replace(/[&"'<>]/g,(t=>e[t]))}static getWindowFeatures(){const t=650,e=window.screen.height>=800?800:window.screen.height-100,s=(window.screen.height-e)/2,i=(window.screen.width-t)/2;return`toolbar=0,status=0,top=${s},left=${i},width=${t},height=${e},modal=yes,alwaysRaised=yes`}static hasActiveElementClass(t){return null!==document.activeElement&&document.activeElement.classList.contains(t)}static isFirefox(){return/Firefox/i.test(navigator.userAgent)}static isSafari(){return/Safari/i.test(navigator.userAgent)&&!/Chrome/i.test(navigator.userAgent)}static isMobileDevice(){return/iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&"ontouchend"in document}static isSmartphoneHorizontal(){return window.matchMedia("(max-width: 1000px) and (max-height: 450px)").matches}static isSmartphoneVertical(){return window.matchMedia("(max-width: 600px) and (min-height: 450.01px)").matches}static isTabletHorizontal(){return window.matchMedia("(max-width: 1264px) and (max-height: 850px)").matches}static isTabletVertical(){return window.matchMedia("(max-width: 850px) and (min-height: 850.01px)").matches}static isTouchDevice(){return window.matchMedia("(hover: none)").matches}static mathFloor(t,e=0){return Math.floor(t*10**e)/10**e}static async sleep(t){return await new Promise((e=>setTimeout(e,1e3*t)))}static time(){return Date.now()/1e3}static typeof(t){return Object.prototype.toString.call(t).slice(8,-1).toLowerCase()}static URLtoLink(t){t=$.escapeHTML(t);const e=/(https?:\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi;return t.replace(e,'$1')}}$.version="0.8.0-dev",$.api_base_url=(()=>`${window.location.protocol}//${window.location.host}/api`)();var z=$;class A{static getChannelType(t){try{const e=t.match("(?[a-z]+)[0-9]+").groups.channel_type.toUpperCase();return e}catch(e){return"GR"}}static getChannelForceType(t){return null===t?"normal":t>=500?"festival":t>=200?"so-many":t>=100?"many":"normal"}}var D=s(48764),L=s(29204),N={success(t){return window.KonomiTVVueInstance?.$message.success(t)},info(t){return window.KonomiTVVueInstance?.$message.info(t)},warning(t){return window.KonomiTVVueInstance?.$message.warning(t)},error(t){return window.KonomiTVVueInstance?.$message.error(t)},show(t){return window.KonomiTVVueInstance?.$message.show(t)}},E=s(6154);const K=E["default"].create();K.interceptors.request.use((t=>{if(void 0===t.baseURL&&(t.baseURL=pt.api_base_url),!1===t.url?.startsWith("http")){const e=pt.getAccessToken();null!==e&&(t.headers["Authorization"]=`Bearer ${e}`),t.headers["X-KonomiTV-Version"]=pt.version}return t.timeout=3e4,t}));var H=K;class M{static async createUser(t){const e=await G.post("/users",t);if("is_error"in e){switch(e.error.message){case"Specified username is duplicated":N.error("ユーザー名が重複しています。");break;case"Specified username is not accepted due to system limitations":N.error("ユーザー名に token と me は使えません。");break;default:G.showGenericError(e,"アカウントを作成できませんでした。");break}return null}return e.data}static async createUserAccessToken(t,e){const s=await G.post("/users/token",new URLSearchParams({username:t,password:e}));if("is_error"in s){switch(s.error.message){case"Incorrect username":N.error("ログインできませんでした。そのユーザー名のアカウントは存在しません。");break;case"Incorrect password":N.error("ログインできませんでした。パスワードを間違えていませんか?");break;default:G.showGenericError(s,"ログインできませんでした。");break}return null}return s.data}static async fetchUser(){const t=await G.get("/users/me");return"is_error"in t?(G.showGenericError(t,"アカウント情報を取得できませんでした。"),null):t.data}static async fetchUserIcon(){const t=await G.get("/users/me/icon",{responseType:"blob"});return"is_error"in t?(G.showGenericError(t,"アイコン画像を取得できませんでした。"),null):URL.createObjectURL(t.data)}static async updateUser(t){const e=await G.put("/users/me",t);if("is_error"in e)switch(e.error.message){case"Specified username is duplicated":N.error("ユーザー名が重複しています。");break;case"Specified username is not accepted due to system limitations":N.error("ユーザー名に token と me は使えません。");break;default:G.showGenericError(e,"アカウント情報を更新できませんでした。");break}else;}static async updateUserIcon(t){const e=new FormData;e.append("image",t);const s=await G.put("/users/me/icon",e,{headers:{"Content-Type":"multipart/form-data"}});if("is_error"in s)switch(s.error.message){case"Please upload JPEG or PNG image":N.error("JPEG または PNG 画像をアップロードしてください。");break;default:G.showGenericError(s,"アイコン画像を更新できませんでした。");break}else;}static async deleteUser(){const t=await G["delete"]("/users/me");"is_error"in t&&G.showGenericError(t,"アカウントを削除できませんでした。")}}var F=M;const V=(0,a.Q_)("user",{state:()=>({is_logged_in:!1,user:null,user_icon_url:null}),getters:{user_niconico_icon_url(){if(null===this.user||null===this.user.niconico_user_id)return null;const t=this.user.niconico_user_id.toString().slice(0,4);return`https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/${t}/${this.user.niconico_user_id}.jpg`}},actions:{async register(t,e){const s=await F.createUser({username:t,password:e});return null===s?(console.log("Register failed."),!1):(await this.login(t,e,!0),console.log("Register successful."),N.success("アカウントを作成しました。"),!0)},async login(t,e,s=!1){const i=await F.createUserAccessToken(t,e);return null===i?(console.log("Login failed."),this.logout(!0),!1):(console.log("Login successful."),pt.saveAccessToken(i.access_token),this.is_logged_in=!0,await this.fetchUser(!0),!1===s&&N.success("ログインしました。"),!0)},logout(t=!1){const e=st();e.settings.sync_settings=!1,pt.deleteAccessToken(),this.is_logged_in=!1,this.user=null,this.user_icon_url="",!1===t&&N.success("ログアウトしました。")},async fetchUser(t=!1){if(null===pt.getAccessToken())return null;if(null!==this.user&&!1===t)return this.user;const e=await F.fetchUser();if(null===e)return null===pt.getAccessToken()&&this.logout(!0),null;this.is_logged_in=!0,this.user=e;const s=await F.fetchUserIcon();return null===s?null:(this.user_icon_url=s,this.user)},async updateUser(t){await F.updateUser(t),await this.fetchUser(!0),void 0!==t.username?N.show("ユーザー名を更新しました。"):void 0!==t.password&&N.show("パスワードを更新しました。")},async updateUserIcon(t){await F.updateUserIcon(t),await this.fetchUser(!0),N.show("アイコン画像を更新しました。")},async deleteUser(){await F.deleteUser(),this.logout(!0),N.show("アカウントを削除しました。")}}});var R=V;class U{static async request(t){const e=await H.request(t).catch((t=>t));return e instanceof L.d7?(console.error(e),e.response?{status:e.response.status,data:null,error:new Error(e.response.data.detail),is_error:!0}:{status:NaN,data:null,error:e,is_error:!0}):{status:e.status,data:e.data,error:null,is_success:!0}}static async get(t,e){const s={url:t,method:"GET",...e};return await U.request(s)}static async post(t,e,s){const i={url:t,method:"POST",data:e,...s};return await U.request(i)}static async put(t,e,s){const i={url:t,method:"PUT",data:e,...s};return await U.request(i)}static async delete(t,e){const s={url:t,method:"DELETE",...e};return await U.request(s)}static showGenericError(t,e){const s=R();switch(t.error.message){case"Not authenticated":return s.logout(!0),void N.error(`${e}\nログインし直してください。`);case"Access token data is invalid":return s.logout(!0),void N.error(`${e}\nログインセッションが不正です。もう一度ログインし直してください。`);case"Access token is invalid":return s.logout(!0),void N.error(`${e}\nログインセッションの有効期限が切れています。もう一度ログインし直してください。`);case"User associated with access token does not exist":return s.logout(!0),void N.error(`${e}\nログインセッションに紐づくユーザーが存在しないか、削除されています。`);default:return void(t.error.message?Number.isNaN(t.status)?N.error(`${e}(${t.error.message})`):N.error(`${e}(HTTP Error ${t.status} / ${t.error.message})`):N.error(`${e}(HTTP Error ${t.status})`))}}}var G=U;class q{static async fetchClientSettings(){const t=await G.get("/settings/client");return"is_error"in t?null:t.data}static async updateClientSettings(t){await G.put("/settings/client",t)}}var W=q;const Y=["pinned_channel_ids","saved_twitter_hashtags","panel_display_state","tv_panel_active_tab","tv_channel_selection_requires_alt_key","caption_font","always_border_caption_text","specify_caption_opacity","caption_opacity","tv_show_superimpose","capture_save_mode","capture_caption_mode","comment_speed_rate","comment_font_size","close_comment_form_after_sending","muted_comment_keywords","muted_niconico_user_ids","mute_vulgar_comments","mute_abusive_discriminatory_prejudiced_comments","mute_big_size_comments","mute_fixed_comments","mute_colored_comments","mute_consecutive_same_characters_comments","fold_panel_after_sending_tweet","reset_hashtag_when_program_switches","auto_add_watching_channel_hashtag","twitter_active_tab","tweet_hashtag_position","tweet_capture_watermark_position"],X={pinned_channel_ids:[],showed_panel_last_time:!0,selected_twitter_account_id:null,saved_twitter_hashtags:[],tv_streaming_quality:"1080p",tv_data_saver_mode:!1,tv_low_latency_mode:!0,panel_display_state:"RestorePreviousState",tv_panel_active_tab:"Program",tv_channel_selection_requires_alt_key:!1,caption_font:"Windows TV MaruGothic",always_border_caption_text:!0,specify_caption_opacity:!1,caption_opacity:.5,tv_show_superimpose:!0,tv_show_data_broadcasting:!0,capture_copy_to_clipboard:!1,capture_save_mode:"UploadServer",capture_caption_mode:"Both",sync_settings:!1,comment_speed_rate:1,comment_font_size:34,close_comment_form_after_sending:!0,muted_comment_keywords:[],muted_niconico_user_ids:[],mute_vulgar_comments:!0,mute_abusive_discriminatory_prejudiced_comments:!0,mute_big_size_comments:!0,mute_fixed_comments:!1,mute_colored_comments:!1,mute_consecutive_same_characters_comments:!1,fold_panel_after_sending_tweet:!1,reset_hashtag_when_program_switches:!0,auto_add_watching_channel_hashtag:!0,twitter_active_tab:"Capture",tweet_hashtag_position:"Append",tweet_capture_watermark_position:"None"};function J(){const t=localStorage.getItem("KonomiTV-Settings");return null!==t?JSON.parse(t):(Q(X),X)}function Q(t){localStorage.setItem("KonomiTV-Settings",JSON.stringify(t))}function tt(t){const e={};for(const s of Object.keys(X))e[s]=s in t?t[s]:X[s];return e}const et=(0,a.Q_)("settings",{state:()=>{const t=J(),e=tt(t);return Q(e),{settings:e}},actions:{async importClientSettings(t){const e=await t.text();let s={};try{s=JSON.parse(e)}catch(a){return!1}const i=tt(s);return Q(i),this.settings=i,await this.syncClientSettingsToServer(),!0},async resetClientSettings(){const t={...X,sync_settings:this.settings.sync_settings};Q(t),this.settings=t,await this.syncClientSettingsToServer()},getSyncableClientSettings(){const t={};for(const e of Y)e in this.settings?t[e]=this.settings[e]:t[e]=X[e];return t},async syncClientSettingsFromServer(t=!1){if(null===pt.getAccessToken()||!1===this.settings.sync_settings&&!1===t)return;const e=await W.fetchClientSettings();if(null!==e)for(const[s,i]of Object.entries(e))this.settings[s]=i},async syncClientSettingsToServer(t=!1){if(null===pt.getAccessToken()||!1===this.settings.sync_settings&&!1===t)return;const e=this.getSyncableClientSettings();await W.updateClientSettings(e)}}});var st=et;class it{static getCommentColor(t){return this.color_table[t]||null}static getCommentPosition(t){switch(t){case"ue":return"top";case"naka":return"right";case"shita":return"bottom";default:return null}}static getCommentSize(t){switch(t){case"big":case"medium":case"small":return t;default:return null}}static parseCommentCommand(t){let e="#FFEAEA",s="right",i="medium";if(void 0!==t&&null!==t){const a=t.replace("184","").split(" ");for(const t of a){const a=it.getCommentColor(t),n=it.getCommentPosition(t),r=it.getCommentSize(t);null!==a&&(e=a),null!==n&&(s=n),null!==r&&(i=r)}}return{color:e,position:s,size:i}}static isMutedComment(t,e,s,i,a){const n=st();if(n.settings.muted_niconico_user_ids.includes(e))return!0;if(it.special_command_comments_pattern.test(t))return!0;if(!0===n.settings.mute_fixed_comments&&("top"===i||"bottom"===i))return console.log("[CommentUtils] Muted comment (fixed_comments): "+t),!0;if(!0===n.settings.mute_colored_comments&&"#FFEAEA"!==s)return console.log("[CommentUtils] Muted comment (colored_comments): "+t),!0;if(!0===n.settings.mute_big_size_comments&&"big"===a)return console.log("[CommentUtils] Muted comment (big_size_comments): "+t),!0;if(!0===n.settings.mute_vulgar_comments&&it.mute_vulgar_comments_pattern.test(t))return console.log("[CommentUtils] Muted comment (vulgar_comments): "+t),!0;if(!0===n.settings.mute_abusive_discriminatory_prejudiced_comments&&it.mute_abusive_discriminatory_prejudiced_comments_pattern.test(t))return console.log("[CommentUtils] Muted comment (abusive_discriminatory_prejudiced_comments): "+t),!0;if(!0===n.settings.mute_consecutive_same_characters_comments&&it.mute_consecutive_same_characters_comments_pattern.test(t))return console.log("[CommentUtils] Muted comment (consecutive_same_characters_comments): "+t),!0;for(const r of n.settings.muted_comment_keywords)if(""!==r.pattern)switch(r.match){case"partial":if(t.includes(r.pattern))return console.log("[CommentUtils] Muted comment (partial): "+t),!0;break;case"forward":if(t.startsWith(r.pattern))return console.log("[CommentUtils] Muted comment (forward): "+t),!0;break;case"backward":if(t.endsWith(r.pattern))return console.log("[CommentUtils] Muted comment (backward): "+t),!0;break;case"exact":if(t===r.pattern)return console.log("[CommentUtils] Muted comment (exact): "+t),!0;break;case"regex":if(new RegExp(r.pattern).test(t))return console.log("[CommentUtils] Muted comment (regex): "+t),!0;break}return!!it.annoying_statistical_comments_pattern.test(t)}static addMutedKeywords(t){const e=st();for(const s of e.settings.muted_comment_keywords)if("exact"===s.match&&s.pattern===t)return;e.settings.muted_comment_keywords.push({match:"exact",pattern:t})}static addMutedNiconicoUserIDs(t){const e=st();e.settings.muted_niconico_user_ids.includes(t)||e.settings.muted_niconico_user_ids.push(t)}}it.mute_vulgar_comments_pattern=new RegExp(D.Buffer.from("XChpXCl8XChVXCl8cHJwcnzvvZDvvZLvvZDvvZJ8U0VYfFPjgIdYfFPil69YfFPil4tYfFPil49YfO+8s++8pe+8uHzvvLPjgIfvvLh877yz4pev77y4fO+8s+KXi++8uHzvvLPil4/vvLh844Ki44OA44Or44OIfOOCouODiuOCpXzjgqLjg4rjg6t844Kk44Kr6IetfOOCpOOBj3zjgYbjgpPjgZN844Km44Oz44KzfOOBhuOCk+OBoXzjgqbjg7Pjg4F844Ko44Kt44ObfOOBiOOBoeOBiOOBoXzjgYjjgaPjgaF844Ko44OD44OBfOOBiOOBo+OCjXzjgqjjg4Pjg61844GI44KNfOOCqOODrXzlt6Xlj6N844GK44GV44KP44KK44G+44KTfOOBiuOBl+OBo+OBk3zjgqrjgrfjg4PjgrN844Kq44OD44K144OzfOOBiuOBo+OBseOBhHzjgqrjg4Pjg5HjgqR844Kq44OK44OL44O8fOOBiuOBquOBu3zjgqrjg4rjg5t844GK44Gx44GEfOOCquODkeOCpHzjgYpwfOOBiu+9kHzjgqrjg5Xjg5HjgrN844Ks44Kk44K444OzfOOCreODs+OCv+ODnnzjgY/jgbHjgYJ844GP44Gx44GBfOOCr+ODquODiOODquOCuXzjgq/jg7Pjg4t844GU44GP44GU44GP44GU44GP44GU44GPfOOCs+ODs+ODieODvOODoHzjgZHjgaTjgYLjgap844Kx44OE44Ki44OKfOOCtuODvOODoeODs3zjgrfjgrN844GX44GT44GX44GTfOOCt+OCs+OCt+OCs3zjgZnjgZHjgZnjgZF844Gb44GE44GI44GNfOOBm+OBhOOCinzjgZvjg7zjgop844GZ44GF44GF44GF44GF44GFfOOBmeOBhuOBhuOBhuOBhuOBhnzjgrvjgq/jg63jgrl844K744OD44Kv44K5fOOCu+ODleODrHzjgaHjgaPjgbHjgYR844Gh44Gj44OR44KkfOODgeODg+ODkeOCpHzjgaHjgpPjgZN844Gh44CH44GTfOOBoeKXr+OBk3zjgaHil4vjgZN844Gh4peP44GTfOODgeODs+OCs3zjg4HjgIfjgrN844OB4pev44KzfOODgeKXi+OCs3zjg4Hil4/jgrN844Gh44KT44G9fOOBoeOAh+OBvXzjgaHil6/jgb1844Gh4peL44G9fOOBoeKXj+OBvXzjg4Hjg7Pjg51844OB44CH44OdfOODgeKXr+ODnXzjg4Hil4vjg51844OB4peP44OdfOOBoeOCk+OBoeOCk3zjg4Hjg7Pjg4Hjg7N844Gm44GD44KT44Gm44GD44KTfOODhuOCo+ODs+ODhuOCo+ODs3zjg4bjgqPjg7Pjg51844OH44Kr44GEfOODh+ODquODmOODq3zjgarjgYvjgaDjgZd844Gq44GL44CH44GXfOOBquOBi+KXr+OBl3zjgarjgYvil4vjgZd844Gq44GL4peP44GXfOiEseOBknzjg4zjgYR844OM44GLfOODjOOCq3zjg4zjgY1844OM44KtfOODjOOBj3zjg4zjgq9844OM44GRfOODjOOCsXzjg4zjgZN844OM44KzfOOBseOBhOOCguOBv3zjg5Hjg5HmtLt844G144GG44O7fOOBteOBhuKApnzjgbXjgYV8776M772pfOOBteOBj+OCieOBv3zjgbXjgY/jgonjgpPjgad844G644Gj44GffOOBuuOCjeOBuuOCjXzjg5rjg63jg5rjg618776N776f776b776N776f776bfOODleOCp+ODqXzjgbvjgYbjgZHjgYR844G844Gj44GNfOODneODq+ODjnzjgbzjgo3jgpN844Oc44Ot44OzfO++ju++nu++m+++nXzjgb3jgo3jgop844Od44Ot44OqfO++ju++n+++m+++mHzjg57jg7PjgY3jgaR844Oe44Oz44Kt44OEfOOBvuOCk+OBk3zjgb7jgIfjgZN844G+4pev44GTfOOBvuKXi+OBk3zjgb7il4/jgZN844Oe44Oz44KzfOODnuOAh+OCs3zjg57il6/jgrN844Oe4peL44KzfOODnuKXj+OCs3zjgb7jgpPjgZXjgpN844KC44Gj44GT44KKfOODouODg+OCs+ODqnzjgoLjgb/jgoLjgb9844Oi44Of44Oi44OffOODpOOBo+OBn3zjg6TjgaPjgaZ844Ok44KJfOOChOOCieOBm+OCjXzjg6Tjgop844Ok44KLfOODpOOCjHzjg6Tjgo1844Op44OW44ObfOODr+ODrOODoXzmhJvmtrJ85ZaYfOmZsOaguHzpmbDojI586Zmw5ZSHfOa3q+WkonzpmqDmr5t86Zmw5q+bfOeUo+OCgeOCi3zlpbPjga7lrZDjga7ml6V85rGa44Gj44GV44KTfOWnpnzpqI7kuZfkvY185beo5qC5fOW3qOODgeODs3zlt6jnj4186YeR546JfOaciOe1jHzlvozog4zkvY185a2Q56iufOWtkOS9nOOCinzlsITnsr585L+h6ICFfOeyvua2snzpgI/jgZF85oCn5LqkfOeyvuWtkHzmraPluLjkvY185oCn5b60fOaAp+eahHznlJ/nkIZ85a+45q2i44KBfOe0oOadkHzmirHjgYR85oqx44GLfOaKseOBjXzmirHjgY985oqx44GRfOaKseOBk3zkvZPmtrJ85Lmz6aaWfOaBpeWeonznj43mo5J85Lit44Gg44GXfOS4reWHuuOBl3zlsL985oqc44GEfOaKnOOBkeOBquOBhHzmipzjgZHjgot85oqc44GR44KMfOeKr+ePjXzohqjjgol85YyF6IyOfOWLg+i1t3zmkannvoV86a2U576FfOaPieOBvnzmj4njgb985o+J44KAfOaPieOCgXzmvKvmuZZ844CH772efOKXr++9nnzil4vvvZ584peP772efOOAh+ODg+OCr+OCuXzil6/jg4Pjgq/jgrl84peL44OD44Kv44K5fOKXj+ODg+OCr+OCuQ==","base64").toString()),it.mute_abusive_discriminatory_prejudiced_comments_pattern=new RegExp(D.Buffer.from("44CCfOOCouODi+ODl+ODrOOBj+OCk3zjgqLjg4vjg5fjg6zlkJt844Ki44K544OafOOCpOOCq+OCjHzjgYTjgb7jgYTjgaF844Kk44Oe44Kk44OBfOOCpOODqeOBpOOBj3zjgqbjgrh844Km44O844OofOOCpuODqHzjgqbjg6jjgq9844Km44OyfOOBjeOCguOBhHzjgq3jg6LjgqR844Kt44Oi44GEfOOCrS/jg6Av44OBfOOCrOOCpOOCuHzvvbbvvp7vvbLvvbzvvp5844Ks44KtfOOCq+OCuXzjgq3jg4Pjgrp844GN44Gh44GM44GEfOOCreODgeOCrOOCpHzjgq3jg6Djg4F844K344OKfOOCueODhuODnnzjgaTjgb7jgonjgap844Gk44G+44KJ44KTfOODgeODp+ODg+ODkeODqnzjg4Hjg6fjg7N85Y2D44On44OzfOOBpOOCk+OBvHzjg4Tjg7Pjg5x844ON44OI44Km44OofOOBq+OBoOOBguOBgnzjg4vjg4B85LqM44OAfO++hu++gO++nnzjg5Hjg7zjg6h844OR44OofOODkeODqOOCr3zjgbbjgaPjgZV844OW44OD44K1fOOBtuOBleOBhHzjg5bjgrXjgqR844G+44Gs44GRfOODoeOCr+ODqXzjg5Djgqt844Og44Kr44Gk44GPfOiNkuOCieOBl3zpurvnlJ/jgrvjg6Hjg7Pjg4h85oWw5a6J5ammfOWus+WFkHzlpJblrZd85aem5Zu9fOmfk+WbvXzpn5PkuK186Z+T5pelfOWfuuWcsOWklnzmsJfni4LjgYR85rCX6YGV44GEfOWIh+OBo+OBn3zliIfjgaPjgaZ85rCX5oyB44Gh5oKqfOWbveS6pOaWree1tnzmrrp86aCDfOmgg+OBl3zpoIPjgZl86aCD44GbfOWcqOaXpXzlj4LmlL/mqKl85q2744GtfOawj+OBrXzvvoDvvot85q255YyVfOatueODknzlpLHpgJ986Zqc5a6zfOaWreS6pHzkuK3pn5N85pyd6a6ufOW+tOeUqOW3pXzlo7p85aO3fOWjvHzml6Xpn5N85pel5bidfOeymOedgHzlj43ml6V86aas6bm/fOeZuueLgnznmbrpgZR85py0fOWjsuWbvXzkuI3lv6t85L215ZCIfOmWk+aKnOOBkXzmloflj6V86Z2W5Zu9","base64").toString()),it.mute_consecutive_same_characters_comments_pattern=/(.)\1{7,}/,it.special_command_comments_pattern=/\/[a-z]+ /,it.annoying_statistical_comments_pattern=/最高\d+米\/|計\d+ID|総\d+米/,it.color_table={white:"#FFEAEA",red:"#F02840",pink:"#FD7E80",orange:"#FDA708",yellow:"#FFE133",green:"#64DD17",cyan:"#00D4F5",blue:"#4763FF",purple:"#D500F9",black:"#1E1310",white2:"#CCCC99",niconicowhite:"#CCCC99",red2:"#CC0033",truered:"#CC0033",pink2:"#FF33CC",orange2:"#FF6600",passionorange:"#FF6600",yellow2:"#999900",madyellow:"#999900",green2:"#00CC66",elementalgreen:"#00CC66",cyan2:"#00CCCC",blue2:"#3399FF",marineblue:"#3399FF",purple2:"#6633CC",nobleviolet:"#6633CC",black2:"#666666"};class at{static generatePlayerBackgroundURL(){const t=50,e=Math.floor(Math.random()*t)+1;return`/assets/images/player-backgrounds/${e.toString().padStart(2,"0")}.jpg`}static isHEVCVideoSupported(){return"probably"===document.createElement("video").canPlayType('video/mp4; codecs="hvc1.1.6.L123.B0"')}static extractAPIQualityFromDPlayer(t){if(null===t.quality)return null;const e=/streams\/live\/[a-z0-9]*\/(.*)\/(mpegts|ll-hls)/,s=t.quality.url.match(e);return s?s[1]:null}}var nt=s(27484),rt=s.n(nt),ot=(s(76831),s(66607)),lt=s.n(ot),ct=s(79212),_t=s.n(ct),dt=s(37412),ut=s.n(dt);rt().extend(lt()),rt().extend(_t()),rt().extend(ut());class mt{static convertTimestampToISO8601(t){rt().locale("ja");const e=rt()(t).toISOString();return e}static decorateProgramInfo(t,e){if(null!==t&&null!==t[e]){const s=pt.escapeHTML(t[e]),i="新|終|再|交|映|手|声|多|副|字|文|CC|OP|二|S|B|SS|無|無料C|S1|S2|S3|MV|双|デ|D|N|W|P|H|HV|SD|天|解|料|前|後初|生|販|吹|PPV|演|移|他|収|・|英|韓|中|字/日|字/日英|3D|2K|4K|8K|5.1|7.1|22.2|60P|120P|d|HC|HDR|SHV|UHD|VOD|配|初",a=new RegExp("\\((二|字|再)\\)","g"),n=new RegExp(`\\[(${i})\\]`,"g");return s.replace(a,'$1').replace(n,'$1')}{const t=rt()(),s=rt()().hour(0).minute(0).second(0),i=rt()().hour(6).minute(59).second(59),a=rt()().hour(23).minute(0).second(0),n=rt()().hour(23).minute(59).second(59);return t.isSameOrAfter(s)&&t.isSameOrBefore(i)||t.isSameOrAfter(a)&&t.isSameOrBefore(n)?"title"===e?"放送休止":"この時間は放送を休止しています。":"title"===e?"番組情報がありません":"この時間の番組情報を取得できませんでした。"}}static getProgramProgress(t){if(null!==t){const e=rt()(rt()()).diff(t.start_time,"second");return e/t.duration*100}return 0}static getProgramTime(t,e=!1){if(null!==t&&"2000-01-01T00:00:00+09:00"!==t.start_time){rt().locale("ja");const s=rt()(t.start_time);if(t.duration<=0)return!0===e?`${s.format("HH:mm")} ~ --:--`:`${s.format("YYYY/MM/DD (dd) HH:mm")} ~ --:-- (放送時間未定)`;const i=rt()(t.end_time),a=t.duration/60;return!0===e?`${s.format("HH:mm")} ~ ${i.format("HH:mm")}`:`${s.format("YYYY/MM/DD (dd) HH:mm")} ~ ${i.format("HH:mm")} (${a}分)`}return!0===e?"--:-- ~ --:--":"----/--/-- (-) --:-- ~ --:-- (--分)"}static formatString(t){null===mt.format_string_translation_map&&(mt.format_string_translation_map=mt.getFormatStringTranslationTable());for(const e in mt.format_string_translation_map)t=t.replaceAll(e,mt.format_string_translation_map[e]);return t}static getFormatStringTranslationTable(){const t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",s={};for(let r=0;r[\\]^_`{|} ";for(let r=0;r({server_version_info:null,last_updated_at:0}),getters:{client_version(){return pt.version},server_version(){return this.server_version_info?.version??null},latest_version(){return this.server_version_info?.latest_version??null},is_client_develop_version(){return this.client_version.includes("-dev")},is_server_develop_version(){return this.server_version?.includes("-dev")??!1},is_update_available(){return null!==this.server_version&&null!==this.latest_version&&(!1===this.is_server_develop_version&&this.server_version!==this.latest_version||!0===this.is_server_develop_version&&this.server_version.replace("-dev","")===this.latest_version)},is_version_mismatch(){return null!==this.server_version&&this.client_version!==this.server_version}},actions:{async fetchServerVersion(t=!1){if(null!==this.server_version_info&&!1===t)return pt.time()-this.last_updated_at>60&&this.fetchServerVersion(!0),this.server_version_info;const e=await Et.fetchServerVersion();return null===e?null:(this.server_version_info=e,this.last_updated_at=pt.time(),this.server_version_info)}}});var Ht=Kt,Mt=o["default"].extend({name:"Navigation",components:{BottomNavigation:Lt},computed:{...(0,a.Kc)(Ht)},async created(){await this.versionStore.fetchServerVersion()}}),Ft=Mt,Vt=(0,p.Z)(Ft,Zt,Bt,!1,null,"5b40940b",null),Rt=Vt.exports,Ut=o["default"].extend({name:"Login",components:{Header:jt,Navigation:Rt},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),username:"",password:"",password_showing:!1}},computed:{...(0,a.Kc)(R)},async created(){await this.userStore.fetchUser(),this.userStore.is_logged_in&&await this.$router.replace({path:"/settings/account"})},methods:{async login(){if(""===this.username||""===this.password)return void this.$message.error("ユーザー名またはパスワードが空です。");const t=await this.userStore.login(this.username,this.password);!1!==t&&await this.$router.replace({path:"/settings/account"})}}}),Gt=Ut,qt=(0,p.Z)(Gt,bt,Ct,!1,null,"851c3dec",null),Wt=qt.exports,Yt=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),t._m(0)],1)],1)},Xt=[function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"d-flex justify-center align-center w-100"},[e("div",{staticClass:"d-flex justify-center align-center flex-column"},[e("h1",[t._v("Not Found, or Under Development...")]),e("span",{staticClass:"mt-4 text--text text--darken-1"},[t._v("お探しのページは存在しないか、鋭意開発中です。")])])])}],Jt=o["default"].extend({name:"NotFound",components:{Header:jt,Navigation:Rt}}),Qt=Jt,te=(0,p.Z)(Qt,Yt,Xt,!1,null,"1310cfee",null),ee=te.exports,se=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e("div",{staticClass:"register-container-wrapper d-flex align-center w-100 mb-13"},[e(ht.Z,{staticClass:"register-container px-10 pt-8 pb-11 mx-auto background lighten-1",attrs:{elevation:"10",width:"100%","max-width":"450"}},[e(gt.EB,{staticClass:"register__logo flex-column justify-center"},[e(wt.Z,{attrs:{"max-width":"250",src:"/assets/images/logo.svg"}}),e("h4",{staticClass:"mt-10"},[t._v("アカウントを作成")])],1),e(vt.Z),e(ft.Z,{ref:"register",on:{submit:function(t){t.preventDefault()}}},[e(yt.Z,{staticClass:"mt-12",attrs:{outlined:"",placeholder:"ユーザー名",autofocus:"",dense:t.is_form_dense,rules:[t.username_validation]},model:{value:t.username,callback:function(e){t.username=e},expression:"username"}}),e(yt.Z,{staticStyle:{"margin-top":"2px"},attrs:{outlined:"",placeholder:"パスワード",dense:t.is_form_dense,type:t.password_showing?"text":"password","append-icon":t.password_showing?"mdi-eye":"mdi-eye-off",rules:[t.password_validation]},on:{"click:append":function(e){t.password_showing=!t.password_showing}},model:{value:t.password,callback:function(e){t.password=e},expression:"password"}}),e(I.Z,{staticClass:"register-button mt-5",attrs:{color:"secondary",depressed:"",width:"100%",height:"56"},on:{click:function(e){return t.register()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:person-add-20-filled",height:"24"}}),t._v("アカウントを作成 ")],1)],1)],1)],1)],1)],1)},ie=[],ae=o["default"].extend({name:"Register",components:{Header:jt,Navigation:Rt},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),username:null,username_validation:t=>""===t||null===t?"ユーザー名を入力してください。":!1!==/^.{2,}$/.test(t)||"ユーザー名は2文字以上で入力してください。",password:null,password_showing:!0,password_validation:t=>""===t||null===t?"パスワードを入力してください。":!1!==/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(t)||"パスワードは4文字以上の半角英数記号を入力してください。"}},computed:{...(0,a.Kc)(R)},async created(){await this.userStore.fetchUser(),this.userStore.is_logged_in&&await this.$router.replace({path:"/settings/account"})},methods:{async register(){if(!1===this.$refs.register.validate())return;if(null===this.username||null===this.password)return;const t=await this.userStore.register(this.username,this.password);!1!==t&&await this.$router.replace({path:"/settings/account"})}}}),ne=ae,re=(0,p.Z)(ne,se,ie,!1,null,"6533f3d0",null),oe=re.exports,le=s(93749),ce=s(2780),_e=s(76827),de=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:person-20-filled",width:"25px"}}),e("span",{staticClass:"ml-2"},[t._v("アカウント")])],1),e("div",{staticClass:"settings__content",class:{"settings__content--loading":t.is_loading}},[null===t.userStore.user?e("div",{staticClass:"account"},[e("div",{staticClass:"account-wrapper"},[e("img",{staticClass:"account__icon",attrs:{src:"/assets/images/account-icon-default.png"}}),e("div",{staticClass:"account__info"},[e("div",{staticClass:"account__info-name"},[e("span",{staticClass:"account__info-name-text"},[t._v("ログインしていません")])]),e("span",{staticClass:"account__info-id"},[t._v("Not logged in")])])]),e(I.Z,{staticClass:"account__login ml-auto",attrs:{color:"secondary",width:"140",height:"56",depressed:"",to:"/login/"}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fa:sign-in"}}),t._v("ログイン ")],1)],1):t._e(),null!==t.userStore.user?e("div",{staticClass:"account"},[e("div",{staticClass:"account-wrapper"},[e("img",{staticClass:"account__icon",attrs:{src:t.userStore.user_icon_url??""}}),e("div",{staticClass:"account__info"},[e("div",{staticClass:"account__info-name"},[e("span",{staticClass:"account__info-name-text"},[t._v(t._s(t.userStore.user.name))]),t.userStore.user.is_admin?e("span",{staticClass:"account__info-admin"},[t._v("管理者")]):t._e()]),e("span",{staticClass:"account__info-id"},[t._v("User ID: "+t._s(t.userStore.user.id))])])]),e(I.Z,{staticClass:"account__login ml-auto",attrs:{color:"secondary",width:"140",height:"56",depressed:""},on:{click:function(e){return t.userStore.logout()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fa:sign-out"}}),t._v("ログアウト ")],1)],1):t._e(),!1===t.userStore.is_logged_in?e("div",{staticClass:"account-register"},[e("div",{staticClass:"account-register__heading"},[t._v(" KonomiTV アカウントにログインすると、"),e("br"),t._v("より便利な機能が使えます! ")]),e("div",{staticClass:"account-register__feature"},[e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"bi:chat-left-text-fill"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("ニコニコ実況にコメントする")]),e("span",{staticClass:"account-feature__info-text"},[t._v("テレビを見ながらニコニコ実況にコメントできます。別途、ニコニコアカウントとの連携が必要です。")])])],1),e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"fa-brands:twitter"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("Twitter 連携機能")]),e("span",{staticClass:"account-feature__info-text"},[t._v("テレビを見ながら Twitter にツイートしたり、検索したツイートをリアルタイムで表示できます。別途、Twitter アカウントとの連携が必要です。")])])],1),e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"fluent:arrow-sync-20-filled"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("設定をデバイス間で同期")]),e("span",{staticClass:"account-feature__info-text"},[t._v("ピン留めしたチャンネルなど、ブラウザに保存されている各種設定をブラウザやデバイスをまたいで同期できます。")])])],1),e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"fa-solid:sliders-h"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("サーバー設定をブラウザから変更")]),e("span",{staticClass:"account-feature__info-text"},[t._v("管理者権限があれば、サーバー設定をブラウザから変更できます。一番最初に作成されたアカウントには、自動で管理者権限が付与されます。")])])],1)]),e("div",{staticClass:"account-register__description"},[t._v(" KonomiTV アカウントの作成に必要なものは"),e("br",{staticClass:"smartphone-vertical-only"}),t._v("ユーザー名とパスワードだけです。"),e("br"),t._v(" アカウントはローカルに導入した"),e("br",{staticClass:"smartphone-vertical-only"}),t._v(" KonomiTV サーバーにのみ保存されます。"),e("br"),t._v(" 外部のサービスには保存されませんので、ご安心ください。"),e("br")]),e(I.Z,{staticClass:"account-register__button",attrs:{color:"secondary",width:"100%","max-width":"250",height:"50",depressed:"",to:"/register/"}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:person-add-20-filled",height:"24"}}),t._v("アカウントを作成 ")],1)],1):t._e(),!0===t.userStore.is_logged_in?e("div",[e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"sync_settings"}},[t._v("設定をデバイス間で同期する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"sync_settings"}},[t._v(" KonomiTV では、設定を同じアカウントでログインしているデバイス間で同期できます!"),e("br"),t._v(" 同期をオンにすると、同期をオンにしているすべてのデバイスで共通の設定が使えます。ピン留めチャンネルやハッシュタグリストなども同期されます。"),e("br"),t._v(" なお、デバイス固有の設定(画質設定など)は、同期後も各デバイスで個別に反映されます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"sync_settings",inset:"","hide-details":""},model:{value:t.sync_settings,callback:function(e){t.sync_settings=e},expression:"sync_settings"}})],1),e(le.Z,{attrs:{"max-width":"530"},model:{value:t.sync_settings_dialog,callback:function(e){t.sync_settings_dialog=e},expression:"sync_settings_dialog"}},[e(ht.Z,[e(gt.EB,{staticClass:"justify-center"},[t._v("設定データの競合")]),e(gt.ZB,[t._v(" このデバイスの設定と、サーバーに保存されている設定が競合しています。"),e("br"),t._v(" 一度上書きすると、元に戻すことはできません。慎重に選択してください。"),e("br")]),e("div",{staticClass:"d-flex flex-column px-4 pb-4 settings__conflict-dialog"},[e(I.Z,{staticClass:"settings__save-button error--text text--lighten-1",attrs:{depressed:""},on:{click:function(e){return t.overrideServerSettingsFromClient()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:document-arrow-up-16-filled",height:"22px"}}),t._v(" サーバーに保存されている設定を、"),e("br",{staticClass:"smartphone-vertical-only"}),t._v("このデバイスの設定で上書きする ")],1),e(I.Z,{staticClass:"settings__save-button error--text text--lighten-1 mt-3",attrs:{depressed:""},on:{click:function(e){return t.overrideClientSettingsFromServer()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:document-arrow-down-16-filled",height:"22px"}}),t._v(" このデバイスの設定を、"),e("br",{staticClass:"smartphone-vertical-only"}),t._v("サーバーに保存されている設定で上書きする ")],1),e(I.Z,{staticClass:"settings__save-button mt-3",attrs:{depressed:""},on:{click:function(e){t.sync_settings_dialog=!1}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:dismiss-16-filled",height:"22px"}}),t._v(" キャンセル ")],1)],1)],1)],1),e(ft.Z,{ref:"settings_username",staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e("div",{staticClass:"settings__item-heading"},[t._v("ユーザー名")]),e("div",{staticClass:"settings__item-label"},[t._v(" KonomiTV アカウントのユーザー名を設定します。アルファベットだけでなく日本語や記号も使えます。"),e("br"),t._v(" 同じ KonomiTV サーバー上の他のアカウントと同じユーザー名には変更できません。"),e("br")]),e(yt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",placeholder:"ユーザー名",dense:t.is_form_dense,rules:[t.settings_username_validation]},model:{value:t.settings_username,callback:function(e){t.settings_username=e},expression:"settings_username"}})],1),e(I.Z,{staticClass:"settings__save-button",attrs:{depressed:""},on:{click:function(e){return t.updateAccountInfo("username")}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:save-16-filled",height:"24px"}}),t._v("ユーザー名を更新 ")],1),e(ft.Z,{staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e("div",{staticClass:"settings__item-heading"},[t._v("アイコン画像")]),e("div",{staticClass:"settings__item-label"},[t._v(" KonomiTV アカウントのアイコン画像を設定します。"),e("br"),t._v(" アップロードされた画像は自動で 400×400 の正方形にリサイズされます。"),e("br")]),e(ce.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",placeholder:"アイコン画像を選択",dense:t.is_form_dense,accept:"image/jpeg, image/png","prepend-icon":"","prepend-inner-icon":"mdi-paperclip"},model:{value:t.settings_icon,callback:function(e){t.settings_icon=e},expression:"settings_icon"}})],1),e(I.Z,{staticClass:"settings__save-button mt-5",attrs:{depressed:""},on:{click:function(e){return t.updateAccountIcon()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:save-16-filled",height:"24px"}}),t._v("アイコン画像を更新 ")],1),e(ft.Z,{ref:"settings_password",staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e("div",{staticClass:"settings__item-heading"},[t._v("新しいパスワード")]),e("div",{staticClass:"settings__item-label"},[t._v(" KonomiTV アカウントの新しいパスワードを設定します。"),e("br")]),e(yt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",placeholder:"新しいパスワード",dense:t.is_form_dense,type:t.settings_password_showing?"text":"password","append-icon":t.settings_password_showing?"mdi-eye":"mdi-eye-off",rules:[t.settings_password_validation]},on:{"click:append":function(e){t.settings_password_showing=!t.settings_password_showing}},model:{value:t.settings_password,callback:function(e){t.settings_password=e},expression:"settings_password"}})],1),e(I.Z,{staticClass:"settings__save-button",attrs:{depressed:""},on:{click:function(e){return t.updateAccountInfo("password")}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:save-16-filled",height:"24px"}}),t._v("パスワードを更新 ")],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item mt-6"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("アカウントを削除")]),e("div",{staticClass:"settings__item-label"},[t._v(" 現在ログインしている KonomiTV アカウントを削除します。"),e("br"),e("b",[t._v("アカウントに紐づくすべてのデータが削除されます。")]),t._v("元に戻すことはできません。"),e("br")])]),e(le.Z,{attrs:{"max-width":"385"},scopedSlots:t._u([{key:"activator",fn:function({on:s}){return[e(I.Z,t._g({staticClass:"settings__save-button error mt-5",attrs:{depressed:""}},s),[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:delete-16-filled",height:"24px"}}),t._v("アカウントを削除 ")],1)]}}],null,!1,1849668703),model:{value:t.account_delete_confirm_dialog,callback:function(e){t.account_delete_confirm_dialog=e},expression:"account_delete_confirm_dialog"}},[e(ht.Z,[e(gt.EB,{staticClass:"justify-center pt-6 font-weight-bold"},[t._v("本当にアカウントを削除しますか?")]),e(gt.ZB,{staticClass:"pt-2 pb-0"},[t._v(" アカウントに紐づくすべてのデータが削除されます。元に戻すことはできません。"),e("br"),t._v(" 本当にアカウントを削除しますか? ")]),e(gt.h7,{staticClass:"pt-4 px-6 pb-5"},[e(kt.Z),e(I.Z,{attrs:{color:"text",text:""},on:{click:function(e){t.account_delete_confirm_dialog=!1}}},[t._v("キャンセル")]),e(I.Z,{attrs:{color:"error"},on:{click:function(e){return t.deleteAccount()}}},[t._v("削除")])],1)],1)],1)],1):t._e()])])},ue=[],me=s(37970),pe=s(81667),he=s(51419),ge=s(33560),ve=s(17316),fe=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e(ht.Z,{staticClass:"settings-container d-flex px-5 py-5 mx-auto background",attrs:{elevation:"0",width:"100%","max-width":"1000"}},[e("div",[e(ve.Z,{staticClass:"settings-navigation flex-shrink-0 background",attrs:{permanent:"",width:"195",height:"auto"}},[e(pe.Z,{staticClass:"px-4"},[e(he.km,[e("h1",[t._v("設定")])])],1),e(me.Z,{staticClass:"mt-3 px-0 py-0",attrs:{nav:""}},[e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/general"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 3px"},attrs:{icon:"fa-solid:sliders-h",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("全般")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/caption"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:subtitles-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("字幕")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/data-broadcasting"}},[e(ge.Z,{staticClass:"mr-4"},[e("svg",{attrs:{width:"26px",height:"26px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})])]),e(he.km,[e(he.V9,[t._v("データ放送")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/capture"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:image-multiple-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("キャプチャ")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/account"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:person-20-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("アカウント")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/jikkyo"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 2px"},attrs:{icon:"bi:chat-left-text-fill",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("ニコニコ実況")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/twitter"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 1px"},attrs:{icon:"fa-brands:twitter",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("Twitter")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/server"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:server-surface-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("サーバー設定")])],1)],1)],1)],1)],1),e(ht.Z,{staticClass:"settings ml-5 px-7 py-7 lighten-1",attrs:{width:"100%"}},[t._t("default")],2)],1)],1)],1)},we=[],ye=o["default"].extend({name:"Settings-Base",components:{Header:jt,Navigation:Rt}}),be=ye,Ce=(0,p.Z)(be,fe,we,!1,null,"7802007e",null),ke=Ce.exports,xe=o["default"].extend({name:"Settings-Account",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),is_loading:!0,settings_username:null,settings_username_validation:t=>""===t||null===t?"ユーザー名を入力してください。":!1!==/^.{2,}$/.test(t)||"ユーザー名は2文字以上で入力してください。",settings_password:null,settings_password_showing:!1,settings_password_validation:t=>""===t||null===t?"パスワードを入力してください。":!1!==/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(t)||"パスワードは4文字以上の半角英数記号を入力してください。",settings_icon:null,account_delete_confirm_dialog:!1,sync_settings:st().settings.sync_settings,sync_settings_dialog:!1}},computed:{...(0,a.Kc)(st,R)},async created(){await this.userStore.fetchUser(),this.is_loading=!1},watch:{async sync_settings(){if(!0===this.sync_settings&&!1===this.sync_settings_dialog){const t=this.settingsStore.getSyncableClientSettings(),e=JSON.stringify(t),s=await W.fetchClientSettings();if(null===s)return void this.$message.error("サーバーから設定データを取得できませんでした。");const i=JSON.stringify(s);e!==i?(this.sync_settings_dialog=!0,this.sync_settings=!1):this.settingsStore.settings.sync_settings=!0}else!1===this.sync_settings&&!1===this.sync_settings_dialog&&(this.settingsStore.settings.sync_settings=!1)}},methods:{async overrideServerSettingsFromClient(){await this.settingsStore.syncClientSettingsToServer(!0),this.settingsStore.settings.sync_settings=!0,this.sync_settings=!0,this.sync_settings_dialog=!1},async overrideClientSettingsFromServer(){await this.settingsStore.syncClientSettingsFromServer(!0),this.settingsStore.settings.sync_settings=!0,this.sync_settings=!0,this.sync_settings_dialog=!1},async updateAccountInfo(t){if("username"===t){if(!1===this.$refs.settings_username.validate())return}else if(!1===this.$refs.settings_password.validate())return;if("username"===t){if(null===this.settings_username)return;await this.userStore.updateUser({username:this.settings_username})}else{if(null===this.settings_password)return;await this.userStore.updateUser({password:this.settings_password})}},async updateAccountIcon(){null!==this.settings_icon?await this.userStore.updateUserIcon(this.settings_icon):this.$message.error("アップロードする画像を選択してください!")},async deleteAccount(){this.account_delete_confirm_dialog=!1,await this.userStore.deleteUser()}}}),Se=xe,Oe=(0,p.Z)(Se,de,ue,!1,null,"3ec6610e",null),Te=Oe.exports,Ie=s(17303),je=s(61013),Ze=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:subtitles-16-filled",width:"25px"}}),e("span",{staticClass:"ml-3"},[t._v("字幕")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item"},[e("label",{staticClass:"settings__item-heading"},[t._v("字幕のフォント")]),e("label",{staticClass:"settings__item-label"},[t._v(" プレイヤーで字幕表示をオンにしているときの、字幕のフォントを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.caption_font},model:{value:t.settingsStore.settings.caption_font,callback:function(e){t.$set(t.settingsStore.settings,"caption_font",e)},expression:"settingsStore.settings.caption_font"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"always_border_caption_text"}},[t._v("字幕の文字を常に縁取りする")]),e("label",{staticClass:"settings__item-label",attrs:{for:"always_border_caption_text"}},[t._v(" 字幕表示時、縁取りをオンにすると、字幕が見やすくきれいになります。とくに理由がなければ、オンにしておくのがおすすめです。"),e("br"),t._v(" この設定がオフのときも、字幕データ側で縁取りが指定されていれば、オンのときと同様に縁取り付きで描画されます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"always_border_caption_text",inset:"","hide-details":""},model:{value:t.settingsStore.settings.always_border_caption_text,callback:function(e){t.$set(t.settingsStore.settings,"always_border_caption_text",e)},expression:"settingsStore.settings.always_border_caption_text"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"specify_caption_opacity"}},[t._v("字幕の不透明度を指定する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"specify_caption_opacity"}},[t._v(" 字幕表示時、不透明度を自分で指定するか設定できます。"),e("br"),t._v(" この設定がオフのときは、字幕データ側で指定されている不透明度で描画します。とくに理由がなければ、オフにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"specify_caption_opacity",inset:"","hide-details":""},model:{value:t.settingsStore.settings.specify_caption_opacity,callback:function(e){t.$set(t.settingsStore.settings,"specify_caption_opacity",e)},expression:"settingsStore.settings.specify_caption_opacity"}})],1),e("div",{staticClass:"settings__item",class:{"settings__item--disabled":!1===t.settingsStore.settings.specify_caption_opacity}},[e("label",{staticClass:"settings__item-heading"},[t._v("字幕の不透明度")]),e("label",{staticClass:"settings__item-label"},[t._v(" 上の [字幕の不透明度を指定する] をオンに設定したときのみ有効です。不透明度を 0 に設定すれば、字幕の背景を非表示にできます。"),e("br")]),e("div",{ref:"caption_opacity",staticClass:"settings__item-label"},[e(je.Z,{staticClass:"settings__item-form",attrs:{ticks:"always","thumb-label":"","hide-details":"",min:0,max:1,step:.05,disabled:!1===t.settingsStore.settings.specify_caption_opacity},model:{value:t.settingsStore.settings.caption_opacity,callback:function(e){t.$set(t.settingsStore.settings,"caption_opacity",e)},expression:"settingsStore.settings.caption_opacity"}})],1)]),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_show_superimpose"}},[t._v("テレビをみるときに文字スーパーを表示する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_superimpose"}},[t._v(" 文字スーパーは、緊急地震速報の赤テロップや、NHK BS のニュース速報のテロップなどで利用されています。とくに理由がなければ、オンにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_show_superimpose",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_show_superimpose,callback:function(e){t.$set(t.settingsStore.settings,"tv_show_superimpose",e)},expression:"settingsStore.settings.tv_show_superimpose"}})],1)],1)])},Be=[],Pe=o["default"].extend({name:"Settings-Caption",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),caption_font:[{text:"Windows TV ゴシック",value:"Windows TV Gothic"},{text:"Windows TV 丸ゴシック",value:"Windows TV MaruGothic"},{text:"Windows TV 太丸ゴシック",value:"Windows TV FutoMaruGothic"},{text:"ヒラギノTV丸ゴ",value:"Hiragino TV Sans Rd S"},{text:"新丸ゴ ARIB",value:"TT-ShinMGo-regular"},{text:"Rounded M+ 1m for ARIB",value:"Rounded M+ 1m for ARIB"},{text:"Noto Sans JP",value:"Noto Sans JP Caption"},{text:"デフォルトのフォント",value:"sans-serif"}]}},computed:{...(0,a.Kc)(st)}}),$e=Pe,ze=(0,p.Z)($e,Ze,Be,!1,null,null,null),Ae=ze.exports,De=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:image-multiple-16-filled",width:"26px"}}),e("span",{staticClass:"ml-2"},[t._v("キャプチャ")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"capture_copy_to_clipboard"}},[t._v("キャプチャをクリップボードにコピーする")]),e("label",{staticClass:"settings__item-label",attrs:{for:"capture_copy_to_clipboard"}},[t._v(" この設定をオンにすると、撮ったキャプチャ画像がクリップボードにもコピーされます。"),e("br"),t._v(" クリップボードの履歴をサポートしていない OS では、この設定をオンにしてキャプチャを撮ると、以前のクリップボードが上書きされます。注意してください。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"capture_copy_to_clipboard",inset:"","hide-details":""},model:{value:t.settingsStore.settings.capture_copy_to_clipboard,callback:function(e){t.$set(t.settingsStore.settings,"capture_copy_to_clipboard",e)},expression:"settingsStore.settings.capture_copy_to_clipboard"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("キャプチャの保存先")]),e("div",{staticClass:"settings__item-label"},[e("p",[t._v(" キャプチャした画像をブラウザでダウンロードするか、KonomiTV サーバーにアップロードするかを設定します。"),e("br"),t._v(" ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方同時に行うこともできます。"),e("br")]),e("p",[t._v(" ブラウザでダウンロードすると、視聴中のデバイスのダウンロードフォルダに保存されます。"),e("br"),t._v(" 視聴中のデバイスにそのまま保存されるためシンプルですが、保存先のフォルダを変更できないこと、PC 版 Chrome では毎回ダウンロードバーが表示されてしまったり、iOS Safari (PWA モード) ではダウンロードするとファイル概要画面が表示され再生が中断してしまったりなど、視聴に支障することがデメリットです (将来的には、iOS / Android アプリ版や拡張機能などで解消される予定) 。"),e("br")]),e("p",[t._v(" KonomiTV サーバーにアップロードすると、サーバー設定で指定されたキャプチャ保存フォルダに保存されます。視聴したデバイスにかかわらず、今までに撮ったキャプチャをひとつのフォルダにまとめて保存できます。"),e("br"),t._v(" 他のデバイスでキャプチャを見るにはキャプチャ保存フォルダをネットワークに共有する必要があること、スマホ・タブレットではネットワーク上のフォルダへのアクセスがやや面倒なことがデメリットです。(将来的には、保存フォルダ内のキャプチャを Google フォトのように表示する機能を追加予定)"),e("br")])]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.capture_save_mode},model:{value:t.settingsStore.settings.capture_save_mode,callback:function(e){t.$set(t.settingsStore.settings,"capture_save_mode",e)},expression:"settingsStore.settings.capture_save_mode"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("字幕表示時のキャプチャの保存モード")]),e("div",{staticClass:"settings__item-label"},[t._v(" 字幕表示時、キャプチャした画像に字幕を合成するかを設定します。"),e("br"),t._v(" 映像のみのキャプチャと、字幕を合成したキャプチャを両方同時に保存することもできます。"),e("br"),t._v(" なお、字幕非表示時は、常に映像のみ (+コメント付きキャプチャではコメントを合成して) 保存されます。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.capture_caption_mode},model:{value:t.settingsStore.settings.capture_caption_mode,callback:function(e){t.$set(t.settingsStore.settings,"capture_caption_mode",e)},expression:"settingsStore.settings.capture_caption_mode"}})],1)])])},Le=[],Ne=o["default"].extend({name:"Settings-Capture",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),capture_save_mode:[{text:"ブラウザでダウンロード",value:"Browser"},{text:"KonomiTV サーバーにアップロード",value:"UploadServer"},{text:"ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方行う",value:"Both"}],capture_caption_mode:[{text:"映像のみのキャプチャを保存する",value:"VideoOnly"},{text:"字幕を合成したキャプチャを保存する",value:"CompositingCaption"},{text:"映像のみのキャプチャと、字幕を合成したキャプチャを両方保存する",value:"Both"}]}},computed:{...(0,a.Kc)(st)}}),Ee=Ne,Ke=(0,p.Z)(Ee,De,Le,!1,null,null,null),He=Ke.exports,Me=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("svg",{attrs:{width:"27px",height:"27px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})]),e("span",{staticClass:"ml-2"},[t._v("データ放送")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_show_data_broadcasting"}},[t._v("テレビをみるときにデータ放送を表示する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_data_broadcasting"}},[t._v(" この設定をオンにすると、テレビをみるときにデータ放送機能を利用できます。"),e("br"),t._v(" データ放送そのもののオン/オフは、視聴画面右側のパネルからリモコンを表示した上で、リモコンの d ボタンから切り替えられます。"),e("br")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_data_broadcasting"}},[t._v(" データ放送機能をオンにすると、負荷が高くなり視聴に支障が出ることがあります。データ放送を利用しない場合や、性能の低い Android デバイスではオフにすることをおすすめします。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_show_data_broadcasting",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_show_data_broadcasting,callback:function(e){t.$set(t.settingsStore.settings,"tv_show_data_broadcasting",e)},expression:"settingsStore.settings.tv_show_data_broadcasting"}})],1),e(vt.Z,{staticClass:"mt-6"}),e(ft.Z,{ref:"data_broadcasting_zip_code",staticClass:"settings__item settings__item--sync-disabled",on:{submit:function(t){t.preventDefault()}}},[e("label",{staticClass:"settings__item-heading"},[t._v("お住まいの郵便番号")]),e("label",{staticClass:"settings__item-label"},[t._v(" ここで設定した郵便番号をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。"),e("br"),t._v(" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。"),e("br")]),e(yt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",placeholder:"郵便番号",dense:t.is_form_dense,rules:[t.data_broadcasting_zip_code_validation]},model:{value:t.data_broadcasting_zip_code,callback:function(e){t.data_broadcasting_zip_code=e},expression:"data_broadcasting_zip_code"}})],1),e("div",{staticClass:"settings__item settings__item--sync-disabled mt-0"},[e("label",{staticClass:"settings__item-heading"},[t._v("お住まいの都道府県")]),e("label",{staticClass:"settings__item-label"},[t._v(" ここで設定した都道府県をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。"),e("br"),t._v(" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.data_broadcasting_prefectures},model:{value:t.data_broadcasting_prefecture,callback:function(e){t.data_broadcasting_prefecture=e},expression:"data_broadcasting_prefecture"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("データ放送の保存データをリセット")]),e("div",{staticClass:"settings__item-label"},[t._v(" このデバイス(ブラウザ)に保存されているデータ放送の保存データを、初期状態にリセット (消去) できます。"),e("br"),t._v(" 保存データには、データ放送内のミニゲームの得点データや、設定データなどが含まれます。"),e("br"),t._v(" 保存データをリセットすると、元に戻すことはできません。十分ご注意ください。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button error mt-5",attrs:{depressed:""},on:{click:function(e){return t.resetNVRAMSettings()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"material-symbols:device-reset-rounded",height:"23px"}}),t._v("保存データをリセット ")],1)],1)])},Fe=[];s(82801);const Ve="KonomiTV-BMLBrowser_nvram_prefix=receiverinfo%2F";var Re=o["default"].extend({name:"Settings-DataBroadcasting",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),data_broadcasting_zip_code:"",data_broadcasting_zip_code_validation:t=>""===t||(null!==t.match(/^[0-9]{3}-[0-9]{4}$/)||"郵便番号は「000-0000」の形式で入力してください。"),data_broadcasting_prefecture:"255-0b0",data_broadcasting_prefectures:[{text:"未設定",value:"255-0b0"},{text:"西北海道",value:"2-0b000101101011"},{text:"東北海道",value:"1-0b000101101011"},{text:"青森県",value:"3-0b010001100111"},{text:"岩手県",value:"4-0b010111010100"},{text:"宮城県",value:"5-0b011101011000"},{text:"秋田県",value:"6-0b101011000110"},{text:"山形県",value:"7-0b111001001100"},{text:"福島県",value:"8-0b000110101110"},{text:"茨城県",value:"9-0b110001101001"},{text:"栃木県",value:"10-0b111000111000"},{text:"群馬県",value:"11-0b100110001011"},{text:"埼玉県",value:"12-0b011001001011"},{text:"千葉県",value:"13-0b000111000111"},{text:"東京都 (島部を除く)",value:"14-0b101010101100"},{text:"東京都島部 (伊豆・小笠原諸島)",value:"49-0b101010101100"},{text:"神奈川県",value:"15-0b010101101100"},{text:"新潟県",value:"16-0b010011001110"},{text:"富山県",value:"17-0b010100111001"},{text:"石川県",value:"18-0b011010100110"},{text:"福井県",value:"19-0b100100101101"},{text:"山梨県",value:"20-0b110101001010"},{text:"長野県",value:"21-0b100111010010"},{text:"岐阜県",value:"22-0b101001100101"},{text:"静岡県",value:"23-0b101001011010"},{text:"愛知県",value:"24-0b100101100110"},{text:"三重県",value:"25-0b001011011100"},{text:"滋賀県",value:"26-0b110011100100"},{text:"京都府",value:"27-0b010110011010"},{text:"大阪府",value:"28-0b110010110010"},{text:"兵庫県",value:"29-0b011001110100"},{text:"奈良県",value:"30-0b101010010011"},{text:"和歌山県",value:"31-0b001110010110"},{text:"鳥取県",value:"32-0b110100100011"},{text:"島根県",value:"33-0b001100011011"},{text:"岡山県",value:"34-0b001010110101"},{text:"広島県",value:"35-0b101100110001"},{text:"山口県",value:"36-0b101110011000"},{text:"徳島県",value:"37-0b111001100010"},{text:"香川県",value:"38-0b100110110100"},{text:"愛媛県",value:"39-0b000110011101"},{text:"高知県",value:"40-0b001011100011"},{text:"福岡県",value:"41-0b011000101101"},{text:"佐賀県",value:"42-0b100101011001"},{text:"長崎県",value:"43-0b101000101011"},{text:"熊本県",value:"44-0b100010100111"},{text:"大分県",value:"45-0b110010001101"},{text:"宮崎県",value:"46-0b110100011100"},{text:"鹿児島県 (南西諸島を除く)",value:"47-0b110101000101"},{text:"鹿児島県島部 (南西諸島の鹿児島県域)",value:"50-0b110101000101"},{text:"沖縄県",value:"48-0b001101110010"}]}},computed:{...(0,a.Kc)(st)},created(){const t=localStorage.getItem(`${Ve}zipcode`);if(t)try{this.data_broadcasting_zip_code=window.atob(t),this.data_broadcasting_zip_code=this.data_broadcasting_zip_code.slice(0,3)+"-"+this.data_broadcasting_zip_code.slice(3)}catch(s){}const e=localStorage.getItem(`${Ve}prefecture`);if(e)try{const t=window.atob(e).charCodeAt(0);for(const e of this.data_broadcasting_prefectures)if(e.value.startsWith(`${t}-`)){this.data_broadcasting_prefecture=e.value;break}}catch(s){}},watch:{data_broadcasting_zip_code(t){if(!1!==this.$refs.data_broadcasting_zip_code.validate())if(""!==t){const e=window.btoa(t.replace("-",""));localStorage.setItem(`${Ve}zipcode`,e)}else localStorage.removeItem(`${Ve}zipcode`)},data_broadcasting_prefecture(t){if("255-0b0"!==t){const e=t.split("-0b"),s=parseInt(e[0]),i=window.btoa(String.fromCharCode(s));localStorage.setItem(`${Ve}prefecture`,i);const a=parseInt(e[1],2),n=window.btoa(String.fromCharCode(a>>8,255&a));localStorage.setItem(`${Ve}regioncode`,n)}else localStorage.removeItem(`${Ve}prefecture`),localStorage.removeItem(`${Ve}regioncode`)}},methods:{resetNVRAMSettings(){for(const t in localStorage)t.startsWith("KonomiTV-BMLBrowser_nvram_")&&localStorage.removeItem(t);this.data_broadcasting_zip_code="",this.data_broadcasting_prefecture="255-0b0",this.$message.success("データ放送の保存データをリセットしました。")}}}),Ue=Re,Ge=(0,p.Z)(Ue,Me,Fe,!1,null,null,null),qe=Ge.exports,We=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fa-solid:sliders-h",width:"19px"}}),e("span",{staticClass:"ml-3"},[t._v("全般")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item settings__item--sync-disabled"},[e("div",{staticClass:"settings__item-heading"},[t._v("テレビのデフォルトのストリーミング画質")]),e("div",{staticClass:"settings__item-label"},[t._v(" テレビをライブストリーミングするときのデフォルトの画質を設定します。"),e("br"),t._v(" ストリーミング画質はプレイヤーの設定からいつでも切り替えられます。"),e("br")]),e("div",{staticClass:"settings__item-label"},[t._v(" [1080p (60fps)] は、通常 30fps (60i) の映像を補間し、より滑らか(ぬるぬる)な映像で視聴できます!"),e("br"),t._v(" [1080p (60fps)] で視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出ることがあります。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tv_streaming_quality},model:{value:t.settingsStore.settings.tv_streaming_quality,callback:function(e){t.$set(t.settingsStore.settings,"tv_streaming_quality",e)},expression:"settingsStore.settings.tv_streaming_quality"}})],1),e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled",class:{"settings__item--disabled":!1===t.PlayerUtils.isHEVCVideoSupported()}},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_data_saver_mode"}},[t._v("テレビを通信節約モードで視聴する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_data_saver_mode"}},[t._v(" 通信節約モードでは、H.265 / HEVC という圧縮率の高いコーデックを使い、画質はほぼそのまま、通信量を通常の 1/2 程度に抑えながら視聴できます!"),e("br"),t._v(" 通信節約モードで視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出る可能性が高いです。"),e("br"),!1===t.PlayerUtils.isHEVCVideoSupported()&&!1===t.Utils.isFirefox()?e("p",{staticClass:"mt-1 mb-0 error--text lighten-1"},[t._v(" このデバイスでは通信節約モードがサポートされていません。 ")]):t._e(),!1===t.PlayerUtils.isHEVCVideoSupported()&&!0===t.Utils.isFirefox()?e("p",{staticClass:"mt-1 mb-0 error--text lighten-1"},[t._v(" お使いの Firefox ブラウザでは通信節約モードがサポートされていません。 ")]):t._e()]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_data_saver_mode",inset:"","hide-details":"",disabled:!1===t.PlayerUtils.isHEVCVideoSupported()},model:{value:t.settingsStore.settings.tv_data_saver_mode,callback:function(e){t.$set(t.settingsStore.settings,"tv_data_saver_mode",e)},expression:"settingsStore.settings.tv_data_saver_mode"}})],1),e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_low_latency_mode"}},[t._v("テレビを低遅延で視聴する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_low_latency_mode"}},[t._v(" 低遅延ストリーミングをオンにすると、"),e("b",[t._v("放送波との遅延を最短 0.9 秒に抑えて視聴できます!")]),e("br"),t._v(" また、約 3 秒以上遅延したときに少しだけ再生速度を早める (1.1x) ことで、滑らかにストリーミングの遅延を取り戻します。"),e("br"),t._v(" 宅外視聴などのネットワークが不安定になりがちな環境では、低遅延ストリーミングをオフにしてみると、映像のカクつきを改善できるかもしれません。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_low_latency_mode",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_low_latency_mode,callback:function(e){t.$set(t.settingsStore.settings,"tv_low_latency_mode",e)},expression:"settingsStore.settings.tv_low_latency_mode"}})],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("デフォルトのパネルの表示状態")]),e("div",{staticClass:"settings__item-label"},[t._v(" 視聴画面を開いたときに、右側のパネルをどう表示するかを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.panel_display_state},model:{value:t.settingsStore.settings.panel_display_state,callback:function(e){t.$set(t.settingsStore.settings,"panel_display_state",e)},expression:"settingsStore.settings.panel_display_state"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("テレビをみるときにデフォルトで表示されるパネルのタブ")]),e("div",{staticClass:"settings__item-label"},[t._v(" テレビの視聴画面を開いたときに、右側のパネルで最初に表示されるタブを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tv_panel_active_tab},model:{value:t.settingsStore.settings.tv_panel_active_tab,callback:function(e){t.$set(t.settingsStore.settings,"tv_panel_active_tab",e)},expression:"settingsStore.settings.tv_panel_active_tab"}})],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_show_superimpose"}},[t._v("チャンネル選局のキーボードショートカットを "+t._s(t.Utils.AltOrOption())+" + 数字キー/テンキーに変更する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_superimpose"}},[t._v(" この設定をオンにすると、数字キーまたはテンキーに対応するリモコン番号(1~12)のチャンネルに切り替える際、"+t._s(t.Utils.AltOrOption())+" キーを同時に押す必要があります。"),e("br"),t._v(" コメントやツイートを入力しようとして誤って数字キーを押してしまい、チャンネルが変わってしまう事態を避けたい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_show_superimpose",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_channel_selection_requires_alt_key,callback:function(e){t.$set(t.settingsStore.settings,"tv_channel_selection_requires_alt_key",e)},expression:"settingsStore.settings.tv_channel_selection_requires_alt_key"}})],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("設定をエクスポート")]),e("div",{staticClass:"settings__item-label"},[t._v(" このデバイス(ブラウザ)に保存されている設定データを、エクスポート(ダウンロード)できます。"),e("br"),t._v(" ダウンロードした設定データ (KonomiTV-Settings.json) は、[設定をインポート] からインポートできます。異なるサーバーの KonomiTV を同じ設定で使いたいときなどに使ってください。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button mt-4",attrs:{depressed:""},on:{click:function(e){return t.exportSettings()}}},[e("Icon",{staticClass:"mr-3",attrs:{icon:"fa6-solid:download",height:"19px"}}),t._v("設定をエクスポート ")],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("設定をインポート")]),e("div",{staticClass:"settings__item-label"},[t._v(" [設定をエクスポート] でダウンロードした設定データを、このデバイス(ブラウザ)にインポートできます。"),e("br"),t._v(" 設定をインポートすると、"),e("b",[t._v("現在のデバイス設定はすべて上書きされます。")]),t._v("元に戻すことはできません。"),e("br"),t._v(" 設定のデバイス間同期がオンのときは、"),e("b",[t._v("同期が有効なすべてのデバイスに反映されます。")]),t._v("十分ご注意ください。"),e("br")]),e(ce.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",placeholder:"設定データ (KonomiTV-Settings.json) を選択",dense:t.is_form_dense,accept:"application/json","prepend-icon":"","prepend-inner-icon":"mdi-paperclip"},model:{value:t.import_settings_file,callback:function(e){t.import_settings_file=e},expression:"import_settings_file"}})],1),e(I.Z,{staticClass:"settings__save-button error mt-5",attrs:{depressed:""},on:{click:function(e){return t.importSettings()}}},[e("Icon",{staticClass:"mr-3",attrs:{icon:"fa6-solid:upload",height:"19px"}}),t._v("設定をインポート ")],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("設定を初期状態にリセット")]),e("div",{staticClass:"settings__item-label"},[t._v(" このデバイス(ブラウザ)に保存されている設定データを、初期状態のデフォルト値にリセットできます。"),e("br"),t._v(" 設定をリセットすると、元に戻すことはできません。"),e("br"),t._v(" 設定のデバイス間同期がオンのときは、"),e("b",[t._v("同期が有効なすべてのデバイスに反映されます。")]),t._v("十分ご注意ください。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button error mt-5",attrs:{depressed:""},on:{click:function(e){return t.resetSettings()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"material-symbols:device-reset-rounded",height:"23px"}}),t._v("設定をリセット ")],1)],1)])},Ye=[];const Xe=[{text:"1080p (60fps) (約4.50GB/h / 平均10.0Mbps)",value:"1080p-60fps"},{text:"1080p (約4.50GB/h / 平均10.0Mbps)",value:"1080p"},{text:"810p (約2.62GB/h / 平均5.8Mbps)",value:"810p"},{text:"720p (約2.18GB/h / 平均4.9Mbps)",value:"720p"},{text:"540p (約1.52GB/h / 平均3.4Mbps)",value:"540p"},{text:"480p (約1.06GB/h / 平均2.3Mbps)",value:"480p"},{text:"360p (約0.60GB/h / 平均1.3Mbps)",value:"360p"},{text:"240p (約0.35GB/h / 平均0.8Mbps)",value:"240p"}],Je=[{text:"1080p (60fps) (約1.80GB/h / 平均4.0Mbps)",value:"1080p-60fps"},{text:"1080p (約1.37GB/h / 平均3.0Mbps)",value:"1080p"},{text:"810p (約1.05GB/h / 平均2.3Mbps)",value:"810p"},{text:"720p (約0.82GB/h / 平均1.8Mbps)",value:"720p"},{text:"540p (約0.53GB/h / 平均1.2Mbps)",value:"540p"},{text:"480p (約0.46GB/h / 平均1.0Mbps)",value:"480p"},{text:"360p (約0.30GB/h / 平均0.7Mbps)",value:"360p"},{text:"240p (約0.20GB/h / 平均0.4Mbps)",value:"240p"}];var Qe=o["default"].extend({name:"Settings-General",components:{SettingsBase:ke},data(){return{Utils:pt,PlayerUtils:at,is_form_dense:pt.isSmartphoneHorizontal(),tv_streaming_quality:Xe,panel_display_state:[{text:"前回の状態を復元する",value:"RestorePreviousState"},{text:"常に表示する",value:"AlwaysDisplay"},{text:"常に折りたたむ",value:"AlwaysFold"}],tv_panel_active_tab:[{text:"番組情報タブ",value:"Program"},{text:"チャンネルタブ",value:"Channel"},{text:"コメントタブ",value:"Comment"},{text:"Twitter タブ",value:"Twitter"}],import_settings_file:null}},computed:{...(0,a.Kc)(st)},created(){!0===this.settingsStore.settings.tv_data_saver_mode&&(this.tv_streaming_quality=Je)},watch:{"settingsStore.settings.tv_data_saver_mode":{immediate:!0,handler(t){this.tv_streaming_quality=!0===t?Je:Xe}}},methods:{exportSettings(){const t=JSON.stringify(this.settingsStore.settings,null,4),e=new Blob([t],{type:"application/json"});pt.downloadBlobData(e,"KonomiTV-Settings.json"),this.$message.success("設定をエクスポートしました。")},async importSettings(){if(null===this.import_settings_file)return void this.$message.error("インポートする設定データを選択してください!");const t=await this.settingsStore.importClientSettings(this.import_settings_file);!0===t?(this.$message.success("設定をインポートしました。"),window.setTimeout((()=>this.$router.go(0)),300)):this.$message.error("設定データが不正なため、インポートできませんでした。")},async resetSettings(){await this.settingsStore.resetClientSettings(),this.$message.success("設定をリセットしました。"),window.setTimeout((()=>this.$router.go(0)),300)}}}),ts=Qe,es=(0,p.Z)(ts,We,Ye,!1,null,null,null),ss=es.exports,is=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e(ht.Z,{staticClass:"settings-container d-flex px-5 py-5 mx-auto background",attrs:{elevation:"0",width:"100%","max-width":"1000"}},[e(ve.Z,{staticClass:"settings-navigation flex-shrink-0 background",attrs:{permanent:"",width:"100%",height:"auto"}},[e(pe.Z,{staticClass:"px-1"},[e(he.km,[e("h1",[t._v("設定")])])],1),e(me.Z,{staticClass:"mt-2 px-0",attrs:{nav:""}},[e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/general"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 3px"},attrs:{icon:"fa-solid:sliders-h",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("全般")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/caption"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:subtitles-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("字幕")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/data-broadcasting"}},[e(ge.Z,{staticClass:"mr-4"},[e("svg",{attrs:{width:"26px",height:"26px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})])]),e(he.km,[e(he.V9,[t._v("データ放送")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/capture"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:image-multiple-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("キャプチャ")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/account"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:person-20-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("アカウント")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/jikkyo"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 2px"},attrs:{icon:"bi:chat-left-text-fill",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("ニコニコ実況")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/twitter"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 1px"},attrs:{icon:"fa-brands:twitter",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("Twitter")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/server"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:server-surface-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("サーバー設定")])],1)],1),e(pe.Z,{staticClass:"px-4 settings-navigation-version",class:{"settings-navigation-version--highlight":t.versionStore.is_update_available},attrs:{link:"",color:"primary",href:"https://github.com/tsukumijima/KonomiTV"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:info-16-regular",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v(" version "+t._s(t.versionStore.client_version)+t._s(t.versionStore.is_update_available?" (Update Available)":"")+" ")])],1)],1)],1)],1)],1)],1)],1)},as=[],ns=o["default"].extend({name:"Settings-Index",components:{Header:jt,Navigation:Rt},computed:{...(0,a.Kc)(Ht)},async created(){await this.versionStore.fetchServerVersion()}}),rs=ns,os=(0,p.Z)(rs,is,as,!1,null,"51859415",null),ls=os.exports,cs=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"bi:chat-left-text-fill",width:"19px"}}),e("span",{staticClass:"ml-3"},[t._v("ニコニコ実況")])],1),e("div",{staticClass:"settings__content",class:{"settings__content--loading":t.is_loading}},[null===t.userStore.user||null===t.userStore.user.niconico_user_id?e("div",{staticClass:"niconico-account niconico-account--anonymous"},[e("div",{staticClass:"niconico-account-wrapper"},[e("Icon",{staticClass:"flex-shrink-0",attrs:{icon:"bi:chat-left-text-fill",width:"45px"}}),e("div",{staticClass:"niconico-account__info ml-4"},[e("div",{staticClass:"niconico-account__info-name"},[e("span",{staticClass:"niconico-account__info-name-text"},[t._v("ニコニコアカウントと連携していません")])]),e("span",{staticClass:"niconico-account__info-description"},[t._v(" ニコニコアカウントと連携すると、テレビを見ながらニコニコ実況にコメントできるようになります。 ")])])],1),e(I.Z,{staticClass:"niconico-account__login ml-auto",attrs:{color:"secondary",width:"130",height:"56",depressed:""},on:{click:function(e){return t.loginNiconicoAccount()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-connected-20-filled",height:"26"}}),t._v("連携する ")],1)],1):t._e(),null!==t.userStore.user&&null!==t.userStore.user.niconico_user_id?e("div",{staticClass:"niconico-account"},[e("div",{staticClass:"niconico-account-wrapper"},[e("img",{staticClass:"niconico-account__icon",attrs:{src:t.userStore.user_niconico_icon_url??""}}),e("div",{staticClass:"niconico-account__info"},[e("div",{staticClass:"niconico-account__info-name"},[e("span",{staticClass:"niconico-account__info-name-text"},[t._v(t._s(t.userStore.user.niconico_user_name)+" と連携しています")])]),e("span",{staticClass:"niconico-account__info-description"},[e("span",{staticClass:"mr-2",staticStyle:{"white-space":"nowrap"}},[t._v("Niconico User ID:")]),e("a",{staticClass:"mr-2",attrs:{href:`https://www.nicovideo.jp/user/${t.userStore.user.niconico_user_id}`,target:"_blank"}},[t._v(t._s(t.userStore.user.niconico_user_id))]),!0===t.userStore.user.niconico_user_premium?e("span",{staticClass:"secondary--text"},[t._v("(Premium)")]):t._e()])])]),e(I.Z,{staticClass:"niconico-account__login ml-auto",attrs:{color:"secondary",width:"130",height:"56",depressed:""},on:{click:function(e){return t.logoutNiconicoAccount()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-disconnected-20-filled",height:"26"}}),t._v("連携解除 ")],1)],1):t._e(),e("div",{staticClass:"settings__item mt-7"},[e("div",{staticClass:"settings__item-heading"},[t._v("コメントのミュート設定")]),e("div",{staticClass:"settings__item-label"},[t._v(" 表示したくないコメントを、映像上やコメントリストに表示しないようにミュートできます。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button mt-4",attrs:{depressed:""},on:{click:function(e){t.comment_mute_settings_modal=!t.comment_mute_settings_modal}}},[e("Icon",{attrs:{icon:"heroicons-solid:filter",height:"19px"}}),e("span",{staticClass:"ml-1"},[t._v("コメントのミュート設定を開く")])],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("コメントの速さ")]),e("div",{staticClass:"settings__item-label"},[t._v(" プレイヤーに流れるコメントの速さを設定します。"),e("br"),t._v(" たとえば 1.2 に設定すると、コメントが 1.2 倍速く流れます。"),e("br")]),e(je.Z,{staticClass:"settings__item-form",attrs:{ticks:"always","thumb-label":"","hide-details":"",step:.1,min:.5,max:2},model:{value:t.settingsStore.settings.comment_speed_rate,callback:function(e){t.$set(t.settingsStore.settings,"comment_speed_rate",e)},expression:"settingsStore.settings.comment_speed_rate"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("コメントの文字サイズ")]),e("div",{staticClass:"settings__item-label"},[t._v(" プレイヤーに流れるコメントの文字サイズの基準値を設定します。"),e("br"),t._v(" 実際の文字サイズは画面サイズに合わせて調整されます。デフォルトの文字サイズは 34px です。"),e("br")]),e(je.Z,{staticClass:"settings__item-form",attrs:{ticks:"always","thumb-label":"","hide-details":"",min:20,max:60},model:{value:t.settingsStore.settings.comment_font_size,callback:function(e){t.$set(t.settingsStore.settings,"comment_font_size",e)},expression:"settingsStore.settings.comment_font_size"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"close_comment_form_after_sending"}},[t._v("コメント送信後にコメント入力フォームを閉じる")]),e("label",{staticClass:"settings__item-label",attrs:{for:"close_comment_form_after_sending"}},[t._v(" この設定をオンにすると、コメントを送信した後に、コメント入力フォームが自動で閉じるようになります。"),e("br"),t._v(" コメント入力フォームが表示されたままだと、大半のショートカットキーが文字入力と競合して使えなくなります。とくに理由がなければ、オンにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"close_comment_form_after_sending",inset:"","hide-details":""},model:{value:t.settingsStore.settings.close_comment_form_after_sending,callback:function(e){t.$set(t.settingsStore.settings,"close_comment_form_after_sending",e)},expression:"settingsStore.settings.close_comment_form_after_sending"}})],1)],1),e("CommentMuteSettings",{model:{value:t.comment_mute_settings_modal,callback:function(e){t.comment_mute_settings_modal=e},expression:"comment_mute_settings_modal"}})],1)},_s=[],ds=function(){var t=this,e=t._self._c;t._self._setupProxy;return e(le.Z,{attrs:{"max-width":"770",transition:"slide-y-transition"},model:{value:t.comment_mute_settings_modal,callback:function(e){t.comment_mute_settings_modal=e},expression:"comment_mute_settings_modal"}},[e(ht.Z,{staticClass:"comment-mute-settings"},[e(gt.EB,{staticClass:"px-5 pt-5 pb-3 d-flex align-center font-weight-bold",staticStyle:{height:"60px"}},[e("Icon",{attrs:{icon:"heroicons-solid:filter",height:"26px"}}),e("span",{staticClass:"ml-3"},[t._v("コメントのミュート設定")]),e(kt.Z),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"d-flex align-center rounded-circle cursor-pointer px-2 py-2",on:{click:function(e){t.comment_mute_settings_modal=!1}}},[e("Icon",{attrs:{icon:"fluent:dismiss-12-filled",width:"23px",height:"23px"}})],1)],1),e("div",{staticClass:"px-5 pb-5"},[e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold mt-4"},[e("Icon",{attrs:{icon:"fa-solid:sliders-h",width:"24px",height:"20px"}}),e("span",{staticClass:"ml-2"},[t._v("クイック設定")])],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_vulgar_comments"}},[t._v(" 露骨な表現を含むコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_vulgar_comments"}},[t._v(" 性的な単語などの露骨・下品な表現を含むコメントを、一括でミュートするかを設定します。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_vulgar_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_vulgar_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_vulgar_comments",e)},expression:"settingsStore.settings.mute_vulgar_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_abusive_discriminatory_prejudiced_comments"}},[t._v(" ネガティブな表現、差別的な表現、政治的に偏った表現を含むコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_abusive_discriminatory_prejudiced_comments"}},[t._v(" 『死ね』『殺す』などのネガティブな表現、特定の国や人々への差別的な表現、政治的に偏った表現を含むコメントを、一括でミュートするかを設定します。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_abusive_discriminatory_prejudiced_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_abusive_discriminatory_prejudiced_comments",e)},expression:"settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_big_size_comments"}},[t._v(" 文字サイズが大きいコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_big_size_comments"}},[t._v(" 通常より大きい文字サイズで表示されるコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" 文字サイズが大きいコメントには迷惑なコメントが多いです。基本的にはオンにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_big_size_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_big_size_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_big_size_comments",e)},expression:"settingsStore.settings.mute_big_size_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_fixed_comments"}},[t._v(" 映像の上下に固定表示されるコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_fixed_comments"}},[t._v(" 映像の上下に固定された状態で表示されるコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" 固定表示されるコメントが煩わしい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_fixed_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_fixed_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_fixed_comments",e)},expression:"settingsStore.settings.mute_fixed_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_colored_comments"}},[t._v(" 色付きのコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_colored_comments"}},[t._v(" 白以外の色で表示される色付きのコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" この設定をオンにしておくと、目立つ色のコメントを一掃できます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_colored_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_colored_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_colored_comments",e)},expression:"settingsStore.settings.mute_colored_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_consecutive_same_characters_comments"}},[t._v(" 8文字以上同じ文字が連続しているコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_consecutive_same_characters_comments"}},[t._v(" 『wwwwwwwwwww』『あばばばばばばばばば』など、8文字以上同じ文字が連続しているコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" しばしばあるテンプレコメントが煩わしい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_consecutive_same_characters_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_consecutive_same_characters_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_consecutive_same_characters_comments",e)},expression:"settingsStore.settings.mute_consecutive_same_characters_comments"}})],1),e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold mt-4"},[e("Icon",{attrs:{icon:"fluent:comment-dismiss-20-filled",width:"24px"}}),e("span",{staticClass:"ml-2 mr-2"},[t._v("ミュート済みのキーワード")]),e(I.Z,{staticClass:"ml-auto",attrs:{depressed:""},on:{click:function(e){return t.settingsStore.settings.muted_comment_keywords.push({match:"partial",pattern:""})}}},[e("Icon",{attrs:{icon:"fluent:add-12-filled",height:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("追加")])],1)],1),e("div",{staticClass:"muted-comment-items"},t._l(t.settingsStore.settings.muted_comment_keywords,(function(s,i){return e("div",{key:i,staticClass:"muted-comment-item"},[e(yt.Z,{staticClass:"muted-comment-item__input",attrs:{type:"search",dense:"",outlined:"","hide-details":"",placeholder:"ミュートするキーワードを入力"},model:{value:t.settingsStore.settings.muted_comment_keywords[i].pattern,callback:function(e){t.$set(t.settingsStore.settings.muted_comment_keywords[i],"pattern",e)},expression:"settingsStore.settings.muted_comment_keywords[index].pattern"}}),e(Ie.Z,{staticClass:"muted-comment-item__match-type",attrs:{dense:"",outlined:"","hide-details":"",items:t.muted_comment_keyword_match_type},model:{value:t.settingsStore.settings.muted_comment_keywords[i].match,callback:function(e){t.$set(t.settingsStore.settings.muted_comment_keywords[i],"match",e)},expression:"settingsStore.settings.muted_comment_keywords[index].match"}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"muted-comment-item__delete-button",on:{click:function(e){t.settingsStore.settings.muted_comment_keywords.splice(t.settingsStore.settings.muted_comment_keywords.indexOf(s),1)}}},[e("Icon",{attrs:{icon:"fluent:delete-16-filled",width:"20px"}})],1)],1)})),0),e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold mt-4"},[e("Icon",{attrs:{icon:"fluent:person-prohibited-20-filled",width:"24px"}}),e("span",{staticClass:"ml-2 mr-2"},[t._v("ミュート済みのニコニコユーザー ID")]),e(I.Z,{staticClass:"ml-auto",attrs:{depressed:""},on:{click:function(e){return t.settingsStore.settings.muted_niconico_user_ids.push("")}}},[e("Icon",{attrs:{icon:"fluent:add-12-filled",height:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("追加")])],1)],1),e("div",{staticClass:"muted-comment-items"},t._l(t.settingsStore.settings.muted_niconico_user_ids,(function(s,i){return e("div",{key:i,staticClass:"muted-comment-item"},[e(yt.Z,{staticClass:"muted-comment-item__input",attrs:{type:"search",dense:"",outlined:"","hide-details":"",placeholder:"ミュートするニコニコユーザー ID を入力"},model:{value:t.settingsStore.settings.muted_niconico_user_ids[i],callback:function(e){t.$set(t.settingsStore.settings.muted_niconico_user_ids,i,e)},expression:"settingsStore.settings.muted_niconico_user_ids[index]"}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"muted-comment-item__delete-button",on:{click:function(e){t.settingsStore.settings.muted_niconico_user_ids.splice(t.settingsStore.settings.muted_niconico_user_ids.indexOf(s),1)}}},[e("Icon",{attrs:{icon:"fluent:delete-16-filled",width:"20px"}})],1)],1)})),0)])],1)],1)},us=[],ms=o["default"].extend({name:"CommentMuteSettings",model:{prop:"showing",event:"change"},props:{showing:{type:Boolean,required:!0}},data(){return{interval_timer_id:0,comment_mute_settings_modal:!1,muted_comment_keyword_match_type:[{text:"部分一致",value:"partial"},{text:"前方一致",value:"forward"},{text:"後方一致",value:"backward"},{text:"完全一致",value:"exact"},{text:"正規表現",value:"regex"}]}},computed:{...(0,a.Kc)(st)},watch:{showing(){this.comment_mute_settings_modal=this.showing},comment_mute_settings_modal(){this.$emit("change",this.comment_mute_settings_modal)}}}),ps=ms,hs=(0,p.Z)(ps,ds,us,!1,null,"2cd59ba0",null),gs=hs.exports;class vs{static async fetchAuthorizationURL(){const t=await G.get("/niconico/auth");return"is_error"in t?(G.showGenericError(t,"ニコニコアカウントとの連携用の認証 URL を取得できませんでした。"),null):t.data.authorization_url}static async logoutAccount(){const t=await G["delete"]("/niconico/logout");return!("is_error"in t)||(G.showGenericError(t,"ニコニコアカウントとの連携を解除できませんでした。"),!1)}}var fs=vs,ws=o["default"].extend({name:"Settings-Jikkyo",components:{SettingsBase:ke,CommentMuteSettings:gs},data(){return{comment_mute_settings_modal:!1,is_loading:!0}},computed:{...(0,a.Kc)(st,R)},async created(){if(await this.userStore.fetchUser(),this.is_loading=!1,""!==location.hash){const t=new URLSearchParams(location.hash.replace("#",""));if(null!==t.get("status")&&null!==t.get("detail")){const e=parseInt(t.get("status")),s=t.get("detail");this.onOAuthCallbackReceived(e,s),history.replaceState(null,""," ")}}},methods:{async loginNiconicoAccount(){if(!1===this.userStore.is_logged_in)return void this.$message.warning("連携をはじめるには、KonomiTV アカウントにログインしてください。");const t=await fs.fetchAuthorizationURL();if(null===t)return;if(!0===pt.isMobileDevice())return void(location.href=t);const e=window.open(t,"KonomiTV-OAuthPopup",pt.getWindowFeatures());if(null===e)return void this.$message.error("ポップアップウインドウを開けませんでした。");const s=async t=>{if(e.closed)return;if("object"!==pt["typeof"](t.data))return;if("KonomiTV-OAuthPopup"in t.data===!1)return;e&&e.close(),window.removeEventListener("message",s);const i=t.data["KonomiTV-OAuthPopup"]["status"],a=t.data["KonomiTV-OAuthPopup"]["detail"];this.onOAuthCallbackReceived(i,a)};window.addEventListener("message",s)},async onOAuthCallbackReceived(t,e){if(console.log(`NiconicoAuthCallbackAPI: Status: ${t} / Detail: ${e}`),200===t)await this.userStore.fetchUser(!0),this.$message.success("ニコニコアカウントと連携しました。");else if(e.startsWith("Authorization was denied (access_denied)"))this.$message.error("ニコニコアカウントとの連携がキャンセルされました。");else if(e.startsWith("Failed to get access token (HTTP Error ")){const t=e.replace("Failed to get access token ","");this.$message.error(`アクセストークンの取得に失敗しました。${t}`)}else if(e.startsWith("Failed to get access token (Connection Timeout)"))this.$message.error("アクセストークンの取得に失敗しました。ニコニコで障害が発生している可能性があります。");else if(e.startsWith("Failed to get user information (HTTP Error ")){const t=e.replace("Failed to get user information ","");this.$message.error(`ニコニコアカウントのユーザー情報の取得に失敗しました。${t}`)}else e.startsWith("Failed to get user information (Connection Timeout)")?this.$message.error("ニコニコアカウントのユーザー情報の取得に失敗しました。ニコニコで障害が発生している可能性があります。"):this.$message.error(`ニコニコアカウントとの連携に失敗しました。(${e})`)},async logoutNiconicoAccount(){const t=await fs.logoutAccount();!1!==t&&(await this.userStore.fetchUser(!0),this.$message.success("ニコニコアカウントとの連携を解除しました。"))}}}),ys=ws,bs=(0,p.Z)(ys,cs,_s,!1,null,"3ff16abd",null),Cs=bs.exports,ks=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:server-surface-16-filled",width:"22px"}}),e("span",{staticClass:"ml-2"},[t._v("サーバー設定")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("鋭意開発中…")])])])])},xs=[],Ss=o["default"].extend({name:"Settings-Server",components:{SettingsBase:ke}}),Os=Ss,Ts=(0,p.Z)(Os,ks,xs,!1,null,null,null),Is=Ts.exports,js=s(89767),Zs=s(47935),Bs=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fa-brands:twitter",width:"22px"}}),e("span",{staticClass:"ml-3"},[t._v("Twitter")])],1),e("div",{staticClass:"settings__content",class:{"settings__content--loading":t.is_loading}},[e("div",{staticClass:"twitter-accounts"},[null!==t.userStore.user&&t.userStore.user.twitter_accounts.length>0?e("div",{staticClass:"twitter-accounts__heading"},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:person-board-20-filled",height:"30"}}),t._v("連携中のアカウント ")],1):t._e(),null===t.userStore.user||0===t.userStore.user.twitter_accounts.length?e("div",{staticClass:"twitter-accounts__guide"},[e("Icon",{staticClass:"flex-shrink-0",attrs:{icon:"fa-brands:twitter",width:"45px"}}),e("div",{staticClass:"ml-4"},[e("div",{staticClass:"font-weight-bold text-h6"},[t._v("Twitter アカウントと連携していません")]),e("div",{staticClass:"text--text text--darken-1 text-subtitle-2 mt-1"},[t._v(" Twitter アカウントと連携すると、テレビを見ながら Twitter にツイートしたり、ほかの実況ツイートをリアルタイムで表示できるようになります。 ")])])],1):t._e(),t._l(null!==t.userStore.user?t.userStore.user.twitter_accounts:[],(function(s){return e("div",{key:s.id,staticClass:"twitter-account"},[e("img",{staticClass:"twitter-account__icon",attrs:{src:s.icon_url}}),e("div",{staticClass:"twitter-account__info"},[e("div",{staticClass:"twitter-account__info-name"},[e("span",{staticClass:"twitter-account__info-name-text"},[t._v(t._s(s.name))])]),e("span",{staticClass:"twitter-account__info-screen-name"},[t._v(" @"+t._s(s.screen_name)+" "),!0===s.is_oauth_session?e("span",[t._v("(Legacy Session)")]):t._e()])]),e(I.Z,{staticClass:"twitter-account__logout ml-auto",attrs:{width:"124",height:"52",depressed:""},on:{click:function(e){return t.logoutTwitterAccount(s.screen_name)}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-disconnected-20-filled",height:"24"}}),t._v("連携解除 ")],1)],1)})),e(I.Z,{staticClass:"twitter-account__login",attrs:{color:"secondary","max-width":"250",height:"50",depressed:""},on:{click:function(e){return t.loginTwitterAccountWithPasswordForm()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-connected-20-filled",height:"24"}}),t._v("連携するアカウントを追加 ")],1),e(le.Z,{attrs:{"max-width":"600"},model:{value:t.twitter_password_auth_dialog,callback:function(e){t.twitter_password_auth_dialog=e},expression:"twitter_password_auth_dialog"}},[e(ht.Z,[e(gt.EB,{staticClass:"justify-center pt-6 font-weight-bold"},[t._v("Twitter にログイン")]),e(gt.ZB,{staticClass:"pt-2 pb-0"},[e("p",{staticClass:"mb-1"},[t._v("2023/07 以降、Twitter のサードパーティー API の事実上の廃止により、従来のアプリ連携では Twitter にアクセスできなくなりました。")]),e("p",{staticClass:"mb-1"},[t._v("そこで KonomiTV では、代わりに "),e("a",{attrs:{href:"https://github.com/tsukumijima/tweepy-authlib",target:"_blank"}},[t._v("ユーザー名とパスワードでログイン")]),t._v(" することで、これまで通り Twitter 連携ができるようにしています (2要素認証を設定しているアカウントには対応していません) 。")]),e("p",{staticClass:"mb-1"},[t._v("ここで入力したパスワードは一切保存されず、取得した Cookie セッションはローカルの KonomiTV サーバーにのみ保存されます。Cookie セッションが Twitter API 以外の外部サービスに送信されることはありません。")]),e("p",{staticClass:"mb-1"},[t._v("万全は期していますが、非公式な方法のため、使い方次第ではアカウントにペナルティが適用される可能性もあります。自己の責任のもとでご利用ください。")]),e(ft.Z,{ref:"twitter_form",staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e(yt.Z,{ref:"twitter_screen_name",staticClass:"settings__item-form mt-6",attrs:{outlined:"",label:"ユーザー名 (@ から始まる ID)",placeholder:"screen_name",dense:t.is_form_dense,rules:[t=>!!t||"ユーザー名を入力してください。"]},model:{value:t.twitter_screen_name,callback:function(e){t.twitter_screen_name=e},expression:"twitter_screen_name"}}),e(yt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",label:"パスワード",dense:t.is_form_dense,type:t.twitter_password_showing?"text":"password","append-icon":t.twitter_password_showing?"mdi-eye":"mdi-eye-off",rules:[t=>!!t||"パスワードを入力してください。"]},on:{"click:append":function(e){t.twitter_password_showing=!t.twitter_password_showing}},model:{value:t.twitter_password,callback:function(e){t.twitter_password=e},expression:"twitter_password"}})],1)],1),e(gt.h7,{staticClass:"pt-0 px-6 pb-5"},[e(kt.Z),e(I.Z,{attrs:{color:"text",height:"40",text:""},on:{click:function(e){t.twitter_password_auth_dialog=!1}}},[t._v("キャンセル")]),e(I.Z,{staticClass:"px-4",attrs:{color:"secondary",height:"40"},on:{click:function(e){return t.loginTwitterAccountWithPassword()}}},[t._v("ログイン")])],1)],1)],1)],2),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"fold_panel_after_sending_tweet"}},[t._v("ツイート送信後にパネルを折りたたむ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"fold_panel_after_sending_tweet"}},[t._v(" この設定をオンにすると、ツイートを送信した後に、パネルが自動で折りたたまれます。"),e("br"),t._v(" ツイートするとき以外はできるだけ映像を大きくして見たい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"fold_panel_after_sending_tweet",inset:"","hide-details":""},model:{value:t.settingsStore.settings.fold_panel_after_sending_tweet,callback:function(e){t.$set(t.settingsStore.settings,"fold_panel_after_sending_tweet",e)},expression:"settingsStore.settings.fold_panel_after_sending_tweet"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"reset_hashtag_when_program_switches"}},[t._v("番組が切り替わったときにハッシュタグフォームをリセットする")]),e("label",{staticClass:"settings__item-label",attrs:{for:"reset_hashtag_when_program_switches"}},[t._v(" チャンネルを切り替えたときや、視聴中の番組が終了し次の番組の放送が開始されたときに、ハッシュタグフォームをリセットするかを設定します。"),e("br"),t._v(" この設定をオンにしておけば、「誤って前番組のハッシュタグをつけたまま次番組の実況ツイートをしてしまう」といったミスを回避できます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"reset_hashtag_when_program_switches",inset:"","hide-details":""},model:{value:t.settingsStore.settings.reset_hashtag_when_program_switches,callback:function(e){t.$set(t.settingsStore.settings,"reset_hashtag_when_program_switches",e)},expression:"settingsStore.settings.reset_hashtag_when_program_switches"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"auto_add_watching_channel_hashtag"}},[t._v("視聴中のチャンネルに対応する局タグを自動で追加する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"auto_add_watching_channel_hashtag"}},[t._v(" この設定をオンにすると、視聴中のチャンネルに対応する局タグ (#nhk, #tokyomx など) がハッシュタグフォームに自動で追加されます。"),e("br"),t._v(" 現時点で、局タグは三大首都圏の地上波・BS の一部チャンネル・AT-X にのみ対応しています。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"auto_add_watching_channel_hashtag",inset:"","hide-details":""},model:{value:t.settingsStore.settings.auto_add_watching_channel_hashtag,callback:function(e){t.$set(t.settingsStore.settings,"auto_add_watching_channel_hashtag",e)},expression:"settingsStore.settings.auto_add_watching_channel_hashtag"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("デフォルトで表示される Twitter タブ内のタブ")]),e("div",{staticClass:"settings__item-label"},[t._v(" 視聴画面を開いたときに、パネルの Twitter タブの中で最初に表示されるタブを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.twitter_active_tab},model:{value:t.settingsStore.settings.twitter_active_tab,callback:function(e){t.$set(t.settingsStore.settings,"twitter_active_tab",e)},expression:"settingsStore.settings.twitter_active_tab"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("ツイートにつけるハッシュタグの位置")]),e("div",{staticClass:"settings__item-label"},[t._v(" ツイート本文から見て、ハッシュタグをどの位置につけてツイートするかを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tweet_hashtag_position},model:{value:t.settingsStore.settings.tweet_hashtag_position,callback:function(e){t.$set(t.settingsStore.settings,"tweet_hashtag_position",e)},expression:"settingsStore.settings.tweet_hashtag_position"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("ツイートするキャプチャに番組タイトルの透かしを描画する")]),e("div",{staticClass:"settings__item-label"},[t._v(" ツイートするキャプチャに、透かしとして視聴中の番組タイトルを描画するかを設定します。"),e("br"),t._v(" 透かしの描画位置は 左上・右上・左下・右下 から選択できます。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tweet_capture_watermark_position},model:{value:t.settingsStore.settings.tweet_capture_watermark_position,callback:function(e){t.$set(t.settingsStore.settings,"tweet_capture_watermark_position",e)},expression:"settingsStore.settings.tweet_capture_watermark_position"}})],1)]),e(js.Z,{attrs:{value:t.is_twitter_password_auth_sending,"z-index":"300"}},[e(Zs.Z,{attrs:{color:"secondary",indeterminate:"",size:"64"}})],1)],1)},Ps=[];class $s{static async fetchAuthorizationURL(){const t=await G.get("/twitter/auth");return"is_error"in t?(G.showGenericError(t,"Twitter アカウントとの連携用の認証 URL を取得できませんでした。"),null):t.data.authorization_url}static async authWithPassword(t){const e=await G.post("/twitter/password-auth",t);if("is_error"in e){if(e.error.message.startsWith("Failed to authenticate with password")){const t=e.error.message.match(/Message: (.+)\)/)[1];N.error(`ログインに失敗しました。${t}`)}else if(e.error.message.startsWith("Unexpected error occurred while authenticate with password")){const t=e.error.message.match(/Message: (.+)\)/)[1];N.error(`ログインフローの途中で予期せぬエラーが発生しました。${t}`)}else e.error.message.startsWith("Failed to get user information")?N.error("Twitter アカウントのユーザー情報の取得に失敗しました。"):G.showGenericError(e,"Twitter アカウントとの連携に失敗しました。");return!1}return!0}static async logoutAccount(t){const e=await G["delete"](`/twitter/accounts/${t}`);return!("is_error"in e)||(G.showGenericError(e,"Twitter アカウントとの連携を解除できませんでした。"),!1)}static async sendTweet(t,e,s){const i=new FormData;i.append("tweet",e);for(const n of s)i.append("images",n);const a=await G.post(`/twitter/accounts/${t}/tweets`,i,{headers:{"Content-Type":"multipart/form-data"}});return"is_error"in a?a.error.message?Number.isNaN(a.status)?{message:`ツイートの送信に失敗しました。(${a.error.message})`,is_error:!0}:{message:`ツイートの送信に失敗しました。(HTTP Error ${a.status} / ${a.error.message})`,is_error:!0}:{message:`ツイートの送信に失敗しました。(HTTP Error ${a.status})`,is_error:!0}:!0===a.data.is_success?{message:a.data.detail,is_error:!1}:{message:a.data.detail,is_error:!0}}}var zs=$s,As=o["default"].extend({name:"Settings-Twitter",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),twitter_active_tab:[{text:"ツイート検索タブ",value:"Search"},{text:"タイムラインタブ",value:"Timeline"},{text:"キャプチャタブ",value:"Capture"}],tweet_hashtag_position:[{text:"ツイート本文の前に追加する",value:"Prepend"},{text:"ツイート本文の後に追加する",value:"Append"},{text:"ツイート本文の前に追加してから改行する",value:"PrependWithLineBreak"},{text:"ツイート本文の後に改行してから追加する",value:"AppendWithLineBreak"}],tweet_capture_watermark_position:[{text:"透かしを描画しない",value:"None"},{text:"透かしをキャプチャの左上に描画する",value:"TopLeft"},{text:"透かしをキャプチャの右上に描画する",value:"TopRight"},{text:"透かしをキャプチャの左下に描画する",value:"BottomLeft"},{text:"透かしをキャプチャの右下に描画する",value:"BottomRight"}],is_loading:!0,is_twitter_password_auth_sending:!1,twitter_password_auth_dialog:!1,twitter_screen_name:"",twitter_password:"",twitter_password_showing:!1}},computed:{...(0,a.Kc)(st,R)},async created(){await this.userStore.fetchUser(),this.is_loading=!1},methods:{async loginTwitterAccountWithPasswordForm(){if(!1===this.userStore.is_logged_in)return this.$message.warning("連携をはじめるには、KonomiTV アカウントにログインしてください。"),await pt.sleep(.01),void(this.twitter_password_auth_dialog=!1);this.twitter_password_auth_dialog=!0},async loginTwitterAccountWithPassword(){if(!1===this.$refs.twitter_form.validate())return;this.is_twitter_password_auth_sending=!0;const t=await zs.authWithPassword({screen_name:this.twitter_screen_name,password:this.twitter_password});if(this.is_twitter_password_auth_sending=!1,!1===t)return;if(await this.userStore.fetchUser(!0),null===this.userStore.user)return void this.$message.error("アカウント情報を取得できませんでした。");const e=[...this.userStore.user.twitter_accounts].sort(((t,e)=>t.updated_ate.updated_at?-1:0))[0];this.$message.success(`Twitter @${e.screen_name} と連携しました。`),this.$refs.twitter_form.reset(),this.twitter_password_auth_dialog=!1},async logoutTwitterAccount(t){const e=await zs.logoutAccount(t);!1!==e&&(await this.userStore.fetchUser(!0),this.$message.success(`Twitter @${t} との連携を解除しました。`))}}}),Ds=As,Ls=(0,p.Z)(Ds,Bs,Ps,!1,null,"61fbe4ed",null),Ns=Ls.exports,Es=s(756),Ks=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e("div",{staticClass:"channels-container channels-container--home",class:{"channels-container--loading":t.is_loading}},[e("v-tabs-fix",{staticClass:"channels-tab",attrs:{centered:""},model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},t._l(Array.from(t.channelsStore.channels_list_with_pinned),(function([s]){return e(Es.Z,{key:s,staticClass:"channels-tab__item"},[t._v(" "+t._s(s)+" ")])})),1),e("v-tabs-items-fix",{staticClass:"channels-list",model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},t._l(Array.from(t.channelsStore.channels_list_with_pinned),(function([s,i]){return e("v-tab-item-fix",{key:s,staticClass:"channels-tabitem"},[e("div",{staticClass:"channels",class:`channels--tab-${s} channels--length-${i.length}`},[t._l(i,(function(s){return e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],key:s.id,staticClass:"channel",attrs:{to:`/tv/watch/${s.display_channel_id}`}},[e("div",{staticClass:"channel__broadcaster"},[e("img",{staticClass:"channel__broadcaster-icon",attrs:{src:`${t.Utils.api_base_url}/channels/${s.display_channel_id}/logo`}}),e("div",{staticClass:"channel__broadcaster-content"},[e("span",{staticClass:"channel__broadcaster-name"},[t._v("Ch: "+t._s(s.channel_number)+" "+t._s(s.name))]),e("div",{staticClass:"channel__broadcaster-status"},[e("div",{staticClass:"channel__broadcaster-status-force",class:`channel__broadcaster-status-force--${t.ChannelUtils.getChannelForceType(s.jikkyo_force)}`},[e("Icon",{attrs:{icon:"fa-solid:fire-alt",height:"12px"}}),e("span",{staticClass:"ml-1"},[t._v("勢い:")]),e("span",{staticClass:"ml-1"},[t._v(t._s(s.jikkyo_force??"--"))]),e("span",{staticStyle:{"margin-left":"3px"}},[t._v(" コメ/分")])],1),e("div",{staticClass:"channel__broadcaster-status-viewers ml-4"},[e("Icon",{attrs:{icon:"fa-solid:eye",height:"14px"}}),e("span",{staticClass:"ml-1"},[t._v("視聴数:")]),e("span",{staticClass:"ml-1"},[t._v(t._s(s.viewer_count))])],1)])]),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip",value:t.isPinnedChannel(s.display_channel_id)?"ピン留めを外す":"ピン留めする",expression:"isPinnedChannel(channel.display_channel_id) ? 'ピン留めを外す' : 'ピン留めする'"}],staticClass:"channel__broadcaster-pin",class:{"channel__broadcaster-pin--pinned":t.isPinnedChannel(s.display_channel_id)},on:{click:function(e){e.preventDefault(),e.stopPropagation(),t.isPinnedChannel(s.display_channel_id)?t.removePinnedChannel(s.display_channel_id):t.addPinnedChannel(s.display_channel_id)},mousedown:function(t){t.preventDefault(),t.stopPropagation()}}},[e("Icon",{attrs:{icon:"fluent:pin-20-filled",width:"24px"}})],1)]),e("div",{staticClass:"channel__program-present"},[e("div",{staticClass:"channel__program-present-title-wrapper"},[e("span",{staticClass:"channel__program-present-title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(s.program_present,"title"))}}),e("span",{staticClass:"channel__program-present-time"},[t._v(t._s(t.ProgramUtils.getProgramTime(s.program_present)))])]),e("span",{staticClass:"channel__program-present-description",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(s.program_present,"description"))}})]),e(kt.Z),e("div",{staticClass:"channel__program-following"},[e("div",{staticClass:"channel__program-following-title"},[e("span",{staticClass:"channel__program-following-title-decorate"},[t._v("NEXT")]),e("Icon",{staticClass:"channel__program-following-title-icon",attrs:{icon:"fluent:fast-forward-20-filled",width:"16px"}}),e("span",{staticClass:"channel__program-following-title-text",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(s.program_following,"title"))}})],1),e("span",{staticClass:"channel__program-following-time"},[t._v(t._s(t.ProgramUtils.getProgramTime(s.program_following)))])]),e("div",{staticClass:"channel__progressbar"},[e("div",{staticClass:"channel__progressbar-progress",style:`width:${t.ProgramUtils.getProgramProgress(s.program_present)}%;`})])],1)})),"ピン留め"===s&&0===i.length?e("div",{staticClass:"pinned-container d-flex justify-center align-center w-100"},[e("div",{staticClass:"d-flex justify-center align-center flex-column"},[e("h2",[t._v("ピン留めされているチャンネルが"),e("br"),t._v("ありません。")]),e("div",{staticClass:"mt-4 text--text text--darken-1"},[t._v("各チャンネルの "),e("Icon",{staticStyle:{position:"relative",bottom:"-5px"},attrs:{icon:"fluent:pin-20-filled",width:"22px"}}),t._v(" アイコンから、よくみる"),e("br"),t._v("チャンネルをこのタブにピン留めできます。")],1),e("div",{staticClass:"mt-2 text--text text--darken-1"},[t._v("チャンネルをピン留めすると、"),e("br"),t._v("このタブが最初に表示されます。")])])]):t._e()],2)])})),1)],1)],1)],1)},Hs=[];const Ms={id:"NID0-SID0-EID0",channel_id:"NID0-SID0",network_id:0,service_id:0,event_id:0,title:"取得中…",description:"取得中…",detail:{},start_time:"2000-01-01T00:00:00+09:00",end_time:"2000-01-01T00:00:00+09:00",duration:0,is_free:!0,genres:[],video_type:"映像1080i(1125i)、アスペクト比16:9 パンベクトルなし",video_codec:"MPEG-2",video_resolution:"1080i",primary_audio_type:"2/0モード(ステレオ)",primary_audio_language:"日本語",primary_audio_sampling_rate:"48kHz",secondary_audio_type:null,secondary_audio_language:null,secondary_audio_sampling_rate:null},Fs={id:"NID0-SID0",display_channel_id:"gr000",network_id:0,service_id:0,transport_stream_id:null,remocon_id:0,channel_number:"---",type:"GR",name:"取得中…",jikkyo_force:null,is_subchannel:!1,is_radiochannel:!1,is_watchable:!0,is_display:!0,viewer_count:0,program_present:Ms,program_following:Ms};class Vs{static async fetchAll(){const t=await G.get("/channels");return"is_error"in t?(G.showGenericError(t,"チャンネル情報を取得できませんでした。"),null):t.data}static async fetch(t){const e=await G.get(`/channels/${t}`);return"is_error"in e?(G.showGenericError(e,"チャンネル情報を取得できませんでした。"),null):e.data}static async fetchJikkyoSession(t){const e=await G.get(`/channels/${t}/jikkyo`);return"is_error"in e?(G.showGenericError(e,"ニコニコ実況のセッション情報を取得できませんでした。"),null):e.data}}var Rs=Vs;const Us=(0,a.Q_)("channels",{state:()=>({display_channel_id:"gr000",channels_list:{GR:[],BS:[],CS:[],CATV:[],SKY:[],STARDIGIO:[]},is_channels_list_initial_updated:!1,last_updated_at:0}),getters:{is_showing_live(){return"gr000"!==this.display_channel_id},channel(){const t=this.channels_list[A.getChannelType(this.display_channel_id)];if(void 0===t||0===t.length)return{previous:Fs,current:Fs,next:Fs};const e=t.findIndex((t=>t.display_channel_id===this.display_channel_id));if(-1===e){const t={...Fs.program_present,display_channel_id:"gr999",title:"チャンネル情報取得エラー",description:"このチャンネル ID のチャンネル情報は存在しません。"},e={...Fs,display_channel_id:"gr999",name:"ERROR",program_present:t,program_following:t};return{previous:e,current:e,next:e}}const s=(()=>{let s=e-1;while(t.length){if(s<=-1&&(s=t.length-1),t[s].is_display)return s;s--}return 0})(),i=(()=>{let s=e+1;while(t.length){if(s>=t.length&&(s=0),t[s].is_display)return s;s++}return 0})();return{previous:t[s],current:t[e],next:t[i]}},channels_list_with_pinned(){const t=st(),e=new Map;if(e.set("ピン留め",[]),e.set("地デジ",[]),!1===this.is_channels_list_initial_updated)return e;e.set("BS",[]),e.set("CS",[]),e.set("CATV",[]),e.set("SKY",[]),e.set("StarDigio",[]);for(const[s,i]of Object.entries(this.channels_list))for(const a of i)if(!1!==a.is_display)switch(t.settings.pinned_channel_ids.includes(a.display_channel_id)&&e.get("ピン留め")?.push(a),a.type){case"GR":e.get("地デジ")?.push(a);break;case"BS":e.get("BS")?.push(a);break;case"CS":e.get("CS")?.push(a);break;case"CATV":e.get("CATV")?.push(a);break;case"SKY":e.get("SKY")?.push(a);break;case"STARDIGIO":e.get("StarDigio")?.push(a);break}for(const s of[...e.get("ピン留め")]){const i=t.settings.pinned_channel_ids.indexOf(s.display_channel_id);e.get("ピン留め")[i]=s}for(const[s,i]of e)"ピン留め"!==s&&0===i.length&&e.delete(s);return 1===e.size&&e.has("ピン留め")&&e.delete("ピン留め"),e},channels_list_with_pinned_for_watch(){const t=new Map([...this.channels_list_with_pinned]);return 0===t.get("ピン留め")?.length&&t.delete("ピン留め"),t}},actions:{getChannel(t){const e=this.channels_list[A.getChannelType(t)];return void 0===e?null:e.find((e=>e.display_channel_id===t))??null},getChannelByRemoconID(t,e){const s=this.channels_list[t],i=s.find((t=>t.remocon_id===e));return i??null},updateChannel(t,e){const s=A.getChannelType(t);if(void 0===this.channels_list[s])return;const i=this.channels_list[s].findIndex((e=>e.display_channel_id===t));-1!==i&&o["default"].set(this.channels_list[s],i,e)},async update(t=!1){const e=async()=>{const t=await Rs.fetchAll();null!==t&&(this.channels_list=t,this.is_channels_list_initial_updated=!0,this.last_updated_at=pt.time())};!0!==this.is_channels_list_initial_updated||!1!==t?await e():pt.time()-this.last_updated_at>60&&e()}}});var Gs=Us,qs=o["default"].extend({name:"TV-Home",components:{Header:jt,Navigation:Rt},data(){return{Utils:pt,ChannelUtils:A,ProgramUtils:mt,tab:null,is_loading:!0,interval_ids:[]}},computed:{...(0,a.Kc)(Gs,st)},async created(){0===this.settingsStore.settings.pinned_channel_ids.length&&(this.tab=1);const t=60-(new Date).getSeconds();this.interval_ids.push(window.setTimeout((()=>{this.channelsStore.update(!0),this.interval_ids.push(window.setInterval((()=>this.channelsStore.update(!0)),3e4))}),1e3*t)),await this.channelsStore.update(),await pt.sleep(.01),0===this.channelsStore.channels_list_with_pinned.get("ピン留め")?.length&&(this.tab=1),this.is_loading=!1},beforeDestroy(){for(const t of this.interval_ids)window.clearInterval(t)},methods:{addPinnedChannel(t){this.settingsStore.settings.pinned_channel_ids.push(t);const e=this.channelsStore.getChannel(t);e&&this.$message.show(`${e.name}をピン留めしました。`)},removePinnedChannel(t){this.settingsStore.settings.pinned_channel_ids.splice(this.settingsStore.settings.pinned_channel_ids.indexOf(t),1),0===this.channelsStore.channels_list_with_pinned.get("ピン留め")?.length&&(this.tab=1);const e=this.channelsStore.getChannel(t);e&&this.$message.show(`${e.name}のピン留めを外しました。`)},isPinnedChannel(t){return this.settingsStore.settings.pinned_channel_ids.includes(t)}}}),Ws=qs,Ys=(0,p.Z)(Ws,Ks,Hs,!1,null,"b22adce6",null),Xs=Ys.exports,Js=s(17024),Qs=s(57894),ti=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("main",{staticClass:"watch-container",class:{"watch-container--control-display":t.is_control_display,"watch-container--panel-display":!(!t.Utils.isSmartphoneVertical()&&!t.Utils.isTabletVertical())||t.is_panel_display,"watch-container--fullscreen":t.is_fullscreen}},[e("nav",{staticClass:"watch-navigation",on:{mousemove:function(e){return t.controlDisplayTimer(e)},touchmove:function(e){return t.controlDisplayTimer(e)},click:function(e){return t.controlDisplayTimer(e)}}},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"watch-navigation__icon",attrs:{to:"/tv/"}},[e("img",{staticClass:"watch-navigation__icon-image",attrs:{src:"/assets/images/icon.svg",width:"23px"}})]),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"テレビをみる",expression:"'テレビをみる'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/tv/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:tv-20-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"ビデオをみる",expression:"'ビデオをみる'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/videos/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:movies-and-tv-20-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"番組表",expression:"'番組表'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/timetable/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:calendar-ltr-20-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"録画予約",expression:"'録画予約'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/reserves/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",staticStyle:{padding:"0.5px"},attrs:{icon:"fluent:timer-16-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"マイリスト",expression:"'マイリスト'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/mylist/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"ic:round-playlist-play",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"キャプチャ",expression:"'キャプチャ'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/captures/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:image-multiple-24-regular",width:"26px"}})],1),e(kt.Z),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"設定",expression:"'設定'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/settings/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:settings-20-regular",width:"26px"}})],1)],1),e("div",{staticClass:"watch-content",on:{mousemove:function(e){return t.controlDisplayTimer(e,!0)},touchmove:function(e){return t.controlDisplayTimer(e,!0)},click:function(e){return t.controlDisplayTimer(e,!0)}}},[e("header",{staticClass:"watch-header"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"watch-header__back-icon",attrs:{to:"/tv/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("img",{staticClass:"watch-header__broadcaster",attrs:{src:`${t.Utils.api_base_url}/channels/${t.channelsStore.display_channel_id}/logo`}}),e("span",{staticClass:"watch-header__program-title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_present,"title"))}}),e("span",{staticClass:"watch-header__program-time"},[t._v(" "+t._s(t.ProgramUtils.getProgramTime(t.channelsStore.channel.current.program_present,!0))+" ")]),e(kt.Z),e("span",{staticClass:"watch-header__now"},[t._v(t._s(t.time))])],1),e("div",{staticClass:"watch-player",class:{"watch-player--loading":t.is_loading,"watch-player--virtual-keyboard-display":t.is_virtual_keyboard_display&&t.Utils.hasActiveElementClass("dplayer-comment-input")}},[e("div",{staticClass:"watch-player__background-wrapper"},[e("div",{staticClass:"watch-player__background",class:{"watch-player__background--display":t.is_background_display},style:{backgroundImage:`url(${t.background_url})`}},[e("img",{staticClass:"watch-player__background-logo",attrs:{src:"/assets/images/logo.svg"}})])]),e(Zs.Z,{staticClass:"watch-player__buffering",class:{"watch-player__buffering--display":t.is_video_buffering&&(t.is_loading||null!==t.player&&!t.player.video.paused)},attrs:{indeterminate:"",size:"60",width:"6"}}),e("div",{staticClass:"watch-player__dplayer"}),e("div",{staticClass:"watch-player__button",on:{mousemove:function(e){return t.controlDisplayTimer(e)},touchmove:function(e){return t.controlDisplayTimer(e)},click:function(e){return t.controlDisplayTimer(e)}}},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.top",value:"前のチャンネル",expression:"'前のチャンネル'",modifiers:{top:!0}}],staticClass:"switch-button switch-button-up",on:{click:function(e){t.is_zapping=!0,t.$router.push({path:`/tv/watch/${t.channelsStore.channel.previous.display_channel_id}`})}}},[e("Icon",{staticClass:"switch-button-icon",attrs:{icon:"fluent:ios-arrow-left-24-filled",width:"32px",rotate:"1"}})],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"switch-button switch-button-panel switch-button-panel--open",on:{click:function(e){t.is_panel_display=!t.is_panel_display}}},[e("Icon",{staticClass:"switch-button-icon",attrs:{icon:"fluent:navigation-16-filled",width:"32px"}})],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.bottom",value:"次のチャンネル",expression:"'次のチャンネル'",modifiers:{bottom:!0}}],staticClass:"switch-button switch-button-down",on:{click:function(e){t.is_zapping=!0,t.$router.push({path:`/tv/watch/${t.channelsStore.channel.next.display_channel_id}`})}}},[e("Icon",{staticClass:"switch-button-icon",attrs:{icon:"fluent:ios-arrow-right-24-filled",width:"33px",rotate:"1"}})],1)])],1)]),e("div",{staticClass:"watch-panel",on:{mousemove:function(e){return t.controlDisplayTimer(e)}}},[e("div",{staticClass:"watch-panel__header"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-close-button",on:{click:function(e){t.is_panel_display=!1}}},[e("Icon",{staticClass:"panel-close-button__icon",attrs:{icon:"akar-icons:chevron-right",width:"25px"}}),e("span",{staticClass:"panel-close-button__text"},[t._v("閉じる")])],1),e(kt.Z),e("div",{staticClass:"panel-broadcaster"},[e("img",{staticClass:"panel-broadcaster__icon",attrs:{src:`${t.Utils.api_base_url}/channels/${t.channelsStore.display_channel_id}/logo`}}),e("div",{staticClass:"panel-broadcaster__number"},[t._v(t._s(t.channelsStore.channel.current.channel_number))]),e("div",{staticClass:"panel-broadcaster__name"},[t._v(t._s(t.channelsStore.channel.current.name))])])],1),e("div",{staticClass:"watch-panel__content-container"},[e("Program",{staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Program"===t.tv_panel_active_tab}}),e("Channel",{staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Channel"===t.tv_panel_active_tab}}),e("Comment",{ref:"Comment",staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Comment"===t.tv_panel_active_tab},attrs:{channel:t.channelsStore.channel.current,player:t.player}}),e("Twitter",{ref:"Twitter",staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Twitter"===t.tv_panel_active_tab},attrs:{player:t.player,is_virtual_keyboard_display:t.is_virtual_keyboard_display},on:{panel_folding_requested:function(e){t.is_panel_display=!1}}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"watch-panel__content-remocon-button elevation-8",class:{"watch-panel__content-remocon-button--active":"Program"===t.tv_panel_active_tab||"Channel"===t.tv_panel_active_tab},on:{click:function(e){t.is_remocon_display=!t.is_remocon_display}}},[e("Icon",{staticClass:"panel-close-button__icon",attrs:{icon:"material-symbols:remote-gen",width:"25px"}})],1),e("Remocon",{staticClass:"watch-panel__remocon",attrs:{showing:("Program"===t.tv_panel_active_tab||"Channel"===t.tv_panel_active_tab)&&!0===t.is_remocon_display},on:{close:function(e){t.is_remocon_display=!1}}})],1),e("div",{staticClass:"watch-panel__navigation"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Program"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Program"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"fa-solid:info-circle",width:"33px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("番組情報")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Channel"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Channel"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"fa-solid:broadcast-tower",width:"34px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("チャンネル")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Comment"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Comment"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"bi:chat-left-text-fill",width:"29px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("コメント")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Twitter"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Twitter"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"fa-brands:twitter",width:"34px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("Twitter")])],1)])])]),e(le.Z,{attrs:{"max-width":"1050",transition:"slide-y-transition"},model:{value:t.shortcut_key_modal,callback:function(e){t.shortcut_key_modal=e},expression:"shortcut_key_modal"}},[e(ht.Z,[e(gt.EB,{staticClass:"px-5 pt-4 pb-3 d-flex align-center font-weight-bold"},[e("Icon",{attrs:{icon:"fluent:keyboard-20-filled",height:"28px"}}),e("span",{staticClass:"ml-3"},[t._v("キーボードショートカット")]),e(kt.Z),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"d-flex align-center rounded-circle cursor-pointer px-2 py-2",on:{click:function(e){t.shortcut_key_modal=!1}}},[e("Icon",{attrs:{icon:"fluent:dismiss-12-filled",width:"23px",height:"23px"}})],1)],1),e("div",{staticClass:"px-5 pb-4"},[e(Qs.Z,t._l(t.shortcut_key_list,(function(s,i){return e(Js.Z,{key:i,attrs:{cols:"6"}},t._l(s,(function(s){return e("div",{key:s.name,staticClass:"mt-3"},[e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold"},[e("Icon",{attrs:{icon:s.icon,height:s.icon_height}}),e("span",{staticClass:"ml-2"},[t._v(t._s(s.name))])],1),t._l(s.shortcuts,(function(s){return e("div",{key:s.name,staticClass:"mt-3"},[e("div",{staticClass:"text-subtitle-2 mt-2 d-flex align-center font-weight-medium"},[e("span",{staticClass:"mr-2",domProps:{innerHTML:t._s(s.name)}}),e("div",{staticClass:"ml-auto d-flex align-center flex-shrink-0"},t._l(s.keys,(function(i,a){return e("div",{key:i.name,staticClass:"ml-auto d-flex align-center"},[e("span",{staticClass:"shortcut-key"},[t._l(i.name.split(";"),(function(t){return e("Icon",{directives:[{name:"show",rawName:"v-show",value:!0===i.icon,expression:"key.icon === true"}],key:t,attrs:{icon:t,height:"18px"}})})),!1===i.icon?e("span",{domProps:{innerHTML:t._s(i.name)}}):t._e()],2),a{this.watch_session?.send(JSON.stringify({type:"startWatching",data:{reconnect:!1}}))}),{signal:this.abort_controller.signal}),this.watch_session.addEventListener("close",(async e=>{!0!==t&&(console.error(`[LiveCommentManager][WatchSession] Connection closed. (Code: ${e.code})`),this.player.notice(`ニコニコ実況との接続が切断されました。(Code: ${e.code})`,void 0,void 0,"#FF6F6A"),await pt.sleep(10),await this.reconnect())}),{signal:this.abort_controller.signal}),this.watch_session.addEventListener("message",(async e=>{if(null===this.watch_session)return;const s=JSON.parse(e.data);switch(s.type){case"seat":if(null!==this.keep_seat_interval_id)break;this.keep_seat_interval_id=window.setInterval((()=>{this.watch_session&&this.watch_session.readyState===WebSocket.OPEN?this.watch_session.send(JSON.stringify({type:"keepSeat"})):window.clearInterval(this.keep_seat_interval_id??0)}),1e3*s.data.keepIntervalSec);break;case"ping":this.watch_session.send(JSON.stringify({type:"pong"}));break;case"error":{if("COMMENT_POST_NOT_ALLOWED"===s.data.code||"INVALID_MESSAGE"===s.data.code)break;let t=`ニコニコ実況でエラーが発生しています。(Code: ${s.data.code})`;switch(s.data.code){case"CONNECT_ERROR":t="ニコニコ実況のコメントサーバーに接続できません。";break;case"CONTENT_NOT_READY":t="ニコニコ実況が配信できない状態です。";break;case"NO_THREAD_AVAILABLE":t="ニコニコ実況のコメントスレッドを取得できません。";break;case"NO_ROOM_AVAILABLE":t="ニコニコ実況のコメント部屋を取得できません。";break;case"NO_PERMISSION":t="ニコニコ実況の API にアクセスする権限がありません。";break;case"NOT_ON_AIR":t="ニコニコ実況が放送中ではありません。";break;case"BROADCAST_NOT_FOUND":t="ニコニコ実況の配信情報を取得できません。";break;case"INTERNAL_SERVERERROR":t="ニコニコ実況でサーバーエラーが発生しています。";break}console.error(`[LiveCommentManager][WatchSession] Error occurred. (Code: ${s.data.code})`),this.player.notice(t,void 0,void 0,"#FF6F6A"),await pt.sleep(5),await this.reconnect();break}case"reconnect":await this.reconnect();break;case"disconnect":{t=!0;let e=`ニコニコ実況との接続が切断されました。(${s.data.reason})`;switch(s.data.reason){case"TAKEOVER":e="ニコニコ実況の番組から追い出されました。";break;case"NO_PERMISSION":e="ニコニコ実況の番組の座席を取得できませんでした。";break;case"END_PROGRAM":e="ニコニコ実況がリセットされたか、コミュニティの番組が終了しました。";break;case"PING_TIMEOUT":e="コメントサーバーとの接続生存確認に失敗しました。";break;case"TOO_MANY_CONNECTIONS":e="ニコニコ実況の同一ユーザからの接続数上限を越えています。";break;case"TOO_MANY_WATCHINGS":e="ニコニコ実況の同一ユーザからの視聴番組数上限を越えています。";break;case"CROWDED":e="ニコニコ実況の番組が満席です。";break;case"MAINTENANCE_IN":e="ニコニコ実況はメンテナンス中です。";break;case"SERVICE_TEMPORARILY_UNAVAILABLE":e="ニコニコ実況で一時的にサーバーエラーが発生しています。";break}console.error(`[LiveCommentManager][WatchSession] Disconnected. (Reason: ${s.data.reason})`),this.player.notice(e),await pt.sleep(5),await this.reconnect();break}}}),{signal:this.abort_controller.signal}),new Promise((t=>{this.watch_session.addEventListener("message",(async e=>{const s=JSON.parse(e.data);if("room"===s.type)return this.vpos_base_timestamp=rt()(s.data.vposBaseTime).valueOf(),console.log(`[LiveCommentManager][WatchSession] Connected.\nThread ID: ${s.data.threadId}\n`),t({is_success:!0,detail:"視聴セッションを取得しました。",message_server_url:s.data.messageServer.uri,thread_id:s.data.threadId,your_post_key:s.data.yourPostKey?s.data.yourPostKey:null})}),{signal:this.abort_controller.signal})})))}initCommentSession(t){const e=[];let s=!1;this.comment_session=new WebSocket(t.message_server_url),this.comment_session.addEventListener("open",(()=>{null!==this.comment_session&&this.comment_session.send(JSON.stringify([{ping:{content:"rs:0"}},{ping:{content:"ps:0"}},{thread:{version:"20061206",thread:t.thread_id,threadkey:t.your_post_key,user_id:"",res_from:-50}},{ping:{content:"pf:0"}},{ping:{content:"rf:0"}}]))}),{signal:this.abort_controller.signal}),this.comment_session.addEventListener("message",(async t=>{const i=JSON.parse(t.data);if(void 0!==i.thread&&0!==i.thread.resultcode)return void console.error(`[LiveCommentManager][CommentSession] Connection failed. (Code: ${i.thread.resultcode})`);if(void 0!==i.ping&&"rf:0"===i.ping.content)return s=!0,void this.on_initial_comments_received(e);const a=i.chat;if(void 0===a||void 0===a.content||""===a.content||a.yourpost&&1===a.yourpost)return;const{color:n,position:r,size:o}=it.parseCommentCommand(a.mail);if(it.isMutedComment(a.content,a.user_id,n,r,o))return;const l={id:a.no,text:a.content,time:rt()(1e3*a.date).format("HH:mm:ss"),user_id:a.user_id,my_post:!1};if(!1===s)return void e.push(l);let c=0;this.player.video.buffered.length>=1&&(c=this.player.video.buffered.end(0));const _=c-this.player.video.currentTime;await pt.sleep(_),this.on_comment_received(l),!1===this.player.video.paused&&this.player.danmaku.draw({text:a.content,color:n,type:r,size:o})}),{signal:this.abort_controller.signal})}sendComment(t){const e={"#FFEAEA":"white","#F02840":"red","#FD7E80":"pink","#FDA708":"orange","#FFE133":"yellow","#64DD17":"green","#00D4F5":"cyan","#4763FF":"blue"},s={top:"ue",right:"naka",bottom:"shita"},i=Math.round((rt()().valueOf()-this.vpos_base_timestamp)/10);if(null===this.watch_session||this.watch_session.readyState!==WebSocket.OPEN)return console.error("[LiveCommentManager][WatchSession] Comment sending failed. (Connection is not established.)"),void t.error("コメントの送信に失敗しました。WebSocket 接続が確立されていません。");this.watch_session.send(JSON.stringify({type:"postComment",data:{text:t.data.text,color:e[t.data.color.toUpperCase()],position:s[t.data.type],size:t.data.size,vpos:i,isAnonymous:!0}}));const a=new AbortController;this.watch_session.addEventListener("message",(e=>{const s=JSON.parse(e.data);switch(s.type){case"postCommentResult":t.success(),a.abort();break;case"error":{let e=`コメントの送信に失敗しました。(${s.data.code})`;switch(s.data.code){case"COMMENT_POST_NOT_ALLOWED":e="コメントが許可されていません。";break;case"INVALID_MESSAGE":e="コメント内容が無効です。";break}console.error(`[LiveCommentManager][WatchSession] Comment sending failed. (Code: ${s.data.code})`),t.error(e),a.abort();break}}}),{signal:a.signal})}async reconnect(){console.warn("[LiveCommentManager][WatchSession] Reconnecting..."),this.player.notice("ニコニコ実況に再接続しています…"),this.destroy();const t=await this.initSession();!1===t.is_success&&(console.error("[LiveCommentManager][WatchSession] Reconnection failed."),this.player.notice(t.detail,void 0,void 0,"#FF6F6A"))}destroy(){this.abort_controller.abort(),this.abort_controller=new AbortController,null!==this.watch_session&&(this.watch_session.close(),this.watch_session=null),null!==this.comment_session&&(this.comment_session.close(),this.comment_session=null),null!==this.keep_seat_interval_id&&(window.clearInterval(this.keep_seat_interval_id),this.keep_seat_interval_id=null),this.vpos_base_timestamp=0,console.log("[LiveCommentManager][WatchSession] Destroyed.")}}var hi=pi,gi=o["default"].extend({name:"Panel-CommentTab",components:{CommentMuteSettings:gs},data(){return{Utils:pt,is_manual_scroll:!1,is_auto_scrolling:!1,comment_list:[],comment_list_element:null,is_comment_list_dropdown_display:!1,comment_list_dropdown_top:0,comment_list_dropdown_comment:null,live_comment_manager:null,initialize_failed_message:null,visibilitychange_listener:null,resize_observer:null,comment_mute_settings_modal:!1,player:null}},computed:{...(0,a.Kc)(R)},created(){this.userStore.fetchUser()},mounted(){null===this.comment_list_element&&(this.comment_list_element=this.$el.querySelector(".comment-list"));let t=!1;this.comment_list_element.onmousedown=e=>{if(null===this.comment_list_element)return;const s=e.clientX-this.comment_list_element.getBoundingClientRect().left;s>this.comment_list_element.clientWidth&&(t=!0)},this.comment_list_element.onmouseup=e=>{if(null===this.comment_list_element)return;const s=e.clientX-this.comment_list_element.getBoundingClientRect().left;s>this.comment_list_element.clientWidth&&(t=!1)};const e=()=>{t=!0,window.setTimeout((()=>t=!1),100)};let s=!1;this.comment_list_element.ontouchstart=()=>s=!0,this.comment_list_element.ontouchend=()=>s=!1,this.comment_list_element.ontouchmove=()=>!0===s?e():"",this.comment_list_element.onwheel=e,this.comment_list_element.onscroll=async()=>{null!==this.comment_list_element&&!1===this.is_auto_scrolling&&!0===t&&(this.is_manual_scroll=!0,await pt.sleep(.1),this.comment_list_element.scrollTop+this.comment_list_element.offsetHeight>this.comment_list_element.scrollHeight-10&&(this.is_manual_scroll=!1))}},beforeDestroy(){this.destroy(),null!==this.resize_observer&&this.resize_observer.disconnect()},methods:{showCommentListDropdown(t,e){const s=this.$refs.comment_list_wrapper.getBoundingClientRect(),i=76,a=t.currentTarget.getBoundingClientRect();this.comment_list_dropdown_top=a.top-s.top,this.comment_list_dropdown_top+i>s.height&&(this.comment_list_dropdown_top=this.comment_list_dropdown_top-i+a.height),this.comment_list_dropdown_comment=e,this.is_comment_list_dropdown_display=!0},hideCommentListDropdown(){this.is_comment_list_dropdown_display=!1,this.comment_list=this.comment_list.filter((t=>!1===it.isMutedComment(t.text,t.user_id)))},addMutedKeywords(){null!==this.comment_list_dropdown_comment&&(it.addMutedKeywords(this.comment_list_dropdown_comment.text),this.hideCommentListDropdown())},addMutedNiconicoUserIds(){null!==this.comment_list_dropdown_comment&&(it.addMutedNiconicoUserIDs(this.comment_list_dropdown_comment.user_id),this.hideCommentListDropdown())},async scrollCommentList(t=!1){if(null!==this.comment_list_element&&(!0===this.is_comment_list_dropdown_display&&(this.is_manual_scroll=!0),!0!==this.is_manual_scroll)){this.is_auto_scrolling=!0;for(let e=0;e<3;e++)await pt.sleep(.01),!0===t?this.comment_list_element.scrollTo({top:this.comment_list_element.scrollHeight,left:0,behavior:"smooth"}):this.comment_list_element.scrollTo(0,this.comment_list_element.scrollHeight);await pt.sleep(.1),this.is_auto_scrolling=!1}},initReserveObserver(){null!==this.resize_observer&&this.resize_observer.disconnect();const t=document.querySelector(".watch-player"),e=()=>{const e=this.player?.template.danmaku,s=e.clientWidth,i=e.clientWidth*(9/16);if(null===t||null===t.clientHeight)return;const a=(t.clientHeight-i)/2,n=pt.isSmartphoneVertical()?0:window.matchMedia("(max-height: 450px)").matches?50:66;if(a0===e?t:l(e,t%e),c=l(r,o),_=`${r/c} / ${o/c}`;e.style.transition="none",e.style.setProperty("--comment-area-aspect-ratio",_),e.style.setProperty("--comment-area-vertical-margin",`${t}px`),window.setTimeout((()=>{e.style.transition=""}),200)}else e.style.removeProperty("--comment-area-aspect-ratio"),e.style.removeProperty("--comment-area-vertical-margin")};this.resize_observer=new ResizeObserver(e),this.resize_observer.observe(t),window.setTimeout(e,600)},async initSession(t,e){this.player=t,this.initReserveObserver();const s=[],i=500;this.live_comment_manager=new hi({player:t,display_channel_id:e,on_initial_comments_received:async t=>{this.comment_list.push(...t),this.scrollCommentList()},on_comment_received:async t=>{"hidden"!==document.visibilityState?(this.comment_list.length>=i&&!1===this.is_manual_scroll&&this.comment_list.splice(0,Math.max(0,this.comment_list.length-i)),this.comment_list.push(t),this.scrollCommentList()):s.push(t)}}),this.visibilitychange_listener=()=>{if("visible"===document.visibilityState){const t=this.comment_list.length+s.length;t>=i&&!1===this.is_manual_scroll&&this.comment_list.splice(0,Math.max(0,t-i)),this.comment_list.push(...s),s.length=0,this.scrollCommentList()}},document.addEventListener("visibilitychange",this.visibilitychange_listener);const a=await this.live_comment_manager.initSession();!1===a.is_success&&(this.initialize_failed_message=a.detail)},sendComment(t){null===this.initialize_failed_message?null!==this.userStore.user?null!==this.userStore.user.niconico_user_id?!1!==this.userStore.user.niconico_user_premium||"top"!==t.data.type&&"bottom"!==t.data.type?!1!==this.userStore.user.niconico_user_premium||"big"!==t.data.size?this.live_comment_manager?.sendComment(t):t.error("コメントサイズを大きめに設定するには、ニコニコアカウントのプレミアム会員登録が必要です。"):t.error("コメントを上下に固定するには、ニコニコアカウントのプレミアム会員登録が必要です。"):t.error("コメントするには、ニコニコアカウントと連携してください。"):t.error("コメントするには、KonomiTV アカウントにログインしてください。"):t.error(this.initialize_failed_message)},destroy(){null!==this.visibilitychange_listener&&(document.removeEventListener("visibilitychange",this.visibilitychange_listener),this.visibilitychange_listener=null),null!==this.live_comment_manager&&(this.live_comment_manager.destroy(),this.live_comment_manager=null),this.initialize_failed_message=null,this.comment_list=[]}}}),vi=gi,fi=(0,p.Z)(vi,ui,mi,!1,null,"df07fabe",null),wi=fi.exports,yi=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"program-container"},[e("section",{staticClass:"program-broadcaster"},[e("img",{staticClass:"program-broadcaster__icon",attrs:{src:`${t.Utils.api_base_url}/channels/${t.channelsStore.display_channel_id}/logo`}}),e("div",{staticClass:"program-broadcaster__number"},[t._v("Ch: "+t._s(t.channelsStore.channel.current.channel_number))]),e("div",{staticClass:"program-broadcaster__name"},[t._v(t._s(t.channelsStore.channel.current.name))])]),e("section",{staticClass:"program-info"},[e("h1",{staticClass:"program-info__title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_present,"title"))}}),e("div",{staticClass:"program-info__time"},[t._v(" "+t._s(t.ProgramUtils.getProgramTime(t.channelsStore.channel.current.program_present))+" ")]),e("div",{staticClass:"program-info__description",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_present,"description"))}}),e("div",{staticClass:"program-info__genre-container"},t._l(t.channelsStore.channel.current.program_present?.genres??[],(function(s,i){return e("div",{key:i,staticClass:"program-info__genre"},[t._v(" "+t._s(s.major)+" / "+t._s(s.middle)+" ")])})),0),e("div",{staticClass:"program-info__next"},[e("span",{staticClass:"program-info__next-decorate"},[t._v("NEXT")]),e("Icon",{staticClass:"program-info__next-icon",attrs:{icon:"fluent:fast-forward-20-filled",width:"16px"}})],1),e("span",{staticClass:"program-info__next-title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_following,"title"))}}),e("div",{staticClass:"program-info__next-time"},[t._v(" "+t._s(t.ProgramUtils.getProgramTime(t.channelsStore.channel.current.program_following))+" ")]),e("div",{staticClass:"program-info__status"},[e("div",{staticClass:"program-info__status-force",class:`program-info__status-force--${t.ChannelUtils.getChannelForceType(t.channelsStore.channel.current.jikkyo_force)}`},[e("Icon",{attrs:{icon:"fa-solid:fire-alt",height:"14px"}}),e("span",{staticClass:"ml-2"},[t._v("勢い:")]),e("span",{staticClass:"ml-2"},[t._v(t._s(t.channelsStore.channel.current.jikkyo_force??"--")+" コメ/分")])],1),e("div",{staticClass:"program-info__status-viewers ml-5"},[e("Icon",{attrs:{icon:"fa-solid:eye",height:"14px"}}),e("span",{staticClass:"ml-2"},[t._v("視聴数:")]),e("span",{staticClass:"ml-1"},[t._v(t._s(t.channelsStore.channel.current.viewer_count))])],1)])]),e("section",{staticClass:"program-detail-container"},t._l(t.channelsStore.channel.current.program_present?.detail??{},(function(s,i){return e("div",{key:i,staticClass:"program-detail"},[e("h2",{staticClass:"program-detail__heading"},[t._v(t._s(i))]),e("div",{staticClass:"program-detail__text",domProps:{innerHTML:t._s(t.Utils.URLtoLink(s))}})])})),0)])},bi=[],Ci=o["default"].extend({name:"Panel-ProgramTab",data(){return{Utils:pt,ChannelUtils:A,ProgramUtils:mt}},computed:{...(0,a.Kc)(Gs)}}),ki=Ci,xi=(0,p.Z)(ki,yi,bi,!1,null,"710b8382",null),Si=xi.exports,Oi=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"remote-control-container",class:{"remote-control-container--showing":t.showing},on:{click:function(e){return t.$emit("close")}}},[e("div",{staticClass:"remote-control elevation-6",on:{click:function(t){t.stopPropagation()}}},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control__close d-flex align-center rounded-circle cursor-pointer px-2 py-2",on:{click:function(e){return t.$emit("close")}}},[e("Icon",{attrs:{icon:"fluent:dismiss-12-filled",width:"23px",height:"23px"}})],1),e("div",{staticClass:"remote-control-data-broadcasting remote-control-data-broadcasting--disabled"},[e(Zs.Z,{staticClass:"remote-control__loading",attrs:{indeterminate:"",size:"60",width:"6"}}),e("div",{staticClass:"remote-control__directional-key"},[e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-up",attrs:{"data-arib-key-code":"1"}},[e("Icon",{attrs:{icon:"fluent:chevron-up-12-filled",width:"26px",height:"26px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-left",attrs:{"data-arib-key-code":"3"}},[e("Icon",{attrs:{icon:"fluent:chevron-left-12-filled",width:"26px",height:"26px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-select",attrs:{"data-arib-key-code":"18"}},[t._v(" 決定 ")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-right",attrs:{"data-arib-key-code":"4"}},[e("Icon",{attrs:{icon:"fluent:chevron-right-12-filled",width:"26px",height:"26px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-down",attrs:{"data-arib-key-code":"2"}},[e("Icon",{attrs:{icon:"fluent:chevron-down-12-filled",width:"26px",height:"26px"}})],1)]),e("div",{staticClass:"remote-control__control-key"},[e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-data",attrs:{"data-arib-key-code":"20"}},[e("svg",{attrs:{width:"20px",height:"20px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})]),e("span",{staticClass:"ml-1"},[t._v("データ")])]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-back",attrs:{"data-arib-key-code":"19"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"20px"}}),e("span",{staticClass:"ml-1"},[t._v("戻る")])],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-blue blue darken-3",attrs:{"data-arib-key-code":"21"}},[t._v("青")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-red red darken-3",attrs:{"data-arib-key-code":"22"}},[t._v("赤")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-green green darken-3",attrs:{"data-arib-key-code":"23"}},[t._v("緑")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-yellow yellow darken-3",attrs:{"data-arib-key-code":"24"}},[t._v("黄")])])],1),e("div",{staticClass:"remote-control__number-key"},[e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"1","data-arib-key-code":"6"}},[t._v("1")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"2","data-arib-key-code":"7"}},[t._v("2")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"3","data-arib-key-code":"8"}},[t._v("3")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"4","data-arib-key-code":"9"}},[t._v("4")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"5","data-arib-key-code":"10"}},[t._v("5")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"6","data-arib-key-code":"11"}},[t._v("6")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"7","data-arib-key-code":"12"}},[t._v("7")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"8","data-arib-key-code":"13"}},[t._v("8")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"9","data-arib-key-code":"14"}},[t._v("9")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"10","data-arib-key-code":"15"}},[t._v("10")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"11","data-arib-key-code":"16"}},[t._v("11")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"12","data-arib-key-code":"17"}},[t._v("12")])])])])},Ti=[],Ii=o["default"].extend({name:"Panel-Remocon",props:{showing:{type:Boolean,required:!0}}}),ji=Ii,Zi=(0,p.Z)(ji,Oi,Ti,!1,null,"b659b524",null),Bi=Zi.exports,Pi=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"twitter-container"},[e(le.Z,{attrs:{"content-class":"zoom-capture-modal-container","max-width":"980",transition:"slide-y-transition"},model:{value:t.zoom_capture_modal,callback:function(e){t.zoom_capture_modal=e},expression:"zoom_capture_modal"}},[e("div",{staticClass:"zoom-capture-modal"},[e("img",{staticClass:"zoom-capture-modal__image",attrs:{src:t.zoom_capture?t.zoom_capture.image_url:""}}),e("a",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"zoom-capture-modal__download",attrs:{href:t.zoom_capture?t.zoom_capture.image_url:"",download:t.zoom_capture?t.zoom_capture.filename:""}},[e("Icon",{attrs:{icon:"fa6-solid:download",width:"45px"}})],1)])]),e("div",{staticClass:"tab-container"},[e("div",{staticClass:"tab-content tab-content--search",class:{"tab-content--active":"Search"===t.twitter_active_tab}},[e("div",{staticClass:"search px-4"},[t._v(" リアルタイム検索機能は鋭意開発中です。 ")])]),e("div",{staticClass:"tab-content tab-content--timeline",class:{"tab-content--active":"Timeline"===t.twitter_active_tab}},[e("div",{staticClass:"search px-4"},[t._v(" タイムライン機能は鋭意開発中です。 ")])]),e("div",{staticClass:"tab-content tab-content--capture",class:{"tab-content--active":"Capture"===t.twitter_active_tab}},[e("div",{staticClass:"captures"},t._l(t.captures,(function(s){return e("div",{key:s.image_url,staticClass:"capture",class:{"capture--selected":s.selected,"capture--focused":s.focused,"capture--disabled":!s.selected&&t.tweet_captures.length>=4},on:{click:function(e){return t.clickCapture(s)}}},[e("img",{staticClass:"capture__image",attrs:{src:s.image_url}}),e("div",{staticClass:"capture__disabled-cover"}),e("div",{staticClass:"capture__selected-number"},[t._v(t._s(t.tweet_captures.findIndex((t=>t===s.blob))+1))]),e("Icon",{staticClass:"capture__selected-checkmark",attrs:{icon:"fluent:checkmark-circle-16-filled"}}),e("div",{staticClass:"capture__selected-border"}),e("div",{staticClass:"capture__focused-border"}),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"capture__zoom",on:{click:function(e){e.preventDefault(),e.stopPropagation(),t.zoom_capture_modal=!0,t.zoom_capture=s},mousedown:function(t){t.preventDefault(),t.stopPropagation()}}},[e("Icon",{attrs:{icon:"fluent:zoom-in-16-regular",width:"32px"}})],1)],1)})),0),e("div",{directives:[{name:"show",rawName:"v-show",value:0===t.captures.length,expression:"captures.length === 0"}],staticClass:"capture-announce"},[e("div",{staticClass:"capture-announce__heading"},[t._v("まだキャプチャがありません。")]),t._m(0)])])]),e("div",{staticClass:"tab-button-container"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tab-button",class:{"tab-button--active":"Search"===t.twitter_active_tab},on:{click:function(e){t.twitter_active_tab="Search"}}},[e("Icon",{attrs:{icon:"fluent:search-16-filled",height:"18px"}}),e("span",{staticClass:"tab-button__text"},[t._v("ツイート検索")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tab-button",class:{"tab-button--active":"Timeline"===t.twitter_active_tab},on:{click:function(e){t.twitter_active_tab="Timeline"}}},[e("Icon",{attrs:{icon:"fluent:home-16-regular",height:"18px"}}),e("span",{staticClass:"tab-button__text"},[t._v("タイムライン")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tab-button",class:{"tab-button--active":"Capture"===t.twitter_active_tab},on:{click:function(e){t.twitter_active_tab="Capture"}}},[e("Icon",{attrs:{icon:"fluent:image-copy-20-regular",height:"18px"}}),e("span",{staticClass:"tab-button__text"},[t._v("キャプチャ")])],1)]),e("div",{staticClass:"tweet-form",class:{"tweet-form--focused":t.is_tweet_hashtag_form_focused||t.is_tweet_text_form_focused,"tweet-form--virtual-keyboard-display":t.is_virtual_keyboard_display&&(t.Utils.hasActiveElementClass("tweet-form__hashtag-form")||t.Utils.hasActiveElementClass("tweet-form__textarea"))&&(()=>(t.is_hashtag_list_display=!1,!0))()}},[e("div",{staticClass:"tweet-form__hashtag"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.tweet_hashtag,expression:"tweet_hashtag"}],staticClass:"tweet-form__hashtag-form",attrs:{type:"search",placeholder:"#ハッシュタグ",spellcheck:"false"},domProps:{value:t.tweet_hashtag},on:{input:[function(e){e.target.composing||(t.tweet_hashtag=e.target.value)},function(e){return t.updateTweetLetterCount()}],focus:function(e){t.is_tweet_hashtag_form_focused=!0},blur:function(e){t.is_tweet_hashtag_form_focused=!1},change:function(e){t.tweet_hashtag=t.formatHashtag(t.tweet_hashtag),t.updateTweetLetterCount()}}}),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tweet-form__hashtag-list-button",on:{click:function(e){return t.clickHashtagListButton()}}},[e("Icon",{attrs:{icon:"fluent:clipboard-text-ltr-32-regular",height:"22px"}})],1)]),e("textarea",{directives:[{name:"model",rawName:"v-model",value:t.tweet_text,expression:"tweet_text"}],ref:"tweet_text",staticClass:"tweet-form__textarea",attrs:{placeholder:"ツイート",spellcheck:"false"},domProps:{value:t.tweet_text},on:{input:[function(e){e.target.composing||(t.tweet_text=e.target.value)},function(e){return t.updateTweetLetterCount()}],paste:function(e){return t.pasteClipboardData(e)},focus:function(e){t.is_tweet_text_form_focused=!0},blur:function(e){t.is_tweet_text_form_focused=!1}}}),e("div",{staticClass:"tweet-form__control"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"account-button",class:{"account-button--no-login":!t.is_logged_in_twitter},on:{click:function(e){return t.clickAccountButton()}}},[e("img",{staticClass:"account-button__icon",attrs:{src:t.is_logged_in_twitter?t.selected_twitter_account?.icon_url:"/assets/images/account-icon-default.png"}}),e("span",{staticClass:"account-button__screen-name"},[t._v(" "+t._s(t.is_logged_in_twitter?`@${t.selected_twitter_account?.screen_name}`:"連携されていません")+" ")]),e("Icon",{staticClass:"account-button__menu",attrs:{icon:"fluent:more-circle-20-regular",width:"22px"}})],1),e("div",{staticClass:"limit-meter"},[e("div",{staticClass:"limit-meter__content",class:{"limit-meter__content--yellow":t.tweet_letter_count<=20,"limit-meter__content--red":t.tweet_letter_count<=0}},[e("Icon",{staticStyle:{"margin-right":"-2px"},attrs:{icon:"fa-brands:twitter",width:"12px"}}),e("span",[t._v(t._s(t.tweet_letter_count))])],1),e("div",{staticClass:"limit-meter__content"},[e("Icon",{attrs:{icon:"fluent:image-16-filled",width:"14px"}}),e("span",[t._v(t._s(t.tweet_captures.length)+"/4")])],1)]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tweet-button",attrs:{disabled:!t.is_logged_in_twitter||t.tweet_letter_count<0||140===t.tweet_letter_count&&0===t.tweet_captures.length},on:{click:function(e){return t.sendTweet()},touchstart:function(e){return t.sendTweet()}}},[e("Icon",{attrs:{icon:"fa-brands:twitter",height:"16px"}}),e("span",{staticClass:"ml-1"},[t._v("ツイート")])],1)])]),e("div",{staticClass:"hashtag-list",class:{"hashtag-list--display":t.is_hashtag_list_display,"hashtag-list--virtual-keyboard-display":t.is_virtual_keyboard_display&&t.Utils.hasActiveElementClass("hashtag__input")}},[e("div",{staticClass:"hashtag-heading"},[e("div",{staticClass:"hashtag-heading__text"},[e("Icon",{attrs:{icon:"charm:hash",width:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("ハッシュタグリスト")])],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"hashtag-heading__add-button",on:{click:function(e){t.saved_twitter_hashtags.push({id:t.Utils.time(),text:"#ここにハッシュタグを入力",editing:!1})}}},[e("Icon",{attrs:{icon:"fluent:add-12-filled",width:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("追加")])],1)]),e("draggable",{staticClass:"hashtag-container",attrs:{handle:".hashtag__sort-handle"},model:{value:t.saved_twitter_hashtags,callback:function(e){t.saved_twitter_hashtags=e},expression:"saved_twitter_hashtags"}},t._l(t.saved_twitter_hashtags,(function(s){return e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple",value:!s.editing,expression:"!hashtag.editing"}],key:s.id,staticClass:"hashtag",class:{"hashtag--editing":s.editing},on:{click:function(e){return t.clickHashtag(s)}}},[e("input",{directives:[{name:"model",rawName:"v-model",value:s.text,expression:"hashtag.text"}],staticClass:"hashtag__input",attrs:{type:"search",spellcheck:"false",disabled:!s.editing},domProps:{value:s.text},on:{click:function(t){t.stopPropagation()},input:function(e){e.target.composing||t.$set(s,"text",e.target.value)}}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"hashtag__edit-button",on:{click:function(e){e.preventDefault(),e.stopPropagation(),s.editing=!s.editing,s.text=t.formatHashtag(s.text,!0),t.updateTweetLetterCount()}}},[e("Icon",{attrs:{icon:s.editing?"fluent:checkmark-16-filled":"fluent:edit-16-filled",width:"17px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"hashtag__delete-button",on:{click:function(e){e.preventDefault(),e.stopPropagation(),t.saved_twitter_hashtags.splice(t.saved_twitter_hashtags.indexOf(s),1)}}},[e("Icon",{attrs:{icon:"fluent:delete-16-filled",width:"17px"}})],1),e("div",{staticClass:"hashtag__sort-handle"},[e("Icon",{attrs:{icon:"material-symbols:drag-handle-rounded",width:"17px"}})],1)])})),0)],1),e("div",{staticClass:"twitter-account-list",class:{"twitter-account-list--display":t.is_twitter_account_list_display}},t._l(t.userStore.user?t.userStore.user.twitter_accounts:[],(function(s){return e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],key:s.id,staticClass:"twitter-account",on:{click:function(e){return t.updateSelectedTwitterAccount(s)}}},[e("img",{staticClass:"twitter-account__icon",attrs:{src:s.icon_url}}),e("div",{staticClass:"twitter-account__info"},[e("div",{staticClass:"twitter-account__name"},[t._v(t._s(s.name))]),e("div",{staticClass:"twitter-account__screen-name"},[t._v("@"+t._s(s.screen_name))])]),e("Icon",{directives:[{name:"show",rawName:"v-show",value:s.id===t.settingsStore.settings.selected_twitter_account_id,expression:"twitter_account.id === settingsStore.settings.selected_twitter_account_id"}],staticClass:"twitter-account__check",attrs:{icon:"fluent:checkmark-16-filled",width:"24px"}})],1)})),0)],1)},$i=[function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"capture-announce__text"},[e("p",{staticClass:"mt-0 mb-0"},[t._v("プレイヤーのキャプチャボタンやショートカットキーでキャプチャを撮ると、ここに表示されます。")]),e("p",{staticClass:"mt-2 mb-0"},[t._v("表示されたキャプチャを選択してからツイートすると、キャプチャを付けてツイートできます。")])])}],zi=s(9980),Ai=s.n(zi),Di=o["default"].extend({name:"Panel-TwitterTab",components:{draggable:Ai()},props:{player:{type:null,required:!0},is_virtual_keyboard_display:{type:Boolean,required:!0}},data(){return{Utils:pt,is_logged_in_twitter:!1,selected_twitter_account:null,is_twitter_account_list_display:!1,saved_twitter_hashtags:st().settings.saved_twitter_hashtags.map(((t,e)=>({id:pt.time()+e,text:t,editing:!1}))),is_hashtag_list_display:!1,twitter_active_tab:st().settings.twitter_active_tab,zoom_capture_modal:!1,zoom_capture:null,captures:[],captures_element:null,is_tweet_hashtag_form_focused:!1,is_tweet_text_form_focused:!1,tweet_hashtag:"",tweet_text:"",tweet_captures:[],tweet_letter_count:140,is_tweet_sending:!1}},computed:{...(0,a.Kc)(Gs,st,R)},async created(){if(await this.userStore.fetchUser(),!0===this.userStore.is_logged_in&&this.userStore.user&&this.userStore.user.twitter_accounts.length>0){this.is_logged_in_twitter=!0,null!==this.settingsStore.settings.selected_twitter_account_id&&this.userStore.user.twitter_accounts.some((t=>t.id===this.settingsStore.settings.selected_twitter_account_id))||(this.settingsStore.settings.selected_twitter_account_id=this.userStore.user.twitter_accounts[0].id);const t=this.userStore.user.twitter_accounts.findIndex((t=>t.id===this.settingsStore.settings.selected_twitter_account_id));this.selected_twitter_account=this.userStore.user.twitter_accounts[t]}this.tweet_hashtag=this.formatHashtag(this.tweet_hashtag),this.updateTweetLetterCount()},beforeDestroy(){for(const t of this.captures)URL.revokeObjectURL(t.image_url)},watch:{saved_twitter_hashtags:{deep:!0,handler(){this.settingsStore.settings.saved_twitter_hashtags=this.saved_twitter_hashtags.map((t=>t.text))}}},methods:{updateTweetLetterCount(){this.tweet_letter_count=140-[...this.tweet_hashtag].length-[...this.tweet_text].length},pasteClipboardData(t){if(null!==t.clipboardData)for(const e of t.clipboardData.items)if(e.type.startsWith("image/")){const t=e.getAsFile();t&&this.addCaptureList(t,t.name)}},clickHashtagListButton(){this.is_hashtag_list_display=!this.is_hashtag_list_display;for(const t of this.saved_twitter_hashtags)t.editing=!1},clickHashtag(t){this.tweet_hashtag=t.text,this.tweet_hashtag=this.formatHashtag(this.tweet_hashtag),this.updateTweetLetterCount(),window.setTimeout((()=>this.is_hashtag_list_display=!1),150)},clickAccountButton(){if(!this.is_logged_in_twitter)return document.fullscreenElement&&document.exitFullscreen(),void this.$router.push({path:"/settings/twitter"});this.is_twitter_account_list_display=!this.is_twitter_account_list_display,!0===this.is_twitter_account_list_display&&(this.is_hashtag_list_display=!1)},updateSelectedTwitterAccount(t){this.settingsStore.settings.selected_twitter_account_id=t.id,this.selected_twitter_account=t,window.setTimeout((()=>this.is_twitter_account_list_display=!1),150)},clickCapture(t){if(this.tweet_captures.length<4&&!1===t.selected)t.selected=!0,this.tweet_captures.push(t.blob);else{const e=this.tweet_captures.findIndex((e=>e===t.blob));e>-1&&this.tweet_captures.splice(e,1),t.selected=!1}},async addCaptureList(t,e){null===this.captures_element&&(this.captures_element=this.$el.querySelector(".tab-content--capture")),this.captures.length>50&&(URL.revokeObjectURL(this.captures[0].image_url),this.captures.shift());const s=URL.createObjectURL(t);this.captures.push({blob:t,filename:e,image_url:s,selected:!1,focused:!1}),this.$nextTick((()=>{null!==this.captures_element&&this.captures_element.scrollTo({top:this.captures_element.scrollHeight,behavior:"smooth"})}))},async drawProgramTitleOnCapture(t){const e=await createImageBitmap(t),s="OffscreenCanvas"in window?new OffscreenCanvas(e.width,e.height):document.createElement("canvas"),i=s.getContext("2d",{alpha:!1,desynchronized:!0,willReadFrequently:!1});i.drawImage(e,0,0),e.close(),i.font='bold 22px "YakuHanJPs", "Open Sans", "Hiragino Sans", "Noto Sans JP", sans-serif',i.fillStyle="rgba(255, 255, 255, 70%)",i.shadowColor="rgba(0, 0, 0, 100%)",i.shadowBlur=4,i.shadowOffsetX=0,i.shadowOffsetY=0;const a=this.channelsStore.channel.current.program_present?.title??"放送休止";switch(this.settingsStore.settings.tweet_capture_watermark_position){case"TopLeft":i.textAlign="left",i.textBaseline="top",i.fillText(a,16,12);break;case"TopRight":i.textAlign="right",i.textBaseline="top",i.fillText(a,s.width-16,12);break;case"BottomLeft":i.textAlign="left",i.textBaseline="bottom",i.fillText(a,16,s.height-12);break;case"BottomRight":i.textAlign="right",i.textBaseline="bottom",i.fillText(a,s.width-16,s.height-12);break}return s instanceof OffscreenCanvas?await s.convertToBlob({type:"image/jpeg",quality:1}):new Promise(((t,e)=>s.toBlob((s=>{null===s?e():t(s)}),"image/jpeg",1)))},getChannelHashtag(t){return t.startsWith("NHK総合")?"#nhk":t.startsWith("NHKEテレ")?"#etv":t.startsWith("日テレ")?"#ntv":t.startsWith("読売テレビ")?"#ytv":t.startsWith("中京テレビ")?"#chukyotv":t.startsWith("テレビ朝日")?"#tvasahi":t.startsWith("ABCテレビ")?"#abc":t.startsWith("メ~テレ")?"#nagoyatv":t.startsWith("TBS")&&!t.includes("TBSチャンネル")?"#tbs":t.startsWith("MBS")?"#mbs":t.startsWith("CBC")?"#cbc":t.startsWith("テレビ東京")?"#tvtokyo":t.startsWith("テレビ大阪")?"#tvo":t.startsWith("テレビ愛知")?"#tva":t.startsWith("フジテレビ")?"#fujitv":t.startsWith("関西テレビ")?"#kantele":t.startsWith("東海テレビ")?"#tokaitv":t.startsWith("TOKYO MX")?"#tokyomx":t.startsWith("tvk")?"#tvk":t.startsWith("チバテレ")?"#chibatv":t.startsWith("テレ玉")?"#teletama":t.startsWith("サンテレビ")?"#suntv":t.startsWith("KBS京都")?"#kbs":t.startsWith("NHKBS1")?"#nhkbs1":t.startsWith("NHKBSプレミアム")?"#nhkbsp":t.startsWith("BS日テレ")?"#bsntv":t.startsWith("BS朝日")?"#bsasahi":t.startsWith("BS-TBS")?"#bstbs":t.startsWith("BSテレ東")?"#bstvtokyo":t.startsWith("BSフジ")?"#bsfuji":t.startsWith("BS11イレブン")?"#bs11":t.startsWith("BS12トゥエルビ")?"#bs12":t.startsWith("AT-X")?"#at_x":null},formatHashtag(t,e=!1){const s=t.trim().replaceAll("♯","#").replaceAll("#","#").replace(/#{2,}/g,"#").replaceAll(" "," ").replaceAll(/ +/g," ").split(" ").filter((t=>""!==t));for(let i in s)s[i].startsWith("#")||(s[i]=`#${s[i]}`);if(!0===this.settingsStore.settings.auto_add_watching_channel_hashtag&&!1===e){const t=this.getChannelHashtag(this.channelsStore.channel.current.name);null!==t&&!1===s.includes(t)&&s.push(t)}return s.join(" ")},async sendTweet(){if(null===this.selected_twitter_account)return;if(!0===this.is_tweet_sending)return;this.is_tweet_sending=!0,this.tweet_hashtag=this.formatHashtag(this.tweet_hashtag),this.updateTweetLetterCount();const t=this.tweet_hashtag;let e=this.tweet_text;if(""!==t)switch(this.settingsStore.settings.tweet_hashtag_position){case"Prepend":e=`${t} ${this.tweet_text}`;break;case"Append":e=`${this.tweet_text} ${t}`;break;case"PrependWithLineBreak":e=`${t}\n${this.tweet_text}`;break;case"AppendWithLineBreak":e=`${this.tweet_text}\n${t}`;break}const s=[];for(let i of this.tweet_captures)"None"!==this.settingsStore.settings.tweet_capture_watermark_position&&(i=await this.drawProgramTitleOnCapture(i)),s.push(i);zs.sendTweet(this.selected_twitter_account.screen_name,e,s).then((t=>{this.player.notice(t.message,void 0,void 0,t.is_error?"#FF6F6A":void 0)}));for(const i of this.captures)i.selected=!1,i.focused=!1;this.tweet_captures=[],this.tweet_text="",this.is_tweet_sending=!1,!0===this.settingsStore.settings.fold_panel_after_sending_tweet&&(this.$emit("panel_folding_requested"),this.$refs.tweet_text.blur())}}}),Li=Di,Ni=(0,p.Z)(Li,Pi,$i,!1,null,"51116497",null),Ei=Ni.exports,Ki=(s(23767),s(8585),s(68696),s(59908)),Hi=s(88488);class Mi{static async uploadCapture(t,e){const s=new FormData;s.append("image",t,e);const i=await G.post("/captures",s,{headers:{"Content-Type":"multipart/form-data"}});if("is_error"in i)switch(i.error.message){case"Permission denied to save the file":N.error("キャプチャのアップロードに失敗しました。保存先フォルダに書き込み権限がありません。");break;case"No space left on the device":N.error("キャプチャのアップロードに失敗しました。保存先フォルダに空き容量がありません。");break;case"Unexpected error occurred while saving the file":N.error("キャプチャのアップロードに失敗しました。保存中に予期しないエラーが発生しました。");break;default:G.showGenericError(i,"キャプチャのアップロードに失敗しました。");break}else;}}var Fi=Mi;let Vi=null,Ri=null;class Ui{constructor(t){this.settings_store=st(),this.player=t.player,this.player_container=this.player.container,this.captured_callback=t.captured_callback,this.player_container.querySelector(".dplayer-icons.dplayer-icons-right").insertAdjacentHTML("afterbegin",'\n
\n \n \n \n
\n '),this.player_container.querySelector(".dplayer-icons.dplayer-icons-right").insertAdjacentHTML("afterbegin",'\n
\n \n \n \n
\n '),this.comment_capture_button=this.player_container.querySelector(".dplayer-comment-capture-icon"),this.capture_button=this.player_container.querySelector(".dplayer-capture-icon"),(async()=>{const t="https://cdn.jsdelivr.net/npm/noto-sans-japanese@1.0.0/fonts/NotoSansJP-Bold.woff2",e="https://cdn.jsdelivr.net/npm/open-sans-all@0.1.3/fonts/open-sans-700.woff2",s="data:font/woff2;base64,";if(null===Vi){const e=(await G.get(t,{responseType:"arraybuffer"})).data;Vi=s+D.Buffer.from(e).toString("base64")}if(null===Ri){const t=(await G.get(e,{responseType:"arraybuffer"})).data;Ri=s+D.Buffer.from(t).toString("base64")}})()}async captureAndSave(t){const e=pt.time(),s=Gs(),i=s.is_showing_live?s.channel.current:null;if(null!==i&&!0===i.is_radiochannel)return void this.player.notice("ラジオチャンネルはキャプチャできません。",void 0,void 0,"#FF6F6A");if(0===this.player.video.videoWidth&&0===this.player.video.videoHeight)return void this.player.notice("読み込み中はキャプチャできません。",void 0,void 0,"#FF6F6A");if(!0===t&&!1===this.player.danmaku.showing)return void this.player.notice("コメントを付けてキャプチャするには、コメント表示をオンにしてください。",void 0,void 0,"#FF6F6A");this.addHighlight(t);const a=`Capture_${rt()().format("YYYYMMDD-HHmmss")}`,n=`${a}.jpg`,r=`${a}_caption.jpg`,o=this.player.plugins.aribb24Caption,l=this.player.plugins.aribb24Superimpose,c=o.getRawCanvas(),_=l.getRawCanvas(),d=!0===o.isShowing&&o.isPresent(),u=!0===l.isShowing&&l.isPresent(),m=d?o.getTextContent():null;let p;p=null!==i?{network_id:i.network_id,service_id:i.service_id,event_id:i.program_present?.event_id??-1,title:i.program_present?.title??"放送休止",description:i.program_present?.description??"",start_time:i.program_present?.start_time??"2000-01-01T00:00:00+09:00",end_time:i.program_present?.end_time??"2000-01-01T00:00:00+09:00",duration:i.program_present?.duration??0,caption_text:m,is_caption_composited:!1,is_comment_composited:!1}:{network_id:-1,service_id:-1,event_id:-1,title:"録画番組",description:"",start_time:"2000-01-01T00:00:00+09:00",end_time:"2000-01-01T00:00:00+09:00",duration:0,caption_text:m,is_caption_composited:!1,is_comment_composited:!1};const h=async(t,e,s)=>{const i=pt.time();let a;try{a=await this.exportToBlob(t)}catch(n){return console.log(n),this.player.notice("キャプチャの保存に失敗しました。",void 0,void 0,"#FF6F6A"),!1}return console.log("[CaptureManager] Export to Blob:",pt.mathFloor(pt.time()-i,3),"sec"),a=await this.setEXIFDataToCapture(a,s),["Browser","Both"].includes(this.settings_store.settings.capture_save_mode)&&pt.downloadBlobData(a,e),["UploadServer","Both"].includes(this.settings_store.settings.capture_save_mode)&&Fi.uploadCapture(a,e),a};let g=null,v=null;const f=await createImageBitmap(this.player.video);if(!1!==t||!1!==u||!1!==d&&"VideoOnly"!==this.settings_store.settings.capture_caption_mode){const e=[],s="OffscreenCanvas"in window?new OffscreenCanvas(this.player.video.videoWidth,this.player.video.videoHeight):document.createElement("canvas");s.width=this.player.video.videoWidth,s.height=this.player.video.videoHeight;const i=s.getContext("2d",{alpha:!1,desynchronized:!0,willReadFrequently:!1});i.drawImage(f,0,0,s.width,s.height),!0===u&&i.drawImage(_,0,0,s.width,s.height);let a=null;!0===t&&(a=await this.createCommentsImage(),await this.drawComments(s,i,a)),(["VideoOnly","Both"].includes(this.settings_store.settings.capture_caption_mode)||!1===d)&&e.push((async()=>{const e="CompositingCaption"===this.settings_store.settings.capture_caption_mode?r:n,i=await h(s,e,{...p,is_caption_composited:!1,is_comment_composited:t});g=!1!==i&&{blob:i,filename:e},!1!==g&&this.captured_callback(g.blob,g.filename)})()),["CompositingCaption","Both"].includes(this.settings_store.settings.capture_caption_mode)&&!0===d&&e.push((async()=>{!0===t&&(i.drawImage(f,0,0,s.width,s.height),!0===u&&i.drawImage(_,0,0,s.width,s.height)),f.close(),i.drawImage(c,0,0,s.width,s.height),!0===t&&null!==a&&await this.drawComments(s,i,a);const e=await h(s,r,{...p,is_caption_composited:!0,is_comment_composited:t});if(v=!1!==e&&{blob:e,filename:r},!1!==v){if("Both"===this.settings_store.settings.capture_caption_mode)while(null===g)await pt.sleep(.01);this.captured_callback(v.blob,v.filename)}})()),await Promise.all(e)}else{const t="OffscreenCanvas"in window?new OffscreenCanvas(f.width,f.height):document.createElement("canvas");t.width=f.width,t.height=f.height;const e=t.getContext("bitmaprenderer",{alpha:!1});e.transferFromImageBitmap(f),f.close();const s="CompositingCaption"===this.settings_store.settings.capture_caption_mode?r:n,i=await h(t,s,{...p,is_caption_composited:!1,is_comment_composited:!1});g=!1!==i&&{blob:i,filename:s},!1!==g&&this.captured_callback(g.blob,g.filename)}console.log("[CaptureManager] Total:",pt.mathFloor(pt.time()-e,3),"sec"),this.removeHighlight(t);for(const y of[g,v])if(this.settings_store.settings.capture_copy_to_clipboard&&null!==y&&"object"===typeof y)try{await(0,Ki.FH)(await(0,Ki.BD)(y.blob))}catch(w){this.player.notice("クリップボードへのキャプチャのコピーに失敗しました。",void 0,void 0,"#FF6F6A"),console.error(w)}}addHighlight(t=!1){t?this.comment_capture_button.classList.add("dplayer-capturing"):this.capture_button.classList.add("dplayer-capturing")}removeHighlight(t=!1){t?this.comment_capture_button.classList.remove("dplayer-capturing"):this.capture_button.classList.remove("dplayer-capturing")}async commentsHTMLtoSVGImage(t,e,s){const i="http://www.w3.org/2000/svg",a=document.createElementNS(i,"svg");a.setAttribute("width",`${e}`),a.setAttribute("height",`${s}`),a.setAttribute("viewBox",`0 0 ${e} ${s}`);const n=document.createElementNS(i,"foreignObject");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("externalResourcesRequired","true"),a.appendChild(n);const r=document.createElement("body");n.appendChild(r);const o=document.createElement("style");o.appendChild(document.createTextNode(`\n @font-face {\n font-family: 'Noto Sans JP';\n font-weight: bold;\n src: url(${Vi}) format('woff2');\n }\n @font-face {\n font-family: 'Open Sans';\n font-weight: bold;\n src: url(${Ri}) format('woff2');\n }\n .dplayer-danmaku {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: #fff;\n font-size: 29px;\n font-family: 'Open Sans', 'Hiragino Sans', 'Noto Sans JP', sans-serif;\n }\n .dplayer-danmaku .dplayer-danmaku-item {\n display: inline-block;\n line-height: 1;\n font-weight: bold;\n font-size: var(--dplayer-danmaku-font-size);\n opacity: var(--dplayer-danmaku-opacity);\n text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\n white-space: nowrap;\n }\n .dplayer-danmaku .dplayer-danmaku-item--demo {\n position: absolute;\n visibility: hidden;\n }\n .dplayer-danmaku .dplayer-danmaku-item span {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big {\n font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small {\n font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\n }\n .dplayer-danmaku .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n }\n .dplayer-danmaku .dplayer-danmaku-top, .dplayer-danmaku .dplayer-danmaku-bottom {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n `)),r.appendChild(o);const l=document.createElement("div");l.innerHTML=t,r.appendChild(l.childNodes[0]);const c=new Image,_=(new XMLSerializer).serializeToString(a);return c.src=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(_)}`,await new Promise(((t,e)=>{c.onload=t,c.onerror=e})),await c.decode(),c}async createCommentsImage(){let t=this.player.template.danmaku.outerHTML;for(const e of this.player_container.querySelectorAll(".dplayer-danmaku-move")){const s=e.getBoundingClientRect().left-this.player.video.getBoundingClientRect().left;t=t.replace(/transform: translateX\(.*?\);/,`left: ${s}px;`).replaceAll("border: 2px solid #E64F97;","")}return await this.commentsHTMLtoSVGImage(t,this.player.template.danmaku.offsetWidth,this.player.template.danmaku.offsetHeight)}async drawComments(t,e,s){const i=t.width/this.player.template.danmaku.offsetWidth,a=this.player.template.danmaku.offsetHeight*i;e.drawImage(s,0,0,t.width,a)}async exportToBlob(t){if("OffscreenCanvas"in window&&t instanceof OffscreenCanvas)return await t.convertToBlob({type:"image/jpeg",quality:.99});if(t instanceof HTMLCanvasElement)return new Promise(((e,s)=>{t.toBlob((t=>{null!==t?e(t):s(new Error("Failed to convert canvas to blob"))}),"image/jpeg",.99)}));throw new Error("Failed to convert canvas to blob")}async setEXIFDataToCapture(t,e){const s=rt()().diff(rt()(e.start_time),"second",!0),i={captured_at:rt()().format("YYYY-MM-DDTHH:mm:ss+09:00"),captured_playback_position:s,network_id:e.network_id,service_id:e.service_id,event_id:e.event_id,title:e.title,description:e.description,start_time:e.start_time,end_time:e.end_time,duration:e.duration,caption_text:e.caption_text,is_caption_composited:e.is_caption_composited,is_comment_composited:e.is_comment_composited},a=rt()().format("YYYY:MM:DD HH:mm:ss"),n={"0th":{[Hi.TagValues.ImageIFD.XResolution]:[72,1],[Hi.TagValues.ImageIFD.YResolution]:[72,1],[Hi.TagValues.ImageIFD.ResolutionUnit]:2,[Hi.TagValues.ImageIFD.YCbCrPositioning]:1,[Hi.TagValues.ImageIFD.DateTime]:a,[Hi.TagValues.ImageIFD.Software]:`KonomiTV version ${pt.version}`,[Hi.TagValues.ImageIFD.XPComment]:[...D.Buffer.from(JSON.stringify(i),"ucs2")]},Exif:{[Hi.TagValues.ExifIFD.ExifVersion]:"0230",[Hi.TagValues.ExifIFD.ComponentsConfiguration]:"\0",[Hi.TagValues.ExifIFD.FlashpixVersion]:"0100",[Hi.TagValues.ExifIFD.ColorSpace]:1,[Hi.TagValues.ExifIFD.DateTimeOriginal]:a,[Hi.TagValues.ExifIFD.DateTimeDigitized]:a}},r=Hi.dump(n),o=await new Promise(((e,s)=>{const i=new FileReader;i.onload=()=>e(i.result),i.onerror=s,i.readAsBinaryString(t)})),l=Hi.insert(r,o),c=new Uint8Array(l.length);for(let _=0;_"")):JSON.parse(window.sessionStorage.getItem("KonomiTV-BMLBrowser-Greg")),e[t]??""},setReg(t,e){let s;s=null===window.sessionStorage.getItem("KonomiTV-BMLBrowser-Greg")?[...new Array(64)].map((t=>"")):JSON.parse(window.sessionStorage.getItem("KonomiTV-BMLBrowser-Greg")),s[t]=e,window.sessionStorage.setItem("KonomiTV-BMLBrowser-Greg",JSON.stringify(s))}},epg:{tune(s,i,a){if(t.channel.current.network_id===s&&t.channel.current.service_id===a)return(async()=>{await e.destroy(),await e.init()})(),!0;for(const e of Object.values(t.channels_list))for(const t of e)if(t.network_id===s&&t.service_id===a)return pt.sleep(.3).then((()=>_a.push({path:`/tv/watch/${t.display_channel_id}`}))),!0;return console.error(`[LiveDataBroadcastingManager] Channel not found (network_id: ${s} / service_id: ${a})`),e.player.notice(`切り替え先のチャンネルが見つかりませんでした。(network_id: ${s} / service_id: ${a})`,3e3,void 0,"#FF6F6A"),pt.sleep(3).then((async()=>{await e.destroy(),await e.init()})),!1}},ip:{getConnectionType(){return 403},isIPConnected(){return 0}},showErrorMessage(t,s,i){e.player.notice(`${t}
${s} (${i})`,3e3,void 0,"#FF6F6A")}}),"f"),this.bml_browser_width=960,this.bml_browser_height=540,console.log("[LiveDataBroadcastingManager] BMLBrowser initialized."),(0,Wi.Q_)(this,Gi,"f").addEventListener("load",(t=>{console.log("[LiveDataBroadcastingManager] BMLBrowser: load",t.detail),this.bml_browser_width=t.detail.resolution.width,this.bml_browser_height=t.detail.resolution.height,this.container_element?.style.setProperty("--bml-browser-width",`${this.bml_browser_width}px`),this.container_element?.style.setProperty("--bml-browser-height",`${this.bml_browser_height}px`),this.calculateBMLBrowserScaleFactor(this.player.template.videoWrap.clientWidth,this.player.template.videoWrap.clientHeight),this.moveVideoElementToBMLBrowser()})),(0,Wi.Q_)(this,Gi,"f").addEventListener("invisible",(t=>{!0===t.detail?(console.log("[LiveDataBroadcastingManager] BMLBrowser: invisible"),this.moveVideoElementToDPlayer()):(console.log("[LiveDataBroadcastingManager] BMLBrowser: visible"),this.moveVideoElementToBMLBrowser())})),(0,Wi.Q_)(this,Gi,"f").addEventListener("usedkeylistchanged",(t=>{this.is_bml_browser_using_numeric_key=[...t.detail.usedKeyList].includes("numeric-tuning")})),this.resize_observer=new ResizeObserver((t=>{const e=t[0];this.calculateBMLBrowserScaleFactor(e.contentRect.width,e.contentRect.height)})),this.resize_observer.observe(this.player.template.videoWrap)}const s=at.extractAPIQualityFromDPlayer(this.player),i=`${pt.api_base_url}/streams/live/${this.display_channel_id}/${s}/psi-archived-data`;this.live_psi_archived_data_decoder=await new ta(i),this.live_psi_archived_data_decoder.run(Yi.sj((async e=>{if("pmt"===e.type&&null!==(0,Wi.Q_)(this,Gi,"f")){const t=e.components.some((t=>void 0!==t.bxmlInfo));console.log("[LiveDataBroadcastingManager] BMLBrowser: "+(t?"available":"unavailable")),!1===t?(this.toggleRemoconButtonsLoading(!1),this.toggleRemoconButtonsEnabled(!1)):this.toggleRemoconButtonsEnabled(!0)}if("programInfo"===e.type&&null!=t.channel.current.program_present&&(e.eventId&&(t.channel.current.program_present.event_id=e.eventId),e.eventName&&(t.channel.current.program_present.title=mt.formatString(e.eventName)),e.startTimeUnixMillis)){const s=mt.convertTimestampToISO8601(e.startTimeUnixMillis);t.channel.current.program_present.start_time=s,e.durationSeconds?(t.channel.current.program_present.end_time=rt()(s).add(e.durationSeconds,"seconds").toISOString(),t.channel.current.program_present.duration=e.durationSeconds):(t.channel.current.program_present.end_time=s,t.channel.current.program_present.duration=-1)}null!==(0,Wi.Q_)(this,Gi,"f")&&(0,Wi.Q_)(this,Gi,"f").emitMessage(e)})))}initRemoconButtons(){const t=Gs();this.remocon_button_event_abort_controller=new AbortController;const e=this.remocon_element.querySelectorAll("button");for(const s of e)s.addEventListener("click",(async()=>{const e=parseInt(s.dataset.aribKeyCode),i=s.dataset.remoconId?parseInt(s.dataset.remoconId):null;if(null===i||!1!==this.is_bml_browser_using_numeric_key)null!==(0,Wi.Q_)(this,Gi,"f")&&(10===i&&((0,Wi.Q_)(this,Gi,"f").content.processKeyDown(Ji.I5.Digit0),(0,Wi.Q_)(this,Gi,"f").content.processKeyUp(Ji.I5.Digit0),await pt.sleep(.1)),(0,Wi.Q_)(this,Gi,"f").content.processKeyDown(e),(0,Wi.Q_)(this,Gi,"f").content.processKeyUp(e));else{const e=t.channel.current.type,s=t.getChannelByRemoconID(e,i);null!==s&&s.display_channel_id!==t.display_channel_id&&_a.push({path:`/tv/watch/${s.display_channel_id}`})}}),{signal:this.remocon_button_event_abort_controller.signal})}toggleRemoconButtonsLoading(t){!0===t?this.remocon_data_broadcasting_element.classList.add("remote-control-data-broadcasting--loading"):this.remocon_data_broadcasting_element.classList.remove("remote-control-data-broadcasting--loading")}toggleRemoconButtonsEnabled(t){!0===t?this.remocon_data_broadcasting_element.classList.remove("remote-control-data-broadcasting--disabled"):this.remocon_data_broadcasting_element.classList.add("remote-control-data-broadcasting--disabled")}calculateBMLBrowserScaleFactor(t,e){const s=t/(16*this.bml_browser_height/9),i=e/this.bml_browser_height,a=Math.min(s,i),n=16*this.bml_browser_height/9/this.bml_browser_width;this.container_element?.style.setProperty("--bml-browser-scale-factor-width",""+a*n),this.container_element?.style.setProperty("--bml-browser-scale-factor-height",`${a}`)}moveVideoElementToBMLBrowser(){if(!this.is_bml_browser_destroying&&null!==(0,Wi.Q_)(this,Gi,"f")?.getVideoElement()){(0,Wi.Q_)(this,Gi,"f")?.getVideoElement()?.firstElementChild instanceof HTMLParagraphElement&&(0,Wi.Q_)(this,Gi,"f")?.getVideoElement()?.firstElementChild?.remove(),(0,Wi.Q_)(this,Gi,"f")?.getVideoElement()?.appendChild(this.media_element),this.media_element.style.width="100%",this.media_element.style.height="100%";for(const t of this.media_element.children)if(t.style.display="block",t.style.visibility="visible",t instanceof HTMLVideoElement)if(t.style.width="100%",t.style.height="100%",this.bml_browser_width/this.bml_browser_height!==16/9){const e=16*this.bml_browser_height/9/this.bml_browser_width;t.style.transform=`scaleY(${e})`,t.style.transformOrigin="center center"}else t.style.transform="",t.style.transformOrigin="";this.is_video_element_moved_to_bml_browser=!0}}moveVideoElementToDPlayer(){if(!this.is_bml_browser_destroying&&!1!==this.is_video_element_moved_to_bml_browser){null!==this.container_element&&this.player.template.videoWrap.insertBefore(this.media_element,this.container_element.nextElementSibling),this.media_element.style.width="",this.media_element.style.height="";for(const t of this.media_element.children)t.style.display="",t.style.visibility="",t instanceof HTMLVideoElement&&(t.style.width="",t.style.height="",t.style.transform="",t.style.transformOrigin="");this.is_video_element_moved_to_bml_browser=!1}}async destroy(){null!==this.live_psi_archived_data_decoder&&(this.live_psi_archived_data_decoder.destroy(),this.live_psi_archived_data_decoder=null),null!==this.remocon_button_event_abort_controller&&(this.remocon_button_event_abort_controller.abort(),this.remocon_button_event_abort_controller=null),null!==(0,Wi.Q_)(this,Gi,"f")&&(this.toggleRemoconButtonsEnabled(!1),this.toggleRemoconButtonsLoading(!0),null!==this.resize_observer&&(this.resize_observer.disconnect(),this.resize_observer=null),this.moveVideoElementToDPlayer(),this.is_bml_browser_destroying=!0,await(0,Wi.Q_)(this,Gi,"f").destroy(),this.is_bml_browser_destroying=!1,(0,Wi.YH)(this,Gi,null,"f"),console.log("[LiveDataBroadcastingManager] BMLBrowser destroyed."),this.container_element?.remove())}}Gi=new WeakMap,ea.round_gothic={source:'url("https://cdn.jsdelivr.net/gh/googlefonts/kosugi-maru@main/fonts/webfonts/KosugiMaru-Regular.woff2"), local("sans-serif")'},ea.square_gothic={source:'url("https://cdn.jsdelivr.net/gh/googlefonts/kosugi@main/fonts/webfonts/Kosugi-Regular.woff2"), local("sans-serif")'};var sa=ea;const ia=.7,aa=5;var na=o["default"].extend({name:"TV-Watch",components:{BottomNavigation:Lt,Channel:di,Comment:wi,Program:Si,Remocon:Bi,Twitter:Ei},data(){return{Utils:pt,ProgramUtils:mt,time:rt()().format("YYYY/MM/DD HH:mm:ss"),tv_panel_active_tab:st().settings.tv_panel_active_tab,background_url:"",is_loading:!0,is_video_buffering:!0,is_background_display:!1,is_control_display:!0,is_remocon_display:!1,is_panel_display:(()=>{const t=st();switch(t.settings.panel_display_state){case"AlwaysDisplay":return!0;case"AlwaysFold":return!1;case"RestorePreviousState":return t.settings.showed_panel_last_time}})(),is_fullscreen:!1,is_ime_composing:!1,is_virtual_keyboard_display:!1,is_comment_send_just_did:!1,interval_ids:[],control_interval_id:0,is_zapping:!1,is_zapping_continuously:!1,player:null,player_can_be_destroyed:!1,is_mpegts_supported:!0===ni().isSupported()&&!1===pt.isSafari(),is_offline:!1,romsounds_context:null,romsounds_buffers:[],eventsource:null,fullscreen_handler:null,capture_manager:null,data_broadcasting_manager:null,shortcut_key_handler:null,shortcut_key_pressed_at:pt.time(),shortcut_key_modal:!1,shortcut_key_list:{left_column:[{name:"全般",icon:"fluent:home-20-filled",icon_height:"22px",shortcuts:[{name:"数字キー/テンキーに対応するリモコン番号 (1~12) の地デジチャンネルに切り替える",keys:[{name:"1~9, 0, -(=), ^(~)",icon:!1}]},{name:"数字キー/テンキーに対応するリモコン番号 (1~12) の BS チャンネルに切り替える",keys:[{name:"Shift",icon:!1},{name:"1~9, 0, -(=), ^(~)",icon:!1}]},{name:"前のチャンネルに切り替える",keys:[{name:"fluent:arrow-up-12-filled",icon:!0}]},{name:"次のチャンネルに切り替える",keys:[{name:"fluent:arrow-down-12-filled",icon:!0}]},{name:"キーボードショートカットの一覧を表示する",keys:[{name:"/(?)",icon:!1}]}]},{name:"プレイヤー",icon:"fluent:play-20-filled",icon_height:"20px",shortcuts:[{name:"再生 / 一時停止の切り替え",keys:[{name:"Space",icon:!1}]},{name:"再生 / 一時停止の切り替え (キャプチャタブ表示時)",keys:[{name:"Shift",icon:!1},{name:"Space",icon:!1}]},{name:"プレイヤーの音量を上げる",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-up-12-filled",icon:!0}]},{name:"プレイヤーの音量を下げる",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-down-12-filled",icon:!0}]},{name:"停止して0.5秒早戻し",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-left-12-filled",icon:!0}]},{name:"停止して0.5秒早送り",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-right-12-filled",icon:!0}]},{name:"フルスクリーンの切り替え",keys:[{name:"F",icon:!1}]},{name:"ライブストリームの同期",keys:[{name:"W",icon:!1}]},{name:"Picture-in-Picture の表示切り替え",keys:[{name:"E",icon:!1}]},{name:"字幕の表示切り替え",keys:[{name:"S",icon:!1}]},{name:"コメントの表示切り替え",keys:[{name:"D",icon:!1}]},{name:"映像をキャプチャする",keys:[{name:"C",icon:!1}]},{name:"映像をコメントを付けてキャプチャする",keys:[{name:"V",icon:!1}]},{name:"コメント入力フォームにフォーカスする",keys:[{name:"M",icon:!1}]},{name:"コメント入力フォームを閉じる",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"M",icon:!1}]}]}],right_column:[{name:"パネル",icon:"fluent:panel-right-20-filled",icon_height:"24px",shortcuts:[{name:"パネルの表示切り替え",keys:[{name:"P",icon:!1}]},{name:"番組情報タブを表示する",keys:[{name:"K",icon:!1}]},{name:"チャンネルタブを表示する",keys:[{name:"L",icon:!1}]},{name:"コメントタブを表示する",keys:[{name:";(+)",icon:!1}]},{name:"Twitter タブを表示する",keys:[{name:":(*)",icon:!1}]}]},{name:"Twitter",icon:"fa-brands:twitter",icon_height:"22px",shortcuts:[{name:"ツイート検索タブを表示する",keys:[{name:"[ (「)",icon:!1}]},{name:"タイムラインタブを表示する",keys:[{name:"] (」)",icon:!1}]},{name:"キャプチャタブを表示する",keys:[{name:"\(¥)",icon:!1}]},{name:"ツイート入力フォームにフォーカスを当てる/フォーカスを外す",keys:[{name:"Tab",icon:!1}]},{name:"キャプチャにフォーカスする",keys:[{name:"キャプチャタブを表示",icon:!1},{name:"fluent:arrow-up-12-filled;fluent:arrow-down-12-filled;fluent:arrow-left-12-filled;fluent:arrow-right-12-filled",icon:!0}]},{name:"キャプチャを拡大表示する/
キャプチャの拡大表示を閉じる",keys:[{name:"キャプチャにフォーカス",icon:!1},{name:"Enter",icon:!1}]},{name:"キャプチャを選択する/
キャプチャの選択を解除する",keys:[{name:"キャプチャにフォーカス",icon:!1},{name:"Space",icon:!1}]},{name:"クリップボード内の画像を
キャプチャとして取り込む",keys:[{name:"ツイート入力
フォームにフォーカス",icon:!1},{name:pt.CtrlOrCmd(),icon:!1},{name:"V",icon:!1}]},{name:"ツイートを送信する",keys:[{name:"Twitter タブを表示",icon:!1},{name:pt.CtrlOrCmd(),icon:!1},{name:"Enter",icon:!1}]}]}]}}},computed:{...(0,a.Kc)(Gs,st)},async created(){!0===this.settingsStore.settings.tv_channel_selection_requires_alt_key&&(this.shortcut_key_list.left_column[0].shortcuts[0].keys.unshift({name:pt.AltOrOption(),icon:!1}),this.shortcut_key_list.left_column[0].shortcuts[1].keys.unshift({name:pt.AltOrOption(),icon:!1})),this.channelsStore.display_channel_id=this.$route.params.display_channel_id,"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0,navigator.virtualKeyboard.ongeometrychange=t=>{0===t.target.boundingRect.width&&0===t.target.boundingRect.height?this.is_virtual_keyboard_display=!1:this.is_virtual_keyboard_display=!0}),this.init(),this.romsounds_context=new AudioContext;for(let t=1;t<=14;t++){const e=`/assets/romsounds/${t.toString().padStart(2,"0")}.wav`,s=await G.get(e,{baseURL:"",responseType:"arraybuffer"});this.romsounds_buffers.push(await this.romsounds_context.decodeAudioData(s.data))}},beforeDestroy(){"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!1),"gr999"!==this.channelsStore.channel.current.display_channel_id&&this.destroy(!0),null!==this.romsounds_context&&this.romsounds_context.close(),this.channelsStore.display_channel_id="gr000"},beforeRouteUpdate(t,e,s){const i=this.destroy(!1,this.is_zapping_continuously);this.is_zapping_continuously=!0,this.channelsStore.display_channel_id=t.params.display_channel_id,!0===this.settingsStore.settings.reset_hashtag_when_program_switches&&(this.$refs.Twitter.tweet_hashtag=""),(async()=>{!0===this.is_zapping?(this.is_zapping=!1,this.interval_ids.push(window.setTimeout((()=>{this.is_zapping_continuously=!1,i.then((()=>this.init()))}),500))):(this.is_zapping_continuously=!1,i.then((()=>this.init())))})(),s()},watch:{"channelsStore.channel":{immediate:!0,handler(t,e){if(void 0===e)return;const s=this.$refs.Twitter;if(t.current.display_channel_id!==e.current.display_channel_id){const t=s.getChannelHashtag(e.current.name)??"";s.tweet_hashtag=s.formatHashtag(s.tweet_hashtag.replaceAll(t,"")),s.updateTweetLetterCount()}(t.current.id!==e.current.id||null!==t.current.program_present&&null===e.current.program_present||null===t.current.program_present&&null!==e.current.program_present||null!==t.current.program_present&&null!==e.current.program_present&&t.current.program_present.id!==e.current.program_present.id)&&!0===this.settingsStore.settings.reset_hashtag_when_program_switches&&(s.tweet_hashtag=s.formatHashtag(""),s.updateTweetLetterCount())}},is_panel_display(){this.settingsStore.settings.showed_panel_last_time=this.is_panel_display}},methods:{async init(){this.background_url=at.generatePlayerBackgroundURL(),this.controlDisplayTimer(),this.interval_ids.push(window.setInterval((()=>this.time=rt()().format("YYYY/MM/DD HH:mm:ss")),1e3));const t=60-(new Date).getSeconds();this.interval_ids.push(window.setTimeout((()=>{this.channelsStore.update(!0),this.update(),this.interval_ids.push(window.setInterval((()=>{this.channelsStore.update(!0),this.update()}),3e4))}),1e3*t)),await this.channelsStore.update(),this.update()},async update(){if(void 0!==this.$route.params.display_channel_id)if("gr999"!==this.channelsStore.channel.current.display_channel_id){if(null!==this.player&&!0!==this.player_can_be_destroyed||(this.initPlayer(),await this.initEventHandler(),this.initCaptureManager(),document.removeEventListener("keydown",this.shortcut_key_handler),this.initShortcutKeyHandler()),null!==this.player){if(null===this.channelsStore.channel.current.program_present||"1/0+1/0モード(デュアルモノ)"!==this.channelsStore.channel.current.program_present.primary_audio_type&&null===this.channelsStore.channel.current.program_present.secondary_audio_type){if(this.player.template.audioItem[1].classList.add("dplayer-setting-audio-item--disabled"),void 0!==this.player.plugins.mpegts||void 0!==this.player.plugins.liveLLHLSForKonomiTV){while(null===this.player)await pt.sleep(.1);this.player.template.audioItem[0].classList.add("dplayer-setting-audio-current"),this.player.template.audioItem[1].classList.remove("dplayer-setting-audio-current"),this.player.template.audioValue.textContent=this.player.tran("Primary audio");try{void 0!==this.player.plugins.mpegts&&this.player.plugins.mpegts instanceof ni().MSEPlayer&&this.player.plugins.mpegts.switchPrimaryAudio(),void 0!==this.player.plugins.liveLLHLSForKonomiTV&&this.player.plugins.liveLLHLSForKonomiTV.switchPrimaryAudio()}catch(t){}}}else this.player.template.audioItem[1].classList.remove("dplayer-setting-audio-item--disabled");if("mediaSession"in navigator){const t=[{src:"/assets/images/icons/icon-maskable-192px.png",sizes:"192x192",type:"image/png"},{src:"/assets/images/icons/icon-maskable-512px.png",sizes:"512x512",type:"image/png"}];navigator.mediaSession.metadata=new MediaMetadata({title:this.channelsStore.channel.current.program_present?.title??"放送休止",artist:this.channelsStore.channel.current.name,artwork:t}),"setPositionState"in navigator.mediaSession&&navigator.mediaSession.setPositionState({duration:0,playbackRate:1}),navigator.mediaSession.setActionHandler("play",null),navigator.mediaSession.setActionHandler("pause",null),navigator.mediaSession.setActionHandler("previoustrack",null),navigator.mediaSession.setActionHandler("nexttrack",null),navigator.mediaSession.setActionHandler("play",(()=>this.player?.play())),navigator.mediaSession.setActionHandler("pause",(()=>this.player?.pause())),navigator.mediaSession.setActionHandler("previoustrack",(async()=>{navigator.mediaSession.metadata=new MediaMetadata({title:this.channelsStore.channel.previous.program_present?.title??"放送休止",artist:this.channelsStore.channel.previous.name,artwork:t}),await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`})})),navigator.mediaSession.setActionHandler("nexttrack",(async()=>{navigator.mediaSession.metadata=new MediaMetadata({title:this.channelsStore.channel.next.program_present?.title??"放送休止",artist:this.channelsStore.channel.next.name,artwork:t}),await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.next.display_channel_id}`})}))}}}else this.$router.push({path:"/not-found/"})},controlDisplayTimer(t=null,e=!1){const s=/iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&"ontouchend"in document;if(!0===s&&null!==t&&"mousemove"===t.type)return;if(!1===s&&null!==t&&("touchmove"===t.type||"click"===t.type))return;window.clearTimeout(this.control_interval_id);const i=()=>{null!==this.player&&this.player.template.controller.classList.contains("dplayer-controller-comment")?this.control_interval_id=window.setTimeout(i,3e3):(this.is_control_display=!1,null!==this.player&&(this.player.controller.hide(),this.player.setting.hide()))};!0===s&&!0===e?this.player?.controller.isShow()?(this.is_control_display=!0,this.player.controller.show(),this.control_interval_id=window.setTimeout(i,3e3)):(this.is_control_display=!1,this.player?.controller.hide(),this.player?.setting.hide()):(this.is_control_display=!0,null!==this.player&&this.player.controller.show(),this.control_interval_id=window.setTimeout(i,3e3))},initPlayer(){if(window.mpegts=ni(),null!==this.player&&!0===this.player_can_be_destroyed){try{this.player.destroy()}catch(a){void 0!==this.player.plugins.mpegts&&this.player.plugins.mpegts.destroy()}this.player_can_be_destroyed=!1,this.player=null}const t=this.settingsStore.settings.tv_low_latency_mode?ia:aa;this.player=new(ii())({container:this.$el.querySelector(".watch-player__dplayer"),theme:"#E64F97",lang:"ja-jp",live:!0,liveSyncMinBufferSize:this.is_mpegts_supported?t-.1:0,loop:!1,airplay:!1,autoplay:!0,hotkey:!1,screenshot:!1,volume:1,video:{defaultQuality:this.channelsStore.channel.current.is_radiochannel?"48kHz/192kbps":this.settingsStore.settings.tv_streaming_quality,quality:(()=>{const t=[];if(this.channelsStore.channel.current.is_radiochannel)!0===this.is_mpegts_supported?t.push({name:"48kHz/192kbps",type:"mpegts",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/mpegts`}):t.push({name:"48kHz/192kbps",type:"live-llhls-for-KonomiTV",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/ll-hls`});else{let e="";at.isHEVCVideoSupported()&&!0===this.settingsStore.settings.tv_data_saver_mode&&(e="-hevc");for(const s of["1080p-60fps","1080p","810p","720p","540p","480p","360p","240p"])!0===this.is_mpegts_supported?t.push({name:"1080p-60fps"===s?"1080p (60fps)":s,type:"mpegts",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${s}${e}/mpegts`}):t.push({name:"1080p-60fps"===s?"1080p (60fps)":s,type:"live-llhls-for-KonomiTV",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${s}${e}/ll-hls`})}return t})()},danmaku:{user:"KonomiTV",speedRate:this.settingsStore.settings.comment_speed_rate,fontSize:this.settingsStore.settings.comment_font_size},apiBackend:{read:t=>{t.success([])},send:async t=>{this.$refs.Comment.sendComment(t)}},pluginOptions:{mpegts:{config:{enableWorker:!0,enableMSEWorker:!0===MediaSource.canConstructInDedicatedWorker,enableStashBuffer:!1,liveSync:this.settingsStore.settings.tv_low_latency_mode,liveSyncMaxLatency:3,liveSyncTargetLatency:t,liveSyncPlaybackRate:1.1}},aribb24:{normalFont:`"${this.settingsStore.settings.caption_font}", "Rounded M+ 1m for ARIB", sans-serif`,forceStrokeColor:this.settingsStore.settings.always_border_caption_text,forceBackgroundColor:(()=>{if(!0===this.settingsStore.settings.specify_caption_opacity){const t=this.settingsStore.settings.caption_opacity;return`rgba(0, 0, 0, ${t})`}})(),drcsReplacement:!0,enableRawCanvas:!0,useStroke:!0,usePUA:(()=>{const t=this.settingsStore.settings.caption_font,e=document.createElement("canvas").getContext("2d");return e.font='10px "Rounded M+ 1m for ARIB"',e.fillText("Test",0,0),e.font=`10px "${t}"`,e.fillText("Test",0,0),!!t.startsWith("Windows TV")})(),PRACallback:async t=>{if(!1===this.settingsStore.settings.tv_show_superimpose)return;"suspended"===this.romsounds_context.state&&await this.romsounds_context.resume();const e=this.romsounds_context.createBufferSource();e.buffer=this.romsounds_buffers[t];const s=this.romsounds_context.createGain();e.connect(s),s.connect(this.romsounds_context.destination),s.gain.value=3,e.start(0)}}},subtitle:{type:"aribb24"}}),window.player=this.player,this.player.controller.setAutoHide=t=>{},this.$refs.Comment.initSession(this.player,this.channelsStore.display_channel_id),this.player.template.commentInput.addEventListener("keydown",(t=>{"Enter"===t.code&&(this.is_comment_send_just_did=!0,setTimeout((()=>this.is_comment_send_just_did=!1),100))})),this.player.comment.send=()=>{null!==this.player&&(!0===this.settingsStore.settings.close_comment_form_after_sending&&this.player.template.commentInput.blur(),this.player.template.commentInput.value.replace(/^\s+|\s+$/g,"")?(this.player.danmaku.send({text:this.player.template.commentInput.value,color:this.player.container.querySelector(".dplayer-comment-setting-color input:checked").value,type:this.player.container.querySelector(".dplayer-comment-setting-type input:checked").value,size:this.player.container.querySelector(".dplayer-comment-setting-size input:checked").value},(()=>{!0===this.settingsStore.settings.close_comment_form_after_sending&&null!==this.player&&this.player.comment.hide()}),!0),this.player.template.commentInput.value=""):this.player.notice(this.player.tran("Please input danmaku content!"),void 0,void 0,"#FF6F6A"))};const e=/iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&"ontouchend"in document;if(!1===e){this.player.template.settingOriginPanel.insertAdjacentHTML("beforeend",'\n
\n キーボードショートカット\n
\n \n \n \n
\n
');const t=this.player.template.settingOriginPanel.scrollHeight;this.player.template.settingBox.style.clipPath=`inset(calc(100% - ${t}px) 0 0 round 7px)`,this.$el.querySelector(".dplayer-setting-keyboard-shortcut").addEventListener("click",(()=>{this.player?.setting.hide(),this.shortcut_key_modal=!0}))}const s=document.querySelector(".v-application");this.fullscreen_handler=()=>{this.is_fullscreen=!0===this.player?.fullScreen.isFullScreen()},void 0!==s.onfullscreenchange?s.addEventListener("fullscreenchange",this.fullscreen_handler):s.addEventListener("webkitfullscreenchange",this.fullscreen_handler),this.player.fullScreen.isFullScreen=t=>!(!document.fullscreenElement&&!document.webkitFullscreenElement),this.player.fullScreen.request=t=>{null!==this.player&&(this.player.fullScreen.isFullScreen()?this.player.fullScreen.cancel():(s.requestFullscreen=s.requestFullscreen||s.webkitRequestFullscreen,s.requestFullscreen?(s.requestFullscreen(),screen.orientation&&screen.orientation.lock("landscape").catch((()=>{}))):this.player.notice("iPhone Safari は動画のフルスクリーン表示に対応していません。",void 0,void 0,"#FF6F6A")))},this.player.fullScreen.cancel=t=>{document.exitFullscreen=document.exitFullscreen||document.webkitExitFullscreen,document.exitFullscreen&&document.exitFullscreen(),screen.orientation&&screen.orientation.unlock()};const i=()=>{this.player?.setting.hide(),this.controlDisplayTimer()};this.player.on("play",i),this.player.on("pause",i),this.player.on("quality_start",(async()=>{this.background_url=at.generatePlayerBackgroundURL(),null!==this.eventsource&&(this.eventsource.close(),this.eventsource=null),await this.initEventHandler()})),!0===this.is_mpegts_supported?this.interval_ids.push(window.setInterval((()=>{null!==this.player&&this.player.video.paused&&this.player.video.buffered.length>=1&&this.player.video.buffered.end(0)-this.player.video.currentTime>30&&this.player.sync()}),6e4)):this.interval_ids.push(window.setInterval((()=>{null!==this.player&&this.player.video.paused&&this.player.sync()}),3e4)),(async()=>{if(null!==this.player){while(void 0===this.player.plugins.aribb24Superimpose)await pt.sleep(.1);!0===this.settingsStore.settings.tv_show_superimpose?(this.player.plugins.aribb24Superimpose.show(),this.player.on("subtitle_hide",(()=>{this.player?.plugins.aribb24Superimpose.show()}))):(this.player.plugins.aribb24Superimpose.hide(),this.player.on("subtitle_show",(()=>{this.player?.plugins.aribb24Superimpose.hide()})))}})()},async initEventHandler(){if(null===this.player)return;null!==this.data_broadcasting_manager&&await this.data_broadcasting_manager.destroy(),this.data_broadcasting_manager=new sa({player:this.player,display_channel_id:this.channelsStore.channel.current.display_channel_id}),await this.data_broadcasting_manager.init(),this.is_loading=!0,this.player.video.volume=0,this.player.video.crossOrigin="anonymous",!0===this.is_mpegts_supported&&void 0!==this.player.plugins.mpegts?this.player.plugins.mpegts.on(ni().Events.ERROR,(async(t,e)=>{this.player.notice(`再生中にエラーが発生しました。(${t}: ${e}) 3秒後にリロードします。`,-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload()})):!1===this.is_mpegts_supported&&this.player.on("error",(async()=>{!0!==this.is_offline&&this.player?.video.error&&(this.player.notice(`再生中にエラーが発生しました。(${this.player.video.error.code}: ${this.player.video.error.message}) 3秒後にリロードします。`,-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload())}));const t=()=>{this.player?.video.play().catch((()=>{console.warn("HTMLVideoElement.play() rejected. run fallback.");const t='';this.player.template.playButton.innerHTML=t,this.player.template.mobilePlayButton.innerHTML=t,this.player.container.classList.remove("dplayer-paused"),this.player.container.classList.add("dplayer-playing"),this.player.danmaku.play()})),!1!==this.is_loading||this.player.video.removeEventListener("pause",t)};!1===this.is_mpegts_supported&&(this.player.video.addEventListener("pause",t),t());const e=async()=>{await pt.sleep(.5),this.player?.video.readyState<3&&(console.log("player.video.readyState < HAVE_FUTURE_DATA. trying to recover."),this.player?.video.pause(),await pt.sleep(.1),this.player?.video.play().catch((()=>{console.warn("HTMLVideoElement.play() rejected. paused."),this.player?.pause()})))},s=async()=>{if(null===this.player)return;if(this.player.video.oncanplay=null,this.player.video.oncanplaythrough=null,!0===this.is_mpegts_supported){this.player.video.playbackRate=0;const t=()=>{let t=0;return this.player.video.buffered.length>=1&&(t=this.player.video.buffered.end(0)),Math.round(1e3*(t-this.player.video.currentTime))/1e3},e=this.settingsStore.settings.tv_low_latency_mode?ia:aa;let s=t();while(sthis.is_video_buffering=!0)),this.player.video.addEventListener("playing",(()=>{this.is_video_buffering=!1,e()})),this.is_loading=!1,!1===this.is_mpegts_supported&&this.player.video.removeEventListener("pause",t),this.is_video_buffering=!1,e(),this.channelsStore.channel.current.is_radiochannel?this.is_background_display=!0:this.is_background_display=!1;const s=this.player.user.get("volume");while(this.player.video.volume+.05{const e=JSON.parse(t.data);switch(console.log(`[initial_update] Status: ${e.status} / Detail: ${e.detail}`),e.status){case"Standby":this.is_video_buffering=!0,this.is_background_display=!0;break}})),this.eventsource.addEventListener("status_update",(async t=>{if(null===this.player)return;const e=JSON.parse(t.data);switch(console.log(`[status_update] Status: ${e.status} / Detail: ${e.detail}`),this.channelsStore.updateChannel(this.channelsStore.display_channel_id,{...this.channelsStore.channel.current,viewer_count:e.client_count}),e.status){case"Standby":this.player.template.notice.textContent.includes("画質を")||this.player.notice(e.detail,-1),this.is_video_buffering=!0,this.is_background_display=!0;break;case"ONAir":this.player.template.notice.textContent.includes("画質を")||this.player.notice(this.player.template.notice.textContent,1e-6),!1===this.is_mpegts_supported&&(this.player.video.load(),this.player.video.play(),s()),this.player.container.classList.contains("dplayer-paused")&&(this.player.container.classList.remove("dplayer-paused"),this.player.container.classList.add("dplayer-playing")),document.pictureInPictureElement&&(document.exitPictureInPicture(),this.player.video.requestPictureInPicture());break;case"Idling":this.player.notice("ストリーミング接続が切断されました。3秒後にリロードします。",-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload();break;case"Restart":this.player.notice(e.detail,-1),this.player.switchVideo({url:this.player.quality.url,type:this.player.quality.type}),this.player.play(),this.is_video_buffering=!0,this.is_background_display=!0;break;case"Offline":"ライブストリームは Offline です。"===e.detail&&(this.player?.notice("ストリーミング接続が切断されました。3秒後にリロードします。",-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload()),null!==this.player&&(this.player.notice(e.detail,-1),this.player.video.onerror=()=>{this.player.notice(e.detail,-1),this.player.video.onerror=null},this.player?.danmaku?.clear(),this.player.video.pause()),null!==this.eventsource&&(this.eventsource.close(),this.eventsource=null),this.is_background_display=!0,this.is_loading=!1,this.is_video_buffering=!1,this.is_offline=!0;break}})),this.eventsource.addEventListener("detail_update",(t=>{if(null===this.player)return;const e=JSON.parse(t.data);switch(console.log(`[detail_update] Status: ${e.status} Detail:${e.detail}`),this.channelsStore.updateChannel(this.channelsStore.display_channel_id,{...this.channelsStore.channel.current,viewer_count:e.client_count}),e.status){case"Standby":this.player.notice(e.detail,-1),this.is_background_display||(this.is_background_display=!0);break}})),this.eventsource.addEventListener("clients_update",(t=>{const e=JSON.parse(t.data);this.channelsStore.updateChannel(this.channelsStore.display_channel_id,{...this.channelsStore.channel.current,viewer_count:e.client_count})}))},initShortcutKeyHandler(){const t=this.$refs.Twitter,e=t.$el.querySelector(".tweet-form__textarea");for(const s of document.querySelectorAll("input[type=text],input[type=search],textarea"))s.addEventListener("compositionstart",(()=>this.is_ime_composing=!0)),s.addEventListener("compositionend",(()=>this.is_ime_composing=!1));this.shortcut_key_handler=async s=>{const i=document.activeElement.tagName.toUpperCase(),a=document.activeElement.getAttribute("contenteditable");["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(s.code)&&"INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a&&s.preventDefault();let n=!1;s.repeat&&(n=!0);const r=pt.time();if(r-this.shortcut_key_pressed_at<.05)return;this.shortcut_key_pressed_at=r;const o=await(async()=>{if(("INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a||document.activeElement===e)&&!1===this.is_ime_composing&&"Tab"===s.code)return document.activeElement===e?(e.blur(),!0):(this.is_panel_display=!0,this.tv_panel_active_tab="Twitter",e.focus(),this.$el.scrollLeft=0,window.setTimeout((()=>{e.focus(),this.$el.scrollLeft=0}),100),!0);if(("INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a||document.activeElement===e)&&"Twitter"===this.tv_panel_active_tab&&!1===this.is_ime_composing&&(s.ctrlKey||s.metaKey||s.shiftKey)&&"Enter"===s.code)return t.$el.querySelector(".tweet-button").click(),!0;if(null!==this.player&&!s.shiftKey&&!s.altKey&&this.player.template.controller.classList.contains("dplayer-controller-comment")&&(s.ctrlKey||s.metaKey)&&"KeyM"===s.code)return this.player.comment.hide(),!0;if("INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a){if(!1===n&&!s.ctrlKey&&!s.metaKey&&(!1===this.settingsStore.settings.tv_channel_selection_requires_alt_key||s.altKey)){const t=s.shiftKey?"BS":"GR";let e=null;if("Digit1"!==s.code&&"Digit2"!==s.code&&"Digit3"!==s.code&&"Digit4"!==s.code&&"Digit5"!==s.code&&"Digit6"!==s.code&&"Digit7"!==s.code&&"Digit8"!==s.code&&"Digit9"!==s.code||(e=Number(s.code.replace("Digit",""))),"Digit0"===s.code&&(e=10),"Minus"===s.code&&(e=11),"Equal"===s.code&&(e=12),"Numpad1"!==s.code&&"Numpad2"!==s.code&&"Numpad3"!==s.code&&"Numpad4"!==s.code&&"Numpad5"!==s.code&&"Numpad6"!==s.code&&"Numpad7"!==s.code&&"Numpad8"!==s.code&&"Numpad9"!==s.code||(e=Number(s.code.replace("Numpad",""))),"Numpad0"===s.code&&(e=10),null!==e){const s=this.channelsStore.getChannelByRemoconID(t,e);if(null!==s&&s.display_channel_id!==this.channelsStore.display_channel_id)return await this.$router.push({path:`/tv/watch/${s.display_channel_id}`}),!0}}if(!1===n&&!s.ctrlKey&&!s.metaKey&&!s.shiftKey&&!s.altKey){if("Slash"===s.code)return this.shortcut_key_modal=!this.shortcut_key_modal,!0;if("KeyP"===s.code)return this.is_panel_display=!this.is_panel_display,!0;if("KeyK"===s.code)return this.tv_panel_active_tab="Program",!0;if("KeyL"===s.code)return this.tv_panel_active_tab="Channel",!0;if("Semicolon"===s.code)return this.tv_panel_active_tab="Comment",!0;if("Quote"===s.code)return this.tv_panel_active_tab="Twitter",!0;if("BracketRight"===s.code)return t.twitter_active_tab="Search",!0;if("Backslash"===s.code)return t.twitter_active_tab="Timeline",!0;if("IntlRo"===s.code)return t.twitter_active_tab="Capture",!0}if("Twitter"===this.tv_panel_active_tab&&"Capture"===t.twitter_active_tab&&!s.ctrlKey&&!s.metaKey&&!s.shiftKey&&!s.altKey){if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(s.code)){if(0===t.captures.length)return!1;if(!1===t.captures.some((t=>!0===t.focused)))return t.captures[t.captures.length-1].focused=!0,!0;const e=t.captures.findIndex((t=>!0===t.focused));if("ArrowUp"===s.code){if(e-2<0)return!1;t.captures[e-2].focused=!0}if("ArrowDown"===s.code){if(e+2>t.captures.length-1)return!1;t.captures[e+2].focused=!0}if("ArrowLeft"===s.code){if(e-1<0)return!1;t.captures[e-1].focused=!0}if("ArrowRight"===s.code){if(e+1>t.captures.length-1)return!1;t.captures[e+1].focused=!0}t.captures[e].focused=!1;const i=t.captures.find((t=>!0===t.focused));!0===t.zoom_capture_modal&&(t.zoom_capture=i);const a=t.$el.querySelector(`img[src="${i.image_url}"]`).parentElement;return n?a.scrollIntoView({block:"nearest",inline:"nearest",behavior:"auto"}):a.scrollIntoView({block:"nearest",inline:"nearest",behavior:"smooth"}),!0}if("Enter"===s.code){if(this.is_comment_send_just_did)return!1;if(!0===t.zoom_capture_modal)return t.zoom_capture_modal=!1,!0;const e=t.captures.find((t=>!0===t.focused));return void 0!==e&&(t.zoom_capture=e,t.zoom_capture_modal=!0,!0)}if("Space"===s.code){const e=t.captures.find((t=>!0===t.focused));return void 0!==e&&(t.clickCapture(e),!0)}}if(!1===n&&!s.ctrlKey&&!s.metaKey&&!s.shiftKey&&!s.altKey){if("ArrowUp"===s.code)return this.is_zapping=!0,await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`}),!0;if("ArrowDown"===s.code)return this.is_zapping=!0,await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.next.display_channel_id}`}),!0}if(null!==this.player&&!s.shiftKey&&!s.altKey){if((s.ctrlKey||s.metaKey)&&"ArrowUp"===s.code)return this.player.volume(this.player.volume()+.05),!0;if((s.ctrlKey||s.metaKey)&&"ArrowDown"===s.code)return this.player.volume(this.player.volume()-.05),!0;if((s.ctrlKey||s.metaKey)&&"ArrowLeft"===s.code)return!1===this.player.video.paused&&this.player.video.pause(),this.player.video.currentTime=this.player.video.currentTime-.5,!0;if((s.ctrlKey||s.metaKey)&&"ArrowRight"===s.code)return!1===this.player.video.paused&&this.player.video.pause(),this.player.video.currentTime=this.player.video.currentTime+.5,!0}if(null!==this.player&&!s.ctrlKey&&!s.metaKey&&!s.altKey&&!0===s.shiftKey&&"Space"===s.code&&!1===n&&"Twitter"===this.tv_panel_active_tab&&"Capture"===t.twitter_active_tab)return this.player.toggle(),!0;if(null!==this.player&&!1===n&&!s.ctrlKey&&!s.metaKey&&!s.altKey){if("Space"===s.code)return this.player.toggle(),!0;if("KeyF"===s.code)return this.player.fullScreen.toggle(),!0;if("KeyW"===s.code)return this.player.sync(),!0;if("KeyE"===s.code)return document.pictureInPictureEnabled&&this.player.template.pipButton.click(),!0;if("KeyS"===s.code)return this.player.subtitle.toggle(),this.player.subtitle.container.classList.contains("dplayer-subtitle-hide")?this.player.notice(`${this.player.tran("Hide subtitle")}`):this.player.notice(`${this.player.tran("Show subtitle")}`),!0;if("KeyD"===s.code)return this.player.template.showDanmaku.click(),this.player.template.showDanmakuToggle.checked?this.player.notice(`${this.player.tran("Show comment")}`):this.player.notice(`${this.player.tran("Hide comment")}`),!0;if("KeyC"===s.code)return await this.capture_manager.captureAndSave(!1),!0;if("KeyV"===s.code)return await this.capture_manager.captureAndSave(!0),!0;if("KeyM"===s.code)return this.player.controller.show(),this.player.comment.show(),this.controlDisplayTimer(),window.setTimeout((()=>this.player.template.commentInput.focus()),100),!0}}return!1})();!0===o&&s.preventDefault()},document.addEventListener("keydown",this.shortcut_key_handler)},initCaptureManager(){this.capture_manager=new qi({player:this.player,captured_callback:(t,e)=>{this.$refs.Twitter.addCaptureList(t,e)}});const t=this.$el.querySelector(".dplayer-icon.dplayer-capture-icon");t.addEventListener("click",(async()=>{await this.capture_manager.captureAndSave(!1)}));const e=this.$el.querySelector(".dplayer-icon.dplayer-comment-capture-icon");e.addEventListener("click",(async()=>{await this.capture_manager.captureAndSave(!0)}))},async destroy(t=!1,e=!1){this.$refs.Comment.destroy();for(const i of this.interval_ids)window.clearInterval(i);if(window.clearTimeout(this.control_interval_id),this.interval_ids=[],null!==this.data_broadcasting_manager&&(await this.data_broadcasting_manager.destroy(),this.data_broadcasting_manager=null),this.is_loading=!0,this.is_background_display=!1,null!==this.player&&(this.player_can_be_destroyed=!0),null!==this.eventsource&&(this.eventsource.close(),this.eventsource=null),!1===e){const t=this.player.user.get("volume");for(let e=0;e<20;e++)await pt.sleep(.01),this.player.video.volume=t*(1-(e+1)/20)}if(!0===t&&null!==this.player){try{this.player.destroy()}catch(s){void 0!==this.player.plugins.mpegts&&this.player.plugins.mpegts.destroy()}this.player_can_be_destroyed=!1,this.player=null}}}}),ra=na,oa=(0,p.Z)(ra,ti,ei,!1,null,"040fbec5",null),la=oa.exports;o["default"].use(P.ZP);const ca=new P.ZP({mode:"history",base:"/",routes:[{path:"/",redirect:"/tv/"},{path:"/tv/",name:"TV Home",component:Xs},{path:"/tv/watch/:display_channel_id",name:"TV Watch",component:la},{path:"/settings/",name:"Settings Index",component:ls,beforeEnter:(t,e,s)=>{pt.isSmartphoneVertical()||pt.isSmartphoneHorizontal()||pt.isTabletVertical()?s():s({path:"/settings/general/"})}},{path:"/settings/general",name:"Settings General",component:ss},{path:"/settings/caption",name:"Settings Caption",component:Ae},{path:"/settings/data-broadcasting",name:"Settings Data Broadcasting",component:qe},{path:"/settings/capture",name:"Settings Capture",component:He},{path:"/settings/account",name:"Settings Account",component:Te},{path:"/settings/jikkyo",name:"Settings Jikkyo",component:Cs},{path:"/settings/twitter",name:"Settings Twitter",component:Ns},{path:"/settings/server",name:"Settings Server",component:Is},{path:"/login/",name:"Login",component:Wt},{path:"/register/",name:"Register",component:oe},{path:"*",name:"NotFound",component:ee}],scrollBehavior(t,e,s){return s||{x:0,y:0}}});var _a=ca,da=s(95205);(0,da.z)("/service-worker.js",{ready(){console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB")},registered(){console.log("Service worker has been registered.")},cached(){console.log("Content has been cached for offline use.")},updatefound(){console.log("New content is downloading.")},updated(t){console.log("New content is available; please refresh."),N.show({message:"クライアントが新しいバージョンに更新されました。5秒後にリロードします。",timeout:1e4}),null!==t.waiting&&(t.waiting.postMessage({type:"SKIP_WAITING"}),t.waiting.addEventListener("statechange",(async t=>{"activated"===t.target.state&&(await pt.sleep(4),location.reload(!0))})))},offline(){console.log("No internet connection found. App is running in offline mode.")},error(t){console.error("Error during service worker registration:",t)}}),(0,n.OK)(),o["default"].config.productionTip=!1,o["default"].config.devtools=!0,o["default"].use(a.og);const ua=(0,a.WB)();o["default"].use(l.ZP),o["default"].use(_(),{top:!1,bottom:!0,color:"#433532",dark:!0,elevation:8,timeout:2500,autoRemove:!0,closeButtonContent:"閉じる",vuetifyInstance:B});const ma=pt.isTouchDevice()?[]:["hover","focus","touch"];r.ZP.options.themes.tooltip.showTriggers=ma,r.ZP.options.themes.tooltip.hideTriggers=ma,r.ZP.options.themes.tooltip.delay.show=0,r.ZP.options.offset=[0,7],o["default"].use(r.ZP),o["default"].component("Icon",i.JO),o["default"].component("v-tab-item-fix",w),o["default"].component("v-tabs-fix",x),o["default"].component("v-tabs-items-fix",O),window.KonomiTVVueInstance=new o["default"]({pinia:ua,router:_a,vuetify:B,render:t=>t(v)}).$mount("#app");let pa=!1;const ha=st();ha.$subscribe((async()=>{!0!==pa&&(console.log("Client Settings Changed:",ha.settings),Q(ha.settings),await ha.syncClientSettingsToServer())}),{detached:!0}),window.setInterval((async()=>{null!==pt.getAccessToken()&&!0===ha.settings.sync_settings&&(pa=!0,await ha.syncClientSettingsFromServer(),pa=!1,Q(ha.settings))}),3e3)},91343:function(){},2307:function(){},11004:function(){},4065:function(){},43450:function(){}},e={};function s(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={id:i,loaded:!1,exports:{}};return t[i].call(n.exports,n,n.exports,s),n.loaded=!0,n.exports}s.m=t,function(){var t=[];s.O=function(e,i,a,n){if(!i){var r=1/0;for(_=0;_=n)&&Object.keys(s.O).every((function(t){return s.O[t](i[l])}))?i.splice(l--,1):(o=!1,n0&&t[_-1][2]>n;_--)t[_]=t[_-1];t[_]=[i,a,n]}}(),function(){s.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return s.d(e,{a:e}),e}}(),function(){s.d=function(t,e){for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}}(),function(){s.u=function(t){return"assets/js/"+t+".64d0cbac.js"}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"===typeof window)return window}}()}(),function(){s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(),function(){s.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}}(),function(){s.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t}}(),function(){s.p="/"}(),function(){s.b=document.baseURI||self.location.href;var t={143:0};s.O.j=function(e){return 0===t[e]};var e=function(e,i){var a,n,r=i[0],o=i[1],l=i[2],c=0;if(r.some((function(e){return 0!==t[e]}))){for(a in o)s.o(o,a)&&(s.m[a]=o[a]);if(l)var _=l(s)}for(e&&e(i);c{const s=this.$slots.default.findIndex((e=>t.$vnode.key===e.key)),i=this.$slots.default.findIndex((t=>e.$vnode.key===t.key));return s-i})),t.$on("change",(()=>this.onClick(t))),this.mandatory&&!this.selectedValues.length&&this.updateMandatory(),this.updateItem(t,this.items.indexOf(t)),void 0!==e&&this.updateInternalValue(this.items.indexOf(e))},unregister(t){const e=this.items[this.internalIndex];this.constructor.super.options.methods.unregister.call(this,t),void 0!==e&&this.updateInternalValue(this.items.indexOf(e))}}}),x=b.Z.extend({methods:{genBar(t,e){const s={style:{height:(0,y.kb)(this.height)},props:{activeClass:this.activeClass,centerActive:this.centerActive,dark:this.dark,light:this.light,mandatory:!this.optional,mobileBreakpoint:this.mobileBreakpoint,nextIcon:this.nextIcon,prevIcon:this.prevIcon,showArrows:this.showArrows,value:this.internalValue},on:{"call:slider":this.callSlider,change:t=>{this.internalValue=t}},ref:"items"};return this.setTextColor(this.computedColor,s),this.setBackgroundColor(this.backgroundColor,s),this.$createElement(k,s,[this.genSlider(e),t])}}}),S=s(71550),O=S.Z.extend({data(){return{items:[]}},methods:{register(t){const e=this.items[this.internalIndex];this.items.push(t),this.items.sort(((t,e)=>{const s=this.$slots.default.findIndex((e=>t.$vnode.key===e.key)),i=this.$slots.default.findIndex((t=>e.$vnode.key===t.key));return s-i})),t.$on("change",(()=>this.onClick(t))),this.mandatory&&!this.selectedValues.length&&this.updateMandatory(),this.updateItem(t,this.items.indexOf(t)),void 0!==e&&this.items.indexOf(e)!==this.internalValue&&this.updateInternalValue(this.items.indexOf(e))},unregister(t){const e=this.items[this.internalIndex];this.constructor.super.options.methods.unregister.call(this,t),void 0!==e&&this.updateInternalValue(this.items.indexOf(e))},updateReverse(t,e){const s=this.items.length,i=s-1;return s<=2?t":">"};return t.replace(/[&"'<>]/g,(t=>e[t]))}static getWindowFeatures(){const t=650,e=window.screen.height>=800?800:window.screen.height-100,s=(window.screen.height-e)/2,i=(window.screen.width-t)/2;return`toolbar=0,status=0,top=${s},left=${i},width=${t},height=${e},modal=yes,alwaysRaised=yes`}static hasActiveElementClass(t){return null!==document.activeElement&&document.activeElement.classList.contains(t)}static isFirefox(){return/Firefox/i.test(navigator.userAgent)}static isSafari(){return/Safari/i.test(navigator.userAgent)&&!/Chrome/i.test(navigator.userAgent)}static isMobileDevice(){return/iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&"ontouchend"in document}static isSmartphoneHorizontal(){return window.matchMedia("(max-width: 1000px) and (max-height: 450px)").matches}static isSmartphoneVertical(){return window.matchMedia("(max-width: 600px) and (min-height: 450.01px)").matches}static isTabletHorizontal(){return window.matchMedia("(max-width: 1264px) and (max-height: 850px)").matches}static isTabletVertical(){return window.matchMedia("(max-width: 850px) and (min-height: 850.01px)").matches}static isTouchDevice(){return window.matchMedia("(hover: none)").matches}static mathFloor(t,e=0){return Math.floor(t*10**e)/10**e}static async sleep(t){return await new Promise((e=>setTimeout(e,1e3*t)))}static time(){return Date.now()/1e3}static typeof(t){return Object.prototype.toString.call(t).slice(8,-1).toLowerCase()}static URLtoLink(t){t=$.escapeHTML(t);const e=/(https?:\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi;return t.replace(e,'$1')}}$.version="0.8.0-dev",$.api_base_url=(()=>`${window.location.protocol}//${window.location.host}/api`)();var z=$;class A{static getChannelType(t){try{const e=t.match("(?[a-z]+)[0-9]+").groups.channel_type.toUpperCase();return e}catch(e){return"GR"}}static getChannelForceType(t){return null===t?"normal":t>=500?"festival":t>=200?"so-many":t>=100?"many":"normal"}}var D=s(48764),L=s(29204),N={success(t){return window.KonomiTVVueInstance?.$message.success(t)},info(t){return window.KonomiTVVueInstance?.$message.info(t)},warning(t){return window.KonomiTVVueInstance?.$message.warning(t)},error(t){return window.KonomiTVVueInstance?.$message.error(t)},show(t){return window.KonomiTVVueInstance?.$message.show(t)}},E=s(6154);const K=E["default"].create();K.interceptors.request.use((t=>{if(void 0===t.baseURL&&(t.baseURL=pt.api_base_url),!1===t.url?.startsWith("http")){const e=pt.getAccessToken();null!==e&&(t.headers["Authorization"]=`Bearer ${e}`),t.headers["X-KonomiTV-Version"]=pt.version}return t.timeout=3e4,t}));var M=K;class H{static async createUser(t){const e=await G.post("/users",t);if("is_error"in e){switch(e.error.message){case"Specified username is duplicated":N.error("ユーザー名が重複しています。");break;case"Specified username is not accepted due to system limitations":N.error("ユーザー名に token と me は使えません。");break;default:G.showGenericError(e,"アカウントを作成できませんでした。");break}return null}return e.data}static async createUserAccessToken(t,e){const s=await G.post("/users/token",new URLSearchParams({username:t,password:e}));if("is_error"in s){switch(s.error.message){case"Incorrect username":N.error("ログインできませんでした。そのユーザー名のアカウントは存在しません。");break;case"Incorrect password":N.error("ログインできませんでした。パスワードを間違えていませんか?");break;default:G.showGenericError(s,"ログインできませんでした。");break}return null}return s.data}static async fetchUser(){const t=await G.get("/users/me");return"is_error"in t?(G.showGenericError(t,"アカウント情報を取得できませんでした。"),null):t.data}static async fetchUserIcon(){const t=await G.get("/users/me/icon",{responseType:"blob"});return"is_error"in t?(G.showGenericError(t,"アイコン画像を取得できませんでした。"),null):URL.createObjectURL(t.data)}static async updateUser(t){const e=await G.put("/users/me",t);if("is_error"in e)switch(e.error.message){case"Specified username is duplicated":N.error("ユーザー名が重複しています。");break;case"Specified username is not accepted due to system limitations":N.error("ユーザー名に token と me は使えません。");break;default:G.showGenericError(e,"アカウント情報を更新できませんでした。");break}else;}static async updateUserIcon(t){const e=new FormData;e.append("image",t);const s=await G.put("/users/me/icon",e,{headers:{"Content-Type":"multipart/form-data"}});if("is_error"in s)switch(s.error.message){case"Please upload JPEG or PNG image":N.error("JPEG または PNG 画像をアップロードしてください。");break;default:G.showGenericError(s,"アイコン画像を更新できませんでした。");break}else;}static async deleteUser(){const t=await G["delete"]("/users/me");"is_error"in t&&G.showGenericError(t,"アカウントを削除できませんでした。")}}var F=H;const V=(0,a.Q_)("user",{state:()=>({is_logged_in:!1,user:null,user_icon_url:null}),getters:{user_niconico_icon_url(){if(null===this.user||null===this.user.niconico_user_id)return null;const t=this.user.niconico_user_id.toString().slice(0,4);return`https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/${t}/${this.user.niconico_user_id}.jpg`}},actions:{async register(t,e){const s=await F.createUser({username:t,password:e});return null===s?(console.log("Register failed."),!1):(await this.login(t,e,!0),console.log("Register successful."),N.success("アカウントを作成しました。"),!0)},async login(t,e,s=!1){const i=await F.createUserAccessToken(t,e);return null===i?(console.log("Login failed."),this.logout(!0),!1):(console.log("Login successful."),pt.saveAccessToken(i.access_token),this.is_logged_in=!0,await this.fetchUser(!0),!1===s&&N.success("ログインしました。"),!0)},logout(t=!1){const e=st();e.settings.sync_settings=!1,pt.deleteAccessToken(),this.is_logged_in=!1,this.user=null,this.user_icon_url="",!1===t&&N.success("ログアウトしました。")},async fetchUser(t=!1){if(null===pt.getAccessToken())return null;if(null!==this.user&&!1===t)return this.user;const e=await F.fetchUser();if(null===e)return null===pt.getAccessToken()&&this.logout(!0),null;this.is_logged_in=!0,this.user=e;const s=await F.fetchUserIcon();return null===s?null:(this.user_icon_url=s,this.user)},async updateUser(t){await F.updateUser(t),await this.fetchUser(!0),void 0!==t.username?N.show("ユーザー名を更新しました。"):void 0!==t.password&&N.show("パスワードを更新しました。")},async updateUserIcon(t){await F.updateUserIcon(t),await this.fetchUser(!0),N.show("アイコン画像を更新しました。")},async deleteUser(){await F.deleteUser(),this.logout(!0),N.show("アカウントを削除しました。")}}});var R=V;class U{static async request(t){const e=await M.request(t).catch((t=>t));return e instanceof L.d7?(console.error(e),e.response?{status:e.response.status,data:null,error:new Error(e.response.data.detail),is_error:!0}:{status:NaN,data:null,error:e,is_error:!0}):{status:e.status,data:e.data,error:null,is_success:!0}}static async get(t,e){const s={url:t,method:"GET",...e};return await U.request(s)}static async post(t,e,s){const i={url:t,method:"POST",data:e,...s};return await U.request(i)}static async put(t,e,s){const i={url:t,method:"PUT",data:e,...s};return await U.request(i)}static async delete(t,e){const s={url:t,method:"DELETE",...e};return await U.request(s)}static showGenericError(t,e){const s=R();switch(t.error.message){case"Not authenticated":return s.logout(!0),void N.error(`${e}\nログインし直してください。`);case"Access token data is invalid":return s.logout(!0),void N.error(`${e}\nログインセッションが不正です。もう一度ログインし直してください。`);case"Access token is invalid":return s.logout(!0),void N.error(`${e}\nログインセッションの有効期限が切れています。もう一度ログインし直してください。`);case"User associated with access token does not exist":return s.logout(!0),void N.error(`${e}\nログインセッションに紐づくユーザーが存在しないか、削除されています。`);default:return void(t.error.message?Number.isNaN(t.status)?N.error(`${e}(${t.error.message})`):N.error(`${e}(HTTP Error ${t.status} / ${t.error.message})`):N.error(`${e}(HTTP Error ${t.status})`))}}}var G=U;class W{static async fetchClientSettings(){const t=await G.get("/settings/client");return"is_error"in t?null:t.data}static async updateClientSettings(t){await G.put("/settings/client",t)}}var q=W;const Y=["pinned_channel_ids","saved_twitter_hashtags","panel_display_state","tv_panel_active_tab","tv_channel_selection_requires_alt_key","caption_font","always_border_caption_text","specify_caption_opacity","caption_opacity","tv_show_superimpose","capture_save_mode","capture_caption_mode","comment_speed_rate","comment_font_size","close_comment_form_after_sending","muted_comment_keywords","muted_niconico_user_ids","mute_vulgar_comments","mute_abusive_discriminatory_prejudiced_comments","mute_big_size_comments","mute_fixed_comments","mute_colored_comments","mute_consecutive_same_characters_comments","fold_panel_after_sending_tweet","reset_hashtag_when_program_switches","auto_add_watching_channel_hashtag","twitter_active_tab","tweet_hashtag_position","tweet_capture_watermark_position"],X={pinned_channel_ids:[],showed_panel_last_time:!0,selected_twitter_account_id:null,saved_twitter_hashtags:[],tv_streaming_quality:"1080p",tv_data_saver_mode:!1,tv_low_latency_mode:!0,panel_display_state:"RestorePreviousState",tv_panel_active_tab:"Program",tv_channel_selection_requires_alt_key:!1,caption_font:"Windows TV MaruGothic",always_border_caption_text:!0,specify_caption_opacity:!1,caption_opacity:.5,tv_show_superimpose:!0,tv_show_data_broadcasting:!0,capture_copy_to_clipboard:!1,capture_save_mode:"UploadServer",capture_caption_mode:"Both",sync_settings:!1,comment_speed_rate:1,comment_font_size:34,close_comment_form_after_sending:!0,muted_comment_keywords:[],muted_niconico_user_ids:[],mute_vulgar_comments:!0,mute_abusive_discriminatory_prejudiced_comments:!0,mute_big_size_comments:!0,mute_fixed_comments:!1,mute_colored_comments:!1,mute_consecutive_same_characters_comments:!1,fold_panel_after_sending_tweet:!1,reset_hashtag_when_program_switches:!0,auto_add_watching_channel_hashtag:!0,twitter_active_tab:"Capture",tweet_hashtag_position:"Append",tweet_capture_watermark_position:"None"};function J(){const t=localStorage.getItem("KonomiTV-Settings");return null!==t?JSON.parse(t):(Q(X),X)}function Q(t){localStorage.setItem("KonomiTV-Settings",JSON.stringify(t))}function tt(t){const e={};for(const s of Object.keys(X))e[s]=s in t?t[s]:X[s];return e}const et=(0,a.Q_)("settings",{state:()=>{const t=J(),e=tt(t);return Q(e),{settings:e}},actions:{async importClientSettings(t){const e=await t.text();let s={};try{s=JSON.parse(e)}catch(a){return!1}const i=tt(s);return Q(i),this.settings=i,await this.syncClientSettingsToServer(),!0},async resetClientSettings(){const t={...X,sync_settings:this.settings.sync_settings};Q(t),this.settings=t,await this.syncClientSettingsToServer()},getSyncableClientSettings(){const t={};for(const e of Y)e in this.settings?t[e]=this.settings[e]:t[e]=X[e];return t},async syncClientSettingsFromServer(t=!1){if(null===pt.getAccessToken()||!1===this.settings.sync_settings&&!1===t)return;const e=await q.fetchClientSettings();if(null!==e)for(const[s,i]of Object.entries(e))this.settings[s]=i},async syncClientSettingsToServer(t=!1){if(null===pt.getAccessToken()||!1===this.settings.sync_settings&&!1===t)return;const e=this.getSyncableClientSettings();await q.updateClientSettings(e)}}});var st=et;class it{static getCommentColor(t){return this.color_table[t]||null}static getCommentPosition(t){switch(t){case"ue":return"top";case"naka":return"right";case"shita":return"bottom";default:return null}}static getCommentSize(t){switch(t){case"big":case"medium":case"small":return t;default:return null}}static parseCommentCommand(t){let e="#FFEAEA",s="right",i="medium";if(void 0!==t&&null!==t){const a=t.replace("184","").split(" ");for(const t of a){const a=it.getCommentColor(t),n=it.getCommentPosition(t),r=it.getCommentSize(t);null!==a&&(e=a),null!==n&&(s=n),null!==r&&(i=r)}}return{color:e,position:s,size:i}}static isMutedComment(t,e,s,i,a){const n=st();if(n.settings.muted_niconico_user_ids.includes(e))return!0;if(it.special_command_comments_pattern.test(t))return!0;if(!0===n.settings.mute_fixed_comments&&("top"===i||"bottom"===i))return console.log("[CommentUtils] Muted comment (fixed_comments): "+t),!0;if(!0===n.settings.mute_colored_comments&&"#FFEAEA"!==s)return console.log("[CommentUtils] Muted comment (colored_comments): "+t),!0;if(!0===n.settings.mute_big_size_comments&&"big"===a)return console.log("[CommentUtils] Muted comment (big_size_comments): "+t),!0;if(!0===n.settings.mute_vulgar_comments&&it.mute_vulgar_comments_pattern.test(t))return console.log("[CommentUtils] Muted comment (vulgar_comments): "+t),!0;if(!0===n.settings.mute_abusive_discriminatory_prejudiced_comments&&it.mute_abusive_discriminatory_prejudiced_comments_pattern.test(t))return console.log("[CommentUtils] Muted comment (abusive_discriminatory_prejudiced_comments): "+t),!0;if(!0===n.settings.mute_consecutive_same_characters_comments&&it.mute_consecutive_same_characters_comments_pattern.test(t))return console.log("[CommentUtils] Muted comment (consecutive_same_characters_comments): "+t),!0;for(const r of n.settings.muted_comment_keywords)if(""!==r.pattern)switch(r.match){case"partial":if(t.includes(r.pattern))return console.log("[CommentUtils] Muted comment (partial): "+t),!0;break;case"forward":if(t.startsWith(r.pattern))return console.log("[CommentUtils] Muted comment (forward): "+t),!0;break;case"backward":if(t.endsWith(r.pattern))return console.log("[CommentUtils] Muted comment (backward): "+t),!0;break;case"exact":if(t===r.pattern)return console.log("[CommentUtils] Muted comment (exact): "+t),!0;break;case"regex":if(new RegExp(r.pattern).test(t))return console.log("[CommentUtils] Muted comment (regex): "+t),!0;break}return!!it.annoying_statistical_comments_pattern.test(t)}static addMutedKeywords(t){const e=st();for(const s of e.settings.muted_comment_keywords)if("exact"===s.match&&s.pattern===t)return;e.settings.muted_comment_keywords.push({match:"exact",pattern:t})}static addMutedNiconicoUserIDs(t){const e=st();e.settings.muted_niconico_user_ids.includes(t)||e.settings.muted_niconico_user_ids.push(t)}}it.mute_vulgar_comments_pattern=new RegExp(D.Buffer.from("XChpXCl8XChVXCl8cHJwcnzvvZDvvZLvvZDvvZJ8U0VYfFPjgIdYfFPil69YfFPil4tYfFPil49YfO+8s++8pe+8uHzvvLPjgIfvvLh877yz4pev77y4fO+8s+KXi++8uHzvvLPil4/vvLh844Ki44OA44Or44OIfOOCouODiuOCpXzjgqLjg4rjg6t844Kk44Kr6IetfOOCpOOBj3zjgYbjgpPjgZN844Km44Oz44KzfOOBhuOCk+OBoXzjgqbjg7Pjg4F844Ko44Kt44ObfOOBiOOBoeOBiOOBoXzjgYjjgaPjgaF844Ko44OD44OBfOOBiOOBo+OCjXzjgqjjg4Pjg61844GI44KNfOOCqOODrXzlt6Xlj6N844GK44GV44KP44KK44G+44KTfOOBiuOBl+OBo+OBk3zjgqrjgrfjg4PjgrN844Kq44OD44K144OzfOOBiuOBo+OBseOBhHzjgqrjg4Pjg5HjgqR844Kq44OK44OL44O8fOOBiuOBquOBu3zjgqrjg4rjg5t844GK44Gx44GEfOOCquODkeOCpHzjgYpwfOOBiu+9kHzjgqrjg5Xjg5HjgrN844Ks44Kk44K444OzfOOCreODs+OCv+ODnnzjgY/jgbHjgYJ844GP44Gx44GBfOOCr+ODquODiOODquOCuXzjgq/jg7Pjg4t844GU44GP44GU44GP44GU44GP44GU44GPfOOCs+ODs+ODieODvOODoHzjgZHjgaTjgYLjgap844Kx44OE44Ki44OKfOOCtuODvOODoeODs3zjgrfjgrN844GX44GT44GX44GTfOOCt+OCs+OCt+OCs3zjgZnjgZHjgZnjgZF844Gb44GE44GI44GNfOOBm+OBhOOCinzjgZvjg7zjgop844GZ44GF44GF44GF44GF44GFfOOBmeOBhuOBhuOBhuOBhuOBhnzjgrvjgq/jg63jgrl844K744OD44Kv44K5fOOCu+ODleODrHzjgaHjgaPjgbHjgYR844Gh44Gj44OR44KkfOODgeODg+ODkeOCpHzjgaHjgpPjgZN844Gh44CH44GTfOOBoeKXr+OBk3zjgaHil4vjgZN844Gh4peP44GTfOODgeODs+OCs3zjg4HjgIfjgrN844OB4pev44KzfOODgeKXi+OCs3zjg4Hil4/jgrN844Gh44KT44G9fOOBoeOAh+OBvXzjgaHil6/jgb1844Gh4peL44G9fOOBoeKXj+OBvXzjg4Hjg7Pjg51844OB44CH44OdfOODgeKXr+ODnXzjg4Hil4vjg51844OB4peP44OdfOOBoeOCk+OBoeOCk3zjg4Hjg7Pjg4Hjg7N844Gm44GD44KT44Gm44GD44KTfOODhuOCo+ODs+ODhuOCo+ODs3zjg4bjgqPjg7Pjg51844OH44Kr44GEfOODh+ODquODmOODq3zjgarjgYvjgaDjgZd844Gq44GL44CH44GXfOOBquOBi+KXr+OBl3zjgarjgYvil4vjgZd844Gq44GL4peP44GXfOiEseOBknzjg4zjgYR844OM44GLfOODjOOCq3zjg4zjgY1844OM44KtfOODjOOBj3zjg4zjgq9844OM44GRfOODjOOCsXzjg4zjgZN844OM44KzfOOBseOBhOOCguOBv3zjg5Hjg5HmtLt844G144GG44O7fOOBteOBhuKApnzjgbXjgYV8776M772pfOOBteOBj+OCieOBv3zjgbXjgY/jgonjgpPjgad844G644Gj44GffOOBuuOCjeOBuuOCjXzjg5rjg63jg5rjg618776N776f776b776N776f776bfOODleOCp+ODqXzjgbvjgYbjgZHjgYR844G844Gj44GNfOODneODq+ODjnzjgbzjgo3jgpN844Oc44Ot44OzfO++ju++nu++m+++nXzjgb3jgo3jgop844Od44Ot44OqfO++ju++n+++m+++mHzjg57jg7PjgY3jgaR844Oe44Oz44Kt44OEfOOBvuOCk+OBk3zjgb7jgIfjgZN844G+4pev44GTfOOBvuKXi+OBk3zjgb7il4/jgZN844Oe44Oz44KzfOODnuOAh+OCs3zjg57il6/jgrN844Oe4peL44KzfOODnuKXj+OCs3zjgb7jgpPjgZXjgpN844KC44Gj44GT44KKfOODouODg+OCs+ODqnzjgoLjgb/jgoLjgb9844Oi44Of44Oi44OffOODpOOBo+OBn3zjg6TjgaPjgaZ844Ok44KJfOOChOOCieOBm+OCjXzjg6Tjgop844Ok44KLfOODpOOCjHzjg6Tjgo1844Op44OW44ObfOODr+ODrOODoXzmhJvmtrJ85ZaYfOmZsOaguHzpmbDojI586Zmw5ZSHfOa3q+WkonzpmqDmr5t86Zmw5q+bfOeUo+OCgeOCi3zlpbPjga7lrZDjga7ml6V85rGa44Gj44GV44KTfOWnpnzpqI7kuZfkvY185beo5qC5fOW3qOODgeODs3zlt6jnj4186YeR546JfOaciOe1jHzlvozog4zkvY185a2Q56iufOWtkOS9nOOCinzlsITnsr585L+h6ICFfOeyvua2snzpgI/jgZF85oCn5LqkfOeyvuWtkHzmraPluLjkvY185oCn5b60fOaAp+eahHznlJ/nkIZ85a+45q2i44KBfOe0oOadkHzmirHjgYR85oqx44GLfOaKseOBjXzmirHjgY985oqx44GRfOaKseOBk3zkvZPmtrJ85Lmz6aaWfOaBpeWeonznj43mo5J85Lit44Gg44GXfOS4reWHuuOBl3zlsL985oqc44GEfOaKnOOBkeOBquOBhHzmipzjgZHjgot85oqc44GR44KMfOeKr+ePjXzohqjjgol85YyF6IyOfOWLg+i1t3zmkannvoV86a2U576FfOaPieOBvnzmj4njgb985o+J44KAfOaPieOCgXzmvKvmuZZ844CH772efOKXr++9nnzil4vvvZ584peP772efOOAh+ODg+OCr+OCuXzil6/jg4Pjgq/jgrl84peL44OD44Kv44K5fOKXj+ODg+OCr+OCuQ==","base64").toString()),it.mute_abusive_discriminatory_prejudiced_comments_pattern=new RegExp(D.Buffer.from("44CCfOOCouODi+ODl+ODrOOBj+OCk3zjgqLjg4vjg5fjg6zlkJt844Ki44K544OafOOCpOOCq+OCjHzjgYTjgb7jgYTjgaF844Kk44Oe44Kk44OBfOOCpOODqeOBpOOBj3zjgqbjgrh844Km44O844OofOOCpuODqHzjgqbjg6jjgq9844Km44OyfOOBjeOCguOBhHzjgq3jg6LjgqR844Kt44Oi44GEfOOCrS/jg6Av44OBfOOCrOOCpOOCuHzvvbbvvp7vvbLvvbzvvp5844Ks44KtfOOCq+OCuXzjgq3jg4Pjgrp844GN44Gh44GM44GEfOOCreODgeOCrOOCpHzjgq3jg6Djg4F844K344OKfOOCueODhuODnnzjgaTjgb7jgonjgap844Gk44G+44KJ44KTfOODgeODp+ODg+ODkeODqnzjg4Hjg6fjg7N85Y2D44On44OzfOOBpOOCk+OBvHzjg4Tjg7Pjg5x844ON44OI44Km44OofOOBq+OBoOOBguOBgnzjg4vjg4B85LqM44OAfO++hu++gO++nnzjg5Hjg7zjg6h844OR44OofOODkeODqOOCr3zjgbbjgaPjgZV844OW44OD44K1fOOBtuOBleOBhHzjg5bjgrXjgqR844G+44Gs44GRfOODoeOCr+ODqXzjg5Djgqt844Og44Kr44Gk44GPfOiNkuOCieOBl3zpurvnlJ/jgrvjg6Hjg7Pjg4h85oWw5a6J5ammfOWus+WFkHzlpJblrZd85aem5Zu9fOmfk+WbvXzpn5PkuK186Z+T5pelfOWfuuWcsOWklnzmsJfni4LjgYR85rCX6YGV44GEfOWIh+OBo+OBn3zliIfjgaPjgaZ85rCX5oyB44Gh5oKqfOWbveS6pOaWree1tnzmrrp86aCDfOmgg+OBl3zpoIPjgZl86aCD44GbfOWcqOaXpXzlj4LmlL/mqKl85q2744GtfOawj+OBrXzvvoDvvot85q255YyVfOatueODknzlpLHpgJ986Zqc5a6zfOaWreS6pHzkuK3pn5N85pyd6a6ufOW+tOeUqOW3pXzlo7p85aO3fOWjvHzml6Xpn5N85pel5bidfOeymOedgHzlj43ml6V86aas6bm/fOeZuueLgnznmbrpgZR85py0fOWjsuWbvXzkuI3lv6t85L215ZCIfOmWk+aKnOOBkXzmloflj6V86Z2W5Zu9","base64").toString()),it.mute_consecutive_same_characters_comments_pattern=/(.)\1{7,}/,it.special_command_comments_pattern=/\/[a-z]+ /,it.annoying_statistical_comments_pattern=/最高\d+米\/|計\d+ID|総\d+米/,it.color_table={white:"#FFEAEA",red:"#F02840",pink:"#FD7E80",orange:"#FDA708",yellow:"#FFE133",green:"#64DD17",cyan:"#00D4F5",blue:"#4763FF",purple:"#D500F9",black:"#1E1310",white2:"#CCCC99",niconicowhite:"#CCCC99",red2:"#CC0033",truered:"#CC0033",pink2:"#FF33CC",orange2:"#FF6600",passionorange:"#FF6600",yellow2:"#999900",madyellow:"#999900",green2:"#00CC66",elementalgreen:"#00CC66",cyan2:"#00CCCC",blue2:"#3399FF",marineblue:"#3399FF",purple2:"#6633CC",nobleviolet:"#6633CC",black2:"#666666"};class at{static generatePlayerBackgroundURL(){const t=50,e=Math.floor(Math.random()*t)+1;return`/assets/images/player-backgrounds/${e.toString().padStart(2,"0")}.jpg`}static isHEVCVideoSupported(){return"probably"===document.createElement("video").canPlayType('video/mp4; codecs="hvc1.1.6.L123.B0"')}static extractAPIQualityFromDPlayer(t){if(null===t.quality)return null;const e=/streams\/live\/[a-z0-9]*\/(.*)\/(mpegts|ll-hls)/,s=t.quality.url.match(e);return s?s[1]:null}}var nt=s(27484),rt=s.n(nt),ot=(s(76831),s(66607)),lt=s.n(ot),ct=s(79212),_t=s.n(ct),dt=s(37412),ut=s.n(dt);rt().extend(lt()),rt().extend(_t()),rt().extend(ut());class mt{static convertTimestampToISO8601(t){rt().locale("ja");const e=rt()(t).toISOString();return e}static decorateProgramInfo(t,e){if(null!==t&&null!==t[e]){const s=pt.escapeHTML(t[e]),i="新|終|再|交|映|手|声|多|副|字|文|CC|OP|二|S|B|SS|無|無料C|S1|S2|S3|MV|双|デ|D|N|W|P|H|HV|SD|天|解|料|前|後初|生|販|吹|PPV|演|移|他|収|・|英|韓|中|字/日|字/日英|3D|2K|4K|8K|5.1|7.1|22.2|60P|120P|d|HC|HDR|SHV|UHD|VOD|配|初",a=new RegExp("\\((二|字|再)\\)","g"),n=new RegExp(`\\[(${i})\\]`,"g");return s.replace(a,'$1').replace(n,'$1')}{const t=rt()(),s=rt()().hour(0).minute(0).second(0),i=rt()().hour(6).minute(59).second(59),a=rt()().hour(23).minute(0).second(0),n=rt()().hour(23).minute(59).second(59);return t.isSameOrAfter(s)&&t.isSameOrBefore(i)||t.isSameOrAfter(a)&&t.isSameOrBefore(n)?"title"===e?"放送休止":"この時間は放送を休止しています。":"title"===e?"番組情報がありません":"この時間の番組情報を取得できませんでした。"}}static getProgramProgress(t){if(null!==t){const e=rt()(rt()()).diff(t.start_time,"second");return e/t.duration*100}return 0}static getProgramTime(t,e=!1){if(null!==t&&"2000-01-01T00:00:00+09:00"!==t.start_time){rt().locale("ja");const s=rt()(t.start_time);if(t.duration<=0)return!0===e?`${s.format("HH:mm")} ~ --:--`:`${s.format("YYYY/MM/DD (dd) HH:mm")} ~ --:-- (放送時間未定)`;const i=rt()(t.end_time),a=t.duration/60;return!0===e?`${s.format("HH:mm")} ~ ${i.format("HH:mm")}`:`${s.format("YYYY/MM/DD (dd) HH:mm")} ~ ${i.format("HH:mm")} (${a}分)`}return!0===e?"--:-- ~ --:--":"----/--/-- (-) --:-- ~ --:-- (--分)"}static formatString(t){null===mt.format_string_translation_map&&(mt.format_string_translation_map=mt.getFormatStringTranslationTable());for(const e in mt.format_string_translation_map)t=t.replaceAll(e,mt.format_string_translation_map[e]);return t}static getFormatStringTranslationTable(){const t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",s={};for(let r=0;r[\\]^_`{|} ";for(let r=0;r({server_version_info:null,last_updated_at:0}),getters:{client_version(){return pt.version},server_version(){return this.server_version_info?.version??null},latest_version(){return this.server_version_info?.latest_version??null},is_client_develop_version(){return this.client_version.includes("-dev")},is_server_develop_version(){return this.server_version?.includes("-dev")??!1},is_update_available(){return null!==this.server_version&&null!==this.latest_version&&(!1===this.is_server_develop_version&&this.server_version!==this.latest_version||!0===this.is_server_develop_version&&this.server_version.replace("-dev","")===this.latest_version)},is_version_mismatch(){return null!==this.server_version&&this.client_version!==this.server_version}},actions:{async fetchServerVersion(t=!1){if(null!==this.server_version_info&&!1===t)return pt.time()-this.last_updated_at>60&&this.fetchServerVersion(!0),this.server_version_info;const e=await Et.fetchServerVersion();return null===e?null:(this.server_version_info=e,this.last_updated_at=pt.time(),this.server_version_info)}}});var Mt=Kt,Ht=o["default"].extend({name:"Navigation",components:{BottomNavigation:Lt},computed:{...(0,a.Kc)(Mt)},async created(){await this.versionStore.fetchServerVersion()}}),Ft=Ht,Vt=(0,p.Z)(Ft,Zt,Bt,!1,null,"5b40940b",null),Rt=Vt.exports,Ut=o["default"].extend({name:"Login",components:{Header:jt,Navigation:Rt},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),username:"",password:"",password_showing:!1}},computed:{...(0,a.Kc)(R)},async created(){await this.userStore.fetchUser(),this.userStore.is_logged_in&&await this.$router.replace({path:"/settings/account"})},methods:{async login(){if(""===this.username||""===this.password)return void this.$message.error("ユーザー名またはパスワードが空です。");const t=await this.userStore.login(this.username,this.password);!1!==t&&await this.$router.replace({path:"/settings/account"})}}}),Gt=Ut,Wt=(0,p.Z)(Gt,yt,Ct,!1,null,"851c3dec",null),qt=Wt.exports,Yt=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),t._m(0)],1)],1)},Xt=[function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"d-flex justify-center align-center w-100"},[e("div",{staticClass:"d-flex justify-center align-center flex-column"},[e("h1",[t._v("Not Found, or Under Development...")]),e("span",{staticClass:"mt-4 text--text text--darken-1"},[t._v("お探しのページは存在しないか、鋭意開発中です。")])])])}],Jt=o["default"].extend({name:"NotFound",components:{Header:jt,Navigation:Rt}}),Qt=Jt,te=(0,p.Z)(Qt,Yt,Xt,!1,null,"1310cfee",null),ee=te.exports,se=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e("div",{staticClass:"register-container-wrapper d-flex align-center w-100 mb-13"},[e(ht.Z,{staticClass:"register-container px-10 pt-8 pb-11 mx-auto background lighten-1",attrs:{elevation:"10",width:"100%","max-width":"450"}},[e(gt.EB,{staticClass:"register__logo flex-column justify-center"},[e(wt.Z,{attrs:{"max-width":"250",src:"/assets/images/logo.svg"}}),e("h4",{staticClass:"mt-10"},[t._v("アカウントを作成")])],1),e(vt.Z),e(ft.Z,{ref:"register",on:{submit:function(t){t.preventDefault()}}},[e(bt.Z,{staticClass:"mt-12",attrs:{outlined:"",placeholder:"ユーザー名",autofocus:"",dense:t.is_form_dense,rules:[t.username_validation]},model:{value:t.username,callback:function(e){t.username=e},expression:"username"}}),e(bt.Z,{staticStyle:{"margin-top":"2px"},attrs:{outlined:"",placeholder:"パスワード",dense:t.is_form_dense,type:t.password_showing?"text":"password","append-icon":t.password_showing?"mdi-eye":"mdi-eye-off",rules:[t.password_validation]},on:{"click:append":function(e){t.password_showing=!t.password_showing}},model:{value:t.password,callback:function(e){t.password=e},expression:"password"}}),e(I.Z,{staticClass:"register-button mt-5",attrs:{color:"secondary",depressed:"",width:"100%",height:"56"},on:{click:function(e){return t.register()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:person-add-20-filled",height:"24"}}),t._v("アカウントを作成 ")],1)],1)],1)],1)],1)],1)},ie=[],ae=o["default"].extend({name:"Register",components:{Header:jt,Navigation:Rt},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),username:null,username_validation:t=>""===t||null===t?"ユーザー名を入力してください。":!1!==/^.{2,}$/.test(t)||"ユーザー名は2文字以上で入力してください。",password:null,password_showing:!0,password_validation:t=>""===t||null===t?"パスワードを入力してください。":!1!==/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(t)||"パスワードは4文字以上の半角英数記号を入力してください。"}},computed:{...(0,a.Kc)(R)},async created(){await this.userStore.fetchUser(),this.userStore.is_logged_in&&await this.$router.replace({path:"/settings/account"})},methods:{async register(){if(!1===this.$refs.register.validate())return;if(null===this.username||null===this.password)return;const t=await this.userStore.register(this.username,this.password);!1!==t&&await this.$router.replace({path:"/settings/account"})}}}),ne=ae,re=(0,p.Z)(ne,se,ie,!1,null,"6533f3d0",null),oe=re.exports,le=s(93749),ce=s(2780),_e=s(76827),de=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:person-20-filled",width:"25px"}}),e("span",{staticClass:"ml-2"},[t._v("アカウント")])],1),e("div",{staticClass:"settings__content",class:{"settings__content--loading":t.is_loading}},[null===t.userStore.user?e("div",{staticClass:"account"},[e("div",{staticClass:"account-wrapper"},[e("img",{staticClass:"account__icon",attrs:{src:"/assets/images/account-icon-default.png"}}),e("div",{staticClass:"account__info"},[e("div",{staticClass:"account__info-name"},[e("span",{staticClass:"account__info-name-text"},[t._v("ログインしていません")])]),e("span",{staticClass:"account__info-id"},[t._v("Not logged in")])])]),e(I.Z,{staticClass:"account__login ml-auto",attrs:{color:"secondary",width:"140",height:"56",depressed:"",to:"/login/"}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fa:sign-in"}}),t._v("ログイン ")],1)],1):t._e(),null!==t.userStore.user?e("div",{staticClass:"account"},[e("div",{staticClass:"account-wrapper"},[e("img",{staticClass:"account__icon",attrs:{src:t.userStore.user_icon_url??""}}),e("div",{staticClass:"account__info"},[e("div",{staticClass:"account__info-name"},[e("span",{staticClass:"account__info-name-text"},[t._v(t._s(t.userStore.user.name))]),t.userStore.user.is_admin?e("span",{staticClass:"account__info-admin"},[t._v("管理者")]):t._e()]),e("span",{staticClass:"account__info-id"},[t._v("User ID: "+t._s(t.userStore.user.id))])])]),e(I.Z,{staticClass:"account__login ml-auto",attrs:{color:"secondary",width:"140",height:"56",depressed:""},on:{click:function(e){return t.userStore.logout()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fa:sign-out"}}),t._v("ログアウト ")],1)],1):t._e(),!1===t.userStore.is_logged_in?e("div",{staticClass:"account-register"},[e("div",{staticClass:"account-register__heading"},[t._v(" KonomiTV アカウントにログインすると、"),e("br"),t._v("より便利な機能が使えます! ")]),e("div",{staticClass:"account-register__feature"},[e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"bi:chat-left-text-fill"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("ニコニコ実況にコメントする")]),e("span",{staticClass:"account-feature__info-text"},[t._v("テレビを見ながらニコニコ実況にコメントできます。別途、ニコニコアカウントとの連携が必要です。")])])],1),e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"fa-brands:twitter"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("Twitter 連携機能")]),e("span",{staticClass:"account-feature__info-text"},[t._v("テレビを見ながら Twitter にツイートしたり、検索したツイートをリアルタイムで表示できます。別途、Twitter アカウントとの連携が必要です。")])])],1),e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"fluent:arrow-sync-20-filled"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("設定をデバイス間で同期")]),e("span",{staticClass:"account-feature__info-text"},[t._v("ピン留めしたチャンネルなど、ブラウザに保存されている各種設定をブラウザやデバイスをまたいで同期できます。")])])],1),e("div",{staticClass:"account-feature"},[e("Icon",{staticClass:"account-feature__icon",attrs:{icon:"fa-solid:sliders-h"}}),e("div",{staticClass:"account-feature__info"},[e("span",{staticClass:"account-feature__info-heading"},[t._v("サーバー設定をブラウザから変更")]),e("span",{staticClass:"account-feature__info-text"},[t._v("管理者権限があれば、サーバー設定をブラウザから変更できます。一番最初に作成されたアカウントには、自動で管理者権限が付与されます。")])])],1)]),e("div",{staticClass:"account-register__description"},[t._v(" KonomiTV アカウントの作成に必要なものは"),e("br",{staticClass:"smartphone-vertical-only"}),t._v("ユーザー名とパスワードだけです。"),e("br"),t._v(" アカウントはローカルに導入した"),e("br",{staticClass:"smartphone-vertical-only"}),t._v(" KonomiTV サーバーにのみ保存されます。"),e("br"),t._v(" 外部のサービスには保存されませんので、ご安心ください。"),e("br")]),e(I.Z,{staticClass:"account-register__button",attrs:{color:"secondary",width:"100%","max-width":"250",height:"50",depressed:"",to:"/register/"}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:person-add-20-filled",height:"24"}}),t._v("アカウントを作成 ")],1)],1):t._e(),!0===t.userStore.is_logged_in?e("div",[e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"sync_settings"}},[t._v("設定をデバイス間で同期する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"sync_settings"}},[t._v(" KonomiTV では、設定を同じアカウントでログインしているデバイス間で同期できます!"),e("br"),t._v(" 同期をオンにすると、同期をオンにしているすべてのデバイスで共通の設定が使えます。ピン留めチャンネルやハッシュタグリストなども同期されます。"),e("br"),t._v(" なお、デバイス固有の設定(画質設定など)は、同期後も各デバイスで個別に反映されます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"sync_settings",inset:"","hide-details":""},model:{value:t.sync_settings,callback:function(e){t.sync_settings=e},expression:"sync_settings"}})],1),e(le.Z,{attrs:{"max-width":"530"},model:{value:t.sync_settings_dialog,callback:function(e){t.sync_settings_dialog=e},expression:"sync_settings_dialog"}},[e(ht.Z,[e(gt.EB,{staticClass:"justify-center"},[t._v("設定データの競合")]),e(gt.ZB,[t._v(" このデバイスの設定と、サーバーに保存されている設定が競合しています。"),e("br"),t._v(" 一度上書きすると、元に戻すことはできません。慎重に選択してください。"),e("br")]),e("div",{staticClass:"d-flex flex-column px-4 pb-4 settings__conflict-dialog"},[e(I.Z,{staticClass:"settings__save-button error--text text--lighten-1",attrs:{depressed:""},on:{click:function(e){return t.overrideServerSettingsFromClient()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:document-arrow-up-16-filled",height:"22px"}}),t._v(" サーバーに保存されている設定を、"),e("br",{staticClass:"smartphone-vertical-only"}),t._v("このデバイスの設定で上書きする ")],1),e(I.Z,{staticClass:"settings__save-button error--text text--lighten-1 mt-3",attrs:{depressed:""},on:{click:function(e){return t.overrideClientSettingsFromServer()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:document-arrow-down-16-filled",height:"22px"}}),t._v(" このデバイスの設定を、"),e("br",{staticClass:"smartphone-vertical-only"}),t._v("サーバーに保存されている設定で上書きする ")],1),e(I.Z,{staticClass:"settings__save-button mt-3",attrs:{depressed:""},on:{click:function(e){t.sync_settings_dialog=!1}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:dismiss-16-filled",height:"22px"}}),t._v(" キャンセル ")],1)],1)],1)],1),e(ft.Z,{ref:"settings_username",staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e("div",{staticClass:"settings__item-heading"},[t._v("ユーザー名")]),e("div",{staticClass:"settings__item-label"},[t._v(" KonomiTV アカウントのユーザー名を設定します。アルファベットだけでなく日本語や記号も使えます。"),e("br"),t._v(" 同じ KonomiTV サーバー上の他のアカウントと同じユーザー名には変更できません。"),e("br")]),e(bt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",placeholder:"ユーザー名",dense:t.is_form_dense,rules:[t.settings_username_validation]},model:{value:t.settings_username,callback:function(e){t.settings_username=e},expression:"settings_username"}})],1),e(I.Z,{staticClass:"settings__save-button",attrs:{depressed:""},on:{click:function(e){return t.updateAccountInfo("username")}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:save-16-filled",height:"24px"}}),t._v("ユーザー名を更新 ")],1),e(ft.Z,{staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e("div",{staticClass:"settings__item-heading"},[t._v("アイコン画像")]),e("div",{staticClass:"settings__item-label"},[t._v(" KonomiTV アカウントのアイコン画像を設定します。"),e("br"),t._v(" アップロードされた画像は自動で 400×400 の正方形にリサイズされます。"),e("br")]),e(ce.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",placeholder:"アイコン画像を選択",dense:t.is_form_dense,accept:"image/jpeg, image/png","prepend-icon":"","prepend-inner-icon":"mdi-paperclip"},model:{value:t.settings_icon,callback:function(e){t.settings_icon=e},expression:"settings_icon"}})],1),e(I.Z,{staticClass:"settings__save-button mt-5",attrs:{depressed:""},on:{click:function(e){return t.updateAccountIcon()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:save-16-filled",height:"24px"}}),t._v("アイコン画像を更新 ")],1),e(ft.Z,{ref:"settings_password",staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e("div",{staticClass:"settings__item-heading"},[t._v("新しいパスワード")]),e("div",{staticClass:"settings__item-label"},[t._v(" KonomiTV アカウントの新しいパスワードを設定します。"),e("br")]),e(bt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",placeholder:"新しいパスワード",dense:t.is_form_dense,type:t.settings_password_showing?"text":"password","append-icon":t.settings_password_showing?"mdi-eye":"mdi-eye-off",rules:[t.settings_password_validation]},on:{"click:append":function(e){t.settings_password_showing=!t.settings_password_showing}},model:{value:t.settings_password,callback:function(e){t.settings_password=e},expression:"settings_password"}})],1),e(I.Z,{staticClass:"settings__save-button",attrs:{depressed:""},on:{click:function(e){return t.updateAccountInfo("password")}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:save-16-filled",height:"24px"}}),t._v("パスワードを更新 ")],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item mt-6"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("アカウントを削除")]),e("div",{staticClass:"settings__item-label"},[t._v(" 現在ログインしている KonomiTV アカウントを削除します。"),e("br"),e("b",[t._v("アカウントに紐づくすべてのデータが削除されます。")]),t._v("元に戻すことはできません。"),e("br")])]),e(le.Z,{attrs:{"max-width":"385"},scopedSlots:t._u([{key:"activator",fn:function({on:s}){return[e(I.Z,t._g({staticClass:"settings__save-button error mt-5",attrs:{depressed:""}},s),[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:delete-16-filled",height:"24px"}}),t._v("アカウントを削除 ")],1)]}}],null,!1,1849668703),model:{value:t.account_delete_confirm_dialog,callback:function(e){t.account_delete_confirm_dialog=e},expression:"account_delete_confirm_dialog"}},[e(ht.Z,[e(gt.EB,{staticClass:"justify-center pt-6 font-weight-bold"},[t._v("本当にアカウントを削除しますか?")]),e(gt.ZB,{staticClass:"pt-2 pb-0"},[t._v(" アカウントに紐づくすべてのデータが削除されます。元に戻すことはできません。"),e("br"),t._v(" 本当にアカウントを削除しますか? ")]),e(gt.h7,{staticClass:"pt-4 px-6 pb-5"},[e(kt.Z),e(I.Z,{attrs:{color:"text",text:""},on:{click:function(e){t.account_delete_confirm_dialog=!1}}},[t._v("キャンセル")]),e(I.Z,{attrs:{color:"error"},on:{click:function(e){return t.deleteAccount()}}},[t._v("削除")])],1)],1)],1)],1):t._e()])])},ue=[],me=s(37970),pe=s(81667),he=s(51419),ge=s(33560),ve=s(17316),fe=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e(ht.Z,{staticClass:"settings-container d-flex px-5 py-5 mx-auto background",attrs:{elevation:"0",width:"100%","max-width":"1000"}},[e("div",[e(ve.Z,{staticClass:"settings-navigation flex-shrink-0 background",attrs:{permanent:"",width:"195",height:"auto"}},[e(pe.Z,{staticClass:"px-4"},[e(he.km,[e("h1",[t._v("設定")])])],1),e(me.Z,{staticClass:"mt-3 px-0 py-0",attrs:{nav:""}},[e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/general"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 3px"},attrs:{icon:"fa-solid:sliders-h",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("全般")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/caption"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:subtitles-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("字幕")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/data-broadcasting"}},[e(ge.Z,{staticClass:"mr-4"},[e("svg",{attrs:{width:"26px",height:"26px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})])]),e(he.km,[e(he.V9,[t._v("データ放送")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/capture"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:image-multiple-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("キャプチャ")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/account"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:person-20-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("アカウント")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/jikkyo"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 2px"},attrs:{icon:"bi:chat-left-text-fill",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("ニコニコ実況")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/twitter"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 1px"},attrs:{icon:"fa-brands:twitter",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("Twitter")])],1)],1),e(pe.Z,{staticClass:"px-4 mb-1",attrs:{link:"",color:"primary",to:"/settings/server"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:server-surface-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("サーバー設定")])],1)],1)],1)],1)],1),e(ht.Z,{staticClass:"settings ml-5 px-7 py-7 lighten-1",attrs:{width:"100%"}},[t._t("default")],2)],1)],1)],1)},we=[],be=o["default"].extend({name:"Settings-Base",components:{Header:jt,Navigation:Rt}}),ye=be,Ce=(0,p.Z)(ye,fe,we,!1,null,"7802007e",null),ke=Ce.exports,xe=o["default"].extend({name:"Settings-Account",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),is_loading:!0,settings_username:null,settings_username_validation:t=>""===t||null===t?"ユーザー名を入力してください。":!1!==/^.{2,}$/.test(t)||"ユーザー名は2文字以上で入力してください。",settings_password:null,settings_password_showing:!1,settings_password_validation:t=>""===t||null===t?"パスワードを入力してください。":!1!==/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(t)||"パスワードは4文字以上の半角英数記号を入力してください。",settings_icon:null,account_delete_confirm_dialog:!1,sync_settings:st().settings.sync_settings,sync_settings_dialog:!1}},computed:{...(0,a.Kc)(st,R)},async created(){await this.userStore.fetchUser(),this.is_loading=!1},watch:{async sync_settings(){if(!0===this.sync_settings&&!1===this.sync_settings_dialog){const t=this.settingsStore.getSyncableClientSettings(),e=JSON.stringify(t),s=await q.fetchClientSettings();if(null===s)return void this.$message.error("サーバーから設定データを取得できませんでした。");const i=JSON.stringify(s);e!==i?(this.sync_settings_dialog=!0,this.sync_settings=!1):this.settingsStore.settings.sync_settings=!0}else!1===this.sync_settings&&!1===this.sync_settings_dialog&&(this.settingsStore.settings.sync_settings=!1)}},methods:{async overrideServerSettingsFromClient(){await this.settingsStore.syncClientSettingsToServer(!0),this.settingsStore.settings.sync_settings=!0,this.sync_settings=!0,this.sync_settings_dialog=!1},async overrideClientSettingsFromServer(){await this.settingsStore.syncClientSettingsFromServer(!0),this.settingsStore.settings.sync_settings=!0,this.sync_settings=!0,this.sync_settings_dialog=!1},async updateAccountInfo(t){if("username"===t){if(!1===this.$refs.settings_username.validate())return}else if(!1===this.$refs.settings_password.validate())return;if("username"===t){if(null===this.settings_username)return;await this.userStore.updateUser({username:this.settings_username})}else{if(null===this.settings_password)return;await this.userStore.updateUser({password:this.settings_password})}},async updateAccountIcon(){null!==this.settings_icon?await this.userStore.updateUserIcon(this.settings_icon):this.$message.error("アップロードする画像を選択してください!")},async deleteAccount(){this.account_delete_confirm_dialog=!1,await this.userStore.deleteUser()}}}),Se=xe,Oe=(0,p.Z)(Se,de,ue,!1,null,"3ec6610e",null),Te=Oe.exports,Ie=s(17303),je=s(61013),Ze=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:subtitles-16-filled",width:"25px"}}),e("span",{staticClass:"ml-3"},[t._v("字幕")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item"},[e("label",{staticClass:"settings__item-heading"},[t._v("字幕のフォント")]),e("label",{staticClass:"settings__item-label"},[t._v(" プレイヤーで字幕表示をオンにしているときの、字幕のフォントを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.caption_font},model:{value:t.settingsStore.settings.caption_font,callback:function(e){t.$set(t.settingsStore.settings,"caption_font",e)},expression:"settingsStore.settings.caption_font"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"always_border_caption_text"}},[t._v("字幕の文字を常に縁取りする")]),e("label",{staticClass:"settings__item-label",attrs:{for:"always_border_caption_text"}},[t._v(" 字幕表示時、縁取りをオンにすると、字幕が見やすくきれいになります。とくに理由がなければ、オンにしておくのがおすすめです。"),e("br"),t._v(" この設定がオフのときも、字幕データ側で縁取りが指定されていれば、オンのときと同様に縁取り付きで描画されます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"always_border_caption_text",inset:"","hide-details":""},model:{value:t.settingsStore.settings.always_border_caption_text,callback:function(e){t.$set(t.settingsStore.settings,"always_border_caption_text",e)},expression:"settingsStore.settings.always_border_caption_text"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"specify_caption_opacity"}},[t._v("字幕の不透明度を指定する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"specify_caption_opacity"}},[t._v(" 字幕表示時、不透明度を自分で指定するか設定できます。"),e("br"),t._v(" この設定がオフのときは、字幕データ側で指定されている不透明度で描画します。とくに理由がなければ、オフにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"specify_caption_opacity",inset:"","hide-details":""},model:{value:t.settingsStore.settings.specify_caption_opacity,callback:function(e){t.$set(t.settingsStore.settings,"specify_caption_opacity",e)},expression:"settingsStore.settings.specify_caption_opacity"}})],1),e("div",{staticClass:"settings__item",class:{"settings__item--disabled":!1===t.settingsStore.settings.specify_caption_opacity}},[e("label",{staticClass:"settings__item-heading"},[t._v("字幕の不透明度")]),e("label",{staticClass:"settings__item-label"},[t._v(" 上の [字幕の不透明度を指定する] をオンに設定したときのみ有効です。不透明度を 0 に設定すれば、字幕の背景を非表示にできます。"),e("br")]),e("div",{ref:"caption_opacity",staticClass:"settings__item-label"},[e(je.Z,{staticClass:"settings__item-form",attrs:{ticks:"always","thumb-label":"","hide-details":"",min:0,max:1,step:.05,disabled:!1===t.settingsStore.settings.specify_caption_opacity},model:{value:t.settingsStore.settings.caption_opacity,callback:function(e){t.$set(t.settingsStore.settings,"caption_opacity",e)},expression:"settingsStore.settings.caption_opacity"}})],1)]),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_show_superimpose"}},[t._v("テレビをみるときに文字スーパーを表示する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_superimpose"}},[t._v(" 文字スーパーは、緊急地震速報の赤テロップや、NHK BS のニュース速報のテロップなどで利用されています。とくに理由がなければ、オンにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_show_superimpose",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_show_superimpose,callback:function(e){t.$set(t.settingsStore.settings,"tv_show_superimpose",e)},expression:"settingsStore.settings.tv_show_superimpose"}})],1)],1)])},Be=[],Pe=o["default"].extend({name:"Settings-Caption",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),caption_font:[{text:"Windows TV ゴシック",value:"Windows TV Gothic"},{text:"Windows TV 丸ゴシック",value:"Windows TV MaruGothic"},{text:"Windows TV 太丸ゴシック",value:"Windows TV FutoMaruGothic"},{text:"ヒラギノTV丸ゴ",value:"Hiragino TV Sans Rd S"},{text:"新丸ゴ ARIB",value:"TT-ShinMGo-regular"},{text:"Rounded M+ 1m for ARIB",value:"Rounded M+ 1m for ARIB"},{text:"Noto Sans JP",value:"Noto Sans JP Caption"},{text:"デフォルトのフォント",value:"sans-serif"}]}},computed:{...(0,a.Kc)(st)}}),$e=Pe,ze=(0,p.Z)($e,Ze,Be,!1,null,null,null),Ae=ze.exports,De=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:image-multiple-16-filled",width:"26px"}}),e("span",{staticClass:"ml-2"},[t._v("キャプチャ")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"capture_copy_to_clipboard"}},[t._v("キャプチャをクリップボードにコピーする")]),e("label",{staticClass:"settings__item-label",attrs:{for:"capture_copy_to_clipboard"}},[t._v(" この設定をオンにすると、撮ったキャプチャ画像がクリップボードにもコピーされます。"),e("br"),t._v(" クリップボードの履歴をサポートしていない OS では、この設定をオンにしてキャプチャを撮ると、以前のクリップボードが上書きされます。注意してください。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"capture_copy_to_clipboard",inset:"","hide-details":""},model:{value:t.settingsStore.settings.capture_copy_to_clipboard,callback:function(e){t.$set(t.settingsStore.settings,"capture_copy_to_clipboard",e)},expression:"settingsStore.settings.capture_copy_to_clipboard"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("キャプチャの保存先")]),e("div",{staticClass:"settings__item-label"},[e("p",[t._v(" キャプチャした画像をブラウザでダウンロードするか、KonomiTV サーバーにアップロードするかを設定します。"),e("br"),t._v(" ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方同時に行うこともできます。"),e("br")]),e("p",[t._v(" ブラウザでダウンロードすると、視聴中のデバイスのダウンロードフォルダに保存されます。"),e("br"),t._v(" 視聴中のデバイスにそのまま保存されるためシンプルですが、保存先のフォルダを変更できないこと、PC 版 Chrome では毎回ダウンロードバーが表示されてしまったり、iOS Safari (PWA モード) ではダウンロードするとファイル概要画面が表示され再生が中断してしまったりなど、視聴に支障することがデメリットです (将来的には、iOS / Android アプリ版や拡張機能などで解消される予定) 。"),e("br")]),e("p",[t._v(" KonomiTV サーバーにアップロードすると、サーバー設定で指定されたキャプチャ保存フォルダに保存されます。視聴したデバイスにかかわらず、今までに撮ったキャプチャをひとつのフォルダにまとめて保存できます。"),e("br"),t._v(" 他のデバイスでキャプチャを見るにはキャプチャ保存フォルダをネットワークに共有する必要があること、スマホ・タブレットではネットワーク上のフォルダへのアクセスがやや面倒なことがデメリットです。(将来的には、保存フォルダ内のキャプチャを Google フォトのように表示する機能を追加予定)"),e("br")])]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.capture_save_mode},model:{value:t.settingsStore.settings.capture_save_mode,callback:function(e){t.$set(t.settingsStore.settings,"capture_save_mode",e)},expression:"settingsStore.settings.capture_save_mode"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("字幕表示時のキャプチャの保存モード")]),e("div",{staticClass:"settings__item-label"},[t._v(" 字幕表示時、キャプチャした画像に字幕を合成するかを設定します。"),e("br"),t._v(" 映像のみのキャプチャと、字幕を合成したキャプチャを両方同時に保存することもできます。"),e("br"),t._v(" なお、字幕非表示時は、常に映像のみ (+コメント付きキャプチャではコメントを合成して) 保存されます。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.capture_caption_mode},model:{value:t.settingsStore.settings.capture_caption_mode,callback:function(e){t.$set(t.settingsStore.settings,"capture_caption_mode",e)},expression:"settingsStore.settings.capture_caption_mode"}})],1)])])},Le=[],Ne=o["default"].extend({name:"Settings-Capture",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),capture_save_mode:[{text:"ブラウザでダウンロード",value:"Browser"},{text:"KonomiTV サーバーにアップロード",value:"UploadServer"},{text:"ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方行う",value:"Both"}],capture_caption_mode:[{text:"映像のみのキャプチャを保存する",value:"VideoOnly"},{text:"字幕を合成したキャプチャを保存する",value:"CompositingCaption"},{text:"映像のみのキャプチャと、字幕を合成したキャプチャを両方保存する",value:"Both"}]}},computed:{...(0,a.Kc)(st)}}),Ee=Ne,Ke=(0,p.Z)(Ee,De,Le,!1,null,null,null),Me=Ke.exports,He=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("svg",{attrs:{width:"27px",height:"27px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})]),e("span",{staticClass:"ml-2"},[t._v("データ放送")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_show_data_broadcasting"}},[t._v("テレビをみるときにデータ放送を表示する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_data_broadcasting"}},[t._v(" この設定をオンにすると、テレビをみるときにデータ放送機能を利用できます。"),e("br"),t._v(" データ放送そのもののオン/オフは、視聴画面右側のパネルからリモコンを表示した上で、リモコンの d ボタンから切り替えられます。"),e("br")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_data_broadcasting"}},[t._v(" データ放送機能をオンにすると、負荷が高くなり視聴に支障が出ることがあります。データ放送を利用しない場合や、性能の低い Android デバイスではオフにすることをおすすめします。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_show_data_broadcasting",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_show_data_broadcasting,callback:function(e){t.$set(t.settingsStore.settings,"tv_show_data_broadcasting",e)},expression:"settingsStore.settings.tv_show_data_broadcasting"}})],1),e(vt.Z,{staticClass:"mt-6"}),e(ft.Z,{ref:"data_broadcasting_zip_code",staticClass:"settings__item settings__item--sync-disabled",on:{submit:function(t){t.preventDefault()}}},[e("label",{staticClass:"settings__item-heading"},[t._v("お住まいの郵便番号")]),e("label",{staticClass:"settings__item-label"},[t._v(" ここで設定した郵便番号をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。"),e("br"),t._v(" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。"),e("br")]),e(bt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",placeholder:"郵便番号",dense:t.is_form_dense,rules:[t.data_broadcasting_zip_code_validation]},model:{value:t.data_broadcasting_zip_code,callback:function(e){t.data_broadcasting_zip_code=e},expression:"data_broadcasting_zip_code"}})],1),e("div",{staticClass:"settings__item settings__item--sync-disabled mt-0"},[e("label",{staticClass:"settings__item-heading"},[t._v("お住まいの都道府県")]),e("label",{staticClass:"settings__item-label"},[t._v(" ここで設定した都道府県をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。"),e("br"),t._v(" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.data_broadcasting_prefectures},model:{value:t.data_broadcasting_prefecture,callback:function(e){t.data_broadcasting_prefecture=e},expression:"data_broadcasting_prefecture"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("データ放送の保存データをリセット")]),e("div",{staticClass:"settings__item-label"},[t._v(" このデバイス(ブラウザ)に保存されているデータ放送の保存データを、初期状態にリセット (消去) できます。"),e("br"),t._v(" 保存データには、データ放送内のミニゲームの得点データや、設定データなどが含まれます。"),e("br"),t._v(" 保存データをリセットすると、元に戻すことはできません。十分ご注意ください。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button error mt-5",attrs:{depressed:""},on:{click:function(e){return t.resetNVRAMSettings()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"material-symbols:device-reset-rounded",height:"23px"}}),t._v("保存データをリセット ")],1)],1)])},Fe=[];s(82801);const Ve="KonomiTV-BMLBrowser_nvram_prefix=receiverinfo%2F";var Re=o["default"].extend({name:"Settings-DataBroadcasting",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),data_broadcasting_zip_code:"",data_broadcasting_zip_code_validation:t=>""===t||(null!==t.match(/^[0-9]{3}-[0-9]{4}$/)||"郵便番号は「000-0000」の形式で入力してください。"),data_broadcasting_prefecture:"255-0b0",data_broadcasting_prefectures:[{text:"未設定",value:"255-0b0"},{text:"西北海道",value:"2-0b000101101011"},{text:"東北海道",value:"1-0b000101101011"},{text:"青森県",value:"3-0b010001100111"},{text:"岩手県",value:"4-0b010111010100"},{text:"宮城県",value:"5-0b011101011000"},{text:"秋田県",value:"6-0b101011000110"},{text:"山形県",value:"7-0b111001001100"},{text:"福島県",value:"8-0b000110101110"},{text:"茨城県",value:"9-0b110001101001"},{text:"栃木県",value:"10-0b111000111000"},{text:"群馬県",value:"11-0b100110001011"},{text:"埼玉県",value:"12-0b011001001011"},{text:"千葉県",value:"13-0b000111000111"},{text:"東京都 (島部を除く)",value:"14-0b101010101100"},{text:"東京都島部 (伊豆・小笠原諸島)",value:"49-0b101010101100"},{text:"神奈川県",value:"15-0b010101101100"},{text:"新潟県",value:"16-0b010011001110"},{text:"富山県",value:"17-0b010100111001"},{text:"石川県",value:"18-0b011010100110"},{text:"福井県",value:"19-0b100100101101"},{text:"山梨県",value:"20-0b110101001010"},{text:"長野県",value:"21-0b100111010010"},{text:"岐阜県",value:"22-0b101001100101"},{text:"静岡県",value:"23-0b101001011010"},{text:"愛知県",value:"24-0b100101100110"},{text:"三重県",value:"25-0b001011011100"},{text:"滋賀県",value:"26-0b110011100100"},{text:"京都府",value:"27-0b010110011010"},{text:"大阪府",value:"28-0b110010110010"},{text:"兵庫県",value:"29-0b011001110100"},{text:"奈良県",value:"30-0b101010010011"},{text:"和歌山県",value:"31-0b001110010110"},{text:"鳥取県",value:"32-0b110100100011"},{text:"島根県",value:"33-0b001100011011"},{text:"岡山県",value:"34-0b001010110101"},{text:"広島県",value:"35-0b101100110001"},{text:"山口県",value:"36-0b101110011000"},{text:"徳島県",value:"37-0b111001100010"},{text:"香川県",value:"38-0b100110110100"},{text:"愛媛県",value:"39-0b000110011101"},{text:"高知県",value:"40-0b001011100011"},{text:"福岡県",value:"41-0b011000101101"},{text:"佐賀県",value:"42-0b100101011001"},{text:"長崎県",value:"43-0b101000101011"},{text:"熊本県",value:"44-0b100010100111"},{text:"大分県",value:"45-0b110010001101"},{text:"宮崎県",value:"46-0b110100011100"},{text:"鹿児島県 (南西諸島を除く)",value:"47-0b110101000101"},{text:"鹿児島県島部 (南西諸島の鹿児島県域)",value:"50-0b110101000101"},{text:"沖縄県",value:"48-0b001101110010"}]}},computed:{...(0,a.Kc)(st)},created(){const t=localStorage.getItem(`${Ve}zipcode`);if(t)try{this.data_broadcasting_zip_code=window.atob(t),this.data_broadcasting_zip_code=this.data_broadcasting_zip_code.slice(0,3)+"-"+this.data_broadcasting_zip_code.slice(3)}catch(s){}const e=localStorage.getItem(`${Ve}prefecture`);if(e)try{const t=window.atob(e).charCodeAt(0);for(const e of this.data_broadcasting_prefectures)if(e.value.startsWith(`${t}-`)){this.data_broadcasting_prefecture=e.value;break}}catch(s){}},watch:{data_broadcasting_zip_code(t){if(!1!==this.$refs.data_broadcasting_zip_code.validate())if(""!==t){const e=window.btoa(t.replace("-",""));localStorage.setItem(`${Ve}zipcode`,e)}else localStorage.removeItem(`${Ve}zipcode`)},data_broadcasting_prefecture(t){if("255-0b0"!==t){const e=t.split("-0b"),s=parseInt(e[0]),i=window.btoa(String.fromCharCode(s));localStorage.setItem(`${Ve}prefecture`,i);const a=parseInt(e[1],2),n=window.btoa(String.fromCharCode(a>>8,255&a));localStorage.setItem(`${Ve}regioncode`,n)}else localStorage.removeItem(`${Ve}prefecture`),localStorage.removeItem(`${Ve}regioncode`)}},methods:{resetNVRAMSettings(){for(const t in localStorage)t.startsWith("KonomiTV-BMLBrowser_nvram_")&&localStorage.removeItem(t);this.data_broadcasting_zip_code="",this.data_broadcasting_prefecture="255-0b0",this.$message.success("データ放送の保存データをリセットしました。")}}}),Ue=Re,Ge=(0,p.Z)(Ue,He,Fe,!1,null,null,null),We=Ge.exports,qe=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fa-solid:sliders-h",width:"19px"}}),e("span",{staticClass:"ml-3"},[t._v("全般")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item settings__item--sync-disabled"},[e("div",{staticClass:"settings__item-heading"},[t._v("テレビのデフォルトのストリーミング画質")]),e("div",{staticClass:"settings__item-label"},[t._v(" テレビをライブストリーミングするときのデフォルトの画質を設定します。"),e("br"),t._v(" ストリーミング画質はプレイヤーの設定からいつでも切り替えられます。"),e("br")]),e("div",{staticClass:"settings__item-label"},[t._v(" [1080p (60fps)] は、通常 30fps (60i) の映像を補間し、より滑らか(ぬるぬる)な映像で視聴できます!"),e("br"),t._v(" [1080p (60fps)] で視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出ることがあります。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tv_streaming_quality},model:{value:t.settingsStore.settings.tv_streaming_quality,callback:function(e){t.$set(t.settingsStore.settings,"tv_streaming_quality",e)},expression:"settingsStore.settings.tv_streaming_quality"}})],1),e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled",class:{"settings__item--disabled":!1===t.PlayerUtils.isHEVCVideoSupported()}},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_data_saver_mode"}},[t._v("テレビを通信節約モードで視聴する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_data_saver_mode"}},[t._v(" 通信節約モードでは、H.265 / HEVC という圧縮率の高いコーデックを使い、画質はほぼそのまま、通信量を通常の 1/2 程度に抑えながら視聴できます!"),e("br"),t._v(" 通信節約モードで視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出る可能性が高いです。"),e("br"),!1===t.PlayerUtils.isHEVCVideoSupported()&&!1===t.Utils.isFirefox()?e("p",{staticClass:"mt-1 mb-0 error--text lighten-1"},[t._v(" このデバイスでは通信節約モードがサポートされていません。 ")]):t._e(),!1===t.PlayerUtils.isHEVCVideoSupported()&&!0===t.Utils.isFirefox()?e("p",{staticClass:"mt-1 mb-0 error--text lighten-1"},[t._v(" お使いの Firefox ブラウザでは通信節約モードがサポートされていません。 ")]):t._e()]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_data_saver_mode",inset:"","hide-details":"",disabled:!1===t.PlayerUtils.isHEVCVideoSupported()},model:{value:t.settingsStore.settings.tv_data_saver_mode,callback:function(e){t.$set(t.settingsStore.settings,"tv_data_saver_mode",e)},expression:"settingsStore.settings.tv_data_saver_mode"}})],1),e("div",{staticClass:"settings__item settings__item--switch settings__item--sync-disabled"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_low_latency_mode"}},[t._v("テレビを低遅延で視聴する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_low_latency_mode"}},[t._v(" 低遅延ストリーミングをオンにすると、"),e("b",[t._v("放送波との遅延を最短 0.9 秒に抑えて視聴できます!")]),e("br"),t._v(" また、約 3 秒以上遅延したときに少しだけ再生速度を早める (1.1x) ことで、滑らかにストリーミングの遅延を取り戻します。"),e("br"),t._v(" 宅外視聴などのネットワークが不安定になりがちな環境では、低遅延ストリーミングをオフにしてみると、映像のカクつきを改善できるかもしれません。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_low_latency_mode",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_low_latency_mode,callback:function(e){t.$set(t.settingsStore.settings,"tv_low_latency_mode",e)},expression:"settingsStore.settings.tv_low_latency_mode"}})],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("デフォルトのパネルの表示状態")]),e("div",{staticClass:"settings__item-label"},[t._v(" 視聴画面を開いたときに、右側のパネルをどう表示するかを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.panel_display_state},model:{value:t.settingsStore.settings.panel_display_state,callback:function(e){t.$set(t.settingsStore.settings,"panel_display_state",e)},expression:"settingsStore.settings.panel_display_state"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("テレビをみるときにデフォルトで表示されるパネルのタブ")]),e("div",{staticClass:"settings__item-label"},[t._v(" テレビの視聴画面を開いたときに、右側のパネルで最初に表示されるタブを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tv_panel_active_tab},model:{value:t.settingsStore.settings.tv_panel_active_tab,callback:function(e){t.$set(t.settingsStore.settings,"tv_panel_active_tab",e)},expression:"settingsStore.settings.tv_panel_active_tab"}})],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"tv_show_superimpose"}},[t._v("チャンネル選局のキーボードショートカットを "+t._s(t.Utils.AltOrOption())+" + 数字キー/テンキーに変更する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"tv_show_superimpose"}},[t._v(" この設定をオンにすると、数字キーまたはテンキーに対応するリモコン番号(1~12)のチャンネルに切り替える際、"+t._s(t.Utils.AltOrOption())+" キーを同時に押す必要があります。"),e("br"),t._v(" コメントやツイートを入力しようとして誤って数字キーを押してしまい、チャンネルが変わってしまう事態を避けたい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"tv_show_superimpose",inset:"","hide-details":""},model:{value:t.settingsStore.settings.tv_channel_selection_requires_alt_key,callback:function(e){t.$set(t.settingsStore.settings,"tv_channel_selection_requires_alt_key",e)},expression:"settingsStore.settings.tv_channel_selection_requires_alt_key"}})],1),e(vt.Z,{staticClass:"mt-6"}),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("設定をエクスポート")]),e("div",{staticClass:"settings__item-label"},[t._v(" このデバイス(ブラウザ)に保存されている設定データを、エクスポート(ダウンロード)できます。"),e("br"),t._v(" ダウンロードした設定データ (KonomiTV-Settings.json) は、[設定をインポート] からインポートできます。異なるサーバーの KonomiTV を同じ設定で使いたいときなどに使ってください。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button mt-4",attrs:{depressed:""},on:{click:function(e){return t.exportSettings()}}},[e("Icon",{staticClass:"mr-3",attrs:{icon:"fa6-solid:download",height:"19px"}}),t._v("設定をエクスポート ")],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("設定をインポート")]),e("div",{staticClass:"settings__item-label"},[t._v(" [設定をエクスポート] でダウンロードした設定データを、このデバイス(ブラウザ)にインポートできます。"),e("br"),t._v(" 設定をインポートすると、"),e("b",[t._v("現在のデバイス設定はすべて上書きされます。")]),t._v("元に戻すことはできません。"),e("br"),t._v(" 設定のデバイス間同期がオンのときは、"),e("b",[t._v("同期が有効なすべてのデバイスに反映されます。")]),t._v("十分ご注意ください。"),e("br")]),e(ce.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",placeholder:"設定データ (KonomiTV-Settings.json) を選択",dense:t.is_form_dense,accept:"application/json","prepend-icon":"","prepend-inner-icon":"mdi-paperclip"},model:{value:t.import_settings_file,callback:function(e){t.import_settings_file=e},expression:"import_settings_file"}})],1),e(I.Z,{staticClass:"settings__save-button error mt-5",attrs:{depressed:""},on:{click:function(e){return t.importSettings()}}},[e("Icon",{staticClass:"mr-3",attrs:{icon:"fa6-solid:upload",height:"19px"}}),t._v("設定をインポート ")],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading error--text text--lighten-1"},[t._v("設定を初期状態にリセット")]),e("div",{staticClass:"settings__item-label"},[t._v(" このデバイス(ブラウザ)に保存されている設定データを、初期状態のデフォルト値にリセットできます。"),e("br"),t._v(" 設定をリセットすると、元に戻すことはできません。"),e("br"),t._v(" 設定のデバイス間同期がオンのときは、"),e("b",[t._v("同期が有効なすべてのデバイスに反映されます。")]),t._v("十分ご注意ください。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button error mt-5",attrs:{depressed:""},on:{click:function(e){return t.resetSettings()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"material-symbols:device-reset-rounded",height:"23px"}}),t._v("設定をリセット ")],1)],1)])},Ye=[];const Xe=[{text:"1080p (60fps) (約4.50GB/h / 平均10.0Mbps)",value:"1080p-60fps"},{text:"1080p (約4.50GB/h / 平均10.0Mbps)",value:"1080p"},{text:"810p (約2.62GB/h / 平均5.8Mbps)",value:"810p"},{text:"720p (約2.18GB/h / 平均4.9Mbps)",value:"720p"},{text:"540p (約1.52GB/h / 平均3.4Mbps)",value:"540p"},{text:"480p (約1.06GB/h / 平均2.3Mbps)",value:"480p"},{text:"360p (約0.60GB/h / 平均1.3Mbps)",value:"360p"},{text:"240p (約0.35GB/h / 平均0.8Mbps)",value:"240p"}],Je=[{text:"1080p (60fps) (約1.80GB/h / 平均4.0Mbps)",value:"1080p-60fps"},{text:"1080p (約1.37GB/h / 平均3.0Mbps)",value:"1080p"},{text:"810p (約1.05GB/h / 平均2.3Mbps)",value:"810p"},{text:"720p (約0.82GB/h / 平均1.8Mbps)",value:"720p"},{text:"540p (約0.53GB/h / 平均1.2Mbps)",value:"540p"},{text:"480p (約0.46GB/h / 平均1.0Mbps)",value:"480p"},{text:"360p (約0.30GB/h / 平均0.7Mbps)",value:"360p"},{text:"240p (約0.20GB/h / 平均0.4Mbps)",value:"240p"}];var Qe=o["default"].extend({name:"Settings-General",components:{SettingsBase:ke},data(){return{Utils:pt,PlayerUtils:at,is_form_dense:pt.isSmartphoneHorizontal(),tv_streaming_quality:Xe,panel_display_state:[{text:"前回の状態を復元する",value:"RestorePreviousState"},{text:"常に表示する",value:"AlwaysDisplay"},{text:"常に折りたたむ",value:"AlwaysFold"}],tv_panel_active_tab:[{text:"番組情報タブ",value:"Program"},{text:"チャンネルタブ",value:"Channel"},{text:"コメントタブ",value:"Comment"},{text:"Twitter タブ",value:"Twitter"}],import_settings_file:null}},computed:{...(0,a.Kc)(st)},created(){!0===this.settingsStore.settings.tv_data_saver_mode&&(this.tv_streaming_quality=Je)},watch:{"settingsStore.settings.tv_data_saver_mode":{immediate:!0,handler(t){this.tv_streaming_quality=!0===t?Je:Xe}}},methods:{exportSettings(){const t=JSON.stringify(this.settingsStore.settings,null,4),e=new Blob([t],{type:"application/json"});pt.downloadBlobData(e,"KonomiTV-Settings.json"),this.$message.success("設定をエクスポートしました。")},async importSettings(){if(null===this.import_settings_file)return void this.$message.error("インポートする設定データを選択してください!");const t=await this.settingsStore.importClientSettings(this.import_settings_file);!0===t?(this.$message.success("設定をインポートしました。"),window.setTimeout((()=>this.$router.go(0)),300)):this.$message.error("設定データが不正なため、インポートできませんでした。")},async resetSettings(){await this.settingsStore.resetClientSettings(),this.$message.success("設定をリセットしました。"),window.setTimeout((()=>this.$router.go(0)),300)}}}),ts=Qe,es=(0,p.Z)(ts,qe,Ye,!1,null,null,null),ss=es.exports,is=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e(ht.Z,{staticClass:"settings-container d-flex px-5 py-5 mx-auto background",attrs:{elevation:"0",width:"100%","max-width":"1000"}},[e(ve.Z,{staticClass:"settings-navigation flex-shrink-0 background",attrs:{permanent:"",width:"100%",height:"auto"}},[e(pe.Z,{staticClass:"px-1"},[e(he.km,[e("h1",[t._v("設定")])])],1),e(me.Z,{staticClass:"mt-2 px-0",attrs:{nav:""}},[e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/general"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 3px"},attrs:{icon:"fa-solid:sliders-h",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("全般")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/caption"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:subtitles-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("字幕")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/data-broadcasting"}},[e(ge.Z,{staticClass:"mr-4"},[e("svg",{attrs:{width:"26px",height:"26px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})])]),e(he.km,[e(he.V9,[t._v("データ放送")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/capture"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:image-multiple-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("キャプチャ")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/account"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:person-20-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("アカウント")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/jikkyo"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 2px"},attrs:{icon:"bi:chat-left-text-fill",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("ニコニコ実況")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/twitter"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{staticStyle:{padding:"0 1px"},attrs:{icon:"fa-brands:twitter",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("Twitter")])],1)],1),e(pe.Z,{staticClass:"px-4",attrs:{link:"",color:"primary",to:"/settings/server"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:server-surface-16-filled",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v("サーバー設定")])],1)],1),e(pe.Z,{staticClass:"px-4 settings-navigation-version",class:{"settings-navigation-version--highlight":t.versionStore.is_update_available},attrs:{link:"",color:"primary",href:"https://github.com/tsukumijima/KonomiTV"}},[e(ge.Z,{staticClass:"mr-4"},[e("Icon",{attrs:{icon:"fluent:info-16-regular",width:"26px"}})],1),e(he.km,[e(he.V9,[t._v(" version "+t._s(t.versionStore.client_version)+t._s(t.versionStore.is_update_available?" (Update Available)":"")+" ")])],1)],1)],1)],1)],1)],1)],1)},as=[],ns=o["default"].extend({name:"Settings-Index",components:{Header:jt,Navigation:Rt},computed:{...(0,a.Kc)(Mt)},async created(){await this.versionStore.fetchServerVersion()}}),rs=ns,os=(0,p.Z)(rs,is,as,!1,null,"51859415",null),ls=os.exports,cs=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"bi:chat-left-text-fill",width:"19px"}}),e("span",{staticClass:"ml-3"},[t._v("ニコニコ実況")])],1),e("div",{staticClass:"settings__content",class:{"settings__content--loading":t.is_loading}},[null===t.userStore.user||null===t.userStore.user.niconico_user_id?e("div",{staticClass:"niconico-account niconico-account--anonymous"},[e("div",{staticClass:"niconico-account-wrapper"},[e("Icon",{staticClass:"flex-shrink-0",attrs:{icon:"bi:chat-left-text-fill",width:"45px"}}),e("div",{staticClass:"niconico-account__info ml-4"},[e("div",{staticClass:"niconico-account__info-name"},[e("span",{staticClass:"niconico-account__info-name-text"},[t._v("ニコニコアカウントと連携していません")])]),e("span",{staticClass:"niconico-account__info-description"},[t._v(" ニコニコアカウントと連携すると、テレビを見ながらニコニコ実況にコメントできるようになります。 ")])])],1),e(I.Z,{staticClass:"niconico-account__login ml-auto",attrs:{color:"secondary",width:"130",height:"56",depressed:""},on:{click:function(e){return t.loginNiconicoAccount()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-connected-20-filled",height:"26"}}),t._v("連携する ")],1)],1):t._e(),null!==t.userStore.user&&null!==t.userStore.user.niconico_user_id?e("div",{staticClass:"niconico-account"},[e("div",{staticClass:"niconico-account-wrapper"},[e("img",{staticClass:"niconico-account__icon",attrs:{src:t.userStore.user_niconico_icon_url??""}}),e("div",{staticClass:"niconico-account__info"},[e("div",{staticClass:"niconico-account__info-name"},[e("span",{staticClass:"niconico-account__info-name-text"},[t._v(t._s(t.userStore.user.niconico_user_name)+" と連携しています")])]),e("span",{staticClass:"niconico-account__info-description"},[e("span",{staticClass:"mr-2",staticStyle:{"white-space":"nowrap"}},[t._v("Niconico User ID:")]),e("a",{staticClass:"mr-2",attrs:{href:`https://www.nicovideo.jp/user/${t.userStore.user.niconico_user_id}`,target:"_blank"}},[t._v(t._s(t.userStore.user.niconico_user_id))]),!0===t.userStore.user.niconico_user_premium?e("span",{staticClass:"secondary--text"},[t._v("(Premium)")]):t._e()])])]),e(I.Z,{staticClass:"niconico-account__login ml-auto",attrs:{color:"secondary",width:"130",height:"56",depressed:""},on:{click:function(e){return t.logoutNiconicoAccount()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-disconnected-20-filled",height:"26"}}),t._v("連携解除 ")],1)],1):t._e(),e("div",{staticClass:"settings__item mt-7"},[e("div",{staticClass:"settings__item-heading"},[t._v("コメントのミュート設定")]),e("div",{staticClass:"settings__item-label"},[t._v(" 表示したくないコメントを、映像上やコメントリストに表示しないようにミュートできます。"),e("br")])]),e(I.Z,{staticClass:"settings__save-button mt-4",attrs:{depressed:""},on:{click:function(e){t.comment_mute_settings_modal=!t.comment_mute_settings_modal}}},[e("Icon",{attrs:{icon:"heroicons-solid:filter",height:"19px"}}),e("span",{staticClass:"ml-1"},[t._v("コメントのミュート設定を開く")])],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("コメントの速さ")]),e("div",{staticClass:"settings__item-label"},[t._v(" プレイヤーに流れるコメントの速さを設定します。"),e("br"),t._v(" たとえば 1.2 に設定すると、コメントが 1.2 倍速く流れます。"),e("br")]),e(je.Z,{staticClass:"settings__item-form",attrs:{ticks:"always","thumb-label":"","hide-details":"",step:.1,min:.5,max:2},model:{value:t.settingsStore.settings.comment_speed_rate,callback:function(e){t.$set(t.settingsStore.settings,"comment_speed_rate",e)},expression:"settingsStore.settings.comment_speed_rate"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("コメントの文字サイズ")]),e("div",{staticClass:"settings__item-label"},[t._v(" プレイヤーに流れるコメントの文字サイズの基準値を設定します。"),e("br"),t._v(" 実際の文字サイズは画面サイズに合わせて調整されます。デフォルトの文字サイズは 34px です。"),e("br")]),e(je.Z,{staticClass:"settings__item-form",attrs:{ticks:"always","thumb-label":"","hide-details":"",min:20,max:60},model:{value:t.settingsStore.settings.comment_font_size,callback:function(e){t.$set(t.settingsStore.settings,"comment_font_size",e)},expression:"settingsStore.settings.comment_font_size"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"close_comment_form_after_sending"}},[t._v("コメント送信後にコメント入力フォームを閉じる")]),e("label",{staticClass:"settings__item-label",attrs:{for:"close_comment_form_after_sending"}},[t._v(" この設定をオンにすると、コメントを送信した後に、コメント入力フォームが自動で閉じるようになります。"),e("br"),t._v(" コメント入力フォームが表示されたままだと、大半のショートカットキーが文字入力と競合して使えなくなります。とくに理由がなければ、オンにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"close_comment_form_after_sending",inset:"","hide-details":""},model:{value:t.settingsStore.settings.close_comment_form_after_sending,callback:function(e){t.$set(t.settingsStore.settings,"close_comment_form_after_sending",e)},expression:"settingsStore.settings.close_comment_form_after_sending"}})],1)],1),e("CommentMuteSettings",{model:{value:t.comment_mute_settings_modal,callback:function(e){t.comment_mute_settings_modal=e},expression:"comment_mute_settings_modal"}})],1)},_s=[],ds=function(){var t=this,e=t._self._c;t._self._setupProxy;return e(le.Z,{attrs:{"max-width":"770",transition:"slide-y-transition"},model:{value:t.comment_mute_settings_modal,callback:function(e){t.comment_mute_settings_modal=e},expression:"comment_mute_settings_modal"}},[e(ht.Z,{staticClass:"comment-mute-settings"},[e(gt.EB,{staticClass:"px-5 pt-5 pb-3 d-flex align-center font-weight-bold",staticStyle:{height:"60px"}},[e("Icon",{attrs:{icon:"heroicons-solid:filter",height:"26px"}}),e("span",{staticClass:"ml-3"},[t._v("コメントのミュート設定")]),e(kt.Z),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"d-flex align-center rounded-circle cursor-pointer px-2 py-2",on:{click:function(e){t.comment_mute_settings_modal=!1}}},[e("Icon",{attrs:{icon:"fluent:dismiss-12-filled",width:"23px",height:"23px"}})],1)],1),e("div",{staticClass:"px-5 pb-5"},[e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold mt-4"},[e("Icon",{attrs:{icon:"fa-solid:sliders-h",width:"24px",height:"20px"}}),e("span",{staticClass:"ml-2"},[t._v("クイック設定")])],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_vulgar_comments"}},[t._v(" 露骨な表現を含むコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_vulgar_comments"}},[t._v(" 性的な単語などの露骨・下品な表現を含むコメントを、一括でミュートするかを設定します。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_vulgar_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_vulgar_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_vulgar_comments",e)},expression:"settingsStore.settings.mute_vulgar_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_abusive_discriminatory_prejudiced_comments"}},[t._v(" ネガティブな表現、差別的な表現、政治的に偏った表現を含むコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_abusive_discriminatory_prejudiced_comments"}},[t._v(" 『死ね』『殺す』などのネガティブな表現、特定の国や人々への差別的な表現、政治的に偏った表現を含むコメントを、一括でミュートするかを設定します。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_abusive_discriminatory_prejudiced_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_abusive_discriminatory_prejudiced_comments",e)},expression:"settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_big_size_comments"}},[t._v(" 文字サイズが大きいコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_big_size_comments"}},[t._v(" 通常より大きい文字サイズで表示されるコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" 文字サイズが大きいコメントには迷惑なコメントが多いです。基本的にはオンにしておくのがおすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_big_size_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_big_size_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_big_size_comments",e)},expression:"settingsStore.settings.mute_big_size_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_fixed_comments"}},[t._v(" 映像の上下に固定表示されるコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_fixed_comments"}},[t._v(" 映像の上下に固定された状態で表示されるコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" 固定表示されるコメントが煩わしい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_fixed_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_fixed_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_fixed_comments",e)},expression:"settingsStore.settings.mute_fixed_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_colored_comments"}},[t._v(" 色付きのコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_colored_comments"}},[t._v(" 白以外の色で表示される色付きのコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" この設定をオンにしておくと、目立つ色のコメントを一掃できます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_colored_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_colored_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_colored_comments",e)},expression:"settingsStore.settings.mute_colored_comments"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"mute_consecutive_same_characters_comments"}},[t._v(" 8文字以上同じ文字が連続しているコメントをミュートする ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"mute_consecutive_same_characters_comments"}},[t._v(" 『wwwwwwwwwww』『あばばばばばばばばば』など、8文字以上同じ文字が連続しているコメントを、一括でミュートするかを設定します。"),e("br"),t._v(" しばしばあるテンプレコメントが煩わしい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"mute_consecutive_same_characters_comments",inset:"","hide-details":""},model:{value:t.settingsStore.settings.mute_consecutive_same_characters_comments,callback:function(e){t.$set(t.settingsStore.settings,"mute_consecutive_same_characters_comments",e)},expression:"settingsStore.settings.mute_consecutive_same_characters_comments"}})],1),e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold mt-4"},[e("Icon",{attrs:{icon:"fluent:comment-dismiss-20-filled",width:"24px"}}),e("span",{staticClass:"ml-2 mr-2"},[t._v("ミュート済みのキーワード")]),e(I.Z,{staticClass:"ml-auto",attrs:{depressed:""},on:{click:function(e){return t.settingsStore.settings.muted_comment_keywords.push({match:"partial",pattern:""})}}},[e("Icon",{attrs:{icon:"fluent:add-12-filled",height:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("追加")])],1)],1),e("div",{staticClass:"muted-comment-items"},t._l(t.settingsStore.settings.muted_comment_keywords,(function(s,i){return e("div",{key:i,staticClass:"muted-comment-item"},[e(bt.Z,{staticClass:"muted-comment-item__input",attrs:{type:"search",dense:"",outlined:"","hide-details":"",placeholder:"ミュートするキーワードを入力"},model:{value:t.settingsStore.settings.muted_comment_keywords[i].pattern,callback:function(e){t.$set(t.settingsStore.settings.muted_comment_keywords[i],"pattern",e)},expression:"settingsStore.settings.muted_comment_keywords[index].pattern"}}),e(Ie.Z,{staticClass:"muted-comment-item__match-type",attrs:{dense:"",outlined:"","hide-details":"",items:t.muted_comment_keyword_match_type},model:{value:t.settingsStore.settings.muted_comment_keywords[i].match,callback:function(e){t.$set(t.settingsStore.settings.muted_comment_keywords[i],"match",e)},expression:"settingsStore.settings.muted_comment_keywords[index].match"}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"muted-comment-item__delete-button",on:{click:function(e){t.settingsStore.settings.muted_comment_keywords.splice(t.settingsStore.settings.muted_comment_keywords.indexOf(s),1)}}},[e("Icon",{attrs:{icon:"fluent:delete-16-filled",width:"20px"}})],1)],1)})),0),e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold mt-4"},[e("Icon",{attrs:{icon:"fluent:person-prohibited-20-filled",width:"24px"}}),e("span",{staticClass:"ml-2 mr-2"},[t._v("ミュート済みのニコニコユーザー ID")]),e(I.Z,{staticClass:"ml-auto",attrs:{depressed:""},on:{click:function(e){return t.settingsStore.settings.muted_niconico_user_ids.push("")}}},[e("Icon",{attrs:{icon:"fluent:add-12-filled",height:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("追加")])],1)],1),e("div",{staticClass:"muted-comment-items"},t._l(t.settingsStore.settings.muted_niconico_user_ids,(function(s,i){return e("div",{key:i,staticClass:"muted-comment-item"},[e(bt.Z,{staticClass:"muted-comment-item__input",attrs:{type:"search",dense:"",outlined:"","hide-details":"",placeholder:"ミュートするニコニコユーザー ID を入力"},model:{value:t.settingsStore.settings.muted_niconico_user_ids[i],callback:function(e){t.$set(t.settingsStore.settings.muted_niconico_user_ids,i,e)},expression:"settingsStore.settings.muted_niconico_user_ids[index]"}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"muted-comment-item__delete-button",on:{click:function(e){t.settingsStore.settings.muted_niconico_user_ids.splice(t.settingsStore.settings.muted_niconico_user_ids.indexOf(s),1)}}},[e("Icon",{attrs:{icon:"fluent:delete-16-filled",width:"20px"}})],1)],1)})),0)])],1)],1)},us=[],ms=o["default"].extend({name:"CommentMuteSettings",model:{prop:"showing",event:"change"},props:{showing:{type:Boolean,required:!0}},data(){return{interval_timer_id:0,comment_mute_settings_modal:!1,muted_comment_keyword_match_type:[{text:"部分一致",value:"partial"},{text:"前方一致",value:"forward"},{text:"後方一致",value:"backward"},{text:"完全一致",value:"exact"},{text:"正規表現",value:"regex"}]}},computed:{...(0,a.Kc)(st)},watch:{showing(){this.comment_mute_settings_modal=this.showing},comment_mute_settings_modal(){this.$emit("change",this.comment_mute_settings_modal)}}}),ps=ms,hs=(0,p.Z)(ps,ds,us,!1,null,"2cd59ba0",null),gs=hs.exports;class vs{static async fetchAuthorizationURL(){const t=await G.get("/niconico/auth");return"is_error"in t?(G.showGenericError(t,"ニコニコアカウントとの連携用の認証 URL を取得できませんでした。"),null):t.data.authorization_url}static async logoutAccount(){const t=await G["delete"]("/niconico/logout");return!("is_error"in t)||(G.showGenericError(t,"ニコニコアカウントとの連携を解除できませんでした。"),!1)}}var fs=vs,ws=o["default"].extend({name:"Settings-Jikkyo",components:{SettingsBase:ke,CommentMuteSettings:gs},data(){return{comment_mute_settings_modal:!1,is_loading:!0}},computed:{...(0,a.Kc)(st,R)},async created(){if(await this.userStore.fetchUser(),this.is_loading=!1,""!==location.hash){const t=new URLSearchParams(location.hash.replace("#",""));if(null!==t.get("status")&&null!==t.get("detail")){const e=parseInt(t.get("status")),s=t.get("detail");this.onOAuthCallbackReceived(e,s),history.replaceState(null,""," ")}}},methods:{async loginNiconicoAccount(){if(!1===this.userStore.is_logged_in)return void this.$message.warning("連携をはじめるには、KonomiTV アカウントにログインしてください。");const t=await fs.fetchAuthorizationURL();if(null===t)return;if(!0===pt.isMobileDevice())return void(location.href=t);const e=window.open(t,"KonomiTV-OAuthPopup",pt.getWindowFeatures());if(null===e)return void this.$message.error("ポップアップウインドウを開けませんでした。");const s=async t=>{if(e.closed)return;if("object"!==pt["typeof"](t.data))return;if("KonomiTV-OAuthPopup"in t.data===!1)return;e&&e.close(),window.removeEventListener("message",s);const i=t.data["KonomiTV-OAuthPopup"]["status"],a=t.data["KonomiTV-OAuthPopup"]["detail"];this.onOAuthCallbackReceived(i,a)};window.addEventListener("message",s)},async onOAuthCallbackReceived(t,e){if(console.log(`NiconicoAuthCallbackAPI: Status: ${t} / Detail: ${e}`),200===t)await this.userStore.fetchUser(!0),this.$message.success("ニコニコアカウントと連携しました。");else if(e.startsWith("Authorization was denied (access_denied)"))this.$message.error("ニコニコアカウントとの連携がキャンセルされました。");else if(e.startsWith("Failed to get access token (HTTP Error ")){const t=e.replace("Failed to get access token ","");this.$message.error(`アクセストークンの取得に失敗しました。${t}`)}else if(e.startsWith("Failed to get access token (Connection Timeout)"))this.$message.error("アクセストークンの取得に失敗しました。ニコニコで障害が発生している可能性があります。");else if(e.startsWith("Failed to get user information (HTTP Error ")){const t=e.replace("Failed to get user information ","");this.$message.error(`ニコニコアカウントのユーザー情報の取得に失敗しました。${t}`)}else e.startsWith("Failed to get user information (Connection Timeout)")?this.$message.error("ニコニコアカウントのユーザー情報の取得に失敗しました。ニコニコで障害が発生している可能性があります。"):this.$message.error(`ニコニコアカウントとの連携に失敗しました。(${e})`)},async logoutNiconicoAccount(){const t=await fs.logoutAccount();!1!==t&&(await this.userStore.fetchUser(!0),this.$message.success("ニコニコアカウントとの連携を解除しました。"))}}}),bs=ws,ys=(0,p.Z)(bs,cs,_s,!1,null,"3ff16abd",null),Cs=ys.exports,ks=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fluent:server-surface-16-filled",width:"22px"}}),e("span",{staticClass:"ml-2"},[t._v("サーバー設定")])],1),e("div",{staticClass:"settings__content"},[e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("鋭意開発中…")])])])])},xs=[],Ss=o["default"].extend({name:"Settings-Server",components:{SettingsBase:ke}}),Os=Ss,Ts=(0,p.Z)(Os,ks,xs,!1,null,null,null),Is=Ts.exports,js=s(89767),Zs=s(47935),Bs=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("SettingsBase",[e("h2",{staticClass:"settings__heading"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"settings__back-button",attrs:{to:"/settings/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("Icon",{attrs:{icon:"fa-brands:twitter",width:"22px"}}),e("span",{staticClass:"ml-3"},[t._v("Twitter")])],1),e("div",{staticClass:"settings__content",class:{"settings__content--loading":t.is_loading}},[e("div",{staticClass:"twitter-accounts"},[null!==t.userStore.user&&t.userStore.user.twitter_accounts.length>0?e("div",{staticClass:"twitter-accounts__heading"},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:person-board-20-filled",height:"30"}}),t._v("連携中のアカウント ")],1):t._e(),null===t.userStore.user||0===t.userStore.user.twitter_accounts.length?e("div",{staticClass:"twitter-accounts__guide"},[e("Icon",{staticClass:"flex-shrink-0",attrs:{icon:"fa-brands:twitter",width:"45px"}}),e("div",{staticClass:"ml-4"},[e("div",{staticClass:"font-weight-bold text-h6"},[t._v("Twitter アカウントと連携していません")]),e("div",{staticClass:"text--text text--darken-1 text-subtitle-2 mt-1"},[t._v(" Twitter アカウントと連携すると、テレビを見ながら Twitter にツイートしたり、ほかの実況ツイートをリアルタイムで表示できるようになります。 ")])])],1):t._e(),t._l(null!==t.userStore.user?t.userStore.user.twitter_accounts:[],(function(s){return e("div",{key:s.id,staticClass:"twitter-account"},[e("img",{staticClass:"twitter-account__icon",attrs:{src:s.icon_url}}),e("div",{staticClass:"twitter-account__info"},[e("div",{staticClass:"twitter-account__info-name"},[e("span",{staticClass:"twitter-account__info-name-text"},[t._v(t._s(s.name))])]),e("span",{staticClass:"twitter-account__info-screen-name"},[t._v(" @"+t._s(s.screen_name)+" "),!0===s.is_oauth_session?e("span",[t._v("(Legacy Session)")]):t._e()])]),e(I.Z,{staticClass:"twitter-account__logout ml-auto",attrs:{width:"124",height:"52",depressed:""},on:{click:function(e){return t.logoutTwitterAccount(s.screen_name)}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-disconnected-20-filled",height:"24"}}),t._v("連携解除 ")],1)],1)})),e(I.Z,{staticClass:"twitter-account__login",attrs:{color:"secondary","max-width":"250",height:"50",depressed:""},on:{click:function(e){return t.loginTwitterAccountWithPasswordForm()}}},[e("Icon",{staticClass:"mr-2",attrs:{icon:"fluent:plug-connected-20-filled",height:"24"}}),t._v("連携するアカウントを追加 ")],1),e(le.Z,{attrs:{"max-width":"600"},model:{value:t.twitter_password_auth_dialog,callback:function(e){t.twitter_password_auth_dialog=e},expression:"twitter_password_auth_dialog"}},[e(ht.Z,[e(gt.EB,{staticClass:"justify-center pt-6 font-weight-bold"},[t._v("Twitter にログイン")]),e(gt.ZB,{staticClass:"pt-2 pb-0"},[e("p",{staticClass:"mb-1"},[t._v("2023/07 以降、Twitter のサードパーティー API の事実上の廃止により、従来のアプリ連携では Twitter にアクセスできなくなりました。")]),e("p",{staticClass:"mb-1"},[t._v("そこで KonomiTV では、代わりに "),e("a",{attrs:{href:"https://github.com/tsukumijima/tweepy-authlib",target:"_blank"}},[t._v("ユーザー名とパスワードでログイン")]),t._v(" することで、これまで通り Twitter 連携ができるようにしています (2要素認証を設定しているアカウントには対応していません) 。")]),e("p",{staticClass:"mb-1"},[t._v("ここで入力したパスワードは一切保存されず、取得した Cookie セッションはローカルの KonomiTV サーバーにのみ保存されます。Cookie セッションが Twitter API 以外の外部サービスに送信されることはありません。")]),e("p",{staticClass:"mb-1"},[t._v("万全は期していますが、非公式な方法のため、使い方次第ではアカウントにペナルティが適用される可能性もあります。自己の責任のもとでご利用ください。")]),e(ft.Z,{ref:"twitter_form",staticClass:"settings__item",on:{submit:function(t){t.preventDefault()}}},[e(bt.Z,{ref:"twitter_screen_name",staticClass:"settings__item-form mt-6",attrs:{outlined:"",label:"ユーザー名 (@ から始まる ID)",placeholder:"screen_name",dense:t.is_form_dense,rules:[t=>!!t||"ユーザー名を入力してください。"]},model:{value:t.twitter_screen_name,callback:function(e){t.twitter_screen_name=e},expression:"twitter_screen_name"}}),e(bt.Z,{staticClass:"settings__item-form",attrs:{outlined:"",label:"パスワード",dense:t.is_form_dense,type:t.twitter_password_showing?"text":"password","append-icon":t.twitter_password_showing?"mdi-eye":"mdi-eye-off",rules:[t=>!!t||"パスワードを入力してください。"]},on:{"click:append":function(e){t.twitter_password_showing=!t.twitter_password_showing}},model:{value:t.twitter_password,callback:function(e){t.twitter_password=e},expression:"twitter_password"}})],1)],1),e(gt.h7,{staticClass:"pt-0 px-6 pb-5"},[e(kt.Z),e(I.Z,{attrs:{color:"text",height:"40",text:""},on:{click:function(e){t.twitter_password_auth_dialog=!1}}},[t._v("キャンセル")]),e(I.Z,{staticClass:"px-4",attrs:{color:"secondary",height:"40"},on:{click:function(e){return t.loginTwitterAccountWithPassword()}}},[t._v("ログイン")])],1)],1)],1)],2),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"fold_panel_after_sending_tweet"}},[t._v("ツイート送信後にパネルを折りたたむ")]),e("label",{staticClass:"settings__item-label",attrs:{for:"fold_panel_after_sending_tweet"}},[t._v(" この設定をオンにすると、ツイートを送信した後に、パネルが自動で折りたたまれます。"),e("br"),t._v(" ツイートするとき以外はできるだけ映像を大きくして見たい方におすすめです。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"fold_panel_after_sending_tweet",inset:"","hide-details":""},model:{value:t.settingsStore.settings.fold_panel_after_sending_tweet,callback:function(e){t.$set(t.settingsStore.settings,"fold_panel_after_sending_tweet",e)},expression:"settingsStore.settings.fold_panel_after_sending_tweet"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"reset_hashtag_when_program_switches"}},[t._v("番組が切り替わったときにハッシュタグフォームをリセットする")]),e("label",{staticClass:"settings__item-label",attrs:{for:"reset_hashtag_when_program_switches"}},[t._v(" チャンネルを切り替えたときや、視聴中の番組が終了し次の番組の放送が開始されたときに、ハッシュタグフォームをリセットするかを設定します。"),e("br"),t._v(" この設定をオンにしておけば、「誤って前番組のハッシュタグをつけたまま次番組の実況ツイートをしてしまう」といったミスを回避できます。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"reset_hashtag_when_program_switches",inset:"","hide-details":""},model:{value:t.settingsStore.settings.reset_hashtag_when_program_switches,callback:function(e){t.$set(t.settingsStore.settings,"reset_hashtag_when_program_switches",e)},expression:"settingsStore.settings.reset_hashtag_when_program_switches"}})],1),e("div",{staticClass:"settings__item settings__item--switch"},[e("label",{staticClass:"settings__item-heading",attrs:{for:"auto_add_watching_channel_hashtag"}},[t._v("視聴中のチャンネルに対応する局タグを自動で追加する")]),e("label",{staticClass:"settings__item-label",attrs:{for:"auto_add_watching_channel_hashtag"}},[t._v(" この設定をオンにすると、視聴中のチャンネルに対応する局タグ (#nhk, #tokyomx など) がハッシュタグフォームに自動で追加されます。"),e("br"),t._v(" 現時点で、局タグは三大首都圏の地上波・BS の一部チャンネル・AT-X にのみ対応しています。"),e("br")]),e(_e.Z,{staticClass:"settings__item-switch",attrs:{id:"auto_add_watching_channel_hashtag",inset:"","hide-details":""},model:{value:t.settingsStore.settings.auto_add_watching_channel_hashtag,callback:function(e){t.$set(t.settingsStore.settings,"auto_add_watching_channel_hashtag",e)},expression:"settingsStore.settings.auto_add_watching_channel_hashtag"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("デフォルトで表示される Twitter タブ内のタブ")]),e("div",{staticClass:"settings__item-label"},[t._v(" 視聴画面を開いたときに、パネルの Twitter タブの中で最初に表示されるタブを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.twitter_active_tab},model:{value:t.settingsStore.settings.twitter_active_tab,callback:function(e){t.$set(t.settingsStore.settings,"twitter_active_tab",e)},expression:"settingsStore.settings.twitter_active_tab"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("ツイートにつけるハッシュタグの位置")]),e("div",{staticClass:"settings__item-label"},[t._v(" ツイート本文から見て、ハッシュタグをどの位置につけてツイートするかを設定します。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tweet_hashtag_position},model:{value:t.settingsStore.settings.tweet_hashtag_position,callback:function(e){t.$set(t.settingsStore.settings,"tweet_hashtag_position",e)},expression:"settingsStore.settings.tweet_hashtag_position"}})],1),e("div",{staticClass:"settings__item"},[e("div",{staticClass:"settings__item-heading"},[t._v("ツイートするキャプチャに番組タイトルの透かしを描画する")]),e("div",{staticClass:"settings__item-label"},[t._v(" ツイートするキャプチャに、透かしとして視聴中の番組タイトルを描画するかを設定します。"),e("br"),t._v(" 透かしの描画位置は 左上・右上・左下・右下 から選択できます。"),e("br")]),e(Ie.Z,{staticClass:"settings__item-form",attrs:{outlined:"","hide-details":"",dense:t.is_form_dense,items:t.tweet_capture_watermark_position},model:{value:t.settingsStore.settings.tweet_capture_watermark_position,callback:function(e){t.$set(t.settingsStore.settings,"tweet_capture_watermark_position",e)},expression:"settingsStore.settings.tweet_capture_watermark_position"}})],1)]),e(js.Z,{attrs:{value:t.is_twitter_password_auth_sending,"z-index":"300"}},[e(Zs.Z,{attrs:{color:"secondary",indeterminate:"",size:"64"}})],1)],1)},Ps=[];class $s{static async fetchAuthorizationURL(){const t=await G.get("/twitter/auth");return"is_error"in t?(G.showGenericError(t,"Twitter アカウントとの連携用の認証 URL を取得できませんでした。"),null):t.data.authorization_url}static async authWithPassword(t){const e=await G.post("/twitter/password-auth",t);if("is_error"in e){if(e.error.message.startsWith("Failed to authenticate with password")){const t=e.error.message.match(/Message: (.+)\)/)[1];N.error(`ログインに失敗しました。${t}`)}else if(e.error.message.startsWith("Unexpected error occurred while authenticate with password")){const t=e.error.message.match(/Message: (.+)\)/)[1];N.error(`ログインフローの途中で予期せぬエラーが発生しました。${t}`)}else e.error.message.startsWith("Failed to get user information")?N.error("Twitter アカウントのユーザー情報の取得に失敗しました。"):G.showGenericError(e,"Twitter アカウントとの連携に失敗しました。");return!1}return!0}static async logoutAccount(t){const e=await G["delete"](`/twitter/accounts/${t}`);return!("is_error"in e)||(G.showGenericError(e,"Twitter アカウントとの連携を解除できませんでした。"),!1)}static async sendTweet(t,e,s){const i=new FormData;i.append("tweet",e);for(const n of s)i.append("images",n);const a=await G.post(`/twitter/accounts/${t}/tweets`,i,{headers:{"Content-Type":"multipart/form-data"}});return"is_error"in a?a.error.message?Number.isNaN(a.status)?{message:`ツイートの送信に失敗しました。(${a.error.message})`,is_error:!0}:{message:`ツイートの送信に失敗しました。(HTTP Error ${a.status} / ${a.error.message})`,is_error:!0}:{message:`ツイートの送信に失敗しました。(HTTP Error ${a.status})`,is_error:!0}:!0===a.data.is_success?{message:a.data.detail,is_error:!1}:{message:a.data.detail,is_error:!0}}}var zs=$s,As=o["default"].extend({name:"Settings-Twitter",components:{SettingsBase:ke},data(){return{is_form_dense:pt.isSmartphoneHorizontal(),twitter_active_tab:[{text:"ツイート検索タブ",value:"Search"},{text:"タイムラインタブ",value:"Timeline"},{text:"キャプチャタブ",value:"Capture"}],tweet_hashtag_position:[{text:"ツイート本文の前に追加する",value:"Prepend"},{text:"ツイート本文の後に追加する",value:"Append"},{text:"ツイート本文の前に追加してから改行する",value:"PrependWithLineBreak"},{text:"ツイート本文の後に改行してから追加する",value:"AppendWithLineBreak"}],tweet_capture_watermark_position:[{text:"透かしを描画しない",value:"None"},{text:"透かしをキャプチャの左上に描画する",value:"TopLeft"},{text:"透かしをキャプチャの右上に描画する",value:"TopRight"},{text:"透かしをキャプチャの左下に描画する",value:"BottomLeft"},{text:"透かしをキャプチャの右下に描画する",value:"BottomRight"}],is_loading:!0,is_twitter_password_auth_sending:!1,twitter_password_auth_dialog:!1,twitter_screen_name:"",twitter_password:"",twitter_password_showing:!1}},computed:{...(0,a.Kc)(st,R)},async created(){await this.userStore.fetchUser(),this.is_loading=!1},methods:{async loginTwitterAccountWithPasswordForm(){if(!1===this.userStore.is_logged_in)return this.$message.warning("連携をはじめるには、KonomiTV アカウントにログインしてください。"),await pt.sleep(.01),void(this.twitter_password_auth_dialog=!1);this.twitter_password_auth_dialog=!0},async loginTwitterAccountWithPassword(){if(!1===this.$refs.twitter_form.validate())return;this.is_twitter_password_auth_sending=!0;const t=await zs.authWithPassword({screen_name:this.twitter_screen_name,password:this.twitter_password});if(this.is_twitter_password_auth_sending=!1,!1===t)return;if(await this.userStore.fetchUser(!0),null===this.userStore.user)return void this.$message.error("アカウント情報を取得できませんでした。");const e=[...this.userStore.user.twitter_accounts].sort(((t,e)=>t.updated_ate.updated_at?-1:0))[0];this.$message.success(`Twitter @${e.screen_name} と連携しました。`),this.$refs.twitter_form.reset(),this.twitter_password_auth_dialog=!1},async logoutTwitterAccount(t){const e=await zs.logoutAccount(t);!1!==e&&(await this.userStore.fetchUser(!0),this.$message.success(`Twitter @${t} との連携を解除しました。`))}}}),Ds=As,Ls=(0,p.Z)(Ds,Bs,Ps,!1,null,"61fbe4ed",null),Ns=Ls.exports,Es=s(756),Ks=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("Header"),e("main",[e("Navigation"),e("div",{staticClass:"channels-container channels-container--home",class:{"channels-container--loading":t.is_loading}},[e("v-tabs-fix",{staticClass:"channels-tab",attrs:{centered:""},model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},t._l(Array.from(t.channelsStore.channels_list_with_pinned),(function([s]){return e(Es.Z,{key:s,staticClass:"channels-tab__item"},[t._v(" "+t._s(s)+" ")])})),1),e("v-tabs-items-fix",{staticClass:"channels-list",model:{value:t.tab,callback:function(e){t.tab=e},expression:"tab"}},t._l(Array.from(t.channelsStore.channels_list_with_pinned),(function([s,i]){return e("v-tab-item-fix",{key:s,staticClass:"channels-tabitem"},[e("div",{staticClass:"channels",class:`channels--tab-${s} channels--length-${i.length}`},[t._l(i,(function(s){return e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],key:s.id,staticClass:"channel",attrs:{to:`/tv/watch/${s.display_channel_id}`}},[e("div",{staticClass:"channel__broadcaster"},[e("img",{staticClass:"channel__broadcaster-icon",attrs:{src:`${t.Utils.api_base_url}/channels/${s.display_channel_id}/logo`}}),e("div",{staticClass:"channel__broadcaster-content"},[e("span",{staticClass:"channel__broadcaster-name"},[t._v("Ch: "+t._s(s.channel_number)+" "+t._s(s.name))]),e("div",{staticClass:"channel__broadcaster-status"},[e("div",{staticClass:"channel__broadcaster-status-force",class:`channel__broadcaster-status-force--${t.ChannelUtils.getChannelForceType(s.jikkyo_force)}`},[e("Icon",{attrs:{icon:"fa-solid:fire-alt",height:"12px"}}),e("span",{staticClass:"ml-1"},[t._v("勢い:")]),e("span",{staticClass:"ml-1"},[t._v(t._s(s.jikkyo_force??"--"))]),e("span",{staticStyle:{"margin-left":"3px"}},[t._v(" コメ/分")])],1),e("div",{staticClass:"channel__broadcaster-status-viewers ml-4"},[e("Icon",{attrs:{icon:"fa-solid:eye",height:"14px"}}),e("span",{staticClass:"ml-1"},[t._v("視聴数:")]),e("span",{staticClass:"ml-1"},[t._v(t._s(s.viewer_count))])],1)])]),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip",value:t.isPinnedChannel(s.display_channel_id)?"ピン留めを外す":"ピン留めする",expression:"isPinnedChannel(channel.display_channel_id) ? 'ピン留めを外す' : 'ピン留めする'"}],staticClass:"channel__broadcaster-pin",class:{"channel__broadcaster-pin--pinned":t.isPinnedChannel(s.display_channel_id)},on:{click:function(e){e.preventDefault(),e.stopPropagation(),t.isPinnedChannel(s.display_channel_id)?t.removePinnedChannel(s.display_channel_id):t.addPinnedChannel(s.display_channel_id)},mousedown:function(t){t.preventDefault(),t.stopPropagation()}}},[e("Icon",{attrs:{icon:"fluent:pin-20-filled",width:"24px"}})],1)]),e("div",{staticClass:"channel__program-present"},[e("div",{staticClass:"channel__program-present-title-wrapper"},[e("span",{staticClass:"channel__program-present-title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(s.program_present,"title"))}}),e("span",{staticClass:"channel__program-present-time"},[t._v(t._s(t.ProgramUtils.getProgramTime(s.program_present)))])]),e("span",{staticClass:"channel__program-present-description",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(s.program_present,"description"))}})]),e(kt.Z),e("div",{staticClass:"channel__program-following"},[e("div",{staticClass:"channel__program-following-title"},[e("span",{staticClass:"channel__program-following-title-decorate"},[t._v("NEXT")]),e("Icon",{staticClass:"channel__program-following-title-icon",attrs:{icon:"fluent:fast-forward-20-filled",width:"16px"}}),e("span",{staticClass:"channel__program-following-title-text",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(s.program_following,"title"))}})],1),e("span",{staticClass:"channel__program-following-time"},[t._v(t._s(t.ProgramUtils.getProgramTime(s.program_following)))])]),e("div",{staticClass:"channel__progressbar"},[e("div",{staticClass:"channel__progressbar-progress",style:`width:${t.ProgramUtils.getProgramProgress(s.program_present)}%;`})])],1)})),"ピン留め"===s&&0===i.length?e("div",{staticClass:"pinned-container d-flex justify-center align-center w-100"},[e("div",{staticClass:"d-flex justify-center align-center flex-column"},[e("h2",[t._v("ピン留めされているチャンネルが"),e("br"),t._v("ありません。")]),e("div",{staticClass:"mt-4 text--text text--darken-1"},[t._v("各チャンネルの "),e("Icon",{staticStyle:{position:"relative",bottom:"-5px"},attrs:{icon:"fluent:pin-20-filled",width:"22px"}}),t._v(" アイコンから、よくみる"),e("br"),t._v("チャンネルをこのタブにピン留めできます。")],1),e("div",{staticClass:"mt-2 text--text text--darken-1"},[t._v("チャンネルをピン留めすると、"),e("br"),t._v("このタブが最初に表示されます。")])])]):t._e()],2)])})),1)],1)],1)],1)},Ms=[];const Hs={id:"NID0-SID0-EID0",channel_id:"NID0-SID0",network_id:0,service_id:0,event_id:0,title:"取得中…",description:"取得中…",detail:{},start_time:"2000-01-01T00:00:00+09:00",end_time:"2000-01-01T00:00:00+09:00",duration:0,is_free:!0,genres:[],video_type:"映像1080i(1125i)、アスペクト比16:9 パンベクトルなし",video_codec:"MPEG-2",video_resolution:"1080i",primary_audio_type:"2/0モード(ステレオ)",primary_audio_language:"日本語",primary_audio_sampling_rate:"48kHz",secondary_audio_type:null,secondary_audio_language:null,secondary_audio_sampling_rate:null},Fs={id:"NID0-SID0",display_channel_id:"gr000",network_id:0,service_id:0,transport_stream_id:null,remocon_id:0,channel_number:"---",type:"GR",name:"取得中…",jikkyo_force:null,is_subchannel:!1,is_radiochannel:!1,is_watchable:!0,is_display:!0,viewer_count:0,program_present:Hs,program_following:Hs};class Vs{static async fetchAll(){const t=await G.get("/channels");return"is_error"in t?(G.showGenericError(t,"チャンネル情報を取得できませんでした。"),null):t.data}static async fetch(t){const e=await G.get(`/channels/${t}`);return"is_error"in e?(G.showGenericError(e,"チャンネル情報を取得できませんでした。"),null):e.data}static async fetchJikkyoSession(t){const e=await G.get(`/channels/${t}/jikkyo`);return"is_error"in e?(G.showGenericError(e,"ニコニコ実況のセッション情報を取得できませんでした。"),null):e.data}}var Rs=Vs;const Us=(0,a.Q_)("channels",{state:()=>({display_channel_id:"gr000",channels_list:{GR:[],BS:[],CS:[],CATV:[],SKY:[],STARDIGIO:[]},is_channels_list_initial_updated:!1,last_updated_at:0}),getters:{is_showing_live(){return"gr000"!==this.display_channel_id},channel(){const t=this.channels_list[A.getChannelType(this.display_channel_id)];if(void 0===t||0===t.length)return{previous:Fs,current:Fs,next:Fs};const e=t.findIndex((t=>t.display_channel_id===this.display_channel_id));if(-1===e){const t={...Fs.program_present,display_channel_id:"gr999",title:"チャンネル情報取得エラー",description:"このチャンネル ID のチャンネル情報は存在しません。"},e={...Fs,display_channel_id:"gr999",name:"ERROR",program_present:t,program_following:t};return{previous:e,current:e,next:e}}const s=(()=>{let s=e-1;while(t.length){if(s<=-1&&(s=t.length-1),t[s].is_display)return s;s--}return 0})(),i=(()=>{let s=e+1;while(t.length){if(s>=t.length&&(s=0),t[s].is_display)return s;s++}return 0})();return{previous:t[s],current:t[e],next:t[i]}},channels_list_with_pinned(){const t=st(),e=new Map;if(e.set("ピン留め",[]),e.set("地デジ",[]),!1===this.is_channels_list_initial_updated)return e;e.set("BS",[]),e.set("CS",[]),e.set("CATV",[]),e.set("SKY",[]),e.set("StarDigio",[]);for(const[s,i]of Object.entries(this.channels_list))for(const a of i)if(!1!==a.is_display)switch(t.settings.pinned_channel_ids.includes(a.display_channel_id)&&e.get("ピン留め")?.push(a),a.type){case"GR":e.get("地デジ")?.push(a);break;case"BS":e.get("BS")?.push(a);break;case"CS":e.get("CS")?.push(a);break;case"CATV":e.get("CATV")?.push(a);break;case"SKY":e.get("SKY")?.push(a);break;case"STARDIGIO":e.get("StarDigio")?.push(a);break}for(const s of[...e.get("ピン留め")]){const i=t.settings.pinned_channel_ids.indexOf(s.display_channel_id);e.get("ピン留め")[i]=s}for(const[s,i]of e)"ピン留め"!==s&&0===i.length&&e.delete(s);return 1===e.size&&e.has("ピン留め")&&e.delete("ピン留め"),e},channels_list_with_pinned_for_watch(){const t=new Map([...this.channels_list_with_pinned]);return 0===t.get("ピン留め")?.length&&t.delete("ピン留め"),t}},actions:{getChannel(t){const e=this.channels_list[A.getChannelType(t)];return void 0===e?null:e.find((e=>e.display_channel_id===t))??null},getChannelByRemoconID(t,e){const s=this.channels_list[t],i=s.find((t=>t.remocon_id===e));return i??null},updateChannel(t,e){const s=A.getChannelType(t);if(void 0===this.channels_list[s])return;const i=this.channels_list[s].findIndex((e=>e.display_channel_id===t));-1!==i&&o["default"].set(this.channels_list[s],i,e)},async update(t=!1){const e=async()=>{const t=await Rs.fetchAll();null!==t&&(this.channels_list=t,this.is_channels_list_initial_updated=!0,this.last_updated_at=pt.time())};!0!==this.is_channels_list_initial_updated||!1!==t?await e():pt.time()-this.last_updated_at>60&&e()}}});var Gs=Us,Ws=o["default"].extend({name:"TV-Home",components:{Header:jt,Navigation:Rt},data(){return{Utils:pt,ChannelUtils:A,ProgramUtils:mt,tab:null,is_loading:!0,interval_ids:[]}},computed:{...(0,a.Kc)(Gs,st)},async created(){0===this.settingsStore.settings.pinned_channel_ids.length&&(this.tab=1);const t=60-(new Date).getSeconds();this.interval_ids.push(window.setTimeout((()=>{this.channelsStore.update(!0),this.interval_ids.push(window.setInterval((()=>this.channelsStore.update(!0)),3e4))}),1e3*t)),await this.channelsStore.update(),await pt.sleep(.01),0===this.channelsStore.channels_list_with_pinned.get("ピン留め")?.length&&(this.tab=1),this.is_loading=!1},beforeDestroy(){for(const t of this.interval_ids)window.clearInterval(t)},methods:{addPinnedChannel(t){this.settingsStore.settings.pinned_channel_ids.push(t);const e=this.channelsStore.getChannel(t);e&&this.$message.show(`${e.name}をピン留めしました。`)},removePinnedChannel(t){this.settingsStore.settings.pinned_channel_ids.splice(this.settingsStore.settings.pinned_channel_ids.indexOf(t),1),0===this.channelsStore.channels_list_with_pinned.get("ピン留め")?.length&&(this.tab=1);const e=this.channelsStore.getChannel(t);e&&this.$message.show(`${e.name}のピン留めを外しました。`)},isPinnedChannel(t){return this.settingsStore.settings.pinned_channel_ids.includes(t)}}}),qs=Ws,Ys=(0,p.Z)(qs,Ks,Ms,!1,null,"b22adce6",null),Xs=Ys.exports,Js=s(17024),Qs=s(57894),ti=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"route-container"},[e("main",{staticClass:"watch-container",class:{"watch-container--control-display":t.is_control_display,"watch-container--panel-display":!(!t.Utils.isSmartphoneVertical()&&!t.Utils.isTabletVertical())||t.is_panel_display,"watch-container--fullscreen":t.is_fullscreen}},[e("nav",{staticClass:"watch-navigation",on:{mousemove:function(e){return t.controlDisplayTimer(e)},touchmove:function(e){return t.controlDisplayTimer(e)},click:function(e){return t.controlDisplayTimer(e)}}},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"watch-navigation__icon",attrs:{to:"/tv/"}},[e("img",{staticClass:"watch-navigation__icon-image",attrs:{src:"/assets/images/icon.svg",width:"23px"}})]),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"テレビをみる",expression:"'テレビをみる'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/tv/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:tv-20-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"ビデオをみる",expression:"'ビデオをみる'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/videos/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:movies-and-tv-20-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"番組表",expression:"'番組表'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/timetable/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:calendar-ltr-20-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"録画予約",expression:"'録画予約'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/reserves/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",staticStyle:{padding:"0.5px"},attrs:{icon:"fluent:timer-16-regular",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"マイリスト",expression:"'マイリスト'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/mylist/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"ic:round-playlist-play",width:"26px"}})],1),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"キャプチャ",expression:"'キャプチャ'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/captures/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:image-multiple-24-regular",width:"26px"}})],1),e(kt.Z),e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.right",value:"設定",expression:"'設定'",modifiers:{right:!0}}],staticClass:"watch-navigation__link",attrs:{"active-class":"watch-navigation__link--active",to:"/settings/"}},[e("Icon",{staticClass:"watch-navigation__link-icon",attrs:{icon:"fluent:settings-20-regular",width:"26px"}})],1)],1),e("div",{staticClass:"watch-content",on:{mousemove:function(e){return t.controlDisplayTimer(e,!0)},touchmove:function(e){return t.controlDisplayTimer(e,!0)},click:function(e){return t.controlDisplayTimer(e,!0)}}},[e("header",{staticClass:"watch-header"},[e("router-link",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"watch-header__back-icon",attrs:{to:"/tv/"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"25px"}})],1),e("img",{staticClass:"watch-header__broadcaster",attrs:{src:`${t.Utils.api_base_url}/channels/${t.channelsStore.display_channel_id}/logo`}}),e("span",{staticClass:"watch-header__program-title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_present,"title"))}}),e("span",{staticClass:"watch-header__program-time"},[t._v(" "+t._s(t.ProgramUtils.getProgramTime(t.channelsStore.channel.current.program_present,!0))+" ")]),e(kt.Z),e("span",{staticClass:"watch-header__now"},[t._v(t._s(t.time))])],1),e("div",{staticClass:"watch-player",class:{"watch-player--loading":t.is_loading,"watch-player--virtual-keyboard-display":t.is_virtual_keyboard_display&&t.Utils.hasActiveElementClass("dplayer-comment-input")}},[e("div",{staticClass:"watch-player__background-wrapper"},[e("div",{staticClass:"watch-player__background",class:{"watch-player__background--display":t.is_background_display},style:{backgroundImage:`url(${t.background_url})`}},[e("img",{staticClass:"watch-player__background-logo",attrs:{src:"/assets/images/logo.svg"}})])]),e(Zs.Z,{staticClass:"watch-player__buffering",class:{"watch-player__buffering--display":t.is_video_buffering&&(t.is_loading||null!==t.player&&!t.player.video.paused)},attrs:{indeterminate:"",size:"60",width:"6"}}),e("div",{staticClass:"watch-player__dplayer"}),e("div",{staticClass:"watch-player__button",on:{mousemove:function(e){return t.controlDisplayTimer(e)},touchmove:function(e){return t.controlDisplayTimer(e)},click:function(e){return t.controlDisplayTimer(e)}}},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.top",value:"前のチャンネル",expression:"'前のチャンネル'",modifiers:{top:!0}}],staticClass:"switch-button switch-button-up",on:{click:function(e){t.is_zapping=!0,t.$router.push({path:`/tv/watch/${t.channelsStore.channel.previous.display_channel_id}`})}}},[e("Icon",{staticClass:"switch-button-icon",attrs:{icon:"fluent:ios-arrow-left-24-filled",width:"32px",rotate:"1"}})],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"switch-button switch-button-panel switch-button-panel--open",on:{click:function(e){t.is_panel_display=!t.is_panel_display}}},[e("Icon",{staticClass:"switch-button-icon",attrs:{icon:"fluent:navigation-16-filled",width:"32px"}})],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"},{name:"tooltip",rawName:"v-tooltip.bottom",value:"次のチャンネル",expression:"'次のチャンネル'",modifiers:{bottom:!0}}],staticClass:"switch-button switch-button-down",on:{click:function(e){t.is_zapping=!0,t.$router.push({path:`/tv/watch/${t.channelsStore.channel.next.display_channel_id}`})}}},[e("Icon",{staticClass:"switch-button-icon",attrs:{icon:"fluent:ios-arrow-right-24-filled",width:"33px",rotate:"1"}})],1)])],1)]),e("div",{staticClass:"watch-panel",on:{mousemove:function(e){return t.controlDisplayTimer(e)}}},[e("div",{staticClass:"watch-panel__header"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-close-button",on:{click:function(e){t.is_panel_display=!1}}},[e("Icon",{staticClass:"panel-close-button__icon",attrs:{icon:"akar-icons:chevron-right",width:"25px"}}),e("span",{staticClass:"panel-close-button__text"},[t._v("閉じる")])],1),e(kt.Z),e("div",{staticClass:"panel-broadcaster"},[e("img",{staticClass:"panel-broadcaster__icon",attrs:{src:`${t.Utils.api_base_url}/channels/${t.channelsStore.display_channel_id}/logo`}}),e("div",{staticClass:"panel-broadcaster__number"},[t._v(t._s(t.channelsStore.channel.current.channel_number))]),e("div",{staticClass:"panel-broadcaster__name"},[t._v(t._s(t.channelsStore.channel.current.name))])])],1),e("div",{staticClass:"watch-panel__content-container"},[e("Program",{staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Program"===t.tv_panel_active_tab}}),e("Channel",{staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Channel"===t.tv_panel_active_tab}}),e("Comment",{ref:"Comment",staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Comment"===t.tv_panel_active_tab},attrs:{channel:t.channelsStore.channel.current,player:t.player}}),e("Twitter",{ref:"Twitter",staticClass:"watch-panel__content",class:{"watch-panel__content--active":"Twitter"===t.tv_panel_active_tab},attrs:{player:t.player,is_virtual_keyboard_display:t.is_virtual_keyboard_display},on:{panel_folding_requested:function(e){t.is_panel_display=!1}}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"watch-panel__content-remocon-button elevation-8",class:{"watch-panel__content-remocon-button--active":"Program"===t.tv_panel_active_tab||"Channel"===t.tv_panel_active_tab},on:{click:function(e){t.is_remocon_display=!t.is_remocon_display}}},[e("Icon",{staticClass:"panel-close-button__icon",attrs:{icon:"material-symbols:remote-gen",width:"25px"}})],1),e("Remocon",{staticClass:"watch-panel__remocon",attrs:{showing:("Program"===t.tv_panel_active_tab||"Channel"===t.tv_panel_active_tab)&&!0===t.is_remocon_display},on:{close:function(e){t.is_remocon_display=!1}}})],1),e("div",{staticClass:"watch-panel__navigation"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Program"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Program"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"fa-solid:info-circle",width:"33px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("番組情報")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Channel"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Channel"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"fa-solid:broadcast-tower",width:"34px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("チャンネル")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Comment"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Comment"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"bi:chat-left-text-fill",width:"29px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("コメント")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"panel-navigation-button",class:{"panel-navigation-button--active":"Twitter"===t.tv_panel_active_tab},on:{click:function(e){t.tv_panel_active_tab="Twitter"}}},[e("Icon",{staticClass:"panel-navigation-button__icon",attrs:{icon:"fa-brands:twitter",width:"34px"}}),e("span",{staticClass:"panel-navigation-button__text"},[t._v("Twitter")])],1)])])]),e(le.Z,{attrs:{"max-width":"1050",transition:"slide-y-transition"},model:{value:t.shortcut_key_modal,callback:function(e){t.shortcut_key_modal=e},expression:"shortcut_key_modal"}},[e(ht.Z,[e(gt.EB,{staticClass:"px-5 pt-4 pb-3 d-flex align-center font-weight-bold"},[e("Icon",{attrs:{icon:"fluent:keyboard-20-filled",height:"28px"}}),e("span",{staticClass:"ml-3"},[t._v("キーボードショートカット")]),e(kt.Z),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"d-flex align-center rounded-circle cursor-pointer px-2 py-2",on:{click:function(e){t.shortcut_key_modal=!1}}},[e("Icon",{attrs:{icon:"fluent:dismiss-12-filled",width:"23px",height:"23px"}})],1)],1),e("div",{staticClass:"px-5 pb-4"},[e(Qs.Z,t._l(t.shortcut_key_list,(function(s,i){return e(Js.Z,{key:i,attrs:{cols:"6"}},t._l(s,(function(s){return e("div",{key:s.name,staticClass:"mt-3"},[e("div",{staticClass:"text-subtitle-1 d-flex align-center font-weight-bold"},[e("Icon",{attrs:{icon:s.icon,height:s.icon_height}}),e("span",{staticClass:"ml-2"},[t._v(t._s(s.name))])],1),t._l(s.shortcuts,(function(s){return e("div",{key:s.name,staticClass:"mt-3"},[e("div",{staticClass:"text-subtitle-2 mt-2 d-flex align-center font-weight-medium"},[e("span",{staticClass:"mr-2",domProps:{innerHTML:t._s(s.name)}}),e("div",{staticClass:"ml-auto d-flex align-center flex-shrink-0"},t._l(s.keys,(function(i,a){return e("div",{key:i.name,staticClass:"ml-auto d-flex align-center"},[e("span",{staticClass:"shortcut-key"},[t._l(i.name.split(";"),(function(t){return e("Icon",{directives:[{name:"show",rawName:"v-show",value:!0===i.icon,expression:"key.icon === true"}],key:t,attrs:{icon:t,height:"18px"}})})),!1===i.icon?e("span",{domProps:{innerHTML:t._s(i.name)}}):t._e()],2),a{this.watch_session?.send(JSON.stringify({type:"startWatching",data:{reconnect:!1}}))}),{signal:this.abort_controller.signal}),this.watch_session.addEventListener("close",(async e=>{!0!==t&&(console.error(`[LiveCommentManager][WatchSession] Connection closed. (Code: ${e.code})`),this.player.notice(`ニコニコ実況との接続が切断されました。(Code: ${e.code})`,void 0,void 0,"#FF6F6A"),await pt.sleep(10),await this.reconnect())}),{signal:this.abort_controller.signal}),this.watch_session.addEventListener("message",(async e=>{if(null===this.watch_session)return;const s=JSON.parse(e.data);switch(s.type){case"seat":if(null!==this.keep_seat_interval_id)break;this.keep_seat_interval_id=window.setInterval((()=>{this.watch_session&&this.watch_session.readyState===WebSocket.OPEN?this.watch_session.send(JSON.stringify({type:"keepSeat"})):window.clearInterval(this.keep_seat_interval_id??0)}),1e3*s.data.keepIntervalSec);break;case"ping":this.watch_session.send(JSON.stringify({type:"pong"}));break;case"error":{if("COMMENT_POST_NOT_ALLOWED"===s.data.code||"INVALID_MESSAGE"===s.data.code)break;let t=`ニコニコ実況でエラーが発生しています。(Code: ${s.data.code})`;switch(s.data.code){case"CONNECT_ERROR":t="ニコニコ実況のコメントサーバーに接続できません。";break;case"CONTENT_NOT_READY":t="ニコニコ実況が配信できない状態です。";break;case"NO_THREAD_AVAILABLE":t="ニコニコ実況のコメントスレッドを取得できません。";break;case"NO_ROOM_AVAILABLE":t="ニコニコ実況のコメント部屋を取得できません。";break;case"NO_PERMISSION":t="ニコニコ実況の API にアクセスする権限がありません。";break;case"NOT_ON_AIR":t="ニコニコ実況が放送中ではありません。";break;case"BROADCAST_NOT_FOUND":t="ニコニコ実況の配信情報を取得できません。";break;case"INTERNAL_SERVERERROR":t="ニコニコ実況でサーバーエラーが発生しています。";break}console.error(`[LiveCommentManager][WatchSession] Error occurred. (Code: ${s.data.code})`),this.player.notice(t,void 0,void 0,"#FF6F6A"),await pt.sleep(5),await this.reconnect();break}case"reconnect":await this.reconnect();break;case"disconnect":{t=!0;let e=`ニコニコ実況との接続が切断されました。(${s.data.reason})`;switch(s.data.reason){case"TAKEOVER":e="ニコニコ実況の番組から追い出されました。";break;case"NO_PERMISSION":e="ニコニコ実況の番組の座席を取得できませんでした。";break;case"END_PROGRAM":e="ニコニコ実況がリセットされたか、コミュニティの番組が終了しました。";break;case"PING_TIMEOUT":e="コメントサーバーとの接続生存確認に失敗しました。";break;case"TOO_MANY_CONNECTIONS":e="ニコニコ実況の同一ユーザからの接続数上限を越えています。";break;case"TOO_MANY_WATCHINGS":e="ニコニコ実況の同一ユーザからの視聴番組数上限を越えています。";break;case"CROWDED":e="ニコニコ実況の番組が満席です。";break;case"MAINTENANCE_IN":e="ニコニコ実況はメンテナンス中です。";break;case"SERVICE_TEMPORARILY_UNAVAILABLE":e="ニコニコ実況で一時的にサーバーエラーが発生しています。";break}console.error(`[LiveCommentManager][WatchSession] Disconnected. (Reason: ${s.data.reason})`),this.player.notice(e),await pt.sleep(5),await this.reconnect();break}}}),{signal:this.abort_controller.signal}),new Promise((t=>{this.watch_session.addEventListener("message",(async e=>{const s=JSON.parse(e.data);if("room"===s.type)return this.vpos_base_timestamp=rt()(s.data.vposBaseTime).valueOf(),console.log(`[LiveCommentManager][WatchSession] Connected.\nThread ID: ${s.data.threadId}\n`),t({is_success:!0,detail:"視聴セッションを取得しました。",message_server_url:s.data.messageServer.uri,thread_id:s.data.threadId,your_post_key:s.data.yourPostKey?s.data.yourPostKey:null})}),{signal:this.abort_controller.signal})})))}initCommentSession(t){const e=[];let s=!1;this.comment_session=new WebSocket(t.message_server_url),this.comment_session.addEventListener("open",(()=>{null!==this.comment_session&&this.comment_session.send(JSON.stringify([{ping:{content:"rs:0"}},{ping:{content:"ps:0"}},{thread:{version:"20061206",thread:t.thread_id,threadkey:t.your_post_key,user_id:"",res_from:-50}},{ping:{content:"pf:0"}},{ping:{content:"rf:0"}}]))}),{signal:this.abort_controller.signal}),this.comment_session.addEventListener("message",(async t=>{const i=JSON.parse(t.data);if(void 0!==i.thread&&0!==i.thread.resultcode)return void console.error(`[LiveCommentManager][CommentSession] Connection failed. (Code: ${i.thread.resultcode})`);if(void 0!==i.ping&&"rf:0"===i.ping.content)return s=!0,void this.on_initial_comments_received(e);const a=i.chat;if(void 0===a||void 0===a.content||""===a.content||a.yourpost&&1===a.yourpost)return;const{color:n,position:r,size:o}=it.parseCommentCommand(a.mail);if(it.isMutedComment(a.content,a.user_id,n,r,o))return;const l={id:a.no,text:a.content,time:rt()(1e3*a.date).format("HH:mm:ss"),user_id:a.user_id,my_post:!1};if(!1===s)return void e.push(l);let c=0;this.player.video.buffered.length>=1&&(c=this.player.video.buffered.end(0));const _=c-this.player.video.currentTime;await pt.sleep(_),this.on_comment_received(l),!1===this.player.video.paused&&this.player.danmaku.draw({text:a.content,color:n,type:r,size:o})}),{signal:this.abort_controller.signal})}sendComment(t){const e={"#FFEAEA":"white","#F02840":"red","#FD7E80":"pink","#FDA708":"orange","#FFE133":"yellow","#64DD17":"green","#00D4F5":"cyan","#4763FF":"blue"},s={top:"ue",right:"naka",bottom:"shita"},i=Math.round((rt()().valueOf()-this.vpos_base_timestamp)/10);if(null===this.watch_session||this.watch_session.readyState!==WebSocket.OPEN)return console.error("[LiveCommentManager][WatchSession] Comment sending failed. (Connection is not established.)"),void t.error("コメントの送信に失敗しました。WebSocket 接続が確立されていません。");this.watch_session.send(JSON.stringify({type:"postComment",data:{text:t.data.text,color:e[t.data.color.toUpperCase()],position:s[t.data.type],size:t.data.size,vpos:i,isAnonymous:!0}}));const a=new AbortController;this.watch_session.addEventListener("message",(e=>{const s=JSON.parse(e.data);switch(s.type){case"postCommentResult":t.success(),a.abort();break;case"error":{let e=`コメントの送信に失敗しました。(${s.data.code})`;switch(s.data.code){case"COMMENT_POST_NOT_ALLOWED":e="コメントが許可されていません。";break;case"INVALID_MESSAGE":e="コメント内容が無効です。";break}console.error(`[LiveCommentManager][WatchSession] Comment sending failed. (Code: ${s.data.code})`),t.error(e),a.abort();break}}}),{signal:a.signal})}async reconnect(){console.warn("[LiveCommentManager][WatchSession] Reconnecting..."),this.player.notice("ニコニコ実況に再接続しています…"),this.destroy();const t=await this.initSession();!1===t.is_success&&(console.error("[LiveCommentManager][WatchSession] Reconnection failed."),this.player.notice(t.detail,void 0,void 0,"#FF6F6A"))}destroy(){this.abort_controller.abort(),this.abort_controller=new AbortController,null!==this.watch_session&&(this.watch_session.close(),this.watch_session=null),null!==this.comment_session&&(this.comment_session.close(),this.comment_session=null),null!==this.keep_seat_interval_id&&(window.clearInterval(this.keep_seat_interval_id),this.keep_seat_interval_id=null),this.vpos_base_timestamp=0,console.log("[LiveCommentManager][WatchSession] Destroyed.")}}var hi=pi,gi=o["default"].extend({name:"Panel-CommentTab",components:{CommentMuteSettings:gs},data(){return{Utils:pt,is_manual_scroll:!1,is_auto_scrolling:!1,comment_list:[],comment_list_element:null,is_comment_list_dropdown_display:!1,comment_list_dropdown_top:0,comment_list_dropdown_comment:null,live_comment_manager:null,initialize_failed_message:null,visibilitychange_listener:null,resize_observer:null,comment_mute_settings_modal:!1,player:null}},computed:{...(0,a.Kc)(R)},created(){this.userStore.fetchUser()},mounted(){null===this.comment_list_element&&(this.comment_list_element=this.$el.querySelector(".comment-list"));let t=!1;this.comment_list_element.onmousedown=e=>{if(null===this.comment_list_element)return;const s=e.clientX-this.comment_list_element.getBoundingClientRect().left;s>this.comment_list_element.clientWidth&&(t=!0)},this.comment_list_element.onmouseup=e=>{if(null===this.comment_list_element)return;const s=e.clientX-this.comment_list_element.getBoundingClientRect().left;s>this.comment_list_element.clientWidth&&(t=!1)};const e=()=>{t=!0,window.setTimeout((()=>t=!1),100)};let s=!1;this.comment_list_element.ontouchstart=()=>s=!0,this.comment_list_element.ontouchend=()=>s=!1,this.comment_list_element.ontouchmove=()=>!0===s?e():"",this.comment_list_element.onwheel=e,this.comment_list_element.onscroll=async()=>{null!==this.comment_list_element&&!1===this.is_auto_scrolling&&!0===t&&(this.is_manual_scroll=!0,await pt.sleep(.1),this.comment_list_element.scrollTop+this.comment_list_element.offsetHeight>this.comment_list_element.scrollHeight-10&&(this.is_manual_scroll=!1))}},beforeDestroy(){this.destroy(),null!==this.resize_observer&&this.resize_observer.disconnect()},methods:{showCommentListDropdown(t,e){const s=this.$refs.comment_list_wrapper.getBoundingClientRect(),i=76,a=t.currentTarget.getBoundingClientRect();this.comment_list_dropdown_top=a.top-s.top,this.comment_list_dropdown_top+i>s.height&&(this.comment_list_dropdown_top=this.comment_list_dropdown_top-i+a.height),this.comment_list_dropdown_comment=e,this.is_comment_list_dropdown_display=!0},hideCommentListDropdown(){this.is_comment_list_dropdown_display=!1,this.comment_list=this.comment_list.filter((t=>!1===it.isMutedComment(t.text,t.user_id)))},addMutedKeywords(){null!==this.comment_list_dropdown_comment&&(it.addMutedKeywords(this.comment_list_dropdown_comment.text),this.hideCommentListDropdown())},addMutedNiconicoUserIds(){null!==this.comment_list_dropdown_comment&&(it.addMutedNiconicoUserIDs(this.comment_list_dropdown_comment.user_id),this.hideCommentListDropdown())},async scrollCommentList(t=!1){if(null!==this.comment_list_element&&(!0===this.is_comment_list_dropdown_display&&(this.is_manual_scroll=!0),!0!==this.is_manual_scroll)){this.is_auto_scrolling=!0;for(let e=0;e<3;e++)await pt.sleep(.01),!0===t?this.comment_list_element.scrollTo({top:this.comment_list_element.scrollHeight,left:0,behavior:"smooth"}):this.comment_list_element.scrollTo(0,this.comment_list_element.scrollHeight);await pt.sleep(.1),this.is_auto_scrolling=!1}},initReserveObserver(){null!==this.resize_observer&&this.resize_observer.disconnect();const t=document.querySelector(".watch-player"),e=()=>{const e=this.player?.template.danmaku,s=e.clientWidth,i=e.clientWidth*(9/16);if(null===t||null===t.clientHeight)return;const a=(t.clientHeight-i)/2,n=pt.isSmartphoneVertical()?0:window.matchMedia("(max-height: 450px)").matches?50:66;if(a0===e?t:l(e,t%e),c=l(r,o),_=`${r/c} / ${o/c}`;e.style.transition="none",e.style.setProperty("--comment-area-aspect-ratio",_),e.style.setProperty("--comment-area-vertical-margin",`${t}px`),window.setTimeout((()=>{e.style.transition=""}),200)}else e.style.removeProperty("--comment-area-aspect-ratio"),e.style.removeProperty("--comment-area-vertical-margin")};this.resize_observer=new ResizeObserver(e),this.resize_observer.observe(t),window.setTimeout(e,600)},async initSession(t,e){this.player=t,this.initReserveObserver();const s=[],i=500;this.live_comment_manager=new hi({player:t,display_channel_id:e,on_initial_comments_received:async t=>{this.comment_list.push(...t),this.scrollCommentList()},on_comment_received:async t=>{"hidden"!==document.visibilityState?(this.comment_list.length>=i&&!1===this.is_manual_scroll&&this.comment_list.splice(0,Math.max(0,this.comment_list.length-i)),this.comment_list.push(t),this.scrollCommentList()):s.push(t)}}),this.visibilitychange_listener=()=>{if("visible"===document.visibilityState){const t=this.comment_list.length+s.length;t>=i&&!1===this.is_manual_scroll&&this.comment_list.splice(0,Math.max(0,t-i)),this.comment_list.push(...s),s.length=0,this.scrollCommentList()}},document.addEventListener("visibilitychange",this.visibilitychange_listener);const a=await this.live_comment_manager.initSession();!1===a.is_success&&(this.initialize_failed_message=a.detail)},sendComment(t){null===this.initialize_failed_message?null!==this.userStore.user?null!==this.userStore.user.niconico_user_id?!1!==this.userStore.user.niconico_user_premium||"top"!==t.data.type&&"bottom"!==t.data.type?!1!==this.userStore.user.niconico_user_premium||"big"!==t.data.size?this.live_comment_manager?.sendComment(t):t.error("コメントサイズを大きめに設定するには、ニコニコアカウントのプレミアム会員登録が必要です。"):t.error("コメントを上下に固定するには、ニコニコアカウントのプレミアム会員登録が必要です。"):t.error("コメントするには、ニコニコアカウントと連携してください。"):t.error("コメントするには、KonomiTV アカウントにログインしてください。"):t.error(this.initialize_failed_message)},destroy(){null!==this.visibilitychange_listener&&(document.removeEventListener("visibilitychange",this.visibilitychange_listener),this.visibilitychange_listener=null),null!==this.live_comment_manager&&(this.live_comment_manager.destroy(),this.live_comment_manager=null),this.initialize_failed_message=null,this.comment_list=[]}}}),vi=gi,fi=(0,p.Z)(vi,ui,mi,!1,null,"df07fabe",null),wi=fi.exports,bi=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"program-container"},[e("section",{staticClass:"program-broadcaster"},[e("img",{staticClass:"program-broadcaster__icon",attrs:{src:`${t.Utils.api_base_url}/channels/${t.channelsStore.display_channel_id}/logo`}}),e("div",{staticClass:"program-broadcaster__number"},[t._v("Ch: "+t._s(t.channelsStore.channel.current.channel_number))]),e("div",{staticClass:"program-broadcaster__name"},[t._v(t._s(t.channelsStore.channel.current.name))])]),e("section",{staticClass:"program-info"},[e("h1",{staticClass:"program-info__title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_present,"title"))}}),e("div",{staticClass:"program-info__time"},[t._v(" "+t._s(t.ProgramUtils.getProgramTime(t.channelsStore.channel.current.program_present))+" ")]),e("div",{staticClass:"program-info__description",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_present,"description"))}}),e("div",{staticClass:"program-info__genre-container"},t._l(t.channelsStore.channel.current.program_present?.genres??[],(function(s,i){return e("div",{key:i,staticClass:"program-info__genre"},[t._v(" "+t._s(s.major)+" / "+t._s(s.middle)+" ")])})),0),e("div",{staticClass:"program-info__next"},[e("span",{staticClass:"program-info__next-decorate"},[t._v("NEXT")]),e("Icon",{staticClass:"program-info__next-icon",attrs:{icon:"fluent:fast-forward-20-filled",width:"16px"}})],1),e("span",{staticClass:"program-info__next-title",domProps:{innerHTML:t._s(t.ProgramUtils.decorateProgramInfo(t.channelsStore.channel.current.program_following,"title"))}}),e("div",{staticClass:"program-info__next-time"},[t._v(" "+t._s(t.ProgramUtils.getProgramTime(t.channelsStore.channel.current.program_following))+" ")]),e("div",{staticClass:"program-info__status"},[e("div",{staticClass:"program-info__status-force",class:`program-info__status-force--${t.ChannelUtils.getChannelForceType(t.channelsStore.channel.current.jikkyo_force)}`},[e("Icon",{attrs:{icon:"fa-solid:fire-alt",height:"14px"}}),e("span",{staticClass:"ml-2"},[t._v("勢い:")]),e("span",{staticClass:"ml-2"},[t._v(t._s(t.channelsStore.channel.current.jikkyo_force??"--")+" コメ/分")])],1),e("div",{staticClass:"program-info__status-viewers ml-5"},[e("Icon",{attrs:{icon:"fa-solid:eye",height:"14px"}}),e("span",{staticClass:"ml-2"},[t._v("視聴数:")]),e("span",{staticClass:"ml-1"},[t._v(t._s(t.channelsStore.channel.current.viewer_count))])],1)])]),e("section",{staticClass:"program-detail-container"},t._l(t.channelsStore.channel.current.program_present?.detail??{},(function(s,i){return e("div",{key:i,staticClass:"program-detail"},[e("h2",{staticClass:"program-detail__heading"},[t._v(t._s(i))]),e("div",{staticClass:"program-detail__text",domProps:{innerHTML:t._s(t.Utils.URLtoLink(s))}})])})),0)])},yi=[],Ci=o["default"].extend({name:"Panel-ProgramTab",data(){return{Utils:pt,ChannelUtils:A,ProgramUtils:mt}},computed:{...(0,a.Kc)(Gs)}}),ki=Ci,xi=(0,p.Z)(ki,bi,yi,!1,null,"710b8382",null),Si=xi.exports,Oi=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"remote-control-container",class:{"remote-control-container--showing":t.showing},on:{click:function(e){return t.$emit("close")}}},[e("div",{staticClass:"remote-control elevation-6",on:{click:function(t){t.stopPropagation()}}},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control__close d-flex align-center rounded-circle cursor-pointer px-2 py-2",on:{click:function(e){return t.$emit("close")}}},[e("Icon",{attrs:{icon:"fluent:dismiss-12-filled",width:"23px",height:"23px"}})],1),e("div",{staticClass:"remote-control-data-broadcasting remote-control-data-broadcasting--disabled"},[e(Zs.Z,{staticClass:"remote-control__loading",attrs:{indeterminate:"",size:"60",width:"6"}}),e("div",{staticClass:"remote-control__directional-key"},[e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-up",attrs:{"data-arib-key-code":"1"}},[e("Icon",{attrs:{icon:"fluent:chevron-up-12-filled",width:"26px",height:"26px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-left",attrs:{"data-arib-key-code":"3"}},[e("Icon",{attrs:{icon:"fluent:chevron-left-12-filled",width:"26px",height:"26px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-select",attrs:{"data-arib-key-code":"18"}},[t._v(" 決定 ")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-right",attrs:{"data-arib-key-code":"4"}},[e("Icon",{attrs:{icon:"fluent:chevron-right-12-filled",width:"26px",height:"26px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-down",attrs:{"data-arib-key-code":"2"}},[e("Icon",{attrs:{icon:"fluent:chevron-down-12-filled",width:"26px",height:"26px"}})],1)]),e("div",{staticClass:"remote-control__control-key"},[e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-data",attrs:{"data-arib-key-code":"20"}},[e("svg",{attrs:{width:"20px",height:"20px",viewBox:"0 0 512 512"}},[e("path",{attrs:{fill:"currentColor",d:"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z"}})]),e("span",{staticClass:"ml-1"},[t._v("データ")])]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-back",attrs:{"data-arib-key-code":"19"}},[e("Icon",{attrs:{icon:"fluent:arrow-left-12-filled",width:"20px"}}),e("span",{staticClass:"ml-1"},[t._v("戻る")])],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-blue blue darken-3",attrs:{"data-arib-key-code":"21"}},[t._v("青")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-red red darken-3",attrs:{"data-arib-key-code":"22"}},[t._v("赤")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-green green darken-3",attrs:{"data-arib-key-code":"23"}},[t._v("緑")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"remote-control-button-yellow yellow darken-3",attrs:{"data-arib-key-code":"24"}},[t._v("黄")])])],1),e("div",{staticClass:"remote-control__number-key"},[e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"1","data-arib-key-code":"6"}},[t._v("1")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"2","data-arib-key-code":"7"}},[t._v("2")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"3","data-arib-key-code":"8"}},[t._v("3")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"4","data-arib-key-code":"9"}},[t._v("4")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"5","data-arib-key-code":"10"}},[t._v("5")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"6","data-arib-key-code":"11"}},[t._v("6")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"7","data-arib-key-code":"12"}},[t._v("7")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"8","data-arib-key-code":"13"}},[t._v("8")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"9","data-arib-key-code":"14"}},[t._v("9")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"10","data-arib-key-code":"15"}},[t._v("10")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"11","data-arib-key-code":"16"}},[t._v("11")]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],attrs:{"data-remocon-id":"12","data-arib-key-code":"17"}},[t._v("12")])])])])},Ti=[],Ii=o["default"].extend({name:"Panel-Remocon",props:{showing:{type:Boolean,required:!0}}}),ji=Ii,Zi=(0,p.Z)(ji,Oi,Ti,!1,null,"b659b524",null),Bi=Zi.exports,Pi=function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"twitter-container"},[e(le.Z,{attrs:{"content-class":"zoom-capture-modal-container","max-width":"980",transition:"slide-y-transition"},model:{value:t.zoom_capture_modal,callback:function(e){t.zoom_capture_modal=e},expression:"zoom_capture_modal"}},[e("div",{staticClass:"zoom-capture-modal"},[e("img",{staticClass:"zoom-capture-modal__image",attrs:{src:t.zoom_capture?t.zoom_capture.image_url:""}}),e("a",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"zoom-capture-modal__download",attrs:{href:t.zoom_capture?t.zoom_capture.image_url:"",download:t.zoom_capture?t.zoom_capture.filename:""}},[e("Icon",{attrs:{icon:"fa6-solid:download",width:"45px"}})],1)])]),e("div",{staticClass:"tab-container"},[e("div",{staticClass:"tab-content tab-content--search",class:{"tab-content--active":"Search"===t.twitter_active_tab}},[e("div",{staticClass:"search px-4"},[t._v(" リアルタイム検索機能は鋭意開発中です。 ")])]),e("div",{staticClass:"tab-content tab-content--timeline",class:{"tab-content--active":"Timeline"===t.twitter_active_tab}},[e("div",{staticClass:"search px-4"},[t._v(" タイムライン機能は鋭意開発中です。 ")])]),e("div",{staticClass:"tab-content tab-content--capture",class:{"tab-content--active":"Capture"===t.twitter_active_tab}},[e("div",{staticClass:"captures"},t._l(t.captures,(function(s){return e("div",{key:s.image_url,staticClass:"capture",class:{"capture--selected":s.selected,"capture--focused":s.focused,"capture--disabled":!s.selected&&t.tweet_captures.length>=4},on:{click:function(e){return t.clickCapture(s)}}},[e("img",{staticClass:"capture__image",attrs:{src:s.image_url}}),e("div",{staticClass:"capture__disabled-cover"}),e("div",{staticClass:"capture__selected-number"},[t._v(t._s(t.tweet_captures.findIndex((t=>t===s.blob))+1))]),e("Icon",{staticClass:"capture__selected-checkmark",attrs:{icon:"fluent:checkmark-circle-16-filled"}}),e("div",{staticClass:"capture__selected-border"}),e("div",{staticClass:"capture__focused-border"}),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"capture__zoom",on:{click:function(e){e.preventDefault(),e.stopPropagation(),t.zoom_capture_modal=!0,t.zoom_capture=s},mousedown:function(t){t.preventDefault(),t.stopPropagation()}}},[e("Icon",{attrs:{icon:"fluent:zoom-in-16-regular",width:"32px"}})],1)],1)})),0),e("div",{directives:[{name:"show",rawName:"v-show",value:0===t.captures.length,expression:"captures.length === 0"}],staticClass:"capture-announce"},[e("div",{staticClass:"capture-announce__heading"},[t._v("まだキャプチャがありません。")]),t._m(0)])])]),e("div",{staticClass:"tab-button-container"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tab-button",class:{"tab-button--active":"Search"===t.twitter_active_tab},on:{click:function(e){t.twitter_active_tab="Search"}}},[e("Icon",{attrs:{icon:"fluent:search-16-filled",height:"18px"}}),e("span",{staticClass:"tab-button__text"},[t._v("ツイート検索")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tab-button",class:{"tab-button--active":"Timeline"===t.twitter_active_tab},on:{click:function(e){t.twitter_active_tab="Timeline"}}},[e("Icon",{attrs:{icon:"fluent:home-16-regular",height:"18px"}}),e("span",{staticClass:"tab-button__text"},[t._v("タイムライン")])],1),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tab-button",class:{"tab-button--active":"Capture"===t.twitter_active_tab},on:{click:function(e){t.twitter_active_tab="Capture"}}},[e("Icon",{attrs:{icon:"fluent:image-copy-20-regular",height:"18px"}}),e("span",{staticClass:"tab-button__text"},[t._v("キャプチャ")])],1)]),e("div",{staticClass:"tweet-form",class:{"tweet-form--focused":t.is_tweet_hashtag_form_focused||t.is_tweet_text_form_focused,"tweet-form--virtual-keyboard-display":t.is_virtual_keyboard_display&&(t.Utils.hasActiveElementClass("tweet-form__hashtag-form")||t.Utils.hasActiveElementClass("tweet-form__textarea"))&&(()=>(t.is_hashtag_list_display=!1,!0))()}},[e("div",{staticClass:"tweet-form__hashtag"},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.tweet_hashtag,expression:"tweet_hashtag"}],staticClass:"tweet-form__hashtag-form",attrs:{type:"search",placeholder:"#ハッシュタグ",spellcheck:"false"},domProps:{value:t.tweet_hashtag},on:{input:[function(e){e.target.composing||(t.tweet_hashtag=e.target.value)},function(e){return t.updateTweetLetterCount()}],focus:function(e){t.is_tweet_hashtag_form_focused=!0},blur:function(e){t.is_tweet_hashtag_form_focused=!1},change:function(e){t.tweet_hashtag=t.formatHashtag(t.tweet_hashtag),t.updateTweetLetterCount()}}}),e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tweet-form__hashtag-list-button",on:{click:function(e){return t.clickHashtagListButton()}}},[e("Icon",{attrs:{icon:"fluent:clipboard-text-ltr-32-regular",height:"22px"}})],1)]),e("textarea",{directives:[{name:"model",rawName:"v-model",value:t.tweet_text,expression:"tweet_text"}],ref:"tweet_text",staticClass:"tweet-form__textarea",attrs:{placeholder:"ツイート",spellcheck:"false"},domProps:{value:t.tweet_text},on:{input:[function(e){e.target.composing||(t.tweet_text=e.target.value)},function(e){return t.updateTweetLetterCount()}],paste:function(e){return t.pasteClipboardData(e)},focus:function(e){t.is_tweet_text_form_focused=!0},blur:function(e){t.is_tweet_text_form_focused=!1}}}),e("div",{staticClass:"tweet-form__control"},[e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"account-button",class:{"account-button--no-login":!t.is_logged_in_twitter},on:{click:function(e){return t.clickAccountButton()}}},[e("img",{staticClass:"account-button__icon",attrs:{src:t.is_logged_in_twitter?t.selected_twitter_account?.icon_url:"/assets/images/account-icon-default.png"}}),e("span",{staticClass:"account-button__screen-name"},[t._v(" "+t._s(t.is_logged_in_twitter?`@${t.selected_twitter_account?.screen_name}`:"連携されていません")+" ")]),e("Icon",{staticClass:"account-button__menu",attrs:{icon:"fluent:more-circle-20-regular",width:"22px"}})],1),e("div",{staticClass:"limit-meter"},[e("div",{staticClass:"limit-meter__content",class:{"limit-meter__content--yellow":t.tweet_letter_count<=20,"limit-meter__content--red":t.tweet_letter_count<=0}},[e("Icon",{staticStyle:{"margin-right":"-2px"},attrs:{icon:"fa-brands:twitter",width:"12px"}}),e("span",[t._v(t._s(t.tweet_letter_count))])],1),e("div",{staticClass:"limit-meter__content"},[e("Icon",{attrs:{icon:"fluent:image-16-filled",width:"14px"}}),e("span",[t._v(t._s(t.tweet_captures.length)+"/4")])],1)]),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"tweet-button",attrs:{disabled:!t.is_logged_in_twitter||t.tweet_letter_count<0||140===t.tweet_letter_count&&0===t.tweet_captures.length},on:{click:function(e){return t.sendTweet()},touchstart:function(e){return t.sendTweet()}}},[e("Icon",{attrs:{icon:"fa-brands:twitter",height:"16px"}}),e("span",{staticClass:"ml-1"},[t._v("ツイート")])],1)])]),e("div",{staticClass:"hashtag-list",class:{"hashtag-list--display":t.is_hashtag_list_display,"hashtag-list--virtual-keyboard-display":t.is_virtual_keyboard_display&&t.Utils.hasActiveElementClass("hashtag__input")}},[e("div",{staticClass:"hashtag-heading"},[e("div",{staticClass:"hashtag-heading__text"},[e("Icon",{attrs:{icon:"charm:hash",width:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("ハッシュタグリスト")])],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"hashtag-heading__add-button",on:{click:function(e){t.saved_twitter_hashtags.push({id:t.Utils.time(),text:"#ここにハッシュタグを入力",editing:!1})}}},[e("Icon",{attrs:{icon:"fluent:add-12-filled",width:"17px"}}),e("span",{staticClass:"ml-1"},[t._v("追加")])],1)]),e("draggable",{staticClass:"hashtag-container",attrs:{handle:".hashtag__sort-handle"},model:{value:t.saved_twitter_hashtags,callback:function(e){t.saved_twitter_hashtags=e},expression:"saved_twitter_hashtags"}},t._l(t.saved_twitter_hashtags,(function(s){return e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple",value:!s.editing,expression:"!hashtag.editing"}],key:s.id,staticClass:"hashtag",class:{"hashtag--editing":s.editing},on:{click:function(e){return t.clickHashtag(s)}}},[e("input",{directives:[{name:"model",rawName:"v-model",value:s.text,expression:"hashtag.text"}],staticClass:"hashtag__input",attrs:{type:"search",spellcheck:"false",disabled:!s.editing},domProps:{value:s.text},on:{click:function(t){t.stopPropagation()},input:function(e){e.target.composing||t.$set(s,"text",e.target.value)}}}),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"hashtag__edit-button",on:{click:function(e){e.preventDefault(),e.stopPropagation(),s.editing=!s.editing,s.text=t.formatHashtag(s.text,!0),t.updateTweetLetterCount()}}},[e("Icon",{attrs:{icon:s.editing?"fluent:checkmark-16-filled":"fluent:edit-16-filled",width:"17px"}})],1),e("button",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],staticClass:"hashtag__delete-button",on:{click:function(e){e.preventDefault(),e.stopPropagation(),t.saved_twitter_hashtags.splice(t.saved_twitter_hashtags.indexOf(s),1)}}},[e("Icon",{attrs:{icon:"fluent:delete-16-filled",width:"17px"}})],1),e("div",{staticClass:"hashtag__sort-handle"},[e("Icon",{attrs:{icon:"material-symbols:drag-handle-rounded",width:"17px"}})],1)])})),0)],1),e("div",{staticClass:"twitter-account-list",class:{"twitter-account-list--display":t.is_twitter_account_list_display}},t._l(t.userStore.user?t.userStore.user.twitter_accounts:[],(function(s){return e("div",{directives:[{def:xt.Z,name:"ripple",rawName:"v-ripple"}],key:s.id,staticClass:"twitter-account",on:{click:function(e){return t.updateSelectedTwitterAccount(s)}}},[e("img",{staticClass:"twitter-account__icon",attrs:{src:s.icon_url}}),e("div",{staticClass:"twitter-account__info"},[e("div",{staticClass:"twitter-account__name"},[t._v(t._s(s.name))]),e("div",{staticClass:"twitter-account__screen-name"},[t._v("@"+t._s(s.screen_name))])]),e("Icon",{directives:[{name:"show",rawName:"v-show",value:s.id===t.settingsStore.settings.selected_twitter_account_id,expression:"twitter_account.id === settingsStore.settings.selected_twitter_account_id"}],staticClass:"twitter-account__check",attrs:{icon:"fluent:checkmark-16-filled",width:"24px"}})],1)})),0)],1)},$i=[function(){var t=this,e=t._self._c;t._self._setupProxy;return e("div",{staticClass:"capture-announce__text"},[e("p",{staticClass:"mt-0 mb-0"},[t._v("プレイヤーのキャプチャボタンやショートカットキーでキャプチャを撮ると、ここに表示されます。")]),e("p",{staticClass:"mt-2 mb-0"},[t._v("表示されたキャプチャを選択してからツイートすると、キャプチャを付けてツイートできます。")])])}],zi=s(9980),Ai=s.n(zi),Di=o["default"].extend({name:"Panel-TwitterTab",components:{draggable:Ai()},props:{player:{type:null,required:!0},is_virtual_keyboard_display:{type:Boolean,required:!0}},data(){return{Utils:pt,is_logged_in_twitter:!1,selected_twitter_account:null,is_twitter_account_list_display:!1,saved_twitter_hashtags:st().settings.saved_twitter_hashtags.map(((t,e)=>({id:pt.time()+e,text:t,editing:!1}))),is_hashtag_list_display:!1,twitter_active_tab:st().settings.twitter_active_tab,zoom_capture_modal:!1,zoom_capture:null,captures:[],captures_element:null,is_tweet_hashtag_form_focused:!1,is_tweet_text_form_focused:!1,tweet_hashtag:"",tweet_text:"",tweet_captures:[],tweet_letter_count:140,is_tweet_sending:!1}},computed:{...(0,a.Kc)(Gs,st,R)},async created(){if(await this.userStore.fetchUser(),!0===this.userStore.is_logged_in&&this.userStore.user&&this.userStore.user.twitter_accounts.length>0){this.is_logged_in_twitter=!0,null!==this.settingsStore.settings.selected_twitter_account_id&&this.userStore.user.twitter_accounts.some((t=>t.id===this.settingsStore.settings.selected_twitter_account_id))||(this.settingsStore.settings.selected_twitter_account_id=this.userStore.user.twitter_accounts[0].id);const t=this.userStore.user.twitter_accounts.findIndex((t=>t.id===this.settingsStore.settings.selected_twitter_account_id));this.selected_twitter_account=this.userStore.user.twitter_accounts[t]}this.tweet_hashtag=this.formatHashtag(this.tweet_hashtag),this.updateTweetLetterCount()},beforeDestroy(){for(const t of this.captures)URL.revokeObjectURL(t.image_url)},watch:{saved_twitter_hashtags:{deep:!0,handler(){this.settingsStore.settings.saved_twitter_hashtags=this.saved_twitter_hashtags.map((t=>t.text))}}},methods:{updateTweetLetterCount(){this.tweet_letter_count=140-[...this.tweet_hashtag].length-[...this.tweet_text].length},pasteClipboardData(t){if(null!==t.clipboardData)for(const e of t.clipboardData.items)if(e.type.startsWith("image/")){const t=e.getAsFile();t&&this.addCaptureList(t,t.name)}},clickHashtagListButton(){this.is_hashtag_list_display=!this.is_hashtag_list_display;for(const t of this.saved_twitter_hashtags)t.editing=!1},clickHashtag(t){this.tweet_hashtag=t.text,this.tweet_hashtag=this.formatHashtag(this.tweet_hashtag),this.updateTweetLetterCount(),window.setTimeout((()=>this.is_hashtag_list_display=!1),150)},clickAccountButton(){if(!this.is_logged_in_twitter)return document.fullscreenElement&&document.exitFullscreen(),void this.$router.push({path:"/settings/twitter"});this.is_twitter_account_list_display=!this.is_twitter_account_list_display,!0===this.is_twitter_account_list_display&&(this.is_hashtag_list_display=!1)},updateSelectedTwitterAccount(t){this.settingsStore.settings.selected_twitter_account_id=t.id,this.selected_twitter_account=t,window.setTimeout((()=>this.is_twitter_account_list_display=!1),150)},clickCapture(t){if(this.tweet_captures.length<4&&!1===t.selected)t.selected=!0,this.tweet_captures.push(t.blob);else{const e=this.tweet_captures.findIndex((e=>e===t.blob));e>-1&&this.tweet_captures.splice(e,1),t.selected=!1}},async addCaptureList(t,e){null===this.captures_element&&(this.captures_element=this.$el.querySelector(".tab-content--capture")),this.captures.length>50&&(URL.revokeObjectURL(this.captures[0].image_url),this.captures.shift());const s=URL.createObjectURL(t);this.captures.push({blob:t,filename:e,image_url:s,selected:!1,focused:!1}),this.$nextTick((()=>{null!==this.captures_element&&this.captures_element.scrollTo({top:this.captures_element.scrollHeight,behavior:"smooth"})}))},async drawProgramTitleOnCapture(t){const e=await createImageBitmap(t),s="OffscreenCanvas"in window?new OffscreenCanvas(e.width,e.height):document.createElement("canvas"),i=s.getContext("2d",{alpha:!1,desynchronized:!0,willReadFrequently:!1});i.drawImage(e,0,0),e.close(),i.font='bold 22px "YakuHanJPs", "Open Sans", "Hiragino Sans", "Noto Sans JP", sans-serif',i.fillStyle="rgba(255, 255, 255, 70%)",i.shadowColor="rgba(0, 0, 0, 100%)",i.shadowBlur=4,i.shadowOffsetX=0,i.shadowOffsetY=0;const a=this.channelsStore.channel.current.program_present?.title??"放送休止";switch(this.settingsStore.settings.tweet_capture_watermark_position){case"TopLeft":i.textAlign="left",i.textBaseline="top",i.fillText(a,16,12);break;case"TopRight":i.textAlign="right",i.textBaseline="top",i.fillText(a,s.width-16,12);break;case"BottomLeft":i.textAlign="left",i.textBaseline="bottom",i.fillText(a,16,s.height-12);break;case"BottomRight":i.textAlign="right",i.textBaseline="bottom",i.fillText(a,s.width-16,s.height-12);break}return s instanceof OffscreenCanvas?await s.convertToBlob({type:"image/jpeg",quality:1}):new Promise(((t,e)=>s.toBlob((s=>{null===s?e():t(s)}),"image/jpeg",1)))},getChannelHashtag(t){return t.startsWith("NHK総合")?"#nhk":t.startsWith("NHKEテレ")?"#etv":t.startsWith("日テレ")?"#ntv":t.startsWith("読売テレビ")?"#ytv":t.startsWith("中京テレビ")?"#chukyotv":t.startsWith("テレビ朝日")?"#tvasahi":t.startsWith("ABCテレビ")?"#abc":t.startsWith("メ~テレ")?"#nagoyatv":t.startsWith("TBS")&&!t.includes("TBSチャンネル")?"#tbs":t.startsWith("MBS")?"#mbs":t.startsWith("CBC")?"#cbc":t.startsWith("テレビ東京")?"#tvtokyo":t.startsWith("テレビ大阪")?"#tvo":t.startsWith("テレビ愛知")?"#tva":t.startsWith("フジテレビ")?"#fujitv":t.startsWith("関西テレビ")?"#kantele":t.startsWith("東海テレビ")?"#tokaitv":t.startsWith("TOKYO MX")?"#tokyomx":t.startsWith("tvk")?"#tvk":t.startsWith("チバテレ")?"#chibatv":t.startsWith("テレ玉")?"#teletama":t.startsWith("サンテレビ")?"#suntv":t.startsWith("KBS京都")?"#kbs":t.startsWith("NHKBS1")?"#nhkbs1":t.startsWith("NHKBSプレミアム")?"#nhkbsp":t.startsWith("BS日テレ")?"#bsntv":t.startsWith("BS朝日")?"#bsasahi":t.startsWith("BS-TBS")?"#bstbs":t.startsWith("BSテレ東")?"#bstvtokyo":t.startsWith("BSフジ")?"#bsfuji":t.startsWith("BS11イレブン")?"#bs11":t.startsWith("BS12トゥエルビ")?"#bs12":t.startsWith("AT-X")?"#at_x":null},formatHashtag(t,e=!1){const s=t.trim().replaceAll("♯","#").replaceAll("#","#").replace(/#{2,}/g,"#").replaceAll(" "," ").replaceAll(/ +/g," ").split(" ").filter((t=>""!==t));for(let i in s)s[i].startsWith("#")||(s[i]=`#${s[i]}`);if(!0===this.settingsStore.settings.auto_add_watching_channel_hashtag&&!1===e){const t=this.getChannelHashtag(this.channelsStore.channel.current.name);null!==t&&!1===s.includes(t)&&s.push(t)}return s.join(" ")},async sendTweet(){if(null===this.selected_twitter_account)return;if(!0===this.is_tweet_sending)return;this.is_tweet_sending=!0,this.tweet_hashtag=this.formatHashtag(this.tweet_hashtag),this.updateTweetLetterCount();const t=this.tweet_hashtag;let e=this.tweet_text;if(""!==t)switch(this.settingsStore.settings.tweet_hashtag_position){case"Prepend":e=`${t} ${this.tweet_text}`;break;case"Append":e=`${this.tweet_text} ${t}`;break;case"PrependWithLineBreak":e=`${t}\n${this.tweet_text}`;break;case"AppendWithLineBreak":e=`${this.tweet_text}\n${t}`;break}const s=[];for(let i of this.tweet_captures)"None"!==this.settingsStore.settings.tweet_capture_watermark_position&&(i=await this.drawProgramTitleOnCapture(i)),s.push(i);zs.sendTweet(this.selected_twitter_account.screen_name,e,s).then((t=>{this.player.notice(t.message,void 0,void 0,t.is_error?"#FF6F6A":void 0)}));for(const i of this.captures)i.selected=!1,i.focused=!1;this.tweet_captures=[],this.tweet_text="",this.is_tweet_sending=!1,!0===this.settingsStore.settings.fold_panel_after_sending_tweet&&(this.$emit("panel_folding_requested"),this.$refs.tweet_text.blur())}}}),Li=Di,Ni=(0,p.Z)(Li,Pi,$i,!1,null,"51116497",null),Ei=Ni.exports,Ki=(s(23767),s(8585),s(68696),s(59908)),Mi=s(88488);class Hi{static async uploadCapture(t,e){const s=new FormData;s.append("image",t,e);const i=await G.post("/captures",s,{headers:{"Content-Type":"multipart/form-data"}});if("is_error"in i)switch(i.error.message){case"Permission denied to save the file":N.error("キャプチャのアップロードに失敗しました。保存先フォルダに書き込み権限がありません。");break;case"No space left on the device":N.error("キャプチャのアップロードに失敗しました。保存先フォルダに空き容量がありません。");break;case"Unexpected error occurred while saving the file":N.error("キャプチャのアップロードに失敗しました。保存中に予期しないエラーが発生しました。");break;default:G.showGenericError(i,"キャプチャのアップロードに失敗しました。");break}else;}}var Fi=Hi;let Vi=null,Ri=null;class Ui{constructor(t){this.settings_store=st(),this.player=t.player,this.player_container=this.player.container,this.captured_callback=t.captured_callback,this.player_container.querySelector(".dplayer-icons.dplayer-icons-right").insertAdjacentHTML("afterbegin",'\n
\n \n \n \n
\n '),this.player_container.querySelector(".dplayer-icons.dplayer-icons-right").insertAdjacentHTML("afterbegin",'\n
\n \n \n \n
\n '),this.comment_capture_button=this.player_container.querySelector(".dplayer-comment-capture-icon"),this.capture_button=this.player_container.querySelector(".dplayer-capture-icon"),(async()=>{const t="https://cdn.jsdelivr.net/npm/noto-sans-japanese@1.0.0/fonts/NotoSansJP-Bold.woff2",e="https://cdn.jsdelivr.net/npm/open-sans-all@0.1.3/fonts/open-sans-700.woff2",s="data:font/woff2;base64,";if(null===Vi){const e=(await G.get(t,{responseType:"arraybuffer"})).data;Vi=s+D.Buffer.from(e).toString("base64")}if(null===Ri){const t=(await G.get(e,{responseType:"arraybuffer"})).data;Ri=s+D.Buffer.from(t).toString("base64")}})()}async captureAndSave(t){const e=pt.time(),s=Gs(),i=s.is_showing_live?s.channel.current:null;if(null!==i&&!0===i.is_radiochannel)return void this.player.notice("ラジオチャンネルはキャプチャできません。",void 0,void 0,"#FF6F6A");if(0===this.player.video.videoWidth&&0===this.player.video.videoHeight)return void this.player.notice("読み込み中はキャプチャできません。",void 0,void 0,"#FF6F6A");if(!0===t&&!1===this.player.danmaku.showing)return void this.player.notice("コメントを付けてキャプチャするには、コメント表示をオンにしてください。",void 0,void 0,"#FF6F6A");this.addHighlight(t);const a=`Capture_${rt()().format("YYYYMMDD-HHmmss")}`,n=`${a}.jpg`,r=`${a}_caption.jpg`,o=this.player.plugins.aribb24Caption,l=this.player.plugins.aribb24Superimpose??null,c=o.getRawCanvas(),_=l?.getRawCanvas()??null,d=!0===o.isShowing&&o.isPresent(),u=l&&!0===l.isShowing&&l.isPresent(),m=d?o.getTextContent():null;let p;p=null!==i?{network_id:i.network_id,service_id:i.service_id,event_id:i.program_present?.event_id??-1,title:i.program_present?.title??"放送休止",description:i.program_present?.description??"",start_time:i.program_present?.start_time??"2000-01-01T00:00:00+09:00",end_time:i.program_present?.end_time??"2000-01-01T00:00:00+09:00",duration:i.program_present?.duration??0,caption_text:m,is_caption_composited:!1,is_comment_composited:!1}:{network_id:-1,service_id:-1,event_id:-1,title:"録画番組",description:"",start_time:"2000-01-01T00:00:00+09:00",end_time:"2000-01-01T00:00:00+09:00",duration:0,caption_text:m,is_caption_composited:!1,is_comment_composited:!1};const h=async(t,e,s)=>{const i=pt.time();let a;try{a=await this.exportToBlob(t)}catch(n){return console.log(n),this.player.notice("キャプチャの保存に失敗しました。",void 0,void 0,"#FF6F6A"),!1}return console.log("[CaptureManager] Export to Blob:",pt.mathFloor(pt.time()-i,3),"sec"),a=await this.setEXIFDataToCapture(a,s),["Browser","Both"].includes(this.settings_store.settings.capture_save_mode)&&pt.downloadBlobData(a,e),["UploadServer","Both"].includes(this.settings_store.settings.capture_save_mode)&&Fi.uploadCapture(a,e),a};let g=null,v=null;const f=await createImageBitmap(this.player.video);if(!1!==t||!1!==u||!1!==d&&"VideoOnly"!==this.settings_store.settings.capture_caption_mode){const e=[],s="OffscreenCanvas"in window?new OffscreenCanvas(this.player.video.videoWidth,this.player.video.videoHeight):document.createElement("canvas");s.width=this.player.video.videoWidth,s.height=this.player.video.videoHeight;const i=s.getContext("2d",{alpha:!1,desynchronized:!0,willReadFrequently:!1});i.drawImage(f,0,0,s.width,s.height),_&&!0===u&&i.drawImage(_,0,0,s.width,s.height);let a=null;!0===t&&(a=await this.createCommentsImage(),await this.drawComments(s,i,a)),(["VideoOnly","Both"].includes(this.settings_store.settings.capture_caption_mode)||!1===d)&&e.push((async()=>{const e="CompositingCaption"===this.settings_store.settings.capture_caption_mode?r:n,i=await h(s,e,{...p,is_caption_composited:!1,is_comment_composited:t});g=!1!==i&&{blob:i,filename:e},!1!==g&&this.captured_callback(g.blob,g.filename)})()),["CompositingCaption","Both"].includes(this.settings_store.settings.capture_caption_mode)&&!0===d&&e.push((async()=>{!0===t&&(i.drawImage(f,0,0,s.width,s.height),_&&!0===u&&i.drawImage(_,0,0,s.width,s.height)),f.close(),i.drawImage(c,0,0,s.width,s.height),!0===t&&null!==a&&await this.drawComments(s,i,a);const e=await h(s,r,{...p,is_caption_composited:!0,is_comment_composited:t});if(v=!1!==e&&{blob:e,filename:r},!1!==v){if("Both"===this.settings_store.settings.capture_caption_mode)while(null===g)await pt.sleep(.01);this.captured_callback(v.blob,v.filename)}})()),await Promise.all(e)}else{const t="OffscreenCanvas"in window?new OffscreenCanvas(f.width,f.height):document.createElement("canvas");t.width=f.width,t.height=f.height;const e=t.getContext("bitmaprenderer",{alpha:!1});e.transferFromImageBitmap(f),f.close();const s="CompositingCaption"===this.settings_store.settings.capture_caption_mode?r:n,i=await h(t,s,{...p,is_caption_composited:!1,is_comment_composited:!1});g=!1!==i&&{blob:i,filename:s},!1!==g&&this.captured_callback(g.blob,g.filename)}console.log("[CaptureManager] Total:",pt.mathFloor(pt.time()-e,3),"sec"),this.removeHighlight(t);for(const b of[g,v])if(this.settings_store.settings.capture_copy_to_clipboard&&null!==b&&"object"===typeof b)try{await(0,Ki.FH)(await(0,Ki.BD)(b.blob))}catch(w){this.player.notice("クリップボードへのキャプチャのコピーに失敗しました。",void 0,void 0,"#FF6F6A"),console.error(w)}}addHighlight(t=!1){t?this.comment_capture_button.classList.add("dplayer-capturing"):this.capture_button.classList.add("dplayer-capturing")}removeHighlight(t=!1){t?this.comment_capture_button.classList.remove("dplayer-capturing"):this.capture_button.classList.remove("dplayer-capturing")}async commentsHTMLtoSVGImage(t,e,s){const i="http://www.w3.org/2000/svg",a=document.createElementNS(i,"svg");a.setAttribute("width",`${e}`),a.setAttribute("height",`${s}`),a.setAttribute("viewBox",`0 0 ${e} ${s}`);const n=document.createElementNS(i,"foreignObject");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("externalResourcesRequired","true"),a.appendChild(n);const r=document.createElement("body");n.appendChild(r);const o=document.createElement("style");o.appendChild(document.createTextNode(`\n @font-face {\n font-family: 'Noto Sans JP';\n font-weight: bold;\n src: url(${Vi}) format('woff2');\n }\n @font-face {\n font-family: 'Open Sans';\n font-weight: bold;\n src: url(${Ri}) format('woff2');\n }\n .dplayer-danmaku {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: #fff;\n font-size: 29px;\n font-family: 'Open Sans', 'Hiragino Sans', 'Noto Sans JP', sans-serif;\n }\n .dplayer-danmaku .dplayer-danmaku-item {\n display: inline-block;\n line-height: 1;\n font-weight: bold;\n font-size: var(--dplayer-danmaku-font-size);\n opacity: var(--dplayer-danmaku-opacity);\n text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\n white-space: nowrap;\n }\n .dplayer-danmaku .dplayer-danmaku-item--demo {\n position: absolute;\n visibility: hidden;\n }\n .dplayer-danmaku .dplayer-danmaku-item span {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big {\n font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small {\n font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\n }\n .dplayer-danmaku .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n }\n .dplayer-danmaku .dplayer-danmaku-top, .dplayer-danmaku .dplayer-danmaku-bottom {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n `)),r.appendChild(o);const l=document.createElement("div");l.innerHTML=t,r.appendChild(l.childNodes[0]);const c=new Image,_=(new XMLSerializer).serializeToString(a);return c.src=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(_)}`,await new Promise(((t,e)=>{c.onload=t,c.onerror=e})),await c.decode(),c}async createCommentsImage(){let t=this.player.template.danmaku.outerHTML;for(const e of this.player_container.querySelectorAll(".dplayer-danmaku-move")){const s=e.getBoundingClientRect().left-this.player.video.getBoundingClientRect().left;t=t.replace(/transform: translateX\(.*?\);/,`left: ${s}px;`).replaceAll("border: 2px solid #E64F97;","")}return await this.commentsHTMLtoSVGImage(t,this.player.template.danmaku.offsetWidth,this.player.template.danmaku.offsetHeight)}async drawComments(t,e,s){const i=t.width/this.player.template.danmaku.offsetWidth,a=this.player.template.danmaku.offsetHeight*i;e.drawImage(s,0,0,t.width,a)}async exportToBlob(t){if("OffscreenCanvas"in window&&t instanceof OffscreenCanvas)return await t.convertToBlob({type:"image/jpeg",quality:.99});if(t instanceof HTMLCanvasElement)return new Promise(((e,s)=>{t.toBlob((t=>{null!==t?e(t):s(new Error("Failed to convert canvas to blob"))}),"image/jpeg",.99)}));throw new Error("Failed to convert canvas to blob")}async setEXIFDataToCapture(t,e){const s=rt()().diff(rt()(e.start_time),"second",!0),i={captured_at:rt()().format("YYYY-MM-DDTHH:mm:ss+09:00"),captured_playback_position:s,network_id:e.network_id,service_id:e.service_id,event_id:e.event_id,title:e.title,description:e.description,start_time:e.start_time,end_time:e.end_time,duration:e.duration,caption_text:e.caption_text,is_caption_composited:e.is_caption_composited,is_comment_composited:e.is_comment_composited},a=rt()().format("YYYY:MM:DD HH:mm:ss"),n={"0th":{[Mi.TagValues.ImageIFD.XResolution]:[72,1],[Mi.TagValues.ImageIFD.YResolution]:[72,1],[Mi.TagValues.ImageIFD.ResolutionUnit]:2,[Mi.TagValues.ImageIFD.YCbCrPositioning]:1,[Mi.TagValues.ImageIFD.DateTime]:a,[Mi.TagValues.ImageIFD.Software]:`KonomiTV version ${pt.version}`,[Mi.TagValues.ImageIFD.XPComment]:[...D.Buffer.from(JSON.stringify(i),"ucs2")]},Exif:{[Mi.TagValues.ExifIFD.ExifVersion]:"0230",[Mi.TagValues.ExifIFD.ComponentsConfiguration]:"\0",[Mi.TagValues.ExifIFD.FlashpixVersion]:"0100",[Mi.TagValues.ExifIFD.ColorSpace]:1,[Mi.TagValues.ExifIFD.DateTimeOriginal]:a,[Mi.TagValues.ExifIFD.DateTimeDigitized]:a}},r=Mi.dump(n),o=await new Promise(((e,s)=>{const i=new FileReader;i.onload=()=>e(i.result),i.onerror=s,i.readAsBinaryString(t)})),l=Mi.insert(r,o),c=new Uint8Array(l.length);for(let _=0;_"")):JSON.parse(window.sessionStorage.getItem("KonomiTV-BMLBrowser-Greg")),e[t]??""},setReg(t,e){let s;s=null===window.sessionStorage.getItem("KonomiTV-BMLBrowser-Greg")?[...new Array(64)].map((t=>"")):JSON.parse(window.sessionStorage.getItem("KonomiTV-BMLBrowser-Greg")),s[t]=e,window.sessionStorage.setItem("KonomiTV-BMLBrowser-Greg",JSON.stringify(s))}},epg:{tune(s,i,a){if(t.channel.current.network_id===s&&t.channel.current.service_id===a)return(async()=>{await e.destroy(),await e.init()})(),!0;for(const e of Object.values(t.channels_list))for(const t of e)if(t.network_id===s&&t.service_id===a)return pt.sleep(.3).then((()=>_a.push({path:`/tv/watch/${t.display_channel_id}`}))),!0;return console.error(`[LiveDataBroadcastingManager] Channel not found (network_id: ${s} / service_id: ${a})`),e.player.notice(`切り替え先のチャンネルが見つかりませんでした。(network_id: ${s} / service_id: ${a})`,3e3,void 0,"#FF6F6A"),pt.sleep(3).then((async()=>{await e.destroy(),await e.init()})),!1}},ip:{getConnectionType(){return 403},isIPConnected(){return 0}},showErrorMessage(t,s,i){e.player.notice(`${t}
${s} (${i})`,3e3,void 0,"#FF6F6A")}}),"f"),this.bml_browser_width=960,this.bml_browser_height=540,console.log("[LiveDataBroadcastingManager] BMLBrowser initialized."),(0,qi.Q_)(this,Gi,"f").addEventListener("load",(t=>{console.log("[LiveDataBroadcastingManager] BMLBrowser: load",t.detail),this.bml_browser_width=t.detail.resolution.width,this.bml_browser_height=t.detail.resolution.height,this.container_element?.style.setProperty("--bml-browser-width",`${this.bml_browser_width}px`),this.container_element?.style.setProperty("--bml-browser-height",`${this.bml_browser_height}px`),this.calculateBMLBrowserScaleFactor(this.player.template.videoWrap.clientWidth,this.player.template.videoWrap.clientHeight),this.moveVideoElementToBMLBrowser()})),(0,qi.Q_)(this,Gi,"f").addEventListener("invisible",(t=>{!0===t.detail?(console.log("[LiveDataBroadcastingManager] BMLBrowser: invisible"),this.moveVideoElementToDPlayer()):(console.log("[LiveDataBroadcastingManager] BMLBrowser: visible"),this.moveVideoElementToBMLBrowser())})),(0,qi.Q_)(this,Gi,"f").addEventListener("usedkeylistchanged",(t=>{this.is_bml_browser_using_numeric_key=[...t.detail.usedKeyList].includes("numeric-tuning")})),this.resize_observer=new ResizeObserver((t=>{const e=t[0];this.calculateBMLBrowserScaleFactor(e.contentRect.width,e.contentRect.height)})),this.resize_observer.observe(this.player.template.videoWrap)}const s=at.extractAPIQualityFromDPlayer(this.player),i=`${pt.api_base_url}/streams/live/${this.display_channel_id}/${s}/psi-archived-data`;this.live_psi_archived_data_decoder=await new ta(i),this.live_psi_archived_data_decoder.run(Yi.sj((async e=>{if("pmt"===e.type&&null!==(0,qi.Q_)(this,Gi,"f")){const t=e.components.some((t=>void 0!==t.bxmlInfo));console.log("[LiveDataBroadcastingManager] BMLBrowser: "+(t?"available":"unavailable")),!1===t?(this.toggleRemoconButtonsLoading(!1),this.toggleRemoconButtonsEnabled(!1)):this.toggleRemoconButtonsEnabled(!0)}if("programInfo"===e.type&&null!=t.channel.current.program_present&&(e.eventId&&(t.channel.current.program_present.event_id=e.eventId),e.eventName&&(t.channel.current.program_present.title=mt.formatString(e.eventName)),e.startTimeUnixMillis)){const s=mt.convertTimestampToISO8601(e.startTimeUnixMillis);t.channel.current.program_present.start_time=s,e.durationSeconds?(t.channel.current.program_present.end_time=rt()(s).add(e.durationSeconds,"seconds").toISOString(),t.channel.current.program_present.duration=e.durationSeconds):(t.channel.current.program_present.end_time=s,t.channel.current.program_present.duration=-1)}null!==(0,qi.Q_)(this,Gi,"f")&&(0,qi.Q_)(this,Gi,"f").emitMessage(e)})))}initRemoconButtons(){const t=Gs();this.remocon_button_event_abort_controller=new AbortController;const e=this.remocon_element.querySelectorAll("button");for(const s of e)s.addEventListener("click",(async()=>{const e=parseInt(s.dataset.aribKeyCode),i=s.dataset.remoconId?parseInt(s.dataset.remoconId):null;if(null===i||!1!==this.is_bml_browser_using_numeric_key)null!==(0,qi.Q_)(this,Gi,"f")&&(10===i&&((0,qi.Q_)(this,Gi,"f").content.processKeyDown(Ji.I5.Digit0),(0,qi.Q_)(this,Gi,"f").content.processKeyUp(Ji.I5.Digit0),await pt.sleep(.1)),(0,qi.Q_)(this,Gi,"f").content.processKeyDown(e),(0,qi.Q_)(this,Gi,"f").content.processKeyUp(e));else{const e=t.channel.current.type,s=t.getChannelByRemoconID(e,i);null!==s&&s.display_channel_id!==t.display_channel_id&&_a.push({path:`/tv/watch/${s.display_channel_id}`})}}),{signal:this.remocon_button_event_abort_controller.signal})}toggleRemoconButtonsLoading(t){!0===t?this.remocon_data_broadcasting_element.classList.add("remote-control-data-broadcasting--loading"):this.remocon_data_broadcasting_element.classList.remove("remote-control-data-broadcasting--loading")}toggleRemoconButtonsEnabled(t){!0===t?this.remocon_data_broadcasting_element.classList.remove("remote-control-data-broadcasting--disabled"):this.remocon_data_broadcasting_element.classList.add("remote-control-data-broadcasting--disabled")}calculateBMLBrowserScaleFactor(t,e){const s=t/(16*this.bml_browser_height/9),i=e/this.bml_browser_height,a=Math.min(s,i),n=16*this.bml_browser_height/9/this.bml_browser_width;this.container_element?.style.setProperty("--bml-browser-scale-factor-width",""+a*n),this.container_element?.style.setProperty("--bml-browser-scale-factor-height",`${a}`)}moveVideoElementToBMLBrowser(){if(!this.is_bml_browser_destroying&&null!==(0,qi.Q_)(this,Gi,"f")?.getVideoElement()){(0,qi.Q_)(this,Gi,"f")?.getVideoElement()?.firstElementChild instanceof HTMLParagraphElement&&(0,qi.Q_)(this,Gi,"f")?.getVideoElement()?.firstElementChild?.remove(),(0,qi.Q_)(this,Gi,"f")?.getVideoElement()?.appendChild(this.media_element),this.media_element.style.width="100%",this.media_element.style.height="100%";for(const t of this.media_element.children)if(t.style.display="block",t.style.visibility="visible",t instanceof HTMLVideoElement)if(t.style.width="100%",t.style.height="100%",this.bml_browser_width/this.bml_browser_height!==16/9){const e=16*this.bml_browser_height/9/this.bml_browser_width;t.style.transform=`scaleY(${e})`,t.style.transformOrigin="center center"}else t.style.transform="",t.style.transformOrigin="";this.is_video_element_moved_to_bml_browser=!0}}moveVideoElementToDPlayer(){if(!this.is_bml_browser_destroying&&!1!==this.is_video_element_moved_to_bml_browser){null!==this.container_element&&this.player.template.videoWrap.insertBefore(this.media_element,this.container_element.nextElementSibling),this.media_element.style.width="",this.media_element.style.height="";for(const t of this.media_element.children)t.style.display="",t.style.visibility="",t instanceof HTMLVideoElement&&(t.style.width="",t.style.height="",t.style.transform="",t.style.transformOrigin="");this.is_video_element_moved_to_bml_browser=!1}}async destroy(){null!==this.live_psi_archived_data_decoder&&(this.live_psi_archived_data_decoder.destroy(),this.live_psi_archived_data_decoder=null),null!==this.remocon_button_event_abort_controller&&(this.remocon_button_event_abort_controller.abort(),this.remocon_button_event_abort_controller=null),null!==(0,qi.Q_)(this,Gi,"f")&&(this.toggleRemoconButtonsEnabled(!1),this.toggleRemoconButtonsLoading(!0),null!==this.resize_observer&&(this.resize_observer.disconnect(),this.resize_observer=null),this.moveVideoElementToDPlayer(),this.is_bml_browser_destroying=!0,await(0,qi.Q_)(this,Gi,"f").destroy(),this.is_bml_browser_destroying=!1,(0,qi.YH)(this,Gi,null,"f"),console.log("[LiveDataBroadcastingManager] BMLBrowser destroyed."),this.container_element?.remove())}}Gi=new WeakMap,ea.round_gothic={source:'url("https://cdn.jsdelivr.net/gh/googlefonts/kosugi-maru@main/fonts/webfonts/KosugiMaru-Regular.woff2"), local("sans-serif")'},ea.square_gothic={source:'url("https://cdn.jsdelivr.net/gh/googlefonts/kosugi@main/fonts/webfonts/Kosugi-Regular.woff2"), local("sans-serif")'};var sa=ea;const ia=.7,aa=5;var na=o["default"].extend({name:"TV-Watch",components:{BottomNavigation:Lt,Channel:di,Comment:wi,Program:Si,Remocon:Bi,Twitter:Ei},data(){return{Utils:pt,ProgramUtils:mt,time:rt()().format("YYYY/MM/DD HH:mm:ss"),tv_panel_active_tab:st().settings.tv_panel_active_tab,background_url:"",is_loading:!0,is_video_buffering:!0,is_background_display:!1,is_control_display:!0,is_remocon_display:!1,is_panel_display:(()=>{const t=st();switch(t.settings.panel_display_state){case"AlwaysDisplay":return!0;case"AlwaysFold":return!1;case"RestorePreviousState":return t.settings.showed_panel_last_time}})(),is_fullscreen:!1,is_ime_composing:!1,is_virtual_keyboard_display:!1,is_comment_send_just_did:!1,interval_ids:[],control_interval_id:0,is_zapping:!1,is_zapping_continuously:!1,player:null,player_can_be_destroyed:!1,is_mpegts_supported:!0===ni().isSupported()&&!1===pt.isSafari(),is_offline:!1,romsounds_context:null,romsounds_buffers:[],eventsource:null,fullscreen_handler:null,capture_manager:null,data_broadcasting_manager:null,shortcut_key_handler:null,shortcut_key_pressed_at:pt.time(),shortcut_key_modal:!1,shortcut_key_list:{left_column:[{name:"全般",icon:"fluent:home-20-filled",icon_height:"22px",shortcuts:[{name:"数字キー/テンキーに対応するリモコン番号 (1~12) の地デジチャンネルに切り替える",keys:[{name:"1~9, 0, -(=), ^(~)",icon:!1}]},{name:"数字キー/テンキーに対応するリモコン番号 (1~12) の BS チャンネルに切り替える",keys:[{name:"Shift",icon:!1},{name:"1~9, 0, -(=), ^(~)",icon:!1}]},{name:"前のチャンネルに切り替える",keys:[{name:"fluent:arrow-up-12-filled",icon:!0}]},{name:"次のチャンネルに切り替える",keys:[{name:"fluent:arrow-down-12-filled",icon:!0}]},{name:"キーボードショートカットの一覧を表示する",keys:[{name:"/(?)",icon:!1}]}]},{name:"プレイヤー",icon:"fluent:play-20-filled",icon_height:"20px",shortcuts:[{name:"再生 / 一時停止の切り替え",keys:[{name:"Space",icon:!1}]},{name:"再生 / 一時停止の切り替え (キャプチャタブ表示時)",keys:[{name:"Shift",icon:!1},{name:"Space",icon:!1}]},{name:"プレイヤーの音量を上げる",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-up-12-filled",icon:!0}]},{name:"プレイヤーの音量を下げる",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-down-12-filled",icon:!0}]},{name:"停止して0.5秒早戻し",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-left-12-filled",icon:!0}]},{name:"停止して0.5秒早送り",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"fluent:arrow-right-12-filled",icon:!0}]},{name:"フルスクリーンの切り替え",keys:[{name:"F",icon:!1}]},{name:"ライブストリームの同期",keys:[{name:"W",icon:!1}]},{name:"Picture-in-Picture の表示切り替え",keys:[{name:"E",icon:!1}]},{name:"字幕の表示切り替え",keys:[{name:"S",icon:!1}]},{name:"コメントの表示切り替え",keys:[{name:"D",icon:!1}]},{name:"映像をキャプチャする",keys:[{name:"C",icon:!1}]},{name:"映像をコメントを付けてキャプチャする",keys:[{name:"V",icon:!1}]},{name:"コメント入力フォームにフォーカスする",keys:[{name:"M",icon:!1}]},{name:"コメント入力フォームを閉じる",keys:[{name:pt.CtrlOrCmd(),icon:!1},{name:"M",icon:!1}]}]}],right_column:[{name:"パネル",icon:"fluent:panel-right-20-filled",icon_height:"24px",shortcuts:[{name:"パネルの表示切り替え",keys:[{name:"P",icon:!1}]},{name:"番組情報タブを表示する",keys:[{name:"K",icon:!1}]},{name:"チャンネルタブを表示する",keys:[{name:"L",icon:!1}]},{name:"コメントタブを表示する",keys:[{name:";(+)",icon:!1}]},{name:"Twitter タブを表示する",keys:[{name:":(*)",icon:!1}]}]},{name:"Twitter",icon:"fa-brands:twitter",icon_height:"22px",shortcuts:[{name:"ツイート検索タブを表示する",keys:[{name:"[ (「)",icon:!1}]},{name:"タイムラインタブを表示する",keys:[{name:"] (」)",icon:!1}]},{name:"キャプチャタブを表示する",keys:[{name:"\(¥)",icon:!1}]},{name:"ツイート入力フォームにフォーカスを当てる/フォーカスを外す",keys:[{name:"Tab",icon:!1}]},{name:"キャプチャにフォーカスする",keys:[{name:"キャプチャタブを表示",icon:!1},{name:"fluent:arrow-up-12-filled;fluent:arrow-down-12-filled;fluent:arrow-left-12-filled;fluent:arrow-right-12-filled",icon:!0}]},{name:"キャプチャを拡大表示する/
キャプチャの拡大表示を閉じる",keys:[{name:"キャプチャにフォーカス",icon:!1},{name:"Enter",icon:!1}]},{name:"キャプチャを選択する/
キャプチャの選択を解除する",keys:[{name:"キャプチャにフォーカス",icon:!1},{name:"Space",icon:!1}]},{name:"クリップボード内の画像を
キャプチャとして取り込む",keys:[{name:"ツイート入力
フォームにフォーカス",icon:!1},{name:pt.CtrlOrCmd(),icon:!1},{name:"V",icon:!1}]},{name:"ツイートを送信する",keys:[{name:"Twitter タブを表示",icon:!1},{name:pt.CtrlOrCmd(),icon:!1},{name:"Enter",icon:!1}]}]}]}}},computed:{...(0,a.Kc)(Gs,st)},async created(){!0===this.settingsStore.settings.tv_channel_selection_requires_alt_key&&(this.shortcut_key_list.left_column[0].shortcuts[0].keys.unshift({name:pt.AltOrOption(),icon:!1}),this.shortcut_key_list.left_column[0].shortcuts[1].keys.unshift({name:pt.AltOrOption(),icon:!1})),this.channelsStore.display_channel_id=this.$route.params.display_channel_id,"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0,navigator.virtualKeyboard.ongeometrychange=t=>{0===t.target.boundingRect.width&&0===t.target.boundingRect.height?this.is_virtual_keyboard_display=!1:this.is_virtual_keyboard_display=!0}),this.init(),this.romsounds_context=new AudioContext;for(let t=1;t<=14;t++){const e=`/assets/romsounds/${t.toString().padStart(2,"0")}.wav`,s=await G.get(e,{baseURL:"",responseType:"arraybuffer"});this.romsounds_buffers.push(await this.romsounds_context.decodeAudioData(s.data))}},beforeDestroy(){"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!1),"gr999"!==this.channelsStore.channel.current.display_channel_id&&this.destroy(!0),null!==this.romsounds_context&&this.romsounds_context.close(),this.channelsStore.display_channel_id="gr000"},beforeRouteUpdate(t,e,s){const i=this.destroy(!1,this.is_zapping_continuously);this.is_zapping_continuously=!0,this.channelsStore.display_channel_id=t.params.display_channel_id,!0===this.settingsStore.settings.reset_hashtag_when_program_switches&&(this.$refs.Twitter.tweet_hashtag=""),(async()=>{!0===this.is_zapping?(this.is_zapping=!1,this.interval_ids.push(window.setTimeout((()=>{this.is_zapping_continuously=!1,i.then((()=>this.init()))}),500))):(this.is_zapping_continuously=!1,i.then((()=>this.init())))})(),s()},watch:{"channelsStore.channel":{immediate:!0,handler(t,e){if(void 0===e)return;const s=this.$refs.Twitter;if(t.current.display_channel_id!==e.current.display_channel_id){const t=s.getChannelHashtag(e.current.name)??"";s.tweet_hashtag=s.formatHashtag(s.tweet_hashtag.replaceAll(t,"")),s.updateTweetLetterCount()}(t.current.id!==e.current.id||null!==t.current.program_present&&null===e.current.program_present||null===t.current.program_present&&null!==e.current.program_present||null!==t.current.program_present&&null!==e.current.program_present&&t.current.program_present.id!==e.current.program_present.id)&&!0===this.settingsStore.settings.reset_hashtag_when_program_switches&&(s.tweet_hashtag=s.formatHashtag(""),s.updateTweetLetterCount())}},is_panel_display(){this.settingsStore.settings.showed_panel_last_time=this.is_panel_display}},methods:{async init(){this.background_url=at.generatePlayerBackgroundURL(),this.controlDisplayTimer(),this.interval_ids.push(window.setInterval((()=>this.time=rt()().format("YYYY/MM/DD HH:mm:ss")),1e3));const t=60-(new Date).getSeconds();this.interval_ids.push(window.setTimeout((()=>{this.channelsStore.update(!0),this.update(),this.interval_ids.push(window.setInterval((()=>{this.channelsStore.update(!0),this.update()}),3e4))}),1e3*t)),await this.channelsStore.update(),this.update()},async update(){if(void 0!==this.$route.params.display_channel_id)if("gr999"!==this.channelsStore.channel.current.display_channel_id){if(null!==this.player&&!0!==this.player_can_be_destroyed||(this.initPlayer(),await this.initEventHandler(),this.initCaptureManager(),document.removeEventListener("keydown",this.shortcut_key_handler),this.initShortcutKeyHandler()),null!==this.player){if(null===this.channelsStore.channel.current.program_present||"1/0+1/0モード(デュアルモノ)"!==this.channelsStore.channel.current.program_present.primary_audio_type&&null===this.channelsStore.channel.current.program_present.secondary_audio_type){if(this.player.template.audioItem[1].classList.add("dplayer-setting-audio-item--disabled"),void 0!==this.player.plugins.mpegts||void 0!==this.player.plugins.liveLLHLSForKonomiTV){while(null===this.player)await pt.sleep(.1);this.player.template.audioItem[0].classList.add("dplayer-setting-audio-current"),this.player.template.audioItem[1].classList.remove("dplayer-setting-audio-current"),this.player.template.audioValue.textContent=this.player.tran("Primary audio");try{void 0!==this.player.plugins.mpegts&&this.player.plugins.mpegts instanceof ni().MSEPlayer&&this.player.plugins.mpegts.switchPrimaryAudio(),void 0!==this.player.plugins.liveLLHLSForKonomiTV&&this.player.plugins.liveLLHLSForKonomiTV.switchPrimaryAudio()}catch(t){}}}else this.player.template.audioItem[1].classList.remove("dplayer-setting-audio-item--disabled");if("mediaSession"in navigator){const t=[{src:"/assets/images/icons/icon-maskable-192px.png",sizes:"192x192",type:"image/png"},{src:"/assets/images/icons/icon-maskable-512px.png",sizes:"512x512",type:"image/png"}];navigator.mediaSession.metadata=new MediaMetadata({title:this.channelsStore.channel.current.program_present?.title??"放送休止",artist:this.channelsStore.channel.current.name,artwork:t}),"setPositionState"in navigator.mediaSession&&navigator.mediaSession.setPositionState({duration:0,playbackRate:1}),navigator.mediaSession.setActionHandler("play",null),navigator.mediaSession.setActionHandler("pause",null),navigator.mediaSession.setActionHandler("previoustrack",null),navigator.mediaSession.setActionHandler("nexttrack",null),navigator.mediaSession.setActionHandler("play",(()=>this.player?.play())),navigator.mediaSession.setActionHandler("pause",(()=>this.player?.pause())),navigator.mediaSession.setActionHandler("previoustrack",(async()=>{navigator.mediaSession.metadata=new MediaMetadata({title:this.channelsStore.channel.previous.program_present?.title??"放送休止",artist:this.channelsStore.channel.previous.name,artwork:t}),await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`})})),navigator.mediaSession.setActionHandler("nexttrack",(async()=>{navigator.mediaSession.metadata=new MediaMetadata({title:this.channelsStore.channel.next.program_present?.title??"放送休止",artist:this.channelsStore.channel.next.name,artwork:t}),await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.next.display_channel_id}`})}))}}}else this.$router.push({path:"/not-found/"})},controlDisplayTimer(t=null,e=!1){const s=/iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&"ontouchend"in document;if(!0===s&&null!==t&&"mousemove"===t.type)return;if(!1===s&&null!==t&&("touchmove"===t.type||"click"===t.type))return;window.clearTimeout(this.control_interval_id);const i=()=>{null!==this.player&&this.player.template.controller.classList.contains("dplayer-controller-comment")?this.control_interval_id=window.setTimeout(i,3e3):(this.is_control_display=!1,null!==this.player&&(this.player.controller.hide(),this.player.setting.hide()))};!0===s&&!0===e?this.player?.controller.isShow()?(this.is_control_display=!0,this.player.controller.show(),this.control_interval_id=window.setTimeout(i,3e3)):(this.is_control_display=!1,this.player?.controller.hide(),this.player?.setting.hide()):(this.is_control_display=!0,null!==this.player&&this.player.controller.show(),this.control_interval_id=window.setTimeout(i,3e3))},initPlayer(){if(window.mpegts=ni(),null!==this.player&&!0===this.player_can_be_destroyed){try{this.player.destroy()}catch(a){void 0!==this.player.plugins.mpegts&&this.player.plugins.mpegts.destroy()}this.player_can_be_destroyed=!1,this.player=null}const t=this.settingsStore.settings.tv_low_latency_mode?ia:aa;this.player=new(ii())({container:this.$el.querySelector(".watch-player__dplayer"),theme:"#E64F97",lang:"ja-jp",live:!0,liveSyncMinBufferSize:this.is_mpegts_supported?t-.1:0,loop:!1,airplay:!1,autoplay:!0,hotkey:!1,screenshot:!1,crossOrigin:"anonymous",volume:1,video:{defaultQuality:this.channelsStore.channel.current.is_radiochannel?"48kHz/192kbps":this.settingsStore.settings.tv_streaming_quality,quality:(()=>{const t=[];if(this.channelsStore.channel.current.is_radiochannel)!0===this.is_mpegts_supported?t.push({name:"48kHz/192kbps",type:"mpegts",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/mpegts`}):t.push({name:"48kHz/192kbps",type:"live-llhls-for-KonomiTV",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/ll-hls`});else{let e="";at.isHEVCVideoSupported()&&!0===this.settingsStore.settings.tv_data_saver_mode&&(e="-hevc");for(const s of["1080p-60fps","1080p","810p","720p","540p","480p","360p","240p"])!0===this.is_mpegts_supported?t.push({name:"1080p-60fps"===s?"1080p (60fps)":s,type:"mpegts",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${s}${e}/mpegts`}):t.push({name:"1080p-60fps"===s?"1080p (60fps)":s,type:"live-llhls-for-KonomiTV",url:`${pt.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${s}${e}/ll-hls`})}return t})()},danmaku:{user:"KonomiTV",speedRate:this.settingsStore.settings.comment_speed_rate,fontSize:this.settingsStore.settings.comment_font_size,closeCommentFormAfterSend:this.settingsStore.settings.close_comment_form_after_sending},apiBackend:{read:t=>{t.success([])},send:async t=>{this.$refs.Comment.sendComment(t)}},pluginOptions:{mpegts:{config:{enableWorker:!0,enableMSEWorker:window.MediaSource&&!0===window.MediaSource.canConstructInDedicatedWorker,enableStashBuffer:!1,liveSync:this.settingsStore.settings.tv_low_latency_mode,liveSyncMaxLatency:3,liveSyncTargetLatency:t,liveSyncPlaybackRate:1.1}},aribb24:{disableSuperimposeRenderer:!1===this.settingsStore.settings.tv_show_superimpose,normalFont:`"${this.settingsStore.settings.caption_font}", "Rounded M+ 1m for ARIB", sans-serif`,forceStrokeColor:this.settingsStore.settings.always_border_caption_text,forceBackgroundColor:(()=>{if(!0===this.settingsStore.settings.specify_caption_opacity){const t=this.settingsStore.settings.caption_opacity;return`rgba(0, 0, 0, ${t})`}})(),drcsReplacement:!0,enableRawCanvas:!0,useStroke:!0,usePUA:(()=>{const t=this.settingsStore.settings.caption_font,e=document.createElement("canvas").getContext("2d");return e.font='10px "Rounded M+ 1m for ARIB"',e.fillText("Test",0,0),e.font=`10px "${t}"`,e.fillText("Test",0,0),!!t.startsWith("Windows TV")})(),PRACallback:async t=>{if(!1===this.settingsStore.settings.tv_show_superimpose)return;"suspended"===this.romsounds_context.state&&await this.romsounds_context.resume();const e=this.romsounds_context.createBufferSource();e.buffer=this.romsounds_buffers[t];const s=this.romsounds_context.createGain();e.connect(s),s.connect(this.romsounds_context.destination),s.gain.value=3,e.start(0)}}},subtitle:{type:"aribb24"}}),window.player=this.player,this.player.controller.setAutoHide=t=>{},this.$refs.Comment.initSession(this.player,this.channelsStore.display_channel_id),this.player.template.commentInput.addEventListener("keydown",(t=>{"Enter"===t.code&&(this.is_comment_send_just_did=!0,setTimeout((()=>this.is_comment_send_just_did=!1),100))}));const e=/iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent)&&"ontouchend"in document;!1===e&&(this.player.template.settingOriginPanel.insertAdjacentHTML("beforeend",'\n
\n キーボードショートカット\n
\n \n \n \n
\n
'),this.$el.querySelector(".dplayer-setting-keyboard-shortcut").addEventListener("click",(()=>{this.player?.setting.hide(),this.shortcut_key_modal=!0})));const s=document.querySelector(".v-application");this.fullscreen_handler=()=>{this.is_fullscreen=!0===this.player?.fullScreen.isFullScreen()},void 0!==s.onfullscreenchange?s.addEventListener("fullscreenchange",this.fullscreen_handler):s.addEventListener("webkitfullscreenchange",this.fullscreen_handler),this.player.fullScreen.isFullScreen=t=>!(!document.fullscreenElement&&!document.webkitFullscreenElement),this.player.fullScreen.request=t=>{null!==this.player&&(this.player.fullScreen.isFullScreen()?this.player.fullScreen.cancel():(s.requestFullscreen=s.requestFullscreen||s.webkitRequestFullscreen,s.requestFullscreen?(s.requestFullscreen(),screen.orientation&&screen.orientation.lock("landscape").catch((()=>{}))):this.player.notice("iPhone Safari は動画のフルスクリーン表示に対応していません。",void 0,void 0,"#FF6F6A")))},this.player.fullScreen.cancel=t=>{document.exitFullscreen=document.exitFullscreen||document.webkitExitFullscreen,document.exitFullscreen&&document.exitFullscreen(),screen.orientation&&screen.orientation.unlock()};const i=()=>{this.player?.setting.hide(),this.controlDisplayTimer()};this.player.on("play",i),this.player.on("pause",i),this.player.on("quality_start",(async()=>{this.background_url=at.generatePlayerBackgroundURL(),null!==this.eventsource&&(this.eventsource.close(),this.eventsource=null),await this.initEventHandler()})),!0===this.is_mpegts_supported?this.interval_ids.push(window.setInterval((()=>{null!==this.player&&this.player.video.paused&&this.player.video.buffered.length>=1&&this.player.video.buffered.end(0)-this.player.video.currentTime>30&&this.player.sync()}),6e4)):this.interval_ids.push(window.setInterval((()=>{null!==this.player&&this.player.video.paused&&this.player.sync()}),3e4))},async initEventHandler(){if(null===this.player)return;null!==this.data_broadcasting_manager&&await this.data_broadcasting_manager.destroy(),this.data_broadcasting_manager=new sa({player:this.player,display_channel_id:this.channelsStore.channel.current.display_channel_id}),await this.data_broadcasting_manager.init(),this.is_loading=!0,this.player.video.volume=0,!0===this.is_mpegts_supported&&void 0!==this.player.plugins.mpegts?this.player.plugins.mpegts.on(ni().Events.ERROR,(async(t,e)=>{this.player.notice(`再生中にエラーが発生しました。(${t}: ${e}) 3秒後にリロードします。`,-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload()})):!1===this.is_mpegts_supported&&this.player.on("error",(async()=>{!0!==this.is_offline&&this.player?.video.error&&(this.player.notice(`再生中にエラーが発生しました。(${this.player.video.error.code}: ${this.player.video.error.message}) 3秒後にリロードします。`,-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload())}));const t=()=>{this.player?.video.play().catch((()=>{console.warn("HTMLVideoElement.play() rejected. run fallback.");const t='';this.player.template.playButton.innerHTML=t,this.player.template.mobilePlayButton.innerHTML=t,this.player.container.classList.remove("dplayer-paused"),this.player.container.classList.add("dplayer-playing"),this.player.danmaku.play()})),!1!==this.is_loading||this.player.video.removeEventListener("pause",t)};!1===this.is_mpegts_supported&&(this.player.video.addEventListener("pause",t),t());const e=async()=>{await pt.sleep(.5),this.player?.video.readyState<3&&(console.log("player.video.readyState < HAVE_FUTURE_DATA. trying to recover."),this.player?.video.pause(),await pt.sleep(.1),this.player?.video.play().catch((()=>{console.warn("HTMLVideoElement.play() rejected. paused."),this.player?.pause()})))},s=async()=>{if(null===this.player)return;if(this.player.video.oncanplay=null,this.player.video.oncanplaythrough=null,!0===this.is_mpegts_supported){this.player.video.playbackRate=0;const t=()=>{let t=0;return this.player.video.buffered.length>=1&&(t=this.player.video.buffered.end(0)),Math.round(1e3*(t-this.player.video.currentTime))/1e3},e=this.settingsStore.settings.tv_low_latency_mode?ia:aa;let s=t();while(sthis.is_video_buffering=!0)),this.player.video.addEventListener("playing",(()=>{this.is_video_buffering=!1,e()})),this.is_loading=!1,!1===this.is_mpegts_supported&&this.player.video.removeEventListener("pause",t),this.is_video_buffering=!1,e(),this.channelsStore.channel.current.is_radiochannel?this.is_background_display=!0:this.is_background_display=!1;const s=this.player.user.get("volume");while(this.player.video.volume+.05{const e=JSON.parse(t.data);switch(console.log(`[initial_update] Status: ${e.status} / Detail: ${e.detail}`),e.status){case"Standby":this.is_video_buffering=!0,this.is_background_display=!0;break}})),this.eventsource.addEventListener("status_update",(async t=>{if(null===this.player)return;const e=JSON.parse(t.data);switch(console.log(`[status_update] Status: ${e.status} / Detail: ${e.detail}`),this.channelsStore.updateChannel(this.channelsStore.display_channel_id,{...this.channelsStore.channel.current,viewer_count:e.client_count}),e.status){case"Standby":this.player.template.notice.textContent.includes("画質を")||this.player.notice(e.detail,-1),this.is_video_buffering=!0,this.is_background_display=!0;break;case"ONAir":this.player.template.notice.textContent.includes("画質を")||this.player.notice(this.player.template.notice.textContent,1e-6),!1===this.is_mpegts_supported&&(this.player.video.load(),this.player.video.play(),s()),this.player.container.classList.contains("dplayer-paused")&&(this.player.container.classList.remove("dplayer-paused"),this.player.container.classList.add("dplayer-playing")),document.pictureInPictureElement&&(document.exitPictureInPicture(),this.player.video.requestPictureInPicture());break;case"Idling":this.player.notice("ストリーミング接続が切断されました。3秒後にリロードします。",-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload();break;case"Restart":this.player.notice(e.detail,-1),this.player.switchVideo({url:this.player.quality.url,type:this.player.quality.type}),this.player.play(),this.is_video_buffering=!0,this.is_background_display=!0;break;case"Offline":"ライブストリームは Offline です。"===e.detail&&(this.player?.notice("ストリーミング接続が切断されました。3秒後にリロードします。",-1,void 0,"#FF6F6A"),await pt.sleep(3),location.reload()),null!==this.player&&(this.player.notice(e.detail,-1),this.player.video.onerror=()=>{this.player.notice(e.detail,-1),this.player.video.onerror=null},this.player?.danmaku?.clear(),this.player.video.pause()),null!==this.eventsource&&(this.eventsource.close(),this.eventsource=null),this.is_background_display=!0,this.is_loading=!1,this.is_video_buffering=!1,this.is_offline=!0;break}})),this.eventsource.addEventListener("detail_update",(t=>{if(null===this.player)return;const e=JSON.parse(t.data);switch(console.log(`[detail_update] Status: ${e.status} Detail:${e.detail}`),this.channelsStore.updateChannel(this.channelsStore.display_channel_id,{...this.channelsStore.channel.current,viewer_count:e.client_count}),e.status){case"Standby":this.player.notice(e.detail,-1),this.is_background_display||(this.is_background_display=!0);break}})),this.eventsource.addEventListener("clients_update",(t=>{const e=JSON.parse(t.data);this.channelsStore.updateChannel(this.channelsStore.display_channel_id,{...this.channelsStore.channel.current,viewer_count:e.client_count})}))},initShortcutKeyHandler(){const t=this.$refs.Twitter,e=t.$el.querySelector(".tweet-form__textarea");for(const s of document.querySelectorAll("input[type=text],input[type=search],textarea"))s.addEventListener("compositionstart",(()=>this.is_ime_composing=!0)),s.addEventListener("compositionend",(()=>this.is_ime_composing=!1));this.shortcut_key_handler=async s=>{const i=document.activeElement.tagName.toUpperCase(),a=document.activeElement.getAttribute("contenteditable");["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(s.code)&&"INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a&&s.preventDefault();let n=!1;s.repeat&&(n=!0);const r=pt.time();if(r-this.shortcut_key_pressed_at<.05)return;this.shortcut_key_pressed_at=r;const o=await(async()=>{if(("INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a||document.activeElement===e)&&!1===this.is_ime_composing&&"Tab"===s.code)return document.activeElement===e?(e.blur(),!0):(this.is_panel_display=!0,this.tv_panel_active_tab="Twitter",e.focus(),this.$el.scrollLeft=0,window.setTimeout((()=>{e.focus(),this.$el.scrollLeft=0}),100),!0);if(("INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a||document.activeElement===e)&&"Twitter"===this.tv_panel_active_tab&&!1===this.is_ime_composing&&(s.ctrlKey||s.metaKey||s.shiftKey)&&"Enter"===s.code)return t.$el.querySelector(".tweet-button").click(),!0;if(null!==this.player&&!s.shiftKey&&!s.altKey&&this.player.template.controller.classList.contains("dplayer-controller-comment")&&(s.ctrlKey||s.metaKey)&&"KeyM"===s.code)return this.player.comment.hide(),!0;if("INPUT"!==i&&"TEXTAREA"!==i&&""!==a&&"true"!==a){if(!1===n&&!s.ctrlKey&&!s.metaKey&&(!1===this.settingsStore.settings.tv_channel_selection_requires_alt_key||s.altKey)){const t=s.shiftKey?"BS":"GR";let e=null;if("Digit1"!==s.code&&"Digit2"!==s.code&&"Digit3"!==s.code&&"Digit4"!==s.code&&"Digit5"!==s.code&&"Digit6"!==s.code&&"Digit7"!==s.code&&"Digit8"!==s.code&&"Digit9"!==s.code||(e=Number(s.code.replace("Digit",""))),"Digit0"===s.code&&(e=10),"Minus"===s.code&&(e=11),"Equal"===s.code&&(e=12),"Numpad1"!==s.code&&"Numpad2"!==s.code&&"Numpad3"!==s.code&&"Numpad4"!==s.code&&"Numpad5"!==s.code&&"Numpad6"!==s.code&&"Numpad7"!==s.code&&"Numpad8"!==s.code&&"Numpad9"!==s.code||(e=Number(s.code.replace("Numpad",""))),"Numpad0"===s.code&&(e=10),null!==e){const s=this.channelsStore.getChannelByRemoconID(t,e);if(null!==s&&s.display_channel_id!==this.channelsStore.display_channel_id)return await this.$router.push({path:`/tv/watch/${s.display_channel_id}`}),!0}}if(!1===n&&!s.ctrlKey&&!s.metaKey&&!s.shiftKey&&!s.altKey){if("Slash"===s.code)return this.shortcut_key_modal=!this.shortcut_key_modal,!0;if("KeyP"===s.code)return this.is_panel_display=!this.is_panel_display,!0;if("KeyK"===s.code)return this.tv_panel_active_tab="Program",!0;if("KeyL"===s.code)return this.tv_panel_active_tab="Channel",!0;if("Semicolon"===s.code)return this.tv_panel_active_tab="Comment",!0;if("Quote"===s.code)return this.tv_panel_active_tab="Twitter",!0;if("BracketRight"===s.code)return t.twitter_active_tab="Search",!0;if("Backslash"===s.code)return t.twitter_active_tab="Timeline",!0;if("IntlRo"===s.code)return t.twitter_active_tab="Capture",!0}if("Twitter"===this.tv_panel_active_tab&&"Capture"===t.twitter_active_tab&&!s.ctrlKey&&!s.metaKey&&!s.shiftKey&&!s.altKey){if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(s.code)){if(0===t.captures.length)return!1;if(!1===t.captures.some((t=>!0===t.focused)))return t.captures[t.captures.length-1].focused=!0,!0;const e=t.captures.findIndex((t=>!0===t.focused));if("ArrowUp"===s.code){if(e-2<0)return!1;t.captures[e-2].focused=!0}if("ArrowDown"===s.code){if(e+2>t.captures.length-1)return!1;t.captures[e+2].focused=!0}if("ArrowLeft"===s.code){if(e-1<0)return!1;t.captures[e-1].focused=!0}if("ArrowRight"===s.code){if(e+1>t.captures.length-1)return!1;t.captures[e+1].focused=!0}t.captures[e].focused=!1;const i=t.captures.find((t=>!0===t.focused));!0===t.zoom_capture_modal&&(t.zoom_capture=i);const a=t.$el.querySelector(`img[src="${i.image_url}"]`).parentElement;return n?a.scrollIntoView({block:"nearest",inline:"nearest",behavior:"auto"}):a.scrollIntoView({block:"nearest",inline:"nearest",behavior:"smooth"}),!0}if("Enter"===s.code){if(this.is_comment_send_just_did)return!1;if(!0===t.zoom_capture_modal)return t.zoom_capture_modal=!1,!0;const e=t.captures.find((t=>!0===t.focused));return void 0!==e&&(t.zoom_capture=e,t.zoom_capture_modal=!0,!0)}if("Space"===s.code){const e=t.captures.find((t=>!0===t.focused));return void 0!==e&&(t.clickCapture(e),!0)}}if(!1===n&&!s.ctrlKey&&!s.metaKey&&!s.shiftKey&&!s.altKey){if("ArrowUp"===s.code)return this.is_zapping=!0,await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`}),!0;if("ArrowDown"===s.code)return this.is_zapping=!0,await this.$router.push({path:`/tv/watch/${this.channelsStore.channel.next.display_channel_id}`}),!0}if(null!==this.player&&!s.shiftKey&&!s.altKey){if((s.ctrlKey||s.metaKey)&&"ArrowUp"===s.code)return this.player.volume(this.player.volume()+.05),!0;if((s.ctrlKey||s.metaKey)&&"ArrowDown"===s.code)return this.player.volume(this.player.volume()-.05),!0;if((s.ctrlKey||s.metaKey)&&"ArrowLeft"===s.code)return!1===this.player.video.paused&&this.player.video.pause(),this.player.video.currentTime=this.player.video.currentTime-.5,!0;if((s.ctrlKey||s.metaKey)&&"ArrowRight"===s.code)return!1===this.player.video.paused&&this.player.video.pause(),this.player.video.currentTime=this.player.video.currentTime+.5,!0}if(null!==this.player&&!s.ctrlKey&&!s.metaKey&&!s.altKey&&!0===s.shiftKey&&"Space"===s.code&&!1===n&&"Twitter"===this.tv_panel_active_tab&&"Capture"===t.twitter_active_tab)return this.player.toggle(),!0;if(null!==this.player&&!1===n&&!s.ctrlKey&&!s.metaKey&&!s.altKey){if("Space"===s.code)return this.player.toggle(),!0;if("KeyF"===s.code)return this.player.fullScreen.toggle(),!0;if("KeyW"===s.code)return this.player.sync(),!0;if("KeyE"===s.code)return document.pictureInPictureEnabled&&this.player.template.pipButton.click(),!0;if("KeyS"===s.code)return this.player.subtitle.toggle(),this.player.subtitle.container.classList.contains("dplayer-subtitle-hide")?this.player.notice(`${this.player.tran("Hide subtitle")}`):this.player.notice(`${this.player.tran("Show subtitle")}`),!0;if("KeyD"===s.code)return this.player.template.showDanmaku.click(),this.player.template.showDanmakuToggle.checked?this.player.notice(`${this.player.tran("Show comment")}`):this.player.notice(`${this.player.tran("Hide comment")}`),!0;if("KeyC"===s.code)return await this.capture_manager.captureAndSave(!1),!0;if("KeyV"===s.code)return await this.capture_manager.captureAndSave(!0),!0;if("KeyM"===s.code)return this.player.controller.show(),this.player.comment.show(),this.controlDisplayTimer(),window.setTimeout((()=>this.player.template.commentInput.focus()),100),!0}}return!1})();!0===o&&s.preventDefault()},document.addEventListener("keydown",this.shortcut_key_handler)},initCaptureManager(){this.capture_manager=new Wi({player:this.player,captured_callback:(t,e)=>{this.$refs.Twitter.addCaptureList(t,e)}});const t=this.$el.querySelector(".dplayer-icon.dplayer-capture-icon");t.addEventListener("click",(async()=>{await this.capture_manager.captureAndSave(!1)}));const e=this.$el.querySelector(".dplayer-icon.dplayer-comment-capture-icon");e.addEventListener("click",(async()=>{await this.capture_manager.captureAndSave(!0)}))},async destroy(t=!1,e=!1){this.$refs.Comment.destroy();for(const i of this.interval_ids)window.clearInterval(i);if(window.clearTimeout(this.control_interval_id),this.interval_ids=[],null!==this.data_broadcasting_manager&&(await this.data_broadcasting_manager.destroy(),this.data_broadcasting_manager=null),this.is_loading=!0,this.is_background_display=!1,null!==this.player&&(this.player_can_be_destroyed=!0),null!==this.eventsource&&(this.eventsource.close(),this.eventsource=null),!1===e){const t=this.player.user.get("volume");for(let e=0;e<20;e++)await pt.sleep(.01),this.player.video.volume=t*(1-(e+1)/20)}if(!0===t&&null!==this.player){try{this.player.destroy()}catch(s){void 0!==this.player.plugins.mpegts&&this.player.plugins.mpegts.destroy()}this.player_can_be_destroyed=!1,this.player=null}}}}),ra=na,oa=(0,p.Z)(ra,ti,ei,!1,null,"0dd9e1f3",null),la=oa.exports;o["default"].use(P.ZP);const ca=new P.ZP({mode:"history",base:"/",routes:[{path:"/",redirect:"/tv/"},{path:"/tv/",name:"TV Home",component:Xs},{path:"/tv/watch/:display_channel_id",name:"TV Watch",component:la},{path:"/settings/",name:"Settings Index",component:ls,beforeEnter:(t,e,s)=>{pt.isSmartphoneVertical()||pt.isSmartphoneHorizontal()||pt.isTabletVertical()?s():s({path:"/settings/general/"})}},{path:"/settings/general",name:"Settings General",component:ss},{path:"/settings/caption",name:"Settings Caption",component:Ae},{path:"/settings/data-broadcasting",name:"Settings Data Broadcasting",component:We},{path:"/settings/capture",name:"Settings Capture",component:Me},{path:"/settings/account",name:"Settings Account",component:Te},{path:"/settings/jikkyo",name:"Settings Jikkyo",component:Cs},{path:"/settings/twitter",name:"Settings Twitter",component:Ns},{path:"/settings/server",name:"Settings Server",component:Is},{path:"/login/",name:"Login",component:qt},{path:"/register/",name:"Register",component:oe},{path:"*",name:"NotFound",component:ee}],scrollBehavior(t,e,s){return s||{x:0,y:0}}});var _a=ca,da=s(95205);(0,da.z)("/service-worker.js",{ready(){console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB")},registered(){console.log("Service worker has been registered.")},cached(){console.log("Content has been cached for offline use.")},updatefound(){console.log("New content is downloading.")},updated(t){console.log("New content is available; please refresh."),N.show({message:"クライアントが新しいバージョンに更新されました。5秒後にリロードします。",timeout:1e4}),null!==t.waiting&&(t.waiting.postMessage({type:"SKIP_WAITING"}),t.waiting.addEventListener("statechange",(async t=>{"activated"===t.target.state&&(await pt.sleep(4),location.reload(!0))})))},offline(){console.log("No internet connection found. App is running in offline mode.")},error(t){console.error("Error during service worker registration:",t)}}),(0,n.OK)(),o["default"].config.productionTip=!1,o["default"].config.devtools=!0,o["default"].use(a.og);const ua=(0,a.WB)();o["default"].use(l.ZP),o["default"].use(_(),{top:!1,bottom:!0,color:"#433532",dark:!0,elevation:8,timeout:2500,autoRemove:!0,closeButtonContent:"閉じる",vuetifyInstance:B});const ma=pt.isTouchDevice()?[]:["hover","focus","touch"];r.ZP.options.themes.tooltip.showTriggers=ma,r.ZP.options.themes.tooltip.hideTriggers=ma,r.ZP.options.themes.tooltip.delay.show=0,r.ZP.options.offset=[0,7],o["default"].use(r.ZP),o["default"].component("Icon",i.JO),o["default"].component("v-tab-item-fix",w),o["default"].component("v-tabs-fix",x),o["default"].component("v-tabs-items-fix",O),window.KonomiTVVueInstance=new o["default"]({pinia:ua,router:_a,vuetify:B,render:t=>t(v)}).$mount("#app");let pa=!1;const ha=st();ha.$subscribe((async()=>{!0!==pa&&(console.log("Client Settings Changed:",ha.settings),Q(ha.settings),await ha.syncClientSettingsToServer())}),{detached:!0}),window.setInterval((async()=>{null!==pt.getAccessToken()&&!0===ha.settings.sync_settings&&(pa=!0,await ha.syncClientSettingsFromServer(),pa=!1,Q(ha.settings))}),3e3)},91343:function(){},2307:function(){},11004:function(){},4065:function(){},43450:function(){}},e={};function s(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={id:i,loaded:!1,exports:{}};return t[i].call(n.exports,n,n.exports,s),n.loaded=!0,n.exports}s.m=t,function(){var t=[];s.O=function(e,i,a,n){if(!i){var r=1/0;for(_=0;_=n)&&Object.keys(s.O).every((function(t){return s.O[t](i[l])}))?i.splice(l--,1):(o=!1,n0&&t[_-1][2]>n;_--)t[_]=t[_-1];t[_]=[i,a,n]}}(),function(){s.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return s.d(e,{a:e}),e}}(),function(){s.d=function(t,e){for(var i in e)s.o(e,i)&&!s.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}}(),function(){s.u=function(t){return"assets/js/"+t+".64d0cbac.js"}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"===typeof window)return window}}()}(),function(){s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(),function(){s.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}}(),function(){s.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t}}(),function(){s.p="/"}(),function(){s.b=document.baseURI||self.location.href;var t={143:0};s.O.j=function(e){return 0===t[e]};var e=function(e,i){var a,n,r=i[0],o=i[1],l=i[2],c=0;if(r.some((function(e){return 0!==t[e]}))){for(a in o)s.o(o,a)&&(s.m[a]=o[a]);if(l)var _=l(s)}for(e&&e(i);c {\n\n // VueComponent の key が一致する this.$slots.default 内の VNode を探す\n const index_a = this.$slots.default!.findIndex((element) => {\n return a.$vnode.key === element.key;\n });\n const index_b = this.$slots.default!.findIndex((element) => {\n return b.$vnode.key === element.key;\n });\n\n // index 順で並び替え\n return index_a - index_b;\n });\n\n item.$on('change', () => (this as any).onClick(item));\n if ((this as any).mandatory && !(this as any).selectedValues.length) {\n (this as any).updateMandatory();\n }\n\n // 追加された要素のソート後のインデックスを取得して更新する\n (this as any).updateItem(item, this.items.indexOf(item));\n\n // ソート後の現在アクティブなタブのインデックスを取得し直し、設定する\n // 配列の末尾以外に追加された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n },\n\n unregister(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 継承元の unregister() の処理を呼び出す(いわゆる super() )\n // ref: https://github.com/vuejs/vue/issues/2977\n (this.constructor as any).super.options.methods.unregister.call(this, item);\n\n // 配列の末尾以外から削除された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n }\n }\n});\n","\nimport { VueConstructor, VNode } from 'vue';\nimport VTabs from 'vuetify/lib/components/VTabs/VTabs';\nimport { convertToUnit } from 'vuetify/lib/util/helpers';\n\nimport VTabsBar from '@/components/Vuetify/VTabsBar';\n\nexport default (VTabs as VueConstructor).extend({\n methods: {\n\n // VTabsBar は VTabs から暗黙的に生成されるコンポーネントのため、直接上書きすることができない\n // そこで VTabs 自体も上書きし、VTabs で $createElement() される時の VTabsBar を自前でオーバーライドしたものに差し替える\n // ビルド済みのファイルには型定義が入っていないので any を多用せざるを得ない…\n genBar(items: VNode[], slider: VNode | null) {\n const data = {\n style: {\n height: convertToUnit((this as any).height),\n },\n props: {\n activeClass: (this as any).activeClass,\n centerActive: (this as any).centerActive,\n dark: (this as any).dark,\n light: (this as any).light,\n mandatory: !(this as any).optional,\n mobileBreakpoint: (this as any).mobileBreakpoint,\n nextIcon: (this as any).nextIcon,\n prevIcon: (this as any).prevIcon,\n showArrows: (this as any).showArrows,\n value: (this as any).internalValue,\n },\n on: {\n 'call:slider': (this as any).callSlider,\n change: (val: any) => {\n (this as any).internalValue = val;\n },\n },\n ref: 'items',\n };\n\n (this as any).setTextColor((this as any).computedColor, data);\n (this as any).setBackgroundColor((this as any).backgroundColor, data);\n\n // ここでオーバーライドした VTabsBar を使うのが最重要\n // これをやるためだけにわざわざ VTabs に関してもオーバーライドする羽目になってる…\n return (this as any).$createElement(VTabsBar, data, [\n (this as any).genSlider(slider),\n items,\n ]);\n }\n }\n});\n","\nimport { VueConstructor } from 'vue';\nimport { GroupableInstance } from 'vuetify/lib/components/VItemGroup/VItemGroup';\nimport VTabsItems from 'vuetify/lib/components/VTabs/VTabsItems';\n\n// VTabsItems は VItemGroup と VWindow を extend() して実装されている\nexport default (VTabsItems as VueConstructor).extend({\n data() {\n return {\n // 一応型定義をしておく\n items: [] as GroupableInstance[],\n };\n },\n methods: {\n\n // タブのデータ配列の先頭に新しい要素が追加されるとそのタブのアニメーションの向きが逆になるバグがあるので、VItemGroup 側の挙動をオーバーライドする\n // DOM 上も VNode 上も正しい順序で並んでいるが、this.items に関しては追加された順になっていてしまっていて齟齬が発生するのが原因\n // ref: https://github.com/vuetifyjs/vuetify/issues/13862\n register(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 要素を items に追加\n this.items.push(item);\n\n // this.$slots.default に VNode が、items には単に VueComponent が入っているので、事前に VNode の順番に合わせて並べ替える\n // こうすることで、追加された順ではなく元のデータ配列通りの順番になる\n this.items.sort((a, b) => {\n\n // VueComponent の key が一致する this.$slots.default 内の VNode を探す\n const index_a = this.$slots.default!.findIndex((element) => {\n return a.$vnode.key === element.key;\n });\n const index_b = this.$slots.default!.findIndex((element) => {\n return b.$vnode.key === element.key;\n });\n\n // index 順で並び替え\n return index_a - index_b;\n });\n\n item.$on('change', () => (this as any).onClick(item));\n if ((this as any).mandatory && !(this as any).selectedValues.length) {\n (this as any).updateMandatory();\n }\n\n // 追加された要素のソート後のインデックスを取得して更新する\n (this as any).updateItem(item, this.items.indexOf(item));\n\n // ソート後の現在アクティブなタブのインデックスを取得し直し、設定する\n // 配列の末尾以外に追加された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n // 値が異なるときだけ更新する\n // こうしないと、Safari で変なアニメーションがついてしまう\n if (this.items.indexOf(activeItem) !== (this as any).internalValue) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n }\n },\n\n unregister(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 継承元の unregister() の処理を呼び出す(いわゆる super() )\n // ref: https://github.com/vuejs/vue/issues/2977\n (this.constructor as any).super.options.methods.unregister.call(this, item);\n\n // 配列の末尾以外から削除された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n },\n\n // 最初のタブから最後のタブに遷移するとアニメーションの向きが逆になるバグがあるので、VWindow 側の挙動をオーバーライドする\n // 本来は VCarousel 用の動作だが、VTabsItems も VWindow を継承しているので、それが適用されてしまっているらしい\n // ref: https://github.com/yuwu9145/vuetify/blob/master/packages/vuetify/src/components/VWindow/VWindow.ts#L239-L252\n updateReverse(val: number, oldVal: number) {\n\n const itemsLength = this.items.length;\n const lastIndex = itemsLength - 1;\n\n if (itemsLength <= 2) return val < oldVal;\n\n // continuous が false の時、常に val < oldVal の結果を返す\n if (!(this as any).continuous) return val < oldVal;\n\n if (val === lastIndex && oldVal === 0) {\n return true;\n } else if (val === 0 && oldVal === lastIndex) {\n return false;\n } else {\n return val < oldVal;\n }\n }\n }\n});\n","\nimport Vue from 'vue';\nimport { VSnackbar, VBtn, VIcon } from 'vuetify/lib';\nimport Vuetify from 'vuetify/lib/framework';\n\n\nVue.use(Vuetify);\n\n// vuetify-message-snackbar を使うのに必要\nVue.component('v-snackbar', VSnackbar);\nVue.component('v-btn', VBtn);\nVue.component('v-icon', VIcon);\n\nexport default new Vuetify({\n theme: {\n dark: true,\n themes: {\n dark: {\n primary: '#E64F97',\n secondary: '#E33157',\n twitter: {\n base: '#4F82E6',\n lighten1: '#799FEC',\n lighten2: '#41A5F1',\n },\n gray: '#66514C',\n black: '#110A09',\n background: {\n base: '#1E1310',\n lighten1: '#2F221F',\n lighten2: '#433532',\n lighten3: '#4c3c38',\n },\n text: {\n base: '#FFEAEA',\n darken1: '#D9C7C7',\n darken2: '#8E7F7E',\n darken3: '#786968',\n }\n }\n },\n options: {\n customProperties: true,\n },\n },\n});\n","\n/**\n * 共通ユーティリティ\n */\nexport default class Utils {\n\n // バージョン情報\n // ビルド時の環境変数 (vue.config.js に記載) から取得\n public static readonly version: string = process.env.VUE_APP_VERSION as string;\n\n // バックエンドの API のベース URL\n public static readonly api_base_url = (() => {\n if (process.env.NODE_ENV === 'development') {\n // デバッグ時はポートを 7000 に強制する\n return `${window.location.protocol}//${window.location.hostname}:7000/api`;\n } else {\n // ビルド後は同じポートを使う\n return `${window.location.protocol}//${window.location.host}/api`;\n }\n })();\n\n\n /**\n * アクセストークンを LocalStorage から取得する\n * @returns JWT アクセストークン(ログインしていない場合は null が返る)\n */\n public static getAccessToken(): string | null {\n\n // LocalStorage の取得結果をそのまま返す\n // LocalStorage.getItem() はキーが存在しなければ(=ログインしていなければ)null を返す\n return localStorage.getItem('KonomiTV-AccessToken');\n }\n\n\n /**\n * アクセストークンを LocalStorage に保存する\n * @param access_token 発行された JWT アクセストークン\n */\n public static saveAccessToken(access_token: string): void {\n\n // そのまま LocalStorage に保存\n localStorage.setItem('KonomiTV-AccessToken', access_token);\n }\n\n\n /**\n * アクセストークンを LocalStorage から削除する\n * アクセストークンを削除することで、ログアウト相当になる\n */\n public static deleteAccessToken(): void {\n\n // LocalStorage に KonomiTV-AccessToken キーが存在しない\n if (localStorage.getItem('KonomiTV-AccessToken') === null) return;\n\n // KonomiTV-AccessToken キーを削除\n localStorage.removeItem('KonomiTV-AccessToken');\n }\n\n\n /**\n * ブラウザが実行されている OS に応じて、\"Alt\" または \"Option\" を返す\n * キーボードショートカットのコンビネーションキーの説明を OS によって分けるために使う\n * @returns ブラウザが実行されている OS が Mac なら Option を、それ以外なら Alt を返す\n */\n public static AltOrOption(): 'Alt' | 'Option' {\n // iPhone・iPad で純正キーボードを接続した場合も一応想定して、iPhone・iPad も含める(動くかは未検証)\n return /iPhone|iPad|Macintosh/i.test(navigator.userAgent) ? 'Option' : 'Alt';\n }\n\n\n /**\n * ブラウザが実行されている OS に応じて、\"Ctrl\" または \"Cmd\" を返す\n * キーボードショートカットのコンビネーションキーの説明を OS によって分けるために使う\n * @returns ブラウザが実行されている OS が Mac なら Cmd を、それ以外なら Ctrl を返す\n */\n public static CtrlOrCmd(): 'Ctrl' | 'Cmd' {\n // iPhone・iPad で純正キーボードを接続した場合も一応想定して、iPhone・iPad も含める(動くかは未検証)\n return /iPhone|iPad|Macintosh/i.test(navigator.userAgent) ? 'Cmd' : 'Ctrl';\n }\n\n\n /**\n * Blob に格納されているデータをブラウザにダウンロードさせる\n * @param blob Blob オブジェクト\n * @param filename 保存するファイル名\n */\n public static downloadBlobData(blob: Blob, filename: string): void {\n\n // Blob URL を発行\n const blob_url = URL.createObjectURL(blob);\n\n // 画像をダウンロード\n const link = document.createElement('a');\n link.download = filename;\n link.href = blob_url;\n link.click();\n\n // Blob URL を破棄\n URL.revokeObjectURL(blob_url);\n }\n\n\n /**\n * innerHTML しても問題ないように HTML の特殊文字をエスケープする\n * PHP の htmlspecialchars() と似たようなもの\n * @param content HTML エスケープされてないテキスト\n * @returns HTML エスケープされたテキスト\n */\n public static escapeHTML(content: string): string {\n\n // HTML エスケープが必要な文字\n // ref: https://www.php.net/manual/ja/function.htmlspecialchars.php\n const html_escape_table = {\n '&': '&',\n '\"': '"',\n '\\'': ''',\n '<': '<',\n '>': '>',\n };\n\n // ref: https://qiita.com/noriaki/items/4bfef8d7cf85dc1035b3\n return content.replace(/[&\"'<>]/g, (match) => {\n return html_escape_table[match];\n });\n }\n\n\n /**\n * OAuth 連携時のポップアップを画面中央に表示するための windowFeatures 文字列を取得する\n * ref: https://qiita.com/catatsuy/items/babce8726ea78f5d25b1\n * @returns window.open() で使う windowFeatures 文字列\n */\n public static getWindowFeatures(): string {\n\n // ポップアップウインドウのサイズ\n const popupSizeWidth = 650;\n const popupSizeHeight = window.screen.height >= 800 ? 800 : window.screen.height - 100;\n\n // ポップアップウインドウの位置\n const posTop = (window.screen.height - popupSizeHeight) / 2;\n const posLeft = (window.screen.width - popupSizeWidth) / 2;\n\n return `toolbar=0,status=0,top=${posTop},left=${posLeft},width=${popupSizeWidth},height=${popupSizeHeight},modal=yes,alwaysRaised=yes`;\n }\n\n\n /**\n * 現在フォーカスを持っている要素に指定された CSS クラスが付与されているか\n * @param class_name 存在を確認する CSS クラス名\n * @returns document.activeElement が class_name で指定したクラスを持っているかどうか\n */\n public static hasActiveElementClass(class_name: string): boolean {\n if (document.activeElement === null) return false;\n return document.activeElement.classList.contains(class_name);\n }\n\n\n /**\n * ブラウザが Firefox かどうか\n * @returns ブラウザが Firefox なら true を返す\n */\n public static isFirefox(): boolean {\n return /Firefox/i.test(navigator.userAgent);\n }\n\n\n /**\n * ブラウザが Safari かどうか\n * @returns ブラウザが Safari なら true を返す\n */\n public static isSafari(): boolean {\n return /Safari/i.test(navigator.userAgent) && !/Chrome/i.test(navigator.userAgent);\n }\n\n\n /**\n * モバイルデバイス(スマホ・タブレット)かどうか\n * @returns モバイルデバイス (スマホ・タブレット) なら true を返す\n */\n public static isMobileDevice(): boolean {\n // Macintosh が入っているのは、iPadOS は既定でデスクトップ表示モードが有効になっていて、UA だけでは Mac と判別できないため\n // Mac にタッチパネル付きの機種は存在しないので、'ontouchend' in document で判定できる\n return /iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\n }\n\n\n /**\n * 表示画面がスマホ横画面かどうか\n * @returns スマホ横画面なら true を返す\n */\n public static isSmartphoneHorizontal(): boolean {\n return window.matchMedia('(max-width: 1000px) and (max-height: 450px)').matches;\n }\n\n\n /**\n * 表示画面がスマホ縦画面かどうか\n * @returns スマホ縦画面なら true を返す\n */\n public static isSmartphoneVertical(): boolean {\n return window.matchMedia('(max-width: 600px) and (min-height: 450.01px)').matches;\n }\n\n\n /**\n * 表示画面がタブレット横画面かどうか\n * @returns タブレット横画面なら true を返す\n */\n public static isTabletHorizontal(): boolean {\n return window.matchMedia('(max-width: 1264px) and (max-height: 850px)').matches;\n }\n\n\n /**\n * 表示画面がタブレット縦画面かどうか\n * @returns タブレット縦画面なら true を返す\n */\n public static isTabletVertical(): boolean {\n return window.matchMedia('(max-width: 850px) and (min-height: 850.01px)').matches;\n }\n\n\n /**\n * 表示端末がタッチデバイスかどうか\n * @returns タッチデバイスなら true を返す\n */\n public static isTouchDevice(): boolean {\n return window.matchMedia('(hover: none)').matches;\n }\n\n\n /**\n * 任意の桁で切り捨てする\n * ref: https://qiita.com/nagito25/items/0293bc317067d9e6c560#comment-87f0855f388953843037\n * @param value 切り捨てする数値\n * @param base どの桁で切り捨てするか (-1 → 10の位 / 3 → 小数第3位)\n * @return 切り捨てした値\n */\n public static mathFloor(value: number, base: number = 0): number {\n return Math.floor(value * (10**base)) / (10**base);\n }\n\n\n /**\n * async/await でスリープ的なもの\n * @param seconds 待機する秒数 (ミリ秒単位ではないので注意)\n * @returns Promise を返すので、await sleep(1); のように使う\n */\n public static async sleep(seconds: number): Promise {\n return await new Promise(resolve => setTimeout(resolve, seconds * 1000));\n }\n\n\n /**\n * 現在時刻の UNIX タイムスタンプ (秒単位) を取得する (デバッグ用)\n * @returns 現在時刻の UNIX タイムスタンプ (秒単位)\n */\n public static time(): number {\n return Date.now() / 1000;\n }\n\n\n /**\n * 指定された値の型の名前を取得する\n * ref: https://qiita.com/amamamaou/items/ef0b797156b324bb4ef3\n * @returns 指定された値の型の名前\n */\n public static typeof(value: any): string {\n return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();\n }\n\n\n /**\n * 文字列中に含まれる URL をリンクの HTML に置き換える\n * @param text 置換対象の文字列\n * @returns URL をリンクに置換した文字列\n */\n public static URLtoLink(text: string): string {\n\n // HTML の特殊文字で表示がバグらないように、事前に HTML エスケープしておく\n text = Utils.escapeHTML(text);\n\n // ref: https://www.softel.co.jp/blogs/tech/archives/6099\n const pattern = /(https?:\\/\\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/ig;\n return text.replace(pattern, '$1');\n }\n}\n","\nimport { ChannelType } from '@/services/Channels';\n\n\n/**\n * チャンネル周りのユーティリティ\n */\nexport class ChannelUtils {\n\n /**\n * チャンネル ID からチャンネルタイプを取得する\n * @param display_channel_id チャンネル ID\n * @returns チャンネルタイプ\n */\n public static getChannelType(display_channel_id: string): ChannelType {\n try {\n const result = display_channel_id.match('(?[a-z]+)[0-9]+')!.groups!.channel_type.toUpperCase();\n return result as ChannelType;\n } catch (e) {\n // 何かしらエラーが発生したということはチャンネル ID が不正\n // とりあえずここではエラーにならないよう GR を返す エラー処理はその後の段階で行われる\n return 'GR';\n }\n }\n\n\n /**\n * チャンネルの実況勢いから「多」「激多」「祭」を取得する\n * ref: https://ja.wikipedia.org/wiki/%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%AE%9F%E6%B3%81\n * @param jikkyo_force チャンネルの実況勢い\n * @returns normal(普通)or many(多)or so-many(激多)or festival(祭)\n */\n public static getChannelForceType(jikkyo_force: number | null): 'normal' | 'many' | 'so-many' | 'festival' {\n\n // 実況勢いが null(=対応する実況チャンネルがない)\n if (jikkyo_force === null) return 'normal';\n\n // 実況勢いが 500 コメント以上(祭)\n if (jikkyo_force >= 500) return 'festival';\n // 実況勢いが 200 コメント以上(激多)\n if (jikkyo_force >= 200) return 'so-many';\n // 実況勢いが 100 コメント以上(多)\n if (jikkyo_force >= 100) return 'many';\n\n // それ以外\n return 'normal';\n }\n}\n","\nimport { MessageOption, MessageType } from 'vuetify-message-snackbar/src/message';\n\n\ninterface MessageReturnValue {\n close(): void;\n again(): void;\n}\n\n// Vue コンポーネント以外からも this.$message を使えるようにするための (強引な) ラッパー\nexport default {\n success(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.success(message);\n },\n info(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.info(message);\n },\n warning(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.warning(message);\n },\n error(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.error(message);\n },\n show(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.show(message);\n }\n};\n","\nimport axios from 'axios';\n\nimport Utils from '@/utils';\n\n\n// Axios のインスタンスを作成\nconst axios_instance = axios.create();\n\n// HTTP リクエスト前に割り込んで行われる処理\naxios_instance.interceptors.request.use((config) => {\n\n // API のベース URL を設定 (config.baseURL が指定されていない場合のみ)\n if (config.baseURL === undefined) {\n config.baseURL = Utils.api_base_url;\n }\n\n // 外部サイトへの HTTP リクエストでは実行しない\n if (config.url?.startsWith('http') === false) {\n\n // アクセストークンが取得できたら(=ログインされていれば)\n // 取得したアクセストークンを Authorization ヘッダーに Bearer トークンとしてセット\n // これを忘れると(当然ながら)ログインしていない扱いになる\n const access_token = Utils.getAccessToken();\n if (access_token !== null) {\n config.headers['Authorization'] = `Bearer ${access_token}`;\n }\n\n // KonomiTV クライアントのバージョンを設定\n // 今のところ使わないが、将来的にクライアントとサーバーを分離することを見据えて念のため\n config.headers['X-KonomiTV-Version'] = Utils.version;\n }\n\n // タイムアウト時間を30秒に設定\n config.timeout = 30 * 1000;\n\n return config;\n});\n\nexport default axios_instance;\n","\nimport Message from '@/message';\nimport APIClient from '@/services/APIClient';\n\n\n/** ユーザーアカウントの情報を表すインターフェイス */\nexport interface IUser {\n id: number;\n name: string;\n is_admin: boolean;\n niconico_user_id: number | null;\n niconico_user_name: string | null;\n niconico_user_premium: boolean | null;\n twitter_accounts: ITwitterAccount[];\n created_at: string;\n updated_at: string;\n}\n\n/** ユーザーアカウントに紐づく Twitter アカウントの情報を表すインターフェイス */\nexport interface ITwitterAccount {\n id: number;\n name: string;\n screen_name: string;\n icon_url: string;\n is_oauth_session: boolean;\n created_at: string;\n updated_at: string;\n}\n\n/** ユーザーアカウントのアクセストークンを表すインターフェイス */\nexport interface IUserAccessToken {\n access_token: string;\n token_type: string;\n}\n\nexport interface IUserCreateRequest {\n username: string;\n password: string;\n}\nexport interface IUserUpdateRequest {\n username?: string;\n password?: string;\n}\nexport interface IUserUpdateRequestForAdmin {\n username?: string;\n password?: string;\n is_admin?: boolean;\n}\n\n\nclass Users {\n\n /**\n * ユーザーアカウントを作成する\n * @param user_create_request ユーザー名とパスワード\n * @returns 作成したユーザーアカウントの情報 or アカウント作成に失敗した場合は null\n */\n static async createUser(user_create_request: IUserCreateRequest): Promise {\n\n // API リクエストを実行\n const response = await APIClient.post('/users', user_create_request);\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Specified username is duplicated': {\n Message.error('ユーザー名が重複しています。');\n break;\n }\n case 'Specified username is not accepted due to system limitations': {\n Message.error('ユーザー名に token と me は使えません。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'アカウントを作成できませんでした。');\n break;\n }\n }\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * ユーザーアカウントのアクセストークンを発行する\n * @param username ユーザー名\n * @param password パスワード\n * @returns 発行したアクセストークン or ログインに失敗した場合は null\n */\n static async createUserAccessToken(username: string, password: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.post('/users/token', new URLSearchParams({username, password}));\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Incorrect username': {\n Message.error('ログインできませんでした。そのユーザー名のアカウントは存在しません。');\n break;\n }\n case 'Incorrect password': {\n Message.error('ログインできませんでした。パスワードを間違えていませんか?');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'ログインできませんでした。');\n break;\n }\n }\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を取得する\n * @returns ログイン中のユーザーアカウントの情報 or ログインしていない場合は null\n */\n static async fetchUser(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/users/me');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'アカウント情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントのアイコンを取得する\n * @returns ログイン中のユーザーアカウントのアイコンの Blob URL or ログインしていない場合は null\n */\n static async fetchUserIcon(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/users/me/icon', {responseType: 'blob'});\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'アイコン画像を取得できませんでした。');\n return null;\n }\n\n return URL.createObjectURL(response.data);\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を更新する\n * @param user_update_request ユーザー名 or パスワード\n */\n static async updateUser(user_update_request: IUserUpdateRequest): Promise {\n\n // API リクエストを実行\n const response = await APIClient.put('/users/me', user_update_request);\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Specified username is duplicated': {\n Message.error('ユーザー名が重複しています。');\n break;\n }\n case 'Specified username is not accepted due to system limitations': {\n Message.error('ユーザー名に token と me は使えません。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'アカウント情報を更新できませんでした。');\n break;\n }\n }\n return;\n }\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントのアイコン画像を更新する\n * @param icon アイコンの File オブジェクト\n */\n static async updateUserIcon(icon: File): Promise {\n\n // アイコン画像の File オブジェクト (= Blob) を FormData に入れる\n // multipart/form-data で送るために必要\n // ref: https://r17n.page/2020/02/04/nodejs-axios-file-upload-api/\n const form_data = new FormData();\n form_data.append('image', icon);\n\n // API リクエストを実行\n const response = await APIClient.put('/users/me/icon', form_data, {headers: {'Content-Type': 'multipart/form-data'}});\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Please upload JPEG or PNG image': {\n Message.error('JPEG または PNG 画像をアップロードしてください。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'アイコン画像を更新できませんでした。');\n break;\n }\n }\n return;\n }\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントを削除する\n */\n static async deleteUser(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.delete('/users/me');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'アカウントを削除できませんでした。');\n return;\n }\n }\n}\n\nexport default Users;\n","\nimport { defineStore } from 'pinia';\n\nimport Message from '@/message';\nimport Users, { IUser, IUserUpdateRequest } from '@/services/Users';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\n\n\n/**\n * 現在ログイン中のユーザーアカウントの情報を共有するストア\n */\nconst useUserStore = defineStore('user', {\n state: () => ({\n\n // 現在ログイン中かどうか\n is_logged_in: false as boolean,\n\n // ログイン済みのユーザーの情報\n user: null as IUser | null,\n\n // ログイン済みのユーザーのアイコン画像の Blob URL\n user_icon_url: null as string | null,\n }),\n getters: {\n\n /**\n * ログイン済みのユーザーのニコニコアカウントのユーザーアイコンの URL (ニコニコアカウントと連携されている場合のみ)\n */\n user_niconico_icon_url(): string | null {\n if (this.user === null || this.user.niconico_user_id === null) {\n return null;\n }\n const user_id_slice = this.user.niconico_user_id.toString().slice(0, 4);\n return `https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/${user_id_slice}/${this.user.niconico_user_id}.jpg`;\n }\n },\n actions: {\n\n /**\n * アカウントを作成する\n * @param username ユーザー名\n * @param password パスワード\n * @returns アカウント作成に成功した場合は true\n */\n async register(username: string, password: string): Promise {\n\n // アカウントを作成\n const result = await Users.createUser({username, password});\n if (result === null) {\n console.log('Register failed.');\n return false; // アカウント作成失敗 (エラーハンドリングは services 層で行われる)\n }\n\n // 作成したアカウントでログイン\n await this.login(username, password, true);\n console.log('Register successful.');\n Message.success('アカウントを作成しました。');\n return true;\n },\n\n /**\n * ログイン処理を行う\n * @param username ユーザー名\n * @param password パスワード\n * @param silent ログインしたことをメッセージで通知しない場合は true\n * @returns ログインに成功した場合は true\n */\n async login(username: string, password: string, silent: boolean = false): Promise {\n\n // アクセストークンを発行\n const access_token = await Users.createUserAccessToken(username, password);\n if (access_token === null) {\n console.log('Login failed.');\n this.logout(true);\n return false; // ログイン失敗 (エラーハンドリングは services 層で行われる)\n }\n\n // 取得したアクセストークンを保存\n console.log('Login successful.');\n Utils.saveAccessToken(access_token.access_token);\n this.is_logged_in = true;\n\n // ユーザーアカウントの情報を取得\n await this.fetchUser(true);\n\n if (silent === false) {\n Message.success('ログインしました。');\n }\n\n return true;\n },\n\n /**\n * ログアウト処理を行う\n * @param silent ログアウトしたことをメッセージで通知しない場合は true\n */\n logout(silent: boolean = false): void {\n\n // 設定の同期を無効化\n const settings_store = useSettingsStore();\n settings_store.settings.sync_settings = false;\n\n // ブラウザからアクセストークンを削除\n // これをもってログアウトしたことになる(それ以降の Axios のリクエストにはアクセストークンが含まれなくなる)\n Utils.deleteAccessToken();\n\n // 未ログイン状態に設定\n this.is_logged_in = false;\n this.user = null;\n this.user_icon_url = '';\n\n if (silent === false) {\n Message.success('ログアウトしました。');\n }\n },\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を取得する\n * すでに取得済みの情報がある場合は API リクエストを行わずにそれを返す\n * @param force 強制的に API リクエストを行う場合は true\n * @returns ログイン中のユーザーアカウントの情報 or ログインしていない場合は null\n */\n async fetchUser(force: boolean = false): Promise {\n\n // LocalStorage にアクセストークンが保存されていない場合 (= 非ログイン状態) は常に null を返す\n if (Utils.getAccessToken() === null) {\n return null;\n }\n\n // すでにログイン済みのユーザーアカウントの情報がある場合はそれを返す\n // force が true の場合は無視される\n if (this.user !== null && force === false) {\n return this.user;\n }\n\n // ユーザーアカウントの情報を取得する\n const user = await Users.fetchUser();\n if (user === null) {\n // この時点で無効などの理由でアクセストークンが削除されている場合、ログアウトする\n if (Utils.getAccessToken() === null) {\n this.logout(true);\n }\n return null;\n }\n this.is_logged_in = true;\n this.user = user;\n\n // ユーザーアカウントのアイコン画像の Blob URL を取得する\n const user_icon_url = await Users.fetchUserIcon();\n if (user_icon_url === null) {\n return null;\n }\n this.user_icon_url = user_icon_url;\n\n return this.user;\n },\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を更新する\n * @param user_update_request ユーザー名 or パスワード\n */\n async updateUser(user_update_request: IUserUpdateRequest): Promise {\n\n // ユーザーアカウントの情報を更新する\n await Users.updateUser(user_update_request);\n\n // ユーザーアカウントの情報を再取得する\n await this.fetchUser(true);\n\n if (user_update_request.username !== undefined) {\n Message.show('ユーザー名を更新しました。');\n } else if (user_update_request.password !== undefined) {\n Message.show('パスワードを更新しました。');\n }\n },\n\n /**\n * 現在ログイン中のユーザーアカウントのアイコン画像を更新する\n * @param icon アイコンの File オブジェクト\n */\n async updateUserIcon(icon: File): Promise {\n\n // ユーザーアカウントのアイコン画像を更新する\n await Users.updateUserIcon(icon);\n\n // ユーザーアカウントの情報を再取得する\n await this.fetchUser(true);\n\n Message.show('アイコン画像を更新しました。');\n },\n\n /**\n * 現在ログイン中のユーザーアカウントを削除する\n */\n async deleteUser(): Promise {\n\n // ユーザーアカウントを削除する\n await Users.deleteUser();\n\n // ログアウトする\n this.logout(true);\n\n Message.show('アカウントを削除しました。');\n }\n }\n});\n\nexport default useUserStore;\n","\n/**\n * services/ 以下の各クラスは、KonomiTV サーバーへの API リクエストを抽象化し、\n * API レスポンスの受け取りと、エラーが発生した際のエラーハンドリング (エラーメッセージ表示) までを責務として負う\n */\n\nimport { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport Message from '@/message';\nimport axios from '@/plugins/axios';\nimport useUserStore from '@/store/UserStore';\n\n\n/** API のエラーレスポンスを表すインターフェイス */\nexport interface IError {\n detail: string;\n}\n\n/** API リクエスト成功時のレスポンスを表すインターフェイス */\nexport type SuccessResponse = {\n status: number;\n data: T;\n error: null;\n is_success: true;\n};\n\n/** API リクエスト失敗時のレスポンスを表すインターフェイス */\nexport type ErrorResponse = {\n status: number;\n data: null;\n error: T;\n is_error: true;\n};\n\n\n/**\n * services/ 以下の各クラスから呼び出される、Axios の薄いラッパー\n * エラーハンドリングを容易にするために、レスポンスを SuccessResponse と ErrorResponse に分けて返す\n * ref: https://zenn.dev/engineer_titan/articles/291c9fccb338e2\n */\nclass APIClient {\n\n /**\n * Axios で HTTP リクエストを送信し、レスポンスを受け取る\n * @param request AxiosRequestConfig\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async request(request: AxiosRequestConfig): Promise | ErrorResponse> {\n\n // Axios で HTTP リクエストを送信し、レスポンスを受け取る\n const result: AxiosResponse | AxiosError = await axios.request(request).catch((error: AxiosError) => error);\n\n // エラーが発生した場合は ErrorResponse を返す\n if (result instanceof AxiosError) {\n console.error(result);\n\n // エラーレスポンスがあれば、エラー内容を取得して返す\n if (result.response) {\n return {\n status: result.response.status,\n data: null,\n error: new Error(result.response.data.detail),\n is_error: true,\n };\n\n // エラーレスポンスがない場合は、AxiosError をそのまま返す\n } else {\n return {\n status: NaN,\n data: null,\n error: result,\n is_error: true,\n };\n }\n\n // 正常にレスポンスが返ってきた場合は SuccessResponse を返す\n } else {\n return {\n status: result.status,\n data: result.data,\n error: null,\n is_success: true,\n };\n }\n }\n\n\n /**\n * GET リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async get(url: string, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'GET',\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * POST リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async post(url: string, data?: D, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'POST',\n data: data,\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * PUT リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async put(url: string, data?: D, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'PUT',\n data: data,\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * DELETE リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async delete(url: string, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'DELETE',\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * 一般的なエラーメッセージの共通処理\n * エラーメッセージを SnackBar で表示する\n * @param response API から返されたエラーレスポンス\n * @param template エラーメッセージのテンプレート(「アカウント情報を取得できませんでした。」など)\n */\n static showGenericError(response: ErrorResponse, template: string): void {\n const user_store = useUserStore();\n switch (response.error.message) {\n case 'Not authenticated': {\n user_store.logout(true);\n Message.error(`${template}\\nログインし直してください。`);\n return;\n }\n case 'Access token data is invalid': {\n user_store.logout(true);\n Message.error(`${template}\\nログインセッションが不正です。もう一度ログインし直してください。`);\n return;\n }\n case 'Access token is invalid': {\n user_store.logout(true);\n Message.error(`${template}\\nログインセッションの有効期限が切れています。もう一度ログインし直してください。`);\n return;\n }\n case 'User associated with access token does not exist': {\n user_store.logout(true);\n Message.error(`${template}\\nログインセッションに紐づくユーザーが存在しないか、削除されています。`);\n return;\n }\n default: {\n if (response.error.message) {\n if (Number.isNaN(response.status)) {\n Message.error(`${template}(${response.error.message})`);\n } else {\n Message.error(`${template}(HTTP Error ${response.status} / ${response.error.message})`);\n }\n } else {\n Message.error(`${template}(HTTP Error ${response.status})`);\n }\n return;\n }\n }\n }\n}\n\nexport default APIClient;\n","\nimport APIClient from '@/services/APIClient';\n\n\n/**\n * サーバーに保存されるクライアント設定を表すインターフェース\n * サーバー側の app.schemas.ClientSettings と\n * client/src/store/SettingsStore.ts 内の sync_settings_keys で定義されているものと同じ\n */\nexport interface IClientSettings {\n pinned_channel_ids: string[];\n // showed_panel_last_time: 同期無効\n // selected_twitter_account_id: 同期無効\n saved_twitter_hashtags: string[];\n // tv_streaming_quality: 同期無効\n // tv_data_saver_mode: 同期無効\n // tv_low_latency_mode: 同期無効\n panel_display_state: 'RestorePreviousState' | 'AlwaysDisplay' | 'AlwaysFold';\n tv_panel_active_tab: 'Program' | 'Channel' | 'Comment' | 'Twitter';\n tv_channel_selection_requires_alt_key: boolean;\n caption_font: string;\n always_border_caption_text: boolean;\n specify_caption_opacity: boolean;\n caption_opacity: number;\n tv_show_superimpose: boolean;\n // tv_show_data_broadcasting: 同期無効\n // capture_copy_to_clipboard: 同期無効\n capture_save_mode: 'Browser' | 'UploadServer' | 'Both';\n capture_caption_mode: 'VideoOnly' | 'CompositingCaption' | 'Both';\n // sync_settings: 同期無効\n comment_speed_rate: number;\n comment_font_size: number;\n close_comment_form_after_sending: boolean;\n muted_comment_keywords: IMutedCommentKeywords[];\n muted_niconico_user_ids: string[];\n mute_vulgar_comments: boolean;\n mute_abusive_discriminatory_prejudiced_comments: boolean;\n mute_big_size_comments: boolean;\n mute_fixed_comments: boolean;\n mute_colored_comments: boolean;\n mute_consecutive_same_characters_comments: boolean;\n fold_panel_after_sending_tweet: boolean;\n reset_hashtag_when_program_switches: boolean;\n auto_add_watching_channel_hashtag: boolean;\n twitter_active_tab: 'Search' | 'Timeline' | 'Capture';\n tweet_hashtag_position: 'Prepend' | 'Append' | 'PrependWithLineBreak' | 'AppendWithLineBreak';\n tweet_capture_watermark_position: 'None' | 'TopLeft' | 'TopRight' | 'BottomLeft' | 'BottomRight';\n}\n\n/**\n * ミュート対象のコメントのキーワードのインターフェイス\n */\nexport interface IMutedCommentKeywords {\n match: 'partial' | 'forward' | 'backward' | 'exact' | 'regex';\n pattern: string;\n}\n\n\nclass Settings {\n\n /**\n * クライアント設定を取得する\n * @return クライアント設定 (取得に失敗した場合は null)\n */\n static async fetchClientSettings(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/settings/client');\n\n // エラー処理 (基本起こらないはず & 実行できなくても後続の処理に影響しないため何もしない)\n if ('is_error' in response) {\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * クライアント設定を更新する\n * @param settings クライアント設定\n */\n static async updateClientSettings(settings: IClientSettings): Promise {\n\n // API リクエストを実行\n // 正常時は 204 No Content が返るし、エラーは基本起こらないはずなので何もしない\n await APIClient.put('/settings/client', settings);\n }\n}\n\nexport default Settings;\n","\nimport { defineStore } from 'pinia';\n\nimport Settings, { IClientSettings, IMutedCommentKeywords } from '@/services/Settings';\nimport Utils from '@/utils';\n\n\n// LocalStorage に保存される KonomiTV の設定データ\ninterface ILocalClientSettings {\n pinned_channel_ids: string[];\n showed_panel_last_time: boolean;\n selected_twitter_account_id: number | null;\n saved_twitter_hashtags: string[];\n tv_streaming_quality: '1080p-60fps' | '1080p' | '810p' | '720p' | '540p' | '480p' | '360p' | '240p';\n tv_data_saver_mode: boolean;\n tv_low_latency_mode: boolean;\n panel_display_state: 'RestorePreviousState' | 'AlwaysDisplay' | 'AlwaysFold';\n tv_panel_active_tab: 'Program' | 'Channel' | 'Comment' | 'Twitter';\n tv_channel_selection_requires_alt_key: boolean;\n caption_font: string;\n always_border_caption_text: boolean;\n specify_caption_opacity: boolean;\n caption_opacity: number;\n tv_show_superimpose: boolean;\n tv_show_data_broadcasting: boolean;\n capture_copy_to_clipboard: boolean;\n capture_save_mode: 'Browser' | 'UploadServer' | 'Both';\n capture_caption_mode: 'VideoOnly' | 'CompositingCaption' | 'Both';\n sync_settings: boolean;\n comment_speed_rate: number;\n comment_font_size: number;\n close_comment_form_after_sending: boolean;\n muted_comment_keywords: IMutedCommentKeywords[];\n muted_niconico_user_ids: string[];\n mute_vulgar_comments: boolean;\n mute_abusive_discriminatory_prejudiced_comments: boolean;\n mute_big_size_comments: boolean;\n mute_fixed_comments: boolean;\n mute_colored_comments: boolean;\n mute_consecutive_same_characters_comments: boolean;\n fold_panel_after_sending_tweet: boolean;\n reset_hashtag_when_program_switches: boolean;\n auto_add_watching_channel_hashtag: boolean;\n twitter_active_tab: 'Search' | 'Timeline' | 'Capture';\n tweet_hashtag_position: 'Prepend' | 'Append' | 'PrependWithLineBreak' | 'AppendWithLineBreak';\n tweet_capture_watermark_position: 'None' | 'TopLeft' | 'TopRight' | 'BottomLeft' | 'BottomRight';\n}\n\n// 設定データのうち、同期対象の設定キー\n// サーバー側の app.schemas.ClientSettings と\n// client/src/services/Settings.ts 内の IClientSettings で定義されているものと同じ\nconst sync_settings_keys = [\n 'pinned_channel_ids',\n // showed_panel_last_time: 同期無効\n // selected_twitter_account_id: 同期無効\n 'saved_twitter_hashtags',\n // tv_streaming_quality: 同期無効\n // tv_data_saver_mode: 同期無効\n // tv_low_latency_mode: 同期無効\n 'panel_display_state',\n 'tv_panel_active_tab',\n 'tv_channel_selection_requires_alt_key',\n 'caption_font',\n 'always_border_caption_text',\n 'specify_caption_opacity',\n 'caption_opacity',\n 'tv_show_superimpose',\n // tv_show_data_broadcasting: 同期無効\n // capture_copy_to_clipboard: 同期無効\n 'capture_save_mode',\n 'capture_caption_mode',\n // sync_settings: 同期無効\n 'comment_speed_rate',\n 'comment_font_size',\n 'close_comment_form_after_sending',\n 'muted_comment_keywords',\n 'muted_niconico_user_ids',\n 'mute_vulgar_comments',\n 'mute_abusive_discriminatory_prejudiced_comments',\n 'mute_big_size_comments',\n 'mute_fixed_comments',\n 'mute_colored_comments',\n 'mute_consecutive_same_characters_comments',\n 'fold_panel_after_sending_tweet',\n 'reset_hashtag_when_program_switches',\n 'auto_add_watching_channel_hashtag',\n 'twitter_active_tab',\n 'tweet_hashtag_position',\n 'tweet_capture_watermark_position',\n];\n\n// LocalStorage に保存される KonomiTV の設定データのデフォルト値\nconst default_settings: ILocalClientSettings = {\n\n // ***** 設定画面から直接変更できない設定値 *****\n\n // ピン留めしているチャンネルの ID (ex: gr011) が入るリスト\n pinned_channel_ids: [],\n // 前回視聴画面を開いた際にパネルが表示されていたかどうか (同期無効)\n showed_panel_last_time: true,\n // 現在ツイート対象として選択されている Twitter アカウントの ID (同期無効)\n selected_twitter_account_id: null,\n // 保存している Twitter のハッシュタグが入るリスト\n saved_twitter_hashtags: [],\n\n // ***** 設定 → 全般 *****\n\n // テレビのデフォルトのストリーミング画質 (Default: 1080p) (同期無効)\n tv_streaming_quality: '1080p',\n // テレビを通信節約モードで視聴する (Default: オフ) (同期無効)\n tv_data_saver_mode: false,\n // テレビを低遅延で視聴する (Default: 低遅延で視聴する) (同期無効)\n tv_low_latency_mode: true,\n // デフォルトのパネルの表示状態 (Default: 前回の状態を復元する)\n panel_display_state: 'RestorePreviousState',\n // テレビをみるときにデフォルトで表示されるパネルのタブ (Default: 番組情報タブ)\n tv_panel_active_tab: 'Program',\n // チャンネル選局のキーボードショートカットを Alt or Option + 数字キー/テンキーに変更する (Default: オフ)\n tv_channel_selection_requires_alt_key: false,\n\n // ***** 設定 → 字幕 *****\n\n // 字幕のフォント (Default: Windows TV 丸ゴシック)\n caption_font: 'Windows TV MaruGothic',\n // 字幕の文字を常に縁取って描画する (Default: 常に縁取る)\n always_border_caption_text: true,\n // 字幕の不透明度を指定する (Default: 指定しない)\n specify_caption_opacity: false,\n // 字幕の不透明度 (Default: 50%)\n caption_opacity: 0.5,\n // テレビをみるときに文字スーパーを表示する (Default: 表示する)\n tv_show_superimpose: true,\n\n // ***** 設定 → データ放送 *****\n\n // テレビをみるときにデータ放送を表示する (Default: 表示する) (同期無効)\n tv_show_data_broadcasting: true,\n\n // ***** 設定 → キャプチャ *****\n\n // キャプチャをクリップボードにコピーする (Default: 無効) (同期無効)\n capture_copy_to_clipboard: false,\n // キャプチャの保存先 (Default: KonomiTV サーバーにアップロード)\n capture_save_mode: 'UploadServer',\n // 字幕が表示されているときのキャプチャの保存モード (Default: 映像のみのキャプチャと、字幕を合成したキャプチャを両方保存する)\n capture_caption_mode: 'Both',\n\n // ***** 設定 → アカウント *****\n\n // 設定を同期する (Default: 同期しない) (同期無効)\n sync_settings: false,\n\n // ***** 設定 → ニコニコ実況 *****\n\n // コメントの速さ (Default: 1倍)\n comment_speed_rate: 1,\n // コメントのフォントサイズ (Default: 34px)\n comment_font_size: 34,\n // コメント送信後にコメント入力フォームを閉じる (Default: オン)\n close_comment_form_after_sending: true,\n\n // ***** 設定 → ニコニコ実況 (ミュート設定) *****\n\n // ミュート済みのコメントのキーワードが入るリスト\n muted_comment_keywords: [],\n // ミュート済みのニコニコユーザー ID が入るリスト\n muted_niconico_user_ids: [],\n // 露骨な表現を含むコメントをミュートする (Default: ミュートする)\n mute_vulgar_comments: true,\n // 罵倒や誹謗中傷、差別的な表現、政治的に偏った表現を含むコメントをミュートする (Default: ミュートする)\n mute_abusive_discriminatory_prejudiced_comments: true,\n // 文字サイズが大きいコメントをミュートする (Default: ミュートする)\n mute_big_size_comments: true,\n // 映像の上下に固定表示されるコメントをミュートする (Default: ミュートしない)\n mute_fixed_comments: false,\n // 色付きのコメントをミュートする (Default: ミュートしない)\n mute_colored_comments: false,\n // 8文字以上同じ文字が連続しているコメントをミュートする (Default: ミュートしない)\n mute_consecutive_same_characters_comments: false,\n\n // ***** 設定 → Twitter *****\n\n // ツイート送信後にパネルを折りたたむ (Default: オフ)\n fold_panel_after_sending_tweet: false,\n // 番組が切り替わったときにハッシュタグフォームをリセットする (Default: オン)\n reset_hashtag_when_program_switches: true,\n // 視聴中のチャンネルに対応する局タグを自動で追加する (Default: オン)\n auto_add_watching_channel_hashtag: true,\n // デフォルトで表示される Twitter タブ内のタブ (Default: キャプチャタブ)\n twitter_active_tab: 'Capture',\n // ツイートにつけるハッシュタグの位置 (Default: ツイート本文の後に追加する)\n tweet_hashtag_position: 'Append',\n // ツイートするキャプチャに番組名の透かしを描画する (Default: 透かしを描画しない)\n tweet_capture_watermark_position: 'None',\n};\n\n/**\n * LocalStorage の KonomiTV-Settings キーから設定データを取得する\n * @returns 設定データ\n */\nexport function getLocalStorageSettings(): {[key: string]: any} {\n const settings = localStorage.getItem('KonomiTV-Settings');\n if (settings !== null) {\n return JSON.parse(settings);\n } else {\n // もし LocalStorage に KonomiTV-Settings キーがまだない場合、あらかじめデフォルトの設定値を保存しておく\n setLocalStorageSettings(default_settings);\n return default_settings;\n }\n}\n\n/**\n * LocalStorage の KonomiTV-Settings キーに設定データを保存する\n * @param settings 設定データ\n */\nexport function setLocalStorageSettings(settings: {[key: string]: any}): void {\n localStorage.setItem('KonomiTV-Settings', JSON.stringify(settings));\n}\n\n/**\n * 与えられた設定データを並び替えたり足りない設定キーを補完したり不要な設定キーを削除したりと整形して返す\n * @param settings 設定データ\n */\nfunction getNormalizedSettings(settings: {[key: string]: any}): ILocalClientSettings {\n\n // (名前が変わった、廃止されたなどの理由で) 現在の default_settings に存在しない設定キーを排除した上で並び替え\n // 並び替えられていないと設定データの比較がうまくいかない\n const new_settings: {[key: string]: any} = {};\n for (const default_settings_key of Object.keys(default_settings)) {\n if (default_settings_key in settings) {\n new_settings[default_settings_key] = settings[default_settings_key];\n } else {\n // 後のバージョンで追加されたなどの理由で現状の KonomiTV-Settings に存在しない設定キーの場合\n // その設定キーのデフォルト値を取得する\n new_settings[default_settings_key] = default_settings[default_settings_key];\n }\n }\n\n // この状態の新しい設定データを返す\n return new_settings as ILocalClientSettings;\n}\n\n/**\n * 設定データを共有するストア\n */\nconst useSettingsStore = defineStore('settings', {\n state: () => {\n\n // ref: https://www.vuemastery.com/blog/refresh-proof-your-pinia-stores/\n\n // LocalStorage から設定データを取得する\n const settings = getLocalStorageSettings();\n\n // (名前が変わった、廃止されたなどの理由で) 現在の default_settings に存在しない設定キーを排除した上で並び替え\n const new_settings = getNormalizedSettings(settings);\n\n // この状態の新しい設定データを LocalStorage に保存する\n setLocalStorageSettings(new_settings);\n\n // 設定データを Store の state のデフォルト値として返す\n return {\n settings: new_settings as ILocalClientSettings,\n };\n },\n actions: {\n\n /**\n * エクスポートした JSON ファイルから設定データをインポートする (既存の設定はすべて上書きされる)\n * @param file エクスポートした JSON ファイル\n * @returns インポートに成功したかどうか\n */\n async importClientSettings(file: File): Promise {\n\n // JSON ファイルを読み込む\n const settings_json = await file.text();\n\n // JSON ファイルをパースする\n let settings = {};\n try {\n settings = JSON.parse(settings_json);\n } catch (error) {\n return false;\n }\n\n // (名前が変わった、廃止されたなどの理由で) 現在の default_settings に存在しない設定キーを排除した上で並び替え\n const new_settings = getNormalizedSettings(settings);\n\n // この状態の新しい設定データを LocalStorage に保存し、Store の state に反映する\n // このとき、既存の設定データはすべて上書きされる\n setLocalStorageSettings(new_settings);\n this.settings = new_settings;\n\n // 設定データをサーバーに同期する\n await this.syncClientSettingsToServer();\n\n return true;\n },\n\n /**\n * 設定データを初期状態にリセットする\n */\n async resetClientSettings(): Promise {\n\n // デフォルトの設定に現在設定の同期がオンになっているかだけ反映した設定データ\n const default_settings_modified: ILocalClientSettings = {\n ...default_settings,\n sync_settings: this.settings.sync_settings,\n };\n\n // デフォルト値の設定データを LocalStorage に保存し、Store の state に反映する\n setLocalStorageSettings(default_settings_modified);\n this.settings = default_settings_modified;\n\n // 設定データをサーバーに同期する\n await this.syncClientSettingsToServer();\n },\n\n /**\n * 設定データのうち、サーバーへの同期対象の設定キーのみで構成されたオブジェクト (IClientSettings と一致する) を返す\n * @returns サーバーへの同期対象の設定キーのみで構成されたオブジェクト\n */\n getSyncableClientSettings(): IClientSettings {\n\n // 同期対象の設定キーのみで設定データをまとめ直す\n // sync_settings には同期対象外の設定は含まれない\n const sync_settings: {[key: string]: any} = {};\n for (const sync_settings_key of sync_settings_keys) {\n if (sync_settings_key in this.settings) {\n sync_settings[sync_settings_key] = this.settings[sync_settings_key];\n } else {\n // 後から追加された設定キーなどの理由で設定キーが現状の KonomiTV-Settings に存在しない場合\n // その設定キーのデフォルト値を取得する\n sync_settings[sync_settings_key] = default_settings[sync_settings_key];\n }\n }\n\n return sync_settings as IClientSettings;\n },\n\n /**\n * ログイン時かつ同期が有効な場合、サーバーに保存されている設定データをこのクライアントに同期する\n * @param force ログイン中なら同期が有効かに関わらず実行する (デフォルト: false)\n */\n async syncClientSettingsFromServer(force: boolean = false): Promise {\n\n // ログインしていない時、同期が無効なときは実行しない\n if (Utils.getAccessToken() === null || (this.settings.sync_settings === false && force === false)) {\n return;\n }\n\n // サーバーから設定データをダウンロード\n const settings_server = await Settings.fetchClientSettings();\n if (settings_server === null) {\n return; // 取得できなくても後続の処理には影響しないので、サイレントに失敗する\n }\n\n // クライアントの設定データをサーバーからの設定データで上書き\n for (const [settings_server_key, settings_server_value] of Object.entries(settings_server)) {\n this.settings[settings_server_key] = settings_server_value;\n }\n },\n\n /**\n * ログイン時かつ同期が有効な場合、このクライアントの設定をサーバーに同期する\n * @param force ログイン中なら同期が有効かに関わらず実行する (デフォルト: false)\n */\n async syncClientSettingsToServer(force: boolean = false): Promise {\n\n // ログインしていない時、同期が無効なときは実行しない\n if (Utils.getAccessToken() === null || (this.settings.sync_settings === false && force === false)) {\n return;\n }\n\n // 同期対象の設定キーのみで設定データをまとめ直す\n const sync_settings = this.getSyncableClientSettings();\n\n // サーバーに設定データをアップロード\n await Settings.updateClientSettings(sync_settings);\n }\n }\n});\n\nexport default useSettingsStore;\n","\nimport { Buffer } from 'buffer';\n\nimport useSettingsStore from '@/store/SettingsStore';\n\n\n/**\n * コメント周りのユーティリティ\n */\nexport class CommentUtils {\n\n // 「露骨な表現を含むコメントをミュートする」のフィルタ正規表現\n private static readonly mute_vulgar_comments_pattern = new RegExp(Buffer.from('XChpXCl8XChVXCl8cHJwcnzvvZDvvZLvvZDvvZJ8U0VYfFPjgIdYfFPil69YfFPil4tYfFPil49YfO+8s++8pe+8uHzvvLPjgIfvvLh877yz4pev77y4fO+8s+KXi++8uHzvvLPil4/vvLh844Ki44OA44Or44OIfOOCouODiuOCpXzjgqLjg4rjg6t844Kk44Kr6IetfOOCpOOBj3zjgYbjgpPjgZN844Km44Oz44KzfOOBhuOCk+OBoXzjgqbjg7Pjg4F844Ko44Kt44ObfOOBiOOBoeOBiOOBoXzjgYjjgaPjgaF844Ko44OD44OBfOOBiOOBo+OCjXzjgqjjg4Pjg61844GI44KNfOOCqOODrXzlt6Xlj6N844GK44GV44KP44KK44G+44KTfOOBiuOBl+OBo+OBk3zjgqrjgrfjg4PjgrN844Kq44OD44K144OzfOOBiuOBo+OBseOBhHzjgqrjg4Pjg5HjgqR844Kq44OK44OL44O8fOOBiuOBquOBu3zjgqrjg4rjg5t844GK44Gx44GEfOOCquODkeOCpHzjgYpwfOOBiu+9kHzjgqrjg5Xjg5HjgrN844Ks44Kk44K444OzfOOCreODs+OCv+ODnnzjgY/jgbHjgYJ844GP44Gx44GBfOOCr+ODquODiOODquOCuXzjgq/jg7Pjg4t844GU44GP44GU44GP44GU44GP44GU44GPfOOCs+ODs+ODieODvOODoHzjgZHjgaTjgYLjgap844Kx44OE44Ki44OKfOOCtuODvOODoeODs3zjgrfjgrN844GX44GT44GX44GTfOOCt+OCs+OCt+OCs3zjgZnjgZHjgZnjgZF844Gb44GE44GI44GNfOOBm+OBhOOCinzjgZvjg7zjgop844GZ44GF44GF44GF44GF44GFfOOBmeOBhuOBhuOBhuOBhuOBhnzjgrvjgq/jg63jgrl844K744OD44Kv44K5fOOCu+ODleODrHzjgaHjgaPjgbHjgYR844Gh44Gj44OR44KkfOODgeODg+ODkeOCpHzjgaHjgpPjgZN844Gh44CH44GTfOOBoeKXr+OBk3zjgaHil4vjgZN844Gh4peP44GTfOODgeODs+OCs3zjg4HjgIfjgrN844OB4pev44KzfOODgeKXi+OCs3zjg4Hil4/jgrN844Gh44KT44G9fOOBoeOAh+OBvXzjgaHil6/jgb1844Gh4peL44G9fOOBoeKXj+OBvXzjg4Hjg7Pjg51844OB44CH44OdfOODgeKXr+ODnXzjg4Hil4vjg51844OB4peP44OdfOOBoeOCk+OBoeOCk3zjg4Hjg7Pjg4Hjg7N844Gm44GD44KT44Gm44GD44KTfOODhuOCo+ODs+ODhuOCo+ODs3zjg4bjgqPjg7Pjg51844OH44Kr44GEfOODh+ODquODmOODq3zjgarjgYvjgaDjgZd844Gq44GL44CH44GXfOOBquOBi+KXr+OBl3zjgarjgYvil4vjgZd844Gq44GL4peP44GXfOiEseOBknzjg4zjgYR844OM44GLfOODjOOCq3zjg4zjgY1844OM44KtfOODjOOBj3zjg4zjgq9844OM44GRfOODjOOCsXzjg4zjgZN844OM44KzfOOBseOBhOOCguOBv3zjg5Hjg5HmtLt844G144GG44O7fOOBteOBhuKApnzjgbXjgYV8776M772pfOOBteOBj+OCieOBv3zjgbXjgY/jgonjgpPjgad844G644Gj44GffOOBuuOCjeOBuuOCjXzjg5rjg63jg5rjg618776N776f776b776N776f776bfOODleOCp+ODqXzjgbvjgYbjgZHjgYR844G844Gj44GNfOODneODq+ODjnzjgbzjgo3jgpN844Oc44Ot44OzfO++ju++nu++m+++nXzjgb3jgo3jgop844Od44Ot44OqfO++ju++n+++m+++mHzjg57jg7PjgY3jgaR844Oe44Oz44Kt44OEfOOBvuOCk+OBk3zjgb7jgIfjgZN844G+4pev44GTfOOBvuKXi+OBk3zjgb7il4/jgZN844Oe44Oz44KzfOODnuOAh+OCs3zjg57il6/jgrN844Oe4peL44KzfOODnuKXj+OCs3zjgb7jgpPjgZXjgpN844KC44Gj44GT44KKfOODouODg+OCs+ODqnzjgoLjgb/jgoLjgb9844Oi44Of44Oi44OffOODpOOBo+OBn3zjg6TjgaPjgaZ844Ok44KJfOOChOOCieOBm+OCjXzjg6Tjgop844Ok44KLfOODpOOCjHzjg6Tjgo1844Op44OW44ObfOODr+ODrOODoXzmhJvmtrJ85ZaYfOmZsOaguHzpmbDojI586Zmw5ZSHfOa3q+WkonzpmqDmr5t86Zmw5q+bfOeUo+OCgeOCi3zlpbPjga7lrZDjga7ml6V85rGa44Gj44GV44KTfOWnpnzpqI7kuZfkvY185beo5qC5fOW3qOODgeODs3zlt6jnj4186YeR546JfOaciOe1jHzlvozog4zkvY185a2Q56iufOWtkOS9nOOCinzlsITnsr585L+h6ICFfOeyvua2snzpgI/jgZF85oCn5LqkfOeyvuWtkHzmraPluLjkvY185oCn5b60fOaAp+eahHznlJ/nkIZ85a+45q2i44KBfOe0oOadkHzmirHjgYR85oqx44GLfOaKseOBjXzmirHjgY985oqx44GRfOaKseOBk3zkvZPmtrJ85Lmz6aaWfOaBpeWeonznj43mo5J85Lit44Gg44GXfOS4reWHuuOBl3zlsL985oqc44GEfOaKnOOBkeOBquOBhHzmipzjgZHjgot85oqc44GR44KMfOeKr+ePjXzohqjjgol85YyF6IyOfOWLg+i1t3zmkannvoV86a2U576FfOaPieOBvnzmj4njgb985o+J44KAfOaPieOCgXzmvKvmuZZ844CH772efOKXr++9nnzil4vvvZ584peP772efOOAh+ODg+OCr+OCuXzil6/jg4Pjgq/jgrl84peL44OD44Kv44K5fOKXj+ODg+OCr+OCuQ==', 'base64').toString());\n\n // 「罵倒や差別的な表現を含むコメントをミュートする」のフィルタ正規表現\n private static readonly mute_abusive_discriminatory_prejudiced_comments_pattern = new RegExp(Buffer.from('44CCfOOCouODi+ODl+ODrOOBj+OCk3zjgqLjg4vjg5fjg6zlkJt844Ki44K544OafOOCpOOCq+OCjHzjgYTjgb7jgYTjgaF844Kk44Oe44Kk44OBfOOCpOODqeOBpOOBj3zjgqbjgrh844Km44O844OofOOCpuODqHzjgqbjg6jjgq9844Km44OyfOOBjeOCguOBhHzjgq3jg6LjgqR844Kt44Oi44GEfOOCrS/jg6Av44OBfOOCrOOCpOOCuHzvvbbvvp7vvbLvvbzvvp5844Ks44KtfOOCq+OCuXzjgq3jg4Pjgrp844GN44Gh44GM44GEfOOCreODgeOCrOOCpHzjgq3jg6Djg4F844K344OKfOOCueODhuODnnzjgaTjgb7jgonjgap844Gk44G+44KJ44KTfOODgeODp+ODg+ODkeODqnzjg4Hjg6fjg7N85Y2D44On44OzfOOBpOOCk+OBvHzjg4Tjg7Pjg5x844ON44OI44Km44OofOOBq+OBoOOBguOBgnzjg4vjg4B85LqM44OAfO++hu++gO++nnzjg5Hjg7zjg6h844OR44OofOODkeODqOOCr3zjgbbjgaPjgZV844OW44OD44K1fOOBtuOBleOBhHzjg5bjgrXjgqR844G+44Gs44GRfOODoeOCr+ODqXzjg5Djgqt844Og44Kr44Gk44GPfOiNkuOCieOBl3zpurvnlJ/jgrvjg6Hjg7Pjg4h85oWw5a6J5ammfOWus+WFkHzlpJblrZd85aem5Zu9fOmfk+WbvXzpn5PkuK186Z+T5pelfOWfuuWcsOWklnzmsJfni4LjgYR85rCX6YGV44GEfOWIh+OBo+OBn3zliIfjgaPjgaZ85rCX5oyB44Gh5oKqfOWbveS6pOaWree1tnzmrrp86aCDfOmgg+OBl3zpoIPjgZl86aCD44GbfOWcqOaXpXzlj4LmlL/mqKl85q2744GtfOawj+OBrXzvvoDvvot85q255YyVfOatueODknzlpLHpgJ986Zqc5a6zfOaWreS6pHzkuK3pn5N85pyd6a6ufOW+tOeUqOW3pXzlo7p85aO3fOWjvHzml6Xpn5N85pel5bidfOeymOedgHzlj43ml6V86aas6bm/fOeZuueLgnznmbrpgZR85py0fOWjsuWbvXzkuI3lv6t85L215ZCIfOmWk+aKnOOBkXzmloflj6V86Z2W5Zu9', 'base64').toString());\n\n // 「8文字以上同じ文字が連続しているコメントをミュートする」のフィルタ正規表現\n private static readonly mute_consecutive_same_characters_comments_pattern = /(.)\\1{7,}/;\n\n // ニコ生の特殊コマンド付きコメントのフィルタ正規表現\n private static readonly special_command_comments_pattern = /\\/[a-z]+ /;\n\n // 迷惑な統計コメントのフィルタ正規表現\n private static readonly annoying_statistical_comments_pattern = /最高\\d+米\\/|計\\d+ID|総\\d+米/;\n\n // ニコニコの色指定を 16 進数カラーコードに置換するテーブル\n private static readonly color_table: {[key: string]: string} = {\n 'white': '#FFEAEA',\n 'red': '#F02840',\n 'pink': '#FD7E80',\n 'orange': '#FDA708',\n 'yellow': '#FFE133',\n 'green': '#64DD17',\n 'cyan': '#00D4F5',\n 'blue': '#4763FF',\n 'purple': '#D500F9',\n 'black': '#1E1310',\n 'white2': '#CCCC99',\n 'niconicowhite': '#CCCC99',\n 'red2': '#CC0033',\n 'truered': '#CC0033',\n 'pink2': '#FF33CC',\n 'orange2': '#FF6600',\n 'passionorange': '#FF6600',\n 'yellow2': '#999900',\n 'madyellow': '#999900',\n 'green2': '#00CC66',\n 'elementalgreen': '#00CC66',\n 'cyan2': '#00CCCC',\n 'blue2': '#3399FF',\n 'marineblue': '#3399FF',\n 'purple2': '#6633CC',\n 'nobleviolet': '#6633CC',\n 'black2': '#666666',\n };\n\n\n /**\n * ニコニコの色指定を 16 進数カラーコードに置換する\n * @param color ニコニコの色指定\n * @return 16 進数カラーコード\n */\n public static getCommentColor(color: string): string | null {\n return this.color_table[color] || null;\n }\n\n\n /**\n * ニコニコの位置指定を DPlayer の位置指定に置換する\n * @param position ニコニコの位置指定\n * @return DPlayer の位置指定\n */\n public static getCommentPosition(position: string): 'top' | 'right' | 'bottom' | null {\n switch (position) {\n case 'ue':\n return 'top';\n case 'naka':\n return 'right';\n case 'shita':\n return 'bottom';\n default:\n return null;\n }\n }\n\n\n /**\n * ニコニコのサイズ指定を DPlayer のサイズ指定に置換する\n * @param size ニコニコのサイズ指定\n * @returns DPlayer のサイズ指定\n */\n public static getCommentSize(size: string): 'big' | 'medium' | 'small' | null {\n switch (size) {\n case 'big':\n case 'medium':\n case 'small':\n return size;\n default:\n return null;\n }\n }\n\n\n /**\n * ニコニコのコメントコマンドを解析する\n * @param comment_mail ニコニコのコメントコマンド\n * @returns コメントの色、位置、サイズ\n */\n public static parseCommentCommand(comment_mail: string): {\n color: string;\n position: 'top' | 'right' | 'bottom';\n size: 'big' | 'medium' | 'small';\n } {\n let color = '#FFEAEA';\n let position: 'top' | 'right' | 'bottom' = 'right';\n let size: 'big' | 'medium' | 'small' = 'medium';\n\n if (comment_mail !== undefined && comment_mail !== null) {\n const commands = comment_mail.replace('184', '').split(' ');\n\n for (const command of commands) {\n const parsed_color = CommentUtils.getCommentColor(command);\n const parsed_position = CommentUtils.getCommentPosition(command);\n const parsed_size = CommentUtils.getCommentSize(command);\n if (parsed_color !== null) {\n color = parsed_color;\n }\n if (parsed_position !== null) {\n position = parsed_position;\n }\n if (parsed_size !== null) {\n size = parsed_size;\n }\n }\n }\n\n return {color, position, size};\n }\n\n\n /**\n * ミュート対象のコメントかどうかを判断する\n * @param comment コメント\n * @param user_id コメントを投稿したユーザーの ID\n * @param color コメントの色\n * @param position コメントの位置\n * @param size コメントのサイズ\n * @return ミュート対象のコメントなら true を返す\n */\n public static isMutedComment(\n comment: string,\n user_id: string,\n color?: string,\n position?: 'top' | 'right' | 'bottom',\n size?: 'big' | 'medium' | 'small',\n ): boolean {\n\n const settings_store = useSettingsStore();\n\n // ユーザー ID ミュート処理\n if (settings_store.settings.muted_niconico_user_ids.includes(user_id)) {\n return true;\n }\n\n // ニコ生の特殊コマンド付きコメント (/nicoad, /emotion など) を一括で弾く\n if (CommentUtils.special_command_comments_pattern.test(comment)) {\n return true;\n }\n\n // 「映像の上下に固定表示されるコメントをミュートする」がオンの場合\n // コメントの位置が top (上固定) もしくは bottom (下固定) のときは弾く\n if (settings_store.settings.mute_fixed_comments === true && (position === 'top' || position === 'bottom')) {\n console.log('[CommentUtils] Muted comment (fixed_comments): ' + comment);\n return true;\n }\n\n // 「色付きのコメントをミュートする」がオンの場合\n // コメントの色が #FFEAEA (デフォルト) 以外のときは弾く\n if (settings_store.settings.mute_colored_comments === true && color !== '#FFEAEA') {\n console.log('[CommentUtils] Muted comment (colored_comments): ' + comment);\n return true;\n }\n\n // 「文字サイズが大きいコメントをミュートする」がオンの場合\n // コメントのサイズが big のときは弾く\n if (settings_store.settings.mute_big_size_comments === true && size === 'big') {\n console.log('[CommentUtils] Muted comment (big_size_comments): ' + comment);\n return true;\n }\n\n // 「露骨な表現を含むコメントをミュートする」がオンの場合\n if ((settings_store.settings.mute_vulgar_comments === true) &&\n (CommentUtils.mute_vulgar_comments_pattern.test(comment))) {\n console.log('[CommentUtils] Muted comment (vulgar_comments): ' + comment);\n return true;\n }\n\n // 「罵倒や差別的な表現を含むコメントをミュートする」がオンの場合\n if ((settings_store.settings.mute_abusive_discriminatory_prejudiced_comments === true) &&\n (CommentUtils.mute_abusive_discriminatory_prejudiced_comments_pattern.test(comment))) {\n console.log('[CommentUtils] Muted comment (abusive_discriminatory_prejudiced_comments): ' + comment);\n return true;\n }\n\n // 「8文字以上同じ文字が連続しているコメントをミュートする」がオンの場合\n if ((settings_store.settings.mute_consecutive_same_characters_comments === true &&\n (CommentUtils.mute_consecutive_same_characters_comments_pattern.test(comment)))) {\n console.log('[CommentUtils] Muted comment (consecutive_same_characters_comments): ' + comment);\n return true;\n }\n\n // キーワードミュート処理\n for (const muted_comment_keyword of settings_store.settings.muted_comment_keywords) {\n if (muted_comment_keyword.pattern === '') continue; // キーワードが空文字のときは無視\n switch (muted_comment_keyword.match) {\n // 部分一致\n case 'partial':\n if (comment.includes(muted_comment_keyword.pattern)) {\n console.log('[CommentUtils] Muted comment (partial): ' + comment);\n return true;\n }\n break;\n // 前方一致\n case 'forward':\n if (comment.startsWith(muted_comment_keyword.pattern)) {\n console.log('[CommentUtils] Muted comment (forward): ' + comment);\n return true;\n }\n break;\n // 後方一致\n case 'backward':\n if (comment.endsWith(muted_comment_keyword.pattern)) {\n console.log('[CommentUtils] Muted comment (backward): ' + comment);\n return true;\n }\n break;\n // 完全一致\n case 'exact':\n if (comment === muted_comment_keyword.pattern) {\n console.log('[CommentUtils] Muted comment (exact): ' + comment);\n return true;\n }\n break;\n // 正規表現\n case 'regex':\n if (new RegExp(muted_comment_keyword.pattern).test(comment)) {\n console.log('[CommentUtils] Muted comment (regex): ' + comment);\n return true;\n }\n break;\n }\n }\n\n // 「NHK→計1447ID/内プレ425ID/総33372米 ◆ Eテレ → 計73ID/内プレ19ID/総941米」のような\n // 迷惑コメントを一括で弾く (あえてミュートしたくないユースケースが思い浮かばないのでデフォルトで弾く)\n // 一番最後なのは、この迷惑コメント自体の頻度が低いため\n if (CommentUtils.annoying_statistical_comments_pattern.test(comment)) {\n return true;\n }\n\n // いずれのミュート処理にも引っかからなかった (ミュート対象ではない)\n return false;\n }\n\n\n /**\n * ミュート済みキーワードリストに追加する (完全一致)\n * @param comment コメント文字列\n */\n public static addMutedKeywords(comment: string): void {\n\n // すでにまったく同じミュート済みキーワードが追加済みの場合は何もしない\n const settings_store = useSettingsStore();\n for (const muted_comment_keyword of settings_store.settings.muted_comment_keywords) {\n if (muted_comment_keyword.match === 'exact' && muted_comment_keyword.pattern === comment) {\n return;\n }\n }\n\n // ミュート済みキーワードリストに追加\n settings_store.settings.muted_comment_keywords.push({\n match: 'exact',\n pattern: comment,\n });\n }\n\n\n /**\n * ミュート済みニコニコユーザー ID リストに追加する\n * @param user_id ニコニコユーザー ID\n */\n public static addMutedNiconicoUserIDs(user_id: string): void {\n\n // すでに追加済みの場合は何もしない\n const settings_store = useSettingsStore();\n if (settings_store.settings.muted_niconico_user_ids.includes(user_id)) {\n return;\n }\n\n // ミュート済みニコニコユーザー ID リストに追加\n settings_store.settings.muted_niconico_user_ids.push(user_id);\n }\n}\n","\nimport DPlayer from 'dplayer';\n\n/**\n * API 上設定できる動画の画質\n */\ntype APIVideoQuality = (\n '1080p-60fps' |\n '1080p-60fps-hevc' |\n '1080p' |\n '1080p-hevc' |\n '810p' |\n '810p-hevc' |\n '720p' |\n '720p-hevc' |\n '540p' |\n '540p-hevc' |\n '480p' |\n '480p-hevc' |\n '360p' |\n '360p-hevc' |\n '240p' |\n '240p-hevc'\n);\n\n\n\n/**\n * プレイヤー周りのユーティリティ\n */\nexport class PlayerUtils {\n\n /**\n * プレイヤーの背景画像をランダムで取得し、その URL を返す\n * @returns ランダムで設定されたプレイヤーの背景画像の URL\n */\n public static generatePlayerBackgroundURL(): string {\n const background_count = 50; // 50種類から選択\n const random = (Math.floor(Math.random() * background_count) + 1);\n return `/assets/images/player-backgrounds/${random.toString().padStart(2, '0')}.jpg`;\n }\n\n\n /**\n * 現在のブラウザで H.265 / HEVC 映像が再生できるかどうかを取得する\n * ref: https://github.com/StaZhu/enable-chromium-hevc-hardware-decoding#mediacapabilities\n * @returns 再生できるなら true、できないなら false\n */\n public static isHEVCVideoSupported(): boolean {\n // hvc1.1.6.L123.B0 の部分は呪文 (HEVC であることと、そのプロファイルを示す値らしい)\n return document.createElement('video').canPlayType('video/mp4; codecs=\"hvc1.1.6.L123.B0\"') === 'probably';\n }\n\n\n /**\n * DPlayer のインスタンスから API で設定できる画質を取得する\n * @param player DPlayer のインスタンス\n * @returns API で設定できる画質 (取得できなかった場合は null)\n */\n public static extractAPIQualityFromDPlayer(player: DPlayer): APIVideoQuality | null {\n if (player.quality === null) {\n return null;\n }\n const regex = /streams\\/live\\/[a-z0-9]*\\/(.*)\\/(mpegts|ll-hls)/;\n const match = player.quality.url.match(regex);\n return match ? (match[1] as APIVideoQuality) : null;\n }\n}\n","\nimport dayjs from 'dayjs';\nimport 'dayjs/locale/ja';\nimport isBetween from 'dayjs/plugin/isBetween';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\n\nimport { IProgram } from '@/services/Programs';\nimport Utils from '@/utils';\n\ndayjs.extend(isBetween);\ndayjs.extend(isSameOrAfter);\ndayjs.extend(isSameOrBefore);\n\n\n/**\n * 番組情報周りのユーティリティ\n */\nexport class ProgramUtils {\n\n private static format_string_translation_map: {[key: string]: string} | null = null;\n\n\n /**\n * ミリ秒単位の Unix タイムスタンプを ISO 8601 形式の文字列に変換する\n * @param timestamp ミリ秒単位の Unix タイムスタンプ\n * @returns ISO 8601 形式の文字列\n */\n public static convertTimestampToISO8601(timestamp: number): string {\n dayjs.locale('ja');\n const date = dayjs(timestamp).toISOString();\n return date;\n }\n\n\n /**\n * 番組情報中の[字]や[解]などの記号をいい感じに装飾する\n * @param program 番組情報のオブジェクト\n * @param key 番組情報のオブジェクトから取り出すプロパティのキー\n * @returns 装飾した文字列\n */\n public static decorateProgramInfo(program: IProgram | null, key: string): string {\n\n // program が空でないかつ、program[key] が存在する\n if (program !== null && program[key] !== null) {\n\n // 番組情報に含まれる HTML の特殊文字で表示がバグらないように、事前に HTML エスケープしておく\n const text = Utils.escapeHTML(program[key]);\n\n // 本来 ARIB 外字である記号の一覧\n // ref: https://ja.wikipedia.org/wiki/%E7%95%AA%E7%B5%84%E8%A1%A8\n // ref: https://github.com/xtne6f/EDCB/blob/work-plus-s/EpgDataCap3/EpgDataCap3/ARIB8CharDecode.cpp#L1319\n const mark = '新|終|再|交|映|手|声|多|副|字|文|CC|OP|二|S|B|SS|無|無料' +\n 'C|S1|S2|S3|MV|双|デ|D|N|W|P|H|HV|SD|天|解|料|前|後初|生|販|吹|PPV|' +\n '演|移|他|収|・|英|韓|中|字/日|字/日英|3D|2K|4K|8K|5.1|7.1|22.2|60P|120P|d|HC|HDR|SHV|UHD|VOD|配|初';\n\n // 正規表現を作成\n const pattern1 = new RegExp('\\\\((二|字|再)\\\\)', 'g'); // 通常の括弧で囲まれている記号\n const pattern2 = new RegExp(`\\\\[(${mark})\\\\]`, 'g');\n\n // 正規表現で置換した結果を返す\n return text.replace(pattern1, '$1')\n .replace(pattern2, '$1');\n\n // 番組情報がない時間帯\n } else {\n\n // 23時~翌7時 (0:00 ~ 06:59 or 23:00 ~ 23:59) の間なら放送を休止している可能性が高いので、放送休止と表示する\n const now = dayjs();\n const pause_time_start = dayjs().hour(0).minute(0).second(0);\n const pause_time_end = dayjs().hour(6).minute(59).second(59);\n const pause_time_start_23 = dayjs().hour(23).minute(0).second(0);\n const pause_time_end_23 = dayjs().hour(23).minute(59).second(59);\n if ((now.isSameOrAfter(pause_time_start) && now.isSameOrBefore(pause_time_end)) ||\n (now.isSameOrAfter(pause_time_start_23) && now.isSameOrBefore(pause_time_end_23))) {\n if (key === 'title') {\n return '放送休止'; // タイトル\n } else {\n return 'この時間は放送を休止しています。'; // 番組概要\n }\n\n // それ以外の時間帯では、「番組情報がありません」と表示する\n // 急な番組変更の影響で、一時的にその時間帯に対応する番組情報が消えることがある\n // 特に Mirakurun バックエンドでは高頻度で収集した EIT[p/f] が比較的すぐ反映されるため、この現象が起こりやすい\n // 日中に放送休止(停波)になることはまずあり得ないので、番組情報が取得できてないだけで視聴できるかも?というニュアンスを与える\n } else {\n if (key === 'title') {\n return '番組情報がありません'; // タイトル\n } else {\n return 'この時間の番組情報を取得できませんでした。'; // 番組概要\n }\n }\n }\n }\n\n\n /**\n * 番組の進捗状況を取得する\n * @param program 番組情報\n * @returns 番組の進捗状況(%単位)\n */\n public static getProgramProgress(program: IProgram | null): number {\n\n // program が空でない\n if (program !== null) {\n\n // 番組開始時刻から何秒進んだか\n const progress = dayjs(dayjs()).diff(program.start_time, 'second');\n\n // %単位の割合を算出して返す\n return progress / program.duration * 100;\n\n // 放送休止中\n } else {\n return 0;\n }\n }\n\n\n /**\n * 番組の放送時刻を取得する\n * @param program 番組情報\n * @param is_short 時刻のみ返すかどうか\n * @returns 番組の放送時刻\n */\n public static getProgramTime(program: IProgram | null, is_short: boolean = false): string {\n\n // program が空でなく、かつ番組時刻が初期値でない\n if (program !== null && program.start_time !== '2000-01-01T00:00:00+09:00') {\n\n dayjs.locale('ja'); // ロケールを日本に設定\n const start_time = dayjs(program.start_time);\n\n // duration が 0 以下の場合は、放送時間未定として扱う\n if (program.duration <= 0) {\n if (is_short === true) { // 時刻のみ\n return `${start_time.format('HH:mm')} ~ --:--`;\n } else {\n return `${start_time.format('YYYY/MM/DD (dd) HH:mm')} ~ --:-- (放送時間未定)`;\n }\n }\n\n const end_time = dayjs(program.end_time);\n const duration = program.duration / 60; // 分換算\n\n if (is_short === true) { // 時刻のみ\n return `${start_time.format('HH:mm')} ~ ${end_time.format('HH:mm')}`;\n } else {\n return `${start_time.format('YYYY/MM/DD (dd) HH:mm')} ~ ${end_time.format('HH:mm')} (${duration}分)`;\n }\n\n // 放送休止中\n } else {\n if (is_short === true) { // 時刻のみ\n return '--:-- ~ --:--';\n } else {\n return '----/--/-- (-) --:-- ~ --:-- (--分)';\n }\n }\n }\n\n\n /**\n * 文字列に含まれる英数や記号を半角に置換し、一律な表現に整える\n * server/app/metadata/TSInfoAnalyzer.py の TSInfoAnalyzer.formatString() と同等の処理を行う\n * @param string 変換する文字列\n * @returns 置換した文字列\n */\n public static formatString(string: string): string {\n\n // 変換マップを構築\n if (ProgramUtils.format_string_translation_map === null) {\n ProgramUtils.format_string_translation_map = ProgramUtils.getFormatStringTranslationTable();\n }\n\n // 変換\n for (const key in ProgramUtils.format_string_translation_map) {\n string = string.replaceAll(key, ProgramUtils.format_string_translation_map[key]);\n }\n\n // 置換した文字列を返す\n return string;\n }\n\n\n /**\n * formatString() で使用する変換テーブルを取得する\n * server/app/metadata/TSInfoAnalyzer.py の TSInfoAnalyzer.__getFormatStringTranslationTable() と同等の処理を行う\n * @returns 変換テーブル\n */\n private static getFormatStringTranslationTable(): {[key: string]: string} {\n\n // 全角英数を半角英数に置換\n const zenkaku_table = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n const hankaku_table = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n const merged_table: { [key: string]: string } = {};\n for (let i = 0; i < zenkaku_table.length; i++) {\n merged_table[zenkaku_table[i]] = hankaku_table[i];\n }\n\n // 全角記号を半角記号に置換\n const symbol_zenkaku_table = '"#$%&'()+,-./:;<=>[\]^_`{|} ';\n const symbol_hankaku_table = '\"#$%&\\'()+,-./:;<=>[\\\\]^_`{|} ';\n for (let i = 0; i < symbol_zenkaku_table.length; i++) {\n merged_table[symbol_zenkaku_table[i]] = symbol_hankaku_table[i];\n }\n // 一部の半角記号を全角に置換\n // 主に見栄え的な問題(全角の方が字面が良い)\n merged_table['!'] = '!';\n merged_table['?'] = '?';\n merged_table['*'] = '*';\n merged_table['~'] = '~';\n merged_table['@'] = '@';\n // シャープ → ハッシュ\n merged_table['♯'] = '#';\n // 波ダッシュ → 全角チルダ\n // EDCB は ~ を全角チルダとして扱っているため、KonomiTV でもそのように統一する\n merged_table['〜'] = '~';\n\n // 番組表で使用される囲み文字の置換テーブル\n // ref: https://note.nkmk.me/python-chr-ord-unicode-code-point/\n // ref: https://github.com/l3tnun/EPGStation/blob/v2.6.17/src/util/StrUtil.ts#L7-L46\n const enclosed_characters_table: {[key: string]: string} = {\n '\\u{1F14A}': '[HV]',\n '\\u{1F13F}': '[P]',\n '\\u{1F14C}': '[SD]',\n '\\u{1F146}': '[W]',\n '\\u{1F14B}': '[MV]',\n '\\u{1F210}': '[手]',\n '\\u{1F211}': '[字]',\n '\\u{1F212}': '[双]',\n '\\u{1F213}': '[デ]',\n '\\u{1F142}': '[S]',\n '\\u{1F214}': '[二]',\n '\\u{1F215}': '[多]',\n '\\u{1F216}': '[解]',\n '\\u{1F14D}': '[SS]',\n '\\u{1F131}': '[B]',\n '\\u{1F13D}': '[N]',\n '\\u{1F217}': '[天]',\n '\\u{1F218}': '[交]',\n '\\u{1F219}': '[映]',\n '\\u{1F21A}': '[無]',\n '\\u{1F21B}': '[料]',\n '\\u{1F21C}': '[前]',\n '\\u{1F21D}': '[後]',\n '\\u{1F21E}': '[再]',\n '\\u{1F21F}': '[新]',\n '\\u{1F220}': '[初]',\n '\\u{1F221}': '[終]',\n '\\u{1F222}': '[生]',\n '\\u{1F223}': '[販]',\n '\\u{1F224}': '[声]',\n '\\u{1F225}': '[吹]',\n '\\u{1F14E}': '[PPV]',\n '\\u{1F200}': '[ほか]',\n };\n\n // Unicode の囲み文字を大かっこで囲った文字に置換する\n // EDCB で EpgDataCap3_Unicode.dll を利用している場合や、Mirakurun 3.9.0-beta.24 以降など、\n // 番組情報取得元から Unicode の囲み文字が送られてくる場合に対応するためのもの\n // Unicode の囲み文字はサロゲートペアなどで扱いが難しい上に KonomiTV では囲み文字を CSS でハイライトしているため、Unicode にするメリットがない\n // ref: https://note.nkmk.me/python-str-replace-translate-re-sub/\n for (const key in enclosed_characters_table) {\n merged_table[key] = enclosed_characters_table[key];\n }\n\n return merged_table;\n }\n}\n","\n// 共通ユーティリティをデフォルトとしてインポート\nimport Utils from '@/utils/Utils';\nexport default Utils;\n\n// Utils フォルダ配下のユーティリティを一括でインポートできるように\nexport * from '@/utils/ChannelUtils';\nexport * from '@/utils/CommentUtils';\nexport * from '@/utils/PlayerUtils';\nexport * from '@/utils/ProgramUtils';\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('div',{staticClass:\"login-container-wrapper d-flex align-center w-100 mb-13\"},[_c('v-card',{staticClass:\"login-container px-10 pt-8 pb-11 mx-auto background lighten-1\",attrs:{\"elevation\":\"10\",\"width\":\"100%\",\"max-width\":\"450\"}},[_c('v-card-title',{staticClass:\"login__logo flex-column justify-center\"},[_c('v-img',{attrs:{\"max-width\":\"250\",\"src\":\"/assets/images/logo.svg\"}}),_c('h4',{staticClass:\"mt-10\"},[_vm._v(\"ログイン\")])],1),_c('v-divider'),_c('v-form',{ref:\"login\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('v-text-field',{staticClass:\"mt-12\",attrs:{\"outlined\":\"\",\"placeholder\":\"ユーザー名\",\"hide-details\":\"\",\"autofocus\":\"\",\"dense\":_vm.is_form_dense},model:{value:(_vm.username),callback:function ($$v) {_vm.username=$$v},expression:\"username\"}}),_c('v-text-field',{staticClass:\"mt-8\",attrs:{\"outlined\":\"\",\"placeholder\":\"パスワード\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"type\":_vm.password_showing ? 'text' : 'password',\"append-icon\":_vm.password_showing ? 'mdi-eye' : 'mdi-eye-off'},on:{\"click:append\":function($event){_vm.password_showing = !_vm.password_showing}},model:{value:(_vm.password),callback:function ($$v) {_vm.password=$$v},expression:\"password\"}}),_c('v-btn',{staticClass:\"login-button mt-5\",attrs:{\"color\":\"secondary\",\"depressed\":\"\",\"width\":\"100%\",\"height\":\"56\"},on:{\"click\":function($event){return _vm.login()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa:sign-in\"}}),_vm._v(\"ログイン \")],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('header',{staticClass:\"header\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"konomitv-logo ml-3 ml-md-6\",attrs:{\"to\":\"/tv/\"}},[_c('img',{staticClass:\"konomitv-logo__image\",attrs:{\"src\":\"/assets/images/logo.svg\",\"height\":\"21\"}})]),_c('v-spacer')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Header.vue?vue&type=template&id=84897154&scoped=true&\"\nvar script = {}\nimport style0 from \"./Header.vue?vue&type=style&index=0&id=84897154&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"84897154\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',[_c('div',{staticClass:\"navigation-container elevation-8\"},[_c('nav',{staticClass:\"navigation\"},[_c('div',{staticClass:\"navigation-scroll\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/tv/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:tv-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"テレビをみる\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/videos/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:movies-and-tv-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"ビデオをみる\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/timetable/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:calendar-ltr-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"番組表\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/reserves/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",staticStyle:{\"padding\":\"0.5px\"},attrs:{\"icon\":\"fluent:timer-16-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"録画予約\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/mylist/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"ic:round-playlist-play\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"マイリスト\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/captures/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:image-multiple-24-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"キャプチャ\")])],1),_c('v-spacer'),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/settings/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:settings-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"設定\")])],1),_c('a',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.top\",value:(_vm.versionStore.is_update_available ?\n `アップデートがあります (version ${_vm.versionStore.latest_version})` : ''),expression:\"versionStore.is_update_available ?\\n `アップデートがあります (version ${versionStore.latest_version})` : ''\",modifiers:{\"top\":true}}],staticClass:\"navigation__link\",class:{\n 'navigation__link--version': _vm.versionStore.is_client_develop_version,\n 'navigation__link--highlight': _vm.versionStore.is_update_available,\n },attrs:{\"active-class\":\"navigation__link--active\",\"href\":\"https://github.com/tsukumijima/KonomiTV\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:info-16-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"version \"+_vm._s(_vm.versionStore.client_version))])],1)],1)])]),_c('BottomNavigation')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-bottom-navigation',{staticClass:\"bottom-navigation-container elevation-12\",attrs:{\"color\":\"primary\",\"grow\":\"\"}},[_c('v-btn',{staticClass:\"bottom-navigation-button\",attrs:{\"to\":\"/tv/\"}},[_c('span',{staticClass:\"mt-1\"},[_vm._v(\"テレビをみる\")]),_c('Icon',{attrs:{\"icon\":\"fluent:tv-20-regular\",\"width\":\"30px\"}})],1),_c('v-btn',{staticClass:\"bottom-navigation-button\",attrs:{\"to\":\"/videos/\"}},[_c('span',{staticClass:\"mt-1\"},[_vm._v(\"ビデオをみる\")]),_c('Icon',{attrs:{\"icon\":\"fluent:movies-and-tv-20-regular\",\"width\":\"30px\"}})],1),_c('v-btn',{staticClass:\"bottom-navigation-button\",attrs:{\"to\":\"/settings/\"}},[_c('span',{staticClass:\"mt-1\"},[_vm._v(\"設定\")]),_c('Icon',{attrs:{\"icon\":\"fluent:settings-20-regular\",\"width\":\"30px\"}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./BottomNavigation.vue?vue&type=template&id=3df53df3&scoped=true&\"\nvar script = {}\nimport style0 from \"./BottomNavigation.vue?vue&type=style&index=0&id=3df53df3&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3df53df3\",\n null\n \n)\n\nexport default component.exports","\nimport APIClient from '@/services/APIClient';\n\n\n/** バージョン情報を表すインターフェイス */\nexport interface IVersionInformation {\n version: string;\n latest_version: string;\n environment: 'Windows' | 'Linux' | 'Linux-Docker' | 'Linux-ARM';\n backend: 'EDCB' | 'Mirakurun';\n encoder: 'FFmpeg' | 'QSVEncC' | 'NVEncC' | 'VCEEncC' | 'rkmppenc';\n}\n\n\nclass Version {\n\n /**\n * バージョン情報を取得する\n * @returns バージョン情報 or バージョン情報の取得に失敗した場合は null\n */\n static async fetchServerVersion(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/version');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'バージョン情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n}\n\nexport default Version;\n","\nimport { defineStore } from 'pinia';\n\nimport Version, { IVersionInformation } from '@/services/Version';\nimport Utils from '@/utils';\n\n\n/**\n * 現在ログイン中のユーザーアカウントの情報を共有するストア\n */\nconst useVersionStore = defineStore('version', {\n state: () => ({\n\n // サーバーのバージョン情報\n server_version_info: null as IVersionInformation | null,\n\n // 最終更新日時 (UNIX タイムスタンプ、秒単位)\n last_updated_at: 0,\n }),\n getters: {\n client_version(): string {\n return Utils.version;\n },\n server_version(): string | null {\n return this.server_version_info?.version ?? null;\n },\n latest_version(): string | null {\n return this.server_version_info?.latest_version ?? null;\n },\n is_client_develop_version(): boolean {\n return this.client_version.includes('-dev');\n },\n is_server_develop_version(): boolean {\n return this.server_version?.includes('-dev') ?? false;\n },\n is_update_available(): boolean {\n // もし現在のサーバーバージョンと最新のバージョンが異なるなら、アップデートが利用できると判断する\n // 現在のサーバーバージョンが開発版 (-dev あり) で、かつ最新のバージョンがリリース版 (-dev なし) の場合も同様に表示する\n // つまり開発版だと同じバージョンのリリース版がリリースされたときにしかアップデート通知が表示されない事になるが、ひとまずこれで…\n if (this.server_version === null || this.latest_version === null) return false;\n if ((this.is_server_develop_version === false && this.server_version !== this.latest_version) ||\n (this.is_server_develop_version === true && this.server_version.replace('-dev', '') === this.latest_version)) {\n return true;\n }\n return false;\n },\n is_version_mismatch(): boolean {\n if (this.server_version === null) return false;\n return this.client_version !== this.server_version;\n }\n },\n actions: {\n\n /**\n * バージョン情報を取得する\n * すでに取得済みの情報がある場合は API リクエストを行わずにそれを返す\n * @param force 強制的に API リクエストを行う場合は true\n * @returns バージョン情報 or バージョン情報の取得に失敗した場合は null\n */\n async fetchServerVersion(force: boolean = false): Promise {\n\n // バージョン情報がある場合はそれを返す\n // force が true の場合は無視される\n if (this.server_version_info !== null && force === false) {\n // ただし、最終更新日時が1分以上前の場合は非同期で更新する\n if (Utils.time() - this.last_updated_at > 60) {\n this.fetchServerVersion(true);\n }\n return this.server_version_info;\n }\n\n // サーバーのバージョン情報を取得する\n const version_info = await Version.fetchServerVersion();\n if (version_info === null) {\n return null;\n }\n this.server_version_info = version_info;\n this.last_updated_at = Utils.time();\n\n return this.server_version_info;\n },\n }\n});\n\nexport default useVersionStore;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport BottomNavigation from '@/components/BottomNavigation.vue';\nimport useVersionStore from '@/store/VersionStore';\n\nexport default Vue.extend({\n name: 'Navigation',\n components: {\n BottomNavigation,\n },\n computed: {\n ...mapStores(useVersionStore),\n },\n async created() {\n await this.versionStore.fetchServerVersion();\n }\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Navigation.vue?vue&type=template&id=5b40940b&scoped=true&\"\nimport script from \"./Navigation.vue?vue&type=script&lang=ts&\"\nexport * from \"./Navigation.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Navigation.vue?vue&type=style&index=0&id=5b40940b&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5b40940b\",\n null\n \n)\n\nexport default component.exports","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\n\nexport default Vue.extend({\n name: 'Login',\n components: {\n Header,\n Navigation,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n username: '' as string,\n password: '' as string,\n password_showing: false,\n };\n },\n computed: {\n // UserStore に this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // 現在ログイン中の場合はアカウントページに遷移\n if (this.userStore.is_logged_in) {\n await this.$router.replace({path: '/settings/account'});\n }\n },\n methods: {\n async login() {\n\n // ユーザー名またはパスワードが空\n if (this.username === '' || this.password === '') {\n this.$message.error('ユーザー名またはパスワードが空です。');\n return;\n }\n\n // ログイン処理 (エラーハンドリング含む) を実行\n const result = await this.userStore.login(this.username, this.password);\n if (result === false) {\n return; // ログイン失敗\n }\n\n // アカウントページに遷移\n // ブラウザバックでログインページに戻れないようにする\n await this.$router.replace({path: '/settings/account'});\n }\n }\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Login.vue?vue&type=template&id=851c3dec&scoped=true&\"\nimport script from \"./Login.vue?vue&type=script&lang=ts&\"\nexport * from \"./Login.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Login.vue?vue&type=style&index=0&id=851c3dec&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"851c3dec\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_vm._m(0)],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"d-flex justify-center align-center w-100\"},[_c('div',{staticClass:\"d-flex justify-center align-center flex-column\"},[_c('h1',[_vm._v(\"Not Found, or Under Development...\")]),_c('span',{staticClass:\"mt-4 text--text text--darken-1\"},[_vm._v(\"お探しのページは存在しないか、鋭意開発中です。\")])])])\n}]\n\nexport { render, staticRenderFns }","\n\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\n\nexport default Vue.extend({\n name: 'NotFound',\n components: {\n Header,\n Navigation,\n },\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./NotFound.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./NotFound.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./NotFound.vue?vue&type=template&id=1310cfee&scoped=true&\"\nimport script from \"./NotFound.vue?vue&type=script&lang=ts&\"\nexport * from \"./NotFound.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./NotFound.vue?vue&type=style&index=0&id=1310cfee&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1310cfee\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('div',{staticClass:\"register-container-wrapper d-flex align-center w-100 mb-13\"},[_c('v-card',{staticClass:\"register-container px-10 pt-8 pb-11 mx-auto background lighten-1\",attrs:{\"elevation\":\"10\",\"width\":\"100%\",\"max-width\":\"450\"}},[_c('v-card-title',{staticClass:\"register__logo flex-column justify-center\"},[_c('v-img',{attrs:{\"max-width\":\"250\",\"src\":\"/assets/images/logo.svg\"}}),_c('h4',{staticClass:\"mt-10\"},[_vm._v(\"アカウントを作成\")])],1),_c('v-divider'),_c('v-form',{ref:\"register\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('v-text-field',{staticClass:\"mt-12\",attrs:{\"outlined\":\"\",\"placeholder\":\"ユーザー名\",\"autofocus\":\"\",\"dense\":_vm.is_form_dense,\"rules\":[_vm.username_validation]},model:{value:(_vm.username),callback:function ($$v) {_vm.username=$$v},expression:\"username\"}}),_c('v-text-field',{staticStyle:{\"margin-top\":\"2px\"},attrs:{\"outlined\":\"\",\"placeholder\":\"パスワード\",\"dense\":_vm.is_form_dense,\"type\":_vm.password_showing ? 'text' : 'password',\"append-icon\":_vm.password_showing ? 'mdi-eye' : 'mdi-eye-off',\"rules\":[_vm.password_validation]},on:{\"click:append\":function($event){_vm.password_showing = !_vm.password_showing}},model:{value:(_vm.password),callback:function ($$v) {_vm.password=$$v},expression:\"password\"}}),_c('v-btn',{staticClass:\"register-button mt-5\",attrs:{\"color\":\"secondary\",\"depressed\":\"\",\"width\":\"100%\",\"height\":\"56\"},on:{\"click\":function($event){return _vm.register()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:person-add-20-filled\",\"height\":\"24\"}}),_vm._v(\"アカウントを作成 \")],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\n\nexport default Vue.extend({\n name: 'Register',\n components: {\n Header,\n Navigation,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n username: null as string | null,\n username_validation: (value: string | null) => {\n if (value === '' || value === null) return 'ユーザー名を入力してください。';\n if (/^.{2,}$/.test(value) === false) return 'ユーザー名は2文字以上で入力してください。';\n return true;\n },\n password: null as string | null,\n password_showing: true, // アカウント作成時はデフォルトでパスワードを表示する\n password_validation: (value: string | null) => {\n if (value === '' || value === null) return 'パスワードを入力してください。';\n // 正規表現の参考: https://qiita.com/grrrr/items/0b35b5c1c98eebfa5128\n if (/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(value) === false) return 'パスワードは4文字以上の半角英数記号を入力してください。';\n return true;\n },\n };\n },\n computed: {\n // UserStore に this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // 現在ログイン中の場合はアカウントページに遷移\n if (this.userStore.is_logged_in) {\n await this.$router.replace({path: '/settings/account'});\n }\n },\n methods: {\n async register() {\n\n // すべてのバリデーションが通過したときのみ\n // ref: https://qiita.com/Hijiri_Ishi/items/56cac99c8f3806a6fa24\n if ((this.$refs.register as any).validate() === false) return;\n if (this.username === null || this.password === null) return;\n\n // アカウント作成 & ログイン処理 (エラーハンドリング含む) を実行\n const result = await this.userStore.register(this.username, this.password);\n if (result === false) {\n return; // ログイン失敗\n }\n\n // アカウントページに遷移\n // ブラウザバックでアカウント作成画面に戻れないようにする\n await this.$router.replace({path: '/settings/account'});\n }\n }\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Register.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Register.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Register.vue?vue&type=template&id=6533f3d0&scoped=true&\"\nimport script from \"./Register.vue?vue&type=script&lang=ts&\"\nexport * from \"./Register.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Register.vue?vue&type=style&index=0&id=6533f3d0&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6533f3d0\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:person-20-filled\",\"width\":\"25px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"アカウント\")])],1),_c('div',{staticClass:\"settings__content\",class:{'settings__content--loading': _vm.is_loading}},[(_vm.userStore.user === null)?_c('div',{staticClass:\"account\"},[_c('div',{staticClass:\"account-wrapper\"},[_c('img',{staticClass:\"account__icon\",attrs:{\"src\":\"/assets/images/account-icon-default.png\"}}),_c('div',{staticClass:\"account__info\"},[_c('div',{staticClass:\"account__info-name\"},[_c('span',{staticClass:\"account__info-name-text\"},[_vm._v(\"ログインしていません\")])]),_c('span',{staticClass:\"account__info-id\"},[_vm._v(\"Not logged in\")])])]),_c('v-btn',{staticClass:\"account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"140\",\"height\":\"56\",\"depressed\":\"\",\"to\":\"/login/\"}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa:sign-in\"}}),_vm._v(\"ログイン \")],1)],1):_vm._e(),(_vm.userStore.user !== null)?_c('div',{staticClass:\"account\"},[_c('div',{staticClass:\"account-wrapper\"},[_c('img',{staticClass:\"account__icon\",attrs:{\"src\":_vm.userStore.user_icon_url ?? ''}}),_c('div',{staticClass:\"account__info\"},[_c('div',{staticClass:\"account__info-name\"},[_c('span',{staticClass:\"account__info-name-text\"},[_vm._v(_vm._s(_vm.userStore.user.name))]),(_vm.userStore.user.is_admin)?_c('span',{staticClass:\"account__info-admin\"},[_vm._v(\"管理者\")]):_vm._e()]),_c('span',{staticClass:\"account__info-id\"},[_vm._v(\"User ID: \"+_vm._s(_vm.userStore.user.id))])])]),_c('v-btn',{staticClass:\"account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"140\",\"height\":\"56\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.userStore.logout()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa:sign-out\"}}),_vm._v(\"ログアウト \")],1)],1):_vm._e(),(_vm.userStore.is_logged_in === false)?_c('div',{staticClass:\"account-register\"},[_c('div',{staticClass:\"account-register__heading\"},[_vm._v(\" KonomiTV アカウントにログインすると、\"),_c('br'),_vm._v(\"より便利な機能が使えます! \")]),_c('div',{staticClass:\"account-register__feature\"},[_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"bi:chat-left-text-fill\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"ニコニコ実況にコメントする\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"テレビを見ながらニコニコ実況にコメントできます。別途、ニコニコアカウントとの連携が必要です。\")])])],1),_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"fa-brands:twitter\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"Twitter 連携機能\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"テレビを見ながら Twitter にツイートしたり、検索したツイートをリアルタイムで表示できます。別途、Twitter アカウントとの連携が必要です。\")])])],1),_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"fluent:arrow-sync-20-filled\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"設定をデバイス間で同期\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"ピン留めしたチャンネルなど、ブラウザに保存されている各種設定をブラウザやデバイスをまたいで同期できます。\")])])],1),_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"fa-solid:sliders-h\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"サーバー設定をブラウザから変更\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"管理者権限があれば、サーバー設定をブラウザから変更できます。一番最初に作成されたアカウントには、自動で管理者権限が付与されます。\")])])],1)]),_c('div',{staticClass:\"account-register__description\"},[_vm._v(\" KonomiTV アカウントの作成に必要なものは\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\"ユーザー名とパスワードだけです。\"),_c('br'),_vm._v(\" アカウントはローカルに導入した\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\" KonomiTV サーバーにのみ保存されます。\"),_c('br'),_vm._v(\" 外部のサービスには保存されませんので、ご安心ください。\"),_c('br')]),_c('v-btn',{staticClass:\"account-register__button\",attrs:{\"color\":\"secondary\",\"width\":\"100%\",\"max-width\":\"250\",\"height\":\"50\",\"depressed\":\"\",\"to\":\"/register/\"}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:person-add-20-filled\",\"height\":\"24\"}}),_vm._v(\"アカウントを作成 \")],1)],1):_vm._e(),(_vm.userStore.is_logged_in === true)?_c('div',[_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"sync_settings\"}},[_vm._v(\"設定をデバイス間で同期する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"sync_settings\"}},[_vm._v(\" KonomiTV では、設定を同じアカウントでログインしているデバイス間で同期できます!\"),_c('br'),_vm._v(\" 同期をオンにすると、同期をオンにしているすべてのデバイスで共通の設定が使えます。ピン留めチャンネルやハッシュタグリストなども同期されます。\"),_c('br'),_vm._v(\" なお、デバイス固有の設定(画質設定など)は、同期後も各デバイスで個別に反映されます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"sync_settings\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.sync_settings),callback:function ($$v) {_vm.sync_settings=$$v},expression:\"sync_settings\"}})],1),_c('v-dialog',{attrs:{\"max-width\":\"530\"},model:{value:(_vm.sync_settings_dialog),callback:function ($$v) {_vm.sync_settings_dialog=$$v},expression:\"sync_settings_dialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"justify-center\"},[_vm._v(\"設定データの競合\")]),_c('v-card-text',[_vm._v(\" このデバイスの設定と、サーバーに保存されている設定が競合しています。\"),_c('br'),_vm._v(\" 一度上書きすると、元に戻すことはできません。慎重に選択してください。\"),_c('br')]),_c('div',{staticClass:\"d-flex flex-column px-4 pb-4 settings__conflict-dialog\"},[_c('v-btn',{staticClass:\"settings__save-button error--text text--lighten-1\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.overrideServerSettingsFromClient()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:document-arrow-up-16-filled\",\"height\":\"22px\"}}),_vm._v(\" サーバーに保存されている設定を、\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\"このデバイスの設定で上書きする \")],1),_c('v-btn',{staticClass:\"settings__save-button error--text text--lighten-1 mt-3\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.overrideClientSettingsFromServer()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:document-arrow-down-16-filled\",\"height\":\"22px\"}}),_vm._v(\" このデバイスの設定を、\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\"サーバーに保存されている設定で上書きする \")],1),_c('v-btn',{staticClass:\"settings__save-button mt-3\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){_vm.sync_settings_dialog = false}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:dismiss-16-filled\",\"height\":\"22px\"}}),_vm._v(\" キャンセル \")],1)],1)],1)],1),_c('v-form',{ref:\"settings_username\",staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"ユーザー名\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" KonomiTV アカウントのユーザー名を設定します。アルファベットだけでなく日本語や記号も使えます。\"),_c('br'),_vm._v(\" 同じ KonomiTV サーバー上の他のアカウントと同じユーザー名には変更できません。\"),_c('br')]),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"placeholder\":\"ユーザー名\",\"dense\":_vm.is_form_dense,\"rules\":[_vm.settings_username_validation]},model:{value:(_vm.settings_username),callback:function ($$v) {_vm.settings_username=$$v},expression:\"settings_username\"}})],1),_c('v-btn',{staticClass:\"settings__save-button\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.updateAccountInfo('username')}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:save-16-filled\",\"height\":\"24px\"}}),_vm._v(\"ユーザー名を更新 \")],1),_c('v-form',{staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"アイコン画像\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" KonomiTV アカウントのアイコン画像を設定します。\"),_c('br'),_vm._v(\" アップロードされた画像は自動で 400×400 の正方形にリサイズされます。\"),_c('br')]),_c('v-file-input',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"アイコン画像を選択\",\"dense\":_vm.is_form_dense,\"accept\":\"image/jpeg, image/png\",\"prepend-icon\":\"\",\"prepend-inner-icon\":\"mdi-paperclip\"},model:{value:(_vm.settings_icon),callback:function ($$v) {_vm.settings_icon=$$v},expression:\"settings_icon\"}})],1),_c('v-btn',{staticClass:\"settings__save-button mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.updateAccountIcon()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:save-16-filled\",\"height\":\"24px\"}}),_vm._v(\"アイコン画像を更新 \")],1),_c('v-form',{ref:\"settings_password\",staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"新しいパスワード\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" KonomiTV アカウントの新しいパスワードを設定します。\"),_c('br')]),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"placeholder\":\"新しいパスワード\",\"dense\":_vm.is_form_dense,\"type\":_vm.settings_password_showing ? 'text' : 'password',\"append-icon\":_vm.settings_password_showing ? 'mdi-eye' : 'mdi-eye-off',\"rules\":[_vm.settings_password_validation]},on:{\"click:append\":function($event){_vm.settings_password_showing = !_vm.settings_password_showing}},model:{value:(_vm.settings_password),callback:function ($$v) {_vm.settings_password=$$v},expression:\"settings_password\"}})],1),_c('v-btn',{staticClass:\"settings__save-button\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.updateAccountInfo('password')}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:save-16-filled\",\"height\":\"24px\"}}),_vm._v(\"パスワードを更新 \")],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item mt-6\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"アカウントを削除\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 現在ログインしている KonomiTV アカウントを削除します。\"),_c('br'),_c('b',[_vm._v(\"アカウントに紐づくすべてのデータが削除されます。\")]),_vm._v(\"元に戻すことはできません。\"),_c('br')])]),_c('v-dialog',{attrs:{\"max-width\":\"385\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-btn',_vm._g({staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"}},on),[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:delete-16-filled\",\"height\":\"24px\"}}),_vm._v(\"アカウントを削除 \")],1)]}}],null,false,1849668703),model:{value:(_vm.account_delete_confirm_dialog),callback:function ($$v) {_vm.account_delete_confirm_dialog=$$v},expression:\"account_delete_confirm_dialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"justify-center pt-6 font-weight-bold\"},[_vm._v(\"本当にアカウントを削除しますか?\")]),_c('v-card-text',{staticClass:\"pt-2 pb-0\"},[_vm._v(\" アカウントに紐づくすべてのデータが削除されます。元に戻すことはできません。\"),_c('br'),_vm._v(\" 本当にアカウントを削除しますか? \")]),_c('v-card-actions',{staticClass:\"pt-4 px-6 pb-5\"},[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"text\",\"text\":\"\"},on:{\"click\":function($event){_vm.account_delete_confirm_dialog = false}}},[_vm._v(\"キャンセル\")]),_c('v-btn',{attrs:{\"color\":\"error\"},on:{\"click\":function($event){return _vm.deleteAccount()}}},[_vm._v(\"削除\")])],1)],1)],1)],1):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('v-card',{staticClass:\"settings-container d-flex px-5 py-5 mx-auto background\",attrs:{\"elevation\":\"0\",\"width\":\"100%\",\"max-width\":\"1000\"}},[_c('div',[_c('v-navigation-drawer',{staticClass:\"settings-navigation flex-shrink-0 background\",attrs:{\"permanent\":\"\",\"width\":\"195\",\"height\":\"auto\"}},[_c('v-list-item',{staticClass:\"px-4\"},[_c('v-list-item-content',[_c('h1',[_vm._v(\"設定\")])])],1),_c('v-list',{staticClass:\"mt-3 px-0 py-0\",attrs:{\"nav\":\"\"}},[_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/general\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 3px\"},attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"全般\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/caption\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:subtitles-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"字幕\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/data-broadcasting\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('svg',{attrs:{\"width\":\"26px\",\"height\":\"26px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})])]),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"データ放送\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/capture\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:image-multiple-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"キャプチャ\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/account\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-20-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"アカウント\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/jikkyo\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 2px\"},attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"ニコニコ実況\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/twitter\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 1px\"},attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"Twitter\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/server\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:server-surface-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"サーバー設定\")])],1)],1)],1)],1)],1),_c('v-card',{staticClass:\"settings ml-5 px-7 py-7 lighten-1\",attrs:{\"width\":\"100%\"}},[_vm._t(\"default\")],2)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\n\n// 設定のベース画面なので、ロジックは基本置かない\nexport default Vue.extend({\n name: 'Settings-Base',\n components: {\n Header,\n Navigation,\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Base.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Base.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Base.vue?vue&type=template&id=7802007e&scoped=true&\"\nimport script from \"./Base.vue?vue&type=script&lang=ts&\"\nexport * from \"./Base.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Base.vue?vue&type=style&index=0&id=7802007e&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7802007e\",\n null\n \n)\n\nexport default component.exports","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Settings from '@/services/Settings';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Account',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // ローディング中かどうか\n is_loading: true,\n\n // ユーザー名とパスワード\n // ログイン画面やアカウント作成画面の data と同一のもの\n settings_username: null as string | null,\n settings_username_validation: (value: string | null) => {\n if (value === '' || value === null) return 'ユーザー名を入力してください。';\n if (/^.{2,}$/.test(value) === false) return 'ユーザー名は2文字以上で入力してください。';\n return true;\n },\n settings_password: null as string | null,\n settings_password_showing: false,\n settings_password_validation: (value: string | null) => {\n if (value === '' || value === null) return 'パスワードを入力してください。';\n // 正規表現の参考: https://qiita.com/grrrr/items/0b35b5c1c98eebfa5128\n if (/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(value) === false) return 'パスワードは4文字以上の半角英数記号を入力してください。';\n return true;\n },\n\n // アップロードするアイコン画像\n settings_icon: null as File | null,\n\n // アカウント削除確認ダイヤログ\n account_delete_confirm_dialog: false,\n\n // 設定を同期するかの設定値\n sync_settings: useSettingsStore().settings.sync_settings as boolean,\n\n // 設定を同期するときのダイヤログ\n sync_settings_dialog: false,\n };\n },\n computed: {\n // SettingsStore / UserStore に this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ローディング状態を解除\n this.is_loading = false;\n },\n watch: {\n // sync_settings の値の変更を監視する\n async sync_settings() {\n\n // 同期がオンになった & ダイヤログが表示されていない\n if (this.sync_settings === true && this.sync_settings_dialog === false) {\n\n // 同期対象の設定キーのみで設定データをまとめ直す\n const sync_settings = this.settingsStore.getSyncableClientSettings();\n\n // 同期対象のこのクライアントの設定を再度 JSON にする(文字列比較のため)\n const sync_settings_json = JSON.stringify(sync_settings);\n\n // サーバーから設定データをダウンロード\n // 一度オブジェクトに戻したものをを再度 JSON にする(文字列比較のため)\n const server_sync_settings = await Settings.fetchClientSettings();\n if (server_sync_settings === null) {\n this.$message.error('サーバーから設定データを取得できませんでした。');\n return;\n }\n const server_sync_settings_json = JSON.stringify(server_sync_settings);\n\n // このクライアントの設定とサーバーに保存されている設定が一致しない(=競合している)\n if (sync_settings_json !== server_sync_settings_json) {\n\n // 一度同期のスイッチをオフにして、クライアントとサーバーどちらの設定を使うのかを選択させるダイヤログを表示\n this.sync_settings_dialog = true;\n this.sync_settings = false;\n\n // このクライアントの設定とサーバーに保存されている設定が一致する\n } else {\n\n // 特に設定の同期をオンにしても問題ないので、そのまま有効にする\n this.settingsStore.settings.sync_settings = true;\n }\n\n // 同期がオフになった & ダイヤログが表示されていない\n } else if (this.sync_settings === false && this.sync_settings_dialog === false) {\n this.settingsStore.settings.sync_settings = false;\n }\n }\n },\n methods: {\n\n // このクライアントの設定でサーバー上の設定を上書きする\n async overrideServerSettingsFromClient() {\n\n // 強制的にこのクライアントの設定をサーバーに同期\n await this.settingsStore.syncClientSettingsToServer(true);\n\n // 設定の同期を有効化\n this.settingsStore.settings.sync_settings = true;\n this.sync_settings = true;\n\n // ダイヤログを閉じる\n this.sync_settings_dialog = false;\n },\n\n // サーバー上の設定でこのクライアントの設定を上書きする\n async overrideClientSettingsFromServer() {\n\n // 強制的にサーバーに保存されている設定データをこのクライアントに同期する\n // 設定の同期を有効化する前に実行しておくのが重要\n await this.settingsStore.syncClientSettingsFromServer(true);\n\n // 設定の同期を有効化\n // 値を変更した時点で設定データがサーバーにアップロードされてしまうので、\n // それよりも前に syncClientSettingsFromServer(true) でサーバー上の設定データを同期させておく必要がある\n // さもなければ、サーバー上の設定データがこのクライアントの設定で上書きされてしまい、overrideServerSettingsFromClient() と同じ挙動になってしまう\n this.settingsStore.settings.sync_settings = true;\n this.sync_settings = true;\n\n // ダイヤログを閉じる\n this.sync_settings_dialog = false;\n },\n\n async updateAccountInfo(update_type: 'username' | 'password') {\n\n // すべてのバリデーションが通過したときのみ\n // ref: https://qiita.com/Hijiri_Ishi/items/56cac99c8f3806a6fa24\n if (update_type === 'username') {\n if ((this.$refs.settings_username as any).validate() === false) return;\n } else {\n if ((this.$refs.settings_password as any).validate() === false) return;\n }\n\n // アカウント情報の更新処理 (エラーハンドリングを含む) を実行\n if (update_type === 'username') {\n if (this.settings_username === null) return;\n await this.userStore.updateUser({username: this.settings_username});\n } else {\n if (this.settings_password === null) return;\n await this.userStore.updateUser({password: this.settings_password});\n }\n },\n\n async updateAccountIcon() {\n\n // アイコン画像が選択されていないなら更新しない\n if (this.settings_icon === null) {\n this.$message.error('アップロードする画像を選択してください!');\n return;\n }\n\n // アイコン画像の更新処理 (エラーハンドリングを含む) を実行\n await this.userStore.updateUserIcon(this.settings_icon);\n },\n\n async deleteAccount() {\n\n // ダイヤログを閉じる\n this.account_delete_confirm_dialog = false;\n\n // アカウント削除処理 (エラーハンドリングを含む) を実行\n await this.userStore.deleteUser();\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Account.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Account.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Account.vue?vue&type=template&id=3ec6610e&scoped=true&\"\nimport script from \"./Account.vue?vue&type=script&lang=ts&\"\nexport * from \"./Account.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Account.vue?vue&type=style&index=0&id=3ec6610e&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3ec6610e\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:subtitles-16-filled\",\"width\":\"25px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"字幕\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item\"},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"字幕のフォント\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" プレイヤーで字幕表示をオンにしているときの、字幕のフォントを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.caption_font},model:{value:(_vm.settingsStore.settings.caption_font),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"caption_font\", $$v)},expression:\"settingsStore.settings.caption_font\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"always_border_caption_text\"}},[_vm._v(\"字幕の文字を常に縁取りする\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"always_border_caption_text\"}},[_vm._v(\" 字幕表示時、縁取りをオンにすると、字幕が見やすくきれいになります。とくに理由がなければ、オンにしておくのがおすすめです。\"),_c('br'),_vm._v(\" この設定がオフのときも、字幕データ側で縁取りが指定されていれば、オンのときと同様に縁取り付きで描画されます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"always_border_caption_text\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.always_border_caption_text),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"always_border_caption_text\", $$v)},expression:\"settingsStore.settings.always_border_caption_text\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"specify_caption_opacity\"}},[_vm._v(\"字幕の不透明度を指定する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"specify_caption_opacity\"}},[_vm._v(\" 字幕表示時、不透明度を自分で指定するか設定できます。\"),_c('br'),_vm._v(\" この設定がオフのときは、字幕データ側で指定されている不透明度で描画します。とくに理由がなければ、オフにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"specify_caption_opacity\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.specify_caption_opacity),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"specify_caption_opacity\", $$v)},expression:\"settingsStore.settings.specify_caption_opacity\"}})],1),_c('div',{staticClass:\"settings__item\",class:{'settings__item--disabled': _vm.settingsStore.settings.specify_caption_opacity === false}},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"字幕の不透明度\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" 上の [字幕の不透明度を指定する] をオンに設定したときのみ有効です。不透明度を 0 に設定すれば、字幕の背景を非表示にできます。\"),_c('br')]),_c('div',{ref:\"caption_opacity\",staticClass:\"settings__item-label\"},[_c('v-slider',{staticClass:\"settings__item-form\",attrs:{\"ticks\":\"always\",\"thumb-label\":\"\",\"hide-details\":\"\",\"min\":0,\"max\":1,\"step\":0.05,\"disabled\":_vm.settingsStore.settings.specify_caption_opacity === false},model:{value:(_vm.settingsStore.settings.caption_opacity),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"caption_opacity\", $$v)},expression:\"settingsStore.settings.caption_opacity\"}})],1)]),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\"テレビをみるときに文字スーパーを表示する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\" 文字スーパーは、緊急地震速報の赤テロップや、NHK BS のニュース速報のテロップなどで利用されています。とくに理由がなければ、オンにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_show_superimpose\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_show_superimpose),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_show_superimpose\", $$v)},expression:\"settingsStore.settings.tv_show_superimpose\"}})],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Caption',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // 字幕のフォントの選択肢\n caption_font: [\n {text: 'Windows TV ゴシック', value: 'Windows TV Gothic'},\n {text: 'Windows TV 丸ゴシック', value: 'Windows TV MaruGothic'},\n {text: 'Windows TV 太丸ゴシック', value: 'Windows TV FutoMaruGothic'},\n {text: 'ヒラギノTV丸ゴ', value: 'Hiragino TV Sans Rd S'},\n {text: '新丸ゴ ARIB', value: 'TT-ShinMGo-regular'},\n {text: 'Rounded M+ 1m for ARIB', value: 'Rounded M+ 1m for ARIB'},\n {text: 'Noto Sans JP', value: 'Noto Sans JP Caption'},\n {text: 'デフォルトのフォント', value: 'sans-serif'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Caption.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Caption.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Caption.vue?vue&type=template&id=0642ebd7&\"\nimport script from \"./Caption.vue?vue&type=script&lang=ts&\"\nexport * from \"./Caption.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:image-multiple-16-filled\",\"width\":\"26px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"キャプチャ\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"capture_copy_to_clipboard\"}},[_vm._v(\"キャプチャをクリップボードにコピーする\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"capture_copy_to_clipboard\"}},[_vm._v(\" この設定をオンにすると、撮ったキャプチャ画像がクリップボードにもコピーされます。\"),_c('br'),_vm._v(\" クリップボードの履歴をサポートしていない OS では、この設定をオンにしてキャプチャを撮ると、以前のクリップボードが上書きされます。注意してください。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"capture_copy_to_clipboard\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.capture_copy_to_clipboard),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"capture_copy_to_clipboard\", $$v)},expression:\"settingsStore.settings.capture_copy_to_clipboard\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"キャプチャの保存先\")]),_c('div',{staticClass:\"settings__item-label\"},[_c('p',[_vm._v(\" キャプチャした画像をブラウザでダウンロードするか、KonomiTV サーバーにアップロードするかを設定します。\"),_c('br'),_vm._v(\" ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方同時に行うこともできます。\"),_c('br')]),_c('p',[_vm._v(\" ブラウザでダウンロードすると、視聴中のデバイスのダウンロードフォルダに保存されます。\"),_c('br'),_vm._v(\" 視聴中のデバイスにそのまま保存されるためシンプルですが、保存先のフォルダを変更できないこと、PC 版 Chrome では毎回ダウンロードバーが表示されてしまったり、iOS Safari (PWA モード) ではダウンロードするとファイル概要画面が表示され再生が中断してしまったりなど、視聴に支障することがデメリットです (将来的には、iOS / Android アプリ版や拡張機能などで解消される予定) 。\"),_c('br')]),_c('p',[_vm._v(\" KonomiTV サーバーにアップロードすると、サーバー設定で指定されたキャプチャ保存フォルダに保存されます。視聴したデバイスにかかわらず、今までに撮ったキャプチャをひとつのフォルダにまとめて保存できます。\"),_c('br'),_vm._v(\" 他のデバイスでキャプチャを見るにはキャプチャ保存フォルダをネットワークに共有する必要があること、スマホ・タブレットではネットワーク上のフォルダへのアクセスがやや面倒なことがデメリットです。(将来的には、保存フォルダ内のキャプチャを Google フォトのように表示する機能を追加予定)\"),_c('br')])]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.capture_save_mode},model:{value:(_vm.settingsStore.settings.capture_save_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"capture_save_mode\", $$v)},expression:\"settingsStore.settings.capture_save_mode\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"字幕表示時のキャプチャの保存モード\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 字幕表示時、キャプチャした画像に字幕を合成するかを設定します。\"),_c('br'),_vm._v(\" 映像のみのキャプチャと、字幕を合成したキャプチャを両方同時に保存することもできます。\"),_c('br'),_vm._v(\" なお、字幕非表示時は、常に映像のみ (+コメント付きキャプチャではコメントを合成して) 保存されます。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.capture_caption_mode},model:{value:(_vm.settingsStore.settings.capture_caption_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"capture_caption_mode\", $$v)},expression:\"settingsStore.settings.capture_caption_mode\"}})],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Capture',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // キャプチャの保存先の選択肢\n capture_save_mode: [\n {text: 'ブラウザでダウンロード', value: 'Browser'},\n {text: 'KonomiTV サーバーにアップロード', value: 'UploadServer'},\n {text: 'ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方行う', value: 'Both'},\n ],\n\n // 字幕が表示されているときのキャプチャの保存モードの選択肢\n capture_caption_mode: [\n {text: '映像のみのキャプチャを保存する', value: 'VideoOnly'},\n {text: '字幕を合成したキャプチャを保存する', value: 'CompositingCaption'},\n {text: '映像のみのキャプチャと、字幕を合成したキャプチャを両方保存する', value: 'Both'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Capture.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Capture.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Capture.vue?vue&type=template&id=212658a0&\"\nimport script from \"./Capture.vue?vue&type=script&lang=ts&\"\nexport * from \"./Capture.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('svg',{attrs:{\"width\":\"27px\",\"height\":\"27px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})]),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"データ放送\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_show_data_broadcasting\"}},[_vm._v(\"テレビをみるときにデータ放送を表示する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_data_broadcasting\"}},[_vm._v(\" この設定をオンにすると、テレビをみるときにデータ放送機能を利用できます。\"),_c('br'),_vm._v(\" データ放送そのもののオン/オフは、視聴画面右側のパネルからリモコンを表示した上で、リモコンの d ボタンから切り替えられます。\"),_c('br')]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_data_broadcasting\"}},[_vm._v(\" データ放送機能をオンにすると、負荷が高くなり視聴に支障が出ることがあります。データ放送を利用しない場合や、性能の低い Android デバイスではオフにすることをおすすめします。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_show_data_broadcasting\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_show_data_broadcasting),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_show_data_broadcasting\", $$v)},expression:\"settingsStore.settings.tv_show_data_broadcasting\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('v-form',{ref:\"data_broadcasting_zip_code\",staticClass:\"settings__item settings__item--sync-disabled\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"お住まいの郵便番号\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" ここで設定した郵便番号をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。\"),_c('br'),_vm._v(\" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。\"),_c('br')]),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"placeholder\":\"郵便番号\",\"dense\":_vm.is_form_dense,\"rules\":[_vm.data_broadcasting_zip_code_validation]},model:{value:(_vm.data_broadcasting_zip_code),callback:function ($$v) {_vm.data_broadcasting_zip_code=$$v},expression:\"data_broadcasting_zip_code\"}})],1),_c('div',{staticClass:\"settings__item settings__item--sync-disabled mt-0\"},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"お住まいの都道府県\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" ここで設定した都道府県をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。\"),_c('br'),_vm._v(\" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.data_broadcasting_prefectures},model:{value:(_vm.data_broadcasting_prefecture),callback:function ($$v) {_vm.data_broadcasting_prefecture=$$v},expression:\"data_broadcasting_prefecture\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"データ放送の保存データをリセット\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" このデバイス(ブラウザ)に保存されているデータ放送の保存データを、初期状態にリセット (消去) できます。\"),_c('br'),_vm._v(\" 保存データには、データ放送内のミニゲームの得点データや、設定データなどが含まれます。\"),_c('br'),_vm._v(\" 保存データをリセットすると、元に戻すことはできません。十分ご注意ください。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.resetNVRAMSettings()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"material-symbols:device-reset-rounded\",\"height\":\"23px\"}}),_vm._v(\"保存データをリセット \")],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\n// データ放送の NVRAM のうち、郵便番号/都道府県設定の保存に使う LocalStorage キーのプレフィックス\nconst NVRAM_LOCAL_STORAGE_PREFIX = 'KonomiTV-BMLBrowser_nvram_prefix=receiverinfo%2F';\n\nexport default Vue.extend({\n name: 'Settings-DataBroadcasting',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // データ放送向け郵便番号設定\n data_broadcasting_zip_code: '' as string,\n\n // データ放送向け郵便番号(日本)のバリデーション関数\n data_broadcasting_zip_code_validation: (value: string) => {\n if (value === '') {\n return true;\n }\n if (value.match(/^[0-9]{3}-[0-9]{4}$/) === null) {\n return '郵便番号は「000-0000」の形式で入力してください。';\n }\n return true;\n },\n\n // データ放送向け都道府県設定\n data_broadcasting_prefecture: '255-0b0' as string,\n data_broadcasting_prefectures: [\n {text: '未設定', value: '255-0b0'},\n {text: '西北海道', value: '2-0b000101101011'},\n {text: '東北海道', value: '1-0b000101101011'},\n {text: '青森県', value: '3-0b010001100111'},\n {text: '岩手県', value: '4-0b010111010100'},\n {text: '宮城県', value: '5-0b011101011000'},\n {text: '秋田県', value: '6-0b101011000110'},\n {text: '山形県', value: '7-0b111001001100'},\n {text: '福島県', value: '8-0b000110101110'},\n {text: '茨城県', value: '9-0b110001101001'},\n {text: '栃木県', value: '10-0b111000111000'},\n {text: '群馬県', value: '11-0b100110001011'},\n {text: '埼玉県', value: '12-0b011001001011'},\n {text: '千葉県', value: '13-0b000111000111'},\n {text: '東京都 (島部を除く)', value: '14-0b101010101100'},\n {text: '東京都島部 (伊豆・小笠原諸島)', value: '49-0b101010101100'},\n {text: '神奈川県', value: '15-0b010101101100'},\n {text: '新潟県', value: '16-0b010011001110'},\n {text: '富山県', value: '17-0b010100111001'},\n {text: '石川県', value: '18-0b011010100110'},\n {text: '福井県', value: '19-0b100100101101'},\n {text: '山梨県', value: '20-0b110101001010'},\n {text: '長野県', value: '21-0b100111010010'},\n {text: '岐阜県', value: '22-0b101001100101'},\n {text: '静岡県', value: '23-0b101001011010'},\n {text: '愛知県', value: '24-0b100101100110'},\n {text: '三重県', value: '25-0b001011011100'},\n {text: '滋賀県', value: '26-0b110011100100'},\n {text: '京都府', value: '27-0b010110011010'},\n {text: '大阪府', value: '28-0b110010110010'},\n {text: '兵庫県', value: '29-0b011001110100'},\n {text: '奈良県', value: '30-0b101010010011'},\n {text: '和歌山県', value: '31-0b001110010110'},\n {text: '鳥取県', value: '32-0b110100100011'},\n {text: '島根県', value: '33-0b001100011011'},\n {text: '岡山県', value: '34-0b001010110101'},\n {text: '広島県', value: '35-0b101100110001'},\n {text: '山口県', value: '36-0b101110011000'},\n {text: '徳島県', value: '37-0b111001100010'},\n {text: '香川県', value: '38-0b100110110100'},\n {text: '愛媛県', value: '39-0b000110011101'},\n {text: '高知県', value: '40-0b001011100011'},\n {text: '福岡県', value: '41-0b011000101101'},\n {text: '佐賀県', value: '42-0b100101011001'},\n {text: '長崎県', value: '43-0b101000101011'},\n {text: '熊本県', value: '44-0b100010100111'},\n {text: '大分県', value: '45-0b110010001101'},\n {text: '宮崎県', value: '46-0b110100011100'},\n {text: '鹿児島県 (南西諸島を除く)', value: '47-0b110101000101'},\n {text: '鹿児島県島部 (南西諸島の鹿児島県域)', value: '50-0b110101000101'},\n {text: '沖縄県', value: '48-0b001101110010'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n },\n created() {\n // 郵便番号設定を LocalStorage から読み込む\n const zip_code_raw = localStorage.getItem(`${NVRAM_LOCAL_STORAGE_PREFIX}zipcode`);\n if (zip_code_raw) {\n try {\n // 3文字目と4文字目の間に - を挿入する\n this.data_broadcasting_zip_code = window.atob(zip_code_raw);\n this.data_broadcasting_zip_code = this.data_broadcasting_zip_code.slice(0, 3) + '-' + this.data_broadcasting_zip_code.slice(3);\n } catch (error) {\n // 何もしない\n }\n }\n // 都道府県設定を LocalStorage から読み込む\n // 現在設定されている都道府県を特定するだけなら regioncode は不要なので、省略している\n const prefecture_raw = localStorage.getItem(`${NVRAM_LOCAL_STORAGE_PREFIX}prefecture`);\n if (prefecture_raw) {\n try {\n const prefecture = window.atob(prefecture_raw).charCodeAt(0);\n for (const item of this.data_broadcasting_prefectures) {\n if (item.value.startsWith(`${prefecture}-`)) {\n this.data_broadcasting_prefecture = item.value;\n break;\n }\n }\n } catch (error) {\n // 何もしない\n }\n }\n },\n watch: {\n data_broadcasting_zip_code(new_value: string) {\n // バリデーションチェック\n if ((this.$refs.data_broadcasting_zip_code as any).validate() === false) {\n return;\n }\n // 郵便番号設定を LocalStorage に保存する\n if (new_value !== '') {\n // - を除去してから Base64 エンコードする\n const zip_code_raw = window.btoa(new_value.replace('-', ''));\n localStorage.setItem(`${NVRAM_LOCAL_STORAGE_PREFIX}zipcode`, zip_code_raw);\n } else {\n // 未設定の場合は LocalStorage から削除する\n localStorage.removeItem(`${NVRAM_LOCAL_STORAGE_PREFIX}zipcode`);\n }\n },\n data_broadcasting_prefecture(new_value: string) {\n // 都道府県設定を LocalStorage に保存する\n if (new_value !== '255-0b0') {\n const value = new_value.split('-0b');\n const prefecture_number = parseInt(value[0]);\n const prefecture_raw = window.btoa(String.fromCharCode(prefecture_number));\n localStorage.setItem(`${NVRAM_LOCAL_STORAGE_PREFIX}prefecture`, prefecture_raw);\n const region_code_number = parseInt(value[1], 2); // 2進数の文字列を10進数の数値に変換する\n const region_code_raw = window.btoa(String.fromCharCode(region_code_number >> 8, region_code_number & 0xff));\n localStorage.setItem(`${NVRAM_LOCAL_STORAGE_PREFIX}regioncode`, region_code_raw);\n } else {\n // 未設定の場合は LocalStorage から削除する\n localStorage.removeItem(`${NVRAM_LOCAL_STORAGE_PREFIX}prefecture`);\n localStorage.removeItem(`${NVRAM_LOCAL_STORAGE_PREFIX}regioncode`);\n }\n }\n },\n methods: {\n resetNVRAMSettings() {\n // KonomiTV-BMLBrowser_nvram_ から始まる LocalStorage の項目をすべて削除する\n for (const key in localStorage) {\n if (key.startsWith('KonomiTV-BMLBrowser_nvram_')) {\n localStorage.removeItem(key);\n }\n }\n this.data_broadcasting_zip_code = '';\n this.data_broadcasting_prefecture = '255-0b0';\n this.$message.success('データ放送の保存データをリセットしました。');\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DataBroadcasting.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DataBroadcasting.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./DataBroadcasting.vue?vue&type=template&id=3a9a6e29&\"\nimport script from \"./DataBroadcasting.vue?vue&type=script&lang=ts&\"\nexport * from \"./DataBroadcasting.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"19px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"全般\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item settings__item--sync-disabled\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"テレビのデフォルトのストリーミング画質\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" テレビをライブストリーミングするときのデフォルトの画質を設定します。\"),_c('br'),_vm._v(\" ストリーミング画質はプレイヤーの設定からいつでも切り替えられます。\"),_c('br')]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" [1080p (60fps)] は、通常 30fps (60i) の映像を補間し、より滑らか(ぬるぬる)な映像で視聴できます!\"),_c('br'),_vm._v(\" [1080p (60fps)] で視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出ることがあります。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tv_streaming_quality},model:{value:(_vm.settingsStore.settings.tv_streaming_quality),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_streaming_quality\", $$v)},expression:\"settingsStore.settings.tv_streaming_quality\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\",class:{'settings__item--disabled': _vm.PlayerUtils.isHEVCVideoSupported() === false}},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_data_saver_mode\"}},[_vm._v(\"テレビを通信節約モードで視聴する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_data_saver_mode\"}},[_vm._v(\" 通信節約モードでは、H.265 / HEVC という圧縮率の高いコーデックを使い、画質はほぼそのまま、通信量を通常の 1/2 程度に抑えながら視聴できます!\"),_c('br'),_vm._v(\" 通信節約モードで視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出る可能性が高いです。\"),_c('br'),(_vm.PlayerUtils.isHEVCVideoSupported() === false && _vm.Utils.isFirefox() === false)?_c('p',{staticClass:\"mt-1 mb-0 error--text lighten-1\"},[_vm._v(\" このデバイスでは通信節約モードがサポートされていません。 \")]):_vm._e(),(_vm.PlayerUtils.isHEVCVideoSupported() === false && _vm.Utils.isFirefox() === true)?_c('p',{staticClass:\"mt-1 mb-0 error--text lighten-1\"},[_vm._v(\" お使いの Firefox ブラウザでは通信節約モードがサポートされていません。 \")]):_vm._e()]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_data_saver_mode\",\"inset\":\"\",\"hide-details\":\"\",\"disabled\":_vm.PlayerUtils.isHEVCVideoSupported() === false},model:{value:(_vm.settingsStore.settings.tv_data_saver_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_data_saver_mode\", $$v)},expression:\"settingsStore.settings.tv_data_saver_mode\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_low_latency_mode\"}},[_vm._v(\"テレビを低遅延で視聴する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_low_latency_mode\"}},[_vm._v(\" 低遅延ストリーミングをオンにすると、\"),_c('b',[_vm._v(\"放送波との遅延を最短 0.9 秒に抑えて視聴できます!\")]),_c('br'),_vm._v(\" また、約 3 秒以上遅延したときに少しだけ再生速度を早める (1.1x) ことで、滑らかにストリーミングの遅延を取り戻します。\"),_c('br'),_vm._v(\" 宅外視聴などのネットワークが不安定になりがちな環境では、低遅延ストリーミングをオフにしてみると、映像のカクつきを改善できるかもしれません。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_low_latency_mode\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_low_latency_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_low_latency_mode\", $$v)},expression:\"settingsStore.settings.tv_low_latency_mode\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"デフォルトのパネルの表示状態\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 視聴画面を開いたときに、右側のパネルをどう表示するかを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.panel_display_state},model:{value:(_vm.settingsStore.settings.panel_display_state),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"panel_display_state\", $$v)},expression:\"settingsStore.settings.panel_display_state\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"テレビをみるときにデフォルトで表示されるパネルのタブ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" テレビの視聴画面を開いたときに、右側のパネルで最初に表示されるタブを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tv_panel_active_tab},model:{value:(_vm.settingsStore.settings.tv_panel_active_tab),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_panel_active_tab\", $$v)},expression:\"settingsStore.settings.tv_panel_active_tab\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\"チャンネル選局のキーボードショートカットを \"+_vm._s(_vm.Utils.AltOrOption())+\" + 数字キー/テンキーに変更する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\" この設定をオンにすると、数字キーまたはテンキーに対応するリモコン番号(1~12)のチャンネルに切り替える際、\"+_vm._s(_vm.Utils.AltOrOption())+\" キーを同時に押す必要があります。\"),_c('br'),_vm._v(\" コメントやツイートを入力しようとして誤って数字キーを押してしまい、チャンネルが変わってしまう事態を避けたい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_show_superimpose\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_channel_selection_requires_alt_key),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_channel_selection_requires_alt_key\", $$v)},expression:\"settingsStore.settings.tv_channel_selection_requires_alt_key\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"設定をエクスポート\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" このデバイス(ブラウザ)に保存されている設定データを、エクスポート(ダウンロード)できます。\"),_c('br'),_vm._v(\" ダウンロードした設定データ (KonomiTV-Settings.json) は、[設定をインポート] からインポートできます。異なるサーバーの KonomiTV を同じ設定で使いたいときなどに使ってください。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button mt-4\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.exportSettings()}}},[_c('Icon',{staticClass:\"mr-3\",attrs:{\"icon\":\"fa6-solid:download\",\"height\":\"19px\"}}),_vm._v(\"設定をエクスポート \")],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"設定をインポート\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" [設定をエクスポート] でダウンロードした設定データを、このデバイス(ブラウザ)にインポートできます。\"),_c('br'),_vm._v(\" 設定をインポートすると、\"),_c('b',[_vm._v(\"現在のデバイス設定はすべて上書きされます。\")]),_vm._v(\"元に戻すことはできません。\"),_c('br'),_vm._v(\" 設定のデバイス間同期がオンのときは、\"),_c('b',[_vm._v(\"同期が有効なすべてのデバイスに反映されます。\")]),_vm._v(\"十分ご注意ください。\"),_c('br')]),_c('v-file-input',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"設定データ (KonomiTV-Settings.json) を選択\",\"dense\":_vm.is_form_dense,\"accept\":\"application/json\",\"prepend-icon\":\"\",\"prepend-inner-icon\":\"mdi-paperclip\"},model:{value:(_vm.import_settings_file),callback:function ($$v) {_vm.import_settings_file=$$v},expression:\"import_settings_file\"}})],1),_c('v-btn',{staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.importSettings()}}},[_c('Icon',{staticClass:\"mr-3\",attrs:{\"icon\":\"fa6-solid:upload\",\"height\":\"19px\"}}),_vm._v(\"設定をインポート \")],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"設定を初期状態にリセット\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" このデバイス(ブラウザ)に保存されている設定データを、初期状態のデフォルト値にリセットできます。\"),_c('br'),_vm._v(\" 設定をリセットすると、元に戻すことはできません。\"),_c('br'),_vm._v(\" 設定のデバイス間同期がオンのときは、\"),_c('b',[_vm._v(\"同期が有効なすべてのデバイスに反映されます。\")]),_vm._v(\"十分ご注意ください。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.resetSettings()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"material-symbols:device-reset-rounded\",\"height\":\"23px\"}}),_vm._v(\"設定をリセット \")],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { PlayerUtils } from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nconst QUALITY_H264 = [\n {text: '1080p (60fps) (約4.50GB/h / 平均10.0Mbps)', value: '1080p-60fps'},\n {text: '1080p (約4.50GB/h / 平均10.0Mbps)', value: '1080p'},\n {text: '810p (約2.62GB/h / 平均5.8Mbps)', value: '810p'},\n {text: '720p (約2.18GB/h / 平均4.9Mbps)', value: '720p'},\n {text: '540p (約1.52GB/h / 平均3.4Mbps)', value: '540p'},\n {text: '480p (約1.06GB/h / 平均2.3Mbps)', value: '480p'},\n {text: '360p (約0.60GB/h / 平均1.3Mbps)', value: '360p'},\n {text: '240p (約0.35GB/h / 平均0.8Mbps)', value: '240p'},\n];\n\nconst QUALITY_H265 = [\n {text: '1080p (60fps) (約1.80GB/h / 平均4.0Mbps)', value: '1080p-60fps'},\n {text: '1080p (約1.37GB/h / 平均3.0Mbps)', value: '1080p'},\n {text: '810p (約1.05GB/h / 平均2.3Mbps)', value: '810p'},\n {text: '720p (約0.82GB/h / 平均1.8Mbps)', value: '720p'},\n {text: '540p (約0.53GB/h / 平均1.2Mbps)', value: '540p'},\n {text: '480p (約0.46GB/h / 平均1.0Mbps)', value: '480p'},\n {text: '360p (約0.30GB/h / 平均0.7Mbps)', value: '360p'},\n {text: '240p (約0.20GB/h / 平均0.4Mbps)', value: '240p'},\n];\n\nexport default Vue.extend({\n name: 'Settings-General',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n PlayerUtils: PlayerUtils,\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // テレビのデフォルトのストリーミング画質の選択肢\n tv_streaming_quality: QUALITY_H264,\n\n // デフォルトのパネルの表示状態の選択肢\n panel_display_state: [\n {text: '前回の状態を復元する', value: 'RestorePreviousState'},\n {text: '常に表示する', value: 'AlwaysDisplay'},\n {text: '常に折りたたむ', value: 'AlwaysFold'},\n ],\n\n // テレビをみるときにデフォルトで表示されるパネルのタブの選択肢\n tv_panel_active_tab: [\n {text: '番組情報タブ', value: 'Program'},\n {text: 'チャンネルタブ', value: 'Channel'},\n {text: 'コメントタブ', value: 'Comment'},\n {text: 'Twitter タブ', value: 'Twitter'},\n ],\n\n // 選択された設定データ (KonomiTV-Settings.json) が入る\n import_settings_file: null as File | null,\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n },\n created() {\n if (this.settingsStore.settings.tv_data_saver_mode === true) {\n this.tv_streaming_quality = QUALITY_H265;\n }\n },\n watch: {\n 'settingsStore.settings.tv_data_saver_mode': {\n immediate: true,\n handler(val: boolean) {\n if (val === true) {\n this.tv_streaming_quality = QUALITY_H265;\n } else {\n this.tv_streaming_quality = QUALITY_H264;\n }\n },\n }\n },\n methods: {\n\n // 設定データをエクスポートする\n exportSettings() {\n\n // 設定データを JSON 化して取得\n const settings_json = JSON.stringify(this.settingsStore.settings, null, 4);\n\n // ダウンロードさせるために一旦 Blob にしてから、KonomiTV-Settings.json としてダウンロード\n const settings_json_blob = new Blob([settings_json], {type: 'application/json'});\n Utils.downloadBlobData(settings_json_blob, 'KonomiTV-Settings.json');\n this.$message.success('設定をエクスポートしました。');\n },\n\n // 設定データをインポートする\n async importSettings() {\n\n // 設定データが選択されていないときは実行しない\n if (this.import_settings_file === null) {\n this.$message.error('インポートする設定データを選択してください!');\n return;\n }\n\n // 設定データのインポートを実行\n const result = await this.settingsStore.importClientSettings(this.import_settings_file);\n if (result === true) {\n this.$message.success('設定をインポートしました。');\n window.setTimeout(() => this.$router.go(0), 300);\n } else {\n this.$message.error('設定データが不正なため、インポートできませんでした。');\n }\n },\n\n // 設定データをリセットする\n async resetSettings() {\n await this.settingsStore.resetClientSettings();\n this.$message.success('設定をリセットしました。');\n window.setTimeout(() => this.$router.go(0), 300);\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./General.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./General.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./General.vue?vue&type=template&id=6630baba&\"\nimport script from \"./General.vue?vue&type=script&lang=ts&\"\nexport * from \"./General.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('v-card',{staticClass:\"settings-container d-flex px-5 py-5 mx-auto background\",attrs:{\"elevation\":\"0\",\"width\":\"100%\",\"max-width\":\"1000\"}},[_c('v-navigation-drawer',{staticClass:\"settings-navigation flex-shrink-0 background\",attrs:{\"permanent\":\"\",\"width\":\"100%\",\"height\":\"auto\"}},[_c('v-list-item',{staticClass:\"px-1\"},[_c('v-list-item-content',[_c('h1',[_vm._v(\"設定\")])])],1),_c('v-list',{staticClass:\"mt-2 px-0\",attrs:{\"nav\":\"\"}},[_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/general\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 3px\"},attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"全般\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/caption\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:subtitles-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"字幕\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/data-broadcasting\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('svg',{attrs:{\"width\":\"26px\",\"height\":\"26px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})])]),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"データ放送\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/capture\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:image-multiple-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"キャプチャ\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/account\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-20-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"アカウント\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/jikkyo\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 2px\"},attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"ニコニコ実況\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/twitter\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 1px\"},attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"Twitter\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/server\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:server-surface-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"サーバー設定\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 settings-navigation-version\",class:{'settings-navigation-version--highlight': _vm.versionStore.is_update_available},attrs:{\"link\":\"\",\"color\":\"primary\",\"href\":\"https://github.com/tsukumijima/KonomiTV\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:info-16-regular\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" version \"+_vm._s(_vm.versionStore.client_version)+_vm._s(_vm.versionStore.is_update_available ? ' (Update Available)' : '')+\" \")])],1)],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useVersionStore from '@/store/VersionStore';\n\nexport default Vue.extend({\n name: 'Settings-Index',\n components: {\n Header,\n Navigation,\n },\n computed: {\n ...mapStores(useVersionStore),\n },\n async created() {\n await this.versionStore.fetchServerVersion();\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Index.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Index.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Index.vue?vue&type=template&id=51859415&scoped=true&\"\nimport script from \"./Index.vue?vue&type=script&lang=ts&\"\nexport * from \"./Index.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Index.vue?vue&type=style&index=0&id=51859415&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"51859415\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"19px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"ニコニコ実況\")])],1),_c('div',{staticClass:\"settings__content\",class:{'settings__content--loading': _vm.is_loading}},[(_vm.userStore.user === null || _vm.userStore.user.niconico_user_id === null)?_c('div',{staticClass:\"niconico-account niconico-account--anonymous\"},[_c('div',{staticClass:\"niconico-account-wrapper\"},[_c('Icon',{staticClass:\"flex-shrink-0\",attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"45px\"}}),_c('div',{staticClass:\"niconico-account__info ml-4\"},[_c('div',{staticClass:\"niconico-account__info-name\"},[_c('span',{staticClass:\"niconico-account__info-name-text\"},[_vm._v(\"ニコニコアカウントと連携していません\")])]),_c('span',{staticClass:\"niconico-account__info-description\"},[_vm._v(\" ニコニコアカウントと連携すると、テレビを見ながらニコニコ実況にコメントできるようになります。 \")])])],1),_c('v-btn',{staticClass:\"niconico-account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"130\",\"height\":\"56\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.loginNiconicoAccount()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-connected-20-filled\",\"height\":\"26\"}}),_vm._v(\"連携する \")],1)],1):_vm._e(),(_vm.userStore.user !== null && _vm.userStore.user.niconico_user_id !== null)?_c('div',{staticClass:\"niconico-account\"},[_c('div',{staticClass:\"niconico-account-wrapper\"},[_c('img',{staticClass:\"niconico-account__icon\",attrs:{\"src\":_vm.userStore.user_niconico_icon_url ?? ''}}),_c('div',{staticClass:\"niconico-account__info\"},[_c('div',{staticClass:\"niconico-account__info-name\"},[_c('span',{staticClass:\"niconico-account__info-name-text\"},[_vm._v(_vm._s(_vm.userStore.user.niconico_user_name)+\" と連携しています\")])]),_c('span',{staticClass:\"niconico-account__info-description\"},[_c('span',{staticClass:\"mr-2\",staticStyle:{\"white-space\":\"nowrap\"}},[_vm._v(\"Niconico User ID:\")]),_c('a',{staticClass:\"mr-2\",attrs:{\"href\":`https://www.nicovideo.jp/user/${_vm.userStore.user.niconico_user_id}`,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.userStore.user.niconico_user_id))]),(_vm.userStore.user.niconico_user_premium === true)?_c('span',{staticClass:\"secondary--text\"},[_vm._v(\"(Premium)\")]):_vm._e()])])]),_c('v-btn',{staticClass:\"niconico-account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"130\",\"height\":\"56\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.logoutNiconicoAccount()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-disconnected-20-filled\",\"height\":\"26\"}}),_vm._v(\"連携解除 \")],1)],1):_vm._e(),_c('div',{staticClass:\"settings__item mt-7\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"コメントのミュート設定\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 表示したくないコメントを、映像上やコメントリストに表示しないようにミュートできます。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button mt-4\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){_vm.comment_mute_settings_modal = !_vm.comment_mute_settings_modal}}},[_c('Icon',{attrs:{\"icon\":\"heroicons-solid:filter\",\"height\":\"19px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"コメントのミュート設定を開く\")])],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"コメントの速さ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" プレイヤーに流れるコメントの速さを設定します。\"),_c('br'),_vm._v(\" たとえば 1.2 に設定すると、コメントが 1.2 倍速く流れます。\"),_c('br')]),_c('v-slider',{staticClass:\"settings__item-form\",attrs:{\"ticks\":\"always\",\"thumb-label\":\"\",\"hide-details\":\"\",\"step\":0.1,\"min\":0.5,\"max\":2},model:{value:(_vm.settingsStore.settings.comment_speed_rate),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"comment_speed_rate\", $$v)},expression:\"settingsStore.settings.comment_speed_rate\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"コメントの文字サイズ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" プレイヤーに流れるコメントの文字サイズの基準値を設定します。\"),_c('br'),_vm._v(\" 実際の文字サイズは画面サイズに合わせて調整されます。デフォルトの文字サイズは 34px です。\"),_c('br')]),_c('v-slider',{staticClass:\"settings__item-form\",attrs:{\"ticks\":\"always\",\"thumb-label\":\"\",\"hide-details\":\"\",\"min\":20,\"max\":60},model:{value:(_vm.settingsStore.settings.comment_font_size),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"comment_font_size\", $$v)},expression:\"settingsStore.settings.comment_font_size\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"close_comment_form_after_sending\"}},[_vm._v(\"コメント送信後にコメント入力フォームを閉じる\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"close_comment_form_after_sending\"}},[_vm._v(\" この設定をオンにすると、コメントを送信した後に、コメント入力フォームが自動で閉じるようになります。\"),_c('br'),_vm._v(\" コメント入力フォームが表示されたままだと、大半のショートカットキーが文字入力と競合して使えなくなります。とくに理由がなければ、オンにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"close_comment_form_after_sending\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.close_comment_form_after_sending),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"close_comment_form_after_sending\", $$v)},expression:\"settingsStore.settings.close_comment_form_after_sending\"}})],1)],1),_c('CommentMuteSettings',{model:{value:(_vm.comment_mute_settings_modal),callback:function ($$v) {_vm.comment_mute_settings_modal=$$v},expression:\"comment_mute_settings_modal\"}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('v-dialog',{attrs:{\"max-width\":\"770\",\"transition\":\"slide-y-transition\"},model:{value:(_vm.comment_mute_settings_modal),callback:function ($$v) {_vm.comment_mute_settings_modal=$$v},expression:\"comment_mute_settings_modal\"}},[_c('v-card',{staticClass:\"comment-mute-settings\"},[_c('v-card-title',{staticClass:\"px-5 pt-5 pb-3 d-flex align-center font-weight-bold\",staticStyle:{\"height\":\"60px\"}},[_c('Icon',{attrs:{\"icon\":\"heroicons-solid:filter\",\"height\":\"26px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"コメントのミュート設定\")]),_c('v-spacer'),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"d-flex align-center rounded-circle cursor-pointer px-2 py-2\",on:{\"click\":function($event){_vm.comment_mute_settings_modal = false}}},[_c('Icon',{attrs:{\"icon\":\"fluent:dismiss-12-filled\",\"width\":\"23px\",\"height\":\"23px\"}})],1)],1),_c('div',{staticClass:\"px-5 pb-5\"},[_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold mt-4\"},[_c('Icon',{attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"24px\",\"height\":\"20px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"クイック設定\")])],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_vulgar_comments\"}},[_vm._v(\" 露骨な表現を含むコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_vulgar_comments\"}},[_vm._v(\" 性的な単語などの露骨・下品な表現を含むコメントを、一括でミュートするかを設定します。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_vulgar_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_vulgar_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_vulgar_comments\", $$v)},expression:\"settingsStore.settings.mute_vulgar_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_abusive_discriminatory_prejudiced_comments\"}},[_vm._v(\" ネガティブな表現、差別的な表現、政治的に偏った表現を含むコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_abusive_discriminatory_prejudiced_comments\"}},[_vm._v(\" 『死ね』『殺す』などのネガティブな表現、特定の国や人々への差別的な表現、政治的に偏った表現を含むコメントを、一括でミュートするかを設定します。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_abusive_discriminatory_prejudiced_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_abusive_discriminatory_prejudiced_comments\", $$v)},expression:\"settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_big_size_comments\"}},[_vm._v(\" 文字サイズが大きいコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_big_size_comments\"}},[_vm._v(\" 通常より大きい文字サイズで表示されるコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" 文字サイズが大きいコメントには迷惑なコメントが多いです。基本的にはオンにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_big_size_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_big_size_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_big_size_comments\", $$v)},expression:\"settingsStore.settings.mute_big_size_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_fixed_comments\"}},[_vm._v(\" 映像の上下に固定表示されるコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_fixed_comments\"}},[_vm._v(\" 映像の上下に固定された状態で表示されるコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" 固定表示されるコメントが煩わしい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_fixed_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_fixed_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_fixed_comments\", $$v)},expression:\"settingsStore.settings.mute_fixed_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_colored_comments\"}},[_vm._v(\" 色付きのコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_colored_comments\"}},[_vm._v(\" 白以外の色で表示される色付きのコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" この設定をオンにしておくと、目立つ色のコメントを一掃できます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_colored_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_colored_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_colored_comments\", $$v)},expression:\"settingsStore.settings.mute_colored_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_consecutive_same_characters_comments\"}},[_vm._v(\" 8文字以上同じ文字が連続しているコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_consecutive_same_characters_comments\"}},[_vm._v(\" 『wwwwwwwwwww』『あばばばばばばばばば』など、8文字以上同じ文字が連続しているコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" しばしばあるテンプレコメントが煩わしい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_consecutive_same_characters_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_consecutive_same_characters_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_consecutive_same_characters_comments\", $$v)},expression:\"settingsStore.settings.mute_consecutive_same_characters_comments\"}})],1),_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold mt-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:comment-dismiss-20-filled\",\"width\":\"24px\"}}),_c('span',{staticClass:\"ml-2 mr-2\"},[_vm._v(\"ミュート済みのキーワード\")]),_c('v-btn',{staticClass:\"ml-auto\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.settingsStore.settings.muted_comment_keywords.push({match: 'partial', pattern: ''})}}},[_c('Icon',{attrs:{\"icon\":\"fluent:add-12-filled\",\"height\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"追加\")])],1)],1),_c('div',{staticClass:\"muted-comment-items\"},_vm._l((_vm.settingsStore.settings.muted_comment_keywords),function(muted_comment_keyword,index){return _c('div',{key:index,staticClass:\"muted-comment-item\"},[_c('v-text-field',{staticClass:\"muted-comment-item__input\",attrs:{\"type\":\"search\",\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"ミュートするキーワードを入力\"},model:{value:(_vm.settingsStore.settings.muted_comment_keywords[index].pattern),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings.muted_comment_keywords[index], \"pattern\", $$v)},expression:\"settingsStore.settings.muted_comment_keywords[index].pattern\"}}),_c('v-select',{staticClass:\"muted-comment-item__match-type\",attrs:{\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\",\"items\":_vm.muted_comment_keyword_match_type},model:{value:(_vm.settingsStore.settings.muted_comment_keywords[index].match),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings.muted_comment_keywords[index], \"match\", $$v)},expression:\"settingsStore.settings.muted_comment_keywords[index].match\"}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"muted-comment-item__delete-button\",on:{\"click\":function($event){_vm.settingsStore.settings.muted_comment_keywords\n .splice(_vm.settingsStore.settings.muted_comment_keywords.indexOf(muted_comment_keyword), 1)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:delete-16-filled\",\"width\":\"20px\"}})],1)],1)}),0),_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold mt-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-prohibited-20-filled\",\"width\":\"24px\"}}),_c('span',{staticClass:\"ml-2 mr-2\"},[_vm._v(\"ミュート済みのニコニコユーザー ID\")]),_c('v-btn',{staticClass:\"ml-auto\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.settingsStore.settings.muted_niconico_user_ids.push('')}}},[_c('Icon',{attrs:{\"icon\":\"fluent:add-12-filled\",\"height\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"追加\")])],1)],1),_c('div',{staticClass:\"muted-comment-items\"},_vm._l((_vm.settingsStore.settings.muted_niconico_user_ids),function(muted_niconico_user_id,index){return _c('div',{key:index,staticClass:\"muted-comment-item\"},[_c('v-text-field',{staticClass:\"muted-comment-item__input\",attrs:{\"type\":\"search\",\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"ミュートするニコニコユーザー ID を入力\"},model:{value:(_vm.settingsStore.settings.muted_niconico_user_ids[index]),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings.muted_niconico_user_ids, index, $$v)},expression:\"settingsStore.settings.muted_niconico_user_ids[index]\"}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"muted-comment-item__delete-button\",on:{\"click\":function($event){_vm.settingsStore.settings.muted_niconico_user_ids\n .splice(_vm.settingsStore.settings.muted_niconico_user_ids.indexOf(muted_niconico_user_id), 1)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:delete-16-filled\",\"width\":\"20px\"}})],1)],1)}),0)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue, { PropType } from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\n\nexport default Vue.extend({\n name: 'CommentMuteSettings',\n // カスタム v-model を実装する\n // ref: https://jp.vuejs.org/v2/guide/components-custom-events.html\n model: {\n prop: 'showing', // v-model で渡された値が \"showing\" props に入る\n event: 'change', // \"change\" イベントで親コンポーネントに反映\n },\n props: {\n // コメントのミュート設定のモーダルを表示するか\n showing: {\n type: Boolean as PropType,\n required: true,\n }\n },\n data() {\n return {\n\n // インターバルのタイマー ID\n interval_timer_id: 0,\n\n // コメントのミュート設定のモーダルを表示するか\n comment_mute_settings_modal: false,\n\n // ミュート済みのキーワードのマッチタイプ\n muted_comment_keyword_match_type: [\n {text: '部分一致', value: 'partial'},\n {text: '前方一致', value: 'forward'},\n {text: '後方一致', value: 'backward'},\n {text: '完全一致', value: 'exact'},\n {text: '正規表現', value: 'regex'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n },\n watch: {\n\n // showing (親コンポーネント側) の変更を監視し、変更されたら comment_mute_settings_modal に反映する\n showing() {\n this.comment_mute_settings_modal = this.showing as boolean;\n },\n\n // comment_mute_settings_modal (子コンポーネント側) の変更を監視し、変更されたら this.$emit() で親コンポーネントに伝える\n comment_mute_settings_modal() {\n this.$emit('change', this.comment_mute_settings_modal);\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CommentMuteSettings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CommentMuteSettings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./CommentMuteSettings.vue?vue&type=template&id=2cd59ba0&scoped=true&\"\nimport script from \"./CommentMuteSettings.vue?vue&type=script&lang=ts&\"\nexport * from \"./CommentMuteSettings.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./CommentMuteSettings.vue?vue&type=style&index=0&id=2cd59ba0&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2cd59ba0\",\n null\n \n)\n\nexport default component.exports","\nimport APIClient from '@/services/APIClient';\n\n\n/** ニコニコアカウントと連携するための認証 URL を表すインターフェイス */\nexport interface INiconicoAuthURL {\n authorization_url: string;\n}\n\n\nclass Niconico {\n\n /**\n * ニコニコアカウントと連携するための認証 URL を取得する\n * @returns 認証 URL or 認証 URL の取得に失敗した場合は null\n */\n static async fetchAuthorizationURL(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/niconico/auth');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'ニコニコアカウントとの連携用の認証 URL を取得できませんでした。');\n return null;\n }\n\n return response.data.authorization_url;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントに紐づくニコニコアカウントとの連携を解除する\n * @returns 連携解除に成功した場合は true, 失敗した場合は false\n */\n static async logoutAccount(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.delete('/niconico/logout');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'ニコニコアカウントとの連携を解除できませんでした。');\n return false;\n }\n\n return true;\n }\n}\n\nexport default Niconico;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport CommentMuteSettings from '@/components/Settings/CommentMuteSettings.vue';\nimport Niconico from '@/services/Niconico';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Jikkyo',\n components: {\n SettingsBase,\n CommentMuteSettings,\n },\n data() {\n return {\n\n // コメントのミュート設定のモーダルを表示するか\n comment_mute_settings_modal: false,\n\n // ローディング中かどうか\n is_loading: true,\n };\n },\n computed: {\n // SettingsStore / UserStore に this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ローディング状態を解除\n this.is_loading = false;\n\n // もしハッシュ (# から始まるフラグメント) に何か指定されていたら、\n // OAuth 連携のコールバックの結果が入っている可能性が高いので、パースを試みる\n // アカウント情報更新より後にしないと Snackbar がうまく表示されない\n if (location.hash !== '') {\n const params = new URLSearchParams(location.hash.replace('#', ''));\n if (params.get('status') !== null && params.get('detail') !== null) {\n // コールバックの結果を取得できたので、OAuth 連携の結果を画面に通知する\n const authorization_status = parseInt(params.get('status')!);\n const authorization_detail = params.get('detail')!;\n this.onOAuthCallbackReceived(authorization_status, authorization_detail);\n // URL からフラグメントを削除\n // ref: https://stackoverflow.com/a/49373716/17124142\n history.replaceState(null, '', ' ');\n }\n }\n },\n methods: {\n async loginNiconicoAccount() {\n\n // ログインしていない場合はエラーにする\n if (this.userStore.is_logged_in === false) {\n this.$message.warning('連携をはじめるには、KonomiTV アカウントにログインしてください。');\n return;\n }\n\n // ニコニコアカウントと連携するための認証 URL を取得\n const authorization_url = await Niconico.fetchAuthorizationURL();\n if (authorization_url === null) {\n return;\n }\n\n // モバイルデバイスではポップアップが事実上使えない (特に Safari ではブロックされてしまう) ので、素直にリダイレクトで実装する\n if (Utils.isMobileDevice() === true) {\n location.href = authorization_url;\n return;\n }\n\n // OAuth 連携のため、認証 URL をポップアップウインドウで開く\n // window.open() の第2引数はユニークなものにしておくと良いらしい\n // ref: https://qiita.com/catatsuy/items/babce8726ea78f5d25b1 (大変参考になりました)\n const popup_window = window.open(authorization_url, 'KonomiTV-OAuthPopup', Utils.getWindowFeatures());\n if (popup_window === null) {\n this.$message.error('ポップアップウインドウを開けませんでした。');\n return;\n }\n\n // 認証完了 or 失敗後、ポップアップウインドウから送信される文字列を受信\n const onMessage = async (event) => {\n\n // すでにウインドウが閉じている場合は実行しない\n if (popup_window.closed) return;\n\n // 受け取ったオブジェクトに KonomiTV-OAuthPopup キーがない or そもそもオブジェクトではない際は実行しない\n // ブラウザの拡張機能から結構余計な message が飛んでくるっぽい…。\n if (Utils.typeof(event.data) !== 'object') return;\n if (('KonomiTV-OAuthPopup' in event.data) === false) return;\n\n // 認証は完了したので、ポップアップウインドウを閉じ、リスナーを解除する\n if (popup_window) popup_window.close();\n window.removeEventListener('message', onMessage);\n\n // ステータスコードと詳細メッセージを取得\n const authorization_status = event.data['KonomiTV-OAuthPopup']['status'] as number;\n const authorization_detail = event.data['KonomiTV-OAuthPopup']['detail'] as string;\n this.onOAuthCallbackReceived(authorization_status, authorization_detail);\n };\n\n // postMessage() を受信するリスナーを登録\n window.addEventListener('message', onMessage);\n },\n\n async onOAuthCallbackReceived(authorization_status: number, authorization_detail: string) {\n console.log(`NiconicoAuthCallbackAPI: Status: ${authorization_status} / Detail: ${authorization_detail}`);\n\n // OAuth 連携に失敗した\n if (authorization_status !== 200) {\n if (authorization_detail.startsWith('Authorization was denied (access_denied)')) {\n this.$message.error('ニコニコアカウントとの連携がキャンセルされました。');\n } else if (authorization_detail.startsWith('Failed to get access token (HTTP Error ')) {\n const error = authorization_detail.replace('Failed to get access token ', '');\n this.$message.error(`アクセストークンの取得に失敗しました。${error}`);\n } else if (authorization_detail.startsWith('Failed to get access token (Connection Timeout)')) {\n this.$message.error('アクセストークンの取得に失敗しました。ニコニコで障害が発生している可能性があります。');\n } else if (authorization_detail.startsWith('Failed to get user information (HTTP Error ')) {\n const error = authorization_detail.replace('Failed to get user information ', '');\n this.$message.error(`ニコニコアカウントのユーザー情報の取得に失敗しました。${error}`);\n } else if (authorization_detail.startsWith('Failed to get user information (Connection Timeout)')) {\n this.$message.error('ニコニコアカウントのユーザー情報の取得に失敗しました。ニコニコで障害が発生している可能性があります。');\n } else {\n this.$message.error(`ニコニコアカウントとの連携に失敗しました。(${authorization_detail})`);\n }\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n\n this.$message.success('ニコニコアカウントと連携しました。');\n },\n\n async logoutNiconicoAccount() {\n\n // ニコニコアカウント連携解除 API にリクエスト\n const result = await Niconico.logoutAccount();\n if (result === false) {\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n\n this.$message.success('ニコニコアカウントとの連携を解除しました。');\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Jikkyo.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Jikkyo.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Jikkyo.vue?vue&type=template&id=3ff16abd&scoped=true&\"\nimport script from \"./Jikkyo.vue?vue&type=script&lang=ts&\"\nexport * from \"./Jikkyo.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Jikkyo.vue?vue&type=style&index=0&id=3ff16abd&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3ff16abd\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:server-surface-16-filled\",\"width\":\"22px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"サーバー設定\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"鋭意開発中…\")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport Vue from 'vue';\n\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Server',\n components: {\n SettingsBase,\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Server.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Server.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Server.vue?vue&type=template&id=7cf86dbd&\"\nimport script from \"./Server.vue?vue&type=script&lang=ts&\"\nexport * from \"./Server.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"22px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"Twitter\")])],1),_c('div',{staticClass:\"settings__content\",class:{'settings__content--loading': _vm.is_loading}},[_c('div',{staticClass:\"twitter-accounts\"},[(_vm.userStore.user !== null && _vm.userStore.user.twitter_accounts.length > 0)?_c('div',{staticClass:\"twitter-accounts__heading\"},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:person-board-20-filled\",\"height\":\"30\"}}),_vm._v(\"連携中のアカウント \")],1):_vm._e(),(_vm.userStore.user === null || _vm.userStore.user.twitter_accounts.length === 0)?_c('div',{staticClass:\"twitter-accounts__guide\"},[_c('Icon',{staticClass:\"flex-shrink-0\",attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"45px\"}}),_c('div',{staticClass:\"ml-4\"},[_c('div',{staticClass:\"font-weight-bold text-h6\"},[_vm._v(\"Twitter アカウントと連携していません\")]),_c('div',{staticClass:\"text--text text--darken-1 text-subtitle-2 mt-1\"},[_vm._v(\" Twitter アカウントと連携すると、テレビを見ながら Twitter にツイートしたり、ほかの実況ツイートをリアルタイムで表示できるようになります。 \")])])],1):_vm._e(),_vm._l(((_vm.userStore.user !== null ? _vm.userStore.user.twitter_accounts: [])),function(twitter_account){return _c('div',{key:twitter_account.id,staticClass:\"twitter-account\"},[_c('img',{staticClass:\"twitter-account__icon\",attrs:{\"src\":twitter_account.icon_url}}),_c('div',{staticClass:\"twitter-account__info\"},[_c('div',{staticClass:\"twitter-account__info-name\"},[_c('span',{staticClass:\"twitter-account__info-name-text\"},[_vm._v(_vm._s(twitter_account.name))])]),_c('span',{staticClass:\"twitter-account__info-screen-name\"},[_vm._v(\" @\"+_vm._s(twitter_account.screen_name)+\" \"),(twitter_account.is_oauth_session === true)?_c('span',[_vm._v(\"(Legacy Session)\")]):_vm._e()])]),_c('v-btn',{staticClass:\"twitter-account__logout ml-auto\",attrs:{\"width\":\"124\",\"height\":\"52\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.logoutTwitterAccount(twitter_account.screen_name)}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-disconnected-20-filled\",\"height\":\"24\"}}),_vm._v(\"連携解除 \")],1)],1)}),_c('v-btn',{staticClass:\"twitter-account__login\",attrs:{\"color\":\"secondary\",\"max-width\":\"250\",\"height\":\"50\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.loginTwitterAccountWithPasswordForm()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-connected-20-filled\",\"height\":\"24\"}}),_vm._v(\"連携するアカウントを追加 \")],1),_c('v-dialog',{attrs:{\"max-width\":\"600\"},model:{value:(_vm.twitter_password_auth_dialog),callback:function ($$v) {_vm.twitter_password_auth_dialog=$$v},expression:\"twitter_password_auth_dialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"justify-center pt-6 font-weight-bold\"},[_vm._v(\"Twitter にログイン\")]),_c('v-card-text',{staticClass:\"pt-2 pb-0\"},[_c('p',{staticClass:\"mb-1\"},[_vm._v(\"2023/07 以降、Twitter のサードパーティー API の事実上の廃止により、従来のアプリ連携では Twitter にアクセスできなくなりました。\")]),_c('p',{staticClass:\"mb-1\"},[_vm._v(\"そこで KonomiTV では、代わりに \"),_c('a',{attrs:{\"href\":\"https://github.com/tsukumijima/tweepy-authlib\",\"target\":\"_blank\"}},[_vm._v(\"ユーザー名とパスワードでログイン\")]),_vm._v(\" することで、これまで通り Twitter 連携ができるようにしています (2要素認証を設定しているアカウントには対応していません) 。\")]),_c('p',{staticClass:\"mb-1\"},[_vm._v(\"ここで入力したパスワードは一切保存されず、取得した Cookie セッションはローカルの KonomiTV サーバーにのみ保存されます。Cookie セッションが Twitter API 以外の外部サービスに送信されることはありません。\")]),_c('p',{staticClass:\"mb-1\"},[_vm._v(\"万全は期していますが、非公式な方法のため、使い方次第ではアカウントにペナルティが適用される可能性もあります。自己の責任のもとでご利用ください。\")]),_c('v-form',{ref:\"twitter_form\",staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('v-text-field',{ref:\"twitter_screen_name\",staticClass:\"settings__item-form mt-6\",attrs:{\"outlined\":\"\",\"label\":\"ユーザー名 (@ から始まる ID)\",\"placeholder\":\"screen_name\",\"dense\":_vm.is_form_dense,\"rules\":[(value) => !!value || 'ユーザー名を入力してください。']},model:{value:(_vm.twitter_screen_name),callback:function ($$v) {_vm.twitter_screen_name=$$v},expression:\"twitter_screen_name\"}}),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"label\":\"パスワード\",\"dense\":_vm.is_form_dense,\"type\":_vm.twitter_password_showing ? 'text' : 'password',\"append-icon\":_vm.twitter_password_showing ? 'mdi-eye' : 'mdi-eye-off',\"rules\":[(value) => !!value || 'パスワードを入力してください。']},on:{\"click:append\":function($event){_vm.twitter_password_showing = !_vm.twitter_password_showing}},model:{value:(_vm.twitter_password),callback:function ($$v) {_vm.twitter_password=$$v},expression:\"twitter_password\"}})],1)],1),_c('v-card-actions',{staticClass:\"pt-0 px-6 pb-5\"},[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"text\",\"height\":\"40\",\"text\":\"\"},on:{\"click\":function($event){_vm.twitter_password_auth_dialog = false}}},[_vm._v(\"キャンセル\")]),_c('v-btn',{staticClass:\"px-4\",attrs:{\"color\":\"secondary\",\"height\":\"40\"},on:{\"click\":function($event){return _vm.loginTwitterAccountWithPassword()}}},[_vm._v(\"ログイン\")])],1)],1)],1)],2),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"fold_panel_after_sending_tweet\"}},[_vm._v(\"ツイート送信後にパネルを折りたたむ\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"fold_panel_after_sending_tweet\"}},[_vm._v(\" この設定をオンにすると、ツイートを送信した後に、パネルが自動で折りたたまれます。\"),_c('br'),_vm._v(\" ツイートするとき以外はできるだけ映像を大きくして見たい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"fold_panel_after_sending_tweet\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.fold_panel_after_sending_tweet),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"fold_panel_after_sending_tweet\", $$v)},expression:\"settingsStore.settings.fold_panel_after_sending_tweet\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"reset_hashtag_when_program_switches\"}},[_vm._v(\"番組が切り替わったときにハッシュタグフォームをリセットする\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"reset_hashtag_when_program_switches\"}},[_vm._v(\" チャンネルを切り替えたときや、視聴中の番組が終了し次の番組の放送が開始されたときに、ハッシュタグフォームをリセットするかを設定します。\"),_c('br'),_vm._v(\" この設定をオンにしておけば、「誤って前番組のハッシュタグをつけたまま次番組の実況ツイートをしてしまう」といったミスを回避できます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"reset_hashtag_when_program_switches\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.reset_hashtag_when_program_switches),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"reset_hashtag_when_program_switches\", $$v)},expression:\"settingsStore.settings.reset_hashtag_when_program_switches\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"auto_add_watching_channel_hashtag\"}},[_vm._v(\"視聴中のチャンネルに対応する局タグを自動で追加する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"auto_add_watching_channel_hashtag\"}},[_vm._v(\" この設定をオンにすると、視聴中のチャンネルに対応する局タグ (#nhk, #tokyomx など) がハッシュタグフォームに自動で追加されます。\"),_c('br'),_vm._v(\" 現時点で、局タグは三大首都圏の地上波・BS の一部チャンネル・AT-X にのみ対応しています。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"auto_add_watching_channel_hashtag\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.auto_add_watching_channel_hashtag),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"auto_add_watching_channel_hashtag\", $$v)},expression:\"settingsStore.settings.auto_add_watching_channel_hashtag\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"デフォルトで表示される Twitter タブ内のタブ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 視聴画面を開いたときに、パネルの Twitter タブの中で最初に表示されるタブを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.twitter_active_tab},model:{value:(_vm.settingsStore.settings.twitter_active_tab),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"twitter_active_tab\", $$v)},expression:\"settingsStore.settings.twitter_active_tab\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"ツイートにつけるハッシュタグの位置\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" ツイート本文から見て、ハッシュタグをどの位置につけてツイートするかを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tweet_hashtag_position},model:{value:(_vm.settingsStore.settings.tweet_hashtag_position),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tweet_hashtag_position\", $$v)},expression:\"settingsStore.settings.tweet_hashtag_position\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"ツイートするキャプチャに番組タイトルの透かしを描画する\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" ツイートするキャプチャに、透かしとして視聴中の番組タイトルを描画するかを設定します。\"),_c('br'),_vm._v(\" 透かしの描画位置は 左上・右上・左下・右下 から選択できます。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tweet_capture_watermark_position},model:{value:(_vm.settingsStore.settings.tweet_capture_watermark_position),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tweet_capture_watermark_position\", $$v)},expression:\"settingsStore.settings.tweet_capture_watermark_position\"}})],1)]),_c('v-overlay',{attrs:{\"value\":_vm.is_twitter_password_auth_sending,\"z-index\":\"300\"}},[_c('v-progress-circular',{attrs:{\"color\":\"secondary\",\"indeterminate\":\"\",\"size\":\"64\"}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport Message from '@/message';\nimport APIClient from '@/services/APIClient';\n\n\n/** Twitter アカウントと連携するための認証 URL を表すインターフェイス */\nexport interface ITwitterAuthURL {\n authorization_url: string;\n}\n\n/** ツイートの送信結果を表すインターフェイス */\nexport interface ITweetResult {\n is_success: boolean;\n tweet_url?: string;\n detail: string;\n}\n\nexport interface ITwitterPasswordAuthRequest {\n screen_name: string;\n password: string;\n}\n\n\nclass Twitter {\n\n /**\n * Twitter アカウントと連携するための認証 URL を取得する\n * @returns 認証 URL or 認証 URL の取得に失敗した場合は null\n */\n static async fetchAuthorizationURL(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/twitter/auth');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'Twitter アカウントとの連携用の認証 URL を取得できませんでした。');\n return null;\n }\n\n return response.data.authorization_url;\n }\n\n\n /**\n * Twitter アカウントとパスワード認証で連携する\n * @param twitter_password_auth_request スクリーンネームとパスワード\n * @returns ログインできた場合は true, 失敗した場合は false\n */\n static async authWithPassword(twitter_password_auth_request: ITwitterPasswordAuthRequest): Promise {\n\n // API リクエストを実行\n const response = await APIClient.post('/twitter/password-auth', twitter_password_auth_request);\n\n // エラー処理\n if ('is_error' in response) {\n if (response.error.message.startsWith('Failed to authenticate with password')) {\n const error = response.error.message.match(/Message: (.+)\\)/)![1];\n Message.error(`ログインに失敗しました。${error}`);\n } else if (response.error.message.startsWith('Unexpected error occurred while authenticate with password')) {\n const error = response.error.message.match(/Message: (.+)\\)/)![1];\n Message.error(`ログインフローの途中で予期せぬエラーが発生しました。${error}`);\n } else if (response.error.message.startsWith('Failed to get user information')) {\n Message.error('Twitter アカウントのユーザー情報の取得に失敗しました。');\n } else {\n APIClient.showGenericError(response, 'Twitter アカウントとの連携に失敗しました。');\n }\n return false;\n }\n\n return true;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントに紐づく Twitter アカウントとの連携を解除する\n * @param screen_name Twitter のスクリーンネーム\n * @returns 連携解除に成功した場合は true, 失敗した場合は false\n */\n static async logoutAccount(screen_name: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.delete(`/twitter/accounts/${screen_name}`);\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'Twitter アカウントとの連携を解除できませんでした。');\n return false;\n }\n\n return true;\n }\n\n\n /**\n * ツイートを送信する\n * @param screen_name Twitter のスクリーンネーム\n * @param text ツイート本文\n * @param captures 添付するキャプチャ画像\n */\n static async sendTweet(screen_name: string, text: string, captures: Blob[]): Promise<{message: string; is_error: boolean;}> {\n\n // multipart/form-data でツイート本文と画像(選択されている場合)を送る\n const form_data = new FormData();\n form_data.append('tweet', text);\n for (const tweet_capture of captures) {\n form_data.append('images', tweet_capture);\n }\n\n // API リクエストを実行\n const response = await APIClient.post(`/twitter/accounts/${screen_name}/tweets`, form_data, {\n headers: {'Content-Type': 'multipart/form-data'},\n });\n\n // エラー処理 (API リクエスト自体に失敗した場合)\n if ('is_error' in response) {\n if (response.error.message) {\n if (Number.isNaN(response.status)) {\n return {message: `ツイートの送信に失敗しました。(${response.error.message})`, is_error: true};\n } else {\n return {message: `ツイートの送信に失敗しました。(HTTP Error ${response.status} / ${response.error.message})`, is_error: true};\n }\n } else {\n return {message: `ツイートの送信に失敗しました。(HTTP Error ${response.status})`, is_error: true};\n }\n }\n\n // 成功 or 失敗に関わらず detail の内容をそのまま通知する\n if (response.data.is_success === true) {\n // ツイート成功\n return {message: response.data.detail, is_error: false};\n } else {\n // ツイート失敗\n return {message: response.data.detail, is_error: true};\n }\n }\n}\n\nexport default Twitter;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Twitter from '@/services/Twitter';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Twitter',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // デフォルトで表示されるパネルのタブの選択肢\n twitter_active_tab: [\n {text: 'ツイート検索タブ', value: 'Search'},\n {text: 'タイムラインタブ', value: 'Timeline'},\n {text: 'キャプチャタブ', value: 'Capture'},\n ],\n\n // ツイートにつけるハッシュタグの位置の選択肢\n tweet_hashtag_position: [\n {text: 'ツイート本文の前に追加する', value: 'Prepend'},\n {text: 'ツイート本文の後に追加する', value: 'Append'},\n {text: 'ツイート本文の前に追加してから改行する', value: 'PrependWithLineBreak'},\n {text: 'ツイート本文の後に改行してから追加する', value: 'AppendWithLineBreak'},\n ],\n\n // ツイートするキャプチャに番組タイトルの透かしを描画する位置の選択肢\n tweet_capture_watermark_position: [\n {text: '透かしを描画しない', value: 'None'},\n {text: '透かしをキャプチャの左上に描画する', value: 'TopLeft'},\n {text: '透かしをキャプチャの右上に描画する', value: 'TopRight'},\n {text: '透かしをキャプチャの左下に描画する', value: 'BottomLeft'},\n {text: '透かしをキャプチャの右下に描画する', value: 'BottomRight'},\n ],\n\n // ローディング中かどうか\n is_loading: true,\n\n // パスワード認証実行中かどうか\n is_twitter_password_auth_sending: false,\n\n // パスワード認証用ダイヤログ\n twitter_password_auth_dialog: false,\n\n // Twitter のスクリーンネームとパスワード\n twitter_screen_name: '',\n twitter_password: '',\n twitter_password_showing: false,\n };\n },\n computed: {\n // SettingsStore / UserStore に this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ローディング状態を解除\n this.is_loading = false;\n },\n methods: {\n async loginTwitterAccountWithPasswordForm() {\n // ログインしていない場合はエラーにする\n if (this.userStore.is_logged_in === false) {\n this.$message.warning('連携をはじめるには、KonomiTV アカウントにログインしてください。');\n await Utils.sleep(0.01);\n this.twitter_password_auth_dialog = false;\n return;\n }\n this.twitter_password_auth_dialog = true;\n },\n\n async loginTwitterAccountWithPassword() {\n\n // バリデーションを実行\n if ((this.$refs.twitter_form as any).validate() === false) {\n return;\n }\n\n // Twitter パスワード認証 API にリクエスト\n this.is_twitter_password_auth_sending = true;\n const result = await Twitter.authWithPassword({\n screen_name: this.twitter_screen_name,\n password: this.twitter_password,\n });\n this.is_twitter_password_auth_sending = false;\n if (result === false) {\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n if (this.userStore.user === null) {\n this.$message.error('アカウント情報を取得できませんでした。');\n return;\n }\n\n // ログイン中のユーザーに紐づく Twitter アカウントのうち、一番 updated_at が新しいものを取得\n // ログインすると updated_at が更新されるため、この時点で一番 updated_at が新しいアカウントが今回連携したものだと判断できる\n // ref: https://stackoverflow.com/a/12192544/17124142 (ISO8601 のソートアルゴリズム)\n const current_twitter_account = [...this.userStore.user.twitter_accounts].sort((a, b) => {\n return (a.updated_at < b.updated_at) ? 1 : ((a.updated_at > b.updated_at) ? -1 : 0);\n })[0];\n\n this.$message.success(`Twitter @${current_twitter_account.screen_name} と連携しました。`);\n\n // フォームをリセットし、非表示にする\n (this.$refs.twitter_form as any).reset();\n this.twitter_password_auth_dialog = false;\n },\n\n async logoutTwitterAccount(screen_name: string) {\n\n // Twitter アカウント連携解除 API にリクエスト\n const result = await Twitter.logoutAccount(screen_name);\n if (result === false) {\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n\n this.$message.success(`Twitter @${screen_name} との連携を解除しました。`);\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Twitter.vue?vue&type=template&id=61fbe4ed&scoped=true&\"\nimport script from \"./Twitter.vue?vue&type=script&lang=ts&\"\nexport * from \"./Twitter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Twitter.vue?vue&type=style&index=0&id=61fbe4ed&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"61fbe4ed\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('div',{staticClass:\"channels-container channels-container--home\",class:{'channels-container--loading': _vm.is_loading}},[_c('v-tabs-fix',{staticClass:\"channels-tab\",attrs:{\"centered\":\"\"},model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned)),function([channels_type,]){return _c('v-tab',{key:channels_type,staticClass:\"channels-tab__item\"},[_vm._v(\" \"+_vm._s(channels_type)+\" \")])}),1),_c('v-tabs-items-fix',{staticClass:\"channels-list\",model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned)),function([channels_type, channels]){return _c('v-tab-item-fix',{key:channels_type,staticClass:\"channels-tabitem\"},[_c('div',{staticClass:\"channels\",class:`channels--tab-${channels_type} channels--length-${channels.length}`},[_vm._l((channels),function(channel){return _c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],key:channel.id,staticClass:\"channel\",attrs:{\"to\":`/tv/watch/${channel.display_channel_id}`}},[_c('div',{staticClass:\"channel__broadcaster\"},[_c('img',{staticClass:\"channel__broadcaster-icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${channel.display_channel_id}/logo`}}),_c('div',{staticClass:\"channel__broadcaster-content\"},[_c('span',{staticClass:\"channel__broadcaster-name\"},[_vm._v(\"Ch: \"+_vm._s(channel.channel_number)+\" \"+_vm._s(channel.name))]),_c('div',{staticClass:\"channel__broadcaster-status\"},[_c('div',{staticClass:\"channel__broadcaster-status-force\",class:`channel__broadcaster-status-force--${_vm.ChannelUtils.getChannelForceType(channel.jikkyo_force)}`},[_c('Icon',{attrs:{\"icon\":\"fa-solid:fire-alt\",\"height\":\"12px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"勢い:\")]),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(channel.jikkyo_force ?? '--'))]),_c('span',{staticStyle:{\"margin-left\":\"3px\"}},[_vm._v(\" コメ/分\")])],1),_c('div',{staticClass:\"channel__broadcaster-status-viewers ml-4\"},[_c('Icon',{attrs:{\"icon\":\"fa-solid:eye\",\"height\":\"14px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"視聴数:\")]),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(channel.viewer_count))])],1)])]),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.isPinnedChannel(channel.display_channel_id) ? 'ピン留めを外す' : 'ピン留めする'),expression:\"isPinnedChannel(channel.display_channel_id) ? 'ピン留めを外す' : 'ピン留めする'\"}],staticClass:\"channel__broadcaster-pin\",class:{'channel__broadcaster-pin--pinned': _vm.isPinnedChannel(channel.display_channel_id)},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();_vm.isPinnedChannel(channel.display_channel_id) ? _vm.removePinnedChannel(channel.display_channel_id) : _vm.addPinnedChannel(channel.display_channel_id)},\"mousedown\":function($event){$event.preventDefault();$event.stopPropagation();/* 親要素の波紋が広がらないように */}}},[_c('Icon',{attrs:{\"icon\":\"fluent:pin-20-filled\",\"width\":\"24px\"}})],1)]),_c('div',{staticClass:\"channel__program-present\"},[_c('div',{staticClass:\"channel__program-present-title-wrapper\"},[_c('span',{staticClass:\"channel__program-present-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_present, 'title'))}}),_c('span',{staticClass:\"channel__program-present-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_present)))])]),_c('span',{staticClass:\"channel__program-present-description\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_present, 'description'))}})]),_c('v-spacer'),_c('div',{staticClass:\"channel__program-following\"},[_c('div',{staticClass:\"channel__program-following-title\"},[_c('span',{staticClass:\"channel__program-following-title-decorate\"},[_vm._v(\"NEXT\")]),_c('Icon',{staticClass:\"channel__program-following-title-icon\",attrs:{\"icon\":\"fluent:fast-forward-20-filled\",\"width\":\"16px\"}}),_c('span',{staticClass:\"channel__program-following-title-text\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_following, 'title'))}})],1),_c('span',{staticClass:\"channel__program-following-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_following)))])]),_c('div',{staticClass:\"channel__progressbar\"},[_c('div',{staticClass:\"channel__progressbar-progress\",style:(`width:${_vm.ProgramUtils.getProgramProgress(channel.program_present)}%;`)})])],1)}),(channels_type === 'ピン留め' && channels.length === 0)?_c('div',{staticClass:\"pinned-container d-flex justify-center align-center w-100\"},[_c('div',{staticClass:\"d-flex justify-center align-center flex-column\"},[_c('h2',[_vm._v(\"ピン留めされているチャンネルが\"),_c('br'),_vm._v(\"ありません。\")]),_c('div',{staticClass:\"mt-4 text--text text--darken-1\"},[_vm._v(\"各チャンネルの \"),_c('Icon',{staticStyle:{\"position\":\"relative\",\"bottom\":\"-5px\"},attrs:{\"icon\":\"fluent:pin-20-filled\",\"width\":\"22px\"}}),_vm._v(\" アイコンから、よくみる\"),_c('br'),_vm._v(\"チャンネルをこのタブにピン留めできます。\")],1),_c('div',{staticClass:\"mt-2 text--text text--darken-1\"},[_vm._v(\"チャンネルをピン留めすると、\"),_c('br'),_vm._v(\"このタブが最初に表示されます。\")])])]):_vm._e()],2)])}),1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n/** 番組情報を表すインターフェイス */\nexport interface IProgram {\n id: string;\n channel_id: string;\n network_id: number;\n service_id: number;\n event_id: number;\n title: string;\n description: string;\n detail: {[key: string]: string};\n start_time: string;\n end_time: string;\n duration: number;\n is_free: boolean;\n genres: {major: string; middle: string;}[];\n video_type: string | null;\n video_codec: string | null;\n video_resolution: string | null;\n primary_audio_type: string;\n primary_audio_language: string;\n primary_audio_sampling_rate: string;\n secondary_audio_type: string | null;\n secondary_audio_language: string | null;\n secondary_audio_sampling_rate: string | null;\n}\n\n/** 番組情報を表すインターフェイスのデフォルト値 */\nexport const IProgramDefault: IProgram = {\n id: 'NID0-SID0-EID0',\n channel_id: 'NID0-SID0',\n network_id: 0,\n service_id: 0,\n event_id: 0,\n title: '取得中…',\n description: '取得中…',\n detail: {},\n start_time: '2000-01-01T00:00:00+09:00',\n end_time: '2000-01-01T00:00:00+09:00',\n duration: 0,\n is_free: true,\n genres: [],\n video_type: '映像1080i(1125i)、アスペクト比16:9 パンベクトルなし',\n video_codec: 'MPEG-2',\n video_resolution: '1080i',\n primary_audio_type: '2/0モード(ステレオ)',\n primary_audio_language: '日本語',\n primary_audio_sampling_rate: '48kHz',\n secondary_audio_type: null,\n secondary_audio_language: null,\n secondary_audio_sampling_rate: null,\n};\n\n// TODO: 番組情報 API が開発されたらここに API 定義を書く\n","\nimport APIClient from '@/services/APIClient';\nimport { IProgram, IProgramDefault } from '@/services/Programs';\n\n\n/** チャンネルタイプの型 */\nexport type ChannelType = 'GR' | 'BS' | 'CS' | 'CATV' | 'SKY' | 'STARDIGIO';\n\n// チャンネルタイプの型 (実際のチャンネルリストに表示される表現)\nexport type ChannelTypePretty = 'ピン留め' | '地デジ' | 'BS' | 'CS' | 'CATV' | 'SKY' | 'StarDigio';\n\n/** すべてのチャンネルタイプのチャンネルの情報を表すインターフェイス */\nexport interface IChannelsList {\n GR: IChannel[];\n BS: IChannel[];\n CS: IChannel[];\n CATV: IChannel[];\n SKY: IChannel[];\n STARDIGIO: IChannel[];\n}\n\n/** チャンネル情報を表すインターフェイス */\nexport interface IChannel {\n id: string;\n display_channel_id: string;\n network_id: number;\n service_id: number;\n transport_stream_id: number | null;\n remocon_id: number;\n channel_number: string;\n type: ChannelType;\n name: string;\n jikkyo_force: number | null;\n is_subchannel: boolean;\n is_radiochannel: boolean;\n is_watchable: boolean,\n is_display: boolean;\n viewer_count: number;\n program_present: IProgram | null;\n program_following: IProgram | null;\n}\n\n/** チャンネル情報を表すインターフェイスのデフォルト値 */\nexport const IChannelDefault: IChannel = {\n id: 'NID0-SID0',\n display_channel_id: 'gr000',\n network_id: 0,\n service_id: 0,\n transport_stream_id: null,\n remocon_id: 0,\n channel_number: '---',\n type: 'GR',\n name: '取得中…',\n jikkyo_force: null,\n is_subchannel: false,\n is_radiochannel: false,\n is_watchable: true,\n is_display: true,\n viewer_count: 0,\n program_present: IProgramDefault,\n program_following: IProgramDefault,\n};\n\n/** ニコニコ実況のセッション情報を表すインターフェイス */\nexport interface IJikkyoSession {\n is_success: boolean;\n audience_token: string | null;\n detail: string;\n}\n\n\nclass Channels {\n\n /**\n * すべてのチャンネルの情報を取得する\n * @return すべてのチャンネルの情報\n */\n static async fetchAll(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/channels');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'チャンネル情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 指定したチャンネルの情報を取得する\n * 現状、処理の見直しにより使用されていない\n * @param display_channel_id チャンネル ID\n * @return 指定したチャンネルの情報\n */\n static async fetch(display_channel_id: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get(`/channels/${display_channel_id}`);\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'チャンネル情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 指定したチャンネルに紐づくニコニコ実況のセッション情報を取得する\n * @param display_channel_id チャンネル ID\n * @return 指定したチャンネルに紐づくニコニコ実況のセッション情報\n */\n static async fetchJikkyoSession(display_channel_id: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get(`/channels/${display_channel_id}/jikkyo`);\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'ニコニコ実況のセッション情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n}\n\nexport default Channels;\n","\nimport { defineStore } from 'pinia';\nimport Vue from 'vue';\n\nimport Channels, { ChannelType, ChannelTypePretty, IChannelsList, IChannel, IChannelDefault } from '@/services/Channels';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { ChannelUtils } from '@/utils';\n\n\n/**\n * TV ホーム画面と TV 視聴画面の両方のページでチャンネル情報を共有するためのストア\n * チャンネル情報の API からの取得はかなり重めなので、ページ遷移時に毎回 API リクエストを行うのはパフォーマンスが悪い\n * チャンネル情報をストアに格納しておくことで、TV ホーム画面から TV 視聴画面に遷移したときのパフォーマンスが向上する\n */\nconst useChannelsStore = defineStore('channels', {\n state: () => ({\n\n // 現在視聴中のチャンネルの ID (ex: gr011)\n // 視聴画面のみ有効で、ホーム画面では利用されない\n display_channel_id: 'gr000' as string,\n\n // すべてのチャンネルタイプのチャンネルリスト\n channels_list: {\n GR: [],\n BS: [],\n CS: [],\n CATV: [],\n SKY: [],\n STARDIGIO: [],\n } as IChannelsList,\n\n // 初回のチャンネル情報更新が実行された後かどうか\n is_channels_list_initial_updated: false,\n\n // 最終更新日時 (UNIX タイムスタンプ、秒単位)\n last_updated_at: 0,\n }),\n getters: {\n\n /**\n * ライブ視聴画面を表示中かどうか\n * チャンネル情報がセットされているかどうかで判定できる\n */\n is_showing_live(): boolean {\n return this.display_channel_id !== 'gr000';\n },\n\n /**\n * 前・現在・次のチャンネル情報 (視聴画面用)\n * チャンネル情報はデータ量がかなり多いので、個別に取得するより一気に取得したほうがループ回数が少なくなりパフォーマンスが良い\n */\n channel(): {previous: IChannel; current: IChannel; next: IChannel;} {\n\n // チャンネルタイプごとのチャンネル情報リストを取得する (すべてのチャンネルリストから探索するより効率的)\n const channels: IChannel[] | undefined = this.channels_list[ChannelUtils.getChannelType(this.display_channel_id)];\n\n // まだチャンネルリストの更新が終わっていないなどの場合で取得できなかった場合、\n // null を返すと UI 側でのエラー処理が大変なので、暫定的なダミーのチャンネル情報を返す\n if (channels === undefined || channels.length === 0) {\n return {\n previous: IChannelDefault,\n current: IChannelDefault,\n next: IChannelDefault,\n };\n }\n\n // 起点にするチャンネル情報があるインデックスを取得\n const current_channel_index = channels.findIndex((channel) => channel.display_channel_id === this.display_channel_id);\n\n // インデックスが取得できなかった場合も同様に、暫定的なダミーのチャンネル情報を返す\n if (current_channel_index === -1) {\n const IProgramError = {\n ...IChannelDefault.program_present,\n display_channel_id: 'gr999',\n title: 'チャンネル情報取得エラー',\n description: 'このチャンネル ID のチャンネル情報は存在しません。',\n };\n const IChannelError = {\n ...IChannelDefault,\n display_channel_id: 'gr999', // チャンネル情報が存在しないことを示す特殊なチャンネル ID\n name: 'ERROR',\n program_present: IProgramError,\n program_following: IProgramError,\n };\n return {\n previous: IChannelError as IChannel,\n current: IChannelError as IChannel,\n next: IChannelError as IChannel,\n };\n }\n\n // 前のインデックスを取得する\n // インデックスがマイナスになった時は、最後のインデックスに巻き戻す\n // channel.is_display が true のチャンネルに到達するまで続ける\n const previous_channel_index = ((): number => {\n let index = current_channel_index - 1;\n while (channels.length) {\n if (index <= -1) {\n index = channels.length - 1; // 最後のインデックス\n }\n if (channels[index].is_display) {\n return index;\n }\n index--;\n }\n return 0;\n })();\n\n // 次のインデックスを取得する\n // インデックスが配列の長さを超えた時は、最初のインデックスに巻き戻す\n // channel.is_display が true のチャンネルに到達するまで続ける\n const next_channel_index = ((): number => {\n let index = current_channel_index + 1;\n while (channels.length) {\n if (index >= channels.length) {\n index = 0; // 最初のインデックス\n }\n if (channels[index].is_display) {\n return index;\n }\n index++;\n }\n return 0;\n })();\n\n // 前・現在・次のチャンネル情報を返す\n return {\n previous: channels[previous_channel_index],\n current: channels[current_channel_index],\n next: channels[next_channel_index],\n };\n },\n\n /**\n * 実際に表示されるチャンネルリストを表すデータ\n * ピン留めチャンネルのタブを追加するほか、放送していないサブチャンネルはピン留めタブを含めて表示から除外される\n * また、チャンネルが1つもないチャンネルタイプのタブも表示から除外される\n * (たとえば SKY (スカパー!プレミアムサービス) のタブは、SKY に属すチャンネルが1つもない(=受信できない)なら表示されない)\n */\n channels_list_with_pinned(): Map {\n\n const settings_store = useSettingsStore();\n\n // 事前に Map を定義しておく\n // Map にしていたのは、確か連想配列の順序を保証してくれるからだったはず\n const channels_list_with_pinned = new Map();\n channels_list_with_pinned.set('ピン留め', []);\n channels_list_with_pinned.set('地デジ', []);\n\n // 初回のチャンネル情報更新がまだ実行されていない or 実行中のときは最低限のこの2つだけで返す\n if (this.is_channels_list_initial_updated === false) {\n return channels_list_with_pinned;\n }\n\n channels_list_with_pinned.set('BS', []);\n channels_list_with_pinned.set('CS', []);\n channels_list_with_pinned.set('CATV', []);\n channels_list_with_pinned.set('SKY', []);\n channels_list_with_pinned.set('StarDigio', []);\n\n // channels_list に格納されているすべてのチャンネルに対しループを回し、\n // 順次 channels_list_with_pinned に追加していく\n // 1つのチャンネルに対するループ回数が少なくなる分、毎回 filter() や find() するよりも高速になるはず\n for (const [channel_type, channels] of Object.entries(this.channels_list)) {\n for (const channel of channels) {\n\n // 放送していないサブチャンネルは除外\n if (channel.is_display === false) {\n continue;\n }\n\n // ピン留めしているチャンネルの ID (ex: gr011) が入るリストに含まれていたら、ピン留めタブに追加\n if (settings_store.settings.pinned_channel_ids.includes(channel.display_channel_id)) {\n channels_list_with_pinned.get('ピン留め')?.push(channel);\n }\n\n // チャンネルタイプごとに分類\n switch (channel.type) {\n case 'GR': {\n channels_list_with_pinned.get('地デジ')?.push(channel);\n break;\n }\n case 'BS': {\n channels_list_with_pinned.get('BS')?.push(channel);\n break;\n }\n case 'CS': {\n channels_list_with_pinned.get('CS')?.push(channel);\n break;\n }\n case 'CATV': {\n channels_list_with_pinned.get('CATV')?.push(channel);\n break;\n }\n case 'SKY': {\n channels_list_with_pinned.get('SKY')?.push(channel);\n break;\n }\n case 'STARDIGIO': {\n channels_list_with_pinned.get('StarDigio')?.push(channel);\n break;\n }\n }\n }\n }\n\n // ピン留めチャンネルを追加順に並び替える\n for (const channel of [...channels_list_with_pinned.get('ピン留め')!]) {\n const index = settings_store.settings.pinned_channel_ids.indexOf(channel.display_channel_id);\n channels_list_with_pinned.get('ピン留め')![index] = channel;\n }\n\n // 最後に、チャンネルが1つもないチャンネルタイプのタブを除外する (ピン留めタブを除く)\n for (const [channel_type, channels] of channels_list_with_pinned) {\n if (channel_type === 'ピン留め') {\n continue;\n }\n if (channels.length === 0) {\n channels_list_with_pinned.delete(channel_type);\n }\n }\n\n // ただし、this.channels_list_with_pinned 全体が空でもうピン留めタブしか残っていない場合は、ピン留めタブも削除する\n if (channels_list_with_pinned.size === 1 && channels_list_with_pinned.has('ピン留め')) {\n channels_list_with_pinned.delete('ピン留め');\n }\n\n return channels_list_with_pinned;\n },\n\n /**\n * 視聴画面向けの channels_list_with_pinned\n * 視聴画面ではピン留めされているチャンネルが1つもないときは、ピン留めタブを表示する必要性がないため削除される\n */\n channels_list_with_pinned_for_watch(): Map {\n const channels_list_with_pinned = new Map([...this.channels_list_with_pinned]);\n if (channels_list_with_pinned.get('ピン留め')?.length === 0) {\n channels_list_with_pinned.delete('ピン留め');\n }\n return channels_list_with_pinned;\n }\n },\n actions: {\n\n /**\n * 指定されたチャンネル ID のチャンネル情報を取得する\n * @param display_channel_id 取得するチャンネル ID (ex: gr011)\n * @returns チャンネル情報\n */\n getChannel(display_channel_id: string): IChannel | null {\n\n // チャンネルタイプごとのチャンネル情報リストを取得する (すべてのチャンネルリストから探索するより効率的)\n const channels = this.channels_list[ChannelUtils.getChannelType(display_channel_id)];\n if (channels === undefined) {\n return null;\n }\n\n // チャンネル ID が一致するチャンネル情報を返す\n return channels.find(channel => channel.display_channel_id === display_channel_id) ?? null;\n },\n\n /**\n * チャンネルタイプとリモコン番号からチャンネル情報を取得する\n * @param channel_type チャンネルタイプ\n * @param remocon_id リモコン番号\n * @returns チャンネル情報 (見つからなかった場合は null)\n */\n getChannelByRemoconID(channel_type: ChannelType, remocon_id: number): IChannel | null {\n\n // 指定されたチャンネルタイプのチャンネルを取得\n const channels = this.channels_list[channel_type];\n\n // リモコン番号が一致するチャンネルを取得\n const channel = channels.find((channel) => channel.remocon_id === remocon_id);\n\n // リモコン番号が一致するチャンネルを見つけられなかった場合は null を返す\n return channel ?? null;\n },\n\n /**\n * 指定されたチャンネル ID のチャンネル情報を更新する\n * 今のところ viewer_count (視聴者数) を更新する目的でしか使っていない\n * @param display_channel_id 更新するチャンネル ID (ex: gr011)\n * @param channel 更新後のチャンネル情報\n */\n updateChannel(display_channel_id: string, channel: IChannel): void {\n\n // チャンネルタイプごとのチャンネル情報リストを取得する (すべてのチャンネルリストから探索するより効率的)\n const channel_type = ChannelUtils.getChannelType(display_channel_id);\n if (this.channels_list[channel_type] === undefined) {\n return;\n }\n\n // チャンネル ID が一致するチャンネル情報を更新する\n const index = this.channels_list[channel_type].findIndex(channel => channel.display_channel_id === display_channel_id);\n if (index === -1) {\n return;\n }\n // リアクティブにするために Vue.set を使う\n Vue.set(this.channels_list[channel_type], index, channel);\n },\n\n /**\n * チャンネルリストを更新する\n * @param force 強制的に更新するかどうか\n */\n async update(force: boolean = false): Promise {\n\n const update = async () => {\n\n // 最新のすべてのチャンネルの情報を取得\n const channels_list = await Channels.fetchAll();\n if (channels_list === null) {\n return;\n }\n\n this.channels_list = channels_list;\n this.is_channels_list_initial_updated = true;\n this.last_updated_at = Utils.time();\n };\n\n // すでに取得されている場合は更新しない\n if (this.is_channels_list_initial_updated === true && force === false) {\n\n // ただし、最終更新日時が1分以上前の場合は非同期で更新する\n if (Utils.time() - this.last_updated_at > 60) {\n update();\n }\n\n return;\n }\n\n // チャンネルリストの更新を行う\n await update();\n }\n }\n});\n\nexport default useChannelsStore;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { ChannelUtils, ProgramUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'TV-Home',\n components: {\n Header,\n Navigation,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ChannelUtils: ChannelUtils,\n ProgramUtils: ProgramUtils,\n\n // タブの状態管理\n tab: null as number | null,\n\n // ローディング中かどうか\n is_loading: true,\n\n // インターバル ID\n // ページ遷移時に setInterval(), setTimeout() の実行を止めるのに使う\n // setInterval(), setTimeout() の返り値を登録する\n interval_ids: [] as number[],\n };\n },\n computed: {\n // ChannelsStore / SettingsStore に this.channelsStore / this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore, useSettingsStore),\n },\n // 開始時に実行\n async created() {\n\n // ピン留めされているチャンネルの ID が空なら、タブを地デジタブに切り替える\n // ピン留めができる事を示唆するためにピン留めタブ自体は残す\n if (this.settingsStore.settings.pinned_channel_ids.length === 0) {\n this.tab = 1;\n }\n\n // 00秒までの残り秒数を取得\n // 現在 16:01:34 なら 26 (秒) になる\n const residue_second = 60 - new Date().getSeconds();\n\n // 00秒になるまで待ってから実行するタイマー\n // 番組は基本1分単位で組まれているため、20秒や45秒など中途半端な秒数で更新してしまうと番組情報の反映が遅れてしまう\n this.interval_ids.push(window.setTimeout(() => {\n\n // この時点で00秒なので、チャンネル情報を更新\n this.channelsStore.update(true);\n\n // 以降、30秒おきにチャンネル情報を更新\n this.interval_ids.push(window.setInterval(() => this.channelsStore.update(true), 30 * 1000));\n\n }, residue_second * 1000));\n\n // チャンネル情報を更新 (初回)\n await this.channelsStore.update();\n\n // 少しだけ待つ\n // v-tabs-slider-wrapper をアニメーションさせないために必要\n await Utils.sleep(0.01);\n\n // この時点でピン留めされているチャンネルがないなら、タブを地デジタブに切り替える\n // ピン留めされているチャンネル自体はあるが、現在放送されていないため表示できない場合に備える\n if (this.channelsStore.channels_list_with_pinned.get('ピン留め')?.length === 0) {\n this.tab = 1;\n }\n\n // チャンネル情報の更新が終わったタイミングでローディング状態を解除する\n this.is_loading = false;\n },\n // 終了前に実行\n beforeDestroy() {\n\n // clearInterval() ですべての setInterval(), setTimeout() の実行を止める\n // clearInterval() と clearTimeout() は中身共通なので問題ない\n for (const interval_id of this.interval_ids) {\n window.clearInterval(interval_id);\n }\n },\n methods: {\n\n // チャンネルをピン留めする\n addPinnedChannel(display_channel_id: string) {\n\n // ピン留めするチャンネルの ID を追加 (保存は自動で行われる)\n this.settingsStore.settings.pinned_channel_ids.push(display_channel_id);\n\n const channel = this.channelsStore.getChannel(display_channel_id);\n if (channel) {\n this.$message.show(`${channel.name}をピン留めしました。`);\n }\n },\n\n // チャンネルをピン留めから外す\n removePinnedChannel(display_channel_id: string) {\n\n // ピン留めを外すチャンネルの ID を削除 (保存は自動で行われる)\n this.settingsStore.settings.pinned_channel_ids.splice(this.settingsStore.settings.pinned_channel_ids.indexOf(display_channel_id), 1);\n\n // この時点でピン留めされているチャンネルがないなら、タブを地デジタブに切り替える\n if (this.channelsStore.channels_list_with_pinned.get('ピン留め')?.length === 0) {\n this.tab = 1;\n }\n\n const channel = this.channelsStore.getChannel(display_channel_id);\n if (channel) {\n this.$message.show(`${channel.name}のピン留めを外しました。`);\n }\n },\n\n // チャンネルがピン留めされているか\n isPinnedChannel(display_channel_id: string): boolean {\n\n // 引数のチャンネルがピン留めリストに存在するかを返す\n return this.settingsStore.settings.pinned_channel_ids.includes(display_channel_id);\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=b22adce6&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=ts&\"\nexport * from \"./Home.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=b22adce6&prod&lang=scss&\"\nimport style1 from \"./Home.vue?vue&type=style&index=1&id=b22adce6&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b22adce6\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('main',{staticClass:\"watch-container\",class:{\n 'watch-container--control-display': _vm.is_control_display,\n 'watch-container--panel-display': _vm.Utils.isSmartphoneVertical() || _vm.Utils.isTabletVertical() ? true : _vm.is_panel_display,\n 'watch-container--fullscreen': _vm.is_fullscreen,\n }},[_c('nav',{staticClass:\"watch-navigation\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event)},\"touchmove\":function($event){return _vm.controlDisplayTimer($event)},\"click\":function($event){return _vm.controlDisplayTimer($event)}}},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"watch-navigation__icon\",attrs:{\"to\":\"/tv/\"}},[_c('img',{staticClass:\"watch-navigation__icon-image\",attrs:{\"src\":\"/assets/images/icon.svg\",\"width\":\"23px\"}})]),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('テレビをみる'),expression:\"'テレビをみる'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/tv/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:tv-20-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('ビデオをみる'),expression:\"'ビデオをみる'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/videos/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:movies-and-tv-20-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('番組表'),expression:\"'番組表'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/timetable/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:calendar-ltr-20-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('録画予約'),expression:\"'録画予約'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/reserves/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",staticStyle:{\"padding\":\"0.5px\"},attrs:{\"icon\":\"fluent:timer-16-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('マイリスト'),expression:\"'マイリスト'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/mylist/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"ic:round-playlist-play\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('キャプチャ'),expression:\"'キャプチャ'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/captures/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:image-multiple-24-regular\",\"width\":\"26px\"}})],1),_c('v-spacer'),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('設定'),expression:\"'設定'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/settings/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:settings-20-regular\",\"width\":\"26px\"}})],1)],1),_c('div',{staticClass:\"watch-content\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event, true)},\"touchmove\":function($event){return _vm.controlDisplayTimer($event, true)},\"click\":function($event){return _vm.controlDisplayTimer($event, true)}}},[_c('header',{staticClass:\"watch-header\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"watch-header__back-icon\",attrs:{\"to\":\"/tv/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('img',{staticClass:\"watch-header__broadcaster\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${(_vm.channelsStore.display_channel_id)}/logo`}}),_c('span',{staticClass:\"watch-header__program-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_present, 'title'))}}),_c('span',{staticClass:\"watch-header__program-time\"},[_vm._v(\" \"+_vm._s(_vm.ProgramUtils.getProgramTime(_vm.channelsStore.channel.current.program_present, true))+\" \")]),_c('v-spacer'),_c('span',{staticClass:\"watch-header__now\"},[_vm._v(_vm._s(_vm.time))])],1),_c('div',{staticClass:\"watch-player\",class:{\n 'watch-player--loading': _vm.is_loading,\n 'watch-player--virtual-keyboard-display': _vm.is_virtual_keyboard_display && _vm.Utils.hasActiveElementClass('dplayer-comment-input'),\n }},[_c('div',{staticClass:\"watch-player__background-wrapper\"},[_c('div',{staticClass:\"watch-player__background\",class:{'watch-player__background--display': _vm.is_background_display},style:({backgroundImage: `url(${_vm.background_url})`})},[_c('img',{staticClass:\"watch-player__background-logo\",attrs:{\"src\":\"/assets/images/logo.svg\"}})])]),_c('v-progress-circular',{staticClass:\"watch-player__buffering\",class:{'watch-player__buffering--display': _vm.is_video_buffering && (_vm.is_loading || (_vm.player !== null && !_vm.player.video.paused))},attrs:{\"indeterminate\":\"\",\"size\":\"60\",\"width\":\"6\"}}),_c('div',{staticClass:\"watch-player__dplayer\"}),_c('div',{staticClass:\"watch-player__button\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event)},\"touchmove\":function($event){return _vm.controlDisplayTimer($event)},\"click\":function($event){return _vm.controlDisplayTimer($event)}}},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.top\",value:('前のチャンネル'),expression:\"'前のチャンネル'\",modifiers:{\"top\":true}}],staticClass:\"switch-button switch-button-up\",on:{\"click\":function($event){_vm.is_zapping = true; _vm.$router.push({path: `/tv/watch/${_vm.channelsStore.channel.previous.display_channel_id}`})}}},[_c('Icon',{staticClass:\"switch-button-icon\",attrs:{\"icon\":\"fluent:ios-arrow-left-24-filled\",\"width\":\"32px\",\"rotate\":\"1\"}})],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"switch-button switch-button-panel switch-button-panel--open\",on:{\"click\":function($event){_vm.is_panel_display = !_vm.is_panel_display}}},[_c('Icon',{staticClass:\"switch-button-icon\",attrs:{\"icon\":\"fluent:navigation-16-filled\",\"width\":\"32px\"}})],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.bottom\",value:('次のチャンネル'),expression:\"'次のチャンネル'\",modifiers:{\"bottom\":true}}],staticClass:\"switch-button switch-button-down\",on:{\"click\":function($event){_vm.is_zapping = true; _vm.$router.push({path: `/tv/watch/${_vm.channelsStore.channel.next.display_channel_id}`})}}},[_c('Icon',{staticClass:\"switch-button-icon\",attrs:{\"icon\":\"fluent:ios-arrow-right-24-filled\",\"width\":\"33px\",\"rotate\":\"1\"}})],1)])],1)]),_c('div',{staticClass:\"watch-panel\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event)}}},[_c('div',{staticClass:\"watch-panel__header\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-close-button\",on:{\"click\":function($event){_vm.is_panel_display = false}}},[_c('Icon',{staticClass:\"panel-close-button__icon\",attrs:{\"icon\":\"akar-icons:chevron-right\",\"width\":\"25px\"}}),_c('span',{staticClass:\"panel-close-button__text\"},[_vm._v(\"閉じる\")])],1),_c('v-spacer'),_c('div',{staticClass:\"panel-broadcaster\"},[_c('img',{staticClass:\"panel-broadcaster__icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${(_vm.channelsStore.display_channel_id)}/logo`}}),_c('div',{staticClass:\"panel-broadcaster__number\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.channel_number))]),_c('div',{staticClass:\"panel-broadcaster__name\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.name))])])],1),_c('div',{staticClass:\"watch-panel__content-container\"},[_c('Program',{staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Program'}}),_c('Channel',{staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Channel'}}),_c('Comment',{ref:\"Comment\",staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Comment'},attrs:{\"channel\":_vm.channelsStore.channel.current,\"player\":_vm.player}}),_c('Twitter',{ref:\"Twitter\",staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Twitter'},attrs:{\"player\":_vm.player,\"is_virtual_keyboard_display\":_vm.is_virtual_keyboard_display},on:{\"panel_folding_requested\":function($event){_vm.is_panel_display = false}}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"watch-panel__content-remocon-button elevation-8\",class:{'watch-panel__content-remocon-button--active': _vm.tv_panel_active_tab === 'Program' || _vm.tv_panel_active_tab === 'Channel'},on:{\"click\":function($event){_vm.is_remocon_display = !_vm.is_remocon_display}}},[_c('Icon',{staticClass:\"panel-close-button__icon\",attrs:{\"icon\":\"material-symbols:remote-gen\",\"width\":\"25px\"}})],1),_c('Remocon',{staticClass:\"watch-panel__remocon\",attrs:{\"showing\":(_vm.tv_panel_active_tab === 'Program' || _vm.tv_panel_active_tab === 'Channel') && _vm.is_remocon_display === true},on:{\"close\":function($event){_vm.is_remocon_display = false}}})],1),_c('div',{staticClass:\"watch-panel__navigation\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Program'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Program'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"fa-solid:info-circle\",\"width\":\"33px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"番組情報\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Channel'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Channel'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"fa-solid:broadcast-tower\",\"width\":\"34px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"チャンネル\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Comment'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Comment'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"29px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"コメント\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Twitter'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Twitter'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"34px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"Twitter\")])],1)])])]),_c('v-dialog',{attrs:{\"max-width\":\"1050\",\"transition\":\"slide-y-transition\"},model:{value:(_vm.shortcut_key_modal),callback:function ($$v) {_vm.shortcut_key_modal=$$v},expression:\"shortcut_key_modal\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"px-5 pt-4 pb-3 d-flex align-center font-weight-bold\"},[_c('Icon',{attrs:{\"icon\":\"fluent:keyboard-20-filled\",\"height\":\"28px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"キーボードショートカット\")]),_c('v-spacer'),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"d-flex align-center rounded-circle cursor-pointer px-2 py-2\",on:{\"click\":function($event){_vm.shortcut_key_modal = false}}},[_c('Icon',{attrs:{\"icon\":\"fluent:dismiss-12-filled\",\"width\":\"23px\",\"height\":\"23px\"}})],1)],1),_c('div',{staticClass:\"px-5 pb-4\"},[_c('v-row',_vm._l((_vm.shortcut_key_list),function(shortcut_key_column,shortcut_key_column_name){return _c('v-col',{key:shortcut_key_column_name,attrs:{\"cols\":\"6\"}},_vm._l((shortcut_key_column),function(shortcut_keys){return _c('div',{key:shortcut_keys.name,staticClass:\"mt-3\"},[_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold\"},[_c('Icon',{attrs:{\"icon\":shortcut_keys.icon,\"height\":shortcut_keys.icon_height}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(_vm._s(shortcut_keys.name))])],1),_vm._l((shortcut_keys.shortcuts),function(shortcut){return _c('div',{key:shortcut.name,staticClass:\"mt-3\"},[_c('div',{staticClass:\"text-subtitle-2 mt-2 d-flex align-center font-weight-medium\"},[_c('span',{staticClass:\"mr-2\",domProps:{\"innerHTML\":_vm._s(shortcut.name)}}),_c('div',{staticClass:\"ml-auto d-flex align-center flex-shrink-0\"},_vm._l((shortcut.keys),function(key,index){return _c('div',{key:key.name,staticClass:\"ml-auto d-flex align-center\"},[_c('span',{staticClass:\"shortcut-key\"},[_vm._l((key.name.split(';')),function(key_name){return _c('Icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(key.icon === true),expression:\"key.icon === true\"}],key:key_name,attrs:{\"icon\":key_name,\"height\":\"18px\"}})}),(key.icon === false)?_c('span',{domProps:{\"innerHTML\":_vm._s(key.name)}}):_vm._e()],2),(index < (shortcut.keys.length - 1))?_c('span',{staticClass:\"shortcut-key-plus\"},[_vm._v(\"+\")]):_vm._e()])}),0)])])})],2)}),0)}),1)],1)],1)],1),_c('BottomNavigation')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"channels-container channels-container--watch\"},[_c('v-tabs-fix',{staticClass:\"channels-tab\",attrs:{\"centered\":\"\",\"show-arrows\":\"\"},model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned_for_watch)),function([channels_type,]){return _c('v-tab',{key:channels_type,staticClass:\"channels-tab__item\"},[_vm._v(\" \"+_vm._s(channels_type)+\" \")])}),1),_c('div',{staticClass:\"channels-list-container\"},[_c('v-tabs-items-fix',{staticClass:\"channels-list\",model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned_for_watch)),function([channels_type, channels]){return _c('v-tab-item-fix',{key:channels_type,staticClass:\"channels\"},_vm._l((channels),function(channel){return _c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],key:channel.id,staticClass:\"channel\",attrs:{\"to\":`/tv/watch/${channel.display_channel_id}`}},[_c('div',{staticClass:\"channel__broadcaster\"},[_c('img',{staticClass:\"channel__broadcaster-icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${channel.display_channel_id}/logo`}}),_c('div',{staticClass:\"channel__broadcaster-content\"},[_c('span',{staticClass:\"channel__broadcaster-name\"},[_vm._v(\"Ch: \"+_vm._s(channel.channel_number)+\" \"+_vm._s(channel.name))]),_c('div',{staticClass:\"channel__broadcaster-force\",class:`channel__broadcaster-force--${_vm.ChannelUtils.getChannelForceType(channel.jikkyo_force)}`},[_c('Icon',{attrs:{\"icon\":\"fa-solid:fire-alt\",\"height\":\"11px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(channel.jikkyo_force ?? '--'))])],1)])]),_c('div',{staticClass:\"channel__program-present\"},[_c('span',{staticClass:\"channel__program-present-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_present, 'title'))}}),_c('span',{staticClass:\"channel__program-present-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_present)))])]),_c('div',{staticClass:\"channel__program-following\"},[_c('div',{staticClass:\"channel__program-following-title\"},[_c('span',{staticClass:\"channel__program-following-title-decorate\"},[_vm._v(\"NEXT\")]),_c('Icon',{staticClass:\"channel__program-following-title-icon\",attrs:{\"icon\":\"fluent:fast-forward-20-filled\",\"width\":\"16px\"}}),_c('span',{staticClass:\"channel__program-following-title-text\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_following, 'title'))}})],1),_c('span',{staticClass:\"channel__program-following-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_following)))])]),_c('div',{staticClass:\"channel__progressbar\"},[_c('div',{staticClass:\"channel__progressbar-progress\",style:(`width:${_vm.ProgramUtils.getProgramProgress(channel.program_present)}%;`)})])])}),1)}),1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useChannelsStore from '@/store/ChannelsStore';\nimport Utils, { ChannelUtils, ProgramUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'Panel-ChannelTab',\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ChannelUtils: ChannelUtils,\n ProgramUtils: ProgramUtils,\n\n // タブの状態管理\n tab: null,\n };\n },\n computed: {\n // ChannelsStore に this.channelsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Channel.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Channel.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Channel.vue?vue&type=template&id=1773876a&scoped=true&\"\nimport script from \"./Channel.vue?vue&type=script&lang=ts&\"\nexport * from \"./Channel.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Channel.vue?vue&type=style&index=0&id=1773876a&prod&lang=scss&\"\nimport style1 from \"./Channel.vue?vue&type=style&index=1&id=1773876a&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1773876a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"comment-container\"},[_c('section',{staticClass:\"comment-header\"},[_c('h2',{staticClass:\"comment-header__title\"},[_c('Icon',{staticClass:\"comment-header__title-icon\",attrs:{\"icon\":\"bi:chat-left-text-fill\",\"height\":\"18.5px\"}}),_c('span',{staticClass:\"comment-header__title-text\"},[_vm._v(\"コメント\")])],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"comment-header__button ml-auto\",on:{\"click\":function($event){_vm.comment_mute_settings_modal = !_vm.comment_mute_settings_modal}}},[_c('Icon',{attrs:{\"icon\":\"heroicons-solid:filter\",\"height\":\"11px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"ミュート設定\")])],1)]),_c('section',{ref:\"comment_list_wrapper\",staticClass:\"comment-list-wrapper\"},[_c('div',{staticClass:\"comment-list-dropdown\",class:{'comment-list-dropdown--display': _vm.is_comment_list_dropdown_display},style:({'--comment-list-dropdown-top': `${_vm.comment_list_dropdown_top}px`})},[_c('v-list',{staticStyle:{\"background\":\"var(--v-background-lighten1)\"}},[_c('v-list-item',{staticStyle:{\"min-height\":\"30px\"},attrs:{\"dense\":\"\"},on:{\"click\":function($event){return _vm.addMutedKeywords()}}},[_c('v-list-item-title',{staticClass:\"d-flex align-center\"},[_c('Icon',{attrs:{\"icon\":\"fluent:comment-dismiss-20-filled\",\"width\":\"20px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"このコメントをミュート\")])],1)],1),_c('v-list-item',{staticStyle:{\"min-height\":\"30px\"},attrs:{\"dense\":\"\"},on:{\"click\":function($event){return _vm.addMutedNiconicoUserIds()}}},[_c('v-list-item-title',{staticClass:\"d-flex align-center\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-prohibited-20-filled\",\"width\":\"20px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"このコメントの投稿者をミュート\")])],1)],1)],1)],1),_c('div',{staticClass:\"comment-list-cover\",class:{'comment-list-cover--display': _vm.is_comment_list_dropdown_display},on:{\"click\":function($event){return _vm.hideCommentListDropdown()}}}),_c('DynamicScroller',{staticClass:\"comment-list\",attrs:{\"direction\":'vertical',\"items\":_vm.comment_list,\"min-item-size\":34},scopedSlots:_vm._u([{key:\"default\",fn:function({item, active}){return [_c('DynamicScrollerItem',{attrs:{\"item\":item,\"active\":active,\"size-dependencies\":[item.text]}},[_c('div',{staticClass:\"comment\",class:{'comment--my-post': item.my_post}},[_c('span',{staticClass:\"comment__text\"},[_vm._v(_vm._s(item.text))]),_c('span',{staticClass:\"comment__time\"},[_vm._v(_vm._s(item.time))]),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\",value:(!_vm.Utils.isTouchDevice()),expression:\"!Utils.isTouchDevice()\"}],staticClass:\"comment__icon\",on:{\"mouseup\":function($event){return _vm.showCommentListDropdown($event, item)},\"touchend\":function($event){return _vm.showCommentListDropdown($event, item)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:more-vertical-20-filled\",\"width\":\"20px\"}})],1)])])]}}])}),(_vm.initialize_failed_message === null && _vm.comment_list.length === 0)?_c('div',{staticClass:\"comment-announce\"},[_c('div',{staticClass:\"comment-announce__heading\"},[_vm._v(\"まだコメントがありません。\")]),_vm._m(0)]):_vm._e(),(_vm.initialize_failed_message !== null && _vm.comment_list.length === 0)?_c('div',{staticClass:\"comment-announce\"},[_c('div',{staticClass:\"comment-announce__heading\"},[_vm._v(\"コメントがありません。\")]),_c('div',{staticClass:\"comment-announce__text\"},[_c('p',{staticClass:\"mt-0 mb-0\"},[_vm._v(_vm._s(_vm.initialize_failed_message))])])]):_vm._e()],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"comment-scroll-button elevation-5\",class:{'comment-scroll-button--display': _vm.is_manual_scroll},on:{\"click\":function($event){_vm.is_manual_scroll = false; _vm.scrollCommentList(true);}}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-down-12-filled\",\"height\":\"29px\"}})],1),_c('CommentMuteSettings',{model:{value:(_vm.comment_mute_settings_modal),callback:function ($$v) {_vm.comment_mute_settings_modal=$$v},expression:\"comment_mute_settings_modal\"}})],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"comment-announce__text\"},[_c('p',{staticClass:\"mt-0 mb-0\"},[_vm._v(\"このチャンネルに対応するニコニコ実況のコメントが、リアルタイムで表示されます。\")])])\n}]\n\nexport { render, staticRenderFns }","\nimport dayjs from 'dayjs';\nimport DPlayer, { DPlayerType } from 'dplayer';\n\nimport Channels from '@/services/Channels';\nimport Utils, { CommentUtils } from '@/utils';\n\n\nexport interface ICommentData {\n id: number;\n text: string;\n time: string;\n user_id: string;\n my_post: boolean;\n}\n\ninterface IWatchSessionResult {\n is_success: boolean;\n detail: string;\n message_server_url?: string;\n thread_id?: string;\n your_post_key?: string;\n}\n\n\nclass LiveCommentManager {\n\n // 視聴セッションの WebSocket のインスタンス\n private watch_session: WebSocket | null = null;\n // コメントセッションの WebSocket のインスタンス\n private comment_session: WebSocket | null = null;\n // vpos を計算する基準となる時刻のタイムスタンプ\n private vpos_base_timestamp: number = 0;\n // 座席維持用のタイマーのインターバル ID\n private keep_seat_interval_id: number | null = null;\n // destroy() 時に EventListener を全解除するための AbortController\n private abort_controller: AbortController = new AbortController();\n\n private player: DPlayer;\n private display_channel_id: string;\n private on_initial_comments_received: (initial_comments: ICommentData[]) => void;\n private on_comment_received: (comment: ICommentData) => void;\n\n constructor(options: {\n player: DPlayer;\n display_channel_id: string;\n on_initial_comments_received: (initial_comments: ICommentData[]) => void;\n on_comment_received: (comment: ICommentData) => void;\n }) {\n this.player = options.player;\n this.display_channel_id = options.display_channel_id;\n this.on_initial_comments_received = options.on_initial_comments_received;\n this.on_comment_received = options.on_comment_received;\n }\n\n\n /**\n * ニコニコ実況に接続し、セッションを初期化する\n * 初期化に成功した場合は、随時コールバックにニコニコ実況から受信したコメントが渡される\n * @returns セッションの初期化に成功したかどうか\n */\n public async initSession(): Promise<{\n is_success: boolean;\n detail: string;\n }> {\n\n // 視聴セッションを初期化\n const watch_session_result = await this.initWatchSession();\n if (watch_session_result.is_success === false) {\n return {\n is_success: false,\n detail: watch_session_result.detail,\n };\n }\n\n // 視聴セッションを初期化できた場合のみ、\n // 取得したコメントサーバーへの接続情報を使い、非同期でコメントセッションを初期化\n this.initCommentSession(watch_session_result);\n\n return {\n is_success: true,\n detail: '視聴セッションを初期化しました。',\n };\n }\n\n\n /**\n * 視聴セッションを初期化する\n * @returns コメントサーバーへの接続情報 or エラー情報\n */\n private async initWatchSession(): Promise {\n\n // サーバーから disconnect メッセージが送られてきた際のフラグ\n let is_disconnect_message_received = false;\n\n // セッション情報を取得\n const watch_session_info = await Channels.fetchJikkyoSession(this.display_channel_id);\n if (watch_session_info === null) {\n return {\n is_success: false,\n detail: 'ニコニコ実況のセッション情報を取得できませんでした。',\n };\n }\n if (watch_session_info.is_success === false) {\n console.error(`[LiveCommentManager][WatchSession] Error: ${watch_session_info.detail}`);\n // 通常発生しないエラーメッセージ (サーバーエラーなど) はプレイヤー側にも通知する\n if ((watch_session_info.detail !== 'このチャンネルはニコニコ実況に対応していません。') &&\n (watch_session_info.detail !== '現在放送中のニコニコ実況がありません。')) {\n this.player.notice(watch_session_info.detail, undefined, undefined, '#FF6F6A');\n }\n return {\n is_success: false,\n detail: watch_session_info.detail,\n };\n }\n\n // 視聴セッション WebSocket を開く\n this.watch_session = new WebSocket(watch_session_info.audience_token!);\n\n // 視聴セッションの接続が開かれたとき\n this.watch_session.addEventListener('open', () => {\n\n // 視聴セッションをリクエスト\n // 公式ドキュメントいわく、stream フィールドは Optional らしい\n // サーバー負荷軽減のため、映像が不要な場合は必ず省略してくださいとのこと\n this.watch_session?.send(JSON.stringify({\n type: 'startWatching',\n data: {\n 'reconnect': false,\n },\n }));\n\n }, { signal: this.abort_controller.signal });\n\n // 視聴セッションの接続が閉じられたとき(ネットワークが切断された場合など)\n this.watch_session.addEventListener('close', async (event) => {\n\n // すでに disconnect メッセージが送られてきている場合は何もしない\n if (is_disconnect_message_received === true) {\n return;\n }\n\n // 接続切断の理由を表示\n console.error(`[LiveCommentManager][WatchSession] Connection closed. (Code: ${event.code})`);\n this.player.notice(`ニコニコ実況との接続が切断されました。(Code: ${event.code})`, undefined, undefined, '#FF6F6A');\n\n // 10 秒ほど待ってから再接続する\n // ニコ生側から切断された場合と異なりネットワークが切断された可能性が高いので、間を多めに取る\n await Utils.sleep(10);\n await this.reconnect();\n\n }, { signal: this.abort_controller.signal });\n\n // 視聴セッション WebSocket からメッセージを受信したとき\n // 視聴セッションはコメント送信時のために維持し続ける必要がある\n // 以下はいずれも視聴セッションを維持し続けたり、エラーが発生した際に再接続するための処理\n this.watch_session.addEventListener('message', async (event) => {\n if (this.watch_session === null) return;\n\n // 各メッセージタイプに対応する処理を実行\n const message = JSON.parse(event.data);\n switch (message.type) {\n\n // 座席情報\n case 'seat': {\n // すでにタイマーが設定されている場合は何もしない\n if (this.keep_seat_interval_id !== null) {\n break;\n }\n // keepIntervalSec の秒数ごとに keepSeat を送信して座席を維持する\n this.keep_seat_interval_id = window.setInterval(() => {\n if (this.watch_session && this.watch_session.readyState === WebSocket.OPEN) {\n // セッションがまだ開いていれば、座席を維持する\n this.watch_session.send(JSON.stringify({type: 'keepSeat'}));\n } else {\n // セッションが閉じられている場合は、タイマーを停止する\n window.clearInterval(this.keep_seat_interval_id ?? 0);\n }\n }, message.data.keepIntervalSec * 1000);\n break;\n }\n\n // ping-pong\n case 'ping': {\n // pong を返してセッションを維持する\n // 送り返さなかった場合、勝手にセッションが閉じられてしまう\n this.watch_session.send(JSON.stringify({type: 'pong'}));\n break;\n }\n\n // エラー情報\n case 'error': {\n // COMMENT_POST_NOT_ALLOWED と INVALID_MESSAGE に関しては sendComment() の方で処理するので、ここでは何もしない\n if (message.data.code === 'COMMENT_POST_NOT_ALLOWED' || message.data.code === 'INVALID_MESSAGE') {\n break;\n }\n\n let error = `ニコニコ実況でエラーが発生しています。(Code: ${message.data.code})`;\n switch (message.data.code) {\n case 'CONNECT_ERROR':\n error = 'ニコニコ実況のコメントサーバーに接続できません。';\n break;\n case 'CONTENT_NOT_READY':\n error = 'ニコニコ実況が配信できない状態です。';\n break;\n case 'NO_THREAD_AVAILABLE':\n error = 'ニコニコ実況のコメントスレッドを取得できません。';\n break;\n case 'NO_ROOM_AVAILABLE':\n error = 'ニコニコ実況のコメント部屋を取得できません。';\n break;\n case 'NO_PERMISSION':\n error = 'ニコニコ実況の API にアクセスする権限がありません。';\n break;\n case 'NOT_ON_AIR':\n error = 'ニコニコ実況が放送中ではありません。';\n break;\n case 'BROADCAST_NOT_FOUND':\n error = 'ニコニコ実況の配信情報を取得できません。';\n break;\n case 'INTERNAL_SERVERERROR':\n error = 'ニコニコ実況でサーバーエラーが発生しています。';\n break;\n }\n\n // エラー情報を表示\n console.error(`[LiveCommentManager][WatchSession] Error occurred. (Code: ${message.data.code})`);\n this.player.notice(error, undefined, undefined, '#FF6F6A');\n\n // 5 秒ほど待ってから再接続する\n await Utils.sleep(5);\n await this.reconnect();\n break;\n }\n\n // 再接続を求められた\n case 'reconnect': {\n // waitTimeSec に記載の秒数だけ待ってから再接続する\n // 公式ドキュメントには reconnect で送られてくる audienceToken で再接続しろと書いてあるんだけど、\n // 確実性的な面で実装が面倒なので当面このままにしておく\n await this.reconnect();\n break;\n }\n\n // 視聴セッションが閉じられた(4時のリセットなど)\n case 'disconnect': {\n // 実際に接続が閉じられる前に disconnect メッセージが送られてきたので、\n // WebSocket の close メッセージを実行させないようにする\n is_disconnect_message_received = true;\n\n // 接続切断の理由\n let disconnect_reason = `ニコニコ実況との接続が切断されました。(${message.data.reason})`;\n switch (message.data.reason) {\n case 'TAKEOVER':\n disconnect_reason = 'ニコニコ実況の番組から追い出されました。';\n break;\n case 'NO_PERMISSION':\n disconnect_reason = 'ニコニコ実況の番組の座席を取得できませんでした。';\n break;\n case 'END_PROGRAM':\n disconnect_reason = 'ニコニコ実況がリセットされたか、コミュニティの番組が終了しました。';\n break;\n case 'PING_TIMEOUT':\n disconnect_reason = 'コメントサーバーとの接続生存確認に失敗しました。';\n break;\n case 'TOO_MANY_CONNECTIONS':\n disconnect_reason = 'ニコニコ実況の同一ユーザからの接続数上限を越えています。';\n break;\n case 'TOO_MANY_WATCHINGS':\n disconnect_reason = 'ニコニコ実況の同一ユーザからの視聴番組数上限を越えています。';\n break;\n case 'CROWDED':\n disconnect_reason = 'ニコニコ実況の番組が満席です。';\n break;\n case 'MAINTENANCE_IN':\n disconnect_reason = 'ニコニコ実況はメンテナンス中です。';\n break;\n case 'SERVICE_TEMPORARILY_UNAVAILABLE':\n disconnect_reason = 'ニコニコ実況で一時的にサーバーエラーが発生しています。';\n break;\n }\n\n // 接続切断の理由を表示\n console.error(`[LiveCommentManager][WatchSession] Disconnected. (Reason: ${message.data.reason})`);\n this.player.notice(disconnect_reason);\n\n // 5 秒ほど待ってから再接続する\n await Utils.sleep(5);\n await this.reconnect();\n break;\n }\n }\n\n }, { signal: this.abort_controller.signal });\n\n // コメントサーバーへの接続情報を返す\n // イベント内で値を返すため、Promise で包む\n return new Promise((resolve) => {\n this.watch_session!.addEventListener('message', async (event) => {\n const message = JSON.parse(event.data);\n if (message.type === 'room') {\n\n // vpos の基準時刻のタイムスタンプを取得 (ミリ秒単位)\n // vpos は番組開始時間からの累計秒数\n this.vpos_base_timestamp = dayjs(message.data.vposBaseTime).valueOf();\n\n // コメントサーバーへの接続情報を返す\n console.log(`[LiveCommentManager][WatchSession] Connected.\\nThread ID: ${message.data.threadId}\\n`);\n return resolve({\n is_success: true,\n detail: '視聴セッションを取得しました。',\n // コメントサーバーへの接続情報\n message_server_url: message.data.messageServer.uri,\n // コメントサーバー上のスレッド ID\n thread_id: message.data.threadId,\n // メッセージサーバーから受信するコメント (chat メッセージ) に yourpost フラグを付けるためのキー\n your_post_key: (message.data.yourPostKey ? message.data.yourPostKey : null),\n });\n }\n }, { signal: this.abort_controller.signal });\n });\n }\n\n\n /**\n * コメントセッションを初期化する\n * @param comment_session_info コメントサーバーへの接続情報\n */\n private initCommentSession(comment_session_info: IWatchSessionResult): void {\n\n // 初回にドカッと送信されてくる過去コメントを受信し終えるまで格納するバッファ\n const initial_comments_buffer: ICommentData[] = [];\n\n // 初回にドカッと送信されてくる過去コメントを受信し終えたかどうかのフラグ\n let initial_comments_received = false;\n\n // コメントセッション WebSocket を開く\n this.comment_session = new WebSocket(comment_session_info.message_server_url!);\n\n // コメントセッション WebSocket を開いたとき\n this.comment_session.addEventListener('open', () => {\n if (this.comment_session === null) return;\n\n // コメント送信をリクエスト\n // このコマンドを送らないとコメントが送信されてこない\n this.comment_session.send(JSON.stringify([\n {ping: {content: 'rs:0'}},\n {ping: {content: 'ps:0'}},\n {\n thread: {\n version: '20061206', // 設定必須\n thread: comment_session_info.thread_id, // スレッド ID\n threadkey: comment_session_info.your_post_key, // スレッドキー\n user_id: '', // ユーザー ID(設定不要らしい)\n res_from: -50, // 最初にコメントを 50 個送信する\n }\n },\n {ping: {content: 'pf:0'}},\n {ping: {content: 'rf:0'}},\n ]));\n\n }, { signal: this.abort_controller.signal });\n\n // コメントセッション WebSocket からメッセージを受信したとき\n this.comment_session.addEventListener('message', async (event) => {\n\n // メッセージを取得\n const message = JSON.parse(event.data);\n\n // 接続失敗\n if (message.thread !== undefined) {\n if (message.thread.resultcode !== 0) {\n console.error(`[LiveCommentManager][CommentSession] Connection failed. (Code: ${message.thread.resultcode})`);\n return;\n }\n }\n\n // ping メッセージのみ\n // rf:0 が送られてきたら初回にドカッと送信されてくる過去コメントの受信は完了\n // この時点で初回コメントを一気にコールバックに送る\n if (message.ping !== undefined && message.ping.content === 'rf:0') {\n initial_comments_received = true;\n this.on_initial_comments_received(initial_comments_buffer);\n return;\n }\n\n // コメントデータを取得\n const comment = message.chat;\n\n // コメントデータが不正な場合 or 自分のコメントの場合は弾く\n if ((comment === undefined || comment.content === undefined || comment.content === '') ||\n (comment.yourpost && comment.yourpost === 1)) {\n return;\n }\n\n // コメントコマンドをパース\n const { color, position, size } = CommentUtils.parseCommentCommand(comment.mail);\n\n // ミュート対象のコメントかどうかを判定し、もしそうならここで弾く\n if (CommentUtils.isMutedComment(comment.content, comment.user_id, color, position, size)) {\n return;\n }\n\n // コメントリストへ追加するオブジェクト\n const comment_data: ICommentData = {\n id: comment.no,\n text: comment.content,\n time: dayjs(comment.date * 1000).format('HH:mm:ss'),\n user_id: comment.user_id,\n my_post: false,\n };\n\n // もしまだ初回コメントを受信し終えていないなら、バッファに格納して終了\n // 初回コメントはプレイヤーには描画しないため問題ない\n if (initial_comments_received === false) {\n initial_comments_buffer.push(comment_data);\n return;\n }\n\n // 配信で発生する遅延分待ってから\n // おおよその遅延時間は video.buffered.end(0) - video.currentTime で取得できる\n let buffered_end = 0;\n if (this.player.video.buffered.length >= 1) {\n buffered_end = this.player.video.buffered.end(0);\n }\n const comment_delay_time = buffered_end - this.player.video.currentTime;\n // console.log(`[LiveCommentManager][CommentSession] Delay: ${comment_delay_time} sec.`)\n await Utils.sleep(comment_delay_time);\n\n // コールバック関数を実行\n this.on_comment_received(comment_data);\n\n // プレイヤーにコメントを描画する (映像再生時のみ)\n if (this.player.video.paused === false) {\n this.player.danmaku!.draw({\n text: comment.content,\n color: color,\n type: position,\n size: size,\n });\n }\n\n }, { signal: this.abort_controller.signal });\n }\n\n\n /**\n * ニコニコ実況にコメントを送信する\n * @param options DPlayer のコメントオプション\n */\n public sendComment(options: DPlayerType.APIBackendSendOptions): void {\n\n // DPlayer 上のコメント色(カラーコード)とニコニコの色コマンド定義のマッピング\n const color_table = {\n '#FFEAEA': 'white',\n '#F02840': 'red',\n '#FD7E80': 'pink',\n '#FDA708': 'orange',\n '#FFE133': 'yellow',\n '#64DD17': 'green',\n '#00D4F5': 'cyan',\n '#4763FF': 'blue',\n };\n\n // DPlayer 上のコメント位置を表す値とニコニコの位置コマンド定義のマッピング\n const position_table = {\n 'top': 'ue',\n 'right': 'naka',\n 'bottom': 'shita',\n };\n\n // vpos を計算 (10ミリ秒単位)\n // 番組開始時間からの累計秒らしいけど、なぜ指定しないといけないのかは不明\n // 小数点以下は丸めないとコメントサーバー側で投稿エラーになる\n const vpos = Math.round((dayjs().valueOf() - this.vpos_base_timestamp) / 10);\n\n // 視聴セッションが null か、接続が切れている場合は弾く\n if (this.watch_session === null || this.watch_session.readyState !== WebSocket.OPEN) {\n console.error('[LiveCommentManager][WatchSession] Comment sending failed. (Connection is not established.)');\n options.error('コメントの送信に失敗しました。WebSocket 接続が確立されていません。');\n return;\n }\n\n // コメントを送信\n this.watch_session.send(JSON.stringify({\n 'type': 'postComment',\n 'data': {\n // コメント本文\n 'text': options.data.text,\n // コメントの色\n 'color': color_table[options.data.color.toUpperCase()],\n // コメント位置\n 'position': position_table[options.data.type],\n // コメントサイズ (DPlayer とニコニコで表現が共通なため、変換不要)\n 'size': options.data.size,\n // 番組開始時間からの累計秒 (10ミリ秒単位)\n 'vpos': vpos,\n // 匿名コメント (184) にするかどうか\n 'isAnonymous': true,\n }\n }));\n\n // コメント送信のレスポンスを取得\n const abort_controller = new AbortController();\n this.watch_session.addEventListener('message', (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n\n // postCommentResult が送られてきた → コメント送信に成功している\n case 'postCommentResult': {\n // コメント成功を DPlayer にコールバックで通知\n options.success();\n\n // イベントリスナーを削除\n abort_controller.abort();\n break;\n }\n\n // コメント送信直後に error が送られてきた → コメント送信に失敗している\n case 'error': {\n // コメント失敗を DPlayer にコールバックで通知\n let error = `コメントの送信に失敗しました。(${message.data.code})`;\n switch (message.data.code) {\n case 'COMMENT_POST_NOT_ALLOWED':\n error = 'コメントが許可されていません。';\n break;\n case 'INVALID_MESSAGE':\n error = 'コメント内容が無効です。';\n break;\n }\n console.error(`[LiveCommentManager][WatchSession] Comment sending failed. (Code: ${message.data.code})`);\n options.error(error);\n\n // イベントリスナーを解除\n abort_controller.abort();\n break;\n }\n }\n }, { signal: abort_controller.signal });\n }\n\n\n /**\n * 同じ設定でニコニコ実況に再接続する\n */\n private async reconnect(): Promise {\n console.warn('[LiveCommentManager][WatchSession] Reconnecting...');\n this.player.notice('ニコニコ実況に再接続しています…');\n\n // 前のセッションを破棄\n this.destroy();\n\n // セッションを再初期化\n const result = await this.initSession();\n if (result.is_success === false) {\n console.error('[LiveCommentManager][WatchSession] Reconnection failed.');\n this.player.notice(result.detail, undefined, undefined, '#FF6F6A');\n }\n }\n\n\n /**\n * 視聴セッションとコメントセッションをそれぞれ閉じる\n */\n public destroy(): void {\n\n // セッションに紐いているすべての EventListener を解除\n // 再接続する場合に備えて AbortController を作り直す\n this.abort_controller.abort();\n this.abort_controller = new AbortController();\n\n // 視聴セッションを閉じる\n if (this.watch_session !== null) {\n this.watch_session.close(); // WebSocket を閉じる\n this.watch_session = null; // null に戻す\n }\n\n // コメントセッションを閉じる\n if (this.comment_session !== null) {\n this.comment_session.close(); // WebSocket を閉じる\n this.comment_session = null; // null に戻す\n }\n\n // 座席保持用のタイマーをクリア\n if (this.keep_seat_interval_id !== null) {\n window.clearInterval(this.keep_seat_interval_id);\n this.keep_seat_interval_id = null;\n }\n this.vpos_base_timestamp = 0;\n\n console.log('[LiveCommentManager][WatchSession] Destroyed.');\n }\n}\n\nexport default LiveCommentManager;\n","\n\nimport DPlayer, { DPlayerType } from 'dplayer';\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport CommentMuteSettings from '@/components/Settings/CommentMuteSettings.vue';\nimport LiveCommentManager, { ICommentData } from '@/services/player/managers/LiveCommentManager';\nimport useUserStore from '@/store/UserStore';\nimport Utils, { CommentUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'Panel-CommentTab',\n components: {\n CommentMuteSettings,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n\n // 手動スクロール状態かどうか\n is_manual_scroll: false,\n\n // 自動スクロール中かどうか\n // 自動スクロール中の場合、scroll イベントが発火しても無視する\n is_auto_scrolling: false,\n\n // コメントリストの配列\n comment_list: [] as ICommentData[],\n\n // コメントリストの要素\n comment_list_element: null as HTMLElement | null,\n\n // コメントリストのドロップダウン関連\n is_comment_list_dropdown_display: false as boolean,\n comment_list_dropdown_top: 0 as number,\n comment_list_dropdown_comment: null as ICommentData | null,\n\n // LiveCommentManager のインスタンス\n live_comment_manager: null as LiveCommentManager | null,\n\n // ニコニコ実況セッションの初期化に失敗した際のエラーメッセージ\n // 視聴中チャンネルのニコニコ実況がないときなどに発生する\n initialize_failed_message: null as string | null,\n\n // visibilitychange イベントのリスナー\n visibilitychange_listener: null as (() => void) | null,\n\n // ResizeObserver のインスタンス\n resize_observer: null as ResizeObserver | null,\n\n // コメントのミュート設定のモーダルを表示するか\n comment_mute_settings_modal: false,\n\n player: null as DPlayer | null,\n };\n },\n computed: {\n // UserStore に this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useUserStore),\n },\n created() {\n\n // アカウント情報を更新\n this.userStore.fetchUser();\n },\n mounted() {\n\n // コメントリストの要素を取得\n if (this.comment_list_element === null) {\n this.comment_list_element = this.$el.querySelector('.comment-list')!;\n }\n\n // 現在コメントリストがユーザーイベントでスクロールされているかどうか\n let is_user_scrolling = false;\n\n // mousedown → mouseup 中: スクロールバーをマウスでドラッグ\n // 残念ながらスクロールバーのドラッグ中は mousemove のイベントが発火しないため、直接 is_user_scrolling を設定する\n this.comment_list_element.onmousedown = (event: MouseEvent) => {\n // コメントリストの要素の左上を起点としたカーソルのX座標を求める\n if (this.comment_list_element === null) return;\n const x = event.clientX - this.comment_list_element.getBoundingClientRect().left;\n // 座標が clientWidth 以上であれば、スクロールバー上で mousedown されたものとする\n if (x > this.comment_list_element.clientWidth) is_user_scrolling = true;\n };\n this.comment_list_element.onmouseup = (event: MouseEvent) => {\n // コメントリストの要素の左上を起点としたカーソルのX座標を求める\n if (this.comment_list_element === null) return;\n const x = event.clientX - this.comment_list_element.getBoundingClientRect().left;\n // 座標が clientWidth 以上であれば、スクロールバー上で mouseup されたものとする\n if (x > this.comment_list_element.clientWidth) is_user_scrolling = false;\n };\n\n // ユーザーによるスクロールイベントで is_user_scrolling を true にする\n // 0.1 秒後に false にする(継続してイベントが発火すれば再び true になる)\n const on_user_scrolling = () => {\n is_user_scrolling = true;\n window.setTimeout(() => is_user_scrolling = false, 100);\n };\n\n // 現在コメントリストがドラッグされているかどうか\n let is_dragging = false;\n // touchstart → touchend 中: スクロールバーをタップでドラッグ\n this.comment_list_element.ontouchstart = () => is_dragging = true;\n this.comment_list_element.ontouchend = () => is_dragging = false;\n // touchmove + is_dragging 中: コメントリストをタップでドラッグしてスクロール\n this.comment_list_element.ontouchmove = () => is_dragging === true ? on_user_scrolling(): '';\n\n // wheel 中: マウスホイールの回転\n this.comment_list_element.onwheel = on_user_scrolling;\n\n // コメントリストがスクロールされた際、自動スクロール中でない&ユーザーイベントで操作されていれば、手動スクロールモードに設定\n // 手動スクロールモードでは自動スクロールを行わず、ユーザーがコメントリストをスクロールできるようにする\n this.comment_list_element.onscroll = async () => {\n if (this.comment_list_element === null) return;\n\n // scroll イベントは自動スクロールでも発火してしまうので、ユーザーイベントによるスクロールかを確認しないといけない\n // 自動スクロール中かどうかは is_auto_scrolling が true のときで判定できるはずだが、\n // コメントが多くなると is_auto_scrolling が false なのに scroll イベントが遅れて発火してしまうことがある\n if (this.is_auto_scrolling === false && is_user_scrolling === true) {\n\n // 手動スクロールを有効化\n this.is_manual_scroll = true;\n\n // イベント発火時点では scrollTop の値が完全に下にスクロールされていない場合があるため、0.1秒だけ待つ\n await Utils.sleep(0.1);\n\n // 一番下までスクロールされていたら自動スクロールに戻す\n if ((this.comment_list_element.scrollTop + this.comment_list_element.offsetHeight) >\n (this.comment_list_element.scrollHeight - 10)) { // 一番下から 10px 以内\n this.is_manual_scroll = false; // 手動スクロールを無効化\n }\n }\n };\n },\n // 終了前に実行\n beforeDestroy() {\n\n // ニコニコ実況セッションを破棄\n this.destroy();\n\n // ResizeObserver を終了\n if (this.resize_observer !== null) {\n this.resize_observer.disconnect();\n }\n },\n methods: {\n\n // ドロップダウンメニューを表示する\n showCommentListDropdown(event: Event, comment: ICommentData) {\n const comment_list_wrapper_rect = (this.$refs.comment_list_wrapper as HTMLDivElement).getBoundingClientRect();\n const comment_list_dropdown_height = 76; // 76px はドロップダウンメニューの高さ\n const comment_button_rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n // メニューの表示位置をクリックされたコメントに合わせる\n this.comment_list_dropdown_top = comment_button_rect.top - comment_list_wrapper_rect.top;\n // メニューがコメントリストからはみ出るときだけ、表示位置を上側に調整\n if ((this.comment_list_dropdown_top + comment_list_dropdown_height) > comment_list_wrapper_rect.height) {\n this.comment_list_dropdown_top = this.comment_list_dropdown_top - comment_list_dropdown_height + comment_button_rect.height;\n }\n // 表示位置を調整できたので、メニューを表示\n this.comment_list_dropdown_comment = comment;\n this.is_comment_list_dropdown_display = true;\n },\n\n // ドロップダウンメニューを非表示にする\n hideCommentListDropdown() {\n this.is_comment_list_dropdown_display = false;\n this.comment_list = this.comment_list.filter((comment) => {\n return CommentUtils.isMutedComment(comment.text, comment.user_id) === false;\n });\n },\n\n // ミュートするキーワードを追加する\n addMutedKeywords() {\n if (this.comment_list_dropdown_comment === null) return;\n CommentUtils.addMutedKeywords(this.comment_list_dropdown_comment.text);\n this.hideCommentListDropdown();\n },\n\n // ミュートするニコニコユーザー ID を追加する\n addMutedNiconicoUserIds() {\n if (this.comment_list_dropdown_comment === null) return;\n CommentUtils.addMutedNiconicoUserIDs(this.comment_list_dropdown_comment.user_id);\n this.hideCommentListDropdown();\n },\n\n // コメントリストを一番下までスクロールする\n async scrollCommentList(smooth: boolean = false) {\n if (this.comment_list_element === null) return;\n\n // ドロップダウンメニュー表示中なら手動スクロールモードに設定\n if (this.is_comment_list_dropdown_display === true) {\n this.is_manual_scroll = true;\n }\n\n // 手動スクロールモードの時は実行しない\n if (this.is_manual_scroll === true) return;\n\n // 自動スクロール中のフラグを立てる\n this.is_auto_scrolling = true;\n\n // 0.01 秒待って実行し、念押しで2回実行しないと完全に最下部までスクロールされない…(ブラウザの描画バグ?)\n // this.$nextTick() は効かなかった\n for (let index = 0; index < 3; index++) {\n await Utils.sleep(0.01);\n if (smooth === true) { // スムーズスクロール\n this.comment_list_element.scrollTo({top: this.comment_list_element.scrollHeight, left: 0, behavior: 'smooth'});\n } else {\n this.comment_list_element.scrollTo(0, this.comment_list_element.scrollHeight);\n }\n }\n\n // 0.1 秒待つ(重要)\n await Utils.sleep(0.1);\n\n // 自動スクロール中のフラグを降ろす\n this.is_auto_scrolling = false;\n },\n\n // リサイズ時のイベントを初期化\n // プレイヤーが初期化される毎に実行する必要がある\n initReserveObserver() {\n\n // 以前に初期化された ResizeObserver を終了\n if (this.resize_observer !== null) {\n this.resize_observer.disconnect();\n }\n\n // 監視対象の要素\n const resize_observer_element = document.querySelector('.watch-player')!;\n\n // プレイヤーの要素がリサイズされた際に発火するイベント\n const on_resize = () => {\n\n // コメント描画領域の要素\n const comment_area_element = this.player?.template.danmaku!;\n\n // コメント描画領域の幅から算出した、映像の要素の幅/高さ (px)\n // 実際の映像の要素は BML ブラウザ内に入ることがあり正確な算出ができないため、代わりに使っている\n const video_element_width = comment_area_element.clientWidth;\n const video_element_height = comment_area_element.clientWidth * (9 / 16);\n\n // プレイヤー全体と映像の高さの差(レターボックス)から、コメント描画領域の高さを狭める必要があるかを判定する\n // 2で割っているのは単体の差を測るため\n if (resize_observer_element === null || resize_observer_element.clientHeight === null) return;\n const letter_box_height = (resize_observer_element.clientHeight - video_element_height) / 2;\n\n const threshold = Utils.isSmartphoneVertical() ? 0 : window.matchMedia('(max-height: 450px)').matches ? 50 : 66;\n if (letter_box_height < threshold) {\n\n // コメント描画領域に必要な上下マージン\n const comment_area_vertical_margin = (threshold - letter_box_height) * 2;\n\n // 狭めるコメント描画領域の幅\n // 映像の要素の幅をそのまま利用する\n const comment_area_width = video_element_width;\n\n // 狭めるコメント描画領域の高さ\n const comment_area_height = video_element_height - comment_area_vertical_margin;\n\n // 狭めるコメント描画領域のアスペクト比を求める\n // https://tech.arc-one.jp/asepct-ratio/\n const gcd = (x: number, y: number) => { // 最大公約数を求める関数\n if (y === 0) return x;\n return gcd(y, x % y);\n };\n // 幅と高さの最大公約数を求める\n const gcd_result = gcd(comment_area_width, comment_area_height);\n // 幅と高さをそれぞれ最大公約数で割ってアスペクト比を算出\n const comment_area_height_aspect = `${comment_area_width / gcd_result} / ${comment_area_height / gcd_result}`;\n\n // 一時的に transition を無効化する\n // アスペクト比の設定は連続して行われるが、その際に transition が適用されるとワンテンポ遅れたアニメーションになってしまう\n comment_area_element.style.transition = 'none';\n\n // コメント描画領域に算出したアスペクト比を設定する\n comment_area_element.style.setProperty('--comment-area-aspect-ratio', comment_area_height_aspect);\n\n // コメント描画領域に必要な上下マージンを設定する\n comment_area_element.style.setProperty('--comment-area-vertical-margin', `${comment_area_vertical_margin}px`);\n\n // 0.2秒後に実行する\n // 0.2秒より前にもう一度リサイズイベントが来た場合はタイマーがクリアされるため実行されない\n window.setTimeout(() => {\n\n // 再び transition を有効化する\n comment_area_element.style.transition = '';\n\n }, 0.2 * 1000);\n\n } else {\n\n // コメント描画領域に設定したアスペクト比・上下マージンを削除する\n comment_area_element.style.removeProperty('--comment-area-aspect-ratio');\n comment_area_element.style.removeProperty('--comment-area-vertical-margin');\n }\n };\n\n // 要素の監視を開始\n this.resize_observer = new ResizeObserver(on_resize);\n this.resize_observer.observe(resize_observer_element);\n\n // 0.6 秒待ってから初回実行\n // チャンネル切り替え後、再初期化されたプレイヤーに適用するため(早いと再初期化前のプレイヤーに適用されてしまう)\n window.setTimeout(on_resize, 0.6 * 1000);\n },\n\n // ニコニコ実況に接続し、セッションを初期化する\n async initSession(player: DPlayer, display_channel_id: string) {\n this.player = player;\n\n // リサイズ時のイベントを初期化\n // イベントはプレイヤーの DOM に紐づいているため、プレイヤーが破棄→再初期化される毎に実行する必要がある\n this.initReserveObserver();\n\n // タブが非表示状態のときにコメントを格納する配列\n // タブが表示状態になったらコメントリストにのみ表示する(遅れているのでプレイヤーには表示しない)\n const comment_list_buffer: ICommentData[] = [];\n\n // コメントの最大保持数\n const max_comment_count = 500;\n\n // LiveCommentManager を初期化\n this.live_comment_manager = new LiveCommentManager({\n player: player,\n display_channel_id: display_channel_id,\n // 初回の過去コメント (最大50件) を受信したときのコールバック\n on_initial_comments_received: async (initial_comments) => {\n\n // コメントリストに一括で追加\n this.comment_list.push(...initial_comments);\n\n // コメントリストを一番下までスクロール\n this.scrollCommentList();\n },\n // コメントを受信したときのコールバック\n // プレイヤーへの描画は LiveCommentManager が行う\n on_comment_received: async (comment) => {\n\n // タブが非表示状態のときは、バッファにコメントを追加するだけで終了する\n // ここで追加すると、タブが表示状態になったときに一斉に描画されて大変なことになる\n if (document.visibilityState === 'hidden') {\n comment_list_buffer.push(comment);\n return;\n }\n\n // コメントリストのコメント数が max_comment_count 件を超えたら、古いものから順に削除する\n // 仮想スクロールとはいえ、さすがに max_comment_count 件を超えると重くなりそう\n // 手動スクロール時は実行しない\n if (this.comment_list.length >= max_comment_count && this.is_manual_scroll === false) {\n this.comment_list.splice(0, Math.max(0, this.comment_list.length - max_comment_count));\n }\n\n // コメントリストに追加\n this.comment_list.push(comment);\n\n // コメントリストを一番下までスクロール\n this.scrollCommentList();\n }\n });\n\n // タブが表示状態になったときのイベント\n this.visibilitychange_listener = () => {\n if (document.visibilityState === 'visible') {\n\n // コメントリスト + バッファの合計コメント数が max_comment_count 件を超えたら、\n // コメントリスト内のコメントを古いものから順に削除し、max_comment_count 件になるようにする\n const comment_list_and_buffer_length = this.comment_list.length + comment_list_buffer.length;\n if (comment_list_and_buffer_length >= max_comment_count && this.is_manual_scroll === false) {\n this.comment_list.splice(0, Math.max(0, comment_list_and_buffer_length - max_comment_count));\n }\n\n // バッファ内のコメントをコメントリストに一括で追加する\n this.comment_list.push(...comment_list_buffer);\n comment_list_buffer.length = 0; // バッファを空にする\n\n // コメントリストを一番下までスクロール\n this.scrollCommentList();\n }\n };\n document.addEventListener('visibilitychange', this.visibilitychange_listener);\n\n // ニコニコ実況セッションを初期化する\n const result = await this.live_comment_manager.initSession();\n\n // ニコニコ実況セッションの初期化に失敗した\n // 初期化に失敗した際のエラーメッセージを保存しておく (エラー表示などで利用する)\n // プレイヤーへのエラー表示はすでに LiveCommentManager の方で行われているので、ここでは何もしない\n if (result.is_success === false) {\n this.initialize_failed_message = result.detail;\n }\n },\n\n // コメントを送信する\n sendComment(options: DPlayerType.APIBackendSendOptions) {\n\n // 初期化に失敗しているときは実行せず、保存しておいたエラーメッセージを表示する\n if (this.initialize_failed_message !== null) {\n options.error(this.initialize_failed_message);\n return;\n }\n\n // バリデーション\n if (this.userStore.user === null) {\n options.error('コメントするには、KonomiTV アカウントにログインしてください。');\n return;\n }\n if (this.userStore.user.niconico_user_id === null) {\n options.error('コメントするには、ニコニコアカウントと連携してください。');\n return;\n }\n if (this.userStore.user.niconico_user_premium === false && (options.data.type === 'top' || options.data.type === 'bottom')) {\n options.error('コメントを上下に固定するには、ニコニコアカウントのプレミアム会員登録が必要です。');\n return;\n }\n if (this.userStore.user.niconico_user_premium === false && options.data.size === 'big') {\n options.error('コメントサイズを大きめに設定するには、ニコニコアカウントのプレミアム会員登録が必要です。');\n return;\n }\n\n // ニコニコ実況のコメントサーバーにコメントを送信\n this.live_comment_manager?.sendComment(options);\n },\n\n // ニコニコ実況セッションを破棄する\n destroy() {\n\n // タブの表示/非表示の状態が切り替わったときのイベントを削除\n if (this.visibilitychange_listener !== null) {\n document.removeEventListener('visibilitychange', this.visibilitychange_listener);\n this.visibilitychange_listener = null;\n }\n\n // LiveCommentManager を破棄\n if (this.live_comment_manager !== null) {\n this.live_comment_manager.destroy();\n this.live_comment_manager = null;\n }\n\n this.initialize_failed_message = null;\n this.comment_list = [];\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Comment.vue?vue&type=template&id=df07fabe&scoped=true&\"\nimport script from \"./Comment.vue?vue&type=script&lang=ts&\"\nexport * from \"./Comment.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Comment.vue?vue&type=style&index=0&id=df07fabe&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"df07fabe\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"program-container\"},[_c('section',{staticClass:\"program-broadcaster\"},[_c('img',{staticClass:\"program-broadcaster__icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${(_vm.channelsStore.display_channel_id)}/logo`}}),_c('div',{staticClass:\"program-broadcaster__number\"},[_vm._v(\"Ch: \"+_vm._s(_vm.channelsStore.channel.current.channel_number))]),_c('div',{staticClass:\"program-broadcaster__name\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.name))])]),_c('section',{staticClass:\"program-info\"},[_c('h1',{staticClass:\"program-info__title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_present, 'title'))}}),_c('div',{staticClass:\"program-info__time\"},[_vm._v(\" \"+_vm._s(_vm.ProgramUtils.getProgramTime(_vm.channelsStore.channel.current.program_present))+\" \")]),_c('div',{staticClass:\"program-info__description\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_present, 'description'))}}),_c('div',{staticClass:\"program-info__genre-container\"},_vm._l((_vm.channelsStore.channel.current.program_present?.genres ?? []),function(genre,genre_index){return _c('div',{key:genre_index,staticClass:\"program-info__genre\"},[_vm._v(\" \"+_vm._s(genre.major)+\" / \"+_vm._s(genre.middle)+\" \")])}),0),_c('div',{staticClass:\"program-info__next\"},[_c('span',{staticClass:\"program-info__next-decorate\"},[_vm._v(\"NEXT\")]),_c('Icon',{staticClass:\"program-info__next-icon\",attrs:{\"icon\":\"fluent:fast-forward-20-filled\",\"width\":\"16px\"}})],1),_c('span',{staticClass:\"program-info__next-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_following, 'title'))}}),_c('div',{staticClass:\"program-info__next-time\"},[_vm._v(\" \"+_vm._s(_vm.ProgramUtils.getProgramTime(_vm.channelsStore.channel.current.program_following))+\" \")]),_c('div',{staticClass:\"program-info__status\"},[_c('div',{staticClass:\"program-info__status-force\",class:`program-info__status-force--${_vm.ChannelUtils.getChannelForceType(_vm.channelsStore.channel.current.jikkyo_force)}`},[_c('Icon',{attrs:{\"icon\":\"fa-solid:fire-alt\",\"height\":\"14px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"勢い:\")]),_c('span',{staticClass:\"ml-2\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.jikkyo_force ?? '--')+\" コメ/分\")])],1),_c('div',{staticClass:\"program-info__status-viewers ml-5\"},[_c('Icon',{attrs:{\"icon\":\"fa-solid:eye\",\"height\":\"14px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"視聴数:\")]),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.viewer_count))])],1)])]),_c('section',{staticClass:\"program-detail-container\"},_vm._l((_vm.channelsStore.channel.current.program_present?.detail ?? {}),function(detail_text,detail_heading){return _c('div',{key:detail_heading,staticClass:\"program-detail\"},[_c('h2',{staticClass:\"program-detail__heading\"},[_vm._v(_vm._s(detail_heading))]),_c('div',{staticClass:\"program-detail__text\",domProps:{\"innerHTML\":_vm._s(_vm.Utils.URLtoLink(detail_text))}})])}),0)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useChannelsStore from '@/store/ChannelsStore';\nimport Utils, { ChannelUtils, ProgramUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'Panel-ProgramTab',\n data() {\n return {\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ChannelUtils: ChannelUtils,\n ProgramUtils: ProgramUtils,\n };\n },\n computed: {\n // ChannelsStore に this.channelsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Program.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Program.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Program.vue?vue&type=template&id=710b8382&scoped=true&\"\nimport script from \"./Program.vue?vue&type=script&lang=ts&\"\nexport * from \"./Program.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Program.vue?vue&type=style&index=0&id=710b8382&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"710b8382\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"remote-control-container\",class:{'remote-control-container--showing': _vm.showing},on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('div',{staticClass:\"remote-control elevation-6\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control__close d-flex align-center rounded-circle cursor-pointer px-2 py-2\",on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('Icon',{attrs:{\"icon\":\"fluent:dismiss-12-filled\",\"width\":\"23px\",\"height\":\"23px\"}})],1),_c('div',{staticClass:\"remote-control-data-broadcasting remote-control-data-broadcasting--disabled\"},[_c('v-progress-circular',{staticClass:\"remote-control__loading\",attrs:{\"indeterminate\":\"\",\"size\":\"60\",\"width\":\"6\"}}),_c('div',{staticClass:\"remote-control__directional-key\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-up\",attrs:{\"data-arib-key-code\":\"1\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-up-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-left\",attrs:{\"data-arib-key-code\":\"3\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-left-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-select\",attrs:{\"data-arib-key-code\":\"18\"}},[_vm._v(\" 決定 \")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-right\",attrs:{\"data-arib-key-code\":\"4\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-right-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-down\",attrs:{\"data-arib-key-code\":\"2\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-down-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1)]),_c('div',{staticClass:\"remote-control__control-key\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-data\",attrs:{\"data-arib-key-code\":\"20\"}},[_c('svg',{attrs:{\"width\":\"20px\",\"height\":\"20px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})]),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"データ\")])]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-back\",attrs:{\"data-arib-key-code\":\"19\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"20px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"戻る\")])],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-blue blue darken-3\",attrs:{\"data-arib-key-code\":\"21\"}},[_vm._v(\"青\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-red red darken-3\",attrs:{\"data-arib-key-code\":\"22\"}},[_vm._v(\"赤\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-green green darken-3\",attrs:{\"data-arib-key-code\":\"23\"}},[_vm._v(\"緑\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-yellow yellow darken-3\",attrs:{\"data-arib-key-code\":\"24\"}},[_vm._v(\"黄\")])])],1),_c('div',{staticClass:\"remote-control__number-key\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"1\",\"data-arib-key-code\":\"6\"}},[_vm._v(\"1\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"2\",\"data-arib-key-code\":\"7\"}},[_vm._v(\"2\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"3\",\"data-arib-key-code\":\"8\"}},[_vm._v(\"3\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"4\",\"data-arib-key-code\":\"9\"}},[_vm._v(\"4\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"5\",\"data-arib-key-code\":\"10\"}},[_vm._v(\"5\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"6\",\"data-arib-key-code\":\"11\"}},[_vm._v(\"6\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"7\",\"data-arib-key-code\":\"12\"}},[_vm._v(\"7\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"8\",\"data-arib-key-code\":\"13\"}},[_vm._v(\"8\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"9\",\"data-arib-key-code\":\"14\"}},[_vm._v(\"9\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"10\",\"data-arib-key-code\":\"15\"}},[_vm._v(\"10\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"11\",\"data-arib-key-code\":\"16\"}},[_vm._v(\"11\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"12\",\"data-arib-key-code\":\"17\"}},[_vm._v(\"12\")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport Vue, { PropType } from 'vue';\n\nexport default Vue.extend({\n name: 'Panel-Remocon',\n props: {\n // リモコンのモーダルを表示するか\n showing: {\n type: Boolean as PropType,\n required: true,\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Remocon.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Remocon.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Remocon.vue?vue&type=template&id=b659b524&scoped=true&\"\nimport script from \"./Remocon.vue?vue&type=script&lang=ts&\"\nexport * from \"./Remocon.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Remocon.vue?vue&type=style&index=0&id=b659b524&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b659b524\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"twitter-container\"},[_c('v-dialog',{attrs:{\"content-class\":\"zoom-capture-modal-container\",\"max-width\":\"980\",\"transition\":\"slide-y-transition\"},model:{value:(_vm.zoom_capture_modal),callback:function ($$v) {_vm.zoom_capture_modal=$$v},expression:\"zoom_capture_modal\"}},[_c('div',{staticClass:\"zoom-capture-modal\"},[_c('img',{staticClass:\"zoom-capture-modal__image\",attrs:{\"src\":_vm.zoom_capture ? _vm.zoom_capture.image_url: ''}}),_c('a',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"zoom-capture-modal__download\",attrs:{\"href\":_vm.zoom_capture ? _vm.zoom_capture.image_url : '',\"download\":_vm.zoom_capture ? _vm.zoom_capture.filename : ''}},[_c('Icon',{attrs:{\"icon\":\"fa6-solid:download\",\"width\":\"45px\"}})],1)])]),_c('div',{staticClass:\"tab-container\"},[_c('div',{staticClass:\"tab-content tab-content--search\",class:{'tab-content--active': _vm.twitter_active_tab === 'Search'}},[_c('div',{staticClass:\"search px-4\"},[_vm._v(\" リアルタイム検索機能は鋭意開発中です。 \")])]),_c('div',{staticClass:\"tab-content tab-content--timeline\",class:{'tab-content--active': _vm.twitter_active_tab === 'Timeline'}},[_c('div',{staticClass:\"search px-4\"},[_vm._v(\" タイムライン機能は鋭意開発中です。 \")])]),_c('div',{staticClass:\"tab-content tab-content--capture\",class:{'tab-content--active': _vm.twitter_active_tab === 'Capture'}},[_c('div',{staticClass:\"captures\"},_vm._l((_vm.captures),function(capture){return _c('div',{key:capture.image_url,staticClass:\"capture\",class:{\n 'capture--selected': capture.selected,\n 'capture--focused': capture.focused,\n 'capture--disabled': !capture.selected && _vm.tweet_captures.length >= 4,\n },on:{\"click\":function($event){return _vm.clickCapture(capture)}}},[_c('img',{staticClass:\"capture__image\",attrs:{\"src\":capture.image_url}}),_c('div',{staticClass:\"capture__disabled-cover\"}),_c('div',{staticClass:\"capture__selected-number\"},[_vm._v(_vm._s(_vm.tweet_captures.findIndex(blob => blob === capture.blob) + 1))]),_c('Icon',{staticClass:\"capture__selected-checkmark\",attrs:{\"icon\":\"fluent:checkmark-circle-16-filled\"}}),_c('div',{staticClass:\"capture__selected-border\"}),_c('div',{staticClass:\"capture__focused-border\"}),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"capture__zoom\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();_vm.zoom_capture_modal = true; _vm.zoom_capture = capture},\"mousedown\":function($event){$event.preventDefault();$event.stopPropagation();/* 親要素の波紋が広がらないように */}}},[_c('Icon',{attrs:{\"icon\":\"fluent:zoom-in-16-regular\",\"width\":\"32px\"}})],1)],1)}),0),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.captures.length === 0),expression:\"captures.length === 0\"}],staticClass:\"capture-announce\"},[_c('div',{staticClass:\"capture-announce__heading\"},[_vm._v(\"まだキャプチャがありません。\")]),_vm._m(0)])])]),_c('div',{staticClass:\"tab-button-container\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tab-button\",class:{'tab-button--active': _vm.twitter_active_tab === 'Search'},on:{\"click\":function($event){_vm.twitter_active_tab = 'Search'}}},[_c('Icon',{attrs:{\"icon\":\"fluent:search-16-filled\",\"height\":\"18px\"}}),_c('span',{staticClass:\"tab-button__text\"},[_vm._v(\"ツイート検索\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tab-button\",class:{'tab-button--active': _vm.twitter_active_tab === 'Timeline'},on:{\"click\":function($event){_vm.twitter_active_tab = 'Timeline'}}},[_c('Icon',{attrs:{\"icon\":\"fluent:home-16-regular\",\"height\":\"18px\"}}),_c('span',{staticClass:\"tab-button__text\"},[_vm._v(\"タイムライン\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tab-button\",class:{'tab-button--active': _vm.twitter_active_tab === 'Capture'},on:{\"click\":function($event){_vm.twitter_active_tab = 'Capture'}}},[_c('Icon',{attrs:{\"icon\":\"fluent:image-copy-20-regular\",\"height\":\"18px\"}}),_c('span',{staticClass:\"tab-button__text\"},[_vm._v(\"キャプチャ\")])],1)]),_c('div',{staticClass:\"tweet-form\",class:{\n 'tweet-form--focused': _vm.is_tweet_hashtag_form_focused || _vm.is_tweet_text_form_focused,\n 'tweet-form--virtual-keyboard-display': _vm.is_virtual_keyboard_display &&\n (_vm.Utils.hasActiveElementClass('tweet-form__hashtag-form') || _vm.Utils.hasActiveElementClass('tweet-form__textarea')) &&\n (() => {_vm.is_hashtag_list_display = false; return true;})(),\n }},[_c('div',{staticClass:\"tweet-form__hashtag\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.tweet_hashtag),expression:\"tweet_hashtag\"}],staticClass:\"tweet-form__hashtag-form\",attrs:{\"type\":\"search\",\"placeholder\":\"#ハッシュタグ\",\"spellcheck\":\"false\"},domProps:{\"value\":(_vm.tweet_hashtag)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.tweet_hashtag=$event.target.value},function($event){return _vm.updateTweetLetterCount()}],\"focus\":function($event){_vm.is_tweet_hashtag_form_focused = true},\"blur\":function($event){_vm.is_tweet_hashtag_form_focused = false},\"change\":function($event){_vm.tweet_hashtag = _vm.formatHashtag(_vm.tweet_hashtag); _vm.updateTweetLetterCount()}}}),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tweet-form__hashtag-list-button\",on:{\"click\":function($event){return _vm.clickHashtagListButton()}}},[_c('Icon',{attrs:{\"icon\":\"fluent:clipboard-text-ltr-32-regular\",\"height\":\"22px\"}})],1)]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.tweet_text),expression:\"tweet_text\"}],ref:\"tweet_text\",staticClass:\"tweet-form__textarea\",attrs:{\"placeholder\":\"ツイート\",\"spellcheck\":\"false\"},domProps:{\"value\":(_vm.tweet_text)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.tweet_text=$event.target.value},function($event){return _vm.updateTweetLetterCount()}],\"paste\":function($event){return _vm.pasteClipboardData($event)},\"focus\":function($event){_vm.is_tweet_text_form_focused = true},\"blur\":function($event){_vm.is_tweet_text_form_focused = false}}}),_c('div',{staticClass:\"tweet-form__control\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"account-button\",class:{'account-button--no-login': !_vm.is_logged_in_twitter},on:{\"click\":function($event){return _vm.clickAccountButton()}}},[_c('img',{staticClass:\"account-button__icon\",attrs:{\"src\":_vm.is_logged_in_twitter ? _vm.selected_twitter_account?.icon_url : '/assets/images/account-icon-default.png'}}),_c('span',{staticClass:\"account-button__screen-name\"},[_vm._v(\" \"+_vm._s(_vm.is_logged_in_twitter ? `@${_vm.selected_twitter_account?.screen_name}` : '連携されていません')+\" \")]),_c('Icon',{staticClass:\"account-button__menu\",attrs:{\"icon\":\"fluent:more-circle-20-regular\",\"width\":\"22px\"}})],1),_c('div',{staticClass:\"limit-meter\"},[_c('div',{staticClass:\"limit-meter__content\",class:{\n 'limit-meter__content--yellow': _vm.tweet_letter_count <= 20,\n 'limit-meter__content--red': _vm.tweet_letter_count <= 0,\n }},[_c('Icon',{staticStyle:{\"margin-right\":\"-2px\"},attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"12px\"}}),_c('span',[_vm._v(_vm._s(_vm.tweet_letter_count))])],1),_c('div',{staticClass:\"limit-meter__content\"},[_c('Icon',{attrs:{\"icon\":\"fluent:image-16-filled\",\"width\":\"14px\"}}),_c('span',[_vm._v(_vm._s(_vm.tweet_captures.length)+\"/4\")])],1)]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tweet-button\",attrs:{\"disabled\":!_vm.is_logged_in_twitter || _vm.tweet_letter_count < 0 ||\n (_vm.tweet_letter_count === 140 && _vm.tweet_captures.length === 0)},on:{\"click\":function($event){return _vm.sendTweet()},\"touchstart\":function($event){return _vm.sendTweet()}}},[_c('Icon',{attrs:{\"icon\":\"fa-brands:twitter\",\"height\":\"16px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"ツイート\")])],1)])]),_c('div',{staticClass:\"hashtag-list\",class:{\n 'hashtag-list--display': _vm.is_hashtag_list_display,\n 'hashtag-list--virtual-keyboard-display': _vm.is_virtual_keyboard_display && _vm.Utils.hasActiveElementClass('hashtag__input'),\n }},[_c('div',{staticClass:\"hashtag-heading\"},[_c('div',{staticClass:\"hashtag-heading__text\"},[_c('Icon',{attrs:{\"icon\":\"charm:hash\",\"width\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"ハッシュタグリスト\")])],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"hashtag-heading__add-button\",on:{\"click\":function($event){_vm.saved_twitter_hashtags.push({id: _vm.Utils.time(), text: '#ここにハッシュタグを入力', editing: false})}}},[_c('Icon',{attrs:{\"icon\":\"fluent:add-12-filled\",\"width\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"追加\")])],1)]),_c('draggable',{staticClass:\"hashtag-container\",attrs:{\"handle\":\".hashtag__sort-handle\"},model:{value:(_vm.saved_twitter_hashtags),callback:function ($$v) {_vm.saved_twitter_hashtags=$$v},expression:\"saved_twitter_hashtags\"}},_vm._l((_vm.saved_twitter_hashtags),function(hashtag){return _c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\",value:(!hashtag.editing),expression:\"!hashtag.editing\"}],key:hashtag.id,staticClass:\"hashtag\",class:{'hashtag--editing': hashtag.editing},on:{\"click\":function($event){return _vm.clickHashtag(hashtag)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(hashtag.text),expression:\"hashtag.text\"}],staticClass:\"hashtag__input\",attrs:{\"type\":\"search\",\"spellcheck\":\"false\",\"disabled\":!hashtag.editing},domProps:{\"value\":(hashtag.text)},on:{\"click\":function($event){$event.stopPropagation();},\"input\":function($event){if($event.target.composing)return;_vm.$set(hashtag, \"text\", $event.target.value)}}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"hashtag__edit-button\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();hashtag.editing = !hashtag.editing;\n hashtag.text = _vm.formatHashtag(hashtag.text, true); _vm.updateTweetLetterCount()}}},[_c('Icon',{attrs:{\"icon\":hashtag.editing ? 'fluent:checkmark-16-filled': 'fluent:edit-16-filled',\"width\":\"17px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"hashtag__delete-button\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();_vm.saved_twitter_hashtags.splice(_vm.saved_twitter_hashtags.indexOf(hashtag), 1)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:delete-16-filled\",\"width\":\"17px\"}})],1),_c('div',{staticClass:\"hashtag__sort-handle\"},[_c('Icon',{attrs:{\"icon\":\"material-symbols:drag-handle-rounded\",\"width\":\"17px\"}})],1)])}),0)],1),_c('div',{staticClass:\"twitter-account-list\",class:{'twitter-account-list--display': _vm.is_twitter_account_list_display}},_vm._l((_vm.userStore.user ? _vm.userStore.user.twitter_accounts : []),function(twitter_account){return _c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],key:twitter_account.id,staticClass:\"twitter-account\",on:{\"click\":function($event){return _vm.updateSelectedTwitterAccount(twitter_account)}}},[_c('img',{staticClass:\"twitter-account__icon\",attrs:{\"src\":twitter_account.icon_url}}),_c('div',{staticClass:\"twitter-account__info\"},[_c('div',{staticClass:\"twitter-account__name\"},[_vm._v(_vm._s(twitter_account.name))]),_c('div',{staticClass:\"twitter-account__screen-name\"},[_vm._v(\"@\"+_vm._s(twitter_account.screen_name))])]),_c('Icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(twitter_account.id === _vm.settingsStore.settings.selected_twitter_account_id),expression:\"twitter_account.id === settingsStore.settings.selected_twitter_account_id\"}],staticClass:\"twitter-account__check\",attrs:{\"icon\":\"fluent:checkmark-16-filled\",\"width\":\"24px\"}})],1)}),0)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"capture-announce__text\"},[_c('p',{staticClass:\"mt-0 mb-0\"},[_vm._v(\"プレイヤーのキャプチャボタンやショートカットキーでキャプチャを撮ると、ここに表示されます。\")]),_c('p',{staticClass:\"mt-2 mb-0\"},[_vm._v(\"表示されたキャプチャを選択してからツイートすると、キャプチャを付けてツイートできます。\")])])\n}]\n\nexport { render, staticRenderFns }","\n\nimport DPlayer from 'dplayer';\nimport { mapStores } from 'pinia';\nimport Vue, { PropType } from 'vue';\nimport draggable from 'vuedraggable';\n\nimport Twitter from '@/services/Twitter';\nimport { ITwitterAccount } from '@/services/Users';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\n\n// このコンポーネント内でのキャプチャのインターフェイス\ninterface ITweetCapture {\n blob: Blob;\n filename: string;\n image_url: string;\n selected: boolean;\n focused: boolean;\n}\n\n// このコンポーネント内でのハッシュタグのインターフェイス\ninterface IHashtag {\n id: number;\n text: string;\n editing: boolean;\n}\n\nexport default Vue.extend({\n name: 'Panel-TwitterTab',\n components: {\n draggable,\n },\n props: {\n // プレイヤーのインスタンス\n player: {\n type: null as unknown as PropType, // 代入当初は null になるため苦肉の策\n required: true,\n },\n // 仮想キーボードが表示されているかどうか\n is_virtual_keyboard_display: {\n type: Boolean as PropType,\n required: true,\n },\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n\n // Twitter アカウントを1つでも連携しているかどうか\n is_logged_in_twitter: false,\n\n // 現在ツイート対象として選択されている Twitter アカウント\n selected_twitter_account: null as ITwitterAccount | null,\n\n // 連携している Twitter アカウントリストを表示しているか\n is_twitter_account_list_display: false,\n\n // 保存している Twitter のハッシュタグが入るリスト\n saved_twitter_hashtags: useSettingsStore().settings.saved_twitter_hashtags.map((hashtag, index) => {\n // id プロパティは :key=\"\" に指定するためにつける ID (ミリ秒単位のタイムスタンプ + index で適当に一意になるように)\n return {id: Utils.time() + index, text: hashtag, editing: false} as IHashtag;\n }),\n\n // ハッシュタグリストを表示しているか\n is_hashtag_list_display: false,\n\n // デフォルトで表示される Twitter タブ内のタブ\n twitter_active_tab: useSettingsStore().settings.twitter_active_tab,\n\n // キャプチャを拡大表示するモーダルの表示状態\n zoom_capture_modal: false,\n\n // 現在モーダルで拡大表示中のキャプチャのオブジェクト\n zoom_capture: null as ITweetCapture | null,\n\n // キャプチャリスト\n captures: [] as ITweetCapture[],\n\n // キャプチャリストの要素\n captures_element: null as HTMLDivElement | null,\n\n // ツイートハッシュタグフォームにフォーカスしているか\n is_tweet_hashtag_form_focused: false,\n\n // ツイート本文フォームにフォーカスしているか\n is_tweet_text_form_focused: false,\n\n // ツイートのハッシュタグ\n tweet_hashtag: '',\n\n // ツイート本文\n tweet_text: '',\n\n // ツイートに添付するキャプチャの Blob のリスト\n tweet_captures: [] as Blob[],\n\n // 文字数カウント\n tweet_letter_count: 140,\n\n // ツイートを送信中か (API リクエストを実行するまで)\n is_tweet_sending: false,\n };\n },\n computed: {\n // ChannelsStore / SettingsStore / UserStore に this.channelsStore / this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore, useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ログイン時のみ\n if (this.userStore.is_logged_in === true) {\n\n // 連携している Twitter アカウントがあれば true に設定\n if (this.userStore.user && this.userStore.user.twitter_accounts.length > 0) {\n this.is_logged_in_twitter = true;\n\n // 現在ツイート対象として選択されている Twitter アカウントの ID が設定されていない or ID に紐づく Twitter アカウントがない\n // 連携している Twitter アカウントのうち、一番最初のものを自動選択する\n // ここで言う Twitter アカウントの ID は DB 上で連番で振られるもので、Twitter アカウントそのものの固有 ID ではない\n if (this.settingsStore.settings.selected_twitter_account_id === null ||\n !this.userStore.user.twitter_accounts.some((twitter_account) => {\n return twitter_account.id === this.settingsStore.settings.selected_twitter_account_id;\n })) {\n this.settingsStore.settings.selected_twitter_account_id = this.userStore.user.twitter_accounts[0].id;\n }\n\n // 現在ツイート対象として選択されている Twitter アカウントを取得・設定\n const twitter_account_index = this.userStore.user.twitter_accounts.findIndex((twitter_account) => {\n // Twitter アカウントの ID が選択されているものと一致する\n return twitter_account.id === this.settingsStore.settings.selected_twitter_account_id;\n });\n this.selected_twitter_account = this.userStore.user.twitter_accounts[twitter_account_index];\n }\n }\n\n // 局タグ追加処理を走らせる (ハッシュタグフォームのフォーマット処理も同時に行われるが、元々空なので無意味)\n this.tweet_hashtag = this.formatHashtag(this.tweet_hashtag);\n this.updateTweetLetterCount();\n },\n beforeDestroy() {\n // 終了前にすべてのキャプチャの Blob URL を revoke してリソースを解放する\n for (const capture of this.captures) {\n URL.revokeObjectURL(capture.image_url);\n }\n },\n watch: {\n\n // 保存しているハッシュタグが変更されたら随時 LocalStorage に保存する\n saved_twitter_hashtags: {\n deep: true,\n handler() {\n this.settingsStore.settings.saved_twitter_hashtags = this.saved_twitter_hashtags.map(hashtag => hashtag.text);\n }\n }\n },\n methods: {\n\n // 文字数カウントを変更するイベント\n updateTweetLetterCount() {\n\n // サロゲートペアを考慮し、スプレッド演算子で一度配列化してから数えている\n // ref: https://qiita.com/suin/items/3da4fb016728c024eaca\n this.tweet_letter_count = 140 - [...this.tweet_hashtag].length - [...this.tweet_text].length;\n },\n\n // クリップボード内のデータがペーストされたときのイベント\n pasteClipboardData(event: ClipboardEvent) {\n if (event.clipboardData === null) return;\n\n // 一応配列になっているので回しているが、基本1回のペーストにつき DataTransferItem は1個しか入らない\n for (const clipboard_item of event.clipboardData.items) {\n\n // 画像のみを対象にする (DataTransferItem.type には MIME タイプが入る)\n if (clipboard_item.type.startsWith('image/')) {\n\n // クリップボード内の画像データを File オブジェクトとして取得し、キャプチャリストに追加\n const file = clipboard_item.getAsFile();\n if (file) {\n this.addCaptureList(file, file.name);\n }\n }\n }\n },\n\n // ハッシュタグリストボタンが押されたときのイベント\n clickHashtagListButton() {\n this.is_hashtag_list_display = !this.is_hashtag_list_display;\n // すべてのハッシュタグの編集状態を解除する\n for (const hashtag of this.saved_twitter_hashtags) {\n hashtag.editing = false;\n }\n },\n\n // ハッシュタグがクリックされたときのイベント\n clickHashtag(hashtag: IHashtag) {\n this.tweet_hashtag = hashtag.text;\n this.tweet_hashtag = this.formatHashtag(this.tweet_hashtag);\n this.updateTweetLetterCount();\n window.setTimeout(() => this.is_hashtag_list_display = false, 150);\n },\n\n // アカウントボタンが押されたときのイベント\n clickAccountButton() {\n\n // Twitter アカウントが連携されていない場合は Twitter 設定画面に飛ばす\n if (!this.is_logged_in_twitter) {\n\n // 視聴画面以外に遷移するため、フルスクリーンを解除しないと画面が崩れる\n if (document.fullscreenElement) {\n document.exitFullscreen();\n }\n\n this.$router.push({path: '/settings/twitter'});\n return;\n }\n\n // アカウントリストの表示/非表示を切り替え\n this.is_twitter_account_list_display = !this.is_twitter_account_list_display;\n\n // アカウントリストが表示されているなら、ハッシュタグリストを非表示にする\n if (this.is_twitter_account_list_display === true) {\n this.is_hashtag_list_display = false;\n }\n },\n\n // 選択されている Twitter アカウントを更新する\n updateSelectedTwitterAccount(twitter_account: ITwitterAccount) {\n this.settingsStore.settings.selected_twitter_account_id = twitter_account.id;\n this.selected_twitter_account = twitter_account;\n\n // Twitter アカウントリストのオーバーレイを閉じる (少し待ってから閉じたほうが体感が良い)\n window.setTimeout(() => this.is_twitter_account_list_display = false, 150);\n },\n\n // キャプチャリスト内のキャプチャがクリックされたときのイベント\n clickCapture(capture: ITweetCapture) {\n\n // 選択されたキャプチャが3枚まで & まだ選択されていないならキャプチャをツイート対象に追加する\n if (this.tweet_captures.length < 4 && capture.selected === false) {\n capture.selected = true;\n this.tweet_captures.push(capture.blob);\n } else {\n // ツイート対象のキャプチャになっていたら取り除く\n const index = this.tweet_captures.findIndex(blob => blob === capture.blob);\n if (index > -1) {\n this.tweet_captures.splice(index, 1);\n }\n // キャプチャの選択を解除\n capture.selected = false;\n }\n },\n\n // 撮ったキャプチャを親コンポーネントから受け取り、キャプチャリストに追加する\n async addCaptureList(blob: Blob, filename: string) {\n\n if (this.captures_element === null) {\n this.captures_element = this.$el.querySelector('.tab-content--capture')!;\n }\n\n // 撮ったキャプチャが50件を超えていたら、重くなるので古いものから削除する\n // 削除する前に Blob URL を revoke してリソースを解放するのがポイント\n if (this.captures.length > 50) {\n URL.revokeObjectURL(this.captures[0].image_url);\n this.captures.shift();\n }\n\n // キャプチャリストにキャプチャを追加\n const blob_url = URL.createObjectURL(blob);\n this.captures.push({\n blob: blob,\n filename: filename,\n image_url: blob_url,\n selected: false,\n focused: false,\n });\n\n // キャプチャリストを下にスクロール\n // this.$nextTick() のコールバックで DOM の更新を待つ\n this.$nextTick(() => {\n if (this.captures_element === null) return;\n this.captures_element.scrollTo({\n top: this.captures_element.scrollHeight,\n behavior: 'smooth',\n });\n });\n },\n\n // 撮ったキャプチャに番組タイトルの透かしを描画する\n async drawProgramTitleOnCapture(capture: Blob): Promise {\n\n // キャプチャの Blob を createImageBitmap() で Canvas に描ける ImageBitmap に変換\n const image_bitmap = await createImageBitmap(capture);\n\n // OffscreenCanvas が使えるなら使う (OffscreenCanvas の方がパフォーマンスが良い)\n const canvas = ('OffscreenCanvas' in window) ?\n new OffscreenCanvas(image_bitmap.width, image_bitmap.height) : document.createElement('canvas');\n\n // Canvas にキャプチャを描画\n const context = canvas.getContext('2d', {\n alpha: false,\n desynchronized: true,\n willReadFrequently: false,\n }) as OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n context.drawImage(image_bitmap, 0, 0);\n image_bitmap.close();\n\n // 描画設定\n context.font = 'bold 22px \"YakuHanJPs\", \"Open Sans\", \"Hiragino Sans\", \"Noto Sans JP\", sans-serif'; // フォント\n context.fillStyle = 'rgba(255, 255, 255, 70%)'; // 半透明の白\n context.shadowColor = 'rgba(0, 0, 0, 100%)'; // 影の色\n context.shadowBlur = 4; // 影をぼかすしきい値\n context.shadowOffsetX = 0; // 影のX座標\n context.shadowOffsetY = 0; // 影のY座標\n\n // 番組タイトルの透かしを描画\n const title = this.channelsStore.channel.current.program_present?.title ?? '放送休止';\n switch (this.settingsStore.settings.tweet_capture_watermark_position) {\n case 'TopLeft': {\n context.textAlign = 'left'; // 左寄せ\n context.textBaseline = 'top'; // ベースラインを上寄せ\n context.fillText(title, 16, 12);\n break;\n }\n case 'TopRight': {\n context.textAlign = 'right'; // 右寄せ\n context.textBaseline = 'top'; // ベースラインを上寄せ\n context.fillText(title, canvas.width - 16, 12);\n break;\n }\n case 'BottomLeft': {\n context.textAlign = 'left'; // 左寄せ\n context.textBaseline = 'bottom'; // ベースラインを下寄せ\n context.fillText(title, 16, canvas.height - 12);\n break;\n }\n case 'BottomRight': {\n context.textAlign = 'right'; // 右寄せ\n context.textBaseline = 'bottom'; // ベースラインを下寄せ\n context.fillText(title, canvas.width - 16, canvas.height - 12);\n break;\n }\n }\n\n // Blob にして返す\n if (canvas instanceof OffscreenCanvas) {\n return await canvas.convertToBlob({type: 'image/jpeg', quality: 1});\n } else {\n return new Promise((resolve, reject) => canvas.toBlob(blob => {\n if (blob === null) {\n reject();\n } else {\n resolve(blob);\n }\n }, 'image/jpeg', 1));\n }\n },\n\n // チャンネル名から対応する局タグを取得する\n // とりあえず三大首都圏 + BS のみ対応\n getChannelHashtag(channel_name: string): string | null {\n // NHK\n if (channel_name.startsWith('NHK総合')) {\n return '#nhk';\n } else if (channel_name.startsWith('NHKEテレ')) {\n return '#etv';\n // 民放\n } else if (channel_name.startsWith('日テレ')) {\n return '#ntv';\n } else if (channel_name.startsWith('読売テレビ')) {\n return '#ytv';\n } else if (channel_name.startsWith('中京テレビ')) {\n return '#chukyotv';\n } else if (channel_name.startsWith('テレビ朝日')) {\n return '#tvasahi';\n } else if (channel_name.startsWith('ABCテレビ')) {\n return '#abc';\n } else if (channel_name.startsWith('メ~テレ')) {\n return '#nagoyatv';\n } else if (channel_name.startsWith('TBS') && !channel_name.includes('TBSチャンネル')) {\n return '#tbs';\n } else if (channel_name.startsWith('MBS')) {\n return '#mbs';\n } else if (channel_name.startsWith('CBC')) {\n return '#cbc';\n } else if (channel_name.startsWith('テレビ東京')) {\n return '#tvtokyo';\n } else if (channel_name.startsWith('テレビ大阪')) {\n return '#tvo';\n } else if (channel_name.startsWith('テレビ愛知')) {\n return '#tva';\n } else if (channel_name.startsWith('フジテレビ')) {\n return '#fujitv';\n } else if (channel_name.startsWith('関西テレビ')) {\n return '#kantele';\n } else if (channel_name.startsWith('東海テレビ')) {\n return '#tokaitv';\n // 独立局\n } else if (channel_name.startsWith('TOKYO MX')) {\n return '#tokyomx';\n } else if (channel_name.startsWith('tvk')) {\n return '#tvk';\n } else if (channel_name.startsWith('チバテレ')) {\n return '#chibatv';\n } else if (channel_name.startsWith('テレ玉')) {\n return '#teletama';\n } else if (channel_name.startsWith('サンテレビ')) {\n return '#suntv';\n } else if (channel_name.startsWith('KBS京都')) {\n return '#kbs';\n // BS・CS\n } else if (channel_name.startsWith('NHKBS1')) {\n return '#nhkbs1';\n } else if (channel_name.startsWith('NHKBSプレミアム')) {\n return '#nhkbsp';\n } else if (channel_name.startsWith('BS日テレ')) {\n return '#bsntv';\n } else if (channel_name.startsWith('BS朝日')) {\n return '#bsasahi';\n } else if (channel_name.startsWith('BS-TBS')) {\n return '#bstbs';\n } else if (channel_name.startsWith('BSテレ東')) {\n return '#bstvtokyo';\n } else if (channel_name.startsWith('BSフジ')) {\n return '#bsfuji';\n } else if (channel_name.startsWith('BS11イレブン')) {\n return '#bs11';\n } else if (channel_name.startsWith('BS12トゥエルビ')) {\n return '#bs12';\n } else if (channel_name.startsWith('AT-X')) {\n return '#at_x';\n }\n\n return null;\n },\n\n // ハッシュタグを整形(余計なスペースなどを削り、全角ハッシュを半角ハッシュへ、全角スペースを半角スペースに置換)\n formatHashtag(tweet_hashtag: string, from_hashtag_list: boolean = false): string {\n\n // ハッシュとスペースの表記ゆれを統一し、連続するハッシュやスペースを1つにする\n const tweet_hashtag_array = tweet_hashtag.trim()\n .replaceAll('♯', '#').replaceAll('#', '#').replace(/#{2,}/g, '#').replaceAll(' ', ' ').replaceAll(/ +/g,' ').split(' ')\n .filter(hashtag => hashtag !== '');\n\n // ハッシュタグがついてない場合にハッシュタグを付与\n for (let index in tweet_hashtag_array) {\n if (!tweet_hashtag_array[index].startsWith('#')) {\n tweet_hashtag_array[index] = `#${tweet_hashtag_array[index]}`;\n }\n }\n\n // 設定でオンになっている場合のみ、視聴中チャンネルの局タグを自動で追加する (ハッシュタグリスト内のハッシュタグは除外)\n if (this.settingsStore.settings.auto_add_watching_channel_hashtag === true && from_hashtag_list === false) {\n const channel_hashtag = this.getChannelHashtag(this.channelsStore.channel.current.name);\n if (channel_hashtag !== null) {\n if (tweet_hashtag_array.includes(channel_hashtag) === false) {\n tweet_hashtag_array.push(channel_hashtag);\n }\n }\n }\n\n return tweet_hashtag_array.join(' ');\n },\n\n // ツイートを送信する\n async sendTweet() {\n if (this.selected_twitter_account === null) return;\n\n // 送信中フラグを立てる (重複送信防止)\n if (this.is_tweet_sending === true) return;\n this.is_tweet_sending = true;\n\n // ハッシュタグを整形\n this.tweet_hashtag = this.formatHashtag(this.tweet_hashtag);\n this.updateTweetLetterCount();\n const tweet_hashtag = this.tweet_hashtag;\n\n // 実際に送るツイート本文を作成\n let tweet_text = this.tweet_text;\n if (tweet_hashtag !== '') { // ハッシュタグが入力されているときのみ\n switch (this.settingsStore.settings.tweet_hashtag_position) {\n // ツイート本文の前に追加する\n case 'Prepend': {\n tweet_text = `${tweet_hashtag} ${this.tweet_text}`;\n break;\n }\n // ツイート本文の後に追加する\n case 'Append': {\n tweet_text = `${this.tweet_text} ${tweet_hashtag}`;\n break;\n }\n // ツイート本文の前に追加してから改行する\n case 'PrependWithLineBreak': {\n tweet_text = `${tweet_hashtag}\\n${this.tweet_text}`;\n break;\n }\n // ツイート本文の後に改行してから追加する\n case 'AppendWithLineBreak': {\n tweet_text = `${this.tweet_text}\\n${tweet_hashtag}`;\n break;\n }\n }\n }\n\n // キャプチャへの透かしの描画がオンの場合、キャプチャの Blob を透かし付きのものに差し替える\n const new_tweet_captures: Blob[] = [];\n for (let tweet_capture of this.tweet_captures) {\n if (this.settingsStore.settings.tweet_capture_watermark_position !== 'None') {\n tweet_capture = await this.drawProgramTitleOnCapture(tweet_capture);\n }\n new_tweet_captures.push(tweet_capture);\n }\n\n // ツイート送信 API にリクエスト\n // レスポンスは待たない\n Twitter.sendTweet(this.selected_twitter_account.screen_name, tweet_text, new_tweet_captures).then((result) => {\n this.player.notice(result.message, undefined, undefined, result.is_error ? '#FF6F6A' : undefined);\n });\n\n // 連投防止のため、フォーム上のツイート本文・キャプチャの選択・キャプチャのフォーカスを消去\n // 送信した感を出す意味合いもある\n for (const capture of this.captures) {\n capture.selected = false;\n capture.focused = false;\n }\n this.tweet_captures = [];\n this.tweet_text = '';\n\n // 送信中フラグを下ろす\n this.is_tweet_sending = false;\n\n // パネルを閉じるように親コンポーネントに伝える\n if (this.settingsStore.settings.fold_panel_after_sending_tweet === true) {\n this.$emit('panel_folding_requested');\n (this.$refs.tweet_text as HTMLTextAreaElement).blur(); // フォーカスを外す\n }\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Twitter.vue?vue&type=template&id=51116497&scoped=true&\"\nimport script from \"./Twitter.vue?vue&type=script&lang=ts&\"\nexport * from \"./Twitter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Twitter.vue?vue&type=style&index=0&id=51116497&prod&lang=scss&\"\nimport style1 from \"./Twitter.vue?vue&type=style&index=1&id=51116497&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"51116497\",\n null\n \n)\n\nexport default component.exports","\nimport Message from '@/message';\nimport APIClient from '@/services/APIClient';\n\n\nclass Captures {\n\n /**\n * キャプチャをサーバーにアップロードし保存する\n * @param blob キャプチャ画像の Blob\n * @param filename サーバーに保存するときのファイル名\n */\n static async uploadCapture(blob: Blob, filename: string): Promise {\n\n // キャプチャ画像の File オブジェクト (= Blob) を FormData に入れる\n // multipart/form-data で送るために必要\n // ref: https://r17n.page/2020/02/04/nodejs-axios-file-upload-api/\n const form_data = new FormData();\n form_data.append('image', blob, filename);\n\n // API リクエストを実行\n const response = await APIClient.post('/captures', form_data, {headers: {'Content-Type': 'multipart/form-data'}});\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Permission denied to save the file': {\n Message.error('キャプチャのアップロードに失敗しました。保存先フォルダに書き込み権限がありません。');\n break;\n }\n case 'No space left on the device': {\n Message.error('キャプチャのアップロードに失敗しました。保存先フォルダに空き容量がありません。');\n break;\n }\n case 'Unexpected error occurred while saving the file': {\n Message.error('キャプチャのアップロードに失敗しました。保存中に予期しないエラーが発生しました。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'キャプチャのアップロードに失敗しました。');\n break;\n }\n }\n return;\n }\n }\n\n // TODO: キャプチャリスト機能の実装時にいろいろ追加する\n}\n\nexport default Captures;\n","\nimport { Buffer } from 'buffer';\n\nimport { convertBlobToPng, copyBlobToClipboard } from 'copy-image-clipboard';\nimport dayjs from 'dayjs';\nimport DPlayer from 'dplayer';\nimport 'dayjs/locale/ja';\nimport * as piexif from 'piexifjs';\n\nimport APIClient from '@/services/APIClient';\nimport Captures from '@/services/Captures';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\n\n\n// キャプチャに書き込む EXIF メタデータのインターフェイス\ninterface ICaptureExifData {\n captured_at: string;\n captured_playback_position: number;\n network_id: number;\n service_id: number;\n event_id: number;\n title: string;\n description: string;\n start_time: string;\n end_time: string;\n duration: number;\n caption_text: string | null;\n is_caption_composited: boolean;\n is_comment_composited: boolean;\n}\n\n// CaptureManager.setEXIFDataToCapture() のオプションのインターフェイス\ninterface ISetEXIFDataToCaptureOptions {\n network_id: number;\n service_id: number;\n event_id: number;\n title: string;\n description: string;\n start_time: string;\n end_time: string;\n duration: number;\n caption_text: string | null;\n is_caption_composited: boolean;\n is_comment_composited: boolean;\n}\n\n// Web フォントを Base64 化したデータ (コメントを SVG の foreignObject としてレンダリングする際に必要)\nlet web_font_noto_sans_base64: string | null = null;\nlet web_font_open_sans_base64: string | null = null;\n\n\nclass CaptureManager {\n\n private player: DPlayer;\n private player_container: HTMLElement;\n private captured_callback: (blob: Blob, filename: string) => void;\n private capture_button: HTMLDivElement;\n private comment_capture_button: HTMLDivElement;\n private canvas: OffscreenCanvas | HTMLCanvasElement;\n private canvas_context: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n private settings_store = useSettingsStore();\n\n constructor(options: {\n player: DPlayer;\n captured_callback: (blob: Blob, filename: string) => void;\n }) {\n this.player = options.player;\n this.player_container = this.player.container;\n this.captured_callback = options.captured_callback;\n\n // コメント付きキャプチャボタンの HTML を追加\n // insertAdjacentHTML で .dplayer-icons-right の一番左側に配置する\n // この後に通常のキャプチャボタンが insert されるので、実際は左から2番目\n // TODO: ボタンのデザインをコメント付きだと分かるようなものに変更する\n this.player_container.querySelector('.dplayer-icons.dplayer-icons-right')!.insertAdjacentHTML('afterbegin', `\n
\n \n \n \n
\n `);\n\n // キャプチャボタンの HTML を追加\n // 標準のスクリーンショット機能は貧弱なので、あえて独自に実装している(そのほうが自由度も高くてやりやすい)\n // insertAdjacentHTML で .dplayer-icons-right の一番左側に配置する\n this.player_container.querySelector('.dplayer-icons.dplayer-icons-right')!.insertAdjacentHTML('afterbegin', `\n
\n \n \n \n
\n `);\n\n this.comment_capture_button = this.player_container.querySelector('.dplayer-comment-capture-icon')!;\n this.capture_button = this.player_container.querySelector('.dplayer-capture-icon')!;\n\n // もし Web フォントがダウンロードされていないならダウンロード\n // コメントのレンダリングに最低限必要なウェイトのみダウンロードする\n // 待つ必要はないので非同期で実行\n // ref: https://stackoverflow.com/a/66969479/17124142\n (async () => {\n const web_font_noto_sans_url = 'https://cdn.jsdelivr.net/npm/noto-sans-japanese@1.0.0/fonts/NotoSansJP-Bold.woff2';\n const web_font_open_sans_url = 'https://cdn.jsdelivr.net/npm/open-sans-all@0.1.3/fonts/open-sans-700.woff2';\n const base64_font_prefix = 'data:font/woff2;base64,';\n if (web_font_noto_sans_base64 === null) {\n const web_font_noto_sans: ArrayBuffer = (await APIClient.get(web_font_noto_sans_url, {\n responseType: 'arraybuffer',\n })).data;\n // Buffer で受け取ったデータを Base64 に変換\n web_font_noto_sans_base64 = base64_font_prefix + Buffer.from(web_font_noto_sans).toString('base64');\n }\n if (web_font_open_sans_base64 === null) {\n const web_font_open_sans: ArrayBuffer = (await APIClient.get(web_font_open_sans_url, {\n responseType: 'arraybuffer',\n })).data;\n // Buffer で受け取ったデータを Base64 に変換\n web_font_open_sans_base64 = base64_font_prefix + Buffer.from(web_font_open_sans).toString('base64');\n }\n })();\n }\n\n\n /**\n * 映像をキャプチャして保存する\n * 映像のみと字幕付き (字幕表示時のみ) の両方のキャプチャを生成できる\n * @param with_comments キャプチャにコメントを合成するかどうか\n */\n public async captureAndSave(with_comments: boolean): Promise {\n\n const total_time = Utils.time();\n\n // チャンネル情報を取得 (ライブ視聴画面のみ、ビデオ視聴画面では null になる)\n const channels_store = useChannelsStore();\n const channel = channels_store.is_showing_live ? channels_store.channel.current : null;\n\n // ***** バリデーション *****\n\n // ラジオチャンネルを視聴している場合 (当然映像がないのでキャプチャできない)\n if (channel !== null && channel.is_radiochannel === true) {\n this.player.notice('ラジオチャンネルはキャプチャできません。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // まだ映像の表示準備が終わっていない (Canvas の幅/高さが 0 のまま)\n if (this.player.video.videoWidth === 0 && this.player.video.videoHeight === 0) {\n this.player.notice('読み込み中はキャプチャできません。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // コメントが表示されていないのにコメント付きキャプチャしようとした\n if (with_comments === true && this.player.danmaku!.showing === false) {\n this.player.notice('コメントを付けてキャプチャするには、コメント表示をオンにしてください。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // ***** キャプチャの下準備 *****\n\n // キャプチャ中はキャプチャボタンをハイライトする\n this.addHighlight(with_comments);\n\n // ファイル名(拡張子なし)\n // TODO: ファイル名パターンを変更できるようにする\n const filename_base = `Capture_${dayjs().format('YYYYMMDD-HHmmss')}`;\n const filename = `${filename_base}.jpg`; // 字幕なしキャプチャ\n const filename_caption = `${filename_base}_caption.jpg`; // 字幕ありキャプチャ\n\n // 字幕・文字スーパーの Canvas を取得\n // getRawCanvas() で映像と同じ解像度の Canvas が取得できる\n const aribb24_caption = this.player.plugins.aribb24Caption!;\n const aribb24_superimpose = this.player.plugins.aribb24Superimpose ?? null;\n const caption_canvas = aribb24_caption.getRawCanvas()!;\n const superimpose_canvas = aribb24_superimpose?.getRawCanvas() ?? null;\n\n // 字幕が表示されているか\n const is_caption_showing = ((aribb24_caption as any).isShowing === true && aribb24_caption.isPresent());\n\n // 文字スーパーが表示されているか\n const is_superimpose_showing = (aribb24_superimpose && (aribb24_superimpose as any).isShowing === true && aribb24_superimpose.isPresent());\n\n // 字幕が表示されている場合、表示中の字幕のテキストを取得\n // 取得した字幕のテキストは、キャプチャに字幕が合成されているかに関わらず、常に EXIF メタデータに書き込まれる\n // 字幕が表示されていない場合は null を入れ、キャプチャしたシーンで字幕が表示されていなかったことを明示する\n const caption_text = is_caption_showing ? aribb24_caption.getTextContent() : null;\n\n // EXIF に書き込むメタデータを取得する\n // ライブ視聴画面では、番組情報から EXIF に書き込むメタデータを取得する\n let exif_options: ISetEXIFDataToCaptureOptions;\n if (channel !== null) {\n exif_options = {\n network_id: channel.network_id,\n service_id: channel.service_id,\n event_id: channel.program_present?.event_id ?? -1,\n title: channel.program_present?.title ?? '放送休止',\n description: channel.program_present?.description ?? '',\n start_time: channel.program_present?.start_time ?? '2000-01-01T00:00:00+09:00',\n end_time: channel.program_present?.end_time ?? '2000-01-01T00:00:00+09:00',\n duration: channel.program_present?.duration ?? 0,\n caption_text: caption_text,\n is_caption_composited: false, // 後で上書きされる\n is_comment_composited: false, // 後で上書きされる\n };\n // ビデオ視聴画面では、録画番組情報から EXIF に書き込むメタデータを取得する\n } else {\n // TODO\n exif_options = {\n network_id: -1,\n service_id: -1,\n event_id: -1,\n title: '録画番組',\n description: '',\n start_time: '2000-01-01T00:00:00+09:00',\n end_time: '2000-01-01T00:00:00+09:00',\n duration: 0,\n caption_text: caption_text,\n is_caption_composited: false, // 後で上書きされる\n is_comment_composited: false, // 後で上書きされる\n };\n }\n\n // エクスポートして保存する共通処理\n const export_and_save = async (\n canvas: OffscreenCanvas | HTMLCanvasElement,\n filename: string,\n exif_options: ISetEXIFDataToCaptureOptions,\n ): Promise => {\n\n // Canvas を Blob にエクスポート\n const time = Utils.time();\n let blob: Blob;\n try {\n blob = await this.exportToBlob(canvas);\n } catch (error) {\n console.log(error);\n this.player.notice('キャプチャの保存に失敗しました。', undefined, undefined, '#FF6F6A');\n return false;\n }\n console.log('[CaptureManager] Export to Blob:', Utils.mathFloor(Utils.time() - time, 3), 'sec');\n\n // キャプチャに番組情報などのメタデータ (EXIF) をセット\n blob = await this.setEXIFDataToCapture(blob, exif_options);\n\n // キャプチャの保存先: ブラウザでダウンロード or 両方\n if (['Browser', 'Both'].includes(this.settings_store.settings.capture_save_mode)) {\n Utils.downloadBlobData(blob, filename);\n }\n\n // キャプチャの保存先: KonomiTV サーバーにアップロード or 両方\n // 時間がかかるし完了を待つ必要がないので非同期\n if (['UploadServer', 'Both'].includes(this.settings_store.settings.capture_save_mode)) {\n Captures.uploadCapture(blob, filename);\n }\n\n return blob;\n };\n\n // ***** 映像のキャプチャ *****\n\n // null はまだキャプチャしていないことを、false はキャプチャに失敗したことを表す\n let capture_normal: {blob: Blob, filename: string} | null | false = null;\n let capture_caption: {blob: Blob, filename: string} | null | false = null;\n\n // 映像の ImageBitmap を取得\n const image_bitmap = await createImageBitmap(this.player.video);\n\n // もし映像以外に追加で合成するものがないなら、処理の高速化のために ImageBitmap をそのまま Canvas に転送して Blob 化する\n // コメントキャプチャではない & 文字スーパーが表示されていない (=合成処理を行う必要がない) &\n // (字幕が表示されていない or 字幕が表示されているが合成しないように設定されている) 場合\n // コメント付きキャプチャではなく、かつ字幕のない番組では大半がここの処理を通ることになる\n if (with_comments === false && is_superimpose_showing === false &&\n (is_caption_showing === false || this.settings_store.settings.capture_caption_mode === 'VideoOnly')) {\n\n // OffscreenCanvas が使えるなら使う (OffscreenCanvas の方がパフォーマンスが良い)\n const bitmap_canvas = ('OffscreenCanvas' in window) ?\n new OffscreenCanvas(image_bitmap.width, image_bitmap.height) : document.createElement('canvas');\n bitmap_canvas.width = image_bitmap.width; // HTMLCanvasElement でのフォールバック用\n bitmap_canvas.height = image_bitmap.height; // HTMLCanvasElement でのフォールバック用\n const canvas_context = bitmap_canvas.getContext('bitmaprenderer', {alpha: false}) as ImageBitmapRenderingContext;\n\n // Canvas に映像がキャプチャされた ImageBitmap を転送\n // 描画ではなくゼロコピーで転送しているらしい…?\n canvas_context.transferFromImageBitmap(image_bitmap);\n image_bitmap.close(); // 今後使うことはないので明示的に閉じる\n\n // ファイル名\n // 保存モードが「字幕キャプチャのみ」のとき (=字幕キャプチャのみをキャプチャする設定にしていたが、字幕がそもそもないとき) は、\n // 便宜上字幕ありキャプチャと同じファイル名で保存する\n const filename_real =\n (this.settings_store.settings.capture_caption_mode === 'CompositingCaption') ? filename_caption : filename;\n\n // Blob にエクスポートして保存\n // false が返ってきた場合は失敗を意味する\n const blob = await export_and_save(bitmap_canvas, filename_real, {\n ...exif_options,\n is_caption_composited: false,\n is_comment_composited: false,\n });\n if (blob !== false) {\n capture_normal = {blob: blob, filename: filename_real};\n } else {\n capture_normal = false; // キャプチャのエクスポートに失敗\n }\n\n // キャプチャの Blob をコールバック関数に渡す\n // ここでコールバック関数に渡した Blob が Twitter タブのキャプチャリストに送られる\n if (capture_normal !== false) {\n this.captured_callback(capture_normal.blob, capture_normal.filename);\n }\n\n // ***** 通常実行 (Canvas にキャプチャ以外のデータを重ねて描画する必要があるケース) *****\n } else {\n\n const promises: Promise[] = [];\n\n // キャプチャ用の Canvas を初期化\n // OffscreenCanvas が使えるなら使う (OffscreenCanvas の方がパフォーマンスが良い)\n const canvas = ('OffscreenCanvas' in window) ?\n new OffscreenCanvas(this.player.video.videoWidth, this.player.video.videoHeight) : document.createElement('canvas');\n canvas.width = this.player.video.videoWidth; // HTMLCanvasElement でのフォールバック用\n canvas.height = this.player.video.videoHeight; // HTMLCanvasElement でのフォールバック用\n const canvas_context = canvas.getContext('2d', {\n alpha: false,\n desynchronized: true,\n willReadFrequently: false,\n }) as OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n // Canvas に映像がキャプチャされた ImageBitmap を描画\n canvas_context.drawImage(image_bitmap, 0, 0, canvas.width, canvas.height);\n\n // 文字スーパーを描画 (表示されている場合)\n // 文字スーパー自体が稀だし、文字スーパーなしでキャプチャ撮りたいユースケースはない…はず\n if (superimpose_canvas && is_superimpose_showing === true) {\n canvas_context.drawImage(superimpose_canvas, 0, 0, canvas.width, canvas.height);\n }\n\n // コメント付きキャプチャ: 追加でニコニコ実況のコメントを描画\n let comments_image: HTMLImageElement | null = null;\n if (with_comments === true) {\n comments_image = await this.createCommentsImage();\n await this.drawComments(canvas, canvas_context, comments_image);\n }\n\n // ***** 映像のみのキャプチャを保存 *****\n\n // 字幕表示時のキャプチャの保存モード: 映像のみ or 両方\n // 保存モードが「字幕キャプチャのみ」になっているが字幕が表示されていない場合も実行する\n if (['VideoOnly', 'Both'].includes(this.settings_store.settings.capture_caption_mode) || is_caption_showing === false) {\n\n promises.push((async () => {\n\n // ファイル名\n // 保存モードが「字幕キャプチャのみ」のとき (=字幕キャプチャのみをキャプチャする設定にしていたが、字幕がそもそもないとき) は、\n // 便宜上字幕ありキャプチャと同じファイル名で保存する\n const filename_real =\n (this.settings_store.settings.capture_caption_mode === 'CompositingCaption') ? filename_caption : filename;\n\n // Blob にエクスポートして保存\n const blob = await export_and_save(canvas, filename_real, {\n ...exif_options,\n is_caption_composited: false,\n is_comment_composited: with_comments,\n });\n if (blob !== false) {\n capture_normal = {blob: blob, filename: filename_real};\n } else {\n capture_normal = false; // キャプチャのエクスポートに失敗\n }\n\n // キャプチャの Blob をコールバック関数に渡す\n // ここでコールバック関数に渡した Blob が Twitter タブのキャプチャリストに送られる\n if (capture_normal !== false) {\n this.captured_callback(capture_normal.blob, capture_normal.filename);\n }\n\n })());\n }\n\n // ***** 字幕付きのキャプチャを保存 *****\n\n // 字幕表示時のキャプチャの保存モード: 字幕キャプチャのみ or 両方\n // 字幕が表示されているときのみ実行(字幕が表示されていないのにやっても意味がない)\n if (['CompositingCaption', 'Both'].includes(this.settings_store.settings.capture_caption_mode) && is_caption_showing === true) {\n\n promises.push((async () => {\n\n // コメント付きキャプチャ: 映像と文字スーパーの描画をやり直す\n // すでに字幕なしキャプチャを生成する過程でコメントを描画してしまっているため、映像描画からやり直す必要がある\n if (with_comments === true) {\n canvas_context.drawImage(image_bitmap, 0, 0, canvas.width, canvas.height);\n if (superimpose_canvas && is_superimpose_showing === true) {\n canvas_context.drawImage(superimpose_canvas, 0, 0, canvas.width, canvas.height);\n }\n }\n image_bitmap.close(); // 今後使うことはないので明示的に閉じる\n\n // 字幕を重ねて描画\n canvas_context.drawImage(caption_canvas, 0, 0, canvas.width, canvas.height);\n\n // コメント付きキャプチャ: 追加でニコニコ実況のコメントを描画\n if (with_comments === true && comments_image !== null) {\n await this.drawComments(canvas, canvas_context, comments_image);\n }\n\n // Blob にエクスポートして保存\n const blob = await export_and_save(canvas, filename_caption, {\n ...exif_options,\n is_caption_composited: true,\n is_comment_composited: with_comments,\n });\n if (blob !== false) {\n capture_caption = {blob: blob, filename: filename_caption};\n } else {\n capture_caption = false; // キャプチャのエクスポートに失敗\n }\n\n // キャプチャの Blob をコールバック関数に渡す\n // ここでコールバック関数に渡した Blob が Twitter タブのキャプチャリストに送られる\n if (capture_caption !== false) {\n // 字幕表示時のキャプチャの保存モードが「両方 (Both)」のときのみ、映像のみのキャプチャの生成が終わるまで待ってから実行\n // 必ずキャプチャリストへの追加が [映像のみ] → [字幕付き] の順序で行われるようにする\n if (this.settings_store.settings.capture_caption_mode === 'Both') {\n while (capture_normal === null) {\n // Blob (成功) か false (失敗) が capture_normal に入るまでループ\n await Utils.sleep(0.01);\n }\n }\n this.captured_callback(capture_caption.blob, capture_caption.filename);\n }\n\n })());\n }\n\n // すべてのキャプチャ処理が終わるまで待つ\n await Promise.all(promises);\n }\n\n console.log('[CaptureManager] Total:', Utils.mathFloor(Utils.time() - total_time, 3), 'sec');\n\n // キャプチャボタンのハイライトを削除する\n this.removeHighlight(with_comments);\n\n // Twitter タブのキャプチャリストに送る処理が最優先なので、コールバックを実行しきった後に時間のかかるクリップボードへのコピーを行う\n for (const capture of [capture_normal, capture_caption]) {\n\n // クリップボードへのコピーが有効なら、キャプチャの Blob をクリップボードにコピー\n // PNG 以外は受け付けないそうなので、JPEG を PNG に変換してからコピーしている\n if (this.settings_store.settings.capture_copy_to_clipboard && capture !== null && typeof capture === 'object') {\n try {\n await copyBlobToClipboard(await convertBlobToPng(capture.blob));\n } catch (error) {\n this.player.notice('クリップボードへのキャプチャのコピーに失敗しました。', undefined, undefined, '#FF6F6A');\n console.error(error);\n }\n }\n }\n }\n\n\n /**\n * キャプチャボタンをハイライトする\n * @param with_comments コメント付きキャプチャボタンをハイライトするか\n */\n private addHighlight(with_comments: boolean = false): void {\n if (with_comments) {\n this.comment_capture_button.classList.add('dplayer-capturing');\n } else {\n this.capture_button.classList.add('dplayer-capturing');\n }\n }\n\n\n /**\n * キャプチャボタンのハイライトを外す\n * @param with_comments コメント付きキャプチャボタンのハイライトを外すか\n */\n private removeHighlight(with_comments: boolean = false): void {\n if (with_comments) {\n this.comment_capture_button.classList.remove('dplayer-capturing');\n } else {\n this.capture_button.classList.remove('dplayer-capturing');\n }\n }\n\n\n /**\n * DPlayer から取得したコメント HTML を SVG 画像の HTMLImageElement に変換する\n * ZenzaWatch と html-to-image を参考に実装した\n * ref: https://github.com/bubkoo/html-to-image/blob/v1.11.11/src/util.ts#L202-L224\n * ref: https://github.com/segabito/ZenzaWatch/blob/master/packages/lib/src/dom/VideoCaptureUtil.js\n * ref: https://web.archive.org/web/2/https://developer.mozilla.org/ja/docs/Web/HTML/Canvas/Drawing_DOM_objects_into_a_canvas\n * @param comments_html DPlayer から取得したコメント HTML\n * @param width SVG 画像の幅\n * @param height SVG 画像の高さ\n * @returns SVG 画像の HTMLImageElement\n */\n private async commentsHTMLtoSVGImage(comments_html: string, width: number, height: number): Promise {\n\n // SVG の foreignObject を使い、HTML をそのまま SVG に埋め込む\n\n // SVG を作成\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n\n // SVG に foreignObject を追加\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n\n // foreignObject にコンテナ要素を追加\n const body = document.createElement('body');\n foreignObject.appendChild(body);\n\n // コンテナ要素に CSS と Web フォントの定義を追加\n // SVG なので、CSS はインラインでないと適用されない…\n // DPlayer の danmaku.scss の内容のうち、描画に必要なプロパティのみを列挙 (追加変更したものもある)\n // ref: https://github.com/tsukumijima/DPlayer/blob/master/src/css/danmaku.scss\n const style = document.createElement('style');\n style.appendChild(document.createTextNode(`\n @font-face {\n font-family: 'Noto Sans JP';\n font-weight: bold;\n src: url(${web_font_noto_sans_base64}) format('woff2');\n }\n @font-face {\n font-family: 'Open Sans';\n font-weight: bold;\n src: url(${web_font_open_sans_base64}) format('woff2');\n }\n .dplayer-danmaku {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: #fff;\n font-size: 29px;\n font-family: 'Open Sans', 'Hiragino Sans', 'Noto Sans JP', sans-serif;\n }\n .dplayer-danmaku .dplayer-danmaku-item {\n display: inline-block;\n line-height: 1;\n font-weight: bold;\n font-size: var(--dplayer-danmaku-font-size);\n opacity: var(--dplayer-danmaku-opacity);\n text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\n white-space: nowrap;\n }\n .dplayer-danmaku .dplayer-danmaku-item--demo {\n position: absolute;\n visibility: hidden;\n }\n .dplayer-danmaku .dplayer-danmaku-item span {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big {\n font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small {\n font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\n }\n .dplayer-danmaku .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n }\n .dplayer-danmaku .dplayer-danmaku-top, .dplayer-danmaku .dplayer-danmaku-bottom {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n `));\n body.appendChild(style);\n\n // コンテナ要素にコメントの HTML を追加\n const temp = document.createElement('div');\n temp.innerHTML = comments_html;\n body.appendChild(temp.childNodes[0]);\n\n // Data URL 化して Image オブジェクトにする\n const image = new Image();\n const serialized_svg = new XMLSerializer().serializeToString(svg);\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(serialized_svg)}`;\n\n // 画像を読み込んでデコードしてから返す\n await new Promise((resolve, reject) => {\n image.onload = resolve;\n image.onerror = reject;\n });\n await image.decode();\n return image;\n }\n\n\n /**\n * DPlayer から表示中のコメントを取得し、SVG 画像の HTMLImageElement を作成する\n * @returns 表示されているコメントが描画された HTMLImageElement\n */\n private async createCommentsImage(): Promise {\n\n // コメントが表示されている要素の HTML を取得する\n let comments_html = this.player.template.danmaku.outerHTML;\n\n // HTML を取得するだけではスクロール中コメントの表示位置が特定できないため、HTML を修正する\n for (const comment of this.player_container.querySelectorAll('.dplayer-danmaku-move')) { // コメントの数だけ置換\n // スクロール中のコメントの表示座標を計算\n const position = comment.getBoundingClientRect().left - this.player.video.getBoundingClientRect().left;\n comments_html = comments_html.replace(/transform: translateX\\(.*?\\);/, `left: ${position}px;`)\n .replaceAll('border: 2px solid #E64F97;', '');\n }\n\n // HTML を画像として取得\n // SVG のサイズはコメントが表示されている要素に合わせる (そうしないとプレイヤー側と一致しない)\n // SVG はベクター画像なので、リサイズしても画質が変わらないはず\n return await this.commentsHTMLtoSVGImage(\n comments_html,\n this.player.template.danmaku.offsetWidth,\n this.player.template.danmaku.offsetHeight,\n );\n }\n\n\n /**\n * 現在表示されているニコニコ実況のコメントを Canvas に描画する\n */\n private async drawComments(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n canvas_context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n comments_image: HTMLImageElement,\n ): Promise {\n\n // コメント描画領域がコントロールの表示によりリサイズされている (=16:9でない) 場合も考慮して、コメント要素の offsetWidth から高さを求める\n // 映像の横解像度 (ex: 1920) がコメント描画領域の幅 (ex: 1280) の何倍かの割合 (ex: 1.5 (150%))\n const draw_scale_ratio = canvas.width / this.player.template.danmaku.offsetWidth;\n\n // コメント描画領域の高さを映像の横解像度に合わせて(コメント描画領域のアスペクト比を維持したまま)拡大した値\n // 映像の縦解像度が 1080 のとき、コントロールがコメント領域と被っていない or 表示されていないなら、この値は 1080 に近くなる\n const draw_height = this.player.template.danmaku.offsetHeight * draw_scale_ratio;\n\n canvas_context.drawImage(comments_image, 0, 0, canvas.width, draw_height);\n }\n\n\n /**\n * Canvas もしくは OffscreenCanvas に描画されている画像を Blob に変換する\n * JPEG 画像の品質は 99% にした方が若干 Blob 変換までの速度が速い (?)\n * @param canvas Canvas もしくは OffscreenCanvas\n * @returns Blob 化した画像\n */\n private async exportToBlob(canvas: HTMLCanvasElement | OffscreenCanvas): Promise {\n if ('OffscreenCanvas' in window && canvas instanceof OffscreenCanvas) {\n return await canvas.convertToBlob({type: 'image/jpeg', quality: 0.99});\n } else if (canvas instanceof HTMLCanvasElement) {\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob !== null) {\n resolve(blob);\n } else {\n reject(new Error('Failed to convert canvas to blob'));\n }\n }, 'image/jpeg', 0.99);\n });\n }\n // ここに来ることはあり得ない\n throw new Error('Failed to convert canvas to blob');\n }\n\n\n /**\n * キャプチャ画像に番組情報と撮影時刻、字幕やコメントが合成されているかどうかのメタデータ (EXIF) をセットする\n * @param blob キャプチャ画像の Blob オブジェクト\n * @param options EXIF にセットする番組情報データ・字幕テキスト・字幕が合成されているかどうか・コメントが合成されているかどうか\n * @returns EXIF が追加されたキャプチャ画像の Blob オブジェクト\n */\n private async setEXIFDataToCapture(blob: Blob, options: ISetEXIFDataToCaptureOptions): Promise {\n\n // 番組開始時刻換算のキャプチャ時刻 (秒)\n const captured_playback_position = dayjs().diff(dayjs(options.start_time), 'second', true);\n\n // EXIF の XPComment 領域に入れるメタデータの JSON オブジェクト\n // 撮影時刻とチャンネル・番組を一意に特定できる情報を入れる\n const json: ICaptureExifData = {\n captured_at: dayjs().format('YYYY-MM-DDTHH:mm:ss+09:00'), // ISO8601 フォーマットのキャプチャ時刻\n captured_playback_position: captured_playback_position, // 番組開始時刻換算のキャプチャ時刻 (秒)\n network_id: options.network_id, // 番組が放送されたチャンネルのネットワーク ID\n service_id: options.service_id, // 番組が放送されたチャンネルのサービス ID\n event_id: options.event_id, // 番組のイベント ID\n title: options.title, // 番組タイトル\n description: options.description, // 番組概要\n start_time: options.start_time, // 番組開始時刻 (ISO8601 フォーマット)\n end_time: options.end_time, // 番組終了時刻 (ISO8601 フォーマット)\n duration: options.duration, // 番組長 (秒)\n caption_text: options.caption_text, // 字幕のテキスト (キャプチャした瞬間に字幕が表示されていなかったときは null)\n is_caption_composited: options.is_caption_composited, // 字幕が合成されているか\n is_comment_composited: options.is_comment_composited, // コメントが合成されているか\n };\n\n // 保存する EXIF メタデータを構築\n // ref: 「カメラアプリで体感するWeb App」4.2\n const datetime = dayjs().format('YYYY:MM:DD HH:mm:ss'); // すべてコロンで区切るのがポイント\n const exif: piexif.IExif = {\n '0th': {\n // 必須らしいプロパティ\n // とりあえずデフォルト値 (?) を設定しておく\n [piexif.TagValues.ImageIFD.XResolution]: [72, 1],\n [piexif.TagValues.ImageIFD.YResolution]: [72, 1],\n [piexif.TagValues.ImageIFD.ResolutionUnit]: 2,\n [piexif.TagValues.ImageIFD.YCbCrPositioning]: 1,\n // 撮影時刻\n [piexif.TagValues.ImageIFD.DateTime]: datetime,\n // ソフトウェア名\n [piexif.TagValues.ImageIFD.Software]: `KonomiTV version ${Utils.version}`,\n // Microsoft 拡張のコメント領域(エクスプローラーで出てくるコメント欄と同じもの)\n // ref: https://stackoverflow.com/a/66186660/17124142\n [piexif.TagValues.ImageIFD.XPComment]: [...Buffer.from(JSON.stringify(json), 'ucs2')],\n },\n 'Exif': {\n // 必須らしいプロパティ\n // とりあえずデフォルト値 (?) を設定しておく\n [piexif.TagValues.ExifIFD.ExifVersion]: '0230',\n [piexif.TagValues.ExifIFD.ComponentsConfiguration]: '\\x01\\x02\\x03\\x00',\n [piexif.TagValues.ExifIFD.FlashpixVersion]: '0100',\n [piexif.TagValues.ExifIFD.ColorSpace]: 1,\n // 撮影時刻\n [piexif.TagValues.ExifIFD.DateTimeOriginal]: datetime,\n [piexif.TagValues.ExifIFD.DateTimeDigitized]: datetime,\n },\n };\n const exif_string = piexif.dump(exif); // バイナリ文字列に変換した EXIF データ\n\n // piexifjs はバイナリ文字列か DataURL しか受け付けないので、Blob をバイナリ文字列に変換\n const blob_string: string = await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsBinaryString(blob); // バイナリ文字列で読み込む\n });\n\n // 画像に EXIF を挿入\n // 戻り値は EXIF が追加された画像のバイナリ文字列 (なぜ未だにバイナリ文字列で実装してるんだ…)\n const blob_string_new = piexif.insert(exif_string, blob_string);\n\n // 画像のバイナリ文字列を ArrayBuffer に変換\n // ref: 「カメラアプリで体感するWeb App」4.2\n const buffer = new Uint8Array(blob_string_new.length);\n for (let index = 0; index < buffer.length; index++) {\n buffer[index] = blob_string_new.charCodeAt(index) & 0xff;\n }\n\n // 新しい Blob を返す\n return new Blob([buffer], {type: blob.type});\n }\n}\n\nexport default CaptureManager;\n","\nimport * as Comlink from 'comlink';\nimport dayjs from 'dayjs';\nimport DPlayer from 'dplayer';\nimport { BMLBrowser, BMLBrowserFontFace } from 'web-bml/client/bml_browser';\nimport { AribKeyCode } from 'web-bml/client/content';\nimport { ResponseMessage } from 'web-bml/server/ws_api';\n\nimport router from '@/router';\nimport PlayerManager from '@/services/player/PlayerManager';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { PlayerUtils, ProgramUtils } from '@/utils';\nimport { ILivePSIArchivedDataDecoder } from '@/workers/LivePSIArchivedDataDecoder';\n\n\n// LivePSIArchivedDataDecoder を Web Worker で動作させるためのラッパー\n// Comlink を使い、Web Worker とメインスレッド間でオブジェクトをやり取りする\nconst worker = new Worker(new URL('@/workers/LivePSIArchivedDataDecoder', import.meta.url));\nconst LivePSIArchivedDataDecoderWorker =\n Comlink.wrap Comlink.Remote>(worker);\n\n\nclass LiveDataBroadcastingManager implements PlayerManager {\n\n // BML 用フォント\n static readonly round_gothic: BMLBrowserFontFace = {\n source: 'url(\"https://cdn.jsdelivr.net/gh/googlefonts/kosugi-maru@main/fonts/webfonts/KosugiMaru-Regular.woff2\"), local(\"sans-serif\")',\n };\n static readonly square_gothic: BMLBrowserFontFace = {\n source: 'url(\"https://cdn.jsdelivr.net/gh/googlefonts/kosugi@main/fonts/webfonts/Kosugi-Regular.woff2\"), local(\"sans-serif\")',\n };\n\n private player: DPlayer;\n private display_channel_id: string;\n private media_element: HTMLElement;\n private container_element: HTMLElement | null = null;\n\n private remocon_element: HTMLElement;\n private remocon_data_broadcasting_element: HTMLElement;\n private remocon_button_event_abort_controller: AbortController | null = null;\n\n // DPlayer のリサイズを監視する ResizeObserver\n private resize_observer: ResizeObserver | null = null;\n\n // BML ブラウザのインスタンス\n // Vue.js は data() で設定した変数を再帰的に監視するが、BMLBrowser 内の JS-Interpreter のインスタンスが\n // Vue.js の監視対象に入ると謎のエラーが発生してしまうため、プロパティを Hard Private にして監視対象から外す\n #bml_browser: BMLBrowser | null = null;\n\n // BML ブラウザの幅と高さ\n private bml_browser_width: number = 960;\n private bml_browser_height: number = 540;\n\n // BML ブラウザが数字キーを文字入力などに利用中かどうか\n private is_bml_browser_using_numeric_key: boolean = false;\n\n // BML ブラウザを破棄中かどうか\n private is_bml_browser_destroying: boolean = false;\n\n // 動画の要素が BML ブラウザ上に移動されているかどうか\n private is_video_element_moved_to_bml_browser: boolean = false;\n\n // PSI/SI アーカイブデータデコーダーのインスタンス\n private live_psi_archived_data_decoder: Comlink.Remote> | null = null;\n\n constructor(options: {\n player: DPlayer;\n display_channel_id: string;\n }) {\n this.player = options.player;\n this.display_channel_id = options.display_channel_id;\n\n // 映像が入る DOM 要素\n // DPlayer 内の dplayer-video-wrap-aspect をそのまま使う (中に映像と字幕が含まれる)\n this.media_element = this.player.template.videoWrapAspect;\n\n // リモコンの DOM 要素\n this.remocon_element = document.querySelector('.remote-control')!;\n this.remocon_data_broadcasting_element = this.remocon_element.querySelector('.remote-control-data-broadcasting')!;\n }\n\n\n /**\n * LiveDataBroadcastingManager での処理を開始する\n * EDCB Legacy WebUI での実装を参考にした\n * ref: https://github.com/xtne6f/EDCB/blob/work-plus-s-230212/ini/HttpPublic/legacy/util.lua#L444-L497\n */\n public async init(): Promise {\n\n const channels_store = useChannelsStore();\n const is_data_broadcasting_enabled = useSettingsStore().settings.tv_show_data_broadcasting;\n console.log(`[LiveDataBroadcastingManager] BMLBrowser: ${is_data_broadcasting_enabled ? 'enabled' : 'disabled'}`);\n\n // リモコンのボタンを初期化\n this.initRemoconButtons();\n\n // データ放送機能有効時のみ\n if (is_data_broadcasting_enabled === true) {\n\n // BML ブラウザが入る DOM 要素\n // DPlayer 内の dplayer-video-wrap の中に動的に追加する (映像レイヤーより下)\n // 要素のスタイルは Watch.vue で定義されている\n this.container_element = document.createElement('div');\n this.container_element.classList.add('dplayer-bml-browser');\n this.container_element = this.player.template.videoWrap.insertAdjacentElement('afterbegin', this.container_element) as HTMLElement;\n\n // リモコンのボタンを有効化\n // データ放送機能無効時はボタンを無効のままにする\n this.toggleRemoconButtonsEnabled(true);\n\n // リモコンをローディング状態にする\n this.toggleRemoconButtonsLoading(true);\n\n // BML ブラウザの初期化\n const this_ = this;\n this.#bml_browser = new BMLBrowser({\n mediaElement: document.createElement('p'), // ここではダミーの p 要素を渡す\n containerElement: this.container_element,\n storagePrefix: 'KonomiTV-BMLBrowser_',\n nvramPrefix: 'nvram_',\n broadcasterDatabasePrefix: '',\n videoPlaneModeEnabled: true,\n fonts: {\n roundGothic: LiveDataBroadcastingManager.round_gothic,\n squareGothic: LiveDataBroadcastingManager.square_gothic,\n },\n // ステータス更新時のイベント\n indicator: {\n setUrl(name: string, loading: boolean) {\n this_.toggleRemoconButtonsLoading(loading);\n },\n setNetworkingGetStatus(connecting: boolean) {\n this_.toggleRemoconButtonsLoading(connecting);\n },\n setNetworkingPostStatus(connecting: boolean) {\n this_.toggleRemoconButtonsLoading(connecting);\n },\n setReceivingStatus(receiving: boolean) {\n // 何もしない\n },\n setEventName(name: string) {\n // 何もしない\n }\n },\n // Greg: 受信機の電源を切るまでグローバルに持続するメモリ\n greg: {\n getReg(index: number) {\n let Greg: string[];\n if (window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg') === null) {\n // 初回は Greg を初期化する\n Greg = [...new Array(64)].map(_ => '');\n } else {\n // 2回目以降は SessionStorage 内の Greg を復元する\n Greg = JSON.parse(window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg')!);\n }\n return Greg[index] ?? '';\n },\n setReg(index: number, value: string) {\n let Greg: string[];\n if (window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg') === null) {\n // 初回は Greg を初期化する\n Greg = [...new Array(64)].map(_ => '');\n } else {\n // 2回目以降は SessionStorage 内の Greg を復元する\n Greg = JSON.parse(window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg')!);\n }\n Greg[index] = value;\n window.sessionStorage.setItem('KonomiTV-BMLBrowser-Greg', JSON.stringify(Greg));\n },\n },\n // データ放送からのチャンネル切り替え機能\n epg: {\n tune(network_id: number, transport_stream_id: number, service_id: number): boolean {\n // 選局対象のチャンネルが現在視聴中のチャンネルと同じ場合\n if (channels_store.channel.current.network_id === network_id && channels_store.channel.current.service_id === service_id) {\n // 非同期で LiveDataBroadcastingManager を再起動\n // チャンネル切り替え後はリロードし直すまで BML ブラウザがフリーズするため\n (async () => {\n await this_.destroy();\n await this_.init();\n })();\n return true;\n }\n // チャンネルリストから network_id と service_id が一致するチャンネルを探す\n // transport_stream_id は Mirakurun バックエンドの場合は存在しないため使わない\n // network_id + service_id だけで一意になる\n for (const channels of Object.values(channels_store.channels_list)) {\n for (const channel of channels) {\n if (channel.network_id === network_id && channel.service_id === service_id) {\n // 少し待ってからチャンネルを切り替える(チャンネル切り替え時にデータ放送側から音が鳴る可能性があるため)\n Utils.sleep(0.3).then(() => router.push({path: `/tv/watch/${channel.display_channel_id}`}));\n return true;\n }\n }\n }\n // network_id と service_id が一致するチャンネルが見つからなかった\n // 3秒間エラーメッセージを表示する\n console.error(`[LiveDataBroadcastingManager] Channel not found (network_id: ${network_id} / service_id: ${service_id})`);\n this_.player.notice(`切り替え先のチャンネルが見つかりませんでした。(network_id: ${network_id} / service_id: ${service_id})`, 3000, undefined, '#FF6F6A');\n // エラーメッセージを表示し終わったタイミングで、非同期で LiveDataBroadcastingManager を再起動\n // チャンネル切り替えに失敗すると BML ブラウザがフリーズするため\n Utils.sleep(3).then(async () => {\n await this_.destroy();\n await this_.init();\n });\n return false;\n }\n },\n // 双方向 (ネット接続) 機能\n ip: {\n getConnectionType(): number {\n // ARIB STD-B24 第二分冊 (2/2) 第二編 付属3 5.6.5.2 表5-12\n // 1: PSTN\n // 100: ISDN\n // 200: PHS\n // 201: PHS (PIAFS2.0)\n // 202: PHS (PIAFS2.1)\n // 300: Mobile phone\n // 301: Mobile phone (PDC)\n // 302: Mobile phone (PDC-P)\n // 303: Mobile phone (DS-CDMA)\n // 304: Mobile phone(MC-CDMA)\n // 305: Mobile phone (CDMA CelluarSystem)\n // 401: Ethernet (PPPoE)\n // 402: Ethernet (Fixed IP)\n // 403: Ethernet (DHCP)\n // NaN: 失敗\n return 403;\n },\n isIPConnected(): number {\n // ARIB STD-B24 第二分冊 (2/2) 第二編 付属3 5.6.5.2 表5-14\n // 0: IP 接続は確立していない\n // 1: IP 接続は自動接続によって確立している\n // 2: IP 接続は connectPPP() / connectPPPWithISPParams() により確立している\n // NaN 失敗\n return 0;\n },\n },\n // エラー発生時のメッセージ表示\n // 3秒間プレイヤーにエラーメッセージを表示する\n showErrorMessage(title: string, message: string, code?: string): void {\n this_.player.notice(`${title}
${message} (${code})`, 3000, undefined, '#FF6F6A');\n }\n });\n this.bml_browser_width = 960;\n this.bml_browser_height = 540;\n console.log('[LiveDataBroadcastingManager] BMLBrowser initialized.');\n\n // BML ブラウザがロードされたときのイベント\n this.#bml_browser.addEventListener('load', (event) => {\n console.log('[LiveDataBroadcastingManager] BMLBrowser: load', event.detail);\n\n // BML ブラウザの要素に幅と高さを設定\n this.bml_browser_width = event.detail.resolution.width;\n this.bml_browser_height = event.detail.resolution.height;\n this.container_element?.style.setProperty('--bml-browser-width', `${this.bml_browser_width}px`);\n this.container_element?.style.setProperty('--bml-browser-height', `${this.bml_browser_height}px`);\n\n // データ放送画面の拡大/縮小率を再計算\n this.calculateBMLBrowserScaleFactor(this.player.template.videoWrap.clientWidth, this.player.template.videoWrap.clientHeight);\n\n // 映像の要素をデータ放送内に移動\n this.moveVideoElementToBMLBrowser();\n });\n\n // BML ブラウザの表示状態が変化したときのイベント\n this.#bml_browser.addEventListener('invisible', (event) => {\n if (event.detail === true) {\n // 非表示状態\n // データ放送内に移動していた映像の要素を DPlayer に戻す\n console.log('[LiveDataBroadcastingManager] BMLBrowser: invisible');\n this.moveVideoElementToDPlayer();\n } else {\n // 表示状態\n // 映像の要素をデータ放送内に移動\n console.log('[LiveDataBroadcastingManager] BMLBrowser: visible');\n this.moveVideoElementToBMLBrowser();\n }\n });\n\n // 現在 BML ブラウザ上で利用しているボタンの一覧が変化したときのイベント\n this.#bml_browser.addEventListener('usedkeylistchanged', (event) => {\n // usedKeyList の中に numeric-tuning が含まれている場合は、データ放送が数字キーを利用中\n this.is_bml_browser_using_numeric_key = [...event.detail.usedKeyList].includes('numeric-tuning');\n });\n\n // DPlayer のリサイズを監視する ResizeObserver を開始\n this.resize_observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n // データ放送画面の拡大/縮小率を再計算\n const entry = entries[0];\n this.calculateBMLBrowserScaleFactor(entry.contentRect.width, entry.contentRect.height);\n });\n this.resize_observer.observe(this.player.template.videoWrap);\n }\n\n // ここからはデータ放送機能無効時も実行される\n // PSI/SI アーカイブデータは、UI 上の番組情報をリアルタイムに更新する用途でも利用している\n\n // ライブ PSI/SI アーカイブデータストリーミング API の URL を作成\n const api_quality = PlayerUtils.extractAPIQualityFromDPlayer(this.player);\n const api_url = `${Utils.api_base_url}/streams/live/${this.display_channel_id}/${api_quality}/psi-archived-data`;\n\n // ライブ PSI/SI アーカイブデータデコーダーを初期化\n // Comlink を挟んでいる関係上、コンストラクタにも関わらず Promise を返すため await する必要がある\n this.live_psi_archived_data_decoder = await new LivePSIArchivedDataDecoderWorker(api_url);\n\n // デコードを開始\n // デコーダーは Web Worker 上で実行される (コールバックを Comlink.proxy() で包むのがポイント)\n this.live_psi_archived_data_decoder.run(Comlink.proxy(async (message: ResponseMessage) => {\n\n // PMT (Program Map Table)\n // データ放送有効時のみ処理\n if (message.type === 'pmt' && this.#bml_browser !== null) {\n\n // データ放送がチャンネルに含まれているかどうか\n // AdditionalAribBXMLInfo を含むコンポーネントが一つでも存在するかどうかで判定\n const is_bml_available = message.components.some((component) => component.bxmlInfo !== undefined);\n console.log(`[LiveDataBroadcastingManager] BMLBrowser: ${is_bml_available ? 'available' : 'unavailable'}`);\n\n // データ放送がチャンネルに含まれていない場合\n if (is_bml_available === false) {\n\n // リモコンのローディング状態を解除\n // PMT にデータ放送用情報が含まれるようになるまでは、データ放送が利用できる見込みはない\n this.toggleRemoconButtonsLoading(false);\n\n // リモコンのボタンを無効化\n this.toggleRemoconButtonsEnabled(false);\n\n // データ放送がチャンネルに含まれている場合\n // データ放送がチャンネルに含まれていなかったが、後から含まれるようになったケースを想定\n // この時点ではローディングは終わっていないので、ローディング状態は解除しない\n } else {\n\n // リモコンのボタンを有効化\n this.toggleRemoconButtonsEnabled(true);\n }\n }\n\n // 番組情報イベント\n // 現在放送中の番組情報を UI にリアルタイムに反映する\n if (message.type === 'programInfo' && channels_store.channel.current.program_present != null) {\n // イベント ID\n if (message.eventId) {\n channels_store.channel.current.program_present.event_id = message.eventId;\n }\n // 番組タイトル\n if (message.eventName) {\n channels_store.channel.current.program_present.title = ProgramUtils.formatString(message.eventName);\n }\n // 番組開始時刻・番組終了時刻・番組長\n if (message.startTimeUnixMillis) {\n const start_time = ProgramUtils.convertTimestampToISO8601(message.startTimeUnixMillis);\n channels_store.channel.current.program_present.start_time = start_time;\n if (message.durationSeconds) {\n channels_store.channel.current.program_present.end_time =\n dayjs(start_time).add(message.durationSeconds, 'seconds').toISOString();\n channels_store.channel.current.program_present.duration = message.durationSeconds;\n } else {\n // 開始時刻はあるが番組長がない場合、放送時間未定として扱う\n // duration が -1 の場合、ProgramUtils.getProgramTime() は「放送時間未定」と表示する\n channels_store.channel.current.program_present.end_time = start_time;\n channels_store.channel.current.program_present.duration = -1; // -1 を設定する\n }\n }\n }\n\n // TS ストリームのデコード結果を BML ブラウザにそのまま送信する\n // データ放送機能無効時は実行しない\n if (this.#bml_browser !== null) {\n this.#bml_browser.emitMessage(message);\n }\n }));\n }\n\n\n /**\n * リモコンのボタンを初期化する\n */\n private initRemoconButtons(): void {\n\n const channels_store = useChannelsStore();\n this.remocon_button_event_abort_controller = new AbortController();\n\n // リモコンのボタンをクリックしたときのイベントを登録\n const buttons = this.remocon_element.querySelectorAll('button');\n for (const button of buttons) {\n button.addEventListener('click', async () => {\n\n // ARIB 仕様上のキーコード\n const arib_key_code = (parseInt(button.dataset.aribKeyCode!) as AribKeyCode);\n\n // リモコン ID (番号キーのみ)\n const remocon_id = button.dataset.remoconId ? parseInt(button.dataset.remoconId) : null;\n\n // 番号キーでかつ現在データ放送が番号キーを使っていない場合は、そのチャンネルに切り替える\n if (remocon_id !== null && this.is_bml_browser_using_numeric_key === false) {\n\n // 切り替え先のチャンネルを取得する\n // チャンネルタイプは現在視聴中のチャンネルと同じ\n const switch_channel_type = channels_store.channel.current.type;\n const switch_channel = channels_store.getChannelByRemoconID(switch_channel_type, remocon_id);\n\n // チャンネルが取得できていれば、ルーティングをそのチャンネルに置き換える\n // 押されたキーに対応するリモコン ID のチャンネルがない場合や、現在と同じチャンネル ID の場合は何も起こらない\n if (switch_channel !== null && switch_channel.display_channel_id !== channels_store.display_channel_id) {\n router.push({path: `/tv/watch/${switch_channel.display_channel_id}`});\n }\n return;\n\n // それ以外の場合は、BML ブラウザにキーイベントを送信する\n // データ放送機能無効時は何もしない\n } else {\n if (this.#bml_browser !== null) {\n if (remocon_id === 10) {\n // リモコン番号が 10 の場合のみ、\"0\" のキーイベントも送信する\n this.#bml_browser.content.processKeyDown(AribKeyCode.Digit0);\n this.#bml_browser.content.processKeyUp(AribKeyCode.Digit0);\n await Utils.sleep(0.1); // 若干待つのがポイント\n }\n this.#bml_browser.content.processKeyDown(arib_key_code);\n this.#bml_browser.content.processKeyUp(arib_key_code);\n }\n }\n\n }, {signal: this.remocon_button_event_abort_controller.signal});\n }\n }\n\n\n /**\n * リモコンのデータ放送ボタンの表示状態をローディングかどうかで切り替える\n */\n private toggleRemoconButtonsLoading(loading: boolean): void {\n if (loading === true) {\n this.remocon_data_broadcasting_element.classList.add('remote-control-data-broadcasting--loading');\n } else {\n this.remocon_data_broadcasting_element.classList.remove('remote-control-data-broadcasting--loading');\n }\n }\n\n\n /**\n * リモコンのデータ放送ボタンの有効/無効をローディングかどうかで切り替える\n * 初期状態 (Vue SFC の HTML 上) では無効になっているので、BML ブラウザの初期化時に有効にする\n */\n private toggleRemoconButtonsEnabled(enabled: boolean): void {\n if (enabled === true) {\n this.remocon_data_broadcasting_element.classList.remove('remote-control-data-broadcasting--disabled');\n } else {\n this.remocon_data_broadcasting_element.classList.add('remote-control-data-broadcasting--disabled');\n }\n }\n\n\n /**\n * データ放送画面の拡大/縮小率を再計算し、CSS カスタムプロパティに設定する\n * データ放送は 960×540 か 720×480 の固定サイズなので、レスポンシブにするために transform: scale() を使っている\n * @param container_width BML ブラウザが入るコンテナ要素の幅\n * @param container_height BML ブラウザが入るコンテナ要素の高さ\n */\n private calculateBMLBrowserScaleFactor(container_width: number, container_height: number): void {\n\n // 高さは BML ブラウザの高さをそのまま利用するが、横幅は常に高さに対して常に 16:9 の比率になるようにする\n // BML ブラウザのサイズが 960×540 なら問題ないが、720×480 の場合は 854×480 として計算される\n const scale_factor_width = container_width / (this.bml_browser_height * 16 / 9);\n const scale_factor_height = container_height / this.bml_browser_height;\n\n // transform: scale() での拡大率を算出\n const scale_factor = Math.min(scale_factor_width, scale_factor_height);\n\n // (BMLブラウザの高さに対して 16:9 の比率の幅)÷(BMLブラウザの幅) で横に引き伸ばす倍率を算出\n // 854÷720 の場合、約 1.185 倍になる\n const magnification = (this.bml_browser_height * 16 / 9) / this.bml_browser_width;\n\n // データ放送画面の拡大/縮小率を CSS カスタムプロパティとして設定\n this.container_element?.style.setProperty('--bml-browser-scale-factor-width', `${scale_factor * magnification}`);\n this.container_element?.style.setProperty('--bml-browser-scale-factor-height', `${scale_factor}`);\n }\n\n\n /**\n * 映像の DOM 要素を DPlayer から BML ブラウザ (データ放送) 内に移動する\n */\n private moveVideoElementToBMLBrowser(): void {\n\n // BML ブラウザの破棄中にイベントが発火した場合は何もしない\n if (this.is_bml_browser_destroying) {\n return;\n }\n\n // getVideoElement() に失敗した (=現在データ放送に映像が表示されていない) 場合は何もしない\n if (this.#bml_browser?.getVideoElement() === null) {\n return;\n }\n\n // ダミーで渡した p 要素があれば削除\n if (this.#bml_browser?.getVideoElement()?.firstElementChild instanceof HTMLParagraphElement) {\n this.#bml_browser?.getVideoElement()?.firstElementChild?.remove();\n }\n\n // データ放送内に映像の要素を入れる\n this.#bml_browser?.getVideoElement()?.appendChild(this.media_element);\n\n // データ放送内での表示用にスタイルを調整\n this.media_element.style.width = '100%';\n this.media_element.style.height = '100%';\n for (const child of this.media_element.children) {\n (child as HTMLElement).style.display = 'block';\n (child as HTMLElement).style.visibility = 'visible';\n if (child instanceof HTMLVideoElement) {\n (child as HTMLVideoElement).style.width = '100%';\n (child as HTMLVideoElement).style.height = '100%';\n // BML ブラウザのアスペクト比が 16:9 以外のケース (運用上は 720×480 のみ該当) に限定して適用する\n if (this.bml_browser_width / this.bml_browser_height !== 16 / 9) {\n const magnification = (this.bml_browser_height * 16 / 9) / this.bml_browser_width;\n (child as HTMLVideoElement).style.transform = `scaleY(${magnification})`;\n (child as HTMLVideoElement).style.transformOrigin = 'center center';\n } else {\n (child as HTMLVideoElement).style.transform = '';\n (child as HTMLVideoElement).style.transformOrigin = '';\n }\n }\n }\n\n this.is_video_element_moved_to_bml_browser = true;\n }\n\n\n /**\n * 映像の DOM 要素を BML ブラウザ (データ放送) から DPlayer 内に移動する\n */\n private moveVideoElementToDPlayer(): void {\n\n // BML ブラウザの破棄中にイベントが発火した場合は何もしない\n if (this.is_bml_browser_destroying) {\n return;\n }\n\n // 既に DPlayer 内に映像の要素がある場合は何もしない\n if (this.is_video_element_moved_to_bml_browser === false) {\n return;\n }\n\n // データ放送内に移動していた映像の要素を DPlayer に戻す (BML ブラウザより上のレイヤーに配置)\n // BML ブラウザの破棄前に行う必要がある\n if (this.container_element !== null) {\n this.player.template.videoWrap.insertBefore(this.media_element, this.container_element.nextElementSibling);\n }\n\n // データ放送内での表示用に調整していたスタイルを戻す\n this.media_element.style.width = '';\n this.media_element.style.height = '';\n for (const child of this.media_element.children) {\n (child as HTMLElement).style.display = '';\n (child as HTMLElement).style.visibility = '';\n if (child instanceof HTMLVideoElement) {\n (child as HTMLVideoElement).style.width = '';\n (child as HTMLVideoElement).style.height = '';\n (child as HTMLVideoElement).style.transform = '';\n (child as HTMLVideoElement).style.transformOrigin = '';\n }\n }\n\n this.is_video_element_moved_to_bml_browser = false;\n }\n\n\n /**\n * LiveDataBroadcastingManager での処理を終了し、破棄する\n */\n public async destroy(): Promise {\n\n // ライブ PSI/SI アーカイブデータデコーダーを終了\n if (this.live_psi_archived_data_decoder !== null) {\n // タイミングの関係なのかチャンネル切り替え時の映像のフェードアウトが効かなくなるため、await してはいけない\n this.live_psi_archived_data_decoder.destroy();\n this.live_psi_archived_data_decoder = null;\n }\n\n // リモコンの各ボタンに登録していたリスナーを削除\n if (this.remocon_button_event_abort_controller !== null) {\n this.remocon_button_event_abort_controller.abort();\n this.remocon_button_event_abort_controller = null;\n }\n\n // ここからはデータ放送機能有効時のみ実行\n if (this.#bml_browser !== null) {\n\n // リモコンのボタンを再び無効化\n this.toggleRemoconButtonsEnabled(false);\n\n // リモコンを再びローディング状態に戻す\n this.toggleRemoconButtonsLoading(true);\n\n // DPlayer のリサイズを監視する ResizeObserver を終了\n if (this.resize_observer !== null) {\n this.resize_observer.disconnect();\n this.resize_observer = null;\n }\n\n // データ放送内に移動していた映像の要素を DPlayer に戻す\n this.moveVideoElementToDPlayer();\n\n // BML ブラウザを破棄\n this.is_bml_browser_destroying = true;\n await this.#bml_browser.destroy();\n this.is_bml_browser_destroying = false;\n this.#bml_browser = null;\n console.log('[LiveDataBroadcastingManager] BMLBrowser destroyed.');\n\n // BML ブラウザの要素を削除\n this.container_element?.remove();\n }\n }\n}\n\nexport default LiveDataBroadcastingManager;\n","\n\nimport dayjs from 'dayjs';\nimport DPlayer, { DPlayerType } from 'dplayer';\nimport mpegts from 'mpegts.js';\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport BottomNavigation from '@/components/BottomNavigation.vue';\nimport Channel from '@/components/Panel/Channel.vue';\nimport Comment from '@/components/Panel/Comment.vue';\nimport Program from '@/components/Panel/Program.vue';\nimport Remocon from '@/components/Panel/Remocon.vue';\nimport Twitter from '@/components/Panel/Twitter.vue';\nimport APIClient from '@/services/APIClient';\nimport { IChannel } from '@/services/Channels';\nimport CaptureManager from '@/services/player/managers/CaptureManager';\nimport LiveDataBroadcastingManager from '@/services/player/managers/LiveDataBroadcastingManager';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { PlayerUtils, ProgramUtils } from '@/utils';\n\n// 低遅延モードオン時の再生バッファ (秒単位)\n// 0.7 秒程度余裕を持たせる\nconst PLAYBACK_BUFFER_SEC_LOW_LATENCY = 0.7;\n\n// 低遅延モードオフ時の再生バッファ (秒単位)\n// 5秒程度の遅延を許容する\nconst PLAYBACK_BUFFER_SEC = 5.0;\n\nexport default Vue.extend({\n name: 'TV-Watch',\n components: {\n BottomNavigation,\n Channel,\n Comment,\n Program,\n Remocon,\n Twitter,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ProgramUtils: ProgramUtils,\n\n // 現在時刻\n time: dayjs().format('YYYY/MM/DD HH:mm:ss'),\n\n // 表示されるパネルのタブ\n tv_panel_active_tab: useSettingsStore().settings.tv_panel_active_tab,\n\n // 背景の URL\n background_url: '',\n\n // プレイヤーのローディング状態\n // 既定でローディングとする\n is_loading: true,\n\n // プレイヤーが映像の再生をバッファリングしているか\n // 視聴開始時以外にも、ネットワークが遅くて再生が一時的に途切れたときなどで表示される\n // 既定でバッファリング中とする\n is_video_buffering: true,\n\n // プレイヤーの背景を表示するか\n // 既定で表示しない\n is_background_display: false,\n\n // コントロールを表示するか\n // 既定で表示する\n is_control_display: true,\n\n // リモコンを表示するか\n is_remocon_display: false,\n\n // パネルを表示するか\n // panel_display_state が 'AlwaysDisplay' なら常に表示し、'AlwaysFold' なら常に折りたたむ\n // 'RestorePreviousState' なら showed_panel_last_time の値を使い、前回の状態を復元する\n is_panel_display: (() => {\n const settings_store = useSettingsStore();\n switch (settings_store.settings.panel_display_state) {\n case 'AlwaysDisplay':\n return true;\n case 'AlwaysFold':\n return false;\n case 'RestorePreviousState':\n return settings_store.settings.showed_panel_last_time;\n }\n })() as boolean,\n\n // フルスクリーン状態かどうか\n is_fullscreen: false,\n\n // IME 変換中かどうか\n is_ime_composing: false,\n\n // 仮想キーボードが表示されているか\n is_virtual_keyboard_display: false,\n\n // プレイヤーからのコメント送信から間もないかどうか\n is_comment_send_just_did: false,\n\n // インターバル ID\n // ページ遷移時に setInterval(), setTimeout() の実行を止めるのに使う\n // setInterval(), setTimeout() の返り値を登録する\n interval_ids: [] as number[],\n\n // コントロール表示切り替え用のインターバル ID\n // 混ぜるとダメなので独立させる\n control_interval_id: 0,\n\n // ***** チャンネル *****\n\n // ザッピング(「前/次のチャンネル」ボタン or 上下キーショートカット)によるチャンネル移動かどうか\n is_zapping: false,\n\n // ザッピングで連続してチャンネルを切り替えている最中かどうか\n // 「連続して」とは、切り替える間隔が 0.5 秒以下で、再生セッションが初期化される前に次のチャンネルに切り替えたときのこと\n is_zapping_continuously: false,\n\n // ***** プレイヤー *****\n\n // プレイヤー (DPlayer) のインスタンス\n player: null as DPlayer | null,\n\n // プレイヤーの破棄を許可するかどうか\n player_can_be_destroyed: false,\n\n // mpegts.js がサポートされているかどうか\n // mpegts.js がサポートされていない場合は LL-HLS にフォールバックする (基本 iPhone/iPad Safari 向け)\n // iPad Safari では Media Source Extensions API がサポートされているが、残念ながら数年経っても挙動が不安定なこと、\n // どっちみち iPhone Safari 向けに LL-HLS のサポートを続ける必要があることから、iPad Safari でも LL-HLS を使う\n is_mpegts_supported: mpegts.isSupported() === true && Utils.isSafari() === false,\n\n // ライブストリームが Offline 状態かどうか\n is_offline: false,\n\n // RomSound の AudioContext\n romsounds_context: null as AudioContext | null,\n\n // RomSound の AudioBuffer(音声データ)が入るリスト\n romsounds_buffers: [] as AudioBuffer[],\n\n // イベントソースのインスタンス\n eventsource: null as EventSource | null,\n\n // フルスクリーン状態が切り替わったときのハンドラー\n fullscreen_handler: null as () => void | null,\n\n // キャプチャマネージャーのインスタンス\n capture_manager: null as CaptureManager | null,\n\n // データ放送マネージャーのインスタンス\n data_broadcasting_manager: null as LiveDataBroadcastingManager | null,\n\n // ***** キーボードショートカット *****\n\n // ショートカットキーのハンドラー\n shortcut_key_handler: null as (event: KeyboardEvent) => void | null,\n\n // ショートカットキーの最終押下時刻のタイムスタンプ\n shortcut_key_pressed_at: Utils.time(),\n\n // キーボードショートカットの一覧のモーダルを表示するか\n shortcut_key_modal: false,\n\n // キーボードショートカットの一覧に表示するショートカットキーのリスト\n shortcut_key_list: {\n left_column: [\n {\n name: '全般',\n icon: 'fluent:home-20-filled',\n icon_height: '22px',\n shortcuts: [\n { name: '数字キー/テンキーに対応するリモコン番号 (1~12) の地デジチャンネルに切り替える', keys: [{name: '1~9, 0, -(=), ^(~)', icon: false}] },\n { name: '数字キー/テンキーに対応するリモコン番号 (1~12) の BS チャンネルに切り替える', keys: [{name: 'Shift', icon: false}, {name: '1~9, 0, -(=), ^(~)', icon: false}] },\n { name: '前のチャンネルに切り替える', keys: [{name: 'fluent:arrow-up-12-filled', icon: true}] },\n { name: '次のチャンネルに切り替える', keys: [{name: 'fluent:arrow-down-12-filled', icon: true}] },\n { name: 'キーボードショートカットの一覧を表示する', keys: [{name: '/(?)', icon: false}] },\n ]\n },\n {\n name: 'プレイヤー',\n icon: 'fluent:play-20-filled',\n icon_height: '20px',\n shortcuts: [\n { name: '再生 / 一時停止の切り替え', keys: [{name: 'Space', icon: false}] },\n { name: '再生 / 一時停止の切り替え (キャプチャタブ表示時)', keys: [{name: 'Shift', icon: false}, {name: 'Space', icon: false}] },\n { name: 'プレイヤーの音量を上げる', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-up-12-filled', icon: true}] },\n { name: 'プレイヤーの音量を下げる', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-down-12-filled', icon: true}] },\n { name: '停止して0.5秒早戻し', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-left-12-filled', icon: true}] },\n { name: '停止して0.5秒早送り', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-right-12-filled', icon: true}] },\n { name: 'フルスクリーンの切り替え', keys: [{name: 'F', icon: false}] },\n { name: 'ライブストリームの同期', keys: [{name: 'W', icon: false}] },\n { name: 'Picture-in-Picture の表示切り替え', keys: [{name: 'E', icon: false}] },\n { name: '字幕の表示切り替え', keys: [{name: 'S', icon: false}] },\n { name: 'コメントの表示切り替え', keys: [{name: 'D', icon: false}] },\n { name: '映像をキャプチャする', keys: [{name: 'C', icon: false}] },\n { name: '映像をコメントを付けてキャプチャする', keys: [{name: 'V', icon: false}] },\n { name: 'コメント入力フォームにフォーカスする', keys: [{name: 'M', icon: false}] },\n { name: 'コメント入力フォームを閉じる', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'M', icon: false}] },\n ]\n },\n ],\n right_column: [\n {\n name: 'パネル',\n icon: 'fluent:panel-right-20-filled',\n icon_height: '24px',\n shortcuts: [\n { name: 'パネルの表示切り替え', keys: [{name: 'P', icon: false}] },\n { name: '番組情報タブを表示する', keys: [{name: 'K', icon: false}] },\n { name: 'チャンネルタブを表示する', keys: [{name: 'L', icon: false}] },\n { name: 'コメントタブを表示する', keys: [{name: ';(+)', icon: false}] },\n { name: 'Twitter タブを表示する', keys: [{name: ':(*)', icon: false}] },\n ]\n },\n {\n name: 'Twitter',\n icon: 'fa-brands:twitter',\n icon_height: '22px',\n shortcuts: [\n { name: 'ツイート検索タブを表示する', keys: [{name: '[ (「)', icon: false}] },\n { name: 'タイムラインタブを表示する', keys: [{name: '] (」)', icon: false}] },\n { name: 'キャプチャタブを表示する', keys: [{name: '\(¥)', icon: false}] },\n { name: 'ツイート入力フォームにフォーカスを当てる/フォーカスを外す', keys: [{name: 'Tab', icon: false}] },\n { name: 'キャプチャにフォーカスする', keys: [{name: 'キャプチャタブを表示', icon: false}, {name: 'fluent:arrow-up-12-filled;fluent:arrow-down-12-filled;fluent:arrow-left-12-filled;fluent:arrow-right-12-filled', icon: true}] },\n { name: 'キャプチャを拡大表示する/
キャプチャの拡大表示を閉じる', keys: [{name: 'キャプチャにフォーカス', icon: false}, {name: 'Enter', icon: false}] },\n { name: 'キャプチャを選択する/
キャプチャの選択を解除する', keys: [{name: 'キャプチャにフォーカス', icon: false}, {name: 'Space', icon: false}] },\n { name: 'クリップボード内の画像を
キャプチャとして取り込む', keys: [{name: 'ツイート入力
フォームにフォーカス', icon: false}, {name: Utils.CtrlOrCmd(), icon: false}, {name: 'V', icon: false}] },\n { name: 'ツイートを送信する', keys: [{name: 'Twitter タブを表示', icon: false}, {name: Utils.CtrlOrCmd(), icon: false}, {name: 'Enter', icon: false}] },\n ]\n },\n ]\n }\n };\n },\n computed: {\n // ChannelsStore / SettingsStore に this.channelsStore / this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore, useSettingsStore),\n },\n // 開始時に実行\n async created() {\n\n // チャンネル選局のキーボードショートカットを Alt or Option + 数字キー/テンキーに変更する設定が有効なら、\n // キーボードショートカット一覧に反映する\n if (this.settingsStore.settings.tv_channel_selection_requires_alt_key === true) {\n this.shortcut_key_list.left_column[0].shortcuts[0].keys.unshift({name: Utils.AltOrOption(), icon: false});\n this.shortcut_key_list.left_column[0].shortcuts[1].keys.unshift({name: Utils.AltOrOption(), icon: false});\n }\n\n // チャンネル ID をセット\n this.channelsStore.display_channel_id = this.$route.params.display_channel_id;\n\n // Virtual Keyboard API に対応している場合は、仮想キーボード周りの操作を自力で行うことをブラウザに伝える\n // この視聴画面のみ\n if ('virtualKeyboard' in navigator) {\n navigator.virtualKeyboard.overlaysContent = true;\n // 仮想キーボードが表示されたり閉じられたときのイベント\n navigator.virtualKeyboard.ongeometrychange = (event) => {\n if (event.target.boundingRect.width === 0 && event.target.boundingRect.height === 0) {\n this.is_virtual_keyboard_display = false;\n } else {\n this.is_virtual_keyboard_display = true;\n }\n };\n }\n\n // 再生セッションを初期化\n this.init();\n\n // RomSound を鳴らすための AudioContext を生成\n this.romsounds_context = new AudioContext();\n\n // 01 ~ 14 まですべての RomSound を読み込む\n for (let index = 1; index <= 14; index++) {\n\n // ArrayBuffer として RomSound を取得\n const url = `/assets/romsounds/${index.toString().padStart(2, '0')}.wav`;\n const audio_data = await APIClient.get(url, {\n baseURL: '', // BaseURL を明示的にクライアントのルートに設定\n responseType: 'arraybuffer',\n });\n\n // ArrayBuffer をデコードして AudioBuffer にし、すぐ呼び出せるように貯めておく\n // ref: https://ics.media/entry/200427/\n this.romsounds_buffers.push(await this.romsounds_context.decodeAudioData(audio_data.data));\n }\n },\n // 終了前に実行\n beforeDestroy() {\n\n // 仮想キーボード周りの操作をブラウザに戻す\n if ('virtualKeyboard' in navigator) {\n navigator.virtualKeyboard.overlaysContent = false;\n }\n\n // destroy() を実行\n // 別のページへ遷移するため、DPlayer のインスタンスを確実に破棄する\n // さもなければ、ブラウザがリロードされるまでバックグラウンドで永遠に再生され続けてしまう\n // 不正な ID のため 404 ページに遷移されるときは実行しない\n if (this.channelsStore.channel.current.display_channel_id !== 'gr999') {\n this.destroy(true);\n }\n\n // AudioContext のリソースを解放\n if (this.romsounds_context !== null) {\n this.romsounds_context.close();\n }\n\n // このページから離れるので、チャンネル ID を gr000 (ダミー値) に戻す\n this.channelsStore.display_channel_id = 'gr000';\n },\n // チャンネル切り替え時に実行\n // コンポーネント(インスタンス)は再利用される\n // ref: https://v3.router.vuejs.org/ja/guide/advanced/navigation-guards.html#%E3%83%AB%E3%83%BC%E3%83%88%E5%8D%98%E4%BD%8D%E3%82%AB%E3%82%99%E3%83%BC%E3%83%88%E3%82%99\n beforeRouteUpdate(to, from, next) {\n\n // 前の再生セッションを破棄して終了する\n const destroy_promise = this.destroy(false, this.is_zapping_continuously);\n\n // 連続してチャンネルを切り替えていることを示すフラグを立てる\n // このフラグは再生セッションが初期化されるタイミングで必ず降ろされる\n this.is_zapping_continuously = true;\n\n // チャンネル ID を次のチャンネルのものに切り替える\n this.channelsStore.display_channel_id = to.params.display_channel_id;\n\n // ハッシュタグフォームのリセットがオンなら、ハッシュタグフォームを空にする\n if (this.settingsStore.settings.reset_hashtag_when_program_switches === true) {\n (this.$refs.Twitter as InstanceType).tweet_hashtag = '';\n }\n\n (async () => {\n\n // ザッピング(「前/次のチャンネル」ボタン or 上下キーショートカット)によるチャンネル移動時のみ、\n // 0.5秒だけ待ってから新しい再生セッションを初期化する\n // 連続してチャンネルを切り替えた際に毎回再生処理を開始しないように猶予を設ける\n if (this.is_zapping === true) {\n this.is_zapping = false;\n this.interval_ids.push(window.setTimeout(() => {\n this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす\n destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する\n }, 0.5 * 1000));\n\n // 通常のチャンネル移動時は、すぐに再生セッションを初期化する\n } else {\n this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす\n destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する\n }\n })();\n\n // 次のルートに置き換え\n next();\n },\n watch: {\n\n // 視聴中のチャンネルが変更されたときのイベント\n 'channelsStore.channel': {\n immediate: true,\n handler(\n new_channel: {previous: IChannel; current: IChannel; next: IChannel;},\n old_channel: {previous: IChannel; current: IChannel; next: IChannel;} | undefined,\n ) {\n\n // old_channel が undefined の場合は、初回のイベント発火なので何もしない\n if (old_channel === undefined) {\n return;\n }\n\n // Twitter コンポーネントのインスタンスを取得\n const twitter_component = this.$refs.Twitter as InstanceType;\n\n // 前のチャンネル情報と次のチャンネル情報で display_channel_id が変わってたら局タグ追加処理を走らせる\n if (new_channel.current.display_channel_id !== old_channel.current.display_channel_id) {\n const old_channel_hashtag = twitter_component.getChannelHashtag(old_channel.current.name) ?? '';\n twitter_component.tweet_hashtag =\n twitter_component.formatHashtag(twitter_component.tweet_hashtag.replaceAll(old_channel_hashtag, ''));\n twitter_component.updateTweetLetterCount();\n }\n\n // 取得したチャンネル情報と現在のチャンネル情報の NID-SID-EID の組み合わせが異なる場合\n if ((new_channel.current.id !== old_channel.current.id) || // チャンネルが異なる\n (new_channel.current.program_present !== null && old_channel.current.program_present === null) || // 番組情報あり→番組情報なし\n (new_channel.current.program_present === null && old_channel.current.program_present !== null) || // 番組情報なし→番組情報あり\n ((new_channel.current.program_present !== null && old_channel.current.program_present !== null) &&\n (new_channel.current.program_present.id !== old_channel.current.program_present.id))) { // 番組情報あり→番組情報あり & 番組が異なる\n\n // ハッシュタグフォームのリセットがオンなら、ハッシュタグフォームを空にする\n if (this.settingsStore.settings.reset_hashtag_when_program_switches === true) {\n twitter_component.tweet_hashtag = twitter_component.formatHashtag('');\n twitter_component.updateTweetLetterCount();\n }\n }\n },\n },\n\n // 前回視聴画面を開いた際にパネルが表示されていたかどうかを保存\n is_panel_display() {\n this.settingsStore.settings.showed_panel_last_time = this.is_panel_display;\n }\n },\n methods: {\n\n // 再生セッションを初期化する\n async init() {\n\n // ローディング中の背景画像をランダムで設定\n this.background_url = PlayerUtils.generatePlayerBackgroundURL();\n\n // コントロール表示タイマーを実行\n this.controlDisplayTimer();\n\n // 現在時刻を1秒おきに更新\n this.interval_ids.push(window.setInterval(() => this.time = dayjs().format('YYYY/MM/DD HH:mm:ss'), 1 * 1000));\n\n // 00秒までの残り秒数を取得\n // 現在 16:01:34 なら 26 (秒) になる\n const residue_second = 60 - new Date().getSeconds();\n\n // 00秒になるまで待ってから実行するタイマー\n // 番組は基本1分単位で組まれているため、20秒や45秒など中途半端な秒数で更新してしまうと番組情報の反映が遅れてしまう\n this.interval_ids.push(window.setTimeout(() => {\n\n // この時点で00秒なので、チャンネル情報を更新\n this.channelsStore.update(true);\n this.update();\n\n // 以降、30秒おきにチャンネル情報を更新\n this.interval_ids.push(window.setInterval(() => {\n this.channelsStore.update(true);\n this.update();\n }, 30 * 1000));\n\n }, residue_second * 1000));\n\n // チャンネル情報を更新 (初回)\n await this.channelsStore.update();\n this.update();\n },\n\n // 画面を更新する\n async update() {\n\n // チャンネル ID が未定義なら実行しない(フェイルセーフ)\n if (this.$route.params.display_channel_id === undefined) {\n return;\n }\n\n // もし現時点でチャンネル ID が gr999 だった場合、チャンネル情報に存在しない不正な ID なので、404 ページにリダイレクト\n if (this.channelsStore.channel.current.display_channel_id === 'gr999') {\n this.$router.push({path: '/not-found/'});\n return;\n }\n\n // プレイヤーがまだ初期化されていない or 他のチャンネルからの切り替えですでにプレイヤーが初期化されているけど破棄が可能\n // update() 自体は初期化時以外にも1分ごとに定期実行されるため、その際に毎回プレイヤーを再初期化しないようにする\n if (this.player === null || this.player_can_be_destroyed === true) {\n\n // プレイヤー (DPlayer) 周りのセットアップ\n this.initPlayer();\n\n // サーバーから送られてくるメッセージのイベントハンドラーを初期化\n await this.initEventHandler();\n\n // キャプチャのイベントハンドラーを初期化\n this.initCaptureManager();\n\n // ショートカットキーのイベントハンドラーを初期化\n // 事前に前のイベントハンドラーを削除しておかないと、重複してキー操作が実行されてしまう\n // 直前で実行しないと上下キーでのチャンネル操作が動かなくなる\n document.removeEventListener('keydown', this.shortcut_key_handler);\n this.initShortcutKeyHandler();\n }\n\n if (this.player === null) {\n return; // 復旧不可能 (発生しないはずだが、書いとかないと TypeScript に怒られる)\n }\n\n // 副音声がない番組でプレイヤー上で副音声に切り替えられないように\n // 音声多重放送でもデュアルモノでもない番組のみ\n if ((this.channelsStore.channel.current.program_present === null) ||\n ((this.channelsStore.channel.current.program_present.primary_audio_type !== '1/0+1/0モード(デュアルモノ)') &&\n (this.channelsStore.channel.current.program_present.secondary_audio_type === null))) {\n\n // クラスを付与\n this.player.template.audioItem[1].classList.add('dplayer-setting-audio-item--disabled');\n\n // 現在副音声が選択されている可能性を考慮し、明示的に主音声に切り替える\n if (this.player.plugins.mpegts !== undefined || this.player.plugins.liveLLHLSForKonomiTV !== undefined) {\n // プレイヤーの初期化が完了するまで少し待つ\n while (this.player === null) {\n await Utils.sleep(0.1);\n }\n this.player.template.audioItem[0].classList.add('dplayer-setting-audio-current');\n this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-current');\n this.player.template.audioValue.textContent = this.player.tran('Primary audio');\n try {\n if (this.player.plugins.mpegts !== undefined && this.player.plugins.mpegts instanceof mpegts.MSEPlayer) {\n this.player.plugins.mpegts.switchPrimaryAudio();\n }\n if (this.player.plugins.liveLLHLSForKonomiTV !== undefined) {\n this.player.plugins.liveLLHLSForKonomiTV.switchPrimaryAudio();\n }\n } catch (error) {\n // pass\n }\n }\n\n // 音声多重放送かデュアルモノなので、副音声への切り替えを有効化\n } else {\n this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-item--disabled');\n }\n\n // MediaSession API を使い、メディア通知の表示をカスタマイズ\n if ('mediaSession' in navigator) {\n\n // アートワークとして表示するアイコン\n const artwork = [\n {src: '/assets/images/icons/icon-maskable-192px.png', sizes: '192x192', type: 'image/png'},\n {src: '/assets/images/icons/icon-maskable-512px.png', sizes: '512x512', type: 'image/png'},\n ];\n\n // メディア通知の表示をカスタマイズ\n navigator.mediaSession.metadata = new MediaMetadata({\n title: this.channelsStore.channel.current.program_present?.title ?? '放送休止',\n artist: this.channelsStore.channel.current.name,\n artwork: artwork,\n });\n\n // 再生状況のステータスを設定\n if ('setPositionState' in navigator.mediaSession) {\n navigator.mediaSession.setPositionState({\n duration: 0, // ライブなので0(長さなしを表すらしい)に設定\n playbackRate: 1, // ライブなので再生速度は常に1になる\n });\n }\n\n // 一旦既存のイベントハンドラーを削除\n navigator.mediaSession.setActionHandler('play', null);\n navigator.mediaSession.setActionHandler('pause', null);\n navigator.mediaSession.setActionHandler('previoustrack', null);\n navigator.mediaSession.setActionHandler('nexttrack', null);\n\n // メディア通知上のボタンが押されたときのイベント\n navigator.mediaSession.setActionHandler('play', () => this.player?.play()); // 再生\n navigator.mediaSession.setActionHandler('pause', () => this.player?.pause()); // 停止\n navigator.mediaSession.setActionHandler('previoustrack', async () => { // 前のチャンネルに切り替え\n navigator.mediaSession.metadata = new MediaMetadata({\n title: this.channelsStore.channel.previous.program_present?.title ?? '放送休止',\n artist: this.channelsStore.channel.previous.name,\n artwork: artwork,\n });\n // ルーティングを前のチャンネルに置き換える\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`});\n });\n navigator.mediaSession.setActionHandler('nexttrack', async () => { // 次のチャンネルに切り替え\n navigator.mediaSession.metadata = new MediaMetadata({\n title: this.channelsStore.channel.next.program_present?.title ?? '放送休止',\n artist: this.channelsStore.channel.next.name,\n artwork: artwork,\n });\n // ルーティングを次のチャンネルに置き換える\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.next.display_channel_id}`});\n });\n }\n },\n\n // マウスが動いたりタップされた時のイベント\n // 3秒間何も操作がなければコントロールを非表示にする\n controlDisplayTimer(event: Event | null = null, is_player_event: boolean = false) {\n\n // タッチデバイスかどうか\n // DPlayer の UA 判定コードと同一\n const is_touch_device = /iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\n\n // タッチデバイスで mousemove 、あるいはタッチデバイス以外で touchmove か click が発火した時は実行じない\n if (is_touch_device === true && event !== null && event.type === 'mousemove') return;\n if (is_touch_device === false && event !== null && (event.type === 'touchmove' || event.type === 'click')) return;\n\n // 以前セットされたタイマーを止める\n window.clearTimeout(this.control_interval_id);\n\n // setTimeout に渡すタイマー関数\n const timeout = () => {\n\n // コメント入力フォームが表示されているときは実行しない\n // タイマーを掛け直してから抜ける\n if (this.player !== null && this.player.template.controller.classList.contains('dplayer-controller-comment')) {\n this.control_interval_id = window.setTimeout(timeout, 3 * 1000);\n return;\n }\n\n // コントロールを非表示にする\n this.is_control_display = false;\n\n // プレイヤーのコントロールと設定パネルを非表示にする\n if (this.player !== null) {\n this.player.controller.hide();\n this.player.setting.hide();\n }\n };\n\n // タッチデバイスでプレイヤー画面がクリックされたとき\n if (is_touch_device === true && is_player_event === true) {\n\n // プレイヤーのコントロールの表示状態に合わせる\n if (this.player?.controller.isShow()) {\n\n // コントロールを表示する\n this.is_control_display = true;\n\n // プレイヤーのコントロールを表示する\n this.player.controller.show();\n\n // 3秒間何も操作がなければコントロールを非表示にする\n // 3秒間の間一度でもマウスが動けばタイマーが解除されてやり直しになる\n this.control_interval_id = window.setTimeout(timeout, 3 * 1000);\n\n } else {\n\n // コントロールを非表示にする\n this.is_control_display = false;\n\n // プレイヤーのコントロールと設定パネルを非表示にする\n this.player?.controller.hide();\n this.player?.setting.hide();\n }\n\n // それ以外の画面がクリックされたとき\n } else {\n\n // コントロールを表示する\n this.is_control_display = true;\n\n // プレイヤーのコントロールを表示する\n if (this.player !== null) {\n this.player.controller.show();\n }\n\n // 3秒間何も操作がなければコントロールを非表示にする\n // 3秒間の間一度でもマウスが動けばタイマーが解除されてやり直しになる\n this.control_interval_id = window.setTimeout(timeout, 3 * 1000);\n }\n },\n\n // プレイヤーを初期化する\n initPlayer() {\n\n // mpegts.js を window 直下に入れる\n // こうしないと DPlayer が mpegts.js を認識できない\n (window as any).mpegts = mpegts;\n\n // すでに DPlayer が初期化されている場合は破棄する\n // チャンネル切り替え時などが該当する\n if (this.player !== null && this.player_can_be_destroyed === true) {\n try {\n this.player.destroy();\n } catch (error) {\n // mpegts.js をうまく破棄できない場合\n if (this.player.plugins.mpegts !== undefined) {\n this.player.plugins.mpegts.destroy();\n }\n }\n this.player_can_be_destroyed = false;\n this.player = null;\n }\n\n // 低遅延モードであれば低遅延向けの再生バッファを、そうでなければ通常の再生バッファをセット (秒単位)\n const playback_buffer_sec = this.settingsStore.settings.tv_low_latency_mode ?\n PLAYBACK_BUFFER_SEC_LOW_LATENCY : PLAYBACK_BUFFER_SEC;\n\n // DPlayer を初期化\n this.player = new DPlayer({\n container: this.$el.querySelector('.watch-player__dplayer')!,\n theme: '#E64F97', // テーマカラー\n lang: 'ja-jp', // 言語\n live: true, // ライブモード\n liveSyncMinBufferSize: this.is_mpegts_supported ? playback_buffer_sec - 0.1 : 0, // ライブモードで同期する際の最小バッファサイズ\n loop: false, // ループ再生 (ライブのため無効化)\n airplay: false, // AirPlay 機能 (うまく動かないため無効化)\n autoplay: true, // 自動再生\n hotkey: false, // ショートカットキー(こちらで制御するため無効化)\n screenshot: false, // スクリーンショット (こちらで制御するため無効化)\n crossOrigin: 'anonymous', // CORS を有効化\n volume: 1.0, // 音量の初期値\n // 映像\n video: {\n // デフォルトの品質\n // ラジオチャンネルでは常に 48KHz/192kbps に固定する\n defaultQuality: (this.channelsStore.channel.current.is_radiochannel) ?\n '48kHz/192kbps' : this.settingsStore.settings.tv_streaming_quality,\n // 品質リスト\n quality: (() => {\n const qualities: DPlayerType.VideoQuality[] = [];\n\n // ラジオチャンネル\n // API が受け付ける品質の値は通常のチャンネルと同じだが (手抜き…)、実際の品質は 48KHz/192kbps で固定される\n // ラジオチャンネルの場合は、1080p と渡しても 48kHz/192kbps 固定の音声だけの MPEG-TS が配信される\n if (this.channelsStore.channel.current.is_radiochannel) {\n // mpegts.js\n if (this.is_mpegts_supported === true) {\n qualities.push({\n name: '48kHz/192kbps',\n type: 'mpegts',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/mpegts`,\n });\n // LL-HLS (mpegts.js がサポートされていない場合)\n } else {\n qualities.push({\n name: '48kHz/192kbps',\n type: 'live-llhls-for-KonomiTV',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/ll-hls`,\n });\n }\n\n // 通常のチャンネル\n } else {\n\n // ブラウザが H.265 / HEVC の再生に対応していて、かつ通信節約モードが有効なとき\n // API に渡す画質に -hevc のプレフィックスをつける\n let hevc_prefix = '';\n if (PlayerUtils.isHEVCVideoSupported() && this.settingsStore.settings.tv_data_saver_mode === true) {\n hevc_prefix = '-hevc';\n }\n\n // 品質リストを作成\n for (const quality of ['1080p-60fps', '1080p', '810p', '720p', '540p', '480p', '360p', '240p']) {\n // mpegts.js\n if (this.is_mpegts_supported === true) {\n qualities.push({\n name: quality === '1080p-60fps' ? '1080p (60fps)' : quality,\n type: 'mpegts',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${quality}${hevc_prefix}/mpegts`,\n });\n // LL-HLS (mpegts.js がサポートされていない場合)\n } else {\n qualities.push({\n name: quality === '1080p-60fps' ? '1080p (60fps)' : quality,\n type: 'live-llhls-for-KonomiTV',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${quality}${hevc_prefix}/ll-hls`,\n });\n }\n }\n }\n return qualities;\n })(),\n },\n // コメント\n danmaku: {\n user: 'KonomiTV', // 便宜上 KonomiTV に固定\n speedRate: this.settingsStore.settings.comment_speed_rate, // コメントの流れる速度\n fontSize: this.settingsStore.settings.comment_font_size, // コメントのフォントサイズ\n closeCommentFormAfterSend: this.settingsStore.settings.close_comment_form_after_sending, // コメント送信後にコメントフォームを閉じる\n },\n // コメント API バックエンド\n apiBackend: {\n // コメント取得時\n read: (options) => {\n // 空の配列を返す (こうするとコメント0件と認識される)\n options.success([]);\n },\n // コメント送信時\n send: async (options) => {\n // Comment コンポーネント内のコメント送信メソッドを呼び出す\n // ref: https://stackoverflow.com/a/65729556/17124142 ($refs への型設定)\n (this.$refs.Comment as InstanceType).sendComment(options);\n },\n },\n // プラグイン\n pluginOptions: {\n // mpegts.js\n mpegts: {\n config: {\n // Web Worker を有効にする\n enableWorker: true,\n // Media Source Extensions API 向けの Web Worker を有効にする\n // メインスレッドから再生処理を分離することで、低スペック端末で DOM 描画の遅延が影響して映像再生が詰まる問題が解消される\n // MSE in Workers が使えるかは MediaSource.canConstructInDedicatedWorker が true かどうかで判定できる\n // MediaSource.canConstructInDedicatedWorker は TypeScript の仕様上型定義の追加が難しいため any で回避している\n // ref: https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/canConstructInDedicatedWorker_static\n enableMSEWorker: window.MediaSource && (window.MediaSource as any).canConstructInDedicatedWorker === true,\n // IO 層のバッファを禁止する\n enableStashBuffer: false,\n // HTMLMediaElement の内部バッファによるライブストリームの遅延を追跡する\n // liveBufferLatencyChasing と異なり、いきなり再生時間をスキップするのではなく、\n // 再生速度を少しだけ上げることで再生を途切れさせることなく遅延を追跡する\n liveSync: this.settingsStore.settings.tv_low_latency_mode,\n // 許容する HTMLMediaElement の内部バッファの最大値 (秒単位, 3秒)\n liveSyncMaxLatency: 3,\n // HTMLMediaElement の内部バッファ (遅延) が liveSyncMaxLatency を超えたとき、ターゲットとする遅延時間 (秒単位)\n liveSyncTargetLatency: playback_buffer_sec,\n // ライブストリームの遅延の追跡に利用する再生速度 (x1.1)\n // 遅延が 3 秒を超えたとき、遅延が playback_buffer_sec を下回るまで再生速度が x1.1 に設定される\n liveSyncPlaybackRate: 1.1,\n }\n },\n // aribb24.js\n aribb24: {\n // 文字スーパーを表示するかどうか\n disableSuperimposeRenderer: this.settingsStore.settings.tv_show_superimpose === false,\n // 描画フォント\n normalFont: `\"${this.settingsStore.settings.caption_font}\", \"Rounded M+ 1m for ARIB\", sans-serif`,\n // 縁取りする色\n forceStrokeColor: this.settingsStore.settings.always_border_caption_text,\n // 背景色\n forceBackgroundColor: (() => {\n if (this.settingsStore.settings.specify_caption_opacity === true) {\n const opacity = this.settingsStore.settings.caption_opacity;\n return `rgba(0, 0, 0, ${opacity})`;\n } else {\n return undefined;\n }\n })(),\n // DRCS 文字を対応する Unicode 文字に置換\n drcsReplacement: true,\n // 高解像度の字幕 Canvas を取得できるように\n enableRawCanvas: true,\n // 縁取りに strokeText API を利用\n useStroke: true,\n // Unicode 領域の代わりに私用面の領域を利用 (Windows TV 系フォントのみ)\n usePUA: (() => {\n const font = this.settingsStore.settings.caption_font;\n const context = document.createElement('canvas').getContext('2d')!;\n context.font = '10px \"Rounded M+ 1m for ARIB\"';\n context.fillText('Test', 0, 0);\n context.font = `10px \"${font}\"`;\n context.fillText('Test', 0, 0);\n if (font.startsWith('Windows TV')) {\n return true;\n } else {\n return false;\n }\n })(),\n // 文字スーパーの PRA (内蔵音再生コマンド) のコールバックを指定\n PRACallback: async (index: number) => {\n\n // 設定で文字スーパーが無効なら実行しない\n if (this.settingsStore.settings.tv_show_superimpose === false) return;\n\n // index に応じた内蔵音を鳴らす\n // ref: https://ics.media/entry/200427/\n // ref: https://www.ipentec.com/document/javascript-web-audio-api-change-volume\n\n // 自動再生ポリシーに引っかかったなどで AudioContext が一時停止されている場合、一度 resume() する必要がある\n // resume() するまでに何らかのユーザーのジェスチャーが行われているはず…\n // なくても動くこともあるみたいだけど、念のため\n if (this.romsounds_context.state === 'suspended') {\n await this.romsounds_context.resume();\n }\n\n // index で指定された音声データを読み込み\n const buffer_source_node = this.romsounds_context.createBufferSource();\n buffer_source_node.buffer = this.romsounds_buffers[index];\n\n // GainNode につなげる\n const gain_node = this.romsounds_context.createGain();\n buffer_source_node.connect(gain_node);\n\n // 出力につなげる\n gain_node.connect(this.romsounds_context.destination);\n\n // 音量を元の wav の3倍にする (1倍だと結構小さめ)\n gain_node.gain.value = 3;\n\n // 再生開始\n buffer_source_node.start(0);\n },\n }\n },\n // 字幕\n subtitle: {\n type: 'aribb24', // aribb24.js を有効化\n }\n });\n\n // デバッグ用にプレイヤーインスタンスも window 直下に入れる\n (window as any).player = this.player;\n\n // プレイヤー側のコントロール非表示タイマーを無効化(上書き)\n // 無効化しておかないと、controlDisplayTimer() と競合してしまう\n // 上書き元のコードは https://github.com/tsukumijima/DPlayer/blob/master/src/js/controller.js#L387-L395 にある\n this.player.controller.setAutoHide = (time: number) => {};\n\n // ニコニコ実況セッションを初期化し、随時コメントを受信できるようにする\n // 初期化以降の処理はすべて LiveCommentManager に任せる\n (this.$refs.Comment as InstanceType).initSession(this.player, this.channelsStore.display_channel_id);\n\n // ***** コメント送信時のイベントハンドラー *****\n\n // コメントが送信されたときに、プレイヤーからのコメント送信から間もないかどうかのフラグを立てる (0.1秒後に解除する)\n // コメントを送信するとコメント入力フォームへのフォーカスが外れるため、ページ全体の keydown イベントでは\n // Enter キーの押下がコメント送信由来のイベントかキャプチャ拡大表示由来のイベントかを判断できない\n // そこで、コメント入力フォームフォーカス中に Enter キーが押された場合(=コメント送信時)に 0.1 秒間フラグを立てることで、\n // ショートカットキーハンドラーがコメント送信由来のイベントであることを判定できるようにしている\n // TODO: 普通に KeyboardEvent.target が dplayer-comment-input かで判断できるんじゃね?\n this.player.template.commentInput.addEventListener('keydown', (event) => {\n if (event.code === 'Enter') {\n this.is_comment_send_just_did = true;\n setTimeout(() => this.is_comment_send_just_did = false, 100);\n }\n });\n\n // ***** 設定パネルのショートカット一覧へのリンクのイベントハンドラー *****\n\n // 設定パネルにショートカット一覧を表示するリンクを動的に追加する\n // タッチデバイスでは実行しない\n const is_touch_device = /iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\n if (is_touch_device === false) {\n this.player.template.settingOriginPanel.insertAdjacentHTML('beforeend', `\n
\n キーボードショートカット\n
\n \n \n \n
\n
`);\n\n // 設定パネルのショートカット一覧を表示するリンクがクリックされたときのイベント\n // リアクティブではないので、手動でやらないといけない…\n this.$el.querySelector('.dplayer-setting-keyboard-shortcut')!.addEventListener('click', () => {\n this.player?.setting.hide(); // 設定パネルを閉じる\n this.shortcut_key_modal = true;\n });\n }\n\n // ***** フルスクリーンのイベントハンドラー *****\n\n // フルスクリーンにするコンテナ要素(ページ全体)\n const fullscreen_container = document.querySelector('.v-application')!;\n this.fullscreen_handler = () => {\n this.is_fullscreen = this.player?.fullScreen.isFullScreen() === true;\n };\n if (fullscreen_container.onfullscreenchange !== undefined) {\n fullscreen_container.addEventListener('fullscreenchange', this.fullscreen_handler);\n } else {\n fullscreen_container.addEventListener('webkitfullscreenchange', this.fullscreen_handler);\n }\n\n // DPlayer のフルスクリーン関係のメソッドを無理やり上書きし、KonomiTV の UI と統合する\n // 上書き元のコードは https://github.com/tsukumijima/DPlayer/blob/master/src/js/fullscreen.js にある\n // フルスクリーンかどうか\n this.player.fullScreen.isFullScreen = (type?: DPlayerType.FullscreenType) => {\n return !!(document.fullscreenElement || document.webkitFullscreenElement);\n };\n // フルスクリーンをリクエスト\n this.player.fullScreen.request = (type?: DPlayerType.FullscreenType) => {\n if (this.player === null) return;\n\n // すでにフルスクリーンだったらキャンセルする\n if (this.player.fullScreen.isFullScreen()) {\n this.player.fullScreen.cancel();\n return;\n }\n\n // フルスクリーンをリクエスト\n // Safari は webkit のベンダープレフィックスが必要\n fullscreen_container.requestFullscreen = fullscreen_container.requestFullscreen || fullscreen_container.webkitRequestFullscreen;\n if (fullscreen_container.requestFullscreen) {\n fullscreen_container.requestFullscreen();\n } else {\n // フルスクリーンがサポートされていない場合はエラーを表示\n this.player.notice('iPhone Safari は動画のフルスクリーン表示に対応していません。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // 画面の向きを横に固定 (Screen Orientation API がサポートされている場合)\n if (screen.orientation) {\n screen.orientation.lock('landscape').catch(() => {});\n }\n };\n // フルスクリーンをキャンセル\n this.player.fullScreen.cancel = (type?: DPlayerType.FullscreenType) => {\n\n // フルスクリーンを終了\n // Safari は webkit のベンダープレフィックスが必要\n document.exitFullscreen = document.exitFullscreen || document.webkitExitFullscreen;\n if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n\n // 画面の向きの固定を解除\n if (screen.orientation) {\n screen.orientation.unlock();\n }\n };\n\n // ***** 再生/停止/画質切り替え時のイベントハンドラー *****\n\n // 再生/停止されたとき\n // 通知バーからの制御など、画面から以外の外的要因で再生/停止が行われる事もある\n const on_play_or_pause = () => {\n\n // まだ設定パネルが表示されていたら非表示にする\n this.player?.setting.hide();\n\n // コントロールを表示する\n this.controlDisplayTimer();\n };\n this.player.on('play', on_play_or_pause);\n this.player.on('pause', on_play_or_pause);\n\n // 画質の切り替えが開始されたときのイベント\n this.player.on('quality_start', async () => {\n\n // ローディング中の背景画像をランダムで設定\n this.background_url = PlayerUtils.generatePlayerBackgroundURL();\n\n // イベントソースを閉じる\n if (this.eventsource !== null) {\n this.eventsource.close();\n this.eventsource = null;\n }\n\n // 新しい EventSource を作成\n // 画質ごとにイベント API は異なるため、一度破棄してから作り直す\n await this.initEventHandler();\n });\n\n // 停止状態でかつ再生時間からバッファが 30 秒以上離れていないかを監視し、そうなっていたら強制的にシークする\n // mpegts.js の仕様上、MSE に未再生のバッファがたまり過ぎると SourceBuffer が追加できなくなるため、強制的に接続が切断されてしまう\n // LL-HLS 再生時も、ずっと停止したままだとプレイリストやセグメントに HTTP リクエストされなくなり、サーバー側でタイムアウトさせられてしまう\n // mpegts.js 再生時は 60 秒、LL-HLS 再生時は 30 秒おきに監視する (LL-HLS 再生時はバッファの状態に関わらずシークする)\n if (this.is_mpegts_supported === true) {\n this.interval_ids.push(window.setInterval(() => {\n if (this.player === null) return;\n if ((this.player.video.paused && this.player.video.buffered.length >= 1) &&\n (this.player.video.buffered.end(0) - this.player.video.currentTime > 30)) {\n this.player.sync();\n }\n }, 60 * 1000));\n } else {\n this.interval_ids.push(window.setInterval(() => {\n if (this.player === null) return;\n if (this.player.video.paused) {\n this.player.sync();\n }\n }, 30 * 1000));\n }\n },\n\n // イベントハンドラーを初期化する\n async initEventHandler() {\n\n // ***** プレイヤー再生開始時のイベントハンドラー *****\n\n if (this.player === null) return;\n\n // データ放送マネージャーを初期化\n // TODO: これは暫定的なものでリファクタリング時は周囲含めて総取っ替えする\n if (this.data_broadcasting_manager !== null) {\n await this.data_broadcasting_manager.destroy();\n }\n this.data_broadcasting_manager = new LiveDataBroadcastingManager({\n player: this.player,\n display_channel_id: this.channelsStore.channel.current.display_channel_id,\n });\n await this.data_broadcasting_manager.init();\n\n // 必ず最初はローディング状態とする\n this.is_loading = true;\n\n // 音量を 0 に設定\n this.player.video.volume = 0;\n\n // mpegts.js 再生時のみ、mpegts.js のログハンドラーを設定する\n if (this.is_mpegts_supported === true && this.player.plugins.mpegts !== undefined) {\n this.player.plugins.mpegts.on(mpegts.Events.ERROR, async (error_type: mpegts.ErrorTypes, detail: mpegts.ErrorDetails) => {\n // 再生中にエラーが発生した場合\n // ワークアラウンドとして通知した後にページをリロードする\n // TODO: ロジックを整理してストリーミングを再起動できるようにする\n this.player.notice(`再生中にエラーが発生しました。(${error_type}: ${detail}) 3秒後にリロードします。`, -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n });\n // LL-HLS 再生時は、error イベントを監視してエラーが発生したらページをリロードする\n } else if (this.is_mpegts_supported === false) {\n this.player.on('error', async () => {\n // オフライン状態では実行しない\n if (this.is_offline === true) {\n return;\n }\n // エラーイベントが発生したが、エラー情報が取得できない場合は何もしない\n if (!this.player?.video.error) {\n return;\n }\n this.player.notice(`再生中にエラーが発生しました。(${this.player.video.error.code}: ${this.player.video.error.message}) 3秒後にリロードします。`, -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n });\n }\n\n // LL-HLS 再生時のみ、ローディングが終わるまでは表示上再生状態を維持する\n // play() が正常に実行できればいいのだが、Safari の自動再生制限により失敗することがあるので、\n // その際はアイコンの HTML を書き換えたりして強制的に再生状態にする (苦肉の策)\n const force_play = () => {\n this.player?.video.play().catch(() => {\n console.warn('HTMLVideoElement.play() rejected. run fallback.');\n const pause_icon = '';\n this.player!.template.playButton.innerHTML = pause_icon;\n this.player!.template.mobilePlayButton.innerHTML = pause_icon;\n this.player!.container.classList.remove('dplayer-paused');\n this.player!.container.classList.add('dplayer-playing');\n this.player!.danmaku!.play();\n });\n // ローディング表示が消えたタイミングでイベントを登録解除\n if (this.is_loading === false) {\n this.player!.video.removeEventListener('pause', force_play);\n return;\n }\n };\n if (this.is_mpegts_supported === false) {\n this.player.video.addEventListener('pause', force_play);\n force_play(); // 一度実行しておく\n }\n\n // 再生準備ができていない場合に復旧を試みる\n const recover = async () => {\n await Utils.sleep(0.5);\n // この時点で映像が停止している場合、復旧を試みる\n if (this.player?.video.readyState < 3) {\n console.log('player.video.readyState < HAVE_FUTURE_DATA. trying to recover.');\n this.player?.video.pause();\n await Utils.sleep(0.1);\n this.player?.video.play().catch(() => {\n console.warn('HTMLVideoElement.play() rejected. paused.');\n this.player?.pause();\n });\n }\n };\n\n // 再生バッファを調整し、再生準備ができた段階でプレイヤーの背景を非表示にするイベントを登録\n // 実際に再生可能になるのを待ってから実行する\n // 画質切り替え時にも実行する必要があるので、あえてこの位置に記述している\n const on_canplay = async () => {\n\n // 自分自身のイベントを登録解除 (重複実行を避ける)\n if (this.player === null) return;\n this.player.video.oncanplay = null;\n this.player.video.oncanplaythrough = null;\n\n // mpegts.js 利用時のみ実行\n if (this.is_mpegts_supported === true) {\n\n // 再生バッファ調整のため、一旦停止させる\n // this.player.video.pause() を使うとプレイヤーの UI アイコンが停止してしまうので、代わりに playbackRate を使う\n this.player.video.playbackRate = 0;\n\n // 再生バッファを取得する (取得に失敗した場合は 0 を返す)\n const get_playback_buffer_sec = (): number => {\n let buffered_end = 0;\n if (this.player.video.buffered.length >= 1) {\n buffered_end = this.player.video.buffered.end(0);\n }\n return (Math.round((buffered_end - this.player.video.currentTime) * 1000) / 1000);\n };\n\n // 低遅延モードであれば低遅延向けの再生バッファを、そうでなければ通常の再生バッファをセット (秒単位)\n const playback_buffer_sec = this.settingsStore.settings.tv_low_latency_mode ?\n PLAYBACK_BUFFER_SEC_LOW_LATENCY : PLAYBACK_BUFFER_SEC;\n\n // 再生バッファが playback_buffer_sec を超えるまで 0.1 秒おきに再生バッファをチェックする\n // 再生バッファが playback_buffer_sec を切ると再生が途切れやすくなるので (特に動きの激しい映像)、\n // 再生開始までの時間を若干犠牲にして、再生バッファの調整と同期に時間を割く\n // playback_buffer_sec の値は mpegts.js に渡す liveSyncTargetLatency プロパティに渡す値と共通\n let current_playback_buffer_sec = get_playback_buffer_sec();\n while (current_playback_buffer_sec < playback_buffer_sec) {\n await Utils.sleep(0.1);\n current_playback_buffer_sec = get_playback_buffer_sec();\n }\n\n // 再生開始\n this.player.video.playbackRate = 1;\n }\n\n // 再生が一時的に止まってバッファリングしているとき/再び再生されはじめたときのイベント\n // バッファリングの Progress Circular の表示を制御する\n // 同期が終わってからの方が都合が良い\n this.player.video.addEventListener('waiting', () => this.is_video_buffering = true);\n this.player.video.addEventListener('playing', () => {\n this.is_video_buffering = false;\n recover();\n });\n\n // ローディング状態を解除し、映像を表示する\n this.is_loading = false;\n\n // ローディングが終わったので強制的に見かけ上再生状態に見せるのをやめる\n if (this.is_mpegts_supported === false) {\n this.player!.video.removeEventListener('pause', force_play);\n }\n\n // バッファリング中の Progress Circular を非表示にする\n this.is_video_buffering = false;\n recover();\n\n if (this.channelsStore.channel.current.is_radiochannel) {\n // ラジオチャンネルでは引き続き映像の代わりとして背景画像を表示し続ける\n this.is_background_display = true;\n } else {\n // 背景画像をフェードアウト\n this.is_background_display = false;\n }\n\n // 再生開始時に音量を徐々に上げる\n // いきなり再生されるよりも体験が良い\n const current_volume = this.player.user.get('volume');\n while ((this.player.video.volume + 0.05) < current_volume) {\n // 小数第2位以下を切り捨てて、浮動小数の誤差で 1 (100%) を微妙に超えてしまいエラーになるのを避ける\n this.player.video.volume = Utils.mathFloor(this.player.video.volume + 0.05, 2);\n await Utils.sleep(0.02);\n }\n this.player.video.volume = current_volume;\n };\n this.player.video.oncanplay = on_canplay;\n this.player.video.oncanplaythrough = on_canplay;\n\n // ***** KonomiTV サーバーのイベント API のイベントハンドラー *****\n\n // EventSource を作成\n const eventsource_url = (this.player!.quality!.url as string).replace('/mpegts', '/events').replace(/\\/ll-hls.*/, '/events');\n this.eventsource = new EventSource(eventsource_url);\n\n // 初回接続時のイベント\n this.eventsource.addEventListener('initial_update', (event_raw: MessageEvent) => {\n\n // イベントを取得\n const event = JSON.parse(event_raw.data);\n console.log(`[initial_update] Status: ${event.status} / Detail: ${event.detail}`);\n\n // ステータスごとに処理を振り分け\n switch (event.status) {\n\n // Status: Standby\n case 'Standby': {\n\n // バッファリング中の Progress Circular を表示\n this.is_video_buffering = true;\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n break;\n }\n }\n });\n\n // ステータスが更新されたときのイベント\n this.eventsource.addEventListener('status_update', async (event_raw: MessageEvent) => {\n\n // イベントを取得\n if (this.player === null) return;\n const event = JSON.parse(event_raw.data);\n console.log(`[status_update] Status: ${event.status} / Detail: ${event.detail}`);\n\n // 視聴者数を更新\n this.channelsStore.updateChannel(this.channelsStore.display_channel_id, {\n ...this.channelsStore.channel.current,\n viewer_count: event.client_count,\n });\n\n // ステータスごとに処理を振り分け\n switch (event.status) {\n\n // Status: Standby\n case 'Standby': {\n\n // ステータス詳細をプレイヤーに表示\n if (!this.player.template.notice.textContent!.includes('画質を')) { // 画質切り替えの表示を上書きしない\n this.player.notice(event.detail, -1);\n }\n\n // バッファリング中の Progress Circular を表示\n this.is_video_buffering = true;\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n break;\n }\n\n // Status: ONAir\n case 'ONAir': {\n\n // ステータス詳細をプレイヤーから削除\n if (!this.player.template.notice.textContent!.includes('画質を')) { // 画質切り替えの表示を上書きしない\n this.player.notice(this.player.template.notice.textContent!, 0.000001);\n }\n\n // LL-HLS ストリーミング時のみ、このタイミングで映像をロードして再生を開始する\n if (this.is_mpegts_supported === false) {\n this.player.video.load();\n this.player.video.play();\n on_canplay();\n }\n\n // 再生が開始される前にチャンネルを切り替えた際にコメントが流れない不具合のワークアラウンド\n if (this.player.container.classList.contains('dplayer-paused')) {\n this.player.container.classList.remove('dplayer-paused');\n this.player.container.classList.add('dplayer-playing');\n }\n\n // 前のプレイヤーインスタンスの Picture-in-Picture ウインドウが残っている場合、終了させてからもう一度切り替える\n // チャンネル切り替えが完了しても前の Picture-in-Picture ウインドウは再利用されないため、一旦終了させるしかない\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n this.player.video.requestPictureInPicture();\n }\n break;\n }\n\n // Status: Idling\n case 'Idling': {\n\n // 本来誰も視聴していないことを示す Idling ステータスを受信している場合、何らかの理由で\n // ストリーミング API への接続が切断された可能性が高いので、ワークアラウンドとして通知した後にページをリロードする\n // TODO: ロジックを整理してストリーミングを再起動できるようにする\n this.player.notice('ストリーミング接続が切断されました。3秒後にリロードします。', -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n\n break;\n }\n\n // Status: Restart\n case 'Restart': {\n\n // ステータス詳細をプレイヤーに表示\n this.player.notice(event.detail, -1);\n\n // プレイヤーを再起動する\n this.player.switchVideo({\n url: this.player.quality!.url,\n type: this.player.quality!.type,\n });\n\n // 再起動しただけでは自動再生されないので、明示的に\n this.player.play();\n\n // バッファリング中の Progress Circular を表示\n this.is_video_buffering = true;\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n break;\n }\n\n // Status: Offline\n // 基本的に Offline は放送休止中やエラーなどで復帰の見込みがない状態\n case 'Offline': {\n\n // 「ライブストリームは Offline です。」のステータス詳細を受信すること自体が不正な状態\n // ストリーミング API への接続が切断された可能性が高いので、ワークアラウンドとして通知した後にページをリロードする\n // TODO: ロジックを整理してストリーミングを再起動できるようにする\n if (event.detail === 'ライブストリームは Offline です。') {\n this.player?.notice('ストリーミング接続が切断されました。3秒後にリロードします。', -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n }\n\n if (this.player !== null) {\n\n // ステータス詳細をプレイヤーに表示\n // 動画の読み込みエラーが送出された時にメッセージを上書きする\n this.player.notice(event.detail, -1);\n this.player.video.onerror = () => {\n this.player!.notice(event.detail, -1);\n this.player!.video.onerror = null;\n };\n\n // 描画されたコメントをクリア\n this.player?.danmaku?.clear();\n\n // 動画を停止する\n this.player.video.pause();\n }\n\n // イベントソースを閉じる(復帰の見込みがないため)\n if (this.eventsource !== null) {\n this.eventsource.close();\n this.eventsource = null;\n }\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n\n // バッファリング中の Progress Circular を非表示にする\n this.is_loading = false;\n this.is_video_buffering = false;\n\n this.is_offline = true;\n break;\n }\n }\n });\n\n // ステータス詳細が更新されたときのイベント\n this.eventsource.addEventListener('detail_update', (event_raw: MessageEvent) => {\n\n // イベントを取得\n if (this.player === null) return;\n const event = JSON.parse(event_raw.data);\n console.log(`[detail_update] Status: ${event.status} Detail:${event.detail}`);\n\n // 視聴者数を更新\n this.channelsStore.updateChannel(this.channelsStore.display_channel_id, {\n ...this.channelsStore.channel.current,\n viewer_count: event.client_count,\n });\n\n // ステータスごとに処理を振り分け\n switch (event.status) {\n\n // Status: Standby\n case 'Standby': {\n\n // ステータス詳細をプレイヤーに表示\n this.player.notice(event.detail, -1);\n\n // プレイヤーの背景を表示する\n if (!this.is_background_display) {\n this.is_background_display = true;\n }\n break;\n }\n }\n });\n\n // クライアント数(だけ)が更新されたときのイベント\n this.eventsource.addEventListener('clients_update', (event_raw: MessageEvent) => {\n\n // イベントを取得\n const event = JSON.parse(event_raw.data);\n\n // 視聴者数を更新\n this.channelsStore.updateChannel(this.channelsStore.display_channel_id, {\n ...this.channelsStore.channel.current,\n viewer_count: event.client_count,\n });\n });\n },\n\n // ショートカットキーを初期化する\n initShortcutKeyHandler() {\n\n const twitter_component = (this.$refs.Twitter as InstanceType);\n const tweet_form_element = twitter_component.$el.querySelector('.tweet-form__textarea');\n\n // IME 変換中の状態を保存する\n for (const element of document.querySelectorAll('input[type=text],input[type=search],textarea')) {\n element.addEventListener('compositionstart', () => this.is_ime_composing = true);\n element.addEventListener('compositionend', () => this.is_ime_composing = false);\n }\n\n // ショートカットキーハンドラー\n this.shortcut_key_handler = async (event: KeyboardEvent) => {\n\n const tag = document.activeElement.tagName.toUpperCase();\n const editable = document.activeElement.getAttribute('contenteditable');\n\n // 矢印キーのデフォルトの挙動(スクロール)を抑制\n // キーリピート周りで間引かれるイベントでも event.preventDefault() しないとスクロールしてしまうため、\n // 一番最初のタイミングでやっておく\n // input・textarea・contenteditable 状態の要素では実行しない\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code) &&\n (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true')) {\n event.preventDefault();\n }\n\n // キーリピート(押しっぱなし)状態の場合は基本実行しない\n // 押し続けると何度も同じ動作が実行されて大変な事になる…\n // ただ、キーリピートを使いたい場合もあるので、リピート状態をフラグとして保存する\n let is_repeat = false;\n if (event.repeat) is_repeat = true;\n\n // キーリピート状態は event.repeat を見る事でだいたい検知できるが、最初の何回かは検知できないこともある\n // そこで、0.05 秒以内に連続して発火したキーイベントは間引きも兼ねて実行しない\n const now = Utils.time();\n if (now - this.shortcut_key_pressed_at < 0.05) return;\n this.shortcut_key_pressed_at = now; // 最終押下時刻を更新\n\n // 無名関数の中で実行する\n const result = await (async (): Promise => {\n\n // ***** ツイート入力フォームにフォーカスを当てる/フォーカスを外す *****\n\n // ツイート入力フォームにフォーカスしているときもこのショートカットが動くようにする\n // 以降の if 文で textarea フォーカス時のイベントをすべて弾いてしまっているため、前に持ってきている\n // Tab キーに割り当てている関係で、IME 変換中は実行しない(IME 変換中に実行すると文字変換ができなくなる)\n if (((tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') ||\n (document.activeElement === tweet_form_element)) && this.is_ime_composing === false) {\n if (event.code === 'Tab') {\n\n // ツイート入力フォームにフォーカスがすでに当たっていたら、フォーカスを外して終了\n if (document.activeElement === tweet_form_element) {\n tweet_form_element.blur();\n return true;\n }\n\n // パネルを開く\n this.is_panel_display = true;\n\n // どのタブを開いていたかに関係なく Twitter タブに切り替える\n this.tv_panel_active_tab = 'Twitter';\n\n // ツイート入力フォームの textarea 要素にフォーカスを当てる\n tweet_form_element.focus();\n\n // フォーカスを当てると勝手に横方向にスクロールされてしまうので、元に戻す\n this.$el.scrollLeft = 0;\n\n window.setTimeout(() => {\n\n // 他のタブから切り替えると一発でフォーカスが当たらないことがあるので、ちょっとだけ待ってから念押し\n // $nextTick() だと上手くいかなかった…\n tweet_form_element.focus();\n\n // フォーカスを当てると勝手に横方向にスクロールされてしまうので、元に戻す\n this.$el.scrollLeft = 0;\n\n }, 100); // 0.1秒\n\n return true;\n }\n }\n\n // ***** ツイートを送信する *****\n\n // ツイート入力フォームにフォーカスしているときもこのショートカットが動くようにする\n // Twitter タブ以外を開いているときは実行しない\n // 以降の if 文で textarea フォーカス時のイベントをすべて弾いてしまっているため、前に持ってきている\n if (((tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') ||\n (document.activeElement === tweet_form_element)) &&\n this.tv_panel_active_tab === 'Twitter' &&\n this.is_ime_composing === false) {\n // (Ctrl or Cmd or Shift) + Enter\n // Shift + Enter は隠し機能(間違えたとき用)\n if ((event.ctrlKey || event.metaKey || event.shiftKey) && event.code === 'Enter') {\n twitter_component.$el.querySelector('.tweet-button')!.click();\n return true;\n }\n }\n\n // ***** コメント入力フォームを閉じる *****\n\n // プレイヤーが初期化されていない時・Shift / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && !event.shiftKey && !event.altKey) {\n\n // コメント入力フォームが表示されているときのみ\n if (this.player.template.controller.classList.contains('dplayer-controller-comment')) {\n // Ctrl or Cmd + M\n if ((event.ctrlKey || event.metaKey) && event.code === 'KeyM') {\n this.player.comment!.hide();\n return true;\n }\n }\n }\n\n // input・textarea・contenteditable 状態の要素でなければ\n // 文字入力中にショートカットキーが作動してしまわないように\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n\n // キーリピートでない時・Ctrl / Cmd キーが一緒に押された時に作動しないように\n // チャンネル選局のキーボードショートカットを Alt or Option + 数字キー/テンキーに変更する設定が有効なときは、\n // Alt or Option キーが押されていることを条件に追加する\n if (is_repeat === false && !event.ctrlKey && !event.metaKey &&\n (this.settingsStore.settings.tv_channel_selection_requires_alt_key === false || (event.altKey))) {\n\n // ***** 数字キーでチャンネルを切り替える *****\n\n // Shift キーが同時押しされていたら BS チャンネルの方を選局する\n const switch_channel_type = (event.shiftKey) ? 'BS' : 'GR';\n\n // 1~9キー\n let switch_remocon_id: number | null = null;\n if (event.code === 'Digit1' || event.code === 'Digit2' || event.code === 'Digit3' ||\n event.code === 'Digit4' || event.code === 'Digit5' || event.code === 'Digit6' ||\n event.code === 'Digit7' || event.code === 'Digit8' || event.code === 'Digit9') {\n switch_remocon_id = Number(event.code.replace('Digit', ''));\n }\n // 0キー: 10に割り当て\n if (event.code === 'Digit0') switch_remocon_id = 10;\n // -キー: 11に割り当て\n if (event.code === 'Minus') switch_remocon_id = 11;\n // ^キー: 12に割り当て\n if (event.code === 'Equal') switch_remocon_id = 12;\n // 1~9キー (テンキー)\n if (event.code === 'Numpad1' || event.code === 'Numpad2' || event.code === 'Numpad3' ||\n event.code === 'Numpad4' || event.code === 'Numpad5' || event.code === 'Numpad6' ||\n event.code === 'Numpad7' || event.code === 'Numpad8' || event.code === 'Numpad9') {\n switch_remocon_id = Number(event.code.replace('Numpad', ''));\n }\n // 0キー (テンキー): 10に割り当て\n if (event.code === 'Numpad0') switch_remocon_id = 10;\n\n // この時点でリモコン番号が取得できていたら実行\n if (switch_remocon_id !== null) {\n\n // 切り替え先のチャンネルを取得する\n const switch_channel = this.channelsStore.getChannelByRemoconID(switch_channel_type, switch_remocon_id);\n\n // チャンネルが取得できていれば、ルーティングをそのチャンネルに置き換える\n // 押されたキーに対応するリモコン番号のチャンネルがない場合や、現在と同じチャンネル ID の場合は何も起こらない\n if (switch_channel !== null && switch_channel.display_channel_id !== this.channelsStore.display_channel_id) {\n await this.$router.push({path: `/tv/watch/${switch_channel.display_channel_id}`});\n return true;\n }\n }\n }\n\n // キーリピートでない時・Ctrl / Cmd / Shift / Alt キーが一緒に押された時に作動しないように\n if (is_repeat === false && !event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey) {\n\n // ***** キーボードショートカットの一覧を表示する *****\n\n // /(?)キー: キーボードショートカットの一覧を表示する\n if (event.code === 'Slash') {\n this.shortcut_key_modal = !this.shortcut_key_modal;\n return true;\n }\n\n // ***** パネルのタブを切り替える *****\n\n // Pキー: パネルの表示切り替え\n if (event.code === 'KeyP') {\n this.is_panel_display = !this.is_panel_display;\n return true;\n }\n // Kキー: 番組情報タブ\n if (event.code === 'KeyK') {\n this.tv_panel_active_tab = 'Program';\n return true;\n }\n // Lキー: チャンネルタブ\n if (event.code === 'KeyL') {\n this.tv_panel_active_tab = 'Channel';\n return true;\n }\n // ;(+)キー: コメントタブ\n if (event.code === 'Semicolon') {\n this.tv_panel_active_tab = 'Comment';\n return true;\n }\n // :(*)キー: Twitterタブ\n if (event.code === 'Quote') {\n this.tv_panel_active_tab = 'Twitter';\n return true;\n }\n\n // ***** Twitter タブ内のタブを切り替える *****\n\n // [(「): ツイート検索タブ\n if (event.code === 'BracketRight') {\n twitter_component.twitter_active_tab = 'Search';\n return true;\n }\n // ](」): タイムラインタブ\n if (event.code === 'Backslash') {\n twitter_component.twitter_active_tab = 'Timeline';\n return true;\n }\n // \\(¥)キー: キャプチャタブ\n if (event.code === 'IntlRo') {\n twitter_component.twitter_active_tab = 'Capture';\n return true;\n }\n }\n\n // Twitter タブ内のキャプチャタブが表示されている & Ctrl / Cmd / Shift / Alt のいずれも押されていないときだけ\n // キャプチャタブが表示されている時は、プレイヤー操作側の矢印キー/スペースキーのショートカットは動作しない(キーが重複するため)\n if (this.tv_panel_active_tab === 'Twitter' && twitter_component.twitter_active_tab === 'Capture' &&\n (!event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey)) {\n\n // ***** キャプチャにフォーカスする *****\n\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) {\n\n // キャプチャリストに一枚もキャプチャがない\n if (twitter_component.captures.length === 0) return false;\n\n // まだどのキャプチャにもフォーカスされていない場合は、一番新しいキャプチャにフォーカスして終了\n if (twitter_component.captures.some(capture => capture.focused === true) === false) {\n twitter_component.captures[twitter_component.captures.length - 1].focused = true;\n return true;\n }\n\n // 現在フォーカスされているキャプチャのインデックスを取得\n const focused_capture_index = twitter_component.captures.findIndex(capture => capture.focused === true);\n\n // ↑キー: 2つ前のキャプチャにフォーカスする\n // キャプチャリストは2列で並んでいるので、2つ後のキャプチャが現在フォーカスされているキャプチャの直上になる\n if (event.code === 'ArrowUp') {\n // 2つ前のキャプチャがないなら実行しない\n if (focused_capture_index - 2 < 0) return false;\n twitter_component.captures[focused_capture_index - 2].focused = true;\n }\n\n // ↓キー: 2つ後のキャプチャにフォーカスする\n // キャプチャリストは2列で並んでいるので、2つ後のキャプチャが現在フォーカスされているキャプチャの直下になる\n if (event.code === 'ArrowDown') {\n // 2つ後のキャプチャがないなら実行しない\n if (focused_capture_index + 2 > (twitter_component.captures.length - 1)) return false;\n twitter_component.captures[focused_capture_index + 2].focused = true;\n }\n\n // ←キー: 1つ前のキャプチャにフォーカスする\n if (event.code === 'ArrowLeft') {\n // 1つ前のキャプチャがないなら実行しない\n if (focused_capture_index - 1 < 0) return false;\n twitter_component.captures[focused_capture_index - 1].focused = true;\n }\n\n // ←キー: 1つ後のキャプチャにフォーカスする\n if (event.code === 'ArrowRight') {\n // 1つ後のキャプチャがないなら実行しない\n if (focused_capture_index + 1 > (twitter_component.captures.length - 1)) return false;\n twitter_component.captures[focused_capture_index + 1].focused = true;\n }\n\n // 現在フォーカスされているキャプチャのフォーカスを外す\n twitter_component.captures[focused_capture_index].focused = false;\n\n // 拡大表示のモーダルが開かれている場合は、フォーカスしたキャプチャをモーダルにセット\n // こうすることで、QuickLook みたいな挙動になる\n const focused_capture = twitter_component.captures.find(capture => capture.focused === true);\n if (twitter_component.zoom_capture_modal === true) {\n twitter_component.zoom_capture = focused_capture;\n }\n\n // 現在フォーカスされているキャプチャが見える位置までスクロール\n // block: 'nearest' の指定で、上下どちらにスクロールしてもフォーカスされているキャプチャが常に表示されるようになる\n const focused_capture_element =\n twitter_component.$el.querySelector(`img[src=\"${focused_capture.image_url}\"]`).parentElement;\n if (is_repeat) {\n // キーリピート状態ではスムーズスクロールがフォーカスの移動に追いつけずスクロールの挙動がおかしくなるため、\n // スムーズスクロールは無効にしてある\n focused_capture_element.scrollIntoView({block: 'nearest', inline: 'nearest', behavior: 'auto'});\n } else {\n focused_capture_element.scrollIntoView({block: 'nearest', inline: 'nearest', behavior: 'smooth'});\n }\n return true;\n }\n\n // ***** キャプチャを拡大表示する/拡大表示を閉じる *****\n\n if (event.code === 'Enter') {\n\n // Enter キーの押下がプレイヤー側のコメント送信由来のイベントの場合は実行しない\n if (this.is_comment_send_just_did) return false;\n\n // すでにモーダルが開かれている場合は、どのキャプチャが拡大表示されているかに関わらず閉じる\n if (twitter_component.zoom_capture_modal === true) {\n twitter_component.zoom_capture_modal = false;\n return true;\n }\n\n // 現在フォーカスされているキャプチャを取得\n // まだどのキャプチャにもフォーカスされていない場合は実行しない\n const focused_capture = twitter_component.captures.find(capture => capture.focused === true);\n if (focused_capture === undefined) return false;\n\n // モーダルを開き、モーダルで拡大表示するキャプチャとしてセット\n twitter_component.zoom_capture = focused_capture;\n twitter_component.zoom_capture_modal = true;\n return true;\n }\n\n // ***** キャプチャを選択する/選択を解除する *****\n\n if (event.code === 'Space') {\n\n // 現在フォーカスされているキャプチャを取得\n // まだどのキャプチャにもフォーカスされていない場合は実行しない\n const focused_capture = twitter_component.captures.find(capture => capture.focused === true);\n if (focused_capture === undefined) return false;\n\n // 「キャプチャリスト内のキャプチャがクリックされたときのイベント」を呼ぶ\n // 選択されていなければ選択され、選択されていれば選択が解除される\n // キャプチャの枚数制限などはすべて clickCapture() の中で処理される\n twitter_component.clickCapture(focused_capture);\n return true;\n }\n }\n\n // ***** 上下キーでチャンネルを切り替える *****\n\n // キーリピートでない時・Ctrl / Cmd / Shift / Alt キーが一緒に押された時に作動しないように\n // キャプチャ関連のショートカットの後に持ってこないとキャプチャ関連のショートカットが動作しなくなる\n if (is_repeat === false && !event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey) {\n\n // ↑キー: 前のチャンネルに切り替え\n if (event.code === 'ArrowUp') {\n this.is_zapping = true;\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`});\n return true;\n }\n // ↓キー: 次のチャンネルに切り替え\n if (event.code === 'ArrowDown') {\n this.is_zapping = true;\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.next.display_channel_id}`});\n return true;\n }\n }\n\n // ***** プレイヤーのショートカットキー *****\n\n // プレイヤーが初期化されていない時・Shift / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && !event.shiftKey && !event.altKey) {\n\n // Ctrl / Cmd + ↑キー: プレイヤーの音量を上げる\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowUp') {\n this.player.volume(this.player.volume() + 0.05);\n return true;\n }\n // Ctrl / Cmd + ↓キー: プレイヤーの音量を下げる\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowDown') {\n this.player.volume(this.player.volume() - 0.05);\n return true;\n }\n // Ctrl / Cmd + ←キー: 停止して0.5秒巻き戻し\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowLeft') {\n if (this.player.video.paused === false) this.player.video.pause();\n this.player.video.currentTime = this.player.video.currentTime - 0.5;\n return true;\n }\n // Ctrl / Cmd + →キー: 停止して0.5秒早送り\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowRight') {\n if (this.player.video.paused === false) this.player.video.pause();\n this.player.video.currentTime = this.player.video.currentTime + 0.5;\n return true;\n }\n }\n\n // プレイヤーが初期化されていない時・Ctrl / Cmd / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && !event.ctrlKey && !event.metaKey && !event.altKey) {\n\n // Shift + Spaceキー + キーリピートでない時 + Twitter タブ表示時 + キャプチャタブ表示時: 再生/停止\n if (event.shiftKey === true && event.code === 'Space' && is_repeat === false &&\n this.tv_panel_active_tab === 'Twitter' && twitter_component.twitter_active_tab === 'Capture') {\n this.player.toggle();\n return true;\n }\n }\n\n // プレイヤーが初期化されていない時・キーリピートでない時・Ctrl / Cmd / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && is_repeat === false && !event.ctrlKey && !event.metaKey && !event.altKey) {\n\n // Spaceキー: 再生/停止\n if (event.code === 'Space') {\n this.player.toggle();\n return true;\n }\n // Fキー: フルスクリーンの切り替え\n if (event.code === 'KeyF') {\n this.player.fullScreen.toggle();\n return true;\n }\n // Wキー: ライブストリームの同期\n if (event.code === 'KeyW') {\n this.player.sync();\n return true;\n }\n // Eキー: Picture-in-Picture の表示切り替え\n if (event.code === 'KeyE') {\n if (document.pictureInPictureEnabled) {\n this.player.template.pipButton.click();\n }\n return true;\n }\n // Sキー: 字幕の表示切り替え\n if (event.code === 'KeyS') {\n this.player.subtitle.toggle();\n if (!this.player.subtitle.container.classList.contains('dplayer-subtitle-hide')) {\n this.player.notice(`${this.player.tran('Show subtitle')}`);\n } else {\n this.player.notice(`${this.player.tran('Hide subtitle')}`);\n }\n return true;\n }\n // Dキー: コメントの表示切り替え\n if (event.code === 'KeyD') {\n this.player.template.showDanmaku.click();\n if (this.player.template.showDanmakuToggle.checked) {\n this.player.notice(`${this.player.tran('Show comment')}`);\n } else {\n this.player.notice(`${this.player.tran('Hide comment')}`);\n }\n return true;\n }\n // Cキー: 映像をキャプチャ\n if (event.code === 'KeyC') {\n await this.capture_manager.captureAndSave(false);\n return true;\n }\n // Vキー: 映像を実況コメントを付けてキャプチャ\n if (event.code === 'KeyV') {\n await this.capture_manager.captureAndSave(true);\n return true;\n }\n // Mキー: コメント入力フォームにフォーカス\n if (event.code === 'KeyM') {\n this.player.controller.show();\n this.player.comment.show();\n this.controlDisplayTimer();\n window.setTimeout(() => this.player.template.commentInput.focus(), 100);\n return true;\n }\n }\n }\n return false;\n })();\n\n // 無名関数を実行した後の戻り値が true ならショートカットキーの操作を実行したことになるので、デフォルトのキー操作を封じる\n if (result === true) {\n event.preventDefault();\n }\n };\n\n // ページ上でキーが押されたときのイベントを登録\n document.addEventListener('keydown', this.shortcut_key_handler);\n },\n\n // キャプチャ関連のイベントを初期化する\n initCaptureManager() {\n\n // キャプチャマネージャーを初期化\n this.capture_manager = new CaptureManager({\n player: this.player,\n captured_callback: (blob: Blob, filename: string) => {\n // キャプチャが撮られたら、随時 Twitter タブのキャプチャリストに追加する\n (this.$refs.Twitter as InstanceType).addCaptureList(blob, filename);\n }\n });\n\n // キャプチャボタンがクリックされたときのイベント\n // ショートカットからのキャプチャでも同じイベントがトリガーされる\n const capture_button = this.$el.querySelector('.dplayer-icon.dplayer-capture-icon')!;\n capture_button.addEventListener('click', async () => {\n await this.capture_manager.captureAndSave(false);\n });\n\n // コメント付きキャプチャボタンがクリックされたときのイベント\n // ショートカットからのキャプチャでも同じイベントがトリガーされる\n const comment_capture_button = this.$el.querySelector('.dplayer-icon.dplayer-comment-capture-icon')!;\n comment_capture_button.addEventListener('click', async () => {\n await this.capture_manager.captureAndSave(true);\n });\n },\n\n\n // 再生セッションを破棄する\n // チャンネルを切り替える際に実行される\n async destroy(is_destroy_player = false, is_zapping_continuously = false) {\n\n // ニコニコ実況セッションを破棄し、コメント受信を終了する\n (this.$refs.Comment as InstanceType).destroy();\n\n // clearInterval() ですべての setInterval(), setTimeout() の実行を止める\n // clearInterval() と clearTimeout() は中身共通なので問題ない\n for (const interval_id of this.interval_ids) {\n window.clearInterval(interval_id);\n }\n\n // コントロール表示制御用タイマーを止める\n window.clearTimeout(this.control_interval_id);\n\n // interval_ids をクリア\n this.interval_ids = [];\n\n // データ放送マネージャーを破棄\n // CSS アニメーションの関係上、ローディング状態にする前に破棄する必要がある\n if (this.data_broadcasting_manager !== null) {\n await this.data_broadcasting_manager.destroy();\n this.data_broadcasting_manager = null;\n }\n\n // 再びローディング状態にする\n this.is_loading = true;\n\n // プレイヤーの背景を隠す\n this.is_background_display = false;\n\n // プレイヤーの破棄を許可する\n if (this.player !== null) {\n this.player_can_be_destroyed = true;\n }\n\n // イベントソースを閉じる\n if (this.eventsource !== null) {\n this.eventsource.close();\n this.eventsource = null;\n }\n\n // 映像がフェードアウトするアニメーション (0.2秒) 分待ってから実行\n // この 0.2 秒の間に音量をフェードアウトさせる\n // なお、ザッピングでチャンネルを連続で切り替えている場合は実行しない (実行しても意味がないため)\n if (is_zapping_continuously === false) {\n const current_volume = this.player.user.get('volume');\n // 20回 (0.01秒おき) に分けて音量を下げる\n for (let i = 0; i < 20; i++) {\n await Utils.sleep(0.01);\n this.player.video.volume = current_volume * (1 - (i + 1) / 20);\n }\n }\n\n // is_destroy_player が true の時は、ここで DPlayer 自体を破棄する\n // false の時は次の initPlayer() が実行されるまで破棄されない\n // 次のプレイヤーの初期化の直前に前のプレイヤーを破棄することで、プレイヤーの HTML が消えることによるちらつきを防ぐ\n if (is_destroy_player === true && this.player !== null) {\n try {\n this.player.destroy();\n } catch (error) {\n // mpegts.js をうまく破棄できない場合\n if (this.player.plugins.mpegts !== undefined) {\n this.player.plugins.mpegts.destroy();\n }\n }\n this.player_can_be_destroyed = false;\n this.player = null;\n }\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Watch.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Watch.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Watch.vue?vue&type=template&id=0dd9e1f3&scoped=true&\"\nimport script from \"./Watch.vue?vue&type=script&lang=ts&\"\nexport * from \"./Watch.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Watch.vue?vue&type=style&index=0&id=0dd9e1f3&prod&lang=scss&\"\nimport style1 from \"./Watch.vue?vue&type=style&index=1&id=0dd9e1f3&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0dd9e1f3\",\n null\n \n)\n\nexport default component.exports","\nimport Vue from 'vue';\nimport VueRouter from 'vue-router';\n\nimport Utils from '@/utils';\nimport Login from '@/views/Login.vue';\nimport NotFound from '@/views/NotFound.vue';\nimport Register from '@/views/Register.vue';\nimport SettingsAccount from '@/views/Settings/Account.vue';\nimport SettingsCaption from '@/views/Settings/Caption.vue';\nimport SettingsCapture from '@/views/Settings/Capture.vue';\nimport SettingsDataBroadcasting from '@/views/Settings/DataBroadcasting.vue';\nimport SettingsGeneral from '@/views/Settings/General.vue';\nimport SettingsIndex from '@/views/Settings/Index.vue';\nimport SettingsJikkyo from '@/views/Settings/Jikkyo.vue';\nimport SettingsServer from '@/views/Settings/Server.vue';\nimport SettingsTwitter from '@/views/Settings/Twitter.vue';\nimport TVHome from '@/views/TV/Home.vue';\nimport TVWatch from '@/views/TV/Watch.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n\n // History API モード\n mode: 'history',\n\n // ルーティングのベース URL\n base: process.env.BASE_URL,\n\n // ルーティング設定\n routes: [\n {\n path: '/',\n redirect: '/tv/',\n },\n {\n path: '/tv/',\n name: 'TV Home',\n component: TVHome,\n },\n {\n path: '/tv/watch/:display_channel_id',\n name: 'TV Watch',\n component: TVWatch,\n },\n {\n path: '/settings/',\n name: 'Settings Index',\n component: SettingsIndex,\n beforeEnter: (to, from, next) => {\n\n // スマホ縦画面・スマホ横画面・タブレット縦画面では設定一覧画面を表示する(画面サイズの関係)\n if (Utils.isSmartphoneVertical() || Utils.isSmartphoneHorizontal() || Utils.isTabletVertical()) {\n next(); // 通常通り遷移\n return;\n }\n\n // それ以外の画面サイズでは全般設定にリダイレクト\n next({path: '/settings/general/'});\n }\n },\n {\n path: '/settings/general',\n name: 'Settings General',\n component: SettingsGeneral,\n },\n {\n path: '/settings/caption',\n name: 'Settings Caption',\n component: SettingsCaption,\n },\n {\n path: '/settings/data-broadcasting',\n name: 'Settings Data Broadcasting',\n component: SettingsDataBroadcasting,\n },\n {\n path: '/settings/capture',\n name: 'Settings Capture',\n component: SettingsCapture,\n },\n {\n path: '/settings/account',\n name: 'Settings Account',\n component: SettingsAccount,\n },\n {\n path: '/settings/jikkyo',\n name: 'Settings Jikkyo',\n component: SettingsJikkyo,\n },\n {\n path: '/settings/twitter',\n name: 'Settings Twitter',\n component: SettingsTwitter,\n },\n {\n path: '/settings/server',\n name: 'Settings Server',\n component: SettingsServer,\n },\n {\n path: '/login/',\n name: 'Login',\n component: Login,\n },\n {\n path: '/register/',\n name: 'Register',\n component: Register,\n },\n {\n path: '*',\n name: 'NotFound',\n component: NotFound,\n },\n ],\n\n // ページ遷移時のスクロールの挙動の設定\n // ref: https://v3.router.vuejs.org/ja/guide/advanced/scroll-behavior.html\n scrollBehavior (to, from, savedPosition) {\n if (savedPosition) {\n // 戻る/進むボタンが押されたときは保存されたスクロール位置を使う\n return savedPosition;\n } else {\n // それ以外は常に先頭にスクロールする\n return {x: 0, y: 0};\n }\n }\n});\n\nexport default router;\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker';\n\nimport Message from '@/message';\nimport Utils from '@/utils';\n\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready() {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n );\n },\n registered() {\n console.log('Service worker has been registered.');\n },\n cached() {\n console.log('Content has been cached for offline use.');\n },\n updatefound() {\n console.log('New content is downloading.');\n },\n updated(registration: ServiceWorkerRegistration) {\n console.log('New content is available; please refresh.');\n Message.show({\n message: 'クライアントが新しいバージョンに更新されました。5秒後にリロードします。',\n timeout: 10000, // リロードするまで表示し続ける\n });\n // PWA (Service Worker) を更新する\n if (registration.waiting === null) {\n return;\n }\n registration.waiting.postMessage({type: 'SKIP_WAITING'});\n registration.waiting.addEventListener('statechange', async (event) => {\n if ((event.target as ServiceWorker).state === 'activated') {\n await Utils.sleep(4); // activated になるまで少し時間がかかるので、1秒減らして4秒待つ\n location.reload(true);\n }\n });\n },\n offline() {\n console.log('No internet connection found. App is running in offline mode.');\n },\n error(error) {\n console.error('Error during service worker registration:', error);\n }\n });\n}\n","\nimport { Icon } from '@iconify/vue2';\nimport { createPinia, PiniaVuePlugin } from 'pinia';\nimport { polyfill as SeamlessScrollPolyfill } from 'seamless-scroll-polyfill';\nimport VTooltip from 'v-tooltip';\nimport Vue from 'vue';\nimport VueVirtualScroller from 'vue-virtual-scroller';\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css';\nimport VuetifyMessageSnackbar from 'vuetify-message-snackbar';\nimport 'v-tooltip/dist/v-tooltip.css';\n\nimport App from '@/App.vue';\nimport VTabItem from '@/components/Vuetify/VTabItem';\nimport VTabs from '@/components/Vuetify/VTabs';\nimport VTabsItems from '@/components/Vuetify/VTabsItems';\nimport vuetify from '@/plugins/vuetify';\nimport router from '@/router';\nimport useSettingsStore, { setLocalStorageSettings } from '@/store/SettingsStore';\nimport '@/service-worker';\nimport Utils from '@/utils';\n\n\n// スムーズスクロール周りの API の polyfill を適用\n// Element.scrollInfoView() のオプション指定を使うために必要\nSeamlessScrollPolyfill();\n\n// Production Tip を非表示にする\nVue.config.productionTip = false;\n\n// 常に Vue.js devtools を有効にする\nVue.config.devtools = true;\n\n// Pinia を使う\n// ref: https://pinia.vuejs.org/cookbook/options-api.html\nVue.use(PiniaVuePlugin);\nconst pinia = createPinia();\n\n// vue-virtual-scroller を使う\nVue.use(VueVirtualScroller);\n\n// vuetify-message-snackbar を使う\n// マイナーな OSS(しかも中国語…)だけど、Snackbar を関数で呼びたかったのでちょうどよかった\n// ref: https://github.com/thinkupp/vuetify-message-snackbar\nVue.use(VuetifyMessageSnackbar, {\n // 画面上に配置しない\n top: false,\n // 画面下に配置する\n bottom: true,\n // デフォルトの背景色\n color: '#433532',\n // ダークテーマを適用する\n dark: true,\n // 影 (Elevation) の設定\n elevation: 8,\n // 2.5秒でタイムアウト\n timeout: 2500,\n // 要素が非表示になった後に DOM から要素を削除する\n autoRemove: true,\n // 閉じるボタンのテキスト\n closeButtonContent: '閉じる',\n // Vuetify のインスタンス\n vuetifyInstance: vuetify,\n});\n\n// VTooltip を使う\n// タッチデバイスでは無効化する\n// ref: https://v-tooltip.netlify.app/guide/config.html#default-values\nconst trigger = Utils.isTouchDevice() ? [] : ['hover', 'focus', 'touch'];\nVTooltip.options.themes.tooltip.showTriggers = trigger;\nVTooltip.options.themes.tooltip.hideTriggers = trigger;\nVTooltip.options.themes.tooltip.delay.show = 0;\nVTooltip.options.offset = [0, 7];\nVue.use(VTooltip);\n\n// Iconify(アイコン)のグローバルコンポーネント\nVue.component('Icon', Icon);\n\n// VTabItem / VTabs / VTabsItems の挙動を改善するグローバルコンポーネント\nVue.component('v-tab-item-fix', VTabItem);\nVue.component('v-tabs-fix', VTabs);\nVue.component('v-tabs-items-fix', VTabsItems);\n\n// Vue を初期化\n(window as any).KonomiTVVueInstance = new Vue({\n pinia,\n router,\n vuetify,\n render: h => h(App),\n}).$mount('#app');\n\n// 設定データをサーバーにアップロード中かどうか\nlet is_uploading_settings = false;\n\n// 設定データの変更を監視する\nconst settings_store = useSettingsStore();\nsettings_store.$subscribe(async () => {\n\n // 設定データをアップロード中の場合は何もしない\n if (is_uploading_settings === true) {\n return;\n }\n\n // 設定データを LocalStorage に保存\n console.log('Client Settings Changed:', settings_store.settings);\n setLocalStorageSettings(settings_store.settings);\n\n // 設定データをサーバーに同期する (ログイン時かつ同期が有効な場合のみ)\n await settings_store.syncClientSettingsToServer();\n\n}, {detached: true});\n\n// ログイン時かつ設定の同期が有効な場合、ページ遷移に関わらず、常に3秒おきにサーバーから設定を取得する\n// 初回のページレンダリングに間に合わないのは想定内(同期の完了を待つこともできるが、それだと表示速度が遅くなるのでしょうがない)\nwindow.setInterval(async () => {\n if (Utils.getAccessToken() !== null && settings_store.settings.sync_settings === true) {\n\n // 設定データをサーバーにアップロード\n is_uploading_settings = true;\n await settings_store.syncClientSettingsFromServer();\n is_uploading_settings = false;\n\n // 設定データを LocalStorage に保存\n setLocalStorageSettings(settings_store.settings);\n }\n}, 3 * 1000); // 3秒おき\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\tid: moduleId,\n\t\tloaded: false,\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// Flag the module as loaded\n\tmodule.loaded = true;\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};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"assets/js/\" + chunkId + \".\" + \"64d0cbac\" + \".js\";\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); }","// 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__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\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\t143: 0\n};\n\n// no chunk on demand loading\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[\"webpackChunkKonomiTV\"] = self[\"webpackChunkKonomiTV\"] || [];\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, [998], function() { return __webpack_require__(40490); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_c","_self","attrs","staticRenderFns","script","component","render","VTabItem","h","props","name","this","computedTransition","on","beforeEnter","onBeforeTransition","afterEnter","onAfterTransition","enterCancelled","onTransitionCancelled","beforeLeave","afterLeave","leaveCancelled","enter","onEnter","genWindowItem","VTabsBar","data","items","methods","register","item","activeItem","internalIndex","push","sort","a","b","index_a","$slots","default","findIndex","element","$vnode","key","index_b","$on","onClick","mandatory","selectedValues","length","updateMandatory","updateItem","indexOf","undefined","updateInternalValue","unregister","constructor","super","options","call","VTabs","genBar","slider","style","height","convertToUnit","activeClass","centerActive","dark","light","optional","mobileBreakpoint","nextIcon","prevIcon","showArrows","value","internalValue","callSlider","change","val","ref","setTextColor","computedColor","setBackgroundColor","backgroundColor","$createElement","genSlider","VTabsItems","updateReverse","oldVal","itemsLength","lastIndex","continuous","Vue","Vuetify","VSnackbar","VBtn","VIcon","theme","themes","primary","secondary","twitter","base","lighten1","lighten2","gray","black","background","lighten3","text","darken1","darken2","darken3","customProperties","Utils","static","localStorage","getItem","access_token","setItem","removeItem","test","navigator","userAgent","blob","filename","blob_url","URL","createObjectURL","link","document","createElement","download","href","click","revokeObjectURL","content","html_escape_table","replace","match","popupSizeWidth","popupSizeHeight","window","screen","posTop","posLeft","width","class_name","activeElement","classList","contains","matchMedia","matches","Math","floor","seconds","Promise","resolve","setTimeout","Date","now","Object","prototype","toString","slice","toLowerCase","escapeHTML","pattern","version","process","api_base_url","location","protocol","host","ChannelUtils","display_channel_id","result","groups","channel_type","toUpperCase","e","jikkyo_force","success","message","KonomiTVVueInstance","$message","info","warning","error","show","axios_instance","axios","interceptors","request","use","config","baseURL","url","startsWith","headers","timeout","Users","user_create_request","response","APIClient","Message","username","password","URLSearchParams","responseType","user_update_request","icon","form_data","FormData","append","useUserStore","defineStore","state","is_logged_in","user","user_icon_url","getters","user_niconico_icon_url","niconico_user_id","user_id_slice","actions","async","console","log","login","silent","logout","fetchUser","settings_store","useSettingsStore","settings","sync_settings","force","catch","AxiosError","status","Error","detail","is_error","NaN","is_success","method","template","user_store","Number","isNaN","Settings","sync_settings_keys","default_settings","pinned_channel_ids","showed_panel_last_time","selected_twitter_account_id","saved_twitter_hashtags","tv_streaming_quality","tv_data_saver_mode","tv_low_latency_mode","panel_display_state","tv_panel_active_tab","tv_channel_selection_requires_alt_key","caption_font","always_border_caption_text","specify_caption_opacity","caption_opacity","tv_show_superimpose","tv_show_data_broadcasting","capture_copy_to_clipboard","capture_save_mode","capture_caption_mode","comment_speed_rate","comment_font_size","close_comment_form_after_sending","muted_comment_keywords","muted_niconico_user_ids","mute_vulgar_comments","mute_abusive_discriminatory_prejudiced_comments","mute_big_size_comments","mute_fixed_comments","mute_colored_comments","mute_consecutive_same_characters_comments","fold_panel_after_sending_tweet","reset_hashtag_when_program_switches","auto_add_watching_channel_hashtag","twitter_active_tab","tweet_hashtag_position","tweet_capture_watermark_position","getLocalStorageSettings","JSON","parse","setLocalStorageSettings","stringify","getNormalizedSettings","new_settings","default_settings_key","keys","file","settings_json","syncClientSettingsToServer","default_settings_modified","getSyncableClientSettings","sync_settings_key","settings_server","settings_server_key","settings_server_value","entries","CommentUtils","color","color_table","position","size","comment_mail","commands","split","command","parsed_color","getCommentColor","parsed_position","getCommentPosition","parsed_size","getCommentSize","comment","user_id","includes","special_command_comments_pattern","mute_vulgar_comments_pattern","mute_abusive_discriminatory_prejudiced_comments_pattern","mute_consecutive_same_characters_comments_pattern","muted_comment_keyword","endsWith","RegExp","annoying_statistical_comments_pattern","Buffer","PlayerUtils","background_count","random","padStart","canPlayType","player","quality","regex","dayjs","isBetween","isSameOrAfter","isSameOrBefore","ProgramUtils","timestamp","date","toISOString","program","mark","pattern1","pattern2","pause_time_start","hour","minute","second","pause_time_end","pause_time_start_23","pause_time_end_23","progress","diff","start_time","duration","is_short","format","end_time","string","format_string_translation_map","getFormatStringTranslationTable","replaceAll","zenkaku_table","hankaku_table","merged_table","i","symbol_zenkaku_table","symbol_hankaku_table","enclosed_characters_table","staticClass","$event","model","callback","expression","_vm","password_showing","directives","rawName","_setup","_v","staticStyle","class","Version","useVersionStore","server_version_info","last_updated_at","client_version","server_version","latest_version","is_client_develop_version","is_server_develop_version","is_update_available","is_version_mismatch","fetchServerVersion","version_info","components","BottomNavigation","computed","mapStores","versionStore","Header","Navigation","is_form_dense","userStore","$router","path","_setupProxy","_m","password_validation","username_validation","$refs","validate","is_admin","overrideServerSettingsFromClient","sync_settings_dialog","preventDefault","settings_username","settings_icon","$$v","settings_password_showing","settings_password","scopedSlots","account_delete_confirm_dialog","SettingsBase","is_loading","settings_username_validation","settings_password_validation","watch","settingsStore","sync_settings_json","server_sync_settings","server_sync_settings_json","syncClientSettingsFromServer","update_type","updateUser","updateUserIcon","deleteUser","$set","resetNVRAMSettings","NVRAM_LOCAL_STORAGE_PREFIX","data_broadcasting_zip_code","data_broadcasting_zip_code_validation","data_broadcasting_prefecture","data_broadcasting_prefectures","created","zip_code_raw","atob","prefecture_raw","prefecture","charCodeAt","new_value","btoa","prefecture_number","parseInt","String","fromCharCode","region_code_number","region_code_raw","isHEVCVideoSupported","import_settings_file","QUALITY_H264","QUALITY_H265","immediate","handler","exportSettings","settings_json_blob","Blob","type","importClientSettings","go","resetClientSettings","comment_mute_settings_modal","muted_comment_keyword_match_type","prop","event","showing","Boolean","required","interval_timer_id","$emit","Niconico","authorization_url","CommentMuteSettings","hash","params","get","authorization_status","authorization_detail","onOAuthCallbackReceived","history","replaceState","popup_window","open","onMessage","closed","close","removeEventListener","addEventListener","twitter_account","loginTwitterAccountWithPasswordForm","twitter_password_auth_dialog","twitter_screen_name","twitter_password_showing","twitter_password","Twitter","twitter_password_auth_request","screen_name","captures","tweet_capture","is_twitter_password_auth_sending","twitter_form","current_twitter_account","twitter_accounts","updated_at","reset","Array","from","channels_type","channels","id","removePinnedChannel","stopPropagation","domProps","_s","IProgramDefault","channel_id","network_id","service_id","event_id","title","description","is_free","genres","video_type","video_codec","video_resolution","primary_audio_type","primary_audio_language","primary_audio_sampling_rate","secondary_audio_type","secondary_audio_language","secondary_audio_sampling_rate","IChannelDefault","transport_stream_id","remocon_id","channel_number","is_subchannel","is_radiochannel","is_watchable","is_display","viewer_count","program_present","program_following","Channels","useChannelsStore","channels_list","GR","BS","CS","CATV","SKY","STARDIGIO","is_channels_list_initial_updated","is_showing_live","channel","getChannelType","previous","current","next","current_channel_index","IProgramError","IChannelError","previous_channel_index","index","next_channel_index","channels_list_with_pinned","Map","set","delete","has","channels_list_with_pinned_for_watch","getChannel","find","getChannelByRemoconID","updateChannel","update","tab","interval_ids","residue_second","getSeconds","channelsStore","setInterval","beforeDestroy","interval_id","clearInterval","addPinnedChannel","splice","isPinnedChannel","controlDisplayTimer","modifiers","backgroundImage","is_panel_display","is_remocon_display","shortcut_key_modal","shortcut_key_column_name","shortcut_key_column","shortcut_keys","_l","key_name","shortcut","getProgramTime","getProgramProgress","is_comment_list_dropdown_display","fn","active","time","isTouchDevice","initialize_failed_message","is_manual_scroll","LiveCommentManager","watch_session","comment_session","vpos_base_timestamp","keep_seat_interval_id","abort_controller","AbortController","on_initial_comments_received","on_comment_received","watch_session_result","initWatchSession","initCommentSession","is_disconnect_message_received","watch_session_info","notice","WebSocket","audience_token","send","signal","code","reconnect","readyState","OPEN","keepIntervalSec","disconnect_reason","reason","vposBaseTime","valueOf","threadId","message_server_url","messageServer","uri","thread_id","your_post_key","yourPostKey","comment_session_info","initial_comments_buffer","initial_comments_received","ping","thread","threadkey","res_from","resultcode","chat","yourpost","parseCommentCommand","mail","isMutedComment","comment_data","no","my_post","buffered_end","video","buffered","end","comment_delay_time","currentTime","paused","danmaku","draw","sendComment","position_table","vpos","round","abort","warn","destroy","initSession","is_auto_scrolling","comment_list","comment_list_element","comment_list_dropdown_top","comment_list_dropdown_comment","live_comment_manager","visibilitychange_listener","resize_observer","mounted","$el","querySelector","is_user_scrolling","onmousedown","x","clientX","getBoundingClientRect","left","clientWidth","onmouseup","on_user_scrolling","is_dragging","ontouchstart","ontouchend","ontouchmove","onwheel","onscroll","scrollTop","offsetHeight","scrollHeight","disconnect","showCommentListDropdown","comment_list_wrapper_rect","comment_list_wrapper","comment_list_dropdown_height","comment_button_rect","currentTarget","top","hideCommentListDropdown","filter","addMutedKeywords","addMutedNiconicoUserIds","addMutedNiconicoUserIDs","smooth","scrollTo","behavior","initReserveObserver","resize_observer_element","on_resize","comment_area_element","video_element_width","video_element_height","clientHeight","letter_box_height","threshold","comment_area_vertical_margin","comment_area_width","comment_area_height","gcd","y","gcd_result","comment_area_height_aspect","transition","setProperty","removeProperty","ResizeObserver","observe","comment_list_buffer","max_comment_count","initial_comments","scrollCommentList","visibilityState","max","comment_list_and_buffer_length","niconico_user_premium","decorateProgramInfo","genre","genre_index","major","middle","getChannelForceType","detail_text","detail_heading","URLtoLink","zoom_capture_modal","capture","clickCapture","target","tweet_hashtag","is_tweet_hashtag_form_focused","updateTweetLetterCount","tweet_text","is_tweet_text_form_focused","is_logged_in_twitter","tweet_letter_count","editing","hashtag","updateSelectedTwitterAccount","draggable","is_virtual_keyboard_display","selected_twitter_account","is_twitter_account_list_display","map","is_hashtag_list_display","zoom_capture","captures_element","tweet_captures","is_tweet_sending","some","twitter_account_index","formatHashtag","image_url","deep","pasteClipboardData","clipboardData","clipboard_item","getAsFile","addCaptureList","clickHashtagListButton","clickHashtag","clickAccountButton","fullscreenElement","exitFullscreen","selected","shift","focused","$nextTick","image_bitmap","createImageBitmap","canvas","OffscreenCanvas","context","getContext","alpha","desynchronized","willReadFrequently","drawImage","font","fillStyle","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textAlign","textBaseline","fillText","convertToBlob","reject","toBlob","getChannelHashtag","channel_name","from_hashtag_list","tweet_hashtag_array","trim","channel_hashtag","join","new_tweet_captures","drawProgramTitleOnCapture","then","blur","Captures","web_font_noto_sans_base64","web_font_open_sans_base64","CaptureManager","player_container","container","captured_callback","insertAdjacentHTML","comment_capture_button","capture_button","web_font_noto_sans_url","web_font_open_sans_url","base64_font_prefix","web_font_noto_sans","web_font_open_sans","with_comments","total_time","channels_store","videoWidth","videoHeight","addHighlight","filename_base","filename_caption","aribb24_caption","plugins","aribb24Caption","aribb24_superimpose","aribb24Superimpose","caption_canvas","getRawCanvas","superimpose_canvas","is_caption_showing","isShowing","isPresent","is_superimpose_showing","caption_text","getTextContent","exif_options","is_caption_composited","is_comment_composited","export_and_save","exportToBlob","setEXIFDataToCapture","capture_normal","capture_caption","promises","canvas_context","comments_image","createCommentsImage","drawComments","filename_real","all","bitmap_canvas","transferFromImageBitmap","removeHighlight","copyBlobToClipboard","convertBlobToPng","add","remove","comments_html","xmlns","svg","createElementNS","setAttribute","foreignObject","appendChild","body","createTextNode","temp","innerHTML","childNodes","image","Image","serialized_svg","XMLSerializer","serializeToString","src","encodeURIComponent","onload","onerror","decode","outerHTML","querySelectorAll","commentsHTMLtoSVGImage","offsetWidth","draw_scale_ratio","draw_height","HTMLCanvasElement","captured_playback_position","json","captured_at","datetime","exif","piexif","TagValues","ImageIFD","XResolution","YResolution","ResolutionUnit","YCbCrPositioning","DateTime","Software","XPComment","ExifIFD","ExifVersion","ComponentsConfiguration","FlashpixVersion","ColorSpace","DateTimeOriginal","DateTimeDigitized","exif_string","dump","blob_string","reader","FileReader","readAsBinaryString","blob_string_new","insert","buffer","Uint8Array","worker","Worker","LivePSIArchivedDataDecoderWorker","Comlink","LiveDataBroadcastingManager","container_element","remocon_button_event_abort_controller","_LiveDataBroadcastingManager_bml_browser","bml_browser_width","bml_browser_height","is_bml_browser_using_numeric_key","is_bml_browser_destroying","is_video_element_moved_to_bml_browser","live_psi_archived_data_decoder","media_element","videoWrapAspect","remocon_element","remocon_data_broadcasting_element","is_data_broadcasting_enabled","initRemoconButtons","videoWrap","insertAdjacentElement","toggleRemoconButtonsEnabled","toggleRemoconButtonsLoading","this_","__classPrivateFieldSet","BMLBrowser","mediaElement","containerElement","storagePrefix","nvramPrefix","broadcasterDatabasePrefix","videoPlaneModeEnabled","fonts","roundGothic","round_gothic","squareGothic","square_gothic","indicator","setUrl","loading","setNetworkingGetStatus","connecting","setNetworkingPostStatus","setReceivingStatus","receiving","setEventName","greg","getReg","Greg","sessionStorage","_","setReg","epg","tune","init","values","router","ip","getConnectionType","isIPConnected","showErrorMessage","__classPrivateFieldGet","resolution","calculateBMLBrowserScaleFactor","moveVideoElementToBMLBrowser","moveVideoElementToDPlayer","usedKeyList","entry","contentRect","api_quality","extractAPIQualityFromDPlayer","api_url","run","is_bml_available","bxmlInfo","eventId","eventName","formatString","startTimeUnixMillis","convertTimestampToISO8601","durationSeconds","emitMessage","buttons","button","arib_key_code","dataset","aribKeyCode","remoconId","processKeyDown","AribKeyCode","processKeyUp","switch_channel_type","switch_channel","enabled","container_width","container_height","scale_factor_width","scale_factor_height","scale_factor","min","magnification","getVideoElement","firstElementChild","HTMLParagraphElement","child","children","display","visibility","HTMLVideoElement","transform","transformOrigin","insertBefore","nextElementSibling","source","PLAYBACK_BUFFER_SEC_LOW_LATENCY","PLAYBACK_BUFFER_SEC","Channel","Comment","Program","Remocon","background_url","is_video_buffering","is_background_display","is_control_display","is_fullscreen","is_ime_composing","is_comment_send_just_did","control_interval_id","is_zapping","is_zapping_continuously","player_can_be_destroyed","is_mpegts_supported","mpegts","is_offline","romsounds_context","romsounds_buffers","eventsource","fullscreen_handler","capture_manager","data_broadcasting_manager","shortcut_key_handler","shortcut_key_pressed_at","shortcut_key_list","left_column","icon_height","shortcuts","right_column","unshift","$route","virtualKeyboard","overlaysContent","ongeometrychange","boundingRect","AudioContext","audio_data","decodeAudioData","beforeRouteUpdate","to","destroy_promise","new_channel","old_channel","twitter_component","old_channel_hashtag","generatePlayerBackgroundURL","initPlayer","initEventHandler","initCaptureManager","initShortcutKeyHandler","audioItem","liveLLHLSForKonomiTV","audioValue","textContent","tran","switchPrimaryAudio","artwork","sizes","mediaSession","metadata","MediaMetadata","artist","setPositionState","playbackRate","setActionHandler","play","pause","is_player_event","is_touch_device","clearTimeout","controller","hide","setting","isShow","playback_buffer_sec","DPlayer","lang","live","liveSyncMinBufferSize","loop","airplay","autoplay","hotkey","screenshot","crossOrigin","volume","defaultQuality","qualities","hevc_prefix","speedRate","fontSize","closeCommentFormAfterSend","apiBackend","read","pluginOptions","enableWorker","enableMSEWorker","MediaSource","canConstructInDedicatedWorker","enableStashBuffer","liveSync","liveSyncMaxLatency","liveSyncTargetLatency","liveSyncPlaybackRate","aribb24","disableSuperimposeRenderer","normalFont","forceStrokeColor","forceBackgroundColor","opacity","drcsReplacement","enableRawCanvas","useStroke","usePUA","PRACallback","resume","buffer_source_node","createBufferSource","gain_node","createGain","connect","destination","gain","start","subtitle","setAutoHide","commentInput","settingOriginPanel","fullscreen_container","fullScreen","isFullScreen","onfullscreenchange","webkitFullscreenElement","cancel","requestFullscreen","webkitRequestFullscreen","orientation","lock","webkitExitFullscreen","unlock","on_play_or_pause","sync","error_type","reload","force_play","pause_icon","playButton","mobilePlayButton","recover","on_canplay","oncanplay","oncanplaythrough","get_playback_buffer_sec","current_playback_buffer_sec","current_volume","eventsource_url","EventSource","event_raw","client_count","load","pictureInPictureElement","exitPictureInPicture","requestPictureInPicture","switchVideo","clear","tweet_form_element","tag","tagName","editable","getAttribute","is_repeat","repeat","focus","scrollLeft","ctrlKey","metaKey","shiftKey","altKey","switch_remocon_id","focused_capture_index","focused_capture","focused_capture_element","parentElement","scrollIntoView","block","inline","toggle","pictureInPictureEnabled","pipButton","showDanmaku","showDanmakuToggle","checked","captureAndSave","is_destroy_player","VueRouter","mode","routes","redirect","TVHome","TVWatch","SettingsIndex","SettingsGeneral","SettingsCaption","SettingsDataBroadcasting","SettingsCapture","SettingsAccount","SettingsJikkyo","SettingsTwitter","SettingsServer","Login","Register","NotFound","scrollBehavior","savedPosition","ready","registered","cached","updatefound","updated","registration","waiting","postMessage","offline","SeamlessScrollPolyfill","PiniaVuePlugin","pinia","createPinia","VueVirtualScroller","VuetifyMessageSnackbar","bottom","elevation","autoRemove","closeButtonContent","vuetifyInstance","vuetify","trigger","VTooltip","Icon","App","$mount","is_uploading_settings","$subscribe","detached","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","m","deferred","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","r","n","getter","__esModule","d","definition","o","defineProperty","enumerable","u","chunkId","g","globalThis","Function","obj","hasOwnProperty","Symbol","toStringTag","nmd","paths","p","baseURI","self","installedChunks","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/client/dist/assets/js/app.ed6e0fd9.js.map b/client/dist/assets/js/app.ed6e0fd9.js.map deleted file mode 100644 index 8325ffa4..00000000 --- a/client/dist/assets/js/app.ed6e0fd9.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assets/js/app.ed6e0fd9.js","mappings":"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","sources":["webpack://KonomiTV/./src/App.vue","webpack://KonomiTV/./src/App.vue?74c6","webpack://KonomiTV/./src/components/Vuetify/VTabItem.ts","webpack://KonomiTV/./src/components/Vuetify/VTabsBar.ts","webpack://KonomiTV/./src/components/Vuetify/VTabs.ts","webpack://KonomiTV/./src/components/Vuetify/VTabsItems.ts","webpack://KonomiTV/./src/plugins/vuetify.ts","webpack://KonomiTV/./src/utils/Utils.ts","webpack://KonomiTV/./src/utils/ChannelUtils.ts","webpack://KonomiTV/./src/message.ts","webpack://KonomiTV/./src/plugins/axios.ts","webpack://KonomiTV/./src/services/Users.ts","webpack://KonomiTV/./src/store/UserStore.ts","webpack://KonomiTV/./src/services/APIClient.ts","webpack://KonomiTV/./src/services/Settings.ts","webpack://KonomiTV/./src/store/SettingsStore.ts","webpack://KonomiTV/./src/utils/CommentUtils.ts","webpack://KonomiTV/./src/utils/PlayerUtils.ts","webpack://KonomiTV/./src/utils/ProgramUtils.ts","webpack://KonomiTV/./src/utils/index.ts","webpack://KonomiTV/./src/views/Login.vue","webpack://KonomiTV/./src/components/Header.vue","webpack://KonomiTV/./src/components/Header.vue?5d06","webpack://KonomiTV/./src/components/Navigation.vue","webpack://KonomiTV/./src/components/BottomNavigation.vue","webpack://KonomiTV/./src/components/BottomNavigation.vue?ff7d","webpack://KonomiTV/./src/services/Version.ts","webpack://KonomiTV/./src/store/VersionStore.ts","webpack://KonomiTV/./src/components/Navigation.vue?e993","webpack://KonomiTV/./src/components/Navigation.vue?c328","webpack://KonomiTV/./src/components/Navigation.vue?bd43","webpack://KonomiTV/./src/views/Login.vue?21ac","webpack://KonomiTV/./src/views/Login.vue?ce3e","webpack://KonomiTV/./src/views/Login.vue?f5d0","webpack://KonomiTV/./src/views/NotFound.vue","webpack://KonomiTV/./src/views/NotFound.vue?5999","webpack://KonomiTV/./src/views/NotFound.vue?4637","webpack://KonomiTV/./src/views/NotFound.vue?dbe0","webpack://KonomiTV/./src/views/Register.vue","webpack://KonomiTV/./src/views/Register.vue?4c26","webpack://KonomiTV/./src/views/Register.vue?e763","webpack://KonomiTV/./src/views/Register.vue?709e","webpack://KonomiTV/./src/views/Settings/Account.vue","webpack://KonomiTV/./src/views/Settings/Base.vue","webpack://KonomiTV/./src/views/Settings/Base.vue?8f0e","webpack://KonomiTV/./src/views/Settings/Base.vue?b75f","webpack://KonomiTV/./src/views/Settings/Base.vue?13e1","webpack://KonomiTV/./src/views/Settings/Account.vue?a46e","webpack://KonomiTV/./src/views/Settings/Account.vue?c440","webpack://KonomiTV/./src/views/Settings/Account.vue?d79e","webpack://KonomiTV/./src/views/Settings/Caption.vue","webpack://KonomiTV/./src/views/Settings/Caption.vue?b49e","webpack://KonomiTV/./src/views/Settings/Caption.vue?c909","webpack://KonomiTV/./src/views/Settings/Caption.vue?3a40","webpack://KonomiTV/./src/views/Settings/Capture.vue","webpack://KonomiTV/./src/views/Settings/Capture.vue?91d0","webpack://KonomiTV/./src/views/Settings/Capture.vue?2770","webpack://KonomiTV/./src/views/Settings/Capture.vue?6493","webpack://KonomiTV/./src/views/Settings/DataBroadcasting.vue","webpack://KonomiTV/./src/views/Settings/DataBroadcasting.vue?d31d","webpack://KonomiTV/./src/views/Settings/DataBroadcasting.vue?e92e","webpack://KonomiTV/./src/views/Settings/DataBroadcasting.vue?a0d2","webpack://KonomiTV/./src/views/Settings/General.vue","webpack://KonomiTV/./src/views/Settings/General.vue?5f9b","webpack://KonomiTV/./src/views/Settings/General.vue?6383","webpack://KonomiTV/./src/views/Settings/General.vue?1430","webpack://KonomiTV/./src/views/Settings/Index.vue","webpack://KonomiTV/./src/views/Settings/Index.vue?6033","webpack://KonomiTV/./src/views/Settings/Index.vue?c35a","webpack://KonomiTV/./src/views/Settings/Index.vue?ea37","webpack://KonomiTV/./src/views/Settings/Jikkyo.vue","webpack://KonomiTV/./src/components/Settings/CommentMuteSettings.vue","webpack://KonomiTV/./src/components/Settings/CommentMuteSettings.vue?c072","webpack://KonomiTV/./src/components/Settings/CommentMuteSettings.vue?2b63","webpack://KonomiTV/./src/components/Settings/CommentMuteSettings.vue?5678","webpack://KonomiTV/./src/services/Niconico.ts","webpack://KonomiTV/./src/views/Settings/Jikkyo.vue?43de","webpack://KonomiTV/./src/views/Settings/Jikkyo.vue?dae2","webpack://KonomiTV/./src/views/Settings/Jikkyo.vue?e1ab","webpack://KonomiTV/./src/views/Settings/Server.vue","webpack://KonomiTV/./src/views/Settings/Server.vue?51f8","webpack://KonomiTV/./src/views/Settings/Server.vue?617c","webpack://KonomiTV/./src/views/Settings/Server.vue?c8b5","webpack://KonomiTV/./src/views/Settings/Twitter.vue","webpack://KonomiTV/./src/services/Twitter.ts","webpack://KonomiTV/./src/views/Settings/Twitter.vue?a501","webpack://KonomiTV/./src/views/Settings/Twitter.vue?c5a2","webpack://KonomiTV/./src/views/Settings/Twitter.vue?8f70","webpack://KonomiTV/./src/views/TV/Home.vue","webpack://KonomiTV/./src/services/Programs.ts","webpack://KonomiTV/./src/services/Channels.ts","webpack://KonomiTV/./src/store/ChannelsStore.ts","webpack://KonomiTV/./src/views/TV/Home.vue?bdd6","webpack://KonomiTV/./src/views/TV/Home.vue?8980","webpack://KonomiTV/./src/views/TV/Home.vue?6763","webpack://KonomiTV/./src/views/TV/Watch.vue","webpack://KonomiTV/./src/components/Panel/Channel.vue","webpack://KonomiTV/./src/components/Panel/Channel.vue?0e9d","webpack://KonomiTV/./src/components/Panel/Channel.vue?34fb","webpack://KonomiTV/./src/components/Panel/Channel.vue?d5d3","webpack://KonomiTV/./src/components/Panel/Comment.vue","webpack://KonomiTV/./src/services/player/managers/LiveCommentManager.ts","webpack://KonomiTV/./src/components/Panel/Comment.vue?94d2","webpack://KonomiTV/./src/components/Panel/Comment.vue?31bb","webpack://KonomiTV/./src/components/Panel/Comment.vue?ffda","webpack://KonomiTV/./src/components/Panel/Program.vue","webpack://KonomiTV/./src/components/Panel/Program.vue?d838","webpack://KonomiTV/./src/components/Panel/Program.vue?f967","webpack://KonomiTV/./src/components/Panel/Program.vue?393d","webpack://KonomiTV/./src/components/Panel/Remocon.vue","webpack://KonomiTV/./src/components/Panel/Remocon.vue?08a4","webpack://KonomiTV/./src/components/Panel/Remocon.vue?6b7e","webpack://KonomiTV/./src/components/Panel/Remocon.vue?b5eb","webpack://KonomiTV/./src/components/Panel/Twitter.vue","webpack://KonomiTV/./src/components/Panel/Twitter.vue?d4d0","webpack://KonomiTV/./src/components/Panel/Twitter.vue?710e","webpack://KonomiTV/./src/components/Panel/Twitter.vue?82e1","webpack://KonomiTV/./src/services/Captures.ts","webpack://KonomiTV/./src/services/player/managers/CaptureManager.ts","webpack://KonomiTV/./src/services/player/managers/LiveDataBroadcastingManager.ts","webpack://KonomiTV/./src/views/TV/Watch.vue?a1ad","webpack://KonomiTV/./src/views/TV/Watch.vue?78bf","webpack://KonomiTV/./src/views/TV/Watch.vue?f307","webpack://KonomiTV/./src/router/index.ts","webpack://KonomiTV/./src/service-worker.ts","webpack://KonomiTV/./src/main.ts","webpack://KonomiTV/webpack/bootstrap","webpack://KonomiTV/webpack/runtime/chunk loaded","webpack://KonomiTV/webpack/runtime/compat get default export","webpack://KonomiTV/webpack/runtime/define property getters","webpack://KonomiTV/webpack/runtime/get javascript chunk filename","webpack://KonomiTV/webpack/runtime/global","webpack://KonomiTV/webpack/runtime/hasOwnProperty shorthand","webpack://KonomiTV/webpack/runtime/make namespace object","webpack://KonomiTV/webpack/runtime/node module decorator","webpack://KonomiTV/webpack/runtime/publicPath","webpack://KonomiTV/webpack/runtime/jsonp chunk loading","webpack://KonomiTV/webpack/startup"],"sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-app',{attrs:{\"id\":\"app\"}},[_c('transition',[_c('router-view')],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=ff01ecb2&\"\nvar script = {}\nimport style0 from \"./App.vue?vue&type=style&index=0&id=ff01ecb2&prod&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\nimport { VueConstructor, VNode } from 'vue';\nimport VTabItem from 'vuetify/lib/components/VTabs/VTabItem';\n\n// VTabItem は VWindowItem を extend() して実装されている\nexport default (VTabItem as VueConstructor).extend({\n render (h): VNode {\n return h('transition', {\n props: {\n name: (this as any).computedTransition,\n },\n on: {\n // Handlers for enter windows.\n beforeEnter: (this as any).onBeforeTransition,\n afterEnter: (this as any).onAfterTransition,\n enterCancelled: (this as any).onTransitionCancelled,\n\n // Handlers for leave windows.\n beforeLeave: (this as any).onBeforeTransition,\n afterLeave: (this as any).onAfterTransition,\n leaveCancelled: (this as any).onTransitionCancelled,\n\n // Enter handler for height transition.\n enter: (this as any).onEnter,\n }\n // this.showLazyContent() を通さずに常にレンダリングされるようにする\n // 本来は実際に表示されている時だけレンダリングし、負荷を減らすための処理\n // ただチャンネルリストのレンダリングは重いので、最初からレンダリングされていた方がタブの初回切り替えが早くなる\n }, [(this as any).genWindowItem()]);\n }\n});\n","\nimport { VueConstructor } from 'vue';\nimport { GroupableInstance } from 'vuetify/lib/components/VItemGroup/VItemGroup';\nimport VTabsBar from 'vuetify/lib/components/VTabs/VTabsBar';\n\n// VTabsBar は VItemGroup を extend() して実装されている\nexport default (VTabsBar as VueConstructor).extend({\n data() {\n return {\n // 一応型定義をしておく\n items: [] as GroupableInstance[],\n };\n },\n methods: {\n\n // タブのデータ配列の先頭に新しい要素が追加されるとそのタブのアニメーションの向きが逆になるバグがあるので、VItemGroup 側の挙動をオーバーライドする\n // DOM 上も VNode 上も正しい順序で並んでいるが、this.items に関しては追加された順になっていてしまっていて齟齬が発生するのが原因\n // ref: https://github.com/vuetifyjs/vuetify/issues/13862\n register(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 要素を items に追加\n this.items.push(item);\n\n // this.$slots.default に VNode が、items には単に VueComponent が入っているので、事前に VNode の順番に合わせて並べ替える\n // こうすることで、追加された順ではなく元のデータ配列通りの順番になる\n this.items.sort((a, b) => {\n\n // VueComponent の key が一致する this.$slots.default 内の VNode を探す\n const index_a = this.$slots.default!.findIndex((element) => {\n return a.$vnode.key === element.key;\n });\n const index_b = this.$slots.default!.findIndex((element) => {\n return b.$vnode.key === element.key;\n });\n\n // index 順で並び替え\n return index_a - index_b;\n });\n\n item.$on('change', () => (this as any).onClick(item));\n if ((this as any).mandatory && !(this as any).selectedValues.length) {\n (this as any).updateMandatory();\n }\n\n // 追加された要素のソート後のインデックスを取得して更新する\n (this as any).updateItem(item, this.items.indexOf(item));\n\n // ソート後の現在アクティブなタブのインデックスを取得し直し、設定する\n // 配列の末尾以外に追加された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n },\n\n unregister(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 継承元の unregister() の処理を呼び出す(いわゆる super() )\n // ref: https://github.com/vuejs/vue/issues/2977\n (this.constructor as any).super.options.methods.unregister.call(this, item);\n\n // 配列の末尾以外から削除された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n }\n }\n});\n","\nimport { VueConstructor, VNode } from 'vue';\nimport VTabs from 'vuetify/lib/components/VTabs/VTabs';\nimport { convertToUnit } from 'vuetify/lib/util/helpers';\n\nimport VTabsBar from '@/components/Vuetify/VTabsBar';\n\nexport default (VTabs as VueConstructor).extend({\n methods: {\n\n // VTabsBar は VTabs から暗黙的に生成されるコンポーネントのため、直接上書きすることができない\n // そこで VTabs 自体も上書きし、VTabs で $createElement() される時の VTabsBar を自前でオーバーライドしたものに差し替える\n // ビルド済みのファイルには型定義が入っていないので any を多用せざるを得ない…\n genBar(items: VNode[], slider: VNode | null) {\n const data = {\n style: {\n height: convertToUnit((this as any).height),\n },\n props: {\n activeClass: (this as any).activeClass,\n centerActive: (this as any).centerActive,\n dark: (this as any).dark,\n light: (this as any).light,\n mandatory: !(this as any).optional,\n mobileBreakpoint: (this as any).mobileBreakpoint,\n nextIcon: (this as any).nextIcon,\n prevIcon: (this as any).prevIcon,\n showArrows: (this as any).showArrows,\n value: (this as any).internalValue,\n },\n on: {\n 'call:slider': (this as any).callSlider,\n change: (val: any) => {\n (this as any).internalValue = val;\n },\n },\n ref: 'items',\n };\n\n (this as any).setTextColor((this as any).computedColor, data);\n (this as any).setBackgroundColor((this as any).backgroundColor, data);\n\n // ここでオーバーライドした VTabsBar を使うのが最重要\n // これをやるためだけにわざわざ VTabs に関してもオーバーライドする羽目になってる…\n return (this as any).$createElement(VTabsBar, data, [\n (this as any).genSlider(slider),\n items,\n ]);\n }\n }\n});\n","\nimport { VueConstructor } from 'vue';\nimport { GroupableInstance } from 'vuetify/lib/components/VItemGroup/VItemGroup';\nimport VTabsItems from 'vuetify/lib/components/VTabs/VTabsItems';\n\n// VTabsItems は VItemGroup と VWindow を extend() して実装されている\nexport default (VTabsItems as VueConstructor).extend({\n data() {\n return {\n // 一応型定義をしておく\n items: [] as GroupableInstance[],\n };\n },\n methods: {\n\n // タブのデータ配列の先頭に新しい要素が追加されるとそのタブのアニメーションの向きが逆になるバグがあるので、VItemGroup 側の挙動をオーバーライドする\n // DOM 上も VNode 上も正しい順序で並んでいるが、this.items に関しては追加された順になっていてしまっていて齟齬が発生するのが原因\n // ref: https://github.com/vuetifyjs/vuetify/issues/13862\n register(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 要素を items に追加\n this.items.push(item);\n\n // this.$slots.default に VNode が、items には単に VueComponent が入っているので、事前に VNode の順番に合わせて並べ替える\n // こうすることで、追加された順ではなく元のデータ配列通りの順番になる\n this.items.sort((a, b) => {\n\n // VueComponent の key が一致する this.$slots.default 内の VNode を探す\n const index_a = this.$slots.default!.findIndex((element) => {\n return a.$vnode.key === element.key;\n });\n const index_b = this.$slots.default!.findIndex((element) => {\n return b.$vnode.key === element.key;\n });\n\n // index 順で並び替え\n return index_a - index_b;\n });\n\n item.$on('change', () => (this as any).onClick(item));\n if ((this as any).mandatory && !(this as any).selectedValues.length) {\n (this as any).updateMandatory();\n }\n\n // 追加された要素のソート後のインデックスを取得して更新する\n (this as any).updateItem(item, this.items.indexOf(item));\n\n // ソート後の現在アクティブなタブのインデックスを取得し直し、設定する\n // 配列の末尾以外に追加された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n // 値が異なるときだけ更新する\n // こうしないと、Safari で変なアニメーションがついてしまう\n if (this.items.indexOf(activeItem) !== (this as any).internalValue) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n }\n },\n\n unregister(item: GroupableInstance) {\n\n // 現在アクティブなタブの VueComponent を取得\n const activeItem = this.items[(this as any).internalIndex];\n\n // 継承元の unregister() の処理を呼び出す(いわゆる super() )\n // ref: https://github.com/vuejs/vue/issues/2977\n (this.constructor as any).super.options.methods.unregister.call(this, item);\n\n // 配列の末尾以外から削除された場合はインデックスが1つずつずれてしまうため、インデックスを設定し直す必要がある\n if (activeItem !== undefined) {\n (this as any).updateInternalValue(this.items.indexOf(activeItem));\n }\n },\n\n // 最初のタブから最後のタブに遷移するとアニメーションの向きが逆になるバグがあるので、VWindow 側の挙動をオーバーライドする\n // 本来は VCarousel 用の動作だが、VTabsItems も VWindow を継承しているので、それが適用されてしまっているらしい\n // ref: https://github.com/yuwu9145/vuetify/blob/master/packages/vuetify/src/components/VWindow/VWindow.ts#L239-L252\n updateReverse(val: number, oldVal: number) {\n\n const itemsLength = this.items.length;\n const lastIndex = itemsLength - 1;\n\n if (itemsLength <= 2) return val < oldVal;\n\n // continuous が false の時、常に val < oldVal の結果を返す\n if (!(this as any).continuous) return val < oldVal;\n\n if (val === lastIndex && oldVal === 0) {\n return true;\n } else if (val === 0 && oldVal === lastIndex) {\n return false;\n } else {\n return val < oldVal;\n }\n }\n }\n});\n","\nimport Vue from 'vue';\nimport { VSnackbar, VBtn, VIcon } from 'vuetify/lib';\nimport Vuetify from 'vuetify/lib/framework';\n\n\nVue.use(Vuetify);\n\n// vuetify-message-snackbar を使うのに必要\nVue.component('v-snackbar', VSnackbar);\nVue.component('v-btn', VBtn);\nVue.component('v-icon', VIcon);\n\nexport default new Vuetify({\n theme: {\n dark: true,\n themes: {\n dark: {\n primary: '#E64F97',\n secondary: '#E33157',\n twitter: {\n base: '#4F82E6',\n lighten1: '#799FEC',\n lighten2: '#41A5F1',\n },\n gray: '#66514C',\n black: '#110A09',\n background: {\n base: '#1E1310',\n lighten1: '#2F221F',\n lighten2: '#433532',\n lighten3: '#4c3c38',\n },\n text: {\n base: '#FFEAEA',\n darken1: '#D9C7C7',\n darken2: '#8E7F7E',\n darken3: '#786968',\n }\n }\n },\n options: {\n customProperties: true,\n },\n },\n});\n","\n/**\n * 共通ユーティリティ\n */\nexport default class Utils {\n\n // バージョン情報\n // ビルド時の環境変数 (vue.config.js に記載) から取得\n public static readonly version: string = process.env.VUE_APP_VERSION as string;\n\n // バックエンドの API のベース URL\n public static readonly api_base_url = (() => {\n if (process.env.NODE_ENV === 'development') {\n // デバッグ時はポートを 7000 に強制する\n return `${window.location.protocol}//${window.location.hostname}:7000/api`;\n } else {\n // ビルド後は同じポートを使う\n return `${window.location.protocol}//${window.location.host}/api`;\n }\n })();\n\n\n /**\n * アクセストークンを LocalStorage から取得する\n * @returns JWT アクセストークン(ログインしていない場合は null が返る)\n */\n public static getAccessToken(): string | null {\n\n // LocalStorage の取得結果をそのまま返す\n // LocalStorage.getItem() はキーが存在しなければ(=ログインしていなければ)null を返す\n return localStorage.getItem('KonomiTV-AccessToken');\n }\n\n\n /**\n * アクセストークンを LocalStorage に保存する\n * @param access_token 発行された JWT アクセストークン\n */\n public static saveAccessToken(access_token: string): void {\n\n // そのまま LocalStorage に保存\n localStorage.setItem('KonomiTV-AccessToken', access_token);\n }\n\n\n /**\n * アクセストークンを LocalStorage から削除する\n * アクセストークンを削除することで、ログアウト相当になる\n */\n public static deleteAccessToken(): void {\n\n // LocalStorage に KonomiTV-AccessToken キーが存在しない\n if (localStorage.getItem('KonomiTV-AccessToken') === null) return;\n\n // KonomiTV-AccessToken キーを削除\n localStorage.removeItem('KonomiTV-AccessToken');\n }\n\n\n /**\n * ブラウザが実行されている OS に応じて、\"Alt\" または \"Option\" を返す\n * キーボードショートカットのコンビネーションキーの説明を OS によって分けるために使う\n * @returns ブラウザが実行されている OS が Mac なら Option を、それ以外なら Alt を返す\n */\n public static AltOrOption(): 'Alt' | 'Option' {\n // iPhone・iPad で純正キーボードを接続した場合も一応想定して、iPhone・iPad も含める(動くかは未検証)\n return /iPhone|iPad|Macintosh/i.test(navigator.userAgent) ? 'Option' : 'Alt';\n }\n\n\n /**\n * ブラウザが実行されている OS に応じて、\"Ctrl\" または \"Cmd\" を返す\n * キーボードショートカットのコンビネーションキーの説明を OS によって分けるために使う\n * @returns ブラウザが実行されている OS が Mac なら Cmd を、それ以外なら Ctrl を返す\n */\n public static CtrlOrCmd(): 'Ctrl' | 'Cmd' {\n // iPhone・iPad で純正キーボードを接続した場合も一応想定して、iPhone・iPad も含める(動くかは未検証)\n return /iPhone|iPad|Macintosh/i.test(navigator.userAgent) ? 'Cmd' : 'Ctrl';\n }\n\n\n /**\n * Blob に格納されているデータをブラウザにダウンロードさせる\n * @param blob Blob オブジェクト\n * @param filename 保存するファイル名\n */\n public static downloadBlobData(blob: Blob, filename: string): void {\n\n // Blob URL を発行\n const blob_url = URL.createObjectURL(blob);\n\n // 画像をダウンロード\n const link = document.createElement('a');\n link.download = filename;\n link.href = blob_url;\n link.click();\n\n // Blob URL を破棄\n URL.revokeObjectURL(blob_url);\n }\n\n\n /**\n * innerHTML しても問題ないように HTML の特殊文字をエスケープする\n * PHP の htmlspecialchars() と似たようなもの\n * @param content HTML エスケープされてないテキスト\n * @returns HTML エスケープされたテキスト\n */\n public static escapeHTML(content: string): string {\n\n // HTML エスケープが必要な文字\n // ref: https://www.php.net/manual/ja/function.htmlspecialchars.php\n const html_escape_table = {\n '&': '&',\n '\"': '"',\n '\\'': ''',\n '<': '<',\n '>': '>',\n };\n\n // ref: https://qiita.com/noriaki/items/4bfef8d7cf85dc1035b3\n return content.replace(/[&\"'<>]/g, (match) => {\n return html_escape_table[match];\n });\n }\n\n\n /**\n * OAuth 連携時のポップアップを画面中央に表示するための windowFeatures 文字列を取得する\n * ref: https://qiita.com/catatsuy/items/babce8726ea78f5d25b1\n * @returns window.open() で使う windowFeatures 文字列\n */\n public static getWindowFeatures(): string {\n\n // ポップアップウインドウのサイズ\n const popupSizeWidth = 650;\n const popupSizeHeight = window.screen.height >= 800 ? 800 : window.screen.height - 100;\n\n // ポップアップウインドウの位置\n const posTop = (window.screen.height - popupSizeHeight) / 2;\n const posLeft = (window.screen.width - popupSizeWidth) / 2;\n\n return `toolbar=0,status=0,top=${posTop},left=${posLeft},width=${popupSizeWidth},height=${popupSizeHeight},modal=yes,alwaysRaised=yes`;\n }\n\n\n /**\n * 現在フォーカスを持っている要素に指定された CSS クラスが付与されているか\n * @param class_name 存在を確認する CSS クラス名\n * @returns document.activeElement が class_name で指定したクラスを持っているかどうか\n */\n public static hasActiveElementClass(class_name: string): boolean {\n if (document.activeElement === null) return false;\n return document.activeElement.classList.contains(class_name);\n }\n\n\n /**\n * ブラウザが Firefox かどうか\n * @returns ブラウザが Firefox なら true を返す\n */\n public static isFirefox(): boolean {\n return /Firefox/i.test(navigator.userAgent);\n }\n\n\n /**\n * ブラウザが Safari かどうか\n * @returns ブラウザが Safari なら true を返す\n */\n public static isSafari(): boolean {\n return /Safari/i.test(navigator.userAgent) && !/Chrome/i.test(navigator.userAgent);\n }\n\n\n /**\n * モバイルデバイス(スマホ・タブレット)かどうか\n * @returns モバイルデバイス (スマホ・タブレット) なら true を返す\n */\n public static isMobileDevice(): boolean {\n // Macintosh が入っているのは、iPadOS は既定でデスクトップ表示モードが有効になっていて、UA だけでは Mac と判別できないため\n // Mac にタッチパネル付きの機種は存在しないので、'ontouchend' in document で判定できる\n return /iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\n }\n\n\n /**\n * 表示画面がスマホ横画面かどうか\n * @returns スマホ横画面なら true を返す\n */\n public static isSmartphoneHorizontal(): boolean {\n return window.matchMedia('(max-width: 1000px) and (max-height: 450px)').matches;\n }\n\n\n /**\n * 表示画面がスマホ縦画面かどうか\n * @returns スマホ縦画面なら true を返す\n */\n public static isSmartphoneVertical(): boolean {\n return window.matchMedia('(max-width: 600px) and (min-height: 450.01px)').matches;\n }\n\n\n /**\n * 表示画面がタブレット横画面かどうか\n * @returns タブレット横画面なら true を返す\n */\n public static isTabletHorizontal(): boolean {\n return window.matchMedia('(max-width: 1264px) and (max-height: 850px)').matches;\n }\n\n\n /**\n * 表示画面がタブレット縦画面かどうか\n * @returns タブレット縦画面なら true を返す\n */\n public static isTabletVertical(): boolean {\n return window.matchMedia('(max-width: 850px) and (min-height: 850.01px)').matches;\n }\n\n\n /**\n * 表示端末がタッチデバイスかどうか\n * @returns タッチデバイスなら true を返す\n */\n public static isTouchDevice(): boolean {\n return window.matchMedia('(hover: none)').matches;\n }\n\n\n /**\n * 任意の桁で切り捨てする\n * ref: https://qiita.com/nagito25/items/0293bc317067d9e6c560#comment-87f0855f388953843037\n * @param value 切り捨てする数値\n * @param base どの桁で切り捨てするか (-1 → 10の位 / 3 → 小数第3位)\n * @return 切り捨てした値\n */\n public static mathFloor(value: number, base: number = 0): number {\n return Math.floor(value * (10**base)) / (10**base);\n }\n\n\n /**\n * async/await でスリープ的なもの\n * @param seconds 待機する秒数 (ミリ秒単位ではないので注意)\n * @returns Promise を返すので、await sleep(1); のように使う\n */\n public static async sleep(seconds: number): Promise {\n return await new Promise(resolve => setTimeout(resolve, seconds * 1000));\n }\n\n\n /**\n * 現在時刻の UNIX タイムスタンプ (秒単位) を取得する (デバッグ用)\n * @returns 現在時刻の UNIX タイムスタンプ (秒単位)\n */\n public static time(): number {\n return Date.now() / 1000;\n }\n\n\n /**\n * 指定された値の型の名前を取得する\n * ref: https://qiita.com/amamamaou/items/ef0b797156b324bb4ef3\n * @returns 指定された値の型の名前\n */\n public static typeof(value: any): string {\n return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();\n }\n\n\n /**\n * 文字列中に含まれる URL をリンクの HTML に置き換える\n * @param text 置換対象の文字列\n * @returns URL をリンクに置換した文字列\n */\n public static URLtoLink(text: string): string {\n\n // HTML の特殊文字で表示がバグらないように、事前に HTML エスケープしておく\n text = Utils.escapeHTML(text);\n\n // ref: https://www.softel.co.jp/blogs/tech/archives/6099\n const pattern = /(https?:\\/\\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/ig;\n return text.replace(pattern, '$1');\n }\n}\n","\nimport { ChannelType } from '@/services/Channels';\n\n\n/**\n * チャンネル周りのユーティリティ\n */\nexport class ChannelUtils {\n\n /**\n * チャンネル ID からチャンネルタイプを取得する\n * @param display_channel_id チャンネル ID\n * @returns チャンネルタイプ\n */\n public static getChannelType(display_channel_id: string): ChannelType {\n try {\n const result = display_channel_id.match('(?[a-z]+)[0-9]+')!.groups!.channel_type.toUpperCase();\n return result as ChannelType;\n } catch (e) {\n // 何かしらエラーが発生したということはチャンネル ID が不正\n // とりあえずここではエラーにならないよう GR を返す エラー処理はその後の段階で行われる\n return 'GR';\n }\n }\n\n\n /**\n * チャンネルの実況勢いから「多」「激多」「祭」を取得する\n * ref: https://ja.wikipedia.org/wiki/%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%AE%9F%E6%B3%81\n * @param jikkyo_force チャンネルの実況勢い\n * @returns normal(普通)or many(多)or so-many(激多)or festival(祭)\n */\n public static getChannelForceType(jikkyo_force: number | null): 'normal' | 'many' | 'so-many' | 'festival' {\n\n // 実況勢いが null(=対応する実況チャンネルがない)\n if (jikkyo_force === null) return 'normal';\n\n // 実況勢いが 500 コメント以上(祭)\n if (jikkyo_force >= 500) return 'festival';\n // 実況勢いが 200 コメント以上(激多)\n if (jikkyo_force >= 200) return 'so-many';\n // 実況勢いが 100 コメント以上(多)\n if (jikkyo_force >= 100) return 'many';\n\n // それ以外\n return 'normal';\n }\n}\n","\nimport { MessageOption, MessageType } from 'vuetify-message-snackbar/src/message';\n\n\ninterface MessageReturnValue {\n close(): void;\n again(): void;\n}\n\n// Vue コンポーネント以外からも this.$message を使えるようにするための (強引な) ラッパー\nexport default {\n success(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.success(message);\n },\n info(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.info(message);\n },\n warning(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.warning(message);\n },\n error(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.error(message);\n },\n show(message: MessageType | MessageOption): MessageReturnValue {\n // @ts-ignore\n return window.KonomiTVVueInstance?.$message.show(message);\n }\n};\n","\nimport axios from 'axios';\n\nimport Utils from '@/utils';\n\n\n// Axios のインスタンスを作成\nconst axios_instance = axios.create();\n\n// HTTP リクエスト前に割り込んで行われる処理\naxios_instance.interceptors.request.use((config) => {\n\n // API のベース URL を設定 (config.baseURL が指定されていない場合のみ)\n if (config.baseURL === undefined) {\n config.baseURL = Utils.api_base_url;\n }\n\n // 外部サイトへの HTTP リクエストでは実行しない\n if (config.url?.startsWith('http') === false) {\n\n // アクセストークンが取得できたら(=ログインされていれば)\n // 取得したアクセストークンを Authorization ヘッダーに Bearer トークンとしてセット\n // これを忘れると(当然ながら)ログインしていない扱いになる\n const access_token = Utils.getAccessToken();\n if (access_token !== null) {\n config.headers['Authorization'] = `Bearer ${access_token}`;\n }\n\n // KonomiTV クライアントのバージョンを設定\n // 今のところ使わないが、将来的にクライアントとサーバーを分離することを見据えて念のため\n config.headers['X-KonomiTV-Version'] = Utils.version;\n }\n\n // タイムアウト時間を30秒に設定\n config.timeout = 30 * 1000;\n\n return config;\n});\n\nexport default axios_instance;\n","\nimport Message from '@/message';\nimport APIClient from '@/services/APIClient';\n\n\n/** ユーザーアカウントの情報を表すインターフェイス */\nexport interface IUser {\n id: number;\n name: string;\n is_admin: boolean;\n niconico_user_id: number | null;\n niconico_user_name: string | null;\n niconico_user_premium: boolean | null;\n twitter_accounts: ITwitterAccount[];\n created_at: string;\n updated_at: string;\n}\n\n/** ユーザーアカウントに紐づく Twitter アカウントの情報を表すインターフェイス */\nexport interface ITwitterAccount {\n id: number;\n name: string;\n screen_name: string;\n icon_url: string;\n is_oauth_session: boolean;\n created_at: string;\n updated_at: string;\n}\n\n/** ユーザーアカウントのアクセストークンを表すインターフェイス */\nexport interface IUserAccessToken {\n access_token: string;\n token_type: string;\n}\n\nexport interface IUserCreateRequest {\n username: string;\n password: string;\n}\nexport interface IUserUpdateRequest {\n username?: string;\n password?: string;\n}\nexport interface IUserUpdateRequestForAdmin {\n username?: string;\n password?: string;\n is_admin?: boolean;\n}\n\n\nclass Users {\n\n /**\n * ユーザーアカウントを作成する\n * @param user_create_request ユーザー名とパスワード\n * @returns 作成したユーザーアカウントの情報 or アカウント作成に失敗した場合は null\n */\n static async createUser(user_create_request: IUserCreateRequest): Promise {\n\n // API リクエストを実行\n const response = await APIClient.post('/users', user_create_request);\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Specified username is duplicated': {\n Message.error('ユーザー名が重複しています。');\n break;\n }\n case 'Specified username is not accepted due to system limitations': {\n Message.error('ユーザー名に token と me は使えません。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'アカウントを作成できませんでした。');\n break;\n }\n }\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * ユーザーアカウントのアクセストークンを発行する\n * @param username ユーザー名\n * @param password パスワード\n * @returns 発行したアクセストークン or ログインに失敗した場合は null\n */\n static async createUserAccessToken(username: string, password: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.post('/users/token', new URLSearchParams({username, password}));\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Incorrect username': {\n Message.error('ログインできませんでした。そのユーザー名のアカウントは存在しません。');\n break;\n }\n case 'Incorrect password': {\n Message.error('ログインできませんでした。パスワードを間違えていませんか?');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'ログインできませんでした。');\n break;\n }\n }\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を取得する\n * @returns ログイン中のユーザーアカウントの情報 or ログインしていない場合は null\n */\n static async fetchUser(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/users/me');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'アカウント情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントのアイコンを取得する\n * @returns ログイン中のユーザーアカウントのアイコンの Blob URL or ログインしていない場合は null\n */\n static async fetchUserIcon(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/users/me/icon', {responseType: 'blob'});\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'アイコン画像を取得できませんでした。');\n return null;\n }\n\n return URL.createObjectURL(response.data);\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を更新する\n * @param user_update_request ユーザー名 or パスワード\n */\n static async updateUser(user_update_request: IUserUpdateRequest): Promise {\n\n // API リクエストを実行\n const response = await APIClient.put('/users/me', user_update_request);\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Specified username is duplicated': {\n Message.error('ユーザー名が重複しています。');\n break;\n }\n case 'Specified username is not accepted due to system limitations': {\n Message.error('ユーザー名に token と me は使えません。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'アカウント情報を更新できませんでした。');\n break;\n }\n }\n return;\n }\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントのアイコン画像を更新する\n * @param icon アイコンの File オブジェクト\n */\n static async updateUserIcon(icon: File): Promise {\n\n // アイコン画像の File オブジェクト (= Blob) を FormData に入れる\n // multipart/form-data で送るために必要\n // ref: https://r17n.page/2020/02/04/nodejs-axios-file-upload-api/\n const form_data = new FormData();\n form_data.append('image', icon);\n\n // API リクエストを実行\n const response = await APIClient.put('/users/me/icon', form_data, {headers: {'Content-Type': 'multipart/form-data'}});\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Please upload JPEG or PNG image': {\n Message.error('JPEG または PNG 画像をアップロードしてください。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'アイコン画像を更新できませんでした。');\n break;\n }\n }\n return;\n }\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントを削除する\n */\n static async deleteUser(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.delete('/users/me');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'アカウントを削除できませんでした。');\n return;\n }\n }\n}\n\nexport default Users;\n","\nimport { defineStore } from 'pinia';\n\nimport Message from '@/message';\nimport Users, { IUser, IUserUpdateRequest } from '@/services/Users';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\n\n\n/**\n * 現在ログイン中のユーザーアカウントの情報を共有するストア\n */\nconst useUserStore = defineStore('user', {\n state: () => ({\n\n // 現在ログイン中かどうか\n is_logged_in: false as boolean,\n\n // ログイン済みのユーザーの情報\n user: null as IUser | null,\n\n // ログイン済みのユーザーのアイコン画像の Blob URL\n user_icon_url: null as string | null,\n }),\n getters: {\n\n /**\n * ログイン済みのユーザーのニコニコアカウントのユーザーアイコンの URL (ニコニコアカウントと連携されている場合のみ)\n */\n user_niconico_icon_url(): string | null {\n if (this.user === null || this.user.niconico_user_id === null) {\n return null;\n }\n const user_id_slice = this.user.niconico_user_id.toString().slice(0, 4);\n return `https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/${user_id_slice}/${this.user.niconico_user_id}.jpg`;\n }\n },\n actions: {\n\n /**\n * アカウントを作成する\n * @param username ユーザー名\n * @param password パスワード\n * @returns アカウント作成に成功した場合は true\n */\n async register(username: string, password: string): Promise {\n\n // アカウントを作成\n const result = await Users.createUser({username, password});\n if (result === null) {\n console.log('Register failed.');\n return false; // アカウント作成失敗 (エラーハンドリングは services 層で行われる)\n }\n\n // 作成したアカウントでログイン\n await this.login(username, password, true);\n console.log('Register successful.');\n Message.success('アカウントを作成しました。');\n return true;\n },\n\n /**\n * ログイン処理を行う\n * @param username ユーザー名\n * @param password パスワード\n * @param silent ログインしたことをメッセージで通知しない場合は true\n * @returns ログインに成功した場合は true\n */\n async login(username: string, password: string, silent: boolean = false): Promise {\n\n // アクセストークンを発行\n const access_token = await Users.createUserAccessToken(username, password);\n if (access_token === null) {\n console.log('Login failed.');\n this.logout(true);\n return false; // ログイン失敗 (エラーハンドリングは services 層で行われる)\n }\n\n // 取得したアクセストークンを保存\n console.log('Login successful.');\n Utils.saveAccessToken(access_token.access_token);\n this.is_logged_in = true;\n\n // ユーザーアカウントの情報を取得\n await this.fetchUser(true);\n\n if (silent === false) {\n Message.success('ログインしました。');\n }\n\n return true;\n },\n\n /**\n * ログアウト処理を行う\n * @param silent ログアウトしたことをメッセージで通知しない場合は true\n */\n logout(silent: boolean = false): void {\n\n // 設定の同期を無効化\n const settings_store = useSettingsStore();\n settings_store.settings.sync_settings = false;\n\n // ブラウザからアクセストークンを削除\n // これをもってログアウトしたことになる(それ以降の Axios のリクエストにはアクセストークンが含まれなくなる)\n Utils.deleteAccessToken();\n\n // 未ログイン状態に設定\n this.is_logged_in = false;\n this.user = null;\n this.user_icon_url = '';\n\n if (silent === false) {\n Message.success('ログアウトしました。');\n }\n },\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を取得する\n * すでに取得済みの情報がある場合は API リクエストを行わずにそれを返す\n * @param force 強制的に API リクエストを行う場合は true\n * @returns ログイン中のユーザーアカウントの情報 or ログインしていない場合は null\n */\n async fetchUser(force: boolean = false): Promise {\n\n // LocalStorage にアクセストークンが保存されていない場合 (= 非ログイン状態) は常に null を返す\n if (Utils.getAccessToken() === null) {\n return null;\n }\n\n // すでにログイン済みのユーザーアカウントの情報がある場合はそれを返す\n // force が true の場合は無視される\n if (this.user !== null && force === false) {\n return this.user;\n }\n\n // ユーザーアカウントの情報を取得する\n const user = await Users.fetchUser();\n if (user === null) {\n // この時点で無効などの理由でアクセストークンが削除されている場合、ログアウトする\n if (Utils.getAccessToken() === null) {\n this.logout(true);\n }\n return null;\n }\n this.is_logged_in = true;\n this.user = user;\n\n // ユーザーアカウントのアイコン画像の Blob URL を取得する\n const user_icon_url = await Users.fetchUserIcon();\n if (user_icon_url === null) {\n return null;\n }\n this.user_icon_url = user_icon_url;\n\n return this.user;\n },\n\n /**\n * 現在ログイン中のユーザーアカウントの情報を更新する\n * @param user_update_request ユーザー名 or パスワード\n */\n async updateUser(user_update_request: IUserUpdateRequest): Promise {\n\n // ユーザーアカウントの情報を更新する\n await Users.updateUser(user_update_request);\n\n // ユーザーアカウントの情報を再取得する\n await this.fetchUser(true);\n\n if (user_update_request.username !== undefined) {\n Message.show('ユーザー名を更新しました。');\n } else if (user_update_request.password !== undefined) {\n Message.show('パスワードを更新しました。');\n }\n },\n\n /**\n * 現在ログイン中のユーザーアカウントのアイコン画像を更新する\n * @param icon アイコンの File オブジェクト\n */\n async updateUserIcon(icon: File): Promise {\n\n // ユーザーアカウントのアイコン画像を更新する\n await Users.updateUserIcon(icon);\n\n // ユーザーアカウントの情報を再取得する\n await this.fetchUser(true);\n\n Message.show('アイコン画像を更新しました。');\n },\n\n /**\n * 現在ログイン中のユーザーアカウントを削除する\n */\n async deleteUser(): Promise {\n\n // ユーザーアカウントを削除する\n await Users.deleteUser();\n\n // ログアウトする\n this.logout(true);\n\n Message.show('アカウントを削除しました。');\n }\n }\n});\n\nexport default useUserStore;\n","\n/**\n * services/ 以下の各クラスは、KonomiTV サーバーへの API リクエストを抽象化し、\n * API レスポンスの受け取りと、エラーが発生した際のエラーハンドリング (エラーメッセージ表示) までを責務として負う\n */\n\nimport { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport Message from '@/message';\nimport axios from '@/plugins/axios';\nimport useUserStore from '@/store/UserStore';\n\n\n/** API のエラーレスポンスを表すインターフェイス */\nexport interface IError {\n detail: string;\n}\n\n/** API リクエスト成功時のレスポンスを表すインターフェイス */\nexport type SuccessResponse = {\n status: number;\n data: T;\n error: null;\n is_success: true;\n};\n\n/** API リクエスト失敗時のレスポンスを表すインターフェイス */\nexport type ErrorResponse = {\n status: number;\n data: null;\n error: T;\n is_error: true;\n};\n\n\n/**\n * services/ 以下の各クラスから呼び出される、Axios の薄いラッパー\n * エラーハンドリングを容易にするために、レスポンスを SuccessResponse と ErrorResponse に分けて返す\n * ref: https://zenn.dev/engineer_titan/articles/291c9fccb338e2\n */\nclass APIClient {\n\n /**\n * Axios で HTTP リクエストを送信し、レスポンスを受け取る\n * @param request AxiosRequestConfig\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async request(request: AxiosRequestConfig): Promise | ErrorResponse> {\n\n // Axios で HTTP リクエストを送信し、レスポンスを受け取る\n const result: AxiosResponse | AxiosError = await axios.request(request).catch((error: AxiosError) => error);\n\n // エラーが発生した場合は ErrorResponse を返す\n if (result instanceof AxiosError) {\n console.error(result);\n\n // エラーレスポンスがあれば、エラー内容を取得して返す\n if (result.response) {\n return {\n status: result.response.status,\n data: null,\n error: new Error(result.response.data.detail),\n is_error: true,\n };\n\n // エラーレスポンスがない場合は、AxiosError をそのまま返す\n } else {\n return {\n status: NaN,\n data: null,\n error: result,\n is_error: true,\n };\n }\n\n // 正常にレスポンスが返ってきた場合は SuccessResponse を返す\n } else {\n return {\n status: result.status,\n data: result.data,\n error: null,\n is_success: true,\n };\n }\n }\n\n\n /**\n * GET リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async get(url: string, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'GET',\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * POST リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async post(url: string, data?: D, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'POST',\n data: data,\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * PUT リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async put(url: string, data?: D, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'PUT',\n data: data,\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * DELETE リクエストを送信する\n * @param url リクエスト先の URL\n * @returns 成功なら SuccessResponse 、失敗なら ErrorResponse を返す\n */\n static async delete(url: string, config?: AxiosRequestConfig): Promise | ErrorResponse> {\n const request: AxiosRequestConfig = {\n url: url,\n method: 'DELETE',\n ...config,\n };\n return await APIClient.request(request);\n }\n\n\n /**\n * 一般的なエラーメッセージの共通処理\n * エラーメッセージを SnackBar で表示する\n * @param response API から返されたエラーレスポンス\n * @param template エラーメッセージのテンプレート(「アカウント情報を取得できませんでした。」など)\n */\n static showGenericError(response: ErrorResponse, template: string): void {\n const user_store = useUserStore();\n switch (response.error.message) {\n case 'Not authenticated': {\n user_store.logout(true);\n Message.error(`${template}\\nログインし直してください。`);\n return;\n }\n case 'Access token data is invalid': {\n user_store.logout(true);\n Message.error(`${template}\\nログインセッションが不正です。もう一度ログインし直してください。`);\n return;\n }\n case 'Access token is invalid': {\n user_store.logout(true);\n Message.error(`${template}\\nログインセッションの有効期限が切れています。もう一度ログインし直してください。`);\n return;\n }\n case 'User associated with access token does not exist': {\n user_store.logout(true);\n Message.error(`${template}\\nログインセッションに紐づくユーザーが存在しないか、削除されています。`);\n return;\n }\n default: {\n if (response.error.message) {\n if (Number.isNaN(response.status)) {\n Message.error(`${template}(${response.error.message})`);\n } else {\n Message.error(`${template}(HTTP Error ${response.status} / ${response.error.message})`);\n }\n } else {\n Message.error(`${template}(HTTP Error ${response.status})`);\n }\n return;\n }\n }\n }\n}\n\nexport default APIClient;\n","\nimport APIClient from '@/services/APIClient';\n\n\n/**\n * サーバーに保存されるクライアント設定を表すインターフェース\n * サーバー側の app.schemas.ClientSettings と\n * client/src/store/SettingsStore.ts 内の sync_settings_keys で定義されているものと同じ\n */\nexport interface IClientSettings {\n pinned_channel_ids: string[];\n // showed_panel_last_time: 同期無効\n // selected_twitter_account_id: 同期無効\n saved_twitter_hashtags: string[];\n // tv_streaming_quality: 同期無効\n // tv_data_saver_mode: 同期無効\n // tv_low_latency_mode: 同期無効\n panel_display_state: 'RestorePreviousState' | 'AlwaysDisplay' | 'AlwaysFold';\n tv_panel_active_tab: 'Program' | 'Channel' | 'Comment' | 'Twitter';\n tv_channel_selection_requires_alt_key: boolean;\n caption_font: string;\n always_border_caption_text: boolean;\n specify_caption_opacity: boolean;\n caption_opacity: number;\n tv_show_superimpose: boolean;\n // tv_show_data_broadcasting: 同期無効\n // capture_copy_to_clipboard: 同期無効\n capture_save_mode: 'Browser' | 'UploadServer' | 'Both';\n capture_caption_mode: 'VideoOnly' | 'CompositingCaption' | 'Both';\n // sync_settings: 同期無効\n comment_speed_rate: number;\n comment_font_size: number;\n close_comment_form_after_sending: boolean;\n muted_comment_keywords: IMutedCommentKeywords[];\n muted_niconico_user_ids: string[];\n mute_vulgar_comments: boolean;\n mute_abusive_discriminatory_prejudiced_comments: boolean;\n mute_big_size_comments: boolean;\n mute_fixed_comments: boolean;\n mute_colored_comments: boolean;\n mute_consecutive_same_characters_comments: boolean;\n fold_panel_after_sending_tweet: boolean;\n reset_hashtag_when_program_switches: boolean;\n auto_add_watching_channel_hashtag: boolean;\n twitter_active_tab: 'Search' | 'Timeline' | 'Capture';\n tweet_hashtag_position: 'Prepend' | 'Append' | 'PrependWithLineBreak' | 'AppendWithLineBreak';\n tweet_capture_watermark_position: 'None' | 'TopLeft' | 'TopRight' | 'BottomLeft' | 'BottomRight';\n}\n\n/**\n * ミュート対象のコメントのキーワードのインターフェイス\n */\nexport interface IMutedCommentKeywords {\n match: 'partial' | 'forward' | 'backward' | 'exact' | 'regex';\n pattern: string;\n}\n\n\nclass Settings {\n\n /**\n * クライアント設定を取得する\n * @return クライアント設定 (取得に失敗した場合は null)\n */\n static async fetchClientSettings(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/settings/client');\n\n // エラー処理 (基本起こらないはず & 実行できなくても後続の処理に影響しないため何もしない)\n if ('is_error' in response) {\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * クライアント設定を更新する\n * @param settings クライアント設定\n */\n static async updateClientSettings(settings: IClientSettings): Promise {\n\n // API リクエストを実行\n // 正常時は 204 No Content が返るし、エラーは基本起こらないはずなので何もしない\n await APIClient.put('/settings/client', settings);\n }\n}\n\nexport default Settings;\n","\nimport { defineStore } from 'pinia';\n\nimport Settings, { IClientSettings, IMutedCommentKeywords } from '@/services/Settings';\nimport Utils from '@/utils';\n\n\n// LocalStorage に保存される KonomiTV の設定データ\ninterface ILocalClientSettings {\n pinned_channel_ids: string[];\n showed_panel_last_time: boolean;\n selected_twitter_account_id: number | null;\n saved_twitter_hashtags: string[];\n tv_streaming_quality: '1080p-60fps' | '1080p' | '810p' | '720p' | '540p' | '480p' | '360p' | '240p';\n tv_data_saver_mode: boolean;\n tv_low_latency_mode: boolean;\n panel_display_state: 'RestorePreviousState' | 'AlwaysDisplay' | 'AlwaysFold';\n tv_panel_active_tab: 'Program' | 'Channel' | 'Comment' | 'Twitter';\n tv_channel_selection_requires_alt_key: boolean;\n caption_font: string;\n always_border_caption_text: boolean;\n specify_caption_opacity: boolean;\n caption_opacity: number;\n tv_show_superimpose: boolean;\n tv_show_data_broadcasting: boolean;\n capture_copy_to_clipboard: boolean;\n capture_save_mode: 'Browser' | 'UploadServer' | 'Both';\n capture_caption_mode: 'VideoOnly' | 'CompositingCaption' | 'Both';\n sync_settings: boolean;\n comment_speed_rate: number;\n comment_font_size: number;\n close_comment_form_after_sending: boolean;\n muted_comment_keywords: IMutedCommentKeywords[];\n muted_niconico_user_ids: string[];\n mute_vulgar_comments: boolean;\n mute_abusive_discriminatory_prejudiced_comments: boolean;\n mute_big_size_comments: boolean;\n mute_fixed_comments: boolean;\n mute_colored_comments: boolean;\n mute_consecutive_same_characters_comments: boolean;\n fold_panel_after_sending_tweet: boolean;\n reset_hashtag_when_program_switches: boolean;\n auto_add_watching_channel_hashtag: boolean;\n twitter_active_tab: 'Search' | 'Timeline' | 'Capture';\n tweet_hashtag_position: 'Prepend' | 'Append' | 'PrependWithLineBreak' | 'AppendWithLineBreak';\n tweet_capture_watermark_position: 'None' | 'TopLeft' | 'TopRight' | 'BottomLeft' | 'BottomRight';\n}\n\n// 設定データのうち、同期対象の設定キー\n// サーバー側の app.schemas.ClientSettings と\n// client/src/services/Settings.ts 内の IClientSettings で定義されているものと同じ\nconst sync_settings_keys = [\n 'pinned_channel_ids',\n // showed_panel_last_time: 同期無効\n // selected_twitter_account_id: 同期無効\n 'saved_twitter_hashtags',\n // tv_streaming_quality: 同期無効\n // tv_data_saver_mode: 同期無効\n // tv_low_latency_mode: 同期無効\n 'panel_display_state',\n 'tv_panel_active_tab',\n 'tv_channel_selection_requires_alt_key',\n 'caption_font',\n 'always_border_caption_text',\n 'specify_caption_opacity',\n 'caption_opacity',\n 'tv_show_superimpose',\n // tv_show_data_broadcasting: 同期無効\n // capture_copy_to_clipboard: 同期無効\n 'capture_save_mode',\n 'capture_caption_mode',\n // sync_settings: 同期無効\n 'comment_speed_rate',\n 'comment_font_size',\n 'close_comment_form_after_sending',\n 'muted_comment_keywords',\n 'muted_niconico_user_ids',\n 'mute_vulgar_comments',\n 'mute_abusive_discriminatory_prejudiced_comments',\n 'mute_big_size_comments',\n 'mute_fixed_comments',\n 'mute_colored_comments',\n 'mute_consecutive_same_characters_comments',\n 'fold_panel_after_sending_tweet',\n 'reset_hashtag_when_program_switches',\n 'auto_add_watching_channel_hashtag',\n 'twitter_active_tab',\n 'tweet_hashtag_position',\n 'tweet_capture_watermark_position',\n];\n\n// LocalStorage に保存される KonomiTV の設定データのデフォルト値\nconst default_settings: ILocalClientSettings = {\n\n // ***** 設定画面から直接変更できない設定値 *****\n\n // ピン留めしているチャンネルの ID (ex: gr011) が入るリスト\n pinned_channel_ids: [],\n // 前回視聴画面を開いた際にパネルが表示されていたかどうか (同期無効)\n showed_panel_last_time: true,\n // 現在ツイート対象として選択されている Twitter アカウントの ID (同期無効)\n selected_twitter_account_id: null,\n // 保存している Twitter のハッシュタグが入るリスト\n saved_twitter_hashtags: [],\n\n // ***** 設定 → 全般 *****\n\n // テレビのデフォルトのストリーミング画質 (Default: 1080p) (同期無効)\n tv_streaming_quality: '1080p',\n // テレビを通信節約モードで視聴する (Default: オフ) (同期無効)\n tv_data_saver_mode: false,\n // テレビを低遅延で視聴する (Default: 低遅延で視聴する) (同期無効)\n tv_low_latency_mode: true,\n // デフォルトのパネルの表示状態 (Default: 前回の状態を復元する)\n panel_display_state: 'RestorePreviousState',\n // テレビをみるときにデフォルトで表示されるパネルのタブ (Default: 番組情報タブ)\n tv_panel_active_tab: 'Program',\n // チャンネル選局のキーボードショートカットを Alt or Option + 数字キー/テンキーに変更する (Default: オフ)\n tv_channel_selection_requires_alt_key: false,\n\n // ***** 設定 → 字幕 *****\n\n // 字幕のフォント (Default: Windows TV 丸ゴシック)\n caption_font: 'Windows TV MaruGothic',\n // 字幕の文字を常に縁取って描画する (Default: 常に縁取る)\n always_border_caption_text: true,\n // 字幕の不透明度を指定する (Default: 指定しない)\n specify_caption_opacity: false,\n // 字幕の不透明度 (Default: 50%)\n caption_opacity: 0.5,\n // テレビをみるときに文字スーパーを表示する (Default: 表示する)\n tv_show_superimpose: true,\n\n // ***** 設定 → データ放送 *****\n\n // テレビをみるときにデータ放送を表示する (Default: 表示する) (同期無効)\n tv_show_data_broadcasting: true,\n\n // ***** 設定 → キャプチャ *****\n\n // キャプチャをクリップボードにコピーする (Default: 無効) (同期無効)\n capture_copy_to_clipboard: false,\n // キャプチャの保存先 (Default: KonomiTV サーバーにアップロード)\n capture_save_mode: 'UploadServer',\n // 字幕が表示されているときのキャプチャの保存モード (Default: 映像のみのキャプチャと、字幕を合成したキャプチャを両方保存する)\n capture_caption_mode: 'Both',\n\n // ***** 設定 → アカウント *****\n\n // 設定を同期する (Default: 同期しない) (同期無効)\n sync_settings: false,\n\n // ***** 設定 → ニコニコ実況 *****\n\n // コメントの速さ (Default: 1倍)\n comment_speed_rate: 1,\n // コメントのフォントサイズ (Default: 34px)\n comment_font_size: 34,\n // コメント送信後にコメント入力フォームを閉じる (Default: オン)\n close_comment_form_after_sending: true,\n\n // ***** 設定 → ニコニコ実況 (ミュート設定) *****\n\n // ミュート済みのコメントのキーワードが入るリスト\n muted_comment_keywords: [],\n // ミュート済みのニコニコユーザー ID が入るリスト\n muted_niconico_user_ids: [],\n // 露骨な表現を含むコメントをミュートする (Default: ミュートする)\n mute_vulgar_comments: true,\n // 罵倒や誹謗中傷、差別的な表現、政治的に偏った表現を含むコメントをミュートする (Default: ミュートする)\n mute_abusive_discriminatory_prejudiced_comments: true,\n // 文字サイズが大きいコメントをミュートする (Default: ミュートする)\n mute_big_size_comments: true,\n // 映像の上下に固定表示されるコメントをミュートする (Default: ミュートしない)\n mute_fixed_comments: false,\n // 色付きのコメントをミュートする (Default: ミュートしない)\n mute_colored_comments: false,\n // 8文字以上同じ文字が連続しているコメントをミュートする (Default: ミュートしない)\n mute_consecutive_same_characters_comments: false,\n\n // ***** 設定 → Twitter *****\n\n // ツイート送信後にパネルを折りたたむ (Default: オフ)\n fold_panel_after_sending_tweet: false,\n // 番組が切り替わったときにハッシュタグフォームをリセットする (Default: オン)\n reset_hashtag_when_program_switches: true,\n // 視聴中のチャンネルに対応する局タグを自動で追加する (Default: オン)\n auto_add_watching_channel_hashtag: true,\n // デフォルトで表示される Twitter タブ内のタブ (Default: キャプチャタブ)\n twitter_active_tab: 'Capture',\n // ツイートにつけるハッシュタグの位置 (Default: ツイート本文の後に追加する)\n tweet_hashtag_position: 'Append',\n // ツイートするキャプチャに番組名の透かしを描画する (Default: 透かしを描画しない)\n tweet_capture_watermark_position: 'None',\n};\n\n/**\n * LocalStorage の KonomiTV-Settings キーから設定データを取得する\n * @returns 設定データ\n */\nexport function getLocalStorageSettings(): {[key: string]: any} {\n const settings = localStorage.getItem('KonomiTV-Settings');\n if (settings !== null) {\n return JSON.parse(settings);\n } else {\n // もし LocalStorage に KonomiTV-Settings キーがまだない場合、あらかじめデフォルトの設定値を保存しておく\n setLocalStorageSettings(default_settings);\n return default_settings;\n }\n}\n\n/**\n * LocalStorage の KonomiTV-Settings キーに設定データを保存する\n * @param settings 設定データ\n */\nexport function setLocalStorageSettings(settings: {[key: string]: any}): void {\n localStorage.setItem('KonomiTV-Settings', JSON.stringify(settings));\n}\n\n/**\n * 与えられた設定データを並び替えたり足りない設定キーを補完したり不要な設定キーを削除したりと整形して返す\n * @param settings 設定データ\n */\nfunction getNormalizedSettings(settings: {[key: string]: any}): ILocalClientSettings {\n\n // (名前が変わった、廃止されたなどの理由で) 現在の default_settings に存在しない設定キーを排除した上で並び替え\n // 並び替えられていないと設定データの比較がうまくいかない\n const new_settings: {[key: string]: any} = {};\n for (const default_settings_key of Object.keys(default_settings)) {\n if (default_settings_key in settings) {\n new_settings[default_settings_key] = settings[default_settings_key];\n } else {\n // 後のバージョンで追加されたなどの理由で現状の KonomiTV-Settings に存在しない設定キーの場合\n // その設定キーのデフォルト値を取得する\n new_settings[default_settings_key] = default_settings[default_settings_key];\n }\n }\n\n // この状態の新しい設定データを返す\n return new_settings as ILocalClientSettings;\n}\n\n/**\n * 設定データを共有するストア\n */\nconst useSettingsStore = defineStore('settings', {\n state: () => {\n\n // ref: https://www.vuemastery.com/blog/refresh-proof-your-pinia-stores/\n\n // LocalStorage から設定データを取得する\n const settings = getLocalStorageSettings();\n\n // (名前が変わった、廃止されたなどの理由で) 現在の default_settings に存在しない設定キーを排除した上で並び替え\n const new_settings = getNormalizedSettings(settings);\n\n // この状態の新しい設定データを LocalStorage に保存する\n setLocalStorageSettings(new_settings);\n\n // 設定データを Store の state のデフォルト値として返す\n return {\n settings: new_settings as ILocalClientSettings,\n };\n },\n actions: {\n\n /**\n * エクスポートした JSON ファイルから設定データをインポートする (既存の設定はすべて上書きされる)\n * @param file エクスポートした JSON ファイル\n * @returns インポートに成功したかどうか\n */\n async importClientSettings(file: File): Promise {\n\n // JSON ファイルを読み込む\n const settings_json = await file.text();\n\n // JSON ファイルをパースする\n let settings = {};\n try {\n settings = JSON.parse(settings_json);\n } catch (error) {\n return false;\n }\n\n // (名前が変わった、廃止されたなどの理由で) 現在の default_settings に存在しない設定キーを排除した上で並び替え\n const new_settings = getNormalizedSettings(settings);\n\n // この状態の新しい設定データを LocalStorage に保存し、Store の state に反映する\n // このとき、既存の設定データはすべて上書きされる\n setLocalStorageSettings(new_settings);\n this.settings = new_settings;\n\n // 設定データをサーバーに同期する\n await this.syncClientSettingsToServer();\n\n return true;\n },\n\n /**\n * 設定データを初期状態にリセットする\n */\n async resetClientSettings(): Promise {\n\n // デフォルトの設定に現在設定の同期がオンになっているかだけ反映した設定データ\n const default_settings_modified: ILocalClientSettings = {\n ...default_settings,\n sync_settings: this.settings.sync_settings,\n };\n\n // デフォルト値の設定データを LocalStorage に保存し、Store の state に反映する\n setLocalStorageSettings(default_settings_modified);\n this.settings = default_settings_modified;\n\n // 設定データをサーバーに同期する\n await this.syncClientSettingsToServer();\n },\n\n /**\n * 設定データのうち、サーバーへの同期対象の設定キーのみで構成されたオブジェクト (IClientSettings と一致する) を返す\n * @returns サーバーへの同期対象の設定キーのみで構成されたオブジェクト\n */\n getSyncableClientSettings(): IClientSettings {\n\n // 同期対象の設定キーのみで設定データをまとめ直す\n // sync_settings には同期対象外の設定は含まれない\n const sync_settings: {[key: string]: any} = {};\n for (const sync_settings_key of sync_settings_keys) {\n if (sync_settings_key in this.settings) {\n sync_settings[sync_settings_key] = this.settings[sync_settings_key];\n } else {\n // 後から追加された設定キーなどの理由で設定キーが現状の KonomiTV-Settings に存在しない場合\n // その設定キーのデフォルト値を取得する\n sync_settings[sync_settings_key] = default_settings[sync_settings_key];\n }\n }\n\n return sync_settings as IClientSettings;\n },\n\n /**\n * ログイン時かつ同期が有効な場合、サーバーに保存されている設定データをこのクライアントに同期する\n * @param force ログイン中なら同期が有効かに関わらず実行する (デフォルト: false)\n */\n async syncClientSettingsFromServer(force: boolean = false): Promise {\n\n // ログインしていない時、同期が無効なときは実行しない\n if (Utils.getAccessToken() === null || (this.settings.sync_settings === false && force === false)) {\n return;\n }\n\n // サーバーから設定データをダウンロード\n const settings_server = await Settings.fetchClientSettings();\n if (settings_server === null) {\n return; // 取得できなくても後続の処理には影響しないので、サイレントに失敗する\n }\n\n // クライアントの設定データをサーバーからの設定データで上書き\n for (const [settings_server_key, settings_server_value] of Object.entries(settings_server)) {\n this.settings[settings_server_key] = settings_server_value;\n }\n },\n\n /**\n * ログイン時かつ同期が有効な場合、このクライアントの設定をサーバーに同期する\n * @param force ログイン中なら同期が有効かに関わらず実行する (デフォルト: false)\n */\n async syncClientSettingsToServer(force: boolean = false): Promise {\n\n // ログインしていない時、同期が無効なときは実行しない\n if (Utils.getAccessToken() === null || (this.settings.sync_settings === false && force === false)) {\n return;\n }\n\n // 同期対象の設定キーのみで設定データをまとめ直す\n const sync_settings = this.getSyncableClientSettings();\n\n // サーバーに設定データをアップロード\n await Settings.updateClientSettings(sync_settings);\n }\n }\n});\n\nexport default useSettingsStore;\n","\nimport { Buffer } from 'buffer';\n\nimport useSettingsStore from '@/store/SettingsStore';\n\n\n/**\n * コメント周りのユーティリティ\n */\nexport class CommentUtils {\n\n // 「露骨な表現を含むコメントをミュートする」のフィルタ正規表現\n private static readonly mute_vulgar_comments_pattern = new RegExp(Buffer.from('XChpXCl8XChVXCl8cHJwcnzvvZDvvZLvvZDvvZJ8U0VYfFPjgIdYfFPil69YfFPil4tYfFPil49YfO+8s++8pe+8uHzvvLPjgIfvvLh877yz4pev77y4fO+8s+KXi++8uHzvvLPil4/vvLh844Ki44OA44Or44OIfOOCouODiuOCpXzjgqLjg4rjg6t844Kk44Kr6IetfOOCpOOBj3zjgYbjgpPjgZN844Km44Oz44KzfOOBhuOCk+OBoXzjgqbjg7Pjg4F844Ko44Kt44ObfOOBiOOBoeOBiOOBoXzjgYjjgaPjgaF844Ko44OD44OBfOOBiOOBo+OCjXzjgqjjg4Pjg61844GI44KNfOOCqOODrXzlt6Xlj6N844GK44GV44KP44KK44G+44KTfOOBiuOBl+OBo+OBk3zjgqrjgrfjg4PjgrN844Kq44OD44K144OzfOOBiuOBo+OBseOBhHzjgqrjg4Pjg5HjgqR844Kq44OK44OL44O8fOOBiuOBquOBu3zjgqrjg4rjg5t844GK44Gx44GEfOOCquODkeOCpHzjgYpwfOOBiu+9kHzjgqrjg5Xjg5HjgrN844Ks44Kk44K444OzfOOCreODs+OCv+ODnnzjgY/jgbHjgYJ844GP44Gx44GBfOOCr+ODquODiOODquOCuXzjgq/jg7Pjg4t844GU44GP44GU44GP44GU44GP44GU44GPfOOCs+ODs+ODieODvOODoHzjgZHjgaTjgYLjgap844Kx44OE44Ki44OKfOOCtuODvOODoeODs3zjgrfjgrN844GX44GT44GX44GTfOOCt+OCs+OCt+OCs3zjgZnjgZHjgZnjgZF844Gb44GE44GI44GNfOOBm+OBhOOCinzjgZvjg7zjgop844GZ44GF44GF44GF44GF44GFfOOBmeOBhuOBhuOBhuOBhuOBhnzjgrvjgq/jg63jgrl844K744OD44Kv44K5fOOCu+ODleODrHzjgaHjgaPjgbHjgYR844Gh44Gj44OR44KkfOODgeODg+ODkeOCpHzjgaHjgpPjgZN844Gh44CH44GTfOOBoeKXr+OBk3zjgaHil4vjgZN844Gh4peP44GTfOODgeODs+OCs3zjg4HjgIfjgrN844OB4pev44KzfOODgeKXi+OCs3zjg4Hil4/jgrN844Gh44KT44G9fOOBoeOAh+OBvXzjgaHil6/jgb1844Gh4peL44G9fOOBoeKXj+OBvXzjg4Hjg7Pjg51844OB44CH44OdfOODgeKXr+ODnXzjg4Hil4vjg51844OB4peP44OdfOOBoeOCk+OBoeOCk3zjg4Hjg7Pjg4Hjg7N844Gm44GD44KT44Gm44GD44KTfOODhuOCo+ODs+ODhuOCo+ODs3zjg4bjgqPjg7Pjg51844OH44Kr44GEfOODh+ODquODmOODq3zjgarjgYvjgaDjgZd844Gq44GL44CH44GXfOOBquOBi+KXr+OBl3zjgarjgYvil4vjgZd844Gq44GL4peP44GXfOiEseOBknzjg4zjgYR844OM44GLfOODjOOCq3zjg4zjgY1844OM44KtfOODjOOBj3zjg4zjgq9844OM44GRfOODjOOCsXzjg4zjgZN844OM44KzfOOBseOBhOOCguOBv3zjg5Hjg5HmtLt844G144GG44O7fOOBteOBhuKApnzjgbXjgYV8776M772pfOOBteOBj+OCieOBv3zjgbXjgY/jgonjgpPjgad844G644Gj44GffOOBuuOCjeOBuuOCjXzjg5rjg63jg5rjg618776N776f776b776N776f776bfOODleOCp+ODqXzjgbvjgYbjgZHjgYR844G844Gj44GNfOODneODq+ODjnzjgbzjgo3jgpN844Oc44Ot44OzfO++ju++nu++m+++nXzjgb3jgo3jgop844Od44Ot44OqfO++ju++n+++m+++mHzjg57jg7PjgY3jgaR844Oe44Oz44Kt44OEfOOBvuOCk+OBk3zjgb7jgIfjgZN844G+4pev44GTfOOBvuKXi+OBk3zjgb7il4/jgZN844Oe44Oz44KzfOODnuOAh+OCs3zjg57il6/jgrN844Oe4peL44KzfOODnuKXj+OCs3zjgb7jgpPjgZXjgpN844KC44Gj44GT44KKfOODouODg+OCs+ODqnzjgoLjgb/jgoLjgb9844Oi44Of44Oi44OffOODpOOBo+OBn3zjg6TjgaPjgaZ844Ok44KJfOOChOOCieOBm+OCjXzjg6Tjgop844Ok44KLfOODpOOCjHzjg6Tjgo1844Op44OW44ObfOODr+ODrOODoXzmhJvmtrJ85ZaYfOmZsOaguHzpmbDojI586Zmw5ZSHfOa3q+WkonzpmqDmr5t86Zmw5q+bfOeUo+OCgeOCi3zlpbPjga7lrZDjga7ml6V85rGa44Gj44GV44KTfOWnpnzpqI7kuZfkvY185beo5qC5fOW3qOODgeODs3zlt6jnj4186YeR546JfOaciOe1jHzlvozog4zkvY185a2Q56iufOWtkOS9nOOCinzlsITnsr585L+h6ICFfOeyvua2snzpgI/jgZF85oCn5LqkfOeyvuWtkHzmraPluLjkvY185oCn5b60fOaAp+eahHznlJ/nkIZ85a+45q2i44KBfOe0oOadkHzmirHjgYR85oqx44GLfOaKseOBjXzmirHjgY985oqx44GRfOaKseOBk3zkvZPmtrJ85Lmz6aaWfOaBpeWeonznj43mo5J85Lit44Gg44GXfOS4reWHuuOBl3zlsL985oqc44GEfOaKnOOBkeOBquOBhHzmipzjgZHjgot85oqc44GR44KMfOeKr+ePjXzohqjjgol85YyF6IyOfOWLg+i1t3zmkannvoV86a2U576FfOaPieOBvnzmj4njgb985o+J44KAfOaPieOCgXzmvKvmuZZ844CH772efOKXr++9nnzil4vvvZ584peP772efOOAh+ODg+OCr+OCuXzil6/jg4Pjgq/jgrl84peL44OD44Kv44K5fOKXj+ODg+OCr+OCuQ==', 'base64').toString());\n\n // 「罵倒や差別的な表現を含むコメントをミュートする」のフィルタ正規表現\n private static readonly mute_abusive_discriminatory_prejudiced_comments_pattern = new RegExp(Buffer.from('44CCfOOCouODi+ODl+ODrOOBj+OCk3zjgqLjg4vjg5fjg6zlkJt844Ki44K544OafOOCpOOCq+OCjHzjgYTjgb7jgYTjgaF844Kk44Oe44Kk44OBfOOCpOODqeOBpOOBj3zjgqbjgrh844Km44O844OofOOCpuODqHzjgqbjg6jjgq9844Km44OyfOOBjeOCguOBhHzjgq3jg6LjgqR844Kt44Oi44GEfOOCrS/jg6Av44OBfOOCrOOCpOOCuHzvvbbvvp7vvbLvvbzvvp5844Ks44KtfOOCq+OCuXzjgq3jg4Pjgrp844GN44Gh44GM44GEfOOCreODgeOCrOOCpHzjgq3jg6Djg4F844K344OKfOOCueODhuODnnzjgaTjgb7jgonjgap844Gk44G+44KJ44KTfOODgeODp+ODg+ODkeODqnzjg4Hjg6fjg7N85Y2D44On44OzfOOBpOOCk+OBvHzjg4Tjg7Pjg5x844ON44OI44Km44OofOOBq+OBoOOBguOBgnzjg4vjg4B85LqM44OAfO++hu++gO++nnzjg5Hjg7zjg6h844OR44OofOODkeODqOOCr3zjgbbjgaPjgZV844OW44OD44K1fOOBtuOBleOBhHzjg5bjgrXjgqR844G+44Gs44GRfOODoeOCr+ODqXzjg5Djgqt844Og44Kr44Gk44GPfOiNkuOCieOBl3zpurvnlJ/jgrvjg6Hjg7Pjg4h85oWw5a6J5ammfOWus+WFkHzlpJblrZd85aem5Zu9fOmfk+WbvXzpn5PkuK186Z+T5pelfOWfuuWcsOWklnzmsJfni4LjgYR85rCX6YGV44GEfOWIh+OBo+OBn3zliIfjgaPjgaZ85rCX5oyB44Gh5oKqfOWbveS6pOaWree1tnzmrrp86aCDfOmgg+OBl3zpoIPjgZl86aCD44GbfOWcqOaXpXzlj4LmlL/mqKl85q2744GtfOawj+OBrXzvvoDvvot85q255YyVfOatueODknzlpLHpgJ986Zqc5a6zfOaWreS6pHzkuK3pn5N85pyd6a6ufOW+tOeUqOW3pXzlo7p85aO3fOWjvHzml6Xpn5N85pel5bidfOeymOedgHzlj43ml6V86aas6bm/fOeZuueLgnznmbrpgZR85py0fOWjsuWbvXzkuI3lv6t85L215ZCIfOmWk+aKnOOBkXzmloflj6V86Z2W5Zu9', 'base64').toString());\n\n // 「8文字以上同じ文字が連続しているコメントをミュートする」のフィルタ正規表現\n private static readonly mute_consecutive_same_characters_comments_pattern = /(.)\\1{7,}/;\n\n // ニコ生の特殊コマンド付きコメントのフィルタ正規表現\n private static readonly special_command_comments_pattern = /\\/[a-z]+ /;\n\n // 迷惑な統計コメントのフィルタ正規表現\n private static readonly annoying_statistical_comments_pattern = /最高\\d+米\\/|計\\d+ID|総\\d+米/;\n\n // ニコニコの色指定を 16 進数カラーコードに置換するテーブル\n private static readonly color_table: {[key: string]: string} = {\n 'white': '#FFEAEA',\n 'red': '#F02840',\n 'pink': '#FD7E80',\n 'orange': '#FDA708',\n 'yellow': '#FFE133',\n 'green': '#64DD17',\n 'cyan': '#00D4F5',\n 'blue': '#4763FF',\n 'purple': '#D500F9',\n 'black': '#1E1310',\n 'white2': '#CCCC99',\n 'niconicowhite': '#CCCC99',\n 'red2': '#CC0033',\n 'truered': '#CC0033',\n 'pink2': '#FF33CC',\n 'orange2': '#FF6600',\n 'passionorange': '#FF6600',\n 'yellow2': '#999900',\n 'madyellow': '#999900',\n 'green2': '#00CC66',\n 'elementalgreen': '#00CC66',\n 'cyan2': '#00CCCC',\n 'blue2': '#3399FF',\n 'marineblue': '#3399FF',\n 'purple2': '#6633CC',\n 'nobleviolet': '#6633CC',\n 'black2': '#666666',\n };\n\n\n /**\n * ニコニコの色指定を 16 進数カラーコードに置換する\n * @param color ニコニコの色指定\n * @return 16 進数カラーコード\n */\n public static getCommentColor(color: string): string | null {\n return this.color_table[color] || null;\n }\n\n\n /**\n * ニコニコの位置指定を DPlayer の位置指定に置換する\n * @param position ニコニコの位置指定\n * @return DPlayer の位置指定\n */\n public static getCommentPosition(position: string): 'top' | 'right' | 'bottom' | null {\n switch (position) {\n case 'ue':\n return 'top';\n case 'naka':\n return 'right';\n case 'shita':\n return 'bottom';\n default:\n return null;\n }\n }\n\n\n /**\n * ニコニコのサイズ指定を DPlayer のサイズ指定に置換する\n * @param size ニコニコのサイズ指定\n * @returns DPlayer のサイズ指定\n */\n public static getCommentSize(size: string): 'big' | 'medium' | 'small' | null {\n switch (size) {\n case 'big':\n case 'medium':\n case 'small':\n return size;\n default:\n return null;\n }\n }\n\n\n /**\n * ニコニコのコメントコマンドを解析する\n * @param comment_mail ニコニコのコメントコマンド\n * @returns コメントの色、位置、サイズ\n */\n public static parseCommentCommand(comment_mail: string): {\n color: string;\n position: 'top' | 'right' | 'bottom';\n size: 'big' | 'medium' | 'small';\n } {\n let color = '#FFEAEA';\n let position: 'top' | 'right' | 'bottom' = 'right';\n let size: 'big' | 'medium' | 'small' = 'medium';\n\n if (comment_mail !== undefined && comment_mail !== null) {\n const commands = comment_mail.replace('184', '').split(' ');\n\n for (const command of commands) {\n const parsed_color = CommentUtils.getCommentColor(command);\n const parsed_position = CommentUtils.getCommentPosition(command);\n const parsed_size = CommentUtils.getCommentSize(command);\n if (parsed_color !== null) {\n color = parsed_color;\n }\n if (parsed_position !== null) {\n position = parsed_position;\n }\n if (parsed_size !== null) {\n size = parsed_size;\n }\n }\n }\n\n return {color, position, size};\n }\n\n\n /**\n * ミュート対象のコメントかどうかを判断する\n * @param comment コメント\n * @param user_id コメントを投稿したユーザーの ID\n * @param color コメントの色\n * @param position コメントの位置\n * @param size コメントのサイズ\n * @return ミュート対象のコメントなら true を返す\n */\n public static isMutedComment(\n comment: string,\n user_id: string,\n color?: string,\n position?: 'top' | 'right' | 'bottom',\n size?: 'big' | 'medium' | 'small',\n ): boolean {\n\n const settings_store = useSettingsStore();\n\n // ユーザー ID ミュート処理\n if (settings_store.settings.muted_niconico_user_ids.includes(user_id)) {\n return true;\n }\n\n // ニコ生の特殊コマンド付きコメント (/nicoad, /emotion など) を一括で弾く\n if (CommentUtils.special_command_comments_pattern.test(comment)) {\n return true;\n }\n\n // 「映像の上下に固定表示されるコメントをミュートする」がオンの場合\n // コメントの位置が top (上固定) もしくは bottom (下固定) のときは弾く\n if (settings_store.settings.mute_fixed_comments === true && (position === 'top' || position === 'bottom')) {\n console.log('[CommentUtils] Muted comment (fixed_comments): ' + comment);\n return true;\n }\n\n // 「色付きのコメントをミュートする」がオンの場合\n // コメントの色が #FFEAEA (デフォルト) 以外のときは弾く\n if (settings_store.settings.mute_colored_comments === true && color !== '#FFEAEA') {\n console.log('[CommentUtils] Muted comment (colored_comments): ' + comment);\n return true;\n }\n\n // 「文字サイズが大きいコメントをミュートする」がオンの場合\n // コメントのサイズが big のときは弾く\n if (settings_store.settings.mute_big_size_comments === true && size === 'big') {\n console.log('[CommentUtils] Muted comment (big_size_comments): ' + comment);\n return true;\n }\n\n // 「露骨な表現を含むコメントをミュートする」がオンの場合\n if ((settings_store.settings.mute_vulgar_comments === true) &&\n (CommentUtils.mute_vulgar_comments_pattern.test(comment))) {\n console.log('[CommentUtils] Muted comment (vulgar_comments): ' + comment);\n return true;\n }\n\n // 「罵倒や差別的な表現を含むコメントをミュートする」がオンの場合\n if ((settings_store.settings.mute_abusive_discriminatory_prejudiced_comments === true) &&\n (CommentUtils.mute_abusive_discriminatory_prejudiced_comments_pattern.test(comment))) {\n console.log('[CommentUtils] Muted comment (abusive_discriminatory_prejudiced_comments): ' + comment);\n return true;\n }\n\n // 「8文字以上同じ文字が連続しているコメントをミュートする」がオンの場合\n if ((settings_store.settings.mute_consecutive_same_characters_comments === true &&\n (CommentUtils.mute_consecutive_same_characters_comments_pattern.test(comment)))) {\n console.log('[CommentUtils] Muted comment (consecutive_same_characters_comments): ' + comment);\n return true;\n }\n\n // キーワードミュート処理\n for (const muted_comment_keyword of settings_store.settings.muted_comment_keywords) {\n if (muted_comment_keyword.pattern === '') continue; // キーワードが空文字のときは無視\n switch (muted_comment_keyword.match) {\n // 部分一致\n case 'partial':\n if (comment.includes(muted_comment_keyword.pattern)) {\n console.log('[CommentUtils] Muted comment (partial): ' + comment);\n return true;\n }\n break;\n // 前方一致\n case 'forward':\n if (comment.startsWith(muted_comment_keyword.pattern)) {\n console.log('[CommentUtils] Muted comment (forward): ' + comment);\n return true;\n }\n break;\n // 後方一致\n case 'backward':\n if (comment.endsWith(muted_comment_keyword.pattern)) {\n console.log('[CommentUtils] Muted comment (backward): ' + comment);\n return true;\n }\n break;\n // 完全一致\n case 'exact':\n if (comment === muted_comment_keyword.pattern) {\n console.log('[CommentUtils] Muted comment (exact): ' + comment);\n return true;\n }\n break;\n // 正規表現\n case 'regex':\n if (new RegExp(muted_comment_keyword.pattern).test(comment)) {\n console.log('[CommentUtils] Muted comment (regex): ' + comment);\n return true;\n }\n break;\n }\n }\n\n // 「NHK→計1447ID/内プレ425ID/総33372米 ◆ Eテレ → 計73ID/内プレ19ID/総941米」のような\n // 迷惑コメントを一括で弾く (あえてミュートしたくないユースケースが思い浮かばないのでデフォルトで弾く)\n // 一番最後なのは、この迷惑コメント自体の頻度が低いため\n if (CommentUtils.annoying_statistical_comments_pattern.test(comment)) {\n return true;\n }\n\n // いずれのミュート処理にも引っかからなかった (ミュート対象ではない)\n return false;\n }\n\n\n /**\n * ミュート済みキーワードリストに追加する (完全一致)\n * @param comment コメント文字列\n */\n public static addMutedKeywords(comment: string): void {\n\n // すでにまったく同じミュート済みキーワードが追加済みの場合は何もしない\n const settings_store = useSettingsStore();\n for (const muted_comment_keyword of settings_store.settings.muted_comment_keywords) {\n if (muted_comment_keyword.match === 'exact' && muted_comment_keyword.pattern === comment) {\n return;\n }\n }\n\n // ミュート済みキーワードリストに追加\n settings_store.settings.muted_comment_keywords.push({\n match: 'exact',\n pattern: comment,\n });\n }\n\n\n /**\n * ミュート済みニコニコユーザー ID リストに追加する\n * @param user_id ニコニコユーザー ID\n */\n public static addMutedNiconicoUserIDs(user_id: string): void {\n\n // すでに追加済みの場合は何もしない\n const settings_store = useSettingsStore();\n if (settings_store.settings.muted_niconico_user_ids.includes(user_id)) {\n return;\n }\n\n // ミュート済みニコニコユーザー ID リストに追加\n settings_store.settings.muted_niconico_user_ids.push(user_id);\n }\n}\n","\nimport DPlayer from 'dplayer';\n\n/**\n * API 上設定できる動画の画質\n */\ntype APIVideoQuality = (\n '1080p-60fps' |\n '1080p-60fps-hevc' |\n '1080p' |\n '1080p-hevc' |\n '810p' |\n '810p-hevc' |\n '720p' |\n '720p-hevc' |\n '540p' |\n '540p-hevc' |\n '480p' |\n '480p-hevc' |\n '360p' |\n '360p-hevc' |\n '240p' |\n '240p-hevc'\n);\n\n\n\n/**\n * プレイヤー周りのユーティリティ\n */\nexport class PlayerUtils {\n\n /**\n * プレイヤーの背景画像をランダムで取得し、その URL を返す\n * @returns ランダムで設定されたプレイヤーの背景画像の URL\n */\n public static generatePlayerBackgroundURL(): string {\n const background_count = 50; // 50種類から選択\n const random = (Math.floor(Math.random() * background_count) + 1);\n return `/assets/images/player-backgrounds/${random.toString().padStart(2, '0')}.jpg`;\n }\n\n\n /**\n * 現在のブラウザで H.265 / HEVC 映像が再生できるかどうかを取得する\n * ref: https://github.com/StaZhu/enable-chromium-hevc-hardware-decoding#mediacapabilities\n * @returns 再生できるなら true、できないなら false\n */\n public static isHEVCVideoSupported(): boolean {\n // hvc1.1.6.L123.B0 の部分は呪文 (HEVC であることと、そのプロファイルを示す値らしい)\n return document.createElement('video').canPlayType('video/mp4; codecs=\"hvc1.1.6.L123.B0\"') === 'probably';\n }\n\n\n /**\n * DPlayer のインスタンスから API で設定できる画質を取得する\n * @param player DPlayer のインスタンス\n * @returns API で設定できる画質 (取得できなかった場合は null)\n */\n public static extractAPIQualityFromDPlayer(player: DPlayer): APIVideoQuality | null {\n if (player.quality === null) {\n return null;\n }\n const regex = /streams\\/live\\/[a-z0-9]*\\/(.*)\\/(mpegts|ll-hls)/;\n const match = player.quality.url.match(regex);\n return match ? (match[1] as APIVideoQuality) : null;\n }\n}\n","\nimport dayjs from 'dayjs';\nimport 'dayjs/locale/ja';\nimport isBetween from 'dayjs/plugin/isBetween';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\n\nimport { IProgram } from '@/services/Programs';\nimport Utils from '@/utils';\n\ndayjs.extend(isBetween);\ndayjs.extend(isSameOrAfter);\ndayjs.extend(isSameOrBefore);\n\n\n/**\n * 番組情報周りのユーティリティ\n */\nexport class ProgramUtils {\n\n private static format_string_translation_map: {[key: string]: string} | null = null;\n\n\n /**\n * ミリ秒単位の Unix タイムスタンプを ISO 8601 形式の文字列に変換する\n * @param timestamp ミリ秒単位の Unix タイムスタンプ\n * @returns ISO 8601 形式の文字列\n */\n public static convertTimestampToISO8601(timestamp: number): string {\n dayjs.locale('ja');\n const date = dayjs(timestamp).toISOString();\n return date;\n }\n\n\n /**\n * 番組情報中の[字]や[解]などの記号をいい感じに装飾する\n * @param program 番組情報のオブジェクト\n * @param key 番組情報のオブジェクトから取り出すプロパティのキー\n * @returns 装飾した文字列\n */\n public static decorateProgramInfo(program: IProgram | null, key: string): string {\n\n // program が空でないかつ、program[key] が存在する\n if (program !== null && program[key] !== null) {\n\n // 番組情報に含まれる HTML の特殊文字で表示がバグらないように、事前に HTML エスケープしておく\n const text = Utils.escapeHTML(program[key]);\n\n // 本来 ARIB 外字である記号の一覧\n // ref: https://ja.wikipedia.org/wiki/%E7%95%AA%E7%B5%84%E8%A1%A8\n // ref: https://github.com/xtne6f/EDCB/blob/work-plus-s/EpgDataCap3/EpgDataCap3/ARIB8CharDecode.cpp#L1319\n const mark = '新|終|再|交|映|手|声|多|副|字|文|CC|OP|二|S|B|SS|無|無料' +\n 'C|S1|S2|S3|MV|双|デ|D|N|W|P|H|HV|SD|天|解|料|前|後初|生|販|吹|PPV|' +\n '演|移|他|収|・|英|韓|中|字/日|字/日英|3D|2K|4K|8K|5.1|7.1|22.2|60P|120P|d|HC|HDR|SHV|UHD|VOD|配|初';\n\n // 正規表現を作成\n const pattern1 = new RegExp('\\\\((二|字|再)\\\\)', 'g'); // 通常の括弧で囲まれている記号\n const pattern2 = new RegExp(`\\\\[(${mark})\\\\]`, 'g');\n\n // 正規表現で置換した結果を返す\n return text.replace(pattern1, '$1')\n .replace(pattern2, '$1');\n\n // 番組情報がない時間帯\n } else {\n\n // 23時~翌7時 (0:00 ~ 06:59 or 23:00 ~ 23:59) の間なら放送を休止している可能性が高いので、放送休止と表示する\n const now = dayjs();\n const pause_time_start = dayjs().hour(0).minute(0).second(0);\n const pause_time_end = dayjs().hour(6).minute(59).second(59);\n const pause_time_start_23 = dayjs().hour(23).minute(0).second(0);\n const pause_time_end_23 = dayjs().hour(23).minute(59).second(59);\n if ((now.isSameOrAfter(pause_time_start) && now.isSameOrBefore(pause_time_end)) ||\n (now.isSameOrAfter(pause_time_start_23) && now.isSameOrBefore(pause_time_end_23))) {\n if (key === 'title') {\n return '放送休止'; // タイトル\n } else {\n return 'この時間は放送を休止しています。'; // 番組概要\n }\n\n // それ以外の時間帯では、「番組情報がありません」と表示する\n // 急な番組変更の影響で、一時的にその時間帯に対応する番組情報が消えることがある\n // 特に Mirakurun バックエンドでは高頻度で収集した EIT[p/f] が比較的すぐ反映されるため、この現象が起こりやすい\n // 日中に放送休止(停波)になることはまずあり得ないので、番組情報が取得できてないだけで視聴できるかも?というニュアンスを与える\n } else {\n if (key === 'title') {\n return '番組情報がありません'; // タイトル\n } else {\n return 'この時間の番組情報を取得できませんでした。'; // 番組概要\n }\n }\n }\n }\n\n\n /**\n * 番組の進捗状況を取得する\n * @param program 番組情報\n * @returns 番組の進捗状況(%単位)\n */\n public static getProgramProgress(program: IProgram | null): number {\n\n // program が空でない\n if (program !== null) {\n\n // 番組開始時刻から何秒進んだか\n const progress = dayjs(dayjs()).diff(program.start_time, 'second');\n\n // %単位の割合を算出して返す\n return progress / program.duration * 100;\n\n // 放送休止中\n } else {\n return 0;\n }\n }\n\n\n /**\n * 番組の放送時刻を取得する\n * @param program 番組情報\n * @param is_short 時刻のみ返すかどうか\n * @returns 番組の放送時刻\n */\n public static getProgramTime(program: IProgram | null, is_short: boolean = false): string {\n\n // program が空でなく、かつ番組時刻が初期値でない\n if (program !== null && program.start_time !== '2000-01-01T00:00:00+09:00') {\n\n dayjs.locale('ja'); // ロケールを日本に設定\n const start_time = dayjs(program.start_time);\n\n // duration が 0 以下の場合は、放送時間未定として扱う\n if (program.duration <= 0) {\n if (is_short === true) { // 時刻のみ\n return `${start_time.format('HH:mm')} ~ --:--`;\n } else {\n return `${start_time.format('YYYY/MM/DD (dd) HH:mm')} ~ --:-- (放送時間未定)`;\n }\n }\n\n const end_time = dayjs(program.end_time);\n const duration = program.duration / 60; // 分換算\n\n if (is_short === true) { // 時刻のみ\n return `${start_time.format('HH:mm')} ~ ${end_time.format('HH:mm')}`;\n } else {\n return `${start_time.format('YYYY/MM/DD (dd) HH:mm')} ~ ${end_time.format('HH:mm')} (${duration}分)`;\n }\n\n // 放送休止中\n } else {\n if (is_short === true) { // 時刻のみ\n return '--:-- ~ --:--';\n } else {\n return '----/--/-- (-) --:-- ~ --:-- (--分)';\n }\n }\n }\n\n\n /**\n * 文字列に含まれる英数や記号を半角に置換し、一律な表現に整える\n * server/app/metadata/TSInfoAnalyzer.py の TSInfoAnalyzer.formatString() と同等の処理を行う\n * @param string 変換する文字列\n * @returns 置換した文字列\n */\n public static formatString(string: string): string {\n\n // 変換マップを構築\n if (ProgramUtils.format_string_translation_map === null) {\n ProgramUtils.format_string_translation_map = ProgramUtils.getFormatStringTranslationTable();\n }\n\n // 変換\n for (const key in ProgramUtils.format_string_translation_map) {\n string = string.replaceAll(key, ProgramUtils.format_string_translation_map[key]);\n }\n\n // 置換した文字列を返す\n return string;\n }\n\n\n /**\n * formatString() で使用する変換テーブルを取得する\n * server/app/metadata/TSInfoAnalyzer.py の TSInfoAnalyzer.__getFormatStringTranslationTable() と同等の処理を行う\n * @returns 変換テーブル\n */\n private static getFormatStringTranslationTable(): {[key: string]: string} {\n\n // 全角英数を半角英数に置換\n const zenkaku_table = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n const hankaku_table = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n const merged_table: { [key: string]: string } = {};\n for (let i = 0; i < zenkaku_table.length; i++) {\n merged_table[zenkaku_table[i]] = hankaku_table[i];\n }\n\n // 全角記号を半角記号に置換\n const symbol_zenkaku_table = '"#$%&'()+,-./:;<=>[\]^_`{|} ';\n const symbol_hankaku_table = '\"#$%&\\'()+,-./:;<=>[\\\\]^_`{|} ';\n for (let i = 0; i < symbol_zenkaku_table.length; i++) {\n merged_table[symbol_zenkaku_table[i]] = symbol_hankaku_table[i];\n }\n // 一部の半角記号を全角に置換\n // 主に見栄え的な問題(全角の方が字面が良い)\n merged_table['!'] = '!';\n merged_table['?'] = '?';\n merged_table['*'] = '*';\n merged_table['~'] = '~';\n merged_table['@'] = '@';\n // シャープ → ハッシュ\n merged_table['♯'] = '#';\n // 波ダッシュ → 全角チルダ\n // EDCB は ~ を全角チルダとして扱っているため、KonomiTV でもそのように統一する\n merged_table['〜'] = '~';\n\n // 番組表で使用される囲み文字の置換テーブル\n // ref: https://note.nkmk.me/python-chr-ord-unicode-code-point/\n // ref: https://github.com/l3tnun/EPGStation/blob/v2.6.17/src/util/StrUtil.ts#L7-L46\n const enclosed_characters_table: {[key: string]: string} = {\n '\\u{1F14A}': '[HV]',\n '\\u{1F13F}': '[P]',\n '\\u{1F14C}': '[SD]',\n '\\u{1F146}': '[W]',\n '\\u{1F14B}': '[MV]',\n '\\u{1F210}': '[手]',\n '\\u{1F211}': '[字]',\n '\\u{1F212}': '[双]',\n '\\u{1F213}': '[デ]',\n '\\u{1F142}': '[S]',\n '\\u{1F214}': '[二]',\n '\\u{1F215}': '[多]',\n '\\u{1F216}': '[解]',\n '\\u{1F14D}': '[SS]',\n '\\u{1F131}': '[B]',\n '\\u{1F13D}': '[N]',\n '\\u{1F217}': '[天]',\n '\\u{1F218}': '[交]',\n '\\u{1F219}': '[映]',\n '\\u{1F21A}': '[無]',\n '\\u{1F21B}': '[料]',\n '\\u{1F21C}': '[前]',\n '\\u{1F21D}': '[後]',\n '\\u{1F21E}': '[再]',\n '\\u{1F21F}': '[新]',\n '\\u{1F220}': '[初]',\n '\\u{1F221}': '[終]',\n '\\u{1F222}': '[生]',\n '\\u{1F223}': '[販]',\n '\\u{1F224}': '[声]',\n '\\u{1F225}': '[吹]',\n '\\u{1F14E}': '[PPV]',\n '\\u{1F200}': '[ほか]',\n };\n\n // Unicode の囲み文字を大かっこで囲った文字に置換する\n // EDCB で EpgDataCap3_Unicode.dll を利用している場合や、Mirakurun 3.9.0-beta.24 以降など、\n // 番組情報取得元から Unicode の囲み文字が送られてくる場合に対応するためのもの\n // Unicode の囲み文字はサロゲートペアなどで扱いが難しい上に KonomiTV では囲み文字を CSS でハイライトしているため、Unicode にするメリットがない\n // ref: https://note.nkmk.me/python-str-replace-translate-re-sub/\n for (const key in enclosed_characters_table) {\n merged_table[key] = enclosed_characters_table[key];\n }\n\n return merged_table;\n }\n}\n","\n// 共通ユーティリティをデフォルトとしてインポート\nimport Utils from '@/utils/Utils';\nexport default Utils;\n\n// Utils フォルダ配下のユーティリティを一括でインポートできるように\nexport * from '@/utils/ChannelUtils';\nexport * from '@/utils/CommentUtils';\nexport * from '@/utils/PlayerUtils';\nexport * from '@/utils/ProgramUtils';\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('div',{staticClass:\"login-container-wrapper d-flex align-center w-100 mb-13\"},[_c('v-card',{staticClass:\"login-container px-10 pt-8 pb-11 mx-auto background lighten-1\",attrs:{\"elevation\":\"10\",\"width\":\"100%\",\"max-width\":\"450\"}},[_c('v-card-title',{staticClass:\"login__logo flex-column justify-center\"},[_c('v-img',{attrs:{\"max-width\":\"250\",\"src\":\"/assets/images/logo.svg\"}}),_c('h4',{staticClass:\"mt-10\"},[_vm._v(\"ログイン\")])],1),_c('v-divider'),_c('v-form',{ref:\"login\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('v-text-field',{staticClass:\"mt-12\",attrs:{\"outlined\":\"\",\"placeholder\":\"ユーザー名\",\"hide-details\":\"\",\"autofocus\":\"\",\"dense\":_vm.is_form_dense},model:{value:(_vm.username),callback:function ($$v) {_vm.username=$$v},expression:\"username\"}}),_c('v-text-field',{staticClass:\"mt-8\",attrs:{\"outlined\":\"\",\"placeholder\":\"パスワード\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"type\":_vm.password_showing ? 'text' : 'password',\"append-icon\":_vm.password_showing ? 'mdi-eye' : 'mdi-eye-off'},on:{\"click:append\":function($event){_vm.password_showing = !_vm.password_showing}},model:{value:(_vm.password),callback:function ($$v) {_vm.password=$$v},expression:\"password\"}}),_c('v-btn',{staticClass:\"login-button mt-5\",attrs:{\"color\":\"secondary\",\"depressed\":\"\",\"width\":\"100%\",\"height\":\"56\"},on:{\"click\":function($event){return _vm.login()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa:sign-in\"}}),_vm._v(\"ログイン \")],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('header',{staticClass:\"header\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"konomitv-logo ml-3 ml-md-6\",attrs:{\"to\":\"/tv/\"}},[_c('img',{staticClass:\"konomitv-logo__image\",attrs:{\"src\":\"/assets/images/logo.svg\",\"height\":\"21\"}})]),_c('v-spacer')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Header.vue?vue&type=template&id=84897154&scoped=true&\"\nvar script = {}\nimport style0 from \"./Header.vue?vue&type=style&index=0&id=84897154&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"84897154\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',[_c('div',{staticClass:\"navigation-container elevation-8\"},[_c('nav',{staticClass:\"navigation\"},[_c('div',{staticClass:\"navigation-scroll\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/tv/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:tv-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"テレビをみる\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/videos/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:movies-and-tv-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"ビデオをみる\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/timetable/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:calendar-ltr-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"番組表\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/reserves/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",staticStyle:{\"padding\":\"0.5px\"},attrs:{\"icon\":\"fluent:timer-16-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"録画予約\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/mylist/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"ic:round-playlist-play\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"マイリスト\")])],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/captures/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:image-multiple-24-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"キャプチャ\")])],1),_c('v-spacer'),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"navigation__link\",attrs:{\"active-class\":\"navigation__link--active\",\"to\":\"/settings/\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:settings-20-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"設定\")])],1),_c('a',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.top\",value:(_vm.versionStore.is_update_available ?\n `アップデートがあります (version ${_vm.versionStore.latest_version})` : ''),expression:\"versionStore.is_update_available ?\\n `アップデートがあります (version ${versionStore.latest_version})` : ''\",modifiers:{\"top\":true}}],staticClass:\"navigation__link\",class:{\n 'navigation__link--version': _vm.versionStore.is_client_develop_version,\n 'navigation__link--highlight': _vm.versionStore.is_update_available,\n },attrs:{\"active-class\":\"navigation__link--active\",\"href\":\"https://github.com/tsukumijima/KonomiTV\"}},[_c('Icon',{staticClass:\"navigation__link-icon\",attrs:{\"icon\":\"fluent:info-16-regular\",\"width\":\"26px\"}}),_c('span',{staticClass:\"navigation__link-text\"},[_vm._v(\"version \"+_vm._s(_vm.versionStore.client_version))])],1)],1)])]),_c('BottomNavigation')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('v-bottom-navigation',{staticClass:\"bottom-navigation-container elevation-12\",attrs:{\"color\":\"primary\",\"grow\":\"\"}},[_c('v-btn',{staticClass:\"bottom-navigation-button\",attrs:{\"to\":\"/tv/\"}},[_c('span',{staticClass:\"mt-1\"},[_vm._v(\"テレビをみる\")]),_c('Icon',{attrs:{\"icon\":\"fluent:tv-20-regular\",\"width\":\"30px\"}})],1),_c('v-btn',{staticClass:\"bottom-navigation-button\",attrs:{\"to\":\"/videos/\"}},[_c('span',{staticClass:\"mt-1\"},[_vm._v(\"ビデオをみる\")]),_c('Icon',{attrs:{\"icon\":\"fluent:movies-and-tv-20-regular\",\"width\":\"30px\"}})],1),_c('v-btn',{staticClass:\"bottom-navigation-button\",attrs:{\"to\":\"/settings/\"}},[_c('span',{staticClass:\"mt-1\"},[_vm._v(\"設定\")]),_c('Icon',{attrs:{\"icon\":\"fluent:settings-20-regular\",\"width\":\"30px\"}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./BottomNavigation.vue?vue&type=template&id=3df53df3&scoped=true&\"\nvar script = {}\nimport style0 from \"./BottomNavigation.vue?vue&type=style&index=0&id=3df53df3&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3df53df3\",\n null\n \n)\n\nexport default component.exports","\nimport APIClient from '@/services/APIClient';\n\n\n/** バージョン情報を表すインターフェイス */\nexport interface IVersionInformation {\n version: string;\n latest_version: string;\n environment: 'Windows' | 'Linux' | 'Linux-Docker' | 'Linux-ARM';\n backend: 'EDCB' | 'Mirakurun';\n encoder: 'FFmpeg' | 'QSVEncC' | 'NVEncC' | 'VCEEncC' | 'rkmppenc';\n}\n\n\nclass Version {\n\n /**\n * バージョン情報を取得する\n * @returns バージョン情報 or バージョン情報の取得に失敗した場合は null\n */\n static async fetchServerVersion(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/version');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'バージョン情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n}\n\nexport default Version;\n","\nimport { defineStore } from 'pinia';\n\nimport Version, { IVersionInformation } from '@/services/Version';\nimport Utils from '@/utils';\n\n\n/**\n * 現在ログイン中のユーザーアカウントの情報を共有するストア\n */\nconst useVersionStore = defineStore('version', {\n state: () => ({\n\n // サーバーのバージョン情報\n server_version_info: null as IVersionInformation | null,\n\n // 最終更新日時 (UNIX タイムスタンプ、秒単位)\n last_updated_at: 0,\n }),\n getters: {\n client_version(): string {\n return Utils.version;\n },\n server_version(): string | null {\n return this.server_version_info?.version ?? null;\n },\n latest_version(): string | null {\n return this.server_version_info?.latest_version ?? null;\n },\n is_client_develop_version(): boolean {\n return this.client_version.includes('-dev');\n },\n is_server_develop_version(): boolean {\n return this.server_version?.includes('-dev') ?? false;\n },\n is_update_available(): boolean {\n // もし現在のサーバーバージョンと最新のバージョンが異なるなら、アップデートが利用できると判断する\n // 現在のサーバーバージョンが開発版 (-dev あり) で、かつ最新のバージョンがリリース版 (-dev なし) の場合も同様に表示する\n // つまり開発版だと同じバージョンのリリース版がリリースされたときにしかアップデート通知が表示されない事になるが、ひとまずこれで…\n if (this.server_version === null || this.latest_version === null) return false;\n if ((this.is_server_develop_version === false && this.server_version !== this.latest_version) ||\n (this.is_server_develop_version === true && this.server_version.replace('-dev', '') === this.latest_version)) {\n return true;\n }\n return false;\n },\n is_version_mismatch(): boolean {\n if (this.server_version === null) return false;\n return this.client_version !== this.server_version;\n }\n },\n actions: {\n\n /**\n * バージョン情報を取得する\n * すでに取得済みの情報がある場合は API リクエストを行わずにそれを返す\n * @param force 強制的に API リクエストを行う場合は true\n * @returns バージョン情報 or バージョン情報の取得に失敗した場合は null\n */\n async fetchServerVersion(force: boolean = false): Promise {\n\n // バージョン情報がある場合はそれを返す\n // force が true の場合は無視される\n if (this.server_version_info !== null && force === false) {\n // ただし、最終更新日時が1分以上前の場合は非同期で更新する\n if (Utils.time() - this.last_updated_at > 60) {\n this.fetchServerVersion(true);\n }\n return this.server_version_info;\n }\n\n // サーバーのバージョン情報を取得する\n const version_info = await Version.fetchServerVersion();\n if (version_info === null) {\n return null;\n }\n this.server_version_info = version_info;\n this.last_updated_at = Utils.time();\n\n return this.server_version_info;\n },\n }\n});\n\nexport default useVersionStore;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport BottomNavigation from '@/components/BottomNavigation.vue';\nimport useVersionStore from '@/store/VersionStore';\n\nexport default Vue.extend({\n name: 'Navigation',\n components: {\n BottomNavigation,\n },\n computed: {\n ...mapStores(useVersionStore),\n },\n async created() {\n await this.versionStore.fetchServerVersion();\n }\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Navigation.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Navigation.vue?vue&type=template&id=5b40940b&scoped=true&\"\nimport script from \"./Navigation.vue?vue&type=script&lang=ts&\"\nexport * from \"./Navigation.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Navigation.vue?vue&type=style&index=0&id=5b40940b&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5b40940b\",\n null\n \n)\n\nexport default component.exports","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\n\nexport default Vue.extend({\n name: 'Login',\n components: {\n Header,\n Navigation,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n username: '' as string,\n password: '' as string,\n password_showing: false,\n };\n },\n computed: {\n // UserStore に this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // 現在ログイン中の場合はアカウントページに遷移\n if (this.userStore.is_logged_in) {\n await this.$router.replace({path: '/settings/account'});\n }\n },\n methods: {\n async login() {\n\n // ユーザー名またはパスワードが空\n if (this.username === '' || this.password === '') {\n this.$message.error('ユーザー名またはパスワードが空です。');\n return;\n }\n\n // ログイン処理 (エラーハンドリング含む) を実行\n const result = await this.userStore.login(this.username, this.password);\n if (result === false) {\n return; // ログイン失敗\n }\n\n // アカウントページに遷移\n // ブラウザバックでログインページに戻れないようにする\n await this.$router.replace({path: '/settings/account'});\n }\n }\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Login.vue?vue&type=template&id=851c3dec&scoped=true&\"\nimport script from \"./Login.vue?vue&type=script&lang=ts&\"\nexport * from \"./Login.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Login.vue?vue&type=style&index=0&id=851c3dec&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"851c3dec\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_vm._m(0)],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"d-flex justify-center align-center w-100\"},[_c('div',{staticClass:\"d-flex justify-center align-center flex-column\"},[_c('h1',[_vm._v(\"Not Found, or Under Development...\")]),_c('span',{staticClass:\"mt-4 text--text text--darken-1\"},[_vm._v(\"お探しのページは存在しないか、鋭意開発中です。\")])])])\n}]\n\nexport { render, staticRenderFns }","\n\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\n\nexport default Vue.extend({\n name: 'NotFound',\n components: {\n Header,\n Navigation,\n },\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./NotFound.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./NotFound.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./NotFound.vue?vue&type=template&id=1310cfee&scoped=true&\"\nimport script from \"./NotFound.vue?vue&type=script&lang=ts&\"\nexport * from \"./NotFound.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./NotFound.vue?vue&type=style&index=0&id=1310cfee&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1310cfee\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('div',{staticClass:\"register-container-wrapper d-flex align-center w-100 mb-13\"},[_c('v-card',{staticClass:\"register-container px-10 pt-8 pb-11 mx-auto background lighten-1\",attrs:{\"elevation\":\"10\",\"width\":\"100%\",\"max-width\":\"450\"}},[_c('v-card-title',{staticClass:\"register__logo flex-column justify-center\"},[_c('v-img',{attrs:{\"max-width\":\"250\",\"src\":\"/assets/images/logo.svg\"}}),_c('h4',{staticClass:\"mt-10\"},[_vm._v(\"アカウントを作成\")])],1),_c('v-divider'),_c('v-form',{ref:\"register\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('v-text-field',{staticClass:\"mt-12\",attrs:{\"outlined\":\"\",\"placeholder\":\"ユーザー名\",\"autofocus\":\"\",\"dense\":_vm.is_form_dense,\"rules\":[_vm.username_validation]},model:{value:(_vm.username),callback:function ($$v) {_vm.username=$$v},expression:\"username\"}}),_c('v-text-field',{staticStyle:{\"margin-top\":\"2px\"},attrs:{\"outlined\":\"\",\"placeholder\":\"パスワード\",\"dense\":_vm.is_form_dense,\"type\":_vm.password_showing ? 'text' : 'password',\"append-icon\":_vm.password_showing ? 'mdi-eye' : 'mdi-eye-off',\"rules\":[_vm.password_validation]},on:{\"click:append\":function($event){_vm.password_showing = !_vm.password_showing}},model:{value:(_vm.password),callback:function ($$v) {_vm.password=$$v},expression:\"password\"}}),_c('v-btn',{staticClass:\"register-button mt-5\",attrs:{\"color\":\"secondary\",\"depressed\":\"\",\"width\":\"100%\",\"height\":\"56\"},on:{\"click\":function($event){return _vm.register()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:person-add-20-filled\",\"height\":\"24\"}}),_vm._v(\"アカウントを作成 \")],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\n\nexport default Vue.extend({\n name: 'Register',\n components: {\n Header,\n Navigation,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n username: null as string | null,\n username_validation: (value: string | null) => {\n if (value === '' || value === null) return 'ユーザー名を入力してください。';\n if (/^.{2,}$/.test(value) === false) return 'ユーザー名は2文字以上で入力してください。';\n return true;\n },\n password: null as string | null,\n password_showing: true, // アカウント作成時はデフォルトでパスワードを表示する\n password_validation: (value: string | null) => {\n if (value === '' || value === null) return 'パスワードを入力してください。';\n // 正規表現の参考: https://qiita.com/grrrr/items/0b35b5c1c98eebfa5128\n if (/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(value) === false) return 'パスワードは4文字以上の半角英数記号を入力してください。';\n return true;\n },\n };\n },\n computed: {\n // UserStore に this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // 現在ログイン中の場合はアカウントページに遷移\n if (this.userStore.is_logged_in) {\n await this.$router.replace({path: '/settings/account'});\n }\n },\n methods: {\n async register() {\n\n // すべてのバリデーションが通過したときのみ\n // ref: https://qiita.com/Hijiri_Ishi/items/56cac99c8f3806a6fa24\n if ((this.$refs.register as any).validate() === false) return;\n if (this.username === null || this.password === null) return;\n\n // アカウント作成 & ログイン処理 (エラーハンドリング含む) を実行\n const result = await this.userStore.register(this.username, this.password);\n if (result === false) {\n return; // ログイン失敗\n }\n\n // アカウントページに遷移\n // ブラウザバックでアカウント作成画面に戻れないようにする\n await this.$router.replace({path: '/settings/account'});\n }\n }\n});\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Register.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Register.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Register.vue?vue&type=template&id=6533f3d0&scoped=true&\"\nimport script from \"./Register.vue?vue&type=script&lang=ts&\"\nexport * from \"./Register.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Register.vue?vue&type=style&index=0&id=6533f3d0&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6533f3d0\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:person-20-filled\",\"width\":\"25px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"アカウント\")])],1),_c('div',{staticClass:\"settings__content\",class:{'settings__content--loading': _vm.is_loading}},[(_vm.userStore.user === null)?_c('div',{staticClass:\"account\"},[_c('div',{staticClass:\"account-wrapper\"},[_c('img',{staticClass:\"account__icon\",attrs:{\"src\":\"/assets/images/account-icon-default.png\"}}),_c('div',{staticClass:\"account__info\"},[_c('div',{staticClass:\"account__info-name\"},[_c('span',{staticClass:\"account__info-name-text\"},[_vm._v(\"ログインしていません\")])]),_c('span',{staticClass:\"account__info-id\"},[_vm._v(\"Not logged in\")])])]),_c('v-btn',{staticClass:\"account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"140\",\"height\":\"56\",\"depressed\":\"\",\"to\":\"/login/\"}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa:sign-in\"}}),_vm._v(\"ログイン \")],1)],1):_vm._e(),(_vm.userStore.user !== null)?_c('div',{staticClass:\"account\"},[_c('div',{staticClass:\"account-wrapper\"},[_c('img',{staticClass:\"account__icon\",attrs:{\"src\":_vm.userStore.user_icon_url ?? ''}}),_c('div',{staticClass:\"account__info\"},[_c('div',{staticClass:\"account__info-name\"},[_c('span',{staticClass:\"account__info-name-text\"},[_vm._v(_vm._s(_vm.userStore.user.name))]),(_vm.userStore.user.is_admin)?_c('span',{staticClass:\"account__info-admin\"},[_vm._v(\"管理者\")]):_vm._e()]),_c('span',{staticClass:\"account__info-id\"},[_vm._v(\"User ID: \"+_vm._s(_vm.userStore.user.id))])])]),_c('v-btn',{staticClass:\"account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"140\",\"height\":\"56\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.userStore.logout()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fa:sign-out\"}}),_vm._v(\"ログアウト \")],1)],1):_vm._e(),(_vm.userStore.is_logged_in === false)?_c('div',{staticClass:\"account-register\"},[_c('div',{staticClass:\"account-register__heading\"},[_vm._v(\" KonomiTV アカウントにログインすると、\"),_c('br'),_vm._v(\"より便利な機能が使えます! \")]),_c('div',{staticClass:\"account-register__feature\"},[_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"bi:chat-left-text-fill\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"ニコニコ実況にコメントする\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"テレビを見ながらニコニコ実況にコメントできます。別途、ニコニコアカウントとの連携が必要です。\")])])],1),_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"fa-brands:twitter\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"Twitter 連携機能\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"テレビを見ながら Twitter にツイートしたり、検索したツイートをリアルタイムで表示できます。別途、Twitter アカウントとの連携が必要です。\")])])],1),_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"fluent:arrow-sync-20-filled\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"設定をデバイス間で同期\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"ピン留めしたチャンネルなど、ブラウザに保存されている各種設定をブラウザやデバイスをまたいで同期できます。\")])])],1),_c('div',{staticClass:\"account-feature\"},[_c('Icon',{staticClass:\"account-feature__icon\",attrs:{\"icon\":\"fa-solid:sliders-h\"}}),_c('div',{staticClass:\"account-feature__info\"},[_c('span',{staticClass:\"account-feature__info-heading\"},[_vm._v(\"サーバー設定をブラウザから変更\")]),_c('span',{staticClass:\"account-feature__info-text\"},[_vm._v(\"管理者権限があれば、サーバー設定をブラウザから変更できます。一番最初に作成されたアカウントには、自動で管理者権限が付与されます。\")])])],1)]),_c('div',{staticClass:\"account-register__description\"},[_vm._v(\" KonomiTV アカウントの作成に必要なものは\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\"ユーザー名とパスワードだけです。\"),_c('br'),_vm._v(\" アカウントはローカルに導入した\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\" KonomiTV サーバーにのみ保存されます。\"),_c('br'),_vm._v(\" 外部のサービスには保存されませんので、ご安心ください。\"),_c('br')]),_c('v-btn',{staticClass:\"account-register__button\",attrs:{\"color\":\"secondary\",\"width\":\"100%\",\"max-width\":\"250\",\"height\":\"50\",\"depressed\":\"\",\"to\":\"/register/\"}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:person-add-20-filled\",\"height\":\"24\"}}),_vm._v(\"アカウントを作成 \")],1)],1):_vm._e(),(_vm.userStore.is_logged_in === true)?_c('div',[_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"sync_settings\"}},[_vm._v(\"設定をデバイス間で同期する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"sync_settings\"}},[_vm._v(\" KonomiTV では、設定を同じアカウントでログインしているデバイス間で同期できます!\"),_c('br'),_vm._v(\" 同期をオンにすると、同期をオンにしているすべてのデバイスで共通の設定が使えます。ピン留めチャンネルやハッシュタグリストなども同期されます。\"),_c('br'),_vm._v(\" なお、デバイス固有の設定(画質設定など)は、同期後も各デバイスで個別に反映されます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"sync_settings\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.sync_settings),callback:function ($$v) {_vm.sync_settings=$$v},expression:\"sync_settings\"}})],1),_c('v-dialog',{attrs:{\"max-width\":\"530\"},model:{value:(_vm.sync_settings_dialog),callback:function ($$v) {_vm.sync_settings_dialog=$$v},expression:\"sync_settings_dialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"justify-center\"},[_vm._v(\"設定データの競合\")]),_c('v-card-text',[_vm._v(\" このデバイスの設定と、サーバーに保存されている設定が競合しています。\"),_c('br'),_vm._v(\" 一度上書きすると、元に戻すことはできません。慎重に選択してください。\"),_c('br')]),_c('div',{staticClass:\"d-flex flex-column px-4 pb-4 settings__conflict-dialog\"},[_c('v-btn',{staticClass:\"settings__save-button error--text text--lighten-1\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.overrideServerSettingsFromClient()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:document-arrow-up-16-filled\",\"height\":\"22px\"}}),_vm._v(\" サーバーに保存されている設定を、\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\"このデバイスの設定で上書きする \")],1),_c('v-btn',{staticClass:\"settings__save-button error--text text--lighten-1 mt-3\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.overrideClientSettingsFromServer()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:document-arrow-down-16-filled\",\"height\":\"22px\"}}),_vm._v(\" このデバイスの設定を、\"),_c('br',{staticClass:\"smartphone-vertical-only\"}),_vm._v(\"サーバーに保存されている設定で上書きする \")],1),_c('v-btn',{staticClass:\"settings__save-button mt-3\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){_vm.sync_settings_dialog = false}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:dismiss-16-filled\",\"height\":\"22px\"}}),_vm._v(\" キャンセル \")],1)],1)],1)],1),_c('v-form',{ref:\"settings_username\",staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"ユーザー名\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" KonomiTV アカウントのユーザー名を設定します。アルファベットだけでなく日本語や記号も使えます。\"),_c('br'),_vm._v(\" 同じ KonomiTV サーバー上の他のアカウントと同じユーザー名には変更できません。\"),_c('br')]),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"placeholder\":\"ユーザー名\",\"dense\":_vm.is_form_dense,\"rules\":[_vm.settings_username_validation]},model:{value:(_vm.settings_username),callback:function ($$v) {_vm.settings_username=$$v},expression:\"settings_username\"}})],1),_c('v-btn',{staticClass:\"settings__save-button\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.updateAccountInfo('username')}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:save-16-filled\",\"height\":\"24px\"}}),_vm._v(\"ユーザー名を更新 \")],1),_c('v-form',{staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"アイコン画像\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" KonomiTV アカウントのアイコン画像を設定します。\"),_c('br'),_vm._v(\" アップロードされた画像は自動で 400×400 の正方形にリサイズされます。\"),_c('br')]),_c('v-file-input',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"アイコン画像を選択\",\"dense\":_vm.is_form_dense,\"accept\":\"image/jpeg, image/png\",\"prepend-icon\":\"\",\"prepend-inner-icon\":\"mdi-paperclip\"},model:{value:(_vm.settings_icon),callback:function ($$v) {_vm.settings_icon=$$v},expression:\"settings_icon\"}})],1),_c('v-btn',{staticClass:\"settings__save-button mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.updateAccountIcon()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:save-16-filled\",\"height\":\"24px\"}}),_vm._v(\"アイコン画像を更新 \")],1),_c('v-form',{ref:\"settings_password\",staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"新しいパスワード\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" KonomiTV アカウントの新しいパスワードを設定します。\"),_c('br')]),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"placeholder\":\"新しいパスワード\",\"dense\":_vm.is_form_dense,\"type\":_vm.settings_password_showing ? 'text' : 'password',\"append-icon\":_vm.settings_password_showing ? 'mdi-eye' : 'mdi-eye-off',\"rules\":[_vm.settings_password_validation]},on:{\"click:append\":function($event){_vm.settings_password_showing = !_vm.settings_password_showing}},model:{value:(_vm.settings_password),callback:function ($$v) {_vm.settings_password=$$v},expression:\"settings_password\"}})],1),_c('v-btn',{staticClass:\"settings__save-button\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.updateAccountInfo('password')}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:save-16-filled\",\"height\":\"24px\"}}),_vm._v(\"パスワードを更新 \")],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item mt-6\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"アカウントを削除\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 現在ログインしている KonomiTV アカウントを削除します。\"),_c('br'),_c('b',[_vm._v(\"アカウントに紐づくすべてのデータが削除されます。\")]),_vm._v(\"元に戻すことはできません。\"),_c('br')])]),_c('v-dialog',{attrs:{\"max-width\":\"385\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on }){return [_c('v-btn',_vm._g({staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"}},on),[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:delete-16-filled\",\"height\":\"24px\"}}),_vm._v(\"アカウントを削除 \")],1)]}}],null,false,1849668703),model:{value:(_vm.account_delete_confirm_dialog),callback:function ($$v) {_vm.account_delete_confirm_dialog=$$v},expression:\"account_delete_confirm_dialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"justify-center pt-6 font-weight-bold\"},[_vm._v(\"本当にアカウントを削除しますか?\")]),_c('v-card-text',{staticClass:\"pt-2 pb-0\"},[_vm._v(\" アカウントに紐づくすべてのデータが削除されます。元に戻すことはできません。\"),_c('br'),_vm._v(\" 本当にアカウントを削除しますか? \")]),_c('v-card-actions',{staticClass:\"pt-4 px-6 pb-5\"},[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"text\",\"text\":\"\"},on:{\"click\":function($event){_vm.account_delete_confirm_dialog = false}}},[_vm._v(\"キャンセル\")]),_c('v-btn',{attrs:{\"color\":\"error\"},on:{\"click\":function($event){return _vm.deleteAccount()}}},[_vm._v(\"削除\")])],1)],1)],1)],1):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('v-card',{staticClass:\"settings-container d-flex px-5 py-5 mx-auto background\",attrs:{\"elevation\":\"0\",\"width\":\"100%\",\"max-width\":\"1000\"}},[_c('div',[_c('v-navigation-drawer',{staticClass:\"settings-navigation flex-shrink-0 background\",attrs:{\"permanent\":\"\",\"width\":\"195\",\"height\":\"auto\"}},[_c('v-list-item',{staticClass:\"px-4\"},[_c('v-list-item-content',[_c('h1',[_vm._v(\"設定\")])])],1),_c('v-list',{staticClass:\"mt-3 px-0 py-0\",attrs:{\"nav\":\"\"}},[_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/general\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 3px\"},attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"全般\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/caption\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:subtitles-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"字幕\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/data-broadcasting\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('svg',{attrs:{\"width\":\"26px\",\"height\":\"26px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})])]),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"データ放送\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/capture\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:image-multiple-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"キャプチャ\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/account\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-20-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"アカウント\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/jikkyo\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 2px\"},attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"ニコニコ実況\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/twitter\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 1px\"},attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"Twitter\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 mb-1\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/server\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:server-surface-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"サーバー設定\")])],1)],1)],1)],1)],1),_c('v-card',{staticClass:\"settings ml-5 px-7 py-7 lighten-1\",attrs:{\"width\":\"100%\"}},[_vm._t(\"default\")],2)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\n\n// 設定のベース画面なので、ロジックは基本置かない\nexport default Vue.extend({\n name: 'Settings-Base',\n components: {\n Header,\n Navigation,\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Base.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Base.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Base.vue?vue&type=template&id=7802007e&scoped=true&\"\nimport script from \"./Base.vue?vue&type=script&lang=ts&\"\nexport * from \"./Base.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Base.vue?vue&type=style&index=0&id=7802007e&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7802007e\",\n null\n \n)\n\nexport default component.exports","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Settings from '@/services/Settings';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Account',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // ローディング中かどうか\n is_loading: true,\n\n // ユーザー名とパスワード\n // ログイン画面やアカウント作成画面の data と同一のもの\n settings_username: null as string | null,\n settings_username_validation: (value: string | null) => {\n if (value === '' || value === null) return 'ユーザー名を入力してください。';\n if (/^.{2,}$/.test(value) === false) return 'ユーザー名は2文字以上で入力してください。';\n return true;\n },\n settings_password: null as string | null,\n settings_password_showing: false,\n settings_password_validation: (value: string | null) => {\n if (value === '' || value === null) return 'パスワードを入力してください。';\n // 正規表現の参考: https://qiita.com/grrrr/items/0b35b5c1c98eebfa5128\n if (/^[a-zA-Z0-9!-/:-@¥[-`{-~]{4,}$/.test(value) === false) return 'パスワードは4文字以上の半角英数記号を入力してください。';\n return true;\n },\n\n // アップロードするアイコン画像\n settings_icon: null as File | null,\n\n // アカウント削除確認ダイヤログ\n account_delete_confirm_dialog: false,\n\n // 設定を同期するかの設定値\n sync_settings: useSettingsStore().settings.sync_settings as boolean,\n\n // 設定を同期するときのダイヤログ\n sync_settings_dialog: false,\n };\n },\n computed: {\n // SettingsStore / UserStore に this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ローディング状態を解除\n this.is_loading = false;\n },\n watch: {\n // sync_settings の値の変更を監視する\n async sync_settings() {\n\n // 同期がオンになった & ダイヤログが表示されていない\n if (this.sync_settings === true && this.sync_settings_dialog === false) {\n\n // 同期対象の設定キーのみで設定データをまとめ直す\n const sync_settings = this.settingsStore.getSyncableClientSettings();\n\n // 同期対象のこのクライアントの設定を再度 JSON にする(文字列比較のため)\n const sync_settings_json = JSON.stringify(sync_settings);\n\n // サーバーから設定データをダウンロード\n // 一度オブジェクトに戻したものをを再度 JSON にする(文字列比較のため)\n const server_sync_settings = await Settings.fetchClientSettings();\n if (server_sync_settings === null) {\n this.$message.error('サーバーから設定データを取得できませんでした。');\n return;\n }\n const server_sync_settings_json = JSON.stringify(server_sync_settings);\n\n // このクライアントの設定とサーバーに保存されている設定が一致しない(=競合している)\n if (sync_settings_json !== server_sync_settings_json) {\n\n // 一度同期のスイッチをオフにして、クライアントとサーバーどちらの設定を使うのかを選択させるダイヤログを表示\n this.sync_settings_dialog = true;\n this.sync_settings = false;\n\n // このクライアントの設定とサーバーに保存されている設定が一致する\n } else {\n\n // 特に設定の同期をオンにしても問題ないので、そのまま有効にする\n this.settingsStore.settings.sync_settings = true;\n }\n\n // 同期がオフになった & ダイヤログが表示されていない\n } else if (this.sync_settings === false && this.sync_settings_dialog === false) {\n this.settingsStore.settings.sync_settings = false;\n }\n }\n },\n methods: {\n\n // このクライアントの設定でサーバー上の設定を上書きする\n async overrideServerSettingsFromClient() {\n\n // 強制的にこのクライアントの設定をサーバーに同期\n await this.settingsStore.syncClientSettingsToServer(true);\n\n // 設定の同期を有効化\n this.settingsStore.settings.sync_settings = true;\n this.sync_settings = true;\n\n // ダイヤログを閉じる\n this.sync_settings_dialog = false;\n },\n\n // サーバー上の設定でこのクライアントの設定を上書きする\n async overrideClientSettingsFromServer() {\n\n // 強制的にサーバーに保存されている設定データをこのクライアントに同期する\n // 設定の同期を有効化する前に実行しておくのが重要\n await this.settingsStore.syncClientSettingsFromServer(true);\n\n // 設定の同期を有効化\n // 値を変更した時点で設定データがサーバーにアップロードされてしまうので、\n // それよりも前に syncClientSettingsFromServer(true) でサーバー上の設定データを同期させておく必要がある\n // さもなければ、サーバー上の設定データがこのクライアントの設定で上書きされてしまい、overrideServerSettingsFromClient() と同じ挙動になってしまう\n this.settingsStore.settings.sync_settings = true;\n this.sync_settings = true;\n\n // ダイヤログを閉じる\n this.sync_settings_dialog = false;\n },\n\n async updateAccountInfo(update_type: 'username' | 'password') {\n\n // すべてのバリデーションが通過したときのみ\n // ref: https://qiita.com/Hijiri_Ishi/items/56cac99c8f3806a6fa24\n if (update_type === 'username') {\n if ((this.$refs.settings_username as any).validate() === false) return;\n } else {\n if ((this.$refs.settings_password as any).validate() === false) return;\n }\n\n // アカウント情報の更新処理 (エラーハンドリングを含む) を実行\n if (update_type === 'username') {\n if (this.settings_username === null) return;\n await this.userStore.updateUser({username: this.settings_username});\n } else {\n if (this.settings_password === null) return;\n await this.userStore.updateUser({password: this.settings_password});\n }\n },\n\n async updateAccountIcon() {\n\n // アイコン画像が選択されていないなら更新しない\n if (this.settings_icon === null) {\n this.$message.error('アップロードする画像を選択してください!');\n return;\n }\n\n // アイコン画像の更新処理 (エラーハンドリングを含む) を実行\n await this.userStore.updateUserIcon(this.settings_icon);\n },\n\n async deleteAccount() {\n\n // ダイヤログを閉じる\n this.account_delete_confirm_dialog = false;\n\n // アカウント削除処理 (エラーハンドリングを含む) を実行\n await this.userStore.deleteUser();\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Account.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Account.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Account.vue?vue&type=template&id=3ec6610e&scoped=true&\"\nimport script from \"./Account.vue?vue&type=script&lang=ts&\"\nexport * from \"./Account.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Account.vue?vue&type=style&index=0&id=3ec6610e&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3ec6610e\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:subtitles-16-filled\",\"width\":\"25px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"字幕\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item\"},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"字幕のフォント\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" プレイヤーで字幕表示をオンにしているときの、字幕のフォントを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.caption_font},model:{value:(_vm.settingsStore.settings.caption_font),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"caption_font\", $$v)},expression:\"settingsStore.settings.caption_font\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"always_border_caption_text\"}},[_vm._v(\"字幕の文字を常に縁取りする\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"always_border_caption_text\"}},[_vm._v(\" 字幕表示時、縁取りをオンにすると、字幕が見やすくきれいになります。とくに理由がなければ、オンにしておくのがおすすめです。\"),_c('br'),_vm._v(\" この設定がオフのときも、字幕データ側で縁取りが指定されていれば、オンのときと同様に縁取り付きで描画されます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"always_border_caption_text\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.always_border_caption_text),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"always_border_caption_text\", $$v)},expression:\"settingsStore.settings.always_border_caption_text\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"specify_caption_opacity\"}},[_vm._v(\"字幕の不透明度を指定する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"specify_caption_opacity\"}},[_vm._v(\" 字幕表示時、不透明度を自分で指定するか設定できます。\"),_c('br'),_vm._v(\" この設定がオフのときは、字幕データ側で指定されている不透明度で描画します。とくに理由がなければ、オフにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"specify_caption_opacity\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.specify_caption_opacity),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"specify_caption_opacity\", $$v)},expression:\"settingsStore.settings.specify_caption_opacity\"}})],1),_c('div',{staticClass:\"settings__item\",class:{'settings__item--disabled': _vm.settingsStore.settings.specify_caption_opacity === false}},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"字幕の不透明度\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" 上の [字幕の不透明度を指定する] をオンに設定したときのみ有効です。不透明度を 0 に設定すれば、字幕の背景を非表示にできます。\"),_c('br')]),_c('div',{ref:\"caption_opacity\",staticClass:\"settings__item-label\"},[_c('v-slider',{staticClass:\"settings__item-form\",attrs:{\"ticks\":\"always\",\"thumb-label\":\"\",\"hide-details\":\"\",\"min\":0,\"max\":1,\"step\":0.05,\"disabled\":_vm.settingsStore.settings.specify_caption_opacity === false},model:{value:(_vm.settingsStore.settings.caption_opacity),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"caption_opacity\", $$v)},expression:\"settingsStore.settings.caption_opacity\"}})],1)]),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\"テレビをみるときに文字スーパーを表示する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\" 文字スーパーは、緊急地震速報の赤テロップや、NHK BS のニュース速報のテロップなどで利用されています。とくに理由がなければ、オンにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_show_superimpose\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_show_superimpose),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_show_superimpose\", $$v)},expression:\"settingsStore.settings.tv_show_superimpose\"}})],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Caption',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // 字幕のフォントの選択肢\n caption_font: [\n {text: 'Windows TV ゴシック', value: 'Windows TV Gothic'},\n {text: 'Windows TV 丸ゴシック', value: 'Windows TV MaruGothic'},\n {text: 'Windows TV 太丸ゴシック', value: 'Windows TV FutoMaruGothic'},\n {text: 'ヒラギノTV丸ゴ', value: 'Hiragino TV Sans Rd S'},\n {text: '新丸ゴ ARIB', value: 'TT-ShinMGo-regular'},\n {text: 'Rounded M+ 1m for ARIB', value: 'Rounded M+ 1m for ARIB'},\n {text: 'Noto Sans JP', value: 'Noto Sans JP Caption'},\n {text: 'デフォルトのフォント', value: 'sans-serif'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Caption.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Caption.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Caption.vue?vue&type=template&id=0642ebd7&\"\nimport script from \"./Caption.vue?vue&type=script&lang=ts&\"\nexport * from \"./Caption.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:image-multiple-16-filled\",\"width\":\"26px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"キャプチャ\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"capture_copy_to_clipboard\"}},[_vm._v(\"キャプチャをクリップボードにコピーする\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"capture_copy_to_clipboard\"}},[_vm._v(\" この設定をオンにすると、撮ったキャプチャ画像がクリップボードにもコピーされます。\"),_c('br'),_vm._v(\" クリップボードの履歴をサポートしていない OS では、この設定をオンにしてキャプチャを撮ると、以前のクリップボードが上書きされます。注意してください。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"capture_copy_to_clipboard\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.capture_copy_to_clipboard),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"capture_copy_to_clipboard\", $$v)},expression:\"settingsStore.settings.capture_copy_to_clipboard\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"キャプチャの保存先\")]),_c('div',{staticClass:\"settings__item-label\"},[_c('p',[_vm._v(\" キャプチャした画像をブラウザでダウンロードするか、KonomiTV サーバーにアップロードするかを設定します。\"),_c('br'),_vm._v(\" ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方同時に行うこともできます。\"),_c('br')]),_c('p',[_vm._v(\" ブラウザでダウンロードすると、視聴中のデバイスのダウンロードフォルダに保存されます。\"),_c('br'),_vm._v(\" 視聴中のデバイスにそのまま保存されるためシンプルですが、保存先のフォルダを変更できないこと、PC 版 Chrome では毎回ダウンロードバーが表示されてしまったり、iOS Safari (PWA モード) ではダウンロードするとファイル概要画面が表示され再生が中断してしまったりなど、視聴に支障することがデメリットです (将来的には、iOS / Android アプリ版や拡張機能などで解消される予定) 。\"),_c('br')]),_c('p',[_vm._v(\" KonomiTV サーバーにアップロードすると、サーバー設定で指定されたキャプチャ保存フォルダに保存されます。視聴したデバイスにかかわらず、今までに撮ったキャプチャをひとつのフォルダにまとめて保存できます。\"),_c('br'),_vm._v(\" 他のデバイスでキャプチャを見るにはキャプチャ保存フォルダをネットワークに共有する必要があること、スマホ・タブレットではネットワーク上のフォルダへのアクセスがやや面倒なことがデメリットです。(将来的には、保存フォルダ内のキャプチャを Google フォトのように表示する機能を追加予定)\"),_c('br')])]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.capture_save_mode},model:{value:(_vm.settingsStore.settings.capture_save_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"capture_save_mode\", $$v)},expression:\"settingsStore.settings.capture_save_mode\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"字幕表示時のキャプチャの保存モード\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 字幕表示時、キャプチャした画像に字幕を合成するかを設定します。\"),_c('br'),_vm._v(\" 映像のみのキャプチャと、字幕を合成したキャプチャを両方同時に保存することもできます。\"),_c('br'),_vm._v(\" なお、字幕非表示時は、常に映像のみ (+コメント付きキャプチャではコメントを合成して) 保存されます。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.capture_caption_mode},model:{value:(_vm.settingsStore.settings.capture_caption_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"capture_caption_mode\", $$v)},expression:\"settingsStore.settings.capture_caption_mode\"}})],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Capture',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // キャプチャの保存先の選択肢\n capture_save_mode: [\n {text: 'ブラウザでダウンロード', value: 'Browser'},\n {text: 'KonomiTV サーバーにアップロード', value: 'UploadServer'},\n {text: 'ブラウザでのダウンロードと、KonomiTV サーバーへのアップロードを両方行う', value: 'Both'},\n ],\n\n // 字幕が表示されているときのキャプチャの保存モードの選択肢\n capture_caption_mode: [\n {text: '映像のみのキャプチャを保存する', value: 'VideoOnly'},\n {text: '字幕を合成したキャプチャを保存する', value: 'CompositingCaption'},\n {text: '映像のみのキャプチャと、字幕を合成したキャプチャを両方保存する', value: 'Both'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Capture.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Capture.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Capture.vue?vue&type=template&id=212658a0&\"\nimport script from \"./Capture.vue?vue&type=script&lang=ts&\"\nexport * from \"./Capture.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('svg',{attrs:{\"width\":\"27px\",\"height\":\"27px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})]),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"データ放送\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_show_data_broadcasting\"}},[_vm._v(\"テレビをみるときにデータ放送を表示する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_data_broadcasting\"}},[_vm._v(\" この設定をオンにすると、テレビをみるときにデータ放送機能を利用できます。\"),_c('br'),_vm._v(\" データ放送そのもののオン/オフは、視聴画面右側のパネルからリモコンを表示した上で、リモコンの d ボタンから切り替えられます。\"),_c('br')]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_data_broadcasting\"}},[_vm._v(\" データ放送機能をオンにすると、負荷が高くなり視聴に支障が出ることがあります。データ放送を利用しない場合や、性能の低い Android デバイスではオフにすることをおすすめします。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_show_data_broadcasting\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_show_data_broadcasting),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_show_data_broadcasting\", $$v)},expression:\"settingsStore.settings.tv_show_data_broadcasting\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('v-form',{ref:\"data_broadcasting_zip_code\",staticClass:\"settings__item settings__item--sync-disabled\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"お住まいの郵便番号\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" ここで設定した郵便番号をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。\"),_c('br'),_vm._v(\" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。\"),_c('br')]),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"placeholder\":\"郵便番号\",\"dense\":_vm.is_form_dense,\"rules\":[_vm.data_broadcasting_zip_code_validation]},model:{value:(_vm.data_broadcasting_zip_code),callback:function ($$v) {_vm.data_broadcasting_zip_code=$$v},expression:\"data_broadcasting_zip_code\"}})],1),_c('div',{staticClass:\"settings__item settings__item--sync-disabled mt-0\"},[_c('label',{staticClass:\"settings__item-heading\"},[_vm._v(\"お住まいの都道府県\")]),_c('label',{staticClass:\"settings__item-label\"},[_vm._v(\" ここで設定した都道府県をもとに、データ放送の地域情報(ニュース・天気予報など)が表示されます。\"),_c('br'),_vm._v(\" 設定しない場合、データ放送の一部のコンテンツが利用できないことがあります。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.data_broadcasting_prefectures},model:{value:(_vm.data_broadcasting_prefecture),callback:function ($$v) {_vm.data_broadcasting_prefecture=$$v},expression:\"data_broadcasting_prefecture\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"データ放送の保存データをリセット\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" このデバイス(ブラウザ)に保存されているデータ放送の保存データを、初期状態にリセット (消去) できます。\"),_c('br'),_vm._v(\" 保存データには、データ放送内のミニゲームの得点データや、設定データなどが含まれます。\"),_c('br'),_vm._v(\" 保存データをリセットすると、元に戻すことはできません。十分ご注意ください。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.resetNVRAMSettings()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"material-symbols:device-reset-rounded\",\"height\":\"23px\"}}),_vm._v(\"保存データをリセット \")],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\n// データ放送の NVRAM のうち、郵便番号/都道府県設定の保存に使う LocalStorage キーのプレフィックス\nconst NVRAM_LOCAL_STORAGE_PREFIX = 'KonomiTV-BMLBrowser_nvram_prefix=receiverinfo%2F';\n\nexport default Vue.extend({\n name: 'Settings-DataBroadcasting',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // データ放送向け郵便番号設定\n data_broadcasting_zip_code: '' as string,\n\n // データ放送向け郵便番号(日本)のバリデーション関数\n data_broadcasting_zip_code_validation: (value: string) => {\n if (value === '') {\n return true;\n }\n if (value.match(/^[0-9]{3}-[0-9]{4}$/) === null) {\n return '郵便番号は「000-0000」の形式で入力してください。';\n }\n return true;\n },\n\n // データ放送向け都道府県設定\n data_broadcasting_prefecture: '255-0b0' as string,\n data_broadcasting_prefectures: [\n {text: '未設定', value: '255-0b0'},\n {text: '西北海道', value: '2-0b000101101011'},\n {text: '東北海道', value: '1-0b000101101011'},\n {text: '青森県', value: '3-0b010001100111'},\n {text: '岩手県', value: '4-0b010111010100'},\n {text: '宮城県', value: '5-0b011101011000'},\n {text: '秋田県', value: '6-0b101011000110'},\n {text: '山形県', value: '7-0b111001001100'},\n {text: '福島県', value: '8-0b000110101110'},\n {text: '茨城県', value: '9-0b110001101001'},\n {text: '栃木県', value: '10-0b111000111000'},\n {text: '群馬県', value: '11-0b100110001011'},\n {text: '埼玉県', value: '12-0b011001001011'},\n {text: '千葉県', value: '13-0b000111000111'},\n {text: '東京都 (島部を除く)', value: '14-0b101010101100'},\n {text: '東京都島部 (伊豆・小笠原諸島)', value: '49-0b101010101100'},\n {text: '神奈川県', value: '15-0b010101101100'},\n {text: '新潟県', value: '16-0b010011001110'},\n {text: '富山県', value: '17-0b010100111001'},\n {text: '石川県', value: '18-0b011010100110'},\n {text: '福井県', value: '19-0b100100101101'},\n {text: '山梨県', value: '20-0b110101001010'},\n {text: '長野県', value: '21-0b100111010010'},\n {text: '岐阜県', value: '22-0b101001100101'},\n {text: '静岡県', value: '23-0b101001011010'},\n {text: '愛知県', value: '24-0b100101100110'},\n {text: '三重県', value: '25-0b001011011100'},\n {text: '滋賀県', value: '26-0b110011100100'},\n {text: '京都府', value: '27-0b010110011010'},\n {text: '大阪府', value: '28-0b110010110010'},\n {text: '兵庫県', value: '29-0b011001110100'},\n {text: '奈良県', value: '30-0b101010010011'},\n {text: '和歌山県', value: '31-0b001110010110'},\n {text: '鳥取県', value: '32-0b110100100011'},\n {text: '島根県', value: '33-0b001100011011'},\n {text: '岡山県', value: '34-0b001010110101'},\n {text: '広島県', value: '35-0b101100110001'},\n {text: '山口県', value: '36-0b101110011000'},\n {text: '徳島県', value: '37-0b111001100010'},\n {text: '香川県', value: '38-0b100110110100'},\n {text: '愛媛県', value: '39-0b000110011101'},\n {text: '高知県', value: '40-0b001011100011'},\n {text: '福岡県', value: '41-0b011000101101'},\n {text: '佐賀県', value: '42-0b100101011001'},\n {text: '長崎県', value: '43-0b101000101011'},\n {text: '熊本県', value: '44-0b100010100111'},\n {text: '大分県', value: '45-0b110010001101'},\n {text: '宮崎県', value: '46-0b110100011100'},\n {text: '鹿児島県 (南西諸島を除く)', value: '47-0b110101000101'},\n {text: '鹿児島県島部 (南西諸島の鹿児島県域)', value: '50-0b110101000101'},\n {text: '沖縄県', value: '48-0b001101110010'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n },\n created() {\n // 郵便番号設定を LocalStorage から読み込む\n const zip_code_raw = localStorage.getItem(`${NVRAM_LOCAL_STORAGE_PREFIX}zipcode`);\n if (zip_code_raw) {\n try {\n // 3文字目と4文字目の間に - を挿入する\n this.data_broadcasting_zip_code = window.atob(zip_code_raw);\n this.data_broadcasting_zip_code = this.data_broadcasting_zip_code.slice(0, 3) + '-' + this.data_broadcasting_zip_code.slice(3);\n } catch (error) {\n // 何もしない\n }\n }\n // 都道府県設定を LocalStorage から読み込む\n // 現在設定されている都道府県を特定するだけなら regioncode は不要なので、省略している\n const prefecture_raw = localStorage.getItem(`${NVRAM_LOCAL_STORAGE_PREFIX}prefecture`);\n if (prefecture_raw) {\n try {\n const prefecture = window.atob(prefecture_raw).charCodeAt(0);\n for (const item of this.data_broadcasting_prefectures) {\n if (item.value.startsWith(`${prefecture}-`)) {\n this.data_broadcasting_prefecture = item.value;\n break;\n }\n }\n } catch (error) {\n // 何もしない\n }\n }\n },\n watch: {\n data_broadcasting_zip_code(new_value: string) {\n // バリデーションチェック\n if ((this.$refs.data_broadcasting_zip_code as any).validate() === false) {\n return;\n }\n // 郵便番号設定を LocalStorage に保存する\n if (new_value !== '') {\n // - を除去してから Base64 エンコードする\n const zip_code_raw = window.btoa(new_value.replace('-', ''));\n localStorage.setItem(`${NVRAM_LOCAL_STORAGE_PREFIX}zipcode`, zip_code_raw);\n } else {\n // 未設定の場合は LocalStorage から削除する\n localStorage.removeItem(`${NVRAM_LOCAL_STORAGE_PREFIX}zipcode`);\n }\n },\n data_broadcasting_prefecture(new_value: string) {\n // 都道府県設定を LocalStorage に保存する\n if (new_value !== '255-0b0') {\n const value = new_value.split('-0b');\n const prefecture_number = parseInt(value[0]);\n const prefecture_raw = window.btoa(String.fromCharCode(prefecture_number));\n localStorage.setItem(`${NVRAM_LOCAL_STORAGE_PREFIX}prefecture`, prefecture_raw);\n const region_code_number = parseInt(value[1], 2); // 2進数の文字列を10進数の数値に変換する\n const region_code_raw = window.btoa(String.fromCharCode(region_code_number >> 8, region_code_number & 0xff));\n localStorage.setItem(`${NVRAM_LOCAL_STORAGE_PREFIX}regioncode`, region_code_raw);\n } else {\n // 未設定の場合は LocalStorage から削除する\n localStorage.removeItem(`${NVRAM_LOCAL_STORAGE_PREFIX}prefecture`);\n localStorage.removeItem(`${NVRAM_LOCAL_STORAGE_PREFIX}regioncode`);\n }\n }\n },\n methods: {\n resetNVRAMSettings() {\n // KonomiTV-BMLBrowser_nvram_ から始まる LocalStorage の項目をすべて削除する\n for (const key in localStorage) {\n if (key.startsWith('KonomiTV-BMLBrowser_nvram_')) {\n localStorage.removeItem(key);\n }\n }\n this.data_broadcasting_zip_code = '';\n this.data_broadcasting_prefecture = '255-0b0';\n this.$message.success('データ放送の保存データをリセットしました。');\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DataBroadcasting.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./DataBroadcasting.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./DataBroadcasting.vue?vue&type=template&id=3a9a6e29&\"\nimport script from \"./DataBroadcasting.vue?vue&type=script&lang=ts&\"\nexport * from \"./DataBroadcasting.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"19px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"全般\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item settings__item--sync-disabled\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"テレビのデフォルトのストリーミング画質\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" テレビをライブストリーミングするときのデフォルトの画質を設定します。\"),_c('br'),_vm._v(\" ストリーミング画質はプレイヤーの設定からいつでも切り替えられます。\"),_c('br')]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" [1080p (60fps)] は、通常 30fps (60i) の映像を補間し、より滑らか(ぬるぬる)な映像で視聴できます!\"),_c('br'),_vm._v(\" [1080p (60fps)] で視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出ることがあります。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tv_streaming_quality},model:{value:(_vm.settingsStore.settings.tv_streaming_quality),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_streaming_quality\", $$v)},expression:\"settingsStore.settings.tv_streaming_quality\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\",class:{'settings__item--disabled': _vm.PlayerUtils.isHEVCVideoSupported() === false}},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_data_saver_mode\"}},[_vm._v(\"テレビを通信節約モードで視聴する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_data_saver_mode\"}},[_vm._v(\" 通信節約モードでは、H.265 / HEVC という圧縮率の高いコーデックを使い、画質はほぼそのまま、通信量を通常の 1/2 程度に抑えながら視聴できます!\"),_c('br'),_vm._v(\" 通信節約モードで視聴するときは、サーバー設定の [利用するエンコーダー] をハードウェアエンコーダーに設定してください。FFmpeg (ソフトウェアエンコーダー) では、視聴に支障が出る可能性が高いです。\"),_c('br'),(_vm.PlayerUtils.isHEVCVideoSupported() === false && _vm.Utils.isFirefox() === false)?_c('p',{staticClass:\"mt-1 mb-0 error--text lighten-1\"},[_vm._v(\" このデバイスでは通信節約モードがサポートされていません。 \")]):_vm._e(),(_vm.PlayerUtils.isHEVCVideoSupported() === false && _vm.Utils.isFirefox() === true)?_c('p',{staticClass:\"mt-1 mb-0 error--text lighten-1\"},[_vm._v(\" お使いの Firefox ブラウザでは通信節約モードがサポートされていません。 \")]):_vm._e()]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_data_saver_mode\",\"inset\":\"\",\"hide-details\":\"\",\"disabled\":_vm.PlayerUtils.isHEVCVideoSupported() === false},model:{value:(_vm.settingsStore.settings.tv_data_saver_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_data_saver_mode\", $$v)},expression:\"settingsStore.settings.tv_data_saver_mode\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch settings__item--sync-disabled\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_low_latency_mode\"}},[_vm._v(\"テレビを低遅延で視聴する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_low_latency_mode\"}},[_vm._v(\" 低遅延ストリーミングをオンにすると、\"),_c('b',[_vm._v(\"放送波との遅延を最短 0.9 秒に抑えて視聴できます!\")]),_c('br'),_vm._v(\" また、約 3 秒以上遅延したときに少しだけ再生速度を早める (1.1x) ことで、滑らかにストリーミングの遅延を取り戻します。\"),_c('br'),_vm._v(\" 宅外視聴などのネットワークが不安定になりがちな環境では、低遅延ストリーミングをオフにしてみると、映像のカクつきを改善できるかもしれません。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_low_latency_mode\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_low_latency_mode),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_low_latency_mode\", $$v)},expression:\"settingsStore.settings.tv_low_latency_mode\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"デフォルトのパネルの表示状態\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 視聴画面を開いたときに、右側のパネルをどう表示するかを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.panel_display_state},model:{value:(_vm.settingsStore.settings.panel_display_state),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"panel_display_state\", $$v)},expression:\"settingsStore.settings.panel_display_state\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"テレビをみるときにデフォルトで表示されるパネルのタブ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" テレビの視聴画面を開いたときに、右側のパネルで最初に表示されるタブを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tv_panel_active_tab},model:{value:(_vm.settingsStore.settings.tv_panel_active_tab),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_panel_active_tab\", $$v)},expression:\"settingsStore.settings.tv_panel_active_tab\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\"チャンネル選局のキーボードショートカットを \"+_vm._s(_vm.Utils.AltOrOption())+\" + 数字キー/テンキーに変更する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"tv_show_superimpose\"}},[_vm._v(\" この設定をオンにすると、数字キーまたはテンキーに対応するリモコン番号(1~12)のチャンネルに切り替える際、\"+_vm._s(_vm.Utils.AltOrOption())+\" キーを同時に押す必要があります。\"),_c('br'),_vm._v(\" コメントやツイートを入力しようとして誤って数字キーを押してしまい、チャンネルが変わってしまう事態を避けたい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"tv_show_superimpose\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.tv_channel_selection_requires_alt_key),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tv_channel_selection_requires_alt_key\", $$v)},expression:\"settingsStore.settings.tv_channel_selection_requires_alt_key\"}})],1),_c('v-divider',{staticClass:\"mt-6\"}),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"設定をエクスポート\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" このデバイス(ブラウザ)に保存されている設定データを、エクスポート(ダウンロード)できます。\"),_c('br'),_vm._v(\" ダウンロードした設定データ (KonomiTV-Settings.json) は、[設定をインポート] からインポートできます。異なるサーバーの KonomiTV を同じ設定で使いたいときなどに使ってください。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button mt-4\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.exportSettings()}}},[_c('Icon',{staticClass:\"mr-3\",attrs:{\"icon\":\"fa6-solid:download\",\"height\":\"19px\"}}),_vm._v(\"設定をエクスポート \")],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"設定をインポート\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" [設定をエクスポート] でダウンロードした設定データを、このデバイス(ブラウザ)にインポートできます。\"),_c('br'),_vm._v(\" 設定をインポートすると、\"),_c('b',[_vm._v(\"現在のデバイス設定はすべて上書きされます。\")]),_vm._v(\"元に戻すことはできません。\"),_c('br'),_vm._v(\" 設定のデバイス間同期がオンのときは、\"),_c('b',[_vm._v(\"同期が有効なすべてのデバイスに反映されます。\")]),_vm._v(\"十分ご注意ください。\"),_c('br')]),_c('v-file-input',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"設定データ (KonomiTV-Settings.json) を選択\",\"dense\":_vm.is_form_dense,\"accept\":\"application/json\",\"prepend-icon\":\"\",\"prepend-inner-icon\":\"mdi-paperclip\"},model:{value:(_vm.import_settings_file),callback:function ($$v) {_vm.import_settings_file=$$v},expression:\"import_settings_file\"}})],1),_c('v-btn',{staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.importSettings()}}},[_c('Icon',{staticClass:\"mr-3\",attrs:{\"icon\":\"fa6-solid:upload\",\"height\":\"19px\"}}),_vm._v(\"設定をインポート \")],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading error--text text--lighten-1\"},[_vm._v(\"設定を初期状態にリセット\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" このデバイス(ブラウザ)に保存されている設定データを、初期状態のデフォルト値にリセットできます。\"),_c('br'),_vm._v(\" 設定をリセットすると、元に戻すことはできません。\"),_c('br'),_vm._v(\" 設定のデバイス間同期がオンのときは、\"),_c('b',[_vm._v(\"同期が有効なすべてのデバイスに反映されます。\")]),_vm._v(\"十分ご注意ください。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button error mt-5\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.resetSettings()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"material-symbols:device-reset-rounded\",\"height\":\"23px\"}}),_vm._v(\"設定をリセット \")],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { PlayerUtils } from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nconst QUALITY_H264 = [\n {text: '1080p (60fps) (約4.50GB/h / 平均10.0Mbps)', value: '1080p-60fps'},\n {text: '1080p (約4.50GB/h / 平均10.0Mbps)', value: '1080p'},\n {text: '810p (約2.62GB/h / 平均5.8Mbps)', value: '810p'},\n {text: '720p (約2.18GB/h / 平均4.9Mbps)', value: '720p'},\n {text: '540p (約1.52GB/h / 平均3.4Mbps)', value: '540p'},\n {text: '480p (約1.06GB/h / 平均2.3Mbps)', value: '480p'},\n {text: '360p (約0.60GB/h / 平均1.3Mbps)', value: '360p'},\n {text: '240p (約0.35GB/h / 平均0.8Mbps)', value: '240p'},\n];\n\nconst QUALITY_H265 = [\n {text: '1080p (60fps) (約1.80GB/h / 平均4.0Mbps)', value: '1080p-60fps'},\n {text: '1080p (約1.37GB/h / 平均3.0Mbps)', value: '1080p'},\n {text: '810p (約1.05GB/h / 平均2.3Mbps)', value: '810p'},\n {text: '720p (約0.82GB/h / 平均1.8Mbps)', value: '720p'},\n {text: '540p (約0.53GB/h / 平均1.2Mbps)', value: '540p'},\n {text: '480p (約0.46GB/h / 平均1.0Mbps)', value: '480p'},\n {text: '360p (約0.30GB/h / 平均0.7Mbps)', value: '360p'},\n {text: '240p (約0.20GB/h / 平均0.4Mbps)', value: '240p'},\n];\n\nexport default Vue.extend({\n name: 'Settings-General',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n PlayerUtils: PlayerUtils,\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // テレビのデフォルトのストリーミング画質の選択肢\n tv_streaming_quality: QUALITY_H264,\n\n // デフォルトのパネルの表示状態の選択肢\n panel_display_state: [\n {text: '前回の状態を復元する', value: 'RestorePreviousState'},\n {text: '常に表示する', value: 'AlwaysDisplay'},\n {text: '常に折りたたむ', value: 'AlwaysFold'},\n ],\n\n // テレビをみるときにデフォルトで表示されるパネルのタブの選択肢\n tv_panel_active_tab: [\n {text: '番組情報タブ', value: 'Program'},\n {text: 'チャンネルタブ', value: 'Channel'},\n {text: 'コメントタブ', value: 'Comment'},\n {text: 'Twitter タブ', value: 'Twitter'},\n ],\n\n // 選択された設定データ (KonomiTV-Settings.json) が入る\n import_settings_file: null as File | null,\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n },\n created() {\n if (this.settingsStore.settings.tv_data_saver_mode === true) {\n this.tv_streaming_quality = QUALITY_H265;\n }\n },\n watch: {\n 'settingsStore.settings.tv_data_saver_mode': {\n immediate: true,\n handler(val: boolean) {\n if (val === true) {\n this.tv_streaming_quality = QUALITY_H265;\n } else {\n this.tv_streaming_quality = QUALITY_H264;\n }\n },\n }\n },\n methods: {\n\n // 設定データをエクスポートする\n exportSettings() {\n\n // 設定データを JSON 化して取得\n const settings_json = JSON.stringify(this.settingsStore.settings, null, 4);\n\n // ダウンロードさせるために一旦 Blob にしてから、KonomiTV-Settings.json としてダウンロード\n const settings_json_blob = new Blob([settings_json], {type: 'application/json'});\n Utils.downloadBlobData(settings_json_blob, 'KonomiTV-Settings.json');\n this.$message.success('設定をエクスポートしました。');\n },\n\n // 設定データをインポートする\n async importSettings() {\n\n // 設定データが選択されていないときは実行しない\n if (this.import_settings_file === null) {\n this.$message.error('インポートする設定データを選択してください!');\n return;\n }\n\n // 設定データのインポートを実行\n const result = await this.settingsStore.importClientSettings(this.import_settings_file);\n if (result === true) {\n this.$message.success('設定をインポートしました。');\n window.setTimeout(() => this.$router.go(0), 300);\n } else {\n this.$message.error('設定データが不正なため、インポートできませんでした。');\n }\n },\n\n // 設定データをリセットする\n async resetSettings() {\n await this.settingsStore.resetClientSettings();\n this.$message.success('設定をリセットしました。');\n window.setTimeout(() => this.$router.go(0), 300);\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./General.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./General.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./General.vue?vue&type=template&id=6630baba&\"\nimport script from \"./General.vue?vue&type=script&lang=ts&\"\nexport * from \"./General.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('v-card',{staticClass:\"settings-container d-flex px-5 py-5 mx-auto background\",attrs:{\"elevation\":\"0\",\"width\":\"100%\",\"max-width\":\"1000\"}},[_c('v-navigation-drawer',{staticClass:\"settings-navigation flex-shrink-0 background\",attrs:{\"permanent\":\"\",\"width\":\"100%\",\"height\":\"auto\"}},[_c('v-list-item',{staticClass:\"px-1\"},[_c('v-list-item-content',[_c('h1',[_vm._v(\"設定\")])])],1),_c('v-list',{staticClass:\"mt-2 px-0\",attrs:{\"nav\":\"\"}},[_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/general\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 3px\"},attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"全般\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/caption\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:subtitles-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"字幕\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/data-broadcasting\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('svg',{attrs:{\"width\":\"26px\",\"height\":\"26px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})])]),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"データ放送\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/capture\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:image-multiple-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"キャプチャ\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/account\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-20-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"アカウント\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/jikkyo\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 2px\"},attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"ニコニコ実況\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/twitter\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{staticStyle:{\"padding\":\"0 1px\"},attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"Twitter\")])],1)],1),_c('v-list-item',{staticClass:\"px-4\",attrs:{\"link\":\"\",\"color\":\"primary\",\"to\":\"/settings/server\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:server-surface-16-filled\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\"サーバー設定\")])],1)],1),_c('v-list-item',{staticClass:\"px-4 settings-navigation-version\",class:{'settings-navigation-version--highlight': _vm.versionStore.is_update_available},attrs:{\"link\":\"\",\"color\":\"primary\",\"href\":\"https://github.com/tsukumijima/KonomiTV\"}},[_c('v-list-item-icon',{staticClass:\"mr-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:info-16-regular\",\"width\":\"26px\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" version \"+_vm._s(_vm.versionStore.client_version)+_vm._s(_vm.versionStore.is_update_available ? ' (Update Available)' : '')+\" \")])],1)],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useVersionStore from '@/store/VersionStore';\n\nexport default Vue.extend({\n name: 'Settings-Index',\n components: {\n Header,\n Navigation,\n },\n computed: {\n ...mapStores(useVersionStore),\n },\n async created() {\n await this.versionStore.fetchServerVersion();\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Index.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Index.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Index.vue?vue&type=template&id=51859415&scoped=true&\"\nimport script from \"./Index.vue?vue&type=script&lang=ts&\"\nexport * from \"./Index.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Index.vue?vue&type=style&index=0&id=51859415&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"51859415\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"19px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"ニコニコ実況\")])],1),_c('div',{staticClass:\"settings__content\",class:{'settings__content--loading': _vm.is_loading}},[(_vm.userStore.user === null || _vm.userStore.user.niconico_user_id === null)?_c('div',{staticClass:\"niconico-account niconico-account--anonymous\"},[_c('div',{staticClass:\"niconico-account-wrapper\"},[_c('Icon',{staticClass:\"flex-shrink-0\",attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"45px\"}}),_c('div',{staticClass:\"niconico-account__info ml-4\"},[_c('div',{staticClass:\"niconico-account__info-name\"},[_c('span',{staticClass:\"niconico-account__info-name-text\"},[_vm._v(\"ニコニコアカウントと連携していません\")])]),_c('span',{staticClass:\"niconico-account__info-description\"},[_vm._v(\" ニコニコアカウントと連携すると、テレビを見ながらニコニコ実況にコメントできるようになります。 \")])])],1),_c('v-btn',{staticClass:\"niconico-account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"130\",\"height\":\"56\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.loginNiconicoAccount()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-connected-20-filled\",\"height\":\"26\"}}),_vm._v(\"連携する \")],1)],1):_vm._e(),(_vm.userStore.user !== null && _vm.userStore.user.niconico_user_id !== null)?_c('div',{staticClass:\"niconico-account\"},[_c('div',{staticClass:\"niconico-account-wrapper\"},[_c('img',{staticClass:\"niconico-account__icon\",attrs:{\"src\":_vm.userStore.user_niconico_icon_url ?? ''}}),_c('div',{staticClass:\"niconico-account__info\"},[_c('div',{staticClass:\"niconico-account__info-name\"},[_c('span',{staticClass:\"niconico-account__info-name-text\"},[_vm._v(_vm._s(_vm.userStore.user.niconico_user_name)+\" と連携しています\")])]),_c('span',{staticClass:\"niconico-account__info-description\"},[_c('span',{staticClass:\"mr-2\",staticStyle:{\"white-space\":\"nowrap\"}},[_vm._v(\"Niconico User ID:\")]),_c('a',{staticClass:\"mr-2\",attrs:{\"href\":`https://www.nicovideo.jp/user/${_vm.userStore.user.niconico_user_id}`,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.userStore.user.niconico_user_id))]),(_vm.userStore.user.niconico_user_premium === true)?_c('span',{staticClass:\"secondary--text\"},[_vm._v(\"(Premium)\")]):_vm._e()])])]),_c('v-btn',{staticClass:\"niconico-account__login ml-auto\",attrs:{\"color\":\"secondary\",\"width\":\"130\",\"height\":\"56\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.logoutNiconicoAccount()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-disconnected-20-filled\",\"height\":\"26\"}}),_vm._v(\"連携解除 \")],1)],1):_vm._e(),_c('div',{staticClass:\"settings__item mt-7\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"コメントのミュート設定\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 表示したくないコメントを、映像上やコメントリストに表示しないようにミュートできます。\"),_c('br')])]),_c('v-btn',{staticClass:\"settings__save-button mt-4\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){_vm.comment_mute_settings_modal = !_vm.comment_mute_settings_modal}}},[_c('Icon',{attrs:{\"icon\":\"heroicons-solid:filter\",\"height\":\"19px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"コメントのミュート設定を開く\")])],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"コメントの速さ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" プレイヤーに流れるコメントの速さを設定します。\"),_c('br'),_vm._v(\" たとえば 1.2 に設定すると、コメントが 1.2 倍速く流れます。\"),_c('br')]),_c('v-slider',{staticClass:\"settings__item-form\",attrs:{\"ticks\":\"always\",\"thumb-label\":\"\",\"hide-details\":\"\",\"step\":0.1,\"min\":0.5,\"max\":2},model:{value:(_vm.settingsStore.settings.comment_speed_rate),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"comment_speed_rate\", $$v)},expression:\"settingsStore.settings.comment_speed_rate\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"コメントの文字サイズ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" プレイヤーに流れるコメントの文字サイズの基準値を設定します。\"),_c('br'),_vm._v(\" 実際の文字サイズは画面サイズに合わせて調整されます。デフォルトの文字サイズは 34px です。\"),_c('br')]),_c('v-slider',{staticClass:\"settings__item-form\",attrs:{\"ticks\":\"always\",\"thumb-label\":\"\",\"hide-details\":\"\",\"min\":20,\"max\":60},model:{value:(_vm.settingsStore.settings.comment_font_size),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"comment_font_size\", $$v)},expression:\"settingsStore.settings.comment_font_size\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"close_comment_form_after_sending\"}},[_vm._v(\"コメント送信後にコメント入力フォームを閉じる\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"close_comment_form_after_sending\"}},[_vm._v(\" この設定をオンにすると、コメントを送信した後に、コメント入力フォームが自動で閉じるようになります。\"),_c('br'),_vm._v(\" コメント入力フォームが表示されたままだと、大半のショートカットキーが文字入力と競合して使えなくなります。とくに理由がなければ、オンにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"close_comment_form_after_sending\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.close_comment_form_after_sending),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"close_comment_form_after_sending\", $$v)},expression:\"settingsStore.settings.close_comment_form_after_sending\"}})],1)],1),_c('CommentMuteSettings',{model:{value:(_vm.comment_mute_settings_modal),callback:function ($$v) {_vm.comment_mute_settings_modal=$$v},expression:\"comment_mute_settings_modal\"}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('v-dialog',{attrs:{\"max-width\":\"770\",\"transition\":\"slide-y-transition\"},model:{value:(_vm.comment_mute_settings_modal),callback:function ($$v) {_vm.comment_mute_settings_modal=$$v},expression:\"comment_mute_settings_modal\"}},[_c('v-card',{staticClass:\"comment-mute-settings\"},[_c('v-card-title',{staticClass:\"px-5 pt-5 pb-3 d-flex align-center font-weight-bold\",staticStyle:{\"height\":\"60px\"}},[_c('Icon',{attrs:{\"icon\":\"heroicons-solid:filter\",\"height\":\"26px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"コメントのミュート設定\")]),_c('v-spacer'),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"d-flex align-center rounded-circle cursor-pointer px-2 py-2\",on:{\"click\":function($event){_vm.comment_mute_settings_modal = false}}},[_c('Icon',{attrs:{\"icon\":\"fluent:dismiss-12-filled\",\"width\":\"23px\",\"height\":\"23px\"}})],1)],1),_c('div',{staticClass:\"px-5 pb-5\"},[_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold mt-4\"},[_c('Icon',{attrs:{\"icon\":\"fa-solid:sliders-h\",\"width\":\"24px\",\"height\":\"20px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"クイック設定\")])],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_vulgar_comments\"}},[_vm._v(\" 露骨な表現を含むコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_vulgar_comments\"}},[_vm._v(\" 性的な単語などの露骨・下品な表現を含むコメントを、一括でミュートするかを設定します。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_vulgar_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_vulgar_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_vulgar_comments\", $$v)},expression:\"settingsStore.settings.mute_vulgar_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_abusive_discriminatory_prejudiced_comments\"}},[_vm._v(\" ネガティブな表現、差別的な表現、政治的に偏った表現を含むコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_abusive_discriminatory_prejudiced_comments\"}},[_vm._v(\" 『死ね』『殺す』などのネガティブな表現、特定の国や人々への差別的な表現、政治的に偏った表現を含むコメントを、一括でミュートするかを設定します。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_abusive_discriminatory_prejudiced_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_abusive_discriminatory_prejudiced_comments\", $$v)},expression:\"settingsStore.settings.mute_abusive_discriminatory_prejudiced_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_big_size_comments\"}},[_vm._v(\" 文字サイズが大きいコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_big_size_comments\"}},[_vm._v(\" 通常より大きい文字サイズで表示されるコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" 文字サイズが大きいコメントには迷惑なコメントが多いです。基本的にはオンにしておくのがおすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_big_size_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_big_size_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_big_size_comments\", $$v)},expression:\"settingsStore.settings.mute_big_size_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_fixed_comments\"}},[_vm._v(\" 映像の上下に固定表示されるコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_fixed_comments\"}},[_vm._v(\" 映像の上下に固定された状態で表示されるコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" 固定表示されるコメントが煩わしい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_fixed_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_fixed_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_fixed_comments\", $$v)},expression:\"settingsStore.settings.mute_fixed_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_colored_comments\"}},[_vm._v(\" 色付きのコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_colored_comments\"}},[_vm._v(\" 白以外の色で表示される色付きのコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" この設定をオンにしておくと、目立つ色のコメントを一掃できます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_colored_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_colored_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_colored_comments\", $$v)},expression:\"settingsStore.settings.mute_colored_comments\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"mute_consecutive_same_characters_comments\"}},[_vm._v(\" 8文字以上同じ文字が連続しているコメントをミュートする \")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"mute_consecutive_same_characters_comments\"}},[_vm._v(\" 『wwwwwwwwwww』『あばばばばばばばばば』など、8文字以上同じ文字が連続しているコメントを、一括でミュートするかを設定します。\"),_c('br'),_vm._v(\" しばしばあるテンプレコメントが煩わしい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"mute_consecutive_same_characters_comments\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.mute_consecutive_same_characters_comments),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"mute_consecutive_same_characters_comments\", $$v)},expression:\"settingsStore.settings.mute_consecutive_same_characters_comments\"}})],1),_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold mt-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:comment-dismiss-20-filled\",\"width\":\"24px\"}}),_c('span',{staticClass:\"ml-2 mr-2\"},[_vm._v(\"ミュート済みのキーワード\")]),_c('v-btn',{staticClass:\"ml-auto\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.settingsStore.settings.muted_comment_keywords.push({match: 'partial', pattern: ''})}}},[_c('Icon',{attrs:{\"icon\":\"fluent:add-12-filled\",\"height\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"追加\")])],1)],1),_c('div',{staticClass:\"muted-comment-items\"},_vm._l((_vm.settingsStore.settings.muted_comment_keywords),function(muted_comment_keyword,index){return _c('div',{key:index,staticClass:\"muted-comment-item\"},[_c('v-text-field',{staticClass:\"muted-comment-item__input\",attrs:{\"type\":\"search\",\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"ミュートするキーワードを入力\"},model:{value:(_vm.settingsStore.settings.muted_comment_keywords[index].pattern),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings.muted_comment_keywords[index], \"pattern\", $$v)},expression:\"settingsStore.settings.muted_comment_keywords[index].pattern\"}}),_c('v-select',{staticClass:\"muted-comment-item__match-type\",attrs:{\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\",\"items\":_vm.muted_comment_keyword_match_type},model:{value:(_vm.settingsStore.settings.muted_comment_keywords[index].match),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings.muted_comment_keywords[index], \"match\", $$v)},expression:\"settingsStore.settings.muted_comment_keywords[index].match\"}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"muted-comment-item__delete-button\",on:{\"click\":function($event){_vm.settingsStore.settings.muted_comment_keywords\n .splice(_vm.settingsStore.settings.muted_comment_keywords.indexOf(muted_comment_keyword), 1)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:delete-16-filled\",\"width\":\"20px\"}})],1)],1)}),0),_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold mt-4\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-prohibited-20-filled\",\"width\":\"24px\"}}),_c('span',{staticClass:\"ml-2 mr-2\"},[_vm._v(\"ミュート済みのニコニコユーザー ID\")]),_c('v-btn',{staticClass:\"ml-auto\",attrs:{\"depressed\":\"\"},on:{\"click\":function($event){return _vm.settingsStore.settings.muted_niconico_user_ids.push('')}}},[_c('Icon',{attrs:{\"icon\":\"fluent:add-12-filled\",\"height\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"追加\")])],1)],1),_c('div',{staticClass:\"muted-comment-items\"},_vm._l((_vm.settingsStore.settings.muted_niconico_user_ids),function(muted_niconico_user_id,index){return _c('div',{key:index,staticClass:\"muted-comment-item\"},[_c('v-text-field',{staticClass:\"muted-comment-item__input\",attrs:{\"type\":\"search\",\"dense\":\"\",\"outlined\":\"\",\"hide-details\":\"\",\"placeholder\":\"ミュートするニコニコユーザー ID を入力\"},model:{value:(_vm.settingsStore.settings.muted_niconico_user_ids[index]),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings.muted_niconico_user_ids, index, $$v)},expression:\"settingsStore.settings.muted_niconico_user_ids[index]\"}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"muted-comment-item__delete-button\",on:{\"click\":function($event){_vm.settingsStore.settings.muted_niconico_user_ids\n .splice(_vm.settingsStore.settings.muted_niconico_user_ids.indexOf(muted_niconico_user_id), 1)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:delete-16-filled\",\"width\":\"20px\"}})],1)],1)}),0)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue, { PropType } from 'vue';\n\nimport useSettingsStore from '@/store/SettingsStore';\n\nexport default Vue.extend({\n name: 'CommentMuteSettings',\n // カスタム v-model を実装する\n // ref: https://jp.vuejs.org/v2/guide/components-custom-events.html\n model: {\n prop: 'showing', // v-model で渡された値が \"showing\" props に入る\n event: 'change', // \"change\" イベントで親コンポーネントに反映\n },\n props: {\n // コメントのミュート設定のモーダルを表示するか\n showing: {\n type: Boolean as PropType,\n required: true,\n }\n },\n data() {\n return {\n\n // インターバルのタイマー ID\n interval_timer_id: 0,\n\n // コメントのミュート設定のモーダルを表示するか\n comment_mute_settings_modal: false,\n\n // ミュート済みのキーワードのマッチタイプ\n muted_comment_keyword_match_type: [\n {text: '部分一致', value: 'partial'},\n {text: '前方一致', value: 'forward'},\n {text: '後方一致', value: 'backward'},\n {text: '完全一致', value: 'exact'},\n {text: '正規表現', value: 'regex'},\n ],\n };\n },\n computed: {\n // SettingsStore に this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore),\n },\n watch: {\n\n // showing (親コンポーネント側) の変更を監視し、変更されたら comment_mute_settings_modal に反映する\n showing() {\n this.comment_mute_settings_modal = this.showing as boolean;\n },\n\n // comment_mute_settings_modal (子コンポーネント側) の変更を監視し、変更されたら this.$emit() で親コンポーネントに伝える\n comment_mute_settings_modal() {\n this.$emit('change', this.comment_mute_settings_modal);\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CommentMuteSettings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./CommentMuteSettings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./CommentMuteSettings.vue?vue&type=template&id=2cd59ba0&scoped=true&\"\nimport script from \"./CommentMuteSettings.vue?vue&type=script&lang=ts&\"\nexport * from \"./CommentMuteSettings.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./CommentMuteSettings.vue?vue&type=style&index=0&id=2cd59ba0&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2cd59ba0\",\n null\n \n)\n\nexport default component.exports","\nimport APIClient from '@/services/APIClient';\n\n\n/** ニコニコアカウントと連携するための認証 URL を表すインターフェイス */\nexport interface INiconicoAuthURL {\n authorization_url: string;\n}\n\n\nclass Niconico {\n\n /**\n * ニコニコアカウントと連携するための認証 URL を取得する\n * @returns 認証 URL or 認証 URL の取得に失敗した場合は null\n */\n static async fetchAuthorizationURL(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/niconico/auth');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'ニコニコアカウントとの連携用の認証 URL を取得できませんでした。');\n return null;\n }\n\n return response.data.authorization_url;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントに紐づくニコニコアカウントとの連携を解除する\n * @returns 連携解除に成功した場合は true, 失敗した場合は false\n */\n static async logoutAccount(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.delete('/niconico/logout');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'ニコニコアカウントとの連携を解除できませんでした。');\n return false;\n }\n\n return true;\n }\n}\n\nexport default Niconico;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport CommentMuteSettings from '@/components/Settings/CommentMuteSettings.vue';\nimport Niconico from '@/services/Niconico';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Jikkyo',\n components: {\n SettingsBase,\n CommentMuteSettings,\n },\n data() {\n return {\n\n // コメントのミュート設定のモーダルを表示するか\n comment_mute_settings_modal: false,\n\n // ローディング中かどうか\n is_loading: true,\n };\n },\n computed: {\n // SettingsStore / UserStore に this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ローディング状態を解除\n this.is_loading = false;\n\n // もしハッシュ (# から始まるフラグメント) に何か指定されていたら、\n // OAuth 連携のコールバックの結果が入っている可能性が高いので、パースを試みる\n // アカウント情報更新より後にしないと Snackbar がうまく表示されない\n if (location.hash !== '') {\n const params = new URLSearchParams(location.hash.replace('#', ''));\n if (params.get('status') !== null && params.get('detail') !== null) {\n // コールバックの結果を取得できたので、OAuth 連携の結果を画面に通知する\n const authorization_status = parseInt(params.get('status')!);\n const authorization_detail = params.get('detail')!;\n this.onOAuthCallbackReceived(authorization_status, authorization_detail);\n // URL からフラグメントを削除\n // ref: https://stackoverflow.com/a/49373716/17124142\n history.replaceState(null, '', ' ');\n }\n }\n },\n methods: {\n async loginNiconicoAccount() {\n\n // ログインしていない場合はエラーにする\n if (this.userStore.is_logged_in === false) {\n this.$message.warning('連携をはじめるには、KonomiTV アカウントにログインしてください。');\n return;\n }\n\n // ニコニコアカウントと連携するための認証 URL を取得\n const authorization_url = await Niconico.fetchAuthorizationURL();\n if (authorization_url === null) {\n return;\n }\n\n // モバイルデバイスではポップアップが事実上使えない (特に Safari ではブロックされてしまう) ので、素直にリダイレクトで実装する\n if (Utils.isMobileDevice() === true) {\n location.href = authorization_url;\n return;\n }\n\n // OAuth 連携のため、認証 URL をポップアップウインドウで開く\n // window.open() の第2引数はユニークなものにしておくと良いらしい\n // ref: https://qiita.com/catatsuy/items/babce8726ea78f5d25b1 (大変参考になりました)\n const popup_window = window.open(authorization_url, 'KonomiTV-OAuthPopup', Utils.getWindowFeatures());\n if (popup_window === null) {\n this.$message.error('ポップアップウインドウを開けませんでした。');\n return;\n }\n\n // 認証完了 or 失敗後、ポップアップウインドウから送信される文字列を受信\n const onMessage = async (event) => {\n\n // すでにウインドウが閉じている場合は実行しない\n if (popup_window.closed) return;\n\n // 受け取ったオブジェクトに KonomiTV-OAuthPopup キーがない or そもそもオブジェクトではない際は実行しない\n // ブラウザの拡張機能から結構余計な message が飛んでくるっぽい…。\n if (Utils.typeof(event.data) !== 'object') return;\n if (('KonomiTV-OAuthPopup' in event.data) === false) return;\n\n // 認証は完了したので、ポップアップウインドウを閉じ、リスナーを解除する\n if (popup_window) popup_window.close();\n window.removeEventListener('message', onMessage);\n\n // ステータスコードと詳細メッセージを取得\n const authorization_status = event.data['KonomiTV-OAuthPopup']['status'] as number;\n const authorization_detail = event.data['KonomiTV-OAuthPopup']['detail'] as string;\n this.onOAuthCallbackReceived(authorization_status, authorization_detail);\n };\n\n // postMessage() を受信するリスナーを登録\n window.addEventListener('message', onMessage);\n },\n\n async onOAuthCallbackReceived(authorization_status: number, authorization_detail: string) {\n console.log(`NiconicoAuthCallbackAPI: Status: ${authorization_status} / Detail: ${authorization_detail}`);\n\n // OAuth 連携に失敗した\n if (authorization_status !== 200) {\n if (authorization_detail.startsWith('Authorization was denied (access_denied)')) {\n this.$message.error('ニコニコアカウントとの連携がキャンセルされました。');\n } else if (authorization_detail.startsWith('Failed to get access token (HTTP Error ')) {\n const error = authorization_detail.replace('Failed to get access token ', '');\n this.$message.error(`アクセストークンの取得に失敗しました。${error}`);\n } else if (authorization_detail.startsWith('Failed to get access token (Connection Timeout)')) {\n this.$message.error('アクセストークンの取得に失敗しました。ニコニコで障害が発生している可能性があります。');\n } else if (authorization_detail.startsWith('Failed to get user information (HTTP Error ')) {\n const error = authorization_detail.replace('Failed to get user information ', '');\n this.$message.error(`ニコニコアカウントのユーザー情報の取得に失敗しました。${error}`);\n } else if (authorization_detail.startsWith('Failed to get user information (Connection Timeout)')) {\n this.$message.error('ニコニコアカウントのユーザー情報の取得に失敗しました。ニコニコで障害が発生している可能性があります。');\n } else {\n this.$message.error(`ニコニコアカウントとの連携に失敗しました。(${authorization_detail})`);\n }\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n\n this.$message.success('ニコニコアカウントと連携しました。');\n },\n\n async logoutNiconicoAccount() {\n\n // ニコニコアカウント連携解除 API にリクエスト\n const result = await Niconico.logoutAccount();\n if (result === false) {\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n\n this.$message.success('ニコニコアカウントとの連携を解除しました。');\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Jikkyo.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Jikkyo.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Jikkyo.vue?vue&type=template&id=3ff16abd&scoped=true&\"\nimport script from \"./Jikkyo.vue?vue&type=script&lang=ts&\"\nexport * from \"./Jikkyo.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Jikkyo.vue?vue&type=style&index=0&id=3ff16abd&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3ff16abd\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fluent:server-surface-16-filled\",\"width\":\"22px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"サーバー設定\")])],1),_c('div',{staticClass:\"settings__content\"},[_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"鋭意開発中…\")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport Vue from 'vue';\n\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Server',\n components: {\n SettingsBase,\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Server.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Server.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Server.vue?vue&type=template&id=7cf86dbd&\"\nimport script from \"./Server.vue?vue&type=script&lang=ts&\"\nexport * from \"./Server.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('SettingsBase',[_c('h2',{staticClass:\"settings__heading\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"settings__back-button\",attrs:{\"to\":\"/settings/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('Icon',{attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"22px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"Twitter\")])],1),_c('div',{staticClass:\"settings__content\",class:{'settings__content--loading': _vm.is_loading}},[_c('div',{staticClass:\"twitter-accounts\"},[(_vm.userStore.user !== null && _vm.userStore.user.twitter_accounts.length > 0)?_c('div',{staticClass:\"twitter-accounts__heading\"},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:person-board-20-filled\",\"height\":\"30\"}}),_vm._v(\"連携中のアカウント \")],1):_vm._e(),(_vm.userStore.user === null || _vm.userStore.user.twitter_accounts.length === 0)?_c('div',{staticClass:\"twitter-accounts__guide\"},[_c('Icon',{staticClass:\"flex-shrink-0\",attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"45px\"}}),_c('div',{staticClass:\"ml-4\"},[_c('div',{staticClass:\"font-weight-bold text-h6\"},[_vm._v(\"Twitter アカウントと連携していません\")]),_c('div',{staticClass:\"text--text text--darken-1 text-subtitle-2 mt-1\"},[_vm._v(\" Twitter アカウントと連携すると、テレビを見ながら Twitter にツイートしたり、ほかの実況ツイートをリアルタイムで表示できるようになります。 \")])])],1):_vm._e(),_vm._l(((_vm.userStore.user !== null ? _vm.userStore.user.twitter_accounts: [])),function(twitter_account){return _c('div',{key:twitter_account.id,staticClass:\"twitter-account\"},[_c('img',{staticClass:\"twitter-account__icon\",attrs:{\"src\":twitter_account.icon_url}}),_c('div',{staticClass:\"twitter-account__info\"},[_c('div',{staticClass:\"twitter-account__info-name\"},[_c('span',{staticClass:\"twitter-account__info-name-text\"},[_vm._v(_vm._s(twitter_account.name))])]),_c('span',{staticClass:\"twitter-account__info-screen-name\"},[_vm._v(\" @\"+_vm._s(twitter_account.screen_name)+\" \"),(twitter_account.is_oauth_session === true)?_c('span',[_vm._v(\"(Legacy Session)\")]):_vm._e()])]),_c('v-btn',{staticClass:\"twitter-account__logout ml-auto\",attrs:{\"width\":\"124\",\"height\":\"52\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.logoutTwitterAccount(twitter_account.screen_name)}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-disconnected-20-filled\",\"height\":\"24\"}}),_vm._v(\"連携解除 \")],1)],1)}),_c('v-btn',{staticClass:\"twitter-account__login\",attrs:{\"color\":\"secondary\",\"max-width\":\"250\",\"height\":\"50\",\"depressed\":\"\"},on:{\"click\":function($event){return _vm.loginTwitterAccountWithPasswordForm()}}},[_c('Icon',{staticClass:\"mr-2\",attrs:{\"icon\":\"fluent:plug-connected-20-filled\",\"height\":\"24\"}}),_vm._v(\"連携するアカウントを追加 \")],1),_c('v-dialog',{attrs:{\"max-width\":\"600\"},model:{value:(_vm.twitter_password_auth_dialog),callback:function ($$v) {_vm.twitter_password_auth_dialog=$$v},expression:\"twitter_password_auth_dialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"justify-center pt-6 font-weight-bold\"},[_vm._v(\"Twitter にログイン\")]),_c('v-card-text',{staticClass:\"pt-2 pb-0\"},[_c('p',{staticClass:\"mb-1\"},[_vm._v(\"2023/07 以降、Twitter のサードパーティー API の事実上の廃止により、従来のアプリ連携では Twitter にアクセスできなくなりました。\")]),_c('p',{staticClass:\"mb-1\"},[_vm._v(\"そこで KonomiTV では、代わりに \"),_c('a',{attrs:{\"href\":\"https://github.com/tsukumijima/tweepy-authlib\",\"target\":\"_blank\"}},[_vm._v(\"ユーザー名とパスワードでログイン\")]),_vm._v(\" することで、これまで通り Twitter 連携ができるようにしています (2要素認証を設定しているアカウントには対応していません) 。\")]),_c('p',{staticClass:\"mb-1\"},[_vm._v(\"ここで入力したパスワードは一切保存されず、取得した Cookie セッションはローカルの KonomiTV サーバーにのみ保存されます。Cookie セッションが Twitter API 以外の外部サービスに送信されることはありません。\")]),_c('p',{staticClass:\"mb-1\"},[_vm._v(\"万全は期していますが、非公式な方法のため、使い方次第ではアカウントにペナルティが適用される可能性もあります。自己の責任のもとでご利用ください。\")]),_c('v-form',{ref:\"twitter_form\",staticClass:\"settings__item\",on:{\"submit\":function($event){$event.preventDefault();}}},[_c('v-text-field',{ref:\"twitter_screen_name\",staticClass:\"settings__item-form mt-6\",attrs:{\"outlined\":\"\",\"label\":\"ユーザー名 (@ から始まる ID)\",\"placeholder\":\"screen_name\",\"dense\":_vm.is_form_dense,\"rules\":[(value) => !!value || 'ユーザー名を入力してください。']},model:{value:(_vm.twitter_screen_name),callback:function ($$v) {_vm.twitter_screen_name=$$v},expression:\"twitter_screen_name\"}}),_c('v-text-field',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"label\":\"パスワード\",\"dense\":_vm.is_form_dense,\"type\":_vm.twitter_password_showing ? 'text' : 'password',\"append-icon\":_vm.twitter_password_showing ? 'mdi-eye' : 'mdi-eye-off',\"rules\":[(value) => !!value || 'パスワードを入力してください。']},on:{\"click:append\":function($event){_vm.twitter_password_showing = !_vm.twitter_password_showing}},model:{value:(_vm.twitter_password),callback:function ($$v) {_vm.twitter_password=$$v},expression:\"twitter_password\"}})],1)],1),_c('v-card-actions',{staticClass:\"pt-0 px-6 pb-5\"},[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"text\",\"height\":\"40\",\"text\":\"\"},on:{\"click\":function($event){_vm.twitter_password_auth_dialog = false}}},[_vm._v(\"キャンセル\")]),_c('v-btn',{staticClass:\"px-4\",attrs:{\"color\":\"secondary\",\"height\":\"40\"},on:{\"click\":function($event){return _vm.loginTwitterAccountWithPassword()}}},[_vm._v(\"ログイン\")])],1)],1)],1)],2),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"fold_panel_after_sending_tweet\"}},[_vm._v(\"ツイート送信後にパネルを折りたたむ\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"fold_panel_after_sending_tweet\"}},[_vm._v(\" この設定をオンにすると、ツイートを送信した後に、パネルが自動で折りたたまれます。\"),_c('br'),_vm._v(\" ツイートするとき以外はできるだけ映像を大きくして見たい方におすすめです。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"fold_panel_after_sending_tweet\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.fold_panel_after_sending_tweet),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"fold_panel_after_sending_tweet\", $$v)},expression:\"settingsStore.settings.fold_panel_after_sending_tweet\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"reset_hashtag_when_program_switches\"}},[_vm._v(\"番組が切り替わったときにハッシュタグフォームをリセットする\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"reset_hashtag_when_program_switches\"}},[_vm._v(\" チャンネルを切り替えたときや、視聴中の番組が終了し次の番組の放送が開始されたときに、ハッシュタグフォームをリセットするかを設定します。\"),_c('br'),_vm._v(\" この設定をオンにしておけば、「誤って前番組のハッシュタグをつけたまま次番組の実況ツイートをしてしまう」といったミスを回避できます。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"reset_hashtag_when_program_switches\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.reset_hashtag_when_program_switches),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"reset_hashtag_when_program_switches\", $$v)},expression:\"settingsStore.settings.reset_hashtag_when_program_switches\"}})],1),_c('div',{staticClass:\"settings__item settings__item--switch\"},[_c('label',{staticClass:\"settings__item-heading\",attrs:{\"for\":\"auto_add_watching_channel_hashtag\"}},[_vm._v(\"視聴中のチャンネルに対応する局タグを自動で追加する\")]),_c('label',{staticClass:\"settings__item-label\",attrs:{\"for\":\"auto_add_watching_channel_hashtag\"}},[_vm._v(\" この設定をオンにすると、視聴中のチャンネルに対応する局タグ (#nhk, #tokyomx など) がハッシュタグフォームに自動で追加されます。\"),_c('br'),_vm._v(\" 現時点で、局タグは三大首都圏の地上波・BS の一部チャンネル・AT-X にのみ対応しています。\"),_c('br')]),_c('v-switch',{staticClass:\"settings__item-switch\",attrs:{\"id\":\"auto_add_watching_channel_hashtag\",\"inset\":\"\",\"hide-details\":\"\"},model:{value:(_vm.settingsStore.settings.auto_add_watching_channel_hashtag),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"auto_add_watching_channel_hashtag\", $$v)},expression:\"settingsStore.settings.auto_add_watching_channel_hashtag\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"デフォルトで表示される Twitter タブ内のタブ\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" 視聴画面を開いたときに、パネルの Twitter タブの中で最初に表示されるタブを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.twitter_active_tab},model:{value:(_vm.settingsStore.settings.twitter_active_tab),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"twitter_active_tab\", $$v)},expression:\"settingsStore.settings.twitter_active_tab\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"ツイートにつけるハッシュタグの位置\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" ツイート本文から見て、ハッシュタグをどの位置につけてツイートするかを設定します。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tweet_hashtag_position},model:{value:(_vm.settingsStore.settings.tweet_hashtag_position),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tweet_hashtag_position\", $$v)},expression:\"settingsStore.settings.tweet_hashtag_position\"}})],1),_c('div',{staticClass:\"settings__item\"},[_c('div',{staticClass:\"settings__item-heading\"},[_vm._v(\"ツイートするキャプチャに番組タイトルの透かしを描画する\")]),_c('div',{staticClass:\"settings__item-label\"},[_vm._v(\" ツイートするキャプチャに、透かしとして視聴中の番組タイトルを描画するかを設定します。\"),_c('br'),_vm._v(\" 透かしの描画位置は 左上・右上・左下・右下 から選択できます。\"),_c('br')]),_c('v-select',{staticClass:\"settings__item-form\",attrs:{\"outlined\":\"\",\"hide-details\":\"\",\"dense\":_vm.is_form_dense,\"items\":_vm.tweet_capture_watermark_position},model:{value:(_vm.settingsStore.settings.tweet_capture_watermark_position),callback:function ($$v) {_vm.$set(_vm.settingsStore.settings, \"tweet_capture_watermark_position\", $$v)},expression:\"settingsStore.settings.tweet_capture_watermark_position\"}})],1)]),_c('v-overlay',{attrs:{\"value\":_vm.is_twitter_password_auth_sending,\"z-index\":\"300\"}},[_c('v-progress-circular',{attrs:{\"color\":\"secondary\",\"indeterminate\":\"\",\"size\":\"64\"}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\nimport Message from '@/message';\nimport APIClient from '@/services/APIClient';\n\n\n/** Twitter アカウントと連携するための認証 URL を表すインターフェイス */\nexport interface ITwitterAuthURL {\n authorization_url: string;\n}\n\n/** ツイートの送信結果を表すインターフェイス */\nexport interface ITweetResult {\n is_success: boolean;\n tweet_url?: string;\n detail: string;\n}\n\nexport interface ITwitterPasswordAuthRequest {\n screen_name: string;\n password: string;\n}\n\n\nclass Twitter {\n\n /**\n * Twitter アカウントと連携するための認証 URL を取得する\n * @returns 認証 URL or 認証 URL の取得に失敗した場合は null\n */\n static async fetchAuthorizationURL(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/twitter/auth');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'Twitter アカウントとの連携用の認証 URL を取得できませんでした。');\n return null;\n }\n\n return response.data.authorization_url;\n }\n\n\n /**\n * Twitter アカウントとパスワード認証で連携する\n * @param twitter_password_auth_request スクリーンネームとパスワード\n * @returns ログインできた場合は true, 失敗した場合は false\n */\n static async authWithPassword(twitter_password_auth_request: ITwitterPasswordAuthRequest): Promise {\n\n // API リクエストを実行\n const response = await APIClient.post('/twitter/password-auth', twitter_password_auth_request);\n\n // エラー処理\n if ('is_error' in response) {\n if (response.error.message.startsWith('Failed to authenticate with password')) {\n const error = response.error.message.match(/Message: (.+)\\)/)![1];\n Message.error(`ログインに失敗しました。${error}`);\n } else if (response.error.message.startsWith('Unexpected error occurred while authenticate with password')) {\n const error = response.error.message.match(/Message: (.+)\\)/)![1];\n Message.error(`ログインフローの途中で予期せぬエラーが発生しました。${error}`);\n } else if (response.error.message.startsWith('Failed to get user information')) {\n Message.error('Twitter アカウントのユーザー情報の取得に失敗しました。');\n } else {\n APIClient.showGenericError(response, 'Twitter アカウントとの連携に失敗しました。');\n }\n return false;\n }\n\n return true;\n }\n\n\n /**\n * 現在ログイン中のユーザーアカウントに紐づく Twitter アカウントとの連携を解除する\n * @param screen_name Twitter のスクリーンネーム\n * @returns 連携解除に成功した場合は true, 失敗した場合は false\n */\n static async logoutAccount(screen_name: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.delete(`/twitter/accounts/${screen_name}`);\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'Twitter アカウントとの連携を解除できませんでした。');\n return false;\n }\n\n return true;\n }\n\n\n /**\n * ツイートを送信する\n * @param screen_name Twitter のスクリーンネーム\n * @param text ツイート本文\n * @param captures 添付するキャプチャ画像\n */\n static async sendTweet(screen_name: string, text: string, captures: Blob[]): Promise<{message: string; is_error: boolean;}> {\n\n // multipart/form-data でツイート本文と画像(選択されている場合)を送る\n const form_data = new FormData();\n form_data.append('tweet', text);\n for (const tweet_capture of captures) {\n form_data.append('images', tweet_capture);\n }\n\n // API リクエストを実行\n const response = await APIClient.post(`/twitter/accounts/${screen_name}/tweets`, form_data, {\n headers: {'Content-Type': 'multipart/form-data'},\n });\n\n // エラー処理 (API リクエスト自体に失敗した場合)\n if ('is_error' in response) {\n if (response.error.message) {\n if (Number.isNaN(response.status)) {\n return {message: `ツイートの送信に失敗しました。(${response.error.message})`, is_error: true};\n } else {\n return {message: `ツイートの送信に失敗しました。(HTTP Error ${response.status} / ${response.error.message})`, is_error: true};\n }\n } else {\n return {message: `ツイートの送信に失敗しました。(HTTP Error ${response.status})`, is_error: true};\n }\n }\n\n // 成功 or 失敗に関わらず detail の内容をそのまま通知する\n if (response.data.is_success === true) {\n // ツイート成功\n return {message: response.data.detail, is_error: false};\n } else {\n // ツイート失敗\n return {message: response.data.detail, is_error: true};\n }\n }\n}\n\nexport default Twitter;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Twitter from '@/services/Twitter';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\nimport SettingsBase from '@/views/Settings/Base.vue';\n\nexport default Vue.extend({\n name: 'Settings-Twitter',\n components: {\n SettingsBase,\n },\n data() {\n return {\n\n // フォームを小さくするかどうか\n is_form_dense: Utils.isSmartphoneHorizontal(),\n\n // デフォルトで表示されるパネルのタブの選択肢\n twitter_active_tab: [\n {text: 'ツイート検索タブ', value: 'Search'},\n {text: 'タイムラインタブ', value: 'Timeline'},\n {text: 'キャプチャタブ', value: 'Capture'},\n ],\n\n // ツイートにつけるハッシュタグの位置の選択肢\n tweet_hashtag_position: [\n {text: 'ツイート本文の前に追加する', value: 'Prepend'},\n {text: 'ツイート本文の後に追加する', value: 'Append'},\n {text: 'ツイート本文の前に追加してから改行する', value: 'PrependWithLineBreak'},\n {text: 'ツイート本文の後に改行してから追加する', value: 'AppendWithLineBreak'},\n ],\n\n // ツイートするキャプチャに番組タイトルの透かしを描画する位置の選択肢\n tweet_capture_watermark_position: [\n {text: '透かしを描画しない', value: 'None'},\n {text: '透かしをキャプチャの左上に描画する', value: 'TopLeft'},\n {text: '透かしをキャプチャの右上に描画する', value: 'TopRight'},\n {text: '透かしをキャプチャの左下に描画する', value: 'BottomLeft'},\n {text: '透かしをキャプチャの右下に描画する', value: 'BottomRight'},\n ],\n\n // ローディング中かどうか\n is_loading: true,\n\n // パスワード認証実行中かどうか\n is_twitter_password_auth_sending: false,\n\n // パスワード認証用ダイヤログ\n twitter_password_auth_dialog: false,\n\n // Twitter のスクリーンネームとパスワード\n twitter_screen_name: '',\n twitter_password: '',\n twitter_password_showing: false,\n };\n },\n computed: {\n // SettingsStore / UserStore に this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ローディング状態を解除\n this.is_loading = false;\n },\n methods: {\n async loginTwitterAccountWithPasswordForm() {\n // ログインしていない場合はエラーにする\n if (this.userStore.is_logged_in === false) {\n this.$message.warning('連携をはじめるには、KonomiTV アカウントにログインしてください。');\n await Utils.sleep(0.01);\n this.twitter_password_auth_dialog = false;\n return;\n }\n this.twitter_password_auth_dialog = true;\n },\n\n async loginTwitterAccountWithPassword() {\n\n // バリデーションを実行\n if ((this.$refs.twitter_form as any).validate() === false) {\n return;\n }\n\n // Twitter パスワード認証 API にリクエスト\n this.is_twitter_password_auth_sending = true;\n const result = await Twitter.authWithPassword({\n screen_name: this.twitter_screen_name,\n password: this.twitter_password,\n });\n this.is_twitter_password_auth_sending = false;\n if (result === false) {\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n if (this.userStore.user === null) {\n this.$message.error('アカウント情報を取得できませんでした。');\n return;\n }\n\n // ログイン中のユーザーに紐づく Twitter アカウントのうち、一番 updated_at が新しいものを取得\n // ログインすると updated_at が更新されるため、この時点で一番 updated_at が新しいアカウントが今回連携したものだと判断できる\n // ref: https://stackoverflow.com/a/12192544/17124142 (ISO8601 のソートアルゴリズム)\n const current_twitter_account = [...this.userStore.user.twitter_accounts].sort((a, b) => {\n return (a.updated_at < b.updated_at) ? 1 : ((a.updated_at > b.updated_at) ? -1 : 0);\n })[0];\n\n this.$message.success(`Twitter @${current_twitter_account.screen_name} と連携しました。`);\n\n // フォームをリセットし、非表示にする\n (this.$refs.twitter_form as any).reset();\n this.twitter_password_auth_dialog = false;\n },\n\n async logoutTwitterAccount(screen_name: string) {\n\n // Twitter アカウント連携解除 API にリクエスト\n const result = await Twitter.logoutAccount(screen_name);\n if (result === false) {\n return;\n }\n\n // アカウント情報を強制的に更新\n await this.userStore.fetchUser(true);\n\n this.$message.success(`Twitter @${screen_name} との連携を解除しました。`);\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Twitter.vue?vue&type=template&id=61fbe4ed&scoped=true&\"\nimport script from \"./Twitter.vue?vue&type=script&lang=ts&\"\nexport * from \"./Twitter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Twitter.vue?vue&type=style&index=0&id=61fbe4ed&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"61fbe4ed\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('Header'),_c('main',[_c('Navigation'),_c('div',{staticClass:\"channels-container channels-container--home\",class:{'channels-container--loading': _vm.is_loading}},[_c('v-tabs-fix',{staticClass:\"channels-tab\",attrs:{\"centered\":\"\"},model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned)),function([channels_type,]){return _c('v-tab',{key:channels_type,staticClass:\"channels-tab__item\"},[_vm._v(\" \"+_vm._s(channels_type)+\" \")])}),1),_c('v-tabs-items-fix',{staticClass:\"channels-list\",model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned)),function([channels_type, channels]){return _c('v-tab-item-fix',{key:channels_type,staticClass:\"channels-tabitem\"},[_c('div',{staticClass:\"channels\",class:`channels--tab-${channels_type} channels--length-${channels.length}`},[_vm._l((channels),function(channel){return _c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],key:channel.id,staticClass:\"channel\",attrs:{\"to\":`/tv/watch/${channel.display_channel_id}`}},[_c('div',{staticClass:\"channel__broadcaster\"},[_c('img',{staticClass:\"channel__broadcaster-icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${channel.display_channel_id}/logo`}}),_c('div',{staticClass:\"channel__broadcaster-content\"},[_c('span',{staticClass:\"channel__broadcaster-name\"},[_vm._v(\"Ch: \"+_vm._s(channel.channel_number)+\" \"+_vm._s(channel.name))]),_c('div',{staticClass:\"channel__broadcaster-status\"},[_c('div',{staticClass:\"channel__broadcaster-status-force\",class:`channel__broadcaster-status-force--${_vm.ChannelUtils.getChannelForceType(channel.jikkyo_force)}`},[_c('Icon',{attrs:{\"icon\":\"fa-solid:fire-alt\",\"height\":\"12px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"勢い:\")]),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(channel.jikkyo_force ?? '--'))]),_c('span',{staticStyle:{\"margin-left\":\"3px\"}},[_vm._v(\" コメ/分\")])],1),_c('div',{staticClass:\"channel__broadcaster-status-viewers ml-4\"},[_c('Icon',{attrs:{\"icon\":\"fa-solid:eye\",\"height\":\"14px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"視聴数:\")]),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(channel.viewer_count))])],1)])]),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.isPinnedChannel(channel.display_channel_id) ? 'ピン留めを外す' : 'ピン留めする'),expression:\"isPinnedChannel(channel.display_channel_id) ? 'ピン留めを外す' : 'ピン留めする'\"}],staticClass:\"channel__broadcaster-pin\",class:{'channel__broadcaster-pin--pinned': _vm.isPinnedChannel(channel.display_channel_id)},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();_vm.isPinnedChannel(channel.display_channel_id) ? _vm.removePinnedChannel(channel.display_channel_id) : _vm.addPinnedChannel(channel.display_channel_id)},\"mousedown\":function($event){$event.preventDefault();$event.stopPropagation();/* 親要素の波紋が広がらないように */}}},[_c('Icon',{attrs:{\"icon\":\"fluent:pin-20-filled\",\"width\":\"24px\"}})],1)]),_c('div',{staticClass:\"channel__program-present\"},[_c('div',{staticClass:\"channel__program-present-title-wrapper\"},[_c('span',{staticClass:\"channel__program-present-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_present, 'title'))}}),_c('span',{staticClass:\"channel__program-present-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_present)))])]),_c('span',{staticClass:\"channel__program-present-description\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_present, 'description'))}})]),_c('v-spacer'),_c('div',{staticClass:\"channel__program-following\"},[_c('div',{staticClass:\"channel__program-following-title\"},[_c('span',{staticClass:\"channel__program-following-title-decorate\"},[_vm._v(\"NEXT\")]),_c('Icon',{staticClass:\"channel__program-following-title-icon\",attrs:{\"icon\":\"fluent:fast-forward-20-filled\",\"width\":\"16px\"}}),_c('span',{staticClass:\"channel__program-following-title-text\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_following, 'title'))}})],1),_c('span',{staticClass:\"channel__program-following-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_following)))])]),_c('div',{staticClass:\"channel__progressbar\"},[_c('div',{staticClass:\"channel__progressbar-progress\",style:(`width:${_vm.ProgramUtils.getProgramProgress(channel.program_present)}%;`)})])],1)}),(channels_type === 'ピン留め' && channels.length === 0)?_c('div',{staticClass:\"pinned-container d-flex justify-center align-center w-100\"},[_c('div',{staticClass:\"d-flex justify-center align-center flex-column\"},[_c('h2',[_vm._v(\"ピン留めされているチャンネルが\"),_c('br'),_vm._v(\"ありません。\")]),_c('div',{staticClass:\"mt-4 text--text text--darken-1\"},[_vm._v(\"各チャンネルの \"),_c('Icon',{staticStyle:{\"position\":\"relative\",\"bottom\":\"-5px\"},attrs:{\"icon\":\"fluent:pin-20-filled\",\"width\":\"22px\"}}),_vm._v(\" アイコンから、よくみる\"),_c('br'),_vm._v(\"チャンネルをこのタブにピン留めできます。\")],1),_c('div',{staticClass:\"mt-2 text--text text--darken-1\"},[_vm._v(\"チャンネルをピン留めすると、\"),_c('br'),_vm._v(\"このタブが最初に表示されます。\")])])]):_vm._e()],2)])}),1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n/** 番組情報を表すインターフェイス */\nexport interface IProgram {\n id: string;\n channel_id: string;\n network_id: number;\n service_id: number;\n event_id: number;\n title: string;\n description: string;\n detail: {[key: string]: string};\n start_time: string;\n end_time: string;\n duration: number;\n is_free: boolean;\n genres: {major: string; middle: string;}[];\n video_type: string | null;\n video_codec: string | null;\n video_resolution: string | null;\n primary_audio_type: string;\n primary_audio_language: string;\n primary_audio_sampling_rate: string;\n secondary_audio_type: string | null;\n secondary_audio_language: string | null;\n secondary_audio_sampling_rate: string | null;\n}\n\n/** 番組情報を表すインターフェイスのデフォルト値 */\nexport const IProgramDefault: IProgram = {\n id: 'NID0-SID0-EID0',\n channel_id: 'NID0-SID0',\n network_id: 0,\n service_id: 0,\n event_id: 0,\n title: '取得中…',\n description: '取得中…',\n detail: {},\n start_time: '2000-01-01T00:00:00+09:00',\n end_time: '2000-01-01T00:00:00+09:00',\n duration: 0,\n is_free: true,\n genres: [],\n video_type: '映像1080i(1125i)、アスペクト比16:9 パンベクトルなし',\n video_codec: 'MPEG-2',\n video_resolution: '1080i',\n primary_audio_type: '2/0モード(ステレオ)',\n primary_audio_language: '日本語',\n primary_audio_sampling_rate: '48kHz',\n secondary_audio_type: null,\n secondary_audio_language: null,\n secondary_audio_sampling_rate: null,\n};\n\n// TODO: 番組情報 API が開発されたらここに API 定義を書く\n","\nimport APIClient from '@/services/APIClient';\nimport { IProgram, IProgramDefault } from '@/services/Programs';\n\n\n/** チャンネルタイプの型 */\nexport type ChannelType = 'GR' | 'BS' | 'CS' | 'CATV' | 'SKY' | 'STARDIGIO';\n\n// チャンネルタイプの型 (実際のチャンネルリストに表示される表現)\nexport type ChannelTypePretty = 'ピン留め' | '地デジ' | 'BS' | 'CS' | 'CATV' | 'SKY' | 'StarDigio';\n\n/** すべてのチャンネルタイプのチャンネルの情報を表すインターフェイス */\nexport interface IChannelsList {\n GR: IChannel[];\n BS: IChannel[];\n CS: IChannel[];\n CATV: IChannel[];\n SKY: IChannel[];\n STARDIGIO: IChannel[];\n}\n\n/** チャンネル情報を表すインターフェイス */\nexport interface IChannel {\n id: string;\n display_channel_id: string;\n network_id: number;\n service_id: number;\n transport_stream_id: number | null;\n remocon_id: number;\n channel_number: string;\n type: ChannelType;\n name: string;\n jikkyo_force: number | null;\n is_subchannel: boolean;\n is_radiochannel: boolean;\n is_watchable: boolean,\n is_display: boolean;\n viewer_count: number;\n program_present: IProgram | null;\n program_following: IProgram | null;\n}\n\n/** チャンネル情報を表すインターフェイスのデフォルト値 */\nexport const IChannelDefault: IChannel = {\n id: 'NID0-SID0',\n display_channel_id: 'gr000',\n network_id: 0,\n service_id: 0,\n transport_stream_id: null,\n remocon_id: 0,\n channel_number: '---',\n type: 'GR',\n name: '取得中…',\n jikkyo_force: null,\n is_subchannel: false,\n is_radiochannel: false,\n is_watchable: true,\n is_display: true,\n viewer_count: 0,\n program_present: IProgramDefault,\n program_following: IProgramDefault,\n};\n\n/** ニコニコ実況のセッション情報を表すインターフェイス */\nexport interface IJikkyoSession {\n is_success: boolean;\n audience_token: string | null;\n detail: string;\n}\n\n\nclass Channels {\n\n /**\n * すべてのチャンネルの情報を取得する\n * @return すべてのチャンネルの情報\n */\n static async fetchAll(): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get('/channels');\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'チャンネル情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 指定したチャンネルの情報を取得する\n * 現状、処理の見直しにより使用されていない\n * @param display_channel_id チャンネル ID\n * @return 指定したチャンネルの情報\n */\n static async fetch(display_channel_id: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get(`/channels/${display_channel_id}`);\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'チャンネル情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n\n\n /**\n * 指定したチャンネルに紐づくニコニコ実況のセッション情報を取得する\n * @param display_channel_id チャンネル ID\n * @return 指定したチャンネルに紐づくニコニコ実況のセッション情報\n */\n static async fetchJikkyoSession(display_channel_id: string): Promise {\n\n // API リクエストを実行\n const response = await APIClient.get(`/channels/${display_channel_id}/jikkyo`);\n\n // エラー処理\n if ('is_error' in response) {\n APIClient.showGenericError(response, 'ニコニコ実況のセッション情報を取得できませんでした。');\n return null;\n }\n\n return response.data;\n }\n}\n\nexport default Channels;\n","\nimport { defineStore } from 'pinia';\nimport Vue from 'vue';\n\nimport Channels, { ChannelType, ChannelTypePretty, IChannelsList, IChannel, IChannelDefault } from '@/services/Channels';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { ChannelUtils } from '@/utils';\n\n\n/**\n * TV ホーム画面と TV 視聴画面の両方のページでチャンネル情報を共有するためのストア\n * チャンネル情報の API からの取得はかなり重めなので、ページ遷移時に毎回 API リクエストを行うのはパフォーマンスが悪い\n * チャンネル情報をストアに格納しておくことで、TV ホーム画面から TV 視聴画面に遷移したときのパフォーマンスが向上する\n */\nconst useChannelsStore = defineStore('channels', {\n state: () => ({\n\n // 現在視聴中のチャンネルの ID (ex: gr011)\n // 視聴画面のみ有効で、ホーム画面では利用されない\n display_channel_id: 'gr000' as string,\n\n // すべてのチャンネルタイプのチャンネルリスト\n channels_list: {\n GR: [],\n BS: [],\n CS: [],\n CATV: [],\n SKY: [],\n STARDIGIO: [],\n } as IChannelsList,\n\n // 初回のチャンネル情報更新が実行された後かどうか\n is_channels_list_initial_updated: false,\n\n // 最終更新日時 (UNIX タイムスタンプ、秒単位)\n last_updated_at: 0,\n }),\n getters: {\n\n /**\n * ライブ視聴画面を表示中かどうか\n * チャンネル情報がセットされているかどうかで判定できる\n */\n is_showing_live(): boolean {\n return this.display_channel_id !== 'gr000';\n },\n\n /**\n * 前・現在・次のチャンネル情報 (視聴画面用)\n * チャンネル情報はデータ量がかなり多いので、個別に取得するより一気に取得したほうがループ回数が少なくなりパフォーマンスが良い\n */\n channel(): {previous: IChannel; current: IChannel; next: IChannel;} {\n\n // チャンネルタイプごとのチャンネル情報リストを取得する (すべてのチャンネルリストから探索するより効率的)\n const channels: IChannel[] | undefined = this.channels_list[ChannelUtils.getChannelType(this.display_channel_id)];\n\n // まだチャンネルリストの更新が終わっていないなどの場合で取得できなかった場合、\n // null を返すと UI 側でのエラー処理が大変なので、暫定的なダミーのチャンネル情報を返す\n if (channels === undefined || channels.length === 0) {\n return {\n previous: IChannelDefault,\n current: IChannelDefault,\n next: IChannelDefault,\n };\n }\n\n // 起点にするチャンネル情報があるインデックスを取得\n const current_channel_index = channels.findIndex((channel) => channel.display_channel_id === this.display_channel_id);\n\n // インデックスが取得できなかった場合も同様に、暫定的なダミーのチャンネル情報を返す\n if (current_channel_index === -1) {\n const IProgramError = {\n ...IChannelDefault.program_present,\n display_channel_id: 'gr999',\n title: 'チャンネル情報取得エラー',\n description: 'このチャンネル ID のチャンネル情報は存在しません。',\n };\n const IChannelError = {\n ...IChannelDefault,\n display_channel_id: 'gr999', // チャンネル情報が存在しないことを示す特殊なチャンネル ID\n name: 'ERROR',\n program_present: IProgramError,\n program_following: IProgramError,\n };\n return {\n previous: IChannelError as IChannel,\n current: IChannelError as IChannel,\n next: IChannelError as IChannel,\n };\n }\n\n // 前のインデックスを取得する\n // インデックスがマイナスになった時は、最後のインデックスに巻き戻す\n // channel.is_display が true のチャンネルに到達するまで続ける\n const previous_channel_index = ((): number => {\n let index = current_channel_index - 1;\n while (channels.length) {\n if (index <= -1) {\n index = channels.length - 1; // 最後のインデックス\n }\n if (channels[index].is_display) {\n return index;\n }\n index--;\n }\n return 0;\n })();\n\n // 次のインデックスを取得する\n // インデックスが配列の長さを超えた時は、最初のインデックスに巻き戻す\n // channel.is_display が true のチャンネルに到達するまで続ける\n const next_channel_index = ((): number => {\n let index = current_channel_index + 1;\n while (channels.length) {\n if (index >= channels.length) {\n index = 0; // 最初のインデックス\n }\n if (channels[index].is_display) {\n return index;\n }\n index++;\n }\n return 0;\n })();\n\n // 前・現在・次のチャンネル情報を返す\n return {\n previous: channels[previous_channel_index],\n current: channels[current_channel_index],\n next: channels[next_channel_index],\n };\n },\n\n /**\n * 実際に表示されるチャンネルリストを表すデータ\n * ピン留めチャンネルのタブを追加するほか、放送していないサブチャンネルはピン留めタブを含めて表示から除外される\n * また、チャンネルが1つもないチャンネルタイプのタブも表示から除外される\n * (たとえば SKY (スカパー!プレミアムサービス) のタブは、SKY に属すチャンネルが1つもない(=受信できない)なら表示されない)\n */\n channels_list_with_pinned(): Map {\n\n const settings_store = useSettingsStore();\n\n // 事前に Map を定義しておく\n // Map にしていたのは、確か連想配列の順序を保証してくれるからだったはず\n const channels_list_with_pinned = new Map();\n channels_list_with_pinned.set('ピン留め', []);\n channels_list_with_pinned.set('地デジ', []);\n\n // 初回のチャンネル情報更新がまだ実行されていない or 実行中のときは最低限のこの2つだけで返す\n if (this.is_channels_list_initial_updated === false) {\n return channels_list_with_pinned;\n }\n\n channels_list_with_pinned.set('BS', []);\n channels_list_with_pinned.set('CS', []);\n channels_list_with_pinned.set('CATV', []);\n channels_list_with_pinned.set('SKY', []);\n channels_list_with_pinned.set('StarDigio', []);\n\n // channels_list に格納されているすべてのチャンネルに対しループを回し、\n // 順次 channels_list_with_pinned に追加していく\n // 1つのチャンネルに対するループ回数が少なくなる分、毎回 filter() や find() するよりも高速になるはず\n for (const [channel_type, channels] of Object.entries(this.channels_list)) {\n for (const channel of channels) {\n\n // 放送していないサブチャンネルは除外\n if (channel.is_display === false) {\n continue;\n }\n\n // ピン留めしているチャンネルの ID (ex: gr011) が入るリストに含まれていたら、ピン留めタブに追加\n if (settings_store.settings.pinned_channel_ids.includes(channel.display_channel_id)) {\n channels_list_with_pinned.get('ピン留め')?.push(channel);\n }\n\n // チャンネルタイプごとに分類\n switch (channel.type) {\n case 'GR': {\n channels_list_with_pinned.get('地デジ')?.push(channel);\n break;\n }\n case 'BS': {\n channels_list_with_pinned.get('BS')?.push(channel);\n break;\n }\n case 'CS': {\n channels_list_with_pinned.get('CS')?.push(channel);\n break;\n }\n case 'CATV': {\n channels_list_with_pinned.get('CATV')?.push(channel);\n break;\n }\n case 'SKY': {\n channels_list_with_pinned.get('SKY')?.push(channel);\n break;\n }\n case 'STARDIGIO': {\n channels_list_with_pinned.get('StarDigio')?.push(channel);\n break;\n }\n }\n }\n }\n\n // ピン留めチャンネルを追加順に並び替える\n for (const channel of [...channels_list_with_pinned.get('ピン留め')!]) {\n const index = settings_store.settings.pinned_channel_ids.indexOf(channel.display_channel_id);\n channels_list_with_pinned.get('ピン留め')![index] = channel;\n }\n\n // 最後に、チャンネルが1つもないチャンネルタイプのタブを除外する (ピン留めタブを除く)\n for (const [channel_type, channels] of channels_list_with_pinned) {\n if (channel_type === 'ピン留め') {\n continue;\n }\n if (channels.length === 0) {\n channels_list_with_pinned.delete(channel_type);\n }\n }\n\n // ただし、this.channels_list_with_pinned 全体が空でもうピン留めタブしか残っていない場合は、ピン留めタブも削除する\n if (channels_list_with_pinned.size === 1 && channels_list_with_pinned.has('ピン留め')) {\n channels_list_with_pinned.delete('ピン留め');\n }\n\n return channels_list_with_pinned;\n },\n\n /**\n * 視聴画面向けの channels_list_with_pinned\n * 視聴画面ではピン留めされているチャンネルが1つもないときは、ピン留めタブを表示する必要性がないため削除される\n */\n channels_list_with_pinned_for_watch(): Map {\n const channels_list_with_pinned = new Map([...this.channels_list_with_pinned]);\n if (channels_list_with_pinned.get('ピン留め')?.length === 0) {\n channels_list_with_pinned.delete('ピン留め');\n }\n return channels_list_with_pinned;\n }\n },\n actions: {\n\n /**\n * 指定されたチャンネル ID のチャンネル情報を取得する\n * @param display_channel_id 取得するチャンネル ID (ex: gr011)\n * @returns チャンネル情報\n */\n getChannel(display_channel_id: string): IChannel | null {\n\n // チャンネルタイプごとのチャンネル情報リストを取得する (すべてのチャンネルリストから探索するより効率的)\n const channels = this.channels_list[ChannelUtils.getChannelType(display_channel_id)];\n if (channels === undefined) {\n return null;\n }\n\n // チャンネル ID が一致するチャンネル情報を返す\n return channels.find(channel => channel.display_channel_id === display_channel_id) ?? null;\n },\n\n /**\n * チャンネルタイプとリモコン番号からチャンネル情報を取得する\n * @param channel_type チャンネルタイプ\n * @param remocon_id リモコン番号\n * @returns チャンネル情報 (見つからなかった場合は null)\n */\n getChannelByRemoconID(channel_type: ChannelType, remocon_id: number): IChannel | null {\n\n // 指定されたチャンネルタイプのチャンネルを取得\n const channels = this.channels_list[channel_type];\n\n // リモコン番号が一致するチャンネルを取得\n const channel = channels.find((channel) => channel.remocon_id === remocon_id);\n\n // リモコン番号が一致するチャンネルを見つけられなかった場合は null を返す\n return channel ?? null;\n },\n\n /**\n * 指定されたチャンネル ID のチャンネル情報を更新する\n * 今のところ viewer_count (視聴者数) を更新する目的でしか使っていない\n * @param display_channel_id 更新するチャンネル ID (ex: gr011)\n * @param channel 更新後のチャンネル情報\n */\n updateChannel(display_channel_id: string, channel: IChannel): void {\n\n // チャンネルタイプごとのチャンネル情報リストを取得する (すべてのチャンネルリストから探索するより効率的)\n const channel_type = ChannelUtils.getChannelType(display_channel_id);\n if (this.channels_list[channel_type] === undefined) {\n return;\n }\n\n // チャンネル ID が一致するチャンネル情報を更新する\n const index = this.channels_list[channel_type].findIndex(channel => channel.display_channel_id === display_channel_id);\n if (index === -1) {\n return;\n }\n // リアクティブにするために Vue.set を使う\n Vue.set(this.channels_list[channel_type], index, channel);\n },\n\n /**\n * チャンネルリストを更新する\n * @param force 強制的に更新するかどうか\n */\n async update(force: boolean = false): Promise {\n\n const update = async () => {\n\n // 最新のすべてのチャンネルの情報を取得\n const channels_list = await Channels.fetchAll();\n if (channels_list === null) {\n return;\n }\n\n this.channels_list = channels_list;\n this.is_channels_list_initial_updated = true;\n this.last_updated_at = Utils.time();\n };\n\n // すでに取得されている場合は更新しない\n if (this.is_channels_list_initial_updated === true && force === false) {\n\n // ただし、最終更新日時が1分以上前の場合は非同期で更新する\n if (Utils.time() - this.last_updated_at > 60) {\n update();\n }\n\n return;\n }\n\n // チャンネルリストの更新を行う\n await update();\n }\n }\n});\n\nexport default useChannelsStore;\n","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport Header from '@/components/Header.vue';\nimport Navigation from '@/components/Navigation.vue';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { ChannelUtils, ProgramUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'TV-Home',\n components: {\n Header,\n Navigation,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ChannelUtils: ChannelUtils,\n ProgramUtils: ProgramUtils,\n\n // タブの状態管理\n tab: null as number | null,\n\n // ローディング中かどうか\n is_loading: true,\n\n // インターバル ID\n // ページ遷移時に setInterval(), setTimeout() の実行を止めるのに使う\n // setInterval(), setTimeout() の返り値を登録する\n interval_ids: [] as number[],\n };\n },\n computed: {\n // ChannelsStore / SettingsStore に this.channelsStore / this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore, useSettingsStore),\n },\n // 開始時に実行\n async created() {\n\n // ピン留めされているチャンネルの ID が空なら、タブを地デジタブに切り替える\n // ピン留めができる事を示唆するためにピン留めタブ自体は残す\n if (this.settingsStore.settings.pinned_channel_ids.length === 0) {\n this.tab = 1;\n }\n\n // 00秒までの残り秒数を取得\n // 現在 16:01:34 なら 26 (秒) になる\n const residue_second = 60 - new Date().getSeconds();\n\n // 00秒になるまで待ってから実行するタイマー\n // 番組は基本1分単位で組まれているため、20秒や45秒など中途半端な秒数で更新してしまうと番組情報の反映が遅れてしまう\n this.interval_ids.push(window.setTimeout(() => {\n\n // この時点で00秒なので、チャンネル情報を更新\n this.channelsStore.update(true);\n\n // 以降、30秒おきにチャンネル情報を更新\n this.interval_ids.push(window.setInterval(() => this.channelsStore.update(true), 30 * 1000));\n\n }, residue_second * 1000));\n\n // チャンネル情報を更新 (初回)\n await this.channelsStore.update();\n\n // 少しだけ待つ\n // v-tabs-slider-wrapper をアニメーションさせないために必要\n await Utils.sleep(0.01);\n\n // この時点でピン留めされているチャンネルがないなら、タブを地デジタブに切り替える\n // ピン留めされているチャンネル自体はあるが、現在放送されていないため表示できない場合に備える\n if (this.channelsStore.channels_list_with_pinned.get('ピン留め')?.length === 0) {\n this.tab = 1;\n }\n\n // チャンネル情報の更新が終わったタイミングでローディング状態を解除する\n this.is_loading = false;\n },\n // 終了前に実行\n beforeDestroy() {\n\n // clearInterval() ですべての setInterval(), setTimeout() の実行を止める\n // clearInterval() と clearTimeout() は中身共通なので問題ない\n for (const interval_id of this.interval_ids) {\n window.clearInterval(interval_id);\n }\n },\n methods: {\n\n // チャンネルをピン留めする\n addPinnedChannel(display_channel_id: string) {\n\n // ピン留めするチャンネルの ID を追加 (保存は自動で行われる)\n this.settingsStore.settings.pinned_channel_ids.push(display_channel_id);\n\n const channel = this.channelsStore.getChannel(display_channel_id);\n if (channel) {\n this.$message.show(`${channel.name}をピン留めしました。`);\n }\n },\n\n // チャンネルをピン留めから外す\n removePinnedChannel(display_channel_id: string) {\n\n // ピン留めを外すチャンネルの ID を削除 (保存は自動で行われる)\n this.settingsStore.settings.pinned_channel_ids.splice(this.settingsStore.settings.pinned_channel_ids.indexOf(display_channel_id), 1);\n\n // この時点でピン留めされているチャンネルがないなら、タブを地デジタブに切り替える\n if (this.channelsStore.channels_list_with_pinned.get('ピン留め')?.length === 0) {\n this.tab = 1;\n }\n\n const channel = this.channelsStore.getChannel(display_channel_id);\n if (channel) {\n this.$message.show(`${channel.name}のピン留めを外しました。`);\n }\n },\n\n // チャンネルがピン留めされているか\n isPinnedChannel(display_channel_id: string): boolean {\n\n // 引数のチャンネルがピン留めリストに存在するかを返す\n return this.settingsStore.settings.pinned_channel_ids.includes(display_channel_id);\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=b22adce6&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=ts&\"\nexport * from \"./Home.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=b22adce6&prod&lang=scss&\"\nimport style1 from \"./Home.vue?vue&type=style&index=1&id=b22adce6&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b22adce6\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"route-container\"},[_c('main',{staticClass:\"watch-container\",class:{\n 'watch-container--control-display': _vm.is_control_display,\n 'watch-container--panel-display': _vm.Utils.isSmartphoneVertical() || _vm.Utils.isTabletVertical() ? true : _vm.is_panel_display,\n 'watch-container--fullscreen': _vm.is_fullscreen,\n }},[_c('nav',{staticClass:\"watch-navigation\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event)},\"touchmove\":function($event){return _vm.controlDisplayTimer($event)},\"click\":function($event){return _vm.controlDisplayTimer($event)}}},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"watch-navigation__icon\",attrs:{\"to\":\"/tv/\"}},[_c('img',{staticClass:\"watch-navigation__icon-image\",attrs:{\"src\":\"/assets/images/icon.svg\",\"width\":\"23px\"}})]),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('テレビをみる'),expression:\"'テレビをみる'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/tv/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:tv-20-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('ビデオをみる'),expression:\"'ビデオをみる'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/videos/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:movies-and-tv-20-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('番組表'),expression:\"'番組表'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/timetable/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:calendar-ltr-20-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('録画予約'),expression:\"'録画予約'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/reserves/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",staticStyle:{\"padding\":\"0.5px\"},attrs:{\"icon\":\"fluent:timer-16-regular\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('マイリスト'),expression:\"'マイリスト'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/mylist/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"ic:round-playlist-play\",\"width\":\"26px\"}})],1),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('キャプチャ'),expression:\"'キャプチャ'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/captures/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:image-multiple-24-regular\",\"width\":\"26px\"}})],1),_c('v-spacer'),_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.right\",value:('設定'),expression:\"'設定'\",modifiers:{\"right\":true}}],staticClass:\"watch-navigation__link\",attrs:{\"active-class\":\"watch-navigation__link--active\",\"to\":\"/settings/\"}},[_c('Icon',{staticClass:\"watch-navigation__link-icon\",attrs:{\"icon\":\"fluent:settings-20-regular\",\"width\":\"26px\"}})],1)],1),_c('div',{staticClass:\"watch-content\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event, true)},\"touchmove\":function($event){return _vm.controlDisplayTimer($event, true)},\"click\":function($event){return _vm.controlDisplayTimer($event, true)}}},[_c('header',{staticClass:\"watch-header\"},[_c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"watch-header__back-icon\",attrs:{\"to\":\"/tv/\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"25px\"}})],1),_c('img',{staticClass:\"watch-header__broadcaster\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${(_vm.channelsStore.display_channel_id)}/logo`}}),_c('span',{staticClass:\"watch-header__program-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_present, 'title'))}}),_c('span',{staticClass:\"watch-header__program-time\"},[_vm._v(\" \"+_vm._s(_vm.ProgramUtils.getProgramTime(_vm.channelsStore.channel.current.program_present, true))+\" \")]),_c('v-spacer'),_c('span',{staticClass:\"watch-header__now\"},[_vm._v(_vm._s(_vm.time))])],1),_c('div',{staticClass:\"watch-player\",class:{\n 'watch-player--loading': _vm.is_loading,\n 'watch-player--virtual-keyboard-display': _vm.is_virtual_keyboard_display && _vm.Utils.hasActiveElementClass('dplayer-comment-input'),\n }},[_c('div',{staticClass:\"watch-player__background-wrapper\"},[_c('div',{staticClass:\"watch-player__background\",class:{'watch-player__background--display': _vm.is_background_display},style:({backgroundImage: `url(${_vm.background_url})`})},[_c('img',{staticClass:\"watch-player__background-logo\",attrs:{\"src\":\"/assets/images/logo.svg\"}})])]),_c('v-progress-circular',{staticClass:\"watch-player__buffering\",class:{'watch-player__buffering--display': _vm.is_video_buffering && (_vm.is_loading || (_vm.player !== null && !_vm.player.video.paused))},attrs:{\"indeterminate\":\"\",\"size\":\"60\",\"width\":\"6\"}}),_c('div',{staticClass:\"watch-player__dplayer\"}),_c('div',{staticClass:\"watch-player__button\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event)},\"touchmove\":function($event){return _vm.controlDisplayTimer($event)},\"click\":function($event){return _vm.controlDisplayTimer($event)}}},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.top\",value:('前のチャンネル'),expression:\"'前のチャンネル'\",modifiers:{\"top\":true}}],staticClass:\"switch-button switch-button-up\",on:{\"click\":function($event){_vm.is_zapping = true; _vm.$router.push({path: `/tv/watch/${_vm.channelsStore.channel.previous.display_channel_id}`})}}},[_c('Icon',{staticClass:\"switch-button-icon\",attrs:{\"icon\":\"fluent:ios-arrow-left-24-filled\",\"width\":\"32px\",\"rotate\":\"1\"}})],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"switch-button switch-button-panel switch-button-panel--open\",on:{\"click\":function($event){_vm.is_panel_display = !_vm.is_panel_display}}},[_c('Icon',{staticClass:\"switch-button-icon\",attrs:{\"icon\":\"fluent:navigation-16-filled\",\"width\":\"32px\"}})],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"},{name:\"tooltip\",rawName:\"v-tooltip.bottom\",value:('次のチャンネル'),expression:\"'次のチャンネル'\",modifiers:{\"bottom\":true}}],staticClass:\"switch-button switch-button-down\",on:{\"click\":function($event){_vm.is_zapping = true; _vm.$router.push({path: `/tv/watch/${_vm.channelsStore.channel.next.display_channel_id}`})}}},[_c('Icon',{staticClass:\"switch-button-icon\",attrs:{\"icon\":\"fluent:ios-arrow-right-24-filled\",\"width\":\"33px\",\"rotate\":\"1\"}})],1)])],1)]),_c('div',{staticClass:\"watch-panel\",on:{\"mousemove\":function($event){return _vm.controlDisplayTimer($event)}}},[_c('div',{staticClass:\"watch-panel__header\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-close-button\",on:{\"click\":function($event){_vm.is_panel_display = false}}},[_c('Icon',{staticClass:\"panel-close-button__icon\",attrs:{\"icon\":\"akar-icons:chevron-right\",\"width\":\"25px\"}}),_c('span',{staticClass:\"panel-close-button__text\"},[_vm._v(\"閉じる\")])],1),_c('v-spacer'),_c('div',{staticClass:\"panel-broadcaster\"},[_c('img',{staticClass:\"panel-broadcaster__icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${(_vm.channelsStore.display_channel_id)}/logo`}}),_c('div',{staticClass:\"panel-broadcaster__number\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.channel_number))]),_c('div',{staticClass:\"panel-broadcaster__name\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.name))])])],1),_c('div',{staticClass:\"watch-panel__content-container\"},[_c('Program',{staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Program'}}),_c('Channel',{staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Channel'}}),_c('Comment',{ref:\"Comment\",staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Comment'},attrs:{\"channel\":_vm.channelsStore.channel.current,\"player\":_vm.player}}),_c('Twitter',{ref:\"Twitter\",staticClass:\"watch-panel__content\",class:{'watch-panel__content--active': _vm.tv_panel_active_tab === 'Twitter'},attrs:{\"player\":_vm.player,\"is_virtual_keyboard_display\":_vm.is_virtual_keyboard_display},on:{\"panel_folding_requested\":function($event){_vm.is_panel_display = false}}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"watch-panel__content-remocon-button elevation-8\",class:{'watch-panel__content-remocon-button--active': _vm.tv_panel_active_tab === 'Program' || _vm.tv_panel_active_tab === 'Channel'},on:{\"click\":function($event){_vm.is_remocon_display = !_vm.is_remocon_display}}},[_c('Icon',{staticClass:\"panel-close-button__icon\",attrs:{\"icon\":\"material-symbols:remote-gen\",\"width\":\"25px\"}})],1),_c('Remocon',{staticClass:\"watch-panel__remocon\",attrs:{\"showing\":(_vm.tv_panel_active_tab === 'Program' || _vm.tv_panel_active_tab === 'Channel') && _vm.is_remocon_display === true},on:{\"close\":function($event){_vm.is_remocon_display = false}}})],1),_c('div',{staticClass:\"watch-panel__navigation\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Program'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Program'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"fa-solid:info-circle\",\"width\":\"33px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"番組情報\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Channel'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Channel'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"fa-solid:broadcast-tower\",\"width\":\"34px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"チャンネル\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Comment'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Comment'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"bi:chat-left-text-fill\",\"width\":\"29px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"コメント\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"panel-navigation-button\",class:{'panel-navigation-button--active': _vm.tv_panel_active_tab === 'Twitter'},on:{\"click\":function($event){_vm.tv_panel_active_tab = 'Twitter'}}},[_c('Icon',{staticClass:\"panel-navigation-button__icon\",attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"34px\"}}),_c('span',{staticClass:\"panel-navigation-button__text\"},[_vm._v(\"Twitter\")])],1)])])]),_c('v-dialog',{attrs:{\"max-width\":\"1050\",\"transition\":\"slide-y-transition\"},model:{value:(_vm.shortcut_key_modal),callback:function ($$v) {_vm.shortcut_key_modal=$$v},expression:\"shortcut_key_modal\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"px-5 pt-4 pb-3 d-flex align-center font-weight-bold\"},[_c('Icon',{attrs:{\"icon\":\"fluent:keyboard-20-filled\",\"height\":\"28px\"}}),_c('span',{staticClass:\"ml-3\"},[_vm._v(\"キーボードショートカット\")]),_c('v-spacer'),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"d-flex align-center rounded-circle cursor-pointer px-2 py-2\",on:{\"click\":function($event){_vm.shortcut_key_modal = false}}},[_c('Icon',{attrs:{\"icon\":\"fluent:dismiss-12-filled\",\"width\":\"23px\",\"height\":\"23px\"}})],1)],1),_c('div',{staticClass:\"px-5 pb-4\"},[_c('v-row',_vm._l((_vm.shortcut_key_list),function(shortcut_key_column,shortcut_key_column_name){return _c('v-col',{key:shortcut_key_column_name,attrs:{\"cols\":\"6\"}},_vm._l((shortcut_key_column),function(shortcut_keys){return _c('div',{key:shortcut_keys.name,staticClass:\"mt-3\"},[_c('div',{staticClass:\"text-subtitle-1 d-flex align-center font-weight-bold\"},[_c('Icon',{attrs:{\"icon\":shortcut_keys.icon,\"height\":shortcut_keys.icon_height}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(_vm._s(shortcut_keys.name))])],1),_vm._l((shortcut_keys.shortcuts),function(shortcut){return _c('div',{key:shortcut.name,staticClass:\"mt-3\"},[_c('div',{staticClass:\"text-subtitle-2 mt-2 d-flex align-center font-weight-medium\"},[_c('span',{staticClass:\"mr-2\",domProps:{\"innerHTML\":_vm._s(shortcut.name)}}),_c('div',{staticClass:\"ml-auto d-flex align-center flex-shrink-0\"},_vm._l((shortcut.keys),function(key,index){return _c('div',{key:key.name,staticClass:\"ml-auto d-flex align-center\"},[_c('span',{staticClass:\"shortcut-key\"},[_vm._l((key.name.split(';')),function(key_name){return _c('Icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(key.icon === true),expression:\"key.icon === true\"}],key:key_name,attrs:{\"icon\":key_name,\"height\":\"18px\"}})}),(key.icon === false)?_c('span',{domProps:{\"innerHTML\":_vm._s(key.name)}}):_vm._e()],2),(index < (shortcut.keys.length - 1))?_c('span',{staticClass:\"shortcut-key-plus\"},[_vm._v(\"+\")]):_vm._e()])}),0)])])})],2)}),0)}),1)],1)],1)],1),_c('BottomNavigation')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"channels-container channels-container--watch\"},[_c('v-tabs-fix',{staticClass:\"channels-tab\",attrs:{\"centered\":\"\",\"show-arrows\":\"\"},model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned_for_watch)),function([channels_type,]){return _c('v-tab',{key:channels_type,staticClass:\"channels-tab__item\"},[_vm._v(\" \"+_vm._s(channels_type)+\" \")])}),1),_c('div',{staticClass:\"channels-list-container\"},[_c('v-tabs-items-fix',{staticClass:\"channels-list\",model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((Array.from(_vm.channelsStore.channels_list_with_pinned_for_watch)),function([channels_type, channels]){return _c('v-tab-item-fix',{key:channels_type,staticClass:\"channels\"},_vm._l((channels),function(channel){return _c('router-link',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],key:channel.id,staticClass:\"channel\",attrs:{\"to\":`/tv/watch/${channel.display_channel_id}`}},[_c('div',{staticClass:\"channel__broadcaster\"},[_c('img',{staticClass:\"channel__broadcaster-icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${channel.display_channel_id}/logo`}}),_c('div',{staticClass:\"channel__broadcaster-content\"},[_c('span',{staticClass:\"channel__broadcaster-name\"},[_vm._v(\"Ch: \"+_vm._s(channel.channel_number)+\" \"+_vm._s(channel.name))]),_c('div',{staticClass:\"channel__broadcaster-force\",class:`channel__broadcaster-force--${_vm.ChannelUtils.getChannelForceType(channel.jikkyo_force)}`},[_c('Icon',{attrs:{\"icon\":\"fa-solid:fire-alt\",\"height\":\"11px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(channel.jikkyo_force ?? '--'))])],1)])]),_c('div',{staticClass:\"channel__program-present\"},[_c('span',{staticClass:\"channel__program-present-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_present, 'title'))}}),_c('span',{staticClass:\"channel__program-present-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_present)))])]),_c('div',{staticClass:\"channel__program-following\"},[_c('div',{staticClass:\"channel__program-following-title\"},[_c('span',{staticClass:\"channel__program-following-title-decorate\"},[_vm._v(\"NEXT\")]),_c('Icon',{staticClass:\"channel__program-following-title-icon\",attrs:{\"icon\":\"fluent:fast-forward-20-filled\",\"width\":\"16px\"}}),_c('span',{staticClass:\"channel__program-following-title-text\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(channel.program_following, 'title'))}})],1),_c('span',{staticClass:\"channel__program-following-time\"},[_vm._v(_vm._s(_vm.ProgramUtils.getProgramTime(channel.program_following)))])]),_c('div',{staticClass:\"channel__progressbar\"},[_c('div',{staticClass:\"channel__progressbar-progress\",style:(`width:${_vm.ProgramUtils.getProgramProgress(channel.program_present)}%;`)})])])}),1)}),1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useChannelsStore from '@/store/ChannelsStore';\nimport Utils, { ChannelUtils, ProgramUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'Panel-ChannelTab',\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ChannelUtils: ChannelUtils,\n ProgramUtils: ProgramUtils,\n\n // タブの状態管理\n tab: null,\n };\n },\n computed: {\n // ChannelsStore に this.channelsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Channel.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Channel.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Channel.vue?vue&type=template&id=1773876a&scoped=true&\"\nimport script from \"./Channel.vue?vue&type=script&lang=ts&\"\nexport * from \"./Channel.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Channel.vue?vue&type=style&index=0&id=1773876a&prod&lang=scss&\"\nimport style1 from \"./Channel.vue?vue&type=style&index=1&id=1773876a&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1773876a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"comment-container\"},[_c('section',{staticClass:\"comment-header\"},[_c('h2',{staticClass:\"comment-header__title\"},[_c('Icon',{staticClass:\"comment-header__title-icon\",attrs:{\"icon\":\"bi:chat-left-text-fill\",\"height\":\"18.5px\"}}),_c('span',{staticClass:\"comment-header__title-text\"},[_vm._v(\"コメント\")])],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"comment-header__button ml-auto\",on:{\"click\":function($event){_vm.comment_mute_settings_modal = !_vm.comment_mute_settings_modal}}},[_c('Icon',{attrs:{\"icon\":\"heroicons-solid:filter\",\"height\":\"11px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"ミュート設定\")])],1)]),_c('section',{ref:\"comment_list_wrapper\",staticClass:\"comment-list-wrapper\"},[_c('div',{staticClass:\"comment-list-dropdown\",class:{'comment-list-dropdown--display': _vm.is_comment_list_dropdown_display},style:({'--comment-list-dropdown-top': `${_vm.comment_list_dropdown_top}px`})},[_c('v-list',{staticStyle:{\"background\":\"var(--v-background-lighten1)\"}},[_c('v-list-item',{staticStyle:{\"min-height\":\"30px\"},attrs:{\"dense\":\"\"},on:{\"click\":function($event){return _vm.addMutedKeywords()}}},[_c('v-list-item-title',{staticClass:\"d-flex align-center\"},[_c('Icon',{attrs:{\"icon\":\"fluent:comment-dismiss-20-filled\",\"width\":\"20px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"このコメントをミュート\")])],1)],1),_c('v-list-item',{staticStyle:{\"min-height\":\"30px\"},attrs:{\"dense\":\"\"},on:{\"click\":function($event){return _vm.addMutedNiconicoUserIds()}}},[_c('v-list-item-title',{staticClass:\"d-flex align-center\"},[_c('Icon',{attrs:{\"icon\":\"fluent:person-prohibited-20-filled\",\"width\":\"20px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"このコメントの投稿者をミュート\")])],1)],1)],1)],1),_c('div',{staticClass:\"comment-list-cover\",class:{'comment-list-cover--display': _vm.is_comment_list_dropdown_display},on:{\"click\":function($event){return _vm.hideCommentListDropdown()}}}),_c('DynamicScroller',{staticClass:\"comment-list\",attrs:{\"direction\":'vertical',\"items\":_vm.comment_list,\"min-item-size\":34},scopedSlots:_vm._u([{key:\"default\",fn:function({item, active}){return [_c('DynamicScrollerItem',{attrs:{\"item\":item,\"active\":active,\"size-dependencies\":[item.text]}},[_c('div',{staticClass:\"comment\",class:{'comment--my-post': item.my_post}},[_c('span',{staticClass:\"comment__text\"},[_vm._v(_vm._s(item.text))]),_c('span',{staticClass:\"comment__time\"},[_vm._v(_vm._s(item.time))]),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\",value:(!_vm.Utils.isTouchDevice()),expression:\"!Utils.isTouchDevice()\"}],staticClass:\"comment__icon\",on:{\"mouseup\":function($event){return _vm.showCommentListDropdown($event, item)},\"touchend\":function($event){return _vm.showCommentListDropdown($event, item)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:more-vertical-20-filled\",\"width\":\"20px\"}})],1)])])]}}])}),(_vm.initialize_failed_message === null && _vm.comment_list.length === 0)?_c('div',{staticClass:\"comment-announce\"},[_c('div',{staticClass:\"comment-announce__heading\"},[_vm._v(\"まだコメントがありません。\")]),_vm._m(0)]):_vm._e(),(_vm.initialize_failed_message !== null && _vm.comment_list.length === 0)?_c('div',{staticClass:\"comment-announce\"},[_c('div',{staticClass:\"comment-announce__heading\"},[_vm._v(\"コメントがありません。\")]),_c('div',{staticClass:\"comment-announce__text\"},[_c('p',{staticClass:\"mt-0 mb-0\"},[_vm._v(_vm._s(_vm.initialize_failed_message))])])]):_vm._e()],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"comment-scroll-button elevation-5\",class:{'comment-scroll-button--display': _vm.is_manual_scroll},on:{\"click\":function($event){_vm.is_manual_scroll = false; _vm.scrollCommentList(true);}}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-down-12-filled\",\"height\":\"29px\"}})],1),_c('CommentMuteSettings',{model:{value:(_vm.comment_mute_settings_modal),callback:function ($$v) {_vm.comment_mute_settings_modal=$$v},expression:\"comment_mute_settings_modal\"}})],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"comment-announce__text\"},[_c('p',{staticClass:\"mt-0 mb-0\"},[_vm._v(\"このチャンネルに対応するニコニコ実況のコメントが、リアルタイムで表示されます。\")])])\n}]\n\nexport { render, staticRenderFns }","\nimport dayjs from 'dayjs';\nimport DPlayer, { DPlayerType } from 'dplayer';\n\nimport Channels from '@/services/Channels';\nimport Utils, { CommentUtils } from '@/utils';\n\n\nexport interface ICommentData {\n id: number;\n text: string;\n time: string;\n user_id: string;\n my_post: boolean;\n}\n\ninterface IWatchSessionResult {\n is_success: boolean;\n detail: string;\n message_server_url?: string;\n thread_id?: string;\n your_post_key?: string;\n}\n\n\nclass LiveCommentManager {\n\n // 視聴セッションの WebSocket のインスタンス\n private watch_session: WebSocket | null = null;\n // コメントセッションの WebSocket のインスタンス\n private comment_session: WebSocket | null = null;\n // vpos を計算する基準となる時刻のタイムスタンプ\n private vpos_base_timestamp: number = 0;\n // 座席維持用のタイマーのインターバル ID\n private keep_seat_interval_id: number | null = null;\n // destroy() 時に EventListener を全解除するための AbortController\n private abort_controller: AbortController = new AbortController();\n\n private player: DPlayer;\n private display_channel_id: string;\n private on_initial_comments_received: (initial_comments: ICommentData[]) => void;\n private on_comment_received: (comment: ICommentData) => void;\n\n constructor(options: {\n player: DPlayer;\n display_channel_id: string;\n on_initial_comments_received: (initial_comments: ICommentData[]) => void;\n on_comment_received: (comment: ICommentData) => void;\n }) {\n this.player = options.player;\n this.display_channel_id = options.display_channel_id;\n this.on_initial_comments_received = options.on_initial_comments_received;\n this.on_comment_received = options.on_comment_received;\n }\n\n\n /**\n * ニコニコ実況に接続し、セッションを初期化する\n * 初期化に成功した場合は、随時コールバックにニコニコ実況から受信したコメントが渡される\n * @returns セッションの初期化に成功したかどうか\n */\n public async initSession(): Promise<{\n is_success: boolean;\n detail: string;\n }> {\n\n // 視聴セッションを初期化\n const watch_session_result = await this.initWatchSession();\n if (watch_session_result.is_success === false) {\n return {\n is_success: false,\n detail: watch_session_result.detail,\n };\n }\n\n // 視聴セッションを初期化できた場合のみ、\n // 取得したコメントサーバーへの接続情報を使い、非同期でコメントセッションを初期化\n this.initCommentSession(watch_session_result);\n\n return {\n is_success: true,\n detail: '視聴セッションを初期化しました。',\n };\n }\n\n\n /**\n * 視聴セッションを初期化する\n * @returns コメントサーバーへの接続情報 or エラー情報\n */\n private async initWatchSession(): Promise {\n\n // サーバーから disconnect メッセージが送られてきた際のフラグ\n let is_disconnect_message_received = false;\n\n // セッション情報を取得\n const watch_session_info = await Channels.fetchJikkyoSession(this.display_channel_id);\n if (watch_session_info === null) {\n return {\n is_success: false,\n detail: 'ニコニコ実況のセッション情報を取得できませんでした。',\n };\n }\n if (watch_session_info.is_success === false) {\n console.error(`[LiveCommentManager][WatchSession] Error: ${watch_session_info.detail}`);\n // 通常発生しないエラーメッセージ (サーバーエラーなど) はプレイヤー側にも通知する\n if ((watch_session_info.detail !== 'このチャンネルはニコニコ実況に対応していません。') &&\n (watch_session_info.detail !== '現在放送中のニコニコ実況がありません。')) {\n this.player.notice(watch_session_info.detail, undefined, undefined, '#FF6F6A');\n }\n return {\n is_success: false,\n detail: watch_session_info.detail,\n };\n }\n\n // 視聴セッション WebSocket を開く\n this.watch_session = new WebSocket(watch_session_info.audience_token!);\n\n // 視聴セッションの接続が開かれたとき\n this.watch_session.addEventListener('open', () => {\n\n // 視聴セッションをリクエスト\n // 公式ドキュメントいわく、stream フィールドは Optional らしい\n // サーバー負荷軽減のため、映像が不要な場合は必ず省略してくださいとのこと\n this.watch_session?.send(JSON.stringify({\n type: 'startWatching',\n data: {\n 'reconnect': false,\n },\n }));\n\n }, { signal: this.abort_controller.signal });\n\n // 視聴セッションの接続が閉じられたとき(ネットワークが切断された場合など)\n this.watch_session.addEventListener('close', async (event) => {\n\n // すでに disconnect メッセージが送られてきている場合は何もしない\n if (is_disconnect_message_received === true) {\n return;\n }\n\n // 接続切断の理由を表示\n console.error(`[LiveCommentManager][WatchSession] Connection closed. (Code: ${event.code})`);\n this.player.notice(`ニコニコ実況との接続が切断されました。(Code: ${event.code})`, undefined, undefined, '#FF6F6A');\n\n // 10 秒ほど待ってから再接続する\n // ニコ生側から切断された場合と異なりネットワークが切断された可能性が高いので、間を多めに取る\n await Utils.sleep(10);\n await this.reconnect();\n\n }, { signal: this.abort_controller.signal });\n\n // 視聴セッション WebSocket からメッセージを受信したとき\n // 視聴セッションはコメント送信時のために維持し続ける必要がある\n // 以下はいずれも視聴セッションを維持し続けたり、エラーが発生した際に再接続するための処理\n this.watch_session.addEventListener('message', async (event) => {\n if (this.watch_session === null) return;\n\n // 各メッセージタイプに対応する処理を実行\n const message = JSON.parse(event.data);\n switch (message.type) {\n\n // 座席情報\n case 'seat': {\n // すでにタイマーが設定されている場合は何もしない\n if (this.keep_seat_interval_id !== null) {\n break;\n }\n // keepIntervalSec の秒数ごとに keepSeat を送信して座席を維持する\n this.keep_seat_interval_id = window.setInterval(() => {\n if (this.watch_session && this.watch_session.readyState === WebSocket.OPEN) {\n // セッションがまだ開いていれば、座席を維持する\n this.watch_session.send(JSON.stringify({type: 'keepSeat'}));\n } else {\n // セッションが閉じられている場合は、タイマーを停止する\n window.clearInterval(this.keep_seat_interval_id ?? 0);\n }\n }, message.data.keepIntervalSec * 1000);\n break;\n }\n\n // ping-pong\n case 'ping': {\n // pong を返してセッションを維持する\n // 送り返さなかった場合、勝手にセッションが閉じられてしまう\n this.watch_session.send(JSON.stringify({type: 'pong'}));\n break;\n }\n\n // エラー情報\n case 'error': {\n // COMMENT_POST_NOT_ALLOWED と INVALID_MESSAGE に関しては sendComment() の方で処理するので、ここでは何もしない\n if (message.data.code === 'COMMENT_POST_NOT_ALLOWED' || message.data.code === 'INVALID_MESSAGE') {\n break;\n }\n\n let error = `ニコニコ実況でエラーが発生しています。(Code: ${message.data.code})`;\n switch (message.data.code) {\n case 'CONNECT_ERROR':\n error = 'ニコニコ実況のコメントサーバーに接続できません。';\n break;\n case 'CONTENT_NOT_READY':\n error = 'ニコニコ実況が配信できない状態です。';\n break;\n case 'NO_THREAD_AVAILABLE':\n error = 'ニコニコ実況のコメントスレッドを取得できません。';\n break;\n case 'NO_ROOM_AVAILABLE':\n error = 'ニコニコ実況のコメント部屋を取得できません。';\n break;\n case 'NO_PERMISSION':\n error = 'ニコニコ実況の API にアクセスする権限がありません。';\n break;\n case 'NOT_ON_AIR':\n error = 'ニコニコ実況が放送中ではありません。';\n break;\n case 'BROADCAST_NOT_FOUND':\n error = 'ニコニコ実況の配信情報を取得できません。';\n break;\n case 'INTERNAL_SERVERERROR':\n error = 'ニコニコ実況でサーバーエラーが発生しています。';\n break;\n }\n\n // エラー情報を表示\n console.error(`[LiveCommentManager][WatchSession] Error occurred. (Code: ${message.data.code})`);\n this.player.notice(error, undefined, undefined, '#FF6F6A');\n\n // 5 秒ほど待ってから再接続する\n await Utils.sleep(5);\n await this.reconnect();\n break;\n }\n\n // 再接続を求められた\n case 'reconnect': {\n // waitTimeSec に記載の秒数だけ待ってから再接続する\n // 公式ドキュメントには reconnect で送られてくる audienceToken で再接続しろと書いてあるんだけど、\n // 確実性的な面で実装が面倒なので当面このままにしておく\n await this.reconnect();\n break;\n }\n\n // 視聴セッションが閉じられた(4時のリセットなど)\n case 'disconnect': {\n // 実際に接続が閉じられる前に disconnect メッセージが送られてきたので、\n // WebSocket の close メッセージを実行させないようにする\n is_disconnect_message_received = true;\n\n // 接続切断の理由\n let disconnect_reason = `ニコニコ実況との接続が切断されました。(${message.data.reason})`;\n switch (message.data.reason) {\n case 'TAKEOVER':\n disconnect_reason = 'ニコニコ実況の番組から追い出されました。';\n break;\n case 'NO_PERMISSION':\n disconnect_reason = 'ニコニコ実況の番組の座席を取得できませんでした。';\n break;\n case 'END_PROGRAM':\n disconnect_reason = 'ニコニコ実況がリセットされたか、コミュニティの番組が終了しました。';\n break;\n case 'PING_TIMEOUT':\n disconnect_reason = 'コメントサーバーとの接続生存確認に失敗しました。';\n break;\n case 'TOO_MANY_CONNECTIONS':\n disconnect_reason = 'ニコニコ実況の同一ユーザからの接続数上限を越えています。';\n break;\n case 'TOO_MANY_WATCHINGS':\n disconnect_reason = 'ニコニコ実況の同一ユーザからの視聴番組数上限を越えています。';\n break;\n case 'CROWDED':\n disconnect_reason = 'ニコニコ実況の番組が満席です。';\n break;\n case 'MAINTENANCE_IN':\n disconnect_reason = 'ニコニコ実況はメンテナンス中です。';\n break;\n case 'SERVICE_TEMPORARILY_UNAVAILABLE':\n disconnect_reason = 'ニコニコ実況で一時的にサーバーエラーが発生しています。';\n break;\n }\n\n // 接続切断の理由を表示\n console.error(`[LiveCommentManager][WatchSession] Disconnected. (Reason: ${message.data.reason})`);\n this.player.notice(disconnect_reason);\n\n // 5 秒ほど待ってから再接続する\n await Utils.sleep(5);\n await this.reconnect();\n break;\n }\n }\n\n }, { signal: this.abort_controller.signal });\n\n // コメントサーバーへの接続情報を返す\n // イベント内で値を返すため、Promise で包む\n return new Promise((resolve) => {\n this.watch_session!.addEventListener('message', async (event) => {\n const message = JSON.parse(event.data);\n if (message.type === 'room') {\n\n // vpos の基準時刻のタイムスタンプを取得 (ミリ秒単位)\n // vpos は番組開始時間からの累計秒数\n this.vpos_base_timestamp = dayjs(message.data.vposBaseTime).valueOf();\n\n // コメントサーバーへの接続情報を返す\n console.log(`[LiveCommentManager][WatchSession] Connected.\\nThread ID: ${message.data.threadId}\\n`);\n return resolve({\n is_success: true,\n detail: '視聴セッションを取得しました。',\n // コメントサーバーへの接続情報\n message_server_url: message.data.messageServer.uri,\n // コメントサーバー上のスレッド ID\n thread_id: message.data.threadId,\n // メッセージサーバーから受信するコメント (chat メッセージ) に yourpost フラグを付けるためのキー\n your_post_key: (message.data.yourPostKey ? message.data.yourPostKey : null),\n });\n }\n }, { signal: this.abort_controller.signal });\n });\n }\n\n\n /**\n * コメントセッションを初期化する\n * @param comment_session_info コメントサーバーへの接続情報\n */\n private initCommentSession(comment_session_info: IWatchSessionResult): void {\n\n // 初回にドカッと送信されてくる過去コメントを受信し終えるまで格納するバッファ\n const initial_comments_buffer: ICommentData[] = [];\n\n // 初回にドカッと送信されてくる過去コメントを受信し終えたかどうかのフラグ\n let initial_comments_received = false;\n\n // コメントセッション WebSocket を開く\n this.comment_session = new WebSocket(comment_session_info.message_server_url!);\n\n // コメントセッション WebSocket を開いたとき\n this.comment_session.addEventListener('open', () => {\n if (this.comment_session === null) return;\n\n // コメント送信をリクエスト\n // このコマンドを送らないとコメントが送信されてこない\n this.comment_session.send(JSON.stringify([\n {ping: {content: 'rs:0'}},\n {ping: {content: 'ps:0'}},\n {\n thread: {\n version: '20061206', // 設定必須\n thread: comment_session_info.thread_id, // スレッド ID\n threadkey: comment_session_info.your_post_key, // スレッドキー\n user_id: '', // ユーザー ID(設定不要らしい)\n res_from: -50, // 最初にコメントを 50 個送信する\n }\n },\n {ping: {content: 'pf:0'}},\n {ping: {content: 'rf:0'}},\n ]));\n\n }, { signal: this.abort_controller.signal });\n\n // コメントセッション WebSocket からメッセージを受信したとき\n this.comment_session.addEventListener('message', async (event) => {\n\n // メッセージを取得\n const message = JSON.parse(event.data);\n\n // 接続失敗\n if (message.thread !== undefined) {\n if (message.thread.resultcode !== 0) {\n console.error(`[LiveCommentManager][CommentSession] Connection failed. (Code: ${message.thread.resultcode})`);\n return;\n }\n }\n\n // ping メッセージのみ\n // rf:0 が送られてきたら初回にドカッと送信されてくる過去コメントの受信は完了\n // この時点で初回コメントを一気にコールバックに送る\n if (message.ping !== undefined && message.ping.content === 'rf:0') {\n initial_comments_received = true;\n this.on_initial_comments_received(initial_comments_buffer);\n return;\n }\n\n // コメントデータを取得\n const comment = message.chat;\n\n // コメントデータが不正な場合 or 自分のコメントの場合は弾く\n if ((comment === undefined || comment.content === undefined || comment.content === '') ||\n (comment.yourpost && comment.yourpost === 1)) {\n return;\n }\n\n // コメントコマンドをパース\n const { color, position, size } = CommentUtils.parseCommentCommand(comment.mail);\n\n // ミュート対象のコメントかどうかを判定し、もしそうならここで弾く\n if (CommentUtils.isMutedComment(comment.content, comment.user_id, color, position, size)) {\n return;\n }\n\n // コメントリストへ追加するオブジェクト\n const comment_data: ICommentData = {\n id: comment.no,\n text: comment.content,\n time: dayjs(comment.date * 1000).format('HH:mm:ss'),\n user_id: comment.user_id,\n my_post: false,\n };\n\n // もしまだ初回コメントを受信し終えていないなら、バッファに格納して終了\n // 初回コメントはプレイヤーには描画しないため問題ない\n if (initial_comments_received === false) {\n initial_comments_buffer.push(comment_data);\n return;\n }\n\n // 配信で発生する遅延分待ってから\n // おおよその遅延時間は video.buffered.end(0) - video.currentTime で取得できる\n let buffered_end = 0;\n if (this.player.video.buffered.length >= 1) {\n buffered_end = this.player.video.buffered.end(0);\n }\n const comment_delay_time = buffered_end - this.player.video.currentTime;\n // console.log(`[LiveCommentManager][CommentSession] Delay: ${comment_delay_time} sec.`)\n await Utils.sleep(comment_delay_time);\n\n // コールバック関数を実行\n this.on_comment_received(comment_data);\n\n // プレイヤーにコメントを描画する (映像再生時のみ)\n if (this.player.video.paused === false) {\n this.player.danmaku!.draw({\n text: comment.content,\n color: color,\n type: position,\n size: size,\n });\n }\n\n }, { signal: this.abort_controller.signal });\n }\n\n\n /**\n * ニコニコ実況にコメントを送信する\n * @param options DPlayer のコメントオプション\n */\n public sendComment(options: DPlayerType.APIBackendSendOptions): void {\n\n // DPlayer 上のコメント色(カラーコード)とニコニコの色コマンド定義のマッピング\n const color_table = {\n '#FFEAEA': 'white',\n '#F02840': 'red',\n '#FD7E80': 'pink',\n '#FDA708': 'orange',\n '#FFE133': 'yellow',\n '#64DD17': 'green',\n '#00D4F5': 'cyan',\n '#4763FF': 'blue',\n };\n\n // DPlayer 上のコメント位置を表す値とニコニコの位置コマンド定義のマッピング\n const position_table = {\n 'top': 'ue',\n 'right': 'naka',\n 'bottom': 'shita',\n };\n\n // vpos を計算 (10ミリ秒単位)\n // 番組開始時間からの累計秒らしいけど、なぜ指定しないといけないのかは不明\n // 小数点以下は丸めないとコメントサーバー側で投稿エラーになる\n const vpos = Math.round((dayjs().valueOf() - this.vpos_base_timestamp) / 10);\n\n // 視聴セッションが null か、接続が切れている場合は弾く\n if (this.watch_session === null || this.watch_session.readyState !== WebSocket.OPEN) {\n console.error('[LiveCommentManager][WatchSession] Comment sending failed. (Connection is not established.)');\n options.error('コメントの送信に失敗しました。WebSocket 接続が確立されていません。');\n return;\n }\n\n // コメントを送信\n this.watch_session.send(JSON.stringify({\n 'type': 'postComment',\n 'data': {\n // コメント本文\n 'text': options.data.text,\n // コメントの色\n 'color': color_table[options.data.color.toUpperCase()],\n // コメント位置\n 'position': position_table[options.data.type],\n // コメントサイズ (DPlayer とニコニコで表現が共通なため、変換不要)\n 'size': options.data.size,\n // 番組開始時間からの累計秒 (10ミリ秒単位)\n 'vpos': vpos,\n // 匿名コメント (184) にするかどうか\n 'isAnonymous': true,\n }\n }));\n\n // コメント送信のレスポンスを取得\n const abort_controller = new AbortController();\n this.watch_session.addEventListener('message', (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n\n // postCommentResult が送られてきた → コメント送信に成功している\n case 'postCommentResult': {\n // コメント成功を DPlayer にコールバックで通知\n options.success();\n\n // イベントリスナーを削除\n abort_controller.abort();\n break;\n }\n\n // コメント送信直後に error が送られてきた → コメント送信に失敗している\n case 'error': {\n // コメント失敗を DPlayer にコールバックで通知\n let error = `コメントの送信に失敗しました。(${message.data.code})`;\n switch (message.data.code) {\n case 'COMMENT_POST_NOT_ALLOWED':\n error = 'コメントが許可されていません。';\n break;\n case 'INVALID_MESSAGE':\n error = 'コメント内容が無効です。';\n break;\n }\n console.error(`[LiveCommentManager][WatchSession] Comment sending failed. (Code: ${message.data.code})`);\n options.error(error);\n\n // イベントリスナーを解除\n abort_controller.abort();\n break;\n }\n }\n }, { signal: abort_controller.signal });\n }\n\n\n /**\n * 同じ設定でニコニコ実況に再接続する\n */\n private async reconnect(): Promise {\n console.warn('[LiveCommentManager][WatchSession] Reconnecting...');\n this.player.notice('ニコニコ実況に再接続しています…');\n\n // 前のセッションを破棄\n this.destroy();\n\n // セッションを再初期化\n const result = await this.initSession();\n if (result.is_success === false) {\n console.error('[LiveCommentManager][WatchSession] Reconnection failed.');\n this.player.notice(result.detail, undefined, undefined, '#FF6F6A');\n }\n }\n\n\n /**\n * 視聴セッションとコメントセッションをそれぞれ閉じる\n */\n public destroy(): void {\n\n // セッションに紐いているすべての EventListener を解除\n // 再接続する場合に備えて AbortController を作り直す\n this.abort_controller.abort();\n this.abort_controller = new AbortController();\n\n // 視聴セッションを閉じる\n if (this.watch_session !== null) {\n this.watch_session.close(); // WebSocket を閉じる\n this.watch_session = null; // null に戻す\n }\n\n // コメントセッションを閉じる\n if (this.comment_session !== null) {\n this.comment_session.close(); // WebSocket を閉じる\n this.comment_session = null; // null に戻す\n }\n\n // 座席保持用のタイマーをクリア\n if (this.keep_seat_interval_id !== null) {\n window.clearInterval(this.keep_seat_interval_id);\n this.keep_seat_interval_id = null;\n }\n this.vpos_base_timestamp = 0;\n\n console.log('[LiveCommentManager][WatchSession] Destroyed.');\n }\n}\n\nexport default LiveCommentManager;\n","\n\nimport DPlayer, { DPlayerType } from 'dplayer';\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport CommentMuteSettings from '@/components/Settings/CommentMuteSettings.vue';\nimport LiveCommentManager, { ICommentData } from '@/services/player/managers/LiveCommentManager';\nimport useUserStore from '@/store/UserStore';\nimport Utils, { CommentUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'Panel-CommentTab',\n components: {\n CommentMuteSettings,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n\n // 手動スクロール状態かどうか\n is_manual_scroll: false,\n\n // 自動スクロール中かどうか\n // 自動スクロール中の場合、scroll イベントが発火しても無視する\n is_auto_scrolling: false,\n\n // コメントリストの配列\n comment_list: [] as ICommentData[],\n\n // コメントリストの要素\n comment_list_element: null as HTMLElement | null,\n\n // コメントリストのドロップダウン関連\n is_comment_list_dropdown_display: false as boolean,\n comment_list_dropdown_top: 0 as number,\n comment_list_dropdown_comment: null as ICommentData | null,\n\n // LiveCommentManager のインスタンス\n live_comment_manager: null as LiveCommentManager | null,\n\n // ニコニコ実況セッションの初期化に失敗した際のエラーメッセージ\n // 視聴中チャンネルのニコニコ実況がないときなどに発生する\n initialize_failed_message: null as string | null,\n\n // visibilitychange イベントのリスナー\n visibilitychange_listener: null as (() => void) | null,\n\n // ResizeObserver のインスタンス\n resize_observer: null as ResizeObserver | null,\n\n // コメントのミュート設定のモーダルを表示するか\n comment_mute_settings_modal: false,\n\n player: null as DPlayer | null,\n };\n },\n computed: {\n // UserStore に this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useUserStore),\n },\n created() {\n\n // アカウント情報を更新\n this.userStore.fetchUser();\n },\n mounted() {\n\n // コメントリストの要素を取得\n if (this.comment_list_element === null) {\n this.comment_list_element = this.$el.querySelector('.comment-list')!;\n }\n\n // 現在コメントリストがユーザーイベントでスクロールされているかどうか\n let is_user_scrolling = false;\n\n // mousedown → mouseup 中: スクロールバーをマウスでドラッグ\n // 残念ながらスクロールバーのドラッグ中は mousemove のイベントが発火しないため、直接 is_user_scrolling を設定する\n this.comment_list_element.onmousedown = (event: MouseEvent) => {\n // コメントリストの要素の左上を起点としたカーソルのX座標を求める\n if (this.comment_list_element === null) return;\n const x = event.clientX - this.comment_list_element.getBoundingClientRect().left;\n // 座標が clientWidth 以上であれば、スクロールバー上で mousedown されたものとする\n if (x > this.comment_list_element.clientWidth) is_user_scrolling = true;\n };\n this.comment_list_element.onmouseup = (event: MouseEvent) => {\n // コメントリストの要素の左上を起点としたカーソルのX座標を求める\n if (this.comment_list_element === null) return;\n const x = event.clientX - this.comment_list_element.getBoundingClientRect().left;\n // 座標が clientWidth 以上であれば、スクロールバー上で mouseup されたものとする\n if (x > this.comment_list_element.clientWidth) is_user_scrolling = false;\n };\n\n // ユーザーによるスクロールイベントで is_user_scrolling を true にする\n // 0.1 秒後に false にする(継続してイベントが発火すれば再び true になる)\n const on_user_scrolling = () => {\n is_user_scrolling = true;\n window.setTimeout(() => is_user_scrolling = false, 100);\n };\n\n // 現在コメントリストがドラッグされているかどうか\n let is_dragging = false;\n // touchstart → touchend 中: スクロールバーをタップでドラッグ\n this.comment_list_element.ontouchstart = () => is_dragging = true;\n this.comment_list_element.ontouchend = () => is_dragging = false;\n // touchmove + is_dragging 中: コメントリストをタップでドラッグしてスクロール\n this.comment_list_element.ontouchmove = () => is_dragging === true ? on_user_scrolling(): '';\n\n // wheel 中: マウスホイールの回転\n this.comment_list_element.onwheel = on_user_scrolling;\n\n // コメントリストがスクロールされた際、自動スクロール中でない&ユーザーイベントで操作されていれば、手動スクロールモードに設定\n // 手動スクロールモードでは自動スクロールを行わず、ユーザーがコメントリストをスクロールできるようにする\n this.comment_list_element.onscroll = async () => {\n if (this.comment_list_element === null) return;\n\n // scroll イベントは自動スクロールでも発火してしまうので、ユーザーイベントによるスクロールかを確認しないといけない\n // 自動スクロール中かどうかは is_auto_scrolling が true のときで判定できるはずだが、\n // コメントが多くなると is_auto_scrolling が false なのに scroll イベントが遅れて発火してしまうことがある\n if (this.is_auto_scrolling === false && is_user_scrolling === true) {\n\n // 手動スクロールを有効化\n this.is_manual_scroll = true;\n\n // イベント発火時点では scrollTop の値が完全に下にスクロールされていない場合があるため、0.1秒だけ待つ\n await Utils.sleep(0.1);\n\n // 一番下までスクロールされていたら自動スクロールに戻す\n if ((this.comment_list_element.scrollTop + this.comment_list_element.offsetHeight) >\n (this.comment_list_element.scrollHeight - 10)) { // 一番下から 10px 以内\n this.is_manual_scroll = false; // 手動スクロールを無効化\n }\n }\n };\n },\n // 終了前に実行\n beforeDestroy() {\n\n // ニコニコ実況セッションを破棄\n this.destroy();\n\n // ResizeObserver を終了\n if (this.resize_observer !== null) {\n this.resize_observer.disconnect();\n }\n },\n methods: {\n\n // ドロップダウンメニューを表示する\n showCommentListDropdown(event: Event, comment: ICommentData) {\n const comment_list_wrapper_rect = (this.$refs.comment_list_wrapper as HTMLDivElement).getBoundingClientRect();\n const comment_list_dropdown_height = 76; // 76px はドロップダウンメニューの高さ\n const comment_button_rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n // メニューの表示位置をクリックされたコメントに合わせる\n this.comment_list_dropdown_top = comment_button_rect.top - comment_list_wrapper_rect.top;\n // メニューがコメントリストからはみ出るときだけ、表示位置を上側に調整\n if ((this.comment_list_dropdown_top + comment_list_dropdown_height) > comment_list_wrapper_rect.height) {\n this.comment_list_dropdown_top = this.comment_list_dropdown_top - comment_list_dropdown_height + comment_button_rect.height;\n }\n // 表示位置を調整できたので、メニューを表示\n this.comment_list_dropdown_comment = comment;\n this.is_comment_list_dropdown_display = true;\n },\n\n // ドロップダウンメニューを非表示にする\n hideCommentListDropdown() {\n this.is_comment_list_dropdown_display = false;\n this.comment_list = this.comment_list.filter((comment) => {\n return CommentUtils.isMutedComment(comment.text, comment.user_id) === false;\n });\n },\n\n // ミュートするキーワードを追加する\n addMutedKeywords() {\n if (this.comment_list_dropdown_comment === null) return;\n CommentUtils.addMutedKeywords(this.comment_list_dropdown_comment.text);\n this.hideCommentListDropdown();\n },\n\n // ミュートするニコニコユーザー ID を追加する\n addMutedNiconicoUserIds() {\n if (this.comment_list_dropdown_comment === null) return;\n CommentUtils.addMutedNiconicoUserIDs(this.comment_list_dropdown_comment.user_id);\n this.hideCommentListDropdown();\n },\n\n // コメントリストを一番下までスクロールする\n async scrollCommentList(smooth: boolean = false) {\n if (this.comment_list_element === null) return;\n\n // ドロップダウンメニュー表示中なら手動スクロールモードに設定\n if (this.is_comment_list_dropdown_display === true) {\n this.is_manual_scroll = true;\n }\n\n // 手動スクロールモードの時は実行しない\n if (this.is_manual_scroll === true) return;\n\n // 自動スクロール中のフラグを立てる\n this.is_auto_scrolling = true;\n\n // 0.01 秒待って実行し、念押しで2回実行しないと完全に最下部までスクロールされない…(ブラウザの描画バグ?)\n // this.$nextTick() は効かなかった\n for (let index = 0; index < 3; index++) {\n await Utils.sleep(0.01);\n if (smooth === true) { // スムーズスクロール\n this.comment_list_element.scrollTo({top: this.comment_list_element.scrollHeight, left: 0, behavior: 'smooth'});\n } else {\n this.comment_list_element.scrollTo(0, this.comment_list_element.scrollHeight);\n }\n }\n\n // 0.1 秒待つ(重要)\n await Utils.sleep(0.1);\n\n // 自動スクロール中のフラグを降ろす\n this.is_auto_scrolling = false;\n },\n\n // リサイズ時のイベントを初期化\n // プレイヤーが初期化される毎に実行する必要がある\n initReserveObserver() {\n\n // 以前に初期化された ResizeObserver を終了\n if (this.resize_observer !== null) {\n this.resize_observer.disconnect();\n }\n\n // 監視対象の要素\n const resize_observer_element = document.querySelector('.watch-player')!;\n\n // プレイヤーの要素がリサイズされた際に発火するイベント\n const on_resize = () => {\n\n // コメント描画領域の要素\n const comment_area_element = this.player?.template.danmaku!;\n\n // コメント描画領域の幅から算出した、映像の要素の幅/高さ (px)\n // 実際の映像の要素は BML ブラウザ内に入ることがあり正確な算出ができないため、代わりに使っている\n const video_element_width = comment_area_element.clientWidth;\n const video_element_height = comment_area_element.clientWidth * (9 / 16);\n\n // プレイヤー全体と映像の高さの差(レターボックス)から、コメント描画領域の高さを狭める必要があるかを判定する\n // 2で割っているのは単体の差を測るため\n if (resize_observer_element === null || resize_observer_element.clientHeight === null) return;\n const letter_box_height = (resize_observer_element.clientHeight - video_element_height) / 2;\n\n const threshold = Utils.isSmartphoneVertical() ? 0 : window.matchMedia('(max-height: 450px)').matches ? 50 : 66;\n if (letter_box_height < threshold) {\n\n // コメント描画領域に必要な上下マージン\n const comment_area_vertical_margin = (threshold - letter_box_height) * 2;\n\n // 狭めるコメント描画領域の幅\n // 映像の要素の幅をそのまま利用する\n const comment_area_width = video_element_width;\n\n // 狭めるコメント描画領域の高さ\n const comment_area_height = video_element_height - comment_area_vertical_margin;\n\n // 狭めるコメント描画領域のアスペクト比を求める\n // https://tech.arc-one.jp/asepct-ratio/\n const gcd = (x: number, y: number) => { // 最大公約数を求める関数\n if (y === 0) return x;\n return gcd(y, x % y);\n };\n // 幅と高さの最大公約数を求める\n const gcd_result = gcd(comment_area_width, comment_area_height);\n // 幅と高さをそれぞれ最大公約数で割ってアスペクト比を算出\n const comment_area_height_aspect = `${comment_area_width / gcd_result} / ${comment_area_height / gcd_result}`;\n\n // 一時的に transition を無効化する\n // アスペクト比の設定は連続して行われるが、その際に transition が適用されるとワンテンポ遅れたアニメーションになってしまう\n comment_area_element.style.transition = 'none';\n\n // コメント描画領域に算出したアスペクト比を設定する\n comment_area_element.style.setProperty('--comment-area-aspect-ratio', comment_area_height_aspect);\n\n // コメント描画領域に必要な上下マージンを設定する\n comment_area_element.style.setProperty('--comment-area-vertical-margin', `${comment_area_vertical_margin}px`);\n\n // 0.2秒後に実行する\n // 0.2秒より前にもう一度リサイズイベントが来た場合はタイマーがクリアされるため実行されない\n window.setTimeout(() => {\n\n // 再び transition を有効化する\n comment_area_element.style.transition = '';\n\n }, 0.2 * 1000);\n\n } else {\n\n // コメント描画領域に設定したアスペクト比・上下マージンを削除する\n comment_area_element.style.removeProperty('--comment-area-aspect-ratio');\n comment_area_element.style.removeProperty('--comment-area-vertical-margin');\n }\n };\n\n // 要素の監視を開始\n this.resize_observer = new ResizeObserver(on_resize);\n this.resize_observer.observe(resize_observer_element);\n\n // 0.6 秒待ってから初回実行\n // チャンネル切り替え後、再初期化されたプレイヤーに適用するため(早いと再初期化前のプレイヤーに適用されてしまう)\n window.setTimeout(on_resize, 0.6 * 1000);\n },\n\n // ニコニコ実況に接続し、セッションを初期化する\n async initSession(player: DPlayer, display_channel_id: string) {\n this.player = player;\n\n // リサイズ時のイベントを初期化\n // イベントはプレイヤーの DOM に紐づいているため、プレイヤーが破棄→再初期化される毎に実行する必要がある\n this.initReserveObserver();\n\n // タブが非表示状態のときにコメントを格納する配列\n // タブが表示状態になったらコメントリストにのみ表示する(遅れているのでプレイヤーには表示しない)\n const comment_list_buffer: ICommentData[] = [];\n\n // コメントの最大保持数\n const max_comment_count = 500;\n\n // LiveCommentManager を初期化\n this.live_comment_manager = new LiveCommentManager({\n player: player,\n display_channel_id: display_channel_id,\n // 初回の過去コメント (最大50件) を受信したときのコールバック\n on_initial_comments_received: async (initial_comments) => {\n\n // コメントリストに一括で追加\n this.comment_list.push(...initial_comments);\n\n // コメントリストを一番下までスクロール\n this.scrollCommentList();\n },\n // コメントを受信したときのコールバック\n // プレイヤーへの描画は LiveCommentManager が行う\n on_comment_received: async (comment) => {\n\n // タブが非表示状態のときは、バッファにコメントを追加するだけで終了する\n // ここで追加すると、タブが表示状態になったときに一斉に描画されて大変なことになる\n if (document.visibilityState === 'hidden') {\n comment_list_buffer.push(comment);\n return;\n }\n\n // コメントリストのコメント数が max_comment_count 件を超えたら、古いものから順に削除する\n // 仮想スクロールとはいえ、さすがに max_comment_count 件を超えると重くなりそう\n // 手動スクロール時は実行しない\n if (this.comment_list.length >= max_comment_count && this.is_manual_scroll === false) {\n this.comment_list.splice(0, Math.max(0, this.comment_list.length - max_comment_count));\n }\n\n // コメントリストに追加\n this.comment_list.push(comment);\n\n // コメントリストを一番下までスクロール\n this.scrollCommentList();\n }\n });\n\n // タブが表示状態になったときのイベント\n this.visibilitychange_listener = () => {\n if (document.visibilityState === 'visible') {\n\n // コメントリスト + バッファの合計コメント数が max_comment_count 件を超えたら、\n // コメントリスト内のコメントを古いものから順に削除し、max_comment_count 件になるようにする\n const comment_list_and_buffer_length = this.comment_list.length + comment_list_buffer.length;\n if (comment_list_and_buffer_length >= max_comment_count && this.is_manual_scroll === false) {\n this.comment_list.splice(0, Math.max(0, comment_list_and_buffer_length - max_comment_count));\n }\n\n // バッファ内のコメントをコメントリストに一括で追加する\n this.comment_list.push(...comment_list_buffer);\n comment_list_buffer.length = 0; // バッファを空にする\n\n // コメントリストを一番下までスクロール\n this.scrollCommentList();\n }\n };\n document.addEventListener('visibilitychange', this.visibilitychange_listener);\n\n // ニコニコ実況セッションを初期化する\n const result = await this.live_comment_manager.initSession();\n\n // ニコニコ実況セッションの初期化に失敗した\n // 初期化に失敗した際のエラーメッセージを保存しておく (エラー表示などで利用する)\n // プレイヤーへのエラー表示はすでに LiveCommentManager の方で行われているので、ここでは何もしない\n if (result.is_success === false) {\n this.initialize_failed_message = result.detail;\n }\n },\n\n // コメントを送信する\n sendComment(options: DPlayerType.APIBackendSendOptions) {\n\n // 初期化に失敗しているときは実行せず、保存しておいたエラーメッセージを表示する\n if (this.initialize_failed_message !== null) {\n options.error(this.initialize_failed_message);\n return;\n }\n\n // バリデーション\n if (this.userStore.user === null) {\n options.error('コメントするには、KonomiTV アカウントにログインしてください。');\n return;\n }\n if (this.userStore.user.niconico_user_id === null) {\n options.error('コメントするには、ニコニコアカウントと連携してください。');\n return;\n }\n if (this.userStore.user.niconico_user_premium === false && (options.data.type === 'top' || options.data.type === 'bottom')) {\n options.error('コメントを上下に固定するには、ニコニコアカウントのプレミアム会員登録が必要です。');\n return;\n }\n if (this.userStore.user.niconico_user_premium === false && options.data.size === 'big') {\n options.error('コメントサイズを大きめに設定するには、ニコニコアカウントのプレミアム会員登録が必要です。');\n return;\n }\n\n // ニコニコ実況のコメントサーバーにコメントを送信\n this.live_comment_manager?.sendComment(options);\n },\n\n // ニコニコ実況セッションを破棄する\n destroy() {\n\n // タブの表示/非表示の状態が切り替わったときのイベントを削除\n if (this.visibilitychange_listener !== null) {\n document.removeEventListener('visibilitychange', this.visibilitychange_listener);\n this.visibilitychange_listener = null;\n }\n\n // LiveCommentManager を破棄\n if (this.live_comment_manager !== null) {\n this.live_comment_manager.destroy();\n this.live_comment_manager = null;\n }\n\n this.initialize_failed_message = null;\n this.comment_list = [];\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Comment.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Comment.vue?vue&type=template&id=df07fabe&scoped=true&\"\nimport script from \"./Comment.vue?vue&type=script&lang=ts&\"\nexport * from \"./Comment.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Comment.vue?vue&type=style&index=0&id=df07fabe&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"df07fabe\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"program-container\"},[_c('section',{staticClass:\"program-broadcaster\"},[_c('img',{staticClass:\"program-broadcaster__icon\",attrs:{\"src\":`${_vm.Utils.api_base_url}/channels/${(_vm.channelsStore.display_channel_id)}/logo`}}),_c('div',{staticClass:\"program-broadcaster__number\"},[_vm._v(\"Ch: \"+_vm._s(_vm.channelsStore.channel.current.channel_number))]),_c('div',{staticClass:\"program-broadcaster__name\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.name))])]),_c('section',{staticClass:\"program-info\"},[_c('h1',{staticClass:\"program-info__title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_present, 'title'))}}),_c('div',{staticClass:\"program-info__time\"},[_vm._v(\" \"+_vm._s(_vm.ProgramUtils.getProgramTime(_vm.channelsStore.channel.current.program_present))+\" \")]),_c('div',{staticClass:\"program-info__description\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_present, 'description'))}}),_c('div',{staticClass:\"program-info__genre-container\"},_vm._l((_vm.channelsStore.channel.current.program_present?.genres ?? []),function(genre,genre_index){return _c('div',{key:genre_index,staticClass:\"program-info__genre\"},[_vm._v(\" \"+_vm._s(genre.major)+\" / \"+_vm._s(genre.middle)+\" \")])}),0),_c('div',{staticClass:\"program-info__next\"},[_c('span',{staticClass:\"program-info__next-decorate\"},[_vm._v(\"NEXT\")]),_c('Icon',{staticClass:\"program-info__next-icon\",attrs:{\"icon\":\"fluent:fast-forward-20-filled\",\"width\":\"16px\"}})],1),_c('span',{staticClass:\"program-info__next-title\",domProps:{\"innerHTML\":_vm._s(_vm.ProgramUtils.decorateProgramInfo(_vm.channelsStore.channel.current.program_following, 'title'))}}),_c('div',{staticClass:\"program-info__next-time\"},[_vm._v(\" \"+_vm._s(_vm.ProgramUtils.getProgramTime(_vm.channelsStore.channel.current.program_following))+\" \")]),_c('div',{staticClass:\"program-info__status\"},[_c('div',{staticClass:\"program-info__status-force\",class:`program-info__status-force--${_vm.ChannelUtils.getChannelForceType(_vm.channelsStore.channel.current.jikkyo_force)}`},[_c('Icon',{attrs:{\"icon\":\"fa-solid:fire-alt\",\"height\":\"14px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"勢い:\")]),_c('span',{staticClass:\"ml-2\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.jikkyo_force ?? '--')+\" コメ/分\")])],1),_c('div',{staticClass:\"program-info__status-viewers ml-5\"},[_c('Icon',{attrs:{\"icon\":\"fa-solid:eye\",\"height\":\"14px\"}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"視聴数:\")]),_c('span',{staticClass:\"ml-1\"},[_vm._v(_vm._s(_vm.channelsStore.channel.current.viewer_count))])],1)])]),_c('section',{staticClass:\"program-detail-container\"},_vm._l((_vm.channelsStore.channel.current.program_present?.detail ?? {}),function(detail_text,detail_heading){return _c('div',{key:detail_heading,staticClass:\"program-detail\"},[_c('h2',{staticClass:\"program-detail__heading\"},[_vm._v(_vm._s(detail_heading))]),_c('div',{staticClass:\"program-detail__text\",domProps:{\"innerHTML\":_vm._s(_vm.Utils.URLtoLink(detail_text))}})])}),0)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport useChannelsStore from '@/store/ChannelsStore';\nimport Utils, { ChannelUtils, ProgramUtils } from '@/utils';\n\nexport default Vue.extend({\n name: 'Panel-ProgramTab',\n data() {\n return {\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ChannelUtils: ChannelUtils,\n ProgramUtils: ProgramUtils,\n };\n },\n computed: {\n // ChannelsStore に this.channelsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore),\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Program.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Program.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Program.vue?vue&type=template&id=710b8382&scoped=true&\"\nimport script from \"./Program.vue?vue&type=script&lang=ts&\"\nexport * from \"./Program.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Program.vue?vue&type=style&index=0&id=710b8382&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"710b8382\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"remote-control-container\",class:{'remote-control-container--showing': _vm.showing},on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('div',{staticClass:\"remote-control elevation-6\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control__close d-flex align-center rounded-circle cursor-pointer px-2 py-2\",on:{\"click\":function($event){return _vm.$emit('close')}}},[_c('Icon',{attrs:{\"icon\":\"fluent:dismiss-12-filled\",\"width\":\"23px\",\"height\":\"23px\"}})],1),_c('div',{staticClass:\"remote-control-data-broadcasting remote-control-data-broadcasting--disabled\"},[_c('v-progress-circular',{staticClass:\"remote-control__loading\",attrs:{\"indeterminate\":\"\",\"size\":\"60\",\"width\":\"6\"}}),_c('div',{staticClass:\"remote-control__directional-key\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-up\",attrs:{\"data-arib-key-code\":\"1\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-up-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-left\",attrs:{\"data-arib-key-code\":\"3\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-left-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-select\",attrs:{\"data-arib-key-code\":\"18\"}},[_vm._v(\" 決定 \")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-right\",attrs:{\"data-arib-key-code\":\"4\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-right-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-down\",attrs:{\"data-arib-key-code\":\"2\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:chevron-down-12-filled\",\"width\":\"26px\",\"height\":\"26px\"}})],1)]),_c('div',{staticClass:\"remote-control__control-key\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-data\",attrs:{\"data-arib-key-code\":\"20\"}},[_c('svg',{attrs:{\"width\":\"20px\",\"height\":\"20px\",\"viewBox\":\"0 0 512 512\"}},[_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M248.039 381.326L355.039 67.8258C367.539 28.3257 395.039 34.3258 406.539 34.3258C431.039 34.3258 453.376 61.3258 441.039 96.8258C362.639 322.426 343.539 375.326 340.539 384.826C338.486 391.326 342.039 391.326 345.539 391.326C377.039 391.326 386.539 418.326 386.539 435.326C386.539 458.826 371.539 477.326 350.039 477.326H214.539C179.039 477.326 85.8269 431.3 88.0387 335.826C91.0387 206.326 192.039 183.326 243.539 183.326H296.539L265.539 272.326H243.539C185.539 272.326 174.113 314.826 176.039 334.326C180.039 374.826 215.039 389.814 237.039 390.326C244.539 390.5 246.039 386.826 248.039 381.326Z\"}})]),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"データ\")])]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-back\",attrs:{\"data-arib-key-code\":\"19\"}},[_c('Icon',{attrs:{\"icon\":\"fluent:arrow-left-12-filled\",\"width\":\"20px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"戻る\")])],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-blue blue darken-3\",attrs:{\"data-arib-key-code\":\"21\"}},[_vm._v(\"青\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-red red darken-3\",attrs:{\"data-arib-key-code\":\"22\"}},[_vm._v(\"赤\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-green green darken-3\",attrs:{\"data-arib-key-code\":\"23\"}},[_vm._v(\"緑\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"remote-control-button-yellow yellow darken-3\",attrs:{\"data-arib-key-code\":\"24\"}},[_vm._v(\"黄\")])])],1),_c('div',{staticClass:\"remote-control__number-key\"},[_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"1\",\"data-arib-key-code\":\"6\"}},[_vm._v(\"1\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"2\",\"data-arib-key-code\":\"7\"}},[_vm._v(\"2\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"3\",\"data-arib-key-code\":\"8\"}},[_vm._v(\"3\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"4\",\"data-arib-key-code\":\"9\"}},[_vm._v(\"4\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"5\",\"data-arib-key-code\":\"10\"}},[_vm._v(\"5\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"6\",\"data-arib-key-code\":\"11\"}},[_vm._v(\"6\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"7\",\"data-arib-key-code\":\"12\"}},[_vm._v(\"7\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"8\",\"data-arib-key-code\":\"13\"}},[_vm._v(\"8\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"9\",\"data-arib-key-code\":\"14\"}},[_vm._v(\"9\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"10\",\"data-arib-key-code\":\"15\"}},[_vm._v(\"10\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"11\",\"data-arib-key-code\":\"16\"}},[_vm._v(\"11\")]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],attrs:{\"data-remocon-id\":\"12\",\"data-arib-key-code\":\"17\"}},[_vm._v(\"12\")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\nimport Vue, { PropType } from 'vue';\n\nexport default Vue.extend({\n name: 'Panel-Remocon',\n props: {\n // リモコンのモーダルを表示するか\n showing: {\n type: Boolean as PropType,\n required: true,\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Remocon.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Remocon.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Remocon.vue?vue&type=template&id=b659b524&scoped=true&\"\nimport script from \"./Remocon.vue?vue&type=script&lang=ts&\"\nexport * from \"./Remocon.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Remocon.vue?vue&type=style&index=0&id=b659b524&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b659b524\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"twitter-container\"},[_c('v-dialog',{attrs:{\"content-class\":\"zoom-capture-modal-container\",\"max-width\":\"980\",\"transition\":\"slide-y-transition\"},model:{value:(_vm.zoom_capture_modal),callback:function ($$v) {_vm.zoom_capture_modal=$$v},expression:\"zoom_capture_modal\"}},[_c('div',{staticClass:\"zoom-capture-modal\"},[_c('img',{staticClass:\"zoom-capture-modal__image\",attrs:{\"src\":_vm.zoom_capture ? _vm.zoom_capture.image_url: ''}}),_c('a',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"zoom-capture-modal__download\",attrs:{\"href\":_vm.zoom_capture ? _vm.zoom_capture.image_url : '',\"download\":_vm.zoom_capture ? _vm.zoom_capture.filename : ''}},[_c('Icon',{attrs:{\"icon\":\"fa6-solid:download\",\"width\":\"45px\"}})],1)])]),_c('div',{staticClass:\"tab-container\"},[_c('div',{staticClass:\"tab-content tab-content--search\",class:{'tab-content--active': _vm.twitter_active_tab === 'Search'}},[_c('div',{staticClass:\"search px-4\"},[_vm._v(\" リアルタイム検索機能は鋭意開発中です。 \")])]),_c('div',{staticClass:\"tab-content tab-content--timeline\",class:{'tab-content--active': _vm.twitter_active_tab === 'Timeline'}},[_c('div',{staticClass:\"search px-4\"},[_vm._v(\" タイムライン機能は鋭意開発中です。 \")])]),_c('div',{staticClass:\"tab-content tab-content--capture\",class:{'tab-content--active': _vm.twitter_active_tab === 'Capture'}},[_c('div',{staticClass:\"captures\"},_vm._l((_vm.captures),function(capture){return _c('div',{key:capture.image_url,staticClass:\"capture\",class:{\n 'capture--selected': capture.selected,\n 'capture--focused': capture.focused,\n 'capture--disabled': !capture.selected && _vm.tweet_captures.length >= 4,\n },on:{\"click\":function($event){return _vm.clickCapture(capture)}}},[_c('img',{staticClass:\"capture__image\",attrs:{\"src\":capture.image_url}}),_c('div',{staticClass:\"capture__disabled-cover\"}),_c('div',{staticClass:\"capture__selected-number\"},[_vm._v(_vm._s(_vm.tweet_captures.findIndex(blob => blob === capture.blob) + 1))]),_c('Icon',{staticClass:\"capture__selected-checkmark\",attrs:{\"icon\":\"fluent:checkmark-circle-16-filled\"}}),_c('div',{staticClass:\"capture__selected-border\"}),_c('div',{staticClass:\"capture__focused-border\"}),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"capture__zoom\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();_vm.zoom_capture_modal = true; _vm.zoom_capture = capture},\"mousedown\":function($event){$event.preventDefault();$event.stopPropagation();/* 親要素の波紋が広がらないように */}}},[_c('Icon',{attrs:{\"icon\":\"fluent:zoom-in-16-regular\",\"width\":\"32px\"}})],1)],1)}),0),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.captures.length === 0),expression:\"captures.length === 0\"}],staticClass:\"capture-announce\"},[_c('div',{staticClass:\"capture-announce__heading\"},[_vm._v(\"まだキャプチャがありません。\")]),_vm._m(0)])])]),_c('div',{staticClass:\"tab-button-container\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tab-button\",class:{'tab-button--active': _vm.twitter_active_tab === 'Search'},on:{\"click\":function($event){_vm.twitter_active_tab = 'Search'}}},[_c('Icon',{attrs:{\"icon\":\"fluent:search-16-filled\",\"height\":\"18px\"}}),_c('span',{staticClass:\"tab-button__text\"},[_vm._v(\"ツイート検索\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tab-button\",class:{'tab-button--active': _vm.twitter_active_tab === 'Timeline'},on:{\"click\":function($event){_vm.twitter_active_tab = 'Timeline'}}},[_c('Icon',{attrs:{\"icon\":\"fluent:home-16-regular\",\"height\":\"18px\"}}),_c('span',{staticClass:\"tab-button__text\"},[_vm._v(\"タイムライン\")])],1),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tab-button\",class:{'tab-button--active': _vm.twitter_active_tab === 'Capture'},on:{\"click\":function($event){_vm.twitter_active_tab = 'Capture'}}},[_c('Icon',{attrs:{\"icon\":\"fluent:image-copy-20-regular\",\"height\":\"18px\"}}),_c('span',{staticClass:\"tab-button__text\"},[_vm._v(\"キャプチャ\")])],1)]),_c('div',{staticClass:\"tweet-form\",class:{\n 'tweet-form--focused': _vm.is_tweet_hashtag_form_focused || _vm.is_tweet_text_form_focused,\n 'tweet-form--virtual-keyboard-display': _vm.is_virtual_keyboard_display &&\n (_vm.Utils.hasActiveElementClass('tweet-form__hashtag-form') || _vm.Utils.hasActiveElementClass('tweet-form__textarea')) &&\n (() => {_vm.is_hashtag_list_display = false; return true;})(),\n }},[_c('div',{staticClass:\"tweet-form__hashtag\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.tweet_hashtag),expression:\"tweet_hashtag\"}],staticClass:\"tweet-form__hashtag-form\",attrs:{\"type\":\"search\",\"placeholder\":\"#ハッシュタグ\",\"spellcheck\":\"false\"},domProps:{\"value\":(_vm.tweet_hashtag)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.tweet_hashtag=$event.target.value},function($event){return _vm.updateTweetLetterCount()}],\"focus\":function($event){_vm.is_tweet_hashtag_form_focused = true},\"blur\":function($event){_vm.is_tweet_hashtag_form_focused = false},\"change\":function($event){_vm.tweet_hashtag = _vm.formatHashtag(_vm.tweet_hashtag); _vm.updateTweetLetterCount()}}}),_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tweet-form__hashtag-list-button\",on:{\"click\":function($event){return _vm.clickHashtagListButton()}}},[_c('Icon',{attrs:{\"icon\":\"fluent:clipboard-text-ltr-32-regular\",\"height\":\"22px\"}})],1)]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.tweet_text),expression:\"tweet_text\"}],ref:\"tweet_text\",staticClass:\"tweet-form__textarea\",attrs:{\"placeholder\":\"ツイート\",\"spellcheck\":\"false\"},domProps:{\"value\":(_vm.tweet_text)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.tweet_text=$event.target.value},function($event){return _vm.updateTweetLetterCount()}],\"paste\":function($event){return _vm.pasteClipboardData($event)},\"focus\":function($event){_vm.is_tweet_text_form_focused = true},\"blur\":function($event){_vm.is_tweet_text_form_focused = false}}}),_c('div',{staticClass:\"tweet-form__control\"},[_c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"account-button\",class:{'account-button--no-login': !_vm.is_logged_in_twitter},on:{\"click\":function($event){return _vm.clickAccountButton()}}},[_c('img',{staticClass:\"account-button__icon\",attrs:{\"src\":_vm.is_logged_in_twitter ? _vm.selected_twitter_account?.icon_url : '/assets/images/account-icon-default.png'}}),_c('span',{staticClass:\"account-button__screen-name\"},[_vm._v(\" \"+_vm._s(_vm.is_logged_in_twitter ? `@${_vm.selected_twitter_account?.screen_name}` : '連携されていません')+\" \")]),_c('Icon',{staticClass:\"account-button__menu\",attrs:{\"icon\":\"fluent:more-circle-20-regular\",\"width\":\"22px\"}})],1),_c('div',{staticClass:\"limit-meter\"},[_c('div',{staticClass:\"limit-meter__content\",class:{\n 'limit-meter__content--yellow': _vm.tweet_letter_count <= 20,\n 'limit-meter__content--red': _vm.tweet_letter_count <= 0,\n }},[_c('Icon',{staticStyle:{\"margin-right\":\"-2px\"},attrs:{\"icon\":\"fa-brands:twitter\",\"width\":\"12px\"}}),_c('span',[_vm._v(_vm._s(_vm.tweet_letter_count))])],1),_c('div',{staticClass:\"limit-meter__content\"},[_c('Icon',{attrs:{\"icon\":\"fluent:image-16-filled\",\"width\":\"14px\"}}),_c('span',[_vm._v(_vm._s(_vm.tweet_captures.length)+\"/4\")])],1)]),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"tweet-button\",attrs:{\"disabled\":!_vm.is_logged_in_twitter || _vm.tweet_letter_count < 0 ||\n (_vm.tweet_letter_count === 140 && _vm.tweet_captures.length === 0)},on:{\"click\":function($event){return _vm.sendTweet()},\"touchstart\":function($event){return _vm.sendTweet()}}},[_c('Icon',{attrs:{\"icon\":\"fa-brands:twitter\",\"height\":\"16px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"ツイート\")])],1)])]),_c('div',{staticClass:\"hashtag-list\",class:{\n 'hashtag-list--display': _vm.is_hashtag_list_display,\n 'hashtag-list--virtual-keyboard-display': _vm.is_virtual_keyboard_display && _vm.Utils.hasActiveElementClass('hashtag__input'),\n }},[_c('div',{staticClass:\"hashtag-heading\"},[_c('div',{staticClass:\"hashtag-heading__text\"},[_c('Icon',{attrs:{\"icon\":\"charm:hash\",\"width\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"ハッシュタグリスト\")])],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"hashtag-heading__add-button\",on:{\"click\":function($event){_vm.saved_twitter_hashtags.push({id: _vm.Utils.time(), text: '#ここにハッシュタグを入力', editing: false})}}},[_c('Icon',{attrs:{\"icon\":\"fluent:add-12-filled\",\"width\":\"17px\"}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"追加\")])],1)]),_c('draggable',{staticClass:\"hashtag-container\",attrs:{\"handle\":\".hashtag__sort-handle\"},model:{value:(_vm.saved_twitter_hashtags),callback:function ($$v) {_vm.saved_twitter_hashtags=$$v},expression:\"saved_twitter_hashtags\"}},_vm._l((_vm.saved_twitter_hashtags),function(hashtag){return _c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\",value:(!hashtag.editing),expression:\"!hashtag.editing\"}],key:hashtag.id,staticClass:\"hashtag\",class:{'hashtag--editing': hashtag.editing},on:{\"click\":function($event){return _vm.clickHashtag(hashtag)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(hashtag.text),expression:\"hashtag.text\"}],staticClass:\"hashtag__input\",attrs:{\"type\":\"search\",\"spellcheck\":\"false\",\"disabled\":!hashtag.editing},domProps:{\"value\":(hashtag.text)},on:{\"click\":function($event){$event.stopPropagation();},\"input\":function($event){if($event.target.composing)return;_vm.$set(hashtag, \"text\", $event.target.value)}}}),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"hashtag__edit-button\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();hashtag.editing = !hashtag.editing;\n hashtag.text = _vm.formatHashtag(hashtag.text, true); _vm.updateTweetLetterCount()}}},[_c('Icon',{attrs:{\"icon\":hashtag.editing ? 'fluent:checkmark-16-filled': 'fluent:edit-16-filled',\"width\":\"17px\"}})],1),_c('button',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],staticClass:\"hashtag__delete-button\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();_vm.saved_twitter_hashtags.splice(_vm.saved_twitter_hashtags.indexOf(hashtag), 1)}}},[_c('Icon',{attrs:{\"icon\":\"fluent:delete-16-filled\",\"width\":\"17px\"}})],1),_c('div',{staticClass:\"hashtag__sort-handle\"},[_c('Icon',{attrs:{\"icon\":\"material-symbols:drag-handle-rounded\",\"width\":\"17px\"}})],1)])}),0)],1),_c('div',{staticClass:\"twitter-account-list\",class:{'twitter-account-list--display': _vm.is_twitter_account_list_display}},_vm._l((_vm.userStore.user ? _vm.userStore.user.twitter_accounts : []),function(twitter_account){return _c('div',{directives:[{name:\"ripple\",rawName:\"v-ripple\"}],key:twitter_account.id,staticClass:\"twitter-account\",on:{\"click\":function($event){return _vm.updateSelectedTwitterAccount(twitter_account)}}},[_c('img',{staticClass:\"twitter-account__icon\",attrs:{\"src\":twitter_account.icon_url}}),_c('div',{staticClass:\"twitter-account__info\"},[_c('div',{staticClass:\"twitter-account__name\"},[_vm._v(_vm._s(twitter_account.name))]),_c('div',{staticClass:\"twitter-account__screen-name\"},[_vm._v(\"@\"+_vm._s(twitter_account.screen_name))])]),_c('Icon',{directives:[{name:\"show\",rawName:\"v-show\",value:(twitter_account.id === _vm.settingsStore.settings.selected_twitter_account_id),expression:\"twitter_account.id === settingsStore.settings.selected_twitter_account_id\"}],staticClass:\"twitter-account__check\",attrs:{\"icon\":\"fluent:checkmark-16-filled\",\"width\":\"24px\"}})],1)}),0)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('div',{staticClass:\"capture-announce__text\"},[_c('p',{staticClass:\"mt-0 mb-0\"},[_vm._v(\"プレイヤーのキャプチャボタンやショートカットキーでキャプチャを撮ると、ここに表示されます。\")]),_c('p',{staticClass:\"mt-2 mb-0\"},[_vm._v(\"表示されたキャプチャを選択してからツイートすると、キャプチャを付けてツイートできます。\")])])\n}]\n\nexport { render, staticRenderFns }","\n\nimport DPlayer from 'dplayer';\nimport { mapStores } from 'pinia';\nimport Vue, { PropType } from 'vue';\nimport draggable from 'vuedraggable';\n\nimport Twitter from '@/services/Twitter';\nimport { ITwitterAccount } from '@/services/Users';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport useUserStore from '@/store/UserStore';\nimport Utils from '@/utils';\n\n// このコンポーネント内でのキャプチャのインターフェイス\ninterface ITweetCapture {\n blob: Blob;\n filename: string;\n image_url: string;\n selected: boolean;\n focused: boolean;\n}\n\n// このコンポーネント内でのハッシュタグのインターフェイス\ninterface IHashtag {\n id: number;\n text: string;\n editing: boolean;\n}\n\nexport default Vue.extend({\n name: 'Panel-TwitterTab',\n components: {\n draggable,\n },\n props: {\n // プレイヤーのインスタンス\n player: {\n type: null as unknown as PropType, // 代入当初は null になるため苦肉の策\n required: true,\n },\n // 仮想キーボードが表示されているかどうか\n is_virtual_keyboard_display: {\n type: Boolean as PropType,\n required: true,\n },\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n\n // Twitter アカウントを1つでも連携しているかどうか\n is_logged_in_twitter: false,\n\n // 現在ツイート対象として選択されている Twitter アカウント\n selected_twitter_account: null as ITwitterAccount | null,\n\n // 連携している Twitter アカウントリストを表示しているか\n is_twitter_account_list_display: false,\n\n // 保存している Twitter のハッシュタグが入るリスト\n saved_twitter_hashtags: useSettingsStore().settings.saved_twitter_hashtags.map((hashtag, index) => {\n // id プロパティは :key=\"\" に指定するためにつける ID (ミリ秒単位のタイムスタンプ + index で適当に一意になるように)\n return {id: Utils.time() + index, text: hashtag, editing: false} as IHashtag;\n }),\n\n // ハッシュタグリストを表示しているか\n is_hashtag_list_display: false,\n\n // デフォルトで表示される Twitter タブ内のタブ\n twitter_active_tab: useSettingsStore().settings.twitter_active_tab,\n\n // キャプチャを拡大表示するモーダルの表示状態\n zoom_capture_modal: false,\n\n // 現在モーダルで拡大表示中のキャプチャのオブジェクト\n zoom_capture: null as ITweetCapture | null,\n\n // キャプチャリスト\n captures: [] as ITweetCapture[],\n\n // キャプチャリストの要素\n captures_element: null as HTMLDivElement | null,\n\n // ツイートハッシュタグフォームにフォーカスしているか\n is_tweet_hashtag_form_focused: false,\n\n // ツイート本文フォームにフォーカスしているか\n is_tweet_text_form_focused: false,\n\n // ツイートのハッシュタグ\n tweet_hashtag: '',\n\n // ツイート本文\n tweet_text: '',\n\n // ツイートに添付するキャプチャの Blob のリスト\n tweet_captures: [] as Blob[],\n\n // 文字数カウント\n tweet_letter_count: 140,\n\n // ツイートを送信中か (API リクエストを実行するまで)\n is_tweet_sending: false,\n };\n },\n computed: {\n // ChannelsStore / SettingsStore / UserStore に this.channelsStore / this.settingsStore / this.userStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore, useSettingsStore, useUserStore),\n },\n async created() {\n\n // アカウント情報を更新\n await this.userStore.fetchUser();\n\n // ログイン時のみ\n if (this.userStore.is_logged_in === true) {\n\n // 連携している Twitter アカウントがあれば true に設定\n if (this.userStore.user && this.userStore.user.twitter_accounts.length > 0) {\n this.is_logged_in_twitter = true;\n\n // 現在ツイート対象として選択されている Twitter アカウントの ID が設定されていない or ID に紐づく Twitter アカウントがない\n // 連携している Twitter アカウントのうち、一番最初のものを自動選択する\n // ここで言う Twitter アカウントの ID は DB 上で連番で振られるもので、Twitter アカウントそのものの固有 ID ではない\n if (this.settingsStore.settings.selected_twitter_account_id === null ||\n !this.userStore.user.twitter_accounts.some((twitter_account) => {\n return twitter_account.id === this.settingsStore.settings.selected_twitter_account_id;\n })) {\n this.settingsStore.settings.selected_twitter_account_id = this.userStore.user.twitter_accounts[0].id;\n }\n\n // 現在ツイート対象として選択されている Twitter アカウントを取得・設定\n const twitter_account_index = this.userStore.user.twitter_accounts.findIndex((twitter_account) => {\n // Twitter アカウントの ID が選択されているものと一致する\n return twitter_account.id === this.settingsStore.settings.selected_twitter_account_id;\n });\n this.selected_twitter_account = this.userStore.user.twitter_accounts[twitter_account_index];\n }\n }\n\n // 局タグ追加処理を走らせる (ハッシュタグフォームのフォーマット処理も同時に行われるが、元々空なので無意味)\n this.tweet_hashtag = this.formatHashtag(this.tweet_hashtag);\n this.updateTweetLetterCount();\n },\n beforeDestroy() {\n // 終了前にすべてのキャプチャの Blob URL を revoke してリソースを解放する\n for (const capture of this.captures) {\n URL.revokeObjectURL(capture.image_url);\n }\n },\n watch: {\n\n // 保存しているハッシュタグが変更されたら随時 LocalStorage に保存する\n saved_twitter_hashtags: {\n deep: true,\n handler() {\n this.settingsStore.settings.saved_twitter_hashtags = this.saved_twitter_hashtags.map(hashtag => hashtag.text);\n }\n }\n },\n methods: {\n\n // 文字数カウントを変更するイベント\n updateTweetLetterCount() {\n\n // サロゲートペアを考慮し、スプレッド演算子で一度配列化してから数えている\n // ref: https://qiita.com/suin/items/3da4fb016728c024eaca\n this.tweet_letter_count = 140 - [...this.tweet_hashtag].length - [...this.tweet_text].length;\n },\n\n // クリップボード内のデータがペーストされたときのイベント\n pasteClipboardData(event: ClipboardEvent) {\n if (event.clipboardData === null) return;\n\n // 一応配列になっているので回しているが、基本1回のペーストにつき DataTransferItem は1個しか入らない\n for (const clipboard_item of event.clipboardData.items) {\n\n // 画像のみを対象にする (DataTransferItem.type には MIME タイプが入る)\n if (clipboard_item.type.startsWith('image/')) {\n\n // クリップボード内の画像データを File オブジェクトとして取得し、キャプチャリストに追加\n const file = clipboard_item.getAsFile();\n if (file) {\n this.addCaptureList(file, file.name);\n }\n }\n }\n },\n\n // ハッシュタグリストボタンが押されたときのイベント\n clickHashtagListButton() {\n this.is_hashtag_list_display = !this.is_hashtag_list_display;\n // すべてのハッシュタグの編集状態を解除する\n for (const hashtag of this.saved_twitter_hashtags) {\n hashtag.editing = false;\n }\n },\n\n // ハッシュタグがクリックされたときのイベント\n clickHashtag(hashtag: IHashtag) {\n this.tweet_hashtag = hashtag.text;\n this.tweet_hashtag = this.formatHashtag(this.tweet_hashtag);\n this.updateTweetLetterCount();\n window.setTimeout(() => this.is_hashtag_list_display = false, 150);\n },\n\n // アカウントボタンが押されたときのイベント\n clickAccountButton() {\n\n // Twitter アカウントが連携されていない場合は Twitter 設定画面に飛ばす\n if (!this.is_logged_in_twitter) {\n\n // 視聴画面以外に遷移するため、フルスクリーンを解除しないと画面が崩れる\n if (document.fullscreenElement) {\n document.exitFullscreen();\n }\n\n this.$router.push({path: '/settings/twitter'});\n return;\n }\n\n // アカウントリストの表示/非表示を切り替え\n this.is_twitter_account_list_display = !this.is_twitter_account_list_display;\n\n // アカウントリストが表示されているなら、ハッシュタグリストを非表示にする\n if (this.is_twitter_account_list_display === true) {\n this.is_hashtag_list_display = false;\n }\n },\n\n // 選択されている Twitter アカウントを更新する\n updateSelectedTwitterAccount(twitter_account: ITwitterAccount) {\n this.settingsStore.settings.selected_twitter_account_id = twitter_account.id;\n this.selected_twitter_account = twitter_account;\n\n // Twitter アカウントリストのオーバーレイを閉じる (少し待ってから閉じたほうが体感が良い)\n window.setTimeout(() => this.is_twitter_account_list_display = false, 150);\n },\n\n // キャプチャリスト内のキャプチャがクリックされたときのイベント\n clickCapture(capture: ITweetCapture) {\n\n // 選択されたキャプチャが3枚まで & まだ選択されていないならキャプチャをツイート対象に追加する\n if (this.tweet_captures.length < 4 && capture.selected === false) {\n capture.selected = true;\n this.tweet_captures.push(capture.blob);\n } else {\n // ツイート対象のキャプチャになっていたら取り除く\n const index = this.tweet_captures.findIndex(blob => blob === capture.blob);\n if (index > -1) {\n this.tweet_captures.splice(index, 1);\n }\n // キャプチャの選択を解除\n capture.selected = false;\n }\n },\n\n // 撮ったキャプチャを親コンポーネントから受け取り、キャプチャリストに追加する\n async addCaptureList(blob: Blob, filename: string) {\n\n if (this.captures_element === null) {\n this.captures_element = this.$el.querySelector('.tab-content--capture')!;\n }\n\n // 撮ったキャプチャが50件を超えていたら、重くなるので古いものから削除する\n // 削除する前に Blob URL を revoke してリソースを解放するのがポイント\n if (this.captures.length > 50) {\n URL.revokeObjectURL(this.captures[0].image_url);\n this.captures.shift();\n }\n\n // キャプチャリストにキャプチャを追加\n const blob_url = URL.createObjectURL(blob);\n this.captures.push({\n blob: blob,\n filename: filename,\n image_url: blob_url,\n selected: false,\n focused: false,\n });\n\n // キャプチャリストを下にスクロール\n // this.$nextTick() のコールバックで DOM の更新を待つ\n this.$nextTick(() => {\n if (this.captures_element === null) return;\n this.captures_element.scrollTo({\n top: this.captures_element.scrollHeight,\n behavior: 'smooth',\n });\n });\n },\n\n // 撮ったキャプチャに番組タイトルの透かしを描画する\n async drawProgramTitleOnCapture(capture: Blob): Promise {\n\n // キャプチャの Blob を createImageBitmap() で Canvas に描ける ImageBitmap に変換\n const image_bitmap = await createImageBitmap(capture);\n\n // OffscreenCanvas が使えるなら使う (OffscreenCanvas の方がパフォーマンスが良い)\n const canvas = ('OffscreenCanvas' in window) ?\n new OffscreenCanvas(image_bitmap.width, image_bitmap.height) : document.createElement('canvas');\n\n // Canvas にキャプチャを描画\n const context = canvas.getContext('2d', {\n alpha: false,\n desynchronized: true,\n willReadFrequently: false,\n }) as OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n context.drawImage(image_bitmap, 0, 0);\n image_bitmap.close();\n\n // 描画設定\n context.font = 'bold 22px \"YakuHanJPs\", \"Open Sans\", \"Hiragino Sans\", \"Noto Sans JP\", sans-serif'; // フォント\n context.fillStyle = 'rgba(255, 255, 255, 70%)'; // 半透明の白\n context.shadowColor = 'rgba(0, 0, 0, 100%)'; // 影の色\n context.shadowBlur = 4; // 影をぼかすしきい値\n context.shadowOffsetX = 0; // 影のX座標\n context.shadowOffsetY = 0; // 影のY座標\n\n // 番組タイトルの透かしを描画\n const title = this.channelsStore.channel.current.program_present?.title ?? '放送休止';\n switch (this.settingsStore.settings.tweet_capture_watermark_position) {\n case 'TopLeft': {\n context.textAlign = 'left'; // 左寄せ\n context.textBaseline = 'top'; // ベースラインを上寄せ\n context.fillText(title, 16, 12);\n break;\n }\n case 'TopRight': {\n context.textAlign = 'right'; // 右寄せ\n context.textBaseline = 'top'; // ベースラインを上寄せ\n context.fillText(title, canvas.width - 16, 12);\n break;\n }\n case 'BottomLeft': {\n context.textAlign = 'left'; // 左寄せ\n context.textBaseline = 'bottom'; // ベースラインを下寄せ\n context.fillText(title, 16, canvas.height - 12);\n break;\n }\n case 'BottomRight': {\n context.textAlign = 'right'; // 右寄せ\n context.textBaseline = 'bottom'; // ベースラインを下寄せ\n context.fillText(title, canvas.width - 16, canvas.height - 12);\n break;\n }\n }\n\n // Blob にして返す\n if (canvas instanceof OffscreenCanvas) {\n return await canvas.convertToBlob({type: 'image/jpeg', quality: 1});\n } else {\n return new Promise((resolve, reject) => canvas.toBlob(blob => {\n if (blob === null) {\n reject();\n } else {\n resolve(blob);\n }\n }, 'image/jpeg', 1));\n }\n },\n\n // チャンネル名から対応する局タグを取得する\n // とりあえず三大首都圏 + BS のみ対応\n getChannelHashtag(channel_name: string): string | null {\n // NHK\n if (channel_name.startsWith('NHK総合')) {\n return '#nhk';\n } else if (channel_name.startsWith('NHKEテレ')) {\n return '#etv';\n // 民放\n } else if (channel_name.startsWith('日テレ')) {\n return '#ntv';\n } else if (channel_name.startsWith('読売テレビ')) {\n return '#ytv';\n } else if (channel_name.startsWith('中京テレビ')) {\n return '#chukyotv';\n } else if (channel_name.startsWith('テレビ朝日')) {\n return '#tvasahi';\n } else if (channel_name.startsWith('ABCテレビ')) {\n return '#abc';\n } else if (channel_name.startsWith('メ~テレ')) {\n return '#nagoyatv';\n } else if (channel_name.startsWith('TBS') && !channel_name.includes('TBSチャンネル')) {\n return '#tbs';\n } else if (channel_name.startsWith('MBS')) {\n return '#mbs';\n } else if (channel_name.startsWith('CBC')) {\n return '#cbc';\n } else if (channel_name.startsWith('テレビ東京')) {\n return '#tvtokyo';\n } else if (channel_name.startsWith('テレビ大阪')) {\n return '#tvo';\n } else if (channel_name.startsWith('テレビ愛知')) {\n return '#tva';\n } else if (channel_name.startsWith('フジテレビ')) {\n return '#fujitv';\n } else if (channel_name.startsWith('関西テレビ')) {\n return '#kantele';\n } else if (channel_name.startsWith('東海テレビ')) {\n return '#tokaitv';\n // 独立局\n } else if (channel_name.startsWith('TOKYO MX')) {\n return '#tokyomx';\n } else if (channel_name.startsWith('tvk')) {\n return '#tvk';\n } else if (channel_name.startsWith('チバテレ')) {\n return '#chibatv';\n } else if (channel_name.startsWith('テレ玉')) {\n return '#teletama';\n } else if (channel_name.startsWith('サンテレビ')) {\n return '#suntv';\n } else if (channel_name.startsWith('KBS京都')) {\n return '#kbs';\n // BS・CS\n } else if (channel_name.startsWith('NHKBS1')) {\n return '#nhkbs1';\n } else if (channel_name.startsWith('NHKBSプレミアム')) {\n return '#nhkbsp';\n } else if (channel_name.startsWith('BS日テレ')) {\n return '#bsntv';\n } else if (channel_name.startsWith('BS朝日')) {\n return '#bsasahi';\n } else if (channel_name.startsWith('BS-TBS')) {\n return '#bstbs';\n } else if (channel_name.startsWith('BSテレ東')) {\n return '#bstvtokyo';\n } else if (channel_name.startsWith('BSフジ')) {\n return '#bsfuji';\n } else if (channel_name.startsWith('BS11イレブン')) {\n return '#bs11';\n } else if (channel_name.startsWith('BS12トゥエルビ')) {\n return '#bs12';\n } else if (channel_name.startsWith('AT-X')) {\n return '#at_x';\n }\n\n return null;\n },\n\n // ハッシュタグを整形(余計なスペースなどを削り、全角ハッシュを半角ハッシュへ、全角スペースを半角スペースに置換)\n formatHashtag(tweet_hashtag: string, from_hashtag_list: boolean = false): string {\n\n // ハッシュとスペースの表記ゆれを統一し、連続するハッシュやスペースを1つにする\n const tweet_hashtag_array = tweet_hashtag.trim()\n .replaceAll('♯', '#').replaceAll('#', '#').replace(/#{2,}/g, '#').replaceAll(' ', ' ').replaceAll(/ +/g,' ').split(' ')\n .filter(hashtag => hashtag !== '');\n\n // ハッシュタグがついてない場合にハッシュタグを付与\n for (let index in tweet_hashtag_array) {\n if (!tweet_hashtag_array[index].startsWith('#')) {\n tweet_hashtag_array[index] = `#${tweet_hashtag_array[index]}`;\n }\n }\n\n // 設定でオンになっている場合のみ、視聴中チャンネルの局タグを自動で追加する (ハッシュタグリスト内のハッシュタグは除外)\n if (this.settingsStore.settings.auto_add_watching_channel_hashtag === true && from_hashtag_list === false) {\n const channel_hashtag = this.getChannelHashtag(this.channelsStore.channel.current.name);\n if (channel_hashtag !== null) {\n if (tweet_hashtag_array.includes(channel_hashtag) === false) {\n tweet_hashtag_array.push(channel_hashtag);\n }\n }\n }\n\n return tweet_hashtag_array.join(' ');\n },\n\n // ツイートを送信する\n async sendTweet() {\n if (this.selected_twitter_account === null) return;\n\n // 送信中フラグを立てる (重複送信防止)\n if (this.is_tweet_sending === true) return;\n this.is_tweet_sending = true;\n\n // ハッシュタグを整形\n this.tweet_hashtag = this.formatHashtag(this.tweet_hashtag);\n this.updateTweetLetterCount();\n const tweet_hashtag = this.tweet_hashtag;\n\n // 実際に送るツイート本文を作成\n let tweet_text = this.tweet_text;\n if (tweet_hashtag !== '') { // ハッシュタグが入力されているときのみ\n switch (this.settingsStore.settings.tweet_hashtag_position) {\n // ツイート本文の前に追加する\n case 'Prepend': {\n tweet_text = `${tweet_hashtag} ${this.tweet_text}`;\n break;\n }\n // ツイート本文の後に追加する\n case 'Append': {\n tweet_text = `${this.tweet_text} ${tweet_hashtag}`;\n break;\n }\n // ツイート本文の前に追加してから改行する\n case 'PrependWithLineBreak': {\n tweet_text = `${tweet_hashtag}\\n${this.tweet_text}`;\n break;\n }\n // ツイート本文の後に改行してから追加する\n case 'AppendWithLineBreak': {\n tweet_text = `${this.tweet_text}\\n${tweet_hashtag}`;\n break;\n }\n }\n }\n\n // キャプチャへの透かしの描画がオンの場合、キャプチャの Blob を透かし付きのものに差し替える\n const new_tweet_captures: Blob[] = [];\n for (let tweet_capture of this.tweet_captures) {\n if (this.settingsStore.settings.tweet_capture_watermark_position !== 'None') {\n tweet_capture = await this.drawProgramTitleOnCapture(tweet_capture);\n }\n new_tweet_captures.push(tweet_capture);\n }\n\n // ツイート送信 API にリクエスト\n // レスポンスは待たない\n Twitter.sendTweet(this.selected_twitter_account.screen_name, tweet_text, new_tweet_captures).then((result) => {\n this.player.notice(result.message, undefined, undefined, result.is_error ? '#FF6F6A' : undefined);\n });\n\n // 連投防止のため、フォーム上のツイート本文・キャプチャの選択・キャプチャのフォーカスを消去\n // 送信した感を出す意味合いもある\n for (const capture of this.captures) {\n capture.selected = false;\n capture.focused = false;\n }\n this.tweet_captures = [];\n this.tweet_text = '';\n\n // 送信中フラグを下ろす\n this.is_tweet_sending = false;\n\n // パネルを閉じるように親コンポーネントに伝える\n if (this.settingsStore.settings.fold_panel_after_sending_tweet === true) {\n this.$emit('panel_folding_requested');\n (this.$refs.tweet_text as HTMLTextAreaElement).blur(); // フォーカスを外す\n }\n },\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Twitter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Twitter.vue?vue&type=template&id=51116497&scoped=true&\"\nimport script from \"./Twitter.vue?vue&type=script&lang=ts&\"\nexport * from \"./Twitter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Twitter.vue?vue&type=style&index=0&id=51116497&prod&lang=scss&\"\nimport style1 from \"./Twitter.vue?vue&type=style&index=1&id=51116497&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"51116497\",\n null\n \n)\n\nexport default component.exports","\nimport Message from '@/message';\nimport APIClient from '@/services/APIClient';\n\n\nclass Captures {\n\n /**\n * キャプチャをサーバーにアップロードし保存する\n * @param blob キャプチャ画像の Blob\n * @param filename サーバーに保存するときのファイル名\n */\n static async uploadCapture(blob: Blob, filename: string): Promise {\n\n // キャプチャ画像の File オブジェクト (= Blob) を FormData に入れる\n // multipart/form-data で送るために必要\n // ref: https://r17n.page/2020/02/04/nodejs-axios-file-upload-api/\n const form_data = new FormData();\n form_data.append('image', blob, filename);\n\n // API リクエストを実行\n const response = await APIClient.post('/captures', form_data, {headers: {'Content-Type': 'multipart/form-data'}});\n\n // エラー処理\n if ('is_error' in response) {\n switch (response.error.message) {\n case 'Permission denied to save the file': {\n Message.error('キャプチャのアップロードに失敗しました。保存先フォルダに書き込み権限がありません。');\n break;\n }\n case 'No space left on the device': {\n Message.error('キャプチャのアップロードに失敗しました。保存先フォルダに空き容量がありません。');\n break;\n }\n case 'Unexpected error occurred while saving the file': {\n Message.error('キャプチャのアップロードに失敗しました。保存中に予期しないエラーが発生しました。');\n break;\n }\n default: {\n APIClient.showGenericError(response, 'キャプチャのアップロードに失敗しました。');\n break;\n }\n }\n return;\n }\n }\n\n // TODO: キャプチャリスト機能の実装時にいろいろ追加する\n}\n\nexport default Captures;\n","\nimport { Buffer } from 'buffer';\n\nimport { convertBlobToPng, copyBlobToClipboard } from 'copy-image-clipboard';\nimport dayjs from 'dayjs';\nimport DPlayer from 'dplayer';\nimport 'dayjs/locale/ja';\nimport * as piexif from 'piexifjs';\n\nimport APIClient from '@/services/APIClient';\nimport Captures from '@/services/Captures';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils from '@/utils';\n\n\n// キャプチャに書き込む EXIF メタデータのインターフェイス\ninterface ICaptureExifData {\n captured_at: string;\n captured_playback_position: number;\n network_id: number;\n service_id: number;\n event_id: number;\n title: string;\n description: string;\n start_time: string;\n end_time: string;\n duration: number;\n caption_text: string | null;\n is_caption_composited: boolean;\n is_comment_composited: boolean;\n}\n\n// CaptureManager.setEXIFDataToCapture() のオプションのインターフェイス\ninterface ISetEXIFDataToCaptureOptions {\n network_id: number;\n service_id: number;\n event_id: number;\n title: string;\n description: string;\n start_time: string;\n end_time: string;\n duration: number;\n caption_text: string | null;\n is_caption_composited: boolean;\n is_comment_composited: boolean;\n}\n\n// Web フォントを Base64 化したデータ (コメントを SVG の foreignObject としてレンダリングする際に必要)\nlet web_font_noto_sans_base64: string | null = null;\nlet web_font_open_sans_base64: string | null = null;\n\n\nclass CaptureManager {\n\n private player: DPlayer;\n private player_container: HTMLElement;\n private captured_callback: (blob: Blob, filename: string) => void;\n private capture_button: HTMLDivElement;\n private comment_capture_button: HTMLDivElement;\n private canvas: OffscreenCanvas | HTMLCanvasElement;\n private canvas_context: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n private settings_store = useSettingsStore();\n\n constructor(options: {\n player: DPlayer;\n captured_callback: (blob: Blob, filename: string) => void;\n }) {\n this.player = options.player;\n this.player_container = this.player.container;\n this.captured_callback = options.captured_callback;\n\n // コメント付きキャプチャボタンの HTML を追加\n // insertAdjacentHTML で .dplayer-icons-right の一番左側に配置する\n // この後に通常のキャプチャボタンが insert されるので、実際は左から2番目\n // TODO: ボタンのデザインをコメント付きだと分かるようなものに変更する\n this.player_container.querySelector('.dplayer-icons.dplayer-icons-right')!.insertAdjacentHTML('afterbegin', `\n
\n \n \n \n
\n `);\n\n // キャプチャボタンの HTML を追加\n // 標準のスクリーンショット機能は貧弱なので、あえて独自に実装している(そのほうが自由度も高くてやりやすい)\n // insertAdjacentHTML で .dplayer-icons-right の一番左側に配置する\n this.player_container.querySelector('.dplayer-icons.dplayer-icons-right')!.insertAdjacentHTML('afterbegin', `\n
\n \n \n \n
\n `);\n\n this.comment_capture_button = this.player_container.querySelector('.dplayer-comment-capture-icon')!;\n this.capture_button = this.player_container.querySelector('.dplayer-capture-icon')!;\n\n // もし Web フォントがダウンロードされていないならダウンロード\n // コメントのレンダリングに最低限必要なウェイトのみダウンロードする\n // 待つ必要はないので非同期で実行\n // ref: https://stackoverflow.com/a/66969479/17124142\n (async () => {\n const web_font_noto_sans_url = 'https://cdn.jsdelivr.net/npm/noto-sans-japanese@1.0.0/fonts/NotoSansJP-Bold.woff2';\n const web_font_open_sans_url = 'https://cdn.jsdelivr.net/npm/open-sans-all@0.1.3/fonts/open-sans-700.woff2';\n const base64_font_prefix = 'data:font/woff2;base64,';\n if (web_font_noto_sans_base64 === null) {\n const web_font_noto_sans: ArrayBuffer = (await APIClient.get(web_font_noto_sans_url, {\n responseType: 'arraybuffer',\n })).data;\n // Buffer で受け取ったデータを Base64 に変換\n web_font_noto_sans_base64 = base64_font_prefix + Buffer.from(web_font_noto_sans).toString('base64');\n }\n if (web_font_open_sans_base64 === null) {\n const web_font_open_sans: ArrayBuffer = (await APIClient.get(web_font_open_sans_url, {\n responseType: 'arraybuffer',\n })).data;\n // Buffer で受け取ったデータを Base64 に変換\n web_font_open_sans_base64 = base64_font_prefix + Buffer.from(web_font_open_sans).toString('base64');\n }\n })();\n }\n\n\n /**\n * 映像をキャプチャして保存する\n * 映像のみと字幕付き (字幕表示時のみ) の両方のキャプチャを生成できる\n * @param with_comments キャプチャにコメントを合成するかどうか\n */\n public async captureAndSave(with_comments: boolean): Promise {\n\n const total_time = Utils.time();\n\n // チャンネル情報を取得 (ライブ視聴画面のみ、ビデオ視聴画面では null になる)\n const channels_store = useChannelsStore();\n const channel = channels_store.is_showing_live ? channels_store.channel.current : null;\n\n // ***** バリデーション *****\n\n // ラジオチャンネルを視聴している場合 (当然映像がないのでキャプチャできない)\n if (channel !== null && channel.is_radiochannel === true) {\n this.player.notice('ラジオチャンネルはキャプチャできません。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // まだ映像の表示準備が終わっていない (Canvas の幅/高さが 0 のまま)\n if (this.player.video.videoWidth === 0 && this.player.video.videoHeight === 0) {\n this.player.notice('読み込み中はキャプチャできません。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // コメントが表示されていないのにコメント付きキャプチャしようとした\n if (with_comments === true && this.player.danmaku!.showing === false) {\n this.player.notice('コメントを付けてキャプチャするには、コメント表示をオンにしてください。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // ***** キャプチャの下準備 *****\n\n // キャプチャ中はキャプチャボタンをハイライトする\n this.addHighlight(with_comments);\n\n // ファイル名(拡張子なし)\n // TODO: ファイル名パターンを変更できるようにする\n const filename_base = `Capture_${dayjs().format('YYYYMMDD-HHmmss')}`;\n const filename = `${filename_base}.jpg`; // 字幕なしキャプチャ\n const filename_caption = `${filename_base}_caption.jpg`; // 字幕ありキャプチャ\n\n // 字幕・文字スーパーの Canvas を取得\n // getRawCanvas() で映像と同じ解像度の Canvas が取得できる\n const aribb24_caption = this.player.plugins.aribb24Caption!;\n const aribb24_superimpose = this.player.plugins.aribb24Superimpose!;\n const caption_canvas: HTMLCanvasElement = aribb24_caption.getRawCanvas()!;\n const superimpose_canvas: HTMLCanvasElement = aribb24_superimpose.getRawCanvas()!;\n\n // 字幕が表示されているか\n // @ts-ignore\n const is_caption_showing = (aribb24_caption.isShowing === true && aribb24_caption.isPresent());\n\n // 文字スーパーが表示されているか\n // @ts-ignore\n const is_superimpose_showing = (aribb24_superimpose.isShowing === true && aribb24_superimpose.isPresent());\n\n // 字幕が表示されている場合、表示中の字幕のテキストを取得\n // 取得した字幕のテキストは、キャプチャに字幕が合成されているかに関わらず、常に EXIF メタデータに書き込まれる\n // 字幕が表示されていない場合は null を入れ、キャプチャしたシーンで字幕が表示されていなかったことを明示する\n const caption_text = is_caption_showing ? aribb24_caption.getTextContent() : null;\n\n // EXIF に書き込むメタデータを取得する\n // ライブ視聴画面では、番組情報から EXIF に書き込むメタデータを取得する\n let exif_options: ISetEXIFDataToCaptureOptions;\n if (channel !== null) {\n exif_options = {\n network_id: channel.network_id,\n service_id: channel.service_id,\n event_id: channel.program_present?.event_id ?? -1,\n title: channel.program_present?.title ?? '放送休止',\n description: channel.program_present?.description ?? '',\n start_time: channel.program_present?.start_time ?? '2000-01-01T00:00:00+09:00',\n end_time: channel.program_present?.end_time ?? '2000-01-01T00:00:00+09:00',\n duration: channel.program_present?.duration ?? 0,\n caption_text: caption_text,\n is_caption_composited: false, // 後で上書きされる\n is_comment_composited: false, // 後で上書きされる\n };\n // ビデオ視聴画面では、録画番組情報から EXIF に書き込むメタデータを取得する\n } else {\n // TODO\n exif_options = {\n network_id: -1,\n service_id: -1,\n event_id: -1,\n title: '録画番組',\n description: '',\n start_time: '2000-01-01T00:00:00+09:00',\n end_time: '2000-01-01T00:00:00+09:00',\n duration: 0,\n caption_text: caption_text,\n is_caption_composited: false, // 後で上書きされる\n is_comment_composited: false, // 後で上書きされる\n };\n }\n\n // エクスポートして保存する共通処理\n const export_and_save = async (\n canvas: OffscreenCanvas | HTMLCanvasElement,\n filename: string,\n exif_options: ISetEXIFDataToCaptureOptions,\n ): Promise => {\n\n // Canvas を Blob にエクスポート\n const time = Utils.time();\n let blob: Blob;\n try {\n blob = await this.exportToBlob(canvas);\n } catch (error) {\n console.log(error);\n this.player.notice('キャプチャの保存に失敗しました。', undefined, undefined, '#FF6F6A');\n return false;\n }\n console.log('[CaptureManager] Export to Blob:', Utils.mathFloor(Utils.time() - time, 3), 'sec');\n\n // キャプチャに番組情報などのメタデータ (EXIF) をセット\n blob = await this.setEXIFDataToCapture(blob, exif_options);\n\n // キャプチャの保存先: ブラウザでダウンロード or 両方\n if (['Browser', 'Both'].includes(this.settings_store.settings.capture_save_mode)) {\n Utils.downloadBlobData(blob, filename);\n }\n\n // キャプチャの保存先: KonomiTV サーバーにアップロード or 両方\n // 時間がかかるし完了を待つ必要がないので非同期\n if (['UploadServer', 'Both'].includes(this.settings_store.settings.capture_save_mode)) {\n Captures.uploadCapture(blob, filename);\n }\n\n return blob;\n };\n\n // ***** 映像のキャプチャ *****\n\n // null はまだキャプチャしていないことを、false はキャプチャに失敗したことを表す\n let capture_normal: {blob: Blob, filename: string} | null | false = null;\n let capture_caption: {blob: Blob, filename: string} | null | false = null;\n\n // 映像の ImageBitmap を取得\n const image_bitmap = await createImageBitmap(this.player.video);\n\n // もし映像以外に追加で合成するものがないなら、処理の高速化のために ImageBitmap をそのまま Canvas に転送して Blob 化する\n // コメントキャプチャではない & 文字スーパーが表示されていない (=合成処理を行う必要がない) &\n // (字幕が表示されていない or 字幕が表示されているが合成しないように設定されている) 場合\n // コメント付きキャプチャではなく、かつ字幕のない番組では大半がここの処理を通ることになる\n if (with_comments === false && is_superimpose_showing === false &&\n (is_caption_showing === false || this.settings_store.settings.capture_caption_mode === 'VideoOnly')) {\n\n // OffscreenCanvas が使えるなら使う (OffscreenCanvas の方がパフォーマンスが良い)\n const bitmap_canvas = ('OffscreenCanvas' in window) ?\n new OffscreenCanvas(image_bitmap.width, image_bitmap.height) : document.createElement('canvas');\n bitmap_canvas.width = image_bitmap.width; // HTMLCanvasElement でのフォールバック用\n bitmap_canvas.height = image_bitmap.height; // HTMLCanvasElement でのフォールバック用\n const canvas_context = bitmap_canvas.getContext('bitmaprenderer', {alpha: false}) as ImageBitmapRenderingContext;\n\n // Canvas に映像がキャプチャされた ImageBitmap を転送\n // 描画ではなくゼロコピーで転送しているらしい…?\n canvas_context.transferFromImageBitmap(image_bitmap);\n image_bitmap.close(); // 今後使うことはないので明示的に閉じる\n\n // ファイル名\n // 保存モードが「字幕キャプチャのみ」のとき (=字幕キャプチャのみをキャプチャする設定にしていたが、字幕がそもそもないとき) は、\n // 便宜上字幕ありキャプチャと同じファイル名で保存する\n const filename_real =\n (this.settings_store.settings.capture_caption_mode === 'CompositingCaption') ? filename_caption : filename;\n\n // Blob にエクスポートして保存\n // false が返ってきた場合は失敗を意味する\n const blob = await export_and_save(bitmap_canvas, filename_real, {\n ...exif_options,\n is_caption_composited: false,\n is_comment_composited: false,\n });\n if (blob !== false) {\n capture_normal = {blob: blob, filename: filename_real};\n } else {\n capture_normal = false; // キャプチャのエクスポートに失敗\n }\n\n // キャプチャの Blob をコールバック関数に渡す\n // ここでコールバック関数に渡した Blob が Twitter タブのキャプチャリストに送られる\n if (capture_normal !== false) {\n this.captured_callback(capture_normal.blob, capture_normal.filename);\n }\n\n // ***** 通常実行 (Canvas にキャプチャ以外のデータを重ねて描画する必要があるケース) *****\n } else {\n\n const promises: Promise[] = [];\n\n // キャプチャ用の Canvas を初期化\n // OffscreenCanvas が使えるなら使う (OffscreenCanvas の方がパフォーマンスが良い)\n const canvas = ('OffscreenCanvas' in window) ?\n new OffscreenCanvas(this.player.video.videoWidth, this.player.video.videoHeight) : document.createElement('canvas');\n canvas.width = this.player.video.videoWidth; // HTMLCanvasElement でのフォールバック用\n canvas.height = this.player.video.videoHeight; // HTMLCanvasElement でのフォールバック用\n const canvas_context = canvas.getContext('2d', {\n alpha: false,\n desynchronized: true,\n willReadFrequently: false,\n }) as OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n // Canvas に映像がキャプチャされた ImageBitmap を描画\n canvas_context.drawImage(image_bitmap, 0, 0, canvas.width, canvas.height);\n\n // 文字スーパーを描画 (表示されている場合)\n // 文字スーパー自体が稀だし、文字スーパーなしでキャプチャ撮りたいユースケースはない…はず\n if (is_superimpose_showing === true) {\n canvas_context.drawImage(superimpose_canvas, 0, 0, canvas.width, canvas.height);\n }\n\n // コメント付きキャプチャ: 追加でニコニコ実況のコメントを描画\n let comments_image: HTMLImageElement | null = null;\n if (with_comments === true) {\n comments_image = await this.createCommentsImage();\n await this.drawComments(canvas, canvas_context, comments_image);\n }\n\n // ***** 映像のみのキャプチャを保存 *****\n\n // 字幕表示時のキャプチャの保存モード: 映像のみ or 両方\n // 保存モードが「字幕キャプチャのみ」になっているが字幕が表示されていない場合も実行する\n if (['VideoOnly', 'Both'].includes(this.settings_store.settings.capture_caption_mode) || is_caption_showing === false) {\n\n promises.push((async () => {\n\n // ファイル名\n // 保存モードが「字幕キャプチャのみ」のとき (=字幕キャプチャのみをキャプチャする設定にしていたが、字幕がそもそもないとき) は、\n // 便宜上字幕ありキャプチャと同じファイル名で保存する\n const filename_real =\n (this.settings_store.settings.capture_caption_mode === 'CompositingCaption') ? filename_caption : filename;\n\n // Blob にエクスポートして保存\n const blob = await export_and_save(canvas, filename_real, {\n ...exif_options,\n is_caption_composited: false,\n is_comment_composited: with_comments,\n });\n if (blob !== false) {\n capture_normal = {blob: blob, filename: filename_real};\n } else {\n capture_normal = false; // キャプチャのエクスポートに失敗\n }\n\n // キャプチャの Blob をコールバック関数に渡す\n // ここでコールバック関数に渡した Blob が Twitter タブのキャプチャリストに送られる\n if (capture_normal !== false) {\n this.captured_callback(capture_normal.blob, capture_normal.filename);\n }\n\n })());\n }\n\n // ***** 字幕付きのキャプチャを保存 *****\n\n // 字幕表示時のキャプチャの保存モード: 字幕キャプチャのみ or 両方\n // 字幕が表示されているときのみ実行(字幕が表示されていないのにやっても意味がない)\n if (['CompositingCaption', 'Both'].includes(this.settings_store.settings.capture_caption_mode) && is_caption_showing === true) {\n\n promises.push((async () => {\n\n // コメント付きキャプチャ: 映像と文字スーパーの描画をやり直す\n // すでに字幕なしキャプチャを生成する過程でコメントを描画してしまっているため、映像描画からやり直す必要がある\n if (with_comments === true) {\n canvas_context.drawImage(image_bitmap, 0, 0, canvas.width, canvas.height);\n if (is_superimpose_showing === true) {\n canvas_context.drawImage(superimpose_canvas, 0, 0, canvas.width, canvas.height);\n }\n }\n image_bitmap.close(); // 今後使うことはないので明示的に閉じる\n\n // 字幕を重ねて描画\n canvas_context.drawImage(caption_canvas, 0, 0, canvas.width, canvas.height);\n\n // コメント付きキャプチャ: 追加でニコニコ実況のコメントを描画\n if (with_comments === true && comments_image !== null) {\n await this.drawComments(canvas, canvas_context, comments_image);\n }\n\n // Blob にエクスポートして保存\n const blob = await export_and_save(canvas, filename_caption, {\n ...exif_options,\n is_caption_composited: true,\n is_comment_composited: with_comments,\n });\n if (blob !== false) {\n capture_caption = {blob: blob, filename: filename_caption};\n } else {\n capture_caption = false; // キャプチャのエクスポートに失敗\n }\n\n // キャプチャの Blob をコールバック関数に渡す\n // ここでコールバック関数に渡した Blob が Twitter タブのキャプチャリストに送られる\n if (capture_caption !== false) {\n // 字幕表示時のキャプチャの保存モードが「両方 (Both)」のときのみ、映像のみのキャプチャの生成が終わるまで待ってから実行\n // 必ずキャプチャリストへの追加が [映像のみ] → [字幕付き] の順序で行われるようにする\n if (this.settings_store.settings.capture_caption_mode === 'Both') {\n while (capture_normal === null) {\n // Blob (成功) か false (失敗) が capture_normal に入るまでループ\n await Utils.sleep(0.01);\n }\n }\n this.captured_callback(capture_caption.blob, capture_caption.filename);\n }\n\n })());\n }\n\n // すべてのキャプチャ処理が終わるまで待つ\n await Promise.all(promises);\n }\n\n console.log('[CaptureManager] Total:', Utils.mathFloor(Utils.time() - total_time, 3), 'sec');\n\n // キャプチャボタンのハイライトを削除する\n this.removeHighlight(with_comments);\n\n // Twitter タブのキャプチャリストに送る処理が最優先なので、コールバックを実行しきった後に時間のかかるクリップボードへのコピーを行う\n for (const capture of [capture_normal, capture_caption]) {\n\n // クリップボードへのコピーが有効なら、キャプチャの Blob をクリップボードにコピー\n // PNG 以外は受け付けないそうなので、JPEG を PNG に変換してからコピーしている\n if (this.settings_store.settings.capture_copy_to_clipboard && capture !== null && typeof capture === 'object') {\n try {\n await copyBlobToClipboard(await convertBlobToPng(capture.blob));\n } catch (error) {\n this.player.notice('クリップボードへのキャプチャのコピーに失敗しました。', undefined, undefined, '#FF6F6A');\n console.error(error);\n }\n }\n }\n }\n\n\n /**\n * キャプチャボタンをハイライトする\n * @param with_comments コメント付きキャプチャボタンをハイライトするか\n */\n private addHighlight(with_comments: boolean = false): void {\n if (with_comments) {\n this.comment_capture_button.classList.add('dplayer-capturing');\n } else {\n this.capture_button.classList.add('dplayer-capturing');\n }\n }\n\n\n /**\n * キャプチャボタンのハイライトを外す\n * @param with_comments コメント付きキャプチャボタンのハイライトを外すか\n */\n private removeHighlight(with_comments: boolean = false): void {\n if (with_comments) {\n this.comment_capture_button.classList.remove('dplayer-capturing');\n } else {\n this.capture_button.classList.remove('dplayer-capturing');\n }\n }\n\n\n /**\n * DPlayer から取得したコメント HTML を SVG 画像の HTMLImageElement に変換する\n * ZenzaWatch と html-to-image を参考に実装した\n * ref: https://github.com/bubkoo/html-to-image/blob/v1.11.11/src/util.ts#L202-L224\n * ref: https://github.com/segabito/ZenzaWatch/blob/master/packages/lib/src/dom/VideoCaptureUtil.js\n * ref: https://web.archive.org/web/2/https://developer.mozilla.org/ja/docs/Web/HTML/Canvas/Drawing_DOM_objects_into_a_canvas\n * @param comments_html DPlayer から取得したコメント HTML\n * @param width SVG 画像の幅\n * @param height SVG 画像の高さ\n * @returns SVG 画像の HTMLImageElement\n */\n private async commentsHTMLtoSVGImage(comments_html: string, width: number, height: number): Promise {\n\n // SVG の foreignObject を使い、HTML をそのまま SVG に埋め込む\n\n // SVG を作成\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n\n // SVG に foreignObject を追加\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n\n // foreignObject にコンテナ要素を追加\n const body = document.createElement('body');\n foreignObject.appendChild(body);\n\n // コンテナ要素に CSS と Web フォントの定義を追加\n // SVG なので、CSS はインラインでないと適用されない…\n // DPlayer の danmaku.scss の内容のうち、描画に必要なプロパティのみを列挙 (追加変更したものもある)\n // ref: https://github.com/tsukumijima/DPlayer/blob/master/src/css/danmaku.scss\n const style = document.createElement('style');\n style.appendChild(document.createTextNode(`\n @font-face {\n font-family: 'Noto Sans JP';\n font-weight: bold;\n src: url(${web_font_noto_sans_base64}) format('woff2');\n }\n @font-face {\n font-family: 'Open Sans';\n font-weight: bold;\n src: url(${web_font_open_sans_base64}) format('woff2');\n }\n .dplayer-danmaku {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n color: #fff;\n font-size: 29px;\n font-family: 'Open Sans', 'Hiragino Sans', 'Noto Sans JP', sans-serif;\n }\n .dplayer-danmaku .dplayer-danmaku-item {\n display: inline-block;\n line-height: 1;\n font-weight: bold;\n font-size: var(--dplayer-danmaku-font-size);\n opacity: var(--dplayer-danmaku-opacity);\n text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\n white-space: nowrap;\n }\n .dplayer-danmaku .dplayer-danmaku-item--demo {\n position: absolute;\n visibility: hidden;\n }\n .dplayer-danmaku .dplayer-danmaku-item span {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big {\n font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\n }\n .dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small {\n font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\n }\n .dplayer-danmaku .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n }\n .dplayer-danmaku .dplayer-danmaku-top, .dplayer-danmaku .dplayer-danmaku-bottom {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n `));\n body.appendChild(style);\n\n // コンテナ要素にコメントの HTML を追加\n const temp = document.createElement('div');\n temp.innerHTML = comments_html;\n body.appendChild(temp.childNodes[0]);\n\n // Data URL 化して Image オブジェクトにする\n const image = new Image();\n const serialized_svg = new XMLSerializer().serializeToString(svg);\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(serialized_svg)}`;\n\n // 画像を読み込んでデコードしてから返す\n await new Promise((resolve, reject) => {\n image.onload = resolve;\n image.onerror = reject;\n });\n await image.decode();\n return image;\n }\n\n\n /**\n * DPlayer から表示中のコメントを取得し、SVG 画像の HTMLImageElement を作成する\n * @returns 表示されているコメントが描画された HTMLImageElement\n */\n private async createCommentsImage(): Promise {\n\n // コメントが表示されている要素の HTML を取得する\n let comments_html = this.player.template.danmaku.outerHTML;\n\n // HTML を取得するだけではスクロール中コメントの表示位置が特定できないため、HTML を修正する\n for (const comment of this.player_container.querySelectorAll('.dplayer-danmaku-move')) { // コメントの数だけ置換\n // スクロール中のコメントの表示座標を計算\n const position = comment.getBoundingClientRect().left - this.player.video.getBoundingClientRect().left;\n comments_html = comments_html.replace(/transform: translateX\\(.*?\\);/, `left: ${position}px;`)\n .replaceAll('border: 2px solid #E64F97;', '');\n }\n\n // HTML を画像として取得\n // SVG のサイズはコメントが表示されている要素に合わせる (そうしないとプレイヤー側と一致しない)\n // SVG はベクター画像なので、リサイズしても画質が変わらないはず\n return await this.commentsHTMLtoSVGImage(\n comments_html,\n this.player.template.danmaku.offsetWidth,\n this.player.template.danmaku.offsetHeight,\n );\n }\n\n\n /**\n * 現在表示されているニコニコ実況のコメントを Canvas に描画する\n */\n private async drawComments(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n canvas_context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n comments_image: HTMLImageElement,\n ): Promise {\n\n // コメント描画領域がコントロールの表示によりリサイズされている (=16:9でない) 場合も考慮して、コメント要素の offsetWidth から高さを求める\n // 映像の横解像度 (ex: 1920) がコメント描画領域の幅 (ex: 1280) の何倍かの割合 (ex: 1.5 (150%))\n const draw_scale_ratio = canvas.width / this.player.template.danmaku.offsetWidth;\n\n // コメント描画領域の高さを映像の横解像度に合わせて(コメント描画領域のアスペクト比を維持したまま)拡大した値\n // 映像の縦解像度が 1080 のとき、コントロールがコメント領域と被っていない or 表示されていないなら、この値は 1080 に近くなる\n const draw_height = this.player.template.danmaku.offsetHeight * draw_scale_ratio;\n\n canvas_context.drawImage(comments_image, 0, 0, canvas.width, draw_height);\n }\n\n\n /**\n * Canvas もしくは OffscreenCanvas に描画されている画像を Blob に変換する\n * JPEG 画像の品質は 99% にした方が若干 Blob 変換までの速度が速い (?)\n * @param canvas Canvas もしくは OffscreenCanvas\n * @returns Blob 化した画像\n */\n private async exportToBlob(canvas: HTMLCanvasElement | OffscreenCanvas): Promise {\n if ('OffscreenCanvas' in window && canvas instanceof OffscreenCanvas) {\n return await canvas.convertToBlob({type: 'image/jpeg', quality: 0.99});\n } else if (canvas instanceof HTMLCanvasElement) {\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob !== null) {\n resolve(blob);\n } else {\n reject(new Error('Failed to convert canvas to blob'));\n }\n }, 'image/jpeg', 0.99);\n });\n }\n // ここに来ることはあり得ない\n throw new Error('Failed to convert canvas to blob');\n }\n\n\n /**\n * キャプチャ画像に番組情報と撮影時刻、字幕やコメントが合成されているかどうかのメタデータ (EXIF) をセットする\n * @param blob キャプチャ画像の Blob オブジェクト\n * @param options EXIF にセットする番組情報データ・字幕テキスト・字幕が合成されているかどうか・コメントが合成されているかどうか\n * @returns EXIF が追加されたキャプチャ画像の Blob オブジェクト\n */\n private async setEXIFDataToCapture(blob: Blob, options: ISetEXIFDataToCaptureOptions): Promise {\n\n // 番組開始時刻換算のキャプチャ時刻 (秒)\n const captured_playback_position = dayjs().diff(dayjs(options.start_time), 'second', true);\n\n // EXIF の XPComment 領域に入れるメタデータの JSON オブジェクト\n // 撮影時刻とチャンネル・番組を一意に特定できる情報を入れる\n const json: ICaptureExifData = {\n captured_at: dayjs().format('YYYY-MM-DDTHH:mm:ss+09:00'), // ISO8601 フォーマットのキャプチャ時刻\n captured_playback_position: captured_playback_position, // 番組開始時刻換算のキャプチャ時刻 (秒)\n network_id: options.network_id, // 番組が放送されたチャンネルのネットワーク ID\n service_id: options.service_id, // 番組が放送されたチャンネルのサービス ID\n event_id: options.event_id, // 番組のイベント ID\n title: options.title, // 番組タイトル\n description: options.description, // 番組概要\n start_time: options.start_time, // 番組開始時刻 (ISO8601 フォーマット)\n end_time: options.end_time, // 番組終了時刻 (ISO8601 フォーマット)\n duration: options.duration, // 番組長 (秒)\n caption_text: options.caption_text, // 字幕のテキスト (キャプチャした瞬間に字幕が表示されていなかったときは null)\n is_caption_composited: options.is_caption_composited, // 字幕が合成されているか\n is_comment_composited: options.is_comment_composited, // コメントが合成されているか\n };\n\n // 保存する EXIF メタデータを構築\n // ref: 「カメラアプリで体感するWeb App」4.2\n const datetime = dayjs().format('YYYY:MM:DD HH:mm:ss'); // すべてコロンで区切るのがポイント\n const exif: piexif.IExif = {\n '0th': {\n // 必須らしいプロパティ\n // とりあえずデフォルト値 (?) を設定しておく\n [piexif.TagValues.ImageIFD.XResolution]: [72, 1],\n [piexif.TagValues.ImageIFD.YResolution]: [72, 1],\n [piexif.TagValues.ImageIFD.ResolutionUnit]: 2,\n [piexif.TagValues.ImageIFD.YCbCrPositioning]: 1,\n // 撮影時刻\n [piexif.TagValues.ImageIFD.DateTime]: datetime,\n // ソフトウェア名\n [piexif.TagValues.ImageIFD.Software]: `KonomiTV version ${Utils.version}`,\n // Microsoft 拡張のコメント領域(エクスプローラーで出てくるコメント欄と同じもの)\n // ref: https://stackoverflow.com/a/66186660/17124142\n [piexif.TagValues.ImageIFD.XPComment]: [...Buffer.from(JSON.stringify(json), 'ucs2')],\n },\n 'Exif': {\n // 必須らしいプロパティ\n // とりあえずデフォルト値 (?) を設定しておく\n [piexif.TagValues.ExifIFD.ExifVersion]: '0230',\n [piexif.TagValues.ExifIFD.ComponentsConfiguration]: '\\x01\\x02\\x03\\x00',\n [piexif.TagValues.ExifIFD.FlashpixVersion]: '0100',\n [piexif.TagValues.ExifIFD.ColorSpace]: 1,\n // 撮影時刻\n [piexif.TagValues.ExifIFD.DateTimeOriginal]: datetime,\n [piexif.TagValues.ExifIFD.DateTimeDigitized]: datetime,\n },\n };\n const exif_string = piexif.dump(exif); // バイナリ文字列に変換した EXIF データ\n\n // piexifjs はバイナリ文字列か DataURL しか受け付けないので、Blob をバイナリ文字列に変換\n const blob_string: string = await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsBinaryString(blob); // バイナリ文字列で読み込む\n });\n\n // 画像に EXIF を挿入\n // 戻り値は EXIF が追加された画像のバイナリ文字列 (なぜ未だにバイナリ文字列で実装してるんだ…)\n const blob_string_new = piexif.insert(exif_string, blob_string);\n\n // 画像のバイナリ文字列を ArrayBuffer に変換\n // ref: 「カメラアプリで体感するWeb App」4.2\n const buffer = new Uint8Array(blob_string_new.length);\n for (let index = 0; index < buffer.length; index++) {\n buffer[index] = blob_string_new.charCodeAt(index) & 0xff;\n }\n\n // 新しい Blob を返す\n return new Blob([buffer], {type: blob.type});\n }\n}\n\nexport default CaptureManager;\n","\nimport * as Comlink from 'comlink';\nimport dayjs from 'dayjs';\nimport DPlayer from 'dplayer';\nimport { BMLBrowser, BMLBrowserFontFace } from 'web-bml/client/bml_browser';\nimport { AribKeyCode } from 'web-bml/client/content';\nimport { ResponseMessage } from 'web-bml/server/ws_api';\n\nimport router from '@/router';\nimport PlayerManager from '@/services/player/PlayerManager';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { PlayerUtils, ProgramUtils } from '@/utils';\nimport { ILivePSIArchivedDataDecoder } from '@/workers/LivePSIArchivedDataDecoder';\n\n\n// LivePSIArchivedDataDecoder を Web Worker で動作させるためのラッパー\n// Comlink を使い、Web Worker とメインスレッド間でオブジェクトをやり取りする\nconst worker = new Worker(new URL('@/workers/LivePSIArchivedDataDecoder', import.meta.url));\nconst LivePSIArchivedDataDecoderWorker =\n Comlink.wrap Comlink.Remote>(worker);\n\n\nclass LiveDataBroadcastingManager implements PlayerManager {\n\n // BML 用フォント\n static readonly round_gothic: BMLBrowserFontFace = {\n source: 'url(\"https://cdn.jsdelivr.net/gh/googlefonts/kosugi-maru@main/fonts/webfonts/KosugiMaru-Regular.woff2\"), local(\"sans-serif\")',\n };\n static readonly square_gothic: BMLBrowserFontFace = {\n source: 'url(\"https://cdn.jsdelivr.net/gh/googlefonts/kosugi@main/fonts/webfonts/Kosugi-Regular.woff2\"), local(\"sans-serif\")',\n };\n\n private player: DPlayer;\n private display_channel_id: string;\n private media_element: HTMLElement;\n private container_element: HTMLElement | null = null;\n\n private remocon_element: HTMLElement;\n private remocon_data_broadcasting_element: HTMLElement;\n private remocon_button_event_abort_controller: AbortController | null = null;\n\n // DPlayer のリサイズを監視する ResizeObserver\n private resize_observer: ResizeObserver | null = null;\n\n // BML ブラウザのインスタンス\n // Vue.js は data() で設定した変数を再帰的に監視するが、BMLBrowser 内の JS-Interpreter のインスタンスが\n // Vue.js の監視対象に入ると謎のエラーが発生してしまうため、プロパティを Hard Private にして監視対象から外す\n #bml_browser: BMLBrowser | null = null;\n\n // BML ブラウザの幅と高さ\n private bml_browser_width: number = 960;\n private bml_browser_height: number = 540;\n\n // BML ブラウザが数字キーを文字入力などに利用中かどうか\n private is_bml_browser_using_numeric_key: boolean = false;\n\n // BML ブラウザを破棄中かどうか\n private is_bml_browser_destroying: boolean = false;\n\n // 動画の要素が BML ブラウザ上に移動されているかどうか\n private is_video_element_moved_to_bml_browser: boolean = false;\n\n // PSI/SI アーカイブデータデコーダーのインスタンス\n private live_psi_archived_data_decoder: Comlink.Remote> | null = null;\n\n constructor(options: {\n player: DPlayer;\n display_channel_id: string;\n }) {\n this.player = options.player;\n this.display_channel_id = options.display_channel_id;\n\n // 映像が入る DOM 要素\n // DPlayer 内の dplayer-video-wrap-aspect をそのまま使う (中に映像と字幕が含まれる)\n this.media_element = this.player.template.videoWrapAspect;\n\n // リモコンの DOM 要素\n this.remocon_element = document.querySelector('.remote-control')!;\n this.remocon_data_broadcasting_element = this.remocon_element.querySelector('.remote-control-data-broadcasting')!;\n }\n\n\n /**\n * LiveDataBroadcastingManager での処理を開始する\n * EDCB Legacy WebUI での実装を参考にした\n * ref: https://github.com/xtne6f/EDCB/blob/work-plus-s-230212/ini/HttpPublic/legacy/util.lua#L444-L497\n */\n public async init(): Promise {\n\n const channels_store = useChannelsStore();\n const is_data_broadcasting_enabled = useSettingsStore().settings.tv_show_data_broadcasting;\n console.log(`[LiveDataBroadcastingManager] BMLBrowser: ${is_data_broadcasting_enabled ? 'enabled' : 'disabled'}`);\n\n // リモコンのボタンを初期化\n this.initRemoconButtons();\n\n // データ放送機能有効時のみ\n if (is_data_broadcasting_enabled === true) {\n\n // BML ブラウザが入る DOM 要素\n // DPlayer 内の dplayer-video-wrap の中に動的に追加する (映像レイヤーより下)\n // 要素のスタイルは Watch.vue で定義されている\n this.container_element = document.createElement('div');\n this.container_element.classList.add('dplayer-bml-browser');\n this.container_element = this.player.template.videoWrap.insertAdjacentElement('afterbegin', this.container_element) as HTMLElement;\n\n // リモコンのボタンを有効化\n // データ放送機能無効時はボタンを無効のままにする\n this.toggleRemoconButtonsEnabled(true);\n\n // リモコンをローディング状態にする\n this.toggleRemoconButtonsLoading(true);\n\n // BML ブラウザの初期化\n const this_ = this;\n this.#bml_browser = new BMLBrowser({\n mediaElement: document.createElement('p'), // ここではダミーの p 要素を渡す\n containerElement: this.container_element,\n storagePrefix: 'KonomiTV-BMLBrowser_',\n nvramPrefix: 'nvram_',\n broadcasterDatabasePrefix: '',\n videoPlaneModeEnabled: true,\n fonts: {\n roundGothic: LiveDataBroadcastingManager.round_gothic,\n squareGothic: LiveDataBroadcastingManager.square_gothic,\n },\n // ステータス更新時のイベント\n indicator: {\n setUrl(name: string, loading: boolean) {\n this_.toggleRemoconButtonsLoading(loading);\n },\n setNetworkingGetStatus(connecting: boolean) {\n this_.toggleRemoconButtonsLoading(connecting);\n },\n setNetworkingPostStatus(connecting: boolean) {\n this_.toggleRemoconButtonsLoading(connecting);\n },\n setReceivingStatus(receiving: boolean) {\n // 何もしない\n },\n setEventName(name: string) {\n // 何もしない\n }\n },\n // Greg: 受信機の電源を切るまでグローバルに持続するメモリ\n greg: {\n getReg(index: number) {\n let Greg: string[];\n if (window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg') === null) {\n // 初回は Greg を初期化する\n Greg = [...new Array(64)].map(_ => '');\n } else {\n // 2回目以降は SessionStorage 内の Greg を復元する\n Greg = JSON.parse(window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg')!);\n }\n return Greg[index] ?? '';\n },\n setReg(index: number, value: string) {\n let Greg: string[];\n if (window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg') === null) {\n // 初回は Greg を初期化する\n Greg = [...new Array(64)].map(_ => '');\n } else {\n // 2回目以降は SessionStorage 内の Greg を復元する\n Greg = JSON.parse(window.sessionStorage.getItem('KonomiTV-BMLBrowser-Greg')!);\n }\n Greg[index] = value;\n window.sessionStorage.setItem('KonomiTV-BMLBrowser-Greg', JSON.stringify(Greg));\n },\n },\n // データ放送からのチャンネル切り替え機能\n epg: {\n tune(network_id: number, transport_stream_id: number, service_id: number): boolean {\n // 選局対象のチャンネルが現在視聴中のチャンネルと同じ場合\n if (channels_store.channel.current.network_id === network_id && channels_store.channel.current.service_id === service_id) {\n // 非同期で LiveDataBroadcastingManager を再起動\n // チャンネル切り替え後はリロードし直すまで BML ブラウザがフリーズするため\n (async () => {\n await this_.destroy();\n await this_.init();\n })();\n return true;\n }\n // チャンネルリストから network_id と service_id が一致するチャンネルを探す\n // transport_stream_id は Mirakurun バックエンドの場合は存在しないため使わない\n // network_id + service_id だけで一意になる\n for (const channels of Object.values(channels_store.channels_list)) {\n for (const channel of channels) {\n if (channel.network_id === network_id && channel.service_id === service_id) {\n // 少し待ってからチャンネルを切り替える(チャンネル切り替え時にデータ放送側から音が鳴る可能性があるため)\n Utils.sleep(0.3).then(() => router.push({path: `/tv/watch/${channel.display_channel_id}`}));\n return true;\n }\n }\n }\n // network_id と service_id が一致するチャンネルが見つからなかった\n // 3秒間エラーメッセージを表示する\n console.error(`[LiveDataBroadcastingManager] Channel not found (network_id: ${network_id} / service_id: ${service_id})`);\n this_.player.notice(`切り替え先のチャンネルが見つかりませんでした。(network_id: ${network_id} / service_id: ${service_id})`, 3000, undefined, '#FF6F6A');\n // エラーメッセージを表示し終わったタイミングで、非同期で LiveDataBroadcastingManager を再起動\n // チャンネル切り替えに失敗すると BML ブラウザがフリーズするため\n Utils.sleep(3).then(async () => {\n await this_.destroy();\n await this_.init();\n });\n return false;\n }\n },\n // 双方向 (ネット接続) 機能\n ip: {\n getConnectionType(): number {\n // ARIB STD-B24 第二分冊 (2/2) 第二編 付属3 5.6.5.2 表5-12\n // 1: PSTN\n // 100: ISDN\n // 200: PHS\n // 201: PHS (PIAFS2.0)\n // 202: PHS (PIAFS2.1)\n // 300: Mobile phone\n // 301: Mobile phone (PDC)\n // 302: Mobile phone (PDC-P)\n // 303: Mobile phone (DS-CDMA)\n // 304: Mobile phone(MC-CDMA)\n // 305: Mobile phone (CDMA CelluarSystem)\n // 401: Ethernet (PPPoE)\n // 402: Ethernet (Fixed IP)\n // 403: Ethernet (DHCP)\n // NaN: 失敗\n return 403;\n },\n isIPConnected(): number {\n // ARIB STD-B24 第二分冊 (2/2) 第二編 付属3 5.6.5.2 表5-14\n // 0: IP 接続は確立していない\n // 1: IP 接続は自動接続によって確立している\n // 2: IP 接続は connectPPP() / connectPPPWithISPParams() により確立している\n // NaN 失敗\n return 0;\n },\n },\n // エラー発生時のメッセージ表示\n // 3秒間プレイヤーにエラーメッセージを表示する\n showErrorMessage(title: string, message: string, code?: string): void {\n this_.player.notice(`${title}
${message} (${code})`, 3000, undefined, '#FF6F6A');\n }\n });\n this.bml_browser_width = 960;\n this.bml_browser_height = 540;\n console.log('[LiveDataBroadcastingManager] BMLBrowser initialized.');\n\n // BML ブラウザがロードされたときのイベント\n this.#bml_browser.addEventListener('load', (event) => {\n console.log('[LiveDataBroadcastingManager] BMLBrowser: load', event.detail);\n\n // BML ブラウザの要素に幅と高さを設定\n this.bml_browser_width = event.detail.resolution.width;\n this.bml_browser_height = event.detail.resolution.height;\n this.container_element?.style.setProperty('--bml-browser-width', `${this.bml_browser_width}px`);\n this.container_element?.style.setProperty('--bml-browser-height', `${this.bml_browser_height}px`);\n\n // データ放送画面の拡大/縮小率を再計算\n this.calculateBMLBrowserScaleFactor(this.player.template.videoWrap.clientWidth, this.player.template.videoWrap.clientHeight);\n\n // 映像の要素をデータ放送内に移動\n this.moveVideoElementToBMLBrowser();\n });\n\n // BML ブラウザの表示状態が変化したときのイベント\n this.#bml_browser.addEventListener('invisible', (event) => {\n if (event.detail === true) {\n // 非表示状態\n // データ放送内に移動していた映像の要素を DPlayer に戻す\n console.log('[LiveDataBroadcastingManager] BMLBrowser: invisible');\n this.moveVideoElementToDPlayer();\n } else {\n // 表示状態\n // 映像の要素をデータ放送内に移動\n console.log('[LiveDataBroadcastingManager] BMLBrowser: visible');\n this.moveVideoElementToBMLBrowser();\n }\n });\n\n // 現在 BML ブラウザ上で利用しているボタンの一覧が変化したときのイベント\n this.#bml_browser.addEventListener('usedkeylistchanged', (event) => {\n // usedKeyList の中に numeric-tuning が含まれている場合は、データ放送が数字キーを利用中\n this.is_bml_browser_using_numeric_key = [...event.detail.usedKeyList].includes('numeric-tuning');\n });\n\n // DPlayer のリサイズを監視する ResizeObserver を開始\n this.resize_observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n // データ放送画面の拡大/縮小率を再計算\n const entry = entries[0];\n this.calculateBMLBrowserScaleFactor(entry.contentRect.width, entry.contentRect.height);\n });\n this.resize_observer.observe(this.player.template.videoWrap);\n }\n\n // ここからはデータ放送機能無効時も実行される\n // PSI/SI アーカイブデータは、UI 上の番組情報をリアルタイムに更新する用途でも利用している\n\n // ライブ PSI/SI アーカイブデータストリーミング API の URL を作成\n const api_quality = PlayerUtils.extractAPIQualityFromDPlayer(this.player);\n const api_url = `${Utils.api_base_url}/streams/live/${this.display_channel_id}/${api_quality}/psi-archived-data`;\n\n // ライブ PSI/SI アーカイブデータデコーダーを初期化\n // Comlink を挟んでいる関係上、コンストラクタにも関わらず Promise を返すため await する必要がある\n this.live_psi_archived_data_decoder = await new LivePSIArchivedDataDecoderWorker(api_url);\n\n // デコードを開始\n // デコーダーは Web Worker 上で実行される (コールバックを Comlink.proxy() で包むのがポイント)\n this.live_psi_archived_data_decoder.run(Comlink.proxy(async (message: ResponseMessage) => {\n\n // PMT (Program Map Table)\n // データ放送有効時のみ処理\n if (message.type === 'pmt' && this.#bml_browser !== null) {\n\n // データ放送がチャンネルに含まれているかどうか\n // AdditionalAribBXMLInfo を含むコンポーネントが一つでも存在するかどうかで判定\n const is_bml_available = message.components.some((component) => component.bxmlInfo !== undefined);\n console.log(`[LiveDataBroadcastingManager] BMLBrowser: ${is_bml_available ? 'available' : 'unavailable'}`);\n\n // データ放送がチャンネルに含まれていない場合\n if (is_bml_available === false) {\n\n // リモコンのローディング状態を解除\n // PMT にデータ放送用情報が含まれるようになるまでは、データ放送が利用できる見込みはない\n this.toggleRemoconButtonsLoading(false);\n\n // リモコンのボタンを無効化\n this.toggleRemoconButtonsEnabled(false);\n\n // データ放送がチャンネルに含まれている場合\n // データ放送がチャンネルに含まれていなかったが、後から含まれるようになったケースを想定\n // この時点ではローディングは終わっていないので、ローディング状態は解除しない\n } else {\n\n // リモコンのボタンを有効化\n this.toggleRemoconButtonsEnabled(true);\n }\n }\n\n // 番組情報イベント\n // 現在放送中の番組情報を UI にリアルタイムに反映する\n if (message.type === 'programInfo' && channels_store.channel.current.program_present != null) {\n // イベント ID\n if (message.eventId) {\n channels_store.channel.current.program_present.event_id = message.eventId;\n }\n // 番組タイトル\n if (message.eventName) {\n channels_store.channel.current.program_present.title = ProgramUtils.formatString(message.eventName);\n }\n // 番組開始時刻・番組終了時刻・番組長\n if (message.startTimeUnixMillis) {\n const start_time = ProgramUtils.convertTimestampToISO8601(message.startTimeUnixMillis);\n channels_store.channel.current.program_present.start_time = start_time;\n if (message.durationSeconds) {\n channels_store.channel.current.program_present.end_time =\n dayjs(start_time).add(message.durationSeconds, 'seconds').toISOString();\n channels_store.channel.current.program_present.duration = message.durationSeconds;\n } else {\n // 開始時刻はあるが番組長がない場合、放送時間未定として扱う\n // duration が -1 の場合、ProgramUtils.getProgramTime() は「放送時間未定」と表示する\n channels_store.channel.current.program_present.end_time = start_time;\n channels_store.channel.current.program_present.duration = -1; // -1 を設定する\n }\n }\n }\n\n // TS ストリームのデコード結果を BML ブラウザにそのまま送信する\n // データ放送機能無効時は実行しない\n if (this.#bml_browser !== null) {\n this.#bml_browser.emitMessage(message);\n }\n }));\n }\n\n\n /**\n * リモコンのボタンを初期化する\n */\n private initRemoconButtons(): void {\n\n const channels_store = useChannelsStore();\n this.remocon_button_event_abort_controller = new AbortController();\n\n // リモコンのボタンをクリックしたときのイベントを登録\n const buttons = this.remocon_element.querySelectorAll('button');\n for (const button of buttons) {\n button.addEventListener('click', async () => {\n\n // ARIB 仕様上のキーコード\n const arib_key_code = (parseInt(button.dataset.aribKeyCode!) as AribKeyCode);\n\n // リモコン ID (番号キーのみ)\n const remocon_id = button.dataset.remoconId ? parseInt(button.dataset.remoconId) : null;\n\n // 番号キーでかつ現在データ放送が番号キーを使っていない場合は、そのチャンネルに切り替える\n if (remocon_id !== null && this.is_bml_browser_using_numeric_key === false) {\n\n // 切り替え先のチャンネルを取得する\n // チャンネルタイプは現在視聴中のチャンネルと同じ\n const switch_channel_type = channels_store.channel.current.type;\n const switch_channel = channels_store.getChannelByRemoconID(switch_channel_type, remocon_id);\n\n // チャンネルが取得できていれば、ルーティングをそのチャンネルに置き換える\n // 押されたキーに対応するリモコン ID のチャンネルがない場合や、現在と同じチャンネル ID の場合は何も起こらない\n if (switch_channel !== null && switch_channel.display_channel_id !== channels_store.display_channel_id) {\n router.push({path: `/tv/watch/${switch_channel.display_channel_id}`});\n }\n return;\n\n // それ以外の場合は、BML ブラウザにキーイベントを送信する\n // データ放送機能無効時は何もしない\n } else {\n if (this.#bml_browser !== null) {\n if (remocon_id === 10) {\n // リモコン番号が 10 の場合のみ、\"0\" のキーイベントも送信する\n this.#bml_browser.content.processKeyDown(AribKeyCode.Digit0);\n this.#bml_browser.content.processKeyUp(AribKeyCode.Digit0);\n await Utils.sleep(0.1); // 若干待つのがポイント\n }\n this.#bml_browser.content.processKeyDown(arib_key_code);\n this.#bml_browser.content.processKeyUp(arib_key_code);\n }\n }\n\n }, {signal: this.remocon_button_event_abort_controller.signal});\n }\n }\n\n\n /**\n * リモコンのデータ放送ボタンの表示状態をローディングかどうかで切り替える\n */\n private toggleRemoconButtonsLoading(loading: boolean): void {\n if (loading === true) {\n this.remocon_data_broadcasting_element.classList.add('remote-control-data-broadcasting--loading');\n } else {\n this.remocon_data_broadcasting_element.classList.remove('remote-control-data-broadcasting--loading');\n }\n }\n\n\n /**\n * リモコンのデータ放送ボタンの有効/無効をローディングかどうかで切り替える\n * 初期状態 (Vue SFC の HTML 上) では無効になっているので、BML ブラウザの初期化時に有効にする\n */\n private toggleRemoconButtonsEnabled(enabled: boolean): void {\n if (enabled === true) {\n this.remocon_data_broadcasting_element.classList.remove('remote-control-data-broadcasting--disabled');\n } else {\n this.remocon_data_broadcasting_element.classList.add('remote-control-data-broadcasting--disabled');\n }\n }\n\n\n /**\n * データ放送画面の拡大/縮小率を再計算し、CSS カスタムプロパティに設定する\n * データ放送は 960×540 か 720×480 の固定サイズなので、レスポンシブにするために transform: scale() を使っている\n * @param container_width BML ブラウザが入るコンテナ要素の幅\n * @param container_height BML ブラウザが入るコンテナ要素の高さ\n */\n private calculateBMLBrowserScaleFactor(container_width: number, container_height: number): void {\n\n // 高さは BML ブラウザの高さをそのまま利用するが、横幅は常に高さに対して常に 16:9 の比率になるようにする\n // BML ブラウザのサイズが 960×540 なら問題ないが、720×480 の場合は 854×480 として計算される\n const scale_factor_width = container_width / (this.bml_browser_height * 16 / 9);\n const scale_factor_height = container_height / this.bml_browser_height;\n\n // transform: scale() での拡大率を算出\n const scale_factor = Math.min(scale_factor_width, scale_factor_height);\n\n // (BMLブラウザの高さに対して 16:9 の比率の幅)÷(BMLブラウザの幅) で横に引き伸ばす倍率を算出\n // 854÷720 の場合、約 1.185 倍になる\n const magnification = (this.bml_browser_height * 16 / 9) / this.bml_browser_width;\n\n // データ放送画面の拡大/縮小率を CSS カスタムプロパティとして設定\n this.container_element?.style.setProperty('--bml-browser-scale-factor-width', `${scale_factor * magnification}`);\n this.container_element?.style.setProperty('--bml-browser-scale-factor-height', `${scale_factor}`);\n }\n\n\n /**\n * 映像の DOM 要素を DPlayer から BML ブラウザ (データ放送) 内に移動する\n */\n private moveVideoElementToBMLBrowser(): void {\n\n // BML ブラウザの破棄中にイベントが発火した場合は何もしない\n if (this.is_bml_browser_destroying) {\n return;\n }\n\n // getVideoElement() に失敗した (=現在データ放送に映像が表示されていない) 場合は何もしない\n if (this.#bml_browser?.getVideoElement() === null) {\n return;\n }\n\n // ダミーで渡した p 要素があれば削除\n if (this.#bml_browser?.getVideoElement()?.firstElementChild instanceof HTMLParagraphElement) {\n this.#bml_browser?.getVideoElement()?.firstElementChild?.remove();\n }\n\n // データ放送内に映像の要素を入れる\n this.#bml_browser?.getVideoElement()?.appendChild(this.media_element);\n\n // データ放送内での表示用にスタイルを調整\n this.media_element.style.width = '100%';\n this.media_element.style.height = '100%';\n for (const child of this.media_element.children) {\n (child as HTMLElement).style.display = 'block';\n (child as HTMLElement).style.visibility = 'visible';\n if (child instanceof HTMLVideoElement) {\n (child as HTMLVideoElement).style.width = '100%';\n (child as HTMLVideoElement).style.height = '100%';\n // BML ブラウザのアスペクト比が 16:9 以外のケース (運用上は 720×480 のみ該当) に限定して適用する\n if (this.bml_browser_width / this.bml_browser_height !== 16 / 9) {\n const magnification = (this.bml_browser_height * 16 / 9) / this.bml_browser_width;\n (child as HTMLVideoElement).style.transform = `scaleY(${magnification})`;\n (child as HTMLVideoElement).style.transformOrigin = 'center center';\n } else {\n (child as HTMLVideoElement).style.transform = '';\n (child as HTMLVideoElement).style.transformOrigin = '';\n }\n }\n }\n\n this.is_video_element_moved_to_bml_browser = true;\n }\n\n\n /**\n * 映像の DOM 要素を BML ブラウザ (データ放送) から DPlayer 内に移動する\n */\n private moveVideoElementToDPlayer(): void {\n\n // BML ブラウザの破棄中にイベントが発火した場合は何もしない\n if (this.is_bml_browser_destroying) {\n return;\n }\n\n // 既に DPlayer 内に映像の要素がある場合は何もしない\n if (this.is_video_element_moved_to_bml_browser === false) {\n return;\n }\n\n // データ放送内に移動していた映像の要素を DPlayer に戻す (BML ブラウザより上のレイヤーに配置)\n // BML ブラウザの破棄前に行う必要がある\n if (this.container_element !== null) {\n this.player.template.videoWrap.insertBefore(this.media_element, this.container_element.nextElementSibling);\n }\n\n // データ放送内での表示用に調整していたスタイルを戻す\n this.media_element.style.width = '';\n this.media_element.style.height = '';\n for (const child of this.media_element.children) {\n (child as HTMLElement).style.display = '';\n (child as HTMLElement).style.visibility = '';\n if (child instanceof HTMLVideoElement) {\n (child as HTMLVideoElement).style.width = '';\n (child as HTMLVideoElement).style.height = '';\n (child as HTMLVideoElement).style.transform = '';\n (child as HTMLVideoElement).style.transformOrigin = '';\n }\n }\n\n this.is_video_element_moved_to_bml_browser = false;\n }\n\n\n /**\n * LiveDataBroadcastingManager での処理を終了し、破棄する\n */\n public async destroy(): Promise {\n\n // ライブ PSI/SI アーカイブデータデコーダーを終了\n if (this.live_psi_archived_data_decoder !== null) {\n // タイミングの関係なのかチャンネル切り替え時の映像のフェードアウトが効かなくなるため、await してはいけない\n this.live_psi_archived_data_decoder.destroy();\n this.live_psi_archived_data_decoder = null;\n }\n\n // リモコンの各ボタンに登録していたリスナーを削除\n if (this.remocon_button_event_abort_controller !== null) {\n this.remocon_button_event_abort_controller.abort();\n this.remocon_button_event_abort_controller = null;\n }\n\n // ここからはデータ放送機能有効時のみ実行\n if (this.#bml_browser !== null) {\n\n // リモコンのボタンを再び無効化\n this.toggleRemoconButtonsEnabled(false);\n\n // リモコンを再びローディング状態に戻す\n this.toggleRemoconButtonsLoading(true);\n\n // DPlayer のリサイズを監視する ResizeObserver を終了\n if (this.resize_observer !== null) {\n this.resize_observer.disconnect();\n this.resize_observer = null;\n }\n\n // データ放送内に移動していた映像の要素を DPlayer に戻す\n this.moveVideoElementToDPlayer();\n\n // BML ブラウザを破棄\n this.is_bml_browser_destroying = true;\n await this.#bml_browser.destroy();\n this.is_bml_browser_destroying = false;\n this.#bml_browser = null;\n console.log('[LiveDataBroadcastingManager] BMLBrowser destroyed.');\n\n // BML ブラウザの要素を削除\n this.container_element?.remove();\n }\n }\n}\n\nexport default LiveDataBroadcastingManager;\n","\n\nimport dayjs from 'dayjs';\nimport DPlayer, { DPlayerType } from 'dplayer';\nimport mpegts from 'mpegts.js';\nimport { mapStores } from 'pinia';\nimport Vue from 'vue';\n\nimport BottomNavigation from '@/components/BottomNavigation.vue';\nimport Channel from '@/components/Panel/Channel.vue';\nimport Comment from '@/components/Panel/Comment.vue';\nimport Program from '@/components/Panel/Program.vue';\nimport Remocon from '@/components/Panel/Remocon.vue';\nimport Twitter from '@/components/Panel/Twitter.vue';\nimport APIClient from '@/services/APIClient';\nimport { IChannel } from '@/services/Channels';\nimport CaptureManager from '@/services/player/managers/CaptureManager';\nimport LiveDataBroadcastingManager from '@/services/player/managers/LiveDataBroadcastingManager';\nimport useChannelsStore from '@/store/ChannelsStore';\nimport useSettingsStore from '@/store/SettingsStore';\nimport Utils, { PlayerUtils, ProgramUtils } from '@/utils';\n\n// 低遅延モードオン時の再生バッファ (秒単位)\n// 0.7 秒程度余裕を持たせる\nconst PLAYBACK_BUFFER_SEC_LOW_LATENCY = 0.7;\n\n// 低遅延モードオフ時の再生バッファ (秒単位)\n// 5秒程度の遅延を許容する\nconst PLAYBACK_BUFFER_SEC = 5.0;\n\nexport default Vue.extend({\n name: 'TV-Watch',\n components: {\n BottomNavigation,\n Channel,\n Comment,\n Program,\n Remocon,\n Twitter,\n },\n data() {\n return {\n\n // ユーティリティをテンプレートで使えるように\n Utils: Utils,\n ProgramUtils: ProgramUtils,\n\n // 現在時刻\n time: dayjs().format('YYYY/MM/DD HH:mm:ss'),\n\n // 表示されるパネルのタブ\n tv_panel_active_tab: useSettingsStore().settings.tv_panel_active_tab,\n\n // 背景の URL\n background_url: '',\n\n // プレイヤーのローディング状態\n // 既定でローディングとする\n is_loading: true,\n\n // プレイヤーが映像の再生をバッファリングしているか\n // 視聴開始時以外にも、ネットワークが遅くて再生が一時的に途切れたときなどで表示される\n // 既定でバッファリング中とする\n is_video_buffering: true,\n\n // プレイヤーの背景を表示するか\n // 既定で表示しない\n is_background_display: false,\n\n // コントロールを表示するか\n // 既定で表示する\n is_control_display: true,\n\n // リモコンを表示するか\n is_remocon_display: false,\n\n // パネルを表示するか\n // panel_display_state が 'AlwaysDisplay' なら常に表示し、'AlwaysFold' なら常に折りたたむ\n // 'RestorePreviousState' なら showed_panel_last_time の値を使い、前回の状態を復元する\n is_panel_display: (() => {\n const settings_store = useSettingsStore();\n switch (settings_store.settings.panel_display_state) {\n case 'AlwaysDisplay':\n return true;\n case 'AlwaysFold':\n return false;\n case 'RestorePreviousState':\n return settings_store.settings.showed_panel_last_time;\n }\n })() as boolean,\n\n // フルスクリーン状態かどうか\n is_fullscreen: false,\n\n // IME 変換中かどうか\n is_ime_composing: false,\n\n // 仮想キーボードが表示されているか\n is_virtual_keyboard_display: false,\n\n // プレイヤーからのコメント送信から間もないかどうか\n is_comment_send_just_did: false,\n\n // インターバル ID\n // ページ遷移時に setInterval(), setTimeout() の実行を止めるのに使う\n // setInterval(), setTimeout() の返り値を登録する\n interval_ids: [] as number[],\n\n // コントロール表示切り替え用のインターバル ID\n // 混ぜるとダメなので独立させる\n control_interval_id: 0,\n\n // ***** チャンネル *****\n\n // ザッピング(「前/次のチャンネル」ボタン or 上下キーショートカット)によるチャンネル移動かどうか\n is_zapping: false,\n\n // ザッピングで連続してチャンネルを切り替えている最中かどうか\n // 「連続して」とは、切り替える間隔が 0.5 秒以下で、再生セッションが初期化される前に次のチャンネルに切り替えたときのこと\n is_zapping_continuously: false,\n\n // ***** プレイヤー *****\n\n // プレイヤー (DPlayer) のインスタンス\n player: null as DPlayer | null,\n\n // プレイヤーの破棄を許可するかどうか\n player_can_be_destroyed: false,\n\n // mpegts.js がサポートされているかどうか\n // mpegts.js がサポートされていない場合は LL-HLS にフォールバックする (基本 iPhone/iPad Safari 向け)\n // iPad Safari では Media Source Extensions API がサポートされているが、残念ながら数年経っても挙動が不安定なこと、\n // どっちみち iPhone Safari 向けに LL-HLS のサポートを続ける必要があることから、iPad Safari でも LL-HLS を使う\n is_mpegts_supported: mpegts.isSupported() === true && Utils.isSafari() === false,\n\n // ライブストリームが Offline 状態かどうか\n is_offline: false,\n\n // RomSound の AudioContext\n romsounds_context: null as AudioContext | null,\n\n // RomSound の AudioBuffer(音声データ)が入るリスト\n romsounds_buffers: [] as AudioBuffer[],\n\n // イベントソースのインスタンス\n eventsource: null as EventSource | null,\n\n // フルスクリーン状態が切り替わったときのハンドラー\n fullscreen_handler: null as () => void | null,\n\n // キャプチャマネージャーのインスタンス\n capture_manager: null as CaptureManager | null,\n\n // データ放送マネージャーのインスタンス\n data_broadcasting_manager: null as LiveDataBroadcastingManager | null,\n\n // ***** キーボードショートカット *****\n\n // ショートカットキーのハンドラー\n shortcut_key_handler: null as (event: KeyboardEvent) => void | null,\n\n // ショートカットキーの最終押下時刻のタイムスタンプ\n shortcut_key_pressed_at: Utils.time(),\n\n // キーボードショートカットの一覧のモーダルを表示するか\n shortcut_key_modal: false,\n\n // キーボードショートカットの一覧に表示するショートカットキーのリスト\n shortcut_key_list: {\n left_column: [\n {\n name: '全般',\n icon: 'fluent:home-20-filled',\n icon_height: '22px',\n shortcuts: [\n { name: '数字キー/テンキーに対応するリモコン番号 (1~12) の地デジチャンネルに切り替える', keys: [{name: '1~9, 0, -(=), ^(~)', icon: false}] },\n { name: '数字キー/テンキーに対応するリモコン番号 (1~12) の BS チャンネルに切り替える', keys: [{name: 'Shift', icon: false}, {name: '1~9, 0, -(=), ^(~)', icon: false}] },\n { name: '前のチャンネルに切り替える', keys: [{name: 'fluent:arrow-up-12-filled', icon: true}] },\n { name: '次のチャンネルに切り替える', keys: [{name: 'fluent:arrow-down-12-filled', icon: true}] },\n { name: 'キーボードショートカットの一覧を表示する', keys: [{name: '/(?)', icon: false}] },\n ]\n },\n {\n name: 'プレイヤー',\n icon: 'fluent:play-20-filled',\n icon_height: '20px',\n shortcuts: [\n { name: '再生 / 一時停止の切り替え', keys: [{name: 'Space', icon: false}] },\n { name: '再生 / 一時停止の切り替え (キャプチャタブ表示時)', keys: [{name: 'Shift', icon: false}, {name: 'Space', icon: false}] },\n { name: 'プレイヤーの音量を上げる', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-up-12-filled', icon: true}] },\n { name: 'プレイヤーの音量を下げる', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-down-12-filled', icon: true}] },\n { name: '停止して0.5秒早戻し', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-left-12-filled', icon: true}] },\n { name: '停止して0.5秒早送り', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'fluent:arrow-right-12-filled', icon: true}] },\n { name: 'フルスクリーンの切り替え', keys: [{name: 'F', icon: false}] },\n { name: 'ライブストリームの同期', keys: [{name: 'W', icon: false}] },\n { name: 'Picture-in-Picture の表示切り替え', keys: [{name: 'E', icon: false}] },\n { name: '字幕の表示切り替え', keys: [{name: 'S', icon: false}] },\n { name: 'コメントの表示切り替え', keys: [{name: 'D', icon: false}] },\n { name: '映像をキャプチャする', keys: [{name: 'C', icon: false}] },\n { name: '映像をコメントを付けてキャプチャする', keys: [{name: 'V', icon: false}] },\n { name: 'コメント入力フォームにフォーカスする', keys: [{name: 'M', icon: false}] },\n { name: 'コメント入力フォームを閉じる', keys: [{name: Utils.CtrlOrCmd(), icon: false}, {name: 'M', icon: false}] },\n ]\n },\n ],\n right_column: [\n {\n name: 'パネル',\n icon: 'fluent:panel-right-20-filled',\n icon_height: '24px',\n shortcuts: [\n { name: 'パネルの表示切り替え', keys: [{name: 'P', icon: false}] },\n { name: '番組情報タブを表示する', keys: [{name: 'K', icon: false}] },\n { name: 'チャンネルタブを表示する', keys: [{name: 'L', icon: false}] },\n { name: 'コメントタブを表示する', keys: [{name: ';(+)', icon: false}] },\n { name: 'Twitter タブを表示する', keys: [{name: ':(*)', icon: false}] },\n ]\n },\n {\n name: 'Twitter',\n icon: 'fa-brands:twitter',\n icon_height: '22px',\n shortcuts: [\n { name: 'ツイート検索タブを表示する', keys: [{name: '[ (「)', icon: false}] },\n { name: 'タイムラインタブを表示する', keys: [{name: '] (」)', icon: false}] },\n { name: 'キャプチャタブを表示する', keys: [{name: '\(¥)', icon: false}] },\n { name: 'ツイート入力フォームにフォーカスを当てる/フォーカスを外す', keys: [{name: 'Tab', icon: false}] },\n { name: 'キャプチャにフォーカスする', keys: [{name: 'キャプチャタブを表示', icon: false}, {name: 'fluent:arrow-up-12-filled;fluent:arrow-down-12-filled;fluent:arrow-left-12-filled;fluent:arrow-right-12-filled', icon: true}] },\n { name: 'キャプチャを拡大表示する/
キャプチャの拡大表示を閉じる', keys: [{name: 'キャプチャにフォーカス', icon: false}, {name: 'Enter', icon: false}] },\n { name: 'キャプチャを選択する/
キャプチャの選択を解除する', keys: [{name: 'キャプチャにフォーカス', icon: false}, {name: 'Space', icon: false}] },\n { name: 'クリップボード内の画像を
キャプチャとして取り込む', keys: [{name: 'ツイート入力
フォームにフォーカス', icon: false}, {name: Utils.CtrlOrCmd(), icon: false}, {name: 'V', icon: false}] },\n { name: 'ツイートを送信する', keys: [{name: 'Twitter タブを表示', icon: false}, {name: Utils.CtrlOrCmd(), icon: false}, {name: 'Enter', icon: false}] },\n ]\n },\n ]\n }\n };\n },\n computed: {\n // ChannelsStore / SettingsStore に this.channelsStore / this.settingsStore でアクセスできるようにする\n // ref: https://pinia.vuejs.org/cookbook/options-api.html\n ...mapStores(useChannelsStore, useSettingsStore),\n },\n // 開始時に実行\n async created() {\n\n // チャンネル選局のキーボードショートカットを Alt or Option + 数字キー/テンキーに変更する設定が有効なら、\n // キーボードショートカット一覧に反映する\n if (this.settingsStore.settings.tv_channel_selection_requires_alt_key === true) {\n this.shortcut_key_list.left_column[0].shortcuts[0].keys.unshift({name: Utils.AltOrOption(), icon: false});\n this.shortcut_key_list.left_column[0].shortcuts[1].keys.unshift({name: Utils.AltOrOption(), icon: false});\n }\n\n // チャンネル ID をセット\n this.channelsStore.display_channel_id = this.$route.params.display_channel_id;\n\n // Virtual Keyboard API に対応している場合は、仮想キーボード周りの操作を自力で行うことをブラウザに伝える\n // この視聴画面のみ\n if ('virtualKeyboard' in navigator) {\n navigator.virtualKeyboard.overlaysContent = true;\n // 仮想キーボードが表示されたり閉じられたときのイベント\n navigator.virtualKeyboard.ongeometrychange = (event) => {\n if (event.target.boundingRect.width === 0 && event.target.boundingRect.height === 0) {\n this.is_virtual_keyboard_display = false;\n } else {\n this.is_virtual_keyboard_display = true;\n }\n };\n }\n\n // 再生セッションを初期化\n this.init();\n\n // RomSound を鳴らすための AudioContext を生成\n this.romsounds_context = new AudioContext();\n\n // 01 ~ 14 まですべての RomSound を読み込む\n for (let index = 1; index <= 14; index++) {\n\n // ArrayBuffer として RomSound を取得\n const url = `/assets/romsounds/${index.toString().padStart(2, '0')}.wav`;\n const audio_data = await APIClient.get(url, {\n baseURL: '', // BaseURL を明示的にクライアントのルートに設定\n responseType: 'arraybuffer',\n });\n\n // ArrayBuffer をデコードして AudioBuffer にし、すぐ呼び出せるように貯めておく\n // ref: https://ics.media/entry/200427/\n this.romsounds_buffers.push(await this.romsounds_context.decodeAudioData(audio_data.data));\n }\n },\n // 終了前に実行\n beforeDestroy() {\n\n // 仮想キーボード周りの操作をブラウザに戻す\n if ('virtualKeyboard' in navigator) {\n navigator.virtualKeyboard.overlaysContent = false;\n }\n\n // destroy() を実行\n // 別のページへ遷移するため、DPlayer のインスタンスを確実に破棄する\n // さもなければ、ブラウザがリロードされるまでバックグラウンドで永遠に再生され続けてしまう\n // 不正な ID のため 404 ページに遷移されるときは実行しない\n if (this.channelsStore.channel.current.display_channel_id !== 'gr999') {\n this.destroy(true);\n }\n\n // AudioContext のリソースを解放\n if (this.romsounds_context !== null) {\n this.romsounds_context.close();\n }\n\n // このページから離れるので、チャンネル ID を gr000 (ダミー値) に戻す\n this.channelsStore.display_channel_id = 'gr000';\n },\n // チャンネル切り替え時に実行\n // コンポーネント(インスタンス)は再利用される\n // ref: https://v3.router.vuejs.org/ja/guide/advanced/navigation-guards.html#%E3%83%AB%E3%83%BC%E3%83%88%E5%8D%98%E4%BD%8D%E3%82%AB%E3%82%99%E3%83%BC%E3%83%88%E3%82%99\n beforeRouteUpdate(to, from, next) {\n\n // 前の再生セッションを破棄して終了する\n const destroy_promise = this.destroy(false, this.is_zapping_continuously);\n\n // 連続してチャンネルを切り替えていることを示すフラグを立てる\n // このフラグは再生セッションが初期化されるタイミングで必ず降ろされる\n this.is_zapping_continuously = true;\n\n // チャンネル ID を次のチャンネルのものに切り替える\n this.channelsStore.display_channel_id = to.params.display_channel_id;\n\n // ハッシュタグフォームのリセットがオンなら、ハッシュタグフォームを空にする\n if (this.settingsStore.settings.reset_hashtag_when_program_switches === true) {\n (this.$refs.Twitter as InstanceType).tweet_hashtag = '';\n }\n\n (async () => {\n\n // ザッピング(「前/次のチャンネル」ボタン or 上下キーショートカット)によるチャンネル移動時のみ、\n // 0.5秒だけ待ってから新しい再生セッションを初期化する\n // 連続してチャンネルを切り替えた際に毎回再生処理を開始しないように猶予を設ける\n if (this.is_zapping === true) {\n this.is_zapping = false;\n this.interval_ids.push(window.setTimeout(() => {\n this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす\n destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する\n }, 0.5 * 1000));\n\n // 通常のチャンネル移動時は、すぐに再生セッションを初期化する\n } else {\n this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす\n destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する\n }\n })();\n\n // 次のルートに置き換え\n next();\n },\n watch: {\n\n // 視聴中のチャンネルが変更されたときのイベント\n 'channelsStore.channel': {\n immediate: true,\n handler(\n new_channel: {previous: IChannel; current: IChannel; next: IChannel;},\n old_channel: {previous: IChannel; current: IChannel; next: IChannel;} | undefined,\n ) {\n\n // old_channel が undefined の場合は、初回のイベント発火なので何もしない\n if (old_channel === undefined) {\n return;\n }\n\n // Twitter コンポーネントのインスタンスを取得\n const twitter_component = this.$refs.Twitter as InstanceType;\n\n // 前のチャンネル情報と次のチャンネル情報で display_channel_id が変わってたら局タグ追加処理を走らせる\n if (new_channel.current.display_channel_id !== old_channel.current.display_channel_id) {\n const old_channel_hashtag = twitter_component.getChannelHashtag(old_channel.current.name) ?? '';\n twitter_component.tweet_hashtag =\n twitter_component.formatHashtag(twitter_component.tweet_hashtag.replaceAll(old_channel_hashtag, ''));\n twitter_component.updateTweetLetterCount();\n }\n\n // 取得したチャンネル情報と現在のチャンネル情報の NID-SID-EID の組み合わせが異なる場合\n if ((new_channel.current.id !== old_channel.current.id) || // チャンネルが異なる\n (new_channel.current.program_present !== null && old_channel.current.program_present === null) || // 番組情報あり→番組情報なし\n (new_channel.current.program_present === null && old_channel.current.program_present !== null) || // 番組情報なし→番組情報あり\n ((new_channel.current.program_present !== null && old_channel.current.program_present !== null) &&\n (new_channel.current.program_present.id !== old_channel.current.program_present.id))) { // 番組情報あり→番組情報あり & 番組が異なる\n\n // ハッシュタグフォームのリセットがオンなら、ハッシュタグフォームを空にする\n if (this.settingsStore.settings.reset_hashtag_when_program_switches === true) {\n twitter_component.tweet_hashtag = twitter_component.formatHashtag('');\n twitter_component.updateTweetLetterCount();\n }\n }\n },\n },\n\n // 前回視聴画面を開いた際にパネルが表示されていたかどうかを保存\n is_panel_display() {\n this.settingsStore.settings.showed_panel_last_time = this.is_panel_display;\n }\n },\n methods: {\n\n // 再生セッションを初期化する\n async init() {\n\n // ローディング中の背景画像をランダムで設定\n this.background_url = PlayerUtils.generatePlayerBackgroundURL();\n\n // コントロール表示タイマーを実行\n this.controlDisplayTimer();\n\n // 現在時刻を1秒おきに更新\n this.interval_ids.push(window.setInterval(() => this.time = dayjs().format('YYYY/MM/DD HH:mm:ss'), 1 * 1000));\n\n // 00秒までの残り秒数を取得\n // 現在 16:01:34 なら 26 (秒) になる\n const residue_second = 60 - new Date().getSeconds();\n\n // 00秒になるまで待ってから実行するタイマー\n // 番組は基本1分単位で組まれているため、20秒や45秒など中途半端な秒数で更新してしまうと番組情報の反映が遅れてしまう\n this.interval_ids.push(window.setTimeout(() => {\n\n // この時点で00秒なので、チャンネル情報を更新\n this.channelsStore.update(true);\n this.update();\n\n // 以降、30秒おきにチャンネル情報を更新\n this.interval_ids.push(window.setInterval(() => {\n this.channelsStore.update(true);\n this.update();\n }, 30 * 1000));\n\n }, residue_second * 1000));\n\n // チャンネル情報を更新 (初回)\n await this.channelsStore.update();\n this.update();\n },\n\n // 画面を更新する\n async update() {\n\n // チャンネル ID が未定義なら実行しない(フェイルセーフ)\n if (this.$route.params.display_channel_id === undefined) {\n return;\n }\n\n // もし現時点でチャンネル ID が gr999 だった場合、チャンネル情報に存在しない不正な ID なので、404 ページにリダイレクト\n if (this.channelsStore.channel.current.display_channel_id === 'gr999') {\n this.$router.push({path: '/not-found/'});\n return;\n }\n\n // プレイヤーがまだ初期化されていない or 他のチャンネルからの切り替えですでにプレイヤーが初期化されているけど破棄が可能\n // update() 自体は初期化時以外にも1分ごとに定期実行されるため、その際に毎回プレイヤーを再初期化しないようにする\n if (this.player === null || this.player_can_be_destroyed === true) {\n\n // プレイヤー (DPlayer) 周りのセットアップ\n this.initPlayer();\n\n // サーバーから送られてくるメッセージのイベントハンドラーを初期化\n await this.initEventHandler();\n\n // キャプチャのイベントハンドラーを初期化\n this.initCaptureManager();\n\n // ショートカットキーのイベントハンドラーを初期化\n // 事前に前のイベントハンドラーを削除しておかないと、重複してキー操作が実行されてしまう\n // 直前で実行しないと上下キーでのチャンネル操作が動かなくなる\n document.removeEventListener('keydown', this.shortcut_key_handler);\n this.initShortcutKeyHandler();\n }\n\n if (this.player === null) {\n return; // 復旧不可能 (発生しないはずだが、書いとかないと TypeScript に怒られる)\n }\n\n // 副音声がない番組でプレイヤー上で副音声に切り替えられないように\n // 音声多重放送でもデュアルモノでもない番組のみ\n if ((this.channelsStore.channel.current.program_present === null) ||\n ((this.channelsStore.channel.current.program_present.primary_audio_type !== '1/0+1/0モード(デュアルモノ)') &&\n (this.channelsStore.channel.current.program_present.secondary_audio_type === null))) {\n\n // クラスを付与\n this.player.template.audioItem[1].classList.add('dplayer-setting-audio-item--disabled');\n\n // 現在副音声が選択されている可能性を考慮し、明示的に主音声に切り替える\n if (this.player.plugins.mpegts !== undefined || this.player.plugins.liveLLHLSForKonomiTV !== undefined) {\n // プレイヤーの初期化が完了するまで少し待つ\n while (this.player === null) {\n await Utils.sleep(0.1);\n }\n this.player.template.audioItem[0].classList.add('dplayer-setting-audio-current');\n this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-current');\n this.player.template.audioValue.textContent = this.player.tran('Primary audio');\n try {\n if (this.player.plugins.mpegts !== undefined && this.player.plugins.mpegts instanceof mpegts.MSEPlayer) {\n this.player.plugins.mpegts.switchPrimaryAudio();\n }\n if (this.player.plugins.liveLLHLSForKonomiTV !== undefined) {\n this.player.plugins.liveLLHLSForKonomiTV.switchPrimaryAudio();\n }\n } catch (error) {\n // pass\n }\n }\n\n // 音声多重放送かデュアルモノなので、副音声への切り替えを有効化\n } else {\n this.player.template.audioItem[1].classList.remove('dplayer-setting-audio-item--disabled');\n }\n\n // MediaSession API を使い、メディア通知の表示をカスタマイズ\n if ('mediaSession' in navigator) {\n\n // アートワークとして表示するアイコン\n const artwork = [\n {src: '/assets/images/icons/icon-maskable-192px.png', sizes: '192x192', type: 'image/png'},\n {src: '/assets/images/icons/icon-maskable-512px.png', sizes: '512x512', type: 'image/png'},\n ];\n\n // メディア通知の表示をカスタマイズ\n navigator.mediaSession.metadata = new MediaMetadata({\n title: this.channelsStore.channel.current.program_present?.title ?? '放送休止',\n artist: this.channelsStore.channel.current.name,\n artwork: artwork,\n });\n\n // 再生状況のステータスを設定\n if ('setPositionState' in navigator.mediaSession) {\n navigator.mediaSession.setPositionState({\n duration: 0, // ライブなので0(長さなしを表すらしい)に設定\n playbackRate: 1, // ライブなので再生速度は常に1になる\n });\n }\n\n // 一旦既存のイベントハンドラーを削除\n navigator.mediaSession.setActionHandler('play', null);\n navigator.mediaSession.setActionHandler('pause', null);\n navigator.mediaSession.setActionHandler('previoustrack', null);\n navigator.mediaSession.setActionHandler('nexttrack', null);\n\n // メディア通知上のボタンが押されたときのイベント\n navigator.mediaSession.setActionHandler('play', () => this.player?.play()); // 再生\n navigator.mediaSession.setActionHandler('pause', () => this.player?.pause()); // 停止\n navigator.mediaSession.setActionHandler('previoustrack', async () => { // 前のチャンネルに切り替え\n navigator.mediaSession.metadata = new MediaMetadata({\n title: this.channelsStore.channel.previous.program_present?.title ?? '放送休止',\n artist: this.channelsStore.channel.previous.name,\n artwork: artwork,\n });\n // ルーティングを前のチャンネルに置き換える\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`});\n });\n navigator.mediaSession.setActionHandler('nexttrack', async () => { // 次のチャンネルに切り替え\n navigator.mediaSession.metadata = new MediaMetadata({\n title: this.channelsStore.channel.next.program_present?.title ?? '放送休止',\n artist: this.channelsStore.channel.next.name,\n artwork: artwork,\n });\n // ルーティングを次のチャンネルに置き換える\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.next.display_channel_id}`});\n });\n }\n },\n\n // マウスが動いたりタップされた時のイベント\n // 3秒間何も操作がなければコントロールを非表示にする\n controlDisplayTimer(event: Event | null = null, is_player_event: boolean = false) {\n\n // タッチデバイスかどうか\n // DPlayer の UA 判定コードと同一\n const is_touch_device = /iPhone|iPad|iPod|Windows|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\n\n // タッチデバイスで mousemove 、あるいはタッチデバイス以外で touchmove か click が発火した時は実行じない\n if (is_touch_device === true && event !== null && event.type === 'mousemove') return;\n if (is_touch_device === false && event !== null && (event.type === 'touchmove' || event.type === 'click')) return;\n\n // 以前セットされたタイマーを止める\n window.clearTimeout(this.control_interval_id);\n\n // setTimeout に渡すタイマー関数\n const timeout = () => {\n\n // コメント入力フォームが表示されているときは実行しない\n // タイマーを掛け直してから抜ける\n if (this.player !== null && this.player.template.controller.classList.contains('dplayer-controller-comment')) {\n this.control_interval_id = window.setTimeout(timeout, 3 * 1000);\n return;\n }\n\n // コントロールを非表示にする\n this.is_control_display = false;\n\n // プレイヤーのコントロールと設定パネルを非表示にする\n if (this.player !== null) {\n this.player.controller.hide();\n this.player.setting.hide();\n }\n };\n\n // タッチデバイスでプレイヤー画面がクリックされたとき\n if (is_touch_device === true && is_player_event === true) {\n\n // プレイヤーのコントロールの表示状態に合わせる\n if (this.player?.controller.isShow()) {\n\n // コントロールを表示する\n this.is_control_display = true;\n\n // プレイヤーのコントロールを表示する\n this.player.controller.show();\n\n // 3秒間何も操作がなければコントロールを非表示にする\n // 3秒間の間一度でもマウスが動けばタイマーが解除されてやり直しになる\n this.control_interval_id = window.setTimeout(timeout, 3 * 1000);\n\n } else {\n\n // コントロールを非表示にする\n this.is_control_display = false;\n\n // プレイヤーのコントロールと設定パネルを非表示にする\n this.player?.controller.hide();\n this.player?.setting.hide();\n }\n\n // それ以外の画面がクリックされたとき\n } else {\n\n // コントロールを表示する\n this.is_control_display = true;\n\n // プレイヤーのコントロールを表示する\n if (this.player !== null) {\n this.player.controller.show();\n }\n\n // 3秒間何も操作がなければコントロールを非表示にする\n // 3秒間の間一度でもマウスが動けばタイマーが解除されてやり直しになる\n this.control_interval_id = window.setTimeout(timeout, 3 * 1000);\n }\n },\n\n // プレイヤーを初期化する\n initPlayer() {\n\n // mpegts.js を window 直下に入れる\n // こうしないと DPlayer が mpegts.js を認識できない\n (window as any).mpegts = mpegts;\n\n // すでに DPlayer が初期化されている場合は破棄する\n // チャンネル切り替え時などが該当する\n if (this.player !== null && this.player_can_be_destroyed === true) {\n try {\n this.player.destroy();\n } catch (error) {\n // mpegts.js をうまく破棄できない場合\n if (this.player.plugins.mpegts !== undefined) {\n this.player.plugins.mpegts.destroy();\n }\n }\n this.player_can_be_destroyed = false;\n this.player = null;\n }\n\n // 低遅延モードであれば低遅延向けの再生バッファを、そうでなければ通常の再生バッファをセット (秒単位)\n const playback_buffer_sec = this.settingsStore.settings.tv_low_latency_mode ?\n PLAYBACK_BUFFER_SEC_LOW_LATENCY : PLAYBACK_BUFFER_SEC;\n\n // DPlayer を初期化\n this.player = new DPlayer({\n container: this.$el.querySelector('.watch-player__dplayer')!,\n theme: '#E64F97', // テーマカラー\n lang: 'ja-jp', // 言語\n live: true, // ライブモード\n liveSyncMinBufferSize: this.is_mpegts_supported ? playback_buffer_sec - 0.1 : 0, // ライブモードで同期する際の最小バッファサイズ\n loop: false, // ループ再生 (ライブのため無効化)\n airplay: false, // AirPlay 機能 (うまく動かないため無効化)\n autoplay: true, // 自動再生\n hotkey: false, // ショートカットキー(こちらで制御するため無効化)\n screenshot: false, // スクリーンショット (こちらで制御するため無効化)\n volume: 1.0, // 音量の初期値\n // 映像\n video: {\n // デフォルトの品質\n // ラジオチャンネルでは常に 48KHz/192kbps に固定する\n defaultQuality: (this.channelsStore.channel.current.is_radiochannel) ?\n '48kHz/192kbps' : this.settingsStore.settings.tv_streaming_quality,\n // 品質リスト\n quality: (() => {\n const qualities: DPlayerType.VideoQuality[] = [];\n\n // ラジオチャンネル\n // API が受け付ける品質の値は通常のチャンネルと同じだが (手抜き…)、実際の品質は 48KHz/192kbps で固定される\n // ラジオチャンネルの場合は、1080p と渡しても 48kHz/192kbps 固定の音声だけの MPEG-TS が配信される\n if (this.channelsStore.channel.current.is_radiochannel) {\n // mpegts.js\n if (this.is_mpegts_supported === true) {\n qualities.push({\n name: '48kHz/192kbps',\n type: 'mpegts',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/mpegts`,\n });\n // LL-HLS (mpegts.js がサポートされていない場合)\n } else {\n qualities.push({\n name: '48kHz/192kbps',\n type: 'live-llhls-for-KonomiTV',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/1080p/ll-hls`,\n });\n }\n\n // 通常のチャンネル\n } else {\n\n // ブラウザが H.265 / HEVC の再生に対応していて、かつ通信節約モードが有効なとき\n // API に渡す画質に -hevc のプレフィックスをつける\n let hevc_prefix = '';\n if (PlayerUtils.isHEVCVideoSupported() && this.settingsStore.settings.tv_data_saver_mode === true) {\n hevc_prefix = '-hevc';\n }\n\n // 品質リストを作成\n for (const quality of ['1080p-60fps', '1080p', '810p', '720p', '540p', '480p', '360p', '240p']) {\n // mpegts.js\n if (this.is_mpegts_supported === true) {\n qualities.push({\n name: quality === '1080p-60fps' ? '1080p (60fps)' : quality,\n type: 'mpegts',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${quality}${hevc_prefix}/mpegts`,\n });\n // LL-HLS (mpegts.js がサポートされていない場合)\n } else {\n qualities.push({\n name: quality === '1080p-60fps' ? '1080p (60fps)' : quality,\n type: 'live-llhls-for-KonomiTV',\n url: `${Utils.api_base_url}/streams/live/${this.channelsStore.display_channel_id}/${quality}${hevc_prefix}/ll-hls`,\n });\n }\n }\n }\n return qualities;\n })(),\n },\n // コメント\n danmaku: {\n user: 'KonomiTV', // 便宜上 KonomiTV に固定\n speedRate: this.settingsStore.settings.comment_speed_rate, // コメントの流れる速度\n fontSize: this.settingsStore.settings.comment_font_size, // コメントのフォントサイズ\n },\n // コメント API バックエンド\n apiBackend: {\n // コメント取得時\n read: (options) => {\n // 空の配列を返す (こうするとコメント0件と認識される)\n options.success([]);\n },\n // コメント送信時\n send: async (options) => {\n // Comment コンポーネント内のコメント送信メソッドを呼び出す\n // ref: https://stackoverflow.com/a/65729556/17124142 ($refs への型設定)\n (this.$refs.Comment as InstanceType).sendComment(options);\n },\n },\n // プラグイン\n pluginOptions: {\n // mpegts.js\n mpegts: {\n config: {\n // Web Worker を有効にする\n enableWorker: true,\n // Media Source Extensions API 向けの Web Worker を有効にする\n // メインスレッドから再生処理を分離することで、低スペック端末で DOM 描画の遅延が影響して映像再生が詰まる問題が解消される\n // MSE in Workers が使えるかは MediaSource.canConstructInDedicatedWorker が true かどうかで判定できる\n // MediaSource.canConstructInDedicatedWorker は TypeScript の仕様上型定義の追加が難しいため any で回避している\n // ref: https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/canConstructInDedicatedWorker_static\n enableMSEWorker: (MediaSource as any).canConstructInDedicatedWorker === true,\n // IO 層のバッファを禁止する\n enableStashBuffer: false,\n // HTMLMediaElement の内部バッファによるライブストリームの遅延を追跡する\n // liveBufferLatencyChasing と異なり、いきなり再生時間をスキップするのではなく、\n // 再生速度を少しだけ上げることで再生を途切れさせることなく遅延を追跡する\n liveSync: this.settingsStore.settings.tv_low_latency_mode,\n // 許容する HTMLMediaElement の内部バッファの最大値 (秒単位, 3秒)\n liveSyncMaxLatency: 3,\n // HTMLMediaElement の内部バッファ (遅延) が liveSyncMaxLatency を超えたとき、ターゲットとする遅延時間 (秒単位)\n liveSyncTargetLatency: playback_buffer_sec,\n // ライブストリームの遅延の追跡に利用する再生速度 (x1.1)\n // 遅延が 3 秒を超えたとき、遅延が playback_buffer_sec を下回るまで再生速度が x1.1 に設定される\n liveSyncPlaybackRate: 1.1,\n }\n },\n // aribb24.js\n aribb24: {\n // 描画フォント\n normalFont: `\"${this.settingsStore.settings.caption_font}\", \"Rounded M+ 1m for ARIB\", sans-serif`,\n // 縁取りする色\n forceStrokeColor: this.settingsStore.settings.always_border_caption_text,\n // 背景色\n forceBackgroundColor: (() => {\n if (this.settingsStore.settings.specify_caption_opacity === true) {\n const opacity = this.settingsStore.settings.caption_opacity;\n return `rgba(0, 0, 0, ${opacity})`;\n } else {\n return undefined;\n }\n })(),\n // DRCS 文字を対応する Unicode 文字に置換\n drcsReplacement: true,\n // 高解像度の字幕 Canvas を取得できるように\n enableRawCanvas: true,\n // 縁取りに strokeText API を利用\n useStroke: true,\n // Unicode 領域の代わりに私用面の領域を利用 (Windows TV 系フォントのみ)\n usePUA: (() => {\n const font = this.settingsStore.settings.caption_font;\n const context = document.createElement('canvas').getContext('2d')!;\n context.font = '10px \"Rounded M+ 1m for ARIB\"';\n context.fillText('Test', 0, 0);\n context.font = `10px \"${font}\"`;\n context.fillText('Test', 0, 0);\n if (font.startsWith('Windows TV')) {\n return true;\n } else {\n return false;\n }\n })(),\n // 文字スーパーの PRA (内蔵音再生コマンド) のコールバックを指定\n PRACallback: async (index: number) => {\n\n // 設定で文字スーパーが無効なら実行しない\n if (this.settingsStore.settings.tv_show_superimpose === false) return;\n\n // index に応じた内蔵音を鳴らす\n // ref: https://ics.media/entry/200427/\n // ref: https://www.ipentec.com/document/javascript-web-audio-api-change-volume\n\n // 自動再生ポリシーに引っかかったなどで AudioContext が一時停止されている場合、一度 resume() する必要がある\n // resume() するまでに何らかのユーザーのジェスチャーが行われているはず…\n // なくても動くこともあるみたいだけど、念のため\n if (this.romsounds_context.state === 'suspended') {\n await this.romsounds_context.resume();\n }\n\n // index で指定された音声データを読み込み\n const buffer_source_node = this.romsounds_context.createBufferSource();\n buffer_source_node.buffer = this.romsounds_buffers[index];\n\n // GainNode につなげる\n const gain_node = this.romsounds_context.createGain();\n buffer_source_node.connect(gain_node);\n\n // 出力につなげる\n gain_node.connect(this.romsounds_context.destination);\n\n // 音量を元の wav の3倍にする (1倍だと結構小さめ)\n gain_node.gain.value = 3;\n\n // 再生開始\n buffer_source_node.start(0);\n },\n }\n },\n // 字幕\n subtitle: {\n type: 'aribb24', // aribb24.js を有効化\n }\n });\n\n // デバッグ用にプレイヤーインスタンスも window 直下に入れる\n (window as any).player = this.player;\n\n // プレイヤー側のコントロール非表示タイマーを無効化(上書き)\n // 無効化しておかないと、controlDisplayTimer() と競合してしまう\n // 上書き元のコードは https://github.com/tsukumijima/DPlayer/blob/master/src/js/controller.js#L387-L395 にある\n this.player.controller.setAutoHide = (time: number) => {};\n\n // ニコニコ実況セッションを初期化し、随時コメントを受信できるようにする\n // 初期化以降の処理はすべて LiveCommentManager に任せる\n (this.$refs.Comment as InstanceType).initSession(this.player, this.channelsStore.display_channel_id);\n\n // ***** コメント送信時のイベントハンドラー *****\n\n // コメントが送信されたときに、プレイヤーからのコメント送信から間もないかどうかのフラグを立てる (0.1秒後に解除する)\n // コメントを送信するとコメント入力フォームへのフォーカスが外れるため、ページ全体の keydown イベントでは\n // Enter キーの押下がコメント送信由来のイベントかキャプチャ拡大表示由来のイベントかを判断できない\n // そこで、コメント入力フォームフォーカス中に Enter キーが押された場合(=コメント送信時)に 0.1 秒間フラグを立てることで、\n // ショートカットキーハンドラーがコメント送信由来のイベントであることを判定できるようにしている\n this.player.template.commentInput.addEventListener('keydown', (event) => {\n if (event.code === 'Enter') {\n this.is_comment_send_just_did = true;\n setTimeout(() => this.is_comment_send_just_did = false, 100);\n }\n });\n\n // 「コメント送信後にコメント入力フォームを閉じる」がオフになっている時のために、プレイヤー側のコメント送信関数を上書き\n // 上書き部分以外の処理内容は概ね https://github.com/tsukumijima/DPlayer/blob/master/src/js/comment.js に準じる\n this.player.comment!.send = () => {\n\n if (this.player === null) {\n return; // 復旧不可能 (発生しないはずだが、書いとかないと TypeScript に怒られる)\n }\n\n // コメント入力フォームへのフォーカスを外す (「コメント送信後にコメント入力フォームを閉じる」がオンのときだけ)\n if (this.settingsStore.settings.close_comment_form_after_sending === true) {\n this.player.template.commentInput.blur();\n }\n\n // 空コメントを弾く\n if (!this.player.template.commentInput.value.replace(/^\\s+|\\s+$/g, '')) {\n this.player.notice(this.player.tran('Please input danmaku content!'), undefined, undefined, '#FF6F6A');\n return;\n }\n\n // コメントを送信\n this.player.danmaku!.send(\n {\n text: this.player.template.commentInput.value,\n color: this.player.container.\n querySelector('.dplayer-comment-setting-color input:checked')!.value,\n type: this.player.container.\n querySelector('.dplayer-comment-setting-type input:checked')!.value as DPlayerType.DanmakuType,\n size: this.player.container.\n querySelector('.dplayer-comment-setting-size input:checked')!.value as DPlayerType.DanmakuSize,\n },\n // 送信完了後にコメント入力フォームを閉じる ([コメント送信後にコメント入力フォームを閉じる] がオンのときだけ)\n () => {\n if (this.settingsStore.settings.close_comment_form_after_sending === true) {\n this.player !== null && this.player.comment!.hide();\n }\n },\n true,\n );\n\n // 重複送信を防ぐ\n this.player.template.commentInput.value = '';\n };\n\n // ***** 設定パネルのショートカット一覧へのリンクのイベントハンドラー *****\n\n // 設定パネルにショートカット一覧を表示するリンクを動的に追加する\n // タッチデバイスでは実行しない\n const is_touch_device = /iPhone|iPad|iPod|Macintosh|Android|Mobile/i.test(navigator.userAgent) && 'ontouchend' in document;\n if (is_touch_device === false) {\n this.player.template.settingOriginPanel.insertAdjacentHTML('beforeend', `\n
\n キーボードショートカット\n
\n \n \n \n
\n
`);\n\n // 設定パネルの高さを再設定\n const settingOriginPanelHeight = this.player.template.settingOriginPanel.scrollHeight;\n this.player.template.settingBox.style.clipPath = `inset(calc(100% - ${settingOriginPanelHeight}px) 0 0 round 7px)`;\n\n // 設定パネルのショートカット一覧を表示するリンクがクリックされたときのイベント\n // リアクティブではないので、手動でやらないといけない…\n this.$el.querySelector('.dplayer-setting-keyboard-shortcut')!.addEventListener('click', () => {\n this.player?.setting.hide(); // 設定パネルを閉じる\n this.shortcut_key_modal = true;\n });\n }\n\n // ***** フルスクリーンのイベントハンドラー *****\n\n // フルスクリーンにするコンテナ要素(ページ全体)\n const fullscreen_container = document.querySelector('.v-application')!;\n this.fullscreen_handler = () => {\n this.is_fullscreen = this.player?.fullScreen.isFullScreen() === true;\n };\n if (fullscreen_container.onfullscreenchange !== undefined) {\n fullscreen_container.addEventListener('fullscreenchange', this.fullscreen_handler);\n } else {\n fullscreen_container.addEventListener('webkitfullscreenchange', this.fullscreen_handler);\n }\n\n // DPlayer のフルスクリーン関係のメソッドを無理やり上書きし、KonomiTV の UI と統合する\n // 上書き元のコードは https://github.com/tsukumijima/DPlayer/blob/master/src/js/fullscreen.js にある\n // フルスクリーンかどうか\n this.player.fullScreen.isFullScreen = (type?: DPlayerType.FullscreenType) => {\n return !!(document.fullscreenElement || document.webkitFullscreenElement);\n };\n // フルスクリーンをリクエスト\n this.player.fullScreen.request = (type?: DPlayerType.FullscreenType) => {\n if (this.player === null) return;\n\n // すでにフルスクリーンだったらキャンセルする\n if (this.player.fullScreen.isFullScreen()) {\n this.player.fullScreen.cancel();\n return;\n }\n\n // フルスクリーンをリクエスト\n // Safari は webkit のベンダープレフィックスが必要\n fullscreen_container.requestFullscreen = fullscreen_container.requestFullscreen || fullscreen_container.webkitRequestFullscreen;\n if (fullscreen_container.requestFullscreen) {\n fullscreen_container.requestFullscreen();\n } else {\n // フルスクリーンがサポートされていない場合はエラーを表示\n this.player.notice('iPhone Safari は動画のフルスクリーン表示に対応していません。', undefined, undefined, '#FF6F6A');\n return;\n }\n\n // 画面の向きを横に固定 (Screen Orientation API がサポートされている場合)\n if (screen.orientation) {\n screen.orientation.lock('landscape').catch(() => {});\n }\n };\n // フルスクリーンをキャンセル\n this.player.fullScreen.cancel = (type?: DPlayerType.FullscreenType) => {\n\n // フルスクリーンを終了\n // Safari は webkit のベンダープレフィックスが必要\n document.exitFullscreen = document.exitFullscreen || document.webkitExitFullscreen;\n if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n\n // 画面の向きの固定を解除\n if (screen.orientation) {\n screen.orientation.unlock();\n }\n };\n\n // ***** 再生/停止/画質切り替え時のイベントハンドラー *****\n\n // 再生/停止されたとき\n // 通知バーからの制御など、画面から以外の外的要因で再生/停止が行われる事もある\n const on_play_or_pause = () => {\n\n // まだ設定パネルが表示されていたら非表示にする\n this.player?.setting.hide();\n\n // コントロールを表示する\n this.controlDisplayTimer();\n };\n this.player.on('play', on_play_or_pause);\n this.player.on('pause', on_play_or_pause);\n\n // 画質の切り替えが開始されたときのイベント\n this.player.on('quality_start', async () => {\n\n // ローディング中の背景画像をランダムで設定\n this.background_url = PlayerUtils.generatePlayerBackgroundURL();\n\n // イベントソースを閉じる\n if (this.eventsource !== null) {\n this.eventsource.close();\n this.eventsource = null;\n }\n\n // 新しい EventSource を作成\n // 画質ごとにイベント API は異なるため、一度破棄してから作り直す\n await this.initEventHandler();\n });\n\n // 停止状態でかつ再生時間からバッファが 30 秒以上離れていないかを監視し、そうなっていたら強制的にシークする\n // mpegts.js の仕様上、MSE に未再生のバッファがたまり過ぎると SourceBuffer が追加できなくなるため、強制的に接続が切断されてしまう\n // LL-HLS 再生時も、ずっと停止したままだとプレイリストやセグメントに HTTP リクエストされなくなり、サーバー側でタイムアウトさせられてしまう\n // mpegts.js 再生時は 60 秒、LL-HLS 再生時は 30 秒おきに監視する (LL-HLS 再生時はバッファの状態に関わらずシークする)\n if (this.is_mpegts_supported === true) {\n this.interval_ids.push(window.setInterval(() => {\n if (this.player === null) return;\n if ((this.player.video.paused && this.player.video.buffered.length >= 1) &&\n (this.player.video.buffered.end(0) - this.player.video.currentTime > 30)) {\n this.player.sync();\n }\n }, 60 * 1000));\n } else {\n this.interval_ids.push(window.setInterval(() => {\n if (this.player === null) return;\n if (this.player.video.paused) {\n this.player.sync();\n }\n }, 30 * 1000));\n }\n\n // ***** 文字スーパーのイベントハンドラー *****\n\n (async () => {\n\n // 文字スーパーが初期化されるまで待つ\n if (this.player === null) return;\n while (this.player.plugins.aribb24Superimpose === undefined) {\n await Utils.sleep(0.1); // 0.1 秒待つ\n }\n\n // 設定で文字スーパーが有効\n // 字幕が非表示の場合でも、文字スーパーは表示する\n if (this.settingsStore.settings.tv_show_superimpose === true) {\n this.player.plugins.aribb24Superimpose.show();\n this.player.on('subtitle_hide', () => {\n this.player?.plugins.aribb24Superimpose!.show();\n });\n // 設定で文字スーパーが無効\n } else {\n this.player.plugins.aribb24Superimpose.hide();\n this.player.on('subtitle_show', () => {\n this.player?.plugins.aribb24Superimpose!.hide();\n });\n }\n\n })();\n },\n\n // イベントハンドラーを初期化する\n async initEventHandler() {\n\n // ***** プレイヤー再生開始時のイベントハンドラー *****\n\n if (this.player === null) return;\n\n // データ放送マネージャーを初期化\n // TODO: これは暫定的なものでリファクタリング時は周囲含めて総取っ替えする\n if (this.data_broadcasting_manager !== null) {\n await this.data_broadcasting_manager.destroy();\n }\n this.data_broadcasting_manager = new LiveDataBroadcastingManager({\n player: this.player,\n display_channel_id: this.channelsStore.channel.current.display_channel_id,\n });\n await this.data_broadcasting_manager.init();\n\n // 必ず最初はローディング状態とする\n this.is_loading = true;\n\n // 音量を 0 に設定\n this.player.video.volume = 0;\n\n // video 要素の crossOrigin 属性を 'anonymous' に設定\n // これを設定しないと、クロスオリジンの場合にキャプチャができない\n this.player.video.crossOrigin = 'anonymous';\n\n // mpegts.js 再生時のみ、mpegts.js のログハンドラーを設定する\n if (this.is_mpegts_supported === true && this.player.plugins.mpegts !== undefined) {\n this.player.plugins.mpegts.on(mpegts.Events.ERROR, async (error_type: mpegts.ErrorTypes, detail: mpegts.ErrorDetails) => {\n // 再生中にエラーが発生した場合\n // ワークアラウンドとして通知した後にページをリロードする\n // TODO: ロジックを整理してストリーミングを再起動できるようにする\n this.player.notice(`再生中にエラーが発生しました。(${error_type}: ${detail}) 3秒後にリロードします。`, -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n });\n // LL-HLS 再生時は、error イベントを監視してエラーが発生したらページをリロードする\n } else if (this.is_mpegts_supported === false) {\n this.player.on('error', async () => {\n // オフライン状態では実行しない\n if (this.is_offline === true) {\n return;\n }\n // エラーイベントが発生したが、エラー情報が取得できない場合は何もしない\n if (!this.player?.video.error) {\n return;\n }\n this.player.notice(`再生中にエラーが発生しました。(${this.player.video.error.code}: ${this.player.video.error.message}) 3秒後にリロードします。`, -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n });\n }\n\n // LL-HLS 再生時のみ、ローディングが終わるまでは表示上再生状態を維持する\n // play() が正常に実行できればいいのだが、Safari の自動再生制限により失敗することがあるので、\n // その際はアイコンの HTML を書き換えたりして強制的に再生状態にする (苦肉の策)\n const force_play = () => {\n this.player?.video.play().catch(() => {\n console.warn('HTMLVideoElement.play() rejected. run fallback.');\n const pause_icon = '';\n this.player!.template.playButton.innerHTML = pause_icon;\n this.player!.template.mobilePlayButton.innerHTML = pause_icon;\n this.player!.container.classList.remove('dplayer-paused');\n this.player!.container.classList.add('dplayer-playing');\n this.player!.danmaku!.play();\n });\n // ローディング表示が消えたタイミングでイベントを登録解除\n if (this.is_loading === false) {\n this.player!.video.removeEventListener('pause', force_play);\n return;\n }\n };\n if (this.is_mpegts_supported === false) {\n this.player.video.addEventListener('pause', force_play);\n force_play(); // 一度実行しておく\n }\n\n // 再生準備ができていない場合に復旧を試みる\n const recover = async () => {\n await Utils.sleep(0.5);\n // この時点で映像が停止している場合、復旧を試みる\n if (this.player?.video.readyState < 3) {\n console.log('player.video.readyState < HAVE_FUTURE_DATA. trying to recover.');\n this.player?.video.pause();\n await Utils.sleep(0.1);\n this.player?.video.play().catch(() => {\n console.warn('HTMLVideoElement.play() rejected. paused.');\n this.player?.pause();\n });\n }\n };\n\n // 再生バッファを調整し、再生準備ができた段階でプレイヤーの背景を非表示にするイベントを登録\n // 実際に再生可能になるのを待ってから実行する\n // 画質切り替え時にも実行する必要があるので、あえてこの位置に記述している\n const on_canplay = async () => {\n\n // 自分自身のイベントを登録解除 (重複実行を避ける)\n if (this.player === null) return;\n this.player.video.oncanplay = null;\n this.player.video.oncanplaythrough = null;\n\n // mpegts.js 利用時のみ実行\n if (this.is_mpegts_supported === true) {\n\n // 再生バッファ調整のため、一旦停止させる\n // this.player.video.pause() を使うとプレイヤーの UI アイコンが停止してしまうので、代わりに playbackRate を使う\n this.player.video.playbackRate = 0;\n\n // 再生バッファを取得する (取得に失敗した場合は 0 を返す)\n const get_playback_buffer_sec = (): number => {\n let buffered_end = 0;\n if (this.player.video.buffered.length >= 1) {\n buffered_end = this.player.video.buffered.end(0);\n }\n return (Math.round((buffered_end - this.player.video.currentTime) * 1000) / 1000);\n };\n\n // 低遅延モードであれば低遅延向けの再生バッファを、そうでなければ通常の再生バッファをセット (秒単位)\n const playback_buffer_sec = this.settingsStore.settings.tv_low_latency_mode ?\n PLAYBACK_BUFFER_SEC_LOW_LATENCY : PLAYBACK_BUFFER_SEC;\n\n // 再生バッファが playback_buffer_sec を超えるまで 0.1 秒おきに再生バッファをチェックする\n // 再生バッファが playback_buffer_sec を切ると再生が途切れやすくなるので (特に動きの激しい映像)、\n // 再生開始までの時間を若干犠牲にして、再生バッファの調整と同期に時間を割く\n // playback_buffer_sec の値は mpegts.js に渡す liveSyncTargetLatency プロパティに渡す値と共通\n let current_playback_buffer_sec = get_playback_buffer_sec();\n while (current_playback_buffer_sec < playback_buffer_sec) {\n await Utils.sleep(0.1);\n current_playback_buffer_sec = get_playback_buffer_sec();\n }\n\n // 再生開始\n this.player.video.playbackRate = 1;\n }\n\n // 再生が一時的に止まってバッファリングしているとき/再び再生されはじめたときのイベント\n // バッファリングの Progress Circular の表示を制御する\n // 同期が終わってからの方が都合が良い\n this.player.video.addEventListener('waiting', () => this.is_video_buffering = true);\n this.player.video.addEventListener('playing', () => {\n this.is_video_buffering = false;\n recover();\n });\n\n // ローディング状態を解除し、映像を表示する\n this.is_loading = false;\n\n // ローディングが終わったので強制的に見かけ上再生状態に見せるのをやめる\n if (this.is_mpegts_supported === false) {\n this.player!.video.removeEventListener('pause', force_play);\n }\n\n // バッファリング中の Progress Circular を非表示にする\n this.is_video_buffering = false;\n recover();\n\n if (this.channelsStore.channel.current.is_radiochannel) {\n // ラジオチャンネルでは引き続き映像の代わりとして背景画像を表示し続ける\n this.is_background_display = true;\n } else {\n // 背景画像をフェードアウト\n this.is_background_display = false;\n }\n\n // 再生開始時に音量を徐々に上げる\n // いきなり再生されるよりも体験が良い\n const current_volume = this.player.user.get('volume');\n while ((this.player.video.volume + 0.05) < current_volume) {\n // 小数第2位以下を切り捨てて、浮動小数の誤差で 1 (100%) を微妙に超えてしまいエラーになるのを避ける\n this.player.video.volume = Utils.mathFloor(this.player.video.volume + 0.05, 2);\n await Utils.sleep(0.02);\n }\n this.player.video.volume = current_volume;\n };\n this.player.video.oncanplay = on_canplay;\n this.player.video.oncanplaythrough = on_canplay;\n\n // ***** KonomiTV サーバーのイベント API のイベントハンドラー *****\n\n // EventSource を作成\n const eventsource_url = (this.player!.quality!.url as string).replace('/mpegts', '/events').replace(/\\/ll-hls.*/, '/events');\n this.eventsource = new EventSource(eventsource_url);\n\n // 初回接続時のイベント\n this.eventsource.addEventListener('initial_update', (event_raw: MessageEvent) => {\n\n // イベントを取得\n const event = JSON.parse(event_raw.data);\n console.log(`[initial_update] Status: ${event.status} / Detail: ${event.detail}`);\n\n // ステータスごとに処理を振り分け\n switch (event.status) {\n\n // Status: Standby\n case 'Standby': {\n\n // バッファリング中の Progress Circular を表示\n this.is_video_buffering = true;\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n break;\n }\n }\n });\n\n // ステータスが更新されたときのイベント\n this.eventsource.addEventListener('status_update', async (event_raw: MessageEvent) => {\n\n // イベントを取得\n if (this.player === null) return;\n const event = JSON.parse(event_raw.data);\n console.log(`[status_update] Status: ${event.status} / Detail: ${event.detail}`);\n\n // 視聴者数を更新\n this.channelsStore.updateChannel(this.channelsStore.display_channel_id, {\n ...this.channelsStore.channel.current,\n viewer_count: event.client_count,\n });\n\n // ステータスごとに処理を振り分け\n switch (event.status) {\n\n // Status: Standby\n case 'Standby': {\n\n // ステータス詳細をプレイヤーに表示\n if (!this.player.template.notice.textContent!.includes('画質を')) { // 画質切り替えの表示を上書きしない\n this.player.notice(event.detail, -1);\n }\n\n // バッファリング中の Progress Circular を表示\n this.is_video_buffering = true;\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n break;\n }\n\n // Status: ONAir\n case 'ONAir': {\n\n // ステータス詳細をプレイヤーから削除\n if (!this.player.template.notice.textContent!.includes('画質を')) { // 画質切り替えの表示を上書きしない\n this.player.notice(this.player.template.notice.textContent!, 0.000001);\n }\n\n // LL-HLS ストリーミング時のみ、このタイミングで映像をロードして再生を開始する\n if (this.is_mpegts_supported === false) {\n this.player.video.load();\n this.player.video.play();\n on_canplay();\n }\n\n // 再生が開始される前にチャンネルを切り替えた際にコメントが流れない不具合のワークアラウンド\n if (this.player.container.classList.contains('dplayer-paused')) {\n this.player.container.classList.remove('dplayer-paused');\n this.player.container.classList.add('dplayer-playing');\n }\n\n // 前のプレイヤーインスタンスの Picture-in-Picture ウインドウが残っている場合、終了させてからもう一度切り替える\n // チャンネル切り替えが完了しても前の Picture-in-Picture ウインドウは再利用されないため、一旦終了させるしかない\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n this.player.video.requestPictureInPicture();\n }\n break;\n }\n\n // Status: Idling\n case 'Idling': {\n\n // 本来誰も視聴していないことを示す Idling ステータスを受信している場合、何らかの理由で\n // ストリーミング API への接続が切断された可能性が高いので、ワークアラウンドとして通知した後にページをリロードする\n // TODO: ロジックを整理してストリーミングを再起動できるようにする\n this.player.notice('ストリーミング接続が切断されました。3秒後にリロードします。', -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n\n break;\n }\n\n // Status: Restart\n case 'Restart': {\n\n // ステータス詳細をプレイヤーに表示\n this.player.notice(event.detail, -1);\n\n // プレイヤーを再起動する\n this.player.switchVideo({\n url: this.player.quality!.url,\n type: this.player.quality!.type,\n });\n\n // 再起動しただけでは自動再生されないので、明示的に\n this.player.play();\n\n // バッファリング中の Progress Circular を表示\n this.is_video_buffering = true;\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n break;\n }\n\n // Status: Offline\n // 基本的に Offline は放送休止中やエラーなどで復帰の見込みがない状態\n case 'Offline': {\n\n // 「ライブストリームは Offline です。」のステータス詳細を受信すること自体が不正な状態\n // ストリーミング API への接続が切断された可能性が高いので、ワークアラウンドとして通知した後にページをリロードする\n // TODO: ロジックを整理してストリーミングを再起動できるようにする\n if (event.detail === 'ライブストリームは Offline です。') {\n this.player?.notice('ストリーミング接続が切断されました。3秒後にリロードします。', -1, undefined, '#FF6F6A');\n await Utils.sleep(3);\n location.reload();\n }\n\n if (this.player !== null) {\n\n // ステータス詳細をプレイヤーに表示\n // 動画の読み込みエラーが送出された時にメッセージを上書きする\n this.player.notice(event.detail, -1);\n this.player.video.onerror = () => {\n this.player!.notice(event.detail, -1);\n this.player!.video.onerror = null;\n };\n\n // 描画されたコメントをクリア\n this.player?.danmaku?.clear();\n\n // 動画を停止する\n this.player.video.pause();\n }\n\n // イベントソースを閉じる(復帰の見込みがないため)\n if (this.eventsource !== null) {\n this.eventsource.close();\n this.eventsource = null;\n }\n\n // プレイヤーの背景を表示する\n this.is_background_display = true;\n\n // バッファリング中の Progress Circular を非表示にする\n this.is_loading = false;\n this.is_video_buffering = false;\n\n this.is_offline = true;\n break;\n }\n }\n });\n\n // ステータス詳細が更新されたときのイベント\n this.eventsource.addEventListener('detail_update', (event_raw: MessageEvent) => {\n\n // イベントを取得\n if (this.player === null) return;\n const event = JSON.parse(event_raw.data);\n console.log(`[detail_update] Status: ${event.status} Detail:${event.detail}`);\n\n // 視聴者数を更新\n this.channelsStore.updateChannel(this.channelsStore.display_channel_id, {\n ...this.channelsStore.channel.current,\n viewer_count: event.client_count,\n });\n\n // ステータスごとに処理を振り分け\n switch (event.status) {\n\n // Status: Standby\n case 'Standby': {\n\n // ステータス詳細をプレイヤーに表示\n this.player.notice(event.detail, -1);\n\n // プレイヤーの背景を表示する\n if (!this.is_background_display) {\n this.is_background_display = true;\n }\n break;\n }\n }\n });\n\n // クライアント数(だけ)が更新されたときのイベント\n this.eventsource.addEventListener('clients_update', (event_raw: MessageEvent) => {\n\n // イベントを取得\n const event = JSON.parse(event_raw.data);\n\n // 視聴者数を更新\n this.channelsStore.updateChannel(this.channelsStore.display_channel_id, {\n ...this.channelsStore.channel.current,\n viewer_count: event.client_count,\n });\n });\n },\n\n // ショートカットキーを初期化する\n initShortcutKeyHandler() {\n\n const twitter_component = (this.$refs.Twitter as InstanceType);\n const tweet_form_element = twitter_component.$el.querySelector('.tweet-form__textarea');\n\n // IME 変換中の状態を保存する\n for (const element of document.querySelectorAll('input[type=text],input[type=search],textarea')) {\n element.addEventListener('compositionstart', () => this.is_ime_composing = true);\n element.addEventListener('compositionend', () => this.is_ime_composing = false);\n }\n\n // ショートカットキーハンドラー\n this.shortcut_key_handler = async (event: KeyboardEvent) => {\n\n const tag = document.activeElement.tagName.toUpperCase();\n const editable = document.activeElement.getAttribute('contenteditable');\n\n // 矢印キーのデフォルトの挙動(スクロール)を抑制\n // キーリピート周りで間引かれるイベントでも event.preventDefault() しないとスクロールしてしまうため、\n // 一番最初のタイミングでやっておく\n // input・textarea・contenteditable 状態の要素では実行しない\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code) &&\n (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true')) {\n event.preventDefault();\n }\n\n // キーリピート(押しっぱなし)状態の場合は基本実行しない\n // 押し続けると何度も同じ動作が実行されて大変な事になる…\n // ただ、キーリピートを使いたい場合もあるので、リピート状態をフラグとして保存する\n let is_repeat = false;\n if (event.repeat) is_repeat = true;\n\n // キーリピート状態は event.repeat を見る事でだいたい検知できるが、最初の何回かは検知できないこともある\n // そこで、0.05 秒以内に連続して発火したキーイベントは間引きも兼ねて実行しない\n const now = Utils.time();\n if (now - this.shortcut_key_pressed_at < 0.05) return;\n this.shortcut_key_pressed_at = now; // 最終押下時刻を更新\n\n // 無名関数の中で実行する\n const result = await (async (): Promise => {\n\n // ***** ツイート入力フォームにフォーカスを当てる/フォーカスを外す *****\n\n // ツイート入力フォームにフォーカスしているときもこのショートカットが動くようにする\n // 以降の if 文で textarea フォーカス時のイベントをすべて弾いてしまっているため、前に持ってきている\n // Tab キーに割り当てている関係で、IME 変換中は実行しない(IME 変換中に実行すると文字変換ができなくなる)\n if (((tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') ||\n (document.activeElement === tweet_form_element)) && this.is_ime_composing === false) {\n if (event.code === 'Tab') {\n\n // ツイート入力フォームにフォーカスがすでに当たっていたら、フォーカスを外して終了\n if (document.activeElement === tweet_form_element) {\n tweet_form_element.blur();\n return true;\n }\n\n // パネルを開く\n this.is_panel_display = true;\n\n // どのタブを開いていたかに関係なく Twitter タブに切り替える\n this.tv_panel_active_tab = 'Twitter';\n\n // ツイート入力フォームの textarea 要素にフォーカスを当てる\n tweet_form_element.focus();\n\n // フォーカスを当てると勝手に横方向にスクロールされてしまうので、元に戻す\n this.$el.scrollLeft = 0;\n\n window.setTimeout(() => {\n\n // 他のタブから切り替えると一発でフォーカスが当たらないことがあるので、ちょっとだけ待ってから念押し\n // $nextTick() だと上手くいかなかった…\n tweet_form_element.focus();\n\n // フォーカスを当てると勝手に横方向にスクロールされてしまうので、元に戻す\n this.$el.scrollLeft = 0;\n\n }, 100); // 0.1秒\n\n return true;\n }\n }\n\n // ***** ツイートを送信する *****\n\n // ツイート入力フォームにフォーカスしているときもこのショートカットが動くようにする\n // Twitter タブ以外を開いているときは実行しない\n // 以降の if 文で textarea フォーカス時のイベントをすべて弾いてしまっているため、前に持ってきている\n if (((tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') ||\n (document.activeElement === tweet_form_element)) &&\n this.tv_panel_active_tab === 'Twitter' &&\n this.is_ime_composing === false) {\n // (Ctrl or Cmd or Shift) + Enter\n // Shift + Enter は隠し機能(間違えたとき用)\n if ((event.ctrlKey || event.metaKey || event.shiftKey) && event.code === 'Enter') {\n twitter_component.$el.querySelector('.tweet-button')!.click();\n return true;\n }\n }\n\n // ***** コメント入力フォームを閉じる *****\n\n // プレイヤーが初期化されていない時・Shift / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && !event.shiftKey && !event.altKey) {\n\n // コメント入力フォームが表示されているときのみ\n if (this.player.template.controller.classList.contains('dplayer-controller-comment')) {\n // Ctrl or Cmd + M\n if ((event.ctrlKey || event.metaKey) && event.code === 'KeyM') {\n this.player.comment!.hide();\n return true;\n }\n }\n }\n\n // input・textarea・contenteditable 状態の要素でなければ\n // 文字入力中にショートカットキーが作動してしまわないように\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n\n // キーリピートでない時・Ctrl / Cmd キーが一緒に押された時に作動しないように\n // チャンネル選局のキーボードショートカットを Alt or Option + 数字キー/テンキーに変更する設定が有効なときは、\n // Alt or Option キーが押されていることを条件に追加する\n if (is_repeat === false && !event.ctrlKey && !event.metaKey &&\n (this.settingsStore.settings.tv_channel_selection_requires_alt_key === false || (event.altKey))) {\n\n // ***** 数字キーでチャンネルを切り替える *****\n\n // Shift キーが同時押しされていたら BS チャンネルの方を選局する\n const switch_channel_type = (event.shiftKey) ? 'BS' : 'GR';\n\n // 1~9キー\n let switch_remocon_id: number | null = null;\n if (event.code === 'Digit1' || event.code === 'Digit2' || event.code === 'Digit3' ||\n event.code === 'Digit4' || event.code === 'Digit5' || event.code === 'Digit6' ||\n event.code === 'Digit7' || event.code === 'Digit8' || event.code === 'Digit9') {\n switch_remocon_id = Number(event.code.replace('Digit', ''));\n }\n // 0キー: 10に割り当て\n if (event.code === 'Digit0') switch_remocon_id = 10;\n // -キー: 11に割り当て\n if (event.code === 'Minus') switch_remocon_id = 11;\n // ^キー: 12に割り当て\n if (event.code === 'Equal') switch_remocon_id = 12;\n // 1~9キー (テンキー)\n if (event.code === 'Numpad1' || event.code === 'Numpad2' || event.code === 'Numpad3' ||\n event.code === 'Numpad4' || event.code === 'Numpad5' || event.code === 'Numpad6' ||\n event.code === 'Numpad7' || event.code === 'Numpad8' || event.code === 'Numpad9') {\n switch_remocon_id = Number(event.code.replace('Numpad', ''));\n }\n // 0キー (テンキー): 10に割り当て\n if (event.code === 'Numpad0') switch_remocon_id = 10;\n\n // この時点でリモコン番号が取得できていたら実行\n if (switch_remocon_id !== null) {\n\n // 切り替え先のチャンネルを取得する\n const switch_channel = this.channelsStore.getChannelByRemoconID(switch_channel_type, switch_remocon_id);\n\n // チャンネルが取得できていれば、ルーティングをそのチャンネルに置き換える\n // 押されたキーに対応するリモコン番号のチャンネルがない場合や、現在と同じチャンネル ID の場合は何も起こらない\n if (switch_channel !== null && switch_channel.display_channel_id !== this.channelsStore.display_channel_id) {\n await this.$router.push({path: `/tv/watch/${switch_channel.display_channel_id}`});\n return true;\n }\n }\n }\n\n // キーリピートでない時・Ctrl / Cmd / Shift / Alt キーが一緒に押された時に作動しないように\n if (is_repeat === false && !event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey) {\n\n // ***** キーボードショートカットの一覧を表示する *****\n\n // /(?)キー: キーボードショートカットの一覧を表示する\n if (event.code === 'Slash') {\n this.shortcut_key_modal = !this.shortcut_key_modal;\n return true;\n }\n\n // ***** パネルのタブを切り替える *****\n\n // Pキー: パネルの表示切り替え\n if (event.code === 'KeyP') {\n this.is_panel_display = !this.is_panel_display;\n return true;\n }\n // Kキー: 番組情報タブ\n if (event.code === 'KeyK') {\n this.tv_panel_active_tab = 'Program';\n return true;\n }\n // Lキー: チャンネルタブ\n if (event.code === 'KeyL') {\n this.tv_panel_active_tab = 'Channel';\n return true;\n }\n // ;(+)キー: コメントタブ\n if (event.code === 'Semicolon') {\n this.tv_panel_active_tab = 'Comment';\n return true;\n }\n // :(*)キー: Twitterタブ\n if (event.code === 'Quote') {\n this.tv_panel_active_tab = 'Twitter';\n return true;\n }\n\n // ***** Twitter タブ内のタブを切り替える *****\n\n // [(「): ツイート検索タブ\n if (event.code === 'BracketRight') {\n twitter_component.twitter_active_tab = 'Search';\n return true;\n }\n // ](」): タイムラインタブ\n if (event.code === 'Backslash') {\n twitter_component.twitter_active_tab = 'Timeline';\n return true;\n }\n // \\(¥)キー: キャプチャタブ\n if (event.code === 'IntlRo') {\n twitter_component.twitter_active_tab = 'Capture';\n return true;\n }\n }\n\n // Twitter タブ内のキャプチャタブが表示されている & Ctrl / Cmd / Shift / Alt のいずれも押されていないときだけ\n // キャプチャタブが表示されている時は、プレイヤー操作側の矢印キー/スペースキーのショートカットは動作しない(キーが重複するため)\n if (this.tv_panel_active_tab === 'Twitter' && twitter_component.twitter_active_tab === 'Capture' &&\n (!event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey)) {\n\n // ***** キャプチャにフォーカスする *****\n\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) {\n\n // キャプチャリストに一枚もキャプチャがない\n if (twitter_component.captures.length === 0) return false;\n\n // まだどのキャプチャにもフォーカスされていない場合は、一番新しいキャプチャにフォーカスして終了\n if (twitter_component.captures.some(capture => capture.focused === true) === false) {\n twitter_component.captures[twitter_component.captures.length - 1].focused = true;\n return true;\n }\n\n // 現在フォーカスされているキャプチャのインデックスを取得\n const focused_capture_index = twitter_component.captures.findIndex(capture => capture.focused === true);\n\n // ↑キー: 2つ前のキャプチャにフォーカスする\n // キャプチャリストは2列で並んでいるので、2つ後のキャプチャが現在フォーカスされているキャプチャの直上になる\n if (event.code === 'ArrowUp') {\n // 2つ前のキャプチャがないなら実行しない\n if (focused_capture_index - 2 < 0) return false;\n twitter_component.captures[focused_capture_index - 2].focused = true;\n }\n\n // ↓キー: 2つ後のキャプチャにフォーカスする\n // キャプチャリストは2列で並んでいるので、2つ後のキャプチャが現在フォーカスされているキャプチャの直下になる\n if (event.code === 'ArrowDown') {\n // 2つ後のキャプチャがないなら実行しない\n if (focused_capture_index + 2 > (twitter_component.captures.length - 1)) return false;\n twitter_component.captures[focused_capture_index + 2].focused = true;\n }\n\n // ←キー: 1つ前のキャプチャにフォーカスする\n if (event.code === 'ArrowLeft') {\n // 1つ前のキャプチャがないなら実行しない\n if (focused_capture_index - 1 < 0) return false;\n twitter_component.captures[focused_capture_index - 1].focused = true;\n }\n\n // ←キー: 1つ後のキャプチャにフォーカスする\n if (event.code === 'ArrowRight') {\n // 1つ後のキャプチャがないなら実行しない\n if (focused_capture_index + 1 > (twitter_component.captures.length - 1)) return false;\n twitter_component.captures[focused_capture_index + 1].focused = true;\n }\n\n // 現在フォーカスされているキャプチャのフォーカスを外す\n twitter_component.captures[focused_capture_index].focused = false;\n\n // 拡大表示のモーダルが開かれている場合は、フォーカスしたキャプチャをモーダルにセット\n // こうすることで、QuickLook みたいな挙動になる\n const focused_capture = twitter_component.captures.find(capture => capture.focused === true);\n if (twitter_component.zoom_capture_modal === true) {\n twitter_component.zoom_capture = focused_capture;\n }\n\n // 現在フォーカスされているキャプチャが見える位置までスクロール\n // block: 'nearest' の指定で、上下どちらにスクロールしてもフォーカスされているキャプチャが常に表示されるようになる\n const focused_capture_element =\n twitter_component.$el.querySelector(`img[src=\"${focused_capture.image_url}\"]`).parentElement;\n if (is_repeat) {\n // キーリピート状態ではスムーズスクロールがフォーカスの移動に追いつけずスクロールの挙動がおかしくなるため、\n // スムーズスクロールは無効にしてある\n focused_capture_element.scrollIntoView({block: 'nearest', inline: 'nearest', behavior: 'auto'});\n } else {\n focused_capture_element.scrollIntoView({block: 'nearest', inline: 'nearest', behavior: 'smooth'});\n }\n return true;\n }\n\n // ***** キャプチャを拡大表示する/拡大表示を閉じる *****\n\n if (event.code === 'Enter') {\n\n // Enter キーの押下がプレイヤー側のコメント送信由来のイベントの場合は実行しない\n if (this.is_comment_send_just_did) return false;\n\n // すでにモーダルが開かれている場合は、どのキャプチャが拡大表示されているかに関わらず閉じる\n if (twitter_component.zoom_capture_modal === true) {\n twitter_component.zoom_capture_modal = false;\n return true;\n }\n\n // 現在フォーカスされているキャプチャを取得\n // まだどのキャプチャにもフォーカスされていない場合は実行しない\n const focused_capture = twitter_component.captures.find(capture => capture.focused === true);\n if (focused_capture === undefined) return false;\n\n // モーダルを開き、モーダルで拡大表示するキャプチャとしてセット\n twitter_component.zoom_capture = focused_capture;\n twitter_component.zoom_capture_modal = true;\n return true;\n }\n\n // ***** キャプチャを選択する/選択を解除する *****\n\n if (event.code === 'Space') {\n\n // 現在フォーカスされているキャプチャを取得\n // まだどのキャプチャにもフォーカスされていない場合は実行しない\n const focused_capture = twitter_component.captures.find(capture => capture.focused === true);\n if (focused_capture === undefined) return false;\n\n // 「キャプチャリスト内のキャプチャがクリックされたときのイベント」を呼ぶ\n // 選択されていなければ選択され、選択されていれば選択が解除される\n // キャプチャの枚数制限などはすべて clickCapture() の中で処理される\n twitter_component.clickCapture(focused_capture);\n return true;\n }\n }\n\n // ***** 上下キーでチャンネルを切り替える *****\n\n // キーリピートでない時・Ctrl / Cmd / Shift / Alt キーが一緒に押された時に作動しないように\n // キャプチャ関連のショートカットの後に持ってこないとキャプチャ関連のショートカットが動作しなくなる\n if (is_repeat === false && !event.ctrlKey && !event.metaKey && !event.shiftKey && !event.altKey) {\n\n // ↑キー: 前のチャンネルに切り替え\n if (event.code === 'ArrowUp') {\n this.is_zapping = true;\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.previous.display_channel_id}`});\n return true;\n }\n // ↓キー: 次のチャンネルに切り替え\n if (event.code === 'ArrowDown') {\n this.is_zapping = true;\n await this.$router.push({path: `/tv/watch/${this.channelsStore.channel.next.display_channel_id}`});\n return true;\n }\n }\n\n // ***** プレイヤーのショートカットキー *****\n\n // プレイヤーが初期化されていない時・Shift / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && !event.shiftKey && !event.altKey) {\n\n // Ctrl / Cmd + ↑キー: プレイヤーの音量を上げる\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowUp') {\n this.player.volume(this.player.volume() + 0.05);\n return true;\n }\n // Ctrl / Cmd + ↓キー: プレイヤーの音量を下げる\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowDown') {\n this.player.volume(this.player.volume() - 0.05);\n return true;\n }\n // Ctrl / Cmd + ←キー: 停止して0.5秒巻き戻し\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowLeft') {\n if (this.player.video.paused === false) this.player.video.pause();\n this.player.video.currentTime = this.player.video.currentTime - 0.5;\n return true;\n }\n // Ctrl / Cmd + →キー: 停止して0.5秒早送り\n if ((event.ctrlKey || event.metaKey) && event.code === 'ArrowRight') {\n if (this.player.video.paused === false) this.player.video.pause();\n this.player.video.currentTime = this.player.video.currentTime + 0.5;\n return true;\n }\n }\n\n // プレイヤーが初期化されていない時・Ctrl / Cmd / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && !event.ctrlKey && !event.metaKey && !event.altKey) {\n\n // Shift + Spaceキー + キーリピートでない時 + Twitter タブ表示時 + キャプチャタブ表示時: 再生/停止\n if (event.shiftKey === true && event.code === 'Space' && is_repeat === false &&\n this.tv_panel_active_tab === 'Twitter' && twitter_component.twitter_active_tab === 'Capture') {\n this.player.toggle();\n return true;\n }\n }\n\n // プレイヤーが初期化されていない時・キーリピートでない時・Ctrl / Cmd / Alt キーが一緒に押された時に作動しないように\n if (this.player !== null && is_repeat === false && !event.ctrlKey && !event.metaKey && !event.altKey) {\n\n // Spaceキー: 再生/停止\n if (event.code === 'Space') {\n this.player.toggle();\n return true;\n }\n // Fキー: フルスクリーンの切り替え\n if (event.code === 'KeyF') {\n this.player.fullScreen.toggle();\n return true;\n }\n // Wキー: ライブストリームの同期\n if (event.code === 'KeyW') {\n this.player.sync();\n return true;\n }\n // Eキー: Picture-in-Picture の表示切り替え\n if (event.code === 'KeyE') {\n if (document.pictureInPictureEnabled) {\n this.player.template.pipButton.click();\n }\n return true;\n }\n // Sキー: 字幕の表示切り替え\n if (event.code === 'KeyS') {\n this.player.subtitle.toggle();\n if (!this.player.subtitle.container.classList.contains('dplayer-subtitle-hide')) {\n this.player.notice(`${this.player.tran('Show subtitle')}`);\n } else {\n this.player.notice(`${this.player.tran('Hide subtitle')}`);\n }\n return true;\n }\n // Dキー: コメントの表示切り替え\n if (event.code === 'KeyD') {\n this.player.template.showDanmaku.click();\n if (this.player.template.showDanmakuToggle.checked) {\n this.player.notice(`${this.player.tran('Show comment')}`);\n } else {\n this.player.notice(`${this.player.tran('Hide comment')}`);\n }\n return true;\n }\n // Cキー: 映像をキャプチャ\n if (event.code === 'KeyC') {\n await this.capture_manager.captureAndSave(false);\n return true;\n }\n // Vキー: 映像を実況コメントを付けてキャプチャ\n if (event.code === 'KeyV') {\n await this.capture_manager.captureAndSave(true);\n return true;\n }\n // Mキー: コメント入力フォームにフォーカス\n if (event.code === 'KeyM') {\n this.player.controller.show();\n this.player.comment.show();\n this.controlDisplayTimer();\n window.setTimeout(() => this.player.template.commentInput.focus(), 100);\n return true;\n }\n }\n }\n return false;\n })();\n\n // 無名関数を実行した後の戻り値が true ならショートカットキーの操作を実行したことになるので、デフォルトのキー操作を封じる\n if (result === true) {\n event.preventDefault();\n }\n };\n\n // ページ上でキーが押されたときのイベントを登録\n document.addEventListener('keydown', this.shortcut_key_handler);\n },\n\n // キャプチャ関連のイベントを初期化する\n initCaptureManager() {\n\n // キャプチャマネージャーを初期化\n this.capture_manager = new CaptureManager({\n player: this.player,\n captured_callback: (blob: Blob, filename: string) => {\n // キャプチャが撮られたら、随時 Twitter タブのキャプチャリストに追加する\n (this.$refs.Twitter as InstanceType).addCaptureList(blob, filename);\n }\n });\n\n // キャプチャボタンがクリックされたときのイベント\n // ショートカットからのキャプチャでも同じイベントがトリガーされる\n const capture_button = this.$el.querySelector('.dplayer-icon.dplayer-capture-icon');\n capture_button.addEventListener('click', async () => {\n await this.capture_manager.captureAndSave(false);\n });\n\n // コメント付きキャプチャボタンがクリックされたときのイベント\n // ショートカットからのキャプチャでも同じイベントがトリガーされる\n const comment_capture_button = this.$el.querySelector('.dplayer-icon.dplayer-comment-capture-icon');\n comment_capture_button.addEventListener('click', async () => {\n await this.capture_manager.captureAndSave(true);\n });\n },\n\n\n // 再生セッションを破棄する\n // チャンネルを切り替える際に実行される\n async destroy(is_destroy_player = false, is_zapping_continuously = false) {\n\n // ニコニコ実況セッションを破棄し、コメント受信を終了する\n (this.$refs.Comment as InstanceType).destroy();\n\n // clearInterval() ですべての setInterval(), setTimeout() の実行を止める\n // clearInterval() と clearTimeout() は中身共通なので問題ない\n for (const interval_id of this.interval_ids) {\n window.clearInterval(interval_id);\n }\n\n // コントロール表示制御用タイマーを止める\n window.clearTimeout(this.control_interval_id);\n\n // interval_ids をクリア\n this.interval_ids = [];\n\n // データ放送マネージャーを破棄\n // CSS アニメーションの関係上、ローディング状態にする前に破棄する必要がある\n if (this.data_broadcasting_manager !== null) {\n await this.data_broadcasting_manager.destroy();\n this.data_broadcasting_manager = null;\n }\n\n // 再びローディング状態にする\n this.is_loading = true;\n\n // プレイヤーの背景を隠す\n this.is_background_display = false;\n\n // プレイヤーの破棄を許可する\n if (this.player !== null) {\n this.player_can_be_destroyed = true;\n }\n\n // イベントソースを閉じる\n if (this.eventsource !== null) {\n this.eventsource.close();\n this.eventsource = null;\n }\n\n // 映像がフェードアウトするアニメーション (0.2秒) 分待ってから実行\n // この 0.2 秒の間に音量をフェードアウトさせる\n // なお、ザッピングでチャンネルを連続で切り替えている場合は実行しない (実行しても意味がないため)\n if (is_zapping_continuously === false) {\n const current_volume = this.player.user.get('volume');\n // 20回 (0.01秒おき) に分けて音量を下げる\n for (let i = 0; i < 20; i++) {\n await Utils.sleep(0.01);\n this.player.video.volume = current_volume * (1 - (i + 1) / 20);\n }\n }\n\n // is_destroy_player が true の時は、ここで DPlayer 自体を破棄する\n // false の時は次の initPlayer() が実行されるまで破棄されない\n // 次のプレイヤーの初期化の直前に前のプレイヤーを破棄することで、プレイヤーの HTML が消えることによるちらつきを防ぐ\n if (is_destroy_player === true && this.player !== null) {\n try {\n this.player.destroy();\n } catch (error) {\n // mpegts.js をうまく破棄できない場合\n if (this.player.plugins.mpegts !== undefined) {\n this.player.plugins.mpegts.destroy();\n }\n }\n this.player_can_be_destroyed = false;\n this.player = null;\n }\n }\n }\n});\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Watch.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??clonedRuleSet-41.use[0]!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[3]!../../../node_modules/cache-loader/dist/cjs.js??ruleSet[0].use[0]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./Watch.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Watch.vue?vue&type=template&id=040fbec5&scoped=true&\"\nimport script from \"./Watch.vue?vue&type=script&lang=ts&\"\nexport * from \"./Watch.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Watch.vue?vue&type=style&index=0&id=040fbec5&prod&lang=scss&\"\nimport style1 from \"./Watch.vue?vue&type=style&index=1&id=040fbec5&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"040fbec5\",\n null\n \n)\n\nexport default component.exports","\nimport Vue from 'vue';\nimport VueRouter from 'vue-router';\n\nimport Utils from '@/utils';\nimport Login from '@/views/Login.vue';\nimport NotFound from '@/views/NotFound.vue';\nimport Register from '@/views/Register.vue';\nimport SettingsAccount from '@/views/Settings/Account.vue';\nimport SettingsCaption from '@/views/Settings/Caption.vue';\nimport SettingsCapture from '@/views/Settings/Capture.vue';\nimport SettingsDataBroadcasting from '@/views/Settings/DataBroadcasting.vue';\nimport SettingsGeneral from '@/views/Settings/General.vue';\nimport SettingsIndex from '@/views/Settings/Index.vue';\nimport SettingsJikkyo from '@/views/Settings/Jikkyo.vue';\nimport SettingsServer from '@/views/Settings/Server.vue';\nimport SettingsTwitter from '@/views/Settings/Twitter.vue';\nimport TVHome from '@/views/TV/Home.vue';\nimport TVWatch from '@/views/TV/Watch.vue';\n\nVue.use(VueRouter);\n\nconst router = new VueRouter({\n\n // History API モード\n mode: 'history',\n\n // ルーティングのベース URL\n base: process.env.BASE_URL,\n\n // ルーティング設定\n routes: [\n {\n path: '/',\n redirect: '/tv/',\n },\n {\n path: '/tv/',\n name: 'TV Home',\n component: TVHome,\n },\n {\n path: '/tv/watch/:display_channel_id',\n name: 'TV Watch',\n component: TVWatch,\n },\n {\n path: '/settings/',\n name: 'Settings Index',\n component: SettingsIndex,\n beforeEnter: (to, from, next) => {\n\n // スマホ縦画面・スマホ横画面・タブレット縦画面では設定一覧画面を表示する(画面サイズの関係)\n if (Utils.isSmartphoneVertical() || Utils.isSmartphoneHorizontal() || Utils.isTabletVertical()) {\n next(); // 通常通り遷移\n return;\n }\n\n // それ以外の画面サイズでは全般設定にリダイレクト\n next({path: '/settings/general/'});\n }\n },\n {\n path: '/settings/general',\n name: 'Settings General',\n component: SettingsGeneral,\n },\n {\n path: '/settings/caption',\n name: 'Settings Caption',\n component: SettingsCaption,\n },\n {\n path: '/settings/data-broadcasting',\n name: 'Settings Data Broadcasting',\n component: SettingsDataBroadcasting,\n },\n {\n path: '/settings/capture',\n name: 'Settings Capture',\n component: SettingsCapture,\n },\n {\n path: '/settings/account',\n name: 'Settings Account',\n component: SettingsAccount,\n },\n {\n path: '/settings/jikkyo',\n name: 'Settings Jikkyo',\n component: SettingsJikkyo,\n },\n {\n path: '/settings/twitter',\n name: 'Settings Twitter',\n component: SettingsTwitter,\n },\n {\n path: '/settings/server',\n name: 'Settings Server',\n component: SettingsServer,\n },\n {\n path: '/login/',\n name: 'Login',\n component: Login,\n },\n {\n path: '/register/',\n name: 'Register',\n component: Register,\n },\n {\n path: '*',\n name: 'NotFound',\n component: NotFound,\n },\n ],\n\n // ページ遷移時のスクロールの挙動の設定\n // ref: https://v3.router.vuejs.org/ja/guide/advanced/scroll-behavior.html\n scrollBehavior (to, from, savedPosition) {\n if (savedPosition) {\n // 戻る/進むボタンが押されたときは保存されたスクロール位置を使う\n return savedPosition;\n } else {\n // それ以外は常に先頭にスクロールする\n return {x: 0, y: 0};\n }\n }\n});\n\nexport default router;\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker';\n\nimport Message from '@/message';\nimport Utils from '@/utils';\n\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready() {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n );\n },\n registered() {\n console.log('Service worker has been registered.');\n },\n cached() {\n console.log('Content has been cached for offline use.');\n },\n updatefound() {\n console.log('New content is downloading.');\n },\n updated(registration: ServiceWorkerRegistration) {\n console.log('New content is available; please refresh.');\n Message.show({\n message: 'クライアントが新しいバージョンに更新されました。5秒後にリロードします。',\n timeout: 10000, // リロードするまで表示し続ける\n });\n // PWA (Service Worker) を更新する\n if (registration.waiting === null) {\n return;\n }\n registration.waiting.postMessage({type: 'SKIP_WAITING'});\n registration.waiting.addEventListener('statechange', async (event) => {\n if ((event.target as ServiceWorker).state === 'activated') {\n await Utils.sleep(4); // activated になるまで少し時間がかかるので、1秒減らして4秒待つ\n location.reload(true);\n }\n });\n },\n offline() {\n console.log('No internet connection found. App is running in offline mode.');\n },\n error(error) {\n console.error('Error during service worker registration:', error);\n }\n });\n}\n","\nimport { Icon } from '@iconify/vue2';\nimport { createPinia, PiniaVuePlugin } from 'pinia';\nimport { polyfill as SeamlessScrollPolyfill } from 'seamless-scroll-polyfill';\nimport VTooltip from 'v-tooltip';\nimport Vue from 'vue';\nimport VueVirtualScroller from 'vue-virtual-scroller';\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css';\nimport VuetifyMessageSnackbar from 'vuetify-message-snackbar';\nimport 'v-tooltip/dist/v-tooltip.css';\n\nimport App from '@/App.vue';\nimport VTabItem from '@/components/Vuetify/VTabItem';\nimport VTabs from '@/components/Vuetify/VTabs';\nimport VTabsItems from '@/components/Vuetify/VTabsItems';\nimport vuetify from '@/plugins/vuetify';\nimport router from '@/router';\nimport useSettingsStore, { setLocalStorageSettings } from '@/store/SettingsStore';\nimport '@/service-worker';\nimport Utils from '@/utils';\n\n\n// スムーズスクロール周りの API の polyfill を適用\n// Element.scrollInfoView() のオプション指定を使うために必要\nSeamlessScrollPolyfill();\n\n// Production Tip を非表示にする\nVue.config.productionTip = false;\n\n// 常に Vue.js devtools を有効にする\nVue.config.devtools = true;\n\n// Pinia を使う\n// ref: https://pinia.vuejs.org/cookbook/options-api.html\nVue.use(PiniaVuePlugin);\nconst pinia = createPinia();\n\n// vue-virtual-scroller を使う\nVue.use(VueVirtualScroller);\n\n// vuetify-message-snackbar を使う\n// マイナーな OSS(しかも中国語…)だけど、Snackbar を関数で呼びたかったのでちょうどよかった\n// ref: https://github.com/thinkupp/vuetify-message-snackbar\nVue.use(VuetifyMessageSnackbar, {\n // 画面上に配置しない\n top: false,\n // 画面下に配置する\n bottom: true,\n // デフォルトの背景色\n color: '#433532',\n // ダークテーマを適用する\n dark: true,\n // 影 (Elevation) の設定\n elevation: 8,\n // 2.5秒でタイムアウト\n timeout: 2500,\n // 要素が非表示になった後に DOM から要素を削除する\n autoRemove: true,\n // 閉じるボタンのテキスト\n closeButtonContent: '閉じる',\n // Vuetify のインスタンス\n vuetifyInstance: vuetify,\n});\n\n// VTooltip を使う\n// タッチデバイスでは無効化する\n// ref: https://v-tooltip.netlify.app/guide/config.html#default-values\nconst trigger = Utils.isTouchDevice() ? [] : ['hover', 'focus', 'touch'];\nVTooltip.options.themes.tooltip.showTriggers = trigger;\nVTooltip.options.themes.tooltip.hideTriggers = trigger;\nVTooltip.options.themes.tooltip.delay.show = 0;\nVTooltip.options.offset = [0, 7];\nVue.use(VTooltip);\n\n// Iconify(アイコン)のグローバルコンポーネント\nVue.component('Icon', Icon);\n\n// VTabItem / VTabs / VTabsItems の挙動を改善するグローバルコンポーネント\nVue.component('v-tab-item-fix', VTabItem);\nVue.component('v-tabs-fix', VTabs);\nVue.component('v-tabs-items-fix', VTabsItems);\n\n// Vue を初期化\n(window as any).KonomiTVVueInstance = new Vue({\n pinia,\n router,\n vuetify,\n render: h => h(App),\n}).$mount('#app');\n\n// 設定データをサーバーにアップロード中かどうか\nlet is_uploading_settings = false;\n\n// 設定データの変更を監視する\nconst settings_store = useSettingsStore();\nsettings_store.$subscribe(async () => {\n\n // 設定データをアップロード中の場合は何もしない\n if (is_uploading_settings === true) {\n return;\n }\n\n // 設定データを LocalStorage に保存\n console.log('Client Settings Changed:', settings_store.settings);\n setLocalStorageSettings(settings_store.settings);\n\n // 設定データをサーバーに同期する (ログイン時かつ同期が有効な場合のみ)\n await settings_store.syncClientSettingsToServer();\n\n}, {detached: true});\n\n// ログイン時かつ設定の同期が有効な場合、ページ遷移に関わらず、常に3秒おきにサーバーから設定を取得する\n// 初回のページレンダリングに間に合わないのは想定内(同期の完了を待つこともできるが、それだと表示速度が遅くなるのでしょうがない)\nwindow.setInterval(async () => {\n if (Utils.getAccessToken() !== null && settings_store.settings.sync_settings === true) {\n\n // 設定データをサーバーにアップロード\n is_uploading_settings = true;\n await settings_store.syncClientSettingsFromServer();\n is_uploading_settings = false;\n\n // 設定データを LocalStorage に保存\n setLocalStorageSettings(settings_store.settings);\n }\n}, 3 * 1000); // 3秒おき\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\tid: moduleId,\n\t\tloaded: false,\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// Flag the module as loaded\n\tmodule.loaded = true;\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};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"assets/js/\" + chunkId + \".\" + \"64d0cbac\" + \".js\";\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); }","// 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__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\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\t143: 0\n};\n\n// no chunk on demand loading\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[\"webpackChunkKonomiTV\"] = self[\"webpackChunkKonomiTV\"] || [];\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, [998], function() { return __webpack_require__(32729); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_c","_self","attrs","staticRenderFns","script","component","render","VTabItem","h","props","name","this","computedTransition","on","beforeEnter","onBeforeTransition","afterEnter","onAfterTransition","enterCancelled","onTransitionCancelled","beforeLeave","afterLeave","leaveCancelled","enter","onEnter","genWindowItem","VTabsBar","data","items","methods","register","item","activeItem","internalIndex","push","sort","a","b","index_a","$slots","default","findIndex","element","$vnode","key","index_b","$on","onClick","mandatory","selectedValues","length","updateMandatory","updateItem","indexOf","undefined","updateInternalValue","unregister","constructor","super","options","call","VTabs","genBar","slider","style","height","convertToUnit","activeClass","centerActive","dark","light","optional","mobileBreakpoint","nextIcon","prevIcon","showArrows","value","internalValue","callSlider","change","val","ref","setTextColor","computedColor","setBackgroundColor","backgroundColor","$createElement","genSlider","VTabsItems","updateReverse","oldVal","itemsLength","lastIndex","continuous","Vue","Vuetify","VSnackbar","VBtn","VIcon","theme","themes","primary","secondary","twitter","base","lighten1","lighten2","gray","black","background","lighten3","text","darken1","darken2","darken3","customProperties","Utils","static","localStorage","getItem","access_token","setItem","removeItem","test","navigator","userAgent","blob","filename","blob_url","URL","createObjectURL","link","document","createElement","download","href","click","revokeObjectURL","content","html_escape_table","replace","match","popupSizeWidth","popupSizeHeight","window","screen","posTop","posLeft","width","class_name","activeElement","classList","contains","matchMedia","matches","Math","floor","seconds","Promise","resolve","setTimeout","Date","now","Object","prototype","toString","slice","toLowerCase","escapeHTML","pattern","version","process","api_base_url","location","protocol","host","ChannelUtils","display_channel_id","result","groups","channel_type","toUpperCase","e","jikkyo_force","success","message","KonomiTVVueInstance","$message","info","warning","error","show","axios_instance","axios","interceptors","request","use","config","baseURL","url","startsWith","headers","timeout","Users","user_create_request","response","APIClient","Message","username","password","URLSearchParams","responseType","user_update_request","icon","form_data","FormData","append","useUserStore","defineStore","state","is_logged_in","user","user_icon_url","getters","user_niconico_icon_url","niconico_user_id","user_id_slice","actions","async","console","log","login","silent","logout","fetchUser","settings_store","useSettingsStore","settings","sync_settings","force","catch","AxiosError","status","Error","detail","is_error","NaN","is_success","method","template","user_store","Number","isNaN","Settings","sync_settings_keys","default_settings","pinned_channel_ids","showed_panel_last_time","selected_twitter_account_id","saved_twitter_hashtags","tv_streaming_quality","tv_data_saver_mode","tv_low_latency_mode","panel_display_state","tv_panel_active_tab","tv_channel_selection_requires_alt_key","caption_font","always_border_caption_text","specify_caption_opacity","caption_opacity","tv_show_superimpose","tv_show_data_broadcasting","capture_copy_to_clipboard","capture_save_mode","capture_caption_mode","comment_speed_rate","comment_font_size","close_comment_form_after_sending","muted_comment_keywords","muted_niconico_user_ids","mute_vulgar_comments","mute_abusive_discriminatory_prejudiced_comments","mute_big_size_comments","mute_fixed_comments","mute_colored_comments","mute_consecutive_same_characters_comments","fold_panel_after_sending_tweet","reset_hashtag_when_program_switches","auto_add_watching_channel_hashtag","twitter_active_tab","tweet_hashtag_position","tweet_capture_watermark_position","getLocalStorageSettings","JSON","parse","setLocalStorageSettings","stringify","getNormalizedSettings","new_settings","default_settings_key","keys","file","settings_json","syncClientSettingsToServer","default_settings_modified","getSyncableClientSettings","sync_settings_key","settings_server","settings_server_key","settings_server_value","entries","CommentUtils","color","color_table","position","size","comment_mail","commands","split","command","parsed_color","getCommentColor","parsed_position","getCommentPosition","parsed_size","getCommentSize","comment","user_id","includes","special_command_comments_pattern","mute_vulgar_comments_pattern","mute_abusive_discriminatory_prejudiced_comments_pattern","mute_consecutive_same_characters_comments_pattern","muted_comment_keyword","endsWith","RegExp","annoying_statistical_comments_pattern","Buffer","PlayerUtils","background_count","random","padStart","canPlayType","player","quality","regex","dayjs","isBetween","isSameOrAfter","isSameOrBefore","ProgramUtils","timestamp","date","toISOString","program","mark","pattern1","pattern2","pause_time_start","hour","minute","second","pause_time_end","pause_time_start_23","pause_time_end_23","progress","diff","start_time","duration","is_short","format","end_time","string","format_string_translation_map","getFormatStringTranslationTable","replaceAll","zenkaku_table","hankaku_table","merged_table","i","symbol_zenkaku_table","symbol_hankaku_table","enclosed_characters_table","staticClass","$event","model","callback","expression","_vm","password_showing","directives","rawName","_setup","_v","staticStyle","class","Version","useVersionStore","server_version_info","last_updated_at","client_version","server_version","latest_version","is_client_develop_version","is_server_develop_version","is_update_available","is_version_mismatch","fetchServerVersion","version_info","components","BottomNavigation","computed","mapStores","versionStore","Header","Navigation","is_form_dense","userStore","$router","path","_setupProxy","_m","password_validation","username_validation","$refs","validate","is_admin","overrideServerSettingsFromClient","sync_settings_dialog","preventDefault","settings_username","settings_icon","$$v","settings_password_showing","settings_password","scopedSlots","account_delete_confirm_dialog","SettingsBase","is_loading","settings_username_validation","settings_password_validation","watch","settingsStore","sync_settings_json","server_sync_settings","server_sync_settings_json","syncClientSettingsFromServer","update_type","updateUser","updateUserIcon","deleteUser","$set","resetNVRAMSettings","NVRAM_LOCAL_STORAGE_PREFIX","data_broadcasting_zip_code","data_broadcasting_zip_code_validation","data_broadcasting_prefecture","data_broadcasting_prefectures","created","zip_code_raw","atob","prefecture_raw","prefecture","charCodeAt","new_value","btoa","prefecture_number","parseInt","String","fromCharCode","region_code_number","region_code_raw","isHEVCVideoSupported","import_settings_file","QUALITY_H264","QUALITY_H265","immediate","handler","exportSettings","settings_json_blob","Blob","type","importClientSettings","go","resetClientSettings","comment_mute_settings_modal","muted_comment_keyword_match_type","prop","event","showing","Boolean","required","interval_timer_id","$emit","Niconico","authorization_url","CommentMuteSettings","hash","params","get","authorization_status","authorization_detail","onOAuthCallbackReceived","history","replaceState","popup_window","open","onMessage","closed","close","removeEventListener","addEventListener","twitter_account","loginTwitterAccountWithPasswordForm","twitter_password_auth_dialog","twitter_screen_name","twitter_password_showing","twitter_password","Twitter","twitter_password_auth_request","screen_name","captures","tweet_capture","is_twitter_password_auth_sending","twitter_form","current_twitter_account","twitter_accounts","updated_at","reset","Array","from","channels_type","channels","id","removePinnedChannel","stopPropagation","domProps","_s","IProgramDefault","channel_id","network_id","service_id","event_id","title","description","is_free","genres","video_type","video_codec","video_resolution","primary_audio_type","primary_audio_language","primary_audio_sampling_rate","secondary_audio_type","secondary_audio_language","secondary_audio_sampling_rate","IChannelDefault","transport_stream_id","remocon_id","channel_number","is_subchannel","is_radiochannel","is_watchable","is_display","viewer_count","program_present","program_following","Channels","useChannelsStore","channels_list","GR","BS","CS","CATV","SKY","STARDIGIO","is_channels_list_initial_updated","is_showing_live","channel","getChannelType","previous","current","next","current_channel_index","IProgramError","IChannelError","previous_channel_index","index","next_channel_index","channels_list_with_pinned","Map","set","delete","has","channels_list_with_pinned_for_watch","getChannel","find","getChannelByRemoconID","updateChannel","update","tab","interval_ids","residue_second","getSeconds","channelsStore","setInterval","beforeDestroy","interval_id","clearInterval","addPinnedChannel","splice","isPinnedChannel","controlDisplayTimer","modifiers","backgroundImage","is_panel_display","is_remocon_display","shortcut_key_modal","shortcut_key_column_name","shortcut_key_column","shortcut_keys","_l","key_name","shortcut","getProgramTime","getProgramProgress","is_comment_list_dropdown_display","fn","active","time","isTouchDevice","initialize_failed_message","is_manual_scroll","LiveCommentManager","watch_session","comment_session","vpos_base_timestamp","keep_seat_interval_id","abort_controller","AbortController","on_initial_comments_received","on_comment_received","watch_session_result","initWatchSession","initCommentSession","is_disconnect_message_received","watch_session_info","notice","WebSocket","audience_token","send","signal","code","reconnect","readyState","OPEN","keepIntervalSec","disconnect_reason","reason","vposBaseTime","valueOf","threadId","message_server_url","messageServer","uri","thread_id","your_post_key","yourPostKey","comment_session_info","initial_comments_buffer","initial_comments_received","ping","thread","threadkey","res_from","resultcode","chat","yourpost","parseCommentCommand","mail","isMutedComment","comment_data","no","my_post","buffered_end","video","buffered","end","comment_delay_time","currentTime","paused","danmaku","draw","sendComment","position_table","vpos","round","abort","warn","destroy","initSession","is_auto_scrolling","comment_list","comment_list_element","comment_list_dropdown_top","comment_list_dropdown_comment","live_comment_manager","visibilitychange_listener","resize_observer","mounted","$el","querySelector","is_user_scrolling","onmousedown","x","clientX","getBoundingClientRect","left","clientWidth","onmouseup","on_user_scrolling","is_dragging","ontouchstart","ontouchend","ontouchmove","onwheel","onscroll","scrollTop","offsetHeight","scrollHeight","disconnect","showCommentListDropdown","comment_list_wrapper_rect","comment_list_wrapper","comment_list_dropdown_height","comment_button_rect","currentTarget","top","hideCommentListDropdown","filter","addMutedKeywords","addMutedNiconicoUserIds","addMutedNiconicoUserIDs","smooth","scrollTo","behavior","initReserveObserver","resize_observer_element","on_resize","comment_area_element","video_element_width","video_element_height","clientHeight","letter_box_height","threshold","comment_area_vertical_margin","comment_area_width","comment_area_height","gcd","y","gcd_result","comment_area_height_aspect","transition","setProperty","removeProperty","ResizeObserver","observe","comment_list_buffer","max_comment_count","initial_comments","scrollCommentList","visibilityState","max","comment_list_and_buffer_length","niconico_user_premium","decorateProgramInfo","genre","genre_index","major","middle","getChannelForceType","detail_text","detail_heading","URLtoLink","zoom_capture_modal","capture","clickCapture","target","tweet_hashtag","is_tweet_hashtag_form_focused","updateTweetLetterCount","tweet_text","is_tweet_text_form_focused","is_logged_in_twitter","tweet_letter_count","editing","hashtag","updateSelectedTwitterAccount","draggable","is_virtual_keyboard_display","selected_twitter_account","is_twitter_account_list_display","map","is_hashtag_list_display","zoom_capture","captures_element","tweet_captures","is_tweet_sending","some","twitter_account_index","formatHashtag","image_url","deep","pasteClipboardData","clipboardData","clipboard_item","getAsFile","addCaptureList","clickHashtagListButton","clickHashtag","clickAccountButton","fullscreenElement","exitFullscreen","selected","shift","focused","$nextTick","image_bitmap","createImageBitmap","canvas","OffscreenCanvas","context","getContext","alpha","desynchronized","willReadFrequently","drawImage","font","fillStyle","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textAlign","textBaseline","fillText","convertToBlob","reject","toBlob","getChannelHashtag","channel_name","from_hashtag_list","tweet_hashtag_array","trim","channel_hashtag","join","new_tweet_captures","drawProgramTitleOnCapture","then","blur","Captures","web_font_noto_sans_base64","web_font_open_sans_base64","CaptureManager","player_container","container","captured_callback","insertAdjacentHTML","comment_capture_button","capture_button","web_font_noto_sans_url","web_font_open_sans_url","base64_font_prefix","web_font_noto_sans","web_font_open_sans","with_comments","total_time","channels_store","videoWidth","videoHeight","addHighlight","filename_base","filename_caption","aribb24_caption","plugins","aribb24Caption","aribb24_superimpose","aribb24Superimpose","caption_canvas","getRawCanvas","superimpose_canvas","is_caption_showing","isShowing","isPresent","is_superimpose_showing","caption_text","getTextContent","exif_options","is_caption_composited","is_comment_composited","export_and_save","exportToBlob","setEXIFDataToCapture","capture_normal","capture_caption","promises","canvas_context","comments_image","createCommentsImage","drawComments","filename_real","all","bitmap_canvas","transferFromImageBitmap","removeHighlight","copyBlobToClipboard","convertBlobToPng","add","remove","comments_html","xmlns","svg","createElementNS","setAttribute","foreignObject","appendChild","body","createTextNode","temp","innerHTML","childNodes","image","Image","serialized_svg","XMLSerializer","serializeToString","src","encodeURIComponent","onload","onerror","decode","outerHTML","querySelectorAll","commentsHTMLtoSVGImage","offsetWidth","draw_scale_ratio","draw_height","HTMLCanvasElement","captured_playback_position","json","captured_at","datetime","exif","piexif","TagValues","ImageIFD","XResolution","YResolution","ResolutionUnit","YCbCrPositioning","DateTime","Software","XPComment","ExifIFD","ExifVersion","ComponentsConfiguration","FlashpixVersion","ColorSpace","DateTimeOriginal","DateTimeDigitized","exif_string","dump","blob_string","reader","FileReader","readAsBinaryString","blob_string_new","insert","buffer","Uint8Array","worker","Worker","LivePSIArchivedDataDecoderWorker","Comlink","LiveDataBroadcastingManager","container_element","remocon_button_event_abort_controller","_LiveDataBroadcastingManager_bml_browser","bml_browser_width","bml_browser_height","is_bml_browser_using_numeric_key","is_bml_browser_destroying","is_video_element_moved_to_bml_browser","live_psi_archived_data_decoder","media_element","videoWrapAspect","remocon_element","remocon_data_broadcasting_element","is_data_broadcasting_enabled","initRemoconButtons","videoWrap","insertAdjacentElement","toggleRemoconButtonsEnabled","toggleRemoconButtonsLoading","this_","__classPrivateFieldSet","BMLBrowser","mediaElement","containerElement","storagePrefix","nvramPrefix","broadcasterDatabasePrefix","videoPlaneModeEnabled","fonts","roundGothic","round_gothic","squareGothic","square_gothic","indicator","setUrl","loading","setNetworkingGetStatus","connecting","setNetworkingPostStatus","setReceivingStatus","receiving","setEventName","greg","getReg","Greg","sessionStorage","_","setReg","epg","tune","init","values","router","ip","getConnectionType","isIPConnected","showErrorMessage","__classPrivateFieldGet","resolution","calculateBMLBrowserScaleFactor","moveVideoElementToBMLBrowser","moveVideoElementToDPlayer","usedKeyList","entry","contentRect","api_quality","extractAPIQualityFromDPlayer","api_url","run","is_bml_available","bxmlInfo","eventId","eventName","formatString","startTimeUnixMillis","convertTimestampToISO8601","durationSeconds","emitMessage","buttons","button","arib_key_code","dataset","aribKeyCode","remoconId","processKeyDown","AribKeyCode","processKeyUp","switch_channel_type","switch_channel","enabled","container_width","container_height","scale_factor_width","scale_factor_height","scale_factor","min","magnification","getVideoElement","firstElementChild","HTMLParagraphElement","child","children","display","visibility","HTMLVideoElement","transform","transformOrigin","insertBefore","nextElementSibling","source","PLAYBACK_BUFFER_SEC_LOW_LATENCY","PLAYBACK_BUFFER_SEC","Channel","Comment","Program","Remocon","background_url","is_video_buffering","is_background_display","is_control_display","is_fullscreen","is_ime_composing","is_comment_send_just_did","control_interval_id","is_zapping","is_zapping_continuously","player_can_be_destroyed","is_mpegts_supported","mpegts","is_offline","romsounds_context","romsounds_buffers","eventsource","fullscreen_handler","capture_manager","data_broadcasting_manager","shortcut_key_handler","shortcut_key_pressed_at","shortcut_key_list","left_column","icon_height","shortcuts","right_column","unshift","$route","virtualKeyboard","overlaysContent","ongeometrychange","boundingRect","AudioContext","audio_data","decodeAudioData","beforeRouteUpdate","to","destroy_promise","new_channel","old_channel","twitter_component","old_channel_hashtag","generatePlayerBackgroundURL","initPlayer","initEventHandler","initCaptureManager","initShortcutKeyHandler","audioItem","liveLLHLSForKonomiTV","audioValue","textContent","tran","switchPrimaryAudio","artwork","sizes","mediaSession","metadata","MediaMetadata","artist","setPositionState","playbackRate","setActionHandler","play","pause","is_player_event","is_touch_device","clearTimeout","controller","hide","setting","isShow","playback_buffer_sec","DPlayer","lang","live","liveSyncMinBufferSize","loop","airplay","autoplay","hotkey","screenshot","volume","defaultQuality","qualities","hevc_prefix","speedRate","fontSize","apiBackend","read","pluginOptions","enableWorker","enableMSEWorker","MediaSource","canConstructInDedicatedWorker","enableStashBuffer","liveSync","liveSyncMaxLatency","liveSyncTargetLatency","liveSyncPlaybackRate","aribb24","normalFont","forceStrokeColor","forceBackgroundColor","opacity","drcsReplacement","enableRawCanvas","useStroke","usePUA","PRACallback","resume","buffer_source_node","createBufferSource","gain_node","createGain","connect","destination","gain","start","subtitle","setAutoHide","commentInput","settingOriginPanel","settingOriginPanelHeight","settingBox","clipPath","fullscreen_container","fullScreen","isFullScreen","onfullscreenchange","webkitFullscreenElement","cancel","requestFullscreen","webkitRequestFullscreen","orientation","lock","webkitExitFullscreen","unlock","on_play_or_pause","sync","crossOrigin","error_type","reload","force_play","pause_icon","playButton","mobilePlayButton","recover","on_canplay","oncanplay","oncanplaythrough","get_playback_buffer_sec","current_playback_buffer_sec","current_volume","eventsource_url","EventSource","event_raw","client_count","load","pictureInPictureElement","exitPictureInPicture","requestPictureInPicture","switchVideo","clear","tweet_form_element","tag","tagName","editable","getAttribute","is_repeat","repeat","focus","scrollLeft","ctrlKey","metaKey","shiftKey","altKey","switch_remocon_id","focused_capture_index","focused_capture","focused_capture_element","parentElement","scrollIntoView","block","inline","toggle","pictureInPictureEnabled","pipButton","showDanmaku","showDanmakuToggle","checked","captureAndSave","is_destroy_player","VueRouter","mode","routes","redirect","TVHome","TVWatch","SettingsIndex","SettingsGeneral","SettingsCaption","SettingsDataBroadcasting","SettingsCapture","SettingsAccount","SettingsJikkyo","SettingsTwitter","SettingsServer","Login","Register","NotFound","scrollBehavior","savedPosition","ready","registered","cached","updatefound","updated","registration","waiting","postMessage","offline","SeamlessScrollPolyfill","PiniaVuePlugin","pinia","createPinia","VueVirtualScroller","VuetifyMessageSnackbar","bottom","elevation","autoRemove","closeButtonContent","vuetifyInstance","vuetify","trigger","VTooltip","Icon","App","$mount","is_uploading_settings","$subscribe","detached","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","m","deferred","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","r","n","getter","__esModule","d","definition","o","defineProperty","enumerable","u","chunkId","g","globalThis","Function","obj","hasOwnProperty","Symbol","toStringTag","nmd","paths","p","baseURI","self","installedChunks","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","forEach","bind","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/client/dist/assets/js/chunk-vendors.39539793.js b/client/dist/assets/js/chunk-vendors.58a77b3b.js similarity index 83% rename from client/dist/assets/js/chunk-vendors.39539793.js rename to client/dist/assets/js/chunk-vendors.58a77b3b.js index 5d0fe1e1..0021b381 100644 --- a/client/dist/assets/js/chunk-vendors.39539793.js +++ b/client/dist/assets/js/chunk-vendors.58a77b3b.js @@ -9,8 +9,8 @@ return new i(t,"base64").toString("binary")}:"object"===typeof e.base64js?functi * @author Feross Aboukhadijeh * @license MIT */ -const i=n(79742),r=n(80645),s="function"===typeof Symbol&&"function"===typeof Symbol["for"]?Symbol["for"]("nodejs.util.inspect.custom"):null;e.Buffer=c,e.INSPECT_MAX_BYTES=50;const o=2147483647;function a(){try{const t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}function l(t){if(t>o)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,c.prototype),e}function c(t,e,n){if("number"===typeof t){if("string"===typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return p(t)}return u(t,e,n)}function u(t,e,n){if("string"===typeof t)return f(t,e);if(ArrayBuffer.isView(t))return g(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(ot(t,ArrayBuffer)||t&&ot(t.buffer,ArrayBuffer))return v(t,e,n);if("undefined"!==typeof SharedArrayBuffer&&(ot(t,SharedArrayBuffer)||t&&ot(t.buffer,SharedArrayBuffer)))return v(t,e,n);if("number"===typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const i=t.valueOf&&t.valueOf();if(null!=i&&i!==t)return c.from(i,e,n);const r=A(t);if(r)return r;if("undefined"!==typeof Symbol&&null!=Symbol.toPrimitive&&"function"===typeof t[Symbol.toPrimitive])return c.from(t[Symbol.toPrimitive]("string"),e,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function d(t){if("number"!==typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function h(t,e,n){return d(t),t<=0?l(t):void 0!==e?"string"===typeof n?l(t).fill(e,n):l(t).fill(e):l(t)}function p(t){return d(t),l(t<0?0:0|y(t))}function f(t,e){if("string"===typeof e&&""!==e||(e="utf8"),!c.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const n=0|w(t,e);let i=l(n);const r=i.write(t,e);return r!==n&&(i=i.slice(0,r)),i}function m(t){const e=t.length<0?0:0|y(t.length),n=l(e);for(let i=0;i=o)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o.toString(16)+" bytes");return 0|t}function b(t){return+t!=t&&(t=0),c.alloc(+t)}function w(t,e){if(c.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||ot(t,ArrayBuffer))return t.byteLength;if("string"!==typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const n=t.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===n)return 0;let r=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return et(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return rt(t).length;default:if(r)return i?-1:et(t).length;e=(""+e).toLowerCase(),r=!0}}function x(t,e,n){let i=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,e>>>=0,n<=e)return"";t||(t="utf8");while(1)switch(t){case"hex":return V(this,e,n);case"utf8":case"utf-8":return P(this,e,n);case"ascii":return D(this,e,n);case"latin1":case"binary":return L(this,e,n);case"base64":return B(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return N(this,e,n);default:if(i)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),i=!0}}function S(t,e,n){const i=t[e];t[e]=t[n],t[n]=i}function C(t,e,n,i,r){if(0===t.length)return-1;if("string"===typeof n?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,at(n)&&(n=r?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(r)return-1;n=t.length-1}else if(n<0){if(!r)return-1;n=0}if("string"===typeof e&&(e=c.from(e,i)),c.isBuffer(e))return 0===e.length?-1:E(t,e,n,i,r);if("number"===typeof e)return e&=255,"function"===typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):E(t,[e],n,i,r);throw new TypeError("val must be string, number or Buffer")}function E(t,e,n,i,r){let s,o=1,a=t.length,l=e.length;if(void 0!==i&&(i=String(i).toLowerCase(),"ucs2"===i||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(t.length<2||e.length<2)return-1;o=2,a/=2,l/=2,n/=2}function c(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(r){let i=-1;for(s=n;sa&&(n=a-l),s=n;s>=0;s--){let n=!0;for(let i=0;ir&&(i=r)):i=r;const s=e.length;let o;for(i>s/2&&(i=s/2),o=0;o239?4:e>223?3:e>191?2:1;if(r+o<=n){let n,i,a,l;switch(o){case 1:e<128&&(s=e);break;case 2:n=t[r+1],128===(192&n)&&(l=(31&e)<<6|63&n,l>127&&(s=l));break;case 3:n=t[r+1],i=t[r+2],128===(192&n)&&128===(192&i)&&(l=(15&e)<<12|(63&n)<<6|63&i,l>2047&&(l<55296||l>57343)&&(s=l));break;case 4:n=t[r+1],i=t[r+2],a=t[r+3],128===(192&n)&&128===(192&i)&&128===(192&a)&&(l=(15&e)<<18|(63&n)<<12|(63&i)<<6|63&a,l>65535&&l<1114112&&(s=l))}}null===s?(s=65533,o=1):s>65535&&(s-=65536,i.push(s>>>10&1023|55296),s=56320|1023&s),i.push(s),r+=o}return M(i)}c.TYPED_ARRAY_SUPPORT=a(),c.TYPED_ARRAY_SUPPORT||"undefined"===typeof console||"function"!==typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(c.prototype,"parent",{enumerable:!0,get:function(){if(c.isBuffer(this))return this.buffer}}),Object.defineProperty(c.prototype,"offset",{enumerable:!0,get:function(){if(c.isBuffer(this))return this.byteOffset}}),c.poolSize=8192,c.from=function(t,e,n){return u(t,e,n)},Object.setPrototypeOf(c.prototype,Uint8Array.prototype),Object.setPrototypeOf(c,Uint8Array),c.alloc=function(t,e,n){return h(t,e,n)},c.allocUnsafe=function(t){return p(t)},c.allocUnsafeSlow=function(t){return p(t)},c.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==c.prototype},c.compare=function(t,e){if(ot(t,Uint8Array)&&(t=c.from(t,t.offset,t.byteLength)),ot(e,Uint8Array)&&(e=c.from(e,e.offset,e.byteLength)),!c.isBuffer(t)||!c.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let n=t.length,i=e.length;for(let r=0,s=Math.min(n,i);ri.length?(c.isBuffer(e)||(e=c.from(e)),e.copy(i,r)):Uint8Array.prototype.set.call(i,e,r);else{if(!c.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(i,r)}r+=e.length}return i},c.byteLength=w,c.prototype._isBuffer=!0,c.prototype.swap16=function(){const t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;en&&(t+=" ... "),""},s&&(c.prototype[s]=c.prototype.inspect),c.prototype.compare=function(t,e,n,i,r){if(ot(t,Uint8Array)&&(t=c.from(t,t.offset,t.byteLength)),!c.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===i&&(i=0),void 0===r&&(r=this.length),e<0||n>t.length||i<0||r>this.length)throw new RangeError("out of range index");if(i>=r&&e>=n)return 0;if(i>=r)return-1;if(e>=n)return 1;if(e>>>=0,n>>>=0,i>>>=0,r>>>=0,this===t)return 0;let s=r-i,o=n-e;const a=Math.min(s,o),l=this.slice(i,r),u=t.slice(e,n);for(let c=0;c>>=0,isFinite(n)?(n>>>=0,void 0===i&&(i="utf8")):(i=n,n=void 0)}const r=this.length-e;if((void 0===n||n>r)&&(n=r),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let s=!1;for(;;)switch(i){case"hex":return k(this,t,e,n);case"utf8":case"utf-8":return T(this,t,e,n);case"ascii":case"latin1":case"binary":return I(this,t,e,n);case"base64":return _(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,e,n);default:if(s)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),s=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const R=4096;function M(t){const e=t.length;if(e<=R)return String.fromCharCode.apply(String,t);let n="",i=0;while(ii)&&(n=i);let r="";for(let s=e;sn)throw new RangeError("Trying to access beyond buffer length")}function F(t,e,n,i,r,s){if(!c.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>r||et.length)throw new RangeError("Index out of range")}function U(t,e,n,i,r){K(e,i,r,t,n,7);let s=Number(e&BigInt(4294967295));t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s,s>>=8,t[n++]=s;let o=Number(e>>BigInt(32)&BigInt(4294967295));return t[n++]=o,o>>=8,t[n++]=o,o>>=8,t[n++]=o,o>>=8,t[n++]=o,n}function z(t,e,n,i,r){K(e,i,r,t,n,7);let s=Number(e&BigInt(4294967295));t[n+7]=s,s>>=8,t[n+6]=s,s>>=8,t[n+5]=s,s>>=8,t[n+4]=s;let o=Number(e>>BigInt(32)&BigInt(4294967295));return t[n+3]=o,o>>=8,t[n+2]=o,o>>=8,t[n+1]=o,o>>=8,t[n]=o,n+8}function G(t,e,n,i,r,s){if(n+i>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function H(t,e,n,i,s){return e=+e,n>>>=0,s||G(t,e,n,4,34028234663852886e22,-34028234663852886e22),r.write(t,e,n,i,23,4),n+4}function W(t,e,n,i,s){return e=+e,n>>>=0,s||G(t,e,n,8,17976931348623157e292,-17976931348623157e292),r.write(t,e,n,i,52,8),n+8}c.prototype.slice=function(t,e){const n=this.length;t=~~t,e=void 0===e?n:~~e,t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),e>>=0,e>>>=0,n||j(t,e,this.length);let i=this[t],r=1,s=0;while(++s>>=0,e>>>=0,n||j(t,e,this.length);let i=this[t+--e],r=1;while(e>0&&(r*=256))i+=this[t+--e]*r;return i},c.prototype.readUint8=c.prototype.readUInt8=function(t,e){return t>>>=0,e||j(t,1,this.length),this[t]},c.prototype.readUint16LE=c.prototype.readUInt16LE=function(t,e){return t>>>=0,e||j(t,2,this.length),this[t]|this[t+1]<<8},c.prototype.readUint16BE=c.prototype.readUInt16BE=function(t,e){return t>>>=0,e||j(t,2,this.length),this[t]<<8|this[t+1]},c.prototype.readUint32LE=c.prototype.readUInt32LE=function(t,e){return t>>>=0,e||j(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},c.prototype.readUint32BE=c.prototype.readUInt32BE=function(t,e){return t>>>=0,e||j(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},c.prototype.readBigUInt64LE=ct((function(t){t>>>=0,Q(t,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||X(t,this.length-8);const i=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,r=this[++t]+256*this[++t]+65536*this[++t]+n*2**24;return BigInt(i)+(BigInt(r)<>>=0,Q(t,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||X(t,this.length-8);const i=e*2**24+65536*this[++t]+256*this[++t]+this[++t],r=this[++t]*2**24+65536*this[++t]+256*this[++t]+n;return(BigInt(i)<>>=0,e>>>=0,n||j(t,e,this.length);let i=this[t],r=1,s=0;while(++s=r&&(i-=Math.pow(2,8*e)),i},c.prototype.readIntBE=function(t,e,n){t>>>=0,e>>>=0,n||j(t,e,this.length);let i=e,r=1,s=this[t+--i];while(i>0&&(r*=256))s+=this[t+--i]*r;return r*=128,s>=r&&(s-=Math.pow(2,8*e)),s},c.prototype.readInt8=function(t,e){return t>>>=0,e||j(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},c.prototype.readInt16LE=function(t,e){t>>>=0,e||j(t,2,this.length);const n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt16BE=function(t,e){t>>>=0,e||j(t,2,this.length);const n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},c.prototype.readInt32LE=function(t,e){return t>>>=0,e||j(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},c.prototype.readInt32BE=function(t,e){return t>>>=0,e||j(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},c.prototype.readBigInt64LE=ct((function(t){t>>>=0,Q(t,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||X(t,this.length-8);const i=this[t+4]+256*this[t+5]+65536*this[t+6]+(n<<24);return(BigInt(i)<>>=0,Q(t,"offset");const e=this[t],n=this[t+7];void 0!==e&&void 0!==n||X(t,this.length-8);const i=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(i)<>>=0,e||j(t,4,this.length),r.read(this,t,!0,23,4)},c.prototype.readFloatBE=function(t,e){return t>>>=0,e||j(t,4,this.length),r.read(this,t,!1,23,4)},c.prototype.readDoubleLE=function(t,e){return t>>>=0,e||j(t,8,this.length),r.read(this,t,!0,52,8)},c.prototype.readDoubleBE=function(t,e){return t>>>=0,e||j(t,8,this.length),r.read(this,t,!1,52,8)},c.prototype.writeUintLE=c.prototype.writeUIntLE=function(t,e,n,i){if(t=+t,e>>>=0,n>>>=0,!i){const i=Math.pow(2,8*n)-1;F(this,t,e,n,i,0)}let r=1,s=0;this[e]=255&t;while(++s>>=0,n>>>=0,!i){const i=Math.pow(2,8*n)-1;F(this,t,e,n,i,0)}let r=n-1,s=1;this[e+r]=255&t;while(--r>=0&&(s*=256))this[e+r]=t/s&255;return e+n},c.prototype.writeUint8=c.prototype.writeUInt8=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,1,255,0),this[e]=255&t,e+1},c.prototype.writeUint16LE=c.prototype.writeUInt16LE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},c.prototype.writeUint16BE=c.prototype.writeUInt16BE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},c.prototype.writeUint32LE=c.prototype.writeUInt32LE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},c.prototype.writeUint32BE=c.prototype.writeUInt32BE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},c.prototype.writeBigUInt64LE=ct((function(t,e=0){return U(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),c.prototype.writeBigUInt64BE=ct((function(t,e=0){return z(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),c.prototype.writeIntLE=function(t,e,n,i){if(t=+t,e>>>=0,!i){const i=Math.pow(2,8*n-1);F(this,t,e,n,i-1,-i)}let r=0,s=1,o=0;this[e]=255&t;while(++r>0)-o&255;return e+n},c.prototype.writeIntBE=function(t,e,n,i){if(t=+t,e>>>=0,!i){const i=Math.pow(2,8*n-1);F(this,t,e,n,i-1,-i)}let r=n-1,s=1,o=0;this[e+r]=255&t;while(--r>=0&&(s*=256))t<0&&0===o&&0!==this[e+r+1]&&(o=1),this[e+r]=(t/s>>0)-o&255;return e+n},c.prototype.writeInt8=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},c.prototype.writeInt16LE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},c.prototype.writeInt16BE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},c.prototype.writeInt32LE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},c.prototype.writeInt32BE=function(t,e,n){return t=+t,e>>>=0,n||F(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},c.prototype.writeBigInt64LE=ct((function(t,e=0){return U(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),c.prototype.writeBigInt64BE=ct((function(t,e=0){return z(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),c.prototype.writeFloatLE=function(t,e,n){return H(this,t,e,!0,n)},c.prototype.writeFloatBE=function(t,e,n){return H(this,t,e,!1,n)},c.prototype.writeDoubleLE=function(t,e,n){return W(this,t,e,!0,n)},c.prototype.writeDoubleBE=function(t,e,n){return W(this,t,e,!1,n)},c.prototype.copy=function(t,e,n,i){if(!c.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),i||0===i||(i=this.length),e>=t.length&&(e=t.length),e||(e=0),i>0&&i=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),t.length-e>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"===typeof t)for(r=e;r=i+4;n-=3)e=`_${t.slice(n-3,n)}${e}`;return`${t.slice(0,n)}${e}`}function q(t,e,n){Q(e,"offset"),void 0!==t[e]&&void 0!==t[e+n]||X(e,t.length-(n+1))}function K(t,e,n,i,r,s){if(t>n||t3?0===e||e===BigInt(0)?`>= 0${i} and < 2${i} ** ${8*(s+1)}${i}`:`>= -(2${i} ** ${8*(s+1)-1}${i}) and < 2 ** ${8*(s+1)-1}${i}`:`>= ${e}${i} and <= ${n}${i}`,new J.ERR_OUT_OF_RANGE("value",r,t)}q(i,r,s)}function Q(t,e){if("number"!==typeof t)throw new J.ERR_INVALID_ARG_TYPE(e,"number",t)}function X(t,e,n){if(Math.floor(t)!==t)throw Q(t,n),new J.ERR_OUT_OF_RANGE(n||"offset","an integer",t);if(e<0)throw new J.ERR_BUFFER_OUT_OF_BOUNDS;throw new J.ERR_OUT_OF_RANGE(n||"offset",`>= ${n?1:0} and <= ${e}`,t)}Y("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),Y("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),Y("ERR_OUT_OF_RANGE",(function(t,e,n){let i=`The value of "${t}" is out of range.`,r=n;return Number.isInteger(n)&&Math.abs(n)>2**32?r=Z(String(n)):"bigint"===typeof n&&(r=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(r=Z(r)),r+="n"),i+=` It must be ${e}. Received ${r}`,i}),RangeError);const $=/[^+/0-9A-Za-z-_]/g;function tt(t){if(t=t.split("=")[0],t=t.trim().replace($,""),t.length<2)return"";while(t.length%4!==0)t+="=";return t}function et(t,e){let n;e=e||1/0;const i=t.length;let r=null;const s=[];for(let o=0;o55295&&n<57344){if(!r){if(n>56319){(e-=3)>-1&&s.push(239,191,189);continue}if(o+1===i){(e-=3)>-1&&s.push(239,191,189);continue}r=n;continue}if(n<56320){(e-=3)>-1&&s.push(239,191,189),r=n;continue}n=65536+(r-55296<<10|n-56320)}else r&&(e-=3)>-1&&s.push(239,191,189);if(r=null,n<128){if((e-=1)<0)break;s.push(n)}else if(n<2048){if((e-=2)<0)break;s.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;s.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;s.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return s}function nt(t){const e=[];for(let n=0;n>8,r=n%256,s.push(r),s.push(i)}return s}function rt(t){return i.toByteArray(tt(t))}function st(t,e,n,i){let r;for(r=0;r=e.length||r>=t.length)break;e[r+n]=t[r]}return r}function ot(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function at(t){return t!==t}const lt=function(){const t="0123456789abcdef",e=new Array(256);for(let n=0;n<16;++n){const i=16*n;for(let r=0;r<16;++r)e[i+r]=t[n]+t[r]}return e}();function ct(t){return"undefined"===typeof BigInt?ut:t}function ut(){throw new Error("BigInt not supported")}},10595:function(t,e,n){"use strict";async function i(t){const e=document.createElement("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0);const i=n.getImageData(0,0,t.width,t.height),{width:r,height:s,data:o}=i;for(let a=0;a{e.toBlob((e=>{null!=e?t({blobUrl:URL.createObjectURL(e),width:r,height:s}):n("toBlob failed")}),"image/png")}))}n.d(e,{d:function(){return i}})},22918:function(t,e,n){"use strict";n.d(e,{kN:function(){return Ce},ao:function(){return xe}});n(57658);var i=n(8819);const r={services:{101:{broadcasterId:1},102:{broadcasterId:1},103:{broadcasterId:1},104:{broadcasterId:1},141:{broadcasterId:2},142:{broadcasterId:2},143:{broadcasterId:2},144:{broadcasterId:2},151:{broadcasterId:3},152:{broadcasterId:3},153:{broadcasterId:3},161:{broadcasterId:4},162:{broadcasterId:4},163:{broadcasterId:4},169:{broadcasterId:4},171:{broadcasterId:5},172:{broadcasterId:5},173:{broadcasterId:5},179:{broadcasterId:5},181:{broadcasterId:6},182:{broadcasterId:6},183:{broadcasterId:6},188:{broadcasterId:6},189:{broadcasterId:6},191:{broadcasterId:7},192:{broadcasterId:7},193:{broadcasterId:7},200:{broadcasterId:8},201:{broadcasterId:8},202:{broadcasterId:8},211:{broadcasterId:20},222:{broadcasterId:10},231:{broadcasterId:9},232:{broadcasterId:9},234:{broadcasterId:11},236:{broadcasterId:12},241:{broadcasterId:16},242:{broadcasterId:17},243:{broadcasterId:17},244:{broadcasterId:17},245:{broadcasterId:17},251:{broadcasterId:22},252:{broadcasterId:19},255:{broadcasterId:23},256:{broadcasterId:18},260:{broadcasterId:26},263:{broadcasterId:25},265:{broadcasterId:24},531:{broadcasterId:9},700:{broadcasterId:1},701:{broadcasterId:1},707:{broadcasterId:1},744:{broadcasterId:2},745:{broadcasterId:2},746:{broadcasterId:2},753:{broadcasterId:3},755:{broadcasterId:3},756:{broadcasterId:3},757:{broadcasterId:3},766:{broadcasterId:4},768:{broadcasterId:4},777:{broadcasterId:5},778:{broadcasterId:5},780:{broadcasterId:6},781:{broadcasterId:6},791:{broadcasterId:7},792:{broadcasterId:7},800:{broadcasterId:8},840:{broadcasterId:16},841:{broadcasterId:16},929:{broadcasterId:15}},lastUpdated:1647611239938},s={services:{1:{broadcasterId:4},55:{broadcasterId:8},101:{broadcasterId:4},218:{broadcasterId:22},219:{broadcasterId:21},296:{broadcasterId:17},298:{broadcasterId:11},299:{broadcasterId:11},317:{broadcasterId:4},318:{broadcasterId:16},339:{broadcasterId:11},349:{broadcasterId:8},800:{broadcasterId:4},801:{broadcasterId:4}},lastUpdated:16476957e5},o={services:{100:{broadcasterId:4},161:{broadcasterId:17},223:{broadcasterId:18},227:{broadcasterId:2},240:{broadcasterId:13},250:{broadcasterId:3},254:{broadcasterId:1},257:{broadcasterId:18},262:{broadcasterId:13},290:{broadcasterId:14},292:{broadcasterId:9},293:{broadcasterId:2},294:{broadcasterId:5},295:{broadcasterId:18},297:{broadcasterId:17},300:{broadcasterId:18},301:{broadcasterId:6},305:{broadcasterId:13},307:{broadcasterId:16},308:{broadcasterId:16},309:{broadcasterId:16},310:{broadcasterId:2},311:{broadcasterId:7},312:{broadcasterId:4},314:{broadcasterId:13},316:{broadcasterId:18},321:{broadcasterId:18},322:{broadcasterId:16},323:{broadcasterId:11},324:{broadcasterId:11},325:{broadcasterId:15},329:{broadcasterId:5},330:{broadcasterId:19},331:{broadcasterId:4},333:{broadcasterId:13},340:{broadcasterId:16},341:{broadcasterId:16},342:{broadcasterId:13},343:{broadcasterId:4},351:{broadcasterId:17},353:{broadcasterId:11},354:{broadcasterId:11},363:{broadcasterId:20}},lastUpdated:1647610100264},a=(0,i.by)("broadcaster-database");function l(t,e){if(t.terrestrialBroadcasterId!=e.terrestrialBroadcasterId)return!1;const n=Object.entries(t.services),i=Object.entries(e.services);return n.length===i.length&&JSON.stringify(n.sort((([t],[e])=>Number.parseInt(t)-Number.parseInt(e))))===JSON.stringify(i.sort((([t],[e])=>Number.parseInt(t)-Number.parseInt(e))))}function c(t,e){return null!=t&&(t.length===e.length&&t.every((t=>-1!==e.indexOf(t))))}class u{constructor(t,e){this.broadcastersPrefix="broadcasters_",this.affiliationsPrefix="affiliations_",this.broadcasters=new Map,this.affiliations=new Map,this.localStorageBroadcasters=new Map,this.localStorageAffiliations=new Map,this.resources=t,this.prefix=e??"",this.broadcastersPrefix=this.prefix+"broadcasters_",this.affiliationsPrefix=this.prefix+"affiliations_"}getBroadcasterId(t,e){if(null==t||null==e)return null;const n=this.broadcasters.get(t);if(null==n)return null;const i=n.services[e];return i?.broadcasterId}getAffiliationIdList(t,e){if(null==t)return null;const n=e??255;return this.affiliations.get(`${t}.${n}`)?.affiliations??null}seedDatabase(){localStorage.getItem(this.broadcastersPrefix+"4")||localStorage.setItem(this.broadcastersPrefix+"4",JSON.stringify(r)),localStorage.getItem(this.broadcastersPrefix+"6")||localStorage.setItem(this.broadcastersPrefix+"6",JSON.stringify(s)),localStorage.getItem(this.broadcastersPrefix+"7")||localStorage.setItem(this.broadcastersPrefix+"7",JSON.stringify(o)),localStorage.getItem(this.affiliationsPrefix+"4.1")||localStorage.setItem(this.affiliationsPrefix+"4.1",'{"affiliations":[0,1],"lastUpdated":1647613392353}')}loadDatabase(){for(let t=0;t[Number(t),e]))),lastUpdated:i.lastUpdated})}if(e?.startsWith(this.affiliationsPrefix)){const t=e.substring(this.affiliationsPrefix.length),n=localStorage.getItem(e);if(null==n)continue;const i=JSON.parse(n);this.localStorageAffiliations.set(t,i)}}this.broadcasters=new Map(this.localStorageBroadcasters.entries()),this.affiliations=new Map(this.localStorageAffiliations.entries())}openDatabase(){this.seedDatabase(),this.loadDatabase()}onMessage(t){if("bit"===t.type){const e=this.resources.currentTimeUnixMillis;for(const s of t.broadcasters)if(255!==s.broadcasterId);else{const n=`${t.originalNetworkId}.${s.broadcasterId}`,i={affiliations:s.affiliations,lastUpdated:e??(new Date).getTime()};if(this.affiliations.set(n,i),null!=e){const t=this.localStorageAffiliations.get(n);null!=t&&c(t.affiliations,i.affiliations)||(this.localStorageAffiliations.set(n,i),(null==t||t.lastUpdatednull!=t.terrestrialBroadcasterId));i.length>1&&a(i);const r={services:Object.fromEntries(t.broadcasters.flatMap((t=>t.services.map((e=>[`${e.serviceId}`,{broadcasterId:t.broadcasterId}]))))),terrestrialBroadcasterId:i[0]?.terrestrialBroadcasterId,lastUpdated:e??(new Date).getTime()};if(this.broadcasters.set(t.originalNetworkId,r),null!=e){const i=this.localStorageBroadcasters.get(t.originalNetworkId);null!=i&&l(r,i)||(this.localStorageBroadcasters.set(t.originalNetworkId,r),(null==i||i.lastUpdated>3]&1<<7-(7&t)?1:0,t++;return i}class A{constructor(){this.buffer=p.Buffer.alloc(4096),this.offset=0,this.size=0}get position(){return this.offset}seek(t){const e=this.offset;return this.offset=t,e}extend(t){const e=this.buffer;this.buffer=p.Buffer.alloc(Math.max(t+this.offset,2*this.buffer.length)),e.copy(this.buffer)}writeUInt8(t){return this.offset>=this.buffer.byteLength&&this.extend(1),this.buffer.writeUInt8(t,this.offset),this.offset+=1,this.size=Math.max(this.offset,this.size),this.offset-1}writeUInt16BE(t){return this.offset+2>=this.buffer.byteLength&&this.extend(2),this.buffer.writeUInt16BE(t,this.offset),this.offset+=2,this.size=Math.max(this.offset,this.size),this.offset-2}writeUInt24BE(t){return this.offset+3>=this.buffer.byteLength&&this.extend(3),this.buffer.writeUInt8(t>>8&255,this.offset),this.buffer.writeUInt16BE(65535&t,this.offset),this.offset+=3,this.size=Math.max(this.offset,this.size),this.offset-3}writeUInt32BE(t){return this.offset+4>=this.buffer.byteLength&&this.extend(4),this.buffer.writeUInt32BE(t,this.offset),this.offset+=4,this.size=Math.max(this.offset,this.size),this.offset-4}writeInt8(t){return this.offset+1>=this.buffer.byteLength&&this.extend(1),this.buffer.writeInt8(t,this.offset),this.offset+=1,this.size=Math.max(this.offset,this.size),this.offset-1}writeInt16BE(t){return this.offset+2>=this.buffer.byteLength&&this.extend(2),this.buffer.writeInt16BE(t,this.offset),this.offset+=2,this.size=Math.max(this.offset,this.size),this.offset-2}writeInt32BE(t){return this.offset+4>=this.buffer.byteLength&&this.extend(4),this.buffer.writeInt32BE(t,this.offset),this.offset+=4,this.size=Math.max(this.offset,this.size),this.offset-4}writeInt64BE(t){return this.offset+8>=this.buffer.byteLength&&this.extend(8),this.buffer.writeBigInt64BE(BigInt(t),this.offset),this.offset+=8,this.size=Math.max(this.offset,this.size),this.offset-8}writeASCII(t){return this.offset+t.length>=this.buffer.byteLength&&this.extend(t.length),this.buffer.write(t,this.offset,"ascii"),this.offset+=t.length,this.size=Math.max(this.offset,this.size),this.offset-t.length}writeBuffer(t){return this.offset+t.length>=this.buffer.byteLength&&this.extend(t.length),t.copy(this.buffer,this.offset),this.offset+=t.length,this.size=Math.max(this.offset,this.size),this.offset-t.length}getBuffer(){return this.buffer.subarray(0,this.size)}subarray(t,e){return null==e&&(e=this.size),this.buffer.subarray(t,e)}}function y(t){let e=0,n=0;for(;n+3t.namee.name?1:0));const n=new A;n.writeUInt32BE(65536);const i=e.length;n.writeUInt16BE(i);const r=16*Math.pow(2,Math.floor(Math.log2(i)));n.writeUInt16BE(r);const s=Math.floor(Math.log2(i));n.writeUInt16BE(s),n.writeUInt16BE(16*i-r);for(const c of e)c.headerOffset=n.writeASCII(c.name),n.writeUInt32BE(1234),n.writeUInt32BE(0),n.writeUInt32BE(0);let o=-1;for(const c of e){const e=n.position;"head"===c.name&&(o=e),c.writer(t,n);const i=n.position-e;while(3&n.position)n.writeUInt8(0);const r=y(n.subarray(e,n.position));let s=n.seek(c.headerOffset+4);n.writeInt32BE(r),n.writeUInt32BE(e),n.writeUInt32BE(i),n.seek(s)}const a=2981146554-y(n.getBuffer())|0;n.seek(o+8),n.writeInt32BE(a);const l=t.map((t=>w(t.ku,t.ten)));return{ttf:n.getBuffer(),unicodeCharacters:l}}function w(t,e){const n=f.I[94*(t-1)+e-1];return"number"===typeof n?n:0}function x(t,e){let n=e.writeUInt16BE(0);e.writeUInt16BE(1),e.writeUInt16BE(0),e.writeUInt16BE(3),e.writeInt32BE(e.position+4-n);const i=e.writeUInt16BE(4),r=e.writeUInt16BE(0);e.writeUInt16BE(0);const s=t.length+1;e.writeUInt16BE(2*s);const o=2*Math.pow(2,Math.floor(Math.log2(s)));e.writeUInt16BE(o);const a=Math.log2(o/2);e.writeUInt16BE(a),e.writeUInt16BE(2*s-o);for(let c=0;ct.glyphIndex===n))?.glyph;if(i)return i;const r=t[n-1].glyphs;if(1===r.length)return r[0];const s=r.map((t=>({score:t.width*t.height-e.width*e.height,bitmap:t})));s.sort(((t,e)=>t.score-e.score));const o=s.find((t=>t.score>=0));return o?o.bitmap:s[s.length-1]?.bitmap}function R(t,e){e.writeUInt16BE(3),e.writeUInt16BE(0);const n=O(t);for(const i of n)for(let n=1;n<=t.length;n++){const r=P(t,i,n);e.writeUInt8(i.height),e.writeUInt8(i.width),e.writeUInt8(0),e.writeUInt8(i.height+Math.round(123*-i.width/1024)),e.writeUInt8(i.width);for(let t=0;te.width*e.height-t.width*t.height))[0],r=L(n);let o=`\n\n\n\n\n\n\n`;i.push({glyphId:s,offset:e.writeASCII(o),size:o.length})}const r=e.seek(n+2);for(const s of i)e.writeUInt16BE(s.glyphId),e.writeUInt16BE(s.glyphId),e.writeUInt32BE(s.offset-n),e.writeUInt32BE(s.size);e.seek(r)}function N(t,e){let n=0;const i=t.readUInt8(n);n+=1;const r=[];for(let s=0;s>4,s=15&i;if(0!==s&&1!==s)throw new Error("geometric is not operated");{const i=t.readUInt8(n);n+=1;const s=t.readUInt8(n);n+=1;const o=t.readUInt8(n);n+=1;const l=Math.ceil(Math.log2(i+2));let c=8*n;const u=new Array(s*o);null!=e&&r!==e||a.glyphs.push({width:s,height:o,depth:i+2,bitmap:u});for(let e=0;e>3}}0!==a.glyphs.length&&r.push(a)}return r}(function(t){t[t["RoundGothic"]=1]="RoundGothic",t[t["SquareGothic"]=2]="SquareGothic",t[t["BoldRoundGothic"]=3]="BoldRoundGothic"})(d||(d={}));const j=["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"];var F=n(48764)["Buffer"];function U(t,e,n){const i=t.context.createBuffer(1,e.length,n);i.copyToChannel(e,0);const r=t.context.createBufferSource();r.buffer=i,r.connect(t),r.start(0)}const z=new Map;function G(t,e){let n=z.get(t);if(null==n){const i=j[t];if(null!=i){const n=F.from(i,"base64").buffer;e.context.decodeAudioData(n).then((n=>{const i={buffer:n.getChannelData(0),sampleRate:n.sampleRate};z.set(t,i),U(e,i.buffer,i.sampleRate)}))}null!=n&&z.set(t,n)}null==n||U(e,n.buffer,n.sampleRate)}var H=n(60774),W=n(10329);const J=(0,i.gN)("browser"),Y=(0,i.Bd)("browser"),Z=(0,i.x7)("browser"),q=(0,i.by)("browser"),K=new Map([["Class.BinaryTable",1],["Class.CSVTable",0],["Class.XMLDoc",0],["EPG.Basic",1],["EPG.Basic2",0],["EPG.Ext",0],["EPG.Group",0],["EPG.Series",0],["CC.Stream",0],["CC.Control",0],["Persistent.Ext",0],["Persistent.Basic",1],["Persistent.MediaSupport",1],["Storage.Dir.Dest",0],["Storage.Dir",0],["Storage.Dir.Ext",0],["Storage.File.Dest",0],["Storage.File",0],["Storage.File.Ext",0],["Storage.IO",0],["Storage.Basic",0],["Storage.Carousel",0],["Storage.Module",0],["Storage.Carousel.Ext",0],["Storage.Module.Ext",0],["Storage.Resource.Ext",0],["Storage.Resource",0],["Com.BASIC.Basic",0],["Com.BASIC.Ext",0],["Com.BASIC.Delay",0],["Com.BASIC.Delayed",0],["Com.BASIC.Vote",0],["Com.BASIC.CAS",0],["Com.BASIC.Enc",0],["Com.IP.Params",0],["Com.IP.Connect",0],["Com.IP.Connect.Ext",0],["Com.IP.GetType",1],["Com.IP",1],["Com.IP.Http.Ext",0],["Com.IP.Http",0],["Com.IP.Ftp.Ext",0],["Com.IP.Ftp",0],["Com.IP.Sendmail",0],["Com.IP.Transmit",1],["Com.IP.Delayed",0],["Com.IP.SetCache",0],["Com.IP.confirmIP",1],["Com.Common.Delayed",0],["Com.Line.Prefix",0],["Com.Certificate",0],["Ctrl.Basic",1],["Ctrl.NPT",1],["Ctrl.Time",1],["Ctrl.Exec",0],["Ctrl.Cache",1],["Ctrl.Link",0],["Ctrl.PgmHyperlink",0],["Ctrl.Version",1],["Ctrl.Screen",1],["Ctrl.Com",0],["Ctrl.Quit",0],["Ctrl.ExtApp",0],["Ctrl.Cache.Ext",0],["Ctrl.Media",0],["Ctrl.Basic2",1],["Ctrl.Cache2",1],["Ctrl.MobileDisplay",0],["Ctrl.AppVersion",1],["Ctrl.startResidentApp",0],["Ctrl.startExtraBrowser",0],["Misc.SmartDevice.transmitData",0],["RomSound.Basic",1],["Timer.Basic",1],["Timer.Ext",0],["Timer.DateMode",1],["Misc.DRCS",1],["Misc.DRCS.unload",0],["Misc.Peripheral",0],["Misc.Peripheral.pass",0],["Misc.Peripheral.Array",0],["Bookmark.Basic",0],["Bookmark.Extended",0],["Bookmark.Resident",0],["Misc.Basic",1],["Misc.Ureg",1],["Misc.Greg",1],["Print.Basic",0],["Print.MemoryCard",0],["Iptv.Vod",0],["Iptv.Download",0],["AITControlledApp.Start",0],["Bookmark.Basic2",0],["Ctrl.Status",1],["Storage.Source",0]]),Q=new Map([["JapaneseInput",0],["netTVBrowser",0],["IPTVBMLBrowser",0],["VOD",0],["Download",0],["webBrowserMode1",0],["webBrowserMode2",0],["HTMLBrowser",0],["ReservedTransmission",0],["MailClient",0],["Bookmark",0]]),X=new Map([["datalink",new Map([["PPP.modem",0]])],["application",new Map([["HTTP",new Map([[void 0,1],["1.0",1],["1.1",1]])],["FTP",0],["TLS",new Map([[void 0,1],["1.0",1],["1.1",1],["1.2",1],["1.3",1]])],["physical",new Map([["basic",0]])]])]]),$=new Map([["netTVVOD",0],["netTVDownload",0],["IPTVBMLVOD",0],["IPTVBMLDownload",0]]),tt=new Map([["Misc.Unlink",1],["Com.BASIC.Basic",1],["Com.BASIC.Vote",0]]),et=new Map([["0x0005",1],["0x000D",0]]),nt=new Map([["VOD",new Map([["HTTP",0],["RTSP",0]])]]),it=new Map([["0xF001",0]]),rt=new Map([["SmartDeviceMode1",0],["SmartDeviceMode2",0]]),st=new Map([["IPTV-F",new Map([["HTML5_ph0",0],["HTML5_ph1",0]])]]),ot=new Map([["XML",new Map([["HTTP",0]])]]),at=new Map([["XML",new Map([["HTTP",0]])],["Section",new Map([["DataCarousel",0]])]]),lt=new Map([["BSspecifiedExtension",new Map([["48",1]])],["NumberOfBSBroadcasters",new Map([["23",1]])],["NumberOfCSBroadcasters",new Map([["23",1]])]]),ct=new Map([["Shift-JIS",0],["UTF-8",0],["UTF-16",0],["EUC-JP",1],["JIS8TEXT",0]]),ut=new Map([["1920x1080",1],["1280x720",1],["960x540",1],["720x480",1]]),dt=new Map([["APIGroup",K],["ResidentApp",Q],["TransmissionProtocol",X],["ExtraBrowserFunction",$],["Unsupported",tt],["CASystem",et],["IPTVFunction",nt],["IRDID",it],["SmartDeviceProfile",rt],["AITControlledAppEngineFunction",st],["AITTransferMethod",ot],["AITTransportMethod",at],["nvram",lt],["ResidentBookmark",0],["BookmarkButton",0],["KanaInput",1],["CharacterEncoding",ct],["OSDResolution",ut]]),ht=new Map([["Misc.Basic",1],["EPG.Basic",1],["EPG.Ext",0],["Persistent.Basic",1],["Com.IP.GetType ",1],["Com.IP",1],["Com.IP.Transmit",1],["Ctrl.Basic",1],["Ctrl.RAVersion",1],["Ctrl.MobileDisplay",0],["RomSound.Basic",1],["Timer.Basic",1],["Timer.DateMode",1],["Storage.Ext",0],["Print.MemoryCard1",0],["Print.MemoryCard2",0],["Xdpa.mailTo",0],["Xdpa.RAStart",1],["Xdpa.phoneTo",0],["Xdpa.RcvCond",0],["Xdpa.CurPos",0],["Xdpa.saveExApp",0],["Xdpa.startExAv",0],["Xdpa.stopExAv",0],["Xdpa.tuneRF",0],["Xdpa.SchInfo",0],["Xdpa.ComBrowserUA",1],["Xdpa.AddressBook",0],["Xdpa.launchWithL",1],["Xdpa.chkAV",0],["Xdpa.getIRDID",1],["Xdpa.CproBM",0]]),pt=new Map([["ComBrowser",0],["Bookmark",0],["JapaneseInput",0]]),ft=new Map([["BMtype02",0],["BMtype03",0],["BMtype04",0]]),mt=new Map([["240x480",1]]),gt=new Map([["application",new Map([["HTTP",new Map([[void 0,1],["1.0",1],["1.1",1]])],["TLS",new Map([[void 0,1],["1.0",1],["1.1",1],["1.2",1],["1.3",1]])]])]]),vt=new Map([["APIGroup",ht],["ResidentApp",pt],["WriteCproBM",ft],["OSDResolution",mt],["TransmissionProtocol",gt],["BookmarkButton",0]]),At=new Map([["APIGroup",new Map([["Persistent.Media.Support.Ext",0]])]]);class yt{constructor(t,e,n,i,r,s,o,a,l,c,u,d){this.asyncBrowser={loadDRCS:async t=>{J("loadDRCS",t);const e=this.resources.fetchLockedResource(t)??await this.resources.fetchResourceAsync(t);if(null==e?.data)return NaN;for(const[n,i]of[[1,"丸ゴシック"],[2,"角ゴシック"],[3,"太丸ゴシック"]]){const t=N(p.Buffer.from(e.data),n),{ttf:r,unicodeCharacters:s}=b(t);0!==s.length&&this.content.addDRCSFont(new FontFace(i,r,{unicodeRange:s.map((t=>"U+"+t.toString(16))).join(",")}))}return 1},transmitTextDataOverIP:async(t,e,n)=>{if(Y(`transmitTextDataOverIP(${t}, ${e}, ${n})`),null==this.ip.transmitTextDataOverIP)return[NaN,"",""];function i(t){let e="";for(const n of t){const t=String.fromCharCode(n);t>="A"&&t<="Z"||t>="a"&&t<="z"||t>="0"&&t<="9"||-1!=="-_.!~*'()".indexOf(t)?e+=t:(e+="%",e+=n.toString(16).padStart(2,"0"))}return e}if("EUC-JP"===n){this.indicator?.setNetworkingPostStatus(!0);const{resultCode:n,statusCode:r,response:s}=await this.ip.transmitTextDataOverIP(t,(new TextEncoder).encode("Denbun="+i((0,H.rh)(e))));return this.indicator?.setNetworkingPostStatus(!1),[n,r,(0,H.OZ)(s)]}if("Shift_JIS"===n){this.indicator?.setNetworkingPostStatus(!0);const{resultCode:n,statusCode:r,response:s}=await this.ip.transmitTextDataOverIP(t,(new TextEncoder).encode("Denbun="+i((0,W.Vl)(e))));return this.indicator?.setNetworkingPostStatus(!1),[n,r,(0,W.td)(s)]}return[NaN,"",""]},confirmIPNetwork:async(t,e,n)=>{if(Y(`confirmIPNetwork(${t}, ${e}, ${n})`),null==this.ip.confirmIPNetwork)return null;const i=await this.ip.confirmIPNetwork(t,1===Number(e),Number(n??4e3));return null==i?null:[i.success,i.ipAddress,i.responseTimeMillis]},sleep:async t=>new Promise((e=>{J("SLEEP ",t),setTimeout((()=>{J("END SLEEP ",t),e(1)}),t)})),unlockScreen:async()=>new Promise((t=>{requestAnimationFrame((()=>{t(1)}))})),X_CSP_setAccessInfoToProviderArea:async(t,e)=>{if("S:1V,U:2B"!==e)return NaN;const n=await this.resources.fetchResourceAsync(t);return null==n?.data?NaN:this.nvram.cspSetAccessInfoToProviderArea(n.data)?1:NaN}},this.browser={Ureg:[...new Array(64)].map((t=>"")),Greg:[...new Array(64)].map((t=>"")),epgGetEventStartTime:t=>{if(t==this.resources.eventURI){J("epgGetEventStartTime",t);const e=this.resources.startTimeUnixMillis;return null==e?null:new Date(e)}return q("epgGetEventStartTime: not implemented",t,this.resources.eventId),null},epgGetEventDuration:t=>t==this.resources.eventURI?(J("epgGetEventDuration",t),this.resources.durationSeconds??NaN):(q("epgGetEventDuration: not implemented",t,this.resources.eventId),NaN),setCurrentDateMode:t=>{if(J("setCurrentDateMode",t),0==t)this.content.currentDateMode=0;else{if(1!=t)return NaN;this.content.currentDateMode=1}return 1},getProgramRelativeTime:()=>{J("getProgramRelativeTime");const t=this.resources.currentTimeUnixMillis,e=this.resources.startTimeUnixMillis;return null==t||null==e?NaN:Math.floor((t-e)/1e3)},subDate(t,e,n){if(null==t||null==e)return NaN;const i=t.getTime()-e.getTime();let r;return r=1==n?Math.trunc(i/1e3):2==n?Math.trunc(i/6e4):3==n?Math.trunc(i/36e5):4==n?Math.trunc(i/864e5):5==n?Math.trunc(i/6048e5):i,r<-2147483648||r>2147483647?NaN:r},addDate(t,e,n){return Number.isNaN(e)?t:0==n?new Date(t.getTime()+e):1==n?new Date(t.getTime()+1e3*e):2==n?new Date(t.getTime()+1e3*e*60):3==n?new Date(t.getTime()+1e3*e*60*60):4==n?new Date(t.getTime()+1e3*e*60*60*24):5==n?new Date(t.getTime()+1e3*e*60*60*24*7):NaN},formatNumber(t){const e=Number(t);return Number.isNaN(e)?null:e.toLocaleString("en-US")},unlockModuleOnMemory:t=>{J("unlockModuleOnMemory",t);const{componentId:e,moduleId:n}=this.resources.parseURLEx(t);return null==e||null==n?NaN:this.resources.unlockModule(e,n,"lockModuleOnMemory")?1:NaN},unlockModuleOnMemoryEx:t=>{J("unlockModuleOnMemoryEx",t);const{componentId:e,moduleId:n}=this.resources.parseURLEx(t);return null==e||null==n?NaN:this.resources.unlockModule(e,n,"lockModuleOnMemoryEx")?1:NaN},unlockAllModulesOnMemory:()=>(J("unlockAllModulesOnMemory"),this.resources.unlockModules(),1),lockModuleOnMemory:t=>{J("lockModuleOnMemory",t);const{componentId:e,moduleId:n}=this.resources.parseURLEx(t);if(null==e||null==n||null==t)return NaN;if("lockModuleOnMemoryEx"===this.resources.getModuleLockedBy(e,n))return NaN;if(!this.resources.getPMTComponent(e))return q("lockModuleOnMemory: component does not exist in PMT",t),-1;if(this.resources.componentExistsInDownloadInfo(e)&&!this.resources.moduleExistsInDownloadInfo(e,n))return q("lockModuleOnMemory: component does not exist in DII",t),-1;const i=this.resources.lockCachedModule(e,n,"lockModuleOnMemory");return i?(this.eventDispatcher.dispatchModuleLockedEvent(t,!1,0),1):(Z("lockModuleOnMemory: module not cached",t),this.resources.fetchResourceAsync(t,"lockModuleOnMemory").then((()=>{const i=this.resources.lockCachedModule(e,n,"lockModuleOnMemory");null!=i&&this.eventDispatcher.dispatchModuleLockedEvent(t,!1,0)})),1)},lockModuleOnMemoryEx:t=>{J("lockModuleOnMemoryEx",t);const{componentId:e,moduleId:n}=this.resources.parseURLEx(t);if(null==e||null==n||null==t)return NaN;if(this.resources.profile!==h.N.TrProfileC&&64!==e&&80!==e&&96!==e)return NaN;if("lockModuleOnMemory"===this.resources.getModuleLockedBy(e,n))return NaN;if(!this.resources.getPMTComponent(e))return q("lockModuleOnMemoryEx: component does not exist in PMT",t),-3;if(this.resources.componentExistsInDownloadInfo(e)&&!this.resources.moduleExistsInDownloadInfo(e,n))return q("lockModuleOnMemoryEx: component does not exist in DII",t),this.eventDispatcher.dispatchModuleLockedEvent(t,!0,-2),1;const i=this.resources.lockCachedModule(e,n,"lockModuleOnMemoryEx");if(!i){const i=this.resources.getDownloadComponentInfo(e)?.dataEventId;return Z("lockModuleOnMemoryEx: module not cached",t),this.resources.fetchResourceAsync(t,"lockModuleOnMemoryEx").then((()=>{if(null!=i){const n=this.resources.getDownloadComponentInfo(e)?.dataEventId;if(null!=n&&n!==i)return void this.eventDispatcher.dispatchModuleLockedEvent(t,!0,-1)}const r=this.resources.lockCachedModule(e,n,"lockModuleOnMemoryEx");this.eventDispatcher.dispatchModuleLockedEvent(t,!0,null==r?-2:0)})),1}return this.eventDispatcher.dispatchModuleLockedEvent(t,!0,0),1},lockScreen(){return J("lockScreen"),1},unlockScreen(){return J("unlockScreen"),1},getBrowserSupport:(t,e,...n)=>{Y(`getBrowserSupport(${t}, ${e}, ${n})`);const i=n[0]??void 0,r=n[1]??void 0,s=n[2]??void 0;if("ARIB"===t){if("BMLversion"===e){if(null==i)return 1;{const[t,e]=i.split(".").map((t=>Number.parseInt(t)));return null==t||null==e?0:t<3&&t>=0||3===t&&0===e?1:0}}if("BXMLversion"===e)return 0;if("MediaDecoder"===e);else{if("Storage"===e&&"cachesize"===i){const t=Number(r);return 1024*t<=10485760?1:0}if("AudioFile"===e){const t=Number(i);return t<=10485760?1:0}if("APIGroup"===e&&"Com.IP.confirmIP"===i)return null!=this.ip.confirmIPNetwork?1:0}const o=dt.get(e);if(null==o)return q("unknown getBrowserSupport functionname",t,e,...n),0;const a=o.get(i);if(null==a)return q("unknown getBrowserSupport additionalinfo",t,e,...n),0;if("number"===typeof a)return a;const l=a.get(r);if(null==l)return q("unknown getBrowserSupport additionalinfo2",t,e,...n),0;if("number"===typeof l)return l;const c=l.get(s);return null==c?(q("unknown getBrowserSupport additionalinfo2",t,e,...n),0):c}if("BPA"===t){const r=At.get(e);if(null==r)return q("unknown getBrowserSupport functionname",t,e,...n),0;const s=r.get(i);return null==s?(q("unknown getBrowserSupport additionalinfo",t,e,...n),0):s}if("DPACpro"===t){if("BMLversion"===e){if(null==i)return 1;{const[t,e]=i.split(".").map((t=>Number.parseInt(t)));return null==t||null==e?0:t<12&&t>=0||12===t&&0===e?1:0}}if("MediaDecoder"===e);else{if("Storage"===e&&"cachesize"===i){const t=Number(r);return 1024*t<=10485760?1:0}if("AudioFile"===e){const t=Number(i);return t<=10485760?1:0}}const o=vt.get(e);if(null==o)return q("unknown getBrowserSupport functionname",t,e,...n),0;const a=o.get(i);if(null==a)return q("unknown getBrowserSupport additionalinfo",t,e,...n),0;if("number"===typeof a)return a;const l=a.get(r);if(null==l)return q("unknown getBrowserSupport additionalinfo2",t,e,...n),0;if("number"===typeof l)return l;const c=l.get(s);return null==c?(q("unknown getBrowserSupport additionalinfo2",t,e,...n),0):c}return q("unknown getBrowserSupport",t,e,...n),0},getBrowserStatus:(t,e,n)=>{if(Y(`getBrowserStatus(${t}, ${e}, ${n})`),("TerrP"===t||"DPA"===t)&&"IRDState"===e){if("Link"===n)return 1;if("UnLink"===n)return 0;if("Broadcast"===n)return this.resources.isInternetContent?0:1}return q("unknown getBrowserStatus",t,e,n),NaN},launchDocument:(t,e)=>{throw Y(`%claunchDocument(${t}, ${e})`,"font-size: 1.5em"),this.content.launchDocument(t),this.interpreter.destroyStack(),new Error("unreachable!!")},reloadActiveDocument:()=>(J("reloadActiveDocument"),this.browser.launchDocument(this.browser.getActiveDocument())),readPersistentArray:(t,e)=>(J("readPersistentArray",t,e),this.nvram.readPersistentArray(t,e)),writePersistentArray:(t,e,n,i)=>(J("writePersistentArray",t,e,n,i),this.nvram.writePersistentArray(t,e,n,i)),checkAccessInfoOfPersistentArray:t=>(J("checkAccessInfoOfPersistentArray",t),this.nvram.checkAccessInfoOfPersistentArray(t)),writePersistentArrayWithAccessCheck:(t,e,n,i)=>(J("writePersistentArrayWithAccessCheck",t,e,n,i),this.nvram.writePersistentArrayWithAccessCheck(t,e,n,i)),readPersistentArrayWithAccessCheck:(t,e)=>(J("readPersistentArrayWithAccessCheck",t,e),this.nvram.readPersistentArrayWithAccessCheck(t,e)),random(t){return Math.floor(Math.random()*t)+1},getActiveDocument:()=>{const t=this.resources.activeDocument;if(null==t)return null;if(t.startsWith("http://")||t.startsWith("https://")){const e=new URL(t);return e.pathname+e.search+e.hash}return t},getResidentAppVersion(t){return J("getResidentAppVersion",t),null},getLockedModuleInfo:()=>{J("getLockedModuleInfo");const t=[];for(const{module:e,isEx:n,requesting:i}of this.resources.getLockedModules())t.push([e,n?2:1,i?2:1]);return t},detectComponent:t=>{const{componentId:e}=this.resources.parseURLEx(t);return null==e?NaN:this.resources.getPMTComponent(e)?(J("detectComponent",e,!0),1):(J("detectComponent",e,!1),0)},getProgramID:t=>{function e(t,e){return null==t?null:"0x"+t.toString(16).padStart(e,"0")}return 1==t?e(this.resources.eventId,4):2==t?e(this.resources.serviceId,4):3==t?e(this.resources.originalNetworkId,4):4==t?e(this.resources.transportStreamId,4):6==t?this.resources.eventURI:7==t?this.resources.serviceURI:9==t?e(this.resources.networkId,4):(q(`getProgramID(${t})`),null)},playRomSound:t=>{Y(`playRomSound(${t})`);const e=/romsound:\/\/(?\d+)/.exec(t)?.groups;return null!=e&&G(Number.parseInt(e.soundID),this.audioNodeProvider.getAudioDestinationNode()),1},getBrowserVersion(){return["BMLHTML","BMLHTML","001","000"]},getTuningLinkageSource(){return""},getTuningLinkageType(){return-1},getIRDID(t){return Y(`getIRDID(${t})`),null},isIPConnected:()=>{const t=this.ip.isIPConnected?.()??0;return Y(`isIPConnected(${t})`),t},getConnectionType:()=>{const t=this.ip.getConnectionType?.()??403;return Y(`getConnectionType(${t})`),t},setInterval:(t,e,n)=>{const i=this.eventQueue.setInterval((()=>{n--,0===n&&this.eventQueue.clearInterval(i),this.eventQueue.queueAsyncEvent((async()=>await this.eventQueue.executeEventHandler(t))),this.eventQueue.processEventQueue()}),e);return J("setInterval",t,e,n,i),i},clearTimer:t=>(J("clearTimer",t),this.eventQueue.clearInterval(t)?1:NaN),pauseTimer:t=>(J("pauseTimer",t),this.eventQueue.pauseTimer(t)?1:NaN),resumeTimer:t=>(J("resumeTimer",t),this.eventQueue.resumeTimer(t)?1:NaN),getNPT:()=>{const t=Math.floor((this.content.getNPT90kHz()??NaN)/90);return J("getNPT",t),t},X_DPA_getComBrowserUA:()=>[["00",""]],X_DPA_startResidentApp:(t,e,n,...i)=>{if(t=String(t),e=Number(e),n=String(n),i=i.map((t=>String(t))),null!=this.X_DPA_startResidentApp)return this.X_DPA_startResidentApp(t,e,n,i);if("ComBrowser"===t){String(i[0]);return NaN}return NaN},X_DPA_getIRDID:t=>{switch(t){case 1:return null;case 2:return null;case 3:return null}return q("X_DPA_getIRDID: unknown type",t),null},X_DPA_writeCproBM:(t,e,n,i,r)=>(q(`X_DPA_writeCproBM(${t}, ${e}, ${n}, ${i}, ${r})`),NaN),X_DPA_launchDocWithLink:t=>{if(Y(`%cX_DPA_launchDocWithLink(${t})`,"font-size: 1.5em"),this.resources.profile!==h.N.TrProfileC)return NaN;if(!t.startsWith("http://")&&t.startsWith("https://"))return NaN;if(!this.resources.isInternetContent)return this.content.quitDocument(),NaN;throw this.content.launchDocument(t,{withLink:!0}),this.interpreter.destroyStack(),new Error("unreachable!!")}},this.resources=t,this.eventQueue=e,this.eventDispatcher=n,this.content=i,this.nvram=r,this.interpreter=s,this.audioNodeProvider=o,this.ip=a,this.indicator=l,this.ureg=c??{getReg:t=>this.browser.Ureg[t],setReg:(t,e)=>this.browser.Ureg[t]=e},this.greg=u??{getReg:t=>this.browser.Greg[t],setReg:(t,e)=>this.browser.Greg[t]=e},this.X_DPA_startResidentApp=d}getGreg(t){return t>=0&&t=0&&t=0&&t=0&&t(this.setCurrentBeventEvent({type:"ModuleLocked",target:o,status:n,moduleRef:t}),!!await this.eventQueue.executeEventHandler(e)||(this.resetCurrentEvent(),!1)))),this.eventQueue.processEventQueue())}}}dispatchTimerFiredEvent(t,e){if(xt("TimerFired",t),"subscribe"!==e.getAttribute("subscribe"))return;const n=e.getAttribute("onoccur");n&&(this.eventQueue.queueAsyncEvent((async()=>(this.setCurrentBeventEvent({type:"TimerFired",target:e,status:t}),!!await this.eventQueue.executeEventHandler(n)||(this.resetCurrentEvent(),!1)))),this.eventQueue.processEventQueue())}dispatchDataButtonPressedEvent(){St("DataButtonPressed");const t=wt.X.bmlNodeToNode(this.bmlDocument.documentElement).querySelectorAll('beitem[type="DataButtonPressed"]');for(const e of Array.from(t)){if("subscribe"!==e.getAttribute("subscribe"))continue;const t=e.getAttribute("onoccur");t&&(this.eventQueue.queueAsyncEvent((async()=>(this.setCurrentBeventEvent({type:"DataButtonPressed",target:e,status:0}),!!await this.eventQueue.executeEventHandler(t)||(this.resetCurrentEvent(),!1)))),this.eventQueue.processEventQueue())}}dispatchMainAudioStreamChangedEvent(t,e,n,i){St("MainAudioStreamChanged");const r=wt.X.bmlNodeToNode(this.bmlDocument.documentElement).querySelectorAll('beitem[type="MainAudioStreamChanged"]');for(const s of Array.from(r)){if("subscribe"!==s.getAttribute("subscribe"))continue;const r=s.getAttribute("onoccur");if(!r)continue;const o=s.getAttribute("es_ref");let a;if(o){const{componentId:r,channelId:s}=this.resources.parseAudioReference(o);if(null==r)continue;if(null==s&&t===n)continue;const l=r===t&&(e??s)===(e??null);if(a=r===n&&(i??s)===(i??null),!a&&!l)continue}else a=!0;const l=this.resources.isInternetContent?"arib://-1.-1.-1/":"/",c=n.toString(16).padStart(2,"0");let u;u=null!=i?l+c+";"+i:l+c,this.eventQueue.queueAsyncEvent((async()=>(this.setCurrentBeventEvent({type:"MainAudioStreamChanged",target:s,esRef:u,status:a?1:0}),!!await this.eventQueue.executeEventHandler(r)||(this.resetCurrentEvent(),!1)))),this.eventQueue.processEventQueue()}}async dispatchFocus(t){this.setCurrentEvent({type:"focus",target:t.target});const e=t.target.getAttribute("onfocus");return!(!e||!await this.eventQueue.executeEventHandler(e))||(this.resetCurrentEvent(),t.target instanceof HTMLInputElement&&"direct"===t.target.getAttribute("inputmode")&&wt.X.nodeToBMLNode(t.target,this.bmlDocument).internalLaunchInputApplication(),!1)}async dispatchBlur(t){this.setCurrentEvent({type:"blur",target:t.target});const e=t.target.getAttribute("onblur");return!(!e||!await this.eventQueue.executeEventHandler(e))||(this.resetCurrentEvent(),!1)}async dispatchClick(t){this.setCurrentEvent({type:"click",target:t.target});const e=t.target.getAttribute("onclick");return!(!e||!await this.eventQueue.executeEventHandler(e))||(this.resetCurrentEvent(),!1)}async dispatchChange(t){this.setCurrentEvent({type:"change",target:t.target});const e=t.target.getAttribute("onchange");return!(!e||!await this.eventQueue.executeEventHandler(e))||(this.resetCurrentEvent(),!1)}}class Et{constructor(t){this.dispatchFocus=t=>Promise.resolve(!1),this.dispatchBlur=t=>Promise.resolve(!1),this.dispatchClick=t=>Promise.resolve(!1),this.dispatchChange=t=>Promise.resolve(!1),this.timerHandles=new Map,this.asyncEventQueue=[],this.syncEventQueue=[],this.syncEventQueueLockCount=0,this.discarded=!1,this.interpreter=t}async executeEventHandler(t){if(/^\s*$/.exec(t))return!1;const e=/^\s*(?[a-zA-Z_][0-9a-zA-Z_]*)\s*\(\s*\)\s*;?\s*$/.exec(t)?.groups;if(!e)throw new Error("invalid event handler attribute "+t);xt("EXECUTE",t);const n=await this.interpreter.runEventHandler(e.funcName);return xt("END",t),n}setInterval(t,e,...n){const i=window.setInterval(t,e,...n);return this.timerHandles.set(i,{handle:i,handler:t,timeout:e}),i}pauseTimer(t){const e=this.timerHandles.get(t);return null!=e&&(null!=e.handle&&(window.clearInterval(e.handle),e.handle=null),!0)}resumeTimer(t){const e=this.timerHandles.get(t);return null!=e&&(null==e.handle&&(e.handle=window.setInterval(e.handler,e.timeout)),!0)}clearInterval(t){const e=this.timerHandles.get(t);return null!=e&&(null!=e.handle&&window.clearInterval(e.handle),this.timerHandles.delete(t),!0)}async processEventQueue(){if(this.discarded)return!1;while(this.syncEventQueue.length||this.asyncEventQueue.length){if(this.syncEventQueueLockCount)return!1;if(this.syncEventQueue.length){let t=!1;try{this.lockSyncEventQueue();const e=this.syncEventQueue.shift();if("focus"===e?.type){if(t=await this.dispatchFocus(e))return!0}else if("blur"===e?.type){if(t=await this.dispatchBlur(e))return!0}else if("click"===e?.type){if(t=await this.dispatchClick(e))return!0}else if("change"===e?.type){if(t=await this.dispatchChange(e))return!0}else{}}finally{t||this.unlockSyncEventQueue()}}else if(this.asyncEventQueue.length){let t=!1;try{this.lockSyncEventQueue();const e=this.asyncEventQueue.shift();if(null!=e&&(t=await e.callback(),t))return!0}finally{t||this.unlockSyncEventQueue()}}}return!1}queueSyncEvent(t){this.discarded||this.syncEventQueue.push(t)}queueAsyncEvent(t){this.discarded||this.asyncEventQueue.push({callback:t,local:!0})}queueGlobalAsyncEvent(t){this.asyncEventQueue.push({callback:t,local:!1})}lockSyncEventQueue(){this.syncEventQueueLockCount++}unlockSyncEventQueue(){if(this.syncEventQueueLockCount--,this.syncEventQueueLockCount<0)throw new Error("syncEventQueueLockCount < 0")}discard(){this.discarded=!0,this.clear()}clear(){this.asyncEventQueue=this.asyncEventQueue.filter((t=>!t.local)),this.syncEventQueue.splice(0,this.syncEventQueue.length);for(const t of this.timerHandles.keys())this.clearInterval(t)}reset(){this.discarded=!1,this.clear(),this.syncEventQueueLockCount=0}}var kt,Tt,It;n(23767),n(8585),n(68696);function _t(t,e){let n=[],i=0,r=0;while(i>4,o=15&t[i];i++;let a=t[i]>>4,l=15&t[i];i++;let c=t[i]>>4,u=15&t[i],d=[o,a,l,c,u];switch(i++,s){case 8:for(const t of d){if(t>=10&&t<=14)throw new Error("d >= 10 && d <= 0xe 3digit list");15!==t&&n.push({from:1e4*(10*e+t),to:1e4*(10*e+t+1)-1})}break;case 9:if(15!==o)throw new Error("a !== 0xf 3digit range");if(15===a||15===l)throw new Error("b === 0xf || c === 0xf 3digit range");if(n.push({from:1e4*(10*e+a),to:1e4*(10*e+l+1)-1}),15===c||15===u);else{if(15===c||15===u)throw new Error("not allowed d, e 3digit range");n.push({from:1e4*(10*e+c),to:1e4*(10*e+u+1)-1})}break;case 10:if(15===o||15===a||15===l)throw new Error("a === 0xf || b === 0xf || c === 0xf 5digit list");if(n.push({from:100*(1e3*e+100*o+10*a+l),to:100*(1e3*e+100*o+10*a+l+1)-1}),15===c||15===u);else{if(15===c||15===u)throw new Error("not allowed d, e 5digit range");n.push({from:100*(1e3*e+100*o+10*c+u),to:100*(1e3*e+100*o+10*c+u+1)-1})}break;case 11:if(15===o||15===a||15===l||15!==c||15!==u)throw new Error("a === 0xf || b === 0xf || c === 0xf || d !== 0xf || e !== 0xf 5digit range");n.push({from:100*(1e3*e+100*o+10*a+l),to:100*(1e3*e+100*o+10*a+l)});break;case 12:if(11!==r)throw new Error("prevFlag !== 0xB 5digit range");if(15===o||15===a||15===l||15!==c||15!==u)throw new Error("a === 0xf || b === 0xf || c === 0xf || d !== 0xf || e !== 0xf 5digit range");n[n.length-1].to=100*(1e3*e+100*o+10*a+l+1)-1;break;case 13:case 15:if(15===o||15===a||15===l||15===c||15===u)throw new Error("a === 0xf || b === 0xf || c === 0xf || d === 0xf || e === 0xf 7digit range/list");n.push({from:1e5*e+1e4*o+1e3*a+100*l+10*c+u,to:1e5*e+1e4*o+1e3*a+100*l+10*c+u});break;case 14:if(13!==r)throw new Error("prevFlag !== 0xD 7digit range");if(15===o||15===a||15===l||15===c||15===u)throw new Error("a === 0xf || b === 0xf || c === 0xf || d === 0xf || e === 0xf 7digit range");n[n.length-1].to=1e5*e+1e4*o+1e3*a+100*l+10*c+u;break}r=s}else{let e=127&t[i];i++;let r=127&t[i];if(n.push({from:1e5*e,to:1e5*(r+1)-1}),i++,128&t[i]){let e=127&t[i];i++;let r=127&t[i];i++,n.push({from:1e5*e,to:1e5*(r+1)-1})}else i+=2}return n}function Ot(t){let e=t[0],n=t[1];return{excludeList:_t(t.slice(2),n),list:_t(t.slice(2+n,1+e),e-1-n)}}function Bt(t,e){return t.some((t=>t.from<=e&&t.to>=e))}function Pt(t,e){return Bt(t.list,e)&&!Bt(t.excludeList,e)}function Rt(t,e,n){let i=0;for(let r=0;r>3]&1<<7-(7&t)?1:0,t++;return[i,t]}function Mt(t,e,n,i){for(let r=e-1;r>=0;r--){const e=1<<7-(7&t);n[t>>3]&=~e,i&1<>3]|=e),t++}return t}function Dt(t){const e=t.split(","),n=[];for(const i of e){const t=i.match(/^(?[BUISZP]):(?[1-9][0-9]*)(?[BbVv])$/)?.groups;if(!t)return null;const e=t["type"],r=Number.parseInt(t["length"]);let s=t["unit"];"v"===s&&(s=kt.Variable),n.push({type:e,length:r,unit:s})}return n}function Lt(t,e,n,i){i=i??0;const r=[];for(const s of e){let e=null;switch(s.type){case Tt.Boolean:if(s.unit!==kt.Bit)throw new Error("FIXME");if(1!==s.length)throw new Error("FIXME");[e,i]=Rt(i,s.length,t),e=0!=e;break;case Tt.UnsignedInteger:let r;if(s.unit===kt.Bit)r=s.length;else{if(s.unit!==kt.Byte)throw new Error("FIXME");r=8*s.length}if(r>32)throw new Error("FIXME");[e,i]=Rt(i,r,t);break;case Tt.Integer:if(s.unit!==kt.Byte)throw new Error("must be byte");if(0!==(7&i))throw new Error("must be byte aligned");if(1===s.length)e=t[i>>3]<<24>>24,i+=8;else if(2===s.length)e=(t[0+(i>>3)]<<8|t[1+(i>>3)])<<16>>16,i+=16;else{if(4!==s.length)throw new Error("length must be 1, 2, or 4");e=t[0+(i>>3)]<<24|t[1+(i>>3)]<<16|t[2+(i>>3)]<<8|t[3+(i>>3)]<<0,i+=32}break;case Tt.String:if(0!==(7&i))throw new Error("string must be byte aligned");let o;if(s.unit===kt.Byte)o=s.length;else{if(s.unit!==kt.Variable)throw new Error("string must be byte or variable");[o,i]=Rt(i,8*s.length,t)}const a=n(t.subarray(i>>3,(i>>3)+o)),l=a.indexOf("\0");e=-1!==l?a.substring(0,l):a,i+=8*o;break;case Tt.Pad:if(s.unit===kt.Byte)i+=8*s.length;else{if(s.unit!==kt.Bit)throw new Error("variable not allowed");i+=s.length}break;case Tt.ZipCode:{if(0!==(7&i))throw new Error("zip code must be byte aligned");if(s.unit!==kt.Variable)throw new Error("zip code must be variable");let n;[n,i]=Rt(i,8*s.length,t);const r=t.subarray(i>>3,(i>>3)+n);e=Ot(r),i+=8*n}break}null!=e&&r.push(e)}return[r,i]}function Vt(t,e,n){if(t.length>3);let s=0;for(let o=0;o32)throw new Error("FIXME");s=Mt(s,e,r,Number(t[o]));break;case Tt.Integer:if(i.unit!==kt.Byte)throw new Error("must be byte");if(0!==(7&s))throw new Error("must be byte aligned");if(1===i.length)r[s>>3]=Number(t[o]),s+=8;else if(2===i.length)r[s>>3]=Number(t[o]>>8),s+=8,r[s>>3]=Number(t[o]),s+=8;else{if(4!==i.length)throw new Error("length must be 1, 2, or 4");r[s>>3]=Number(t[o]>>24),s+=8,r[s>>3]=Number(t[o]>>16),s+=8,r[s>>3]=Number(t[o]>>8),s+=8,r[s>>3]=Number(t[o]),s+=8}break;case Tt.String:if(0!==(7&s))throw new Error("string must be byte aligned");const a=n(String(t[o]));if(i.unit===kt.Byte)if(a.length===i.length)r.set(a,s>>3),s+=8*i.length;else if(a.length>i.length)r.set(a.subarray(0,i.length),s>>3),s+=8*i.length;else{r.set(a,s>>3),s+=8*a.length;for(let t=a.length;t>3]=32,s+=8}else{if(i.unit!==kt.Variable)throw new Error("string must be byte or variable");s=Mt(s,8*i.length,r,a.length),r.set(a,s>>3),s+=8*a.length}break;case Tt.Pad:if(i.unit===kt.Byte)s+=8*i.length;else{if(i.unit!==kt.Bit)throw new Error("variable not allowed");s+=i.length}break;case Tt.ZipCode:throw new Error("Z is not allowed")}}return r}(function(t){t["Byte"]="B",t["Bit"]="b",t["Variable"]="V"})(kt||(kt={})),function(t){t["Boolean"]="B",t["UnsignedInteger"]="U",t["Integer"]="I",t["String"]="S",t["ZipCode"]="Z",t["Pad"]="P"}(Tt||(Tt={})),function(t){t[t["Equal"]=0]="Equal",t[t["NotEqual"]=1]="NotEqual",t[t["Less"]=2]="Less",t[t["LessEqual"]=3]="LessEqual",t[t["Greater"]=4]="Greater",t[t["GreaterEqual"]=5]="GreaterEqual",t[t["And"]=6]="And",t[t["Or"]=7]="Or",t[t["Xor"]=8]="Xor",t[t["Nand"]=9]="Nand",t[t["Nor"]=10]="Nor",t[t["Nxor"]=11]="Nxor",t[t["StringMatches"]=32]="StringMatches",t[t["StringIncludes"]=33]="StringIncludes",t[t["StringStarsWith"]=34]="StringStarsWith",t[t["StringEndsWith"]=35]="StringEndsWith",t[t["StringNotMatch"]=36]="StringNotMatch",t[t["StringNotInclude"]=37]="StringNotInclude",t[t["BoolEqualTo"]=64]="BoolEqualTo",t[t["BoolNotEqualTo"]=65]="BoolNotEqualTo",t[t["ZipInclude"]=96]="ZipInclude",t[t["ZipNotInclude"]=97]="ZipNotInclude"}(It||(It={}));class Nt{constructor(t,e,n){const{rows:i,fields:r}=Nt.constructBinaryTable(t,e,n);this.rows=i,this.fields=r}static constructBinaryTable(t,e,n){const i=e.split(",");if(i.length<2)throw new Error("FIXME");if(!i[0].match(/^(?[1-9][0-9]*|0)$/))throw new Error("FIXME");const r=Number.parseInt(i[0]);let s=0;const o=Dt(e.substring(e.indexOf(",")+1));if(!o)throw new Error("FIXME: failed to parse structure");const a=[];while(s<8*t.length){let e=0;r&&([e,s]=Rt(s,8*r,t));let[i,l]=Lt(t,o,n,s);s=r?s+8*e:l,a.push(i)}return{rows:a,fields:o}}get nrow(){return this.rows.length}get ncolumn(){return this.fields.length}close(){return 0}toNumber(t,e){return Number((this.rows[t]??[])[e])}toString(t,e){return(this.rows[t]??[])[e]?.toString()}toArray(t,e){return this.rows.slice(t,t+e).map((t=>t.map(((t,e)=>this.fields[e].type===Tt.ZipCode?null:t))))}search(t,...e){if(e.length%3!==0||e.length<6)throw new TypeError("argument");if(e.length>20)throw new TypeError("argument");const n=e[e.length-3],i=e[e.length-2],r=e[e.length-1];r.length=0;for(let s=t;sNumber(i);break;case It.GreaterEqual:l=a>=Number(i);break;case It.And:l=!!(a&Number(i));break;case It.Or:l=!!(a|Number(i));break;case It.Xor:l=!!(a^Number(i));break;case It.Nand:l=!!~(a&Number(i));break;case It.Nor:l=!!~(a|Number(i));break;case It.Nxor:l=!!~(a^Number(i));break;case It.StringMatches:l=a===String(i);break;case It.StringIncludes:l=String(a).includes(i);break;case It.StringStarsWith:l=String(a).startsWith(i);break;case It.StringEndsWith:l=String(a).endsWith(i);break;case It.StringNotMatch:l=a!==String(i);break;case It.StringNotInclude:l=!String(a).includes(i);break;case It.BoolEqualTo:l=a===Boolean(i);break;case It.BoolNotEqualTo:l=a!==Boolean(i);break;case It.ZipInclude:l=Pt(a,Number(i));break;case It.ZipNotInclude:l=!Pt(a,Number(i));break}o[n/3]=l}if(t=n?o.some((t=>t)):o.every((t=>t)),t&&r.push(this.rows[s].map(((t,n)=>{if(this.fields[n].type===Tt.ZipCode){let t=!1;for(let i=0;i=i)return s}return-1}}var jt=n(22783);function Ft(){return Math.abs(this.getFullYear()).toString().padStart(4,"0")+"-"+(this.getMonth()+1).toString().padStart(2,"0")+"-"+this.getDate().toString().padStart(2,"0")+"T"+this.getHours().toString().padStart(2,"0")+":"+this.getMinutes().toString().padStart(2,"0")+":"+this.getSeconds().toString().padStart(2,"0")}function Ut(){return Math.abs(this.getUTCFullYear()).toString().padStart(4,"0")+"-"+(this.getUTCMonth()+1).toString().padStart(2,"0")+"-"+this.getUTCDate().toString().padStart(2,"0")+"T"+this.getUTCHours().toString().padStart(2,"0")+":"+this.getUTCMinutes().toString().padStart(2,"0")+":"+this.getUTCSeconds().toString().padStart(2,"0")}const zt=1,Gt=2147483647;var Ht=n(50646);const Wt=String.prototype.charCodeAt,Jt=String.fromCharCode;function Yt(t){const e=Wt.call(this,t);if(Number.isNaN(e))return e;const n=Ht.V[e];return null==n?e:n+32896}function Zt(...t){return Jt(...t.flatMap((t=>{const e=t>>8&255,n=255&t;if(e>=161&&e<=254&&n>=161&&n<=254){const t=f.I[94*(e-161)+n-161];return"number"===typeof t?[t]:t}return[t]})))}function qt(t){const e=Wt.call(this,t);if(Number.isNaN(e))return e;const n=(0,W.Vl)(Jt(e));return n.length>=2?n[0]<<8|n[1]:n[0]}function Kt(...t){return Jt(...t.flatMap((t=>{const e=t>>8&255,n=255&t;return 0!==e?[(0,W.td)(new Uint8Array([e,n])).charCodeAt(0)]:t>=128?[(0,W.td)(new Uint8Array([t])).charCodeAt(0)]:[t]})))}var Qt=n(81103);const{Interpreter:Xt}=n(12019),$t=(0,i.gN)("js-interpreter.dom"),te=(0,i.gN)("js-interpreter.event"),ee=(0,i.gN)("js-interpreter.browser"),ne=(0,i.Bd)("js-interpreter.browser"),ie=(0,i.gN)("js-interpreter"),re=(0,i.x7)("js-interpreter"),se=(0,i.by)("js-interpreter"),oe={};function ae(t,e){var n,i=t;n=function(t){return t=arguments.length?Math.trunc(Xt.nativeGlobal.Number(t)):0,i.calledWithNew()?(this.data=t,this):t},t.NUMBER=t.createNativeFunction(n,!0),t.setProperty(e,"Number",t.NUMBER,Xt.NONENUMERABLE_DESCRIPTOR),t.setProperty(t.NUMBER,"MAX_VALUE",Gt,Xt.NONCONFIGURABLE_READONLY_NONENUMERABLE_DESCRIPTOR),t.setProperty(t.NUMBER,"MIN_VALUE",zt,Xt.NONCONFIGURABLE_READONLY_NONENUMERABLE_DESCRIPTOR),t.setProperty(t.NUMBER,"NaN",Number.NaN,Xt.NONCONFIGURABLE_READONLY_NONENUMERABLE_DESCRIPTOR),n=function(t){try{return Number(this).toString(t)}catch(e){i.throwException(i.ERROR,e.message)}},t.setNativeFunctionPrototype(t.NUMBER,"toString",n)}function le(t,e){var n;n=function(e){return e=arguments.length?globalThis.String(e):"",t.calledWithNew()?(this.data=e,this):e},t.STRING=t.createNativeFunction(n,!0),t.setProperty(e,"String",t.STRING,Xt.NONENUMERABLE_DESCRIPTOR);for(var i=["charAt","indexOf","lastIndexOf","substring","toLowerCase","toUpperCase"],r=0;r",e),null!=e&&o.has(Object.getPrototypeOf(e))?a(t,e):e}))),i&&(e.set=t.createNativeFunction((function(t){$t("set",l,t,this.data),i.bind(this.data)(t)}))),"function"===typeof r)e.value=t.createNativeFunction((function(...e){$t("call",l,r,this.data,e);const n=r.bind(this.data)(...e);return $t("=>",n),null!=n&&o.has(Object.getPrototypeOf(n))?a(t,n):n}));else if("undefined"!==typeof r)throw new Error("unreachable");"enumerable"in c&&(e.enumerable=c["enumerable"]),"configurable"in c&&(e.configurable=c["configurable"]),"writable"in c&&(e.enumerable=c["writable"]),t.setProperty(s,l,Xt.VALUE_IN_DESCRIPTOR,e)}return this.nativeProtoToPseudoObject.set(e.prototype,i),i}registerDOMClasses(t,e){this.nativeProtoToPseudoObject.clear(),t.setProperty(e,"Node",this.domClassToPseudo(t,wt.X.Node)),t.setProperty(e,"CharacterData",this.domClassToPseudo(t,wt.X.CharacterData)),t.setProperty(e,"Text",this.domClassToPseudo(t,wt.X.Text)),t.setProperty(e,"CDATASection",this.domClassToPseudo(t,wt.X.CDATASection)),t.setProperty(e,"Document",this.domClassToPseudo(t,wt.X.Document)),t.setProperty(e,"HTMLDocument",this.domClassToPseudo(t,wt.X.HTMLDocument)),t.setProperty(e,"BMLDocument",this.domClassToPseudo(t,wt.X.BMLDocument)),t.setProperty(e,"Element",this.domClassToPseudo(t,wt.X.Element)),t.setProperty(e,"HTMLElement",this.domClassToPseudo(t,wt.X.HTMLElement)),t.setProperty(e,"HTMLBRElement",this.domClassToPseudo(t,wt.X.HTMLBRElement)),t.setProperty(e,"BMLBRElement",this.domClassToPseudo(t,wt.X.BMLBRElement)),t.setProperty(e,"HTMLHtmlElement",this.domClassToPseudo(t,wt.X.HTMLHtmlElement)),t.setProperty(e,"BMLBmlElement",this.domClassToPseudo(t,wt.X.BMLBmlElement)),t.setProperty(e,"HTMLAnchorElement",this.domClassToPseudo(t,wt.X.HTMLAnchorElement)),t.setProperty(e,"BMLAnchorElement",this.domClassToPseudo(t,wt.X.BMLAnchorElement)),t.setProperty(e,"HTMLInputElement",this.domClassToPseudo(t,wt.X.HTMLInputElement)),t.setProperty(e,"BMLInputElement",this.domClassToPseudo(t,wt.X.BMLInputElement)),t.setProperty(e,"HTMLTextAreaElement",this.domClassToPseudo(t,wt.X.HTMLTextAreaElement)),t.setProperty(e,"BMLTextAreaElement",this.domClassToPseudo(t,wt.X.BMLTextAreaElement)),t.setProperty(e,"HTMLFormElement",this.domClassToPseudo(t,wt.X.HTMLFormElement)),t.setProperty(e,"BMLFormElement",this.domClassToPseudo(t,wt.X.BMLFormElement)),t.setProperty(e,"HTMLObjectElement",this.domClassToPseudo(t,wt.X.HTMLObjectElement)),t.setProperty(e,"BMLObjectElement",this.domClassToPseudo(t,wt.X.BMLObjectElement)),t.setProperty(e,"HTMLImageElement",this.domClassToPseudo(t,wt.X.HTMLImageElement)),t.setProperty(e,"BMLImageElement",this.domClassToPseudo(t,wt.X.BMLImageElement)),t.setProperty(e,"BMLSpanElement",this.domClassToPseudo(t,wt.X.BMLSpanElement)),t.setProperty(e,"HTMLBodyElement",this.domClassToPseudo(t,wt.X.HTMLBodyElement)),t.setProperty(e,"BMLBodyElement",this.domClassToPseudo(t,wt.X.BMLBodyElement)),t.setProperty(e,"HTMLDivElement",this.domClassToPseudo(t,wt.X.HTMLDivElement)),t.setProperty(e,"BMLDivElement",this.domClassToPseudo(t,wt.X.BMLDivElement)),t.setProperty(e,"HTMLParagraphElement",this.domClassToPseudo(t,wt.X.HTMLParagraphElement)),t.setProperty(e,"BMLParagraphElement",this.domClassToPseudo(t,wt.X.BMLParagraphElement)),t.setProperty(e,"HTMLMetaElement",this.domClassToPseudo(t,wt.X.HTMLMetaElement)),t.setProperty(e,"HTMLTitleElement",this.domClassToPseudo(t,wt.X.HTMLTitleElement)),t.setProperty(e,"HTMLScriptElement",this.domClassToPseudo(t,wt.X.HTMLScriptElement)),t.setProperty(e,"HTMLStyleElement",this.domClassToPseudo(t,wt.X.HTMLStyleElement)),t.setProperty(e,"HTMLHeadElement",this.domClassToPseudo(t,wt.X.HTMLHeadElement)),t.setProperty(e,"BMLBeventElement",this.domClassToPseudo(t,wt.X.BMLBeventElement)),t.setProperty(e,"BMLBeitemElement",this.domClassToPseudo(t,wt.X.BMLBeitemElement)),t.setProperty(e,"BMLEvent",this.domClassToPseudo(t,wt.X.BMLEvent)),t.setProperty(e,"BMLIntrinsicEvent",this.domClassToPseudo(t,wt.X.BMLIntrinsicEvent)),t.setProperty(e,"BMLBeventEvent",this.domClassToPseudo(t,wt.X.BMLBeventEvent)),t.setProperty(e,"DOMImplementation",this.domClassToPseudo(t,wt.X.DOMImplementation)),t.setProperty(e,"BMLCSS2Properties",this.domClassToPseudo(t,jt.d))}reset(){const t=this.content,e=this.epg,n=this.resources;function i(e,n,i){if(ne(`launchDocument(${n}, ${i})`),n.startsWith("#"))return t.focusFragment(n),void e(0,void 0);const r=t.launchDocument(String(n));e(r,oe)}function r(e){ne("reloadActiveDocument()");const n=t.launchDocument(l.getActiveDocument());e(n,oe)}function s(e,i,r){if(ne(`%cX_DPA_launchDocWithLink(${i})`,"font-size: 1.5em"),n.profile!==h.N.TrProfileC)return void e(NaN,oe);if(!i.startsWith("http://")&&i.startsWith("https://"))return void e(NaN,oe);if(!n.isInternetContent)return t.quitDocument(),void e(NaN,oe);const s=t.launchDocument(i,{withLink:!0});e(s,oe)}function o(t,i){ne(`%cepgTune(${i})`,"font-size: 1.5em");const{originalNetworkId:r,transportStreamId:s,serviceId:o}=n.parseServiceReference(i);if(null==r||null==s||null==o)t(NaN,oe);else{const n=e.tune?.(r,s,o);t(n,oe)}}const a=this.browserAPI,l=a.browser,c=a.asyncBrowser;this.interpreter=new Xt("",((t,e)=>{t.setProperty(e,"___log",t.createNativeFunction((function(t){te(t)})));const n=t.nativeToPseudo(l);for(let f=0;f<64;f++){function m(e,n){t.setProperty(e,n,Xt.VALUE_IN_DESCRIPTOR,{get:t.createNativeFunction((function(){return a.getGreg(f)})),set:t.createNativeFunction((function(t){a.setGreg(f,String(t))}))})}function g(e,n){t.setProperty(e,n,Xt.VALUE_IN_DESCRIPTOR,{get:t.createNativeFunction((function(){return a.getUreg(f)})),set:t.createNativeFunction((function(t){a.setUreg(f,String(t))}))})}m(t.getProperty(n,"Greg"),f.toString()),g(t.getProperty(n,"Ureg"),f.toString())}t.setProperty(e,"browser",n);for(const v in c){const A=c[v];t.setProperty(n,v,t.createAsyncFunction((function(e,...n){A(...n.map((e=>t.pseudoToNative(e)))).then((n=>{e(t.nativeToPseudo(n),void 0)}))})))}t.setProperty(n,"launchDocument",t.createAsyncFunction(i)),t.setProperty(n,"reloadActiveDocument",t.createAsyncFunction(r)),t.setProperty(n,"X_DPA_launchDocWithLink",t.createAsyncFunction(s)),t.setProperty(n,"epgTune",t.createAsyncFunction(o)),t.setProperty(n,"readPersistentArray",t.createNativeFunction((function(e,n){return t.arrayNativeToPseudo(l.readPersistentArray(e,n))}))),t.setProperty(n,"writePersistentArray",t.createNativeFunction((function(e,n,i,r){return l.writePersistentArray(e,n,t.arrayPseudoToNative(i),r)})));const u=this.resources;t.setProperty(n,"getProgramID",t.createAsyncFunction((function(t,e){u.getProgramInfoAsync().then((n=>{const i=l.getProgramID(e);t(i,void 0)}))}))),this.registerDOMClasses(t,e),t.setProperty(e,"document",this.domObjectToPseudo(t,this.content.bmlDocument));const d=t.createAsyncFunction((function(t,e,n){u.fetchResourceAsync(e).then((i=>{if(!i)return ee("BinaryTable",e,"not found"),void t(null,void 0);ee("new BinaryTable",e);let r=i.data;this.instance=new Nt(r,n,(0,Qt.$)(u.profile)),t(this,void 0)}))}));function p(t,e){var n,i=t;n=function(t,e){if(!i.calledWithNew())return null!=u.currentTimeUnixMillis?Ft.call(new Xt.nativeGlobal.Date(u.currentTimeUnixMillis)):Ft.call(new Xt.nativeGlobal.Date);var n=[null].concat(Array.from(arguments));return n.length<=1&&null==t&&null!=u.currentTimeUnixMillis?(ee("new Date()"),this.data=new Xt.nativeGlobal.Date(u.currentTimeUnixMillis)):this.data=new(Function.prototype.bind.apply(Xt.nativeGlobal.Date,n)),this},t.DATE=t.createNativeFunction(n,!0),t.DATE_PROTO=t.DATE.properties["prototype"],t.setProperty(e,"Date",t.DATE,Xt.NONENUMERABLE_DESCRIPTOR),t.setProperty(t.DATE,"now",t.createNativeFunction(Date.now,!1),Xt.NONENUMERABLE_DESCRIPTOR),t.setProperty(t.DATE,"parse",t.createNativeFunction(Date.parse,!1),Xt.NONENUMERABLE_DESCRIPTOR),t.setProperty(t.DATE,"UTC",t.createNativeFunction(Date.UTC,!1),Xt.NONENUMERABLE_DESCRIPTOR);for(var r=["getDate","getDay","getFullYear","getHours","getMilliseconds","getMinutes","getMonth","getSeconds","getTime","getTimezoneOffset","getUTCDate","getUTCDay","getUTCFullYear","getUTCHours","getUTCMilliseconds","getUTCMinutes","getUTCMonth","getUTCSeconds","getYear","setDate","setFullYear","setHours","setMilliseconds","setMinutes","setMonth","setSeconds","setTime","setUTCDate","setUTCFullYear","setUTCHours","setUTCMilliseconds","setUTCMinutes","setUTCMonth","setUTCSeconds","setYear","toDateString","toISOString","toJSON","toGMTString","toLocaleDateString","toLocaleString","toLocaleTimeString","toTimeString","toUTCString"],s=0;st.arrayNativeToPseudo(e))))})),t.setNativeFunctionPrototype(d,"search",(function(e,...n){const i=n[n.length-1];n[n.length-1]=t.arrayPseudoToNative(n[n.length-1]);const r=this.instance.search(e,...n),s=Object.getOwnPropertyNames(n[n.length-1]);for(var o=0;o(re("script execution timeout"),new Promise((t=>{setTimeout((()=>{t(!0)}),100)})))));if(ie("RETURN RUN SCRIPT",n,i,t,this.content.context),!0!==i){i===oe?(ie("browser.launchDocument called."),e=!0):this.content.context!==t&&(se("context switched",this.content.context,t),e=!0);break}}e||this.content.context===t||(se("context switched",this.content.context,t),e=!0)}finally{if(ie("leave runScript()",n,e,t,this.content.context),e)return!0;this._isExecuting=!1}return!1}get isExecuting(){return this._isExecuting}async runEventHandler(t){return this.interpreter.appendCode(`___log("${t}");${t}();`),await this.runScript()}destroyStack(){}resetStack(){const t=new Xt.State(this.interpreter.ast,this.interpreter.globalScope);t.done=!1,this.interpreter.stateStack.length=0,this.interpreter.stateStack[0]=t,this._isExecuting=!1}}n(82801);const ue=(0,i.by)("nvram"),de=[{broadcastType:"GR",prefixId:"affiliation_id",prefix:"group",startBlock:0,lastBlock:63,size:64,isFixed:!0,accessId:["affiliation_id"],permissions:{GR:"rw",BS:"rw",CS:""},isSecure:!1},{broadcastType:"GR",prefixId:null,prefix:"local",startBlock:0,lastBlock:63,size:64,isFixed:!0,accessId:["original_network_id"],permissions:{GR:"rw",BS:"",CS:""},isSecure:!1},{broadcastType:"GR",prefixId:null,prefix:"local_web",startBlock:0,lastBlock:31,size:64,isFixed:!0,accessId:["original_network_id"],permissions:{GR:"rw",BS:"",CS:""},isSecure:!1},{broadcastType:"GR",prefixId:null,prefix:"tr_common",startBlock:0,lastBlock:31,size:64,isFixed:!0,accessId:[],permissions:{GR:"rw",BS:"r",CS:""},isSecure:!1},{broadcastType:"GR",prefixId:null,prefix:"Cprogroup",startBlock:0,lastBlock:31,size:64,isFixed:!0,accessId:["affiliation_id;original_network_id"],permissions:{GR:"rw",BS:"",CS:""},isSecure:!1},{broadcastType:"BS",prefixId:null,prefix:"common",startBlock:0,lastBlock:15,size:64,isFixed:!0,accessId:[],permissions:{GR:"r",BS:"rw",CS:""},isSecure:!1},{broadcastType:"BS",prefixId:null,prefix:"~",startBlock:0,lastBlock:15,size:64,isFixed:!0,accessId:["broadcaster_id"],permissions:{GR:"",BS:"rw",CS:"rw"},isSecure:!1},{broadcastType:"BS",prefixId:null,prefix:"~/ext",startBlock:16,lastBlock:63,size:64,isFixed:!0,accessId:["broadcaster_id"],permissions:{GR:"",BS:"rw",CS:"rw"},isSecure:!1},{broadcastType:"BS",prefixId:null,prefix:"local_web",startBlock:0,lastBlock:31,size:64,isFixed:!0,accessId:["broadcaster_id"],permissions:{GR:"",BS:"rw",CS:""},isSecure:!1},{broadcastType:"CS",prefixId:null,prefix:"cs_common",startBlock:0,lastBlock:31,size:64,isFixed:!0,accessId:[],permissions:{GR:"r",BS:"rw",CS:""},isSecure:!1},{broadcastType:"CS",prefixId:null,prefix:"~",startBlock:0,lastBlock:46,size:64,isFixed:!0,accessId:["original_network_id","broadcaster_id"],permissions:{GR:"",BS:"rw",CS:"rw"},isSecure:!0},{broadcastType:"CS",prefixId:null,prefix:"local_web",startBlock:0,lastBlock:15,size:64,isFixed:!0,accessId:["broadcaster_id"],permissions:{GR:"",BS:"",CS:"rw"},isSecure:!1}];class he{constructor(t,e,n){this.providerAreaPermission=new Map,this.resources=t,this.broadcasterDatabase=e,this.prefix=n??"nvram_"}getBroadcasterInfo(){const t=this.broadcasterDatabase.getBroadcasterId(this.resources.originalNetworkId,this.resources.serviceId);return{originalNetworkId:this.resources.originalNetworkId,affiliationId:this.broadcasterDatabase.getAffiliationIdList(this.resources.originalNetworkId,t),broadcasterId:t,serviceId:this.resources.serviceId}}findNvramArea(t,e){const n=t.match(/^nvrams?:\/\/((?[0-9a-fA-F]{2});)?((?[0-9a-fA-F]{4});)?(?.+)\/(?\d+)$/);if(!n?.groups)return null;const i=t.startsWith("nvrams://");let r=parseInt(n?.groups.affiliationId,16);Number.isFinite(r)||(r=null);let s=parseInt(n?.groups.originalNetworkId,16);Number.isFinite(s)||(s=null);const o=n?.groups.prefix,a=parseInt(n?.groups.block)??-1;for(const l of de)if(o===l.prefix&&l.isSecure===i&&l.startBlock<=a&&l.lastBlock>=a)return[{block:a,affiliationId:r,originalNetworkId:s,broadcasterId:e.broadcasterId,broadcastType:e.broadcastType},l];return null}getLocalStorageKey(t,e,n){const i=new URLSearchParams;for(const r of n.accessId)if("affiliation_id"===r)if(null==t.affiliationId)ue("affiliationId == null!"),i.append("affiliation_id",String(e.affiliationId));else{if(null==e.affiliationId)return ue("affiliationId == null!",e),null;if(!t.affiliationId.includes(e.affiliationId))return ue("permission denied (affiliationId)",t.affiliationId,e.affiliationId),null;i.append("affiliation_id",String(e.affiliationId))}else if("broadcaster_id"===r)null==e.broadcasterId?(ue("broadcasterId == null!"),i.append("broadcaster_id","null")):i.append("broadcaster_id",String(e.broadcasterId));else if("original_network_id"===r)null==t.originalNetworkId?(ue("originalNetworkId == null!"),i.append("original_network_id","null")):i.append("original_network_id",String(t.originalNetworkId));else if("affiliation_id;original_network_id"===r){if(null==e.affiliationId||null==e.originalNetworkId)return ue("invalid",e),null;if(e.originalNetworkId>=0&&e.originalNetworkId<=3)i.append("original_network_id",String(e.originalNetworkId)),i.append("affiliation_id",String(e.affiliationId));else{if(null==t.originalNetworkId)ue("originalNetworkId == null!"),i.append("original_network_id",String(e.originalNetworkId));else{if(null==e.originalNetworkId)return ue("originalNetworkId == null!",e),null;if(t.originalNetworkId!==e.originalNetworkId)return ue("permission denied (original_network_id)",t.originalNetworkId,e.originalNetworkId),null;i.append("original_network_id",String(e.originalNetworkId))}if(null==t.affiliationId)ue("affiliationId == null!"),i.append("affiliation_id",String(e.affiliationId));else{if(null==e.affiliationId)return ue("affiliationId == null!",e),null;if(!t.affiliationId.includes(e.affiliationId))return ue("permission denied (affiliationId)",t.affiliationId,e.affiliationId),null;i.append("affiliation_id",String(e.affiliationId))}}}if(i.append("prefix",n.prefix),null!=e.block&&i.append("block",String(e.block)),n.isSecure){i.append("secure","true");const n=`${t.originalNetworkId}.${t.broadcasterId}`,r=this.providerAreaPermission.get(n);if(null==r)return ue("permission not set (nvrams)"),null;if(null!=e.block){const n=r.serviceIdList[e.block];if(65535!==n&&n!==t.serviceId)return ue("permission denied (nvrams serviceId)",n,t.serviceId),null}}return i.toString()}readNVRAM(t){let e,n,i;if("nvram://receiverinfo/zipcode"===t)e=localStorage.getItem(this.prefix+"prefix=receiverinfo%2Fzipcode"),n=!0,i=7;else if("nvram://receiverinfo/prefecture"===t)e=localStorage.getItem(this.prefix+"prefix=receiverinfo%2Fprefecture"),null!=e&&0!==e.length||(e=window.btoa(String.fromCharCode(255))),n=!0,i=1;else if("nvram://receiverinfo/regioncode"===t)e=localStorage.getItem(this.prefix+"prefix=receiverinfo%2Fregioncode"),null!=e&&0!==e.length||(e=window.btoa(String.fromCharCode(0)+String.fromCharCode(0))),n=!0,i=2;else{const r=this.getBroadcasterInfo(),s=this.findNvramArea(t,r);if(!s)return ue("readNVRAM: findNvramArea failed",t),null;const[o,a]=s,l=this.getLocalStorageKey(r,o,a);if(!l)return ue("readNVRAM: access denied",t),null;if(e=localStorage.getItem(this.prefix+l),null!=e&&a.isSecure){const t=Number.parseInt(e.split(",")[0]);e=65535!==t&&t!==r.serviceId?"":e.split(",")[1]??""}n=a.isFixed,i=a.size}if(!e)return new Uint8Array(n?i:0);const r=Uint8Array.from(window.atob(e),(t=>t.charCodeAt(0)));if(n){if(r.length>i)return r.subarray(0,i);if(r.lengtho.size)return ue("writeNVRAM: too large data",t,e.length,o),NaN;const a=this.getLocalStorageKey(i,s,o);if(!a)return ue("writeNVRAM: access denied",t),NaN;if(o.isSecure&&null!=s.block){const t=`${i.originalNetworkId}.${i.broadcasterId}`,n=this.providerAreaPermission.get(t),r=n?.serviceIdList[s.block];localStorage.setItem(this.prefix+a,r+","+window.btoa(String.fromCharCode(...e)))}else localStorage.setItem(this.prefix+a,window.btoa(String.fromCharCode(...e)));return e.length}readPersistentArray(t,e){if(!t?.startsWith("nvram://"))return null;const n=Dt(e);if(!n)return null;const i=this.readNVRAM(t);if(!i)return null;let[r,s]=Lt(i,n,(0,Qt.$)(this.resources.profile));return r}writePersistentArray(t,e,n,i,r){if(!t?.startsWith("nvram://"))return NaN;const s=Dt(e);if(!s)return NaN;if(s.length>n.length)return ue("writePersistentArray: fields.length > data.length"),NaN;let o=Vt(n,s,(0,Qt.Y)(this.resources.profile));return this.writeNVRAM(t,o,r??!1)}cspSetAccessInfoToProviderArea(t){const e=Dt("S:1V,U:2B"),n=this.getBroadcasterInfo();if(null==n.originalNetworkId||null==n.broadcasterId)return!1;const i=`${n.originalNetworkId}.${n.broadcasterId}`;let r,s=0,o=[];while(sn.length)return ue("writePersistentArrayWithAccessCheck: fields.length > data.length"),NaN;let s=Vt(n,r,(0,Qt.Y)(this.resources.profile));return this.writeNVRAM(t,s,!1)}checkAccessInfoOfPersistentArray(t){if("nvram://receiverinfo/zipcode"===t)return 2;if("nvram://receiverinfo/regioncode"===t)return 1;if("nvram://receiverinfo/prefecture"===t)return 1;{const e=this.getBroadcasterInfo(),n=this.findNvramArea(t,e);if(!n)return NaN;const[i,r]=n,s=this.getLocalStorageKey(e,i,r);return s?2:0}}}class pe{constructor(){this.audioContext=new AudioContext}getAudioDestinationNode(){return this.audioContext.destination}destroy(){this.audioContext.close()}}const fe="0123456789",me="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",ge=" !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",ve="ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわをん",Ae="ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヲン",ye="0123456789",be="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",we=" 、。・ー―「」",xe=new Map([["number",fe],["alphabet",me+ge],["hankaku",me+fe+ge],["zenkaku",ve+Ae+be+ye+we],["katakana",Ae+we],["hiragana",ve+we]]),Se=Object.freeze({roundGothic:"丸ゴシック",boldRoundGothic:"太丸ゴシック",squareGothic:"角ゴシック"});class Ce{constructor(t){this.eventTarget=new EventTarget,this.fonts=[],this.containerElement=t.containerElement,this.mediaElement=t.mediaElement,this.indicator=t.indicator,this.shadowRoot=t.containerElement.attachShadow({mode:"closed"}),this.documentElement=document.createElement("html"),null!=t.tabIndex&&(this.documentElement.tabIndex=t.tabIndex),this.shadowRoot.appendChild(this.documentElement);let e=t.audioNodeProvider;null==e&&(this.defaultAudioNodeProvider=new pe,e=this.defaultAudioNodeProvider),this.epg=t.epg??{},this.interpreter=new ce,this.eventQueue=new Et(this.interpreter),this.resources=new h._(this.indicator,t.ip??{}),this.broadcasterDatabase=new u(this.resources,(t.storagePrefix??"")+(t.broadcasterDatabasePrefix??"")),this.broadcasterDatabase.openDatabase(),this.nvram=new he(this.resources,this.broadcasterDatabase,(t.storagePrefix??"")+(t.nvramPrefix??"nvram_")),this.bmlDocument=new wt.X.BMLDocument(this.documentElement,this.interpreter,this.eventQueue,this.resources,this.eventTarget,e,t.inputApplication,t.setMainAudioStreamCallback),this.eventDispatcher=new Ct(this.eventQueue,this.bmlDocument,this.resources),this.eventQueue.dispatchBlur=this.eventDispatcher.dispatchBlur.bind(this.eventDispatcher),this.eventQueue.dispatchClick=this.eventDispatcher.dispatchClick.bind(this.eventDispatcher),this.eventQueue.dispatchFocus=this.eventDispatcher.dispatchFocus.bind(this.eventDispatcher),this.eventQueue.dispatchChange=this.eventDispatcher.dispatchChange.bind(this.eventDispatcher),this.content=new bt.VY(this.bmlDocument,this.documentElement,this.resources,this.eventQueue,this.eventDispatcher,this.interpreter,this.mediaElement,this.eventTarget,this.indicator,t.videoPlaneModeEnabled??!1,t.inputApplication,t.showErrorMessage),this.browserAPI=new yt(this.resources,this.eventQueue,this.eventDispatcher,this.content,this.nvram,this.interpreter,e,t.ip??{},this.indicator,t.ureg,t.greg,t.X_DPA_startResidentApp),this.interpreter.setupEnvironment(this.browserAPI,this.resources,this.content,this.epg),t.fonts?.roundGothic&&this.fonts.push(new FontFace(Se.roundGothic,t.fonts?.roundGothic.source,t.fonts?.roundGothic.descriptors)),t.fonts?.boldRoundGothic?this.fonts.push(new FontFace(Se.boldRoundGothic,t.fonts?.boldRoundGothic.source,t.fonts?.boldRoundGothic.descriptors)):t.fonts?.roundGothic&&this.fonts.push(new FontFace(Se.boldRoundGothic,t.fonts?.roundGothic.source,t.fonts?.roundGothic.descriptors)),t.fonts?.squareGothic&&this.fonts.push(new FontFace(Se.squareGothic,t.fonts?.squareGothic.source,t.fonts?.squareGothic.descriptors));for(const n of this.fonts)document.fonts.add(n)}emitMessage(t){"programInfo"===t.type&&this.indicator?.setEventName(t.eventName),this.resources.onMessage(t),this.broadcasterDatabase.onMessage(t),this.browserAPI.onMessage(t),this.content.onMessage(t)}addEventListener(t,e,n){this.eventTarget.addEventListener(t,e,n)}removeEventListener(t,e,n){this.eventTarget.removeEventListener(t,e,n)}getVideoElement(){return this.documentElement.querySelector('object[arib-type="video/X-arib-mpeg2"]')}async destroy(){for(const t of this.fonts)document.fonts.delete(t);this.fonts.length=0,await this.content.exitDocument(),null!=this.defaultAudioNodeProvider&&this.defaultAudioNodeProvider.destroy()}setMainAudioStream(t,e){const{mainAudioComponentId:n,mainAudioChannelId:i}=this.resources;t===n&&e===i||(this.resources.mainAudioComponentId=t,this.resources.mainAudioChannelId=e,null!=n&&this.eventDispatcher.dispatchMainAudioStreamChangedEvent(n,i,t,e))}}},29587:function(t,e,n){"use strict";n.d(e,{b:function(){return o}});var i=n(21645),r=n(8819);const s=(0,r.by)("clut");function o(t){let e=i.c.slice();const n=e.length;e.length=256,e=e.fill([0,0,0,255],n,256);const r=128&t[0],o=(96&t[0])>>5,a=16&t[0],l=8&t[0];let c,u,d=1;if(a&&(d+=2,d+=2,d+=2,d+=2,s("region is not operated")),!l)throw new Error("start_end_flag = 0 is not operated");if(0==o)c=t[d]>>4,u=15&t[d],d++;else if(1==o)c=t[d++],u=t[d++];else{if(2!=o)throw new Error("unexpected");c=t[d++],c=c<<8|t[d++],u=t[d++],u=u<<8|t[d++]}for(let i=c;i<=u;i++){let n,s,o;if(0==r){const e=t[d++],i=t[d++],r=t[d++];n=Math.max(0,Math.min(255,Math.floor(1.16438*(e-16)+1.79274*(r-128)))),s=Math.max(0,Math.min(255,Math.floor(1.16438*(e-16)+-.213249*(i-128)-.532909*(r-128)))),o=Math.max(0,Math.min(255,Math.floor(1.16438*(e-16)+2.1124*(i-128))))}else n=t[d++],s=t[d++],o=t[d++];const a=t[d++];e[i]=[n,s,o,a]}return e}},50060:function(t,e,n){"use strict";n.d(e,{I5:function(){return E},VY:function(){return B}});n(57658),n(23767),n(8585),n(68696);var i=n(37288),r=n(21645),s=n(29587),o=n(69809),a=n(48764),l=n(41859),c=n(16932);function u(t,e){const n=[];for(const i of t)if(h(i)===e){n.push(i);break}return n}function d(t,e){const n=h(t);n&&(t[e]=t[n],delete t[n])}function h(t){for(const e of Object.getOwnPropertyNames(t))if(":@"!==e)return e;return null}function p(t){const e=h(t);return!e||e?.startsWith("#")?[]:t[e]}function f(t,e){e(t);for(const n of p(t))f(n,e)}function m(t,e){const n={ignoreAttributes:!1,attributeNamePrefix:"@_",preserveOrder:!0,cdataPropName:"#cdata",trimValues:!1,parseTagValue:!1},i=new c.XMLParser(n),r=i.parse(t),s=u(r,"bml")[0]??u(r,"html")[0],o=s["bml"]??s["html"];f(s,(t=>{const n=p(t),i=h(t);for(let r=0;r0?h(n[r-1]):"",o=r+1i??"")):(t["#text"]=t["#text"].replace(/([ \t\n\r]+)$/g," "),t["#text"]=t["#text"].replace(/^([ \t\n\r]+)|([\u0100-\uffff])[ \t\n\r]+(?=[\u0100-\uffff])/g,((t,e,n)=>n??""))):(t["#text"]=t["#text"].replace(/^([ \t\n\r]+)/g," "),"span"!==o&&"a"!==o&&"br"!==o||"p"!==i||(t["#text"]=t["#text"].replace(/([ \t\n\r]+)$/g," "),t["#text"]=t["#text"].replace(/([\u0100-\uffff])[ \t\n\r]+(?=[\u0100-\uffff])/g,((t,e)=>e)))),t["#text"]=t["#text"].replace(/^[ \t\n\r]$/,"")}}if("bml:beitem"==i?d(t,"beitem"):"bml:bevent"==i?d(t,"bevent"):"script"==i?d(t,"arib-script"):"style"==i?d(t,"arib-style"):"link"==i&&d(t,"arib-link"),"a"===i&&null!=t[":@"]&&null!=t[":@"]["@_href"]&&(t[":@"]["@_bml-href"]=t[":@"]["@_href"],delete t[":@"]["@_href"]),null!=t[":@"])for(const e of Object.getOwnPropertyNames(t[":@"]))e.startsWith("@_bml:")?(t[":@"]["@_"+e.substring(6)]=t[":@"][e],delete t[":@"][e]):e.startsWith("@_xml:")&&(t[":@"]["@_xml-"+e.substring(6)]=t[":@"][e],delete t[":@"][e]);if("object"==i&&null!=t[":@"]&&(t[":@"]["@_arib-type"]=t[":@"]["@_type"],delete t[":@"]["@_type"],t[":@"]["@_data"])){const e=t[":@"]["@_data"];t[":@"]["@_arib-data"]=e,delete t[":@"]["@_data"]}if("img"==i&&null!=t[":@"]&&(t[":@"]["@_arib-src"]=t[":@"]["@_src"],delete t[":@"]["@_src"]),t[":@"]&&t[":@"]["@_onload"]&&t[":@"]&&t[":@"]["@_onload"]){const e=t[":@"]["@_onload"];t[":@"]["@_arib-onload"]=e,delete t[":@"]["@_onload"]}if(t[":@"]&&t[":@"]["@_onunload"]&&t[":@"]&&t[":@"]["@_onunload"]){const e=t[":@"]["@_onunload"];t[":@"]["@_arib-onunload"]=e,delete t[":@"]["@_onunload"]}}));const a=new c.XMLBuilder(n);return a.build(o)}var g=n(10595),v=n(81103),A=n(8819);const y='\n\n/* STD-B24 Annex A Default Style Sheet */\n/* margin */\ndiv, p, input, object {margin: 0 !important}\n/* padding */\ndiv, object {padding-top : 0 !important; padding-right : 0 !important; padding-bottom : 0 !important; padding-left : 0 !important; }\n/* border */\n:where(div, p, span, a, input) { border-width: 0; }\nobject {border-width : 0 !important; border-style : none !important}\n/* display */\nmeta, title, script, style, head, bml, bevent, beitem { display: none !important }\nbody, div, p, object, input { display : block !important }\nbr, span, a { display : inline !important }\n/* position */\np, div, object, input { position : absolute !important }\nbr, span, a { position : static !important }\n/* top left width height*/\n:where(p, div, input, object) { top: 0; left: 0; width: 0; height: 0; }\n/* z-index */\ndiv, p, br, span, a, input, object, body { z-index : auto !important }\n/* line-height */\n/* br, span, a { line-height : inherit !important } */\n/* visibility */\nbody { visibility : visible !important }\nspan, a { visibility : inherit !important }\n/* overflow */\np, div, input, object { overflow : hidden !important }\n/* background-repeat */\nbody { background-repeat : repeat !important }\n/* text */\n:where(p, input) { font-family: "丸ゴシック"; --font-size: 24px; --font-size-raw: 24px; }\n:where(span, a) { font-family: inherit; }\n:where(p, input) { text-align: left; }\n/* letter-spacing */\nspan, a { letter-spacing : inherit !important }\n/* white-space */\n/* CDATA? */\n/* p, input { white-space : normal !important } */\n/* background-color-index */\n:where(body) {\n --clut-color-0: rgba(0, 0, 0, 1);\n --clut-color-1: rgba(255, 0, 0, 1);\n --clut-color-2: rgba(0, 255, 0, 1);\n --clut-color-3: rgba(255, 255, 0, 1);\n --clut-color-4: rgba(0, 0, 255, 1);\n --clut-color-5: rgba(255, 0, 255, 1);\n --clut-color-6: rgba(0, 255, 255, 1);\n --clut-color-7: rgba(255, 255, 255, 1);\n --clut-color-8: rgba(0, 0, 0, 0);\n --clut-color-9: rgba(170, 0, 0, 1);\n --clut-color-10: rgba(0, 170, 0, 1);\n --clut-color-11: rgba(170, 170, 0, 1);\n --clut-color-12: rgba(0, 0, 170, 1);\n --clut-color-13: rgba(170, 0, 170, 1);\n --clut-color-14: rgba(0, 170, 170, 1);\n --clut-color-15: rgba(170, 170, 170, 1);\n --clut-color-16: rgba(0, 0, 85, 1);\n --clut-color-17: rgba(0, 85, 0, 1);\n --clut-color-18: rgba(0, 85, 85, 1);\n --clut-color-19: rgba(0, 85, 170, 1);\n --clut-color-20: rgba(0, 85, 255, 1);\n --clut-color-21: rgba(0, 170, 85, 1);\n --clut-color-22: rgba(0, 170, 255, 1);\n --clut-color-23: rgba(0, 255, 85, 1);\n --clut-color-24: rgba(0, 255, 170, 1);\n --clut-color-25: rgba(85, 0, 0, 1);\n --clut-color-26: rgba(85, 0, 85, 1);\n --clut-color-27: rgba(85, 0, 170, 1);\n --clut-color-28: rgba(85, 0, 255, 1);\n --clut-color-29: rgba(85, 85, 0, 1);\n --clut-color-30: rgba(85, 85, 85, 1);\n --clut-color-31: rgba(85, 85, 170, 1);\n --clut-color-32: rgba(85, 85, 255, 1);\n --clut-color-33: rgba(85, 170, 0, 1);\n --clut-color-34: rgba(85, 170, 85, 1);\n --clut-color-35: rgba(85, 170, 170, 1);\n --clut-color-36: rgba(85, 170, 255, 1);\n --clut-color-37: rgba(85, 255, 0, 1);\n --clut-color-38: rgba(85, 255, 85, 1);\n --clut-color-39: rgba(85, 255, 170, 1);\n --clut-color-40: rgba(85, 255, 255, 1);\n --clut-color-41: rgba(170, 0, 85, 1);\n --clut-color-42: rgba(170, 0, 255, 1);\n --clut-color-43: rgba(170, 85, 0, 1);\n --clut-color-44: rgba(170, 85, 85, 1);\n --clut-color-45: rgba(170, 85, 170, 1);\n --clut-color-46: rgba(170, 85, 255, 1);\n --clut-color-47: rgba(170, 170, 85, 1);\n --clut-color-48: rgba(170, 170, 255, 1);\n --clut-color-49: rgba(170, 255, 0, 1);\n --clut-color-50: rgba(170, 255, 85, 1);\n --clut-color-51: rgba(170, 255, 170, 1);\n --clut-color-52: rgba(170, 255, 255, 1);\n --clut-color-53: rgba(255, 0, 85, 1);\n --clut-color-54: rgba(255, 0, 255, 1);\n --clut-color-55: rgba(255, 85, 0, 1);\n --clut-color-56: rgba(255, 85, 85, 1);\n --clut-color-57: rgba(255, 85, 170, 1);\n --clut-color-58: rgba(255, 85, 255, 1);\n --clut-color-59: rgba(255, 170, 0, 1);\n --clut-color-60: rgba(255, 170, 85, 1);\n --clut-color-61: rgba(255, 170, 170, 1);\n --clut-color-62: rgba(255, 170, 255, 1);\n --clut-color-63: rgba(255, 255, 85, 1);\n --clut-color-64: rgba(255, 255, 255, 1);\n --clut-color-65: rgba(0, 0, 0, 0.5);\n --clut-color-66: rgba(255, 0, 0, 0.5);\n --clut-color-67: rgba(0, 255, 0, 0.5);\n --clut-color-68: rgba(255, 255, 0, 0.5);\n --clut-color-69: rgba(0, 0, 255, 0.5);\n --clut-color-70: rgba(255, 0, 255, 0.5);\n --clut-color-71: rgba(0, 255, 255, 0.5);\n --clut-color-72: rgba(255, 255, 255, 0.5);\n --clut-color-73: rgba(170, 0, 0, 0.5);\n --clut-color-74: rgba(0, 170, 0, 0.5);\n --clut-color-75: rgba(170, 170, 0, 0.5);\n --clut-color-76: rgba(0, 0, 170, 0.5);\n --clut-color-77: rgba(170, 0, 170, 0.5);\n --clut-color-78: rgba(0, 170, 170, 0.5);\n --clut-color-79: rgba(170, 170, 170, 0.5);\n --clut-color-80: rgba(0, 0, 85, 0.5);\n --clut-color-81: rgba(0, 85, 0, 0.5);\n --clut-color-82: rgba(0, 85, 85, 0.5);\n --clut-color-83: rgba(0, 85, 170, 0.5);\n --clut-color-84: rgba(0, 85, 255, 0.5);\n --clut-color-85: rgba(0, 170, 85, 0.5);\n --clut-color-86: rgba(0, 170, 255, 0.5);\n --clut-color-87: rgba(0, 255, 85, 0.5);\n --clut-color-88: rgba(0, 255, 170, 0.5);\n --clut-color-89: rgba(85, 0, 0, 0.5);\n --clut-color-90: rgba(85, 0, 85, 0.5);\n --clut-color-91: rgba(85, 0, 170, 0.5);\n --clut-color-92: rgba(85, 0, 255, 0.5);\n --clut-color-93: rgba(85, 85, 0, 0.5);\n --clut-color-94: rgba(85, 85, 85, 0.5);\n --clut-color-95: rgba(85, 85, 170, 0.5);\n --clut-color-96: rgba(85, 85, 255, 0.5);\n --clut-color-97: rgba(85, 170, 0, 0.5);\n --clut-color-98: rgba(85, 170, 85, 0.5);\n --clut-color-99: rgba(85, 170, 170, 0.5);\n --clut-color-100: rgba(85, 170, 255, 0.5);\n --clut-color-101: rgba(85, 255, 0, 0.5);\n --clut-color-102: rgba(85, 255, 85, 0.5);\n --clut-color-103: rgba(85, 255, 170, 0.5);\n --clut-color-104: rgba(85, 255, 255, 0.5);\n --clut-color-105: rgba(170, 0, 85, 0.5);\n --clut-color-106: rgba(170, 0, 255, 0.5);\n --clut-color-107: rgba(170, 85, 0, 0.5);\n --clut-color-108: rgba(170, 85, 85, 0.5);\n --clut-color-109: rgba(170, 85, 170, 0.5);\n --clut-color-110: rgba(170, 85, 255, 0.5);\n --clut-color-111: rgba(170, 170, 85, 0.5);\n --clut-color-112: rgba(170, 170, 255, 0.5);\n --clut-color-113: rgba(170, 255, 0, 0.5);\n --clut-color-114: rgba(170, 255, 85, 0.5);\n --clut-color-115: rgba(170, 255, 170, 0.5);\n --clut-color-116: rgba(170, 255, 255, 0.5);\n --clut-color-117: rgba(255, 0, 85, 0.5);\n --clut-color-118: rgba(255, 0, 255, 0.5);\n --clut-color-119: rgba(255, 85, 0, 0.5);\n --clut-color-120: rgba(255, 85, 85, 0.5);\n --clut-color-121: rgba(255, 85, 170, 0.5);\n --clut-color-122: rgba(255, 85, 255, 0.5);\n --clut-color-123: rgba(255, 170, 0, 0.5);\n --clut-color-124: rgba(255, 170, 85, 0.5);\n --clut-color-125: rgba(255, 170, 170, 0.5);\n --clut-color-126: rgba(255, 170, 255, 0.5);\n --clut-color-127: rgba(255, 255, 85, 0.5);\n background-color: var(--clut-color-0);\n --background-color: var(--clut-color-0);\n --background-color-index: 0;\n}\n:where(div, p, span, a, input) {\n background-color: var(--clut-color-8);\n --background-color: var(--clut-color-8);\n --background-color-index: 8;\n}\n/* ?? これだとobjectが透過できなくなる */\n/* object { background-color : var(--clut-color-0) !important, --background-color: 0 !important;} */\n/* grayscale-color-index */\n:where(p, input) { --grayscale-color-index: 30 15; }\n\n/* reset UA CSS */\n:where(p) {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 0;\n margin-inline-end: 0;\n}\np {\n line-break: anywhere !important;\n}\nbody {\n padding: 0!important; /* NHK BS1とかbodyにpadding: 6pt;があって崩れる? */\n margin: 0!important;\n}\n\n:where(body) {\n font-family: "丸ゴシック", monospace;\n}\n\nobject[type="audio/X-arib-mpeg2-aac"] {\n visibility: hidden;\n}\n\nobject[type="image/X-arib-png"] {\n visibility: hidden !important;\n}\n\narib-style {\n display: none;\n}\n\narib-script {\n display: none;\n}\n\nbody[arib-loading] { display: none !important; }\n\n:where(html, bml) {\n line-height: 1; /* Firefox */\n --line-height: 1;\n --line-height-raw: normal;\n}\n\nhtml {\n position: absolute;\n top: 0px;\n left: 0px;\n /* タブは空白一文字分 (STD-B24 第二分冊(2/2) 付属2 5.3.2 表5-12) */\n tab-size: 1;\n}\n\n/*\n\n \n \n \n\n*/\n\n/*\nFirefoxだと上手く動かない?\nobject[type="image/jpeg"] {\n filter: url(\'data:image/svg+xml, #bt601bt709\');\n}\n*/\n\n/* 継承しない拡張特性の初期値 */\n:where(*) {\n --used-key-list: basic data-button;\n --border-left-color-index: 0;\n --border-right-color-index: 0;\n --border-top-color-index: 0;\n --border-bottom-color-index: 0;\n}\n\narib-bg {\n background-color: var(--background-color) !important; /* 全称セレクタ対策 */\n background-image: var(--background-image2) !important;\n width: 100% !important;\n height: 100% !important;\n position: absolute !important;\n left: 0px !important;\n top: 0px !important;\n}\n\narib-text, arib-cdata {\n display: inline !important;\n font: inherit !important;\n letter-spacing: inherit !important;\n text-align: inherit !important;\n line-height: inherit !important;\n visibility: unset !important;\n border: none !important;\n}\n\np, input {\n white-space: break-spaces !important;\n}\n\n',b='\n\n/* margin */\ndiv, p, pre, form, input, textarea, object, img { margin: 0 !important }\n/* padding */\ndiv, form, object, img { padding-top: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important; padding-left: 0 !important }\n/* border */\n:where(div, p, pre, form, input, textarea) { border-width: 0; border-top-color: transparent; border-right-color: transparent; border-bottom-color: transparent; border-left-color: transparent; }\nobject, img { border-width: 0 !important; border-style: none !important }\n/* display */\n/* html, */head, title, meta, script, link, bevent, beitem { display: none !important }\nbody, div, pre, form, input, textarea, object, img { display: block !important }\n:where(p) { display: block }\nbr, span, a { display: inline !important }\n/* position */\ndiv, p, pre, form, input, textarea, object, img { position: absolute !important }\nbr, span, a { position: static !important }\n/* top, left, width, height */\n:where(div, p, pre, form, input, textarea, object, img) { top: 0; left: 0; width: 0; height: 0 }\n/* z-index */\nbody, div, p, pre, br, span, a, form, input, textarea, object, img { z-index: auto !important }\n/* line-height */\n/* br, span, a { line-height: inherit !important } */\n/* visibility */\nbody { visibility: visible !important }\nspan, a { visibility: inherit !important }\n/* overflow */\ndiv, p, pre, form, input, textarea, object, img { overflow: hidden !important }\n/* color */\n:where(p, pre, input, textarea) { color: black; --color: black; }\n:where(span, a) { color: inherit }\n/* background-color */\nobject, img { background-color: transparent !important; --background-color: transparent !important; --background-color-inherit: transparent !important; }\n:where(body) { background-color: white; --background-color: white; --background-color-inherit: white; }\n/* background-repeat */\nbody { background-repeat: repeat !important }\n/* font-family */\np, pre, span, a, input, textarea { font-family: "丸ゴシック" !important }\n/* text-align */\n:where(p, input, textarea) { text-align: left }\n/* white-space */\n/* p, input { white-space: normal !important } */\npre, textarea { white-space: pre !important }\n/* resolution */\nbody { --resolution: 240x480 !important }\n/* marquee */\n:where(p) { ---wap-marquee-loop: 1; }\np { ---wap-marquee-dir: rtl !important }\n\n/* reset UA CSS */\n:where(p) {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 0;\n margin-inline-end: 0;\n}\np {\n line-break: anywhere !important;\n}\nbody {\n padding: 0!important; /* NHK BS1とかbodyにpadding: 6pt;があって崩れる? */\n margin: 0!important;\n}\n\n:where(body) {\n font-family: "丸ゴシック", monospace;\n}\n\narib-style {\n display: none;\n}\n\narib-script {\n display: none;\n}\n\nbody[arib-loading] { display: none !important; }\n\n:where(html, bml) {\n line-height: 1; /* Firefox */\n --line-height: 1;\n --line-height-raw: normal;\n}\n\nhtml {\n position: absolute;\n top: 0px;\n left: 0px;\n /* TR-B14 第三分冊 8.1.9.2 表8-1 */\n --small: 16px;\n --medium: 20px;\n --large: 30px;\n /* タブは空白一文字分 (TR-B14 第三分冊 7.7.3 注4) */\n tab-size: 1;\n --font-size: var(--medium);\n --font-size-raw: medium;\n}\n\n/* 継承しない拡張特性の初期値 */\n:where(*) {\n --used-key-list: basic;\n --background-color: ;\n}\n\narib-bg {\n background-color: var(--background-color-inherit) !important; /* 全称セレクタ対策 */\n background-image: var(--background-image2) !important;\n width: 100% !important;\n height: 100% !important;\n position: absolute !important;\n left: 0px !important;\n top: 0px !important;\n}\n\narib-text, arib-cdata {\n display: inline !important;\n font: inherit !important;\n letter-spacing: inherit !important;\n text-align: inherit !important;\n line-height: inherit !important;\n visibility: unset !important;\n border: none !important;\n}\n\narib-cdata {\n white-space: break-spaces !important;\n}\n\n:where(a[web-bml-state="focus"], a[web-bml-state="active"]) {\n /* background-color: var(--color) !important;\n color: var(--background-color-inherit) !important; */\n background-color: blue;\n color: white !important;\n outline: 1px blue dotted;\n outline-offset: -1px;\n}\n\n:where(p) {\n ---wap-marquee-speed: normal;\n ---wap-marquee-style: scroll;\n}\n\n:where(input, textarea) {\n ---wap-input-format: *M;\n}\n\n:where(html) {\n --background-color-inherit: white;\n}\n\ninput[web-bml-state="focus"], input[web-bml-state="active"] {\n background-color: #a3ceff !important;\n}\n\np, input {\n white-space: break-spaces !important;\n}\n\ntextarea {\n resize: none;\n}\n\nobject[web-bml-state="focus"], object[web-bml-state="active"], img[web-bml-state="focus"], img[web-bml-state="active"] {\n outline: 1px blue dotted;\n outline-offset: -1px;\n}\n\n',w=(0,A.gN)("content"),x=(0,A.Bd)("content"),S=(0,A.x7)("content"),C=(0,A.by)("content");var E;(function(t){t[t["Up"]=1]="Up",t[t["Down"]=2]="Down",t[t["Left"]=3]="Left",t[t["Right"]=4]="Right",t[t["Digit0"]=5]="Digit0",t[t["Digit1"]=6]="Digit1",t[t["Digit2"]=7]="Digit2",t[t["Digit3"]=8]="Digit3",t[t["Digit4"]=9]="Digit4",t[t["Digit5"]=10]="Digit5",t[t["Digit6"]=11]="Digit6",t[t["Digit7"]=12]="Digit7",t[t["Digit8"]=13]="Digit8",t[t["Digit9"]=14]="Digit9",t[t["Digit10"]=15]="Digit10",t[t["Digit11"]=16]="Digit11",t[t["Digit12"]=17]="Digit12",t[t["Enter"]=18]="Enter",t[t["Back"]=19]="Back",t[t["DataButton"]=20]="DataButton",t[t["BlueButton"]=21]="BlueButton",t[t["RedButton"]=22]="RedButton",t[t["GreenButton"]=23]="GreenButton",t[t["YellowButton"]=24]="YellowButton",t[t["DataButton1"]=25]="DataButton1",t[t["DataButton2"]=26]="DataButton2",t[t["Bookmark"]=100]="Bookmark",t[t["TVLink"]=100]="TVLink",t[t["Star"]=101]="Star",t[t["Hash"]=102]="Hash"})(E||(E={}));const k=new Map([[E.Up,"basic"],[E.Down,"basic"],[E.Left,"basic"],[E.Right,"basic"],[E.Enter,"basic"],[E.Back,"basic"],[E.BlueButton,"data-button"],[E.RedButton,"data-button"],[E.GreenButton,"data-button"],[E.YellowButton,"data-button"],[E.Bookmark,"data-button"],[E.Digit0,"numeric-tuning"],[E.Digit1,"numeric-tuning"],[E.Digit2,"numeric-tuning"],[E.Digit3,"numeric-tuning"],[E.Digit4,"numeric-tuning"],[E.Digit5,"numeric-tuning"],[E.Digit6,"numeric-tuning"],[E.Digit7,"numeric-tuning"],[E.Digit8,"numeric-tuning"],[E.Digit9,"numeric-tuning"],[E.Digit10,"numeric-tuning"],[E.Digit11,"numeric-tuning"],[E.Digit12,"numeric-tuning"]]),T=new Map([[E.Enter,"basic"],[E.Back,"basic"],[E.Digit0,"numeric-tuning"],[E.Digit1,"numeric-tuning"],[E.Digit2,"numeric-tuning"],[E.Digit3,"numeric-tuning"],[E.Digit4,"numeric-tuning"],[E.Digit5,"numeric-tuning"],[E.Digit6,"numeric-tuning"],[E.Digit7,"numeric-tuning"],[E.Digit8,"numeric-tuning"],[E.Digit9,"numeric-tuning"],[E.Star,"special-1"],[E.Hash,"special-1"],[E.TVLink,"special-2"]]),I=new Map([[E.Back,"X"],[E.BlueButton,"B"],[E.RedButton,"R"],[E.GreenButton,"G"],[E.YellowButton,"Y"],[E.DataButton1,"E"],[E.DataButton2,"F"]]);function _(t){switch(t){case"ArrowUp":return E.Up;case"ArrowDown":return E.Down;case"ArrowLeft":return E.Left;case"ArrowRight":return E.Right;case"0":return E.Digit0;case"1":return E.Digit1;case"2":return E.Digit2;case"3":return E.Digit3;case"4":return E.Digit4;case"5":return E.Digit5;case"6":return E.Digit6;case"7":return E.Digit7;case"8":return E.Digit8;case"9":return E.Digit9;case"Enter":case"Space":return E.Enter;case"Backspace":case"X":case"x":return E.Back;case"D":case"d":return E.DataButton;case"B":case"b":return E.BlueButton;case"R":case"r":return E.RedButton;case"G":case"g":return E.GreenButton;case"Y":case"y":return E.YellowButton;case"E":case"e":return E.DataButton1;case"F":case"f":return E.DataButton2;default:return-1}}function O(){return new Promise(((t,e)=>{requestAnimationFrame((e=>t()))}))}class B{constructor(t,e,n,i,r,s,o,a,c,u,d,h){this.fonts=[],this.loaded=!1,this._currentDateMode=0,this._context={},this.bmlDocument=t,this.documentElement=e,this.resources=n,this.eventQueue=i,this.eventDispatcher=r,this.interpreter=s,this.videoContainer=o,this.bmlEventTarget=a,this.indicator=c,this.videoPlaneModeEnabled=u,this.inputApplication=d,this.showErrorMessage=h??this.defaultShowErrorMessage.bind(this),this.documentElement.addEventListener("keydown",(t=>{if(t.altKey||t.ctrlKey||t.metaKey)return;const e=_(t.key);-1!=e&&(t.preventDefault(),this.processKeyDown(e))})),this.documentElement.addEventListener("keyup",(t=>{const e=_(t.key);-1!=e&&(t.altKey||t.ctrlKey||t.metaKey||t.preventDefault(),this.processKeyUp(e))})),this.resources.addEventListener("dataeventchanged",(async t=>{const{component:e,returnToEntryFlag:i}=t.detail;w("DataEventChanged",t.detail);const{moduleId:r,componentId:s}=this.resources.parseURLEx(this.resources.activeDocument);if(null==r||null==s)return;const o=e.componentId===n.startupComponentId&&i;(o||e.componentId===s)&&(this.eventQueue.queueGlobalAsyncEvent((async()=>{if(e.componentId===s){const t=this.documentElement.querySelectorAll('beitem[type="DataEventChanged"]');for(const n of Array.from(t)){const t=l.X.nodeToBMLNode(n,this.bmlDocument);if(!t.subscribe)continue;const i=n.getAttribute("onoccur");if(null!=i){if(this.eventDispatcher.setCurrentBeventEvent({type:"DataEventChanged",target:n,status:0===e.modules.size?1:0}),await this.eventQueue.executeEventHandler(i))return!0;this.eventDispatcher.resetCurrentEvent()}}this.resources.unlockModules()}return!(e.componentId!==s&&!o)&&(o&&this.resources.unlockModules("lockModuleOnMemory"),C("launch startup (DataEventChanged)"),this.launchStartup(),!0)})),this.eventQueue.processEventQueue())})),this.resources.addEventListener("moduleupdated",(t=>{const{componentId:e,moduleId:n}=t.detail;null==this.resources.activeDocument&&e===this.resources.startupComponentId&&n===this.resources.startupModuleId&&(this.loaded||(this.loaded=!0,this.resources.getProgramInfoAsync().then((t=>this.launchStartup()))))})),this.resources.addEventListener("componentupdated",(t=>{const{component:e}=t.detail;for(const n of this.documentElement.querySelectorAll('beitem[type="ModuleUpdated"][subscribe="subscribe"]')){const t=l.X.nodeToBMLNode(n,this.bmlDocument);t.internalDIIUpdated(e.componentId,e.modules,e.dataEventId)}})),this.resources.addEventListener("pmtupdated",(t=>{const{components:e,prevComponents:n}=t.detail,{componentId:i}=this.resources.parseURLEx(this.resources.activeDocument);for(const c of this.documentElement.querySelectorAll('beitem[type="ModuleUpdated"][subscribe="subscribe"]')){const t=l.X.nodeToBMLNode(c,this.bmlDocument);t.internalPMTUpdated(new Set(e.keys()))}if(null==i)return;if(null!=i&&!e.has(i))return this.eventQueue.queueGlobalAsyncEvent((async()=>(this.resources.unlockModules(),this.launchStartup(),!0))),void this.eventQueue.processEventQueue();const r=n.get(i)?.pid,s=e.get(i)?.pid,o=n.get(this.resources.startupComponentId)?.pid,a=e.get(this.resources.startupComponentId)?.pid;if(null!=r&&r!==s||null!=o&&o!==a){if(null==a)return void this.exitDocument();C("PID changed",r,s,o,a),this.eventQueue.queueGlobalAsyncEvent((async()=>(this.resources.unlockModules(),this.resources.clearCache(),this.launchStartup(),!0))),this.eventQueue.processEventQueue()}}))}decodeText(t){return(0,v.$)(this.resources.profile)(t)}set currentDateMode(t){this._currentDateMode=t}get currentDateMode(){return this._currentDateMode}getBody(){return this.documentElement.querySelector("body")}clipVideoPlane(t){const e=this.getBody();e.style.background="transparent",e.style.setProperty("background","transparent","important");const n=document.createElement("arib-bg");function i(t,e){let n=0,i=0,r=e;while(null!=r&&r!==t)n+=r.offsetLeft,i+=r.offsetTop,r=r.parentElement;return{left:n,top:i,right:n+e.clientWidth,bottom:i+e.clientHeight}}function r(t,e){if(t.left(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)===Node.DOCUMENT_POSITION_FOLLOWING));let o;const a=()=>{const e=this.getBody(),a=i(e,t),l=`polygon(0% 0%, 0% 100%, ${a.left}px 100%, ${a.left}px ${a.top}px, ${a.right}px ${a.top}px, ${a.right}px ${a.bottom}px, ${a.left}px ${a.bottom}px, ${a.left}px 100%, 100% 100%, 100% 0%)`;n.style.clipPath=l;for(const t of s){const n=i(e,t),s=r(a,n);null!=s?(s.left-=n.left,s.right-=n.left,s.top-=n.top,s.bottom-=n.top,t.style.clipPath=`polygon(0% 0%, 0% 100%, ${s.left}px 100%, ${s.left}px ${s.top}px, ${s.right}px ${s.top}px, ${s.right}px ${s.bottom}px, ${s.left}px ${s.bottom}px, ${s.left}px 100%, 100% 100%, 100% 0%)`):t.style.clipPath=""}null!=o&&a.left===o.left&&a.right===o.right&&a.top===o.top&&a.bottom===o.bottom||(o=a,this.bmlEventTarget.dispatchEvent(new CustomEvent("videochanged",{detail:{boundingRect:t.getBoundingClientRect(),clientRect:a}})))},l=new MutationObserver(a);function c(t){do{if(l.observe(t,{attributes:!0,attributeFilter:["style","web-bml-state"]}),null==t.parentNode)break;t=t.parentNode}while(t!==e)}c(t);for(const u of s)c(u);a()}}replaceTextCDATA(t,e){t.childNodes.forEach((t=>{t.nodeType!==Node.COMMENT_NODE&&(t.nodeType===Node.TEXT_NODE||t.nodeType===Node.CDATA_SECTION_NODE?e.push(t):"object"!==t.nodeName.toLowerCase()&&this.replaceTextCDATA(t,e))}))}async loadDocumentToDOM(t){null==this.uaStyle&&(this.uaStyle=document.createElement("style"),this.uaStyle.textContent=this.resources.profile===i.N.TrProfileC?b:y,this.documentElement.parentNode?.prepend(this.uaStyle));const e=(new DOMParser).parseFromString('',"application/xhtml+xml"),n=e.createElement("html");n.innerHTML=m(t,this.resources.profile===i.N.TrProfileC);const r=Array.from(this.documentElement.childNodes).filter((t=>"body"===t.nodeName.toLowerCase()||"head"===t.nodeName.toLowerCase())),s=n.querySelector('[arib-type="video/X-arib-mpeg2"]'),a=this.getBody(),c=n.querySelector("body");a?.setAttribute("arib-loading","arib-loading"),c.setAttribute("arib-loading","arib-loading");for(const i of Array.from(n.querySelectorAll("arib-style, arib-link")))if("arib-link"===i.nodeName.toLowerCase()){const t=i.getAttribute("href");if(null!=t){const e=document.createElement("style"),n=await this.resources.fetchResourceAsync(t);null!=n&&(e.textContent=await(0,o.es)(this.decodeText(n.data),{inline:!1,clutReader:this.getCLUT.bind(this),convertUrl:this.convertCSSUrl.bind(this)}),i.parentElement?.appendChild(e))}}else if(i.textContent){const t=document.createElement("style");t.textContent=await(0,o.es)(i.textContent,{inline:!1,clutReader:this.getCLUT.bind(this),convertUrl:this.convertCSSUrl.bind(this)}),i.parentElement?.appendChild(t)}for(const i of Array.from(n.querySelectorAll("[style]"))){const t=i.getAttribute("style");t&&i.setAttribute("style",await(0,o.es)(t,{inline:!0,clutReader:this.getCLUT.bind(this),convertUrl:this.convertCSSUrl.bind(this)}))}this.documentElement.append(...Array.from(n.children)),null!=s&&s.appendChild(this.videoContainer),c.removeAttribute("arib-loading");for(const i of r)i.remove();const u=[];this.replaceTextCDATA(c,u);let d=!1;for(const i of u){const t=l.X.nodeToBMLNode(i,this.bmlDocument);t.internalReflow()&&(d=!0)}if(d){const t=new MutationObserver((t=>{for(const e of t)e.target.querySelectorAll("arib-text, arib-cdata").forEach((t=>{const e=l.X.nodeToBMLNode(t,this.bmlDocument);e.internalReflow()}))}));t.observe(c,{attributeFilter:["style","web-bml-state"],attributes:!0,subtree:!0})}this.videoPlaneModeEnabled&&this.clipVideoPlane(s)}focusHelper(t){if(null==t)return;const e=l.X.htmlElementToBMLHTMLElement(t,this.bmlDocument);e&&e.focus&&e.focus()}unloadAllDRCS(){for(const t of this.fonts)document.fonts.delete(t);this.fonts.length=0}get context(){return this._context}async unloadDocument(){this.interpreter.resetStack();const t=this.getBody()?.getAttribute("arib-onunload");if(null!=t){if(this.eventDispatcher.setCurrentEvent({target:null,type:"unload"}),await this.eventQueue.executeEventHandler(t))return C("onunload"),!0;this.eventDispatcher.resetCurrentEvent()}this.inputApplication?.cancel("unload"),this.interpreter.reset(),this.currentDateMode=0,this.keyProcessStatus=void 0,this.npt=void 0}async exitDocument(){await this.unloadDocument(),this.eventQueue.reset(),this.unloadAllDRCS(),this.resources.unlockModules(),this._context={from:this.resources.activeDocument,to:null},this.resources.activeDocument=null,this.bmlEventTarget.dispatchEvent(new CustomEvent("invisible",{detail:!0}));const t=Array.from(this.documentElement.childNodes).filter((t=>"body"===t.nodeName.toLowerCase()||"head"===t.nodeName.toLowerCase()));for(const e of t)e.remove();this.loaded=!1}async quitDocument(){this.resources.unlockModules(),await this.launchStartup()}fail(t,e,n){return this.showErrorMessage(t,e,n),this.quitDocument()}isFocusable(t){if(!l.X.isFocusable(t))return!1;if(this.resources.profile===i.N.TrProfileC){const e="a"===t.nodeName.toLowerCase()||"input"===t.nodeName.toLowerCase()||"textarea"===t.nodeName.toLowerCase()||t.hasAttribute("onclick")||t.hasAttribute("onfocus")||t.hasAttribute("onblur")||t.hasAttribute("onkeydown")||t.hasAttribute("onkeyup");if(!e)return!1;const{width:n,height:i}=t.getBoundingClientRect();if(0===n||0===i)return!1}return!0}focusFirstNavIndex(){for(let t=0;;t++){const e=this.findNavIndex(t);if(null==e)break;if(this.isFocusable(e)){this.focusHelper(e);break}}}shimCProfileNavigation(){this.resources.profile===i.N.TrProfileC&&this.documentElement.querySelectorAll("a, input, textarea, [onclick], [onfocus], [onblur], [onkeydown], [onkeyup]").forEach(((t,e)=>{const n=t;n.style.setProperty("--nav-index",`${e}`),0!==e&&(n.style.setProperty("--nav-up",""+(e-1)),n.style.setProperty("--nav-left",""+(e-1))),n.style.setProperty("--nav-down",`${e+1}`),n.style.setProperty("--nav-right",`${e+1}`)}))}async loadDocument(t,e){await this.unloadDocument(),this._context={from:this.resources.activeDocument,to:e},this.bmlDocument._currentFocus=null;const{componentId:n}=this.resources.parseURLEx(e),{componentId:r}=this.resources.parseURLEx(this.resources.activeDocument);r!==n&&this.resources.unlockModules("lockModuleOnMemory"),this.resources.activeDocument=e,await O(),await this.loadDocumentToDOM(this.decodeText(t.data)),this.loadObjects(),this.eventQueue.reset(),this.unloadAllDRCS();let s=960,o=540;const a=this.getBody(),c=l.X.nodeToBMLNode(a,this.bmlDocument),u=window.getComputedStyle(a),d=u.getPropertyValue("--resolution").trim(),h=u.getPropertyValue("--display-aspect-ratio").trim();let p=16,f=9;function m(t){switch(t){case i.N.TrProfileA:return"A";case i.N.TrProfileC:return"C";case i.N.BS:return"BS";case i.N.CS:return"CS";default:return""}}"720x480"===d?"4v3"===h?([s,o]=[720,480],p=4,f=3):[s,o]=[720,480]:"240x480"===d&&([s,o]=[240,480],p=1,f=2),this.bmlEventTarget.dispatchEvent(new CustomEvent("load",{detail:{resolution:{width:s,height:o},displayAspectRatio:{numerator:p,denominator:f},profile:m(this.resources.profile)}})),a.style.maxWidth=s+"px",a.style.minWidth=s+"px",a.style.maxHeight=o+"px",a.style.minHeight=o+"px",c.invisible=c.invisible;const g=u.getPropertyValue("--used-key-list");this.bmlEventTarget.dispatchEvent(new CustomEvent("usedkeylistchanged",{detail:{usedKeyList:new Set(g.split(" ").filter((t=>"basic"===t||"numeric-tuning"===t||"data-button"===t||"special-1"===t||"special-2"===t)))}})),this.eventQueue.lockSyncEventQueue();let v=!1,A=0;try{this.resources.profile===i.N.TrProfileC?(this.shimCProfileNavigation(),this.focusFirstNavIndex()):this.focusHelper(this.findNavIndex(0)),this.eventDispatcher.resetCurrentEvent();for(const e of Array.from(this.documentElement.querySelectorAll("arib-script"))){const t=e.getAttribute("src");if(t){const e=await this.resources.fetchResourceAsync(t);if(null!==e&&(v=await this.interpreter.addScript(this.decodeText(e.data),t)))return!0}else if(null!=e.textContent&&(A++,v=await this.interpreter.addScript(e.textContent,`${this.resources.activeDocument??""}[${A}]`)))return!0}const t=this.getBody()?.getAttribute("arib-onload");if(null!=t){if(w("START ONLOAD"),this.eventDispatcher.setCurrentEvent({target:null,type:"load"}),v=await this.eventQueue.executeEventHandler(t))return!0;this.eventDispatcher.resetCurrentEvent(),w("END ONLOAD")}for(const e of this.documentElement.querySelectorAll('beitem[subscribe="subscribe"]')){const t=l.X.nodeToBMLNode(e,this.bmlDocument);t.subscribe=t.subscribe}}finally{v||this.eventQueue.unlockSyncEventQueue()}return w("START PROC EVQ"),!!await this.eventQueue.processEventQueue()||(w("END PROC EVQ"),this.indicator?.setUrl(this.resources.activeDocument.replace(/(^https?:\/\/)[^/]+/,((t,e)=>e+"…")),!1),!1)}processTimerEvent(){const t=this.documentElement.querySelectorAll('beitem[type="TimerFired"]');t.forEach((t=>{const e=l.X.nodeToBMLNode(t,this.bmlDocument);if(!e.subscribe)return;if(e.internalTimerFired)return;const n=e.timeValue;if("absolute"===e.timeMode||"origAbsolute"===e.timeMode){if(14!==n.length)return;const i=Number.parseInt(n.substring(0,4)),r=Number.parseInt(n.substring(4,6)),s=Number.parseInt(n.substring(6,8)),o=Number.parseInt(n.substring(8,10)),a=Number.parseInt(n.substring(10,12)),l=Number.parseInt(n.substring(12,14)),c=new Date(i,r-1,s,o,a,l),u=c.getTime();null!=this.resources.currentTimeUnixMillis&&u<=this.resources.currentTimeUnixMillis&&(e.internalTimerFired=!0,this.eventDispatcher.dispatchTimerFiredEvent(0,t))}else if("NPT"===e.timeMode){const i=Number.parseInt(n);if(Number.isNaN(i)||null==this.npt)return;const r=this.getNPT90kHz();if(null==r)return;i<=r/90&&(e.internalTimerFired=!0,this.eventDispatcher.dispatchTimerFiredEvent(0,t))}}))}launchDocument(t,e){return this.launchDocumentAsync(t,e),NaN}async launchStartup(){const t=`/${this.resources.startupComponentId.toString(16).padStart(2,"0")}/${this.resources.startupModuleId.toString(16).padStart(4,"0")}`;return await this.resources.fetchResourceAsync(t),this.resources.fetchLockedResource(t+"/startup.bml")?(await this.launchDocumentAsync(t+"/startup.bml"),!0):this.resources.fetchLockedResource(t)?(await this.launchDocumentAsync(t),!0):(this.exitDocument(),!1)}async launchDocumentAsync(t,e){const n=e?.withLink??!1;x(`%claunchDocument(${t})`,"font-size: 1.5em"),this.eventQueue.discard();const{component:r,module:s,filename:o}=this.resources.parseURL(t),a=Number.parseInt(r??"",16),l=Number.parseInt(s??"",16);let c;if(Number.isInteger(a)&&Number.isInteger(l))c=null!=o?`/${a.toString(16).padStart(2,"0")}/${l.toString(16).padStart(4,"0")}/${o}`:`/${a.toString(16).padStart(2,"0")}/${l.toString(16).padStart(4,"0")}`;else{const e=t.startsWith("http://")||t.startsWith("https://");if(e&&(!this.resources.isInternetContent||this.resources.profile===i.N.TrProfileC&&n))this.resources.setBaseURIDirectory(t),c=t;else{if(null==this.resources.activeDocument||!this.resources.isInternetContent)return C("failed to fetch document",t),await this.quitDocument(),NaN;if(!this.resources.checkBaseURIDirectory(t))return C("base URI directory violation"),await this.fail("エラー","ベースURIディレクトリエラー","E402"),NaN;c=new URL(t,this.resources.activeDocument).toString()}this.resources.invalidateRemoteCache(t)}this.indicator?.setUrl(c.replace(/(^https?:\/\/)[^/]+/,((t,e)=>e+"…")),!0);const u=await this.resources.fetchResourceAsync(t);if(null==u)return c.startsWith("http")&&this.fail("ネットワークエラー","文書の取得に失敗しました","E400"),C("NOT FOUND"),await this.quitDocument(),NaN;const d=this.resources.activeDocument;return await this.loadDocument(u,c),w("return ",d,t),NaN}findNavIndex(t){return Array.from(this.documentElement.querySelectorAll("*")).find((e=>parseInt(window.getComputedStyle(e).getPropertyValue("--nav-index"))==t))}processKeyDown(t){if(t===E.DataButton)return void this.eventDispatcher.dispatchDataButtonPressedEvent();if(null!=this.keyProcessStatus)return;const e={keyCode:t,isAccessKey:!1};this.keyProcessStatus=e;let n=this.bmlDocument.currentFocus?.["node"];if(this.resources.profile===i.N.TrProfileC&&(t==E.Left||t==E.Right||t==E.Up||t==E.Down))return null==n?this.focusFirstNavIndex():this.focusNextNavIndex(t,n),void this.eventQueue.processEventQueue();if(n instanceof HTMLInputElement){const e=n.getAttribute("inputmode");if("direct"!==e&&"indirect"!==e)if(t>=E.Digit0&&t<=E.Digit9){const e=(t-E.Digit0).toString();n.maxLength>n.value.length&&(n.value+=e)}else t===E.Back&&n.value.length>=1&&(n.value=n.value.substring(0,n.value.length-1))}const r=this.getBody();if(null==r)return;const s=window.getComputedStyle(r),o=s.getPropertyValue("--used-key-list").split(" ").filter((t=>t.length));if(o.length&&"none"===o[0])return;const a=(this.resources.profile===i.N.TrProfileC?T:k).get(t);if(null==a)return;if(0===o.length){if("basic"!==a&&"data-button"!==a)return}else if(!o.some((t=>t===a)))return;n=this.bmlDocument.currentFocus?.["node"];const c=n;this.eventQueue.queueAsyncEvent((async()=>{const r=c?.getAttribute("onkeydown");if(null!=c&&r){this.eventDispatcher.setCurrentIntrinsicEvent({keyCode:t,type:"keydown",target:c});let e=!1;try{if(this.eventQueue.lockSyncEventQueue(),e=await this.eventQueue.executeEventHandler(r))return!0}finally{e||this.eventQueue.unlockSyncEventQueue()}this.eventDispatcher.resetCurrentEvent()}const s=I.get(t);if(null!=s){const n=this.documentElement.querySelector(`[accesskey="${s}"]`);if(null!=n&&this.isFocusable(n)){this.focusHelper(n),S("accesskey is half implemented.");const i=n.getAttribute("onkeyup");if(null!=i){this.eventDispatcher.setCurrentIntrinsicEvent({keyCode:t,type:"keyup",target:n});let e=!1;try{if(this.eventQueue.lockSyncEventQueue(),e=await this.eventQueue.executeEventHandler(i))return!0}finally{e||this.eventQueue.unlockSyncEventQueue()}this.eventDispatcher.resetCurrentEvent()}const r=n.getAttribute("onkeydown");if(t=E.Enter,null!=r){this.eventDispatcher.setCurrentIntrinsicEvent({keyCode:t,type:"keydown",target:n});let e=!1;try{if(this.eventQueue.lockSyncEventQueue(),e=await this.eventQueue.executeEventHandler(r))return!0}finally{e||this.eventQueue.unlockSyncEventQueue()}this.eventDispatcher.resetCurrentEvent()}e.isAccessKey=!0}}n=this.bmlDocument.currentFocus?.["node"],n&&this.focusNextNavIndex(t,n);const o=this.bmlDocument.currentFocus;if(t==E.Enter&&o){if(n=o["node"],o.internalSetActive(!0),this.eventQueue.queueSyncEvent({type:"click",target:n}),this.bmlDocument.currentFocus instanceof l.X.BMLInputElement){const t=n.getAttribute("inputmode");("indirect"===t||this.resources.profile===i.N.TrProfileC)&&this.bmlDocument.currentFocus.internalLaunchInputApplication()}if(o instanceof l.X.BMLAnchorElement&&""!=o.href)if(o.href.startsWith("#"))this.focusFragment(o.href);else if(this.launchDocument(o.href))return!0}return!1})),this.eventQueue.processEventQueue()}focusNextNavIndex(t,e){let n="",i=window.getComputedStyle(e);while(1){t==E.Left?n=i.getPropertyValue("--nav-left"):t==E.Right?n=i.getPropertyValue("--nav-right"):t==E.Up?n=i.getPropertyValue("--nav-up"):t==E.Down&&(n=i.getPropertyValue("--nav-down"));const e=parseInt(n);if(Number.isFinite(e)&&e>=0&&e<=32767){const t=this.findNavIndex(e);if(null!=t){if(i=window.getComputedStyle(t),!this.isFocusable(t))continue;this.focusHelper(t)}}break}}focusFragment(t){t.startsWith("#")&&(t=t.substring(1));const e=this.bmlDocument.getElementById(t)?.["node"];if(null!=e)if(this.isFocusable(e))this.focusHelper(e);else{const t=[...this.documentElement.querySelectorAll("*")],n=t.indexOf(e);for(const e of t.slice(n+1).concat(t.slice(0,n).reverse()))if(e instanceof HTMLElement&&this.isFocusable(e))return void this.focusHelper(e)}}processKeyUp(t){t!==E.DataButton&&(this.eventQueue.queueAsyncEvent((async()=>{const e=this.keyProcessStatus;if(e?.keyCode!==t)return!1;this.keyProcessStatus=void 0;const n=this.bmlDocument.currentFocus;if(null==n)return!1;const i=n["node"],r=e.isAccessKey?E.Enter:t;r===E.Enter&&n.internalSetFocus(!0);const s=this.getBody();if(null==s)return!1;const o=window.getComputedStyle(s),a=o.getPropertyValue("--used-key-list").split(" ").filter((t=>t.length));if(a.length&&"none"===a[0])return!1;const l=k.get(r);if(null==l)return!1;if(0===a.length){if("basic"!==l&&"data-button"!==l)return!1}else if(!a.some((t=>t===l)))return!1;const c=i.getAttribute("onkeyup");if(c){this.eventDispatcher.setCurrentIntrinsicEvent({keyCode:r,type:"keyup",target:i});let t=!1;try{if(this.eventQueue.lockSyncEventQueue(),t=await this.eventQueue.executeEventHandler(c))return!0}finally{t||this.eventQueue.unlockSyncEventQueue()}this.eventDispatcher.resetCurrentEvent()}return!1})),this.eventQueue.processEventQueue())}clutToDecls(t){const e=[];let n=0;for(const i of t){const t={type:"declaration",property:"--clut-color-"+n,value:`rgba(${i[0]},${i[1]},${i[2]},${i[3]/255})`};e.push(t),n++}return e}async getCLUT(t){const e=await this.resources.fetchResourceAsync(t);let n=r.c;return e?.data&&(n=(0,s.b)(a.Buffer.from(e.data))),this.clutToDecls(n)}async convertCSSUrl(t){const e=await this.resources.fetchResourceAsync(t);if(!e)return t;let n=e.blobUrl.get("BT.709");if(null!=n)return n.blobUrl;const i=await globalThis.createImageBitmap(new Blob([e.data]));return n=await(0,g.d)(i),e.blobUrl.set("BT.709",n),n.blobUrl}loadObjects(){this.documentElement.querySelectorAll("object").forEach((t=>{const e=t.getAttribute("arib-data");l.X.nodeToBMLNode(t,this.bmlDocument).data=e})),this.resources.profile===i.N.TrProfileC&&this.documentElement.querySelectorAll("img").forEach((t=>{const e=t.getAttribute("arib-src");l.X.nodeToBMLNode(t,this.bmlDocument).src=e}))}getNPT90kHz(){if(null==this.npt||null==this.pcrBase)return null;const t=this.npt.stcReference,e=this.npt.nptReference,n=this.pcrBase,i=3888e6,r=3888e6,s=8589934591;return n>t&&n-t<=r||nt&&t+s-n<=i||n"nptReference"===t.type));if(null!=this.pcrBase&&null!=i&&(null!=this.npt||i.STCReference<=this.pcrBase)){const r=null==this.npt||this.npt.nptReference!==i.NPTReference||this.npt.stcReference!==i.STCReference||this.npt.scaleDenominator!==i.scaleDenominator||this.npt.scaleNumerator!==i.scaleNumerator;r&&(this.npt={nptReference:i.NPTReference,stcReference:i.STCReference,scaleDenominator:i.scaleDenominator,scaleNumerator:i.scaleNumerator},w("NPTReferred",this.npt));const s=this.documentElement.querySelectorAll('beitem[type="NPTReferred"][subscribe="subscribe"]');for(const i of Array.from(s)){const s=l.X.nodeToBMLNode(i,this.bmlDocument);if(!s.subscribe)continue;if(!r&&s.internalNPTReferred)continue;const o=s.esRef;let a=e;if(null!=o){const t=this.resources.parseURLEx(o).componentId;null!=t&&(a=t)}if(a!==t.componentId)continue;s.internalNPTReferred=!0;const c=i.getAttribute("onoccur");c&&(this.eventQueue.queueAsyncEvent((async()=>(this.eventDispatcher.setCurrentBeventEvent({type:"NPTReferred",target:i,status:0,esRef:o??"/"+a.toString(16).padStart(2,"0")}),!!await this.eventQueue.executeEventHandler(c)||(this.eventDispatcher.resetCurrentEvent(),!1)))),n=!0)}}const r=this.documentElement.querySelectorAll('beitem[type="EventMessageFired"][subscribe="subscribe"]');r.forEach((i=>{const r=l.X.nodeToBMLNode(i,this.bmlDocument);if(!r.subscribe)return;const s=r.esRef,o=r.messageGroupId,a=r.messageId,c=r.messageVersion,u=i.getAttribute("onoccur");if(!u)return;let d=e;if(null!=s){const t=this.resources.parseURLEx(s).componentId;null!=t&&(d=t)}if(d===t.componentId)for(const e of t.events){if("nptEvent"===e.type){const t=this.getNPT90kHz();if(null==t||e.eventMessageNPT>t)continue}else if("immediateEvent"!==e.type)continue;if(e.eventMessageGroupId!==o)continue;if(0===e.eventMessageGroupId&&this.resources.currentDataEventId!==t.dataEventId)continue;const l=e.eventMessageId>>8,h=255&e.eventMessageId;if(255!==a&&a!==l)continue;if(255!==c&&c!==h)continue;if(null==r.internalMessageVersion&&(r.internalMessageVersion=new Map),r.internalMessageVersion.get(l)===h)continue;r.internalMessageVersion.set(l,h);const p=this.decodeText(Uint8Array.from(e.privateDataByte));w("EventMessageFired",l,h,p),this.eventQueue.queueAsyncEvent((async()=>(this.eventDispatcher.setCurrentBeventEvent({type:"EventMessageFired",target:i,status:0,privateData:p,esRef:s??"/"+d.toString(16).padStart(2,"0"),messageId:l,messageVersion:h,messageGroupId:e.eventMessageGroupId}),!!await this.eventQueue.executeEventHandler(u)||(this.eventDispatcher.resetCurrentEvent(),!1)))),n=!0}})),n&&this.eventQueue.processEventQueue()}}addDRCSFont(t){this.fonts.push(t),document.fonts.add(t)}get invisible(){const t=this.getBody();if(null!=t)return l.X.nodeToBMLNode(t,this.bmlDocument).invisible}defaultShowErrorMessage(t,e,n){const i=document.createElement("div");this.documentElement.parentNode?.append(i);const r=i.attachShadow({mode:"closed"}),s=document.createElement("dialog");r.appendChild(s);const o=document.createElement("h3"),a=document.createElement("p");o.textContent=t,a.textContent=null!=n?`${e} (${n})`:e,o.style.whiteSpace="pre-wrap",a.style.whiteSpace="pre-wrap",o.style.overflowWrap="break-word",a.style.overflowWrap="break-word",s.append(o,a),s.showModal(),window.setTimeout((()=>{s.close(),i.remove()}),5e3)}}},21645:function(t,e,n){"use strict";n.d(e,{c:function(){return i}});const i=[[0,0,0,255],[255,0,0,255],[0,255,0,255],[255,255,0,255],[0,0,255,255],[255,0,255,255],[0,255,255,255],[255,255,255,255],[0,0,0,0],[170,0,0,255],[0,170,0,255],[170,170,0,255],[0,0,170,255],[170,0,170,255],[0,170,170,255],[170,170,170,255],[0,0,85,255],[0,85,0,255],[0,85,85,255],[0,85,170,255],[0,85,255,255],[0,170,85,255],[0,170,255,255],[0,255,85,255],[0,255,170,255],[85,0,0,255],[85,0,85,255],[85,0,170,255],[85,0,255,255],[85,85,0,255],[85,85,85,255],[85,85,170,255],[85,85,255,255],[85,170,0,255],[85,170,85,255],[85,170,170,255],[85,170,255,255],[85,255,0,255],[85,255,85,255],[85,255,170,255],[85,255,255,255],[170,0,85,255],[170,0,255,255],[170,85,0,255],[170,85,85,255],[170,85,170,255],[170,85,255,255],[170,170,85,255],[170,170,255,255],[170,255,0,255],[170,255,85,255],[170,255,170,255],[170,255,255,255],[255,0,85,255],[255,0,255,255],[255,85,0,255],[255,85,85,255],[255,85,170,255],[255,85,255,255],[255,170,0,255],[255,170,85,255],[255,170,170,255],[255,170,255,255],[255,255,85,255],[255,255,255,255],[0,0,0,128],[255,0,0,128],[0,255,0,128],[255,255,0,128],[0,0,255,128],[255,0,255,128],[0,255,255,128],[255,255,255,128],[170,0,0,128],[0,170,0,128],[170,170,0,128],[0,0,170,128],[170,0,170,128],[0,170,170,128],[170,170,170,128],[0,0,85,128],[0,85,0,128],[0,85,85,128],[0,85,170,128],[0,85,255,128],[0,170,85,128],[0,170,255,128],[0,255,85,128],[0,255,170,128],[85,0,0,128],[85,0,85,128],[85,0,170,128],[85,0,255,128],[85,85,0,128],[85,85,85,128],[85,85,170,128],[85,85,255,128],[85,170,0,128],[85,170,85,128],[85,170,170,128],[85,170,255,128],[85,255,0,128],[85,255,85,128],[85,255,170,128],[85,255,255,128],[170,0,85,128],[170,0,255,128],[170,85,0,128],[170,85,85,128],[170,85,170,128],[170,85,255,128],[170,170,85,128],[170,170,255,128],[170,255,0,128],[170,255,85,128],[170,255,170,128],[170,255,255,128],[255,0,85,128],[255,0,255,128],[255,85,0,128],[255,85,85,128],[255,85,170,128],[255,85,255,128],[255,170,0,128],[255,170,85,128],[255,170,170,128],[255,170,255,128],[255,255,85,128]]},60774:function(t,e,n){"use strict";n.d(e,{OZ:function(){return s},pJ:function(){return a},rh:function(){return o}});n(23767),n(8585),n(68696);var i=n(45254),r=n(50646);function s(t){if(0===t.length)return"";const e="�";let n="";for(let r=0;r=161&&t[r]<=254){const s=t[r]-160;if(r++,r>=t.length){n+=e;break}if(t[r]<161||t[r]>254){n+=e;continue}const o=t[r]-160,a=i.I[94*(s-1)+(o-1)];if("number"===typeof a)n+=a>=0?String.fromCharCode(a):e;else for(const t of a)n+=String.fromCharCode(t)}else t[r]<128?n+=String.fromCharCode(t[r]):142===t[r]?(n+=e,r++):143===t[r]?(n+=e,r+=2):n+=e;return n}function o(t){const e=new Uint8Array(2*t.length);let n=0;for(let i=0;i=256?(e[n++]=a>>8,e[n++]=255&a):e[n++]=a}return e.subarray(0,n)}function a(t,e){if(2*t.lengthe)return t.substring(0,i);n+=s}return t}},22783:function(t,e,n){"use strict";n.d(e,{D:function(){return r},d:function(){return s}});var i=n(69809);class r{constructor(t,e,n,i){this.baseDeclarationMap=t,this.declarationMap=e,this.computedPropertyGetter=n,this.propertySetter=i}setProperty(t,e){this.declarationMap.delete(t),this.declarationMap.set(t,e),this.propertySetter(t,e)}getPropertyValue(t){const e=this.declarationMap.get(t)??this.baseDeclarationMap.get(t);return null==e||"inherit"===e.toLowerCase().trim()?this.computedPropertyGetter(t):e}}class s{constructor(t,e,n){this.declaration=t,this.node=e,this.eventTarget=n}getColorIndexVariable(t,e){const n=this.declaration.getPropertyValue("--"+t).trim();return""!==n?n:(0,i.f6)(this.declaration.getPropertyValue(e))??""}setColorIndexVariable(t,e,n){this.declaration.setProperty("--"+t,n),"background-color"===e&&(this.declaration.setProperty("--background-color",(0,i.Si)(n)??""),"transparent"===this.declaration.getPropertyValue("background-color"))||this.declaration.setProperty(e,(0,i.Si)(n)??"")}get paddingTop(){return this.declaration.getPropertyValue("padding-top")}get paddingRight(){return this.declaration.getPropertyValue("padding-right")}get paddingBottom(){return this.declaration.getPropertyValue("padding-bottom")}get paddingLeft(){return this.declaration.getPropertyValue("padding-left")}get borderWidth(){return this.declaration.getPropertyValue("border-width")}get borderStyle(){return this.declaration.getPropertyValue("border-style")}get left(){return this.declaration.getPropertyValue("left")}set left(t){this.declaration.setProperty("left",String(t))}get top(){return this.declaration.getPropertyValue("top")}set top(t){this.declaration.setProperty("top",String(t))}get width(){return this.declaration.getPropertyValue("width")}set width(t){this.declaration.setProperty("width",String(t))}get height(){return this.declaration.getPropertyValue("height")}set height(t){this.declaration.setProperty("height",String(t))}get lineHeight(){return this.declaration.getPropertyValue("--line-height-raw").trim()}get visibility(){return this.declaration.getPropertyValue("visibility")}set visibility(t){this.declaration.setProperty("visibility",String(t))}get fontFamily(){return this.declaration.getPropertyValue("font-family")}set fontFamily(t){this.declaration.setProperty("font-family",String(t))}get fontSize(){const t=this.declaration.getPropertyValue("--font-size-raw");return t.trim()}set fontSize(t){this.declaration.setProperty("--font-size-raw",String(t)),this.declaration.setProperty("--font-size",(0,i.oL)(String(t)))}get fontWeight(){return this.declaration.getPropertyValue("font-weight")}set fontWeight(t){this.declaration.setProperty("font-weight",String(t))}get textAlign(){return this.declaration.getPropertyValue("text-align")}get letterSpacing(){return this.declaration.getPropertyValue("letter-spacing")}get borderTopColorIndex(){return this.getColorIndexVariable("border-top-color-index","border-top-color")}set borderTopColorIndex(t){this.setColorIndexVariable("border-top-color-index","border-top-color",String(t))}get borderRightColorIndex(){return this.getColorIndexVariable("border-right-color-index","border-right-color")}set borderRightColorIndex(t){this.setColorIndexVariable("border-right-color-index","border-right-color",String(t))}get borderLeftColorIndex(){return this.getColorIndexVariable("border-left-color-index","border-left-color")}set borderLeftColorIndex(t){this.setColorIndexVariable("border-left-color-index","border-left-color",String(t))}get borderBottomColorIndex(){return this.getColorIndexVariable("border-bottom-color-index","border-bottom-color")}set borderBottomColorIndex(t){this.setColorIndexVariable("border-bottom-color-index","border-bottom-color",String(t))}get backgroundColorIndex(){return this.getColorIndexVariable("background-color-index","background-color")}set backgroundColorIndex(t){this.setColorIndexVariable("background-color-index","background-color",String(t))}get colorIndex(){return this.getColorIndexVariable("color-index","color")}set colorIndex(t){this.setColorIndexVariable("color-index","color",String(t))}get grayscaleColorIndex(){return this.declaration.getPropertyValue("--grayscale-color-index").trim()}set grayscaleColorIndex(t){this.declaration.setProperty("--grayscale-color-index",String(t))}get clut(){return this.declaration.getPropertyValue("--clut").trim()}get resolution(){return this.declaration.getPropertyValue("--resolution").trim()}get displayAspectRatio(){return this.declaration.getPropertyValue("--display-aspect-ratio").trim()}get navIndex(){return this.declaration.getPropertyValue("--nav-index").trim()}get navUp(){return this.declaration.getPropertyValue("--nav-up").trim()}get navDown(){return this.declaration.getPropertyValue("--nav-down").trim()}get navLeft(){return this.declaration.getPropertyValue("--nav-left").trim()}get navRight(){return this.declaration.getPropertyValue("--nav-right").trim()}get usedKeyList(){return this.declaration.getPropertyValue("--used-key-list").trim()}set usedKeyList(t){t=String(t),this.declaration.setProperty("--used-key-list",t),this.node instanceof HTMLBodyElement&&this.eventTarget.dispatchEvent(new CustomEvent("usedkeylistchanged",{detail:{usedKeyList:new Set(t.split(" ").filter((t=>"basic"===t||"numeric-tuning"===t||"data-button"===t||"special-1"===t||"special-2"===t)))}}))}get borderTopColor(){return this.declaration.getPropertyValue("border-top-color")}set borderTopColor(t){this.declaration.setProperty("border-top-color",String(t))}get borderRightColor(){return this.declaration.getPropertyValue("border-right-color")}set borderRightColor(t){this.declaration.setProperty("border-right-color",String(t))}get borderBottomColor(){return this.declaration.getPropertyValue("border-bottom-color")}set borderBottomColor(t){this.declaration.setProperty("border-bottom-color",String(t))}get borderLeftColor(){return this.declaration.getPropertyValue("border-left-color")}set borderLeftColor(t){this.declaration.setProperty("border-left-color",String(t))}get backgroundColor(){return this.declaration.getPropertyValue("--background-color").trim()}set backgroundColor(t){t=String(t),this.declaration.setProperty("--background-color",t),this.declaration.setProperty("--background-color-inherit",t),this.declaration.setProperty("background-color",t)}get color(){return this.declaration.getPropertyValue("--color").trim()}set color(t){t=String(t),this.declaration.setProperty("--color",t),this.declaration.setProperty("color",t)}get WapMarqueeStyle(){return this.declaration.getPropertyValue("---wap-marquee-style").trim()}get WapMarqueeLoop(){return this.declaration.getPropertyValue("---wap-marquee-loop").trim()}get WapMarqueeSpeed(){return this.declaration.getPropertyValue("---wap-marquee-speed").trim()}get WapInputFormat(){return this.declaration.getPropertyValue("---wap-input-format").trim()}}},41859:function(t,e,n){"use strict";n.d(e,{X:function(){return k}});n(57658);var i=n(22783),r=n(37288),s=n(34606),o=n.n(s),a=n(48764);function l(t){const e=a.Buffer.alloc(8+3*t.length+4);let n=0;n=e.writeUInt32BE(3*t.length,n),n+=e.write("PLTE",n);for(const i of t)n=e.writeUInt8(i[0],n),n=e.writeUInt8(i[1],n),n=e.writeUInt8(i[2],n);return e.writeInt32BE(o().buf(e.slice(4,n),0),n),e}function c(t){const e=a.Buffer.alloc(8+t.length+4);let n=0;n=e.writeUInt32BE(t.length,n),n+=e.write("tRNS",n);for(const i of t)n=e.writeUInt8(i[3],n);return e.writeInt32BE(o().buf(e.slice(4,n),0),n),e}function u(t,e,n){const i=a.Buffer.alloc(t.length+e.length+n.length);let r=0,s=0;t.copy(i,s,r,8),r+=8,s+=8;while(r=33?t.readUInt32BE(16):void 0,o=t.length>=33?t.readUInt32BE(20):void 0;return{data:r,width:s,height:o}}var h=n(29587),p=n(21645),f=n(69809),m=n(22918),g=n(10595);n(23767),n(8585),n(68696);function v(t,e){const n=[],i=l(e),r=c(e),s=new Uint8Array([137,80,78,71,13,10,26,10]);let o,a,u=0;u+=8;let d,h={framingMode:1,interframeDelay:1},p={objectId:0,doNotShowFlag:0,concreteFlag:0,xLocation:0,yLocation:0},f=0;while(u=10){t.readUInt8(u+8+1);const e=t.readUInt8(u+8+2),n=(t.readUInt8(u+8+3),t.readUInt8(u+8+4),t.readUInt8(u+8+5),t.readUInt32BE(u+8+6));2==e&&(h.interframeDelay=n)}}else if("DEFI"===l)p={objectId:t.readUInt16BE(u+8+0),doNotShowFlag:t.readUInt8(u+8+2),concreteFlag:t.readUInt8(u+8+3),xLocation:t.readUInt32BE(u+8+4),yLocation:t.readUInt32BE(u+8+8)};else if("IHDR"===l)d=t.subarray(u,u+e+4+4+4);else if("IDAT"===l&&null!=d){const o=t.subarray(u,u+e+4+4+4),a=new Blob([s,d,i,r,o],{type:"image/png"}),l=URL.createObjectURL(a);(new Image).src=l,n.push({delay:h.interframeDelay,x:p.xLocation,y:p.yLocation,image:l,keep:3!==h.framingMode}),f+=h.interframeDelay}u+=e+4+4+4}const m=[],g=[],v=[];let A=0;for(const l of n)g.unshift("url("+CSS.escape(l.image)+")"),v.unshift(`${l.x}px ${l.y}px`),m.push({backgroundImage:g.join(","),backgroundPosition:v.join(","),backgroundRepeat:"no-repeat",offset:A/f,easing:"step-end"}),l.keep||(g.length=0,v.length=0),A+=l.delay;let y={};return null==a?y.iterations=1:2147483647!==a.iterationMax?y.iterations=a.iterationMax:y.iterations=1/0,null==o?null:(y.duration=1e3*f/o.ticksPerSecond,y.fill="forwards",{keyframes:m,options:y,width:o.frameWidth,height:o.frameHeight,blobs:n.map((t=>t.image))})}var A=n(48764)["Buffer"];function y(t){let e=0;const n=t.toString("ascii",e,e+4);if("FORM"!==n)return null;e+=4;const i=t.readUInt32BE(e);e+=4;const r=Math.min(e+i,t.length),s=t.toString("ascii",e,e+4);if("AIFC"!==s)return null;let o,a;e+=4;while(e0?u*=BigInt(Math.pow(2,l)):l<0&&(u/=BigInt(Math.pow(2,-l))),o={numChannels:n,numSampleFrames:i,sampleSize:r,sampleRate:Number(u)},e+=10;const d=t.toString("ascii",e,e+4);if("NONE"!==d)return null}else if("SSND"===n){if(null==o)return null;if(null==a)return null;const n=t.readUInt32BE(e);e+=4;t.readUInt32BE(e);e+=4,t.copy(a,n,e,r)}e=r}return null==o||null==a?null:{comm:o,soundData:a}}function b(t,e){const n=y(e);if(null==n)return null;const{comm:i,soundData:r}=n;if(1!==i.numChannels)return null;if(16!==i.sampleSize)return null;const s=new Float32Array(i.numSampleFrames);for(let l=0;l>16)/32768;const o=t.context.createBuffer(1,s.length,i.sampleRate);o.copyToChannel(s,0);const a=t.context.createBufferSource();return a.buffer=o,a.connect(t.context.destination),a.start(0),a}var w=n(50646),x=n(81103),S=n(8819);const C=(0,S.gN)("dom"),E=(0,S.by)("dom");var k;(function(t){function e(t,e){return null==t?null:l(t,e)}function n(t){return null==t?null:t["node"]}function s(t,e){if(null==t)return null;const n=l(t,e);if(!(n instanceof R))throw new TypeError("failed to cast to BML.HTMLElement");return n}function o(t,e){return null==t?null:l(t,e)}function l(t,e){const n=e.internalBMLNodeInstanceMap.get(t);if(null!=n)return n;const i=c(t),r=new i(t,e);return e.internalBMLNodeInstanceMap.set(t,r),r}function c(t){return t instanceof globalThis.HTMLInputElement?U:t instanceof globalThis.HTMLBRElement?D:t instanceof globalThis.HTMLAnchorElement?j:t instanceof globalThis.HTMLHtmlElement?V:t instanceof globalThis.HTMLScriptElement?ot:t instanceof globalThis.HTMLObjectElement?Z:t instanceof globalThis.HTMLImageElement?K:t instanceof globalThis.HTMLHeadElement?lt:t instanceof globalThis.HTMLTitleElement?st:t instanceof globalThis.HTMLSpanElement?Q:t instanceof globalThis.HTMLMetaElement?rt:t instanceof globalThis.HTMLStyleElement?at:t instanceof globalThis.HTMLElement&&"bevent"===t.nodeName.toLowerCase()?ct:t instanceof globalThis.HTMLElement&&"beitem"===t.nodeName.toLowerCase()?dt:t instanceof globalThis.HTMLElement&&"arib-cdata"===t.nodeName.toLowerCase()?I:t instanceof globalThis.HTMLElement&&"arib-text"===t.nodeName.toLowerCase()?T:t instanceof globalThis.HTMLBodyElement?$:t instanceof globalThis.HTMLParagraphElement?it:t instanceof globalThis.HTMLDivElement?et:t instanceof globalThis.HTMLHtmlElement?V:t instanceof globalThis.HTMLTextAreaElement?G:t instanceof globalThis.HTMLFormElement?W:t instanceof globalThis.HTMLElement?(E(t),R):t instanceof globalThis.Element?P:t instanceof globalThis.CDATASection?I:t instanceof globalThis.Text?T:t instanceof globalThis.CharacterData?k:t instanceof globalThis.Node?(E(t),S):S}function u(t){if(t instanceof globalThis.HTMLInputElement&&t.disabled)return!1;const e=window.getComputedStyle(t);return"hidden"!==e.visibility}function A(t,e){const n=e.currentFocus;n!==t&&u(t["node"])&&(null!=n?y(n,e,t):e._currentFocus=t,t.internalSetFocus(!0),e.eventQueue.queueSyncEvent({type:"focus",target:t["node"]}))}function y(t,e,n){e.currentFocus===t&&(t.internalSetActive(!1),t.internalSetFocus(!1),t instanceof F&&e.inputApplication?.cancel("blur"),e._currentFocus=n??null,e.eventQueue.queueSyncEvent({type:"blur",target:t["node"]}))}t.nodeToBMLNode=e,t.bmlNodeToNode=n,t.htmlElementToBMLHTMLElement=s,t.isFocusable=u;class S{constructor(t,e){this.node=t,this.ownerDocument=e}get parentNode(){return o(this.node.parentNode,this.ownerDocument)}get firstChild(){let t=this.node.firstChild;return null!=t&&"arib-bg"===t.nodeName.toLowerCase()&&(t=t.nextSibling),o(t,this.ownerDocument)}get lastChild(){let t=this.node.lastChild;return null!=t&&"arib-bg"===t.nodeName.toLowerCase()&&(t=null),o(t,this.ownerDocument)}get previousSibling(){let t=this.node.previousSibling;return null!=t&&"arib-bg"===t.nodeName.toLowerCase()&&(t=null),o(t,this.ownerDocument)}get nextSibling(){return o(this.node.nextSibling,this.ownerDocument)}}t.Node=S;class k extends S{constructor(t,e){super(t,e),null!=t.parentElement&&(t.parentElement.style.fontSize="var(--font-size)",t.parentElement.style.lineHeight="var(--line-height)");const n=window.getComputedStyle(this.getParentBlock(t)),i=n.getPropertyValue("--display").trim();if("-wap-marquee"===i||"normal"!==n.letterSpacing&&"0px"!==n.letterSpacing){let n;n=t instanceof globalThis.CDATASection?document.createElement("arib-cdata"):document.createElement("arib-text");const i=t.textContent??"";t.replaceWith(n);const r=n.attachShadow({mode:"closed"}),s=this.getParentBlock(n);this.flowData={textNode:n,parentBlock:s,root:r,textData:i},e.internalBMLNodeInstanceMap.set(n,this),e.internalBMLNodeInstanceMap.delete(t)}this.node=t}getParentBlock(t){let e=t.parentElement;while(null!=e){if("inline"!==window.getComputedStyle(e).display)return e;e=e.parentElement}return null}createMarquee(t){const e=t.getPropertyValue("---wap-marquee-style").trim().toLowerCase(),n=Number.parseInt(t.getPropertyValue("---wap-marquee-loop").trim().toLowerCase());if(0===n||"hidden"===t.visibility){const t=document.createElement("span");return"slide"!==e&&(t.style.visibility="hidden"),t}const i=document.createElement("marquee");i.behavior=e,Number.isFinite(n)&&(0!==n||(i.loop=n));const r=t.getPropertyValue("---wap-marquee-speed").trim().toLowerCase();switch(r){case"slow":i.scrollAmount=3;break;case"normal":i.scrollAmount=6;break;case"fast":i.scrollAmount=12;break}return i}flowText(t){const e=this.flowData;if(null==e)return;const n=e.textNode.nextElementSibling,i=window.getComputedStyle(e.textNode);"arib-text"===e.textNode.nodeName.toLowerCase()&&(t=t.replace(/[ \n\r\t]+/g," "));const r=i.getPropertyValue("--display").trim(),s="-wap-marquee"===r;if("normal"===i.letterSpacing||"0px"===i.letterSpacing)return void(null==e.textNodeInRoot?(e.textNodeInRoot=document.createTextNode(t),s?(e.marquee=this.createMarquee(i),e.marquee.replaceChildren(e.textNodeInRoot),e.root.replaceChildren(e.marquee)):e.root.replaceChildren(e.textNodeInRoot)):s&&(e.marquee=this.createMarquee(i),e.marquee.replaceChildren(e.textNodeInRoot),e.root.replaceChildren(e.marquee)));null!=e.textNodeInRoot&&(e.textNodeInRoot=void 0);const o=e.textNode.clientLeft,a=e.textNode.clientTop,l=e.parentBlock,c=l.clientWidth;let u=Number.parseInt(i.fontSize);Number.isNaN(u)&&(u=16);let d=Number.parseInt(i.letterSpacing);Number.isNaN(d)&&(d=0);let h=Number.parseInt(i.lineHeight);Number.isNaN(h)&&(h=1*u);let p=o,f=a;const m=[];for(let g=0;gc&&(p=0,f+=h),!i&&p+o+d<=c&&(s.style.marginRight=`${d}px`,p+=d),m.push(s),p+=o}s?(e.marquee=this.createMarquee(i),e.marquee.replaceChildren(...m),e.root.replaceChildren(e.marquee)):e.root.replaceChildren(...m)}internalReflow(){return null!=this.flowData&&(this.flowText(this.data),!0)}get data(){return null==this.flowData?this.node.data:this.flowData.textData}set data(t){if(t=String(t),null!=this.flowData)return this.flowData.textData=t,void(null!=this.flowData.textNodeInRoot?this.flowData.textNodeInRoot.data=t:this.flowText(t));this.node.data=t}get length(){return this.data.length}}t.CharacterData=k;class T extends k{}t.Text=T;class I extends T{}t.CDATASection=I;class _ extends S{constructor(t,e){super(t,e),this.node=t,this._implementation=new mt}get implementation(){return this._implementation}get documentElement(){return l(this.node.documentElement,this.ownerDocument)}}t.Document=_;class O extends _{constructor(t,e){super(t,e),this.node=t}getElementById(t){const e=String(t);return""===e?null:o(this.node.querySelector("#"+CSS.escape(e)),this.ownerDocument)}}t.HTMLDocument=O;class B extends O{constructor(t,e,n,i,r,s,o,a){super(t,null),this.internalBMLNodeInstanceMap=new WeakMap,this._currentFocus=null,this._currentEvent=null,this.ownerDocument=this,this.interpreter=e,this.eventQueue=n,this.resources=i,this.browserEventTarget=r,this.audioNodeProvider=s,this.inputApplication=o,this.setMainAudioStreamCallback=a}get documentElement(){return l(this.node,this.ownerDocument)}get currentFocus(){return this._currentFocus}get currentEvent(){return this._currentEvent}}t.BMLDocument=B;class P extends S{constructor(t,e){super(t,e),this.node=t}get tagName(){const t=this.node.tagName.toLowerCase();return t.startsWith("arib-")?t.substring(5):t}}t.Element=P;class R extends P{constructor(t,e){super(t,e),this.node=t,this.normalStyleMap=new Map,this.focusStyleMap=new Map,this.activeStyleMap=new Map;for(const n of this.node.style)this.normalStyleMap.set(n,this.node.style.getPropertyValue(n))}get id(){return this.node.id}get className(){return this.node.className}internalSetFocus(t){t!==("focus"===this.node.getAttribute("web-bml-state"))&&(t?this.node.setAttribute("web-bml-state","focus"):this.node.removeAttribute("web-bml-state"),this.applyStyle())}internalSetActive(t){t!==("active"===this.node.getAttribute("web-bml-state"))&&(t?this.node.setAttribute("web-bml-state","active"):this.node.removeAttribute("web-bml-state"),this.applyStyle())}applyStyle(){if(0===this.focusStyleMap.size&&0===this.activeStyleMap.size)return;const t=this.node.getAttribute("web-bml-state");this.node.style.cssText="";for(const[e,n]of this.normalStyleMap)this.node.style.setProperty(e,n);if("focus"===t)for(const[e,n]of this.focusStyleMap)this.node.style.setProperty(e,n);else if("active"===t)for(const[e,n]of this.activeStyleMap)this.node.style.setProperty(e,n)}getNormalStyle(){const t=t=>{const e=this.node.getAttribute("web-bml-state");"active"===e?this.internalSetActive(!1):"focus"===e&&this.internalSetFocus(!1);const n=window.getComputedStyle(this.node).getPropertyValue(t);return"active"===e?this.internalSetActive(!0):"focus"===e&&this.internalSetFocus(!0),n},e=(t,e)=>{const n=this.node.getAttribute("web-bml-state");"focus"===n?this.focusStyleMap.has(t)||this.node.style.setProperty(t,e):"active"===n&&this.activeStyleMap.has(t)||this.node.style.setProperty(t,e)},n=new i.D(this.normalStyleMap,this.normalStyleMap,t,e);return new i.d(n,this.node,this.ownerDocument.browserEventTarget)}getFocusStyle(){const t=t=>{const e=this.node.getAttribute("web-bml-state");this.internalSetFocus(!0);const n=window.getComputedStyle(this.node).getPropertyValue(t);return"active"===e?this.internalSetActive(!0):this.internalSetFocus("focus"===e),n},e=(t,e)=>{const n=this.node.getAttribute("web-bml-state");"focus"===n&&this.node.style.setProperty(t,e)},n=new i.D(this.normalStyleMap,this.focusStyleMap,t,e);return new i.d(n,this.node,this.ownerDocument.browserEventTarget)}getActiveStyle(){const t=t=>{const e=this.node.getAttribute("web-bml-state");this.internalSetActive(!0);const n=window.getComputedStyle(this.node).getPropertyValue(t);return"focus"===e?this.internalSetFocus(!0):this.internalSetActive("active"===e),n},e=(t,e)=>{const n=this.node.getAttribute("web-bml-state");"active"===n&&this.node.style.setProperty(t,e)},n=new i.D(this.normalStyleMap,this.activeStyleMap,t,e);return new i.d(n,this.node,this.ownerDocument.browserEventTarget)}}t.HTMLElement=R;class M extends R{}t.HTMLBRElement=M;class D extends M{get normalStyle(){return this.getNormalStyle()}}t.BMLBRElement=D;class L extends R{}t.HTMLHtmlElement=L;class V extends L{}t.BMLBmlElement=V;class N extends R{constructor(t,e){super(t,e),this.node=t}get accessKey(){return this.node.accessKey}get href(){return this.node.getAttribute("bml-href")??""}set href(t){this.node.setAttribute("bml-href",t)}blur(){y(this,this.ownerDocument)}focus(){A(this,this.ownerDocument)}}t.HTMLAnchorElement=N;class j extends N{get normalStyle(){return this.getNormalStyle()}get focusStyle(){return this.getFocusStyle()}get activeStyle(){return this.getActiveStyle()}}t.BMLAnchorElement=j;class F extends R{constructor(t,e){super(t,e),this.node=t}get defaultValue(){return this.node.defaultValue}get accessKey(){return this.node.accessKey}get disabled(){return this.node.disabled}set disabled(t){this.node.disabled=t}get maxLength(){return-1===this.node.maxLength?40:this.node.maxLength}get readOnly(){return this.node.readOnly}set readOnly(t){this.ownerDocument.currentFocus===this&&t&&!this.node.readOnly&&this.ownerDocument.inputApplication?.cancel("readonly"),this.node.readOnly=t}get type(){return this.node.type}get value(){return this.node.value}set value(t){this.node.value=t}blur(){y(this,this.ownerDocument)}focus(){A(this,this.ownerDocument)}internalLaunchInputApplication(){let t,e=this.maxLength;if("submit"===this.type.toLowerCase())return;if(this.ownerDocument.resources.profile===r.N.TrProfileC){const n=window.getComputedStyle(this.node).getPropertyValue("---wap-input-format").trim(),i=/^((?\*)|(?\d+))?(?A+|a+|N+|n+|X+|x+|M+|m+)$/.exec(n)?.groups;if(t="all",null!=i){const n=i.type,r=Number.parseInt(i.length);Number.isNaN(r)?"*"!==i.unlimited&&(e=n.length):e=r,"N"===n.substring(0,1)&&(t="number")}}else{const e=this.node.getAttribute("charactertype")?.toLowerCase();t=null!=e&&m.ao.has(e)?e:"all"}const n=m.ao.get(t);this.ownerDocument.inputApplication?.launch({characterType:t,allowedCharacters:n,maxLength:this.maxLength,value:this.value,inputMode:"password"===this.type?"password":"text",multiline:!0,callback:t=>{t=(0,x.$)(this.ownerDocument.resources.profile)((0,x.Y)(this.ownerDocument.resources.profile)(t)),t=t.replace(/[\n\r]/g,"").substring(0,this.maxLength),null!=n&&(t=t.split("").filter((t=>n.includes(t))).join("")),this.value!==t&&(this.value=t,this.ownerDocument.eventQueue.queueSyncEvent({type:"change",target:this.node}),this.ownerDocument.eventQueue.processEventQueue())}})}}t.HTMLInputElement=F;class U extends F{get normalStyle(){return this.getNormalStyle()}get focusStyle(){return this.getFocusStyle()}get activeStyle(){return this.getActiveStyle()}}t.BMLInputElement=U;class z extends R{constructor(t,e){super(t,e),this.node=t}get defaultValue(){return this.node.defaultValue}get form(){return null==this.node.form?null:e(this.node.form,this.ownerDocument)}get accessKey(){return this.node.accessKey}get name(){return this.node.name}get readOnly(){return this.node.readOnly}set readOnly(t){this.ownerDocument.currentFocus===this&&t&&!this.node.readOnly&&this.ownerDocument.inputApplication?.cancel("readonly"),this.node.readOnly=t}get value(){return this.node.value}set value(t){this.node.value=t}internalLaunchInputApplication(){this.ownerDocument.inputApplication?.launch({characterType:"all",maxLength:240,value:this.value,inputMode:"text",multiline:!0,callback:t=>{t=(0,x.$)(this.ownerDocument.resources.profile)((0,x.Y)(this.ownerDocument.resources.profile)(t)),t=t.substring(0,240),this.value=t}})}}t.HTMLTextAreaElement=z;class G extends z{get normalStyle(){return this.getNormalStyle()}}t.BMLTextAreaElement=G;class H extends R{constructor(t,e){super(t,e),this.node=t}get action(){return this.node.action}set action(t){this.node.action=t}get method(){return this.node.method}submit(){E("HTMLFormElement submit")}}t.HTMLFormElement=H;class W extends H{get normalStyle(){return this.getNormalStyle()}}function J(t,e,n,i){i=i.toLowerCase();const r="720x480"===t.trim();return"image/jpeg"===i?r?e%2!=0?{width:e-1,height:n}:{width:e,height:n}:960===e&&540===n?{width:e,height:n}:{width:Math.floor(e/2),height:Math.floor(n/2)}:"image/x-arib-png"===i||"image/x-arib-mng"===i?{width:e,height:n}:{}}t.BMLFormElement=W;class Y extends R{constructor(t,e){super(t,e),this.node=t}get data(){return this.node.data}set data(t){this.node.data=t}get type(){return this.node.type}}t.HTMLObjectElement=Y;class Z extends Y{constructor(){super(...arguments),this.version=0}get data(){const t=this.node.getAttribute("arib-data");return null==t||""==t?this.node.getAttribute("data")??"":t}delete(){null!=this.animation&&(this.animation.cancel(),this.effect=void 0,this.animation=void 0),this.node.removeAttribute("type"),this.node.removeAttribute("data")}updateAnimation(){if(null==this.animation)return;const t=this.node.getAttribute("streamstatus");"play"===t?this.animation.play():"pause"===t?this.animation.pause():"stop"===t&&this.animation.cancel()}set data(t){(async()=>{if(null==t)return this.delete(),void this.node.removeAttribute("arib-data");const e=this.node.getAttribute("arib-type");if(this.node.setAttribute("arib-data",t),""==t)return void this.delete();if("audio/x-arib-mpeg2-aac"===e?.toLowerCase()){const{componentId:e,channelId:n}=this.ownerDocument.resources.parseAudioReference(t);if(null==e)return;return void this.ownerDocument.browserEventTarget.dispatchEvent(new CustomEvent("audiostreamchanged",{detail:{componentId:e,channelId:n??void 0}}))}this.version=this.version+1;const i=this.version,s=this.ownerDocument.resources.fetchLockedResource(t)??await this.ownerDocument.resources.fetchResourceAsync(t);if(this.version!==i)return;if(!s)return void this.delete();let o;const l="image/x-arib-png"===e?.toLowerCase(),c="image/x-arib-mng"===e?.toLowerCase();let u;if(l||c){const t=window.getComputedStyle(this.node).getPropertyValue("--clut"),r=null==t?null:(0,f.Rk)(t),l=null==r?null:(this.ownerDocument.resources.fetchLockedResource(r)??await this.ownerDocument.resources.fetchResourceAsync(r))?.data;if(this.version!==i)return;if(c){const t=null==l?p.c:(0,h.b)(a.Buffer.from(l?.buffer)),i=v(a.Buffer.from(s.data),t);if(this.node.removeAttribute("data"),null!=this.animation&&(this.animation.cancel(),this.animation=void 0,this.effect=void 0),null==i)return;this.effect=new KeyframeEffect(this.node,i.keyframes,i.options),this.animation=new Animation(this.effect);for(const e of i.blobs)s.blobUrl.set(e,{blobUrl:e});const{width:r,height:o}=J(window.getComputedStyle(n(this.ownerDocument.documentElement).querySelector("body")).getPropertyValue("resolution"),i.width,i.height,e??this.type);return null!=r&&null!=o&&(this.node.style.maxWidth=r+"px",this.node.style.minWidth=r+"px",this.node.style.maxHeight=o+"px",this.node.style.minHeight=o+"px"),"stop"!==this.streamStatus&&E("unexpected streamStatus",this.streamStatus,this.data),void this.updateAnimation()}if(o=s.blobUrl.get(l),null==o){const t=null==l?p.c:(0,h.b)(a.Buffer.from(l?.buffer)),e=d(a.Buffer.from(s.data),t),n=new Blob([e.data],{type:"image/png"});o={blobUrl:URL.createObjectURL(n),width:e.width,height:e.height},s.blobUrl.set(l,o)}u="image/png"}else if("image/jpeg"===e?.toLowerCase()){if(o=s.blobUrl.get("BT.709"),null==o){try{const t=await globalThis.createImageBitmap(new Blob([s.data]));if(o=await(0,g.d)(t),this.version!==i)return}catch{return void this.delete()}s.blobUrl.set("BT.709",o)}u="image/jpeg"}else{if("image/gif"!==e?.toLowerCase())return void this.delete();u="image/gif",o={blobUrl:this.ownerDocument.resources.getCachedFileBlobUrl(s)}}if(null!=o){if(this.ownerDocument.resources.profile!==r.N.TrProfileC&&null!=o.width&&null!=o.height){const{width:t,height:i}=J(window.getComputedStyle(n(this.ownerDocument.documentElement).querySelector("body")).getPropertyValue("--resolution"),o.width,o.height,e??this.type);null!=t&&null!=i&&(this.node.style.maxWidth=t+"px",this.node.style.minWidth=t+"px",this.node.style.maxHeight=i+"px",this.node.style.minHeight=i+"px")}this.node.type=u,this.node.data=o.blobUrl}else this.delete()})()}get type(){const t=this.node.getAttribute("arib-type");return null!=t?t:this.node.type}get normalStyle(){return this.getNormalStyle()}get focusStyle(){return this.getFocusStyle()}get activeStyle(){return this.getActiveStyle()}get accessKey(){return this.node.accessKey}get remain(){return"remain"===this.node.getAttribute("remain")}set remain(t){t?this.node.setAttribute("remain","remain"):this.node.removeAttribute("remain")}get streamPosition(){const t=Number.parseInt(this.node.getAttribute("streamposition")??"0");return Number.isFinite(t)?t:0}set streamPosition(t){if("pause"===this.streamStatus){if(t=Number(t),Number.isFinite(t)&&(this.node.setAttribute("streamposition",t.toString()),null!=this.effect)){const e=this.effect.getTiming(),n=Number(e.duration),i=this.effect.getKeyframes(),r=i[Math.max(0,Math.min(t,i.length-1))];e.delay=-r.computedOffset*n,this.effect.updateTiming(e)}}else{if(null!=this.effect){const t=this.effect.getTiming();t.delay=0,this.effect.updateTiming(t)}this.node.setAttribute("streamposition","0")}}static offsetToFrame(t,e){for(let n=0;n{const e=t?.data;if(null!=e&&(this.audioBufferSourceNode=b(this.ownerDocument.audioNodeProvider.getAudioDestinationNode(),a.Buffer.from(e))??void 0,this.node.setAttribute("streamstatus","play"),null!=this.audioBufferSourceNode)){const t=this.audioBufferSourceNode;t.onended=()=>{t===this.audioBufferSourceNode&&this.node.setAttribute("streamstatus","stop")}}}))):"stop"===t&&(this.audioBufferSourceNode?.stop(),this.audioBufferSourceNode=void 0,this.node.setAttribute("streamstatus","stop")));if(null==this.animation||null==this.effect)return void this.node.setAttribute("streamstatus",t);if(this.streamStatus===t)return;const n=this.streamStatus;if("play"===t)this.node.setAttribute("streamstatus","play"),"pause"===n?this.animation.play():"stop"===n&&(this.streamPosition=0,this.animation.play());else if("pause"===t)if(this.node.setAttribute("streamstatus","pause"),"play"===n){this.animation.pause();const t=Number(this.effect.getTiming().duration);this.streamPosition=Z.offsetToFrame(this.effect.getKeyframes(),(this.animation.currentTime-this.animation.startTime)%t/t)}else"stop"===n&&(this.streamPosition=0,this.animation.play(),this.animation.pause());else"stop"===t&&(this.animation.cancel(),this.streamPosition=0,this.node.setAttribute("streamstatus","stop"))}setMainAudioStream(t){const{componentId:e,channelId:n}=this.ownerDocument.resources.parseAudioReference(t);return null!=e&&(this.ownerDocument.setMainAudioStreamCallback?.(e,n??void 0)??!1)}getMainAudioStream(){const t=this.ownerDocument.resources.mainAudioComponentId??this.ownerDocument.resources.defaultAudioComponentId,e=this.ownerDocument.resources.mainAudioChannelId,n=this.ownerDocument.resources.isInternetContent?"arib://-1.-1.-1/":"/",i=t.toString(16).padStart(2,"0");return null!=e?n+i+";"+e:n+i}blur(){y(this,this.ownerDocument)}focus(){A(this,this.ownerDocument)}}t.BMLObjectElement=Z;class q extends R{constructor(t,e){super(t,e),this.version=0,this.node=t}get alt(){return this.node.alt}get src(){return this.node.getAttribute("arib-src")??""}set src(t){(async()=>{if(null==t)return this.node.src="",void this.node.removeAttribute("arib-src");if(this.node.setAttribute("arib-src",t),""==t)return void(this.node.src="");this.version=this.version+1;const e=this.version,n=this.ownerDocument.resources.fetchLockedResource(t)??await this.ownerDocument.resources.fetchResourceAsync(t);if(this.version!==e)return;if(!n)return void(this.node.src="");const i=71===n.data[0]&&73===n.data[1]&&70===n.data[2],r=255===n.data[0]&&216===n.data[1]&&255===n.data[2]&&224===n.data[3];if(!i&&!r)return void E("unknown media",t);let s;if(r){if(s=n.blobUrl.get("BT.709"),null==s){try{const t=await globalThis.createImageBitmap(new Blob([n.data]));if(s=await(0,g.d)(t),this.version!==e)return}catch{return void(this.node.src="")}n.blobUrl.set("BT.709",s)}}else{if(!i)return void(this.node.src="");s={blobUrl:this.ownerDocument.resources.getCachedFileBlobUrl(n)}}this.node.src=null!=s?s.blobUrl:""})()}}t.HTMLImageElement=q;class K extends q{get normalStyle(){return this.getNormalStyle()}}t.BMLImageElement=K;class Q extends R{get normalStyle(){return this.getNormalStyle()}get focusStyle(){return this.getFocusStyle()}get activeStyle(){return this.getActiveStyle()}get accessKey(){return this.node.accessKey}blur(){y(this,this.ownerDocument)}focus(){A(this,this.ownerDocument)}}t.BMLSpanElement=Q;class X extends R{}t.HTMLBodyElement=X;class $ extends X{get invisible(){return"invisible"===this.node.getAttribute("invisible")}set invisible(t){t=Boolean(t),this.ownerDocument.currentFocus instanceof F&&!t&&this.ownerDocument.inputApplication?.cancel("invisible"),t?this.node.setAttribute("invisible","invisible"):this.node.removeAttribute("invisible"),this.ownerDocument.browserEventTarget.dispatchEvent(new CustomEvent("invisible",{detail:t}))}get normalStyle(){return this.getNormalStyle()}}t.BMLBodyElement=$;class tt extends R{}t.HTMLDivElement=tt;class et extends tt{get normalStyle(){return this.getNormalStyle()}get focusStyle(){return this.getFocusStyle()}get activeStyle(){return this.getActiveStyle()}get accessKey(){return this.node.accessKey}blur(){y(this,this.ownerDocument)}focus(){A(this,this.ownerDocument)}}t.BMLDivElement=et;class nt extends R{}t.HTMLParagraphElement=nt;class it extends nt{get normalStyle(){return this.getNormalStyle()}get focusStyle(){return this.getFocusStyle()}get activeStyle(){return this.getActiveStyle()}get accessKey(){return this.node.accessKey}blur(){y(this,this.ownerDocument)}focus(){A(this,this.ownerDocument)}}t.BMLParagraphElement=it;class rt extends R{constructor(t,e){super(t,e),this.node=t}get content(){return this.node.content}get name(){return this.node.name}}t.HTMLMetaElement=rt;class st extends R{constructor(t,e){super(t,e),this.node=t}get text(){return this.node.text}}t.HTMLTitleElement=st;class ot extends R{}t.HTMLScriptElement=ot;class at extends R{}t.HTMLStyleElement=at;class lt extends R{}t.HTMLHeadElement=lt;class ct extends R{}function ut(t){const e=Number.parseInt(t??"");return Number.isNaN(e)?null:e}t.BMLBeventElement=ct;class dt extends R{constructor(){super(...arguments),this.internalTimerFired=!1,this.internalNPTReferred=!1}get type(){return this.node.getAttribute("type")??""}get esRef(){return this.node.getAttribute("es_ref")??""}set esRef(t){t!==this.esRef&&(this.node.setAttribute("es_ref",t),this.internalMessageVersion=void 0,this.internalNPTReferred=!1)}get messageId(){return ut(this.node.getAttribute("message_id"))??255}set messageId(t){this.node.setAttribute("message_id",String(t))}get messageVersion(){return ut(this.node.getAttribute("message_version"))??255}set messageVersion(t){this.node.setAttribute("message_version",String(t))}get messageGroupId(){return ut(this.node.getAttribute("message_group_id"))??0}get moduleRef(){return this.node.getAttribute("module_ref")??""}set moduleRef(t){this.moduleRef!==t&&(this.node.setAttribute("module_ref",t),this.internalModuleUpdateDataEventId=void 0,this.internalModuleUpdateVersion=void 0,this.internalModuleExistsInDII=void 0)}get languageTag(){return ut(this.node.getAttribute("language_tag"))??0}set languageTag(t){this.node.setAttribute("language_tag",String(t))}get peripheralRef(){return this.node.getAttribute("peripheral_ref")??""}set peripheralRef(t){this.node.setAttribute("peripheral_ref",t)}get timeMode(){return this.node.getAttribute("time_mode")??""}get timeValue(){return this.node.getAttribute("time_value")??""}set timeValue(t){this.timeValue!==t&&(this.node.setAttribute("time_value",t),this.internalTimerFired=!1)}get objectId(){return this.node.getAttribute("object_id")??""}set objectId(t){this.node.setAttribute("object_id",t)}get segmentId(){return this.node.getAttribute("segment_id")??""}set segmentId(t){this.node.setAttribute("segment_id",t)}get subscribe(){return"subscribe"===this.node.getAttribute("subscribe")}dispatchModuleUpdatedEvent(t,e){if(!this.subscribe)return;C("ModuleUpdated",t,e);const n=this.node.getAttribute("onoccur");n&&(this.ownerDocument.eventQueue.queueAsyncEvent((async()=>(this.ownerDocument._currentEvent=new ft({type:"ModuleUpdated",target:this,status:e,moduleRef:t}),!!await this.ownerDocument.eventQueue.executeEventHandler(n)||(this.ownerDocument._currentEvent=new ht({type:void 0,target:null}),!1)))),this.ownerDocument.eventQueue.processEventQueue())}subscribeModuleUpdated(){const{componentId:t,moduleId:e}=this.ownerDocument.resources.parseURLEx(this.moduleRef);if(!this.subscribe||null==t||null==e)return;if(!this.ownerDocument.resources.getPMTComponent(t))return this.dispatchModuleUpdatedEvent(this.moduleRef,1),this.internalModuleExistsInDII=!1,this.internalModuleUpdateVersion=void 0,void(this.internalModuleUpdateDataEventId=void 0);const n=this.ownerDocument.resources.getDownloadComponentInfo(t);if(null==n)return;const i=n.modules.get(e);null!=i?(this.dispatchModuleUpdatedEvent(this.moduleRef,2),this.internalModuleExistsInDII=!0,this.internalModuleUpdateVersion=i.version,this.internalModuleUpdateDataEventId=n.dataEventId):(this.dispatchModuleUpdatedEvent(this.moduleRef,1),this.internalModuleExistsInDII=!1,this.internalModuleUpdateVersion=void 0,this.internalModuleUpdateDataEventId=n.dataEventId)}internalPMTUpdated(t){const{componentId:e,moduleId:n}=this.ownerDocument.resources.parseURLEx(this.moduleRef);this.subscribe&&null!=e&&null!=n&&(t.has(e)||(this.internalModuleExistsInDII&&this.dispatchModuleUpdatedEvent(this.moduleRef,1),this.internalModuleExistsInDII=!1,this.internalModuleUpdateVersion=void 0,this.internalModuleUpdateDataEventId=void 0))}internalDIIUpdated(t,e,n){const{componentId:i,moduleId:r}=this.ownerDocument.resources.parseURLEx(this.moduleRef);if(!this.subscribe||t!==i||null==r)return;const s=e.get(r);null==s?(this.internalModuleExistsInDII&&this.dispatchModuleUpdatedEvent(this.moduleRef,1),null!=this.internalModuleUpdateDataEventId&&this.internalModuleUpdateDataEventId!==n&&this.internalModuleExistsInDII&&this.dispatchModuleUpdatedEvent(this.moduleRef,5),this.internalModuleExistsInDII=!1,this.internalModuleUpdateVersion=void 0,this.internalModuleUpdateDataEventId=n):(this.internalModuleExistsInDII?null!=this.internalModuleUpdateVersion&&this.internalModuleUpdateVersion!==s.version&&this.dispatchModuleUpdatedEvent(this.moduleRef,0):this.dispatchModuleUpdatedEvent(this.moduleRef,2),null!=this.internalModuleUpdateDataEventId&&this.internalModuleUpdateDataEventId!==n&&(this.internalModuleExistsInDII?this.dispatchModuleUpdatedEvent(this.moduleRef,6):this.dispatchModuleUpdatedEvent(this.moduleRef,4)),this.internalModuleExistsInDII=!0,this.internalModuleUpdateVersion=s.version,this.internalModuleUpdateDataEventId=n)}set subscribe(t){Boolean(t)?(this.subscribe||(this.internalTimerFired=!1,this.internalModuleUpdateDataEventId=void 0,this.internalModuleUpdateVersion=void 0,this.internalModuleExistsInDII=void 0,this.internalMessageVersion=void 0,this.internalNPTReferred=!1),this.node.setAttribute("subscribe","subscribe"),"ModuleUpdated"===this.type&&null==this.internalModuleExistsInDII&&this.subscribeModuleUpdated()):this.node.removeAttribute("subscribe")}}t.BMLBeitemElement=dt;class ht{constructor(t){this._data={...t}}get type(){return this._data.type}get target(){return this._data.target}}t.BMLEvent=ht;class pt extends ht{constructor(t){super(t),this._keyCode=t.keyCode}get keyCode(){return this._keyCode}}t.BMLIntrinsicEvent=pt;class ft extends ht{constructor(t){const e={target:null,status:0,privateData:"",esRef:"",messageId:0,messageVersion:0,messageGroupId:0,moduleRef:"",languageTag:0,registerId:0,serviceId:0,eventId:0,peripheralRef:"",object:null,segmentId:null,...t};super(e),this._data=e}get status(){return this._data.status}get privateData(){return this._data.privateData}get esRef(){return this._data.esRef}get messageId(){return this._data.messageId}get messageVersion(){return this._data.messageVersion}get messageGroupId(){return this._data.messageGroupId}get moduleRef(){return this._data.moduleRef}get languageTag(){return this._data.languageTag}get peripheralRef(){return this._data.peripheralRef}get object(){return this._data.object}get segmentId(){return this._data.segmentId}}t.BMLBeventEvent=ft;class mt{hasFeature(t,e){return"BML"===t.toUpperCase()&&"1.0"===e}}t.DOMImplementation=mt})(k||(k={}))},45254:function(t,e,n){"use strict";n.d(e,{I:function(){return i}});const i=[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8712,8715,8838,8839,8834,8835,8746,8745,-1,-1,-1,-1,-1,-1,-1,-1,8743,8744,65506,8658,8660,8704,8707,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,-1,-1,-1,-1,-1,-1,-1,8491,8240,9839,9837,9834,8224,8225,182,-1,-1,-1,-1,9711,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,-1,-1,-1,-1,-1,-1,-1,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,-1,-1,-1,-1,-1,-1,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,-1,-1,-1,-1,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,-1,-1,-1,-1,-1,-1,-1,-1,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,-1,-1,-1,-1,-1,-1,-1,-1,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21e3,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39e3,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32e3,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,3e4,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26e3,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36e3,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27e3,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34e3,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38e3,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13314,57473,20221,20223,20378,20425,20636,20766,20924,13599,21255,21345,21356,35449,57476,21581,21654,21660,21673,21774,21834,22130,22244,22323,22324,64016,22656,23012,23075,23125,23532,64017,14306,24236,24372,24389,24503,24599,64107,24880,26148,26312,26329,26362,26363,26706,40900,26897,26939,27205,27281,27355,57482,57483,57484,27633,27872,27950,64069,28095,28106,28152,64070,28510,28665,28772,64108,57486,28999,29121,29184,29599,29608,29641,29654,29723,29729,64074,29734,29738,29740,29753,29771,16090,30069,30081,30578,16531,30920,30944,31047,31150,40902,16643,40901,31194,31262,31615,31793,16996,32139,32673,33048,33082,64109,33454,33883,34012,34028,34137,34254,34645,34796,34827,35061,35282,35574,36302,36795,36854,37085,37159,37165,37298,37427,37512,37665,37704,38290,38622,39171,39232,39641,39894,40407,40628,40629,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60416,60417,60418,60419,60420,60421,60422,60423,60424,60425,60426,60427,60428,60429,60430,60431,60432,60433,60434,60435,60436,60437,60438,60439,60440,60441,60442,60443,60444,60445,60446,60447,60448,60449,60450,60451,60452,60453,60454,60455,60456,60457,60458,60459,60460,60461,60462,60463,60464,60465,60466,60467,60468,60469,60470,60471,60472,60473,60474,60475,60476,60477,60478,60479,60480,60481,60482,60483,60484,60485,60486,60487,60488,60489,60490,60491,60492,60493,60494,60495,60496,60497,60498,60499,60500,60501,60502,60503,60504,60505,60506,60507,60508,60509,60510,60511,60512,60513,60514,60515,60516,60517,60518,60519,60520,60521,60522,60523,60524,60525,60526,60527,60528,60529,60530,60531,60532,60533,60534,60535,60536,60537,60538,60539,60540,60541,60542,60543,60544,60545,60546,60547,60548,60549,60550,60551,60552,60553,60554,60555,60556,60557,60558,60559,60560,60561,60562,60563,60564,60565,60566,60567,60568,60569,60570,60571,60572,60573,60574,60575,60576,60577,60578,60579,60580,60581,60582,60583,60584,60585,60586,60587,60588,60589,60590,60591,60592,60593,60594,60595,60596,60597,60598,60599,60600,60601,60602,60603,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9932,9933,10071,9935,9936,9937,-1,9938,9941,9939,9940,-1,-1,-1,-1,57560,57561,-1,-1,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,11093,12872,12873,12874,12875,12876,12877,12878,12879,-1,-1,-1,-1,9361,9362,9363,57592,57593,57594,57595,57596,57597,57598,57599,57728,57729,57730,57731,57732,57733,57734,57735,11035,11044,57738,57739,57740,57741,57742,9919,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,12953,57756,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9955,11094,11095,11096,11097,9747,12939,57774,9960,12870,12869,9961,4054,9962,9963,9964,9832,9965,9966,9967,9875,9992,9968,9969,9970,9971,9972,9973,57795,9401,9416,9974,57799,57800,57801,57802,57803,9975,9976,9977,9978,57808,9742,9979,9980,9981,9982,57814,9983,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10145,11013,11014,11015,11055,11054,57995,57996,57997,57998,13217,13221,13213,13216,13220,57999,9352,9353,9354,9355,9356,9357,9358,9359,9360,58e3,58001,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,12851,12854,12850,12849,12857,12868,9654,9664,12310,12311,10192,178,179,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58279,58280,12871,58052,58053,8507,-1,-1,-1,12842,12843,12844,12845,12846,12847,12848,12855,13182,13181,13180,13179,8470,8481,12342,9918,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,8467,13199,13200,13258,13214,13218,13169,-1,-1,189,8585,8531,8532,188,190,8533,8534,8535,8536,8537,8538,8528,8539,8529,8530,9728,9729,9730,9924,9750,9751,9929,9930,9830,9829,9827,9824,9931,10752,8252,8265,9925,9748,9926,9731,9927,9889,9928,-1,9886,9887,9836,58107,-1,-1,-1,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,12881,12882,12883,12884,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,12885,12886,12887,12888,12889,12890,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,10102,10103,10104,10105,10106,10107,10108,10109,10110,10111,9451,9452,12891,-1]},37288:function(t,e,n){"use strict";n.d(e,{N:function(){return A},_:function(){return y}});n(23767),n(8585),n(68696),n(82801),n(57658);var i=n(48764)["Buffer"];function r(t){return 127===t||t>=0&&t<=31}function s(t){return 13===t}function o(t){return 10===t}function a(t){return 32===t}function l(t){return 9===t}function c(t){return-1!=='()<>@,;:\\"/[]?={} \t'.indexOf(String.fromCharCode(t))}function u(t){const e=new d(i.from(t)),n=e.readFieldValue();return h(n)}class d{set offset(t){this._offset=t}get offset(){return this._offset}constructor(t){this.buffer=t,this._offset=0}readEntity(){const t=[];while(1){if(this.offset+1>=this.buffer.length)return null;if(s(this.buffer[this.offset])&&o(this.buffer[this.offset+1])){this.offset+=2;break}const e=this.readEntityHeader();if(!(this.offset+1"content-type"===t.name));let n=null;if(null!=e&&"content-type"===e.name){const t=h(e.value).mediaType;null!=t&&"multipart"===t.type&&"mixed"===t.subtype&&(n=this.readMultipartEntityBody(t))}return{headers:t,body:this.buffer.subarray(this.offset),multipartBody:n}}readMultipartEntityBody(t){const e=t.parameters.find((t=>"boundary"===t.attribute));if(null==e)return null;const n=e.value,i="--"+n+"\r\n",r="--"+n+"--\r\n",s=[];let o=!1;while(!o){const t=this.buffer.indexOf(i,this.offset);if(-1===t)return null;{this.offset=t+i.length;let e=this.buffer.indexOf("\r\n"+i,this.offset);if(-1===e){if(e=this.buffer.indexOf("\r\n"+r,this.offset),-1===e)return null;o=!0,this.offset=e+2+r.length}else this.offset=e+2;const n=this.buffer.subarray(t+i.length,e),a=new d(n),l=a.readEntity();if(null==l)return null;s.push(l)}}return this.offset=this.buffer.length,s}readEntityHeader(){const t=this.readToken();if(null==t)return null;if(this.readImpliedLWS(),this.offset>=this.buffer.length||this.buffer[this.offset]!==":".charCodeAt(0))return null;this.offset++,this.readImpliedLWS();const e=t.toLowerCase();return{name:e,originalName:t,value:this.readFieldValue()}}readFieldValue(){const t=[];while(this.offset=this.buffer.length||this.buffer[this.offset]!=="/".charCodeAt(0))return null;this.offset++;const e=this.readToken();if(null==e)return null;const n=[];this.readImpliedLWS();while(this.offset=this.buffer.length||this.buffer[this.offset]!=="=".charCodeAt(0))return null;this.offset++;const e=this.readQuotedString()??this.readToken();return null==e?null:{attribute:t.toLowerCase(),originalAttribute:t,value:e}}}function h(t){let e=0;const n=t[e];if("token"!==n?.type)return{mediaType:null,error:!0};if(e++,"tspecials"!==t[e]?.type||"/"!==t[e]?.value)return{mediaType:{type:n.value.toLowerCase(),originalType:n.value,subtype:"",originalSubtype:"",parameters:[]},error:!0};e++;const i=t[e];if("token"!==n?.type)return{mediaType:{type:n.value.toLowerCase(),originalType:n.value,subtype:"",originalSubtype:"",parameters:[]},error:!0};e++;const r=[];function s(){const n=t[e];if("token"!==n?.type)return null;if(e++,"tspecials"!==t[e]?.type||"="!==t[e]?.value)return null;e++;const i=t[e];return"token"!==i?.type&&"quoted"!==i?.type?null:(e++,{attribute:n.value.toLowerCase(),originalAttribute:n.value,value:i.value})}"lws"==t[e]?.type&&e++;while(";"===t[e]?.value&&"tspecials"===t[e]?.type){e++,"lws"==t[e]?.type&&e++;const o=s();if(null==o)return{mediaType:{type:n.value.toLowerCase(),originalType:n.value,subtype:i.value.toLowerCase(),originalSubtype:i.value,parameters:r},error:!0};r.push(o)}return{mediaType:{type:n.value.toLowerCase(),originalType:n.value,subtype:i.value.toLowerCase(),originalSubtype:i.value,parameters:r},error:!1}}var p=n(8819);const f=(0,p.gN)("resource"),m=(0,p.by)("resource");function g(t,e){return`${t.toString(16).padStart(2,"0")}/${e.toString(16).padStart(4,"0")}`}class v{constructor(t,e){this.cachedRemoteResources=new Map,this.sizeBytes=0,this.maxEntryCount=t,this.maxSizeBytes=e}get(t){return this.cachedRemoteResources.get(t)}set(t,e){if(this.delete(t),!((e?.data.length??0)>this.maxSizeBytes)&&(this.cachedRemoteResources.set(t,e),this.sizeBytes+=e?.data.length??0,this.sizeBytes>this.maxSizeBytes||this.cachedRemoteResources.size>this.maxEntryCount))for(const[n]of this.cachedRemoteResources.keys()){if(!(this.sizeBytes>this.maxSizeBytes||this.cachedRemoteResources.size>this.maxEntryCount))break;this.delete(n)}}delete(t){const e=this.cachedRemoteResources.get(t);if(null!=e){this.sizeBytes-=e.data.length;for(const t of e.blobUrl.values())URL.revokeObjectURL(t.blobUrl);return this.cachedRemoteResources.delete(t)}return!1}}var A;(function(t){t[t["BS"]=7]="BS",t[t["CS"]=11]="CS",t[t["TrProfileA"]=12]="TrProfileA",t[t["TrProfileC"]=13]="TrProfileC"})(A||(A={}));class y{constructor(t,e){this.eventTarget=new EventTarget,this.cachedRemoteResources=new v(400,10485760),this.remoteResourceRequests=new Map,this._activeDocument=null,this._currentComponentId=null,this._currentModuleId=null,this.cachedComponents=new Map,this.downloadComponents=new Map,this.lockedComponents=new Map,this.pmtComponents=new Map,this.pmtRetrieved=!1,this.currentProgramInfo=null,this.maxTOTIntervalMillis=3e4,this.componentRequests=new Map,this.programInfoCallbacks=[],this.baseURIDirectory=null,this.indicator=t,this.ip=e}get profile(){return this._profile}set activeDocument(t){const{componentId:e,moduleId:n}=this.parseURLEx(t);this._activeDocument=t,this._currentComponentId=e,this._currentModuleId=n,t?.startsWith("http://")||t?.startsWith("https://")||(this.baseURIDirectory=null)}get activeDocument(){return this._activeDocument}get currentComponentId(){return this._currentComponentId}get currentModuleId(){return this._currentModuleId}get currentDataEventId(){return this._currentComponentId&&(this.cachedComponents.get(this._currentComponentId)?.dataEventId??null)}getCachedFileBlobUrl(t,e){let n=t.blobUrl.get(e)?.blobUrl;return null!=n||(n=URL.createObjectURL(new Blob([t.data],{type:`${t.contentType.type}/${t.contentType.originalSubtype}`})),t.blobUrl.set(e,{blobUrl:n})),n}getCachedModule(t,e){const n=this.cachedComponents.get(t);if(null!=n)return n.modules.get(e)}getPMTComponent(t){const e=this.pmtComponents.get(t);return e}lockCachedModule(t,e,n){const i=this.getCachedModule(t,e);if(null==i)return!1;const r=this.cachedComponents.get(t),s=this.lockedComponents.get(t)??{componentId:t,modules:new Map,dataEventId:r.dataEventId},o=s.modules.get(e);return s.modules.set(e,{files:i.files,lockedBy:n,moduleId:i.moduleId,version:i.version,dataEventId:i.dataEventId}),null!=o&&this.revokeCachedModule(t,o),this.lockedComponents.set(t,s),!0}isModuleLocked(t,e){return this.lockedComponents.get(t)?.modules?.has(e)??!1}getModuleLockedBy(t,e){return this.lockedComponents.get(t)?.modules?.get(e)?.lockedBy}unlockModules(t){if(null==t){const t=[...this.lockedComponents.values()];this.lockedComponents.clear();for(const e of t)this.revokeCachedComponent(e)}else for(const e of this.lockedComponents.values())for(const n of e.modules.values())this.unlockModule(e.componentId,n.moduleId,t)}revokeCachedFile(t){for(const e of t.blobUrl.values())f("revoke",e.blobUrl),URL.revokeObjectURL(e.blobUrl);t.blobUrl.clear()}revokeCachedModule(t,e){if(!this.cachedComponents.get(t)?.modules?.has(e.moduleId)&&!this.lockedComponents.get(t)?.modules?.has(e.moduleId)){f("revoke",g(t,e.moduleId));for(const t of e.files.values())this.revokeCachedFile(t)}}revokeCachedComponent(t){for(const e of t.modules.values())this.revokeCachedModule(t.componentId,e)}unlockModule(t,e,n){const i=this.lockedComponents.get(t);if(null!=i){const r=i.modules.get(e);return null!=r&&(r.lockedBy===n&&(i.modules.delete(e),this.revokeCachedModule(t,r),!0))}return!1}componentExistsInDownloadInfo(t){return this.downloadComponents.has(t)}getDownloadComponentInfo(t){return this.downloadComponents.get(t)}moduleExistsInDownloadInfo(t,e){const n=this.downloadComponents.get(t);return!!n&&n.modules.has(e)}get dataCarouselURI(){let t=`arib-dc://${this.originalNetworkId?.toString(16)?.padStart(4,"0")??-1}.${this.transportStreamId?.toString(16)?.padStart(4,"0")??-1}.${this.serviceId?.toString(16)?.padStart(4,"0")??-1}`;return null!=this.contentId&&(t+=";"+this.contentId.toString(16)?.padStart(8,"0")),null!=this.eventId&&(t+="."+this.eventId.toString(16)?.padStart(4,"0")),t}get serviceURI(){return`arib://${this.originalNetworkId?.toString(16)?.padStart(4,"0")??-1}.${this.transportStreamId?.toString(16)?.padStart(4,"0")??-1}.${this.serviceId?.toString(16)?.padStart(4,"0")??-1}`}get eventURI(){return`arib://${this.originalNetworkId?.toString(16)?.padStart(4,"0")??-1}.${this.transportStreamId?.toString(16)?.padStart(4,"0")??-1}.${this.serviceId?.toString(16)?.padStart(4,"0")??-1}.${this.eventId?.toString(16)?.padStart(4,"0")??-1}`}get eventName(){return this.currentProgramInfo?.eventName??null}get eventId(){return this.currentProgramInfo?.eventId??null}get contentId(){return null}get startTimeUnixMillis(){return this.currentProgramInfo?.startTimeUnixMillis??null}get durationSeconds(){return this.currentProgramInfo?.durationSeconds??null}get serviceId(){return this.currentProgramInfo?.serviceId??null}get originalNetworkId(){return this.currentProgramInfo?.originalNetworkId??null}get networkId(){return this.currentProgramInfo?.networkId??this.currentProgramInfo?.originalNetworkId??null}get transportStreamId(){return this.currentProgramInfo?.transportStreamId??null}get currentTimeUnixMillis(){if(null!=this._currentTimeUnixMillis&&null!=this.nearestPCRBase&&null!=this.currentTimeNearestPCRBase){const t=this.nearestPCRBase-this.currentTimeNearestPCRBase;if(t>0)return this._currentTimeUnixMillis+Math.min(this.maxTOTIntervalMillis,Math.floor(t/90))}return this._currentTimeUnixMillis??null}onMessage(t){if("moduleDownloaded"===t.type){const e=this.cachedComponents.get(t.componentId)??{componentId:t.componentId,modules:new Map,dataEventId:t.dataEventId};if(e.dataEventId!==t.dataEventId)return;const n=e.modules.get(t.moduleId);if(null!=n&&n.version===t.version&&n.dataEventId===t.dataEventId)return;const i={moduleId:t.moduleId,files:new Map(t.files.map((t=>[t.contentLocation?.toLowerCase()??null,{contentLocation:t.contentLocation,contentType:t.contentType,data:Uint8Array.from(window.atob(t.dataBase64),(t=>t.charCodeAt(0))),blobUrl:new Map}]))),version:t.version,dataEventId:t.dataEventId};e.modules.set(t.moduleId,i),null!=n&&this.revokeCachedModule(t.componentId,n),this.cachedComponents.set(t.componentId,e);const r=g(t.componentId,t.moduleId),s=this.componentRequests.get(t.componentId),o=s?.moduleRequests?.get(t.moduleId);if(null!=s&&null!=o){s.moduleRequests.delete(t.moduleId);for(const t of o)if(null==t.filename)f("async fetch done",r),t.resolve(null);else{const e=i.files.get(t.filename);f("async fetch done",r,t.filename),t.resolve(e??null)}this.setReceivingStatus()}this.eventTarget.dispatchEvent(new CustomEvent("moduleupdated",{detail:{componentId:t.componentId,dataEventId:t.dataEventId,moduleId:t.moduleId,version:t.version}}))}else if("moduleListUpdated"===t.type){const e={componentId:t.componentId,modules:new Map(t.modules.map((t=>[t.id,t]))),dataEventId:t.dataEventId,returnToEntryFlag:t.returnToEntryFlag},n=this.getDownloadComponentInfo(t.componentId);this.downloadComponents.set(t.componentId,e);const i=this.componentRequests.get(t.componentId),r=this.cachedComponents.get(t.componentId);if(null!=r)for(const s of r.modules.values()){const n=e.modules.get(s.moduleId);null!=n&&n.version===s.version||(r.modules.delete(s.moduleId),this.revokeCachedModule(t.componentId,s))}if(i){for(const[n,r]of i.moduleRequests)if(!e.modules.has(n)){for(const e of r)f("async fetch done (failed) DII",g(t.componentId,n)),e.resolve(null);i.moduleRequests.delete(n)}this.setReceivingStatus()}this.eventTarget.dispatchEvent(new CustomEvent("componentupdated",{detail:{component:e}})),null!=n&&n.dataEventId!==e.dataEventId&&(null!=r&&(this.cachedComponents.delete(t.componentId),this.revokeCachedComponent(r)),this.eventTarget.dispatchEvent(new CustomEvent("dataeventchanged",{detail:{prevComponent:n,component:e,returnToEntryFlag:t.returnToEntryFlag}})))}else if("pmt"===t.type){this.pmtRetrieved=!0;const e=this.pmtComponents;this.pmtComponents=new Map(t.components.filter((t=>13===t.streamType)).map((t=>[t.componentId,t]))),0===e.size&&(this._profile=this.pmtComponents.get(64)?.dataComponentId??this.pmtComponents.get(128)?.dataComponentId);for(const[t,n]of this.componentRequests)if(!this.pmtComponents.has(t))for(const[e,i]of n.moduleRequests){for(const n of i)f("async fetch done (failed) PMT",g(t,e)),n.resolve(null);n.moduleRequests.delete(e)}this.setReceivingStatus(),this.eventTarget.dispatchEvent(new CustomEvent("pmtupdated",{detail:{components:this.pmtComponents,prevComponents:e}}))}else if("programInfo"===t.type){this.currentProgramInfo=t;const e=this.programInfoCallbacks.slice();this.programInfoCallbacks.length=0;for(const n of e)n(t);this.setReceivingStatus()}else"currentTime"===t.type?(this.currentTimeNearestPCRBase=this.nearestPCRBase,this._currentTimeUnixMillis=t.timeUnixMillis):"pcr"===t.type?this.nearestPCRBase=t.pcrBase:"error"===t.type&&m(t)}removeDCReferencePrefix(t){const e=/^arib-dc:\/\/(?[0-9a-f]+|-1)\.(?[0-9a-f]+|-1)\.(?[0-9a-f]+|-1)($|\/)/i.exec(t);if(null==e?.groups)return t;const{originalNetworkId:n,transportStreamId:i,serviceId:r}=e.groups;if((-1===Number.parseInt(n,16)||Number.parseInt(n,16)===this.originalNetworkId)&&(-1===Number.parseInt(i,16)||Number.parseInt(i,16)===this.transportStreamId)&&(-1===Number.parseInt(r,16)||Number.parseInt(r,16)===this.serviceId)){const n=t.substring(e[0].length);return"/"+n}return t}parseURL(t){if(null==t)return{component:null,module:null,filename:null};if(t.startsWith("http://")||t.startsWith("https://"))return{component:null,module:null,filename:null};if(!t.startsWith("arib-dc://")&&!t.startsWith("arib://")&&(this.activeDocument?.startsWith("http://")||this.activeDocument?.startsWith("https://")))return{component:null,module:null,filename:null};if(t=this.removeDCReferencePrefix(t),"~"===t){const t=this.parseURL(this.activeDocument);return{component:t.component,module:null,filename:null}}t.startsWith("~/")&&(t=".."+t.substring(1)),t=new URL(t,"http://localhost"+this.activeDocument).pathname.toLowerCase();const e=t.split("/");return e.length>4?{component:null,module:null,filename:null}:{component:e[1]??null,module:e[2]??null,filename:null==e[3]?null:decodeURI(e[3])}}parseURLEx(t){const{component:e,module:n,filename:i}=this.parseURL(t),r=Number.parseInt(e??"",16),s=Number.parseInt(n??"",16);return Number.isInteger(r)?Number.isInteger(s)?{componentId:r,moduleId:s,filename:null==i?null:i}:{componentId:r,moduleId:null,filename:null}:{componentId:null,moduleId:null,filename:null}}parseAudioReference(t){const{component:e,module:n,filename:i}=this.parseURL(t);if(null==e||null!=n||null!=i)return{componentId:null,channelId:null};const[r,s,...o]=e.split(";");if(0!==o.length)return{componentId:null,channelId:null};const a=Number.parseInt(r??"",16);if(!Number.isInteger(a))return{componentId:null,channelId:null};if(null==s)return{componentId:a,channelId:null};const l=Number.parseInt(s??"");return!Number.isInteger(l)||l>3||l<1?{componentId:null,channelId:null}:{componentId:a,channelId:l}}get defaultAudioComponentId(){return 16}fetchLockedResource(t){const{component:e,module:n,filename:i}=this.parseURL(t),r=Number.parseInt(e??"",16),s=Number.parseInt(n??"",16);if(!Number.isInteger(r)||!Number.isInteger(s))return null;let o=this.lockedComponents.get(r);if(null==o&&(o=this.cachedComponents.get(r),null==o))return m("component not found failed to fetch",t),null;let a=o.modules.get(s);if(null==a&&(o=this.cachedComponents.get(r),a=o?.modules?.get(s),null==a))return m("module not found",t),null;const l=a.files.get(i);return null==l?null:l}async fetchRemoteResource(t){if(null==this.ip.get||null==this.activeDocument||null==this.baseURIDirectory)return null;const e=this.activeDocument.startsWith("http://")||this.activeDocument.startsWith("https://")?new URL(t,this.activeDocument).toString():t,n=this.cachedRemoteResources.get(e);if("undefined"!==typeof n)return n;const i=this.remoteResourceRequests.get(e);if(null!=i)return new Promise(((n,r)=>{i.push({url:e,resolve:e=>{"no-store"!==e?.cacheControl?n(e):this.fetchRemoteResource(t).then((t=>{n(t)}))}})}));const r=[];this.remoteResourceRequests.set(e,r),this.indicator?.setNetworkingGetStatus(!0);const{response:s,headers:o}=await this.ip.get(e);if(this.remoteResourceRequests.delete(e),0===this.remoteResourceRequests.size&&this.indicator?.setNetworkingGetStatus(!1),null==s||null==o){for(const{resolve:t}of r)t(null);return null}const a=o.get("content-type");let l={originalSubtype:"",originalType:"",parameters:[],subtype:"",type:""};if(null!=a){const t=u(a);null!=t.mediaType&&(l=t.mediaType)}const c={contentLocation:null,contentType:l,data:s,blobUrl:new Map,cacheControl:o.get("Cache-Control")?.toLowerCase()};if("no-store"!==c.cacheControl){this.cachedRemoteResources.set(e,c);for(const{resolve:t}of r)t(c)}return c}invalidateRemoteCache(t){if(null==this.ip.get||null==this.activeDocument||null==this.baseURIDirectory)return;const e=this.activeDocument.startsWith("http://")||this.activeDocument.startsWith("https://")?new URL(t,this.activeDocument).toString():t;this.cachedRemoteResources.delete(e)}fetchResourceAsync(t,e){if(this.isInternetContent&&((this.activeDocument?.startsWith("http://")||this.activeDocument?.startsWith("https://"))&&!t.startsWith("arib://")&&!t.startsWith("arib-dc://")||t.startsWith("http://")||t.startsWith("https://")))return this.fetchRemoteResource(t);const n=this.fetchLockedResource(t);if(n)return Promise.resolve(n);const{componentId:i,moduleId:r,filename:s}=this.parseURLEx(t);if(null==i||null==r)return Promise.resolve(null);if(this.pmtRetrieved){if(this.getCachedModule(i,r))return Promise.resolve(null);if(!this.getPMTComponent(i))return Promise.resolve(null);const t=this.downloadComponents.get(i);if(null!=t&&!t.modules.has(r))return Promise.resolve(null)}return f("async fetch requested",t),new Promise(((t,n)=>{const o=this.componentRequests.get(i),a={filename:s,resolve:t,requestType:e};if(null==o)this.componentRequests.set(i,{moduleRequests:new Map([[r,[a]]])});else{const t=o.moduleRequests.get(r);null==t?o.moduleRequests.set(r,[a]):t.push(a)}this.setReceivingStatus()}))}*getLockedModules(){for(const[t,e]of this.componentRequests)for(const[n,i]of e.moduleRequests)for(const e of i.reverse())if(null!=e.requestType){yield{module:`/${g(t,n)}`,isEx:"lockModuleOnMemoryEx"===e.requestType,requesting:!0};break}for(const t of this.lockedComponents.values())for(const e of t.modules.values())yield{module:`/${g(t.componentId,e.moduleId)}`,isEx:"lockModuleOnMemoryEx"===e.lockedBy,requesting:!1}}getProgramInfoAsync(){return null!=this.currentProgramInfo?Promise.resolve(this.currentProgramInfo):new Promise(((t,e)=>{this.programInfoCallbacks.push(t),this.setReceivingStatus()}))}parseServiceReference(t){const e=/^arib:\/\/(?[0-9a-f]+|-1)\.(?[0-9a-f]+|-1)\.(?[0-9a-f]+|-1)\/?$/i.exec(t)?.groups;if(null==e)return{originalNetworkId:null,transportStreamId:null,serviceId:null};let n=Number.parseInt(e.originalNetworkId,16),i=Number.parseInt(e.transportStreamId,16),r=Number.parseInt(e.serviceId,16);return-1==n&&(n=this.originalNetworkId),-1==i&&(i=this.transportStreamId),-1==r&&(r=this.serviceId),{originalNetworkId:n,transportStreamId:i,serviceId:r}}setReceivingStatus(){0!=this.programInfoCallbacks.length||[...this.componentRequests.values()].some((t=>0!=t.moduleRequests.size))?this.pmtRetrieved&&!this.pmtComponents.has(this.startupComponentId)||0===this.downloadComponents.get(this.startupComponentId)?.modules?.size?this.indicator?.setReceivingStatus(!1):this.indicator?.setReceivingStatus(!0):this.indicator?.setReceivingStatus(!1)}addEventListener(t,e,n){this.eventTarget.addEventListener(t,e,n)}removeEventListener(t,e,n){this.eventTarget.removeEventListener(t,e,n)}clearCache(){}get startupComponentId(){return this._profile===A.TrProfileC?128:64}get startupModuleId(){return 0}get isInternetContent(){return null!=this.baseURIDirectory}setBaseURIDirectory(t){this.baseURIDirectory=b(t)}checkBaseURIDirectory(t){if(null==this.baseURIDirectory)return!1;const e=b(this.activeDocument?.startsWith("http://")||this.activeDocument?.startsWith("https://")?new URL(t,this.activeDocument).toString():t);return e.startsWith(this.baseURIDirectory)}}function b(t){const e=new URL(t),n=e.hostname.toLowerCase();let i=e.pathname;const r=i.lastIndexOf("/");return-1!==r&&r!==i.length-1&&(i=i.substring(0,r)),i=i.replace(/%([0-9A-Fa-f]{2})/g,((t,e)=>{const n=Number.parseInt(e,16);return 47!==n&&n>=32&&n<127?String.fromCharCode(n):t})),n+i}},10329:function(t,e,n){"use strict";n.d(e,{Vl:function(){return o},td:function(){return s}});n(23767),n(8585),n(68696);var i=n(45254),r=n(50646);function s(t){if(0===t.length)return"";const e="�";let n="";for(let r=0;r=129&&t[r]<=239){let s,o;if(t[r]>=129&&t[r]<=159)s=2*(t[r]-129)+1;else{if(!(t[r]>=224&&t[r]<=239)){if(t[r]>=161&&t[r]<=223){n+=String.fromCharCode(t[r]-160+65376);continue}n+=e;continue}s=2*(t[r]-224)+63}if(r++,r>=t.length){n+=e;break}if(t[r]>=64&&t[r]<=126)o=t[r]-64+1;else if(t[r]>=128&&t[r]<=158)o=t[r]-128+64;else{if(!(t[r]>=159&&t[r]<=252)){n+=e;continue}s++,o=t[r]-159+1}const a=i.I[94*(s-1)+(o-1)];if("number"===typeof a)n+=a>=0?String.fromCharCode(a):e;else for(const t of a)n+=String.fromCharCode(t)}else t[r]<128?n+=String.fromCharCode(t[r]):n+=e;return n}function o(t){const e=new Uint8Array(2*t.length);let n=0;for(let i=0;i=65377&&s<=65439){e[n++]=s-65376+160;continue}const o=r.V[s];if(null==o&&s<128){e[n++]=s;continue}const a=(o??8750)-8224,l=a>>>8,c=255&a;l>=1&&l<=62?e[n++]=129+(l>>>1)-1:l>=63&&l<=94&&(e[n++]=(l>>>1)-63+224),e[n++]=l%2===1?c>=1&&c<=63?c+64-1:c+128-64:c+159-1}return e.subarray(0,n)}},81103:function(t,e,n){"use strict";n.d(e,{$:function(){return o},Y:function(){return a}});var i=n(60774),r=n(10329),s=n(37288);function o(t){return t===s.N.TrProfileC?r.td:i.OZ}function a(t){return t===s.N.TrProfileC?r.Vl:i.rh}},69809:function(t,e,n){"use strict";n.d(e,{Rk:function(){return a},Si:function(){return l},es:function(){return p},f6:function(){return c},oL:function(){return u}});var i=n(70057);const r=new Set(["padding-top","padding-right","padding-bottom","padding-left","border-width","left","top","width","height","line-height","font-size","letter-spacing"]),s=new Map(Object.entries({"color-index":"color","background-color-index":"background-color","border-bottom-color-index":"border-bottom-color","border-top-color-index":"border-top-color","border-left-color-index":"border-left-color","border-right-color-index":"border-right-color","border-color-index":"border-color","outline-color-index":"outline-color"})),o=new Set(["nav-index","nav-up","nav-right","nav-down","nav-left","used-key-list","resolution","display-aspect-ratio","grayscale-color-index","-wap-marquee-style","-wap-marquee-loop","-wap-marquee-dir","-wap-marquee-speed","-wap-input-format"]);function a(t){const e=/url\(\s*["']?(?.+?)['"]?\s*\)/.exec(t);if(null==e?.groups)return null;const n=e.groups["uri"].replace(/\\/g,"");return n}function l(t){if(null==t)return t;const e=parseInt(t);return Number.isFinite(e)?`var(--clut-color-${t})`:t}function c(t){if(null==t)return t;const e=/var\(--clut-color-(?\d+)\)/.exec(t);return e?.groups?.index??t}function u(t){const e=t.trim().toLowerCase();return"small"===e||"medium"===e||"large"===e?`var(--${e})`:t}function d(t){const e=t.trim().toLowerCase();return"normal"===e?"1":t}async function h(t,e){if("stylesheet"===t.type){const n=t;if(n.stylesheet)for(const t of n.stylesheet.rules)await h(t,e)}else if("rule"===t.type){const n=t;if(n.declarations){let t;null!=n.selectors&&(n.selectors=n.selectors.map((t=>t.replace(/(?<=\s*):(focus|active)(?=\s*)/i,((t,e)=>'[web-bml-state="'+e+'"]')))));for(let i=0;i{console.log(`[web-bml][${t}] ${e}`,...n)}:()=>{}}function r(t){return(e,...n)=>{console.log(`[web-bml][${t}] ${e}`,...n)}}function s(t){return(e,...n)=>{console.warn(`[web-bml][${t}] ${e}`,...n)}}function o(t){return(e,...n)=>{console.error(`[web-bml][${t}] ${e}`,...n)}}n.d(e,{Bd:function(){return r},by:function(){return o},gN:function(){return i},x7:function(){return s}})},59908:function(t,e,n){"use strict";function i(t,e,n,i){function r(t){return t instanceof n?t:new n((function(e){e(t)}))}return new(n||(n=Promise))((function(n,s){function o(t){try{l(i.next(t))}catch(e){s(e)}}function a(t){try{l(i["throw"](t))}catch(e){s(e)}}function l(t){t.done?n(t.value):r(t.value).then(o,a)}l((i=i.apply(t,e||[])).next())}))}function r(t){return i(this,void 0,void 0,(function*(){return new Promise((function(e,n){const i=document.createElement("img");i.crossOrigin="anonymous",i.src=t,i.onload=function(t){const n=t.target;e(n)},i.onabort=n,i.onerror=n}))}))}function s(t){return i(this,void 0,void 0,(function*(){return new Promise((function(e,n){const i=document.createElement("canvas"),r=i.getContext("2d");if(r){const{width:s,height:o}=t;i.width=s,i.height=o,r.drawImage(t,0,0,s,o),i.toBlob((function(t){t?e(t):n("Cannot get blob from image element")}),"image/png",1)}}))}))}function o(t){return i(this,void 0,void 0,(function*(){const e=URL.createObjectURL(t),n=yield r(e);return yield s(n)}))}function a(t){return i(this,void 0,void 0,(function*(){const e={[t.type]:t},n=new ClipboardItem(e);yield navigator.clipboard.write([n])}))}n.d(e,{BD:function(){return o},FH:function(){return a}})},19662:function(t,e,n){"use strict";var i=n(60614),r=n(66330),s=TypeError;t.exports=function(t){if(i(t))return t;throw s(r(t)+" is not a function")}},96077:function(t,e,n){"use strict";var i=n(60614),r=String,s=TypeError;t.exports=function(t){if("object"==typeof t||i(t))return t;throw s("Can't set "+r(t)+" as a prototype")}},25787:function(t,e,n){"use strict";var i=n(47976),r=TypeError;t.exports=function(t,e){if(i(e,t))return t;throw r("Incorrect invocation")}},19670:function(t,e,n){"use strict";var i=n(70111),r=String,s=TypeError;t.exports=function(t){if(i(t))return t;throw s(r(t)+" is not an object")}},23013:function(t){"use strict";t.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},90260:function(t,e,n){"use strict";var i,r,s,o=n(23013),a=n(19781),l=n(17854),c=n(60614),u=n(70111),d=n(92597),h=n(70648),p=n(66330),f=n(68880),m=n(98052),g=n(47045),v=n(47976),A=n(79518),y=n(27674),b=n(5112),w=n(69711),x=n(29909),S=x.enforce,C=x.get,E=l.Int8Array,k=E&&E.prototype,T=l.Uint8ClampedArray,I=T&&T.prototype,_=E&&A(E),O=k&&A(k),B=Object.prototype,P=l.TypeError,R=b("toStringTag"),M=w("TYPED_ARRAY_TAG"),D="TypedArrayConstructor",L=o&&!!y&&"Opera"!==h(l.opera),V=!1,N={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},j={BigInt64Array:8,BigUint64Array:8},F=function(t){if(!u(t))return!1;var e=h(t);return"DataView"===e||d(N,e)||d(j,e)},U=function(t){var e=A(t);if(u(e)){var n=C(e);return n&&d(n,D)?n[D]:U(e)}},z=function(t){if(!u(t))return!1;var e=h(t);return d(N,e)||d(j,e)},G=function(t){if(z(t))return t;throw P("Target is not a typed array")},H=function(t){if(c(t)&&(!y||v(_,t)))return t;throw P(p(t)+" is not a typed array constructor")},W=function(t,e,n,i){if(a){if(n)for(var r in N){var s=l[r];if(s&&d(s.prototype,t))try{delete s.prototype[t]}catch(o){try{s.prototype[t]=e}catch(c){}}}O[t]&&!n||m(O,t,n?e:L&&k[t]||e,i)}},J=function(t,e,n){var i,r;if(a){if(y){if(n)for(i in N)if(r=l[i],r&&d(r,t))try{delete r[t]}catch(s){}if(_[t]&&!n)return;try{return m(_,t,n?e:L&&_[t]||e)}catch(s){}}for(i in N)r=l[i],!r||r[t]&&!n||m(r,t,e)}};for(i in N)r=l[i],s=r&&r.prototype,s?S(s)[D]=r:L=!1;for(i in j)r=l[i],s=r&&r.prototype,s&&(S(s)[D]=r);if((!L||!c(_)||_===Function.prototype)&&(_=function(){throw P("Incorrect invocation")},L))for(i in N)l[i]&&y(l[i],_);if((!L||!O||O===B)&&(O=_.prototype,L))for(i in N)l[i]&&y(l[i].prototype,O);if(L&&A(I)!==O&&y(I,O),a&&!d(O,R))for(i in V=!0,g(O,R,{configurable:!0,get:function(){return u(this)?this[M]:void 0}}),N)l[i]&&f(l[i],M,i);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:L,TYPED_ARRAY_TAG:V&&M,aTypedArray:G,aTypedArrayConstructor:H,exportTypedArrayMethod:W,exportTypedArrayStaticMethod:J,getTypedArrayConstructor:U,isView:F,isTypedArray:z,TypedArray:_,TypedArrayPrototype:O}},97745:function(t,e,n){"use strict";var i=n(26244);t.exports=function(t,e){var n=0,r=i(e),s=new t(r);while(r>n)s[n]=e[n++];return s}},41318:function(t,e,n){"use strict";var i=n(45656),r=n(51400),s=n(26244),o=function(t){return function(e,n,o){var a,l=i(e),c=s(l),u=r(o,c);if(t&&n!==n){while(c>u)if(a=l[u++],a!==a)return!0}else for(;c>u;u++)if((t||u in l)&&l[u]===n)return t||u||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},83658:function(t,e,n){"use strict";var i=n(19781),r=n(43157),s=TypeError,o=Object.getOwnPropertyDescriptor,a=i&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=a?function(t,e){if(r(t)&&!o(t,"length").writable)throw s("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},21843:function(t,e,n){"use strict";var i=n(26244);t.exports=function(t,e){for(var n=i(t),r=new e(n),s=0;s=a||c<0)throw s("Incorrect index");for(var u=new e(a),d=0;dn)throw e("Maximum allowed index exceeded");return t}},93678:function(t){"use strict";t.exports={IndexSizeError:{s:"INDEX_SIZE_ERR",c:1,m:1},DOMStringSizeError:{s:"DOMSTRING_SIZE_ERR",c:2,m:0},HierarchyRequestError:{s:"HIERARCHY_REQUEST_ERR",c:3,m:1},WrongDocumentError:{s:"WRONG_DOCUMENT_ERR",c:4,m:1},InvalidCharacterError:{s:"INVALID_CHARACTER_ERR",c:5,m:1},NoDataAllowedError:{s:"NO_DATA_ALLOWED_ERR",c:6,m:0},NoModificationAllowedError:{s:"NO_MODIFICATION_ALLOWED_ERR",c:7,m:1},NotFoundError:{s:"NOT_FOUND_ERR",c:8,m:1},NotSupportedError:{s:"NOT_SUPPORTED_ERR",c:9,m:1},InUseAttributeError:{s:"INUSE_ATTRIBUTE_ERR",c:10,m:1},InvalidStateError:{s:"INVALID_STATE_ERR",c:11,m:1},SyntaxError:{s:"SYNTAX_ERR",c:12,m:1},InvalidModificationError:{s:"INVALID_MODIFICATION_ERR",c:13,m:1},NamespaceError:{s:"NAMESPACE_ERR",c:14,m:1},InvalidAccessError:{s:"INVALID_ACCESS_ERR",c:15,m:1},ValidationError:{s:"VALIDATION_ERR",c:16,m:0},TypeMismatchError:{s:"TYPE_MISMATCH_ERR",c:17,m:1},SecurityError:{s:"SECURITY_ERR",c:18,m:1},NetworkError:{s:"NETWORK_ERR",c:19,m:1},AbortError:{s:"ABORT_ERR",c:20,m:1},URLMismatchError:{s:"URL_MISMATCH_ERR",c:21,m:1},QuotaExceededError:{s:"QUOTA_EXCEEDED_ERR",c:22,m:1},TimeoutError:{s:"TIMEOUT_ERR",c:23,m:1},InvalidNodeTypeError:{s:"INVALID_NODE_TYPE_ERR",c:24,m:1},DataCloneError:{s:"DATA_CLONE_ERR",c:25,m:1}}},88113:function(t){"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},7392:function(t,e,n){"use strict";var i,r,s=n(17854),o=n(88113),a=s.process,l=s.Deno,c=a&&a.versions||l&&l.version,u=c&&c.v8;u&&(i=u.split("."),r=i[0]>0&&i[0]<4?1:+(i[0]+i[1])),!r&&o&&(i=o.match(/Edge\/(\d+)/),(!i||i[1]>=74)&&(i=o.match(/Chrome\/(\d+)/),i&&(r=+i[1]))),t.exports=r},80748:function(t){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},11060:function(t,e,n){"use strict";var i=n(1702),r=Error,s=i("".replace),o=function(t){return String(r(t).stack)}("zxcasd"),a=/\n\s*at [^:]*:[^\n]*/,l=a.test(o);t.exports=function(t,e){if(l&&"string"==typeof t&&!r.prepareStackTrace)while(e--)t=s(t,a,"");return t}},82109:function(t,e,n){"use strict";var i=n(17854),r=n(31236).f,s=n(68880),o=n(98052),a=n(13072),l=n(99920),c=n(54705);t.exports=function(t,e){var n,u,d,h,p,f,m=t.target,g=t.global,v=t.stat;if(u=g?i:v?i[m]||a(m,{}):(i[m]||{}).prototype,u)for(d in e){if(p=e[d],t.dontCallGetSet?(f=r(u,d),h=f&&f.value):h=u[d],n=c(g?d:m+(v?".":"#")+d,t.forced),!n&&void 0!==h){if(typeof p==typeof h)continue;l(p,h)}(t.sham||h&&h.sham)&&s(p,"sham",!0),o(u,d,p,t)}}},47293:function(t){"use strict";t.exports=function(t){try{return!!t()}catch(e){return!0}}},34374:function(t,e,n){"use strict";var i=n(47293);t.exports=!i((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},46916:function(t,e,n){"use strict";var i=n(34374),r=Function.prototype.call;t.exports=i?r.bind(r):function(){return r.apply(r,arguments)}},76530:function(t,e,n){"use strict";var i=n(19781),r=n(92597),s=Function.prototype,o=i&&Object.getOwnPropertyDescriptor,a=r(s,"name"),l=a&&"something"===function(){}.name,c=a&&(!i||i&&o(s,"name").configurable);t.exports={EXISTS:a,PROPER:l,CONFIGURABLE:c}},75668:function(t,e,n){"use strict";var i=n(1702),r=n(19662);t.exports=function(t,e,n){try{return i(r(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(s){}}},1702:function(t,e,n){"use strict";var i=n(34374),r=Function.prototype,s=r.call,o=i&&r.bind.bind(s,s);t.exports=i?o:function(t){return function(){return s.apply(t,arguments)}}},35005:function(t,e,n){"use strict";var i=n(17854),r=n(60614),s=function(t){return r(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?s(i[t]):i[t]&&i[t][e]}},58173:function(t,e,n){"use strict";var i=n(19662),r=n(68554);t.exports=function(t,e){var n=t[e];return r(n)?void 0:i(n)}},17854:function(t,e,n){"use strict";var i=function(t){return t&&t.Math===Math&&t};t.exports=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof n.g&&n.g)||function(){return this}()||this||Function("return this")()},92597:function(t,e,n){"use strict";var i=n(1702),r=n(47908),s=i({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return s(r(t),e)}},3501:function(t){"use strict";t.exports={}},64664:function(t,e,n){"use strict";var i=n(19781),r=n(47293),s=n(80317);t.exports=!i&&!r((function(){return 7!==Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},68361:function(t,e,n){"use strict";var i=n(1702),r=n(47293),s=n(84326),o=Object,a=i("".split);t.exports=r((function(){return!o("z").propertyIsEnumerable(0)}))?function(t){return"String"===s(t)?a(t,""):o(t)}:o},79587:function(t,e,n){"use strict";var i=n(60614),r=n(70111),s=n(27674);t.exports=function(t,e,n){var o,a;return s&&i(o=e.constructor)&&o!==n&&r(a=o.prototype)&&a!==n.prototype&&s(t,a),t}},42788:function(t,e,n){"use strict";var i=n(1702),r=n(60614),s=n(5465),o=i(Function.toString);r(s.inspectSource)||(s.inspectSource=function(t){return o(t)}),t.exports=s.inspectSource},29909:function(t,e,n){"use strict";var i,r,s,o=n(94811),a=n(17854),l=n(70111),c=n(68880),u=n(92597),d=n(5465),h=n(6200),p=n(3501),f="Object already initialized",m=a.TypeError,g=a.WeakMap,v=function(t){return s(t)?r(t):i(t,{})},A=function(t){return function(e){var n;if(!l(e)||(n=r(e)).type!==t)throw m("Incompatible receiver, "+t+" required");return n}};if(o||d.state){var y=d.state||(d.state=new g);y.get=y.get,y.has=y.has,y.set=y.set,i=function(t,e){if(y.has(t))throw m(f);return e.facade=t,y.set(t,e),e},r=function(t){return y.get(t)||{}},s=function(t){return y.has(t)}}else{var b=h("state");p[b]=!0,i=function(t,e){if(u(t,b))throw m(f);return e.facade=t,c(t,b,e),e},r=function(t){return u(t,b)?t[b]:{}},s=function(t){return u(t,b)}}t.exports={set:i,get:r,has:s,enforce:v,getterFor:A}},43157:function(t,e,n){"use strict";var i=n(84326);t.exports=Array.isArray||function(t){return"Array"===i(t)}},44067:function(t,e,n){"use strict";var i=n(70648);t.exports=function(t){var e=i(t);return"BigInt64Array"===e||"BigUint64Array"===e}},60614:function(t,e,n){"use strict";var i=n(4154),r=i.all;t.exports=i.IS_HTMLDDA?function(t){return"function"==typeof t||t===r}:function(t){return"function"==typeof t}},54705:function(t,e,n){"use strict";var i=n(47293),r=n(60614),s=/#|\.prototype\./,o=function(t,e){var n=l[a(t)];return n===u||n!==c&&(r(e)?i(e):!!e)},a=o.normalize=function(t){return String(t).replace(s,".").toLowerCase()},l=o.data={},c=o.NATIVE="N",u=o.POLYFILL="P";t.exports=o},68554:function(t){"use strict";t.exports=function(t){return null===t||void 0===t}},70111:function(t,e,n){"use strict";var i=n(60614),r=n(4154),s=r.all;t.exports=r.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:i(t)||t===s}:function(t){return"object"==typeof t?null!==t:i(t)}},31913:function(t){"use strict";t.exports=!1},52190:function(t,e,n){"use strict";var i=n(35005),r=n(60614),s=n(47976),o=n(43307),a=Object;t.exports=o?function(t){return"symbol"==typeof t}:function(t){var e=i("Symbol");return r(e)&&s(e.prototype,a(t))}},26244:function(t,e,n){"use strict";var i=n(17466);t.exports=function(t){return i(t.length)}},56339:function(t,e,n){"use strict";var i=n(1702),r=n(47293),s=n(60614),o=n(92597),a=n(19781),l=n(76530).CONFIGURABLE,c=n(42788),u=n(29909),d=u.enforce,h=u.get,p=String,f=Object.defineProperty,m=i("".slice),g=i("".replace),v=i([].join),A=a&&!r((function(){return 8!==f((function(){}),"length",{value:8}).length})),y=String(String).split("String"),b=t.exports=function(t,e,n){"Symbol("===m(p(e),0,7)&&(e="["+g(p(e),/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!o(t,"name")||l&&t.name!==e)&&(a?f(t,"name",{value:e,configurable:!0}):t.name=e),A&&n&&o(n,"arity")&&t.length!==n.arity&&f(t,"length",{value:n.arity});try{n&&o(n,"constructor")&&n.constructor?a&&f(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(r){}var i=d(t);return o(i,"source")||(i.source=v(y,"string"==typeof e?e:"")),t};Function.prototype.toString=b((function(){return s(this)&&h(this).source||c(this)}),"toString")},74758:function(t){"use strict";var e=Math.ceil,n=Math.floor;t.exports=Math.trunc||function(t){var i=+t;return(i>0?n:e)(i)}},56277:function(t,e,n){"use strict";var i=n(41340);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:i(t)}},3070:function(t,e,n){"use strict";var i=n(19781),r=n(64664),s=n(3353),o=n(19670),a=n(34948),l=TypeError,c=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d="enumerable",h="configurable",p="writable";e.f=i?s?function(t,e,n){if(o(t),e=a(e),o(n),"function"===typeof t&&"prototype"===e&&"value"in n&&p in n&&!n[p]){var i=u(t,e);i&&i[p]&&(t[e]=n.value,n={configurable:h in n?n[h]:i[h],enumerable:d in n?n[d]:i[d],writable:!1})}return c(t,e,n)}:c:function(t,e,n){if(o(t),e=a(e),o(n),r)try{return c(t,e,n)}catch(i){}if("get"in n||"set"in n)throw l("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},31236:function(t,e,n){"use strict";var i=n(19781),r=n(46916),s=n(55296),o=n(79114),a=n(45656),l=n(34948),c=n(92597),u=n(64664),d=Object.getOwnPropertyDescriptor;e.f=i?d:function(t,e){if(t=a(t),e=l(e),u)try{return d(t,e)}catch(n){}if(c(t,e))return o(!r(s.f,t,e),t[e])}},8006:function(t,e,n){"use strict";var i=n(16324),r=n(80748),s=r.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return i(t,s)}},25181:function(t,e){"use strict";e.f=Object.getOwnPropertySymbols},79518:function(t,e,n){"use strict";var i=n(92597),r=n(60614),s=n(47908),o=n(6200),a=n(49920),l=o("IE_PROTO"),c=Object,u=c.prototype;t.exports=a?c.getPrototypeOf:function(t){var e=s(t);if(i(e,l))return e[l];var n=e.constructor;return r(n)&&e instanceof n?n.prototype:e instanceof c?u:null}},47976:function(t,e,n){"use strict";var i=n(1702);t.exports=i({}.isPrototypeOf)},16324:function(t,e,n){"use strict";var i=n(1702),r=n(92597),s=n(45656),o=n(41318).indexOf,a=n(3501),l=i([].push);t.exports=function(t,e){var n,i=s(t),c=0,u=[];for(n in i)!r(a,n)&&r(i,n)&&l(u,n);while(e.length>c)r(i,n=e[c++])&&(~o(u,n)||l(u,n));return u}},55296:function(t,e){"use strict";var n={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,r=i&&!n.call({1:2},1);e.f=r?function(t){var e=i(this,t);return!!e&&e.enumerable}:n},27674:function(t,e,n){"use strict";var i=n(75668),r=n(19670),s=n(96077);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,n={};try{t=i(Object.prototype,"__proto__","set"),t(n,[]),e=n instanceof Array}catch(o){}return function(n,i){return r(n),s(i),e?t(n,i):n.__proto__=i,n}}():void 0)},92140:function(t,e,n){"use strict";var i=n(46916),r=n(60614),s=n(70111),o=TypeError;t.exports=function(t,e){var n,a;if("string"===e&&r(n=t.toString)&&!s(a=i(n,t)))return a;if(r(n=t.valueOf)&&!s(a=i(n,t)))return a;if("string"!==e&&r(n=t.toString)&&!s(a=i(n,t)))return a;throw o("Can't convert object to primitive value")}},53887:function(t,e,n){"use strict";var i=n(35005),r=n(1702),s=n(8006),o=n(25181),a=n(19670),l=r([].concat);t.exports=i("Reflect","ownKeys")||function(t){var e=s.f(a(t)),n=o.f;return n?l(e,n(t)):e}},84488:function(t,e,n){"use strict";var i=n(68554),r=TypeError;t.exports=function(t){if(i(t))throw r("Can't call method on "+t);return t}},6200:function(t,e,n){"use strict";var i=n(72309),r=n(69711),s=i("keys");t.exports=function(t){return s[t]||(s[t]=r(t))}},5465:function(t,e,n){"use strict";var i=n(17854),r=n(13072),s="__core-js_shared__",o=i[s]||r(s,{});t.exports=o},72309:function(t,e,n){"use strict";var i=n(31913),r=n(5465);(t.exports=function(t,e){return r[t]||(r[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.32.2",mode:i?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.32.2/LICENSE",source:"https://github.com/zloirock/core-js"})},36293:function(t,e,n){"use strict";var i=n(7392),r=n(47293),s=n(17854),o=s.String;t.exports=!!Object.getOwnPropertySymbols&&!r((function(){var t=Symbol("symbol detection");return!o(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&i&&i<41}))},51400:function(t,e,n){"use strict";var i=n(19303),r=Math.max,s=Math.min;t.exports=function(t,e){var n=i(t);return n<0?r(n+e,0):s(n,e)}},64599:function(t,e,n){"use strict";var i=n(57593),r=TypeError;t.exports=function(t){var e=i(t,"number");if("number"==typeof e)throw r("Can't convert number to bigint");return BigInt(e)}},45656:function(t,e,n){"use strict";var i=n(68361),r=n(84488);t.exports=function(t){return i(r(t))}},19303:function(t,e,n){"use strict";var i=n(74758);t.exports=function(t){var e=+t;return e!==e||0===e?0:i(e)}},17466:function(t,e,n){"use strict";var i=n(19303),r=Math.min;t.exports=function(t){return t>0?r(i(t),9007199254740991):0}},47908:function(t,e,n){"use strict";var i=n(84488),r=Object;t.exports=function(t){return r(i(t))}},57593:function(t,e,n){"use strict";var i=n(46916),r=n(70111),s=n(52190),o=n(58173),a=n(92140),l=n(5112),c=TypeError,u=l("toPrimitive");t.exports=function(t,e){if(!r(t)||s(t))return t;var n,l=o(t,u);if(l){if(void 0===e&&(e="default"),n=i(l,t,e),!r(n)||s(n))return n;throw c("Can't convert object to primitive value")}return void 0===e&&(e="number"),a(t,e)}},34948:function(t,e,n){"use strict";var i=n(57593),r=n(52190);t.exports=function(t){var e=i(t,"string");return r(e)?e:e+""}},51694:function(t,e,n){"use strict";var i=n(5112),r=i("toStringTag"),s={};s[r]="z",t.exports="[object z]"===String(s)},41340:function(t,e,n){"use strict";var i=n(70648),r=String;t.exports=function(t){if("Symbol"===i(t))throw TypeError("Cannot convert a Symbol value to a string");return r(t)}},66330:function(t){"use strict";var e=String;t.exports=function(t){try{return e(t)}catch(n){return"Object"}}},69711:function(t,e,n){"use strict";var i=n(1702),r=0,s=Math.random(),o=i(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+o(++r+s,36)}},43307:function(t,e,n){"use strict";var i=n(36293);t.exports=i&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:function(t,e,n){"use strict";var i=n(19781),r=n(47293);t.exports=i&&r((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},94811:function(t,e,n){"use strict";var i=n(17854),r=n(60614),s=i.WeakMap;t.exports=r(s)&&/native code/.test(String(s))},5112:function(t,e,n){"use strict";var i=n(17854),r=n(72309),s=n(92597),o=n(69711),a=n(36293),l=n(43307),c=i.Symbol,u=r("wks"),d=l?c["for"]||c:c&&c.withoutSetter||o;t.exports=function(t){return s(u,t)||(u[t]=a&&s(c,t)?c[t]:d("Symbol."+t)),u[t]}},57658:function(t,e,n){"use strict";var i=n(82109),r=n(47908),s=n(26244),o=n(83658),a=n(7207),l=n(47293),c=l((function(){return 4294967297!==[].push.call({length:4294967296},1)})),u=function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}},d=c||!u();i({target:"Array",proto:!0,arity:1,forced:d},{push:function(t){var e=r(this),n=s(e),i=arguments.length;a(n+i);for(var l=0;l>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,t=1&t?-306674912^t>>>1:t>>>1,e[n]=t;return"undefined"!==typeof Int32Array?new Int32Array(e):e}t.version="1.2.2";var n=e();function i(t){var e=0,n=0,i=0,r="undefined"!==typeof Int32Array?new Int32Array(4096):new Array(4096);for(i=0;256!=i;++i)r[i]=t[i];for(i=0;256!=i;++i)for(n=t[i],e=256+i;e<4096;e+=256)n=r[e]=n>>>8^t[255&n];var s=[];for(i=1;16!=i;++i)s[i-1]="undefined"!==typeof Int32Array?r.subarray(256*i,256*i+256):r.slice(256*i,256*i+256);return s}var r=i(n),s=r[0],o=r[1],a=r[2],l=r[3],c=r[4],u=r[5],d=r[6],h=r[7],p=r[8],f=r[9],m=r[10],g=r[11],v=r[12],A=r[13],y=r[14];function b(t,e){for(var i=-1^e,r=0,s=t.length;r>>8^n[255&(i^t.charCodeAt(r++))];return~i}function w(t,e){for(var i=-1^e,r=t.length-15,b=0;b>8&255]^v[t[b++]^i>>16&255]^g[t[b++]^i>>>24]^m[t[b++]]^f[t[b++]]^p[t[b++]]^h[t[b++]]^d[t[b++]]^u[t[b++]]^c[t[b++]]^l[t[b++]]^a[t[b++]]^o[t[b++]]^s[t[b++]]^n[t[b++]];r+=15;while(b>>8^n[255&(i^t[b++])];return~i}function x(t,e){for(var i=-1^e,r=0,s=t.length,o=0,a=0;r>>8^n[255&(i^o)]:o<2048?(i=i>>>8^n[255&(i^(192|o>>6&31))],i=i>>>8^n[255&(i^(128|63&o))]):o>=55296&&o<57344?(o=64+(1023&o),a=1023&t.charCodeAt(r++),i=i>>>8^n[255&(i^(240|o>>8&7))],i=i>>>8^n[255&(i^(128|o>>2&63))],i=i>>>8^n[255&(i^(128|a>>6&15|(3&o)<<4))],i=i>>>8^n[255&(i^(128|63&a))]):(i=i>>>8^n[255&(i^(224|o>>12&15))],i=i>>>8^n[255&(i^(128|o>>6&63))],i=i>>>8^n[255&(i^(128|63&o))]);return~i}t.table=n,t.bstr=b,t.buf=w,t.str=x}))},70057:function(t,e,n){e.parse=n(49951),e.stringify=n(29980)},49951:function(t){var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g;function n(t){return t?t.replace(/^\s+|\s+$/g,""):""}function i(t,e){var n=t&&"string"===typeof t.type,r=n?t:e;for(var s in t){var o=t[s];Array.isArray(o)?o.forEach((function(t){i(t,r)})):o&&"object"===typeof o&&i(o,r)}return n&&Object.defineProperty(t,"parent",{configurable:!0,writable:!0,enumerable:!1,value:e||null}),t}t.exports=function(t,r){r=r||{};var s=1,o=1;function a(t){var e=t.match(/\n/g);e&&(s+=e.length);var n=t.lastIndexOf("\n");o=~n?t.length-n:o+t.length}function l(){var t={line:s,column:o};return function(e){return e.position=new c(t),v(),e}}function c(t){this.start=t,this.end={line:s,column:o},this.source=r.source}c.prototype.content=t;var u=[];function d(e){var n=new Error(r.source+":"+s+":"+o+": "+e);if(n.reason=e,n.filename=r.source,n.line=s,n.column=o,n.source=t,!r.silent)throw n;u.push(n)}function h(){var t=m();return{type:"stylesheet",stylesheet:{source:r.source,rules:t,parsingErrors:u}}}function p(){return g(/^{\s*/)}function f(){return g(/^}/)}function m(){var e,n=[];v(),A(n);while(t.length&&"}"!=t.charAt(0)&&(e=L()||V()))!1!==e&&(n.push(e),A(n));return n}function g(e){var n=e.exec(t);if(n){var i=n[0];return a(i),t=t.slice(i.length),n}}function v(){g(/^\s*/)}function A(t){var e;t=t||[];while(e=y())!1!==e&&t.push(e);return t}function y(){var e=l();if("/"==t.charAt(0)&&"*"==t.charAt(1)){var n=2;while(""!=t.charAt(n)&&("*"!=t.charAt(n)||"/"!=t.charAt(n+1)))++n;if(n+=2,""===t.charAt(n-1))return d("End of comment missing");var i=t.slice(2,n-2);return o+=2,a(i),t=t.slice(n),o+=2,e({type:"comment",comment:i})}}function b(){var t=g(/^([^{]+)/);if(t)return n(t[0]).replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g,"").replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g,(function(t){return t.replace(/,/g,"‌")})).split(/\s*(?![^(]*\)),\s*/).map((function(t){return t.replace(/\u200C/g,",")}))}function w(){var t=l(),i=g(/^[\s;]*(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/);if(i){if(i=n(i[1]),!g(/^:\s*/))return d("property missing ':'");var r=g(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/),s=t({type:"declaration",property:i.replace(e,""),value:r?n(r[0]).replace(e,""):""});return g(/^[;\s]*/),s}}function x(){var t,e=[];if(!p())return d("missing '{'");A(e);while(t=w())!1!==t&&(e.push(t),A(e));return f()?e:d("missing '}'")}function S(){var t,e=[],n=l();while(t=g(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/))e.push(t[1]),g(/^,\s*/);if(e.length)return n({type:"keyframe",values:e,declarations:x()})}function C(){var t=l(),e=g(/^@([-\w]+)?keyframes\s*/);if(e){var n=e[1];e=g(/^([-\w]+)\s*/);if(!e)return d("@keyframes missing name");var i,r=e[1];if(!p())return d("@keyframes missing '{'");var s=A();while(i=S())s.push(i),s=s.concat(A());return f()?t({type:"keyframes",name:r,vendor:n,keyframes:s}):d("@keyframes missing '}'")}}function E(){var t=l(),e=g(/^@supports *([^{]+)/);if(e){var i=n(e[1]);if(!p())return d("@supports missing '{'");var r=A().concat(m());return f()?t({type:"supports",supports:i,rules:r}):d("@supports missing '}'")}}function k(){var t=l(),e=g(/^@host\s*/);if(e){if(!p())return d("@host missing '{'");var n=A().concat(m());return f()?t({type:"host",rules:n}):d("@host missing '}'")}}function T(){var t=l(),e=g(/^@media *([^{]+)/);if(e){var i=n(e[1]);if(!p())return d("@media missing '{'");var r=A().concat(m());return f()?t({type:"media",media:i,rules:r}):d("@media missing '}'")}}function I(){var t=l(),e=g(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/);if(e)return t({type:"custom-media",name:n(e[1]),media:n(e[2])})}function _(){var t=l(),e=g(/^@page */);if(e){var n=b()||[];if(!p())return d("@page missing '{'");var i,r=A();while(i=w())r.push(i),r=r.concat(A());return f()?t({type:"page",selectors:n,declarations:r}):d("@page missing '}'")}}function O(){var t=l(),e=g(/^@([-\w]+)?document *([^{]+)/);if(e){var i=n(e[1]),r=n(e[2]);if(!p())return d("@document missing '{'");var s=A().concat(m());return f()?t({type:"document",document:r,vendor:i,rules:s}):d("@document missing '}'")}}function B(){var t=l(),e=g(/^@font-face\s*/);if(e){if(!p())return d("@font-face missing '{'");var n,i=A();while(n=w())i.push(n),i=i.concat(A());return f()?t({type:"font-face",declarations:i}):d("@font-face missing '}'")}}var P=D("import"),R=D("charset"),M=D("namespace");function D(t){var e=new RegExp("^@"+t+"\\s*([^;]+);");return function(){var n=l(),i=g(e);if(i){var r={type:t};return r[t]=i[1].trim(),n(r)}}}function L(){if("@"==t[0])return C()||T()||I()||E()||P()||R()||M()||O()||_()||k()||B()}function V(){var t=l(),e=b();return e?(A(),t({type:"rule",selectors:e,declarations:x()})):d("selector missing")}return i(h())}},57146:function(t){function e(t){this.options=t||{}}t.exports=e,e.prototype.emit=function(t){return t},e.prototype.visit=function(t){return this[t.type](t)},e.prototype.mapVisit=function(t,e){var n="";e=e||"";for(var i=0,r=t.length;i=e?t:""+Array(e+1-i.length).join(n)+t},A={s:v,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),i=Math.floor(n/60),r=n%60;return(e<=0?"+":"-")+v(i,2,"0")+":"+v(r,2,"0")},m:function t(e,n){if(e.date()1)return t(o[0])}else{var a=e.name;b[a]=e,r=a}return!i&&r&&(y=r),r||!i&&y},S=function(t,e){if(w(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new E(n)},C=A;C.l=x,C.i=w,C.w=function(t,e){return S(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var E=function(){function g(t){this.$L=x(t.locale,null,!0),this.parse(t)}var v=g.prototype;return v.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(C.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var i=e.match(f);if(i){var r=i[2]-1||0,s=(i[7]||"0").substring(0,3);return n?new Date(Date.UTC(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,s)):new Date(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,s)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},v.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},v.$utils=function(){return C},v.isValid=function(){return!(this.$d.toString()===p)},v.isSame=function(t,e){var n=S(t);return this.startOf(e)<=n&&n<=this.endOf(e)},v.isAfter=function(t,e){return S(t)(()=>{var t={368:(t,e,n)=>{var i=n(454);t.exports=function(t){"use strict";var e,r="",s=(t=t||{}).video,o=t.options,a=i.$escape,l=t.tran,c=t.icons,u=i.$each,d=(t.$value,t.$index,t.index);return r+='
\n
\n
\n ',e=n(953)(s),r+=e,r+="\n
\n ",o.logo&&(r+='\n \n '),r+='\n
\n
\n
\n
\n
\n \n ',o.danmaku&&(r+='\n ',r+=a(l("Danmaku is loading")),r+="\n "),r+='\n ',r+=c.loading,r+='\n
\n
\n
\n
\n
\n \n \n ',r+=c.send,r+='\n \n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n \n 00:00 /\n 00:00\n \n ',o.live&&(r+='\n ',r+=a(l("Live")),r+="\n \n \n "),r+='\n
\n
\n ',o.screenshot&&(r+='\n
\n
\n "),r+="\n ",o.airplay&&(r+='\n
\n
\n "),r+='\n
\n \n
\n ",o.subtitle&&(r+='\n
\n \n
\n "),r+='\n
\n \n
\n
\n \n \n \n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n ',r+=a(o.video.quality[o.video.defaultQuality].name),r+='\n
',r+=c.right,r+="
\n
\n "),r+='\n
\n ',r+=a(l("Audio")),r+='\n ',r+=a(l("Primary audio")),r+='\n
',r+=c.right,r+='
\n
\n
\n ',r+=a(l("Speed")),r+='\n ',r+=a(l("Normal")),r+='\n
',r+=c.right,r+='
\n
\n
\n ',r+=a(l("Loop")),r+='\n
\n \n \n
\n
\n
\n ',r+=a(l("Show danmaku")),r+='\n
\n \n \n
\n
\n
\n ',r+=a(l("Unlimited danmaku")),r+='\n
\n \n \n
\n
\n
\n ',r+=a(l("Opacity for danmaku")),r+='\n 1.0\n
\n
\n
\n \n
\n
\n
\n
\n \n ',o.video.quality&&(r+='\n
\n
\n
',r+=c.left,r+='
\n ',r+=a(l("Quality")),r+="\n
\n ",u(o.video.quality,(function(t,e){r+='\n
\n
',r+=c.check,r+='
\n ',r+=a(t.name),r+="\n
\n "})),r+="\n
\n "),r+='\n
\n
\n
',r+=c.left,r+='
\n ',r+=a(l("Speed")),r+="\n
\n ",u(o.playbackSpeed,(function(t,e){r+='\n
\n
',r+=c.check,r+='
\n ',r+=a(1===t?l("Normal"):t),r+="\n
\n "})),r+='\n
\n
\n
\n
',r+=c.left,r+='
\n ',r+=a(l("Audio")),r+='\n
\n
\n
',r+=c.check,r+='
\n ',r+=a(l("Primary audio")),r+='\n
\n
\n
',r+=c.check,r+='
\n ',r+=a(l("Secondary audio")),r+='\n
\n
\n\n
\n
\n
',r+=a(l("Set danmaku color")),r+='
\n
\n \n \n \n \n \n \n \n \n
\n
\n
\n
',r+=a(l("Set danmaku type")),r+='
\n \n \n \n
\n
\n
',r+=a(l("Set danmaku size")),r+='
\n \n \n \n
\n
\n
\n
[x]
\n
\n Player version\n \n
\n
\n Player FPS\n \n
\n
\n Video type\n \n
\n
\n Video url\n \n
\n
\n Video resolution\n \n
\n
\n Video duration\n \n
\n ',o.danmaku&&(r+='\n
\n Danmaku id\n \n
\n
\n Danmaku api\n \n
\n
\n Danmaku amount\n \n
\n '),r+='\n
\n
\n ',u(o.contextmenu,(function(t,e){r+='\n
\n ',r+=a(l(t.text)),r+="\n
\n "})),r+='\n
\n
\n
\n \n \n \n
\n"}},953:(t,e,n)=>{var i=n(454);t.exports=function(t){"use strict";var e="",n=(t=t||{}).enableSubtitle,r=t.subtitle,s=t.current,o=t.airplay,a=t.pic,l=i.$escape,c=t.screenshot,u=t.preload,d=t.url;return n=r&&"webvtt"===r.type,e+='\n\n ",n&&(e+='\n \n '),e+"\n\n"}},170:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(236),r=n.n(i),s=n(66),o=n.n(s)()(r());o.push([t.id,':root{--balloon-border-radius:2px;--balloon-color:#101010f2;--balloon-text-color:#fff;--balloon-font-size:12px;--balloon-move:4px}button[aria-label][data-balloon-pos]{overflow:visible}[aria-label][data-balloon-pos]{cursor:pointer;position:relative}[aria-label][data-balloon-pos]:after{background:var(--balloon-color);border-radius:2px;border-radius:var(--balloon-border-radius);color:var(--balloon-text-color);content:attr(aria-label);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:var(--balloon-font-size);font-style:normal;font-weight:400;padding:.5em 1em;text-indent:0;text-shadow:none;white-space:nowrap}[aria-label][data-balloon-pos]:after,[aria-label][data-balloon-pos]:before{opacity:0;pointer-events:none;position:absolute;transition:all .18s ease-out .18s;z-index:10}[aria-label][data-balloon-pos]:before{border:5px solid #0000;border-top:5px solid var(--balloon-color);content:"";height:0;width:0}[aria-label][data-balloon-pos]:hover:after,[aria-label][data-balloon-pos]:hover:before,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after,[aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before,[aria-label][data-balloon-pos][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-visible]:before{opacity:1;pointer-events:none}[aria-label][data-balloon-pos].font-awesome:after{font-family:FontAwesome,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}[aria-label][data-balloon-pos][data-balloon-break]:after{white-space:pre}[aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after{white-space:pre-line;word-break:break-word}[aria-label][data-balloon-pos][data-balloon-blunt]:after,[aria-label][data-balloon-pos][data-balloon-blunt]:before{transition:none}[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=down][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=up][data-balloon-visible]:before{transform:translate(-50%)}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:after{left:0}[aria-label][data-balloon-pos][data-balloon-pos*=-left]:before{left:5px}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:after{right:0}[aria-label][data-balloon-pos][data-balloon-pos*=-right]:before{right:5px}[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:after,[aria-label][data-balloon-pos][data-balloon-po*=-left]:hover:before,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-po*=-left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos*=-right][data-balloon-visible]:before{transform:translate(0)}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after,[aria-label][data-balloon-pos][data-balloon-pos^=up]:before{bottom:100%;transform:translateY(var(--balloon-move));transform-origin:top}[aria-label][data-balloon-pos][data-balloon-pos^=up]:after{margin-bottom:10px}[aria-label][data-balloon-pos][data-balloon-pos=up]:after,[aria-label][data-balloon-pos][data-balloon-pos=up]:before{left:50%;transform:translate(-50%,var(--balloon-move))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after,[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{top:100%;transform:translateY(calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos^=down]:after{margin-top:10px}[aria-label][data-balloon-pos][data-balloon-pos^=down]:before{border:5px solid #0000;border-bottom:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=down]:after,[aria-label][data-balloon-pos][data-balloon-pos=down]:before{left:50%;transform:translate(-50%,calc(var(--balloon-move)*-1))}[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=left][data-balloon-visible]:before,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:hover:before,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:after,[aria-label][data-balloon-pos][data-balloon-pos=right][data-balloon-visible]:before{transform:translateY(-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after,[aria-label][data-balloon-pos][data-balloon-pos=left]:before{right:100%;top:50%;transform:translate(var(--balloon-move),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=left]:after{margin-right:10px}[aria-label][data-balloon-pos][data-balloon-pos=left]:before{border:5px solid #0000;border-left:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-pos=right]:after,[aria-label][data-balloon-pos][data-balloon-pos=right]:before{left:100%;top:50%;transform:translate(calc(var(--balloon-move)*-1),-50%)}[aria-label][data-balloon-pos][data-balloon-pos=right]:after{margin-left:10px}[aria-label][data-balloon-pos][data-balloon-pos=right]:before{border:5px solid #0000;border-right:5px solid var(--balloon-color);height:0;width:0}[aria-label][data-balloon-pos][data-balloon-length]:after{white-space:normal}[aria-label][data-balloon-pos][data-balloon-length=small]:after{width:80px}[aria-label][data-balloon-pos][data-balloon-length=medium]:after{width:150px}[aria-label][data-balloon-pos][data-balloon-length=large]:after{width:260px}[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:380px}@media screen and (max-width:768px){[aria-label][data-balloon-pos][data-balloon-length=xlarge]:after{width:90vw}}[aria-label][data-balloon-pos][data-balloon-length=fit]:after{width:100%}',"",{version:3,sources:["webpack://./node_modules/balloon-css/balloon.css"],names:[],mappings:"AAAA,MACE,2BAA4B,CAC5B,yBAAuC,CACvC,yBAA0B,CAC1B,wBAAyB,CACzB,kBAAqB,CAEvB,qCACE,gBAAmB,CAErB,+BAEE,cAAe,CADf,iBACiB,CACjB,qCAUE,+BAAgC,CAChC,iBAAkB,CAElB,0CAA2C,CAD3C,+BAAgC,CAEhC,wBAAyB,CATzB,wHAAwI,CAIxI,kCAAmC,CAFnC,iBAAkB,CADlB,eAAmB,CASnB,gBAAiB,CAXjB,aAAc,CAId,gBAAiB,CASjB,kBACa,CACf,2EAlBE,SAAU,CACV,mBAAoB,CAcpB,iBAAkB,CAblB,iCAAoC,CAepC,UAWa,CAVf,sCAIE,sBAAsC,CAAtC,yCAAsC,CAItC,UAAW,CANX,QAAS,CADT,OASa,CACf,6VACE,SAAU,CACV,mBAAsB,CACxB,kDACE,oIAAuJ,CACzJ,yDACE,eAAkB,CACpB,8EACE,oBAAqB,CACrB,qBAAwB,CAC1B,mHACE,eAAkB,CAGpB,4kBACE,yBAA+B,CACjC,8DACE,MAAS,CACX,+DACE,QAAW,CACb,+DACE,OAAU,CACZ,gEACE,SAAY,CAGd,omBACE,sBAA4B,CAC9B,uHACE,WAAY,CAEZ,yCAA4C,CAD5C,oBAC8C,CAChD,2DACE,kBAAqB,CACvB,qHACE,QAAS,CACT,6CAAiD,CACnD,2HACE,QAAS,CACT,kDAAyD,CAC3D,6DACE,eAAkB,CACpB,8DAIE,sBAAyC,CAAzC,4CAAyC,CAFzC,QAAS,CADT,OAG2C,CAC7C,yHACE,QAAS,CACT,sDAA4D,CAG9D,wlBACE,0BAA+B,CACjC,yHACE,UAAW,CACX,OAAQ,CACR,6CAAiD,CACnD,4DACE,iBAAoB,CACtB,6DAIE,sBAAuC,CAAvC,0CAAuC,CAFvC,QAAS,CADT,OAGyC,CAC3C,2HACE,SAAU,CACV,OAAQ,CACR,sDAA4D,CAC9D,6DACE,gBAAmB,CACrB,8DAIE,sBAAwC,CAAxC,2CAAwC,CAFxC,QAAS,CADT,OAG0C,CAC5C,0DACE,kBAAqB,CACvB,gEACE,UAAa,CACf,iEACE,WAAc,CAChB,gEACE,WAAc,CAChB,iEACE,WAAc,CACd,oCACE,iEACE,UAAa,CAAE,CACrB,8DACE,UAAa",sourcesContent:[':root {\n --balloon-border-radius: 2px;\n --balloon-color: rgba(16, 16, 16, 0.95);\n --balloon-text-color: #fff;\n --balloon-font-size: 12px;\n --balloon-move: 4px; }\n\nbutton[aria-label][data-balloon-pos] {\n overflow: visible; }\n\n[aria-label][data-balloon-pos] {\n position: relative;\n cursor: pointer; }\n [aria-label][data-balloon-pos]:after {\n opacity: 0;\n pointer-events: none;\n transition: all 0.18s ease-out 0.18s;\n text-indent: 0;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;\n font-weight: normal;\n font-style: normal;\n text-shadow: none;\n font-size: var(--balloon-font-size);\n background: var(--balloon-color);\n border-radius: 2px;\n color: var(--balloon-text-color);\n border-radius: var(--balloon-border-radius);\n content: attr(aria-label);\n padding: .5em 1em;\n position: absolute;\n white-space: nowrap;\n z-index: 10; }\n [aria-label][data-balloon-pos]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-top-color: var(--balloon-color);\n opacity: 0;\n pointer-events: none;\n transition: all 0.18s ease-out 0.18s;\n content: "";\n position: absolute;\n z-index: 10; }\n [aria-label][data-balloon-pos]:hover:before, [aria-label][data-balloon-pos]:hover:after, [aria-label][data-balloon-pos][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-visible]:after, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:before, [aria-label][data-balloon-pos]:not([data-balloon-nofocus]):focus:after {\n opacity: 1;\n pointer-events: none; }\n [aria-label][data-balloon-pos].font-awesome:after {\n font-family: FontAwesome, -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, Oxygen, Ubuntu, Cantarell, \'Open Sans\', \'Helvetica Neue\', sans-serif; }\n [aria-label][data-balloon-pos][data-balloon-break]:after {\n white-space: pre; }\n [aria-label][data-balloon-pos][data-balloon-break][data-balloon-length]:after {\n white-space: pre-line;\n word-break: break-word; }\n [aria-label][data-balloon-pos][data-balloon-blunt]:before, [aria-label][data-balloon-pos][data-balloon-blunt]:after {\n transition: none; }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="up"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos="down"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="down"][data-balloon-visible]:after {\n transform: translate(-50%, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="up"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos="down"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="down"][data-balloon-visible]:before {\n transform: translate(-50%, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos*="-left"]:after {\n left: 0; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-left"]:before {\n left: 5px; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:after {\n right: 0; }\n [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:before {\n right: 5px; }\n [aria-label][data-balloon-pos][data-balloon-po*="-left"]:hover:after, [aria-label][data-balloon-pos][data-balloon-po*="-left"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos*="-right"][data-balloon-visible]:after {\n transform: translate(0, 0); }\n [aria-label][data-balloon-pos][data-balloon-po*="-left"]:hover:before, [aria-label][data-balloon-pos][data-balloon-po*="-left"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos*="-right"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos*="-right"][data-balloon-visible]:before {\n transform: translate(0, 0); }\n [aria-label][data-balloon-pos][data-balloon-pos^="up"]:before, [aria-label][data-balloon-pos][data-balloon-pos^="up"]:after {\n bottom: 100%;\n transform-origin: top;\n transform: translate(0, var(--balloon-move)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="up"]:after {\n margin-bottom: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="up"]:before, [aria-label][data-balloon-pos][data-balloon-pos="up"]:after {\n left: 50%;\n transform: translate(-50%, var(--balloon-move)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:before, [aria-label][data-balloon-pos][data-balloon-pos^="down"]:after {\n top: 100%;\n transform: translate(0, calc(var(--balloon-move) * -1)); }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:after {\n margin-top: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos^="down"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-bottom-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-pos="down"]:after, [aria-label][data-balloon-pos][data-balloon-pos="down"]:before {\n left: 50%;\n transform: translate(-50%, calc(var(--balloon-move) * -1)); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="left"][data-balloon-visible]:after, [aria-label][data-balloon-pos][data-balloon-pos="right"]:hover:after, [aria-label][data-balloon-pos][data-balloon-pos="right"][data-balloon-visible]:after {\n transform: translate(0, -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="left"][data-balloon-visible]:before, [aria-label][data-balloon-pos][data-balloon-pos="right"]:hover:before, [aria-label][data-balloon-pos][data-balloon-pos="right"][data-balloon-visible]:before {\n transform: translate(0, -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:after, [aria-label][data-balloon-pos][data-balloon-pos="left"]:before {\n right: 100%;\n top: 50%;\n transform: translate(var(--balloon-move), -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:after {\n margin-right: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="left"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-left-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:after, [aria-label][data-balloon-pos][data-balloon-pos="right"]:before {\n left: 100%;\n top: 50%;\n transform: translate(calc(var(--balloon-move) * -1), -50%); }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:after {\n margin-left: 10px; }\n [aria-label][data-balloon-pos][data-balloon-pos="right"]:before {\n width: 0;\n height: 0;\n border: 5px solid transparent;\n border-right-color: var(--balloon-color); }\n [aria-label][data-balloon-pos][data-balloon-length]:after {\n white-space: normal; }\n [aria-label][data-balloon-pos][data-balloon-length="small"]:after {\n width: 80px; }\n [aria-label][data-balloon-pos][data-balloon-length="medium"]:after {\n width: 150px; }\n [aria-label][data-balloon-pos][data-balloon-length="large"]:after {\n width: 260px; }\n [aria-label][data-balloon-pos][data-balloon-length="xlarge"]:after {\n width: 380px; }\n @media screen and (max-width: 768px) {\n [aria-label][data-balloon-pos][data-balloon-length="xlarge"]:after {\n width: 90vw; } }\n [aria-label][data-balloon-pos][data-balloon-length="fit"]:after {\n width: 100%; }\n'],sourceRoot:""}]);const a=o},869:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(236),r=n.n(i),s=n(66),o=n.n(s),a=n(170),l=o()(r());l.i(a.Z),l.push([t.id,'@keyframes my-face{2%{transform:translateY(1.5px) rotate(1.5deg)}4%{transform:translateY(-1.5px) rotate(-.5deg)}6%{transform:translateY(1.5px) rotate(-1.5deg)}8%{transform:translateY(-1.5px) rotate(-1.5deg)}10%{transform:translateY(2.5px) rotate(1.5deg)}12%{transform:translateY(-.5px) rotate(1.5deg)}14%{transform:translateY(-1.5px) rotate(1.5deg)}16%{transform:translateY(-.5px) rotate(-1.5deg)}18%{transform:translateY(.5px) rotate(-1.5deg)}20%{transform:translateY(-1.5px) rotate(2.5deg)}22%{transform:translateY(.5px) rotate(-1.5deg)}24%{transform:translateY(1.5px) rotate(1.5deg)}26%{transform:translateY(.5px) rotate(.5deg)}28%{transform:translateY(.5px) rotate(1.5deg)}30%{transform:translateY(-.5px) rotate(2.5deg)}32%{transform:translateY(1.5px) rotate(-.5deg)}34%{transform:translateY(1.5px) rotate(-.5deg)}36%{transform:translateY(-1.5px) rotate(2.5deg)}38%{transform:translateY(1.5px) rotate(-1.5deg)}40%{transform:translateY(-.5px) rotate(2.5deg)}42%{transform:translateY(2.5px) rotate(-1.5deg)}44%{transform:translateY(1.5px) rotate(.5deg)}46%{transform:translateY(-1.5px) rotate(2.5deg)}48%{transform:translateY(-.5px) rotate(.5deg)}50%{transform:translateY(.5px) rotate(.5deg)}52%{transform:translateY(2.5px) rotate(2.5deg)}54%{transform:translateY(-1.5px) rotate(1.5deg)}56%{transform:translateY(2.5px) rotate(2.5deg)}58%{transform:translateY(.5px) rotate(2.5deg)}60%{transform:translateY(2.5px) rotate(2.5deg)}62%{transform:translateY(-.5px) rotate(2.5deg)}64%{transform:translateY(-.5px) rotate(1.5deg)}66%{transform:translateY(1.5px) rotate(-.5deg)}68%{transform:translateY(-1.5px) rotate(-.5deg)}70%{transform:translateY(1.5px) rotate(.5deg)}72%{transform:translateY(2.5px) rotate(1.5deg)}74%{transform:translateY(-.5px) rotate(.5deg)}76%{transform:translateY(-.5px) rotate(2.5deg)}78%{transform:translateY(-.5px) rotate(1.5deg)}80%{transform:translateY(1.5px) rotate(1.5deg)}82%{transform:translateY(-.5px) rotate(.5deg)}84%{transform:translateY(1.5px) rotate(2.5deg)}86%{transform:translateY(-1.5px) rotate(-1.5deg)}88%{transform:translateY(-.5px) rotate(2.5deg)}90%{transform:translateY(2.5px) rotate(-.5deg)}92%{transform:translateY(.5px) rotate(-.5deg)}94%{transform:translateY(2.5px) rotate(.5deg)}96%{transform:translateY(-.5px) rotate(1.5deg)}98%{transform:translateY(-1.5px) rotate(-.5deg)}0%,to{transform:translate(0) rotate(0deg)}}.dplayer{line-height:1;overflow:hidden;position:relative;user-select:none;-webkit-user-select:none}.dplayer *{box-sizing:initial}.dplayer svg{height:100%;width:100%}.dplayer svg circle,.dplayer svg path{fill:#fff}.dplayer.dplayer-fulled,.dplayer.dplayer-fulled-browser{background:#000;height:100%!important;left:0;margin:0;padding:0;position:fixed;top:0;transform:translate(0);width:100%!important;z-index:100000}.dplayer.dplayer-live .dplayer-bar-wrap,.dplayer.dplayer-live .dplayer-time,.dplayer.dplayer-no-audio-switching .dplayer-setting-box .dplayer-setting-audio,.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danmaku,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-danunlimit,.dplayer.dplayer-no-danmaku .dplayer-setting-box .dplayer-setting-showdan{display:none}.dplayer.dplayer-live .dplayer-notice{bottom:56px}.dplayer.dplayer-live .dplayer-setting-loop,.dplayer.dplayer-live .dplayer-setting-speed{display:none}.dplayer.dplayer-live .dplayer-controller .dplayer-icons .dplayer-setting-box{height:auto;overflow-y:hidden}.dplayer.dplayer-live .dplayer-mobile-icon-backward,.dplayer.dplayer-live .dplayer-mobile-icon-forward{display:none}.dplayer.dplayer-live .dplayer-comment-setting-box,.dplayer.dplayer-live .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-live.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-live.dplayer-mobile .dplayer-setting-box{bottom:52px;max-height:calc(100% - 60px)}.dplayer.dplayer-narrow .dplayer-danmaku{font-size:18px}.dplayer.dplayer-narrow .dplayer-icon{margin:0 -3px}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{animation-play-state:running}.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}.dplayer.dplayer-loading .dplayer-bezel .dplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku,.dplayer.dplayer-loading .dplayer-danmaku-move,.dplayer.dplayer-paused .dplayer-danmaku,.dplayer.dplayer-paused .dplayer-danmaku-move{animation-play-state:paused}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer.dplayer-fulled{height:100%!important;left:0;position:fixed!important;top:0;width:100%!important;z-index:100000}.dplayer.dplayer-fulled.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-fulled-browser.dplayer-hide-controller{cursor:none}.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-fulled-browser.dplayer-hide-controller .dplayer-controller-mask{opacity:0!important}.dplayer.dplayer-mobile .dplayer-controller{height:44px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons{padding-bottom:3px;padding-top:3px}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-airplay-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-play-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-volume{display:none}.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-full-in-icon,.dplayer.dplayer-mobile .dplayer-controller .dplayer-icons .dplayer-full .dplayer-pip-icon{display:inline-block;position:static}.dplayer.dplayer-mobile .dplayer-controller-mask{background:linear-gradient(#0000008c 78%,#000c);height:100%}.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller,.dplayer.dplayer-mobile.dplayer-playing .dplayer-controller-mask{opacity:1}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller-mask{opacity:0}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-controller{opacity:0;transform:translateY(100%)}.dplayer.dplayer-mobile .dplayer-bar-wrap{bottom:40px}.dplayer.dplayer-mobile .dplayer-bar-wrap .dplayer-bar-time{display:none}.dplayer.dplayer-mobile .dplayer-comment-setting-box,.dplayer.dplayer-mobile .dplayer-setting-box{bottom:58px;max-height:calc(100% - 66px)}.dplayer.dplayer-mobile.dplayer-hide-controller .dplayer-mobile-icon-wrap{opacity:0;visibility:hidden}.dplayer.dplayer-mobile .dplayer-mobile-icon-wrap{opacity:.7;visibility:visible}.dplayer-web-fullscreen-fix{left:0;margin:0;padding:0;position:fixed;top:0}.dplayer [aria-label]{--balloon-font-size:11.5px}.dplayer [aria-label]:before{display:none}.dplayer [aria-label]:after{background:#111111b3!important;font-family:inherit!important;padding:.3em .8em!important}.dplayer [aria-label][data-balloon-pos=up]:after{margin-bottom:0!important}.dplayer-bezel{bottom:0;color:#fff;font-size:22px;left:0;pointer-events:none;position:absolute;right:0;top:0}.dplayer-bezel .dplayer-bezel-icon{background:#00000080;border-radius:50%;box-sizing:border-box;height:52px;left:50%;margin:-26px 0 0 -26px;opacity:0;padding:12px;pointer-events:none;position:absolute;top:50%;width:52px;will-change:transform}.dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{animation:bezel-hide .5s linear}@keyframes bezel-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(2)}}.dplayer-bezel .dplayer-danloading{animation:my-face 5s ease-in-out infinite;font-size:14px;line-height:14px;margin-top:-7px;position:absolute;text-align:center;top:50%;width:100%}.dplayer-bezel .dplayer-loading-icon{display:none;height:36px;left:50%;margin:-18px 0 0 -18px;pointer-events:none;position:absolute;top:50%;width:36px}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-hide{display:none}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot{animation:dplayer-loading-dot-fade .8s ease infinite;opacity:0;transform-origin:4px 4px;will-change:transform}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-7{animation-delay:.7s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-6{animation-delay:.6s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-5{animation-delay:.5s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-4{animation-delay:.4s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-3{animation-delay:.3s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-2{animation-delay:.2s}.dplayer-bezel .dplayer-loading-icon .dplayer-loading-dot.dplayer-loading-dot-1{animation-delay:.1s}@keyframes dplayer-loading-dot-fade{0%{opacity:.7;transform:scale(1.2)}50%{opacity:.25;transform:scale(.9)}to{opacity:.25;transform:scale(.85)}}.dplayer-controller-mask{background:linear-gradient(#0000 15%,#000000b3);height:98px;width:100%}.dplayer-controller,.dplayer-controller-mask{bottom:0;position:absolute;transition:all .3s ease}.dplayer-controller{height:50px;left:0;padding:0 20px;right:0;user-select:none;-webkit-user-select:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons{display:none}.dplayer-controller.dplayer-controller-comment .dplayer-icons.dplayer-comment-box{display:block}.dplayer-controller .dplayer-bar-wrap{bottom:46px;cursor:pointer;height:3px;padding:5px 0;position:absolute;width:calc(100% - 40px)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-bar .dplayer-played .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-bar-wrap:hover .dplayer-highlight{display:block;height:40%;top:4px;transform:translateX(-4px);width:8px}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight{background-color:#fff;border-radius:6px;height:20%;position:absolute;text-align:center;top:5px;transform:translateX(-3px);transition:all .2s ease-in-out;width:6px;z-index:12}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover .dplayer-highlight-text{display:block}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-preview,.dplayer-controller .dplayer-bar-wrap .dplayer-highlight:hover~.dplayer-bar-time{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-highlight .dplayer-highlight-text{background-color:#0000009e;border-radius:4px;color:#fff;display:none;font-size:12px;left:50%;padding:5px 8px;position:absolute;top:-24px;transform:translateX(-50%);white-space:nowrap}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview{background:#fff;background-size:16000px 100%;border-radius:6px;display:none;pointer-events:none;position:absolute}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-preview-canvas{height:100%;pointer-events:none;position:absolute;width:100%;z-index:1}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time{word-wrap:normal;background-color:#0000009e;border-radius:4px;color:#fff;font-size:12px;left:0;opacity:1;padding:5px 7px;pointer-events:none;position:absolute;text-align:center;top:-20px;transition:opacity .1s ease-in-out;word-break:normal;z-index:2}.dplayer-controller .dplayer-bar-wrap .dplayer-bar-time.hidden{opacity:0}.dplayer-controller .dplayer-bar-wrap .dplayer-bar{background:#fff3;cursor:pointer;height:4px;position:relative;width:100%}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{background:#fff;transition:all .5s ease}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded,.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{bottom:0;height:4px;left:0;position:absolute;top:0;will-change:width}.dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons{-webkit-tap-highlight-color:rgba(0,0,0,0);bottom:0;height:38px;padding-bottom:6px;padding-top:6px;position:absolute}.dplayer-controller .dplayer-icons.dplayer-comment-box{bottom:0;color:#fff;display:none;height:38px;left:20px;position:absolute;right:20px;transition:all .3s ease-in-out;z-index:2}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-icon{padding:7px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-icon{left:0;position:absolute;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon{position:absolute;right:0;top:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-send-icon[aria-label]:after{left:14%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{background:none;border:none;border-radius:4px;box-sizing:border-box;color:#fff;font-family:inherit;font-size:14px;height:100%;line-height:18px;margin:0;outline:none;padding:8px 0;text-align:center;width:100%}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::placeholder{color:#fff;opacity:.8}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input::-ms-clear{display:none}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box{padding:9px 10px 15px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:12px;line-height:24px}.dplayer-controller .dplayer-icons.dplayer-comment-box .dplayer-comment-input{font-size:12px}}.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:6px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding-top:7px}}.dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}@media(max-width:500px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:7px;width:38px}}@media(max-width:350px){.dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:5px;width:31px}}.dplayer-controller .dplayer-icons .dplayer-time{color:#eee;font-family:inherit;font-size:13px;line-height:38px;text-shadow:0 0 2px #00000080;vertical-align:middle}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-time{font-size:12px}}.dplayer-controller .dplayer-icons .dplayer-live-badge{align-items:center;color:#eee;cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;height:100%;line-height:18px;text-shadow:0 0 2px #00000080;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-live-dot{border-radius:6px;content:"";display:inline-block;height:6px;margin-right:5px;vertical-align:4%;width:6px}.dplayer-controller .dplayer-icons .dplayer-icon{background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;height:100%;line-height:18px;outline:none;vertical-align:middle;width:40px}.dplayer-controller .dplayer-icons .dplayer-icon .dplayer-icon-content{opacity:.8;transition:all .2s ease-in-out}.dplayer-controller .dplayer-icons .dplayer-icon:hover .dplayer-icon-content{opacity:1}.dplayer-controller .dplayer-icons .dplayer-icon::-moz-focus-inner{border:0}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10.5px 9.5px 8px}@media(max-width:500px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:9px 9px 8px}}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:6.5px 6.5px 6px}}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-volume-icon{width:43px}.dplayer-controller .dplayer-icons .dplayer-icon.dplayer-full-icon[aria-label]:after{left:1%}@media(max-width:350px){.dplayer-controller .dplayer-icons .dplayer-icon{width:35px}}.dplayer-controller .dplayer-icons .dplayer-volume{cursor:pointer;display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar{width:45px}.dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{transform:scale(1)}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;height:100%;margin:0 10px 0 -5px;vertical-align:middle}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{background:#fff;height:4px;position:relative;top:17px;transition:all .3s ease-in-out;width:0}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .1s ease;will-change:width}.dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transform:scale(0);transition:all .3s ease-in-out;width:11px}.dplayer-controller .dplayer-icons .dplayer-setting,.dplayer-controller .dplayer-icons .dplayer-subtitle-btn{display:inline-block;height:100%}.dplayer-controller .dplayer-icons .dplayer-full{display:inline-block;height:100%;position:relative}.dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer-mobile-icon-wrap{align-items:center;display:flex;height:50px;justify-content:space-evenly;left:50%;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .28s ease;visibility:hidden;width:100%}.dplayer-mobile-icon-wrap .dplayer-mobile-icon{-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:#0000;border:none;box-sizing:border-box;cursor:pointer;filter:drop-shadow(0 0 7px rgba(0,0,0,.5));height:50px;outline:none;pointer-events:auto;width:50px}.dplayer-mobile-icon-wrap .dplayer-mobile-icon-backward,.dplayer-mobile-icon-wrap .dplayer-mobile-icon-forward{padding:12px}.dplayer-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;display:flex;height:calc(100% - 72px);opacity:0;overflow-x:hidden;overflow-y:hidden;position:absolute;right:20px;transition:all .25s ease;visibility:hidden;width:210px;z-index:2}.dplayer-setting-box>div{overflow-x:hidden}.dplayer-setting-box>div.dplayer-setting-origin-panel{display:block}.dplayer-setting-box.dplayer-setting-box-open{opacity:1;visibility:visible}.dplayer-setting-box.dplayer-setting-box-quality{clip-path:inset(calc(100% - 30px*var(--quality-length) - 54px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-quality .dplayer-setting-quality-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-speed{clip-path:inset(calc(100% - 294px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-speed .dplayer-setting-speed-panel{display:block;transform:translateX(0)}.dplayer-setting-box.dplayer-setting-box-audio{clip-path:inset(calc(100% - 114px) 0 0 round 7px)!important}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-origin-panel{transform:translateX(-100%)}.dplayer-setting-box.dplayer-setting-box-audio .dplayer-setting-audio-panel{display:block;transform:translateX(0)}.dplayer-setting-box .dplayer-label{color:#eee;display:inline-block;font-size:13px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-label-value{color:#e0e0e0;display:inline-block;font-size:12px;margin-left:auto;margin-right:23px;vertical-align:middle;white-space:nowrap}.dplayer-setting-box .dplayer-toggle{font-size:0;height:20px;position:absolute;right:7px;text-align:center;top:5px;vertical-align:middle;width:20px}.dplayer-setting-box .dplayer-toggle input{display:none;max-height:0;max-width:0}.dplayer-setting-box .dplayer-toggle input+label{border:1px solid #dfdfdf;border-radius:10px;box-shadow:inset 0 0 0 0 #dfdfdf;box-sizing:border-box;cursor:pointer;display:inline-block;height:20px;position:relative;right:15px;transition:.25s ease;width:32px}.dplayer-setting-box .dplayer-toggle input+label:before{border-radius:15px;content:"";display:block;height:19px;left:-.5px;position:absolute;top:-.5px;transition:.25s ease;width:19px}.dplayer-setting-box .dplayer-toggle input+label:after{background:#fff;border-radius:15px;box-shadow:0 1px 3px #0006;content:"";display:block;height:18.1px;left:0;position:absolute;top:-.1px;transition:.25s ease;width:18.1px}.dplayer-setting-box .dplayer-toggle input:checked+label{border-color:var(--theme-color)}.dplayer-setting-box .dplayer-toggle input:checked+label:before{background:var(--theme-color);width:31px}.dplayer-setting-box .dplayer-toggle input:checked+label:after{left:12px}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-origin-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{bottom:0;box-sizing:border-box;max-height:100%;overflow-y:auto;padding:7px 0;position:absolute;scrollbar-width:thin;transition:transform .25s ease;width:100%}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar{width:6px}.dplayer-setting-box .dplayer-setting-audio-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-origin-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-quality-panel::-webkit-scrollbar-thumb,.dplayer-setting-box .dplayer-setting-speed-panel::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-setting-box .dplayer-setting-origin-panel{transform:translateX(0)}.dplayer-setting-box .dplayer-setting-audio-panel,.dplayer-setting-box .dplayer-setting-quality-panel,.dplayer-setting-box .dplayer-setting-speed-panel{transform:translateX(100%)}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-header,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-header{align-items:center;border-bottom:2px solid #ffffff26;box-sizing:border-box;cursor:pointer;display:flex;height:33px;margin-bottom:7px;padding-bottom:5px;padding-left:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item{padding:5px}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item .dplayer-toggle{visibility:hidden}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-audio-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-quality-item.dplayer-setting-speed-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-audio-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-quality-current .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-setting-speed-item.dplayer-setting-speed-current .dplayer-toggle{visibility:visible}.dplayer-setting-box .dplayer-setting-audio-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-quality-panel .dplayer-toggle,.dplayer-setting-box .dplayer-setting-speed-panel .dplayer-toggle{display:inline-block;margin-right:6px;position:static;width:22px}.dplayer-setting-box .dplayer-setting-audio-item,.dplayer-setting-box .dplayer-setting-item,.dplayer-setting-box .dplayer-setting-quality-item,.dplayer-setting-box .dplayer-setting-speed-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;height:30px;padding:5px 10px;position:relative}.dplayer-setting-box .dplayer-setting-audio-item:hover,.dplayer-setting-box .dplayer-setting-item:hover,.dplayer-setting-box .dplayer-setting-quality-item:hover,.dplayer-setting-box .dplayer-setting-speed-item:hover{background-color:#ffffff1a}.dplayer-setting-box .dplayer-setting-danmaku{padding:5px 0}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label{display:inline;padding:0 10px}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-label-value{font-size:12.5px;margin-right:18px}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label,.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label-value{display:none}.dplayer-setting-box .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{box-sizing:border-box;display:none;height:100%;padding:0 10px;vertical-align:middle;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{background:#fff;height:3px;position:relative;top:8.5px;transition:all .3s ease-in-out;width:100%}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{bottom:0;height:100%;left:0;position:absolute;transition:all .05s ease;will-change:width}.dplayer-setting-box .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{border-radius:50%;cursor:pointer;height:11px;margin-right:-10px;margin-top:-4px;position:absolute;right:5px;top:0;transition:all .3s ease-in-out;width:11px}.dplayer-comment-setting-box{-webkit-tap-highlight-color:rgba(0,0,0,0);background:#1c1c1ce6;border-radius:7px;bottom:64px;box-sizing:border-box;clip-path:inset(0 0 0 round 7px);font-size:14px;left:20px;max-height:calc(100% - 72px);opacity:0;overflow-y:auto;padding:10px 10px 16px;position:absolute;scrollbar-width:thin;transition:all .25s ease;visibility:hidden;width:255px;z-index:2}.dplayer-comment-setting-box::-webkit-scrollbar{width:6px}.dplayer-comment-setting-box::-webkit-scrollbar-thumb{background:#ffffff26}.dplayer-comment-setting-box.dplayer-comment-setting-open{opacity:1;visibility:visible}.dplayer-comment-setting-box input[type=radio]{display:none}.dplayer-comment-setting-box label{cursor:pointer}.dplayer-comment-setting-box .dplayer-comment-setting-title{color:#fff;font-size:13px;line-height:30px}.dplayer-comment-setting-box .dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-size.dplayer-comment-setting-size,.dplayer-comment-setting-box .dplayer-comment-setting-type.dplayer-comment-setting-size{margin-top:8px}.dplayer-comment-setting-box .dplayer-comment-setting-size .dplayer-comment-setting-title,.dplayer-comment-setting-box .dplayer-comment-setting-type .dplayer-comment-setting-title{margin-bottom:6px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(2) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer-comment-setting-box .dplayer-comment-setting-size label:nth-child(4) span,.dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-size span,.dplayer-comment-setting-box .dplayer-comment-setting-type span{border:1px solid #fff;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:12px;line-height:16px;margin-right:-1px;padding:4px 6px;text-align:center;width:33.6%}.dplayer-comment-setting-box .dplayer-comment-setting-size input:checked+span,.dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6;color:#1c1c1c}.dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list{display:flex;justify-content:space-between;padding:4px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list label{display:inline-block;font-size:0;padding:6px 0}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span{border-radius:50%;box-sizing:border-box;cursor:pointer;display:inline-block;height:22px;width:22px}.dplayer-comment-setting-box .dplayer-comment-setting-color .dplayer-comment-setting-color-list span:hover{animation:my-face 5s ease-in-out infinite}.dplayer-danmaku{aspect-ratio:16/9;bottom:0;color:#fff;font-family:inherit;font-size:29px;left:0;margin:auto;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0}.dplayer-danmaku .dplayer-danmaku-item{cursor:default;display:inline-block;font-size:var(--dplayer-danmaku-font-size);font-weight:700;opacity:var(--dplayer-danmaku-opacity);pointer-events:none;text-shadow:1.2px 1.2px 4px #000000e6;user-select:none;-webkit-user-select:none;white-space:nowrap}.dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer-danmaku .dplayer-danmaku-item span{box-decoration-break:clone;-webkit-box-decoration-break:clone}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-big{font-size:calc(var(--dplayer-danmaku-font-size)*1.25)}.dplayer-danmaku .dplayer-danmaku-item.dplayer-danmaku-size-small{font-size:calc(var(--dplayer-danmaku-font-size)*.8)}.dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;transform:translateX(100%)}.dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{animation-name:danmaku;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku{0%{transform:translateX(100%)}}.dplayer-danmaku .dplayer-danmaku-bottom,.dplayer-danmaku .dplayer-danmaku-top{left:50%;position:absolute;transform:translateX(-50%);visibility:hidden}.dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{animation-name:danmaku-center;animation-play-state:paused;animation-timing-function:linear}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer-logo{left:20px;max-height:50px;max-width:50px;pointer-events:none;position:absolute;top:20px}.dplayer-logo img{background:none;max-height:100%;max-width:100%}.dplayer-menu{background:#1c1c1cd9;border-radius:2px;display:none;overflow:hidden;padding:5px 0;position:absolute;width:170px;z-index:3}.dplayer-menu.dplayer-menu-show{display:block}.dplayer-menu .dplayer-menu-item{box-sizing:border-box;cursor:pointer;height:30px}.dplayer-menu .dplayer-menu-item:hover{background-color:#ffffff1a}.dplayer-menu .dplayer-menu-item a{box-sizing:border-box;color:#eee;display:inline-block;font-size:13px;line-height:30px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:100%}.dplayer-menu .dplayer-menu-item a:hover{text-decoration:none}.dplayer-notice{background:#1c1c1ce6;border-radius:4px;bottom:68px;color:#fff;font-size:14px;left:20px;line-height:1.6;margin-right:20px;opacity:0;overflow:hidden;padding:12px 18px;pointer-events:none;position:absolute;transition:all .3s ease-in-out,color 0s}@media(max-width:500px){.dplayer-notice{bottom:auto!important;top:10px}}.dplayer-subtitle{bottom:40px;color:#fff;font-size:20px;left:5%;position:absolute;text-align:center;text-shadow:.5px .5px .5px #00000080;width:90%}.dplayer-subtitle.dplayer-subtitle-hide{display:none}.dplayer-mask{bottom:0;display:none;left:0;position:absolute;right:0;top:0;z-index:1}.dplayer-mask.dplayer-mask-show{display:block}.dplayer-video-wrap{align-items:center;background:#000;display:flex;font-size:0;height:100%;justify-content:center;position:relative;width:100%}.dplayer-video-wrap .dplayer-video-wrap-aspect{aspect-ratio:16/9;max-height:100%;max-width:100%;overflow:hidden;position:relative}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video{display:none;max-height:100%;max-width:100%;width:99999px}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-current{display:block}.dplayer-video-wrap .dplayer-video-wrap-aspect .dplayer-video-prepare{display:none}.dplayer-info-panel{background:#1c1c1ccc;border-radius:2px;color:#fff;font-size:12px;left:10px;padding:10px;position:absolute;top:10px;width:400px}.dplayer-info-panel-hide{display:none}.dplayer-info-panel .dplayer-info-panel-close{cursor:pointer;position:absolute;right:10px;top:10px}.dplayer-info-panel .dplayer-info-panel-item>span{display:inline-block;line-height:15px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.dplayer-info-panel .dplayer-info-panel-item-title{margin-right:10px;text-align:right;width:107px}.dplayer-info-panel .dplayer-info-panel-item-data{width:260px}',"",{version:3,sources:["webpack://./src/css/balloon.scss","webpack://./src/css/global.scss","webpack://./src/css/player.scss","webpack://./src/css/bezel.scss","webpack://./src/css/controller.scss","webpack://./src/css/danmaku.scss","webpack://./src/css/logo.scss","webpack://./src/css/menu.scss","webpack://./src/css/notice.scss","webpack://./src/css/subtitle.scss","webpack://./src/css/video.scss","webpack://./src/css/info-panel.scss"],names:[],mappings:"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",sourcesContent:["@import '../../node_modules/balloon-css/balloon.css';\n\n.dplayer [aria-label] {\n --balloon-font-size: 11.5px;\n}\n\n.dplayer [aria-label]:before {\n display: none;\n}\n\n.dplayer [aria-label]:after {\n padding: .3em .8em !important;\n background: rgba(17, 17, 17, 0.7) !important;\n font-family: inherit !important;\n}\n\n.dplayer [aria-label][data-balloon-pos=\"up\"]:after {\n margin-bottom: 0 !important;\n}\n","@keyframes my-face {\n 2% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 4% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 6% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 8% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 10% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 12% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 14% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 16% {\n transform: translate(0, -0.5px) rotate(-1.5deg);\n }\n 18% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 20% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 22% {\n transform: translate(0, 0.5px) rotate(-1.5deg);\n }\n 24% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 26% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 28% {\n transform: translate(0, 0.5px) rotate(1.5deg);\n }\n 30% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 32% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 34% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 36% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 38% {\n transform: translate(0, 1.5px) rotate(-1.5deg);\n }\n 40% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 42% {\n transform: translate(0, 2.5px) rotate(-1.5deg);\n }\n 44% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 46% {\n transform: translate(0, -1.5px) rotate(2.5deg);\n }\n 48% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 50% {\n transform: translate(0, 0.5px) rotate(0.5deg);\n }\n 52% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 54% {\n transform: translate(0, -1.5px) rotate(1.5deg);\n }\n 56% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 58% {\n transform: translate(0, 0.5px) rotate(2.5deg);\n }\n 60% {\n transform: translate(0, 2.5px) rotate(2.5deg);\n }\n 62% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 64% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 66% {\n transform: translate(0, 1.5px) rotate(-0.5deg);\n }\n 68% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 70% {\n transform: translate(0, 1.5px) rotate(0.5deg);\n }\n 72% {\n transform: translate(0, 2.5px) rotate(1.5deg);\n }\n 74% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 76% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 78% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 80% {\n transform: translate(0, 1.5px) rotate(1.5deg);\n }\n 82% {\n transform: translate(0, -0.5px) rotate(0.5deg);\n }\n 84% {\n transform: translate(0, 1.5px) rotate(2.5deg);\n }\n 86% {\n transform: translate(0, -1.5px) rotate(-1.5deg);\n }\n 88% {\n transform: translate(0, -0.5px) rotate(2.5deg);\n }\n 90% {\n transform: translate(0, 2.5px) rotate(-0.5deg);\n }\n 92% {\n transform: translate(0, 0.5px) rotate(-0.5deg);\n }\n 94% {\n transform: translate(0, 2.5px) rotate(0.5deg);\n }\n 96% {\n transform: translate(0, -0.5px) rotate(1.5deg);\n }\n 98% {\n transform: translate(0, -1.5px) rotate(-0.5deg);\n }\n 0%,\n 100% {\n transform: translate(0, 0) rotate(0deg);\n }\n}\n",".dplayer {\n position: relative;\n overflow: hidden;\n user-select: none;\n -webkit-user-select: none;\n line-height: 1;\n\n * {\n box-sizing: content-box;\n }\n\n svg {\n width: 100%;\n height: 100%;\n\n path,\n circle {\n fill: #fff;\n }\n }\n\n &.dplayer-fulled, &.dplayer-fulled-browser {\n width: 100% !important;\n height: 100% !important;\n background: #000;\n position: fixed;\n z-index: 100000;\n left: 0;\n top: 0;\n margin: 0;\n padding: 0;\n transform: translate(0, 0);\n }\n\n &.dplayer-no-danmaku {\n .dplayer-setting-box {\n .dplayer-setting-showdan,\n .dplayer-setting-danmaku,\n .dplayer-setting-danunlimit {\n display: none;\n }\n }\n\n .dplayer-controller .dplayer-icons .dplayer-comment {\n display: none;\n }\n\n .dplayer-danmaku {\n display: none;\n }\n }\n\n &.dplayer-no-audio-switching {\n .dplayer-setting-box {\n .dplayer-setting-audio {\n display: none;\n }\n }\n }\n\n &.dplayer-live {\n .dplayer-time {\n display: none;\n }\n .dplayer-bar-wrap {\n display: none;\n }\n .dplayer-notice {\n bottom: 56px;\n }\n .dplayer-setting-speed {\n display: none;\n }\n .dplayer-setting-loop {\n display: none;\n }\n .dplayer-controller .dplayer-icons .dplayer-setting-box {\n height: auto;\n overflow-y: hidden;\n }\n .dplayer-mobile-icon-backward, .dplayer-mobile-icon-forward {\n display: none;\n }\n\n .dplayer-setting-box, .dplayer-comment-setting-box {\n bottom: 58px;\n max-height: calc(100% - 58px - 8px);\n }\n &.dplayer-mobile {\n .dplayer-setting-box, .dplayer-comment-setting-box {\n bottom: 52px;\n max-height: calc(100% - 52px - 8px);\n }\n }\n }\n\n &.dplayer-narrow {\n .dplayer-danmaku {\n font-size: 18px;\n }\n .dplayer-icon {\n margin: 0 -3px;\n }\n }\n\n &.dplayer-playing {\n .dplayer-danmaku .dplayer-danmaku-move {\n animation-play-state: running;\n }\n\n .dplayer-controller-mask {\n opacity: 0;\n }\n .dplayer-controller {\n opacity: 0;\n }\n\n &:hover {\n .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer-controller {\n opacity: 1;\n }\n }\n }\n\n &.dplayer-loading {\n .dplayer-bezel .dplayer-loading-icon {\n display: block;\n }\n }\n\n &.dplayer-loading,\n &.dplayer-paused {\n .dplayer-danmaku,\n .dplayer-danmaku-move {\n animation-play-state: paused;\n }\n }\n\n &.dplayer-show-controller {\n .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer-controller {\n opacity: 1;\n }\n }\n\n &.dplayer-fulled {\n position: fixed !important;\n z-index: 100000;\n left: 0;\n top: 0;\n width: 100% !important;\n height: 100% !important;\n\n &.dplayer-hide-controller {\n cursor: none;\n .dplayer-controller-mask {\n opacity: 0 !important;\n }\n .dplayer-controller {\n opacity: 0 !important;\n }\n }\n }\n\n &.dplayer-fulled-browser {\n &.dplayer-hide-controller {\n cursor: none;\n .dplayer-controller-mask {\n opacity: 0 !important;\n }\n .dplayer-controller {\n opacity: 0 !important;\n }\n }\n }\n\n &.dplayer-mobile {\n .dplayer-controller {\n height: 44px;\n .dplayer-icons {\n padding-top: 3px;\n padding-bottom: 3px;\n .dplayer-volume,\n .dplayer-airplay-icon,\n .dplayer-play-icon {\n display: none;\n }\n .dplayer-full .dplayer-full-in-icon {\n position: static;\n display: inline-block;\n }\n .dplayer-full .dplayer-pip-icon {\n position: static;\n display: inline-block;\n }\n }\n }\n\n .dplayer-controller-mask {\n background: linear-gradient(rgba(0, 0, 0, 0.55) 78%, rgba(0, 0, 0, 0.8) 100%);\n height: 100%;\n }\n\n &.dplayer-playing {\n .dplayer-controller-mask {\n opacity: 1;\n }\n .dplayer-controller {\n opacity: 1;\n }\n }\n\n &.dplayer-hide-controller {\n .dplayer-controller-mask {\n opacity: 0;\n }\n .dplayer-controller {\n opacity: 0;\n transform: translateY(100%);\n }\n }\n\n .dplayer-bar-wrap {\n bottom: 40px;\n .dplayer-bar-time {\n display: none;\n }\n }\n\n .dplayer-setting-box, .dplayer-comment-setting-box {\n bottom: 58px;\n max-height: calc(100% - 58px - 8px);\n }\n\n &.dplayer-hide-controller {\n .dplayer-mobile-icon-wrap {\n visibility: hidden;\n opacity: 0;\n }\n }\n\n .dplayer-mobile-icon-wrap {\n visibility: visible;\n opacity: 0.7;\n }\n }\n}\n\n// To hide scroll bar, apply this class to \n.dplayer-web-fullscreen-fix {\n position: fixed;\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n}\n",".dplayer-bezel {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n font-size: 22px;\n color: #fff;\n pointer-events: none;\n .dplayer-bezel-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -26px 0 0 -26px;\n height: 52px;\n width: 52px;\n padding: 12px;\n box-sizing: border-box;\n background: rgba(0, 0, 0, .5);\n border-radius: 50%;\n opacity: 0;\n pointer-events: none;\n will-change: transform;\n &.dplayer-bezel-transition {\n animation: bezel-hide .5s linear;\n }\n @keyframes bezel-hide {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(2);\n }\n }\n }\n .dplayer-danloading {\n position: absolute;\n top: 50%;\n margin-top: -7px;\n width: 100%;\n text-align: center;\n font-size: 14px;\n line-height: 14px;\n animation: my-face 5s infinite ease-in-out;\n }\n .dplayer-loading-icon {\n display: none;\n position: absolute;\n top: 50%;\n left: 50%;\n margin: -18px 0 0 -18px;\n height: 36px;\n width: 36px;\n pointer-events: none;\n .dplayer-loading-hide {\n display: none;\n }\n .dplayer-loading-dot {\n animation: dplayer-loading-dot-fade .8s ease infinite;\n opacity: 0;\n transform-origin: 4px 4px;\n will-change: transform;\n @for $i from 7 through 1 {\n &.dplayer-loading-dot-#{$i} {\n animation-delay: .1s * $i;\n }\n }\n }\n @keyframes dplayer-loading-dot-fade {\n 0% {\n opacity: .7;\n transform: scale(1.2, 1.2);\n }\n 50% {\n opacity: .25;\n transform: scale(.9, .9);\n }\n to {\n opacity: .25;\n transform: scale(.85, .85);\n }\n }\n }\n}\n",'\n.dplayer-controller-mask {\n position: absolute;\n width: 100%;\n height: 98px;\n bottom: 0;\n background: linear-gradient(rgba(0, 0, 0, 0.0) 15%, rgba(0, 0, 0, 0.7) 100%);\n transition: all 0.3s ease;\n}\n\n.dplayer-controller {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 50px;\n padding: 0 20px;\n user-select: none;\n -webkit-user-select: none;\n transition: all 0.3s ease;\n &.dplayer-controller-comment {\n .dplayer-icons {\n display: none;\n }\n .dplayer-icons.dplayer-comment-box {\n display: block;\n }\n }\n .dplayer-bar-wrap {\n position: absolute;\n width: calc(100% - 40px);\n height: 3px;\n bottom: 46px;\n padding: 5px 0;\n cursor: pointer;\n &:hover {\n .dplayer-bar .dplayer-played .dplayer-thumb {\n transform: scale(1);\n }\n .dplayer-highlight {\n display: block;\n width: 8px;\n transform: translateX(-4px);\n top: 4px;\n height: 40%;\n }\n }\n .dplayer-highlight {\n z-index: 12;\n position: absolute;\n top: 5px;\n width: 6px;\n height: 20%;\n border-radius: 6px;\n background-color: #fff;\n text-align: center;\n transform: translateX(-3px);\n transition: all .2s ease-in-out;\n &:hover {\n .dplayer-highlight-text {\n display: block;\n }\n &~.dplayer-bar-preview {\n opacity: 0;\n }\n &~.dplayer-bar-time {\n opacity: 0;\n }\n }\n .dplayer-highlight-text {\n display: none;\n position: absolute;\n left: 50%;\n top: -24px;\n padding: 5px 8px;\n background-color: rgba(0, 0, 0, .62);\n color: #fff;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n transform: translateX(-50%);\n }\n }\n .dplayer-bar-preview {\n display: none;\n position: absolute;\n border-radius: 6px;\n background: #fff;\n pointer-events: none;\n background-size: 16000px 100%;\n }\n .dplayer-bar-preview-canvas {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n pointer-events: none;\n }\n .dplayer-bar-time {\n &.hidden {\n opacity: 0;\n }\n position: absolute;\n left: 0px;\n top: -20px;\n border-radius: 4px;\n padding: 5px 7px;\n background-color: rgba(0, 0, 0, 0.62);\n color: #fff;\n font-size: 12px;\n text-align: center;\n opacity: 1;\n transition: opacity .1s ease-in-out;\n word-wrap: normal;\n word-break: normal;\n z-index: 2;\n pointer-events: none;\n }\n .dplayer-bar {\n position: relative;\n height: 4px;\n width: 100%;\n background: rgba(255, 255, 255, .2);\n cursor: pointer;\n .dplayer-loaded {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n background: #fff;\n height: 4px;\n transition: all 0.5s ease;\n will-change: width;\n }\n .dplayer-played {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n height: 4px;\n will-change: width;\n .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all .3s ease-in-out;\n transform: scale(0);\n }\n }\n }\n }\n .dplayer-icons {\n position: absolute;\n height: 38px;\n padding-top: 6px;\n padding-bottom: 6px;\n bottom: 0;\n -webkit-tap-highlight-color: transparent;\n &.dplayer-comment-box {\n display: none;\n position: absolute;\n transition: all .3s ease-in-out;\n z-index: 2;\n height: 38px;\n bottom: 0;\n left: 20px;\n right: 20px;\n color: #fff;\n .dplayer-icon {\n padding: 7px;\n }\n .dplayer-comment-setting-icon {\n position: absolute;\n left: 0;\n top: 0;\n }\n .dplayer-send-icon {\n position: absolute;\n right: 0;\n top: 0;\n &[aria-label]:after {\n left: 14%;\n }\n }\n .dplayer-comment-input {\n outline: none;\n border: none;\n padding: 8px 0px;\n font-size: 14px;\n font-family: inherit;\n line-height: 18px;\n text-align: center;\n border-radius: 4px;\n background: none;\n margin: 0;\n height: 100%;\n box-sizing: border-box;\n width: 100%;\n color: #fff;\n &::placeholder {\n color: #fff;\n opacity: 0.8;\n }\n &::-moz-focus-inner {\n border: 0;\n }\n &::-ms-clear {\n display: none;\n }\n }\n @media (max-width: 350px){\n .dplayer-comment-setting-box {\n padding: 9px 10px 15px;\n .dplayer-comment-setting-title {\n font-size: 12px;\n line-height: 24px;\n }\n }\n .dplayer-comment-input {\n font-size: 12px;\n }\n }\n }\n &.dplayer-icons-left {\n .dplayer-icon {\n padding: 7px;\n }\n @media (max-width: 500px){\n .dplayer-icon {\n padding-top: 6px;\n }\n }\n @media (max-width: 350px){\n .dplayer-icon {\n padding-top: 7px;\n }\n }\n }\n &.dplayer-icons-right {\n right: 20px;\n .dplayer-icon {\n padding: 8px;\n @media (max-width: 500px){\n & {\n width: 38px;\n padding: 7px;\n }\n }\n @media (max-width: 350px){\n & {\n width: 31px;\n padding: 5px;\n }\n }\n }\n }\n .dplayer-time {\n line-height: 38px;\n color: #eee;\n text-shadow: 0 0 2px rgba(0, 0, 0, .5);\n vertical-align: middle;\n font-size: 13px;\n font-family: inherit;\n @media (max-width: 350px){\n & {\n font-size: 12px;\n }\n }\n }\n .dplayer-live-badge {\n line-height: 18px;\n color: #eee;\n text-shadow: 0 0 2px rgba(0, 0, 0, .5);\n vertical-align: middle;\n font-size: 13px;\n cursor: pointer;\n font-family: inherit;\n height: 100%;\n display: inline-flex;\n align-items: center;\n }\n .dplayer-live-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n vertical-align: 4%;\n margin-right: 5px;\n content: \'\';\n border-radius: 6px;\n }\n .dplayer-icon {\n width: 40px;\n height: 100%;\n border: none;\n background-color: transparent;\n line-height: 18px;\n outline: none;\n cursor: pointer;\n vertical-align: middle;\n box-sizing: border-box;\n display: inline-block;\n .dplayer-icon-content {\n transition: all .2s ease-in-out;\n opacity: .8;\n }\n &:hover {\n .dplayer-icon-content {\n opacity: 1;\n }\n }\n &::-moz-focus-inner {\n border: 0;\n }\n &.dplayer-comment-icon {\n padding: 10.5px 9.5px 8px;\n @media (max-width: 500px){\n & {\n padding: 9px 9px 8px;\n }\n }\n @media (max-width: 350px){\n & {\n padding: 6.5px 6.5px 6px;\n }\n }\n }\n &.dplayer-volume-icon {\n width: 43px;\n }\n &.dplayer-full-icon[aria-label]:after {\n left: 1%;\n }\n @media (max-width: 350px){\n & {\n width: 35px;\n }\n }\n }\n .dplayer-volume {\n position: relative;\n display: inline-block;\n cursor: pointer;\n height: 100%;\n &:hover {\n .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n }\n .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n }\n }\n &.dplayer-volume-active {\n .dplayer-volume-bar-wrap .dplayer-volume-bar {\n width: 45px;\n }\n .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb {\n transform: scale(1);\n }\n }\n .dplayer-volume-bar-wrap {\n display: inline-block;\n margin: 0 10px 0 -5px;\n vertical-align: middle;\n height: 100%;\n .dplayer-volume-bar {\n position: relative;\n top: 17px;\n width: 0;\n height: 4px;\n background: #FFF;\n transition: all 0.3s ease-in-out;\n .dplayer-volume-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.1s ease;\n will-change: width;\n .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all .3s ease-in-out;\n transform: scale(0);\n }\n }\n }\n }\n }\n .dplayer-subtitle-btn {\n display: inline-block;\n height: 100%;\n }\n .dplayer-setting {\n display: inline-block;\n height: 100%;\n }\n .dplayer-full {\n display: inline-block;\n height: 100%;\n position: relative;\n }\n .dplayer-comment {\n display: inline-block;\n height: 100%;\n }\n }\n}\n\n.dplayer-mobile-icon-wrap {\n display: flex;\n align-items: center;\n justify-content: space-evenly;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 100%;\n height: 50px;\n transform: translate(-50%, -50%);\n transition: all 0.28s ease;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n\n .dplayer-mobile-icon {\n width: 50px;\n height: 50px;\n border: none;\n background-color: transparent;\n -webkit-tap-highlight-color: transparent;\n filter: drop-shadow(0 0 7px rgba(0, 0, 0, 0.5));\n box-sizing: border-box;\n cursor: pointer;\n outline: none;\n pointer-events: auto;\n\n &-backward, &-forward {\n padding: 12px;\n }\n }\n}\n\n.dplayer-setting-box {\n display: flex;\n position: absolute;\n right: 20px;\n bottom: 64px;\n width: 210px;\n height: calc(100% - 64px - 8px);\n border-radius: 7px;\n background: rgba(28, 28, 28, 0.9);\n transition: all .25s ease;\n box-sizing: border-box;\n overflow-x: hidden;\n overflow-y: hidden;\n visibility: hidden;\n opacity: 0;\n z-index: 2;\n -webkit-tap-highlight-color: transparent;\n &>div {\n overflow-x: hidden;\n &.dplayer-setting-origin-panel {\n display: block;\n }\n }\n &.dplayer-setting-box-open {\n visibility: visible;\n opacity: 1;\n }\n &.dplayer-setting-box-quality {\n clip-path: inset(calc(100% - (30px * var(--quality-length)) - 54px) 0 0 round 7px) !important;\n .dplayer-setting-origin-panel {\n transform: translateX(-100%);\n }\n .dplayer-setting-quality-panel {\n display: block;\n transform: translateX(0%);\n }\n }\n &.dplayer-setting-box-speed {\n clip-path: inset(calc(100% - 294px) 0 0 round 7px) !important;\n .dplayer-setting-origin-panel {\n transform: translateX(-100%);\n }\n .dplayer-setting-speed-panel {\n display: block;\n transform: translateX(0%);\n }\n }\n &.dplayer-setting-box-audio {\n clip-path: inset(calc(100% - 114px) 0 0 round 7px) !important;\n .dplayer-setting-origin-panel {\n transform: translateX(-100%);\n }\n .dplayer-setting-audio-panel {\n display: block;\n transform: translateX(0%);\n }\n }\n .dplayer-label {\n display: inline-block;\n color: #eee;\n font-size: 13px;\n vertical-align: middle;\n white-space: nowrap;\n }\n .dplayer-label-value {\n display: inline-block;\n margin-left: auto;\n margin-right: 23px;\n color: #e0e0e0;\n font-size: 12px;\n vertical-align: middle;\n white-space: nowrap;\n }\n .dplayer-toggle {\n position: absolute;\n top: 5px;\n right: 7px;\n width: 20px;\n height: 20px;\n text-align: center;\n font-size: 0;\n vertical-align: middle;\n input {\n max-height: 0;\n max-width: 0;\n display: none;\n }\n input+label {\n display: inline-block;\n position: relative;\n right: 15px;\n width: 32px;\n height: 20px;\n border-radius: 10px;\n box-sizing: border-box;\n transition: .25s ease;\n box-shadow: rgb(223, 223, 223) 0 0 0 0 inset;\n border: 1px solid rgb(223, 223, 223);\n cursor: pointer;\n }\n input+label:before {\n content: "";\n position: absolute;\n display: block;\n height: 19px;\n width: 19px;\n top: -0.5px;\n left: -0.5px;\n border-radius: 15px;\n transition: .25s ease;\n }\n input+label:after {\n content: "";\n display: block;\n position: absolute;\n height: 18.1px;\n width: 18.1px;\n top: -0.1px;\n left: 0;\n border-radius: 15px;\n background: #fff;\n transition: .25s ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n }\n input:checked+label {\n border-color: var(--theme-color);\n }\n input:checked+label:before {\n width: 31px;\n background: var(--theme-color);\n }\n input:checked+label:after {\n left: 12px;\n }\n }\n .dplayer-setting-origin-panel,\n .dplayer-setting-quality-panel,\n .dplayer-setting-speed-panel,\n .dplayer-setting-audio-panel {\n position: absolute;\n bottom: 0px;\n width: 100%;\n max-height: 100%;\n padding: 7px 0;\n transition: transform .25s ease;\n box-sizing: border-box;\n scrollbar-width: thin;\n overflow-y: auto;\n &::-webkit-scrollbar {\n width: 6px;\n }\n &::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, .15);\n }\n }\n .dplayer-setting-origin-panel {\n transform: translateX(0%);\n }\n .dplayer-setting-quality-panel,\n .dplayer-setting-speed-panel,\n .dplayer-setting-audio-panel {\n transform: translateX(100%);\n .dplayer-setting-header {\n display: flex;\n align-items: center;\n height: 33px;\n padding-left: 5px;\n padding-bottom: 5px;\n margin-bottom: 7px;\n border-bottom: 2px solid rgba(255, 255, 255, .15);\n box-sizing: border-box;\n cursor: pointer;\n }\n .dplayer-setting-quality-item,\n .dplayer-setting-speed-item,\n .dplayer-setting-audio-item {\n padding: 5px;\n .dplayer-toggle {\n visibility: hidden;\n }\n &.dplayer-setting-quality-current .dplayer-toggle,\n &.dplayer-setting-speed-current .dplayer-toggle,\n &.dplayer-setting-audio-current .dplayer-toggle {\n visibility: visible;\n }\n }\n .dplayer-toggle {\n display: inline-block;\n position: static;\n width: 22px;\n margin-right: 6px;\n }\n }\n .dplayer-setting-item,\n .dplayer-setting-quality-item,\n .dplayer-setting-speed-item,\n .dplayer-setting-audio-item {\n display: flex;\n align-items: center;\n height: 30px;\n padding: 5px 10px;\n box-sizing: border-box;\n cursor: pointer;\n position: relative;\n &:hover {\n background-color: rgba(255, 255, 255, .1);\n }\n }\n .dplayer-setting-danmaku {\n padding: 5px 0;\n .dplayer-label {\n padding: 0 10px;\n display: inline;\n }\n .dplayer-label-value {\n margin-right: 18px;\n font-size: 12.5px;\n }\n &:hover {\n .dplayer-label, .dplayer-label-value {\n display: none;\n }\n .dplayer-danmaku-bar-wrap {\n display: inline-block;\n }\n }\n &.dplayer-setting-danmaku-active {\n .dplayer-label, .dplayer-label-value {\n display: none;\n }\n .dplayer-danmaku-bar-wrap {\n display: inline-block;\n }\n }\n .dplayer-danmaku-bar-wrap {\n padding: 0 10px;\n box-sizing: border-box;\n display: none;\n vertical-align: middle;\n height: 100%;\n width: 100%;\n .dplayer-danmaku-bar {\n position: relative;\n top: 8.5px;\n width: 100%;\n height: 3px;\n background: #fff;\n transition: all 0.3s ease-in-out;\n .dplayer-danmaku-bar-inner {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 100%;\n transition: all 0.05s ease;\n will-change: width;\n .dplayer-thumb {\n position: absolute;\n top: 0;\n right: 5px;\n margin-top: -4px;\n margin-right: -10px;\n height: 11px;\n width: 11px;\n border-radius: 50%;\n cursor: pointer;\n transition: all .3s ease-in-out;\n }\n }\n }\n }\n }\n}\n\n.dplayer-comment-setting-box {\n position: absolute;\n left: 20px;\n bottom: 64px;\n width: 255px;\n max-height: calc(100% - 64px - 8px);\n clip-path: inset(0 0 0 round 7px);\n border-radius: 7px;\n background: rgba(28, 28, 28, 0.9);\n padding: 10px 10px 16px;\n font-size: 14px;\n transition: all .25s ease;\n scrollbar-width: thin;\n visibility: hidden;\n opacity: 0;\n box-sizing: border-box;\n overflow-y: auto;\n z-index: 2;\n -webkit-tap-highlight-color: transparent;\n &::-webkit-scrollbar {\n width: 6px;\n }\n &::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, .15);\n }\n &.dplayer-comment-setting-open {\n visibility: visible;\n opacity: 1;\n }\n input[type=radio] {\n display: none;\n }\n label {\n cursor: pointer;\n }\n .dplayer-comment-setting-title {\n font-size: 13px;\n color: #fff;\n line-height: 30px;\n }\n .dplayer-comment-setting-type, .dplayer-comment-setting-size {\n font-size: 0;\n &.dplayer-comment-setting-size {\n margin-top: 8px;\n }\n .dplayer-comment-setting-title {\n margin-bottom: 6px;\n }\n label {\n &:nth-child(2) {\n span {\n border-radius: 4px 0 0 4px;\n }\n }\n &:nth-child(4) {\n span {\n border-radius: 0 4px 4px 0;\n }\n }\n }\n span {\n width: 33.6%;\n padding: 4px 6px;\n line-height: 16px;\n display: inline-block;\n font-size: 12px;\n color: #fff;\n border: 1px solid #fff;\n margin-right: -1px;\n box-sizing: border-box;\n text-align: center;\n cursor: pointer;\n }\n input:checked+span {\n background: #E4E4E6;\n color: #1c1c1c;\n }\n }\n .dplayer-comment-setting-color {\n font-size: 0;\n .dplayer-comment-setting-color-list {\n display: flex;\n justify-content: space-between;\n padding: 4px 0px;\n label {\n display: inline-block;\n font-size: 0;\n padding: 6px 0px;\n }\n span {\n display: inline-block;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n box-sizing: border-box;\n cursor: pointer;\n &:hover {\n animation: my-face 5s infinite ease-in-out;\n }\n }\n }\n }\n}\n',".dplayer-danmaku {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n max-width: 100%;\n max-height: 100%;\n aspect-ratio: 16/9;\n margin: auto;\n font-size: 29px;\n font-family: inherit;\n color: #fff;\n overflow: hidden;\n .dplayer-danmaku-item {\n display: inline-block;\n font-weight: bold;\n font-size: var(--dplayer-danmaku-font-size);\n opacity: var(--dplayer-danmaku-opacity);\n white-space: nowrap;\n text-shadow: 1.2px 1.2px 4px rgba(0, 0, 0, 0.9);\n cursor: default;\n user-select: none;\n -webkit-user-select: none;\n pointer-events: none;\n &--demo {\n position: absolute;\n visibility: hidden;\n }\n span {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n }\n &.dplayer-danmaku-size-big {\n font-size: calc(var(--dplayer-danmaku-font-size) * 1.25);\n }\n &.dplayer-danmaku-size-small {\n font-size: calc(var(--dplayer-danmaku-font-size) * 0.8);\n }\n }\n .dplayer-danmaku-right {\n position: absolute;\n right: 0;\n transform: translateX(100%);\n &.dplayer-danmaku-move {\n animation-name: danmaku;\n animation-timing-function: linear;\n animation-play-state: paused;\n }\n }\n @keyframes danmaku {\n from {\n transform: translateX(100%);\n }\n }\n .dplayer-danmaku-top,\n .dplayer-danmaku-bottom {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n visibility: hidden;\n &.dplayer-danmaku-move {\n animation-name: danmaku-center;\n animation-timing-function: linear;\n animation-play-state: paused;\n }\n }\n @keyframes danmaku-center {\n from {\n visibility: visible;\n }\n to {\n visibility: visible;\n }\n }\n}\n",".dplayer-logo {\n pointer-events: none;\n position: absolute;\n left: 20px;\n top: 20px;\n max-width: 50px;\n max-height: 50px;\n img {\n max-width: 100%;\n max-height: 100%;\n background: none;\n }\n}\n",".dplayer-menu {\n position: absolute;\n width: 170px;\n border-radius: 2px;\n background: rgba(28, 28, 28, 0.85);\n padding: 5px 0;\n overflow: hidden;\n z-index: 3;\n display: none;\n &.dplayer-menu-show {\n display: block;\n }\n .dplayer-menu-item {\n height: 30px;\n box-sizing: border-box;\n cursor: pointer;\n &:hover {\n background-color: rgba(255, 255, 255, .1);\n }\n a {\n display: inline-block;\n padding: 0 10px;\n line-height: 30px;\n color: #eee;\n font-size: 13px;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n box-sizing: border-box;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n &:hover {\n text-decoration: none;\n }\n }\n }\n}\n",".dplayer-notice {\n position: absolute;\n bottom: 68px;\n left: 20px;\n padding: 12px 18px;\n margin-right: 20px;\n border-radius: 4px;\n background: rgba(28, 28, 28, 0.9);\n color: #fff;\n font-size: 14px;\n line-height: 1.6;\n transition: all .3s ease-in-out, color 0s;\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n}\n@media (max-width: 500px){\n .dplayer-notice {\n top: 10px;\n bottom: auto !important;\n }\n}\n",".dplayer-subtitle {\n position: absolute;\n bottom: 40px;\n width: 90%;\n left: 5%;\n text-align: center;\n color: #fff;\n text-shadow: 0.5px 0.5px 0.5px rgba(0, 0, 0, 0.5);\n font-size: 20px;\n &.dplayer-subtitle-hide {\n display: none;\n }\n}\n",".dplayer-mask {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n display: none;\n &.dplayer-mask-show {\n display: block;\n }\n}\n\n.dplayer-video-wrap {\n display: flex;\n position: relative;\n align-items: center;\n justify-content: center;\n background: #000;\n font-size: 0;\n width: 100%;\n height: 100%;\n\n .dplayer-video-wrap-aspect {\n position: relative;\n max-width: 100%;\n max-height: 100%;\n aspect-ratio: 16 / 9;\n overflow: hidden;\n\n .dplayer-video {\n width: 99999px; // magic!!\n max-width: 100%;\n max-height: 100%;\n display: none;\n }\n .dplayer-video-current {\n display: block;\n }\n .dplayer-video-prepare {\n display: none;\n }\n }\n}\n",".dplayer-info-panel {\n position: absolute;\n top: 10px;\n left: 10px;\n width: 400px;\n background: rgba(28, 28, 28, 0.8);\n padding: 10px;\n color: #fff;\n font-size: 12px;\n border-radius: 2px;\n\n &-hide {\n display: none;\n }\n\n .dplayer-info-panel-close {\n cursor: pointer;\n position: absolute;\n right: 10px;\n top: 10px;\n }\n\n .dplayer-info-panel-item {\n & > span {\n display: inline-block;\n vertical-align: middle;\n line-height: 15px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n\n .dplayer-info-panel-item-title {\n width: 107px;\n text-align: right;\n margin-right: 10px;\n }\n\n .dplayer-info-panel-item-data {\n width: 260px;\n }\n}\n"],sourceRoot:""}]);const c=l},662:function(t){t.exports=function(){var t={9798:function(t,e,n){"use strict";n.r(e),n.d(e,{CanvasProvider:function(){return _},CanvasRenderer:function(){return tt},HTMLProvider:function(){return gt},HTMLRenderer:function(){return wt},SVGProvider:function(){return at},SVGRenderer:function(){return ht}}),n(2526),n(1817),n(2222),n(6992),n(7042),n(5212),n(9575),n(9653),n(5192),n(4363),n(9494),n(1539),n(9714),n(2472),n(2990),n(8927),n(3105),n(5035),n(4345),n(7174),n(2846),n(4731),n(7209),n(6319),n(8867),n(7789),n(3739),n(9368),n(4483),n(2056),n(3462),n(678),n(7462),n(3824),n(5021),n(2974),n(5016),n(3290),n(6699),n(1532),n(9720),n(4916),n(2023),n(8783),n(3112),n(5306),n(3948);var i=new Map([[0,{bytes:2,alphabet:0}],[1,{bytes:1,alphabet:1}],[2,{bytes:1,alphabet:2}],[3,{bytes:1,alphabet:3}],[4,{bytes:1,alphabet:4}],[5,{bytes:1,alphabet:5}],[6,{bytes:1,alphabet:6}],[7,{bytes:1,alphabet:7}],[8,{bytes:1,alphabet:8}],[9,{bytes:1,alphabet:9}],[10,{bytes:1,alphabet:10}],[11,{bytes:1,alphabet:11}],[12,{bytes:2,alphabet:12}],[13,{bytes:2,alphabet:13}],[14,{bytes:2,alphabet:14}]]),r=new Map([[66,{bytes:2,alphabet:0}],[74,{bytes:1,alphabet:1}],[48,{bytes:1,alphabet:2}],[49,{bytes:1,alphabet:3}],[50,{bytes:1,alphabet:4}],[51,{bytes:1,alphabet:5}],[52,{bytes:1,alphabet:6}],[53,{bytes:1,alphabet:7}],[54,{bytes:1,alphabet:8}],[55,{bytes:1,alphabet:9}],[56,{bytes:1,alphabet:10}],[73,{bytes:1,alphabet:11}],[57,{bytes:2,alphabet:12}],[58,{bytes:2,alphabet:13}],[59,{bytes:2,alphabet:14}]]),s=new Map([[15,{bytes:2,alphabet:15}],[16,{bytes:1,alphabet:16}],[17,{bytes:1,alphabet:17}],[18,{bytes:1,alphabet:18}],[19,{bytes:1,alphabet:19}],[20,{bytes:1,alphabet:20}],[21,{bytes:1,alphabet:21}],[22,{bytes:1,alphabet:22}],[23,{bytes:1,alphabet:23}],[24,{bytes:1,alphabet:24}],[25,{bytes:1,alphabet:25}],[26,{bytes:1,alphabet:26}],[27,{bytes:1,alphabet:27}],[28,{bytes:1,alphabet:28}],[29,{bytes:1,alphabet:29}],[30,{bytes:1,alphabet:30}],[31,{bytes:1,alphabet:31}]]),o=new Map([[64,{bytes:2,alphabet:15}],[65,{bytes:1,alphabet:16}],[66,{bytes:1,alphabet:17}],[67,{bytes:1,alphabet:18}],[68,{bytes:1,alphabet:19}],[69,{bytes:1,alphabet:20}],[70,{bytes:1,alphabet:21}],[71,{bytes:1,alphabet:22}],[72,{bytes:1,alphabet:23}],[73,{bytes:1,alphabet:24}],[74,{bytes:1,alphabet:25}],[75,{bytes:1,alphabet:26}],[76,{bytes:1,alphabet:27}],[77,{bytes:1,alphabet:28}],[78,{bytes:1,alphabet:29}],[79,{bytes:1,alphabet:30}],[112,{bytes:1,alphabet:31}]]),a=[["#000000FF","#FF0000FF","#00FF00FF","#FFFF00FF","#0000FFFF","#FF00FFFF","#00FFFFFF","#FFFFFFFF","#00000000","#AA0000FF","#00AA00FF","#AAAA00FF","#0000AAFF","#AA00AAFF","#00AAAAFF","#AAAAAAFF"],["#000055FF","#005500FF","#005555FF","#0055AAFF","#0055FFFF","#00AA55FF","#00AAFFFF","#00FF55FF","#00FFAAFF","#550000FF","#550055FF","#5500AAFF","#5500FFFF","#555500FF","#555555FF","#5555AAFF"],["#5555FFFF","#55AA00FF","#55AA55FF","#55AAAAFF","#55AAFFFF","#55FF00FF","#55FF55FF","#55FFAAFF","#55FFFFFF","#AA0055FF","#AA00FFFF","#AA5500FF","#AA5555FF","#AA55AAFF","#AA55FFFF","#AAAA55FF"],["#AAAAFFFF","#AAFF00FF","#AAFF55FF","#AAFFAAFF","#AAFFFFFF","#FF0055FF","#FF00AAFF","#FF5500FF","#FF5555FF","#FF55AAFF","#FF55FFFF","#FFAA00FF","#FFAA55FF","#FFAAAAFF","#FFAAFFFF","#FFFF55FF"],["#FFFFAAFF","#00000080","#FF000080","#00FF0080","#FFFF0080","#0000FF80","#FF00FF80","#00FFFF80","#FFFFFF80","#AA000080","#00AA0080","#AAAA0080","#0000AA80","#AA00AA80","#00AAAA80","#AAAAAA80"],["#00005580","#00550080","#00555580","#0055AA80","#0055FF80","#00AA5580","#00AAFF80","#00FF5580","#00FFAA80","#55000080","#55005580","#5500AA80","#5500FF80","#55550080","#55555580","#5555AA80"],["#5555FF80","#55AA0080","#55AA5580","#55AAAA80","#55AAFF80","#55FF0080","#55FF5580","#55FFAA80","#55FFFF80","#AA005580","#AA00FF80","#AA550080","#AA555580","#AA55AA80","#AA55FF80","#AAAA5580"],["#AAAAFF80","#AAFF0080","#AAFF5580","#AAFFAA80","#AAFFFF80","#FF005580","#FF00AA80","#FF550080","#FF555580","#FF55AA80","#FF55FF80","#FFAA0080","#FFAA5580","#FFAAAA80","#FFAAFF80","#FFFF5580"]],l=[" ","、","。",",",".","・",":",";","?","!","゛","゜","´","`","¨","^"," ̄","_","ヽ","ヾ","ゝ","ゞ","〃","仝","々","〆","〇","ー","―","‐","/","\","〜","‖","|","…","‥","‘","’","“","”","(",")","〔","〕","[","]","{","}","〈","〉","《","》","「","」","『","』","【","】","+","−","±","×","÷","=","≠","<",">","≦","≧","∞","∴","♂","♀","°","′","″","℃","¥","$","¢","£","%","#","&","*","@","§","☆","★","○","●","◎","◇","◆","□","■","△","▲","▽","▼","※","〒","→","←","↑","↓","〓","'",""","-","~","〳","〴","〵","〻","〼","ヿ","ゟ","∈","∋","⊆","⊇","⊂","⊃","∪","∩","⊄","⊅","⊊","⊋","∉","∅","⌅","⌆","∧","∨","¬","⇒","⇔","∀","∃","⊕","⊖","⊗","∥","∦","⦅","⦆","〘","〙","〖","〗","∠","⊥","⌒","∂","∇","≡","≒","≪","≫","√","∽","∝","∵","∫","∬","≢","≃","≅","≈","≶","≷","↔","Å","‰","♯","♭","♪","†","‡","¶","♮","♫","♬","♩","◯","▷","▶","◁","◀","↗","↘","↖","↙","⇄","⇨","⇦","⇧","⇩","⤴","⤵","0","1","2","3","4","5","6","7","8","9","⦿","◉","〽","﹆","﹅","◦","•","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","∓","ℵ","ℏ","㏋","ℓ","℧","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","゠","–","⧺","⧻","ぁ","あ","ぃ","い","ぅ","う","ぇ","え","ぉ","お","か","が","き","ぎ","く","ぐ","け","げ","こ","ご","さ","ざ","し","じ","す","ず","せ","ぜ","そ","ぞ","た","だ","ち","ぢ","っ","つ","づ","て","で","と","ど","な","に","ぬ","ね","の","は","ば","ぱ","ひ","び","ぴ","ふ","ぶ","ぷ","へ","べ","ぺ","ほ","ぼ","ぽ","ま","み","む","め","も","ゃ","や","ゅ","ゆ","ょ","よ","ら","り","る","れ","ろ","ゎ","わ","ゐ","ゑ","を","ん","ゔ","ゕ","ゖ","か゚","き゚","く゚","け゚","こ゚","","","","ァ","ア","ィ","イ","ゥ","ウ","ェ","エ","ォ","オ","カ","ガ","キ","ギ","ク","グ","ケ","ゲ","コ","ゴ","サ","ザ","シ","ジ","ス","ズ","セ","ゼ","ソ","ゾ","タ","ダ","チ","ヂ","ッ","ツ","ヅ","テ","デ","ト","ド","ナ","ニ","ヌ","ネ","ノ","ハ","バ","パ","ヒ","ビ","ピ","フ","ブ","プ","ヘ","ベ","ペ","ホ","ボ","ポ","マ","ミ","ム","メ","モ","ャ","ヤ","ュ","ユ","ョ","ヨ","ラ","リ","ル","レ","ロ","ヮ","ワ","ヰ","ヱ","ヲ","ン","ヴ","ヵ","ヶ","カ゚","キ゚","ク゚","ケ゚","コ゚","セ゚","ツ゚","ト゚","Α","Β","Γ","Δ","Ε","Ζ","Η","Θ","Ι","Κ","Λ","Μ","Ν","Ξ","Ο","Π","Ρ","Σ","Τ","Υ","Φ","Χ","Ψ","Ω","♤","♠","♢","♦","♡","♥","♧","♣","α","β","γ","δ","ε","ζ","η","θ","ι","κ","λ","μ","ν","ξ","ο","π","ρ","σ","τ","υ","φ","χ","ψ","ω","ς","⓵","⓶","⓷","⓸","⓹","⓺","⓻","⓼","⓽","⓾","☖","☗","〠","☎","☀","☁","☂","☃","♨","▱","ㇰ","ㇱ","ㇲ","ㇳ","ㇴ","ㇵ","ㇶ","ㇷ","ㇸ","ㇹ","ㇷ゚","ㇺ","ㇻ","ㇼ","ㇽ","ㇾ","ㇿ","А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я","⎾","⎿","⏀","⏁","⏂","⏃","⏄","⏅","⏆","⏇","⏈","⏉","⏊","⏋","⏌","а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я","ヷ","ヸ","ヹ","ヺ","⋚","⋛","⅓","⅔","⅕","✓","⌘","␣","⏎","─","│","┌","┐","┘","└","├","┬","┤","┴","┼","━","┃","┏","┓","┛","┗","┣","┳","┫","┻","╋","┠","┯","┨","┷","┿","┝","┰","┥","┸","╂","㉑","㉒","㉓","㉔","㉕","㉖","㉗","㉘","㉙","㉚","㉛","㉜","㉝","㉞","㉟","㊱","㊲","㊳","㊴","㊵","㊶","㊷","㊸","㊹","㊺","㊻","㊼","㊽","㊾","㊿","","","","","","","","","◐","◑","◒","◓","‼","⁇","⁈","⁉","Ǎ","ǎ","ǐ","Ḿ","ḿ","Ǹ","ǹ","Ǒ","ǒ","ǔ","ǖ","ǘ","ǚ","ǜ","","","€"," ","¡","¤","¦","©","ª","«","­","®","¯","²","³","·","¸","¹","º","»","¼","½","¾","¿","À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","Ø","Ù","Ú","Û","Ü","Ý","Þ","ß","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï","ð","ñ","ò","ó","ô","õ","ö","ø","ù","ú","û","ü","ý","þ","ÿ","Ā","Ī","Ū","Ē","Ō","ā","ī","ū","ē","ō","Ą","˘","Ł","Ľ","Ś","Š","Ş","Ť","Ź","Ž","Ż","ą","˛","ł","ľ","ś","ˇ","š","ş","ť","ź","˝","ž","ż","Ŕ","Ă","Ĺ","Ć","Č","Ę","Ě","Ď","Ń","Ň","Ő","Ř","Ů","Ű","Ţ","ŕ","ă","ĺ","ć","č","ę","ě","ď","đ","ń","ň","ő","ř","ů","ű","ţ","˙","Ĉ","Ĝ","Ĥ","Ĵ","Ŝ","Ŭ","ĉ","ĝ","ĥ","ĵ","ŝ","ŭ","ɱ","ʋ","ɾ","ʃ","ʒ","ɬ","ɮ","ɹ","ʈ","ɖ","ɳ","ɽ","ʂ","ʐ","ɻ","ɭ","ɟ","ɲ","ʝ","ʎ","ɡ","ŋ","ɰ","ʁ","ħ","ʕ","ʔ","ɦ","ʘ","ǂ","ɓ","ɗ","ʄ","ɠ","Ɠ","œ","Œ","ɨ","ʉ","ɘ","ɵ","ə","ɜ","ɞ","ɐ","ɯ","ʊ","ɤ","ʌ","ɔ","ɑ","ɒ","ʍ","ɥ","ʢ","ʡ","ɕ","ʑ","ɺ","ɧ","ɚ","æ̀","ǽ","ὰ","ά","ɔ̀","ɔ́","ʌ̀","ʌ́","ə̀","ə́","ɚ̀","ɚ́","ὲ","έ","͡","ˈ","ˌ","ː","ˑ","̆","‿","̋","́","̄","̀","̏","̌","̂","˥","˦","˧","˨","˩","˩˥","˥˩","̥","̬","̹","̜","̟","̠","̈","̽","̩","̯","˞","̤","̰","̼","̴","̝","̞","̘","̙","̪","̺","̻","̃","̚","❶","❷","❸","❹","❺","❻","❼","❽","❾","❿","⓫","⓬","⓭","⓮","⓯","⓰","⓱","⓲","⓳","⓴","ⅰ","ⅱ","ⅲ","ⅳ","ⅴ","ⅵ","ⅶ","ⅷ","ⅸ","ⅹ","ⅺ","ⅻ","ⓐ","ⓑ","ⓒ","ⓓ","ⓔ","ⓕ","ⓖ","ⓗ","ⓘ","ⓙ","ⓚ","ⓛ","ⓜ","ⓝ","ⓞ","ⓟ","ⓠ","ⓡ","ⓢ","ⓣ","ⓤ","ⓥ","ⓦ","ⓧ","ⓨ","ⓩ","㋐","㋑","㋒","㋓","㋔","㋕","㋖","㋗","㋘","㋙","㋚","㋛","㋜","㋝","㋞","㋟","㋠","㋡","㋢","㋣","㋺","㋩","㋥","㋭","㋬","","","","","","","","","","⁑","⁂","①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","⑰","⑱","⑲","⑳","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ","Ⅹ","Ⅺ","㍉","㌔","㌢","㍍","㌘","㌧","㌃","㌶","㍑","㍗","㌍","㌦","㌣","㌫","㍊","㌻","㎜","㎝","㎞","㎎","㎏","㏄","㎡","Ⅻ","","","","","","","","㍻","〝","〟","№","㏍","℡","㊤","㊥","㊦","㊧","㊨","㈱","㈲","㈹","㍾","㍽","㍼","","","","∮","","","","","∟","⊿","","","","❖","☞","俱","𠀋","㐂","丨","丯","丰","亍","仡","份","仿","伃","伋","你","佈","佉","佖","佟","佪","佬","佾","侊","侔","侗","侮","俉","俠","倁","倂","倎","倘","倧","倮","偀","倻","偁","傔","僌","僲","僐","僦","僧","儆","儃","儋","儞","儵","兊","免","兕","兗","㒵","冝","凃","凊","凞","凢","凮","刁","㓛","刓","刕","剉","剗","剡","劓","勈","勉","勌","勐","勖","勛","勤","勰","勻","匀","匇","匜","卑","卡","卣","卽","厓","厝","厲","吒","吧","呍","咜","呫","呴","呿","咈","咖","咡","咩","哆","哿","唎","唫","唵","啐","啞","喁","喆","喎","喝","喭","嗎","嘆","嘈","嘎","嘻","噉","噶","噦","器","噯","噱","噲","嚙","嚞","嚩","嚬","嚳","囉","囊","圊","𡈽","圡","圯","圳","圴","坰","坷","坼","垜","﨏","𡌛","垸","埇","埈","埏","埤","埭","埵","埶","埿","堉","塚","塡","塤","塀","塼","墉","增","墨","墩","𡑮","壒","壎","壔","壚","壠","壩","夌","虁","奝","奭","妋","妒","妤","姃","姒","姝","娓","娣","婧","婭","婷","婾","媄","媞","媧","嫄","𡢽","嬙","嬥","剝","亜","唖","娃","阿","哀","愛","挨","姶","逢","葵","茜","穐","悪","握","渥","旭","葦","芦","鯵","梓","圧","斡","扱","宛","姐","虻","飴","絢","綾","鮎","或","粟","袷","安","庵","按","暗","案","闇","鞍","杏","以","伊","位","依","偉","囲","夷","委","威","尉","惟","意","慰","易","椅","為","畏","異","移","維","緯","胃","萎","衣","謂","違","遺","医","井","亥","域","育","郁","磯","一","壱","溢","逸","稲","茨","芋","鰯","允","印","咽","員","因","姻","引","飲","淫","胤","蔭","院","陰","隠","韻","吋","右","宇","烏","羽","迂","雨","卯","鵜","窺","丑","碓","臼","渦","嘘","唄","欝","蔚","鰻","姥","厩","浦","瓜","閏","噂","云","運","雲","荏","餌","叡","営","嬰","影","映","曳","栄","永","泳","洩","瑛","盈","穎","頴","英","衛","詠","鋭","液","疫","益","駅","悦","謁","越","閲","榎","厭","円","園","堰","奄","宴","延","怨","掩","援","沿","演","炎","焔","煙","燕","猿","縁","艶","苑","薗","遠","鉛","鴛","塩","於","汚","甥","凹","央","奥","往","応","押","旺","横","欧","殴","王","翁","襖","鴬","鴎","黄","岡","沖","荻","億","屋","憶","臆","桶","牡","乙","俺","卸","恩","温","穏","音","下","化","仮","何","伽","価","佳","加","可","嘉","夏","嫁","家","寡","科","暇","果","架","歌","河","火","珂","禍","禾","稼","箇","花","苛","茄","荷","華","菓","蝦","課","嘩","貨","迦","過","霞","蚊","俄","峨","我","牙","画","臥","芽","蛾","賀","雅","餓","駕","介","会","解","回","塊","壊","廻","快","怪","悔","恢","懐","戒","拐","改","魁","晦","械","海","灰","界","皆","絵","芥","蟹","開","階","貝","凱","劾","外","咳","害","崖","慨","概","涯","碍","蓋","街","該","鎧","骸","浬","馨","蛙","垣","柿","蛎","鈎","劃","嚇","各","廓","拡","撹","格","核","殻","獲","確","穫","覚","角","赫","較","郭","閣","隔","革","学","岳","楽","額","顎","掛","笠","樫","橿","梶","鰍","潟","割","喝","恰","括","活","渇","滑","葛","褐","轄","且","鰹","叶","椛","樺","鞄","株","兜","竃","蒲","釜","鎌","噛","鴨","栢","茅","萱","粥","刈","苅","瓦","乾","侃","冠","寒","刊","勘","勧","巻","喚","堪","姦","完","官","寛","干","幹","患","感","慣","憾","換","敢","柑","桓","棺","款","歓","汗","漢","澗","潅","環","甘","監","看","竿","管","簡","緩","缶","翰","肝","艦","莞","観","諌","貫","還","鑑","間","閑","関","陥","韓","館","舘","丸","含","岸","巌","玩","癌","眼","岩","翫","贋","雁","頑","顔","願","企","伎","危","喜","器","基","奇","嬉","寄","岐","希","幾","忌","揮","机","旗","既","期","棋","棄","機","帰","毅","気","汽","畿","祈","季","稀","紀","徽","規","記","貴","起","軌","輝","飢","騎","鬼","亀","偽","儀","妓","宜","戯","技","擬","欺","犠","疑","祇","義","蟻","誼","議","掬","菊","鞠","吉","吃","喫","桔","橘","詰","砧","杵","黍","却","客","脚","虐","逆","丘","久","仇","休","及","吸","宮","弓","急","救","朽","求","汲","泣","灸","球","究","窮","笈","級","糾","給","旧","牛","去","居","巨","拒","拠","挙","渠","虚","許","距","鋸","漁","禦","魚","亨","享","京","供","侠","僑","兇","競","共","凶","協","匡","卿","叫","喬","境","峡","強","彊","怯","恐","恭","挟","教","橋","況","狂","狭","矯","胸","脅","興","蕎","郷","鏡","響","饗","驚","仰","凝","尭","暁","業","局","曲","極","玉","桐","粁","僅","勤","均","巾","錦","斤","欣","欽","琴","禁","禽","筋","緊","芹","菌","衿","襟","謹","近","金","吟","銀","九","倶","句","区","狗","玖","矩","苦","躯","駆","駈","駒","具","愚","虞","喰","空","偶","寓","遇","隅","串","櫛","釧","屑","屈","掘","窟","沓","靴","轡","窪","熊","隈","粂","栗","繰","桑","鍬","勲","君","薫","訓","群","軍","郡","卦","袈","祁","係","傾","刑","兄","啓","圭","珪","型","契","形","径","恵","慶","慧","憩","掲","携","敬","景","桂","渓","畦","稽","系","経","継","繋","罫","茎","荊","蛍","計","詣","警","軽","頚","鶏","芸","迎","鯨","劇","戟","撃","激","隙","桁","傑","欠","決","潔","穴","結","血","訣","月","件","倹","倦","健","兼","券","剣","喧","圏","堅","嫌","建","憲","懸","拳","捲","検","権","牽","犬","献","研","硯","絹","県","肩","見","謙","賢","軒","遣","鍵","険","顕","験","鹸","元","原","厳","幻","弦","減","源","玄","現","絃","舷","言","諺","限","乎","個","古","呼","固","姑","孤","己","庫","弧","戸","故","枯","湖","狐","糊","袴","股","胡","菰","虎","誇","跨","鈷","雇","顧","鼓","五","互","伍","午","呉","吾","娯","後","御","悟","梧","檎","瑚","碁","語","誤","護","醐","乞","鯉","交","佼","侯","候","倖","光","公","功","効","勾","厚","口","向","后","喉","坑","垢","好","孔","孝","宏","工","巧","巷","幸","広","庚","康","弘","恒","慌","抗","拘","控","攻","昂","晃","更","杭","校","梗","構","江","洪","浩","港","溝","甲","皇","硬","稿","糠","紅","紘","絞","綱","耕","考","肯","肱","腔","膏","航","荒","行","衡","講","貢","購","郊","酵","鉱","砿","鋼","閤","降","項","香","高","鴻","剛","劫","号","合","壕","拷","濠","豪","轟","麹","克","刻","告","国","穀","酷","鵠","黒","獄","漉","腰","甑","忽","惚","骨","狛","込","此","頃","今","困","坤","墾","婚","恨","懇","昏","昆","根","梱","混","痕","紺","艮","魂","些","佐","叉","唆","嵯","左","差","査","沙","瑳","砂","詐","鎖","裟","坐","座","挫","債","催","再","最","哉","塞","妻","宰","彩","才","採","栽","歳","済","災","采","犀","砕","砦","祭","斎","細","菜","裁","載","際","剤","在","材","罪","財","冴","坂","阪","堺","榊","肴","咲","崎","埼","碕","鷺","作","削","咋","搾","昨","朔","柵","窄","策","索","錯","桜","鮭","笹","匙","冊","刷","察","拶","撮","擦","札","殺","薩","雑","皐","鯖","捌","錆","鮫","皿","晒","三","傘","参","山","惨","撒","散","桟","燦","珊","産","算","纂","蚕","讃","賛","酸","餐","斬","暫","残","仕","仔","伺","使","刺","司","史","嗣","四","士","始","姉","姿","子","屍","市","師","志","思","指","支","孜","斯","施","旨","枝","止","死","氏","獅","祉","私","糸","紙","紫","肢","脂","至","視","詞","詩","試","誌","諮","資","賜","雌","飼","歯","事","似","侍","児","字","寺","慈","持","時","次","滋","治","爾","璽","痔","磁","示","而","耳","自","蒔","辞","汐","鹿","式","識","鴫","竺","軸","宍","雫","七","叱","執","失","嫉","室","悉","湿","漆","疾","質","実","蔀","篠","偲","柴","芝","屡","蕊","縞","舎","写","射","捨","赦","斜","煮","社","紗","者","謝","車","遮","蛇","邪","借","勺","尺","杓","灼","爵","酌","釈","錫","若","寂","弱","惹","主","取","守","手","朱","殊","狩","珠","種","腫","趣","酒","首","儒","受","呪","寿","授","樹","綬","需","囚","収","周","宗","就","州","修","愁","拾","洲","秀","秋","終","繍","習","臭","舟","蒐","衆","襲","讐","蹴","輯","週","酋","酬","集","醜","什","住","充","十","従","戎","柔","汁","渋","獣","縦","重","銃","叔","夙","宿","淑","祝","縮","粛","塾","熟","出","術","述","俊","峻","春","瞬","竣","舜","駿","准","循","旬","楯","殉","淳","準","潤","盾","純","巡","遵","醇","順","処","初","所","暑","曙","渚","庶","緒","署","書","薯","藷","諸","助","叙","女","序","徐","恕","鋤","除","傷","償","勝","匠","升","召","哨","商","唱","嘗","奨","妾","娼","宵","将","小","少","尚","庄","床","廠","彰","承","抄","招","掌","捷","昇","昌","昭","晶","松","梢","樟","樵","沼","消","渉","湘","焼","焦","照","症","省","硝","礁","祥","称","章","笑","粧","紹","肖","菖","蒋","蕉","衝","裳","訟","証","詔","詳","象","賞","醤","鉦","鍾","鐘","障","鞘","上","丈","丞","乗","冗","剰","城","場","壌","嬢","常","情","擾","条","杖","浄","状","畳","穣","蒸","譲","醸","錠","嘱","埴","飾","拭","植","殖","燭","織","職","色","触","食","蝕","辱","尻","伸","信","侵","唇","娠","寝","審","心","慎","振","新","晋","森","榛","浸","深","申","疹","真","神","秦","紳","臣","芯","薪","親","診","身","辛","進","針","震","人","仁","刃","塵","壬","尋","甚","尽","腎","訊","迅","陣","靭","笥","諏","須","酢","図","厨","逗","吹","垂","帥","推","水","炊","睡","粋","翠","衰","遂","酔","錐","錘","随","瑞","髄","崇","嵩","数","枢","趨","雛","据","杉","椙","菅","頗","雀","裾","澄","摺","寸","世","瀬","畝","是","凄","制","勢","姓","征","性","成","政","整","星","晴","棲","栖","正","清","牲","生","盛","精","聖","声","製","西","誠","誓","請","逝","醒","青","静","斉","税","脆","隻","席","惜","戚","斥","昔","析","石","積","籍","績","脊","責","赤","跡","蹟","碩","切","拙","接","摂","折","設","窃","節","説","雪","絶","舌","蝉","仙","先","千","占","宣","専","尖","川","戦","扇","撰","栓","栴","泉","浅","洗","染","潜","煎","煽","旋","穿","箭","線","繊","羨","腺","舛","船","薦","詮","賎","践","選","遷","銭","銑","閃","鮮","前","善","漸","然","全","禅","繕","膳","糎","噌","塑","岨","措","曾","曽","楚","狙","疏","疎","礎","祖","租","粗","素","組","蘇","訴","阻","遡","鼠","僧","創","双","叢","倉","喪","壮","奏","爽","宋","層","匝","惣","想","捜","掃","挿","掻","操","早","曹","巣","槍","槽","漕","燥","争","痩","相","窓","糟","総","綜","聡","草","荘","葬","蒼","藻","装","走","送","遭","鎗","霜","騒","像","増","憎","臓","蔵","贈","造","促","側","則","即","息","捉","束","測","足","速","俗","属","賊","族","続","卒","袖","其","揃","存","孫","尊","損","村","遜","他","多","太","汰","詑","唾","堕","妥","惰","打","柁","舵","楕","陀","駄","騨","体","堆","対","耐","岱","帯","待","怠","態","戴","替","泰","滞","胎","腿","苔","袋","貸","退","逮","隊","黛","鯛","代","台","大","第","醍","題","鷹","滝","瀧","卓","啄","宅","托","択","拓","沢","濯","琢","託","鐸","濁","諾","茸","凧","蛸","只","叩","但","達","辰","奪","脱","巽","竪","辿","棚","谷","狸","鱈","樽","誰","丹","単","嘆","坦","担","探","旦","歎","淡","湛","炭","短","端","箪","綻","耽","胆","蛋","誕","鍛","団","壇","弾","断","暖","檀","段","男","談","値","知","地","弛","恥","智","池","痴","稚","置","致","蜘","遅","馳","築","畜","竹","筑","蓄","逐","秩","窒","茶","嫡","着","中","仲","宙","忠","抽","昼","柱","注","虫","衷","註","酎","鋳","駐","樗","瀦","猪","苧","著","貯","丁","兆","凋","喋","寵","帖","帳","庁","弔","張","彫","徴","懲","挑","暢","朝","潮","牒","町","眺","聴","脹","腸","蝶","調","諜","超","跳","銚","長","頂","鳥","勅","捗","直","朕","沈","珍","賃","鎮","陳","津","墜","椎","槌","追","鎚","痛","通","塚","栂","掴","槻","佃","漬","柘","辻","蔦","綴","鍔","椿","潰","坪","壷","嬬","紬","爪","吊","釣","鶴","亭","低","停","偵","剃","貞","呈","堤","定","帝","底","庭","廷","弟","悌","抵","挺","提","梯","汀","碇","禎","程","締","艇","訂","諦","蹄","逓","邸","鄭","釘","鼎","泥","摘","擢","敵","滴","的","笛","適","鏑","溺","哲","徹","撤","轍","迭","鉄","典","填","天","展","店","添","纏","甜","貼","転","顛","点","伝","殿","澱","田","電","兎","吐","堵","塗","妬","屠","徒","斗","杜","渡","登","菟","賭","途","都","鍍","砥","砺","努","度","土","奴","怒","倒","党","冬","凍","刀","唐","塔","塘","套","宕","島","嶋","悼","投","搭","東","桃","梼","棟","盗","淘","湯","涛","灯","燈","当","痘","祷","等","答","筒","糖","統","到","董","蕩","藤","討","謄","豆","踏","逃","透","鐙","陶","頭","騰","闘","働","動","同","堂","導","憧","撞","洞","瞳","童","胴","萄","道","銅","峠","鴇","匿","得","徳","涜","特","督","禿","篤","毒","独","読","栃","橡","凸","突","椴","届","鳶","苫","寅","酉","瀞","噸","屯","惇","敦","沌","豚","遁","頓","呑","曇","鈍","奈","那","内","乍","凪","薙","謎","灘","捺","鍋","楢","馴","縄","畷","南","楠","軟","難","汝","二","尼","弐","迩","匂","賑","肉","虹","廿","日","乳","入","如","尿","韮","任","妊","忍","認","濡","禰","祢","寧","葱","猫","熱","年","念","捻","撚","燃","粘","乃","廼","之","埜","嚢","悩","濃","納","能","脳","膿","農","覗","蚤","巴","把","播","覇","杷","波","派","琶","破","婆","罵","芭","馬","俳","廃","拝","排","敗","杯","盃","牌","背","肺","輩","配","倍","培","媒","梅","楳","煤","狽","買","売","賠","陪","這","蝿","秤","矧","萩","伯","剥","博","拍","柏","泊","白","箔","粕","舶","薄","迫","曝","漠","爆","縛","莫","駁","麦","函","箱","硲","箸","肇","筈","櫨","幡","肌","畑","畠","八","鉢","溌","発","醗","髪","伐","罰","抜","筏","閥","鳩","噺","塙","蛤","隼","伴","判","半","反","叛","帆","搬","斑","板","氾","汎","版","犯","班","畔","繁","般","藩","販","範","釆","煩","頒","飯","挽","晩","番","盤","磐","蕃","蛮","匪","卑","否","妃","庇","彼","悲","扉","批","披","斐","比","泌","疲","皮","碑","秘","緋","罷","肥","被","誹","費","避","非","飛","樋","簸","備","尾","微","枇","毘","琵","眉","美","鼻","柊","稗","匹","疋","髭","彦","膝","菱","肘","弼","必","畢","筆","逼","桧","姫","媛","紐","百","謬","俵","彪","標","氷","漂","瓢","票","表","評","豹","廟","描","病","秒","苗","錨","鋲","蒜","蛭","鰭","品","彬","斌","浜","瀕","貧","賓","頻","敏","瓶","不","付","埠","夫","婦","富","冨","布","府","怖","扶","敷","斧","普","浮","父","符","腐","膚","芙","譜","負","賦","赴","阜","附","侮","撫","武","舞","葡","蕪","部","封","楓","風","葺","蕗","伏","副","復","幅","服","福","腹","複","覆","淵","弗","払","沸","仏","物","鮒","分","吻","噴","墳","憤","扮","焚","奮","粉","糞","紛","雰","文","聞","丙","併","兵","塀","幣","平","弊","柄","並","蔽","閉","陛","米","頁","僻","壁","癖","碧","別","瞥","蔑","箆","偏","変","片","篇","編","辺","返","遍","便","勉","娩","弁","鞭","保","舗","鋪","圃","捕","歩","甫","補","輔","穂","募","墓","慕","戊","暮","母","簿","菩","倣","俸","包","呆","報","奉","宝","峰","峯","崩","庖","抱","捧","放","方","朋","法","泡","烹","砲","縫","胞","芳","萌","蓬","蜂","褒","訪","豊","邦","鋒","飽","鳳","鵬","乏","亡","傍","剖","坊","妨","帽","忘","忙","房","暴","望","某","棒","冒","紡","肪","膨","謀","貌","貿","鉾","防","吠","頬","北","僕","卜","墨","撲","朴","牧","睦","穆","釦","勃","没","殆","堀","幌","奔","本","翻","凡","盆","摩","磨","魔","麻","埋","妹","昧","枚","毎","哩","槙","幕","膜","枕","鮪","柾","鱒","桝","亦","俣","又","抹","末","沫","迄","侭","繭","麿","万","慢","満","漫","蔓","味","未","魅","巳","箕","岬","密","蜜","湊","蓑","稔","脈","妙","粍","民","眠","務","夢","無","牟","矛","霧","鵡","椋","婿","娘","冥","名","命","明","盟","迷","銘","鳴","姪","牝","滅","免","棉","綿","緬","面","麺","摸","模","茂","妄","孟","毛","猛","盲","網","耗","蒙","儲","木","黙","目","杢","勿","餅","尤","戻","籾","貰","問","悶","紋","門","匁","也","冶","夜","爺","耶","野","弥","矢","厄","役","約","薬","訳","躍","靖","柳","薮","鑓","愉","愈","油","癒","諭","輸","唯","佑","優","勇","友","宥","幽","悠","憂","揖","有","柚","湧","涌","猶","猷","由","祐","裕","誘","遊","邑","郵","雄","融","夕","予","余","与","誉","輿","預","傭","幼","妖","容","庸","揚","揺","擁","曜","楊","様","洋","溶","熔","用","窯","羊","耀","葉","蓉","要","謡","踊","遥","陽","養","慾","抑","欲","沃","浴","翌","翼","淀","羅","螺","裸","来","莱","頼","雷","洛","絡","落","酪","乱","卵","嵐","欄","濫","藍","蘭","覧","利","吏","履","李","梨","理","璃","痢","裏","裡","里","離","陸","律","率","立","葎","掠","略","劉","流","溜","琉","留","硫","粒","隆","竜","龍","侶","慮","旅","虜","了","亮","僚","両","凌","寮","料","梁","涼","猟","療","瞭","稜","糧","良","諒","遼","量","陵","領","力","緑","倫","厘","林","淋","燐","琳","臨","輪","隣","鱗","麟","瑠","塁","涙","累","類","令","伶","例","冷","励","嶺","怜","玲","礼","苓","鈴","隷","零","霊","麗","齢","暦","歴","列","劣","烈","裂","廉","恋","憐","漣","煉","簾","練","聯","蓮","連","錬","呂","魯","櫓","炉","賂","路","露","労","婁","廊","弄","朗","楼","榔","浪","漏","牢","狼","篭","老","聾","蝋","郎","六","麓","禄","肋","録","論","倭","和","話","歪","賄","脇","惑","枠","鷲","亙","亘","鰐","詫","藁","蕨","椀","湾","碗","腕","𠮟","孁","孖","孽","宓","寘","寬","尒","尞","尣","尫","㞍","屢","層","屮","𡚴","屺","岏","岟","岣","岪","岺","峋","峐","峒","峴","𡸴","㟢","崍","崧","﨑","嵆","嵇","嵓","嵊","嵭","嶁","嶠","嶤","嶧","嶸","巋","吞","弌","丐","丕","个","丱","丶","丼","丿","乂","乖","乘","亂","亅","豫","亊","舒","弍","于","亞","亟","亠","亢","亰","亳","亶","从","仍","仄","仆","仂","仗","仞","仭","仟","价","伉","佚","估","佛","佝","佗","佇","佶","侈","侏","侘","佻","佩","佰","侑","佯","來","侖","儘","俔","俟","俎","俘","俛","俑","俚","俐","俤","俥","倚","倨","倔","倪","倥","倅","伜","俶","倡","倩","倬","俾","俯","們","倆","偃","假","會","偕","偐","偈","做","偖","偬","偸","傀","傚","傅","傴","傲","僉","僊","傳","僂","僖","僞","僥","僭","僣","僮","價","僵","儉","儁","儂","儖","儕","儔","儚","儡","儺","儷","儼","儻","儿","兀","兒","兌","兔","兢","竸","兩","兪","兮","冀","冂","囘","册","冉","冏","冑","冓","冕","冖","冤","冦","冢","冩","冪","冫","决","冱","冲","冰","况","冽","凅","凉","凛","几","處","凩","凭","凰","凵","凾","刄","刋","刔","刎","刧","刪","刮","刳","刹","剏","剄","剋","剌","剞","剔","剪","剴","剩","剳","剿","剽","劍","劔","劒","剱","劈","劑","辨","辧","劬","劭","劼","劵","勁","勍","勗","勞","勣","勦","飭","勠","勳","勵","勸","勹","匆","匈","甸","匍","匐","匏","匕","匚","匣","匯","匱","匳","匸","區","卆","卅","丗","卉","卍","凖","卞","卩","卮","夘","卻","卷","厂","厖","厠","厦","厥","厮","厰","厶","參","簒","雙","叟","曼","燮","叮","叨","叭","叺","吁","吽","呀","听","吭","吼","吮","吶","吩","吝","呎","咏","呵","咎","呟","呱","呷","呰","咒","呻","咀","呶","咄","咐","咆","哇","咢","咸","咥","咬","哄","哈","咨","咫","哂","咤","咾","咼","哘","哥","哦","唏","唔","哽","哮","哭","哺","哢","唹","啀","啣","啌","售","啜","啅","啖","啗","唸","唳","啝","喙","喀","咯","喊","喟","啻","啾","喘","喞","單","啼","喃","喩","喇","喨","嗚","嗅","嗟","嗄","嗜","嗤","嗔","嘔","嗷","嘖","嗾","嗽","嘛","嗹","噎","噐","營","嘴","嘶","嘲","嘸","噫","噤","嘯","噬","噪","嚆","嚀","嚊","嚠","嚔","嚏","嚥","嚮","嚶","嚴","囂","嚼","囁","囃","囀","囈","囎","囑","囓","囗","囮","囹","圀","囿","圄","圉","圈","國","圍","圓","團","圖","嗇","圜","圦","圷","圸","坎","圻","址","坏","坩","埀","垈","坡","坿","垉","垓","垠","垳","垤","垪","垰","埃","埆","埔","埒","埓","堊","埖","埣","堋","堙","堝","塲","堡","塢","塋","塰","毀","塒","堽","塹","墅","墹","墟","墫","墺","壞","墻","墸","墮","壅","壓","壑","壗","壙","壘","壥","壜","壤","壟","壯","壺","壹","壻","壼","壽","夂","夊","夐","夛","梦","夥","夬","夭","夲","夸","夾","竒","奕","奐","奎","奚","奘","奢","奠","奧","奬","奩","奸","妁","妝","佞","侫","妣","妲","姆","姨","姜","妍","姙","姚","娥","娟","娑","娜","娉","娚","婀","婬","婉","娵","娶","婢","婪","媚","媼","媾","嫋","嫂","媽","嫣","嫗","嫦","嫩","嫖","嫺","嫻","嬌","嬋","嬖","嬲","嫐","嬪","嬶","嬾","孃","孅","孀","孑","孕","孚","孛","孥","孩","孰","孳","孵","學","斈","孺","宀","它","宦","宸","寃","寇","寉","寔","寐","寤","實","寢","寞","寥","寫","寰","寶","寳","尅","將","專","對","尓","尠","尢","尨","尸","尹","屁","屆","屎","屓","屐","屏","孱","屬","屮","乢","屶","屹","岌","岑","岔","妛","岫","岻","岶","岼","岷","峅","岾","峇","峙","峩","峽","峺","峭","嶌","峪","崋","崕","崗","嵜","崟","崛","崑","崔","崢","崚","崙","崘","嵌","嵒","嵎","嵋","嵬","嵳","嵶","嶇","嶄","嶂","嶢","嶝","嶬","嶮","嶽","嶐","嶷","嶼","巉","巍","巓","巒","巖","巛","巫","已","巵","帋","帚","帙","帑","帛","帶","帷","幄","幃","幀","幎","幗","幔","幟","幢","幤","幇","幵","并","幺","麼","广","庠","廁","廂","廈","廐","廏","廖","廣","廝","廚","廛","廢","廡","廨","廩","廬","廱","廳","廰","廴","廸","廾","弃","弉","彝","彜","弋","弑","弖","弩","弭","弸","彁","彈","彌","彎","弯","彑","彖","彗","彙","彡","彭","彳","彷","徃","徂","彿","徊","很","徑","徇","從","徙","徘","徠","徨","徭","徼","忖","忻","忤","忸","忱","忝","悳","忿","怡","恠","怙","怐","怩","怎","怱","怛","怕","怫","怦","怏","怺","恚","恁","恪","恷","恟","恊","恆","恍","恣","恃","恤","恂","恬","恫","恙","悁","悍","惧","悃","悚","悄","悛","悖","悗","悒","悧","悋","惡","悸","惠","惓","悴","忰","悽","惆","悵","惘","慍","愕","愆","惶","惷","愀","惴","惺","愃","愡","惻","惱","愍","愎","慇","愾","愨","愧","慊","愿","愼","愬","愴","愽","慂","慄","慳","慷","慘","慙","慚","慫","慴","慯","慥","慱","慟","慝","慓","慵","憙","憖","憇","憬","憔","憚","憊","憑","憫","憮","懌","懊","應","懷","懈","懃","懆","憺","懋","罹","懍","懦","懣","懶","懺","懴","懿","懽","懼","懾","戀","戈","戉","戍","戌","戔","戛","戞","戡","截","戮","戰","戲","戳","扁","扎","扞","扣","扛","扠","扨","扼","抂","抉","找","抒","抓","抖","拔","抃","抔","拗","拑","抻","拏","拿","拆","擔","拈","拜","拌","拊","拂","拇","抛","拉","挌","拮","拱","挧","挂","挈","拯","拵","捐","挾","捍","搜","捏","掖","掎","掀","掫","捶","掣","掏","掉","掟","掵","捫","捩","掾","揩","揀","揆","揣","揉","插","揶","揄","搖","搴","搆","搓","搦","搶","攝","搗","搨","搏","摧","摯","摶","摎","攪","撕","撓","撥","撩","撈","撼","據","擒","擅","擇","撻","擘","擂","擱","擧","舉","擠","擡","抬","擣","擯","攬","擶","擴","擲","擺","攀","擽","攘","攜","攅","攤","攣","攫","攴","攵","攷","收","攸","畋","效","敖","敕","敍","敘","敞","敝","敲","數","斂","斃","變","斛","斟","斫","斷","旃","旆","旁","旄","旌","旒","旛","旙","无","旡","旱","杲","昊","昃","旻","杳","昵","昶","昴","昜","晏","晄","晉","晁","晞","晝","晤","晧","晨","晟","晢","晰","暃","暈","暎","暉","暄","暘","暝","曁","暹","曉","暾","暼","曄","暸","曖","曚","曠","昿","曦","曩","曰","曵","曷","朏","朖","朞","朦","朧","霸","朮","朿","朶","杁","朸","朷","杆","杞","杠","杙","杣","杤","枉","杰","枩","杼","杪","枌","枋","枦","枡","枅","枷","柯","枴","柬","枳","柩","枸","柤","柞","柝","柢","柮","枹","柎","柆","柧","檜","栞","框","栩","桀","桍","栲","桎","梳","栫","桙","档","桷","桿","梟","梏","梭","梔","條","梛","梃","檮","梹","桴","梵","梠","梺","椏","梍","桾","椁","棊","椈","棘","椢","椦","棡","椌","棍","棔","棧","棕","椶","椒","椄","棗","棣","椥","棹","棠","棯","椨","椪","椚","椣","椡","棆","楹","楷","楜","楸","楫","楔","楾","楮","椹","楴","椽","楙","椰","楡","楞","楝","榁","楪","榲","榮","槐","榿","槁","槓","榾","槎","寨","槊","槝","榻","槃","榧","樮","榑","榠","榜","榕","榴","槞","槨","樂","樛","槿","權","槹","槲","槧","樅","榱","樞","槭","樔","槫","樊","樒","櫁","樣","樓","橄","樌","橲","樶","橸","橇","橢","橙","橦","橈","樸","樢","檐","檍","檠","檄","檢","檣","檗","蘗","檻","櫃","櫂","檸","檳","檬","櫞","櫑","櫟","檪","櫚","櫪","櫻","欅","蘖","櫺","欒","欖","鬱","欟","欸","欷","盜","欹","飮","歇","歃","歉","歐","歙","歔","歛","歟","歡","歸","歹","歿","殀","殄","殃","殍","殘","殕","殞","殤","殪","殫","殯","殲","殱","殳","殷","殼","毆","毋","毓","毟","毬","毫","毳","毯","麾","氈","氓","气","氛","氤","氣","汞","汕","汢","汪","沂","沍","沚","沁","沛","汾","汨","汳","沒","沐","泄","泱","泓","沽","泗","泅","泝","沮","沱","沾","沺","泛","泯","泙","泪","洟","衍","洶","洫","洽","洸","洙","洵","洳","洒","洌","浣","涓","浤","浚","浹","浙","涎","涕","濤","涅","淹","渕","渊","涵","淇","淦","涸","淆","淬","淞","淌","淨","淒","淅","淺","淙","淤","淕","淪","淮","渭","湮","渮","渙","湲","湟","渾","渣","湫","渫","湶","湍","渟","湃","渺","湎","渤","滿","渝","游","溂","溪","溘","滉","溷","滓","溽","溯","滄","溲","滔","滕","溏","溥","滂","溟","潁","漑","灌","滬","滸","滾","漿","滲","漱","滯","漲","滌","漾","漓","滷","澆","潺","潸","澁","澀","潯","潛","濳","潭","澂","潼","潘","澎","澑","濂","潦","澳","澣","澡","澤","澹","濆","澪","濟","濕","濬","濔","濘","濱","濮","濛","瀉","瀋","濺","瀑","瀁","瀏","濾","瀛","瀚","潴","瀝","瀘","瀟","瀰","瀾","瀲","灑","灣","炙","炒","炯","烱","炬","炸","炳","炮","烟","烋","烝","烙","焉","烽","焜","焙","煥","煕","熈","煦","煢","煌","煖","煬","熏","燻","熄","熕","熨","熬","燗","熹","熾","燒","燉","燔","燎","燠","燬","燧","燵","燼","燹","燿","爍","爐","爛","爨","爭","爬","爰","爲","爻","爼","爿","牀","牆","牋","牘","牴","牾","犂","犁","犇","犒","犖","犢","犧","犹","犲","狃","狆","狄","狎","狒","狢","狠","狡","狹","狷","倏","猗","猊","猜","猖","猝","猴","猯","猩","猥","猾","獎","獏","默","獗","獪","獨","獰","獸","獵","獻","獺","珈","玳","珎","玻","珀","珥","珮","珞","璢","琅","瑯","琥","珸","琲","琺","瑕","琿","瑟","瑙","瑁","瑜","瑩","瑰","瑣","瑪","瑶","瑾","璋","璞","璧","瓊","瓏","瓔","珱","瓠","瓣","瓧","瓩","瓮","瓲","瓰","瓱","瓸","瓷","甄","甃","甅","甌","甎","甍","甕","甓","甞","甦","甬","甼","畄","畍","畊","畉","畛","畆","畚","畩","畤","畧","畫","畭","畸","當","疆","疇","畴","疊","疉","疂","疔","疚","疝","疥","疣","痂","疳","痃","疵","疽","疸","疼","疱","痍","痊","痒","痙","痣","痞","痾","痿","痼","瘁","痰","痺","痲","痳","瘋","瘍","瘉","瘟","瘧","瘠","瘡","瘢","瘤","瘴","瘰","瘻","癇","癈","癆","癜","癘","癡","癢","癨","癩","癪","癧","癬","癰","癲","癶","癸","發","皀","皃","皈","皋","皎","皖","皓","皙","皚","皰","皴","皸","皹","皺","盂","盍","盖","盒","盞","盡","盥","盧","盪","蘯","盻","眈","眇","眄","眩","眤","眞","眥","眦","眛","眷","眸","睇","睚","睨","睫","睛","睥","睿","睾","睹","瞎","瞋","瞑","瞠","瞞","瞰","瞶","瞹","瞿","瞼","瞽","瞻","矇","矍","矗","矚","矜","矣","矮","矼","砌","砒","礦","砠","礪","硅","碎","硴","碆","硼","碚","碌","碣","碵","碪","碯","磑","磆","磋","磔","碾","碼","磅","磊","磬","磧","磚","磽","磴","礇","礒","礑","礙","礬","礫","祀","祠","祗","祟","祚","祕","祓","祺","祿","禊","禝","禧","齋","禪","禮","禳","禹","禺","秉","秕","秧","秬","秡","秣","稈","稍","稘","稙","稠","稟","禀","稱","稻","稾","稷","穃","穗","穉","穡","穢","穩","龝","穰","穹","穽","窈","窗","窕","窘","窖","窩","竈","窰","窶","竅","竄","窿","邃","竇","竊","竍","竏","竕","竓","站","竚","竝","竡","竢","竦","竭","竰","笂","笏","笊","笆","笳","笘","笙","笞","笵","笨","笶","筐","筺","笄","筍","笋","筌","筅","筵","筥","筴","筧","筰","筱","筬","筮","箝","箘","箟","箍","箜","箚","箋","箒","箏","筝","箙","篋","篁","篌","篏","箴","篆","篝","篩","簑","簔","篦","篥","籠","簀","簇","簓","篳","篷","簗","簍","篶","簣","簧","簪","簟","簷","簫","簽","籌","籃","籔","籏","籀","籐","籘","籟","籤","籖","籥","籬","籵","粃","粐","粤","粭","粢","粫","粡","粨","粳","粲","粱","粮","粹","粽","糀","糅","糂","糘","糒","糜","糢","鬻","糯","糲","糴","糶","糺","紆","紂","紜","紕","紊","絅","絋","紮","紲","紿","紵","絆","絳","絖","絎","絲","絨","絮","絏","絣","經","綉","絛","綏","絽","綛","綺","綮","綣","綵","緇","綽","綫","總","綢","綯","緜","綸","綟","綰","緘","緝","緤","緞","緻","緲","緡","縅","縊","縣","縡","縒","縱","縟","縉","縋","縢","繆","繦","縻","縵","縹","繃","縷","縲","縺","繧","繝","繖","繞","繙","繚","繹","繪","繩","繼","繻","纃","緕","繽","辮","繿","纈","纉","續","纒","纐","纓","纔","纖","纎","纛","纜","缸","缺","罅","罌","罍","罎","罐","网","罕","罔","罘","罟","罠","罨","罩","罧","罸","羂","羆","羃","羈","羇","羌","羔","羞","羝","羚","羣","羯","羲","羹","羮","羶","羸","譱","翅","翆","翊","翕","翔","翡","翦","翩","翳","翹","飜","耆","耄","耋","耒","耘","耙","耜","耡","耨","耿","耻","聊","聆","聒","聘","聚","聟","聢","聨","聳","聲","聰","聶","聹","聽","聿","肄","肆","肅","肛","肓","肚","肭","冐","肬","胛","胥","胙","胝","胄","胚","胖","脉","胯","胱","脛","脩","脣","脯","腋","隋","腆","脾","腓","腑","胼","腱","腮","腥","腦","腴","膃","膈","膊","膀","膂","膠","膕","膤","膣","腟","膓","膩","膰","膵","膾","膸","膽","臀","臂","膺","臉","臍","臑","臙","臘","臈","臚","臟","臠","臧","臺","臻","臾","舁","舂","舅","與","舊","舍","舐","舖","舩","舫","舸","舳","艀","艙","艘","艝","艚","艟","艤","艢","艨","艪","艫","舮","艱","艷","艸","艾","芍","芒","芫","芟","芻","芬","苡","苣","苟","苒","苴","苳","苺","莓","范","苻","苹","苞","茆","苜","茉","苙","茵","茴","茖","茲","茱","荀","茹","荐","荅","茯","茫","茗","茘","莅","莚","莪","莟","莢","莖","茣","莎","莇","莊","荼","莵","荳","荵","莠","莉","莨","菴","萓","菫","菎","菽","萃","菘","萋","菁","菷","萇","菠","菲","萍","萢","萠","莽","萸","蔆","菻","葭","萪","萼","蕚","蒄","葷","葫","蒭","葮","蒂","葩","葆","萬","葯","葹","萵","蓊","葢","蒹","蒿","蒟","蓙","蓍","蒻","蓚","蓐","蓁","蓆","蓖","蒡","蔡","蓿","蓴","蔗","蔘","蔬","蔟","蔕","蔔","蓼","蕀","蕣","蕘","蕈","蕁","蘂","蕋","蕕","薀","薤","薈","薑","薊","薨","蕭","薔","薛","藪","薇","薜","蕷","蕾","薐","藉","薺","藏","薹","藐","藕","藝","藥","藜","藹","蘊","蘓","蘋","藾","藺","蘆","蘢","蘚","蘰","蘿","虍","乕","虔","號","虧","虱","蚓","蚣","蚩","蚪","蚋","蚌","蚶","蚯","蛄","蛆","蚰","蛉","蠣","蚫","蛔","蛞","蛩","蛬","蛟","蛛","蛯","蜒","蜆","蜈","蜀","蜃","蛻","蜑","蜉","蜍","蛹","蜊","蜴","蜿","蜷","蜻","蜥","蜩","蜚","蝠","蝟","蝸","蝌","蝎","蝴","蝗","蝨","蝮","蝙","蝓","蝣","蝪","蠅","螢","螟","螂","螯","蟋","螽","蟀","蟐","雖","螫","蟄","螳","蟇","蟆","螻","蟯","蟲","蟠","蠏","蠍","蟾","蟶","蟷","蠎","蟒","蠑","蠖","蠕","蠢","蠡","蠱","蠶","蠹","蠧","蠻","衄","衂","衒","衙","衞","衢","衫","袁","衾","袞","衵","衽","袵","衲","袂","袗","袒","袮","袙","袢","袍","袤","袰","袿","袱","裃","裄","裔","裘","裙","裝","裹","褂","裼","裴","裨","裲","褄","褌","褊","褓","襃","褞","褥","褪","褫","襁","襄","褻","褶","褸","襌","褝","襠","襞","襦","襤","襭","襪","襯","襴","襷","襾","覃","覈","覊","覓","覘","覡","覩","覦","覬","覯","覲","覺","覽","覿","觀","觚","觜","觝","觧","觴","觸","訃","訖","訐","訌","訛","訝","訥","訶","詁","詛","詒","詆","詈","詼","詭","詬","詢","誅","誂","誄","誨","誡","誑","誥","誦","誚","誣","諄","諍","諂","諚","諫","諳","諧","諤","諱","謔","諠","諢","諷","諞","諛","謌","謇","謚","諡","謖","謐","謗","謠","謳","鞫","謦","謫","謾","謨","譁","譌","譏","譎","證","譖","譛","譚","譫","譟","譬","譯","譴","譽","讀","讌","讎","讒","讓","讖","讙","讚","谺","豁","谿","豈","豌","豎","豐","豕","豢","豬","豸","豺","貂","貉","貅","貊","貍","貎","貔","豼","貘","戝","貭","貪","貽","貲","貳","貮","貶","賈","賁","賤","賣","賚","賽","賺","賻","贄","贅","贊","贇","贏","贍","贐","齎","贓","賍","贔","贖","赧","赭","赱","赳","趁","趙","跂","趾","趺","跏","跚","跖","跌","跛","跋","跪","跫","跟","跣","跼","踈","踉","跿","踝","踞","踐","踟","蹂","踵","踰","踴","蹊","蹇","蹉","蹌","蹐","蹈","蹙","蹤","蹠","踪","蹣","蹕","蹶","蹲","蹼","躁","躇","躅","躄","躋","躊","躓","躑","躔","躙","躪","躡","躬","躰","軆","躱","躾","軅","軈","軋","軛","軣","軼","軻","軫","軾","輊","輅","輕","輒","輙","輓","輜","輟","輛","輌","輦","輳","輻","輹","轅","轂","輾","轌","轉","轆","轎","轗","轜","轢","轣","轤","辜","辟","辣","辭","辯","辷","迚","迥","迢","迪","迯","邇","迴","逅","迹","迺","逑","逕","逡","逍","逞","逖","逋","逧","逶","逵","逹","迸","遏","遐","遑","遒","逎","遉","逾","遖","遘","遞","遨","遯","遶","隨","遲","邂","遽","邁","邀","邊","邉","邏","邨","邯","邱","邵","郢","郤","扈","郛","鄂","鄒","鄙","鄲","鄰","酊","酖","酘","酣","酥","酩","酳","酲","醋","醉","醂","醢","醫","醯","醪","醵","醴","醺","釀","釁","釉","釋","釐","釖","釟","釡","釛","釼","釵","釶","鈞","釿","鈔","鈬","鈕","鈑","鉞","鉗","鉅","鉉","鉤","鉈","銕","鈿","鉋","鉐","銜","銖","銓","銛","鉚","鋏","銹","銷","鋩","錏","鋺","鍄","錮","錙","錢","錚","錣","錺","錵","錻","鍜","鍠","鍼","鍮","鍖","鎰","鎬","鎭","鎔","鎹","鏖","鏗","鏨","鏥","鏘","鏃","鏝","鏐","鏈","鏤","鐚","鐔","鐓","鐃","鐇","鐐","鐶","鐫","鐵","鐡","鐺","鑁","鑒","鑄","鑛","鑠","鑢","鑞","鑪","鈩","鑰","鑵","鑷","鑽","鑚","鑼","鑾","钁","鑿","閂","閇","閊","閔","閖","閘","閙","閠","閨","閧","閭","閼","閻","閹","閾","闊","濶","闃","闍","闌","闕","闔","闖","關","闡","闥","闢","阡","阨","阮","阯","陂","陌","陏","陋","陷","陜","陞","陝","陟","陦","陲","陬","隍","隘","隕","隗","險","隧","隱","隲","隰","隴","隶","隸","隹","雎","雋","雉","雍","襍","雜","霍","雕","雹","霄","霆","霈","霓","霎","霑","霏","霖","霙","霤","霪","霰","霹","霽","霾","靄","靆","靈","靂","靉","靜","靠","靤","靦","靨","勒","靫","靱","靹","鞅","靼","鞁","靺","鞆","鞋","鞏","鞐","鞜","鞨","鞦","鞣","鞳","鞴","韃","韆","韈","韋","韜","韭","齏","韲","竟","韶","韵","頏","頌","頸","頤","頡","頷","頽","顆","顏","顋","顫","顯","顰","顱","顴","顳","颪","颯","颱","颶","飄","飃","飆","飩","飫","餃","餉","餒","餔","餘","餡","餝","餞","餤","餠","餬","餮","餽","餾","饂","饉","饅","饐","饋","饑","饒","饌","饕","馗","馘","馥","馭","馮","馼","駟","駛","駝","駘","駑","駭","駮","駱","駲","駻","駸","騁","騏","騅","駢","騙","騫","騷","驅","驂","驀","驃","騾","驕","驍","驛","驗","驟","驢","驥","驤","驩","驫","驪","骭","骰","骼","髀","髏","髑","髓","體","髞","髟","髢","髣","髦","髯","髫","髮","髴","髱","髷","髻","鬆","鬘","鬚","鬟","鬢","鬣","鬥","鬧","鬨","鬩","鬪","鬮","鬯","鬲","魄","魃","魏","魍","魎","魑","魘","魴","鮓","鮃","鮑","鮖","鮗","鮟","鮠","鮨","鮴","鯀","鯊","鮹","鯆","鯏","鯑","鯒","鯣","鯢","鯤","鯔","鯡","鰺","鯲","鯱","鯰","鰕","鰔","鰉","鰓","鰌","鰆","鰈","鰒","鰊","鰄","鰮","鰛","鰥","鰤","鰡","鰰","鱇","鰲","鱆","鰾","鱚","鱠","鱧","鱶","鱸","鳧","鳬","鳰","鴉","鴈","鳫","鴃","鴆","鴪","鴦","鶯","鴣","鴟","鵄","鴕","鴒","鵁","鴿","鴾","鵆","鵈","鵝","鵞","鵤","鵑","鵐","鵙","鵲","鶉","鶇","鶫","鵯","鵺","鶚","鶤","鶩","鶲","鷄","鷁","鶻","鶸","鶺","鷆","鷏","鷂","鷙","鷓","鷸","鷦","鷭","鷯","鷽","鸚","鸛","鸞","鹵","鹹","鹽","麁","麈","麋","麌","麒","麕","麑","麝","麥","麩","麸","麪","麭","靡","黌","黎","黏","黐","黔","黜","點","黝","黠","黥","黨","黯","黴","黶","黷","黹","黻","黼","黽","鼇","鼈","皷","鼕","鼡","鼬","鼾","齊","齒","齔","齣","齟","齠","齡","齦","齧","齬","齪","齷","齲","齶","龕","龜","龠","堯","槇","遙","瑤","凜","熙","噓","巢","帔","帘","幘","幞","庾","廊","廋","廹","开","异","弇","弝","弣","弴","弶","弽","彀","彅","彔","彘","彤","彧","彽","徉","徜","徧","徯","徵","德","忉","忞","忡","忩","怍","怔","怘","怳","怵","恇","悔","悝","悞","惋","惔","惕","惝","惸","愜","愫","愰","愷","慨","憍","憎","憼","憹","懲","戢","戾","扃","扖","扚","扯","抅","拄","拖","拼","挊","挘","挹","捃","捥","捼","揥","揭","揵","搐","搔","搢","摹","摑","摠","摭","擎","撾","撿","㐂","𠅘","份","仿","侚","俉","傜","儞","冼","㔟","匇","卡","卬","詹","𠮷","呍","咖","咜","咩","唎","啊","噲","囤","圳","圴","塚","墀","姤","娣","婕","寬","﨑","㟢","庬","弴","彅","德","怗","恵","愰","昤","曈","曙","曺","曻","桒","鿄","椑","椻","橅","檑","櫛","𣏌","𣏾","𣗄","毱","泠","洮","海","涿","淊","淸","渚","潞","濹","灤","𤋮","𤋮","煇","燁","爀","玟","玨","珉","珖","琛","琡","琢","琦","琪","琬","琹","瑋","㻚","畵","疁","睲","䂓","磈","磠","祇","禮","鿆","䄃","鿅","秚","稞","筿","簱","䉤","綋","羡","脘","脺","舘","芮","葛","蓜","蓬","蕙","藎","蝕","蟬","蠋","裵","角","諶","跎","辻","迶","郝","鄧","鄭","醲","鈳","銈","錡","鍈","閒","雞","餃","饀","髙","鯖","鷗","麴","麵","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","⛌","⛍","❗","⛏","⛐","⛑","","⛒","⛕","⛓","⛔","","","","","","","","","⛖","⛗","⛘","⛙","⛚","⛛","⛜","⛝","⛞","⛟","⛠","⛡","⭕","㉈","㉉","㉊","㉋","㉌","㉍","㉎","㉏","","","","","⒑","⒒","⒓","","","","","","","","","","","","","","","","","⬛","⬤","","","","","","⚿","","","","","","","","","","","","㊙","","","","","","","","","","","","⛣","⭖","⭗","⭘","⭙","☓","㊋","〒","⛨","㉆","㉅","⛩","࿖","⛪","⛫","⛬","♨","⛭","⛮","⛯","⚓","✈","⛰","⛱","⛲","⛳","⛴","⛵","","Ⓓ","Ⓢ","⛶","","","","","","⛷","⛸","⛹","⛺","","☎","⛻","⛼","⛽","⛾","","⛿","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","➡","⬅","⬆","⬇","⬯","⬮","年","月","日","円","㎡","㎥","㎝","㎠","㎤","","⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","","","","","","","","","","","","","","","","","㈳","㈶","㈲","㈱","㈹","㉄","▶","◀","〖","〗","⟐","²","³","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","㉇","","","℻","","","","㈪","㈫","㈬","㈭","㈮","㈯","㈰","㈷","㍾","㍽","㍼","㍻","№","℡","〶","⚾","","","","","","","","","","","","","","","","","","","","","","","ℓ","㎏","㎐","㏊","㎞","㎢","㍱","","","½","↉","⅓","⅔","¼","¾","⅕","⅖","⅗","⅘","⅙","⅚","⅐","⅛","⅑","⅒","☀","☁","☂","⛄","☖","☗","⛉","⛊","♦","♥","♣","♠","⛋","⨀","‼","⁉","⛅","☔","⛆","☃","⛇","⚡","⛈","","⚞","⚟","♬","☎","","","","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ","Ⅹ","Ⅺ","Ⅻ","⑰","⑱","⑲","⑳","⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽","⑾","⑿","㉑","㉒","㉓","㉔","","","","","","","","","","","","","","","","","","","","","","","","","","","㉕","㉖","㉗","㉘","㉙","㉚","①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","❶","❷","❸","❹","❺","❻","❼","❽","❾","❿","⓫","⓬","㉛",""],c=["㐂","","份","仿","侚","俉","傜","儞","冼","㔟","匇","卡","卬","詹","","呍","咖","咜","咩","唎","啊","噲","囤","圳","圴","塚","墀","姤","娣","婕","寬","﨑","㟢","庬","弴","彅","德","怗","恵","愰","昤","曈","曙","曺","曻","桒","鿄","椑","椻","橅","檑","櫛","","","","毱","泠","洮","海","涿","淊","淸","渚","潞","濹","灤","𤋮","","煇","燁","爀","玟","玨","珉","珖","琛","琡","琢","琦","琪","琬","琹","瑋","㻚","畵","疁","睲","䂓","磈","磠","祇","禮","鿆","䄃","鿅","秚","稞","筿","簱","䉤","綋","羡","脘","脺","舘","芮","葛","蓜","蓬","蕙","藎","蝕","蟬","蠋","裵","角","諶","跎","辻","迶","郝","鄧","鄭","醲","鈳","銈","錡","鍈","閒","雞","餃","饀","髙","鯖","鷗","麴","麵","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","⛌","⛍","❗","⛏","⛐","⛑","","⛒","⛕","⛓","⛔","","","","","","","","","⛖","⛗","⛘","⛙","⛚","⛛","⛜","⛝","⛞","⛟","⛠","⛡","⭕","㉈","㉉","㉊","㉋","㉌","㉍","㉎","㉏","","","","","⒑","⒒","⒓","","","","","","","","","","","","","","","","","⬛","⬤","","","","","","⚿","","","","","","","","","","","","㊙","","","","","","","","","","","","⛣","⭖","⭗","⭘","⭙","☓","㊋","〒","⛨","㉆","㉅","⛩","࿖","⛪","⛫","⛬","♨","⛭","⛮","⛯","⚓","✈","⛰","⛱","⛲","⛳","⛴","⛵","","Ⓓ","Ⓢ","⛶","","","","","","⛷","⛸","⛹","⛺","","☎","⛻","⛼","⛽","⛾","","⛿","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","➡","⬅","⬆","⬇","⬯","⬮","年","月","日","円","㎡","㎥","㎝","㎠","㎤","","⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","","","","","","","","","","","","","","","","","㈳","㈶","㈲","㈱","㈹","㉄","▶","◀","〖","〗","⟐","²","³","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","㉇","","","℻","","","","㈪","㈫","㈬","㈭","㈮","㈯","㈰","㈷","㍾","㍽","㍼","㍻","№","℡","〶","⚾","","","","","","","","","","","","","","","","","","","","","","","ℓ","㎏","㎐","㏊","㎞","㎢","㍱","","","½","↉","⅓","⅔","¼","¾","⅕","⅖","⅗","⅘","⅙","⅚","⅐","⅛","⅑","⅒","☀","☁","☂","⛄","☖","☗","⛉","⛊","♦","♥","♣","♠","⛋","⨀","‼","⁉","⛅","☔","⛆","☃","⛇","⚡","⛈","","⚞","⚟","♬","☎","","","","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ","Ⅹ","Ⅺ","Ⅻ","⑰","⑱","⑲","⑳","⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽","⑾","⑿","㉑","㉒","㉓","㉔","","","","","","","","","","","","","","","","","","","","","","","","","","","㉕","㉖","㉗","㉘","㉙","㉚","①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","❶","❷","❸","❹","❺","❻","❼","❽","❾","❿","⓫","⓬","㉛",""],u=["㐂","𠅘","份","仿","侚","俉","傜","儞","冼","㔟","匇","卡","卬","詹","𠮷","呍","咖","咜","咩","唎","啊","噲","囤","圳","圴","塚","墀","姤","娣","婕","寬","﨑","㟢","庬","弴","彅","德","怗","恵","愰","昤","曈","曙","曺","曻","桒","鿄","椑","椻","橅","檑","櫛","𣏌","𣏾","𣗄","毱","泠","洮","海","涿","淊","淸","渚","潞","濹","灤","𤋮","𤋮","煇","燁","爀","玟","玨","珉","珖","琛","琡","琢","琦","琪","琬","琹","瑋","㻚","畵","疁","睲","䂓","磈","磠","祇","禮","鿆","䄃","鿅","秚","稞","筿","簱","䉤","綋","羡","脘","脺","舘","芮","葛","蓜","蓬","蕙","藎","蝕","蟬","蠋","裵","角","諶","跎","辻","迶","郝","鄧","鄭","醲","鈳","銈","錡","鍈","閒","雞","餃","饀","髙","鯖","鷗","麴","麵","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","⛌","⛍","❗","⛏","⛐","⛑","","⛒","⛕","⛓","⛔","","","","","🅿","🆊","","","⛖","⛗","⛘","⛙","⛚","⛛","⛜","⛝","⛞","⛟","⛠","⛡","⭕","㉈","㉉","㉊","㉋","㉌","㉍","㉎","㉏","","","","","⒑","⒒","⒓","🅊","🅌","🄿","🅆","🅋","🈐","🈑","🈒","🈓","🅂","🈔","🈕","🈖","🅍","🄱","🄽","⬛","⬤","🈗","🈘","🈙","🈚","🈛","⚿","🈜","🈝","🈞","🈟","🈠","🈡","🈢","🈣","🈤","🈥","🅎","㊙","🈀","","","","","","","","","","","⛣","⭖","⭗","⭘","⭙","☓","㊋","〒","⛨","㉆","㉅","⛩","࿖","⛪","⛫","⛬","♨","⛭","⛮","⛯","⚓","✈","⛰","⛱","⛲","⛳","⛴","⛵","🅗","Ⓓ","Ⓢ","⛶","🅟","🆋","🆍","🆌","🅹","⛷","⛸","⛹","⛺","🅻","☎","⛻","⛼","⛽","⛾","🅼","⛿","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","➡","⬅","⬆","⬇","⬯","⬮","年","月","日","円","㎡","㎥","㎝","㎠","㎤","🄀","⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","","","","","","","🄁","🄂","🄃","🄄","🄅","🄆","🄇","🄈","🄉","🄊","㈳","㈶","㈲","㈱","㈹","㉄","▶","◀","〖","〗","⟐","²","³","🄭","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","🄬","🄫","㉇","🆐","🈦","℻","","","","㈪","㈫","㈬","㈭","㈮","㈯","㈰","㈷","㍾","㍽","㍼","㍻","№","℡","〶","⚾","🉀","🉁","🉂","🉃","🉄","🉅","🉆","🉇","🉈","🄪","🈧","🈨","🈩","🈔","🈪","🈫","🈬","🈭","🈮","🈯","🈰","🈱","ℓ","㎏","㎐","㏊","㎞","㎢","㍱","","","½","↉","⅓","⅔","¼","¾","⅕","⅖","⅗","⅘","⅙","⅚","⅐","⅛","⅑","⅒","☀","☁","☂","⛄","☖","☗","⛉","⛊","♦","♥","♣","♠","⛋","⨀","‼","⁉","⛅","☔","⛆","☃","⛇","⚡","⛈","","⚞","⚟","♬","☎","","","","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ","Ⅹ","Ⅺ","Ⅻ","⑰","⑱","⑲","⑳","⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽","⑾","⑿","㉑","㉒","㉓","㉔","🄐","🄑","🄒","🄓","🄔","🄕","🄖","🄗","🄘","🄙","🄚","🄛","🄜","🄝","🄞","🄟","🄠","🄡","🄢","🄣","🄤","🄥","🄦","🄧","🄨","🄩","㉕","㉖","㉗","㉘","㉙","㉚","①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","❶","❷","❸","❹","❺","❻","❼","❽","❾","❿","⓫","⓬","㉛",""],d=["!",""","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","¥","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~"],h=["ぁ","あ","ぃ","い","ぅ","う","ぇ","え","ぉ","お","か","が","き","ぎ","く","ぐ","け","げ","こ","ご","さ","ざ","し","じ","す","ず","せ","ぜ","そ","ぞ","た","だ","ち","ぢ","っ","つ","づ","て","で","と","ど","な","に","ぬ","ね","の","は","ば","ぱ","ひ","び","ぴ","ふ","ぶ","ぷ","へ","べ","ぺ","ほ","ぼ","ぽ","ま","み","む","め","も","ゃ","や","ゅ","ゆ","ょ","よ","ら","り","る","れ","ろ","ゎ","わ","ゐ","ゑ","を","ん","","","","ゝ","ゞ","ー","。","「","」","、","・"],p=["ァ","ア","ィ","イ","ゥ","ウ","ェ","エ","ォ","オ","カ","ガ","キ","ギ","ク","グ","ケ","ゲ","コ","ゴ","サ","ザ","シ","ジ","ス","ズ","セ","ゼ","ソ","ゾ","タ","ダ","チ","ヂ","ッ","ツ","ヅ","テ","デ","ト","ド","ナ","ニ","ヌ","ネ","ノ","ハ","バ","パ","ヒ","ビ","ピ","フ","ブ","プ","ヘ","ベ","ペ","ホ","ボ","ポ","マ","ミ","ム","メ","モ","ャ","ヤ","ュ","ユ","ョ","ヨ","ラ","リ","ル","レ","ロ","ヮ","ワ","ヰ","ヱ","ヲ","ン","ヴ","ヵ","ヶ","ヽ","ヾ","ー","。","「","」","、","・"],f=new Map([["022b6f43e2a414fd68f172da202bac9a","⚞"],["94fb7be756372db6b62e3e0a119083d5","⚞"],["12aecdea283e4d07f88b9f2b740e4f86","⚟"],["1a563501affbf7f5baec350a108d5505","⚟"],["556971570f40044fa4520df3289a1cf2","⚟"],["65b042886a563a771aa389b12af7bca7","⚟"],["bbda644d17efd3c020635ee3d90968a5","⦅"],["5063561406195ca45f5992e3f7ad77d2","⦅"],["9d15c0395a4738936af34308acf2d032","⦅"],["2a063edc4770b3403f060b38166a0d4d","⦅"],["54479aa90145b4713134b78d4fb98aa5","⦅"],["12a2c7156da32fc972b5a451bb87b813","⦅"],["c8d428ead557285b0b7088388b22519c","⦅"],["7160f7419cba7acdacd23cbeb4834dbe","⦅"],["3c49616fb9bf0b9052b30e118f8857ea","⦅"],["71c94bb6d963e47443eac448a09d22ce","⦅"],["7ec2179107ba4c58abb6ef92e7781365","⦅"],["2eb49bd25d7eeada006afc0864350da4","⦅"],["a341ee7fe8a368c9737a3341f016ac70","⦅"],["f47048d669ac8d84eeb62477e8420f89","⦅"],["38566b372f4c5a1aead4efa20decd079","⦆"],["d84fc83615b75802ed422eda4ba39465","⦆"],["5bb8b7731d9473ebd7c842334dfa24f2","⦆"],["9ffa7e00cfc7e807a161ada460b8060c","⦆"],["a58dc0e1271b03a5981b57a83271afa7","⦆"],["e67210b0da0161d36b79e8c9be6a9d0c","⦆"],["08de4be9569ebd6ac01709f552ae8a65","⦆"],["e214599903c94c532684bdf54b62df61","⦆"],["2a83209f8a7489081890c277397df425","⦆"],["0294d50cea5197c8c4646d2cace3e78d","⦆"],["0b808509e4d89a2b9d02252ca85f2e34","⦆"],["2a74d4ad7292c858dc2bb559de67f2d9","⦆"],["8c810b8cbe6159e837a88575bb4e6033","⦆"],["dc66317cd6fff4f4221069a20f321fce","⦆"],["563e1633d226c10ef4ec80638997e4a9","『"],["0993d5cdf910f481eeefa19e4f09d77c","『"],["7b80a8345c16e2d4f8ff2691e245c2b1","『"],["016669fa94786f9581342d47f317c02c","『"],["01d3eb52ab29f0eecc62ff74224fffd4","『"],["089aa1d87915ef8ad3c43982ac657c8c","『"],["30e8cb69cda3ad84e87943c4351c24b7","『"],["385927959c2621acf57f8d40140924f8","『"],["2c256506f406bac4c214318f196ad5db","『"],["2d3912e10113e5c7bef33df3249af4a7","『"],["8b6444be18f269ac615643b26f9e3041","『"],["9c8c1ff659b439f73c65cf4766ab2f14","『"],["e4caa1628ad6878f14be986761e06aaa","『"],["e702912587801d73d58cdb30e48debed","』"],["d70bb2b097f44c1ddefb93bf92bbb5cd","』"],["f2b927267947a75b891403f95db72005","』"],["4ec38a1d8d22e4df6c359f00f7ad8662","』"],["55c9ea9aa8eb630e5ecb793b2f85c927","』"],["70376e1ea05a3438a19c062ad49a7960","』"],["8fe7cb78ca24d1973419eecf99252a88","』"],["9ee59c7d2c202e0214836a0138f59e24","』"],["b56aaf7fc68c5e206ccbc2ee1442b3af","』"],["ba37f6b56d8fc8980c8236de9894fa61","』"],["cc9fde9238a2bf78fd1c13f65b098e77","』"],["f02e3e84dcd71c5d3bab2b7b4b99bd7e","』"],["f686e0b742abe806fccbd4d9b3fcc4cd","』"],["37f6ecf37a0a3ef8dff083ccc8754f81","♬"],["3336f18e849144658f212bd9399bec5f","♬"],["93efdc18683d8ecacb0a920d5f2fffb3","♬"],["9b8325b71aa6a000d24f88c4d7ec730d","♬"],["ab791ef796e6b5d66f13ed9aea3e8ab2","♬"],["6eb29f1917caea1cadf94f5496a4c374","↱"],["583134b86e7d90960f64c5b863196978","➡"],["4ba716a88c003ca0a069392be3b63951","➡"],["4e0fbe47e3ba0fd5949bda53f11b16a5","➡"],["61ec226a927ee80fffa12db219a43233","➡"],["8e5b873ac8e1bf84246b281b3548c2ff","↴"],["a78d9b65f46654601ce0145622164b47","↴"],["5d01e6804b9aaec0c276f77306888c54","↴"],["6168af1e81b6497fccb6b8d3226a8016","↴"],["4360c0b7364802b680f5a65fa415bdd6","↗"],["4dab788480bb9ac50d2454b58438e407","↗"],["bfb2d58ab8c469d2b8b5c42d81e4e3b7","↗"],["4c503a0873195bfe8d71c9d55669781b","→"],["caf36eff2cf3580cd66c5cd021ee4c09","→"],["f00be20caf0aaef3a6fbec90a0e71852","Ⅰ"],["e660e1e23a6ddc9a5d2e0e1ef7ac5b86","Ⅱ"],["a62583f621fb5405add08e8f0beb6db4","Ⅱ"],["0e761ebb18b9870383725b3712f5c8d4","Ⅱ"],["1f65debfbf9df96de52c6f80922b012b","Ⅱ"],["5c13facf2da9f38922a9419061771ed0","Ⅱ"],["75a65cc3171c4c7ca0141042846ab91a","Ⅱ"],["eae94a6301787ff7bf77786ae4424601","Ⅱ"],["f1add7809e18e064e4609783211c9815","Ⅲ"],["a7ee6f7f63d348e2b8fb7ee9503f3c5c","♡"],["9c8cfb5e9349b06f0939605638896f4e","♥"],["45ce7d6d5c779136d32d3e60e13e10cd","⅕"],["51f5fe58aaf460263b766e990fdbe979","⅕"],["db40b0a65939e462396822d5ab3c6d9c","⅕"],["d9e3a48d5a7c6ba6f8db18f56cf91f92","⅛"],["86586bcdf8f14883f846849e93ca274c","⅜"],["9d81f46e134081d56bc92f69eebfabd9","⅒"],["18dddb04a4fe9b3f5c7b79e68fb8ab4b","⅒"],["eff8659a150859b7b69682a023b283c1","⅒"],["6e5ccf08b2bc815b0923df83cf9fafa1","㎠"],["8a77e56517a074d3d2ba426b84a07bf4","㎠"],["2c381a0eab014487d50f6f8bae8f0b71","㎢"],["9d1a36a1bec1cd2b0b0765f93c1e4f3c","㎢"],["e03eb00c54de790d8cc9997527fde905","㎢"],["3bce2a06a6a8557082543a6c90a42fe0","〽"],["4898c7d9fe3a8a6f9859b0e6f85a4327","〽"],["98ab18764756c8ca7608e17f562b21ce","〽"],["3037aad230d8cdae3df6e0ebedc0db79","⁉"],["66e3474e6cbd8e817ba0a1f8920bf4e7","⁉"],["4360dd96063ce1a9660cc8437e8238e3","⁈"],["6ce68b7e389c5169309ee956ed0c98a8","⁈"],["737a19289d25d963e255f3692ded6536","⁈"],["14b18199bbc3f4bf65b72e316bc41d3c","!"],["6bf58c146b692aeb403ed1f7618a060a","!"],["7f12b67caaf7c8c5075b444bb2a16c70","!"],["bfd55f4031ad80cb7401d65937b1d5d9","〜"],["4a61f6f7da9e6c8e373f4112cbd453cf","〜"],["882ded8f0bb4cdfa4ce28a0b64056d2a","〜"],["7726ffbf3a6e953affe6353c24ffb085","〜"],["0e290ec6542b5d52c972775e3d7cfeaf","-"],["420f1d27972d7cc83929307fbbb6dd50","-"],["4aa0e459273a2fe3012d7b3d2e14e07e","-"],["030b487ae68da1f4da98046f4fed390f","一"],["21699fa18fd14735a312512dfea2bff4","一"],["559fc240f4efe5a1e64714ce09217a3e","一"],["b7352c3f33a77bc9d3fbf693efbb8095","一"],["fcdb30a244fb6aad5255ee2d32fdf7fc","一"],["15a0a0fb33aacd4ce730a9503c46df5f","㊙"],["9dad4982bd65fbf21525261a7efdf669","㊙"],["c3e68e6d08d5429e28ffd6592acf4519","ゔ"],["f022cfe594d6f6930d7a5b994e1a0b71","凜"],["407057c7b7b1a91d058d572d9a9d3aa5","凜"],["fc85b0622183795f89111219dfbc6281","凜"],["9707099e5828d97eb12ff2e6ba438558","凜"],["987c829b62eb31f467165827766c410d","凜"],["58371bb195aaa7a468c5c508351ac383","凜"],["32324012ed7274a15002b66ed1e464f8","蜻"],["0ffb731db8d4a6b711f97bbb08ed8819","蜻"],["d90aae9a752e9b61662a9cafa837961f","祓"],["23d6c6f231ac5d51f4cdaaaa26701956","祓"],["81cbedabd8f88d4494255b0631820dfd","祓"],["4185f93a5571e49433ca9c13ae588f96","魎"],["9ab74d6e8bda8723614017a7fce587fe","魎"],["e96a39a050b694e5f8aadb111420b698","𠮷"],["08c5eb5fac4f1d362b946689eb2e4edf","𠮷"],["2cef7e443c22f5835658e67749ae52d1","𠮷"],["4ab0dd1578c8c5fa25f45938ff0f8575","𠮷"],["4c392bb90a1f62796f8fba2c19b4a7de","𠮷"],["43856fd7c04a779e571fe24c47f02a6c","髙"],["265efc2a174c73ea229f9ffefa703f32","髙"],["5a7af09cce6b3005355e1c6c82df8858","髙"],["808e9b858294184933f8bf45d6291572","髙"],["27f0c69a76bf571d6dc25db389d20779","髙"],["46fb250f60436fd5f33808343893ca12","髙"],["8a8c4c67a6094d4dc6039e5fe931159c","髙"],["9257f3792fcfcd21b85524d5f86f624e","髙"],["d502a276d6f311449597ee9e576d9217","髙"],["eaa49075e50fbe1fa4b7f593dfd95620","髙"],["c01d2bafce469da1abbb612fdb16c1e3","元"],["e1ce03321fdb4eaca026a49a43e521a5","元"],["0cfa6c95283a90eff3733db1ac80f58a","元"],["52c1ad5b834821dc6b85ec27bdea1f76","元"],["ad088cffd260c1fccb655cae17b14803","元"],["a9ee52eaa5b4cc32d1891d540bfe93cc","塚"],["a00182f1de36aaee28cac80a3c89d067","塚"],["b03d44ca831a0c995116056ce23f82c5","塚"],["2d6b7d3b5ca6c02d94c5b48661045b7a","﨑"],["f5c6e02e235abd23a87f48ed6a64cdcc","﨑"],["e9a3b055bda7b9ae70bde4003a4c5885","﨑"],["cb17df533b4ebd698a038defeddecf8a","﨑"],["0ea39c05c35f96d5b5a48e9815974132","﨑"],["3f642f3778827e651c8b82a4e9f06fd3","﨑"],["447d8358f482a4e1d9495902ebe269b1","﨑"],["ca59a20f1e0ee55b74db34697f961385","﨑"],["d2eae5651260b39c4239bcf00c8a76c5","﨑"],["f55eb365a9ded45d1e620f83d9f9de26","﨑"],["2b385c2642704e44347f2f4db147c8fa","葛"],["5c3a8c3a891386a771ff8f00a239b4ba","葛"],["e8caa78518e2d690af54e2206c9538f8","彅"],["2e8659ae5e220240c5f8a97147d09df6","彅"],["7592e633260537c1dfa7e5af1000752a","彅"],["a57d3f7684c28d2a901fe6020145de32","彅"],["da3ab2d5da4d69c7d312c7d819e45856","彅"],["918e84ed41c2157aa5f5bbf9aa60514c","塡"],["b1e889986beb3a6518d8c2ea53547b7c","塡"],["d449ab392afa98c27eb817c40e2eb7ce","塡"],["e7158075f2976c353e4cf9247aae3abc","遁"],["f1a6fbb17f041cc15148163da34f541f","遁"],["a1779a3aaf215916fd0d8fbbb5bf5925","蟬"],["a3c09b57be535c0f5618d72f95884c50","蟬"],["4b9401a9f9a58c7d0f9c86120aa2dd23","鏢"],["fe00b640a48dd341573cafa94afeafa2","鏢"],["f4e1d8b42e3c49ea7c896049186d74bd","蟜"],["640130a634bd2a0f4347f933a8c5d6d6","蟜"],["62985aeebaec69314f03ff9d3080ada2","鷗"],["1bd027207977c585c5889a1e24cae94e","鷗"],["5c8022286d3bc941c12e9bbc475255dd","鷗"],["e4a837fe20dfa091e03afe4857e2482e","剝"],["bf2cccb40b985fe3af04281944beac1a","剝"],["d5451a035c4e516e5ccb9372cd533d81","剝"],["e13ae32f28d840df74a88432df9b122e","剝"],["41637d181cd99088e2120a4ec6fc18aa","嬴"],["de63abb1aaa44e6ab8a11470103377d5","嬴"],["3d32b12254e01c701c195412cb8ef37c","嬴"],["f67bc6318ccf43e7902df9a6f9622932","嬴"],["d4ce6847d78fc2f8241088b5c0be795c","嬴"],["c472e6ade04610e67904aca1b1fa1468","麃"],["db3d060943fbf888eb2fa7fd87340cba","麃"],["509cff0edcba46d5db30b2f2f45c49c9","瘣"],["4862270872e35184aab420c4d38169ad","瘣"],["def4d364d00d0f78577987eaebd42aef","齕"],["3cc113a87b49ce231a7b2ffbca4c1e18","齕"],["03dddff25be65f7c284ef8addb8a0a8b","驁"],["52aa815a5a57aff03085d31acd5afbc4","驁"],["4f0431c4c63a6a362646758e62521df8","煖"],["dbf1ab17c746c48d474b3730064ba6f2","煖"],["790c6b4da6a88f7f4fdb6fdab77fe045","煖"],["4d7ae77f2bbf9c8af03d49d466f74058","煖"],["0335ba124be8a9e0c501f4051ac5fcf5","龐"],["01d7892b430fd4362c8917ad921199b2","龐"],["e866fd7e605c8b7c8bf718c45a5438cf","龐"],["5df7d88e1e15018b3bce73e765ef72d6","槌"],["48478e1f69ea50c6f7709d47f15b4007","槌"],["4d7d276f23c92f94056b292e295ebd78","神"],["87d2b97034cf680cd86bc7fe7c500d93","神"],["f6300abbfcd6bd0db3abd41041499aaa","邂"],["26c476496eb73e15285527ab7c635f0b","邂"],["be33b9008a58bab485e17de9b2ab2626","逅"],["3a9b8b576fe8efca2dedc957732afa37","逅"],["b798637262a0c1a29c8de602d4b688c6","逅"],["a3785fd94f13646623554b180d08ac77","德"],["1f81885b0996be70410e5aa3e4aab3c6","德"],["88425dfcbd96fcb6d77ebb76f834d986","德"],["9f993f913cd0614a3a965d74e0f4c8d1","德"],["a8bb5f2f83d975edfc951a1e461befdc","德"],["cd2eadbb87d0aadf1d1cd71fed0ab02f","德"],["d22feeb00ace0a632e1a780682f937e8","德"],["c9f2fda15b722253c625aebe73f4b1d9","辻"],["04556b37bff1ccc2f3b395232e104934","辻"],["117bacaeb67e3508d23a650b98f3c143","辻"],["211d70374c1787c4bc62df15794a4692","辻"],["7ba50856c59d1de19cc9c88caaced915","辻"],["0d627ebf7693b13645336a88813fb7e3","祀"],["2c3c032660b20a485575c2d8c7d47956","祀"],["1aaec04e53f2978bdf0a127c01b34e9a","遼"],["e2c3bf09b755b0d59a8a25cba6dda273","遼"],["fb13879ba2f93a8b0a28b2cd5358d1ee","遼"],["20eff1fff8d986496b949efa604ec402","誾"],["8742940fcbdbd65aeff1566c1889ece7","誾"],["23e6ef0ecc7bbe8e9465b0b40e901c0d","厓"],["5a69785acb47d746fd1ae98bd511db81","厓"],["392b8afa18046fc06398b32a42641889","你"],["7ff2c821d31ef0ca7e9c430f3e659d46","你"],["44d8b7aacbfc1fc4c32d6526ab8012ee","祠"],["c9486b883ab870fc02e7a1f189454f49","祠"],["62e7447a02f797cf287a7a758d66563b","擲"],["7d767d2518431dd61e631941dea6bb5e","擲"],["914fa35485d5016adc8b799b0cb5e978","口"],["d50802fc331261feed1a140f3b70c4b3","口"],["eeff4833bdfc34b1cbfe6a9d98f38cb5","口"],["a6d6aaeaf5505676111390a52fa6be51","暲"],["bc534a1accc68d8876e9d47ad8d4b489","暲"],["b5e8cb114ccad281bcb4d86768d509df","銈"],["d2c0ab0242ae4ad8a08bffa71613a1a7","銈"],["f09031463933b2892be7ebbc501269d0","蕙"],["f1378529fe66a7f655031d7f5b8c4eb5","蕙"],["6b696a5ae7634c454aaa7dd833fdfaf9","眷"],["5012d099f110e5e7c0df78528686ae07","榮"],["bf27e95238dd789b05e38d56dc41cbf7","嵓"],["1d2eafa6be36dc6152cb1917cd2ac486","氏"],["8b1bd5636f709dfd6a95da9f463729c3","柀"],["0b49a77f459cf3783c5bac37a80518c5","份"],["8d1ba0e24b619cb4d377ddb7adb3e6fa","喼"],["dab4c329f3c540192f758a2e0008d275","鎚"],["5b6c90ad3012bfbbc2450b5ab930484d","翟"],["7eb78d5654f8335d0b1cf4cf78872097","鄭"],["c3852ea003683f2866abd56140fb5d84","錆"],["a78b8a79d8a32c925776c82955d168cc","郭"],["b6e773b060fdd575bc965369d509f4e0","煉"],["6d981a3b846347e2b3c9ca4d13794834","桒"],["d0ed8ffbc229f84dd796cdd6de36d2e4","䃯"],["d9aff359058ab474d552ce52e5a71ec8","卿"],["5417381484172c1607d7ca60765b62d2","蝕"],["b309cd2c649ce3ef6ea0ad2f5fc655cc","這"],["2a349ac3d6b94a8a64d904083fdd5c02","辿"],["0632283bfd909ef205b1f950e2b00f16","靑"],["d91c5a40619510b21610f523f9434269","淸"],["8dc47c6e65beb788da7ed9efd59f0934","買"],["e28d4c57d97fbe4a0d67aec2cc92e7c8","捥"],["9374173a2e4b7f1dcac75eccd5ee7e7f","榊"]]),m=(n(189),new Set(["⛌","⛍","❗","⛏","⛐","⛑","⛒","⛕","⛓","⛔","","","⛖","⛗","⛘","⛙","⛚","⛛","⛜","⛝","⛞","⛟","⛠","⛡","⭕","㉈","㉉","㉊","㉋","㉌","㉍","㉎","㉏","⒑","⒒","⒓","","","","","","","","","","","","","","","","","⬛","⬤","","","","","","⚿","","","","","","","","","","","","㊙","","⛣","⭖","⭗","⭘","⭙","☓","㊋","〒","⛨","㉆","㉅","⛩","࿖","⛪","⛫","⛬","♨","⛭","⛮","⛯","⚓","✈","⛰","⛱","⛲","⛳","⛴","⛵","","Ⓓ","Ⓢ","⛶","","","","","","⛷","⛸","⛹","⛺","","☎","⛻","⛼","⛽","⛾","","⛿","➡","⬅","⬆","⬇","⬯","⬮","","","","","㎡","㎥","㎝","㎠","㎤","","⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","","","","","","","","","","","","","","","","","㈳","㈶","㈲","㈱","㈹","㉄","▶","◀","〖","〗","⟐","²","³","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","㉇","","","℻","㈪","㈫","㈬","㈭","㈮","㈯","㈰","㈷","㍾","㍽","㍼","㍻","№","℡","〶","⚾","","","","","","","","","","","","","","","","","","","","","","","ℓ","㎏","㎐","㏊","㎞","㎢","㍱","½","↉","⅓","⅔","¼","¾","⅕","⅖","⅗","⅘","⅙","⅚","⅐","⅛","⅑","⅒","☀","☁","☂","⛄","☖","☗","⛉","⛊","♦","♥","♣","♠","⛋","⨀","‼","⁉","⛅","☔","⛆","☃","⛇","⚡","⛈","⚞","⚟","♬","","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ","Ⅹ","Ⅺ","Ⅻ","⑰","⑱","⑲","⑳","⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽","⑾","⑿","㉑","㉒","㉓","㉔","","","","","","","","","","","","","","","","","","","","","","","","","","","㉕","㉖","㉗","㉘","㉙","㉚","①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","❶","❷","❸","❹","❺","❻","❼","❽","❾","❿","⓫","⓬","㉛","☎","⛌","⛍","❗","⛏","⛐","⛑","⛒","⛕","⛓","⛔","🅿","🆊","⛖","⛗","⛘","⛙","⛚","⛛","⛜","⛝","⛞","⛟","⛠","⛡","⭕","㉈","㉉","㉊","㉋","㉌","㉍","㉎","㉏","⒑","⒒","⒓","🅊","🅌","🄿","🅆","🅋","🈐","🈑","🈒","🈓","🅂","🈔","🈕","🈖","🅍","🄱","🄽","⬛","⬤","🈗","🈘","🈙","🈚","🈛","⚿","🈜","🈝","🈞","🈟","🈠","🈡","🈢","🈣","🈤","🈥","🅎","㊙","🈀","⛣","⭖","⭗","⭘","⭙","☓","㊋","⛨","㉆","㉅","⛩","࿖","⛪","⛫","⛬","⛭","⛮","⛯","⚓","✈","⛰","⛱","⛲","⛳","⛴","⛵","🅗","Ⓓ","Ⓢ","⛶","🅟","🆋","🆍","🆌","🅹","⛷","⛸","⛹","⛺","🅻","⛻","⛼","⛽","⛾","🅼","⛿","➡","⬅","⬆","⬇","⬯","⬮","㎥","㎠","㎤","🄀","⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","🄁","🄂","🄃","🄄","🄅","🄆","🄇","🄈","🄉","🄊","㈳","㈶","㉄","⟐","🄭","🄬","🄫","㉇","🆐","🈦","℻","㈪","㈫","㈬","㈭","㈮","㈯","㈰","㈷","〶","⚾","🉀","🉁","🉂","🉃","🉄","🉅","🉆","🉇","🉈","🄪","🈧","🈨","🈩","🈔","🈪","🈫","🈬","🈭","🈮","🈯","🈰","🈱","㎐","㏊","㎢","㍱","↉","⅖","⅗","⅘","⅙","⅚","⅐","⅛","⅑","⅒","⛄","⛉","⛊","⛋","⨀","⛅","☔","⛆","⛇","⚡","⛈","⚞","⚟","⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽","⑾","⑿","🄐","🄑","🄒","🄓","🄔","🄕","🄖","🄗","🄘","🄙","🄚","🄛","🄜","🄝","🄞","🄟","🄠","🄡","🄢","🄣","🄤","🄥","🄦","🄧","🄨","🄩"])),g=[0,4129,8258,12387,16516,20645,24774,28903,33032,37161,41290,45419,49548,53677,57806,61935,4657,528,12915,8786,21173,17044,29431,25302,37689,33560,45947,41818,54205,50076,62463,58334,9314,13379,1056,5121,25830,29895,17572,21637,42346,46411,34088,38153,58862,62927,50604,54669,13907,9842,5649,1584,30423,26358,22165,18100,46939,42874,38681,34616,63455,59390,55197,51132,18628,22757,26758,30887,2112,6241,10242,14371,51660,55789,59790,63919,35144,39273,43274,47403,23285,19156,31415,27286,6769,2640,14899,10770,56317,52188,64447,60318,39801,35672,47931,43802,27814,31879,19684,23749,11298,15363,3168,7233,60846,64911,52716,56781,44330,48395,36200,40265,32407,28342,24277,20212,15891,11826,7761,3696,65439,61374,57309,53244,48923,44858,40793,36728,37256,33193,45514,41451,53516,49453,61774,57711,4224,161,12482,8419,20484,16421,28742,24679,33721,37784,41979,46042,49981,54044,58239,62302,689,4752,8947,13010,16949,21012,25207,29270,46570,42443,38312,34185,62830,58703,54572,50445,13538,9411,5280,1153,29798,25671,21540,17413,42971,47098,34713,38840,59231,63358,50973,55100,9939,14066,1681,5808,26199,30326,17941,22068,55628,51565,63758,59695,39368,35305,47498,43435,22596,18533,30726,26663,6336,2273,14466,10403,52093,56156,60223,64286,35833,39896,43963,48026,19061,23124,27191,31254,2801,6864,10931,14994,64814,60687,56684,52557,48554,44427,40424,36297,31782,27655,23652,19525,15522,11395,7392,3265,61215,65342,53085,57212,44955,49082,36825,40952,28183,32310,20053,24180,11923,16050,3793,7920],v=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0;null==n&&(n=t.length);for(var i=0,r=e;r>8^t[r])]);return i},A=function(t,e,n,i,r,s,o,a){return 0|((l=e+t(n,i,r)+s+o|0)<<(c=a)|l>>>32-c)+n;var l,c},y=function(t,e,n){return t&e|~t&n},b=function(t,e,n){return t&n|e&~n},w=function(t,e,n){return t^e^n},x=function(t,e,n){return e^(t|~n)},S=function(t){var e=(15&t)>>0;return"".concat(((240&t)>>4).toString(16)).concat(e.toString(16))},C=function(t){var e=64*Math.floor((t.byteLength+8)/64+1),n=new Uint8Array(e);n.set(new Uint8Array(t),0);var i=new DataView(n.buffer);i.setUint8(t.byteLength,128),i.setUint32(e-8,8*t.byteLength%Math.pow(2,32),!0),i.setUint32(e-4,8*t.byteLength/Math.pow(2,32),!0);for(var r=1732584193,s=-271733879,o=-1732584194,a=271733878,l=0;l>>0),p+=S((65280&r)>>>8),p+=S((16711680&r)>>>16),p+=S((4278190080&r)>>>24),p+=S((255&s)>>>0),p+=S((65280&s)>>>8),p+=S((16711680&s)>>>16),p+=S((4278190080&s)>>>24),p+=S((255&o)>>>0),p+=S((65280&o)>>>8),p+=S((16711680&o)>>>16),p+=S((4278190080&o)>>>24),p+=S((255&a)>>>0),p+=S((65280&a)>>>8),(p+=S((16711680&a)>>>16))+S((4278190080&a)>>>24)};function E(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var n=[],i=!0,r=!1,s=void 0;try{for(var o,a=t[Symbol.iterator]();!(i=(o=a.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){r=!0,s=t}finally{try{i||null==a.return||a.return()}finally{if(r)throw s}}return n}}(t,e)||function(t,e){if(t){if("string"==typeof t)return k(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function k(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n>2)!==s||(v(t,o),0))}},{key:"getRGBAColorCode",value:function(t){if(null==t)return null;var e=document.createElement("canvas");e.width=e.height=1;var n=e.getContext("2d");if(!n)return null;n.fillStyle=t,n.fillRect(0,0,e.width,e.height);var i=E(n.getImageData(0,0,1,1).data,4),r=i[0],s=i[1],o=i[2],a=i[3],l="#".concat(r.toString(16).toUpperCase().padStart(2,"0")).concat(s.toString(16).toUpperCase().padStart(2,"0")).concat(o.toString(16).toUpperCase().padStart(2,"0")).concat(a.toString(16).toUpperCase().padStart(2,"0"));return e.width=e.height=0,l}},{key:"fillAlphaColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16);return"#".concat(e.toString(16).toUpperCase().padStart(2,"0")).concat(n.toString(16).toUpperCase().padStart(2,"0")).concat(i.toString(16).toUpperCase().padStart(2,"0"),"FF")}},{key:"getRGBAfromColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16),r=Number.parseInt(t.substring(7,9),16);return"rgba(".concat(e,", ").concat(n,", ").concat(i,", ").concat(r/255,")")}}],(n=[{key:"initialize",value:function(){this.render_canvas=null,this.option_canvas=null,this.render_text="",this.GL=0,this.GR=2,this.G_BACK=[i.get(0),i.get(1),i.get(2),s.get(31)],this.DRCS_mapping=new Map([[15,new Map],[16,new Map],[17,new Map],[18,new Map],[19,new Map],[20,new Map],[21,new Map],[22,new Map],[23,new Map],[24,new Map],[25,new Map],[26,new Map],[27,new Map],[28,new Map],[29,new Map],[30,new Map]]),this.purpose_width=1920,this.purpose_height=1080,this.swf_x=1920,this.swf_y=1080,this.sdf_x=1920,this.sdf_y=1080,this.sdp_x=0,this.sdp_y=0,this.ssm_x=72,this.ssm_y=72,this.shs=8,this.svs=48,this.text_size_x=1,this.text_size_y=1,this.position_x=-1,this.position_y=-1,this.pallet=0,this.fg_color=a[this.pallet][7],this.bg_color=a[this.pallet][8],this.force_bg_color=null,this.hlc=0,this.stl=!1,this.orn=null,this.force_orn=null,this.timeElapsed=0,this.endTime=null,this.rendered=!1,this.PRA=null,this.normalFont="sans-serif",this.gaijiFont=this.normalFont,this.drcsReplacement=!1,this.drcsReplaceMapping=new Map,this.useStroke=!1,this.usePUA=!1}},{key:"width",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:"height",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:"width_magnification",value:function(){return Math.ceil(this.purpose_width/this.swf_x)}},{key:"height_magnification",value:function(){return Math.ceil(this.purpose_height/this.swf_y)}},{key:"canvas_width",value:function(){return this.swf_x*this.width_magnification()}},{key:"canvas_height",value:function(){return this.swf_y*this.height_magnification()}},{key:"move_absolute_dot",value:function(t,e){this.position_x=t,this.position_y=e}},{key:"move_absolute_pos",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:"move_relative_pos",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:"move_newline",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:"render",value:function(e){var n,i,r,s,o,a,l,c,u,d,h,p,m,g,v;this.initialize(),this.option_canvas=null!==(n=null==e?void 0:e.canvas)&&void 0!==n?n:null,this.force_orn=null!==(i="boolean"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==i?i:null,this.force_bg_color=null!==(r=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==r?r:null,this.purpose_width=null!==(s=null!==(o=null==e?void 0:e.width)&&void 0!==o?o:null==e||null===(a=e.canvas)||void 0===a?void 0:a.width)&&void 0!==s?s:this.purpose_width,this.purpose_height=null!==(l=null!==(c=null==e?void 0:e.height)&&void 0!==c?c:null==e||null===(u=e.canvas)||void 0===u?void 0:u.height)&&void 0!==l?l:this.purpose_height,this.normalFont=null!==(d=null==e?void 0:e.normalFont)&&void 0!==d?d:"sans-serif",this.gaijiFont=null!==(h=null==e?void 0:e.gaijiFont)&&void 0!==h?h:this.normalFont,this.drcsReplacement=null!==(p=null==e?void 0:e.drcsReplacement)&&void 0!==p&&p,this.drcsReplaceMapping=new Map(f);for(var A,y=Object.entries(null!==(A=null==e?void 0:e.drcsReplaceMapping)&&void 0!==A?A:{}),b=0;b0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var h=63&this.pes[t+1];this.move_relative_pos(h,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var p=0,f=this.G_BACK[2];if(!f)return;for(var m=0;m=0||I<0)return;for(;O>8),v=127&i,A=null===(f=o.get(g))||void 0===f?void 0:f.alphabet;A&&(null===(m=this.DRCS_mapping.get(A))||void 0===m||m.set(v,p))}else{var y,b=32639&i;null===(y=this.DRCS_mapping.get(15))||void 0===y||y.set(b,p)}e+=4+h}}}}},{key:"renderCharacter",value:function(e,n){var r;if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.option_canvas){this.option_canvas&&!this.render_canvas&&(this.render_canvas=document.createElement("canvas"),this.render_canvas.width=this.canvas_width(),this.render_canvas.height=this.canvas_height());var o,a=null===(r=this.render_canvas)||void 0===r?void 0:r.getContext("2d");if(a)if(31!==n.alphabet&&(this.rendered=!0,a.fillStyle=t.getRGBAfromColorCode(null!==(o=this.force_bg_color)&&void 0!==o?o:this.bg_color),a.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),this.height()*this.height_magnification()),1&this.hlc&&(a.fillStyle=t.getRGBAfromColorCode(this.fg_color),a.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),2&this.hlc&&(a.fillStyle=t.getRGBAfromColorCode(this.fg_color),a.fillRect((this.position_x+this.width()-1)*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),4&this.hlc&&(a.fillStyle=t.getRGBAfromColorCode(this.fg_color),a.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification())),8&this.hlc&&(a.fillStyle=t.getRGBAfromColorCode(this.fg_color),a.fillRect(this.position_x*this.width_magnification(),(this.position_y-this.height())*this.height_magnification(),1*this.width_magnification(),this.height()*this.height_magnification())),this.stl&&(a.fillStyle=t.getRGBAfromColorCode(this.fg_color),a.fillRect(this.position_x*this.width_magnification(),(this.position_y-1)*this.height_magnification(),this.width()*this.width_magnification(),1*this.height_magnification()))),0===n.alphabet){var f=94*(((65280&e)>>8)-33)+(((255&e)>>0)-33),m=7896;if(f>L}M>0&&a.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*R)*this.width_magnification()+2*B,(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*P)*this.height_magnification()+2*O,2*this.width_magnification(),2*this.height_magnification())}}a.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var V=0;V>U}j>0&&a.fillRect((this.position_x-0+Math.floor(this.shs*this.text_size_x/2)+2*N)*this.width_magnification(),(this.position_y-this.height()+Math.floor(this.svs*this.text_size_y/2)+2*V)*this.height_magnification(),2*this.width_magnification(),2*this.height_magnification())}}this.move_relative_pos(1,0)}}}},{key:"renderFont",value:function(e){var n;if(.5===this.text_size_x&&.5===this.text_size_y&&(h.includes(e)||p.includes(e))||(this.render_text+=e),this.render_canvas)if(null!=I&&I.has(e)){var i=I.get(e),r=i.viewBox,s=i.path;this.renderPath(r,s)}else{var o=m.has(e);o&&(e+="︎");var a=null===(n=this.render_canvas)||void 0===n?void 0:n.getContext("2d");if(a){var l=(this.position_x+this.width()/2)*this.width_magnification(),c=(this.position_y-this.height()/2)*this.height_magnification();a.translate(l,c),a.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification());var u=this.getOrnColorCode();if(u&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)a.font="".concat(this.ssm_x,"px ").concat(o?this.gaijiFont:this.normalFont),a.strokeStyle=t.getRGBAfromColorCode(u),a.lineJoin="round",a.textBaseline="middle",a.textAlign="center",a.lineWidth=8,a.strokeText(e,0,0);else{a.setTransform(1,0,0,1,0,0),a.translate(l,c),a.scale(this.text_size_x,this.text_size_y*this.height_magnification()/this.width_magnification());for(var d=-4*this.width_magnification();d<=4*this.width_magnification();d++)for(var f=-4*this.width_magnification();f<=4*this.width_magnification();f++)a.font="".concat(this.ssm_x*this.width_magnification(),"px ").concat(o?this.gaijiFont:this.normalFont),a.fillStyle=t.getRGBAfromColorCode(u),a.textBaseline="middle",a.textAlign="center",a.fillText(e,0+f,0+d);a.setTransform(1,0,0,1,0,0),a.translate(l,c),a.scale(this.text_size_x*this.width_magnification(),this.text_size_y*this.height_magnification())}a.font="".concat(this.ssm_x,"px ").concat(o?this.gaijiFont:this.normalFont),a.fillStyle=t.getRGBAfromColorCode(this.fg_color),a.textBaseline="middle",a.textAlign="center",a.fillText(e,0,0),a.setTransform(1,0,0,1,0,0)}}}},{key:"renderPath",value:function(e,n){var i;if(this.render_canvas){var r=null===(i=this.render_canvas)||void 0===i?void 0:i.getContext("2d");if(r){var s=(this.position_x+this.shs/2)*this.width_magnification(),o=(this.position_y-this.height()+this.svs/2)*this.height_magnification();r.translate(s,o);var a=E(e,4),l=a[0],c=a[1],u=a[2]-l,d=a[3]-c;r.scale(this.ssm_y/u,this.ssm_y/d),r.translate(l,c);var h=this.getOrnColorCode();if(h&&(!this.force_orn||!0===this.force_orn||this.force_orn!==this.fg_color))if(this.useStroke)r.strokeStyle=t.getRGBAfromColorCode(h),r.lineJoin="round",r.lineWidth=4*Math.max(u/this.ssm_y,d/this.ssm_y)*2,r.stroke(new Path2D(n));else for(var p=-4*this.width_magnification();p<=4*this.width_magnification();p++)for(var f=-4*this.width_magnification();f<=4*this.width_magnification();f++)r.translate(f,p),r.fillStyle=t.getRGBAfromColorCode(h),r.fill(new Path2D(n)),r.translate(-f,-p);r.fillStyle=t.getRGBAfromColorCode(this.fg_color),r.fill(new Path2D(n)),r.setTransform(1,0,0,1,0,0)}}}},{key:"getOrnColorCode",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}])&&T(e.prototype,n),g&&T(e,g),t}();function O(t){return(O="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})(t)}function B(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);ne.length)break;if(73!==e[i+0]||68!==e[i+1]||51!==e[i+2])break;if((i+=6)+4>e.length)break;var s=W(e,i+0,i+4);i+=4;var o=r+3+2+1+4+s;if(o>e.length)break;for(var a=i;ae.length)break;var c=Z(e,a+0,a+4);if((a+=4)+4>e.length)break;var u=W(e,a+0,a+4);a+=6;var d=l+4+4+2+u;if(d>e.length)break;if("PRIV"===c){for(var h=a,p=d;0!==e[a]&&ae.length||51===e[i+0]&&68===e[i+1]&&73===e[i+2]&&(i+=10)}return n}},{key:"setInBandMetadataTextTrack",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener("cuechange",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode="hidden",this.id3Track.addEventListener("cuechange",this.onID3CueChangeHandler)}},{key:"pushID3v2Cue",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,n=t;if("15260DFFFF49443320FF49443320000F"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(n.data));if("com.apple.streaming"===this.id3Track.inBandMetadataTrackDispatchType){if("PRIV"===n.value.key)return this.pushID3v2PRIVData(e,n.value.info,new Uint8Array(n.value.data));if("TXXX"===n.value.key)return this.pushID3v2TXXXData(e,n.value.info,n.value.data)}else if("id3"===this.id3Track.label){if("PRIV"===n.value.key)return this.pushID3v2PRIVData(e,n.value.info,new Uint8Array(n.value.data));if("TXXX"===n.value.key)return this.pushID3v2TXXXData(e,n.value.info,n.value.data)}else if("Timed Metadata"===this.id3Track.label){if("PRIV"===n.frame.key)return this.pushID3v2PRIVData(e,n.frame.owner,new Uint8Array(n.frame.data));if("TXXX"===n.frame.key)return this.pushID3v2TXXXData(e,n.frame.description,n.frame.data)}return!1}},{key:"onID3CueChange",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:"addB24Cue",value:function(t,e,n){var i;if(!this.b24Track)return!1;if(!_.detect(n,this.rendererOption))return!1;var r=new(null!==(i=window.VTTCue)&&void 0!==i?i:window.TextTrackCue)(t,e,"");if(r.data=n,window.VTTCue)this.b24Track.addCue(r);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var o=[],a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.cues[a].startTime>=t&&(o.push(this.b24Track.cues[a]),this.b24Track.removeCue(this.b24Track.cues[a]));this.b24Track.addCue(r);for(var l=o.length-1;l>=0;l--)this.b24Track.addCue(o[l])}}return!0}},{key:"onB24CueChange",value:function(){if(this.media&&this.b24Track){if(this.viewCanvas){var t=this.viewCanvas.getContext("2d");t&&t.clearRect(0,0,this.viewCanvas.width,this.viewCanvas.height)}if(this.rawCanvas){var e=this.rawCanvas.getContext("2d");e&&e.clearRect(0,0,this.rawCanvas.width,this.rawCanvas.height)}if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var n=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(n.startTime<=this.media.currentTime&&this.media.currentTime<=n.endTime&&!this.isOnSeeking){var i=new _(n.data,n.startTime),r=!1;if(this.isShowing&&this.viewCanvas){var s,o,a,l,c,u,d,h,p=i.render(Q(Q({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(s=null===(o=this.rendererOption)||void 0===o?void 0:o.width)&&void 0!==s?s:this.viewCanvas.width,height:null!==(a=null===(l=this.rendererOption)||void 0===l?void 0:l.height)&&void 0!==a?a:this.viewCanvas.height}));null!=(null==p?void 0:p.PRA)&&(null===(d=this.rendererOption)||void 0===d||null===(h=d.PRACallback)||void 0===h||h.call(d,p.PRA)),r=null!==(c=null==p?void 0:p.rendered)&&void 0!==c&&c,this.textContent=null!==(u=null==p?void 0:p.textContent)&&void 0!==u?u:null}this.isShowing&&this.rawCanvas&&i.render(Q(Q({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0})),this.onB24CueChangeDrawed=r}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var f=this.b24Track.activeCues.length-2;f>=0;f--){var m=this.b24Track.activeCues[f];m.endTime=Math.min(m.endTime,n.startTime),m.startTime===m.endTime&&this.b24Track.removeCue(m)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:"onHighResTimeupdate",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:"onTimeupdate",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,n=new H(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),i=[n],r=0;rt;p--){var f=i[p];if(f!==n&&this.pushID3v2Cue(f))break}else for(var m=t;m0){var a=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(a.startTime<=this.media.currentTime&&this.media.currentTime<=a.endTime&&!this.isOnSeeking){var l,c,u,d,h=new _(a.data,a.startTime);this.isShowing&&this.viewCanvas&&h.render(Q(Q({},this.rendererOption),{},{canvas:this.viewCanvas,width:null!==(l=null===(c=this.rendererOption)||void 0===c?void 0:c.width)&&void 0!==l?l:this.viewCanvas.width,height:null!==(u=null===(d=this.rendererOption)||void 0===d?void 0:d.height)&&void 0!==u?u:this.viewCanvas.height})),this.isShowing&&this.rawCanvas&&h.render(Q(Q({},this.rendererOption),{},{canvas:this.rawCanvas,width:this.rawCanvas.width,height:this.rawCanvas.height,keepAspectRatio:!0}))}}}}}},{key:"onID3Addtrack",value:function(t){if(this.media){var e=t.track;"metadata"===e.kind&&("15260DFFFF49443320FF49443320000F"!==e.inBandMetadataTrackDispatchType&&"com.apple.streaming"!==e.inBandMetadataTrackDispatchType&&"id3"!==e.label||this.setInBandMetadataTextTrack(e))}}},{key:"setupTrack",value:function(){var t,e;if(this.media){if(null!==(t=this.rendererOption)&&void 0!==t&&t.useHighResTextTrack)this.b24Track=new z(this.media),this.b24Track.startPolling();else{for(var n="ARIB B24 Japanese (data_identifier=0x".concat(this.data_identifier.toString(16),", data_group_id=").concat(this.data_group_id,")"),i=0;i=0;o--)this.b24Track.removeCue(this.b24Track.cues[o]);null===(t=this.b24Track)||void 0===t||t.removeEventListener("cuechange",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener("cuechange",this.onID3CueChangeHandler),null===(n=this.media)||void 0===n||n.removeEventListener("seeking",this.onSeekingHandler),null===(i=this.media)||void 0===i||i.removeEventListener("seeked",this.onSeekedHandler),null===(r=this.media)||void 0===r||r.textTracks.removeEventListener("addtrack",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:"cleanupCanvas",value:function(){var t;window.removeEventListener("resize",this.onResizeHandler),null===(t=this.media)||void 0===t||t.removeEventListener("resize",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.viewCanvas&&this.subtitleElement&&this.subtitleElement.removeChild(this.viewCanvas),this.viewCanvas&&(this.viewCanvas.width=this.viewCanvas.height=0),this.rawCanvas&&(this.rawCanvas.width=this.rawCanvas.height=0),this.viewCanvas=this.rawCanvas=null}}])&&$(t.prototype,e),t}();function et(t,e,n){for(var i=-1,r=e;r>>1^3988292384:i>>>=1}return~i}function nt(t){return function(t){if(Array.isArray(t))return rt(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||it(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function it(t,e){if(t){if("string"==typeof t)return rt(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?rt(t,e):void 0}}function rt(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n>2)!==s||(v(t,o),0))}},{key:"getRGBAColorCode",value:function(t){if(null==t)return null;var e=document.createElement("canvas");e.width=e.height=1;var n=e.getContext("2d");if(!n)return null;n.fillStyle=t,n.fillRect(0,0,e.width,e.height);var i,r,s=(r=4,function(t){if(Array.isArray(t))return t}(i=n.getImageData(0,0,1,1).data)||function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var n=[],i=!0,r=!1,s=void 0;try{for(var o,a=t[Symbol.iterator]();!(i=(o=a.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){r=!0,s=t}finally{try{i||null==a.return||a.return()}finally{if(r)throw s}}return n}}(i,r)||it(i,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=s[0],a=s[1],l=s[2],c=s[3],u="#".concat(o.toString(16).toUpperCase().padStart(2,"0")).concat(a.toString(16).toUpperCase().padStart(2,"0")).concat(l.toString(16).toUpperCase().padStart(2,"0")).concat(c.toString(16).toUpperCase().padStart(2,"0"));return e.width=e.height=0,u}},{key:"fillAlphaColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16);return"#".concat(e.toString(16).toUpperCase().padStart(2,"0")).concat(n.toString(16).toUpperCase().padStart(2,"0")).concat(i.toString(16).toUpperCase().padStart(2,"0"),"FF")}},{key:"getRGBAfromColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16),r=Number.parseInt(t.substring(7,9),16);return"rgba(".concat(e,", ").concat(n,", ").concat(i,", ").concat(r/255,")")}},{key:"getRGBfromColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16);return"rgb(".concat(e,", ").concat(n,", ").concat(i,")")}},{key:"getAlphaFromColorCode",value:function(t){return null==t?Number.NaN:Number.parseInt(t.substring(7,9),16)}}],(n=[{key:"width",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:"height",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:"move_absolute_dot",value:function(t,e){this.position_x=t,this.position_y=e}},{key:"move_absolute_pos",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:"move_relative_pos",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:"move_newline",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:"render",value:function(e){var n,i,r,s,o,a,l,c;this.svg=null!==(n=null==e?void 0:e.svg)&&void 0!==n?n:null,this.force_orn=null!==(i="boolean"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==i?i:null,this.force_bg_color=null!==(r=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==r?r:null,this.normalFont=null!==(s=null==e?void 0:e.normalFont)&&void 0!==s?s:this.normalFont,this.gaijiFont=null!==(o=null==e?void 0:e.gaijiFont)&&void 0!==o?o:this.normalFont,this.drcsReplacement=null!==(a=null==e?void 0:e.drcsReplacement)&&void 0!==a&&a,this.drcsReplaceMapping=new Map(f);for(var u,d=Object.entries(null!==(u=null==e?void 0:e.drcsReplaceMapping)&&void 0!==u?u:{}),h=0;h0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var h=63&this.pes[t+1];this.move_relative_pos(h,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var p=0,f=this.G_BACK[2];if(!f)return;for(var m=0;m=0||_<0)return;for(;B<_;)P*=10,P+=15&this.pes[B],B++;if(5===P)this.swf_x=3840,this.swf_y=2160;else if(7===P)this.swf_x=1920,this.swf_y=1080;else{if(9!=P)return;this.swf_x=1440,this.swf_y=960}break}if(84===this.pes[I])break;if(86===this.pes[I]){for(var R=t+1,M=0,D=0;R>8),v=127&i,A=null===(f=o.get(g))||void 0===f?void 0:f.alphabet;A&&(null===(m=this.DRCS_mapping.get(A))||void 0===m||m.set(v,p))}else{var y,b=32639&i;null===(y=this.DRCS_mapping.get(15))||void 0===y||y.set(b,p)}e+=4+h}}}}},{key:"renderCharacter",value:function(e,n){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),null!==this.svg){if(31!==n.alphabet){this.rendered||this.svg.setAttribute("viewBox","0 0 ".concat(this.swf_x," ").concat(this.swf_y)),this.rendered=!0;var r=this.force_bg_color||this.bg_color,o=t.getAlphaFromColorCode(r);if(!this.groups.has(o)){var a=document.createElementNS("http://www.w3.org/2000/svg","g");a.setAttribute("opacity","".concat(o/255)),this.groups.set(o,a),this.svg.appendChild(a)}var f=this.groups.get(o),m=document.createElementNS("http://www.w3.org/2000/svg","rect");if(m.setAttribute("shape-rendering","crispEdges"),m.setAttribute("x","".concat(this.position_x)),m.setAttribute("y","".concat(this.position_y-this.height())),m.setAttribute("width","".concat(this.width()+1)),m.setAttribute("height","".concat(this.height()+1)),m.setAttribute("fill","".concat(t.getRGBfromColorCode(r))),f.appendChild(m),1&this.hlc){var g=document.createElementNS("http://www.w3.org/2000/svg","line");g.setAttribute("shape-rendering","crispEdges"),g.setAttribute("x1","".concat(this.position_x)),g.setAttribute("y1","".concat(this.position_y-1)),g.setAttribute("x2","".concat(this.position_x+this.width())),g.setAttribute("y2","".concat(this.position_y-1)),g.setAttribute("stroke","".concat(t.getRGBAfromColorCode(this.fg_color))),g.setAttribute("stroke-width","".concat(2)),this.svg.appendChild(g)}if(2&this.hlc){var v=document.createElementNS("http://www.w3.org/2000/svg","line");v.setAttribute("shape-rendering","crispEdges"),v.setAttribute("x1","".concat(this.position_x+this.width()-1)),v.setAttribute("y1","".concat(this.position_y-this.height())),v.setAttribute("x2","".concat(this.position_x+this.width()-1)),v.setAttribute("y2","".concat(this.position_y)),v.setAttribute("stroke","".concat(t.getRGBAfromColorCode(this.fg_color))),v.setAttribute("stroke-width","".concat(2)),this.svg.appendChild(v)}if(4&this.hlc){var A=document.createElementNS("http://www.w3.org/2000/svg","line");A.setAttribute("shape-rendering","crispEdges"),A.setAttribute("x1","".concat(this.position_x)),A.setAttribute("y1","".concat(this.position_y-this.height()+1)),A.setAttribute("x2","".concat(this.position_x+this.width())),A.setAttribute("y2","".concat(this.position_y-this.height()+1)),A.setAttribute("stroke","".concat(t.getRGBAfromColorCode(this.fg_color))),A.setAttribute("stroke-width","".concat(2)),this.svg.appendChild(A)}if(8&this.hlc){var y=document.createElementNS("http://www.w3.org/2000/svg","line");y.setAttribute("shape-rendering","crispEdges"),y.setAttribute("x1","".concat(this.position_x+1)),y.setAttribute("y1","".concat(this.position_y-this.height())),y.setAttribute("x2","".concat(this.position_x+1)),y.setAttribute("y2","".concat(this.position_y)),y.setAttribute("stroke","".concat(t.getRGBAfromColorCode(this.fg_color))),y.setAttribute("stroke-width","".concat(2)),this.svg.appendChild(y)}if(this.stl){var b=document.createElementNS("http://www.w3.org/2000/svg","line");b.setAttribute("shape-rendering","crispEdges"),b.setAttribute("x1","".concat(this.position_x)),b.setAttribute("y1","".concat(this.position_y-1)),b.setAttribute("x2","".concat(this.position_x+this.width())),b.setAttribute("y2","".concat(this.position_y-1)),b.setAttribute("stroke","".concat(t.getRGBAfromColorCode(this.fg_color))),b.setAttribute("stroke-width","".concat(2)),this.svg.appendChild(b)}}if(0===n.alphabet){var w=94*(((65280&e)>>8)-33)+(((255&e)>>0)-33),x=7896;if(w>W}G>0&&V.fillRect(2*(2+z+F),2*(2+U+j),2,2)}}V.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var J=0;J>K}Z>0&&V.fillRect(2*(2+Y),2*(2+J),2,2)}var Q=document.createElementNS("http://www.w3.org/2000/svg","image");if(Q.setAttribute("href",R.toDataURL()),Q.setAttribute("x","".concat(this.position_x+Math.floor(this.shs*this.text_size_x/2)-4)),Q.setAttribute("y","".concat(this.position_y+Math.floor(this.svs*this.text_size_y/2)-this.height()-4)),Q.setAttribute("width","".concat(R.width/2*2)),Q.setAttribute("height","".concat(R.height/2*2)),0===this.flc){var X=document.createElementNS("http://www.w3.org/2000/svg","animate");X.setAttribute("attributeName","opacity"),X.setAttribute("values","1;0"),X.setAttribute("dur","1s"),X.setAttribute("calcMode","discrete"),X.setAttribute("repeatCount","indefinite"),Q.appendChild(X)}else if(7===this.flc){var $=document.createElementNS("http://www.w3.org/2000/svg","animate");$.setAttribute("attributeName","opacity"),$.setAttribute("values","0;1"),$.setAttribute("dur","1s"),$.setAttribute("calcMode","discrete"),$.setAttribute("repeatCount","indefinite"),Q.appendChild($)}this.svg.appendChild(Q)}this.move_relative_pos(1,0)}}}},{key:"renderFont",value:function(e){var n,i;.5===this.text_size_x&&.5===this.text_size_y&&(h.includes(e)||p.includes(e))||(this.text+=e);var r=m.has(e),s=r?this.gaijiFont:this.normalFont;if(null!=ot&&null!==(n=ot)&&void 0!==n&&n.has(e)){var o=ot.get(e),a=o.viewBox,l=o.path;this.renderPath(a,l)}else{r&&(e+="︎");var c=document.createElementNS("http://www.w3.org/2000/svg","text");if(c.setAttribute("x","0"),c.setAttribute("y","0"),c.setAttribute("transform","scale(".concat(this.text_size_x," ").concat(this.text_size_y,") translate(").concat((this.position_x+this.width()/2)/this.text_size_x," ").concat((this.position_y-this.height()/2)/this.text_size_y,")")),c.setAttribute("transform-origin","0 0"),c.setAttribute("font-size","".concat(this.ssm_x)),c.setAttribute("font-family",s),c.setAttribute("dominant-baseline","central"),c.setAttribute("text-anchor","middle"),c.setAttribute("fill",t.getRGBAfromColorCode(this.fg_color)),c.setAttribute("paint-order","stroke"),c.setAttribute("stroke-linejoin","round"),c.setAttribute("stroke-width",this.getOrnColorCode()?"".concat(8):"0"),c.setAttribute("stroke",this.getOrnColorCode()?t.getRGBAfromColorCode(this.getOrnColorCode()):"transparent"),c.appendChild(document.createTextNode(e)),0===this.flc){var u=document.createElementNS("http://www.w3.org/2000/svg","animate");u.setAttribute("attributeName","opacity"),u.setAttribute("values","1;0"),u.setAttribute("dur","1s"),u.setAttribute("calcMode","discrete"),u.setAttribute("repeatCount","indefinite"),c.appendChild(u)}else if(7===this.flc){var d=document.createElementNS("http://www.w3.org/2000/svg","animate");d.setAttribute("attributeName","opacity"),d.setAttribute("values","0;1"),d.setAttribute("dur","1s"),d.setAttribute("calcMode","discrete"),d.setAttribute("repeatCount","indefinite"),c.appendChild(d)}null===(i=this.svg)||void 0===i||i.appendChild(c)}}},{key:"renderPath",value:function(e,n){var i;document.createElementNS("http://www.w3.org/2000/svg","svg").setAttribute("viewBox","".concat(e[0]," ").concat(e[1]," ").concat(e[2]," ").concat(e[3]));var r=this.ssm_x*this.text_size_x/(e[2]-e[0]),s=this.ssm_y*this.text_size_y/(e[3]-e[1]),o=this.shs*this.text_size_x/2,a=this.svs*this.text_size_y/2,l=document.createElementNS("http://www.w3.org/2000/svg","path");if(l.setAttribute("d",n),l.setAttribute("x","0"),l.setAttribute("y","0"),l.setAttribute("transform","scale(".concat(r," ").concat(s,") translate(").concat((this.position_x+o)/r," ").concat((this.position_y+a-this.height())/s,")")),l.setAttribute("transform-origin","0 0"),l.setAttribute("fill",t.getRGBAfromColorCode(this.fg_color)),l.setAttribute("paint-order","stroke"),l.setAttribute("stroke-linejoin","round"),l.setAttribute("stroke-width",this.getOrnColorCode()?"".concat(4/Math.min(r,s)):"0"),l.setAttribute("stroke",this.getOrnColorCode()?t.getRGBAfromColorCode(this.getOrnColorCode()):"transparent"),0===this.flc){var c=document.createElementNS("http://www.w3.org/2000/svg","animate");c.setAttribute("attributeName","opacity"),c.setAttribute("values","1;0"),c.setAttribute("dur","1s"),c.setAttribute("calcMode","discrete"),c.setAttribute("repeatCount","indefinite"),l.appendChild(c)}else if(7===this.flc){var u=document.createElementNS("http://www.w3.org/2000/svg","animate");u.setAttribute("attributeName","opacity"),u.setAttribute("values","0;1"),u.setAttribute("dur","1s"),u.setAttribute("calcMode","discrete"),u.setAttribute("repeatCount","indefinite"),l.appendChild(u)}null===(i=this.svg)||void 0===i||i.appendChild(l)}},{key:"parseBitmap",value:function(t,e){if(null!==this.svg){this.rendered||this.svg.setAttribute("viewBox","0 0 ".concat(this.swf_x," ").concat(this.swf_y)),this.rendered=!0;var n=this.pes[t]<<8|this.pes[t+1];t+=2;var i=this.pes[t]<<8|this.pes[t+1];t+=2;var r=this.pes[t];t+=1;var s=new Set(this.pes.subarray(t,t+r));if(!((t+=r)+33>e)){var o=this.pes.subarray(t,t+33),l=this.pes.subarray(t+33,e),c=new Uint8Array(o.byteLength+l.byteLength+396+140),u=new DataView(c.buffer);c.set(o,0),c.set(l,569);for(var d=0;d<8;d++)for(var h=0;h<16;h++)if(!s.has(16*d+h)){var p=a[d][h],f=Number.parseInt(p.substring(1,3),16),m=Number.parseInt(p.substring(3,5),16),g=Number.parseInt(p.substring(5,7),16),v=Number.parseInt(p.substring(7,9),16);c[41+3*(16*d+h)]=f,c[41+3*(16*d+h)+1]=m,c[41+3*(16*d+h)+2]=g,c[437+(16*d+h)]=v}u.setInt32(33,384,!1),c[37]="P".charCodeAt(0),c[38]="L".charCodeAt(0),c[39]="T".charCodeAt(0),c[40]="E".charCodeAt(0),u.setInt32(429,128,!1),c[433]="t".charCodeAt(0),c[434]="R".charCodeAt(0),c[435]="N".charCodeAt(0),c[436]="S".charCodeAt(0),u.setInt32(425,et(c,37,425),!1),u.setInt32(565,et(c,433,565),!1);var A=u.getInt32(16,!1),y=u.getInt32(20,!1),b=document.createElementNS("http://www.w3.org/2000/svg","svg");b.setAttribute("x","".concat(this.sdp_x)),b.setAttribute("y","".concat(this.sdp_y)),b.setAttribute("width","".concat(this.sdf_x)),b.setAttribute("height","".concat(this.sdf_y)),b.setAttribute("viewBox","0 0 ".concat(this.sdf_x," ").concat(this.sdf_y));var w=document.createElementNS("http://www.w3.org/2000/svg","image");if(w.setAttribute("href","data:image/png;base64,"+window.btoa(String.fromCharCode.apply(String,nt(c)))),w.setAttribute("x","".concat(2*n)),w.setAttribute("y","".concat(2*i)),w.setAttribute("width","".concat(2*A)),w.setAttribute("height","".concat(2*y)),b.appendChild(w),s.size>0){for(var x=0;x<8;x++)for(var S=0;S<16;S++)if(s.has(16*x+S)){var C=a[x][S],E=Number.parseInt(C.substring(1,3),16),k=Number.parseInt(C.substring(3,5),16),T=Number.parseInt(C.substring(5,7),16),I=Number.parseInt(C.substring(7,9),16);c[41+3*(16*x+S)]=E,c[41+3*(16*x+S)+1]=k,c[41+3*(16*x+S)+2]=T,c[437+(16*x+S)]=I}else c[437+(16*x+S)]=0;u.setInt32(425,et(c,37,425),!1),u.setInt32(565,et(c,433,565),!1);var _=document.createElementNS("http://www.w3.org/2000/svg","image");_.setAttribute("href","data:image/png;base64,"+window.btoa(String.fromCharCode.apply(String,nt(c)))),_.setAttribute("x","".concat(2*n)),_.setAttribute("y","".concat(2*i)),_.setAttribute("width","".concat(2*A)),_.setAttribute("height","".concat(2*y));var O=document.createElementNS("http://www.w3.org/2000/svg","animate");O.setAttribute("attributeName","opacity"),O.setAttribute("values","1;0"),O.setAttribute("dur","1s"),O.setAttribute("calcMode","discrete"),O.setAttribute("repeatCount","indefinite"),_.appendChild(O),b.appendChild(_)}this.svg.appendChild(b)}}}},{key:"getOrnColorCode",value:function(){return!0===this.force_orn?t.fillAlphaColorCode(this.bg_color):!1===this.force_orn?this.orn:null!==(e=this.force_orn)&&void 0!==e?e:this.orn;var e}}])&&st(e.prototype,n),g&&st(e,g),t}();function lt(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function ct(t){for(var e=1;ee.length)break;if(73!==e[i+0]||68!==e[i+1]||51!==e[i+2])break;if((i+=6)+4>e.length)break;var s=W(e,i+0,i+4);i+=4;var o=r+3+2+1+4+s;if(o>e.length)break;for(var a=i;ae.length)break;var c=Z(e,a+0,a+4);if((a+=4)+4>e.length)break;var u=W(e,a+0,a+4);a+=6;var d=l+4+4+2+u;if(d>e.length)break;if("PRIV"===c){for(var h=a,p=d;0!==e[a]&&ae.length||51===e[i+0]&&68===e[i+1]&&73===e[i+2]&&(i+=10)}return n}},{key:"setInBandMetadataTextTrack",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener("cuechange",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode="hidden",this.id3Track.addEventListener("cuechange",this.onID3CueChangeHandler)}},{key:"pushID3v2Cue",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,n=t;if("15260DFFFF49443320FF49443320000F"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(n.data));if("com.apple.streaming"===this.id3Track.inBandMetadataTrackDispatchType){if("PRIV"===n.value.key)return this.pushID3v2PRIVData(e,n.value.info,new Uint8Array(n.value.data));if("TXXX"===n.value.key)return this.pushID3v2TXXXData(e,n.value.info,n.value.data)}else if("id3"===this.id3Track.label){if("PRIV"===n.value.key)return this.pushID3v2PRIVData(e,n.value.info,new Uint8Array(n.value.data));if("TXXX"===n.value.key)return this.pushID3v2TXXXData(e,n.value.info,n.value.data)}else if("Timed Metadata"===this.id3Track.label){if("PRIV"===n.frame.key)return this.pushID3v2PRIVData(e,n.frame.owner,new Uint8Array(n.frame.data));if("TXXX"===n.frame.key)return this.pushID3v2TXXXData(e,n.frame.description,n.frame.data)}return!1}},{key:"onID3CueChange",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:"addB24Cue",value:function(t,e,n){var i;if(!this.b24Track)return!1;if(!at.detect(n,this.rendererOption))return!1;var r=new(null!==(i=window.VTTCue)&&void 0!==i?i:window.TextTrackCue)(t,e,"");if(r.data=n,window.VTTCue)this.b24Track.addCue(r);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var o=[],a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.cues[a].startTime>=t&&(o.push(this.b24Track.cues[a]),this.b24Track.removeCue(this.b24Track.cues[a]));this.b24Track.addCue(r);for(var l=o.length-1;l>=0;l--)this.b24Track.addCue(o[l])}}return!0}},{key:"onB24CueChange",value:function(){if(this.media&&this.b24Track){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var t=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(t.startTime<=this.media.currentTime&&this.media.currentTime<=t.endTime&&!this.isOnSeeking){var e=new at(t.data,t.startTime);if(this.isShowing){var n,i,r,s=e.render(ct(ct({},this.rendererOption),{},{svg:this.svg}));null!=(null==s?void 0:s.PRA)&&(null===(i=this.rendererOption)||void 0===i||null===(r=i.PRACallback)||void 0===r||r.call(i,s.PRA)),null==s||s.rendered,this.textContent=null!==(n=null==s?void 0:s.textContent)&&void 0!==n?n:null}this.onB24CueChangeDrawed=!0}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var o=this.b24Track.activeCues.length-2;o>=0;o--){var a=this.b24Track.activeCues[o];a.endTime=Math.min(a.endTime,t.startTime),a.startTime===a.endTime&&this.b24Track.removeCue(a)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:"onHighResTimeupdate",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:"onTimeupdate",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,n=new H(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),i=[n],r=0;rt;p--){var f=i[p];if(f!==n&&this.pushID3v2Cue(f))break}else for(var m=t;m=0;o--)this.b24Track.removeCue(this.b24Track.cues[o]);null===(t=this.b24Track)||void 0===t||t.removeEventListener("cuechange",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener("cuechange",this.onID3CueChangeHandler),null===(n=this.media)||void 0===n||n.removeEventListener("seeking",this.onSeekingHandler),null===(i=this.media)||void 0===i||i.removeEventListener("seeked",this.onSeekedHandler),null===(r=this.media)||void 0===r||r.textTracks.removeEventListener("addtrack",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:"cleanupSVG",value:function(){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild)}}])&&dt(t.prototype,e),t}();function pt(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n>2)!==s||(v(t,o),0))}},{key:"getRGBAColorCode",value:function(t){if(null==t)return null;var e=document.createElement("canvas");e.width=e.height=1;var n=e.getContext("2d");if(!n)return null;n.fillStyle=t,n.fillRect(0,0,e.width,e.height);var i,r,s=(r=4,function(t){if(Array.isArray(t))return t}(i=n.getImageData(0,0,1,1).data)||function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var n=[],i=!0,r=!1,s=void 0;try{for(var o,a=t[Symbol.iterator]();!(i=(o=a.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){r=!0,s=t}finally{try{i||null==a.return||a.return()}finally{if(r)throw s}}return n}}(i,r)||function(t,e){if(t){if("string"==typeof t)return pt(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?pt(t,e):void 0}}(i,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=s[0],a=s[1],l=s[2],c=s[3],u="#".concat(o.toString(16).toUpperCase().padStart(2,"0")).concat(a.toString(16).toUpperCase().padStart(2,"0")).concat(l.toString(16).toUpperCase().padStart(2,"0")).concat(c.toString(16).toUpperCase().padStart(2,"0"));return e.width=e.height=0,u}},{key:"fillAlphaColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16);return"#".concat(e.toString(16).toUpperCase().padStart(2,"0")).concat(n.toString(16).toUpperCase().padStart(2,"0")).concat(i.toString(16).toUpperCase().padStart(2,"0"),"FF")}},{key:"getRGBAfromColorCode",value:function(t){if(null==t)return"";var e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16),r=Number.parseInt(t.substring(7,9),16);return"rgba(".concat(e,", ").concat(n,", ").concat(i,", ").concat(r/255,")")}}],(n=[{key:"width",value:function(){return Math.floor((this.shs+this.ssm_x)*this.text_size_x)}},{key:"height",value:function(){return Math.floor((this.svs+this.ssm_y)*this.text_size_y)}},{key:"move_absolute_dot",value:function(t,e){this.position_x=t,this.position_y=e}},{key:"move_absolute_pos",value:function(t,e){this.position_x=this.sdp_x+t*this.width(),this.position_y=this.sdp_y+(e+1)*this.height()}},{key:"move_relative_pos",value:function(t,e){for((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs));t<0;)this.position_x-=this.width(),t++,this.position_x0;)this.position_x+=this.width(),t--,this.position_x>=this.sdp_x+this.sdf_x&&(this.position_x=this.sdp_x,e++);for(;e<0;)this.position_y-=this.height(),e++;for(;e>0;)this.position_y+=this.height(),e--}},{key:"move_newline",value:function(){(this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),this.position_x=this.sdp_x,this.position_y=this.position_y+this.height()}},{key:"render",value:function(e){var n,i,r,s,o,a,l,c;this.table=null!==(n=null==e?void 0:e.table)&&void 0!==n?n:null,this.force_orn=null!==(i="boolean"==typeof(null==e?void 0:e.forceStrokeColor)?null==e?void 0:e.forceStrokeColor:t.getRGBAColorCode(null==e?void 0:e.forceStrokeColor))&&void 0!==i?i:null,this.force_bg_color=null!==(r=t.getRGBAColorCode(null==e?void 0:e.forceBackgroundColor))&&void 0!==r?r:null,this.normalFont=null!==(s=null==e?void 0:e.normalFont)&&void 0!==s?s:this.normalFont,this.gaijiFont=null!==(o=null==e?void 0:e.gaijiFont)&&void 0!==o?o:this.normalFont,this.drcsReplacement=null!==(a=null==e?void 0:e.drcsReplacement)&&void 0!==a&&a,this.drcsReplaceMapping=new Map(f);for(var u,d=Object.entries(null!==(u=null==e?void 0:e.drcsReplaceMapping)&&void 0!==u?u:{}),h=0;h0&&(this.endTime=this.startTime+this.timeElapsed),t+=1;else if(13===this.pes[t])this.move_newline(),t+=1;else if(14===this.pes[t])this.GL=1,t+=1;else if(15===this.pes[t])this.GL=0,t+=1;else if(22===this.pes[t]){var h=63&this.pes[t+1];this.move_relative_pos(h,0),t+=2}else if(24===this.pes[t])t+=1;else if(25===this.pes[t]){var p=0,f=this.G_BACK[2];if(!f)return;for(var m=0;m>8),v=127&i,A=null===(f=o.get(g))||void 0===f?void 0:f.alphabet;A&&(null===(m=this.DRCS_mapping.get(A))||void 0===m||m.set(v,p))}else{var y,b=32639&i;null===(y=this.DRCS_mapping.get(15))||void 0===y||y.set(b,p)}e+=4+h}}}}},{key:"renderCharacter",value:function(e,n){if((this.position_x<0||this.position_y<0)&&this.move_absolute_dot(this.sdp_x,this.sdp_y+(this.ssm_y+this.svs)),null!==this.table){if(null===this.cells){this.table.parentElement&&(this.table.parentElement.style.position="absolute",this.table.parentElement.style.width="".concat(this.swf_x,"px"),this.table.parentElement.style.height="".concat(this.swf_y,"px")),this.table.style.willChange="transform",this.table.style.position="absolute",this.table.style.left="".concat(this.sdp_x,"px"),this.table.style.top="".concat(this.sdp_y,"px"),this.table.style.width="".concat(this.sdf_x,"px"),this.table.style.height="".concat(this.sdf_y,"px"),this.table.style.boxSizing="border-box",this.table.style.border="none",this.table.style.borderCollapse="collapse";for(var r=[],o=0,a=0;o>8)-33)+(((255&e)>>0)-33),A=7896;if(v>U}j>0&&R.fillRect(2/this.text_size_x+N+L,2/this.text_size_y+V+D,1,1)}}R.fillStyle=t.getRGBAfromColorCode(this.fg_color);for(var z=0;z>J}H>0&&R.fillRect(2/this.text_size_x+G,2/this.text_size_y+z,1,1)}for(var Y=Math.floor(2*this.text_size_x),Z=Math.floor(2*this.text_size_y),q=Math.round((this.position_x-this.sdp_x)/(this.ssm_x+this.shs)*2),K=Math.round((this.position_y-this.height()-this.sdp_y)/(this.ssm_y+this.svs)*2),Q=0;Qe.length)break;if(73!==e[i+0]||68!==e[i+1]||51!==e[i+2])break;if((i+=6)+4>e.length)break;var s=W(e,i+0,i+4);i+=4;var o=r+3+2+1+4+s;if(o>e.length)break;for(var a=i;ae.length)break;var c=Z(e,a+0,a+4);if((a+=4)+4>e.length)break;var u=W(e,a+0,a+4);a+=6;var d=l+4+4+2+u;if(d>e.length)break;if("PRIV"===c){for(var h=a,p=d;0!==e[a]&&ae.length||51===e[i+0]&&68===e[i+1]&&73===e[i+2]&&(i+=10)}return n}},{key:"setInBandMetadataTextTrack",value:function(t){var e;null===(e=this.id3Track)||void 0===e||e.removeEventListener("cuechange",this.onID3CueChangeHandler),this.id3Track=t,this.id3Track.mode="hidden",this.id3Track.addEventListener("cuechange",this.onID3CueChangeHandler)}},{key:"pushID3v2Cue",value:function(t){if(!this.id3Track)return!1;var e=t.startTime,n=t;if("15260DFFFF49443320FF49443320000F"===this.id3Track.inBandMetadataTrackDispatchType)return this.pushID3v2Data(e,new Uint8Array(n.data));if("com.apple.streaming"===this.id3Track.inBandMetadataTrackDispatchType){if("PRIV"===n.value.key)return this.pushID3v2PRIVData(e,n.value.info,new Uint8Array(n.value.data));if("TXXX"===n.value.key)return this.pushID3v2TXXXData(e,n.value.info,n.value.data)}else if("id3"===this.id3Track.label){if("PRIV"===n.value.key)return this.pushID3v2PRIVData(e,n.value.info,new Uint8Array(n.value.data));if("TXXX"===n.value.key)return this.pushID3v2TXXXData(e,n.value.info,n.value.data)}else if("Timed Metadata"===this.id3Track.label){if("PRIV"===n.frame.key)return this.pushID3v2PRIVData(e,n.frame.owner,new Uint8Array(n.frame.data));if("TXXX"===n.frame.key)return this.pushID3v2TXXXData(e,n.frame.description,n.frame.data)}return!1}},{key:"onID3CueChange",value:function(){this.id3Track&&(this.isOnSeeking||this.onTimeupdate())}},{key:"addB24Cue",value:function(t,e,n){var i;if(!this.b24Track)return!1;if(!gt.detect(n,this.rendererOption))return!1;var r=new(null!==(i=window.VTTCue)&&void 0!==i?i:window.TextTrackCue)(t,e,"");if(r.data=n,window.VTTCue)this.b24Track.addCue(r);else if(window.TextTrackCue){var s;if(Array.prototype.some.call(null!==(s=this.b24Track.cues)&&void 0!==s?s:[],(function(e){return e.startTime===t})))return!1;if(this.b24Track.cues){for(var o=[],a=this.b24Track.cues.length-1;a>=0;a--)this.b24Track.cues[a].startTime>=t&&(o.push(this.b24Track.cues[a]),this.b24Track.removeCue(this.b24Track.cues[a]));this.b24Track.addCue(r);for(var l=o.length-1;l>=0;l--)this.b24Track.addCue(o[l])}}return!0}},{key:"onB24CueChange",value:function(){if(this.media&&this.b24Track){if(this.table)for(;this.table.firstChild;)this.table.removeChild(this.table.firstChild);if(this.b24Track.activeCues&&this.b24Track.activeCues.length>0){var t=this.b24Track.activeCues[this.b24Track.activeCues.length-1];if(t.startTime<=this.media.currentTime&&this.media.currentTime<=t.endTime&&!this.isOnSeeking){var e,n,i,r,s,o=new gt(t.data,t.startTime).render(At(At({},this.rendererOption),{},{table:null!==(e=this.table)&&void 0!==e?e:void 0}));null!=(null==o?void 0:o.PRA)&&(null===(r=this.rendererOption)||void 0===r||null===(s=r.PRACallback)||void 0===s||s.call(r,o.PRA)),null!=o&&o.rendered&&this.onResize(),this.onB24CueChangeDrawed=null!==(n=null==o?void 0:o.rendered)&&void 0!==n&&n,this.textContent=null!==(i=null==o?void 0:o.textContent)&&void 0!==i?i:null}else this.onB24CueChangeDrawed=!1,this.textContent=null;for(var a=this.b24Track.activeCues.length-2;a>=0;a--){var l=this.b24Track.activeCues[a];l.endTime=Math.min(l.endTime,t.startTime),l.startTime===l.endTime&&this.b24Track.removeCue(l)}}else this.onB24CueChangeDrawed=!1,this.textContent=null}else this.onB24CueChangeDrawed=!1}},{key:"onHighResTimeupdate",value:function(){this.onTimeupdate(),this.highResTimeupdatePollingId=window.requestAnimationFrame(this.onHighResTimeupdateHandler)}},{key:"onTimeupdate",value:function(){if(this.media)if(null!=this.prevCurrentTime)if(this.id3Track&&this.id3Track.cues&&0!==this.id3Track.cues.length)if(this.isOnSeeking)this.prevCurrentTime=this.media.currentTime;else if(Math.abs(this.media.currentTime-this.prevCurrentTime)>1)this.prevCurrentTime=this.media.currentTime;else{for(var t,e,n=new H(Number.NEGATIVE_INFINITY,this.id3Track.cues[0].startTime),i=[n],r=0;rt;p--){var f=i[p];if(f!==n&&this.pushID3v2Cue(f))break}else for(var m=t;m=0;o--)this.b24Track.removeCue(this.b24Track.cues[o]);null===(t=this.b24Track)||void 0===t||t.removeEventListener("cuechange",this.onB24CueChangeHandler),null===(e=this.id3Track)||void 0===e||e.removeEventListener("cuechange",this.onID3CueChangeHandler),null===(n=this.media)||void 0===n||n.removeEventListener("seeking",this.onSeekingHandler),null===(i=this.media)||void 0===i||i.removeEventListener("seeked",this.onSeekedHandler),null===(r=this.media)||void 0===r||r.textTracks.removeEventListener("addtrack",this.onID3AddtrackHandler),this.b24Track=this.id3Track=null}},{key:"cleanupTable",value:function(){var t;window.removeEventListener("resize",this.onResizeHandler),null===(t=this.media)||void 0===t||t.removeEventListener("resize",this.onResizeHandler),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.table&&this.wrapper&&this.wrapper.removeChild(this.table),this.wrapper&&this.subtitleElement&&this.subtitleElement.removeChild(this.wrapper),this.wrapper=this.table=null}}])&&bt(t.prototype,e),t}()},3099:function(t){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},6077:function(t,e,n){var i=n(111);t.exports=function(t){if(!i(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},1223:function(t,e,n){var i=n(5112),r=n(30),s=n(3070),o=i("unscopables"),a=Array.prototype;null==a[o]&&s.f(a,o,{configurable:!0,value:r(null)}),t.exports=function(t){a[o][t]=!0}},1530:function(t,e,n){"use strict";var i=n(8710).charAt;t.exports=function(t,e,n){return e+(n?i(t,e).length:1)}},5787:function(t){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},9670:function(t,e,n){var i=n(111);t.exports=function(t){if(!i(t))throw TypeError(String(t)+" is not an object");return t}},4019:function(t){t.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},260:function(t,e,n){"use strict";var i,r=n(4019),s=n(9781),o=n(7854),a=n(111),l=n(6656),c=n(648),u=n(8880),d=n(1320),h=n(3070).f,p=n(9518),f=n(7674),m=n(5112),g=n(9711),v=o.Int8Array,A=v&&v.prototype,y=o.Uint8ClampedArray,b=y&&y.prototype,w=v&&p(v),x=A&&p(A),S=Object.prototype,C=S.isPrototypeOf,E=m("toStringTag"),k=g("TYPED_ARRAY_TAG"),T=r&&!!f&&"Opera"!==c(o.opera),I=!1,_={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},O={BigInt64Array:8,BigUint64Array:8},B=function(t){if(!a(t))return!1;var e=c(t);return l(_,e)||l(O,e)};for(i in _)o[i]||(T=!1);if((!T||"function"!=typeof w||w===Function.prototype)&&(w=function(){throw TypeError("Incorrect invocation")},T))for(i in _)o[i]&&f(o[i],w);if((!T||!x||x===S)&&(x=w.prototype,T))for(i in _)o[i]&&f(o[i].prototype,x);if(T&&p(b)!==x&&f(b,x),s&&!l(x,E))for(i in I=!0,h(x,E,{get:function(){return a(this)?this[k]:void 0}}),_)o[i]&&u(o[i],k,i);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:T,TYPED_ARRAY_TAG:I&&k,aTypedArray:function(t){if(B(t))return t;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(t){if(f){if(C.call(w,t))return t}else for(var e in _)if(l(_,i)){var n=o[e];if(n&&(t===n||C.call(n,t)))return t}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(t,e,n){if(s){if(n)for(var i in _){var r=o[i];r&&l(r.prototype,t)&&delete r.prototype[t]}x[t]&&!n||d(x,t,n?e:T&&A[t]||e)}},exportTypedArrayStaticMethod:function(t,e,n){var i,r;if(s){if(f){if(n)for(i in _)(r=o[i])&&l(r,t)&&delete r[t];if(w[t]&&!n)return;try{return d(w,t,n?e:T&&v[t]||e)}catch(t){}}for(i in _)!(r=o[i])||r[t]&&!n||d(r,t,e)}},isView:function(t){if(!a(t))return!1;var e=c(t);return"DataView"===e||l(_,e)||l(O,e)},isTypedArray:B,TypedArray:w,TypedArrayPrototype:x}},3331:function(t,e,n){"use strict";var i=n(7854),r=n(9781),s=n(4019),o=n(8880),a=n(2248),l=n(7293),c=n(5787),u=n(9958),d=n(7466),h=n(7067),p=n(1179),f=n(9518),m=n(7674),g=n(8006).f,v=n(3070).f,A=n(1285),y=n(8003),b=n(9909),w=b.get,x=b.set,S="ArrayBuffer",C="DataView",E="Wrong index",k=i.ArrayBuffer,T=k,I=i.DataView,_=I&&I.prototype,O=Object.prototype,B=i.RangeError,P=p.pack,R=p.unpack,M=function(t){return[255&t]},D=function(t){return[255&t,t>>8&255]},L=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},V=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},N=function(t){return P(t,23,4)},j=function(t){return P(t,52,8)},F=function(t,e){v(t.prototype,e,{get:function(){return w(this)[e]}})},U=function(t,e,n,i){var r=h(n),s=w(t);if(r+e>s.byteLength)throw B(E);var o=w(s.buffer).bytes,a=r+s.byteOffset,l=o.slice(a,a+e);return i?l:l.reverse()},z=function(t,e,n,i,r,s){var o=h(n),a=w(t);if(o+e>a.byteLength)throw B(E);for(var l=w(a.buffer).bytes,c=o+a.byteOffset,u=i(+r),d=0;dJ;)(G=W[J++])in T||o(T,G,k[G]);H.constructor=T}m&&f(_)!==O&&m(_,O);var Y=new I(new T(2)),Z=_.setInt8;Y.setInt8(0,2147483648),Y.setInt8(1,2147483649),!Y.getInt8(0)&&Y.getInt8(1)||a(_,{setInt8:function(t,e){Z.call(this,t,e<<24>>24)},setUint8:function(t,e){Z.call(this,t,e<<24>>24)}},{unsafe:!0})}else T=function(t){c(this,T,S);var e=h(t);x(this,{bytes:A.call(new Array(e),0),byteLength:e}),r||(this.byteLength=e)},I=function(t,e,n){c(this,I,C),c(t,T,C);var i=w(t).byteLength,s=u(e);if(s<0||s>i)throw B("Wrong offset");if(s+(n=void 0===n?i-s:d(n))>i)throw B("Wrong length");x(this,{buffer:t,byteLength:n,byteOffset:s}),r||(this.buffer=t,this.byteLength=n,this.byteOffset=s)},r&&(F(T,"byteLength"),F(I,"buffer"),F(I,"byteLength"),F(I,"byteOffset")),a(I.prototype,{getInt8:function(t){return U(this,1,t)[0]<<24>>24},getUint8:function(t){return U(this,1,t)[0]},getInt16:function(t){var e=U(this,2,t,arguments.length>1?arguments[1]:void 0);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=U(this,2,t,arguments.length>1?arguments[1]:void 0);return e[1]<<8|e[0]},getInt32:function(t){return V(U(this,4,t,arguments.length>1?arguments[1]:void 0))},getUint32:function(t){return V(U(this,4,t,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(t){return R(U(this,4,t,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(t){return R(U(this,8,t,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(t,e){z(this,1,t,M,e)},setUint8:function(t,e){z(this,1,t,M,e)},setInt16:function(t,e){z(this,2,t,D,e,arguments.length>2?arguments[2]:void 0)},setUint16:function(t,e){z(this,2,t,D,e,arguments.length>2?arguments[2]:void 0)},setInt32:function(t,e){z(this,4,t,L,e,arguments.length>2?arguments[2]:void 0)},setUint32:function(t,e){z(this,4,t,L,e,arguments.length>2?arguments[2]:void 0)},setFloat32:function(t,e){z(this,4,t,N,e,arguments.length>2?arguments[2]:void 0)},setFloat64:function(t,e){z(this,8,t,j,e,arguments.length>2?arguments[2]:void 0)}});y(T,S),y(I,C),t.exports={ArrayBuffer:T,DataView:I}},1048:function(t,e,n){"use strict";var i=n(7908),r=n(1400),s=n(7466),o=Math.min;t.exports=[].copyWithin||function(t,e){var n=i(this),a=s(n.length),l=r(t,a),c=r(e,a),u=arguments.length>2?arguments[2]:void 0,d=o((void 0===u?a:r(u,a))-c,a-l),h=1;for(c0;)c in n?n[l]=n[c]:delete n[l],l+=h,c+=h;return n}},1285:function(t,e,n){"use strict";var i=n(7908),r=n(1400),s=n(7466);t.exports=function(t){for(var e=i(this),n=s(e.length),o=arguments.length,a=r(o>1?arguments[1]:void 0,n),l=o>2?arguments[2]:void 0,c=void 0===l?n:r(l,n);c>a;)e[a++]=t;return e}},8533:function(t,e,n){"use strict";var i=n(2092).forEach,r=n(9341),s=n(9207),o=r("forEach"),a=s("forEach");t.exports=o&&a?[].forEach:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}},1318:function(t,e,n){var i=n(5656),r=n(7466),s=n(1400),o=function(t){return function(e,n,o){var a,l=i(e),c=r(l.length),u=s(o,c);if(t&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((t||u in l)&&l[u]===n)return t||u||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},2092:function(t,e,n){var i=n(9974),r=n(8361),s=n(7908),o=n(7466),a=n(5417),l=[].push,c=function(t){var e=1==t,n=2==t,c=3==t,u=4==t,d=6==t,h=7==t,p=5==t||d;return function(f,m,g,v){for(var A,y,b=s(f),w=r(b),x=i(m,g,3),S=o(w.length),C=0,E=v||a,k=e?E(f,S):n||h?E(f,0):void 0;S>C;C++)if((p||C in w)&&(y=x(A=w[C],C,b),t))if(e)k[C]=y;else if(y)switch(t){case 3:return!0;case 5:return A;case 6:return C;case 2:l.call(k,A)}else switch(t){case 4:return!1;case 7:l.call(k,A)}return d?-1:c||u?u:k}};t.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},6583:function(t,e,n){"use strict";var i=n(5656),r=n(9958),s=n(7466),o=n(9341),a=n(9207),l=Math.min,c=[].lastIndexOf,u=!!c&&1/[1].lastIndexOf(1,-0)<0,d=o("lastIndexOf"),h=a("indexOf",{ACCESSORS:!0,1:0}),p=u||!d||!h;t.exports=p?function(t){if(u)return c.apply(this,arguments)||0;var e=i(this),n=s(e.length),o=n-1;for(arguments.length>1&&(o=l(o,r(arguments[1]))),o<0&&(o=n+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:c},1194:function(t,e,n){var i=n(7293),r=n(5112),s=n(7392),o=r("species");t.exports=function(t){return s>=51||!i((function(){var e=[];return(e.constructor={})[o]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},9341:function(t,e,n){"use strict";var i=n(7293);t.exports=function(t,e){var n=[][t];return!!n&&i((function(){n.call(null,e||function(){throw 1},1)}))}},9207:function(t,e,n){var i=n(9781),r=n(7293),s=n(6656),o=Object.defineProperty,a={},l=function(t){throw t};t.exports=function(t,e){if(s(a,t))return a[t];e||(e={});var n=[][t],c=!!s(e,"ACCESSORS")&&e.ACCESSORS,u=s(e,0)?e[0]:l,d=s(e,1)?e[1]:void 0;return a[t]=!!n&&!r((function(){if(c&&!i)return!0;var t={length:-1};c?o(t,1,{enumerable:!0,get:l}):t[1]=1,n.call(t,u,d)}))}},3671:function(t,e,n){var i=n(3099),r=n(7908),s=n(8361),o=n(7466),a=function(t){return function(e,n,a,l){i(n);var c=r(e),u=s(c),d=o(c.length),h=t?d-1:0,p=t?-1:1;if(a<2)for(;;){if(h in u){l=u[h],h+=p;break}if(h+=p,t?h<0:d<=h)throw TypeError("Reduce of empty array with no initial value")}for(;t?h>=0:d>h;h+=p)h in u&&(l=n(l,u[h],h,c));return l}};t.exports={left:a(!1),right:a(!0)}},5417:function(t,e,n){var i=n(111),r=n(3157),s=n(5112)("species");t.exports=function(t,e){var n;return r(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!r(n.prototype)?i(n)&&null===(n=n[s])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},7072:function(t,e,n){var i=n(5112)("iterator"),r=!1;try{var s=0,o={next:function(){return{done:!!s++}},return:function(){r=!0}};o[i]=function(){return this},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var s={};s[i]=function(){return{next:function(){return{done:n=!0}}}},t(s)}catch(t){}return n}},4326:function(t){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},648:function(t,e,n){var i=n(1694),r=n(4326),s=n(5112)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=i?r:function(t){var e,n,i;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),s))?n:o?r(e):"Object"==(i=r(e))&&"function"==typeof e.callee?"Arguments":i}},5631:function(t,e,n){"use strict";var i=n(3070).f,r=n(30),s=n(2248),o=n(9974),a=n(5787),l=n(408),c=n(654),u=n(6340),d=n(9781),h=n(2423).fastKey,p=n(9909),f=p.set,m=p.getterFor;t.exports={getConstructor:function(t,e,n,c){var u=t((function(t,i){a(t,u,e),f(t,{type:e,index:r(null),first:void 0,last:void 0,size:0}),d||(t.size=0),null!=i&&l(i,t[c],{that:t,AS_ENTRIES:n})})),p=m(e),g=function(t,e,n){var i,r,s=p(t),o=v(t,e);return o?o.value=n:(s.last=o={index:r=h(e,!0),key:e,value:n,previous:i=s.last,next:void 0,removed:!1},s.first||(s.first=o),i&&(i.next=o),d?s.size++:t.size++,"F"!==r&&(s.index[r]=o)),t},v=function(t,e){var n,i=p(t),r=h(e);if("F"!==r)return i.index[r];for(n=i.first;n;n=n.next)if(n.key==e)return n};return s(u.prototype,{clear:function(){for(var t=p(this),e=t.index,n=t.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete e[n.index],n=n.next;t.first=t.last=void 0,d?t.size=0:this.size=0},delete:function(t){var e=this,n=p(e),i=v(e,t);if(i){var r=i.next,s=i.previous;delete n.index[i.index],i.removed=!0,s&&(s.next=r),r&&(r.previous=s),n.first==i&&(n.first=r),n.last==i&&(n.last=s),d?n.size--:e.size--}return!!i},forEach:function(t){for(var e,n=p(this),i=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.next:n.first;)for(i(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!v(this,t)}}),s(u.prototype,n?{get:function(t){var e=v(this,t);return e&&e.value},set:function(t,e){return g(this,0===t?0:t,e)}}:{add:function(t){return g(this,t=0===t?0:t,t)}}),d&&i(u.prototype,"size",{get:function(){return p(this).size}}),u},setStrong:function(t,e,n){var i=e+" Iterator",r=m(e),s=m(i);c(t,e,(function(t,e){f(this,{type:i,target:t,state:r(t),kind:e,last:void 0})}),(function(){for(var t=s(this),e=t.kind,n=t.last;n&&n.removed;)n=n.previous;return t.target&&(t.last=n=n?n.next:t.state.first)?"keys"==e?{value:n.key,done:!1}:"values"==e?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),n?"entries":"values",!n,!0),u(e)}}},7710:function(t,e,n){"use strict";var i=n(2109),r=n(7854),s=n(4705),o=n(1320),a=n(2423),l=n(408),c=n(5787),u=n(111),d=n(7293),h=n(7072),p=n(8003),f=n(9587);t.exports=function(t,e,n){var m=-1!==t.indexOf("Map"),g=-1!==t.indexOf("Weak"),v=m?"set":"add",A=r[t],y=A&&A.prototype,b=A,w={},x=function(t){var e=y[t];o(y,t,"add"==t?function(t){return e.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(g&&!u(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!u(t)?void 0:e.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!u(t))&&e.call(this,0===t?0:t)}:function(t,n){return e.call(this,0===t?0:t,n),this})};if(s(t,"function"!=typeof A||!(g||y.forEach&&!d((function(){(new A).entries().next()})))))b=n.getConstructor(e,t,m,v),a.REQUIRED=!0;else if(s(t,!0)){var S=new b,C=S[v](g?{}:-0,1)!=S,E=d((function(){S.has(1)})),k=h((function(t){new A(t)})),T=!g&&d((function(){for(var t=new A,e=5;e--;)t[v](e,e);return!t.has(-0)}));k||((b=e((function(e,n){c(e,b,t);var i=f(new A,e,b);return null!=n&&l(n,i[v],{that:i,AS_ENTRIES:m}),i}))).prototype=y,y.constructor=b),(E||T)&&(x("delete"),x("has"),m&&x("get")),(T||C)&&x(v),g&&y.clear&&delete y.clear}return w[t]=b,i({global:!0,forced:b!=A},w),p(b,t),g||n.setStrong(b,t,m),b}},9920:function(t,e,n){var i=n(6656),r=n(3887),s=n(1236),o=n(3070);t.exports=function(t,e){for(var n=r(e),a=o.f,l=s.f,c=0;c=74)&&(i=o.match(/Chrome\/(\d+)/))&&(r=i[1]),t.exports=r&&+r},748:function(t){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:function(t,e,n){var i=n(7854),r=n(1236).f,s=n(8880),o=n(1320),a=n(3505),l=n(9920),c=n(4705);t.exports=function(t,e){var n,u,d,h,p,f=t.target,m=t.global,g=t.stat;if(n=m?i:g?i[f]||a(f,{}):(i[f]||{}).prototype)for(u in e){if(h=e[u],d=t.noTargetGet?(p=r(n,u))&&p.value:n[u],!c(m?u:f+(g?".":"#")+u,t.forced)&&void 0!==d){if(typeof h==typeof d)continue;l(h,d)}(t.sham||d&&d.sham)&&s(h,"sham",!0),o(n,u,h,t)}}},7293:function(t){t.exports=function(t){try{return!!t()}catch(t){return!0}}},7007:function(t,e,n){"use strict";n(4916);var i=n(1320),r=n(7293),s=n(5112),o=n(2261),a=n(8880),l=s("species"),c=!r((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),u="$0"==="a".replace(/./,"$0"),d=s("replace"),h=!!/./[d]&&""===/./[d]("a","$0"),p=!r((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));t.exports=function(t,e,n,d){var f=s(t),m=!r((function(){var e={};return e[f]=function(){return 7},7!=""[t](e)})),g=m&&!r((function(){var e=!1,n=/a/;return"split"===t&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return e=!0,null},n[f](""),!e}));if(!m||!g||"replace"===t&&(!c||!u||h)||"split"===t&&!p){var v=/./[f],A=n(f,""[t],(function(t,e,n,i,r){return e.exec===o?m&&!r?{done:!0,value:v.call(e,n,i)}:{done:!0,value:t.call(n,e,i)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:h}),y=A[0],b=A[1];i(String.prototype,t,y),i(RegExp.prototype,f,2==e?function(t,e){return b.call(t,this,e)}:function(t){return b.call(t,this)})}d&&a(RegExp.prototype[f],"sham",!0)}},6677:function(t,e,n){var i=n(7293);t.exports=!i((function(){return Object.isExtensible(Object.preventExtensions({}))}))},9974:function(t,e,n){var i=n(3099);t.exports=function(t,e,n){if(i(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)}}return function(){return t.apply(e,arguments)}}},5005:function(t,e,n){var i=n(857),r=n(7854),s=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?s(i[t])||s(r[t]):i[t]&&i[t][e]||r[t]&&r[t][e]}},1246:function(t,e,n){var i=n(648),r=n(7497),s=n(5112)("iterator");t.exports=function(t){if(null!=t)return t[s]||t["@@iterator"]||r[i(t)]}},647:function(t,e,n){var i=n(7908),r=Math.floor,s="".replace,o=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;t.exports=function(t,e,n,l,c,u){var d=n+t.length,h=l.length,p=a;return void 0!==c&&(c=i(c),p=o),s.call(u,p,(function(i,s){var o;switch(s.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(d);case"<":o=c[s.slice(1,-1)];break;default:var a=+s;if(0===a)return i;if(a>h){var u=r(a/10);return 0===u?i:u<=h?void 0===l[u-1]?s.charAt(1):l[u-1]+s.charAt(1):i}o=l[a-1]}return void 0===o?"":o}))}},7854:function(t,e,n){var i=function(t){return t&&t.Math==Math&&t};t.exports=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},6656:function(t){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},3501:function(t){t.exports={}},490:function(t,e,n){var i=n(5005);t.exports=i("document","documentElement")},4664:function(t,e,n){var i=n(9781),r=n(7293),s=n(317);t.exports=!i&&!r((function(){return 7!=Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},1179:function(t){var e=1/0,n=Math.abs,i=Math.pow,r=Math.floor,s=Math.log,o=Math.LN2;t.exports={pack:function(t,a,l){var c,u,d,h=new Array(l),p=8*l-a-1,f=(1<>1,g=23===a?i(2,-24)-i(2,-77):0,v=t<0||0===t&&1/t<0?1:0,A=0;for((t=n(t))!=t||t===e?(u=t!=t?1:0,c=f):(c=r(s(t)/o),t*(d=i(2,-c))<1&&(c--,d*=2),(t+=c+m>=1?g/d:g*i(2,1-m))*d>=2&&(c++,d/=2),c+m>=f?(u=0,c=f):c+m>=1?(u=(t*d-1)*i(2,a),c+=m):(u=t*i(2,m-1)*i(2,a),c=0));a>=8;h[A++]=255&u,u/=256,a-=8);for(c=c<0;h[A++]=255&c,c/=256,p-=8);return h[--A]|=128*v,h},unpack:function(t,n){var r,s=t.length,o=8*s-n-1,a=(1<>1,c=o-7,u=s-1,d=t[u--],h=127&d;for(d>>=7;c>0;h=256*h+t[u],u--,c-=8);for(r=h&(1<<-c)-1,h>>=-c,c+=n;c>0;r=256*r+t[u],u--,c-=8);if(0===h)h=1-l;else{if(h===a)return r?NaN:d?-1/0:e;r+=i(2,n),h-=l}return(d?-1:1)*r*i(2,h-n)}}},8361:function(t,e,n){var i=n(7293),r=n(4326),s="".split;t.exports=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==r(t)?s.call(t,""):Object(t)}:Object},9587:function(t,e,n){var i=n(111),r=n(7674);t.exports=function(t,e,n){var s,o;return r&&"function"==typeof(s=e.constructor)&&s!==n&&i(o=s.prototype)&&o!==n.prototype&&r(t,o),t}},2788:function(t,e,n){var i=n(5465),r=Function.toString;"function"!=typeof i.inspectSource&&(i.inspectSource=function(t){return r.call(t)}),t.exports=i.inspectSource},2423:function(t,e,n){var i=n(3501),r=n(111),s=n(6656),o=n(3070).f,a=n(9711),l=n(6677),c=a("meta"),u=0,d=Object.isExtensible||function(){return!0},h=function(t){o(t,c,{value:{objectID:"O"+ ++u,weakData:{}}})},p=t.exports={REQUIRED:!1,fastKey:function(t,e){if(!r(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,c)){if(!d(t))return"F";if(!e)return"E";h(t)}return t[c].objectID},getWeakData:function(t,e){if(!s(t,c)){if(!d(t))return!0;if(!e)return!1;h(t)}return t[c].weakData},onFreeze:function(t){return l&&p.REQUIRED&&d(t)&&!s(t,c)&&h(t),t}};i[c]=!0},9909:function(t,e,n){var i,r,s,o=n(8536),a=n(7854),l=n(111),c=n(8880),u=n(6656),d=n(5465),h=n(6200),p=n(3501),f=a.WeakMap;if(o){var m=d.state||(d.state=new f),g=m.get,v=m.has,A=m.set;i=function(t,e){return e.facade=t,A.call(m,t,e),e},r=function(t){return g.call(m,t)||{}},s=function(t){return v.call(m,t)}}else{var y=h("state");p[y]=!0,i=function(t,e){return e.facade=t,c(t,y,e),e},r=function(t){return u(t,y)?t[y]:{}},s=function(t){return u(t,y)}}t.exports={set:i,get:r,has:s,enforce:function(t){return s(t)?r(t):i(t,{})},getterFor:function(t){return function(e){var n;if(!l(e)||(n=r(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},7659:function(t,e,n){var i=n(5112),r=n(7497),s=i("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[s]===t)}},3157:function(t,e,n){var i=n(4326);t.exports=Array.isArray||function(t){return"Array"==i(t)}},4705:function(t,e,n){var i=n(7293),r=/#|\.prototype\./,s=function(t,e){var n=a[o(t)];return n==c||n!=l&&("function"==typeof e?i(e):!!e)},o=s.normalize=function(t){return String(t).replace(r,".").toLowerCase()},a=s.data={},l=s.NATIVE="N",c=s.POLYFILL="P";t.exports=s},111:function(t){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},1913:function(t){t.exports=!1},7850:function(t,e,n){var i=n(111),r=n(4326),s=n(5112)("match");t.exports=function(t){var e;return i(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==r(t))}},408:function(t,e,n){var i=n(9670),r=n(7659),s=n(7466),o=n(9974),a=n(1246),l=n(9212),c=function(t,e){this.stopped=t,this.result=e};t.exports=function(t,e,n){var u,d,h,p,f,m,g,v=n&&n.that,A=!(!n||!n.AS_ENTRIES),y=!(!n||!n.IS_ITERATOR),b=!(!n||!n.INTERRUPTED),w=o(e,v,1+A+b),x=function(t){return u&&l(u),new c(!0,t)},S=function(t){return A?(i(t),b?w(t[0],t[1],x):w(t[0],t[1])):b?w(t,x):w(t)};if(y)u=t;else{if("function"!=typeof(d=a(t)))throw TypeError("Target is not iterable");if(r(d)){for(h=0,p=s(t.length);p>h;h++)if((f=S(t[h]))&&f instanceof c)return f;return new c(!1)}u=d.call(t)}for(m=u.next;!(g=m.call(u)).done;){try{f=S(g.value)}catch(t){throw l(u),t}if("object"==typeof f&&f&&f instanceof c)return f}return new c(!1)}},9212:function(t,e,n){var i=n(9670);t.exports=function(t){var e=t.return;if(void 0!==e)return i(e.call(t)).value}},3383:function(t,e,n){"use strict";var i,r,s,o=n(7293),a=n(9518),l=n(8880),c=n(6656),u=n(5112),d=n(1913),h=u("iterator"),p=!1;[].keys&&("next"in(s=[].keys())?(r=a(a(s)))!==Object.prototype&&(i=r):p=!0);var f=null==i||o((function(){var t={};return i[h].call(t)!==t}));f&&(i={}),d&&!f||c(i,h)||l(i,h,(function(){return this})),t.exports={IteratorPrototype:i,BUGGY_SAFARI_ITERATORS:p}},7497:function(t){t.exports={}},133:function(t,e,n){var i=n(7293);t.exports=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())}))},8536:function(t,e,n){var i=n(7854),r=n(2788),s=i.WeakMap;t.exports="function"==typeof s&&/native code/.test(r(s))},3929:function(t,e,n){var i=n(7850);t.exports=function(t){if(i(t))throw TypeError("The method doesn't accept regular expressions");return t}},7023:function(t,e,n){var i=n(7854).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&i(t)}},3009:function(t,e,n){var i=n(7854),r=n(3111).trim,s=n(1361),o=i.parseInt,a=/^[+-]?0[Xx]/,l=8!==o(s+"08")||22!==o(s+"0x16");t.exports=l?function(t,e){var n=r(String(t));return o(n,e>>>0||(a.test(n)?16:10))}:o},30:function(t,e,n){var i,r=n(9670),s=n(6048),o=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200)("IE_PROTO"),d=function(){},h=function(t){return"
\ No newline at end of file +KonomiTV
\ No newline at end of file diff --git a/client/dist/service-worker.js b/client/dist/service-worker.js index 556b55b0..35f67769 100644 --- a/client/dist/service-worker.js +++ b/client/dist/service-worker.js @@ -1,2 +1,2 @@ -if(!self.define){let s,e={};const a=(a,r)=>(a=new URL(a+".js",r).href,e[a]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=a,s.onload=e,document.head.appendChild(s)}else s=a,importScripts(a),e()})).then((()=>{let s=e[a];if(!s)throw new Error(`Module ${a} didn’t register its module`);return s})));self.define=(r,i)=>{const d=s||("document"in self?document.currentScript.src:"")||location.href;if(e[d])return;let c={};const o=s=>a(s,d),n={module:{uri:d},exports:c,require:o};e[d]=Promise.all(r.map((s=>n[s]||o(s)))).then((s=>(i(...s),c)))}}define(["./workbox-ddce758e"],(function(s){"use strict";s.setCacheNameDetails({prefix:"KonomiTV"}),self.addEventListener("message",(s=>{s.data&&"SKIP_WAITING"===s.data.type&&self.skipWaiting()})),s.precacheAndRoute([{url:"/assets/css/app.062c7a27.css",revision:null},{url:"/assets/css/chunk-vendors.f9d0f5b1.css",revision:null},{url:"/assets/images/account-icon-default.png",revision:"3840f879e0ddf77549f4035ae72e8f6b"},{url:"/assets/images/icon.svg",revision:"63abc49a99bd463af26e73cec607771d"},{url:"/assets/images/icons/apple-touch-icon.png",revision:"a1ff224fdbecfd10c117cd6172799b94"},{url:"/assets/images/icons/favicon-16px.png",revision:"66d1179e73198777a49235a76619a093"},{url:"/assets/images/icons/favicon-32px.png",revision:"85e6e77bb3362197cf564bf9b21ebe12"},{url:"/assets/images/icons/favicon.svg",revision:"1bf40917c217fd567119c219ebabe4b9"},{url:"/assets/images/icons/icon-192px.png",revision:"cc3f0142a77651214f66f0a725253521"},{url:"/assets/images/icons/icon-512px.png",revision:"37175521e6de680e90740ead2506f9fd"},{url:"/assets/images/icons/icon-maskable-192px.png",revision:"291866775902df321181d8dbc66c0d22"},{url:"/assets/images/icons/icon-maskable-512px.png",revision:"d105aac16603bc9e5349fba31bf71cfd"},{url:"/assets/images/logo.svg",revision:"83079d38a7a118e1c80fe28d139991d8"},{url:"/assets/images/player-backgrounds/01.jpg",revision:"14d74db9eb062b39dc128daeba77cb63"},{url:"/assets/images/player-backgrounds/02.jpg",revision:"98e077363a5eec17da30acef5038f924"},{url:"/assets/images/player-backgrounds/03.jpg",revision:"e75e4fc34090286e347cebf12c74b1b8"},{url:"/assets/images/player-backgrounds/04.jpg",revision:"714dd3c050c09a16236f2424c548c83f"},{url:"/assets/images/player-backgrounds/05.jpg",revision:"717125c34121b326e8f90773565f59ca"},{url:"/assets/images/player-backgrounds/06.jpg",revision:"aa3b22785383baf67ad6d53fee94ed1c"},{url:"/assets/images/player-backgrounds/07.jpg",revision:"dc9937f7a374b99981cb0d6c9a642e56"},{url:"/assets/images/player-backgrounds/08.jpg",revision:"b6cedbf1da35814fbf784591380fde62"},{url:"/assets/images/player-backgrounds/09.jpg",revision:"e989450375d6954b37b066a1cec3ad35"},{url:"/assets/images/player-backgrounds/10.jpg",revision:"417128b6120078997139b44ee2c73dbd"},{url:"/assets/images/player-backgrounds/11.jpg",revision:"8c173e2d5980e09dc7b0e36e97b8f189"},{url:"/assets/images/player-backgrounds/12.jpg",revision:"97231a4813562229cc55d4516cb85350"},{url:"/assets/images/player-backgrounds/13.jpg",revision:"6efbebd72cadf7bdd59a0ad5325662d7"},{url:"/assets/images/player-backgrounds/14.jpg",revision:"54d47c83175ed7f11697a2cb3e54e3b1"},{url:"/assets/images/player-backgrounds/15.jpg",revision:"e9cb581540c06a770d299dede678ff0c"},{url:"/assets/images/player-backgrounds/16.jpg",revision:"b7e7ddc4ae9ba3811f3d5c0ae39a073f"},{url:"/assets/images/player-backgrounds/17.jpg",revision:"d363a4b8256115c7505a420ca6a55aae"},{url:"/assets/images/player-backgrounds/18.jpg",revision:"6c4e11b735bf6c95dfa5d47c3ae8e2e2"},{url:"/assets/images/player-backgrounds/19.jpg",revision:"7fdf1e54a13c7e9d34ceb170fb47c26a"},{url:"/assets/images/player-backgrounds/20.jpg",revision:"119ef99d06f809582244c2014ba005aa"},{url:"/assets/images/player-backgrounds/21.jpg",revision:"b83a101c3a856de1728790666e4c0040"},{url:"/assets/images/player-backgrounds/22.jpg",revision:"e6575b88d5aa774dc9b3c53e334c7c04"},{url:"/assets/images/player-backgrounds/23.jpg",revision:"c78d6d5548d8e2ed7b6681a6a29f75bb"},{url:"/assets/images/player-backgrounds/24.jpg",revision:"1da1420c684e6e51a0301b83544cf08c"},{url:"/assets/images/player-backgrounds/25.jpg",revision:"aa51d71045e5f5cc9d3b89daa344b917"},{url:"/assets/images/player-backgrounds/26.jpg",revision:"a8deb2d94eb69f1ccaaede00ba5bb6b7"},{url:"/assets/images/player-backgrounds/27.jpg",revision:"5dde7e046f56139835c5db0c397ea0bd"},{url:"/assets/images/player-backgrounds/28.jpg",revision:"a8027e60652ba8b43f436aba7895a82c"},{url:"/assets/images/player-backgrounds/29.jpg",revision:"e0b12e01312c0e627fb133726e44da8e"},{url:"/assets/images/player-backgrounds/30.jpg",revision:"b1841274afaa34e3f2c73a0bf6546c83"},{url:"/assets/images/player-backgrounds/31.jpg",revision:"89a95df22ca39eb75cf5be6ba869223e"},{url:"/assets/images/player-backgrounds/32.jpg",revision:"04aae5ba779d6f5637e40c9da4952e57"},{url:"/assets/images/player-backgrounds/33.jpg",revision:"cb273547824cbd6adbd3dc4a19e3741c"},{url:"/assets/images/player-backgrounds/34.jpg",revision:"772bdfc97346e0f4466db4f23aaa986f"},{url:"/assets/images/player-backgrounds/35.jpg",revision:"08635247d80c6eada10efd122a0233ae"},{url:"/assets/images/player-backgrounds/36.jpg",revision:"d941cbfec1db86258d3131c664c6c606"},{url:"/assets/images/player-backgrounds/37.jpg",revision:"4f79166b5886629699c8914996dae8ec"},{url:"/assets/images/player-backgrounds/38.jpg",revision:"428d6030a438a79fda9c3b891c49ab7e"},{url:"/assets/images/player-backgrounds/39.jpg",revision:"81a7227fee4c963573dbd748066e79e4"},{url:"/assets/images/player-backgrounds/40.jpg",revision:"e59c8f21613f90767eacfcf35a1827d2"},{url:"/assets/images/player-backgrounds/41.jpg",revision:"63aeaea733070316bff748bc113a4a46"},{url:"/assets/images/player-backgrounds/42.jpg",revision:"d1875f1d0349c573d3e8cb91f2aadc33"},{url:"/assets/images/player-backgrounds/43.jpg",revision:"e64ed14afdc88195682716c677108b80"},{url:"/assets/images/player-backgrounds/44.jpg",revision:"0c29f86f731632a6ac52703b68ffa274"},{url:"/assets/images/player-backgrounds/45.jpg",revision:"6b061167c6e71f473ee9adc45a7dbf7c"},{url:"/assets/images/player-backgrounds/46.jpg",revision:"d24c8fbd847cba6e0e99c85218daa430"},{url:"/assets/images/player-backgrounds/47.jpg",revision:"9a907a8ecadc4889f604b0a00564d1f9"},{url:"/assets/images/player-backgrounds/48.jpg",revision:"aaf24d179484067bf4bab284c52456dd"},{url:"/assets/images/player-backgrounds/49.jpg",revision:"0d6cffc1fe9c516400a904f8cea606b3"},{url:"/assets/images/player-backgrounds/50.jpg",revision:"dde138765e318791b3e236ab985f9e98"},{url:"/assets/js/531.64d0cbac.js",revision:null},{url:"/assets/js/app.ed6e0fd9.js",revision:null},{url:"/assets/js/chunk-vendors.39539793.js",revision:null},{url:"/assets/romsounds/01.wav",revision:"4187b218123ba4ff5de4e48ad3ee7778"},{url:"/assets/romsounds/02.wav",revision:"a6e40866a7da83a5a6a77c62686b2fa6"},{url:"/assets/romsounds/03.wav",revision:"30f5d254ec6c10bc37f0584e6cb2d0ed"},{url:"/assets/romsounds/04.wav",revision:"626bbd8f569576f18fba702740d731c5"},{url:"/assets/romsounds/05.wav",revision:"dbfbd7f4e2e7670f47dac6f52de3fd98"},{url:"/assets/romsounds/06.wav",revision:"5e68fa08d3621ab451a6daf1d52803b9"},{url:"/assets/romsounds/07.wav",revision:"b17f57be56bb2141660d2a18a497cf69"},{url:"/assets/romsounds/08.wav",revision:"88b1bed69315e657ecaa6e7cdaa032c5"},{url:"/assets/romsounds/09.wav",revision:"39dd16fc0f20240d5347448f9703e42a"},{url:"/assets/romsounds/10.wav",revision:"e0a34f995f013843fb5e552c2dc78a03"},{url:"/assets/romsounds/11.wav",revision:"4b6fd4f4bddcee2ad1987e4c82da9476"},{url:"/assets/romsounds/12.wav",revision:"e0e67a86607a7ad8457c4adefbac50e9"},{url:"/assets/romsounds/13.wav",revision:"d6c8ef577228462c7b90e677396ca652"},{url:"/assets/romsounds/14.wav",revision:"d72e6dd844260adc6db71a04d3763d07"},{url:"/index.html",revision:"85ab911923ea9701b791a84da731eccc"},{url:"/manifest.json",revision:"c1a7314b537716c7416fe56300a68a54"},{url:"/robots.txt",revision:"d98e9ec5fafad691048cbb603b5b0e71"}],{}),s.cleanupOutdatedCaches()})); +if(!self.define){let s,e={};const a=(a,r)=>(a=new URL(a+".js",r).href,e[a]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=a,s.onload=e,document.head.appendChild(s)}else s=a,importScripts(a),e()})).then((()=>{let s=e[a];if(!s)throw new Error(`Module ${a} didn’t register its module`);return s})));self.define=(r,i)=>{const d=s||("document"in self?document.currentScript.src:"")||location.href;if(e[d])return;let c={};const o=s=>a(s,d),n={module:{uri:d},exports:c,require:o};e[d]=Promise.all(r.map((s=>n[s]||o(s)))).then((s=>(i(...s),c)))}}define(["./workbox-ddce758e"],(function(s){"use strict";s.setCacheNameDetails({prefix:"KonomiTV"}),self.addEventListener("message",(s=>{s.data&&"SKIP_WAITING"===s.data.type&&self.skipWaiting()})),s.precacheAndRoute([{url:"/assets/css/app.0d94d05f.css",revision:null},{url:"/assets/css/chunk-vendors.f9d0f5b1.css",revision:null},{url:"/assets/images/account-icon-default.png",revision:"3840f879e0ddf77549f4035ae72e8f6b"},{url:"/assets/images/icon.svg",revision:"63abc49a99bd463af26e73cec607771d"},{url:"/assets/images/icons/apple-touch-icon.png",revision:"a1ff224fdbecfd10c117cd6172799b94"},{url:"/assets/images/icons/favicon-16px.png",revision:"66d1179e73198777a49235a76619a093"},{url:"/assets/images/icons/favicon-32px.png",revision:"85e6e77bb3362197cf564bf9b21ebe12"},{url:"/assets/images/icons/favicon.svg",revision:"1bf40917c217fd567119c219ebabe4b9"},{url:"/assets/images/icons/icon-192px.png",revision:"cc3f0142a77651214f66f0a725253521"},{url:"/assets/images/icons/icon-512px.png",revision:"37175521e6de680e90740ead2506f9fd"},{url:"/assets/images/icons/icon-maskable-192px.png",revision:"291866775902df321181d8dbc66c0d22"},{url:"/assets/images/icons/icon-maskable-512px.png",revision:"d105aac16603bc9e5349fba31bf71cfd"},{url:"/assets/images/logo.svg",revision:"83079d38a7a118e1c80fe28d139991d8"},{url:"/assets/images/player-backgrounds/01.jpg",revision:"14d74db9eb062b39dc128daeba77cb63"},{url:"/assets/images/player-backgrounds/02.jpg",revision:"98e077363a5eec17da30acef5038f924"},{url:"/assets/images/player-backgrounds/03.jpg",revision:"e75e4fc34090286e347cebf12c74b1b8"},{url:"/assets/images/player-backgrounds/04.jpg",revision:"714dd3c050c09a16236f2424c548c83f"},{url:"/assets/images/player-backgrounds/05.jpg",revision:"717125c34121b326e8f90773565f59ca"},{url:"/assets/images/player-backgrounds/06.jpg",revision:"aa3b22785383baf67ad6d53fee94ed1c"},{url:"/assets/images/player-backgrounds/07.jpg",revision:"dc9937f7a374b99981cb0d6c9a642e56"},{url:"/assets/images/player-backgrounds/08.jpg",revision:"b6cedbf1da35814fbf784591380fde62"},{url:"/assets/images/player-backgrounds/09.jpg",revision:"e989450375d6954b37b066a1cec3ad35"},{url:"/assets/images/player-backgrounds/10.jpg",revision:"417128b6120078997139b44ee2c73dbd"},{url:"/assets/images/player-backgrounds/11.jpg",revision:"8c173e2d5980e09dc7b0e36e97b8f189"},{url:"/assets/images/player-backgrounds/12.jpg",revision:"97231a4813562229cc55d4516cb85350"},{url:"/assets/images/player-backgrounds/13.jpg",revision:"6efbebd72cadf7bdd59a0ad5325662d7"},{url:"/assets/images/player-backgrounds/14.jpg",revision:"54d47c83175ed7f11697a2cb3e54e3b1"},{url:"/assets/images/player-backgrounds/15.jpg",revision:"e9cb581540c06a770d299dede678ff0c"},{url:"/assets/images/player-backgrounds/16.jpg",revision:"b7e7ddc4ae9ba3811f3d5c0ae39a073f"},{url:"/assets/images/player-backgrounds/17.jpg",revision:"d363a4b8256115c7505a420ca6a55aae"},{url:"/assets/images/player-backgrounds/18.jpg",revision:"6c4e11b735bf6c95dfa5d47c3ae8e2e2"},{url:"/assets/images/player-backgrounds/19.jpg",revision:"7fdf1e54a13c7e9d34ceb170fb47c26a"},{url:"/assets/images/player-backgrounds/20.jpg",revision:"119ef99d06f809582244c2014ba005aa"},{url:"/assets/images/player-backgrounds/21.jpg",revision:"b83a101c3a856de1728790666e4c0040"},{url:"/assets/images/player-backgrounds/22.jpg",revision:"e6575b88d5aa774dc9b3c53e334c7c04"},{url:"/assets/images/player-backgrounds/23.jpg",revision:"c78d6d5548d8e2ed7b6681a6a29f75bb"},{url:"/assets/images/player-backgrounds/24.jpg",revision:"1da1420c684e6e51a0301b83544cf08c"},{url:"/assets/images/player-backgrounds/25.jpg",revision:"aa51d71045e5f5cc9d3b89daa344b917"},{url:"/assets/images/player-backgrounds/26.jpg",revision:"a8deb2d94eb69f1ccaaede00ba5bb6b7"},{url:"/assets/images/player-backgrounds/27.jpg",revision:"5dde7e046f56139835c5db0c397ea0bd"},{url:"/assets/images/player-backgrounds/28.jpg",revision:"a8027e60652ba8b43f436aba7895a82c"},{url:"/assets/images/player-backgrounds/29.jpg",revision:"e0b12e01312c0e627fb133726e44da8e"},{url:"/assets/images/player-backgrounds/30.jpg",revision:"b1841274afaa34e3f2c73a0bf6546c83"},{url:"/assets/images/player-backgrounds/31.jpg",revision:"89a95df22ca39eb75cf5be6ba869223e"},{url:"/assets/images/player-backgrounds/32.jpg",revision:"04aae5ba779d6f5637e40c9da4952e57"},{url:"/assets/images/player-backgrounds/33.jpg",revision:"cb273547824cbd6adbd3dc4a19e3741c"},{url:"/assets/images/player-backgrounds/34.jpg",revision:"772bdfc97346e0f4466db4f23aaa986f"},{url:"/assets/images/player-backgrounds/35.jpg",revision:"08635247d80c6eada10efd122a0233ae"},{url:"/assets/images/player-backgrounds/36.jpg",revision:"d941cbfec1db86258d3131c664c6c606"},{url:"/assets/images/player-backgrounds/37.jpg",revision:"4f79166b5886629699c8914996dae8ec"},{url:"/assets/images/player-backgrounds/38.jpg",revision:"428d6030a438a79fda9c3b891c49ab7e"},{url:"/assets/images/player-backgrounds/39.jpg",revision:"81a7227fee4c963573dbd748066e79e4"},{url:"/assets/images/player-backgrounds/40.jpg",revision:"e59c8f21613f90767eacfcf35a1827d2"},{url:"/assets/images/player-backgrounds/41.jpg",revision:"63aeaea733070316bff748bc113a4a46"},{url:"/assets/images/player-backgrounds/42.jpg",revision:"d1875f1d0349c573d3e8cb91f2aadc33"},{url:"/assets/images/player-backgrounds/43.jpg",revision:"e64ed14afdc88195682716c677108b80"},{url:"/assets/images/player-backgrounds/44.jpg",revision:"0c29f86f731632a6ac52703b68ffa274"},{url:"/assets/images/player-backgrounds/45.jpg",revision:"6b061167c6e71f473ee9adc45a7dbf7c"},{url:"/assets/images/player-backgrounds/46.jpg",revision:"d24c8fbd847cba6e0e99c85218daa430"},{url:"/assets/images/player-backgrounds/47.jpg",revision:"9a907a8ecadc4889f604b0a00564d1f9"},{url:"/assets/images/player-backgrounds/48.jpg",revision:"aaf24d179484067bf4bab284c52456dd"},{url:"/assets/images/player-backgrounds/49.jpg",revision:"0d6cffc1fe9c516400a904f8cea606b3"},{url:"/assets/images/player-backgrounds/50.jpg",revision:"dde138765e318791b3e236ab985f9e98"},{url:"/assets/js/531.64d0cbac.js",revision:null},{url:"/assets/js/app.86789222.js",revision:null},{url:"/assets/js/chunk-vendors.58a77b3b.js",revision:null},{url:"/assets/romsounds/01.wav",revision:"4187b218123ba4ff5de4e48ad3ee7778"},{url:"/assets/romsounds/02.wav",revision:"a6e40866a7da83a5a6a77c62686b2fa6"},{url:"/assets/romsounds/03.wav",revision:"30f5d254ec6c10bc37f0584e6cb2d0ed"},{url:"/assets/romsounds/04.wav",revision:"626bbd8f569576f18fba702740d731c5"},{url:"/assets/romsounds/05.wav",revision:"dbfbd7f4e2e7670f47dac6f52de3fd98"},{url:"/assets/romsounds/06.wav",revision:"5e68fa08d3621ab451a6daf1d52803b9"},{url:"/assets/romsounds/07.wav",revision:"b17f57be56bb2141660d2a18a497cf69"},{url:"/assets/romsounds/08.wav",revision:"88b1bed69315e657ecaa6e7cdaa032c5"},{url:"/assets/romsounds/09.wav",revision:"39dd16fc0f20240d5347448f9703e42a"},{url:"/assets/romsounds/10.wav",revision:"e0a34f995f013843fb5e552c2dc78a03"},{url:"/assets/romsounds/11.wav",revision:"4b6fd4f4bddcee2ad1987e4c82da9476"},{url:"/assets/romsounds/12.wav",revision:"e0e67a86607a7ad8457c4adefbac50e9"},{url:"/assets/romsounds/13.wav",revision:"d6c8ef577228462c7b90e677396ca652"},{url:"/assets/romsounds/14.wav",revision:"d72e6dd844260adc6db71a04d3763d07"},{url:"/index.html",revision:"7b56641a804e7ec84790e1e203c57f8e"},{url:"/manifest.json",revision:"c1a7314b537716c7416fe56300a68a54"},{url:"/robots.txt",revision:"d98e9ec5fafad691048cbb603b5b0e71"}],{}),s.cleanupOutdatedCaches()})); //# sourceMappingURL=service-worker.js.map diff --git a/client/dist/service-worker.js.map b/client/dist/service-worker.js.map index 76433814..c339a6c2 100644 --- a/client/dist/service-worker.js.map +++ b/client/dist/service-worker.js.map @@ -1 +1 @@ -{"version":3,"file":"service-worker.js","sources":["../../../tmp/e2c644b90e0dd2765f72dd46256d4355/service-worker.js"],"sourcesContent":["import {setCacheNameDetails as workbox_core_setCacheNameDetails} from '/Develop/KonomiTV/client/node_modules/workbox-core/setCacheNameDetails.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Develop/KonomiTV/client/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/Develop/KonomiTV/client/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\nworkbox_core_setCacheNameDetails({prefix: \"KonomiTV\"});\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/assets/css/app.062c7a27.css\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/css/chunk-vendors.f9d0f5b1.css\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/images/account-icon-default.png\",\n \"revision\": \"3840f879e0ddf77549f4035ae72e8f6b\"\n },\n {\n \"url\": \"/assets/images/icon.svg\",\n \"revision\": \"63abc49a99bd463af26e73cec607771d\"\n },\n {\n \"url\": \"/assets/images/icons/apple-touch-icon.png\",\n \"revision\": \"a1ff224fdbecfd10c117cd6172799b94\"\n },\n {\n \"url\": \"/assets/images/icons/favicon-16px.png\",\n \"revision\": \"66d1179e73198777a49235a76619a093\"\n },\n {\n \"url\": \"/assets/images/icons/favicon-32px.png\",\n \"revision\": \"85e6e77bb3362197cf564bf9b21ebe12\"\n },\n {\n \"url\": \"/assets/images/icons/favicon.svg\",\n \"revision\": \"1bf40917c217fd567119c219ebabe4b9\"\n },\n {\n \"url\": \"/assets/images/icons/icon-192px.png\",\n \"revision\": \"cc3f0142a77651214f66f0a725253521\"\n },\n {\n \"url\": \"/assets/images/icons/icon-512px.png\",\n \"revision\": \"37175521e6de680e90740ead2506f9fd\"\n },\n {\n \"url\": \"/assets/images/icons/icon-maskable-192px.png\",\n \"revision\": \"291866775902df321181d8dbc66c0d22\"\n },\n {\n \"url\": \"/assets/images/icons/icon-maskable-512px.png\",\n \"revision\": \"d105aac16603bc9e5349fba31bf71cfd\"\n },\n {\n \"url\": \"/assets/images/logo.svg\",\n \"revision\": \"83079d38a7a118e1c80fe28d139991d8\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/01.jpg\",\n \"revision\": \"14d74db9eb062b39dc128daeba77cb63\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/02.jpg\",\n \"revision\": \"98e077363a5eec17da30acef5038f924\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/03.jpg\",\n \"revision\": \"e75e4fc34090286e347cebf12c74b1b8\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/04.jpg\",\n \"revision\": \"714dd3c050c09a16236f2424c548c83f\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/05.jpg\",\n \"revision\": \"717125c34121b326e8f90773565f59ca\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/06.jpg\",\n \"revision\": \"aa3b22785383baf67ad6d53fee94ed1c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/07.jpg\",\n \"revision\": \"dc9937f7a374b99981cb0d6c9a642e56\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/08.jpg\",\n \"revision\": \"b6cedbf1da35814fbf784591380fde62\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/09.jpg\",\n \"revision\": \"e989450375d6954b37b066a1cec3ad35\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/10.jpg\",\n \"revision\": \"417128b6120078997139b44ee2c73dbd\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/11.jpg\",\n \"revision\": \"8c173e2d5980e09dc7b0e36e97b8f189\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/12.jpg\",\n \"revision\": \"97231a4813562229cc55d4516cb85350\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/13.jpg\",\n \"revision\": \"6efbebd72cadf7bdd59a0ad5325662d7\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/14.jpg\",\n \"revision\": \"54d47c83175ed7f11697a2cb3e54e3b1\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/15.jpg\",\n \"revision\": \"e9cb581540c06a770d299dede678ff0c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/16.jpg\",\n \"revision\": \"b7e7ddc4ae9ba3811f3d5c0ae39a073f\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/17.jpg\",\n \"revision\": \"d363a4b8256115c7505a420ca6a55aae\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/18.jpg\",\n \"revision\": \"6c4e11b735bf6c95dfa5d47c3ae8e2e2\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/19.jpg\",\n \"revision\": \"7fdf1e54a13c7e9d34ceb170fb47c26a\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/20.jpg\",\n \"revision\": \"119ef99d06f809582244c2014ba005aa\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/21.jpg\",\n \"revision\": \"b83a101c3a856de1728790666e4c0040\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/22.jpg\",\n \"revision\": \"e6575b88d5aa774dc9b3c53e334c7c04\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/23.jpg\",\n \"revision\": \"c78d6d5548d8e2ed7b6681a6a29f75bb\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/24.jpg\",\n \"revision\": \"1da1420c684e6e51a0301b83544cf08c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/25.jpg\",\n \"revision\": \"aa51d71045e5f5cc9d3b89daa344b917\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/26.jpg\",\n \"revision\": \"a8deb2d94eb69f1ccaaede00ba5bb6b7\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/27.jpg\",\n \"revision\": \"5dde7e046f56139835c5db0c397ea0bd\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/28.jpg\",\n \"revision\": \"a8027e60652ba8b43f436aba7895a82c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/29.jpg\",\n \"revision\": \"e0b12e01312c0e627fb133726e44da8e\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/30.jpg\",\n \"revision\": \"b1841274afaa34e3f2c73a0bf6546c83\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/31.jpg\",\n \"revision\": \"89a95df22ca39eb75cf5be6ba869223e\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/32.jpg\",\n \"revision\": \"04aae5ba779d6f5637e40c9da4952e57\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/33.jpg\",\n \"revision\": \"cb273547824cbd6adbd3dc4a19e3741c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/34.jpg\",\n \"revision\": \"772bdfc97346e0f4466db4f23aaa986f\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/35.jpg\",\n \"revision\": \"08635247d80c6eada10efd122a0233ae\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/36.jpg\",\n \"revision\": \"d941cbfec1db86258d3131c664c6c606\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/37.jpg\",\n \"revision\": \"4f79166b5886629699c8914996dae8ec\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/38.jpg\",\n \"revision\": \"428d6030a438a79fda9c3b891c49ab7e\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/39.jpg\",\n \"revision\": \"81a7227fee4c963573dbd748066e79e4\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/40.jpg\",\n \"revision\": \"e59c8f21613f90767eacfcf35a1827d2\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/41.jpg\",\n \"revision\": \"63aeaea733070316bff748bc113a4a46\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/42.jpg\",\n \"revision\": \"d1875f1d0349c573d3e8cb91f2aadc33\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/43.jpg\",\n \"revision\": \"e64ed14afdc88195682716c677108b80\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/44.jpg\",\n \"revision\": \"0c29f86f731632a6ac52703b68ffa274\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/45.jpg\",\n \"revision\": \"6b061167c6e71f473ee9adc45a7dbf7c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/46.jpg\",\n \"revision\": \"d24c8fbd847cba6e0e99c85218daa430\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/47.jpg\",\n \"revision\": \"9a907a8ecadc4889f604b0a00564d1f9\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/48.jpg\",\n \"revision\": \"aaf24d179484067bf4bab284c52456dd\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/49.jpg\",\n \"revision\": \"0d6cffc1fe9c516400a904f8cea606b3\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/50.jpg\",\n \"revision\": \"dde138765e318791b3e236ab985f9e98\"\n },\n {\n \"url\": \"/assets/js/531.64d0cbac.js\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/js/app.ed6e0fd9.js\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/js/chunk-vendors.39539793.js\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/romsounds/01.wav\",\n \"revision\": \"4187b218123ba4ff5de4e48ad3ee7778\"\n },\n {\n \"url\": \"/assets/romsounds/02.wav\",\n \"revision\": \"a6e40866a7da83a5a6a77c62686b2fa6\"\n },\n {\n \"url\": \"/assets/romsounds/03.wav\",\n \"revision\": \"30f5d254ec6c10bc37f0584e6cb2d0ed\"\n },\n {\n \"url\": \"/assets/romsounds/04.wav\",\n \"revision\": \"626bbd8f569576f18fba702740d731c5\"\n },\n {\n \"url\": \"/assets/romsounds/05.wav\",\n \"revision\": \"dbfbd7f4e2e7670f47dac6f52de3fd98\"\n },\n {\n \"url\": \"/assets/romsounds/06.wav\",\n \"revision\": \"5e68fa08d3621ab451a6daf1d52803b9\"\n },\n {\n \"url\": \"/assets/romsounds/07.wav\",\n \"revision\": \"b17f57be56bb2141660d2a18a497cf69\"\n },\n {\n \"url\": \"/assets/romsounds/08.wav\",\n \"revision\": \"88b1bed69315e657ecaa6e7cdaa032c5\"\n },\n {\n \"url\": \"/assets/romsounds/09.wav\",\n \"revision\": \"39dd16fc0f20240d5347448f9703e42a\"\n },\n {\n \"url\": \"/assets/romsounds/10.wav\",\n \"revision\": \"e0a34f995f013843fb5e552c2dc78a03\"\n },\n {\n \"url\": \"/assets/romsounds/11.wav\",\n \"revision\": \"4b6fd4f4bddcee2ad1987e4c82da9476\"\n },\n {\n \"url\": \"/assets/romsounds/12.wav\",\n \"revision\": \"e0e67a86607a7ad8457c4adefbac50e9\"\n },\n {\n \"url\": \"/assets/romsounds/13.wav\",\n \"revision\": \"d6c8ef577228462c7b90e677396ca652\"\n },\n {\n \"url\": \"/assets/romsounds/14.wav\",\n \"revision\": \"d72e6dd844260adc6db71a04d3763d07\"\n },\n {\n \"url\": \"/index.html\",\n \"revision\": \"85ab911923ea9701b791a84da731eccc\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"c1a7314b537716c7416fe56300a68a54\"\n },\n {\n \"url\": \"/robots.txt\",\n \"revision\": \"d98e9ec5fafad691048cbb603b5b0e71\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\n\n\n\n\n"],"names":["workbox_core_setCacheNameDetails","prefix","self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches"],"mappings":"0nBAkBAA,EAAAA,oBAAiC,CAACC,OAAQ,aAG1CC,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACP,IAWFC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,+BACPC,SAAY,MAEd,CACED,IAAO,yCACPC,SAAY,MAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,MAEd,CACED,IAAO,6BACPC,SAAY,MAEd,CACED,IAAO,uCACPC,SAAY,MAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,iBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,qCAEb,CAAE,GACLC,EAAAA"} \ No newline at end of file +{"version":3,"file":"service-worker.js","sources":["../../../tmp/90034188c68a778203ce6118190802f5/service-worker.js"],"sourcesContent":["import {setCacheNameDetails as workbox_core_setCacheNameDetails} from '/Develop/KonomiTV/client/node_modules/workbox-core/setCacheNameDetails.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Develop/KonomiTV/client/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/Develop/KonomiTV/client/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\nworkbox_core_setCacheNameDetails({prefix: \"KonomiTV\"});\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/assets/css/app.0d94d05f.css\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/css/chunk-vendors.f9d0f5b1.css\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/images/account-icon-default.png\",\n \"revision\": \"3840f879e0ddf77549f4035ae72e8f6b\"\n },\n {\n \"url\": \"/assets/images/icon.svg\",\n \"revision\": \"63abc49a99bd463af26e73cec607771d\"\n },\n {\n \"url\": \"/assets/images/icons/apple-touch-icon.png\",\n \"revision\": \"a1ff224fdbecfd10c117cd6172799b94\"\n },\n {\n \"url\": \"/assets/images/icons/favicon-16px.png\",\n \"revision\": \"66d1179e73198777a49235a76619a093\"\n },\n {\n \"url\": \"/assets/images/icons/favicon-32px.png\",\n \"revision\": \"85e6e77bb3362197cf564bf9b21ebe12\"\n },\n {\n \"url\": \"/assets/images/icons/favicon.svg\",\n \"revision\": \"1bf40917c217fd567119c219ebabe4b9\"\n },\n {\n \"url\": \"/assets/images/icons/icon-192px.png\",\n \"revision\": \"cc3f0142a77651214f66f0a725253521\"\n },\n {\n \"url\": \"/assets/images/icons/icon-512px.png\",\n \"revision\": \"37175521e6de680e90740ead2506f9fd\"\n },\n {\n \"url\": \"/assets/images/icons/icon-maskable-192px.png\",\n \"revision\": \"291866775902df321181d8dbc66c0d22\"\n },\n {\n \"url\": \"/assets/images/icons/icon-maskable-512px.png\",\n \"revision\": \"d105aac16603bc9e5349fba31bf71cfd\"\n },\n {\n \"url\": \"/assets/images/logo.svg\",\n \"revision\": \"83079d38a7a118e1c80fe28d139991d8\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/01.jpg\",\n \"revision\": \"14d74db9eb062b39dc128daeba77cb63\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/02.jpg\",\n \"revision\": \"98e077363a5eec17da30acef5038f924\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/03.jpg\",\n \"revision\": \"e75e4fc34090286e347cebf12c74b1b8\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/04.jpg\",\n \"revision\": \"714dd3c050c09a16236f2424c548c83f\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/05.jpg\",\n \"revision\": \"717125c34121b326e8f90773565f59ca\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/06.jpg\",\n \"revision\": \"aa3b22785383baf67ad6d53fee94ed1c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/07.jpg\",\n \"revision\": \"dc9937f7a374b99981cb0d6c9a642e56\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/08.jpg\",\n \"revision\": \"b6cedbf1da35814fbf784591380fde62\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/09.jpg\",\n \"revision\": \"e989450375d6954b37b066a1cec3ad35\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/10.jpg\",\n \"revision\": \"417128b6120078997139b44ee2c73dbd\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/11.jpg\",\n \"revision\": \"8c173e2d5980e09dc7b0e36e97b8f189\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/12.jpg\",\n \"revision\": \"97231a4813562229cc55d4516cb85350\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/13.jpg\",\n \"revision\": \"6efbebd72cadf7bdd59a0ad5325662d7\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/14.jpg\",\n \"revision\": \"54d47c83175ed7f11697a2cb3e54e3b1\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/15.jpg\",\n \"revision\": \"e9cb581540c06a770d299dede678ff0c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/16.jpg\",\n \"revision\": \"b7e7ddc4ae9ba3811f3d5c0ae39a073f\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/17.jpg\",\n \"revision\": \"d363a4b8256115c7505a420ca6a55aae\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/18.jpg\",\n \"revision\": \"6c4e11b735bf6c95dfa5d47c3ae8e2e2\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/19.jpg\",\n \"revision\": \"7fdf1e54a13c7e9d34ceb170fb47c26a\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/20.jpg\",\n \"revision\": \"119ef99d06f809582244c2014ba005aa\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/21.jpg\",\n \"revision\": \"b83a101c3a856de1728790666e4c0040\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/22.jpg\",\n \"revision\": \"e6575b88d5aa774dc9b3c53e334c7c04\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/23.jpg\",\n \"revision\": \"c78d6d5548d8e2ed7b6681a6a29f75bb\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/24.jpg\",\n \"revision\": \"1da1420c684e6e51a0301b83544cf08c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/25.jpg\",\n \"revision\": \"aa51d71045e5f5cc9d3b89daa344b917\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/26.jpg\",\n \"revision\": \"a8deb2d94eb69f1ccaaede00ba5bb6b7\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/27.jpg\",\n \"revision\": \"5dde7e046f56139835c5db0c397ea0bd\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/28.jpg\",\n \"revision\": \"a8027e60652ba8b43f436aba7895a82c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/29.jpg\",\n \"revision\": \"e0b12e01312c0e627fb133726e44da8e\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/30.jpg\",\n \"revision\": \"b1841274afaa34e3f2c73a0bf6546c83\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/31.jpg\",\n \"revision\": \"89a95df22ca39eb75cf5be6ba869223e\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/32.jpg\",\n \"revision\": \"04aae5ba779d6f5637e40c9da4952e57\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/33.jpg\",\n \"revision\": \"cb273547824cbd6adbd3dc4a19e3741c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/34.jpg\",\n \"revision\": \"772bdfc97346e0f4466db4f23aaa986f\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/35.jpg\",\n \"revision\": \"08635247d80c6eada10efd122a0233ae\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/36.jpg\",\n \"revision\": \"d941cbfec1db86258d3131c664c6c606\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/37.jpg\",\n \"revision\": \"4f79166b5886629699c8914996dae8ec\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/38.jpg\",\n \"revision\": \"428d6030a438a79fda9c3b891c49ab7e\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/39.jpg\",\n \"revision\": \"81a7227fee4c963573dbd748066e79e4\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/40.jpg\",\n \"revision\": \"e59c8f21613f90767eacfcf35a1827d2\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/41.jpg\",\n \"revision\": \"63aeaea733070316bff748bc113a4a46\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/42.jpg\",\n \"revision\": \"d1875f1d0349c573d3e8cb91f2aadc33\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/43.jpg\",\n \"revision\": \"e64ed14afdc88195682716c677108b80\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/44.jpg\",\n \"revision\": \"0c29f86f731632a6ac52703b68ffa274\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/45.jpg\",\n \"revision\": \"6b061167c6e71f473ee9adc45a7dbf7c\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/46.jpg\",\n \"revision\": \"d24c8fbd847cba6e0e99c85218daa430\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/47.jpg\",\n \"revision\": \"9a907a8ecadc4889f604b0a00564d1f9\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/48.jpg\",\n \"revision\": \"aaf24d179484067bf4bab284c52456dd\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/49.jpg\",\n \"revision\": \"0d6cffc1fe9c516400a904f8cea606b3\"\n },\n {\n \"url\": \"/assets/images/player-backgrounds/50.jpg\",\n \"revision\": \"dde138765e318791b3e236ab985f9e98\"\n },\n {\n \"url\": \"/assets/js/531.64d0cbac.js\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/js/app.86789222.js\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/js/chunk-vendors.58a77b3b.js\",\n \"revision\": null\n },\n {\n \"url\": \"/assets/romsounds/01.wav\",\n \"revision\": \"4187b218123ba4ff5de4e48ad3ee7778\"\n },\n {\n \"url\": \"/assets/romsounds/02.wav\",\n \"revision\": \"a6e40866a7da83a5a6a77c62686b2fa6\"\n },\n {\n \"url\": \"/assets/romsounds/03.wav\",\n \"revision\": \"30f5d254ec6c10bc37f0584e6cb2d0ed\"\n },\n {\n \"url\": \"/assets/romsounds/04.wav\",\n \"revision\": \"626bbd8f569576f18fba702740d731c5\"\n },\n {\n \"url\": \"/assets/romsounds/05.wav\",\n \"revision\": \"dbfbd7f4e2e7670f47dac6f52de3fd98\"\n },\n {\n \"url\": \"/assets/romsounds/06.wav\",\n \"revision\": \"5e68fa08d3621ab451a6daf1d52803b9\"\n },\n {\n \"url\": \"/assets/romsounds/07.wav\",\n \"revision\": \"b17f57be56bb2141660d2a18a497cf69\"\n },\n {\n \"url\": \"/assets/romsounds/08.wav\",\n \"revision\": \"88b1bed69315e657ecaa6e7cdaa032c5\"\n },\n {\n \"url\": \"/assets/romsounds/09.wav\",\n \"revision\": \"39dd16fc0f20240d5347448f9703e42a\"\n },\n {\n \"url\": \"/assets/romsounds/10.wav\",\n \"revision\": \"e0a34f995f013843fb5e552c2dc78a03\"\n },\n {\n \"url\": \"/assets/romsounds/11.wav\",\n \"revision\": \"4b6fd4f4bddcee2ad1987e4c82da9476\"\n },\n {\n \"url\": \"/assets/romsounds/12.wav\",\n \"revision\": \"e0e67a86607a7ad8457c4adefbac50e9\"\n },\n {\n \"url\": \"/assets/romsounds/13.wav\",\n \"revision\": \"d6c8ef577228462c7b90e677396ca652\"\n },\n {\n \"url\": \"/assets/romsounds/14.wav\",\n \"revision\": \"d72e6dd844260adc6db71a04d3763d07\"\n },\n {\n \"url\": \"/index.html\",\n \"revision\": \"7b56641a804e7ec84790e1e203c57f8e\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"c1a7314b537716c7416fe56300a68a54\"\n },\n {\n \"url\": \"/robots.txt\",\n \"revision\": \"d98e9ec5fafad691048cbb603b5b0e71\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\n\n\n\n\n"],"names":["workbox_core_setCacheNameDetails","prefix","self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches"],"mappings":"0nBAkBAA,EAAAA,oBAAiC,CAACC,OAAQ,aAG1CC,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACP,IAWFC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,+BACPC,SAAY,MAEd,CACED,IAAO,yCACPC,SAAY,MAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,sCACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,2CACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,MAEd,CACED,IAAO,6BACPC,SAAY,MAEd,CACED,IAAO,uCACPC,SAAY,MAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,iBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,qCAEb,CAAE,GACLC,EAAAA"} \ No newline at end of file