{"version":3,"sources":["jsdelivr-header.js","/npm/node_modules/knockout/build/output/knockout-latest.js","/npm/@vivliostyle/viewer@2.40.0/src/models/page-style.ts","/npm/node_modules/i18next-ko/lib/i18next-ko.bundle.js","/npm/node_modules/fast-diff/diff.js","/npm/@vivliostyle/core/src/vivliostyle.ts","/npm/@vivliostyle/core/src/vivliostyle/constants.ts","/npm/@vivliostyle/core/src/vivliostyle/logging.ts","/npm/@vivliostyle/core/src/vivliostyle/plugin.ts","/npm/@vivliostyle/core/src/vivliostyle/profile.ts","/npm/@vivliostyle/core/src/vivliostyle/base.ts","/npm/@vivliostyle/core/src/vivliostyle/cfi.ts","/npm/@vivliostyle/core/src/vivliostyle/exprs.ts","/npm/@vivliostyle/core/src/vivliostyle/css.ts","/npm/@vivliostyle/core/src/vivliostyle/cmyk-store.ts","/npm/@vivliostyle/core/src/vivliostyle/geometry-util.ts","/npm/@vivliostyle/core/src/vivliostyle/css-prop.ts","/npm/@vivliostyle/core/src/vivliostyle/counters.ts","/npm/@vivliostyle/core/src/vivliostyle/css-tokenizer.ts","/npm/@vivliostyle/core/src/vivliostyle/task.ts","/npm/@vivliostyle/core/src/vivliostyle/task-util.ts","/npm/@vivliostyle/core/src/vivliostyle/assets.ts","/npm/@vivliostyle/core/src/vivliostyle/net.ts","/npm/@vivliostyle/core/src/vivliostyle/css-parser.ts","/npm/@vivliostyle/core/src/vivliostyle/css-logical-util.ts","/npm/@vivliostyle/core/src/vivliostyle/sizing.ts","/npm/@vivliostyle/core/src/vivliostyle/break.ts","/npm/@vivliostyle/core/src/vivliostyle/diff.ts","/npm/@vivliostyle/core/src/vivliostyle/types.ts","/npm/@vivliostyle/core/src/vivliostyle/vtree.ts","/npm/@vivliostyle/core/src/vivliostyle/page-floats.ts","/npm/@vivliostyle/core/src/vivliostyle/footnotes.ts","/npm/@vivliostyle/core/src/vivliostyle/display.ts","/npm/@vivliostyle/core/src/vivliostyle/layout-helper.ts","/npm/@vivliostyle/core/src/vivliostyle/break-position.ts","/npm/@vivliostyle/core/src/vivliostyle/layout-processor.ts","/npm/@vivliostyle/core/src/vivliostyle/layout-retryers.ts","/npm/@vivliostyle/core/src/vivliostyle/layout-util.ts","/npm/@vivliostyle/core/src/vivliostyle/shared.ts","/npm/@vivliostyle/core/src/vivliostyle/matchers.ts","/npm/@vivliostyle/core/src/vivliostyle/css-cascade.ts","/npm/@vivliostyle/core/src/vivliostyle/text-polyfill.ts","/npm/@vivliostyle/core/src/vivliostyle/pseudo-element.ts","/npm/@vivliostyle/core/src/vivliostyle/layout.ts","/npm/@vivliostyle/core/src/vivliostyle/repetitive-element.ts","/npm/@vivliostyle/core/src/vivliostyle/table.ts","/npm/@vivliostyle/core/src/vivliostyle/math-util.ts","/npm/@vivliostyle/core/src/vivliostyle/columns.ts","/npm/@vivliostyle/core/src/vivliostyle/counter-style.ts","/npm/@vivliostyle/core/src/vivliostyle/css-styler.ts","/npm/@vivliostyle/core/src/vivliostyle/css-validator.ts","/npm/@vivliostyle/core/src/vivliostyle/font.ts","/npm/@vivliostyle/core/src/vivliostyle/page-master.ts","/npm/@vivliostyle/core/src/vivliostyle/css-page.ts","/npm/@vivliostyle/core/src/vivliostyle/scripts.ts","/npm/@vivliostyle/core/src/vivliostyle/urls.ts","/npm/@vivliostyle/core/src/vivliostyle/vgen.ts","/npm/@vivliostyle/core/src/vivliostyle/xml-doc.ts","/npm/@vivliostyle/core/src/vivliostyle/ops.ts","/npm/@vivliostyle/core/src/vivliostyle/toc.ts","/npm/@vivliostyle/core/src/vivliostyle/epub.ts","/npm/@vivliostyle/core/src/vivliostyle/adaptive-viewer.ts","/npm/@vivliostyle/core/src/vivliostyle/core-viewer.ts","/npm/@vivliostyle/core/src/vivliostyle/print.ts","/npm/@vivliostyle/viewer@2.40.0/src/utils/string-util.ts","/npm/@vivliostyle/viewer@2.40.0/src/stores/url-parameters.ts","/npm/@vivliostyle/viewer@2.40.0/src/models/document-options.ts","/npm/@vivliostyle/viewer@2.40.0/src/models/page-view-mode.ts","/npm/@vivliostyle/viewer@2.40.0/src/models/zoom-options.ts","/npm/@vivliostyle/viewer@2.40.0/src/models/viewer-options.ts","/npm/@vivliostyle/viewer@2.40.0/src/models/message-queue.ts","/npm/@vivliostyle/viewer@2.40.0/src/logging/logger.ts","/npm/@vivliostyle/viewer@2.40.0/src/utils/observable-util.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/viewer.ts","/npm/@vivliostyle/viewer@2.40.0/src/utils/key-util.ts","/npm/@vivliostyle/viewer@2.40.0/src/utils/scale-util.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/marks-store.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/navigation.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/settings-panel.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/find-box.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/message-dialog.ts","/npm/@vivliostyle/viewer@2.40.0/src/viewmodels/viewer-app.ts","/npm/@vivliostyle/viewer@2.40.0/src/bindings/menuButton.ts","/npm/@vivliostyle/viewer@2.40.0/src/bindings/swipePages.ts","/npm/@vivliostyle/viewer@2.40.0/src/bindings/textSelection.ts","/npm/@vivliostyle/viewer@2.40.0/src/bindings/clickOutside.ts","/npm/@vivliostyle/viewer@2.40.0/src/bindings/i18n.ts","/npm/@vivliostyle/viewer@2.40.0/src/vivliostyle-viewer.ts","/npm/@vivliostyle/viewer@2.40.0/src/main.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;mPCAa,SAAU,GAAG,IAAI,EAAE,SAAS,MAAM,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,oBAAqB,SAAS,EAAE,QAAQ,SAAU,GAA8H,EAAE,EAAO,SAAS,EAAoB,CAA9K,EAAgL,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,OAAO,OAAO,UAAU,KAAK,IAAE,IAAI,CAAI,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,WAAW,IAAI,EAAE,EAAE,EAAE,YAAW,WAAW,EAAE,EAAE,GAAG,GAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,WAAW,aAAa,GAClhB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,WAAW,EAAE,iBAAiB,EAAE,KAAK,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC,SAAS,EAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAG,EAAE,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAqBlO,EAAY,EAA2B,EAAmD,EAAiD,EAAqG,EArBV,WAAuB,EAAE,EAAE,CAAE,EAAC,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,MAAM,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,QAAQ,EAAE,EAAE,UAC5e,EAAE,SAAS,EAAE,QAAQ,CAAC,gBAAgB,uBAAuB,0BAA0B,EAAE,EAAE,WAAW,SAAS,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,GAAiB,OAAd,EAAE,UAAU,EAAS,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,IAAG,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAG,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,UAAU,eAAe,EAAE,CAAC,UAAU,cAAc,MAAM,EAAE,mBAAoB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,cAAc,KAAK,EAAE,WAC3f,gBAAgB,YAAY,CAAC,QAAQ,UAAU,YAAY,EAAE,YAAY,sFAAsF,MAAM,KAAK,EAAE,GAAE,SAAS,EAAE,GAAG,GAAG,EAAE,OAAO,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,IAAG,IAA+M,EAA3M,EAAE,CAAC,mBAAmB,EAAE,GAAG,WAAW,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,cAAc,OAAO,EAAE,EAAE,qBAAqB,KAAK,EAAE,UAAU,uBAAuB,EAAE,2BAA2B,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,CAAnK,GAAuK,EAAE,OAAS,MAAM,CAAC,GAAG,CAAC,qBAAqB,sCACpe,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,mBAAmB,MAAM,UAAU,QAAQ,SAAS,EAAE,GAAG,OAAO,MAAM,UAAU,QAAQ,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,GAAoD,OAAjD,GAAG,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAU,CAAC,EAAE,GAAG,SAAS,EACzf,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,aAAa,MAAM,EAAE,KAAK,MAAM,EAAE,QAAQ,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAS,EAAL,EAAE,GAAK,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GACrf,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,SAAS,GAAe,IAAI,IAAI,IAApB,EAAE,EAAE,EAAE,GAAG,IAAgB,IAAI,EAAE,GAAG,eAAe,GAAG,cAAc,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,cAAc,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,GAAa,GAAV,EAAE,EAAE,GAAG,GAAM,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,GACnf,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,GAAO,IAAJ,EAAE,EAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,GAAG,aAAa,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,aAAa,GAAG,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,aAAa,WAAW,GAAG,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,KAClf,EAAE,OAAO,EAAE,WAAW,QAAQ,yBAAyB,GAAG,EAAE,GAAG,SAAS,EAAE,GAAW,OAAR,EAAE,GAAG,KAAU,EAAE,OAAO,EAAE,SAAU,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,SAAS,GAAG,EAAE,SAAS,OAAO,EAAE,SAAS,IAAI,EAAE,SAAS,EAAE,WAAW,GAAG,GAAG,EAAE,wBAAwB,QAAO,IAAK,EAAE,wBAAwB,IAAO,KAAK,GAAG,GAAG,GAAG,EAAE,EAAE,WAAW,QAAQ,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,cAAc,gBAAgB,EAAE,GAAG,SAAS,GAAG,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,GAAG,OAAO,GAC7f,EAAE,SAAS,EAAE,QAAQ,aAAa,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,QAAQ,WAAW,IAAI,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,CAAE,CAAC,EAAE,CAAC,EAAE,WAAW,SAAS,EAAE,GAAG,OAAO,WAAW,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,YAAW,WAAmC,MAAxB,EAAE,SAAS,EAAE,QAAQ,GAAS,CAAE,GAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,GAAU,GAAP,EAAE,EAAE,GAAM,EAAE,QAAQ,qBAAqB,IAAI,EAAE,GAAG,GAAG,mBAAmB,EAAE,iBAAiB,aAAuB,EAAE,YACxY,MAAM,MAAM,2DADyY,IAAI,EAAE,SAAS,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,YAAY,EAC9f,GAAG,EAAE,EAAE,EAAE,GAAG,GAAE,WAAW,EAAE,YAAY,EAAE,EAAE,GAA8E,MAAM,EAAE,iBAAiB,EAAE,WAAW,IAAI,EAAE,mBAAmB,EAAE,GAAG,GAAG,KAAK,QAAQ,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,SAAS,MAAM,MAAM,wDAAwD,IAAI,EAAmG,GAAlC,IAA/D,UAAU,EAAE,EAAE,EAAE,KAAI,EAAE,MAAM,SAAS,EAAE,eAA0B,aAAX,EAAE,EAAE,OAAsB,SAAS,GAAW,EAAE,QAAQ,sBAAsB,GAAG,EAAE,GAAG,mBAAmB,EAAE,YAAY,IAAG,mBAClf,EAAE,cAA2H,MAAM,MAAM,uDAAzH,EAAE,EAAE,YAAY,EAAE,IAAI,eAAgB,UAAU,MAAE,EAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAE,GAAG,GAAG,EAAM,EAAE,GAAG,EAAE,cAAc,EAAyE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,YAAa,aAAuB,EAAE,UAAmC,MAAM,MAAM,6CAArC,EAAE,UAAU,KAAK,EAAgE,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,iBAAkB,EAAE,WAC5e,EAAE,EAAE,UAAU,EAAE,MAAM,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,IAAG,SAAS,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAI,iBAAkB,EAAE,UAAU,QAAQ,EAAE,EAAE,UAAU,UAAU,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAM,OAAO,GAAG,IAAI,IAAE,EAAE,IAAG,IAAI,EAAE,EAAE,EAAE,WAAW,IAAI,GAAG,GAAG,EAAE,UAAU,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,eAAe,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,EAAE,GAAY,GAAT,EAAE,KAAK,EAAK,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,QAAQ,YAAW,SAAS,GAAG,MAAM,KAAK,EAAE,WAAW,GAAG,GAAG,IAAG,EAAE,gBAAgB,EAAE,cAAc,gBAC9f,EAAE,UAAU,CAAC,MAAM,IAAI,EAAE,GAAG,SAAS,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,YAAa,QAAQ,EAAE,MAAM,KAAK,EAAE,MAAM,KAAM,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,qBAAqB,UAAU,OAAO,EAAE,EAAE,GAAG,EAAE,qBAAqB,cAClgB,EAAE,iBAAiB,EAAE,SAAS,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,GAAG,SAAS,GAAG,MAAM,iBAAiB,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,IAAK,SAAS,UAAU,EAAxB,GAA8B,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,UAAU,MAAM,MAAM,4MACtT,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAW,IAAI,GAAZ,EAAE,GAAG,IAAW,QAAQ,CAAE,EAAC,EAAE,EAAE,eAAe,KAAK,GAAG,EAAE,EAAE,GAAG,iBAAiB,GAAG,SAAS,EAAE,EAAE,EAAE,GAAO,CAAI,EAAE,EAAE,OAAZ,IAAI,IAAe,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,KAA5E,CAAkF,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,QAA0D,IAAI,IAAI,KAA1D,EAAE,MAAM,QAAQ,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,OAAoB,GAAE,EAAE,EAAE,cAAc,UAAW,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,EAAE,GAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,SAC3f,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,IAAG,EAAE,KAAK,YAAY,GAAG,EAAE,UAAU,EAAE,UAAU,GAAG,EAAE,SAAS,YAAW,WAAW,EAAE,WAAW,YAAY,EAAE,GAAE,EAAE,EAAE,CAd9E,GAckF,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,EAAE,+BAA+B,EAAE,EAAE,IAAI,EAAE,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,EAAE,wBAAwB,EAAE,EAAE,IAAI,EAAE,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,EAAE,6BAC7e,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,EAAE,mCAAmC,EAAE,EAAE,IAAI,EAAE,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,EAAE,uBAAuB,EAAE,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,EAAE,6BAA6B,EAAE,EAAE,GAAG,EAAE,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,EAAE,yBAAyB,EAAE,EAAE,GAAG,EAAE,EAAE,sBAAsB,EAAE,EAAE,GAAG,EAAE,EAAE,wBAC5e,EAAE,EAAE,IAAI,EAAE,EAAE,uBAAuB,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,UAAU,OAAO,SAAS,UAAU,KAAK,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,UAAU,OAAO,OAAO,WAAW,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,UAAU,MAAM,KAAK,UAAU,GAAG,OAAO,WAAW,IAAI,EAAE,EAAE,MAAM,GAA6B,OAA1B,EAAE,KAAK,MAAM,EAAE,WAAkB,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,WAAW,IAA6C,EAAE,EAA3C,EAAE,EAAE,EAAE,cAAc,MAAM,UAAU,EAAE,CAAE,EACvN,OAD4N,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,SAAS,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,GACpf,CAAE,EAAC,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,GAAG,QAAO,WAAU,EAAE,GAAG,EAAE,GAAG,QAAW,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAsB,OAAlB,GAAG,IAAI,EAAE,EAAE,GAAG,IAAW,CAAC,EAAE,EAAE,SAAS,GAAG,QAAO,EAAE,YAAW,EAAE,MAAS,GAAS,CAAC,IAAI,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAa,OAAV,EAAE,EAAE,OAAe,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,WAAW,OAAO,IAAK,CAAC,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,WAAW,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GACjd,OAAlC,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAW,CAAC,CAAC,SAAS,EAAE,GAAiB,GAAV,EAAE,EAAE,MAAW,IAAI,IAAI,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,kBAAkB,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,cAAc,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,IAAS,EAAL,EAAE,GAAK,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,KAAI,GAAG,IAAI,EAAE,GAAG,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,GAAE,KAAK,MAAM,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,KAAK,MAAM,MAAM,CAAC,GAAG,SAAS,EAAE,GAAG,GAAG,mBAAmB,EAAE,MAAM,MAAM,+BAA+B,EAAE,MAAM,KAAK,EAAE,EAAE,GAAG,SAAS,EAC7f,GAAG,IAAI,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,GAA0F,OAAvF,EAAE,EAAE,GAAE,WAAW,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,qBAAqB,MAAM,IAAU,CAAC,EAAE,WAAW,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,WAAW,YAAY,EAAE,EAAE,kBAAkB,SAAS,GAAG,GAAG,mBAAmB,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,wBAAwB,EAAE,EAAE,GAAG,EAAE,EAAE,2CACxd,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,8CAA8C,EAAE,EAAE,EAAE,IAAoB,EAAE,CAAC,EAAE,GAAG,IAAmI,EAAE,CAAC,MAAlI,EAAE,CAAC,EAAE,UAAU,YAA2H,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,iBAAiB,oBAAoB,GAA1K,EAAE,CAAC,EAAE,qBAAqB,yBAAqJ,GAAG,EAAE,OAAjI,EAAE,CAAC,EAAE,+BAA+B,aAAsG,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,GAAE,GAAG,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,KAAK,EAAE,WAAW,UAAU,EAAE,EAAE,WACtf,EAAE,YAAY,EAAE,WAAW,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAO,EAAE,EAAE,cAAc,EAAE,aAAa,EAArC,IAA0F,EAAnD,EAAE,EAAE,EAAE,GAAG,GAAG,cAAc,EAAE,EAAE,cAAc,OAAkQ,IAAzP,GAAG,EAAE,EAAE,MAAM,+CAA+C,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,KAAK,GAAG,EAAE,KAAK,YAAY,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,YAAY,IAAS,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EACvf,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAwB,GAArB,EAAE,EAAE,GAAG,GAAiB,QAAd,EAAE,EAAE,EAAE,EAAE,KAAgB,IAAI,EAAE,GAAG,iBAAiB,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,YAAY,EAAE,GAAG,EAAM,EAAE,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,GAAG,WAAW,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,SAAqC,OAAvB,EAAE,EAAE,GAAG,GAAG,EAAE,aAAoB,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,GACrf,EAAE,CAAC,IAAI,EAAE,CAAE,EAAC,MAAM,CAAC,GAAG,SAAS,GAAG,GAAG,mBAAmB,EAAE,MAAM,MAAM,4DAA4D,IAAI,GAAG,YAAY,EAAE,KAAK,UAAU,GAAG,SAAS,IAAI,UAAU,IAAI,YAAY,EAAE,KAAK,UAAU,GAAG,SAAS,IAAI,UAAU,GAAU,OAAP,EAAE,GAAG,EAAQ,mBAAmB,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,MAAM,kCAAkC,EAAE,2CAA2C,IAAI,OAAO,EAAE,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EACxf,GAAG,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,YAAY,EAAE,WAAW,YAAY,EAAE,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,EAAE,MAAM,yBAAyB,EAAE,GAAG,IAAI,EAAE,CAFoG,GAEhG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,sBAAsB,EAAE,GAAG,IAAI,EAAE,EAAE,wBAAwB,EAAE,GAAG,IAAI,EAAE,EAAE,4BAA4B,EAAE,GAAG,IAAI,EAAE,EAAE,6CAA6C,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,SAAS,IAAI,GAAG,EAAE,IAAI,IAAY,EAAR,EAAE,EAAE,EAAE,EAAI,EAAE,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,OACrf,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,yCAAyC,EAAE,kBAAkB,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EACpG,OADyH,EAAnB,EAAE,iBAAmB,SAAS,GAAG,IAAI,EAAE,EAAE,cAAc,OAA4D,OAArD,IAAK,iBAAiB,GAAI,QAAQ,EAAE,CAAC,gBAAuB,WAAW,EAAE,UAAU,OAAO,MAAM,CAAC,CAA1I,CAA4I,GAAK,GAAG,uBAAuB,EAAE,cAAc,UAAU,SAAS,GAAG,IAAI,EAAE,EAAE,cAAc,UAAU,EAAE,mBAAmB,WAAW,EAAE,mBAAmB,KAAK,EAAE,gBAAgB,YAAY,GAC/gB,EAAE,KAAK,GAAG,EAAE,EAAE,gBAAgB,YAAY,EAAE,EAAE,SAAS,GAAG,WAAW,EAAE,EAAE,EAAQ,CAAC,UAAU,EAAE,GAAG,SAAS,GAAiC,OAA9B,GAAG,EAAE,GAAG,UAAU,GAAG,EAAE,KAAK,EAAS,GAAG,EAAE,OAAO,SAAS,IAAG,GAAK,EAAE,IAAM,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,gBAAgB,WAAW,IAAI,EAAE,EAAE,EAAiB,OAAf,EAAE,EAAE,EAAE,OAAO,EAAS,CAAC,EAAE,GAAG,EAAE,CAF4J,GAExJ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,SAAS,SAAS,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,SAAS,GAAG,aAAa,GAAG,EAAE,EAAE,EAAE,YAAW,WAAW,EAAE,EAAE,GACrf,EAAE,GAAG,EAAE,UAAU,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,yBAAyB,EAAE,EAAE,EAAE,EAAE,IAAG,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE,GAAE,EAAE,SAAS,SAAS,EAAE,GAAG,QAAQ,EAAE,MAAM,MAAM,yHAAyH,EAAE,KAAK,EAAE,MAAM,EAAE,IAAG,SAAS,GAAG,IAAI,EAAE,KAAK,OAAO,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,kBAAkB,EAAE,QAAQ,CAAC,QAAQ,IACjf,CAAC,CAAC,CAAC,IAAG,EAAE,OAAO,SAAS,EAAE,GAAG,EAAE,iBAAiB,UAAU,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,UAAU,EAAE,QAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,EAAE,KAAK,UAAU,KAAK,GAAG,EAAE,EAAE,KAAK,2BAA2B,KAAK,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,WAAW,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,SAAS,GAAG,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,MAAM,EACngB,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,GAAG,GAAE,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAoD,OAAjD,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,KAAK,GAAU,CAAC,EAAE,kBAAkB,SAAS,EAAE,GAAyC,GAAxB,YAAd,EAAE,GAAG,WAAuB,KAAK,KAAQ,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,KAAK,IAAI,KAAK,EAAE,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,KAAK,IAAI,IAAQ,EAAJ,EAAE,EAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,WAAW,OAAO,KAAK,EAAE,EAC3f,GAAG,SAAS,GAAG,OAAO,KAAK,OAAO,CAAC,EAAE,GAAG,aAAa,KAAK,EAAE,EAAE,GAAG,SAAS,GAAG,IAAoB,EAAE,EAAE,EAAE,EAAE,EAAxB,EAAE,KAAK,EAAE,EAAE,EAAE,GAAa,EAAE,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,EAAE,GAAE,WAAW,EAAE,MAAM,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,IAAG,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,GAAG,WAAW,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,EAAE,EAAE,SAAS,KAAK,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,MAAM,EAC3f,GAAG,SAAS,GAAG,GAAG,EAAE,OAAO,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAA0D,OAAxD,EAAE,EAAE,EAAE,KAAK,GAAE,SAAS,EAAE,GAAG,UAAU,IAAI,GAAG,EAAE,OAAO,IAAU,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,KAAK,mBAAmB,KAAK,iBAAiB,EAAE,EAAE,EAAE,SAAS,WAAW,MAAM,iBAAiB,EAAE,OAAO,SAAS,GAAG,IAAI,EAAE,KAAkF,OAA7E,GAAG,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,mBAAmB,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAU,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAC7f,SAAS,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,MAAM,GAAG,mBAAmB,EAAE,WAAW,mBAAmB,EAAE,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,SAAS,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,IAAS,EAAL,EAAE,GAAK,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,MAAM,oDAAoD,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,OAAO,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,WAAW,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EACxgB,GAAG,WAAW,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,WAAW,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,WAAW,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAD+F,GAC3F,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,EAAE,uCAAuC,EAAE,EAAE,IAAI,EAAE,EAAE,kCAAkC,EAAE,EAAE,IAAI,EAAE,EAAE,4BAA4B,EAAE,EAAE,IAAI,EAAE,EAAE,qCAAqC,EAAE,EAAE,IAAI,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,SAAS,GAAG,SAAS,IAAI,OAAG,EAAE,UAAU,QAAc,EAAE,GAAG,EAAE,GAAG,UAAU,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,GAAG,EAAE,MAAM,OACnf,EAAE,EAAE,GAAG,GAAU,EAAE,GAAE,CAA0G,OAAzG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,cAAc,EAAE,GAAG,SAAS,MAAa,CAAC,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,EAAE,WAAW,OAAO,KAAK,EAAE,EAAE,GAAG,WAAW,KAAK,kBAAkB,KAAK,GAAG,YAAY,KAAK,kBAAkB,KAAK,GAAG,EAAE,GAAG,WAAW,KAAK,kBAAkB,KAAK,GAAG,eAAe,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,GAAG,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,mBAAmB,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,GAAG,MAAM,MAAM,yFAC5f,QAAQ,CAAC,EAAE,EAAE,GAAG,SAAS,GAAG,MAAM,mBAAmB,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,SAAS,GAAW,GAAG,iBAAX,EAAE,GAAG,OAA4B,WAAW,GAAG,MAAM,MAAM,sGACzX,OAD+d,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EACzf,EAAE,GAAG,IAAW,EAAE,OAAO,CAAC,sBAAsB,EAAE,EAAE,GAAG,GAAG,CAAC,OAAO,SAAS,GAAG,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,mBAAmB,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAyB,GAAxB,IAAI,EAAE,QAAQ,KAAK,KAAQ,EAAE,KAAK,EAAE,MAAM,MAAM,oDAAoD,EAAE,KAAK,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,CAAqB,OAApB,EAAE,QAAQ,KAAK,KAAY,CAAC,EAAE,UAAU,SAAS,GAAG,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,MAAM,GAA4C,OAAzC,KAAK,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,KAAK,KAAY,CAAC,CAAC,OAAO,EAAE,KAAK,QAAO,SAAS,GAAG,OAAO,GAC9f,EAAE,EAAE,EAAE,EAAE,EAAE,IAAG,EAAE,EAAE,QAAQ,SAAS,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,mBAAmB,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,EAAE,WAAW,SAAS,GAAG,OAAO,IAAI,EAAE,KAAK,SAAQ,WAAW,QAAQ,IAAG,EAAE,KAAK,SAAQ,SAAS,GAAG,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAG,EAAE,EAAE,QAAQ,SAAS,GAAG,IAAI,EAAE,OAAO,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,SAAS,EAAE,GAAG,IAAI,EAAE,KAAK,QAAQ,GAAG,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,EAAE,KAAK,KAAK,EAAE,OAAO,SAAS,GAAG,IAAI,EAAE,OAAO,MAAM,GAClf,OAAO,EAAE,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,WAAW,OAAO,OAAO,MAAM,GAAG,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,6CAA6C,MAAM,MAAK,SAAS,GAAG,EAAE,GAAG,GAAG,GAAG,WAAW,IAAI,EAAE,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,WAAqB,OAAV,KAAK,KAAY,IAAI,EAAE,KAAK,CAAC,CAAC,IAAG,EAAE,EAAE,EAAE,CAAC,UAAS,SAAS,GAAG,EAAE,GAAG,GAAG,GAAG,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,CAAC,IAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,mBAAmB,EAAE,QAAQ,mBACte,EAAE,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,kBAAkB,SAAS,EAAE,GAAwW,GAAjE,EAAE,GAAG,CAAE,EAAC,GAAG,iBAAiB,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,WAAc,EAAE,GAAG,CAAC,IAAgB,EAAE,EAC/e,EADie,KAAK,EAAE,KAAS,EAAE,EACjf,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAD8C,WAAa,SAAS,IAAI,GAAG,EAAE,CAAC,IAA2B,EAAvB,EAAE,GAAG,OAAO,EAAE,KAAK,IAAS,EAAE,GAAG,mBAAoB,GAAG,EAAE,KAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAI,EAAE,GAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,WAAU,aAAa,CAAC,GAAE,KAAK,YAAY,EAAE,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE,UAAU,GAAG,CAC9U,EAAG,EAAE,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,gBAAgB,GAAG,EAAE,GAAG,iBAAiB,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,GAAG,IAAK,OAAO,EAAE,EAAE,IAAK,UAAU,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,MAAM,IAAK,MAAM,EAAE,EAAE,EAAE,IAAK,QAAQ,GAAG,EAAE,UAAU,EAAE,GAAG,GAAG,MAAM,IAAK,SAAS,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GACtf,EAAE,IAAI,GAAW,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,GAA/D,IAAI,IAA8D,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE,UAAU,OAAO,CAAC,GAAG,mBAAoB,EAA+B,MAAM,MAAM,gJAAgJ,OAAzL,EAAE,MAAM,EAAE,GAAG,WAAmL,IAAI,CACxd,OADyd,EAAE,IACjgB,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAY,EAAE,CAAC,CAAiD,GAAhD,iBAAkB,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,KAAK,IAAO,mBAAmB,EAAE,KAAK,MAAM,MAAM,6DAA6D,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,EAAE,EAAE,0BAA0B,EAAE,GAAG,KAAK,GAAG,EAAE,aAAa,EAAE,GAAG,GAAG,KAAK,EAAE,CAAE,EAAC,EAAE,EAAE,GAAG,MACvK,OAD6K,EAAE,GAAG,EAAE,EAAE,GAAG,mBAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAClf,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,GAAI,EAAE,QAAQ,cAAc,EAAE,GAAG,SAAS,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,GAAU,CAAC,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,GAAG,WAAW,OAAO,KAAK,GAAG,CAAC,EAAE,GAAG,WAAW,IAAI,EAAE,GAAgD,OAA7C,EAAE,EAAE,EAAE,KAAK,GAAG,GAAE,SAAS,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAU,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,KAAK,GAAG,EAAE,SAAS,IAAI,EAAE,KAAK,KAAK,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,MAAQ,EAAE,EAAE,GAAG,GAAE,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,GAAG,KAAK,GAAG,IACvf,IAAI,KAAK,MAAM,MAAM,oDAAoD,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,WAAW,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,IAAI,KAAK,EAAE,GAAG,OAAO,UAAU,eAAe,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,KAAK,QAAQ,EAAE,GAAG,WAAW,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK,MAAM,EAAE,GAAG,WAAW,IAAI,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,WAAW,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,GAAG,OAAO,KAAK,IAAI,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,KAAK,GAAG,KAAK,SAAS,EAAE,EAAE,UAAU,KAAK,GACrf,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,GAAG,KAAK,EAAE,GAAG,WAAW,IAAI,EAAE,KAAK,EAAE,EAAE,mBAAmB,GAAG,GAAG,GAAG,aAAa,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,EAAE,YAAW,WAAW,EAAE,MAAM,GAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE,GAAa,YAAT,KAAK,SAAiB,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG,EACrf,GAAG,EAAG,EAAE,KAAK,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE,GAAkP,OAA/O,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK,KAAK,KAAK,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,EAAE,aAAa,EAAE,GAAG,GAAG,KAAK,kBAAkB,EAAE,GAAG,KAAK,IAAI,KAAK,MAAM,GAAG,KAAK,kBAAkB,EAAE,EAAE,SAAgB,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,KAAK,GAAgD,OAA5C,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,KAAK,KAAY,EAAE,CAAC,EACzf,GAAG,SAAS,GAAG,EAAE,EAAE,GAAG,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,WAA2D,OAAhD,KAAK,GAAG,IAAI,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,OAAc,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,MAAM,IAAI,KAAK,GAAG,OAAO,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,WAAW,IAAI,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,KAAK,EAAE,GAAG,EAAE,GAAG,EAAG,CAAC,GAAG,SAAS,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAQ,GAAP,EAAE,KAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EACrf,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,IAAG,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,IAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,QAAQ,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,IAAI,UAAU,GAAG,KAAK,GAAG,YAAY,EAAE,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,IAAG,EAAE,KAAK,KAAK,kBAAkB,EAAE,UAAU,EAAE,GAAG,WAAW,IAAI,EAAE,KAAK,GAAqC,OAAlC,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,KAAK,KAAY,EAAE,EAAE,GAAG,GAAG,KAAK,KAAK,GAAG,EAAG,CAAC,GAAG,SAAS,GAAG,UACtf,GAAG,gBAAgB,GAAG,KAAK,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,MAAM,mBAAmB,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,MAAG,mBAAoB,EAAS,EAAE,EAAE,EACvf,EAAE,CAAC,YAAU,EAAE,EAAE,EAAE,OAAO,GAAG,IAAK,QAAe,EAAE,EAAE,EAAE,GAAE,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,WAAY,SAAS,EAAE,EAAE,EAAE,GAAqB,GAAlB,EAAE,GAAG,IAAI,EAAY,iBAAV,EAAE,EAAE,KAA0B,OAAO,GAAG,IAAI,GAAG,aAAa,QAAQ,aAAa,MAAM,aAAa,QAAQ,aAAa,QAAQ,aAAa,QAAQ,OAAO,EAAE,IAAI,EAAE,aAAa,MAAM,GAAG,GACxS,OAD2S,EAAE,KAAK,EAAE,GAC3S,SAAW,EAAE,GAAG,GAAG,aAAa,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,GAAG,mBAAmB,EAAE,QAAQ,EAAE,SAAS,MAAM,IAAI,KAAK,EAAE,EAAE,EAAE,CAApI,CADgT,GAAE,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,cAAc,GAAG,IAAK,UAAU,IAAK,SAAS,IAAK,SAAS,IAAK,WAAW,EAAE,GAAG,EAAE,MAAM,IAAK,SAAS,IAAK,YAAY,IAAI,EAAE,EAAE,IAAI,GAAG,EAAE,GAAG,IACjf,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAU,CAAC,CAAsI,SAAS,IAAI,KAAK,KAAK,GAAG,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,SAAS,GAAG,GAAG,GAAG,UAAU,OAAO,MAAM,MAAM,8DAA8D,OAAO,EAAE,GAAE,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,GAAE,EAAE,EAAE,OAAO,SAAS,EAAE,EAAE,GAAa,OAAV,EAAE,EAAE,GAAG,GAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,YAAY,EAAE,KAAK,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,KACvf,GAAG,GAAG,EAAE,KAAK,OAAO,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,KAAK,OAAO,KAAK,GAAG,EAAE,IAAI,SAAS,GAAwB,OAAO,IAA5B,EAAE,EAAE,EAAE,EAAE,KAAK,KAAK,IAAe,KAAK,OAAO,GAAG,CAAC,EAAG,CAFlD,GAEsD,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,WAAW,EAAE,EAAE,WAAU,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAA8B,OAA3B,EAAE,kBAAkB,EAAE,KAAY,CAAC,CAAC,MAAM,mBAAoB,SAAS,EAAE,EAAE,EAAE,KAAK,IAAI,IAAI,QAAQ,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAgB,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,IAAI,IAAK,SAAS,WAAW,EAAE,8BACze,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,iBAAiB,UAAU,EAAE,iBAAiB,SAAS,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAK,SAAS,OAAO,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,IAAI,IAAK,SAAS,iBAAkB,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,GAAG,GAAG,kCAAkC,UAAU,EAAE,8BAA8B,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,iCAAiC,EAAE,MAAM,iBACne,EAAE,EAAE,IAAI,MAAM,IAAK,SAAY,KAAK,GAAG,OAAO,IAAE,EAAE,GAAE,IAAI,IAAgC,EAA5B,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,OAAS,EAAE,IAAI,EAAE,IAAG,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,MAAO,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAI,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,QAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,YAAW,WAAW,EAAE,cAAc,CAAC,GAAE,IAAG,MAAM,QAAW,OAAO,GAAG,IAAI,IAAE,EAAE,IAAG,EAAE,MAAM,EAAE,GAAO,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,EAAE,6BAA6B,EAAE,EAAE,GAAG,EAAE,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,SAAS,EAAE,GAAe,OAAZ,EAAE,EAAE,EAAE,GAAG,IAAW,WAAW,KAAK,EAAE,EAAE,MAAM,GACzf,IAAa,IAAsB,EAAlB,EAAE,GAAG,GAAlB,GAAG,OAAmB,MAAM,GAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,IAAI,IAAQ,EAAJ,EAAE,EAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,WAAW,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,KAAK,CAAC,QAAQ,GAAG,EAAE,KAAK,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,QAAQ,OAAO,GAAG,KAAK,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,QAAQ,MAAO,IAAG,KAAK,GAAG,EAAE,EAAE,SAAS,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,SAAc,KAAK,GAAG,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,EAAE,EAAE,MAAiC,GAA3B,EAAE,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAO,MAAM,GAAG,GAAG,EAAE,EAAE,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,IAAI,EACpf,KAAK,GAAG,MAAM,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,QAAQ,KAAK,GAAG,KAAK,IAAI,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,MAAM,8CAA+C,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,QAAQ,OAAO,aAAa,EAAE,uDAAuD,EAAE,OAAO,4KAA4K,KAAK,EAAE,uBAAuB,EAAE,CAAC,GAAK,EAAE,OAAS,EAAE,OAAS,GACrf,EAAE,CAAE,EAAC,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,kBAAkB,GAAG,GAAG,GAAG,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,QAAU,EAAE,EAAE,MAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,IAAK,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,IAAG,EAAE,GAAE,GAAG,EAAE,KAAK,KAAK,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,kBAAkB,EAAE,OAAO,CAAC,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,CAAS,IAAI,EAAE,GAAG,EAAE,GAAG,GAAtB,EAAE,GAAG,IAAqB,eAAe,EAAE,EAAE,cAAc,EAAE,iBAAkB,EAAE,EAAE,GAAG,EAC/Y,OADiZ,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,QACpf,EAAE,MAAM,IAAG,EAAE,QAAQ,EAAE,uBAAuB,IAAI,EAAE,KAAK,KAAK,MAAa,EAAE,KAAK,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,GAAM,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,MAAM,GAAG,EAAE,IAAY,EAAE,EAAE,IAAI,0BAA0B,EAAE,IAAG,EAAE,GAAG,EAAE,EAAE,CAJmJ,GAI/I,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,+CAA+C,EAAE,EAAE,IAAI,EAAE,EAAE,yCAAyC,EAAE,EAAE,IAAI,EAAE,EAAE,yCAAyC,EAAE,EAAE,IAAI,EAAE,EAAE,sCAC5e,EAAE,EAAE,IAAI,EAAE,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,0DAA0D,EAAE,EAAE,IAAI,WAAY,SAAS,EAAE,GAAG,OAAO,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,GAAG,OAAO,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAU,KAAJ,GAAW,OAAO,EAAE,EAAE,KAAK,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,MAAM,6CAA6C,EAAE,WAAW,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,EACtf,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,GAAG,YAAY,EAAE,YAAY,IAAI,CAAC,IAAI,EAAE,GAAG,sBAAsB,EAAE,cAAc,QAAQ,KAAK,EAAE,EAAE,2CAA2C,8BAA8B,EAAE,EAAE,4BAA4B,eAAe,EAAE,CAAC,MAAM,OAAO,EAAE,2BAA2B,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,GAAwB,IAAI,IAAI,EAAE,EAAE,GAAhC,EAAE,EAAE,EAAE,WAAW,IAAmB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,IAAI,EACxf,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,EAAE,aAAa,KAAK,EAAE,YAAY,GAAG,EAAE,YAAY,EAAE,EAAE,YAAY,MAAM,MAAM,oDACnd,GAAG,OAAO,EAAE,UAAU,EAAE,YAAY,SAAS,GAAkB,GAAf,EAAE,KAAK,EAAE,EAAE,IAAO,EAAE,aAAa,EAAE,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE,YAAY,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,qEAAqE,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,MAAM,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,GAAG,EAAG,MAAM,IAAI,EAAE,SAAS,CAAC,IAAI,EAAqB,EAAE,KAAK,GAA1B,EAAE,EAAE,WAA4B,MAAM,EAAE,EAAE,KAAK,QAAQ,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EACnf,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,aAAa,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,GAAG,QAAO,EAAE,EAAE,YAAa,CAAC,EAAG,CAJvD,GAI2D,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,EAAE,kCAAkC,EAAE,EAAE,IAAI,EAAE,EAAE,4BAA4B,EAAE,EAAE,IAAI,EAAE,EAAE,8BAA8B,EAAE,EAAE,IAAI,EAAE,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,EAAE,qCAAqC,EAAE,EAAE,IAAgB,EAAE,GAAG,WAAW,KAAK,GAAG,CAAE,GAAE,EAAE,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,gBAAgB,SAAS,GAAG,OAAO,EAAE,UAAU,KAAK,EAAE,OAAO,MAC9hB,EAAE,aAAa,cAAc,EAAE,EAAE,wBAAwB,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,QAAQ,SAAS,EAAE,YAAY,SAAS,EAAE,GAAG,IAAkC,GAA9B,EAAE,KAAK,kBAAkB,EAAE,IAAO,KAAK,oBAAoB,EAAE,EAAE,GAAG,KAAK,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,SAAS,EAAE,GAAG,IAAkC,GAA9B,EAAE,KAAK,kBAAkB,EAAE,IAAO,KAAK,oBAAoB,EAAE,EAAE,EAAE,CAAC,oBAAoB,KAAK,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,SAAS,GAAG,OAAO,EAAE,UAAU,KAAK,EAAE,OAAO,EAAE,aAAa,aAAa,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,QAAQ,OAAO,KAAK,EACtgB,oBAAoB,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,IAA4C,EAAxC,EAAE,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE,gBAAgB,IAAM,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,yCAAyC,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,SAAS,WAAW,WAAW,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,8CAA8C,EAAE,cAAc,EAAE,QAAQ,CAAE,CAAC,IAAI,EAAE,GAAG,SAAS,IAAI,EAAE,GAAO,EAAE,EAAE,kBAAkB,EAAE,IAAI,WAAY,SAAS,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,KAAK,KAAK,EAAE,KAAK,GACvf,EAAE,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,OAAO,WAAW,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAG,SAAS,EAAE,GAAG,OAAO,WAAW,OAAO,IAAI,EAAE,CAAC,GAAE,CAA+E,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,YAAY,KAAK,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,eAAe,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,GAAG,EAAE,KAAK,EAAE,GACnf,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,IAAM,GAAG,EAAE,GAAG,SAAS,gBAAgB,MAAG,EAAE,EAAE,EAAE,KAAK,GAAG,8BAA6B,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAC1K,SAAS,EAAE,EAAE,EAAE,GAAG,IAAoK,EAAhK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,MAAM,iEAAiE,EAAE,KAAK,CAAwC,GAAvC,IAAI,EAAE,QAAQ,GAAG,EAAE,KAAK,EAAE,GAAG,IAAa,GAAG,mBAAoB,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAE,WAAsE,OAAxD,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,MAAO,EAAE,IAAG,EAAE,KAAQ,EAAE,IAAG,EAAE,MAAY,CAAC,GAAE,KAAK,CAAC,EAAE,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAQ,EAAJ,EAAE,EAAI,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,OAAO,EAAE,EAAE,GAAG,EAAE,IAClf,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,WAAW,OAAO,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,SAAS,GAAG,OAAO,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAE,WAAW,IAAI,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,WAAW,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAG,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,IAAG,WAAW,IAAI,KAAK,EAAE,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,KAAI,EAFlK,SAAW,GAAG,IAAI,EAAE,GAAG,EAAE,CAAE,EAAC,EAAE,GAClN,OADqN,EAAE,EAAE,EAAE,GAAE,SAAS,EAAG,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,kBAAkB,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,OAAM,SAAS,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,iFAAiF,EAAE,KAAK,OAC3f,EAAG,EAAE,CAAC,IAAG,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,KAAK,CAAC,IAAU,CAAC,CAD4K,CAEsK,GAAG,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,GAAG,MAAM,MAAM,gBACvf,EAAE,0CAA0C,IAAI,mBAAmB,GAAG,EAAE,EAAE,GAAE,WAAW,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,GAAG,EAAE,2BAA2B,CAAC,GAAG,IAAI,EAAE,MAAM,MAAM,sBAAsB,EAAE,QAAQ,EAAE,gIAAgI,EAAE,CAAC,CAAC,IAAG,mBAAmB,GAAG,EAAE,GAAE,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAE,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,8BAA8B,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,QACjf,CAAE,CAAC,GAAE,CAAS,MAAM,CAAC,sBAAf,EAAE,IAAI,EAAiC,6BAA6B,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,GAAG,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,iBAAiB,EAAE,EAAE,EAAE,GAAG,wBAAwB,EAAE,EAAE,EAAE,GAAG,mBAAmB,EAAE,EAAE,CAAE,EAAC,IAAI,EAAE,CAAC,UAAU,YAAY,aAAa,EAAE,kBAAkB,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAC1T,OAD6T,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,SAClf,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAM,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,GAAG,EAAE,KAAI,EAAE,KAAK,IAAI,EAAE,GAAG,GAAU,EAAE,KAAK,CAAC,IAA2D,EAAvD,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,mBAAmB,IAAI,EAAE,EAAE,GAAK,EAAE,GAAG,EAAE,eAAe,GAAG,EAAE,mBAAmB,MAAK,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,KAAK,EAAE,iBAAiB,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,UAAU,mBAAmB,SAAS,EAAE,EAAE,EAAE,GAAsD,IAAlD,GAAG,GAAG,iBAAiB,IAAQ,GAAJ,EAAE,GAAM,GAAG,EAAE,EAAE,QAAW,GAAG,GAAG,EAAE,eAAe,CAAC,IAAI,EAAE,mBAAmB,IAAI,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,MAAK,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAE,EAAE,CAAC,OAAO,IAAI,EAAE,GAAG,EACpgB,KAAK,GAAE,SAAS,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,IAAI,MAAM,GAAG,EAAE,SAAS,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,GAAE,EAAE,EAAE,EAAE,GAAG,UAAU,OAAO,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG,EAAE,KAAK,MAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,GAAG,EAAE,GAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,WAAW,KAAK,IAAI,KAAK,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,KAAK,EAAE,EAAE,UAAU,GAAG,SAAS,GAAG,EAAE,EAAE,GAAG,KAAK,GAAG,IAAI,KAAK,GAAG,QAAQ,KAAK,GAAG,KAAK,IAAI,EAAE,EAAE,UAAU,GAAG,WAAW,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG,SAAS,KAAK,GAAG,EACtf,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,KAAK,GAAG,EAAE,EAAE,GAAG,KAAK,KAAK,EAAE,EAAE,IAAI,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,mBAAmB,GAAG,sBAAsB,UAAU,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAE,GAAuE,OAArE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,mBAAmB,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAW,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,kBAAkB,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,MAAM,MAAM,oEAClb,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAA+B,OAA3B,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAO,SAAS,GAAG,EAAE,GAAG,CAAC,GAAE,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAA6B,OAA1B,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,GAAU,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAU,OAAP,EAAE,EAAE,GAAU,EAAE,GAAG,EATjD,SAAW,EAAE,EAAE,GAAG,MAAM,mBAAoB,EAAE,EAAE,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAS1B,CAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAA8B,IAA1B,GAAG,EAAE,SAAS,EAAE,EAAE,QAAW,EAAE,UAAU,QAAQ,KAAG,EAAE,EAAE,MAAQ,MAAM,MAAM,sFAChc,IAAI,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,SAAS,MAAM,MAAM,sGAAsG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,yBAAyB,EAAE,EAAE,WAAW,EAAE,EAAE,gDAAgD,EAAE,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,6BAA6B,EAAE,IACtf,EAAE,EAAE,8BAA8B,EAAE,IAAI,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,GAAI,CAZoR,GAYhR,SAAU,GAAG,SAAS,EAAE,EAAE,GAAG,IAAuD,EAAnD,EAAE,OAAO,UAAU,eAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAI,EAAE,EAAE,UAAU,KAAI,EAAE,EAAE,GAAG,IAAI,EAAE,GAAI,UAAU,GAAG,EAAE,GAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,GAAG,EAAE,EAAE,kBAAkB,GAAG,EAAE,GAAG,IAAG,WAAW,EAAE,kBAAkB,EAAE,GAAE,IAAG,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,IAAG,SAAS,GAAG,EAAE,EAAE,gBAAgB,CAAC,EAAE,IAAG,SAAS,GAAG,EAAE,EACtf,EAAE,IAAG,EAAE,KAAK,KAAK,GAAE,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,MAAM,IAAI,IAAI,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,GAAG,EAAE,MAAM,EAAE,EAAE,QAAO,SAAS,GAAG,EAAE,EAAE,MAAM,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAM,IAAI,MAAM,EAAE,0BAA0B,MAAM,MAAM,wGAAyG,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAE,EAAC,EAAE,EAAE,CAAC,IAAI,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,UAAU,eAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAE,WAAW,EAAE,EAAE,WAAW,IAC1f,EAAE,GAAG,IAAG,WAAW,EAAE,EAAE,WAAW,IAAG,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,UAAU,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,mCAAmC,EAAE,EAAE,GAAI,CAF1E,GAE8E,WAAwQ,SAAS,EAAE,EAAE,EAAE,GAAG,GAAG,mBAAoB,EAAE,GAAE,SAAS,GAAG,OAAO,IAAI,EAAE,EAAE,SAChhB,GAAG,mBAAoB,EAAE,GAAG,EAAE,EAAE,SAAS,GAAG,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,GAAE,WAAW,OAAO,CAAC,GAAE,KAAK,cAAc,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,EAAE,4BAA4B,EAAE,CAAC,SAAS,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,IAAI,IAAK,SAAS,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,IAAK,WAAW,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,IAAK,WAAW,GAAG,EAAE,EAAE,SAAS,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,YAAY,OAAO,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,SAAS,EAAE,GAAG,OAAO,EAAE,iBAAiB,aAAa,iBAAiB,GAAG,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,iBAAkB,EAAE,QAC3f,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,CAAC,EAAE,UAAS,SAAS,GAAG,GAAG,iBAAkB,GAAG,EAAE,IAAI,EAAW,UAAI,EAAE,EAAW,SAAG,EAAE,EAAE,IAAG,EAAE,8CAA8C,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,OAAO,SAAS,GAAG,MAAM,MAAM,cAAc,EAAE,MAAM,EAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,EAAE,MAAM,MAAM,6BAA6B,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,MAAM,MAAM,aAAa,EAAE,0BAA0B,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,OAAO,OAAO,UAAU,eAAe,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,SAAS,UAAU,EAAE,GAC9f,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,UAAU,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,cAAc,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,GAAE,SAAS,IAHsF,SAAW,EAAE,EAAE,EAAE,GAAG,SAAS,IAAI,KAAM,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAE,EAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,EAAE,EAAE,GAAG,eAAe,CAAC,EAAE,IAAG,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,GAAE,IAAG,IAAI,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,EAAE,EAAE,GAAG,gBAAgB,CAAC,EAAE,IAAG,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,GAAE,IAAG,GAAG,CAG9U,CAAE,EAAE,EAAE,EAAE,EAAE,GAAE,EAAE,aAAa,SAAS,EAAE,EAAE,GAAU,GAAP,EAAE,EAAE,GAAM,iBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,aAAa,MAAM,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,kBAAkB,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,aAAa,YAAY,GAAG,EAAE,SAAS,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,iBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,eAAe,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE,MAAM,EAAE,yBAClf,QAAQ,EAAE,2BAA2B,EAAE,EAAE,cAAc,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,EAAE,sBAAsB,EAAE,EAAE,UAAU,EAAE,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,EAAE,wBAAwB,EAAE,EAAE,YAAY,EAAE,EAAE,2BAA2B,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,CAAE,CAJ3G,GAI+G,WAAY,SAAS,EAAE,EAAE,GAAkC,GAA3B,EAAE,EAAE,aAAa,UAAe,CAAC,IAAI,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC,kBAAkB,mBAAqE,GAAlD,EAAE,EAAE,EAAE,GAAG,GAAE,SAAS,GAAG,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,IAAK,EAAE,EAAE,GAAG,GACxf,SAAS,GAAG,IAAI,EAAE,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,WAAW,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAA8D,OAA3D,OAAO,UAAU,eAAe,KAAK,EAAE,UAAU,EAAE,KAAK,GAAU,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,wBAAwB,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,MAAM,GAAG,EAAE,QAAQ,MAAM,+BAA+B,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,wBAAwB,GAAG,GAAG,EAAE,CAAS,IAAR,EAAE,GAAG,CAAE,GAAM,UAAU,MAAM,MAAM,+EAC3e,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,SAAS,GAAG,OAAO,SAAS,GAAG,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC,CAA9D,CAAgE,EAAE,EAAE,UAAU,EAAE,uBAAuB,SAAS,GAAG,OAAO,WAAW,IAAI,EAAE,IAA2B,OAArB,EAAE,EAAE,GAAwB,CAAC,CAAC,CAAxE,CAA0E,EAAE,wBAAyB,CAFX,GAEe,WAC5T,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,IAAI,IAAI,EAAE,GAAG,EAAE,QAAQ,mBAAoB,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,IAC6B,OADzB,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,WAAW,IAAiB,EAAE,EAAf,EAAE,EAAE,EAAE,EAAE,KAAqE,GAA5D,iBAAkB,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAa,EAAE,MAAM,MAAM,+BAA+B,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAE,SAAS,GAAG,GAAG,IAAI,EAAE,CAAK,GAAJ,KAAQ,EAAE,MAAM,MAAM,sBAAsB,EAAE,MADpH,SAAW,EAAE,EAAE,GAAgB,KAAb,EAAE,EAAE,UAAe,MAAM,MAAM,cAAc,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAA7G,CAC2H,EAAE,EAAE,GAAG,IAAI,EADxB,SAAW,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,OAAO,EAAE,EAAE,KAAK,EACvf,EAAE,GAAG,CAAC,CADub,CAC4B,EAAE,EAAE,CAAC,QAAQ,EAAE,cAAc,IACtf,EAAE,EAAE,mBAAmB,EAAE,CAAC,OAAO,SAAS,GAAG,EAAE,WAAW,EAAE,EAAE,wBAAwB,CAAC,IAAI,GAAG,EAAE,wBAAwB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,sBAAsB,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAE,GAAE,KAAK,CAAC,EAAE,IAAU,CAAC,8BAA8B,GAAG,EAAE,EAAE,GAAG,YAAa,CAF4D,GAExD,IAAI,EAAE,CAAC,MAAQ,YAAY,IAAM,WAAW,EAAE,EAAE,KAAK,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,KAA0E,GAArE,EAAE,uBAAuB,GAAG,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAW,GAAG,OAChf,GAAG,IAAI,GAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,gBAAgB,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAE,GAAe,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,QAAQ,KAAK,SAAS,EAAE,EAAE,GAAG,SAAS,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EACzf,EAAE,UAAU,KAAK,CAAC,CAAoG,IAAI,EAAE,EAAE,IAAG,WAAW,OAAG,EAAE,IAAI,gBAAuB,EAAE,EAAE,EAAE,EAAE,IAAI,iBAAoB,EAAS,EAAE,IAAI,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,UAAU,EAAE,YAAK,IAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,aAAa,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,KAAK,GAAE,WAAW,QAAQ,IAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,EAAE,GAAld,WAAa,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,GAAoX,KAAK,CAAC,EAAE,IACjf,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,aAAa,CAAC,OAAO,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAO,EAAE,EAAS,MAAE,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,mBAAmB,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,OAAO,GAAG,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAG,EAAE,EAAS,MAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,SAAS,EAAE,gBAAgB,YAAY,GAAG,EAAE,WAAW,EAAE,YAAY,GAAG,EAAE,EAAE,QAClf,CAAC,OAAO,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,OAAO,GAAE,WAAW,OAAO,EAAE,EAAE,EAAE,IAAI,GAAE,GAAG,EAAE,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,CAAE,EAAC,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,iBAAiB,GAAG,EAAE,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,IAAI,EAAE,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,GAAE,GAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAG,OAAO,WAAW,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GACpf,OAAI,GAAG,iBAAiB,EAAE,QAAgD,EAAE,EAAE,EAAE,GAAS,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE,GAAG,eAAe,EAAE,eAAe,iBAAiB,EAAE,iBAAiB,SAAS,EAAE,SAAS,aAAa,EAAE,aAAa,YAAY,EAAE,YAAY,WAAW,EAAE,WAAW,UAAU,EAAE,UAAU,eAAe,EAAE,GAAG,KAA1R,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,GAA8P,CAAC,EAAE,KAAK,SAAS,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,KAAK,EAAE,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,OAAO,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,SAAS,OAAO,EAAE,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,WAClf,EAAE,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,yBAAyB,IAAI,EAAE,EAAE,cAAc,GAAG,kBAAkB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,MAAM,EAAE,uBAAuB,EAAE,EAAE,wBAAwB,CAAC,IAAI,EAAE,EAAE,KAAK,SAAS,EAAE,EAAE,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,WAAW,GAAG,EAAE,yBAAyB,EAAE,OAAO,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,yBACne,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,EAAE,wBAAwB,EAAE,cAAc,KAAK,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,UAAU,aAAa,GAAG,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,WAAW,EAAE,EAAE,KAAK,CAAC,KAAK,WAAW,MAAM,CAAC,8BAA8B,EAAE,OAAO,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,WAAY,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAO,EAAE,EAAE,EAAT,EAAE,GAAS,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,MAAM,IAAI,EAAE,EAAE,IAAI,kBAA4B,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,mBAAnC,IAAI,GAAG,GAAiD,CACnH,OADoH,GAAG,EACnf,UAAU,EAAE,IAAI,gBAAgB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAE,WAAW,IAAgC,EAA5B,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,IAAK,EAAE,GAAG,GAAO,GAAG,IAAI,KAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAO,IAAO,IAAG,IAAE,EAAE,eAAe,EAAE,EAAE,KAAI,EAAE,EAAE,EAAE,mBAAmB,mBAAmB,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,KAAK,GAAG,GAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,QAAQ,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAE,KAAK,CAAC,EAAE,IAAU,CAAC,8BAA8B,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,YAAQ,GAAO,EAAE,UAAW,CADjL,GACqL,EAAE,EAAE,IAAI,CAAC,KAAK,SAAS,EAC/f,EAAE,EAAE,EAAE,GAA2B,OAAxB,EAAE,EAAE,OAAO,GAAG,EAAE,GAAG,EAAE,GAAS,CAAC,8BAA8B,GAAG,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,CAAE,EAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,SAAS,GAAG,GAAG,WAAW,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,mDAAmD,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,8BAA8B,EAAE,OAAO,SAAS,EAAE,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE,EAAE,GAAG,EAAE,SAAQ,SAAS,GAAG,OAAO,EAAE,QAAQ,GAAE,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,YAAY,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,GAAG,EAAE,OAAO,CAAC,IAAI,EAC/f,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,oBAAoB,EAAE,IAAI,SAAS,EAAE,EAAE,IAAI,2BAA2B,EAAE,CAAE,EAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,kBAAkB,aAAwB,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,GAAE,SAAS,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,IAAG,EAAE,IAAI,mBAAqD,QAAjC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,qBAC5d,IAAI,GAAG,EAAE,QAAQ,IAAK,IAAI,KAAK,EAAE,aAAa,SAAS,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,uBAAuB,mBAAmB,EAAE,IAAI,wBAAwB,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,sBAAsB,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAE,SAAS,EAAE,EAAE,GAC9P,OADiQ,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,cAAc,cAAc,UAAU,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,mBAAmB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,gBAAgB,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,eAAe,GAClf,EAAE,EAAE,GAAG,EAAE,IAAU,CAAC,EAAE,GAAE,EAAE,GAAO,IAAS,EAAI,EAAE,QAAQ,IAAI,OAAO,EAAE,OAAS,EAAE,QAAQ,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE,QAAQ,GAAG,EAAE,gBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,YAAY,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,gBAAgB,CAAC,KAAK,SAAS,EAAE,EAAE,GAAG,SAAS,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,qBAAqB,WAAU,SAAS,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAG,EAAE,EAAE,GAAG,EAAE,EAAE,kBAC1e,EAAE,CAAC,SAAS,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,GAAG,iBAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,qBAAqB,WAAU,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,IAAG,EAAE,UAAU,CAAC,CAAC,GAAG,UAAU,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,2DAA2D,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,GAAE,KAAK,CAAC,sBAAsB,EAAE,OAAO,WAAY,GAAE,EAAE,EAAE,GAAG,mBAAmB,EAAE,EAAE,MAAM,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KACpf,IAAI,EAAE,EAAE,EAAE,GAAE,SAAS,EAAE,GAA8C,GAA7B,QAAd,EAAE,EAAE,EAAE,EAAE,KAAgB,IAAI,QAAQ,IAAE,EAAE,IAAM,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,GAAG,MAAM,KAAK,GAAG,EAAE,MAAM,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,UAAS,SAAS,EAAE,GAAG,OAAO,EAAE,aAAa,IAAG,IAAI,EAAE,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,CAAC,GAAE,GAAG,EAAE,EAAE,OAAO,CAAC,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,mBAAmB,IAAI,MAAM,MAAM,qDAAqD,EAAE,EAAE,EAAE,EAAE,UAAS,SAAS,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,aAAa,IAAI,EAAE,eACnf,EAAE,iBAAiB,EAAE,eAAe,CAAC,GAAE,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,WAAW,MAAM,CAAC,8BAA8B,EAAE,OAAO,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,QAAQ,WAAY,GAAG,GAAG,EAAE,UAAU,CAAC,IAAwE,EAAE,EAAE,EAAE,EAAE,EAA5E,EAAE,SAAS,GAAG,GAAG,EAAE,OAAO,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,WAAqB,EAAE,EAAE,OAAO,EAAE,MAAM,SAAS,SAAS,EAAE,MAAM,cAAc,EAAE,EAAE,EAAE,MAAM,qBAAqB,EAAE,EAAE,MAAM,sBAAsB,EAAE,EAAE,EAAE,MAAM,+BAA+B,EAAE,EAAE,EAAE,MAAM,wBAAwB,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,oBAC9e,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,KAAK,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,kBAAkB,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,KAAK,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAqI,SAAS,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EACtf,GAAG,CAAC,SAAS,IAAI,aAAa,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,YAAY,GAAG,CAAC,IAAc,EAAE,EAAZ,EAAE,EAAE,MAAU,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,WAAW,GAAG,GAAG,GAAG,EAAE,kBAAiB,SAAS,GAAG,GAAG,UAAU,EAAE,cAAc,GAAI,IAAG,GAAG,IAAI,EAAE,QAAQ,GAAG,EAAE,UAAU,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,MAAM,GAAG,GAAG,IAAI,EAAE,QAAQ,GAAG,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,QAAQ,GAAG,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,GAAG,EAAE,kBAAkB,GAAG,EAAE,WAAW,GAAG,EAAE,OAAO,IAAI,GAAG,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,SAChf,GAAG,EAAE,OAAO,GAAG,EAAE,GAFqT,SAAS,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,KAAQ,OAAO,GAAG,IAAI,IAAE,EAAE,IAAG,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,IAAI,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,GAEpb,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,aAAa,EAAE,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAG,CAH2C,GAGvC,EAAE,EAAE,WAAW,CAAC,KAAK,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAiH,OAA/G,EAAE,IAAI,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,MAAM,eAAe,EAAE,IAAI,oBAAoB,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAS,CAAC,8BAA8B,GAAG,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,SAChf,EAAE,IAAI,GAAG,YAAY,EAAE,MAAM,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,eAAe,KAAK,EAAE,KAAK,IAAuB,EAAnB,iBAAiB,EAAI,CAAC,GAAK,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,WAAW,IACpE,EAAsT,EAD9O,EAAE,WAAW,EAAE,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,GAAG,QAAQ,EAAE,MAAM,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,EAAE,KAAK,eAAe,GAAG,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE,kBAAiB,WAAW,IAAI,IAAG,EAAE,EAAE,EAAE,EAAE,SAAQ,WAAW,IAAI,IAAG,EAAE,EAAE,EAAE,EAAE,QAAO,WAAW,GAAG,GAAG,KAAI,EAAE,EAAE,EAAE,GAAE,SAAS,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,WAC5e,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAS,EAAE,GAAG,QAAQ,EAAE,KAAK,WAAW,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,OAAO,GAAG,IAAI,GAAG,KAAK,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAM,OAAO,GAAG,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,GAAW,IAAI,GAAG,IAAI,IAAE,WAAW,GAAG,EAAE,EAAE,IAAI,mBAAmB,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAE,EAAK,WAAW,EAAS,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAE,WAAW,EAAE,EAAE,IAAI,mBAAmB,IAAI,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,GACxf,KAAK,CAAC,wBAA4B,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAG,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,GAAG,EAAE,OAAO,WAAU,GAAI,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,QAAQ,CAAC,OAAO,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,IAAI,EAAE,EAAE,MAAM,QAAQ,IAAI,GAAG,IAAI,EAAE,MAAM,QAAQ,OAAO,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,SAAS,EAAE,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAE,WAAW,OAAO,EAAE,EAAE,EAAE,IAAI,GAAE,GAAG,SAAU,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,MAAM,KAAK,KAAK,KAAK,GAAE,WAAW,IAAI,EAAE,GAAY,OAAT,EAAE,GAAG,IAAW,CAAC,GAAE,EAAE,EAAE,EAAE,EAAG,CAAhI,CAAkI,SAC7e,EAAE,GAAG,WAAY,EAAC,EAAE,GAAG,UAAU,qBAAqB,WAAW,MAAM,MAAM,gCAAiC,EAAE,EAAE,GAAG,UAAU,+BAA+B,WAAW,MAAM,MAAM,0CAA2C,EAAE,EAAE,GAAG,UAAU,mBAAmB,SAAS,EAAE,GAAG,GAAG,iBAAiB,EAAE,CAAQ,IAAI,GAAX,EAAE,GAAG,GAAU,eAAe,GAAG,IAAI,EAAE,MAAM,MAAM,gCAAgC,GAAG,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,SAAS,OAAO,IAAI,EAAE,EAAE,GAAG,GAAG,MAAM,MAAM,0BAA0B,EAAG,EAAE,EAAE,GAAG,UAAU,eAClgB,SAAS,EAAE,EAAE,EAAE,GAAkC,OAA/B,EAAE,KAAK,mBAAmB,EAAE,GAAU,KAAK,qBAAqB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,UAAU,oBAAoB,SAAS,EAAE,GAAG,WAAW,KAAK,wBAA0B,KAAK,mBAAmB,EAAE,GAAG,KAAK,cAAc,EAAE,EAAE,GAAG,UAAU,gBAAgB,SAAS,EAAE,EAAE,GAAkC,EAAE,GAAjC,EAAE,KAAK,mBAAmB,EAAE,IAAS,QAAQ,EAAE,KAAK,GAAG,EAAE,KAAK,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,WAAW,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,OAAO,UAAU,eAAe,KAAK,EAChhB,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,mBAAoB,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,MAAM,MAAM,QAAS,IAAI,EAAE,MAAM,MAAM,8CAA8C,EAAE,iCAAkC,CAAC,CAA2I,OAA1I,EAAE,wEAAwE,EAAE,EAAE,GAAG,EAAE,CAAC,oBAAoB,aAAa,EAAE,cAAc,KAAY,EAAE,+BAA+B,GAAG,CAAC,CAAC,IAAI,EAAE,oIACpX,EAAE,wCAAwC,MAAM,CAAC,GAAG,SAAS,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,gBAAgB,GAAE,SAAS,GAAG,OAAO,EAAE,GAAG,GAAG,EAAE,EAAE,GAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,QAAQ,GAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAG,QAAQ,GAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAAE,oBAAoB,WAAW,EAAE,GAAE,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,IAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,GAAG,EAAE,SAAS,gBAAgB,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAE,EAAE,CAFtB,GAE0B,EAAE,EAAE,cAAc,EAAE,GAAG,IAAI,WAAY,EAAE,EAAE,CAAE,EAAC,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG,KAAK,EAAE,EAAE,CAAC,IAAI,EACpf,EAAE,EAAE,EAAE,GAAG,KAAK,GAAG,WAAW,EAAE,EAAE,aAAa,EAAE,EAAE,YAAY,GAAG,EAAE,SAAS,KAAK,EAAE,QAAQ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,KAAK,WAAW,IAAI,EAAE,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,QAAQ,YAAY,GAAG,GAAG,UAAU,OAAO,OAAO,KAAK,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,cAAc,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,UAAU,KAAK,SAAS,GAAG,GAAG,IAAI,UAAU,OAAO,OAAO,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,MAAM,WAAW,IAAI,EAAE,KAAK,EACrf,GAAG,GAAG,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,IAAI,KAAK,GAAG,EAAE,QAAQ,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,UAAU,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,UAAU,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,UAAU,KAAK,WAAW,GAAG,GAAG,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,IAAI,GAAyC,OAAtC,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,WAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,KAAK,EAC1gB,EAAE,CAAC,GAAG,UAAU,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,EAAE,6BAA6B,EAAE,EAAE,GAAG,EAAE,EAAE,oCAAoC,EAAE,EAAE,GAAI,CAHqT,GAGjT,WAAY,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,GAAG,IAAI,EAAE,KAAK,GAAwB,EAAE,EAAvB,EAAE,EAAE,EAAE,YAAY,GAAS,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,eAAe,GAAG,EAAE,CAA4H,GAA3H,EAAE,EAAE,GAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,OAAO,IAAI,GAAG,IAAG,EAAE,OAAO,GAAM,EAAE,OAAO,IAAI,EAAE,EAAE,KAAK,IACxf,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAE,SAAS,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,IAAG,EAAE,EAAE,GAAE,SAAS,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,IAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAE,EAAC,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,cAAc,EAAE,EAAE,gBAAgB,EAA6C,GAA3C,EAAE,GAAG,GAAG,EAAE,EAAE,GAAkC,iBAA/B,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,IAAyB,QAAQ,EAAE,EAAE,QAAQ,iBAAiB,EAAE,GAAG,SAAS,MAAM,MAAM,qDAA0D,OAAL,KAAY,GAAG,IAAK,kBAAkB,EAAE,EAAE,GAAG,EAC1hB,GAAG,KAAK,MAAM,IAAK,cAAc,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,IAAK,mBAAmB,MAAM,QAAQ,MAAM,MAAM,uBAAuB,GAAoH,OAAhH,IAAI,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,YAAY,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,WAAW,mBAAmB,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAW,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,mBAAoB,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,SAAS,GAAG,GAAG,GAAG,KAAK,aAAa,EAAE,IAAI,MAAM,MAAM,sDAAsD,EAAE,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,GAAW,KAAR,EAAE,GAAG,IAAS,gBAAgB,IACpf,EAAE,MAAM,MAAM,uDAA8E,GAAvB,EAAE,GAAG,kBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,GAAE,WAAW,IAAI,EAAE,GAAG,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,KAAK,CAAC,wBAAwB,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,eAAe,IAAQ,EAAE,EAAN,EAAE,GAAS,GAAE,KAAK,CAAC,GAAG,WAAW,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,EAAE,WAAW,GAAG,CAAC,OAAO,EAAE,GAAG,IAAG,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,cAAc,GAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CACvf,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,eAAe,OAAO,SAAS,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,kBAAkB,EAAE,QAAQ,wBAAwB,EAAE,iBAAiB,GAAG,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,OAAO,EAAE,GAAE,WAAW,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,YAAuB,EAAE,SAAS,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,GAAE,SAAS,GAAG,OAAO,IAAI,GAAG,OAAO,IAClf,EAAE,EAAE,EAAE,EAAE,SAAS,KAAI,EAAE,EAAE,GAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,WAAU,SAAS,GAAG,EAAE,IAAI,EAAE,GAAE,KAAK,eAAsB,OAAP,EAAE,EAAE,GAAU,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,iBAAiB,GAAG,SAAS,EAAE,EAAE,EAAE,GAAG,QAAQ,GAAG,UAAU,EAAE,CAAe,GAAd,EAAE,EAAE,OAAO,GAAM,EAAE,EAAE,GAAG,MAAM,MAAM,6DAA6D,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,WAAW,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,IAAK,EAAE,EAAE,GAAG,GAAI,MAAM,EAAE,KAAM,MAAuB,GAApB,EAAE,EAAE,EAAE,WAAW,IAAO,QAC9c,MAAM,MAAM,oEADyc,EAC7f,EAAE,EAAE,GAAG,GAAG,IAAK,EAAE,EAAE,GAAG,GAAI,MAAM,EAAuF,CAAC,MAAM,CAAC,8BAA8B,EAAE,OAAO,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAe,KAAK,EAAE,KAAK,iBAAvB,EAAE,EAAE,EAAE,EAAE,IAAkC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,EAAM,KAAI,GAAG,UAAU,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,QAAQ,IAAI,IAAI,OAAO,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,SAAS,IAAI,EAAE,EAAE,mBAAmB,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE,eAAe,yBACpe,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,mBAAmB,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,SAAS,GAAe,OAAO,IAAnB,EAAE,EAAE,EAAE,GAAG,IAAe,QAAQ,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,EAAE,QAAQ,KAAK,uFAAuF,EAAE,EAAE,EAAE,GAAG,WAAY,CAPvL,GAO2L,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAA0B,IAAI,EAAE,EAAE,EAAE,EAAE,EAAnC,GAAG,EAAE,QAAQ,EAAE,OAAsB,IAAI,EAAE,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QACxf,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAE,EAAE,EAAE,EAAE,GAAG,WAAW,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAA+B,EAAa,EAA8B,EAAE,EAAE,EAA1E,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,GAAK,EAAE,EAAE,OAAS,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAQ,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAqB,IAAnB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAM,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,OACvf,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,WAAW,MAAM,EAAE,MAA0C,OAApC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,GAAU,EAAE,SAAS,CAAC,OAAO,SAAS,EAAE,EAAE,GAAmE,OAAhE,EAAE,kBAAmB,EAAE,CAAC,eAAe,GAAG,GAAG,GAAW,EAAE,GAAG,IAAb,EAAE,GAAG,IAAoB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,UAAU,GAAG,EAAE,EAAE,EAAE,UAAU,QAAQ,EAAE,CAAC,CADtM,GAC0M,EAAE,EAAE,sBAAsB,EAAE,EAAE,IAAI,WAAY,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,GAAE,WAAW,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAE,KAAK,CAAC,EAAE,EAAE,GAAG,WAAW,OAAO,EAAE,EAAE,GAAG,EAAE,IAC1gB,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,GAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAE,WAAC,EAAE,GAAG,IAAyB,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,IAAgE,EAE1Y,EAAE,EAAE,EAF0U,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,uBAAuB,CAAC,IAAI,EACnf,EAAE,EAAE,GAAG,GAAE,SAAS,GAAG,OAAO,EAAE,EAAE,IAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,eAAe,EAAE,eAAe,WAAW,CAAK,IAAQ,EAAE,EAAE,EAAhB,IAAQ,EAAE,EAAQ,EAAE,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,IAAK,UAAU,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,KAAI,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,EAAE,eAAe,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,IAAI,MAAM,IAAK,QAAQ,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,EAAE,EAC1f,EAAE,aAAa,EAAE,GAAG,EAAE,YAAsB,IAAI,EAAE,EAAE,cAAc,aAAa,CAAC,MAAM,GAAE,CAAE,GAAG,EAAE,OAAO,MAAM,EAAE,EAAE,UAAU,GAAG,CAAQ,IAAP,EAAE,EAAE,GAAO,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAuC,IAAtC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG,CAAoE,IAAnE,GAAG,EAAE,cAAc,eAAe,GAAG,EAAE,QAAQ,EAAE,EAAE,aAAa,GAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,UAAU,GACpf,EAAE,EAAE,SAAS,EAAE,CAAE,CAJ6S,GAIzS,EAAE,EAAE,2CAA2C,EAAE,EAAE,IAAI,EAAE,GAAG,WAAW,KAAK,yBAAyB,EAAE,EAAE,GAAG,UAAU,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,YAAY,EAAE,GAAG,EAAE,GAAG,UAAU,qBAAqB,SAAS,EAAE,EAAE,EAAE,GAAG,OAAG,EAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAiB,KAAV,EAAE,SAAoB,EAAE,EAAE,GAAG,EAAE,cAAc,aAAY,EAAE,EAAE,OAAc,EAAE,EAAE,GAAG,EAAE,GAAE,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,uBAAuB,EAAE,IAAI,WAAY,EAAE,GAAG,WAAW,IAAI,EAAE,KAAK,GAAG,WAAW,IAAI,IAAI,EAAE,KAAK,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,WAAW,QAAQ,MAAM,OAAO,CAAC,CAAC,MAAM,GAAE,CAAE,OAAO,CAAC,CAAtH,GACrc,KAAK,qBAAqB,SAAS,EAAE,EAAE,EAAE,GAAkB,GAAf,EAAE,GAAG,EAAE,EAAE,GAAG,GAAM,EAAE,EAAE,MAAM,MAAM,4FAA4F,IAAI,EAAE,EAAE,KAAK,eAAqQ,OAAtP,IAAI,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,SAAS,KAAK,qCAAqC,EAAE,gBAAgB,EAAE,KAAK,cAAc,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,iBAAiB,GAAG,EAAE,kBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAK,SAAS,EAAE,cAAc,QAAQ,EAAE,UAAU,CAAE,EAAQ,CAAC,EAAE,KAAK,+BAA+B,SAAS,GAAG,MAAM,mCAC5f,EAAE,WAAW,EAAE,KAAK,YAAY,SAAS,EAAE,GAAG,EAAE,MAAM,gCAAgC,EAAE,KAAK,EAAE,aAAe,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,sBAAsB,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,aAAa,MAAM,MAAM,EAAE,EAAE,GAAG,UAAU,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,YAAY,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,2BAA2B,EAAE,GAAI,CAFsE,EAEnE,GAAG,CApI9U,IAAA,EAAA,SAAA,EAAA,EAAA;;;;;IAAA,SAAA,EAAA,GAAA,UAAA,MAAA,kCAAA,EAAA,iKAAA,EAAA,EAAA,EC8BR,ED9BQ,EAAA,CAAA,QAAA,IAAA,GAAA,MAAA,WAAA,GEN2D,EAAA,QAAyS,SAAU,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAA2C,IAAI,GAAZ,EAAiB,OAAjB,EAA0B,GAAM,GAAG,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,MAAM,uBAAuB,EAAE,KAAK,MAAM,EAAE,KAAK,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,SAAQ,SAAS,GAAoB,OAAO,EAAlB,EAAE,GAAG,GAAG,IAAgB,EAAE,GAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAA2C,IAA1C,IAAI,EAA8B,EAAgB,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,IAAI,OAAO,CAAE,CAAzb,CAA2b,CAAC,EAAE,CAAC,SAAS,EAAQ,EAAO,IACx0B,WACE,IAAI,EAMA,EAAI,EAJN,WADS,EACF,EAAQ,WAER,OAAO,KAIhB,IAAI,EAAmB,CACrB,KAAM,SAAU,EAAS,EAAe,EAAqB,EAAW,GACtE,EAAG,MAAM,gBAAgB,mBAAmB,GAAS,WACnD,IAAI,EAAI,EAAU,YAAY,QAAQ,GAClC,GAAK,IACP,EAAU,YAAY,OAAO,EAAG,GAChC,EAAU,aAAa,OAAO,EAAG,GAE3C,IACM,EAAU,YAAY,KAAK,GAC3B,EAAU,aAAa,KAAK,EAAG,gBAAsB,KAAE,OAAO,YAAgB,EAAS,EAAe,EAAqB,EAAW,IACtI,EAAiB,OAAO,EAAS,EAAe,EAAqB,EAAW,EACjF,EAED,OAAQ,SAAU,EAAS,EAAe,EAAqB,EAAW,GACxE,IAAI,EAAQ,EAAG,KAAK,KACpB,GAAqB,iBAAV,EACT,EAAQ,UAAY,EAAK,EAAE,QACtB,GAAI,EAAM,IACf,EAAQ,UAAY,EAAK,EAAE,EAAM,IAAK,EAAM,cAE5C,IAAK,IAAI,KAAQ,EAAO,CACtB,IACI,EADA,EAAU,EAAM,GAQpB,GALE,EADqB,iBAAZ,EACK,EAAK,EAAE,GAGP,EAAK,EAAE,EAAQ,IAAK,EAAG,KAAK,EAAQ,UAExC,QAAR,EACF,EAAQ,UAAY,MAEjB,CACH,IAAI,EAAM,SAAS,cAAc,OACjC,EAAI,UAAY,EAChB,EAAQ,aAAa,EAAM,EAAI,UAC3C,CACA,CAEA,GAGM,EAAY,CACd,YAAa,GACb,aAAc,GAEd,YAAa,SAAU,GACrB,EAAK,OAAO,GACZ,EAAU,UAAU,GACpB,EAAU,aAAa,SAAQ,SAAU,GACvC,OAAO,EAAE,YACjB,aACiB,YAA4B,EAAE,GAAG,MAC1C,EAAE,QAAQ,MAEb,EAED,KAAM,SAAU,EAAe,EAAU,EAAU,GACjD,EAAK,GAAY,OAAO,GACxB,EAAI,GAAU,OAAO,EAErB,EAAK,KAAK,CACR,iBAAkB,KAClB,IAAK,GAAY,KACjB,SAAU,IAGZ,EAAG,gBAAsB,KAAI,EAC7B,EAAU,UAAY,EAAG,WAAW,GACpC,EAAU,YAAY,EACvB,EAED,EAAG,WACD,IAAI,EAAO,UACX,OAAO,EAAG,UAAS,WAEjB,OADA,EAAU,YACH,EAAK,EAAE,MAAM,EAAM,EAClC,GACK,EAED,KAAM,YAGG,EACT,EAAO,QAAU,EAEjB,OAAO,UAAY,CAEtB,CAlGD,EAoGA,EAAE,CAAC,QAAU,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAG7C,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAAW,OAAO,QAAU,SAAU,GAAU,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,KAAQ,EAAO,GAAO,EAAO,IAAY,OAAO,GAEnP,EAAgb,SAAU,EAAK,GAAK,GAAI,MAAM,QAAQ,GAAQ,OAAO,EAAY,GAAI,OAAO,YAAY,OAAO,GAAQ,OAAxf,SAAuB,EAAK,GAAK,IAAI,EAAO,GAAQ,KAAe,KAAgB,SAAgB,IAAM,IAAK,IAAiC,EAA7B,EAAK,EAAI,OAAO,cAAmB,GAAM,EAAK,EAAG,QAAQ,QAAoB,EAAK,KAAK,EAAG,QAAY,GAAK,EAAK,SAAW,GAA3D,MAAK,CAAoE,MAAO,GAAO,KAAW,EAAK,CAAI,SAAa,KAAW,GAAM,EAAW,QAAG,EAAW,QAAA,CAAe,QAAE,GAAI,EAAI,MAAM,CAAG,EAAK,OAAO,CAAK,CAAwH,CAAc,EAAK,GAAa,MAAM,IAAI,UAAU,uDAA4D,EAI9oB,EAYJ,SAAiC,GAAO,GAAI,GAAO,EAAI,WAAc,OAAO,EAAc,IAAI,EAAS,CAAE,EAAE,GAAW,MAAP,EAAe,IAAK,IAAI,KAAO,EAAW,OAAO,UAAU,eAAe,KAAK,EAAK,KAAM,EAAO,GAAO,EAAI,IAAgC,OAAtB,EAAO,QAAU,EAAY,CAAS,CAZ/P,CAFC,EAAQ,YAMjB,EAAW,EAFD,EAAQ,aAQtB,SAAS,EAAuB,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAU7F,SAAS,EAAU,EAAU,GAAc,GAA0B,mBAAf,GAA4C,OAAf,EAAuB,MAAM,IAAI,UAAU,kEAAoE,GAAe,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,cAAmB,YAAgB,mBAA6B,IAAY,OAAO,eAAiB,OAAO,eAAe,EAAU,GAN9b,SAAmB,EAAK,GAA6D,IAAjD,IAAI,EAAO,OAAO,oBAAoB,GAAoB,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CAAE,IAAI,EAAM,EAAK,GAAQ,EAAQ,OAAO,yBAAyB,EAAU,GAAU,GAAS,EAAM,uBAAgB,EAAI,IAAsB,OAAO,eAAe,EAAK,EAAK,EAAS,CAAc,CAM4I,CAAU,EAAU,GAAY,CAW5e,IAAI,EAAY,SAAU,GAGxB,SAAS,EAAU,EAAS,EAAO,GACjC,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IAnBvF,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,CAqBnJ,CAAgB,KAAM,GAEtB,IAAI,EArBR,SAAoC,EAAM,GAAQ,IAAK,EAAQ,MAAM,IAAI,eAAe,6DAAgE,OAAO,GAAyB,iBAAT,GAAqC,mBAAT,EAA8B,EAAP,CAAY,CAqB9N,CAA2B,KAAM,EAAc,KAAK,OAYhE,OAVA,EAAM,QAAU,EAChB,EAAM,MAAQ,EACd,EAAM,SAAW,EACjB,EAAM,QAAU,EAChB,EAAM,OAAS,EAAS,QAAQ,OAAO,oBAEvC,EAAM,MAAQ,GACd,EAAM,MAAQ,GAEd,EAAM,SAAW,EAAM,QAAQ,MAAQ,EAAM,QAAQ,KAAK,EAAU,EAAQ,QAAS,GAC9E,CACX,CAqQE,OAzRA,EAAU,EAAW,GAsBrB,EAAU,UAAU,UAAY,SAAmB,EAAW,EAAY,GACxE,IAAI,EAAS,KAGT,EAAS,GACT,EAAU,GACV,EAAkB,GAClB,EAAmB,GAqCvB,OAnCA,EAAU,SAAQ,SAAU,GAC1B,IAAI,KAEJ,EAAW,SAAQ,SAAU,GAC3B,IAAI,EAAO,EAAM,IAAM,EAEnB,EAAO,MAAM,kBAAkB,EAAK,GACtC,EAAO,MAAM,GAAQ,EACZ,EAAO,MAAM,GAAQ,IAEI,IAAvB,EAAO,MAAM,GAChB,EAAQ,QAAQ,GAAQ,GAAG,EAAQ,KAAK,IAE5C,EAAO,MAAM,GAAQ,EAErB,KAEI,EAAQ,QAAQ,GAAQ,GAAG,EAAQ,KAAK,GACxC,EAAO,QAAQ,GAAQ,GAAG,EAAO,KAAK,GACtC,EAAiB,QAAQ,GAAM,GAAG,EAAiB,KAAK,IAE1E,IAEW,GAAkB,EAAgB,KAAK,EAClD,KAEQ,EAAO,QAAU,EAAQ,SAC3B,KAAK,MAAM,KAAK,CACd,QAAS,EACT,OAAQ,CAAE,EACV,OAAQ,GACR,SAAU,IAIP,CACL,OAAQ,EACR,QAAS,EACT,gBAAiB,EACjB,iBAAkB,IAItB,EAAU,UAAU,OAAS,SAAgB,EAAM,EAAK,GACtD,IAAI,EAAS,KAET,EAAc,EAAK,MAAM,KAEzB,EAAe,EAAe,EAAa,GAE3C,EAAM,EAAa,GACnB,EAAK,EAAa,GAGlB,GAAK,KAAK,KAAK,gBAAiB,EAAK,EAAI,GAEzC,GACF,KAAK,MAAM,kBAAkB,EAAK,EAAI,GAIxC,KAAK,MAAM,GAAQ,GAAO,EAAI,EAE9B,KAAK,MAAM,SAAQ,SAAU,GAC3B,EAAM,SAAS,EAAE,OAAQ,CAAC,GAAM,GAzGtC,SAAgB,EAAK,GAGnB,IAFA,IAAI,EAAQ,EAAI,QAAQ,IAEN,IAAX,GACL,EAAI,OAAO,EAAO,GAClB,EAAQ,EAAI,QAAQ,EAExB,CAmGM,CAAO,EAAE,QAAS,GAEd,GAAK,EAAE,OAAO,KAAK,GAEE,IAArB,EAAE,QAAQ,QAAiB,EAAE,OAC/B,EAAE,OAAO,OAAS,EAAE,SAAS,EAAE,QAAU,EAAE,WAC3C,EAAO,KAAK,SAAU,EAAE,QACxB,EAAE,QAEV,IAGI,KAAK,MAAQ,KAAK,MAAM,QAAO,SAAU,GACvC,OAAQ,EAAE,IAChB,KAGE,EAAU,UAAU,KAAO,SAAc,EAAK,EAAI,EAAQ,EAAO,EAAM,GACrE,IAAI,EAAS,KAKb,GAHK,IAAO,EAAQ,GACf,IAAM,EAAO,MAEb,EAAI,OAAQ,OAAO,EAAS,KAAM,IAEvC,KAAK,QAAQ,GAAQ,EAAK,GAAI,SAAU,EAAK,GACvC,GAAO,GAA0B,EAAQ,EAC3C,YAAW,WACT,EAAO,KAAK,KAAK,EAAQ,EAAK,EAAI,IAAU,EAAc,EAAP,EAAU,EAC9D,GAAE,GAGL,EAAS,EAAK,EACpB,KAGE,EAAU,UAAU,KAAO,SAAc,EAAW,EAAY,GAC9D,IAAI,EAAS,KAEb,IAAK,KAAK,QAER,OADA,KAAK,OAAO,KAAK,kEACV,GAAY,IAErB,IAAI,EAAU,EAAS,GAAI,KAAK,QAAQ,QAAS,KAAK,QAAQ,SAErC,iBAAd,IAAwB,EAAY,KAAK,SAAS,cAAc,mBAAmB,IACpE,iBAAf,IAAyB,EAAa,CAAC,IAElD,IAoCU,EApCN,EAAS,KAAK,UAAU,EAAW,EAAY,GAC9C,EAAO,OAAO,OAMf,EAAQ,mBAAqB,KAAK,QAAQ,UAC5C,KAAK,KAAK,EAAO,gBAAiB,EAAO,iBAAkB,YAAa,KAAM,MAAM,SAAU,EAAK,GAC7F,GAAK,EAAO,OAAO,KAAK,sBAAwB,EAAO,iBAAiB,KAAK,MAAQ,kBAAoB,EAAO,gBAAgB,KAAK,MAAQ,2BAA4B,IACxK,GAAO,GAAM,EAAO,OAAO,IAAI,qBAAuB,EAAO,iBAAiB,KAAK,MAAQ,kBAAoB,EAAO,gBAAgB,KAAK,MAAQ,oBAAqB,GAE7K,EAAO,OAAO,SAAQ,SAAU,GAC9B,IAAI,EAAe,EAAK,MAAM,KAE1B,EAAe,EAAe,EAAc,GAE5C,EAAI,EAAa,GACjB,EAAI,EAAa,GAGjB,EAAS,EAAM,QAAQ,EAAM,CAAC,EAAG,IACrC,GAAI,EACF,EAAO,OAAO,EAAM,EAAK,OACpB,CACL,IAAI,EAAO,qBAAuB,EAAI,iBAAmB,EAAI,2BAC7D,EAAO,OAAO,EAAM,GACpB,EAAO,OAAO,MAAM,EAChC,CACA,GACA,KAMc,EAAU,SAAiB,GAC7B,IAAI,EAAS,KAET,EAAe,EAAK,MAAM,KAE1B,EAAe,EAAe,EAAc,GAE5C,EAAM,EAAa,GACnB,EAAK,EAAa,GAGtB,KAAK,KAAK,EAAK,EAAI,OAAQ,KAAM,MAAM,SAAU,EAAK,GAChD,GAAK,EAAO,OAAO,KAAK,qBAAuB,EAAK,iBAAmB,EAAM,UAAW,IACvF,GAAO,GAAM,EAAO,OAAO,IAAI,oBAAsB,EAAK,iBAAmB,EAAK,GAEvF,EAAO,OAAO,EAAM,EAAK,EACvC,KAKU,EAAO,OAAO,SAAQ,SAAU,GAC9B,EAAQ,KAAK,EAAQ,EACjC,KAzDW,EAAO,QAAQ,QAAQ,KA8DhC,EAAU,UAAU,OAAS,SAAgB,EAAW,GACtD,IAAI,EAAS,KAER,KAAK,SACR,KAAK,OAAO,KAAK,kEAEnB,IA6BU,EA7BN,EAAU,EAAS,GAAI,KAAK,QAAQ,QAAS,KAAK,QAAQ,SAErC,iBAAd,IAAwB,EAAY,KAAK,SAAS,cAAc,mBAAmB,IACpE,iBAAf,IAAyB,EAAa,CAAC,IAG9C,EAAQ,mBAAqB,KAAK,QAAQ,UAC5C,KAAK,KAAK,EAAW,EAAY,YAAa,KAAM,MAAM,SAAU,EAAK,GACnE,GAAK,EAAO,OAAO,KAAK,wBAA0B,EAAW,KAAK,MAAQ,kBAAoB,EAAU,KAAK,MAAQ,2BAA4B,IAChJ,GAAO,GAAM,EAAO,OAAO,IAAI,uBAAyB,EAAW,KAAK,MAAQ,kBAAoB,EAAU,KAAK,MAAQ,oBAAqB,GAErJ,EAAU,SAAQ,SAAU,GAC1B,EAAW,SAAQ,SAAU,GAC3B,IAAI,EAAS,EAAM,QAAQ,EAAM,CAAC,EAAG,IACrC,GAAI,EACF,EAAO,OAAO,EAAI,IAAM,EAAG,EAAK,OAC3B,CACL,IAAI,EAAQ,uBAAyB,EAAI,iBAAmB,EAAI,2BAChE,EAAO,OAAO,EAAI,IAAM,EAAG,GAC3B,EAAO,OAAO,MAAM,EAClC,CACA,GACA,GACA,KAMc,EAAU,SAAiB,GAC7B,IAAI,EAAS,KAET,EAAe,EAAK,MAAM,KAE1B,EAAe,EAAe,EAAc,GAE5C,EAAM,EAAa,GACnB,EAAK,EAAa,GAGtB,KAAK,KAAK,EAAK,EAAI,OAAQ,KAAM,MAAM,SAAU,EAAK,GAChD,GAAK,EAAO,OAAO,KAAK,uBAAyB,EAAK,iBAAmB,EAAM,UAAW,IACzF,GAAO,GAAM,EAAO,OAAO,IAAI,sBAAwB,EAAK,iBAAmB,EAAK,GAEzF,EAAO,OAAO,EAAM,EAAK,EACvC,KAKU,EAAU,SAAQ,SAAU,GAC1B,EAAW,SAAQ,SAAU,GAC3B,EAAQ,KAAK,EAAQ,EAAI,IAAM,EAC7C,GACA,MAKE,EAAU,UAAU,YAAc,SAAqB,EAAW,EAAW,EAAK,GAC5E,KAAK,SAAW,KAAK,QAAQ,QAAQ,KAAK,QAAQ,OAAO,EAAW,EAAW,EAAK,GAGnF,GAAc,EAAU,IAC7B,KAAK,MAAM,YAAY,EAAU,GAAI,EAAW,EAAK,IAGhD,CACT,CA3RgB,CAvBK,EAFA,EAAQ,mBAoTZ,SAEjB,EAAQ,QAAU,CACjB,EAAC,CAAC,iBAAiB,EAAE,WAAW,GAAG,UAAU,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAG9E,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAAW,OAAO,QAAU,SAAU,GAAU,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,KAAQ,EAAO,GAAO,EAAO,IAAY,OAAO,IAgBvP,SAAiC,GAAO,GAAI,GAAO,EAAI,WAAc,OAAO,EAAc,IAAI,EAAS,CAAE,EAAE,GAAW,MAAP,EAAe,IAAK,IAAI,KAAO,EAAW,OAAO,UAAU,eAAe,KAAK,EAAK,KAAM,EAAO,GAAO,EAAI,IAAU,EAAO,QAAU,CAAqB,CAZ/P,CAFC,EAAQ,YAIrB,IAEI,EAAW,EAFD,EAAQ,aAQtB,SAAS,EAAuB,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAU7F,SAAS,EAAU,EAAU,GAAc,GAA0B,mBAAf,GAA4C,OAAf,EAAuB,MAAM,IAAI,UAAU,kEAAoE,GAAe,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,cAAmB,YAAgB,mBAA6B,IAAY,OAAO,eAAiB,OAAO,eAAe,EAAU,GAN9b,SAAmB,EAAK,GAA6D,IAAjD,IAAI,EAAO,OAAO,oBAAoB,GAAoB,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CAAE,IAAI,EAAM,EAAK,GAAQ,EAAQ,OAAO,yBAAyB,EAAU,GAAU,GAAS,EAAM,uBAAgB,EAAI,IAAsB,OAAO,eAAe,EAAK,EAAK,EAAS,CAAc,CAM4I,CAAU,EAAU,GAAY,CAE5e,IAAI,EAAY,SAAU,GAGxB,SAAS,EAAU,EAAO,EAAO,GAC/B,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IAVvF,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,CAYnJ,CAAgB,KAAM,GAEtB,IAAI,EAZR,SAAoC,EAAM,GAAQ,IAAK,EAAQ,MAAM,IAAI,eAAe,6DAAgE,OAAO,GAAyB,iBAAT,GAAqC,mBAAT,EAA8B,EAAP,CAAY,CAY9N,CAA2B,KAAM,EAAc,KAAK,OAShE,OAPA,EAAM,MAAQ,EACd,EAAM,MAAQ,EACd,EAAM,SAAW,EACjB,EAAM,QAAU,EAChB,EAAM,OAAS,EAAS,QAAQ,OAAO,kBAEvC,EAAM,OAAS,EAAM,MAAM,MAAQ,EAAM,MAAM,KAAK,EAAU,EAAQ,MAAO,GACtE,CACX,CAkCE,OAnDA,EAAU,EAAW,GAmBrB,EAAU,UAAU,KAAO,SAAc,EAAW,EAAY,GAC9D,IAAI,EAAS,KAEb,IAAK,KAAK,MAAO,OAAO,GAAY,IACpC,IAAI,EAAU,EAAS,GAAI,KAAK,MAAM,QAAS,KAAK,QAAQ,OAEnC,iBAAd,IAAwB,EAAY,KAAK,SAAS,cAAc,mBAAmB,IAG1F,EAAQ,QACV,KAAK,MAAM,KAAK,GAAW,SAAU,EAAK,GAExC,GADI,GAAK,EAAO,OAAO,MAAM,qBAAuB,EAAU,KAAK,MAAQ,qBAAsB,GAC7F,EACF,IAAK,IAAI,KAAK,EACZ,IAAK,IAAI,KAAK,EAAK,GACjB,GAAU,cAAN,EAAJ,CACA,IAAI,EAAS,EAAK,GAAG,GACjB,GAAQ,EAAO,MAAM,kBAAkB,EAAG,EAAG,EAF1B,CAMzB,GAAU,GACtB,IAEU,GAAU,KAIlB,EAAU,UAAU,KAAO,WACrB,KAAK,OAAS,KAAK,QAAQ,OAAS,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,KAAK,KAAK,MAAM,OAG1F,CACT,CArDgB,CAdK,EAFA,EAAQ,mBAqEZ,SAEjB,EAAQ,QAAU,CACjB,EAAC,CAAC,iBAAiB,EAAE,WAAW,GAAG,UAAU,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAG9E,OAAO,eAAe,EAAS,aAAc,CAC5C,WAKD,IAAI,EAAe,WAClB,SAAS,KAHV,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,EAIrJ,CAAgB,KAAM,GAEtB,KAAK,UAAY,EACnB,CAkDC,OAhDA,EAAa,UAAU,GAAK,SAAY,EAAQ,GAC/C,IAAI,EAAQ,KAEZ,EAAO,MAAM,KAAK,SAAQ,SAAU,GACnC,EAAM,UAAU,GAAS,EAAM,UAAU,IAAU,GACnD,EAAM,UAAU,GAAO,KAAK,EAC/B,KAGC,EAAa,UAAU,IAAM,SAAa,EAAO,GAChD,IAAI,EAAS,KAER,KAAK,UAAU,IAIpB,KAAK,UAAU,GAAO,SAAQ,WAC7B,GAAK,EAEE,CACN,IAAI,EAAQ,EAAO,UAAU,GAAO,QAAQ,GACxC,GAAS,GACZ,EAAO,UAAU,GAAO,OAAO,EAAO,EAE3C,aANW,EAAO,UAAU,EAO5B,KAGC,EAAa,UAAU,KAAO,SAAc,GAC3C,IAAK,IAAI,EAAO,UAAU,OAAQ,EAAO,MAAM,EAAO,EAAI,EAAO,EAAI,GAAI,EAAO,EAAG,EAAO,EAAM,IAC/F,EAAK,EAAO,GAAK,UAAU,GAGxB,KAAK,UAAU,IAClB,KAAK,UAAU,GAAO,SAAQ,SAAU,GACvC,EAAS,aAAiB,EAC9B,IAGM,KAAK,UAAU,MAClB,KAAK,UAAU,KAAK,SAAQ,SAAU,GACrC,IAAI,EAEJ,EAAS,MAAM,GAAW,EAAO,CAAC,IAAQ,OAAO,MAAM,EAAM,GACjE,KAIQ,CACR,CAxDmB,GA0DnB,EAAQ,QAAU,CAClB,EAAE,IAAI,EAAE,CAAC,SAAS,EAAQ,EAAO,GAGjC,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAEI,EAQJ,SAAiC,GAAO,GAAI,GAAO,EAAI,WAAc,OAAO,EAAc,IAAI,EAAS,CAAE,EAAE,GAAW,MAAP,EAAe,IAAK,IAAI,KAAO,EAAW,OAAO,UAAU,eAAe,KAAK,EAAK,KAAM,EAAO,GAAO,EAAI,IAAgC,OAAtB,EAAO,QAAU,EAAY,CAAS,CAR/P,CAFC,EAAQ,YAMjB,EAEJ,SAAgC,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAF9E,CAFD,EAAQ,aAUtB,IAAI,EAAe,WACjB,SAAS,IACP,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IAJvF,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,EAMnJ,CAAgB,KAAM,GAEtB,KAAK,OAAS,EAAS,QAAQ,OAAO,gBAEtC,KAAK,KAAK,KACd,CA0IE,OAxIA,EAAa,UAAU,KAAO,WAC5B,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GACvE,UAAU,KAGpB,KAAK,QAAU,EACf,KAAK,OAAS,EAAQ,eAAiB,EAAQ,cAAc,QAAU,SAAU,GAC/E,OAAO,IAGN,EAAQ,gBAAe,EAAQ,cAAgB,CAAE,iBAEtD,IAAI,EAAQ,EAAQ,cAEpB,KAAK,YAAc,EAAM,YAEzB,KAAK,OAAS,EAAM,OAAS,EAAM,YAAY,EAAM,QAAU,EAAM,eAAiB,KACtF,KAAK,OAAS,EAAM,OAAS,EAAM,YAAY,EAAM,QAAU,EAAM,eAAiB,KACtF,KAAK,gBAAkB,EAAM,gBAAkB,EAAM,YAAY,EAAM,iBAAmB,EAAM,iBAAmB,IAEnH,KAAK,eAAiB,EAAM,eAAiB,GAAK,EAAM,gBAAkB,IAC1E,KAAK,eAAiB,KAAK,eAAiB,GAAK,EAAM,gBAAkB,GAEzE,KAAK,cAAgB,EAAM,cAAgB,EAAM,YAAY,EAAM,eAAiB,EAAM,sBAAwB,EAAM,YAAY,OACpI,KAAK,cAAgB,EAAM,cAAgB,EAAM,YAAY,EAAM,eAAiB,EAAM,sBAAwB,EAAM,YAAY,KAGpI,KAAK,eAGP,EAAa,UAAU,MAAQ,WACzB,KAAK,SAAS,KAAK,KAAK,KAAK,UAGnC,EAAa,UAAU,YAAc,WAEnC,IAAI,EAAY,KAAK,OAAS,QAAU,KAAK,OAC7C,KAAK,OAAS,IAAI,OAAO,EAAW,KAEpC,IAAI,EAAoB,KAAK,OAAS,KAAK,eAAiB,QAAU,KAAK,eAAiB,KAAK,OACjG,KAAK,eAAiB,IAAI,OAAO,EAAmB,KAEpD,IAAI,EAAmB,KAAK,cAAgB,QAAU,KAAK,cAC3D,KAAK,cAAgB,IAAI,OAAO,EAAkB,MAGpD,EAAa,UAAU,YAAc,SAAqB,EAAK,EAAM,GACnE,IAAI,EAAQ,KAER,SACA,SAEJ,SAAS,EAAU,GACjB,OAAO,EAAI,QAAQ,MAAO,OAChC,CAEI,IAAI,EAAe,SAAsB,GACvC,GAAI,EAAI,QAAQ,EAAM,iBAAmB,EAAG,OAAO,EAAM,QAAQ,EAAM,GAEvE,IAAI,EAAI,EAAI,MAAM,EAAM,iBACpB,EAAI,EAAE,QAAQ,OACd,EAAI,EAAE,KAAK,EAAM,iBAAiB,OAEtC,OAAO,EAAM,OAAO,EAAM,QAAQ,EAAM,GAAI,EAAG,IAMjD,IAHA,KAAK,cAGE,EAAQ,KAAK,eAAe,KAAK,IAAM,CAC5C,IAAI,EAAS,EAAa,EAAM,GAAG,QACnC,EAAM,EAAI,QAAQ,EAAM,GAAI,GAC5B,KAAK,eAAe,UAAY,CACtC,CAGI,KAAO,EAAQ,KAAK,OAAO,KAAK,IAET,iBADrB,EAAQ,EAAa,EAAM,GAAG,WACC,EAAQ,EAAM,WAAW,IACnD,IACH,KAAK,OAAO,KAAK,8BAAgC,EAAM,GAAK,sBAAwB,GACpF,EAAQ,IAEV,EAAQ,KAAK,YAAc,EAAU,EAAM,OAAO,IAAU,EAAU,GACtE,EAAM,EAAI,QAAQ,EAAM,GAAI,GAC5B,KAAK,OAAO,UAAY,EAE1B,OAAO,GAGT,EAAa,UAAU,KAAO,SAAc,EAAK,GAC/C,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAE/E,SACA,SAEA,EAAgB,KAAK,MAAM,KAAK,UAAU,IAG9C,SAAS,EAAU,GACjB,OAAO,EAAI,QAAQ,MAAO,OAChC,CAGI,SAAS,EAAiB,GACxB,GAAI,EAAI,QAAQ,KAAO,EAAG,OAAO,EAEjC,IAAI,EAAI,EAAI,MAAM,KAClB,EAAM,EAAE,QACR,IAAI,EAAgB,EAAE,KAAK,KAC3B,EAAgB,KAAK,YAAY,EAAe,GAEhD,IACE,EAAgB,KAAK,MAAM,EAC5B,CAAC,MAAO,GACP,KAAK,OAAO,MAAM,oDAAsD,EAAK,EACrF,CAEM,OAAO,CACb,CAGI,IAzBA,EAAc,sBAyBP,EAAQ,KAAK,cAAc,KAAK,IAEhB,iBADrB,EAAQ,EAAG,EAAiB,KAAK,KAAM,EAAM,GAAG,QAAS,MAC1B,EAAQ,EAAM,WAAW,IACnD,IACH,KAAK,OAAO,KAAK,8BAAgC,EAAM,GAAK,sBAAwB,GACpF,EAAQ,IAEV,EAAQ,KAAK,YAAc,EAAU,EAAM,OAAO,IAAU,EAAU,GACtE,EAAM,EAAI,QAAQ,EAAM,GAAI,GAC5B,KAAK,OAAO,UAAY,EAE1B,OAAO,GAGF,CACT,CApJmB,GAsJnB,EAAQ,QAAU,CACjB,EAAC,CAAC,WAAW,GAAG,UAAU,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAG3D,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAEI,EAEJ,SAAgC,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAF9E,CAFD,EAAQ,aAQtB,SAAS,EAAW,GAClB,OAAO,EAAO,OAAO,GAAG,cAAgB,EAAO,MAAM,EACvD,CAEA,IAAI,EAAe,WACjB,SAAS,EAAa,IAPxB,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,EAQnJ,CAAgB,KAAM,GAEtB,KAAK,QAAU,EAEf,KAAK,UAAY,KAAK,QAAQ,cAC9B,KAAK,OAAS,EAAS,QAAQ,OAAO,gBAC1C,CAgFE,OA9EA,EAAa,UAAU,wBAA0B,SAAiC,GAChF,GAAI,EAAK,QAAQ,KAAO,EAAG,OAAO,EAElC,IACI,EAAI,EAAK,MAAM,KACnB,OAAO,KAAK,mBAFO,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,SAErB,QAAQ,IAAS,EAAI,EAAE,GAAG,cAAgB,EAAE,KAG1F,EAAa,UAAU,mBAAqB,SAA4B,GAEtE,GAAoB,iBAAT,GAAqB,EAAK,QAAQ,MAAQ,EAAG,CACtD,IAAI,EAAe,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAChE,EAAI,EAAK,MAAM,KAsBnB,OApBI,KAAK,QAAQ,aACf,EAAI,EAAE,KAAI,SAAU,GAClB,OAAO,EAAK,aACtB,IAC8B,IAAb,EAAE,QACX,EAAE,GAAK,EAAE,GAAG,cACZ,EAAE,GAAK,EAAE,GAAG,cAER,EAAa,QAAQ,EAAE,GAAG,gBAAkB,IAAG,EAAE,GAAK,EAAW,EAAE,GAAG,iBACpD,IAAb,EAAE,SACX,EAAE,GAAK,EAAE,GAAG,cAGQ,IAAhB,EAAE,GAAG,SAAc,EAAE,GAAK,EAAE,GAAG,eACtB,QAAT,EAAE,IAAgC,IAAhB,EAAE,GAAG,SAAc,EAAE,GAAK,EAAE,GAAG,eAEjD,EAAa,QAAQ,EAAE,GAAG,gBAAkB,IAAG,EAAE,GAAK,EAAW,EAAE,GAAG,gBACtE,EAAa,QAAQ,EAAE,GAAG,gBAAkB,IAAG,EAAE,GAAK,EAAW,EAAE,GAAG,iBAGrE,EAAE,KAAK,IACpB,CACM,OAAO,KAAK,QAAQ,WAAa,KAAK,QAAQ,aAAe,EAAK,cAAgB,GAItF,EAAa,UAAU,cAAgB,SAAuB,EAAM,GAIlE,OAH0B,iBAAtB,KAAK,QAAQ,MAA2B,KAAK,QAAQ,uBAAyB,KAChF,EAAO,KAAK,wBAAwB,KAE9B,KAAK,YAAc,KAAK,UAAU,QAAU,KAAK,UAAU,QAAQ,IAAS,GAGtF,EAAa,UAAU,mBAAqB,SAA4B,EAAM,GAC5E,IAAI,EAAQ,KAGgB,iBAD5B,EAAe,GAAgB,KAAK,QAAQ,aAAe,MACrB,EAAe,CAAC,IAEtD,IAAI,EAAQ,GACR,EAAU,SAAiB,GAC7B,IAAI,IAAa,UAAU,QAAU,YAAK,UAAU,KAA2B,UAAU,GAErF,EAAM,cAAc,EAAM,GAC5B,EAAM,KAAK,GAEX,EAAM,OAAO,KAAK,4CAA8C,IAepE,MAXoB,iBAAT,GAAqB,EAAK,QAAQ,MAAQ,GACzB,iBAAtB,KAAK,QAAQ,MAAyB,EAAQ,KAAK,mBAAmB,OAChD,gBAAtB,KAAK,QAAQ,MAAwB,EAAQ,KAAK,wBAAwB,KACrD,iBAAT,GAChB,EAAQ,KAAK,mBAAmB,IAGlC,EAAa,SAAQ,SAAU,GACzB,EAAM,QAAQ,GAAM,GAAG,EAAQ,EAAM,mBAAmB,GAClE,IAEW,GAGF,CACT,CAzFmB,GA6FnB,EAAQ,QAAU,CAClB,EAAE,CAAC,WAAW,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAG9C,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAA4B,mBAAX,QAAoD,iBAApB,OAAO,SAAwB,SAAU,GAAO,cAAc,CAAI,EAAK,SAAU,GAAO,OAAO,GAAyB,mBAAX,QAAyB,EAAI,cAAgB,OAAS,gBAAkB,CAAI,EAI1O,EAEJ,SAAgC,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAF9E,CAFD,EAAQ,aAUtB,IAAI,EAAO,CAAC,CAAE,KAAM,CAAC,MAAO,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,QAAS,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,MAAO,MAAO,KAAM,KAAM,QAAS,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,GAAI,CAAC,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,GAAI,CAAC,EAAG,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,KAAM,GAAI,GAAK,CAAE,KAAM,CAAC,KAAM,MAAO,GAAI,CAAC,EAAG,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,MAAO,MAAO,GAAI,CAAC,EAAG,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,EAAG,IAAK,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,IAAK,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,GAAI,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,IAAM,CAAE,KAAM,CAAC,OAAQ,GAAI,CAAC,EAAG,EAAG,GAAI,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,GAAI,IAAK,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,GAAI,GAAI,GAAK,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,IAAK,GAAI,IAAM,CAAE,KAAM,CAAC,MAAO,GAAI,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,KAEnjD,EAAqB,CACvB,EAAG,SAAW,GACZ,OAAO,OAAO,EAAI,EACnB,EACD,EAAG,SAAW,GACZ,OAAO,OAAY,GAAL,EACf,EACD,EAAG,SAAW,GACZ,OAAO,CACR,EACD,EAAG,SAAW,GACZ,OAAO,OAAO,EAAI,IAAM,GAAK,EAAI,KAAO,GAAK,EAAI,EAAI,IAAM,GAAK,EAAI,IAAM,IAAM,EAAI,IAAM,IAAM,EAAI,KAAO,IAAM,EAAI,EACtH,EACD,EAAG,SAAW,GACZ,OAAO,OAAa,IAAN,EAAU,EAAS,GAAL,EAAS,EAAS,GAAL,EAAS,EAAI,EAAI,KAAO,GAAK,EAAI,KAAO,GAAK,EAAI,EAAI,KAAO,GAAK,EAAI,EAC/G,EACD,EAAG,SAAW,GACZ,OAAO,OAAY,GAAL,EAAS,EAAI,GAAK,GAAK,GAAK,EAAI,EAAI,EACnD,EACD,EAAG,SAAW,GACZ,OAAO,OAAY,GAAL,EAAS,EAAI,EAAI,IAAM,GAAK,EAAI,IAAM,IAAM,EAAI,IAAM,IAAM,EAAI,KAAO,IAAM,EAAI,EAChG,EACD,EAAG,SAAW,GACZ,OAAO,OAAY,GAAL,EAAS,EAAS,GAAL,EAAS,EAAS,GAAL,GAAe,IAAL,EAAU,EAAI,EACjE,EACD,EAAG,SAAW,GACZ,OAAO,OAAO,GAAK,EACpB,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,EAAS,EAAS,GAAL,EAAS,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,EAAI,EAClE,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,GAAe,IAAL,EAAU,EAAS,GAAL,GAAe,IAAL,EAAU,EAAI,EAAI,GAAK,EAAI,GAAK,EAAI,EACrF,EACD,GAAI,SAAW,GACb,OAAO,OAAO,EAAI,IAAM,GAAK,EAAI,KAAO,GACzC,EACD,GAAI,SAAW,GACb,OAAO,OAAa,IAAN,EACf,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,EAAS,EAAS,GAAL,EAAS,EAAS,GAAL,EAAS,EAAI,EACtD,EACD,GAAI,SAAW,GACb,OAAO,OAAO,EAAI,IAAM,GAAK,EAAI,KAAO,GAAK,EAAI,EAAI,IAAM,IAAM,EAAI,IAAM,IAAM,EAAI,KAAO,IAAM,EAAI,EACvG,EACD,GAAI,SAAW,GACb,OAAO,OAAO,EAAI,IAAM,GAAK,EAAI,KAAO,GAAK,EAAU,IAAN,EAAU,EAAI,EAChE,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,GAAU,EAAI,IAAM,EAAI,EAAI,EAC3C,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,EAAS,EAAS,GAAL,EAAS,EAAI,EACzC,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,EAAS,EAAU,IAAN,GAAW,EAAI,IAAM,GAAK,EAAI,IAAM,GAAK,EAAI,EAAI,IAAM,IAAM,EAAI,IAAM,GAAK,EAAI,EAC5G,EACD,GAAI,SAAW,GACb,OAAO,OAAY,GAAL,EAAS,EAAU,IAAN,GAAW,EAAI,IAAM,GAAK,EAAI,IAAM,GAAK,EAAI,EACzE,EACD,GAAI,SAAW,GACb,OAAO,OAAO,EAAI,KAAO,EAAI,EAAI,EAAI,KAAO,EAAI,EAAI,EAAI,KAAO,GAAK,EAAI,KAAO,EAAI,EAAI,EAC3F,GAkBA,IAAI,EAAiB,WACnB,SAAS,EAAe,GACtB,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IAzFvF,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,EA2FnJ,CAAgB,KAAM,GAEtB,KAAK,cAAgB,EACrB,KAAK,QAAU,EAEf,KAAK,OAAS,EAAS,QAAQ,OAAO,kBAEtC,KAAK,MAzBT,WAAS,IAEH,EAAQ,CAAE,EASd,OARA,EAAK,SAAQ,SAAU,GACrB,EAAI,KAAK,SAAQ,SAAU,GACzB,OAAO,EAAM,GAAK,CAChB,QAAS,EAAI,GACb,QAAS,EAAmB,EAAI,IAExC,GACA,IACS,CACT,CAaiB,EACjB,CAgFE,OA9EA,EAAe,UAAU,QAAU,SAAiB,EAAK,GACvD,KAAK,MAAM,GAAO,GAGpB,EAAe,UAAU,QAAU,SAAiB,GAClD,OAAO,KAAK,MAAM,KAAK,cAAc,wBAAwB,KAG/D,EAAe,UAAU,YAAc,SAAqB,GAC1D,IAAI,EAAO,KAAK,QAAQ,GAExB,QAAO,GAAQ,EAAK,QAAQ,QAAU,IAGxC,EAAe,UAAU,UAAY,SAAmB,EAAM,GAC5D,IAAI,EAAQ,KAER,EAAO,KAAK,QAAQ,GAExB,IAAI,EAuDF,OADA,KAAK,OAAO,KAAK,6BAA+B,GACzC,GAtDP,IAAI,EAAO,WACT,GAA4B,IAAxB,EAAK,QAAQ,OAAc,MAAO,CAClC,EAAG,IAGP,IAAI,EAAM,EAAK,MAAQ,EAAK,QAAQ,GAAS,EAAK,QAAQ,KAAK,IAAI,IAC/D,EAAS,EAAK,QAAQ,GAGE,IAAxB,EAAK,QAAQ,QAAoC,IAApB,EAAK,QAAQ,KAC7B,IAAX,EACF,EAAS,SACW,IAAX,IACT,EAAS,KAIb,IAAI,EAAe,WACjB,OAAO,EAAM,QAAQ,SAAW,EAAO,WAAa,EAAM,QAAQ,QAAU,EAAO,WAAa,EAAO,YAKzG,MAAwC,OAApC,EAAM,QAAQ,kBACD,IAAX,EAAqB,CACrB,EAAG,IAEe,iBAAX,EAA4B,CACnC,EAAG,WAAa,EAAO,YAEpB,CACL,EAAG,KAIsC,OAApC,EAAM,QAAQ,mBAAsD,IAAxB,EAAK,QAAQ,QAAoC,IAApB,EAAK,QAAQ,IAM5D,IAAxB,EAAK,QAAQ,QAAoC,IAApB,EAAK,QAAQ,GAL1C,CACL,EAAG,KASF,CACL,EAAG,EAAM,QAAQ,SAAW,EAAI,WAAa,EAAM,QAAQ,QAAU,EAAI,WAAa,EAAI,WAEpG,CAjDiB,GAmDX,MAAoE,qBAAxD,EAAuB,YAAc,EAAQ,IAA4B,EAAK,QAA1F,EAOG,CACT,CA7FqB,GAiGrB,EAAQ,QAAU,CAClB,EAAE,CAAC,WAAW,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAG9C,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAAW,OAAO,QAAU,SAAU,GAAU,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,KAAQ,EAAO,GAAO,EAAO,IAAY,OAAO,GAInP,EAQJ,SAAgC,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CARxE,CAFA,EAAQ,mBAMzB,EAEJ,SAAiC,GAAO,GAAI,GAAO,EAAI,WAAc,OAAO,EAAc,IAAI,EAAS,CAAE,EAAE,GAAW,MAAP,EAAe,IAAK,IAAI,KAAO,EAAW,OAAO,UAAU,eAAe,KAAK,EAAK,KAAM,EAAO,GAAO,EAAI,IAAgC,OAAtB,EAAO,QAAU,EAAY,CAAS,CAF/P,CAFC,EAAQ,YAcrB,SAAS,EAAU,EAAU,GAAc,GAA0B,mBAAf,GAA4C,OAAf,EAAuB,MAAM,IAAI,UAAU,kEAAoE,GAAe,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,cAAmB,YAAgB,mBAA6B,IAAY,OAAO,eAAiB,OAAO,eAAe,EAAU,GAN9b,SAAmB,EAAK,GAA6D,IAAjD,IAAI,EAAO,OAAO,oBAAoB,GAAoB,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CAAE,IAAI,EAAM,EAAK,GAAQ,EAAQ,OAAO,yBAAyB,EAAU,GAAU,GAAS,EAAM,uBAAgB,EAAI,IAAsB,OAAO,eAAe,EAAK,EAAK,EAAS,CAAc,CAM4I,CAAU,EAAU,GAAY,CAE5e,IAAI,EAAgB,SAAU,GAG5B,SAAS,IACP,IAAI,EAAO,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAC5E,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,CAAE,GAAI,CAAC,eAAgB,UAAW,eAAkB,UAAU,IAXtI,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,CAanJ,CAAgB,KAAM,GAEtB,IAAI,EAbR,SAAoC,EAAM,GAAQ,IAAK,EAAQ,MAAM,IAAI,eAAe,6DAAgE,OAAO,GAAyB,iBAAT,GAAqC,mBAAT,EAA8B,EAAP,CAAY,CAa9N,CAA2B,KAAM,EAAc,KAAK,OAIhE,OAFA,EAAM,KAAO,EACb,EAAM,QAAU,EACT,CACX,CA+GE,OA5HA,EAAU,EAAe,GAezB,EAAc,UAAU,cAAgB,SAAuB,GACzD,KAAK,QAAQ,GAAG,QAAQ,GAAM,GAChC,KAAK,QAAQ,GAAG,KAAK,IAIzB,EAAc,UAAU,iBAAmB,SAA0B,GACnE,IAAI,EAAQ,KAAK,QAAQ,GAAG,QAAQ,GAChC,GAAS,GACX,KAAK,QAAQ,GAAG,OAAO,EAAO,IAIlC,EAAc,UAAU,YAAc,SAAqB,EAAK,EAAI,GAClE,IAEI,GAFU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IAExD,cAAgB,KAAK,QAAQ,sBACpD,IAA4B,EAAe,KAE/C,IAAI,EAAO,CAAC,EAAK,GAQjB,OAPI,GAAsB,iBAAR,IAAkB,EAAO,EAAK,OAAO,IACnD,GAAsB,iBAAR,IAAkB,EAAO,EAAK,OAAO,EAAe,EAAI,MAAM,GAAgB,IAE5F,EAAI,QAAQ,MAAQ,IACtB,EAAO,EAAI,MAAM,MAGZ,EAAM,QAAQ,KAAK,KAAM,IAGlC,EAAc,UAAU,YAAc,SAAqB,EAAK,EAAI,EAAK,GACvE,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,CAAE,WAAkB,UAAU,GAE9F,EAAe,KAAK,QAAQ,sBAC5B,IAA4B,EAAe,KAE/C,IAAI,EAAO,CAAC,EAAK,GACb,IAAK,EAAO,EAAK,OAAO,EAAe,EAAI,MAAM,GAAgB,IAEjE,EAAI,QAAQ,MAAQ,IAEtB,EAAQ,EACR,GAFA,EAAO,EAAI,MAAM,MAEP,IAGZ,KAAK,cAAc,GAEnB,EAAM,QAAQ,KAAK,KAAM,EAAM,GAE1B,EAAQ,QAAQ,KAAK,KAAK,QAAS,EAAK,EAAI,EAAK,IAGxD,EAAc,UAAU,aAAe,SAAsB,EAAK,EAAI,GACpE,IAAK,IAAI,KAAK,EACgB,iBAAjB,EAAU,IAAiB,KAAK,YAAY,EAAK,EAAI,EAAG,EAAU,GAAI,CAAE,YAErF,KAAK,KAAK,QAAS,EAAK,EAAI,IAG9B,EAAc,UAAU,kBAAoB,SAA2B,EAAK,EAAI,EAAW,EAAM,GAC/F,IAAI,EAAO,CAAC,EAAK,GACb,EAAI,QAAQ,MAAQ,IAEtB,EAAO,EACP,EAAY,EACZ,GAHA,EAAO,EAAI,MAAM,MAGP,IAGZ,KAAK,cAAc,GAEnB,IAAI,EAAO,EAAM,QAAQ,KAAK,KAAM,IAAS,GAEzC,EACF,EAAM,WAAW,EAAM,EAAW,GAElC,EAAO,EAAS,GAAI,EAAM,GAG5B,EAAM,QAAQ,KAAK,KAAM,EAAM,GAE/B,KAAK,KAAK,QAAS,EAAK,EAAI,IAG9B,EAAc,UAAU,qBAAuB,SAA8B,EAAK,GAC5E,KAAK,kBAAkB,EAAK,WACvB,KAAK,KAAK,GAAK,GAExB,KAAK,iBAAiB,GAEtB,KAAK,KAAK,UAAW,EAAK,IAG5B,EAAc,UAAU,kBAAoB,SAA2B,EAAK,GAC1E,gBAAO,KAAK,YAAY,EAAK,IAG/B,EAAc,UAAU,kBAAoB,SAA2B,EAAK,GAI1E,OAHK,IAAI,EAAK,KAAK,QAAQ,WAGW,OAAlC,KAAK,QAAQ,iBAAkC,EAAS,CAAE,EAAE,KAAK,YAAY,EAAK,IAE/E,KAAK,YAAY,EAAK,IAG/B,EAAc,UAAU,OAAS,WAC/B,OAAO,KAAK,MAGP,CACT,CA9HoB,CA8HlB,EAAe,SAEjB,EAAQ,QAAU,CACjB,EAAC,CAAC,iBAAiB,EAAE,UAAU,KAAK,EAAE,CAAC,SAAS,EAAQ,EAAO,GAGhE,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAAW,OAAO,QAAU,SAAU,GAAU,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,KAAQ,EAAO,GAAO,EAAO,IAAY,OAAO,GAEnP,EAA4B,mBAAX,QAAoD,iBAApB,OAAO,SAAwB,SAAU,GAAO,cAAc,CAAI,EAAK,SAAU,GAAO,OAAO,GAAyB,mBAAX,QAAyB,EAAI,cAAgB,OAAS,gBAAkB,CAAI,EAI1O,EAAW,EAFD,EAAQ,aAMlB,EAAiB,EAFA,EAAQ,mBAMzB,EAAkB,EAFD,EAAQ,oBAMzB,EAAS,EAFJ,EAAQ,uBAMb,EAAQ,EAFC,EAAQ,YAIrB,SAAS,EAAwB,GAAO,GAAI,GAAO,EAAI,WAAc,OAAO,EAAc,IAAI,EAAS,CAAE,EAAE,GAAW,MAAP,EAAe,IAAK,IAAI,KAAO,EAAW,OAAO,UAAU,eAAe,KAAK,EAAK,KAAM,EAAO,GAAO,EAAI,IAAgC,OAAtB,EAAO,QAAU,EAAY,CAAS,CAE3Q,SAAS,EAAuB,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAQ7F,SAAS,EAAU,EAAU,GAAc,GAA0B,mBAAf,GAA4C,OAAf,EAAuB,MAAM,IAAI,UAAU,kEAAoE,GAAe,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,cAAmB,YAAgB,mBAA6B,IAAY,OAAO,eAAiB,OAAO,eAAe,EAAU,GAN9b,SAAmB,EAAK,GAA6D,IAAjD,IAAI,EAAO,OAAO,oBAAoB,GAAoB,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CAAE,IAAI,EAAM,EAAK,GAAQ,EAAQ,OAAO,yBAAyB,EAAU,GAAU,GAAS,EAAM,uBAAgB,EAAI,IAAsB,OAAO,eAAe,EAAK,EAAK,EAAS,CAAc,CAM4I,CAAU,EAAU,GAAY,CAE5e,IAAI,EAAa,SAAU,GAGzB,SAAS,EAAW,GAClB,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IAVvF,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,CAYnJ,CAAgB,KAAM,GAEtB,IAAI,EAZR,SAAoC,EAAM,GAAQ,IAAK,EAAQ,MAAM,IAAI,eAAe,6DAAgE,OAAO,GAAyB,iBAAT,GAAqC,mBAAT,EAA8B,EAAP,CAAY,CAY9N,CAA2B,KAAM,EAAc,KAAK,OAMhE,OAJA,EAAM,KAAK,CAAC,gBAAiB,gBAAiB,iBAAkB,eAAgB,oBAAqB,EAAU,GAE/G,EAAM,QAAU,EAChB,EAAM,OAAS,EAAS,QAAQ,OAAO,cAChC,CACX,CAuPE,OArQA,EAAU,EAAY,GAgBtB,EAAW,UAAU,eAAiB,SAAwB,GACxD,IAAK,KAAK,SAAW,IAG3B,EAAW,UAAU,OAAS,SAAgB,GAC5C,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,CAAE,cAAe,IAAO,UAAU,GAMtG,MAJsC,OAAlC,KAAK,QAAQ,mBACf,EAAU,EAAO,gBAAgB,aAG5B,KAAK,QAAQ,EAAK,IAG3B,EAAW,UAAU,eAAiB,SAAwB,EAAK,GACjE,IAAI,EAAc,EAAQ,aAAe,KAAK,QAAQ,qBAClD,IAA2B,EAAc,KAE7C,IAAI,EAAa,EAAQ,IAAM,KAAK,QAAQ,UAC5C,GAAI,GAAe,EAAI,QAAQ,IAAgB,EAAG,CAChD,IAAI,EAAQ,EAAI,MAAM,GACtB,EAAa,EAAM,GACnB,EAAM,EAAM,EAClB,CAGI,MAF0B,iBAAf,IAAyB,EAAa,CAAC,IAE3C,CACL,IAAK,EACL,WAAY,IAIhB,EAAW,UAAU,UAAY,SAAmB,GAClD,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GASnF,GAP0E,qBAA9D,EAA0B,YAAc,EAAQ,IAC1D,EAAU,KAAK,QAAQ,iCAAiC,WACb,OAAlC,KAAK,QAAQ,mBACtB,EAAU,EAAO,gBAAgB,IAI/B,SAAgD,KAAT,EAAa,MAAO,GAC3C,iBAAT,IAAmB,EAAO,OAAO,IACxB,iBAAT,IAAmB,EAAO,CAAC,IAGtC,IAAI,EAAM,EAAQ,KAAO,KAAK,SAC9B,GAAI,GAA6B,WAAtB,EAAI,cAA4B,OAAO,EAAK,EAAK,OAAS,GAGrE,IAAI,EAAe,EAAQ,cAAgB,KAAK,QAAQ,cAAgB,IAIpE,EAAkB,KAAK,eAAe,EAAK,EAAK,OAAS,GAAI,GAE7D,EAAM,EAAgB,IACtB,EAAa,EAAgB,WAE7B,EAAY,EAAW,EAAW,OAAS,GAG3C,EAAM,KAAK,QAAQ,EAAM,GAEzB,EAAU,OAAO,UAAU,SAAS,MAAM,GAE1C,WAAa,EAAQ,WAA2B,EAAQ,WAAa,KAAK,QAAQ,WAGtF,GAAI,GAAsB,iBAAR,GAJH,CAAC,kBAAmB,oBAAqB,mBAIT,QAAQ,GAAW,KAAO,GAA0B,mBAAZ,GAA+B,CACpH,IAAK,EAAQ,gBAAkB,KAAK,QAAQ,cAE1C,OADA,KAAK,OAAO,KAAK,mEACV,KAAK,QAAQ,sBAAwB,KAAK,QAAQ,sBAAsB,EAAK,EAAK,GAAW,QAAW,EAAM,KAAO,KAAK,SAAW,2CAG9I,IAAI,EAAmB,mBAAZ,EAA+B,GAAK,GAE/C,IAAK,IAAI,KAAK,EACZ,EAAK,GAAK,KAAK,UAAU,GAAK,EAAM,EAAe,EAAG,EAAS,CAAE,cAAmB,GAAI,GAAc,IAExG,EAAM,CACZ,MAES,GAAI,GAA0B,mBAAZ,GACnB,EAAM,EAAI,KAAK,MACN,EAAM,KAAK,kBAAkB,EAAK,EAAK,QAG7C,CACD,IAAI,KACA,KAaJ,GAVK,KAAK,cAAc,aAAQ,EAAQ,eACtC,KACA,EAAM,EAAQ,cAEX,KAAK,cAAc,KACtB,KACA,EAAM,GAIJ,GAAW,EAAa,CAC1B,KAAK,OAAO,IAAI,aAAc,EAAK,EAAW,EAAK,GAEnD,IAAI,EAAO,GACX,GAAmC,aAA/B,KAAK,QAAQ,eAAgC,KAAK,QAAQ,aAAe,KAAK,QAAQ,YAAY,GACpG,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,QAAQ,YAAY,OAAQ,IACnD,EAAK,KAAK,KAAK,QAAQ,YAAY,QAEG,QAA/B,KAAK,QAAQ,cACtB,EAAO,KAAK,cAAc,mBAAmB,EAAQ,KAAO,KAAK,UAGjE,EAAK,KAAK,EAAQ,KAAO,KAAK,UAG5B,KAAK,QAAQ,cACX,KAAK,QAAQ,kBACf,KAAK,QAAQ,kBAAkB,EAAM,EAAW,EAAK,GAC5C,KAAK,kBAAoB,KAAK,iBAAiB,aACxD,KAAK,iBAAiB,YAAY,EAAM,EAAW,EAAK,IAI5D,KAAK,KAAK,aAAc,EAAM,EAAW,EAAK,EAC1D,CAGU,EAAM,KAAK,kBAAkB,EAAK,EAAK,GAGnC,GAAW,IAAQ,GAAO,KAAK,QAAQ,8BAA6B,EAAM,EAAY,IAAM,GAG5F,GAAW,KAAK,QAAQ,yBAAwB,EAAM,KAAK,QAAQ,uBAAuB,GACxG,CAGI,OAAO,GAGT,EAAW,UAAU,kBAAoB,SAA2B,EAAK,EAAK,GAC5E,IAAI,EAAS,KAET,EAAQ,eAAe,KAAK,aAAa,KAAK,GAGlD,IAAI,EAAO,EAAQ,SAAsC,iBAApB,EAAQ,QAAuB,EAAQ,QAAU,EAClF,KAAK,QAAQ,cAAc,mBAAkB,EAAO,EAAS,CAAE,EAAE,KAAK,QAAQ,cAAc,iBAAkB,IAClH,EAAM,KAAK,aAAa,YAAY,EAAK,EAAM,KAAK,UAGpD,EAAM,KAAK,aAAa,KAAK,GAAK,WAChC,IAAK,IAAI,EAAO,UAAU,OAAQ,EAAO,MAAM,GAAO,EAAO,EAAG,EAAO,EAAM,IAC3E,EAAK,GAAQ,UAAU,GAGzB,OAAO,EAAO,UAAU,MAAM,EAAQ,EACvC,GAAE,GAEC,EAAQ,eAAe,KAAK,aAAa,QAG7C,IAAI,EAAc,EAAQ,aAAe,KAAK,QAAQ,YAClD,EAA4C,iBAAhB,EAA2B,CAAC,GAAe,EAM3E,gBAJI,GAAqB,GAAsB,EAAmB,aAAU,EAAQ,qBAClF,EAAM,EAAgB,QAAQ,OAAO,EAAoB,EAAK,EAAK,EAAS,OAGvE,GAGT,EAAW,UAAU,QAAU,SAAiB,GAC9C,IAAI,EAAS,KAET,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAE/E,SAmDJ,MAjDoB,iBAAT,IAAmB,EAAO,CAAC,IAGtC,EAAK,SAAQ,SAAU,GACrB,IAAI,EAAO,cAAc,GAAzB,CAEA,IAAI,EAAmB,EAAO,eAAe,EAAG,GAE5C,EAAM,EAAiB,IACvB,EAAa,EAAiB,WAE9B,EAAO,QAAQ,aAAY,EAAa,EAAW,OAAO,EAAO,QAAQ,aAE7E,IAAI,WAAsB,EAAQ,OAAgD,iBAAlB,EAAQ,MACpE,WAAuB,EAAQ,SAAoD,iBAApB,EAAQ,SAA4C,KAApB,EAAQ,QAEvG,EAAQ,EAAQ,KAAO,EAAQ,KAAO,EAAO,cAAc,mBAAmB,EAAQ,KAAO,EAAO,UAExG,EAAW,SAAQ,SAAU,GACvB,EAAO,cAAc,IAEzB,EAAM,SAAQ,SAAU,GACtB,IAAI,EAAO,cAAc,GAAzB,CAEA,IAAI,EAAW,EACX,EAAY,CAAC,GAEb,SACA,IAAqB,EAAe,EAAO,eAAe,UAAU,EAAM,EAAQ,QAGlF,GAAuB,GAAsB,EAAU,KAAK,EAAW,GAGvE,GAAsB,EAAU,KAAK,GAAY,GAAK,EAAO,QAAQ,iBAAmB,EAAQ,SAGhG,GAAqB,EAAU,KAAK,GAAY,GAIpD,IADA,IAAI,SACG,EAAc,EAAU,OACzB,EAAO,cAAc,KACzB,EAAQ,EAAO,YAAY,EAAM,EAAI,EAAa,GArBnB,CAuB3C,GACA,GA1CuC,CA2CvC,IAEW,GAGT,EAAW,UAAU,cAAgB,SAAuB,GAC1D,iBAAO,IAAwB,KAAK,QAAQ,YAAsB,OAAR,IAAoB,KAAK,QAAQ,mBAA6B,KAAR,IAGlH,EAAW,UAAU,YAAc,SAAqB,EAAM,EAAI,GAChE,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAEnF,OAAO,KAAK,cAAc,YAAY,EAAM,EAAI,EAAK,IAGhD,CACT,CAvQiB,CAuQf,EAAe,SAEjB,EAAQ,QAAU,CAClB,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,GAAG,WAAW,GAAG,kBAAkB,GAAG,UAAU,KAAK,GAAG,CAAC,SAAS,EAAQ,EAAO,GAG5H,OAAO,eAAe,EAAS,aAAc,CAC3C,WAEF,EAAQ,kBA2BR,SAA2B,GAgEzB,OA/DI,EAAQ,WAAU,EAAQ,UAAY,EAAQ,UAE9C,EAAQ,IAAM,EAAQ,GAAG,WAC3B,EAAQ,UAAY,EAAQ,GAAG,UAC/B,EAAQ,GAAK,EAAQ,GAAG,YAExB,EAAQ,UAAY,EAAQ,IAAM,cAGhC,EAAQ,qBAAuB,EAAQ,YAAW,EAAQ,WAAa,EAAQ,WAEnF,EAAQ,YAAc,EAAQ,YAC9B,EAAQ,cAAgB,EAAQ,eAAiB,UACjD,EAAQ,YAAa,EAAQ,eAC7B,EAAQ,mBAAoB,EAAQ,gBACpC,EAAQ,cAAgB,EAAQ,kBAChC,EAAQ,WAAa,KAErB,EAAQ,sBAAwB,EAAQ,qBACxC,EAAQ,uBAAyB,EAAQ,gBACzC,EAAQ,+BAER,EAAQ,YAAc,EAAQ,YAC9B,EAAQ,aAAe,EAAQ,aAEE,YAA7B,EAAQ,mBACV,EAAQ,iCAAmC,SAAU,GAGnD,IAFA,IAAI,EAAS,GAEJ,EAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,EAAO,KAAK,EAAK,IAGnB,MAAO,CACL,YAAa,UACb,QAAS,KAKf,EAAQ,UAAY,EAAQ,aAC5B,EAAQ,QAAU,EAAQ,QACL,YAAjB,EAAQ,OAAoB,EAAQ,KAAO,eAC1B,eAAjB,EAAQ,OAAuB,EAAQ,KAAO,gBAGlD,EAAQ,QAAU,EAAQ,SAAW,GACrC,EAAQ,QAAQ,SAAW,EAAQ,YAAc,8BACjD,EAAQ,QAAQ,QAAU,EAAQ,aAAe,6BACjD,EAAQ,QAAQ,kBAAoB,EAAQ,YAG5C,EAAQ,MAAQ,EAAQ,OAAS,GACjC,EAAQ,MAAM,OAAS,OACvB,EAAQ,MAAM,eAAiB,OAC/B,EAAQ,MAAM,UAAU,EAAQ,iBAEhC,EAAU,EAAqB,IACnB,mBAAkB,EAAQ,cAAc,iBAAmB,EAAQ,kBAKxE,CACT,EA3FA,EAAQ,mBA6FR,SAA4B,GAI1B,OAHA,EAAU,EAAqB,IACvB,WAAa,KAEd,CACT,EAjGA,EAAQ,gBAmGR,SAAyB,GAUvB,OATI,EAAQ,qBAAuB,EAAQ,qBAAuB,EAAQ,uBACxE,EAAU,EAAqB,IAGjC,EAAQ,YAAc,EAAQ,YAC9B,EAAQ,aAAe,EAAQ,aAE/B,EAAQ,cAAgB,EAAQ,kBAEzB,CACT,EA7GA,EAAQ,mBA+GR,SAA4B,GAC1B,EAAK,IAAM,WAET,OADA,EAAS,QAAQ,UAAU,6IACpB,EAAK,SAAS,cAAc,mBAAmB,EAAK,UAAU,IAGvE,EAAK,QAAU,SAAU,EAAM,GAC7B,EAAS,QAAQ,UAAU,kEAC3B,EAAK,cAAc,EAAM,IAG3B,EAAK,OAAS,SAAU,EAAK,EAAS,GAQpC,GAPA,EAAS,QAAQ,UAAU,yJACJ,mBAAZ,IACT,EAAW,EACX,EAAU,IAEP,IAAS,EAAU,SAEpB,EAAQ,QACN,EAAU,OAAO,EAAS,KAAM,EAAK,UAAU,IAGrD,EAAK,eAAe,EAAK,IAG3B,EAAK,iBAAmB,SAAU,EAAM,GACtC,EAAS,QAAQ,UAAU,mHAC3B,EAAK,IAAI,CACP,KAAM,gBACN,KAAM,EACN,QAAS,IAGf,EA/IA,IAEI,EAEJ,SAAgC,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAF9E,CAFD,EAAQ,cAMtB,SAAS,EAAqB,GAa5B,OAXA,EAAQ,cAAgB,CACtB,eAAgB,QAGlB,EAAQ,cAAc,OAAS,EAAQ,qBAAuB,KAC9D,EAAQ,cAAc,OAAS,EAAQ,qBAAuB,KAC9D,EAAQ,cAAc,YAAc,EAAQ,wBAE5C,EAAQ,cAAc,cAAgB,EAAQ,aAAe,MAC7D,EAAQ,cAAc,cAAgB,EAAQ,aAAe,IAEtD,CACT,CA4HA,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,SAAS,EAAQ,EAAO,GAGhD,OAAO,eAAe,EAAS,aAAc,CAC3C,WAEF,EAAQ,IAER,WACE,MAAO,CACL,SACA,iBAEA,GAAI,CAAC,eACL,UAAW,CAAC,eACZ,YAAa,CAAC,OACd,cAEA,aACA,wBACA,KAAM,MACN,WAEA,aAAc,IACd,YAAa,IACb,gBAAiB,IACjB,iBAAkB,IAElB,eACA,cAAe,WACf,qBAEA,eACA,cACA,qBACA,iBACA,cACA,sBAAuB,WAAmC,EAC1D,0BACA,+BACA,iCAAkC,SAA0C,GAC1E,MAAO,CAAE,aAAc,EAAK,GAC7B,EAED,cAAe,CACb,eACA,OAAQ,SAAgB,EAAO,EAAS,GACtC,OAAO,CACR,EACD,OAAQ,KACR,OAAQ,KACR,gBAAiB,IAIjB,eAAgB,IAEhB,cAAe,MACf,cAAe,IAGf,yBAGN,EAzDA,EAAQ,iBA2DR,SAA0B,GASxB,MAP0B,iBAAf,EAAQ,KAAiB,EAAQ,GAAK,CAAC,EAAQ,KACvB,iBAAxB,EAAQ,cAA0B,EAAQ,YAAc,CAAC,EAAQ,cAC1C,iBAAvB,EAAQ,aAAyB,EAAQ,WAAa,CAAC,EAAQ,aAGtE,EAAQ,WAAa,EAAQ,UAAU,QAAQ,UAAY,GAAG,EAAQ,UAAU,KAAK,UAElF,CACT,CACA,EAAE,IAAI,GAAG,CAAC,SAAS,EAAQ,EAAO,GAGlC,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAA4B,mBAAX,QAAoD,iBAApB,OAAO,SAAwB,SAAU,GAAO,cAAc,CAAI,EAAK,SAAU,GAAO,OAAO,GAAyB,mBAAX,QAAyB,EAAI,cAAgB,OAAS,gBAAkB,CAAI,EAE1O,EAAW,OAAO,QAAU,SAAU,GAAU,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,KAAQ,EAAO,GAAO,EAAO,IAAY,OAAO,GAInP,EAAW,EAFD,EAAQ,aAMlB,EAAiB,EAFA,EAAQ,mBAMzB,EAAkB,EAFD,EAAQ,oBAMzB,EAAe,EAFD,EAAQ,iBAMtB,EAAkB,EAFD,EAAQ,oBAMzB,EAAmB,EAFD,EAAQ,qBAM1B,EAAiB,EAFD,EAAQ,mBAMxB,EAAqB,EAFD,EAAQ,uBAM5B,EAAmB,EAFD,EAAQ,qBAI1B,EAAa,EAAQ,cAIrB,EAAkB,EAFD,EAAQ,oBAMzB,EAEJ,SAAiC,GAAO,GAAI,GAAO,EAAI,WAAc,OAAO,EAAc,IAAI,EAAS,CAAE,EAAE,GAAW,MAAP,EAAe,IAAK,IAAI,KAAO,EAAW,OAAO,UAAU,eAAe,KAAK,EAAK,KAAM,EAAO,GAAO,EAAI,IAAgC,OAAtB,EAAO,QAAU,EAAY,CAAS,CAF9P,CAFJ,EAAQ,uBAMjB,SAAS,EAAuB,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAQ7F,SAAS,EAAU,EAAU,GAAc,GAA0B,mBAAf,GAA4C,OAAf,EAAuB,MAAM,IAAI,UAAU,kEAAoE,GAAe,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,cAAmB,YAAgB,mBAA6B,IAAY,OAAO,eAAiB,OAAO,eAAe,EAAU,GAN9b,SAAmB,EAAK,GAA6D,IAAjD,IAAI,EAAO,OAAO,oBAAoB,GAAoB,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,CAAE,IAAI,EAAM,EAAK,GAAQ,EAAQ,OAAO,yBAAyB,EAAU,GAAU,GAAS,EAAM,uBAAgB,EAAI,IAAsB,OAAO,eAAe,EAAK,EAAK,EAAS,CAAc,CAM4I,CAAU,EAAU,GAAY,CAE5e,IAAI,EAAO,SAAU,GAGnB,SAAS,IACP,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAC/E,EAAW,UAAU,IAX7B,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,CAanJ,CAAgB,KAAM,GAEtB,IAAI,EAbR,SAAoC,EAAM,GAAQ,IAAK,EAAQ,MAAM,IAAI,eAAe,6DAAgE,OAAO,GAAyB,iBAAT,GAAqC,mBAAT,EAA8B,EAAP,CAAY,CAa9N,CAA2B,KAAM,EAAc,KAAK,OAQhE,OANA,EAAM,WAAc,EAAW,kBAAkB,GACjD,EAAM,SAAW,GACjB,EAAM,OAAS,EAAS,QACxB,EAAM,QAAU,GAEZ,IAAa,EAAM,eAAe,EAAM,KAAK,EAAS,GACnD,CACX,CA+SE,OAhUA,EAAU,EAAM,GAmBhB,EAAK,UAAU,KAAO,SAAc,EAAS,GAC3C,IAAI,EAAS,KAiBb,SAAS,EAAoB,GAC3B,GAAK,EACL,MAA6B,mBAAlB,EAAqC,IAAI,EAC7C,CACb,CAGI,GAtBuB,mBAAZ,IACT,EAAW,EACX,EAAU,IAEP,IAAS,EAAU,IAES,OAA7B,EAAQ,iBACV,KAAK,QAAU,EAAS,CAAE,KAAM,EAAW,UAAY,EAAW,kBAAkB,EAAO,kBAAkB,IAAW,IACjF,OAA9B,EAAQ,kBACjB,KAAK,QAAU,EAAS,CAAE,KAAM,EAAW,UAAY,EAAW,kBAAkB,EAAO,mBAAmB,IAAW,IAEzH,KAAK,QAAU,EAAS,MAAQ,EAAW,OAAQ,KAAK,WAAa,EAAW,kBAAkB,IAE/F,IAAU,EAAW,WAAoB,IASzC,KAAK,QAAQ,QAAS,CACrB,KAAK,QAAQ,OACf,EAAS,QAAQ,KAAK,EAAoB,KAAK,QAAQ,QAAS,KAAK,SAErE,EAAS,QAAQ,KAAK,KAAM,KAAK,SAGnC,IAAI,EAAK,IAAI,EAAgB,QAAQ,KAAK,SAC1C,KAAK,MAAQ,IAAI,EAAgB,QAAQ,KAAK,QAAQ,UAAW,KAAK,SAEtE,IAAI,EAAI,KAAK,SACb,EAAE,OAAS,EAAS,QACpB,EAAE,cAAgB,KAAK,MACvB,EAAE,cAAc,GAAG,iBAAiB,SAAU,EAAK,GACjD,EAAE,eAAe,MACzB,IACM,EAAE,cAAgB,EAClB,EAAE,eAAiB,IAAI,EAAiB,QAAQ,EAAI,CAAE,QAAS,KAAK,QAAQ,gBAAiB,kBAAmB,KAAK,QAAQ,oBAC7H,EAAE,aAAe,IAAI,EAAe,QAAQ,KAAK,SAEjD,EAAE,iBAAmB,IAAI,EAAmB,QAAQ,EAAoB,KAAK,QAAQ,SAAU,EAAE,cAAe,EAAG,KAAK,SAExH,EAAE,iBAAiB,GAAG,KAAK,SAAU,GACnC,IAAK,IAAI,EAAO,UAAU,OAAQ,EAAO,MAAM,EAAO,EAAI,EAAO,EAAI,GAAI,EAAO,EAAG,EAAO,EAAM,IAC9F,EAAK,EAAO,GAAK,UAAU,GAG7B,EAAO,KAAK,MAAM,EAAQ,CAAC,GAAO,OAAO,GACjD,IAEM,EAAE,iBAAiB,GAAG,UAAU,SAAU,GACxC,EAAE,eAAe,MACzB,IAEM,EAAE,eAAiB,IAAI,EAAiB,QAAQ,EAAoB,KAAK,QAAQ,OAAQ,EAAE,cAAe,EAAG,KAAK,SAElH,EAAE,eAAe,GAAG,KAAK,SAAU,GACjC,IAAK,IAAI,EAAQ,UAAU,OAAQ,EAAO,MAAM,EAAQ,EAAI,EAAQ,EAAI,GAAI,EAAQ,EAAG,EAAQ,EAAO,IACpG,EAAK,EAAQ,GAAK,UAAU,GAG9B,EAAO,KAAK,MAAM,EAAQ,CAAC,GAAO,OAAO,GACjD,IAEU,KAAK,QAAQ,mBACf,EAAE,iBAAmB,EAAoB,KAAK,QAAQ,kBACtD,EAAE,iBAAiB,KAAK,EAAG,KAAK,QAAQ,UAAW,KAAK,UAG1D,KAAK,WAAa,IAAI,EAAa,QAAQ,KAAK,SAAU,KAAK,SAE/D,KAAK,WAAW,GAAG,KAAK,SAAU,GAChC,IAAK,IAAI,EAAQ,UAAU,OAAQ,EAAO,MAAM,EAAQ,EAAI,EAAQ,EAAI,GAAI,EAAQ,EAAG,EAAQ,EAAO,IACpG,EAAK,EAAQ,GAAK,UAAU,GAG9B,EAAO,KAAK,MAAM,EAAQ,CAAC,GAAO,OAAO,GACjD,GACA,CAGmB,CAAC,cAAe,cAAe,eAAgB,oBAAqB,uBAAwB,oBAAqB,qBACvH,SAAQ,SAAU,GACzB,EAAO,GAAU,WACf,OAAO,KAAK,MAAM,GAAQ,MAAM,KAAK,MAAO,WAEpD,IAG0C,OAAlC,KAAK,QAAQ,kBAA2B,EAAO,mBAAmB,MAEtE,IAAI,EAAO,WACT,EAAO,eAAe,EAAO,QAAQ,KAAK,SAAU,EAAK,GACvD,EAAO,KAAK,cAAe,EAAO,SAClC,EAAO,OAAO,IAAI,cAAe,EAAO,SAExC,EAAS,EAAK,EACtB,KASI,OANI,KAAK,QAAQ,YAAc,KAAK,QAAQ,cAC1C,IAEA,WAAW,EAAM,GAGZ,MAGT,EAAK,UAAU,cAAgB,SAAuB,GACpD,IAAI,EAAS,KAIb,GAFK,IAAU,EAAW,WAAoB,GAEzC,KAAK,QAAQ,UA8BhB,EAAS,UA9BkB,CAC3B,IAAI,EAAO,WACT,GAAI,EAAO,UAA8C,WAAlC,EAAO,SAAS,cAA4B,MAAO,CACtE,EAAG,KAGP,IAAI,EAAS,GAET,EAAS,SAAgB,GAChB,EAAO,SAAS,cAAc,mBAAmB,GACvD,SAAQ,SAAU,GACjB,EAAO,QAAQ,GAAK,GAAG,EAAO,KAAK,EACnD,KAGQ,EAAO,EAAO,UAEV,EAAO,QAAQ,SACjB,EAAO,QAAQ,QAAQ,SAAQ,SAAU,GACvC,EAAO,EACnB,IAGQ,EAAO,SAAS,eAAe,KAAK,EAAQ,EAAO,QAAQ,IAAI,WAC7D,EAAO,SAAS,iBAAiB,KAAK,EAAQ,EAAO,QAAQ,GAAI,EAC3E,GACA,CAzBiB,GA2BX,GAAoE,qBAAxD,EAAuB,YAAc,EAAQ,IAAqB,OAAO,EAAK,CAChG,GAKE,EAAK,UAAU,gBAAkB,SAAyB,EAAM,GACzD,IAAM,EAAO,KAAK,WAClB,IAAI,EAAK,KAAK,QAAQ,IAC3B,KAAK,SAAS,iBAAiB,OAAO,EAAM,IAG9C,EAAK,UAAU,IAAM,SAAa,GAqBhC,MApBoB,YAAhB,EAAO,OACT,KAAK,QAAQ,QAAU,GAGL,UAAhB,EAAO,OACT,KAAK,QAAQ,MAAQ,IAGH,WAAhB,EAAO,MAAqB,EAAO,KAAO,EAAO,MAAQ,EAAO,QAClE,KAAK,QAAQ,OAAS,GAGJ,qBAAhB,EAAO,OACT,KAAK,QAAQ,iBAAmB,GAGd,kBAAhB,EAAO,MACT,EAAgB,QAAQ,iBAAiB,GAGpC,MAGT,EAAK,UAAU,eAAiB,SAAwB,EAAK,GAC3D,IAAI,EAAS,KAET,EAAO,SAAc,GACnB,IACF,EAAO,KAAK,kBAAmB,GAC/B,EAAO,OAAO,IAAI,kBAAmB,IAGnC,GAAU,EAAS,GAAK,WAC1B,IAAK,IAAI,EAAQ,UAAU,OAAQ,EAAO,MAAM,GAAQ,EAAQ,EAAG,EAAQ,EAAO,IAChF,EAAK,GAAS,UAAU,GAG1B,OAAO,EAAO,EAAE,MAAM,EAAQ,EACtC,MAGS,GAAO,KAAK,SAAS,mBAAkB,EAAM,KAAK,SAAS,iBAAiB,UAE7E,IACF,KAAK,SAAW,EAChB,KAAK,UAAY,KAAK,SAAS,cAAc,mBAAmB,GAEhE,KAAK,WAAW,eAAe,GAE3B,KAAK,SAAS,kBAAkB,KAAK,SAAS,iBAAiB,kBAAkB,IAGvF,KAAK,eAAc,SAAU,GAC3B,EAAK,EACX,KAGE,EAAK,UAAU,UAAY,SAAmB,EAAK,GACjD,IAAI,EAAS,KAET,EAAS,SAAS,EAAO,EAAK,GAIhC,OAHA,EAAU,GAAW,IACb,IAAM,EAAQ,KAAO,EAAO,IACpC,EAAQ,GAAK,EAAQ,IAAM,EAAO,GAC3B,EAAO,EAAE,EAAK,IAIvB,OAFA,EAAO,IAAM,EACb,EAAO,GAAK,EACL,GAGT,EAAK,UAAU,EAAI,WACjB,OAAO,KAAK,YAAc,KAAK,WAAW,UAAU,MAAM,KAAK,WAAY,YAG7E,EAAK,UAAU,OAAS,WACtB,OAAO,KAAK,YAAc,KAAK,WAAW,OAAO,MAAM,KAAK,WAAY,YAG1E,EAAK,UAAU,oBAAsB,SAA6B,GAChE,KAAK,QAAQ,UAAY,GAG3B,EAAK,UAAU,eAAiB,SAAwB,EAAI,GAC1D,IAAI,EAAS,KAEb,IAAK,KAAK,QAAQ,GAAI,OAAO,GAAY,IACvB,iBAAP,IAAiB,EAAK,CAAC,IAElC,EAAG,SAAQ,SAAU,GACf,EAAO,QAAQ,GAAG,QAAQ,GAAK,GAAG,EAAO,QAAQ,GAAG,KAAK,EACnE,IAEI,KAAK,cAAc,IAGrB,EAAK,UAAU,cAAgB,SAAuB,EAAM,GACtC,iBAAT,IAAmB,EAAO,CAAC,IACtC,IAAI,EAAY,KAAK,QAAQ,SAAW,GAEpC,EAAU,EAAK,QAAO,SAAU,GAClC,OAAO,EAAU,QAAQ,GAAO,CACtC,IAEI,IAAK,EAAQ,OAAQ,OAAO,IAE5B,KAAK,QAAQ,QAAU,EAAU,OAAO,GACxC,KAAK,cAAc,IAGrB,EAAK,UAAU,IAAM,SAAa,GAEhC,OADK,IAAK,EAAM,KAAK,UAChB,EAES,CAAC,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,KAAM,MAAO,MAAO,MAAO,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,MAAO,MAAO,MAAO,MAAO,KAAM,OAEpZ,QAAQ,KAAK,SAAS,cAAc,wBAAwB,KAAS,EAAI,MAAQ,MAJ/E,OAOnB,EAAK,UAAU,eAAiB,WAI9B,OAAO,IAAI,EAHG,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GACpE,UAAU,KAK3B,EAAK,UAAU,cAAgB,WAC7B,IAAI,EAAS,KAGT,EAAW,UAAU,GAErB,EAAQ,IAAI,EAAK,EAAS,CAAE,EAHlB,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAGxC,KAAK,QAAS,CAAE,aAAkB,GAM7E,MALoB,CAAC,QAAS,aAAc,WAAY,YAC1C,SAAQ,SAAU,GAC9B,EAAM,GAAK,EAAO,EACxB,IAEW,GAGF,CACT,CAlUW,CAkUT,EAAe,SAEjB,EAAQ,QAAU,IAAI,CACtB,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,KAAK,GAAG,CAAC,SAAS,EAAQ,EAAO,GAG5Q,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAEI,EAEJ,SAAgC,GAAO,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAM,CAF7E,CAFD,EAAQ,cAMvB,EAAQ,QAAU,EAAU,OAC5B,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,SAAS,EAAQ,EAAO,GAGhD,OAAO,eAAe,EAAS,aAAc,CAC3C,WAGF,IAAI,EAAW,OAAO,QAAU,SAAU,GAAU,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,KAAQ,EAAO,GAAO,EAAO,IAAY,OAAO,GAIvP,IAAI,EAAgB,CAClB,KAAM,SAEN,IAAK,SAAa,GAChB,KAAK,QAAQ,MAAO,EACrB,EACD,KAAM,SAAc,GAClB,KAAK,QAAQ,OAAQ,EACtB,EACD,MAAO,SAAe,GACpB,KAAK,QAAQ,QAAS,EACvB,EACD,QAAS,SAAiB,EAAM,GAC1B,SAAW,QAAQ,IAAO,QAAQ,GAAM,MAAM,QAAS,MAAM,UAAU,MAAM,KAAK,GAC1F,GAGI,EAAS,WACX,SAAS,EAAO,GACd,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,IArBvF,SAAyB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAuC,EAuBnJ,CAAgB,KAAM,GAEtB,KAAK,KAAO,GACZ,KAAK,KAAK,EAAgB,EAC9B,CAmDE,OAjDA,EAAO,UAAU,KAAO,SAAc,GACpC,IAAI,EAAU,UAAU,QAAU,YAAK,UAAU,GAAmB,GAAK,UAAU,GAEnF,KAAK,OAAS,EAAQ,QAAU,WAChC,KAAK,OAAS,GAAkB,EAChC,KAAK,QAAU,EACf,KAAK,WAAQ,EAAQ,OAGvB,EAAO,UAAU,SAAW,SAAkB,GAC5C,KAAK,MAAQ,EACb,KAAK,KAAK,SAAQ,SAAU,GAC1B,EAAI,SAAS,EACnB,KAGE,EAAO,UAAU,IAAM,WACrB,KAAK,QAAQ,UAAW,MAAO,MAAI,EAGrC,EAAO,UAAU,KAAO,WACtB,KAAK,QAAQ,UAAW,OAAQ,MAAI,EAGtC,EAAO,UAAU,MAAQ,WACvB,KAAK,QAAQ,UAAW,QAAS,KAGnC,EAAO,UAAU,UAAY,WAC3B,KAAK,QAAQ,UAAW,OAAQ,0BAAwB,EAG1D,EAAO,UAAU,QAAU,SAAiB,EAAM,EAAK,EAAQ,GACzD,IAAc,KAAK,QACA,iBAAZ,EAAK,KAAiB,EAAK,GAAK,EAAS,KAAK,OAAS,IAAM,EAAK,IAC7E,KAAK,OAAO,GAAK,KAGnB,EAAO,UAAU,OAAS,SAAgB,GACxC,IAAI,EAAM,IAAI,EAAO,KAAK,OAAQ,EAAS,CAAE,OAAQ,KAAK,OAAS,IAAM,EAAa,KAAO,KAAK,UAGlG,OAFA,KAAK,KAAK,KAAK,GAER,GAOF,CACT,CA5Da,GAgEb,EAAQ,QAAU,IAAI,CACtB,EAAE,IAAI,GAAG,CAAC,SAAS,EAAQ,EAAO,GAGlC,OAAO,eAAe,EAAS,aAAc,CAC3C,WAEF,EAAQ,QAAU,CAEhB,WAAY,CAAE,EAEd,iBAAkB,SAA0B,GAC1C,KAAK,WAAW,EAAO,MAAQ,CAChC,EACD,OAAQ,SAAgB,EAAY,EAAO,EAAK,EAAS,GACvD,IAAI,EAAQ,KAMZ,OAJA,EAAW,SAAQ,SAAU,GACvB,EAAM,WAAW,KAAY,EAAQ,EAAM,WAAW,GAAW,QAAQ,EAAO,EAAK,EAAS,GACxG,IAEW,CACX,EAEA,EAAE,IAAI,GAAG,CAAC,SAAS,EAAQ,EAAO,GAyBlC,SAAS,EAAc,EAAQ,EAAM,GACnC,SAAS,EAAS,GAChB,OAAO,GAAO,EAAI,QAAQ,QAAU,EAAI,EAAI,QAAQ,OAAQ,KAAO,CACvE,CAGE,IADA,IAAI,EAAwB,iBAAT,EAAoB,GAAG,OAAO,GAAQ,EAAK,MAAM,KAC7D,EAAM,OAAS,GAAG,CACvB,IAAK,EAAQ,MAAO,GAEpB,IAAI,EAAM,EAAS,EAAM,UACpB,EAAO,IAAQ,IAAO,EAAO,GAAO,IAAI,GAC7C,EAAS,EAAO,EACpB,CAEE,OAAK,EACE,CACL,IAAK,EACL,EAAG,EAAS,EAAM,UAHA,EAKtB,CAzCA,OAAO,eAAe,EAAS,aAAc,CAC3C,WAEF,EAAQ,WAQR,SAAoB,GAClB,OAAc,MAAV,EAAuB,GACpB,GAAK,CACd,EAVA,EAAQ,KAYR,SAAc,EAAG,EAAG,GAClB,EAAE,SAAQ,SAAU,GACd,EAAE,KAAI,EAAE,GAAK,EAAE,GACvB,GACA,EAfA,EAAQ,QAsCR,SAAiB,EAAQ,EAAM,GAC7B,IAAI,EAAiB,EAAc,EAAQ,EAAM,QAEvC,EAAe,IACjB,EAAe,GAGd,CACX,EA7CA,EAAQ,SA+CR,SAAkB,EAAQ,EAAM,EAAU,GACxC,IAAI,EAAkB,EAAc,EAAQ,EAAM,QAE9C,EAAM,EAAgB,IACtB,EAAI,EAAgB,EAGxB,EAAI,GAAK,EAAI,IAAM,GACf,IAAQ,EAAI,GAAK,EAAI,GAAG,OAAO,IAC9B,GAAQ,EAAI,GAAG,KAAK,EAC3B,EAxDA,EAAQ,QA0DR,SAAiB,EAAQ,GACvB,IAAI,EAAkB,EAAc,EAAQ,GAExC,EAAM,EAAgB,IACtB,EAAI,EAAgB,EAGxB,GAAK,EACL,OAAO,EAAI,EACb,EAlEA,EAAQ,WAoER,SAAS,EAAW,EAAQ,EAAQ,GAClC,IAAK,IAAI,KAAQ,EACX,KAAQ,EAEkB,iBAAjB,EAAO,IAAsB,EAAO,aAAiB,QAAkC,iBAAjB,EAAO,IAAsB,EAAO,aAAiB,OAChI,IAAW,EAAO,GAAQ,EAAO,IAErC,EAAW,EAAO,GAAO,EAAO,GAAO,GAGzC,EAAO,GAAQ,EAAO,GAEzB,OAAO,CACV,EAhFA,EAAQ,YAkFR,SAAqB,GACnB,OAAO,EAAI,QAAQ,sCAAuC,OAC5D,EAnFA,EAAQ,OAgGR,SAAgB,GACd,MAAoB,iBAAT,EACF,EAAK,QAAQ,cAAc,SAAU,GAC1C,OAAO,EAAW,EACxB,IAEW,CAEX,EAlBA,IAAI,EAAa,CACf,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,SAaP,EAAE,IAAI,GAAG,CAAC,SAAS,EAAQ,EAAO,GAClC,EAAO,QAAU,EAAQ,4BAA4B,OAErD,EAAE,CAAC,2BAA2B,MAAM,GAAG,CAAC,GAj3EyU,CAi3ErU,GF32E/B,CE22E+B,MAAA,SAAA,EAAA,EAAA,GD70EvC,01BEpCL,kBAAA,EAAA,EAAA,KA8BA,IAAI,GACA,EAYJ,SAAS,EAAU,EAAO,EAAO,EAAY,EAAS,GAEpD,GAAI,IAAU,EACZ,OAAI,EACK,CAAC,CAfG,EAeU,IAEhB,GAGT,GAAkB,MAAd,EAAoB,CACtB,IAAI,EAy9BR,SAA+B,EAAS,EAAS,GAE/C,IAAI,EACoB,iBAAf,EACH,CAAE,MAAO,EAAY,OAAQ,GAC7B,EAAW,SACb,EAAiC,iBAAf,EAA0B,KAAO,EAAW,SAK9D,EAAY,EAAQ,OACpB,EAAY,EAAQ,OACxB,GAAwB,IAApB,EAAS,SAA8B,OAAb,GAAyC,IAApB,EAAS,QAAe,CAEzE,IAAI,EAAY,EAAS,MACrB,EAAY,EAAQ,MAAM,EAAG,GAC7B,EAAW,EAAQ,MAAM,GACzB,EAAiB,EAAW,EAAS,MAAQ,KAG3C,EAAY,EAAY,EAAY,EAIxC,KAHuB,OAAnB,GAA2B,IAAmB,GAG9C,EAAY,GAAK,EAAY,GAAjC,CAGA,IAAI,EAAY,EAAQ,MAAM,EAAG,GAEjC,IADI,EAAW,EAAQ,MAAM,MACZ,EAAjB,CAGA,IAAI,EAAe,KAAK,IAAI,EAAW,GAGvC,IAFI,EAAY,EAAU,MAAM,EAAG,OAC/B,EAAY,EAAU,MAAM,EAAG,IAMnC,OAAO,EAAiB,EAFR,EAAU,MAAM,GAChB,EAAU,MAAM,GACyB,EARzD,CALA,CAiBA,GAAuB,OAAnB,GAA2B,IAAmB,EAAlD,CAGA,IAAI,EAAS,EAET,GADA,EAAY,EAAQ,MAAM,EAAG,GAClB,EAAQ,MAAM,IAC7B,GAAI,IAAc,EAAlB,CAGA,IAAI,EAAe,KAAK,IAAI,EAAY,EAAQ,EAAY,GAG5D,IAFI,EAAY,EAAS,MAAM,EAAS,OAAS,OAC7C,EAAY,EAAS,MAAM,EAAS,OAAS,IAMjD,OAAO,EAAiB,EAFR,EAAS,MAAM,EAAG,EAAS,OAAS,GACpC,EAAS,MAAM,EAAG,EAAS,OAAS,GACK,GAhBjD,CAkBZ,CACA,GAAI,EAAS,OAAS,GAAK,GAAgC,IAApB,EAAS,OAChC,CAEZ,IAAI,EAAY,EAAQ,MAAM,EAAG,EAAS,OACtC,EAAY,EAAQ,MAAM,EAAS,MAAQ,EAAS,QAGxD,KAAI,GAFA,EAAe,EAAU,SACzB,EAAe,EAAU,SAC7B,CAGA,IAAI,EAAY,EAAQ,MAAM,EAAG,GAC7B,EAAY,EAAQ,MAAM,EAAY,GAC1C,GAAI,IAAc,GAAa,IAAc,EAK7C,OAAO,EAAiB,EAFR,EAAQ,MAAM,EAAc,EAAY,GACxC,EAAQ,MAAM,EAAc,EAAY,GACC,EATjD,CAUV,CAGF,OAAO,IACT,CAvFA,CAz9ByC,EAAO,EAAO,GACnD,GAAI,EACF,OAAO,CAEX,CAGA,IAAI,EAAe,EAAkB,EAAO,GACxC,EAAe,EAAM,UAAU,EAAG,GAKtC,EAAe,EAJf,EAAQ,EAAM,UAAU,GACxB,EAAQ,EAAM,UAAU,IAIxB,IAAI,EAAe,EAAM,UAAU,EAAM,OAAS,GAK9C,EAuBN,SAAuB,EAAO,GAC5B,IAAI,EAEJ,IAAK,EAEH,MAAO,CAAC,CArEM,EAqEQ,IAGxB,IAAK,EAEH,MAAO,CAAC,CAAC,EAAa,IAGxB,IAAI,EAAW,EAAM,OAAS,EAAM,OAAS,EAAQ,EACjD,EAAY,EAAM,OAAS,EAAM,OAAS,EAAQ,EAClD,EAAI,EAAS,QAAQ,GACzB,IAEE,IAFE,EAEF,OAAA,EAAQ,CACN,CAnFY,EAmFE,EAAS,UAAU,EAAG,IACpC,CAnFW,EAmFE,GACb,CArFY,EAqFE,EAAS,UAAU,EAAI,EAAU,UAG7C,EAAM,OAAS,EAAM,SACvB,EAAM,GAAG,GAAK,EAAM,GAAG,GAAK,GAEvB,EAGT,GAAyB,IAArB,EAAU,OAGZ,MAAO,CACL,CAAC,EAAa,GACd,CAnGY,EAmGE,IAKlB,IAAI,EA2SN,SAAyB,EAAO,GAC9B,IAAI,EAAW,EAAM,OAAS,EAAM,OAAS,EAAQ,EACjD,EAAY,EAAM,OAAS,EAAM,OAAS,EAAQ,EACtD,GAAI,EAAS,OAAS,GAAwB,EAAnB,EAAU,OAAa,EAAS,OACzD,OAAO,KAeT,SAAS,EAAiB,EAAU,EAAW,GAM7C,IAJI,IAGA,EAAiB,EAAiB,EAAkB,EAHpD,EAAO,EAAS,UAAU,EAAG,EAAI,KAAK,MAAM,EAAS,OAAS,IAC9D,GAAI,EACJ,EAAc,SAEV,EAAI,EAAU,QAAQ,EAAM,EAAI,KAAY,CAClD,IAAI,EAAe,EACjB,EAAS,UAAU,GACnB,EAAU,UAAU,IAElB,EAAe,EACjB,EAAS,UAAU,EAAG,GACtB,EAAU,UAAU,EAAG,IAErB,EAAY,OAAS,EAAe,IACtC,EACE,EAAU,UAAU,EAAI,EAAc,GACtC,EAAU,UAAU,EAAG,EAAI,GAC7B,EAAkB,EAAS,UAAU,EAAG,EAAI,GAC5C,EAAkB,EAAS,UAAU,EAAI,GACzC,EAAmB,EAAU,UAAU,EAAG,EAAI,GAC9C,EAAmB,EAAU,UAAU,EAAI,GAE/C,CACA,OAAyB,EAArB,EAAY,QAAc,EAAS,OAC9B,CACL,EACA,EACA,EACA,EACA,GAGK,IAEX,CAGA,IAWI,EAaA,EAAS,EAAS,EAAS,EAxB3B,EAAM,EACR,EACA,EACA,KAAK,KAAK,EAAS,OAAS,IAG1B,EAAM,EACR,EACA,EACA,KAAK,KAAK,EAAS,OAAS,IAG9B,OAAK,GAAQ,GAQX,EANU,EAEA,GAIL,EAAI,GAAG,OAAS,EAAI,GAAG,OAAS,EAHhC,EAFA,EAUH,EAAM,OAAS,EAAM,QACvB,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAU,EAAG,KAEb,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAU,EAAG,IAGR,CAAC,EAAS,EAAS,EAAS,EADlB,EAAG,KAvBX,IAyBX,CAhGA,CA3S2B,EAAO,GAChC,GAAI,EAAI,CAEN,IAAI,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAU,EAAG,GACb,EAAa,EAAG,GAEhB,EAAU,EAAU,EAAS,GAC7B,EAAU,EAAU,EAAS,GAEjC,OAAO,EAAQ,OAAO,CAAC,CAnHV,EAmHuB,IAAc,EACpD,CAEA,OAYF,SAAsB,EAAO,GAW3B,QATI,EAAe,EAAM,OACrB,EAAe,EAAM,OACrB,EAAQ,KAAK,MAAM,EAAe,GAAgB,GAClD,EAAW,EACX,EAAW,EAAI,EACf,EAAK,IAAI,MAAM,GACf,EAAK,IAAI,MAAM,GAGV,EAAI,EAAG,EAAI,EAAU,IAC5B,EAAG,IACH,IAAG,IAAK,EAEV,EAAG,EAAW,GAAK,EACnB,EAAG,EAAW,GAAK,EAWnB,QAVI,EAAQ,EAAe,EAGvB,EAAQ,EAAQ,GAAM,EAGtB,EAAU,EACV,EAAQ,EACR,EAAU,EACV,EAAQ,EACH,EAAI,EAAG,EAAI,EAAO,IAAK,CAE9B,QAAS,GAAM,EAAI,EAAS,GAAM,EAAI,EAAO,GAAM,EAAG,CASpD,IARA,IAAI,EAAY,EAAW,EAOvB,GAJF,EADE,KAAQ,GAAM,IAAO,GAAK,EAAG,EAAY,GAAK,EAAG,EAAY,GAC1D,EAAG,EAAY,GAEf,EAAG,EAAY,GAAK,GAEb,EAEZ,EAAK,GACL,EAAK,GACL,EAAM,OAAO,KAAQ,EAAM,OAAO,IAElC,IACA,IAGF,GADA,EAAG,GAAa,EACZ,EAAK,EAEP,GAAS,UACA,EAAK,EAEd,GAAW,UACF,IACL,EAAY,EAAW,EAAQ,IAClB,GAAK,EAAY,QAAY,EAAG,IAG3C,IADA,EAAK,EAAe,EAAG,IAGzB,OAAO,EAAkB,EAAO,EAAO,EAAI,EAInD,CAGA,QAAS,GAAM,EAAI,EAAS,GAAM,EAAI,EAAO,GAAM,EAAG,CASpD,IARA,IACI,EADA,EAAY,EAAW,EAOvB,GAJF,EADE,KAAQ,GAAM,IAAO,GAAK,EAAG,EAAY,GAAK,EAAG,EAAY,GAC1D,EAAG,EAAY,GAEf,EAAG,EAAY,GAAK,GAEb,EAEZ,EAAK,GACL,EAAK,GACL,EAAM,OAAO,EAAe,EAAK,KAC/B,EAAM,OAAO,EAAe,EAAK,IAEnC,IACA,IAGF,GADA,EAAG,GAAa,EACZ,EAAK,EAEP,GAAS,UACA,EAAK,EAEd,GAAW,WACD,EAAO,CAGf,IAAI,EADN,IADI,EAAY,EAAW,EAAQ,IAClB,GAAK,EAAY,IAAkC,IAAtB,EAAG,GAK/C,GAHI,EAAK,GADL,EAAK,EAAG,IACa,EAGrB,IADJ,EAAK,EAAe,GAGlB,OAAO,EAAkB,EAAO,EAAO,EAAI,EAGjD,CACF,CACF,CAGA,MAAO,CACL,CAAC,EAAa,GACd,CAlPc,EAkPA,GAElB,CAjHA,CAZsB,EAAO,EAC7B,CAxDA,CA3BE,EAAQ,EAAM,UAAU,EAAG,EAAM,OAAS,GAC1C,EAAQ,EAAM,UAAU,EAAG,EAAM,OAAS,IAM1C,OAAI,GACF,EAAM,QAAQ,CA5CD,EA4Cc,IAEzB,GACF,EAAM,KAAK,CA/CE,EA+CW,IAE1B,EAAkB,EAAO,GACrB,GAscN,SAA8B,GAc5B,QAbI,KACA,EAAa,GACb,EAAmB,EAEnB,EAAe,KAEf,EAAU,EAEV,EAAqB,EACrB,EAAoB,EAEpB,EAAqB,EACrB,EAAoB,EACjB,EAAU,EAAM,QAtgBR,GAugBT,EAAM,GAAS,IAEjB,EAAW,KAAsB,EACjC,EAAqB,EACrB,EAAoB,EACpB,EAAqB,EACrB,EAAoB,EACpB,EAAe,EAAM,GAAS,KA/gBlB,GAkhBR,EAAM,GAAS,GACjB,GAAsB,EAAM,GAAS,GAAG,OAExC,GAAqB,EAAM,GAAS,GAAG,OAKvC,GACA,EAAa,QACX,KAAK,IAAI,EAAoB,IAC/B,EAAa,QAAU,KAAK,IAAI,EAAoB,KAGpD,EAAM,OAAO,EAAW,EAAmB,GAAI,EAAG,CAChD,EACA,IAGF,EAAM,EAAW,EAAmB,GAAK,GAAG,GAriBlC,EAuiBV,IAGA,IADA,EAC6B,EAAI,EAAW,EAAmB,MAC/D,EAAqB,EACrB,EAAoB,EACpB,EAAqB,EACrB,EAAoB,EACpB,EAAe,KACf,OAGJ,IAgBF,IAZI,GACF,EAAkB,GA4EtB,SAAsC,GAWpC,SAAS,EAA2B,EAAK,GACvC,IAAK,IAAQ,EAEX,SAQF,IAAI,EAAQ,EAAI,OAAO,EAAI,OAAS,GAChC,EAAQ,EAAI,OAAO,GACnB,EAAmB,EAAM,MAAM,GAC/B,EAAmB,EAAM,MAAM,GAC/B,EAAc,GAAoB,EAAM,MAAM,GAC9C,EAAc,GAAoB,EAAM,MAAM,GAC9C,EAAa,GAAe,EAAM,MAAM,GACxC,EAAa,GAAe,EAAM,MAAM,GACxC,EAAa,GAAc,EAAI,MAAM,GACrC,EAAa,GAAc,EAAI,MAAM,GAEzC,OAAI,GAAc,EAET,EACE,GAAc,EAEhB,EACE,IAAqB,GAAe,EAEtC,EACE,GAAe,EAEjB,EACE,GAAoB,EAEtB,EAEF,CACT,CAIA,IAFI,MAAU,EAEP,EAAU,EAAM,OAAS,GAAG,CACjC,GA1rBa,GA2rBX,EAAM,EAAU,GAAG,IA3rBR,GA4rBX,EAAM,EAAU,GAAG,GACnB,CAEA,IAAI,EAAY,EAAM,EAAU,GAAG,GAC/B,EAAO,EAAM,GAAS,GACtB,EAAY,EAAM,EAAU,GAAG,GAG/B,EAAe,EAAkB,EAAW,GAChD,GAAI,EAAc,CAChB,IAAI,EAAe,EAAK,UAAU,EAAK,OAAS,GAChD,EAAY,EAAU,UAAU,EAAG,EAAU,OAAS,GACtD,EAAO,EAAe,EAAK,UAAU,EAAG,EAAK,OAAS,GACtD,EAAY,EAAe,CAC7B,CASA,QANI,EAAgB,EAChB,EAAW,EACX,EAAgB,EAChB,EACF,EAA2B,EAAW,GACtC,EAA2B,EAAM,GAC5B,EAAK,OAAO,KAAO,EAAU,OAAO,IAAI,CAC7C,GAAa,EAAK,OAAO,GACzB,EAAO,EAAK,UAAU,GAAK,EAAU,OAAO,GAC5C,EAAY,EAAU,UAAU,GAChC,IAAI,EACF,EAA2B,EAAW,GACtC,EAA2B,EAAM,GAE/B,GAAS,IACX,EAAY,EACZ,EAAgB,EAChB,EAAW,EACX,EAAgB,EAEpB,CAEI,EAAM,EAAU,GAAG,IAAM,IAEvB,EACF,EAAM,EAAU,GAAG,GAAK,GAExB,EAAM,OAAO,EAAU,EAAG,GAC1B,KAEF,EAAM,GAAS,GAAK,EAChB,EACF,EAAM,EAAU,GAAG,GAAK,GAExB,EAAM,OAAO,EAAU,EAAG,GAC1B,KAGN,CACA,GACF,CACF,CAnHA,CA1E+B,GAQ7B,EAAU,EACH,EAAU,EAAM,QAAQ,CAC7B,GACE,EAAM,EAAU,GAAG,IAAM,GArkBb,GAskBZ,EAAM,GAAS,GACf,CACA,IAAI,EAAW,EAAM,EAAU,GAAG,GAC9B,EAAY,EAAM,GAAS,GAC3B,EAAkB,EAAoB,EAAU,GAChD,EAAkB,EAAoB,EAAW,GACjD,GAAmB,GAEnB,GAAmB,EAAS,OAAS,GACrC,GAAmB,EAAU,OAAS,KAGtC,EAAM,OAAO,EAAS,EAAG,CAjlBlB,EAmlBL,EAAU,UAAU,EAAG,KAEzB,EAAM,EAAU,GAAG,GAAK,EAAS,UAC/B,EACA,EAAS,OAAS,GAEpB,EAAM,EAAU,GAAG,GAAK,EAAU,UAAU,GAC5C,MAIA,GAAmB,EAAS,OAAS,GACrC,GAAmB,EAAU,OAAS,KAItC,EAAM,OAAO,EAAS,EAAG,CAnmBlB,EAqmBL,EAAS,UAAU,EAAG,KAExB,EAAM,EAAU,GAAG,GAxmBX,EAymBR,EAAM,EAAU,GAAG,GAAK,EAAU,UAChC,EACA,EAAU,OAAS,GAErB,EAAM,EAAU,GAAG,GAAK,EACxB,EAAM,EAAU,GAAG,GAAK,EAAS,UAAU,GAC3C,KAGJ,GACF,CACA,GACF,CACF,CA7HA,CArcyB,GAEhB,CACT,CAwMA,SAAS,EAAkB,EAAO,EAAO,EAAG,GAC1C,IAAI,EAAS,EAAM,UAAU,EAAG,GAC5B,EAAS,EAAM,UAAU,EAAG,GAC5B,EAAS,EAAM,UAAU,GACzB,EAAS,EAAM,UAAU,GAGzB,EAAQ,EAAU,EAAQ,GAC1B,EAAS,EAAU,EAAQ,GAE/B,OAAO,EAAM,OAAO,EACtB,CASA,SAAS,EAAkB,EAAO,GAEhC,IAAK,IAAU,GAAS,EAAM,OAAO,KAAO,EAAM,OAAO,GACvD,OAQF,UAJI,EAAa,EACb,EAAa,KAAK,IAAI,EAAM,OAAQ,EAAM,QAC1C,EAAa,EACb,EAAe,EACZ,EAAa,GAEhB,EAAM,UAAU,EAAc,IAC9B,EAAM,UAAU,EAAc,GAG9B,EADA,EAAa,EAGb,EAAa,EAEf,EAAa,KAAK,OAAO,EAAa,GAAc,EAAI,GAG1D,OAAI,EAAwB,EAAM,WAAW,EAAa,KACxD,IAGK,CACT,CAUA,SAAS,EAAoB,EAAO,GAElC,IAAI,EAAe,EAAM,OACrB,EAAe,EAAM,OAEzB,GAAoB,GAAhB,GAAqC,GAAhB,EACvB,OAGE,IAAe,EACjB,EAAQ,EAAM,UAAU,EAAe,GAC9B,EAAe,IACxB,EAAQ,EAAM,UAAU,EAAG,IAE7B,IAAI,EAAc,KAAK,IAAI,EAAc,GAEzC,GAAI,GAAS,EACX,OAAO,EAQT,IAFI,MAAO,EACP,EAAS,IACA,CACX,IAAI,EAAU,EAAM,UAAU,EAAc,GACxC,EAAQ,EAAM,QAAQ,GAC1B,IACE,GADE,EACF,OAAO,EAET,GAAU,GAEC,GAAT,GACA,EAAM,UAAU,EAAc,IAAW,EAAM,UAAU,EAAG,MAE5D,EAAO,EACP,IAEJ,CACF,CAQA,SAAS,EAAkB,EAAO,GAEhC,IAAK,IAAU,GAAS,EAAM,OAAQ,KAAM,EAAM,OAAQ,GACxD,OAQF,UAJI,EAAa,EACb,EAAa,KAAK,IAAI,EAAM,OAAQ,EAAM,QAC1C,EAAa,EACb,EAAa,EACV,EAAa,GAEhB,EAAM,UAAU,EAAM,OAAS,EAAY,EAAM,OAAS,IAC1D,EAAM,UAAU,EAAM,OAAS,EAAY,EAAM,OAAS,GAG1D,EADA,EAAa,EAGb,EAAa,EAEf,EAAa,KAAK,OAAO,EAAa,GAAc,EAAI,GAG1D,OAAI,EAAsB,EAAM,WAAW,EAAM,OAAS,KACxD,IAGK,CACT,CAiPA,IAAI,EAAwB,eACxB,EAAmB,KACnB,EAAkB,SAClB,EAAqB,WACrB,EAAuB,cAmI3B,SAAS,EAAkB,EAAO,GAChC,EAAM,KAAK,CA/vBI,EA+vBS,KAOxB,QADI,EALA,EAAU,EACV,EAAe,EACf,EAAe,EACf,EAAc,GACd,EAAc,GAEX,EAAU,EAAM,QACrB,GAAI,EAAU,EAAM,OAAS,IAAM,EAAM,GAAS,GAChD,EAAM,OAAO,EAAS,QAGxB,OAAQ,EAAM,GAAS,IACrB,KA7wBY,EA8wBV,IACA,GAAe,EAAM,GAAS,GAC9B,IACA,MACF,KAAK,EACH,IACA,GAAe,EAAM,GAAS,GAC9B,IACA,MACF,KAtxBW,EAuxBT,IAAI,EAAoB,EAAU,EAAe,EAAe,EAChE,GAAI,EAAa,CAWf,GACE,GAAqB,GACrB,EAAqB,EAAM,GAAmB,IAC9C,CACA,IAAI,EAAQ,EAAM,GAAmB,GAAG,OAAM,GAO9C,GANA,EAAM,GAAmB,GAAK,EAAM,GAAmB,GAAG,MACxD,GACA,GAEF,EAAc,EAAQ,EACtB,EAAc,EAAQ,GACjB,EAAM,GAAmB,GAAI,CAEhC,EAAM,OAAO,EAAmB,GAChC,IACA,IAAI,EAAI,EAAoB,EACxB,EAAM,IApzBN,IAozBY,EAAM,GAAG,KACvB,IACA,EAAc,EAAM,GAAG,GAAK,EAC5B,KAEE,EAAM,IAAM,EAAM,GAAG,KAAO,IAC9B,IACA,EAAc,EAAM,GAAG,GAAK,EAC5B,KAEF,EAAoB,CACtB,CACF,CACI,EAAqB,EAAM,GAAS,MAClC,EAAQ,EAAM,GAAS,GAAG,OAAO,GACrC,EAAM,GAAS,GAAK,EAAM,GAAS,GAAG,MAAM,GAC5C,GAAe,EACf,GAAe,EAEnB,CACA,GAAI,EAAU,EAAM,OAAS,IAAM,EAAM,GAAS,GAAI,CAEpD,EAAM,OAAO,EAAS,GACtB,KACF,CACA,GAAI,EAAY,OAAS,GAAK,EAAY,OAAS,EAAG,CAEhD,EAAY,OAAS,GAAK,EAAY,OAAS,IAG5B,KADrB,EAAe,EAAkB,EAAa,MAExC,GAAqB,EACvB,EAAM,GAAmB,IAAM,EAAY,UACzC,EACA,IAGF,EAAM,OAAO,EAAG,EAAG,CAx1BlB,EA01BC,EAAY,UAAU,EAAG,KAE3B,KAEF,EAAc,EAAY,UAAU,GACpC,EAAc,EAAY,UAAU,IAIjB,KADrB,EAAe,EAAkB,EAAa,MAE5C,EAAM,GAAS,GACb,EAAY,UAAU,EAAY,OAAS,GAC3C,EAAM,GAAS,GACjB,EAAc,EAAY,UACxB,EACA,EAAY,OAAS,GAEvB,EAAc,EAAY,UACxB,EACA,EAAY,OAAS,KAK3B,IAAI,EAAI,EAAe,EACI,IAAvB,EAAY,QAAuC,IAAvB,EAAY,QAC1C,EAAM,OAAO,EAAU,EAAG,GAC1B,GAAoB,GACY,IAAvB,EAAY,QACrB,EAAM,OAAO,EAAU,EAAG,EAAG,CAx3BvB,EAw3BqC,IAC3C,EAAU,EAAU,EAAI,GACQ,IAAvB,EAAY,QACrB,EAAM,OAAO,EAAU,EAAG,EAAG,CAAC,EAAa,IAC3C,EAAU,EAAU,EAAI,IAExB,EAAM,OACJ,EAAU,EACV,EACA,CAAC,EAAa,GACd,CAl4BI,EAk4BU,IAEhB,EAAU,EAAU,EAAI,EAE5B,CACgB,IAAZ,GAt4BK,IAs4BY,EAAM,EAAU,GAAG,IAEtC,EAAM,EAAU,GAAG,IAAM,EAAM,GAAS,GACxC,EAAM,OAAO,EAAS,IAEtB,IAEF,EAAe,EACf,EAAe,EACf,EAAc,GACd,EAAc,GAIe,KAA/B,EAAM,EAAM,OAAS,GAAG,IAC1B,EAAM,MAMR,IAAI,KAGJ,IAFA,EAAU,EAEH,EAAU,EAAM,OAAS,GA95BjB,IAg6BX,EAAM,EAAU,GAAG,IAh6BR,IAi6BX,EAAM,EAAU,GAAG,KAIjB,EAAM,GAAS,GAAG,UAChB,EAAM,GAAS,GAAG,OAAS,EAAM,EAAU,GAAG,GAAG,UAC7C,EAAM,EAAU,GAAG,IAGzB,EAAM,GAAS,GACb,EAAM,EAAU,GAAG,GACnB,EAAM,GAAS,GAAG,UAChB,EACA,EAAM,GAAS,GAAG,OAAS,EAAM,EAAU,GAAG,GAAG,QAErD,EAAM,EAAU,GAAG,GAAK,EAAM,EAAU,GAAG,GAAK,EAAM,EAAU,GAAG,GACnE,EAAM,OAAO,EAAU,EAAG,GAC1B,MAEA,EAAM,GAAS,GAAG,UAAU,EAAG,EAAM,EAAU,GAAG,GAAG,SACrD,EAAM,EAAU,GAAG,KAGnB,EAAM,EAAU,GAAG,IAAM,EAAM,EAAU,GAAG,GAC5C,EAAM,GAAS,GACb,EAAM,GAAS,GAAG,UAAU,EAAM,EAAU,GAAG,GAAG,QAClD,EAAM,EAAU,GAAG,GACrB,EAAM,OAAO,EAAU,EAAG,GAC1B,OAGJ,IAGE,GACF,EAAkB,EAAO,EAE7B,CAEA,SAAS,EAAwB,GAC/B,OAAO,GAAY,OAAU,GAAY,KAC3C,CAEA,SAAS,EAAsB,GAC7B,OAAO,GAAY,OAAU,GAAY,KAC3C,CAEA,SAAS,EAAqB,GAC5B,OAAO,EAAsB,EAAI,WAAW,GAC9C,CAEA,SAAS,EAAqB,GAC5B,OAAO,EAAwB,EAAI,WAAW,EAAI,OAAS,GAC7D,CAYA,SAAS,EAAiB,EAAQ,EAAW,EAAW,GACtD,OAAI,EAAqB,IAAW,EAAqB,GAChD,KAZX,SAA6B,GAE3B,QADI,EAAM,GACD,EAAI,EAAG,EAAI,EAAO,OAAQ,IAC7B,EAAO,GAAG,GAAG,OAAS,GACxB,EAAI,KAAK,EAAO,IAGpB,OAAO,CACT,CARA,CAc6B,CACzB,CAv+Ba,EAu+BA,GACb,CAAC,EAAa,GACd,CA1+Bc,EA0+BA,GACd,CA1+Ba,EA0+BA,IAEjB,CA2FA,SAAS,EAAK,EAAO,EAAO,EAAY,GAGtC,OAAO,EAAU,EAAO,EAAO,EAAY,KAC7C,CAEA,EAAK,OA9kCa,EA+kClB,EAAK,OAAS,EACd,EAAK,MA/kCY,EAilCjB,EAAO,QAAU,GAjnCjB,iCCAA,EAAA,KAAA,EAAA,KAAA,QAAA,KAAA,EAAA,EAAA,EAAA,EAAA,CAAA,IAAA,EAAA,GAAA,YAAA,MAAA,EAAA,CAAA,WAAA,IAAA,GAAA,YAAA,kBAAA,gBAAA,IAAA,EAAA,eAAA,oBAAA,eAAA,iBAAA,iBAAA,IAAA,GAAA,iCAAA,wBAAA,gBAAA,IAAA,GAAA,oBAAA,qBAAA,uBAAA,IAAA,GAAA,8BAAA,oCAAA,SAAA,IAAA,GAAA,gBAAA,IAAA,EAAA,QAAA,IAAA,EAAA,wBAAA,aAAA,UAAA,IAAA,GAAA,cAAA,eAAA,mBAAA,iBAAA,SAAA,IAAA,MAAA,EAAA,qCCuBO,IAAI,KACJ,SAAS,EAAS,GACvB,EAAU,CACZ,CAMO,IAAK,WAAA,CAQL,GAPL,IAAM,MACN,EAAA,IAAM,MAFI,GAQL,SAAS,EAAkB,GAChC,OAAQ,GACN,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,QACE,MAAM,IAAI,MAAM,4BAA4B,KAElD,CAMO,IAUL,ECzCU,ED+BA,OACV,EAAA,KAAO,OACP,EAAA,MAAQ,QAFE,IAAA,GAAA,IASA,IACV,EADU,GAAA,IACV,QAAU,UACV,EAAA,YAAc,cACd,EAAA,SAAW,WAHD,GCxCA,SAAA,CAeC,KAdX,MAAQ,GAAR,QACA,EAAA,EAAA,KAAA,UACA,IAAA,KACA,cAAA,MAJU,cA+GZ,SAAS,EAAqB,GAC5B,IAAM,EAAI,MAAM,KAAK,GACjB,EAAW,KACf,OAAI,EAAE,aAAc,QAClB,EAAI,EAAE,SAED,CAAE,MAAO,EAAG,SAAU,EAC/B,CAEA,SAAS,EAA0B,GACjC,IAAM,EAAI,EAAK,MACT,EAAQ,IAAM,EAAE,YAAiB,EAAE,OACrC,EAAW,GAAG,OAAO,EAAK,UAC9B,OAAI,IACE,EAAS,OAAS,IACpB,EAAW,EAAS,OAAO,CAAC,QAE9B,EAAW,EAAS,OAAO,CAAC,EAAE,aAC1B,IACF,EAAW,EAAS,OAAO,CAAC,OAAO,OAAO,KAGvC,CACT,CAEO,IClHL,EDkHW,EAAS,IAzHf,MAGL,WAAA,CAAoB,GAAA,KAAA,cAFpB,EAAA,KAAQ,YAA6D,GAEzB,CAEpC,YAAA,CAAa,GACf,KAAK,YACH,KAAK,YAAY,MACnB,KAAK,YAAY,SAAS,GAE1B,KAAK,YAAY,OAAO,GAG1B,QAAQ,SAAS,EAErB,CAEQ,WAAA,CAAY,GACd,KAAK,YACH,KAAK,YAAY,KACnB,KAAK,YAAY,QAAQ,GAEzB,KAAK,YAAY,OAAO,GAG1B,QAAQ,QAAQ,EAEpB,CAEQ,WAAA,CAAY,GACd,KAAK,YACH,KAAK,YAAY,KACnB,KAAK,YAAY,QAAQ,GAEzB,KAAK,YAAY,OAAO,GAG1B,QAAQ,QAAQ,EAEpB,CAEQ,YAAA,CAAa,GACf,KAAK,YACH,KAAK,YAAY,MACnB,KAAK,YAAY,SAAS,GAE1B,KAAK,YAAY,OAAO,GAG1B,QAAQ,SAAS,EAErB,CAEQ,gBAAA,CAAiB,EAAiB,GACxC,IAAM,EAAW,KAAK,UAAU,GAC5B,GACF,EAAS,EAEb,CAMA,WAAA,CAAY,EAAiB,GAC3B,KAAK,UAAU,GAAS,CAC1B,CAEA,KAAA,IAAS,GACP,IAAM,EAAO,EAAqB,WAClC,KAAK,aAAa,EAA0B,IAC5C,KAAK,iBAAiB,EAAgB,EACxC,CAEA,IAAA,IAAQ,GACN,IAAM,EAAO,EAAqB,WAClC,KAAK,YAAY,EAA0B,IAC3C,KAAK,iBAAiB,EAAe,EACvC,CAEA,IAAA,IAAQ,GACN,IAAM,EAAO,EAAqB,WAClC,KAAK,YAAY,EAA0B,IAC3C,KAAK,iBAAiB,EAAe,EACvC,CAEA,KAAA,IAAS,GACP,IAAM,EAAO,EAAqB,WAClC,KAAK,aAAa,EAA0B,IAC5C,KAAK,iBAAiB,EAAgB,EACxC,GCnGU,IAgBV,EAhBU,GAAA,IAgBV,gBAAkB,kBAQlB,EAAA,2BAA6B,6BAa7B,EAAA,wBAA0B,0BAS1B,EAAA,yBAA2B,2BAO3B,EAAA,2BAA6B,6BAQ7B,EAAA,cAAgB,gBAYhB,EAAA,0BAA4B,4BAe5B,EAAA,2BAA6B,6BAU7B,EAAA,yBAA2B,2BAU3B,EAAA,kBAAoB,oBA5GV,GAyJN,EAAQ,CAAC,EAYR,SAAS,EACd,EACA,EACA,GAEA,GAAK,EAAM,GAEJ,CACL,IAAI,EAAe,EAAM,GACpB,IACH,EAAe,EAAM,GAAQ,IAE3B,EACF,EAAa,QAAQ,GAErB,EAAa,KAAK,EAEtB,MAXU,EAAO,KAAK,IAAI,MAAM,iCAAiC,OAYnE,CASO,SAAS,EAAW,EAAc,GACvC,GAAK,EAAM,GAEJ,CACL,IAAM,EAAe,EAAM,GAC3B,GAAI,EAAc,CAChB,IAAM,EAAQ,EAAa,QAAQ,GAC/B,GAAS,GACX,EAAa,OAAO,EAAO,EAE/B,CACF,MATU,EAAO,KAAK,IAAI,MAAM,iCAAiC,OAUnE,CAMO,SAAS,EAAgB,GAE9B,OADqB,EAAM,IACJ,EACzB,CAKO,IAAM,EAAS,CACpB,eACA,cClOW,EAAN,MAML,WAAA,CAA4B,GAAA,KAAA,sBAL5B,EAAA,KAA2D,cAC3D,KAAA,KAAQ,kBACR,EAAA,KAAA,uBACA,EAAA,KAAA,qBAGE,KAAK,eAAiB,EAGtB,KAAK,oBAAyB,KAAK,oBAAsB,EACzD,KAAK,kBAAuB,KAAK,kBAAoB,CACvD,CAQA,wBAAA,CAAyB,EAAc,GACrC,EAAe,KAAK,KAAM,EAAM,QAAS,EAC3C,CAQA,sBAAA,CAAuB,EAAc,GACnC,EAAe,KAAK,KAAM,EAAM,MAAO,EACzC,CAMA,YAAA,GACE,IAAM,EAAa,KAAK,WACpB,EAAK,GACT,OAAO,KAAK,GAAY,SAAS,IAC/B,IAAM,EAAS,EAAW,GACpB,EAAI,EAAO,OACjB,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAO,GACjB,GAAM,EACF,EAAI,IACN,GAAM,IAAI,MAEZ,GAAM,cAAc,EAAE,eAAkB,EAAE,kBACxC,EAAE,IAAS,EAAE,SAEjB,KAEM,EAAO,KAAK,EACtB,CAKA,OAAA,GACE,KAAK,eAAiB,EAGtB,KAAK,oBAAyB,KAAK,oBAAsB,EACzD,KAAK,kBAAuB,KAAK,kBAAoB,CACvD,CAKA,MAAA,GACE,KAAK,eAAiB,EAGtB,KAAK,oBAAyB,KAAK,oBACjC,EACF,KAAK,kBAAuB,KAAK,kBAAoB,CACvD,CAKA,SAAA,GACE,OAAO,KAAK,sBAAwB,CACtC,GAGF,SAAS,IAUT,UAAS,EACP,EACA,EACA,GAEK,IACH,EAAY,KAAK,oBAAoB,OAEvC,IAII,EAJA,EAAa,KAAK,WAAW,GAC5B,IACH,EAAa,KAAK,WAAW,GAAQ,IAIvC,QAAS,EADC,EAAW,OACJ,EAAG,GAAK,IACvB,EAAI,EAAW,IACX,GAAM,EAAE,IAFc,IAK1B,EAAI,KAED,IACH,EAAI,CACJ,IAAW,KAAK,IAElB,EAAE,GAAY,CAChB,CASA,SAAS,EAAoB,EAAc,GACzC,KAAK,eAAe,EAAM,QAAS,EACrC,CASA,SAAS,EAAkB,EAAc,GACvC,KAAK,eAAe,EAAM,MAAO,EACnC,CACA,IAAM,EAA8B,CAAE,IAAK,KAAK,KAC1C,EAAsB,QAAU,OAAO,YAChC,EAAW,IAAI,EAC1B,GAAuB,GAEzB,EAAS,yBAAyB,oBAK3B,IAAM,EAAU,CACrB,SAAU,CACR,oBAAqB,EAAS,oBAC9B,kBAAmB,EAAS,kBAC5B,aAAc,EAAS,aACvB,QAAS,EAAS,QAClB,OAAQ,EAAS,SClKR,EACX,UAAU,UAAU,SAAS,UACzB,WACA,UAAU,UAAU,SAAS,WAC3B,UACA,UAAU,UAAU,SAAS,eAC3B,SACA,UAMG,EACX,0EAIW,EAAsB,mBAExB,EAAW,GAQf,SAAS,EAAa,GAC3B,OAAO,KAAK,MAAM,EACpB,CAEO,SAAS,EAAc,GAC5B,IAAM,EAAI,EAAI,MAAM,YACpB,OAAI,EACK,EAAE,GAEJ,CACT,CAaO,IAAI,GAAU,OAAO,SAAS,KAC9B,SAAS,GAAW,GACzB,GAAU,CACZ,CAMO,IAAI,GAAkB,OAAO,SAAS,KACtC,SAAS,GAAmB,GACjC,GAAkB,CACpB,CAOO,SAAS,GAAW,EAAgB,GACzC,GAAI,UAAU,KAAK,GACjB,OAAO,GAAU,EAEnB,IAAK,GAAW,EAAO,MAAM,YAC3B,OAAI,EAAO,cAAc,MAAM,gBACtB,KAEL,EAAO,MAAM,yBACf,EAAS,GAAG,MAEP,GAKT,IAAI,EACJ,GAJI,EAAQ,MAAM,yBAChB,EAAU,GAAG,MAGX,EAAO,MAAM,SAEf,OADA,EAAI,EAAQ,MAAM,kBACd,EACK,EAAE,GAAK,EAET,EAET,GAAI,EAAO,MAAM,OAEf,OADA,EAAI,EAAQ,MAAM,0BACd,EACK,EAAE,GAAK,EAET,EAMT,GAJI,EAAO,MAAM,eACf,EAAS,EAAO,OAAO,IAEzB,EAhEK,SAA+B,GACpC,IAAM,EAAI,EAAI,MAAM,aACpB,OAAI,EACK,EAAE,GAEJ,CACT,CANO,CAgE2B,GAC5B,EAAO,MAAM,MACf,OAAO,EAAU,EAEnB,IAAI,EAAI,EAAQ,YAAY,KAC5B,GAAI,EAAI,EACN,OAAO,EAET,IAAI,EAAM,EAAQ,OAAO,EAAG,EAAI,GAAK,EACjC,EAAY,GAOhB,IANA,EAAI,EAAI,MAAM,sBACV,IACF,EAAM,EAAE,GACR,EAAY,EAAE,IAId,EAAI,EAAI,QAAQ,UACZ,GAAK,IAFE,CAKX,IAAM,EAAI,EAAI,YAAY,IAAK,EAAI,GACnC,GAAI,GAAK,EACP,MAEF,EAAM,EAAI,OAAO,EAAG,GAAK,EAAI,OAAO,EAAI,EAC1C,CACA,OAAO,EAAI,QAAQ,aAAc,KAAO,CAC1C,CAUO,SAAS,GAAkB,GAChC,IAAI,EACJ,OACG,EACC,yEAAyE,KACvE,IAIJ,EAAM,GAAG,EAAE,iCAAiC,EAAE,MAAM,EAAE,GAAK,GAAK,YAC9D,EAAE,MAGH,EACC,0EAA0E,KACxE,IAIJ,EAAM,GAAG,EAAE,gEAAgE,EAAE,MAE5E,EACC,uEAAuE,KACrE,IAIJ,EAAM,GAAG,EAAE,kCAAkC,EAAE,UAAU,EAAE,MAE1D,EACC,yEAAyE,KACvE,IAIJ,EAAM,GAAG,EAAE,kCAAkC,EAAE,UAAU,EAAE,MAAM,EAAE,MAElE,EACC,+EAA+E,KAC7E,MAIJ,EAAM,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,OAEvC,CACT,CA6DO,SAAS,GAAS,GACvB,OAAS,MAAL,EACK,EAEF,EAAE,UACX,CAYO,IAAM,GAAN,iBAAA,GACL,EAAA,KAAsB,SAAC,MAAI,CAE3B,MAAA,GACE,OAAO,KAAK,MAAM,OAAS,CAC7B,CAEA,GAAA,CAAI,GACF,IAAI,EAAQ,KAAK,MAAM,OACvB,KAAO,EAAQ,GAAG,CAChB,IAAM,EAAc,KAAK,MAAM,EAAQ,GACjC,EAAS,KAAK,MAAM,GAC1B,GAAI,EAAO,QAAQ,GAAQ,EAEzB,YADA,KAAK,MAAM,GAAS,GAGtB,KAAK,MAAM,GAAS,EACpB,EAAQ,CACV,CACA,KAAK,MAAM,GAAK,CAClB,CAKA,IAAA,GACE,OAAO,KAAK,MAAM,EACpB,CAMA,MAAA,GACE,IAAM,EAAS,KAAK,MAAM,GACpB,EAAO,KAAK,MAAM,MAClB,EAAO,KAAK,MAAM,OACxB,GAAI,EAAO,EAAG,CACZ,IAAI,EAAQ,EACZ,OAAa,CACX,IAAI,EAAqB,EAAR,EACjB,GAAI,GAAc,EAChB,MAEF,GAAI,KAAK,MAAM,GAAY,QAAQ,GAAQ,EAEvC,EAAa,EAAI,GACjB,KAAK,MAAM,EAAa,GAAG,QACzB,KAAK,MAAM,IACT,GAEJ,QAGF,QAAa,EAAI,GACjB,KAAK,MAAM,EAAa,GAAG,QAAQ,GAAQ,GAI3C,MAFA,GAIF,CAAA,KAAK,MAAM,GAAS,KAAK,MAAM,GAC/B,EAAQ,CACV,CACA,KAAK,MAAM,GAAS,CACtB,CACA,OAAO,CACT,GAGW,GAAgB,CAAC,GAAI,WAAY,SAEjC,GAA2C,GAEjD,SAAS,GACd,EACA,GAEA,OAAO,IAAI,SAAS,EAAS,EAAM,QACrC,CAwCO,SAAS,GACd,EACA,EACA,GAEA,IAAM,EAAa,MAAA,WAAsB,MACzC,IAAK,EACH,OAEF,GAAI,EAAK,WAAW,MAElB,YADA,EAAU,YAAY,EAAM,GAAS,KAGvC,IAAM,EAnDD,SAAkC,GACvC,IAAI,EAAW,GAAY,GAC3B,GAAI,GAAyB,OAAb,EAEd,OAAO,EAET,OAAQ,GACN,IAAK,WACL,IAAK,WACL,IAAK,qBACL,IAAK,iBACH,OAAA,GAAY,GAAQ,KACb,KACT,IAAK,uBAEH,GACE,GAAyB,WAAY,kBACpC,GAAyB,GAAI,wBAE9B,OAAA,GAAY,GAAQ,CAAC,wBACd,CAAC,wBAId,QAAW,KAAU,GACnB,GAAI,GAAyB,EAAQ,GACnC,OAAA,EAAW,CAAC,EAAS,GACrB,GAAY,GAAQ,EACb,EAKX,OAAQ,EAAO,KAAK,0CAA2C,GAC/D,GAAY,GAAQ,KACb,IACT,CApCO,CAmDkD,GACvD,GAAK,EAGL,QAAW,KAAY,EAAuB,CAC5C,OAAQ,GACN,IAAK,uBAEI,QADC,IAEJ,EAAQ,cAGZ,MACF,IAAK,uBAEI,QADC,GAGJ,EAAU,YAAY,cAAe,KAK7C,EAAU,YAAY,EAAU,EAClC,CACF,CAEO,SAAS,GACd,EACA,EACA,GAEA,IACE,IAAM,EAAgB,GAAY,GAClC,OAAQ,EAAqB,MAAM,iBACjC,EAAgB,EAAc,GAAK,EAEvC,CAAS,SACT,QAAO,GAAa,EACtB,CAEO,SAAS,GAAiB,GAC/B,IAAI,EAAO,EAAQ,eAAe,uCAAQ,QAC1C,OAAK,GAAgC,gCAAxB,EAAQ,eACnB,EAAO,EAAQ,aAAa,SAEvB,CACT,CAEO,IAAM,GAAN,iBAAA,GACL,EAAA,KAAA,OAAiB,GAAC,CAElB,MAAA,CAAO,GACL,OAAA,KAAK,KAAK,KAAK,GACR,IACT,CAEA,KAAA,GACE,KAAK,KAAO,EACd,CAGA,QAAA,GACE,IAAM,EAAM,KAAK,KAAK,KAAK,IAC3B,OAAA,KAAK,KAAO,CAAC,GACN,CACT,GAGK,SAAS,GAAW,GAEzB,MAAO,KAAK,EAAI,WAAW,GAAG,SAAS,MACzC,CAEO,SAAS,GAAe,GAC7B,OAAO,EAAK,QAAQ,+BAAgC,GACtD,CAEO,SAAS,GAAa,GAC3B,OAAO,EAAI,QAAQ,sBAAuB,GAC5C,CAEO,SAAS,GAAe,GAC7B,OAAO,EAAI,QAAQ,2BAA4B,mBACjD,CAEO,SAAS,GAAS,GACvB,QAAS,EAAG,MACV,6GAEJ,CAOO,SAAS,GAAmB,EAAa,GAI9C,OAAO,EAAI,QAAQ,mBAHnB,SAAoB,GAClB,OAPG,SAAyB,EAAa,GAC3C,OAAA,EAA2B,iBAAX,EAAsB,EAAS,QAC9B,MAAQ,EAAI,WAAW,IAAI,SAAS,IAAI,OAAO,EAClE,CAHO,CAOoB,EAAG,EAC5B,GAEF,CAEO,SAAS,GAAa,GAC3B,OAAO,GAAmB,EAC5B,CA4BO,SAAS,GACd,EACA,GAEA,IAAI,EAAI,EACJ,EAAI,EACR,OAAa,CAIX,GAFoB,GAAL,GAAW,EAAK,EAAI,GACpB,GAAK,GAAQ,EAAK,GAC7B,GAAK,EACP,OAAO,EAET,IAAM,EAAK,EAAI,GAAM,EACjB,EAAK,GACP,EAAI,EAEJ,EAAI,EAAI,CAEZ,CACF,CAKO,SAAS,GAAc,EAAW,GACvC,OAAO,EAAI,CACb,CAMO,SAAS,GACd,EACA,GAEA,IAAM,EAA4B,GAClC,IAAW,SAAK,EAAK,CACnB,IAAM,EAAmB,EAAI,GACzB,IAAM,EAAI,KACZ,EAAI,GAAK,EAEb,CACA,OAAO,CACT,CAmBO,SAAS,GACd,EACA,GAEA,IAAM,EAA8B,CACpC,UAAW,KAAK,EAAK,CACnB,IAAM,EAAI,EAAI,GACV,IACE,EAAI,GACN,EAAI,GAAG,KAAK,GAEZ,EAAI,GAAK,CAAC,GAGhB,CACA,OAAO,CACT,CA0CO,IAAM,GAAN,iBAAA,GACL,EAAA,KAAgD,eAEhD,cAAA,CAAc,GACZ,IAAM,EAAO,KAAK,UAAU,EAAI,MAChC,GAAI,EAAM,CACR,EAAI,OAAS,KACb,EAAI,cAAgB,KACpB,QAAS,EAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,EAAK,GAAG,EAEZ,CACF,CAEA,gBAAA,CACE,EACA,EACA,GAEA,GAAI,EACF,OAEF,IAAM,EAAO,KAAK,UAAU,GACxB,EACG,EAAK,SAAS,IACjB,EAAK,KAAK,GAGZ,KAAK,UAAU,GAAQ,CAAC,EAE5B,CAEA,mBAAA,CACE,EACA,EACA,GAEA,GAAI,EACF,OAEF,IAAM,EAAO,KAAK,UAAU,GAC5B,GAAI,EAAM,CACR,IAAM,EAAQ,EAAK,QAAQ,GACvB,GAAS,GACX,EAAK,OAAO,EAAO,EAEvB,CACF,GAIW,GAAY,CACvB,SACA,UACA,SACA,UACA,OACA,QACA,UACA,WACA,OACA,UCrsBK,SAAS,GAAM,GACpB,GAAqB,GAAjB,EAAK,SAAe,CACtB,IAAM,EAAS,EAAiB,aAAa,MAC7C,GAAI,EACF,OAAO,CAEX,CACA,OAAO,IACT,CAEO,SAAS,GAAW,GACzB,MAAO,IAAI,GACb,CAEO,SAAS,GAAO,GACrB,OAAO,EAAI,QAAQ,kBAAmB,GACxC,CAEO,SAAS,GAAa,GAC3B,OAAO,EAAI,OAAO,EACpB,CAEO,SAAS,GAAS,GACvB,OAAK,GAGE,EAAI,QAAQ,oBAAqB,GAC1C,CAEO,SAAS,GAAY,GAC1B,IAAM,EAAS,GACf,EAAG,CACD,IAAM,EAAI,EAAO,MAAM,gBACjB,EAAI,GAAS,EAAE,IAErB,KADA,EAAS,EAAO,OAAO,EAAE,GAAG,OAAS,MACrB,EAAO,OACrB,OAAO,EAET,EAAO,KAAK,EACd,OAAS,GACT,OAAO,CACT,CAEO,SAAS,GAAS,GACvB,IAAM,EAAM,CAAC,EACb,KAAO,GAAQ,CACb,IAAM,EAAI,EAAO,MAAM,4BACvB,IAAK,EACH,OAAO,EAET,EAAI,EAAE,IAAM,GAAY,EAAE,IAC1B,EAAS,EAAO,OAAO,EAAE,GAAG,OAC9B,CACA,OAAO,CACT,CAQO,IAAM,GAAN,MACL,QAAA,CAAS,GACP,EAAG,OAAO,IACZ,CAGA,OAAA,CAAQ,GACN,QACF,GAGW,GAAN,MACL,WAAA,CACkB,EACA,EACA,GAFA,KAAA,QACA,KAAA,KACA,KAAA,UACf,CAGH,QAAA,CAAS,GACP,EAAG,OAAO,KACV,EAAG,OAAO,KAAK,MAAM,aACjB,KAAK,IAAM,KAAK,YAClB,EAAG,OAAO,KACN,KAAK,IACP,EAAG,OAAO,KAAK,IAEb,KAAK,WACP,EAAG,OAAO,OACV,EAAG,OAAO,KAAK,WAEjB,EAAG,OAAO,KAEd,CAGA,OAAA,CAAQ,GACN,GAAyB,GAArB,EAAI,KAAK,SACX,MAAM,IAAI,MAAM,qBAElB,IAGI,EAHE,EAAO,EAAI,KACX,EAAgB,EAAK,SACrB,EAAoB,EAAc,OAElC,EAAa,KAAK,MAAM,KAAK,MAAQ,GAAK,EAChD,GAAI,EAAa,GAA0B,GAArB,EACpB,EAAQ,EAAK,WACb,EAAI,KAAO,GAAS,MACf,CAEL,GADA,EAAQ,EAAc,KAAK,IAAI,EAAY,EAAoB,IAC9C,EAAb,KAAK,MAAW,CAClB,IAAM,EAAO,EAAM,YACd,GAAyB,GAAjB,EAAK,SAGhB,EAAQ,EAFR,EAAI,QAIR,CACA,EAAI,KAAO,CACb,CACA,GAAI,KAAK,KAAO,EAAI,OAAS,KAAK,IAAM,GAAM,EAAI,OAAQ,CACxD,IAAM,EAAY,EAAK,cAAc,eAAe,KAAK,IACrD,EACF,EAAI,KAAO,EAEH,EAAO,KAAK,qBAAsB,KAAK,GAEnD,CACA,OAAA,EAAI,SAAW,KAAK,WAEtB,GAGW,GAAN,MACL,WAAA,CACkB,EACA,EACA,EACA,GAHA,KAAA,SACA,KAAA,aACA,KAAA,YACA,KAAA,UACf,CAEH,OAAA,CAAQ,GACN,GAAI,KAAK,OAAS,IAAM,EAAI,MAAO,CACjC,IAAI,EAAS,KAAK,OACd,EAAO,EAAI,KACf,OAAa,CACX,IAAM,EAAW,EAAK,SACtB,GAAgB,GAAZ,EACF,MAEF,IAAM,EAAO,EAAK,YAClB,GAAI,GAAK,GAAY,GAAY,EAAG,CAClC,IAAM,EAAa,EAAK,YAAY,OACpC,GAAI,GAAU,EACZ,MAEF,IAAK,EAAM,CACT,EAAS,EACT,KACF,CACA,GAAU,CACZ,CACA,IAAK,EAAM,CACT,EAAS,EACT,KACF,CACA,EAAO,CACT,CACA,EAAI,KAAO,EACX,EAAI,OAAS,CACf,CACA,OAAA,EAAI,SAAW,KAAK,WAEtB,CAGA,QAAA,CAAS,GACP,EAAG,OAAO,KACV,EAAG,OAAO,KAAK,OAAO,aAClB,KAAK,YAAc,KAAK,WAAa,KAAK,YAC5C,EAAG,OAAO,MACN,KAAK,YAAc,KAAK,aACtB,KAAK,YACP,EAAG,OAAO,GAAO,KAAK,aAExB,EAAG,OAAO,KACN,KAAK,WACP,EAAG,OAAO,GAAO,KAAK,aAGtB,KAAK,WACP,EAAG,OAAO,OACV,EAAG,OAAO,KAAK,WAEjB,EAAG,OAAO,KAEd,GAGW,GAAN,MAAM,EAAN,WAAA,GACL,EAAA,KAAgB,cAEhB,UAAA,CAAW,GACT,IAAI,EAAI,EAAQ,MAAM,uBACtB,IAAK,EACH,MAAM,IAAI,MAAM,iBAElB,IAAM,EAAM,mBAAmB,EAAE,IAC7B,EAAI,EACF,EAAQ,GACd,OAAa,CACX,IAAI,EAGJ,OAAQ,EAAI,OAAO,IACjB,IAAK,IAAK,CAKR,GAJA,IACA,EAAI,EACD,OAAO,GACP,MAAM,kDACJ,EACH,MAAM,IAAI,MAAM,yBAElB,GAAK,EAAE,GAAG,OACV,IAAM,EAAQ,SAAS,EAAE,GAAI,IACvB,EAAK,EAAE,GACb,EAAM,GAAS,EAAE,IACjB,EAAM,KAAK,IAAI,GAAU,EAAO,EAAS,GAAS,EAAI,KACtD,KACF,CACA,IAAK,IAAK,CAOR,GANA,IACA,EAAI,EACD,OAAO,GACP,MACC,4FAEC,EACH,MAAM,IAAI,MAAM,yBAElB,GAAK,EAAE,GAAG,OACV,IAAM,EAAS,SAAS,EAAE,GAAI,IAC1B,EAAa,EAAE,GACf,IACF,EAAa,GAAS,IAExB,IAAI,EAAY,EAAE,GACd,IACF,EAAY,GAAS,IAEvB,EAAM,GAAS,EAAE,KACjB,EAAM,KACJ,IAAI,GACF,EACA,EACA,EACK,GAAS,EAAI,KAGtB,KACF,CACA,IAAK,IACH,IACA,EAAM,KAAK,IAAI,IACf,MACF,IAAK,IACL,IAAK,IAIL,IAAK,GAEH,YADA,KAAK,MAAQ,GAEf,QACE,MAAM,IAAI,MAAM,qBAEtB,CACF,CAEA,QAAA,CAAS,GACP,IAAM,EAAM,CACV,KAAM,EAAI,gBACV,OAAQ,EACR,SACA,SAAU,KACV,IAAK,MAEP,IAAS,MAAI,EAAG,EAAI,KAAK,MAAM,OAAQ,IACrC,IAAK,KAAK,MAAM,GAAG,QAAQ,GAAM,CAC/B,EAAI,IAAM,IAAI,EACd,EAAI,IAAI,MAAQ,KAAK,MAAM,MAAM,EAAI,GACrC,KACF,CAEF,OAAO,CACT,CAEA,IAAA,CAAK,EAAc,GACjB,OAAO,EACJ,QAAQ,OAAQ,KAChB,MACC,EACI,gCACA,iCACJ,GACD,QAAQ,MAAO,IACf,QAAQ,MAAO,GACpB,CAKA,mBAAA,CACE,EACA,EACA,EACA,GAEA,IAAM,EAAQ,GACV,EAAS,EAAK,WACd,EAAa,GACb,EAAY,GAChB,KAAO,GAAM,CACX,OAAQ,EAAK,UACX,KACA,OACA,OAAQ,GACN,IAAM,EAAO,EAAK,YACZ,EAAa,EAAK,OACpB,GACF,GAAU,EACL,IACH,EAAa,KAGX,EAAS,IACX,EAAS,GAEX,KACA,EAAa,EAAK,OAAO,EAAG,GAC5B,EAAY,EAAK,OAAO,IAE1B,EAAO,EAAK,gBACZ,QACF,CACA,KAAK,EACH,EAAO,EAAK,gBACZ,SAEJ,KACF,CAOA,KANI,EAAS,GAAK,GAAc,KAC9B,EAAa,KAAK,KAAK,MACvB,EAAY,KAAK,KAAK,MACtB,EAAM,KAAK,IAAI,GAAW,EAAQ,EAAY,EAAW,IACzD,EAAW,MAEN,GACA,GAA6B,GAAnB,EAAO,UADT,CAIb,IAAM,EAAK,EAAQ,KAAO,GAAM,GAC5B,EAAQ,EAAQ,EAAI,EACxB,KAAO,GACgB,GAAjB,EAAK,WACP,GAAS,GAEX,EAAO,EAAK,gBAEd,EAAM,KAAK,IAAI,GAAU,EAAO,EAAI,IACpC,EAAW,KACX,EAAO,EACP,EAAS,EAAO,WAChB,IACF,CACA,EAAM,UACF,KAAK,OACP,EAAM,KAAK,IAAI,IACf,KAAK,MAAQ,EAAM,OAAO,KAAK,QAE/B,KAAK,MAAQ,CAEjB,CAEA,QAAA,GACE,IAAK,KAAK,MACR,MAAO,GAET,IAAM,EAAK,IAAS,GACpB,EAAG,OAAO,YACV,IAAS,MAAI,EAAG,EAAI,KAAK,MAAM,OAAQ,IACrC,KAAK,MAAM,GAAG,SAAS,GAEzB,OAAA,EAAG,OAAO,KACH,EAAG,WAAW,QAAQ,KAAM,MACrC,GCxXK,SAAS,GAAiB,GAC/B,MAAO,CACL,WAAY,EAAK,WACjB,WAAY,EAAK,WACjB,OAAQ,EAAK,OACb,UAAW,EAAK,UAChB,YAAa,EAAK,YAClB,WAAY,EAAK,WACjB,UAAW,EAAK,UAChB,WAAY,EAAK,WACjB,WAAY,EAAK,WACjB,kBAAmB,OAAO,OAAO,GAAI,EAAK,mBAC1C,iBAAkB,EAAK,iBACnB,OAAO,OAAO,CAAI,IAAK,yBAG/B,CAEO,IAAM,GAjCJ,CACL,WAAY,QACZ,WAAY,KACZ,OAAQ,EACR,aACA,YAAa,GACb,cACA,aACA,cACA,WAAY,EACZ,kBAAmB,CAAE,eAAmB,UACxC,yBAgCS,GACF,CACX,EAMO,SAAS,GACd,EACA,EACA,EACA,GAEA,IAAM,EAAQ,KAAK,KAAK,EAAQ,GAAK,GAAO,EAAQ,GAAK,GACzD,MAAO,UAAU,SAAa,QAChC,CAKO,SAAS,GAAU,GACxB,MAAO,IAAS,GAAa,GAAG,OAClC,CAKO,SAAS,GAAS,GACvB,OAAY,GAAe,GAAG,IAChC,CAEO,SAAS,GACd,EACA,GAEA,OAAI,EACK,GAAQ,GAAe,MAAiB,GAAe,KAEpD,GAAe,EAC7B,CAEO,IAAI,GAAuB,EAKrB,GAAN,MAWL,WAAA,CACS,EACA,GAUP,GAXO,KAAA,SACA,KAAA,WAZT,EAAA,KACA,cAAA,KAA2B,eAC3B,EAAA,KACA,UAAA,KACA,SAAA,KACA,WAAA,KACA,YAAA,cAAiC,IACjC,EAAA,KAAA,QAAgC,IAChC,EAAA,KAAA,WAA2D,CAAC,GAM1D,KAAK,SAAW,IAAI,KACpB,KAAK,KAAO,IAAI,GAAM,KAAM,GAC5B,KAAK,IAAM,IAAI,GAAM,KAAM,GAC3B,KAAK,MAAQ,IAAI,GAAM,SACvB,KAAK,OAAS,IAAI,GAAM,SACpB,GACF,EAAO,SAAS,KAAK,OAElB,EAAQ,CAEX,IAAM,EAAW,KAAK,SACtB,EAAS,MAAW,KAAK,MACzB,EAAS,KAAU,KAAK,KACxB,EAAS,MAAW,KAAK,MACzB,EAAS,KAAU,KAAK,KACxB,EAAS,IAAS,KAAK,IACvB,EAAS,IAAS,KAAK,IACvB,EAAS,UAAe,GACxB,EAAS,cAAgB,GACzB,EAAS,YAAc,GACvB,EAAS,OAAa,UAAa,EACnC,KAAK,kBAAkB,cAAc,WACnC,OAAO,KAAK,WACd,IACA,KAAK,kBAAkB,eAAe,WACpC,OAAO,KAAK,YACd,IACA,KAAK,kBAAkB,oBAAoB,WACzC,OAAO,KAAK,KAAK,UACnB,IACA,KAAK,kBAAkB,mBAAmB,WACxC,OAAO,KAAK,KAAK,SACnB,IACA,KAAK,kBAAkB,kBAAkB,WACvC,OAAO,KAAK,KAAK,SACnB,IACA,KAAK,kBAAkB,eAAe,WACpC,OAAO,KAAK,KAAK,MACnB,IACA,KAAK,kBAAkB,oBAAoB,WACzC,OAAO,KAAK,KAAK,UACnB,IACA,KAAK,kBAAkB,qBAAqB,WAC1C,OAAO,KAAK,KAAK,YAAc,KAAK,QACtC,IACA,KAAK,kBAAkB,mBAAmB,WACxC,OAAO,KAAK,KAAK,UACnB,IACA,KAAK,kBAAkB,oBAAoB,WACzC,OAAO,KAAK,KAAK,UACnB,IAGA,KAAK,kBAAkB,aAAa,WAClC,OAAO,GAAU,KAAK,SAAW,KAAK,SAAW,GACnD,IACA,KAAK,kBAAkB,aAAa,WAClC,OAAO,GAAU,KAAK,SAAW,KAAK,SAAW,GACnD,GACF,CACF,CAEA,iBAAA,CAAkB,EAAc,GAC9B,KAAK,OAAO,GAAQ,IAAI,GAAO,KAAM,EAAI,EAC3C,CAEA,UAAA,CAAW,EAAuB,GAChC,KAAK,OAAO,GAAiB,CAC/B,CAEA,UAAA,CAAW,EAAuB,GAChC,KAAK,MAAM,GAAiB,CAC9B,CAEA,aAAA,CAAc,EAAuB,GACnC,KAAK,SAAS,GAAiB,CACjC,GAkBK,SAAS,GAA6B,GAC3C,OAAQ,MAAA,WAAM,eACZ,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,OACL,IAAK,OACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,QACL,IAAK,QACH,SACF,QACE,SAEN,CAwBO,IAAM,GAA8C,CACzD,GAAI,EACJ,GAAI,GACJ,GAAI,EAAI,EACR,GAAI,GACJ,GAAI,GAAK,KACT,GAAI,GAAK,KACT,EAAG,GAAK,KAAO,GACf,GAAI,GACJ,IAAK,GACL,GAAI,GACJ,IAAK,GAEL,KAAM,EACN,IAAK,EAAI,GACT,KAAM,KAAO,IAMR,SAAS,GAAmB,GACjC,OAAQ,GACN,IAAK,IACH,OAAQ,IAAI,SAAS,YAAa,MACpC,IAAK,KACH,OAAQ,IAAI,SAAS,cAAe,OACtC,IAAK,MACL,IAAK,MACH,SACF,QACE,SAEN,CASO,IAAM,GAAN,MAkBL,WAAA,CACkB,EACA,EACA,EAChB,GAHgB,KAAA,YACA,KAAA,gBACA,KAAA,iBApBlB,EAAA,KAAU,kBAAiC,MAC3C,EAAA,KAAA,aACA,EAAA,KAAU,mBAAkC,MAC5C,EAAA,KAAA,cACA,EAAA,KAAA,mBACA,EAAA,KAAA,eAA8B,MAC9B,EAAA,KAAyC,+BACzC,EAAA,KAAA,YACA,EAAA,KAAA,iBAAgC,MAChC,EAAA,KACA,UAAA,KAA0C,aAC1C,EAAA,qBAA+B,MAC/B,EAAA,KAAgC,uBAChC,EAAA,KAAA,eAA+B,MAC/B,EAAA,KAA0B,iBAC1B,EAAA,KAAA,WAA0B,MAQxB,KAAK,UAAY,WACf,OAAI,KAAK,gBACA,KAAK,gBAEL,KAAK,KAAK,WACb,KAAK,MAAM,EAAgB,GAAK,KAAK,KAAK,WAC1C,CAER,EACA,KAAK,WAAa,WAChB,OAAI,KAAK,iBACA,KAAK,iBAEL,CAEX,EACA,KAAK,gBAAkB,EACvB,KAAK,SAAW,WACd,OAAI,KAAK,aACA,KAAK,aAEL,CAEX,EACA,KAAK,KAAO,EACd,CAEQ,eAAA,CAAgB,GACtB,IAAI,EAAI,KAAK,OAAO,EAAM,UAC1B,OAAK,IACH,EAAI,CACJ,EAAA,KAAK,OAAO,EAAM,UAAY,GAEzB,CACT,CAEA,UAAA,CAAW,GACT,KAAK,OAAO,EAAM,UAAY,GAC9B,QAAS,EAAI,EAAG,EAAI,EAAM,SAAS,OAAQ,IACzC,KAAK,WAAW,EAAM,SAAS,GAEnC,CAEA,aAAA,CAAc,EAAc,EAAiB,GAC3C,GAAI,GAA6B,GAAO,CACtC,IAAM,EAAM,KAAK,YAAc,IACzB,EAAM,KAAK,aAAe,IAC1B,EAA2B,MAAtB,KAAK,cAAwB,KAAK,cAAgB,IAAM,EAC7D,EAA4B,MAAvB,KAAK,eAAyB,KAAK,eAAiB,IAAM,EAC/D,EAAa,MAAA,IAAY,KAAK,aAEpC,OAAQ,GACN,IAAK,KACH,OAAO,EACT,IAAK,KACH,OAAO,EACT,IAAK,KACH,OAAO,EAAa,EAAK,EAC3B,IAAK,KACH,OAAO,EAAa,EAAK,EAC3B,IAAK,OACH,OAAO,EAAK,EAAK,EAAK,EACxB,IAAK,OACH,OAAO,EAAK,EAAK,EAAK,EACxB,IAAK,MACH,OAAO,EACT,IAAK,MACH,OAAO,EACT,IAAK,MACH,OAAO,EAAa,EAAM,EAC5B,IAAK,MACH,OAAO,EAAa,EAAM,EAC5B,IAAK,QACH,OAAO,EAAM,EAAM,EAAM,EAC3B,IAAK,QACH,OAAO,EAAM,EAAM,EAAM,EAE/B,CACA,MAAY,MAAR,GAAwB,OAAR,EACX,EAAS,KAAK,gBAAkB,KAAK,WAElC,MAAR,GAAwB,OAAR,EAEX,KAAK,eAGP,GAAiB,EAC1B,CAEA,QAAA,CAAS,EAAqB,GAC5B,EAAG,CACD,IAAI,EAAM,EAAM,OAAO,GAIvB,GAHI,GAGA,EAAM,WACR,EAAM,EAAM,SAAS,KAAK,KAAM,MAC5B,GACF,OAAO,EAGX,EAAQ,EAAM,MAChB,OAAS,GACT,MAAM,IAAI,MAAM,SAAS,kBAC3B,CAKA,QAAA,CACE,EACA,EACA,EACA,GAEA,EAAG,CACD,IAAI,EAAO,EAAM,MAAM,GAIvB,GAHI,GAGA,EAAM,WACR,EAAO,EAAM,SAAS,KAAK,KAAM,MAC7B,GACF,OAAO,EAGX,IAAM,EAAK,EAAM,SAAS,GAC1B,GAAI,EAAI,CACN,GAAI,EACF,OAAO,EAAM,KAEf,IAAM,EAAO,MAAM,EAAO,QAC1B,IAAS,MAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAK,GAAK,EAAO,GAAG,SAAS,MAE/B,OAAO,IAAI,GAAM,EAAO,EAAG,MAAM,KAAM,GACzC,CACA,EAAQ,EAAM,MAChB,OAAS,GACT,MAAM,IAAI,MAAM,aAAa,kBAC/B,CAEA,aAAA,CAAc,EAAc,GAC1B,IAAM,EAAmB,QAAT,KAAoB,KAAK,KAAK,kBAAkB,GAChE,OAAO,GAAO,EAAU,CAC1B,CAEA,aAAA,CAAc,EAAiB,GAC7B,IAAI,EAAS,GACP,EAAI,EAAQ,MAAM,oBACpB,IACF,EAAS,EAAE,GACX,EAAU,EAAE,IAEd,IAAI,EAAqB,KACrB,EAAwB,KAC5B,OAAQ,GACN,IAAK,QACL,IAAK,SACL,IAAK,eACL,IAAK,gBACL,IAAK,QACC,IACF,EAAM,EAAM,SAAS,OAI3B,OAAQ,GACN,IAAK,QACH,EAAS,KAAK,YACd,MACF,IAAK,SACH,EAAS,KAAK,aACd,MACF,IAAK,eACH,EAAS,OAAO,OAAO,WACvB,MACF,IAAK,gBACH,EAAS,OAAO,OAAO,YACvB,MACF,IAAK,QACH,EAAS,OAAO,OAAO,WAG3B,GAAc,MAAV,GAAyB,MAAP,EACpB,OAAQ,GACN,IAAK,MACH,OAAO,GAAU,OAAO,GAC1B,IAAK,MACH,OAAO,GAAU,OAAO,GAC1B,QACE,OAAO,GAAU,OACrB,GACmB,MAAV,GAA2B,MAAT,EAC3B,OAAkB,IAAX,EAET,QACF,CAEA,gBAAA,CAAiB,EAAc,EAAe,GAC5C,QACF,CAEA,QAAA,CAAS,EAAqB,GAC5B,IAAM,EAAI,GAAS,KAAK,OAAO,EAAM,UACrC,OAAO,EAAI,EAAE,SACf,CAEA,QAAA,CAAS,EAAqB,EAAa,GACzC,KAAK,gBAAgB,GAAO,GAAO,CACrC,GAQW,GAAN,MAGL,WAAA,CAAmB,GAAA,KAAA,QAFnB,EAAA,KAGE,OAAA,KAAK,MAAQ,EACb,KAAK,IAAM,IAAI,IACjB,CAGA,QAAA,GACE,IAAM,EAAM,IAAS,GACrB,OAAK,KAAA,SAAS,EAAK,GACZ,EAAI,UACb,CAEA,QAAA,CAAS,EAAwB,GAC/B,MAAM,IAAI,MAAM,aAClB,CAEU,YAAA,CAAa,GACrB,MAAM,IAAI,MAAM,aAClB,CAEA,MAAA,CAAO,EAAkB,GACvB,OAAO,IACT,CAEA,UAAA,CACE,EACA,EACA,GAEA,OAAO,IAAU,IACnB,CAEA,WAAA,CACE,EACA,EACA,GAEA,IAAM,EAAS,EAAgB,KAAK,KACpC,GAAc,MAAV,EACF,OAAI,IAAW,IAGR,EACF,CACL,EAAgB,KAAK,KAAO,GAC5B,IAAM,EAAS,KAAK,WAAW,EAAO,EAAS,GAC/C,OAAA,EAAgB,KAAK,KAAO,EACrB,CACT,CACF,CAEA,MAAA,CAAO,EAAY,GACjB,OAAO,KAAK,YAAY,EAAO,EAAS,CAAE,EAC5C,CAEA,QAAA,CAAS,GACP,IAAI,EAAS,EAAQ,SAAS,KAAK,MAAO,KAAK,KAC/C,gBAAW,IAGX,EAAS,KAAK,aAAa,GACvB,KAAK,OACP,EAAQ,SAAS,KAAK,MAAO,KAAK,IAAK,IAElC,CACT,CAEA,WAAA,GACE,QACF,GAGW,GAAN,cAAqB,GAC1B,WAAA,CACE,EACO,GAEP,MAAM,GAFC,KAAA,KAGT,CAEU,KAAA,GACR,MAAM,IAAI,MAAM,aAClB,CAEA,UAAA,CAAW,GACT,MAAM,IAAI,MAAM,aAClB,CAES,YAAA,CAAa,GACpB,IAAM,EAAM,KAAK,IAAI,SAAS,GAC9B,OAAO,KAAK,WAAW,EACzB,CAES,UAAA,CACP,EACA,EACA,GAEA,OACE,IAAU,MAAQ,KAAK,IAAI,YAAY,EAAO,EAAS,EAE3D,CAES,QAAA,CAAS,EAAwB,GACpC,GAAK,GACP,EAAI,OAAO,KAEb,EAAI,OAAO,KAAK,SAChB,KAAK,IAAI,SAAS,EAAK,IACnB,GAAK,GACP,EAAI,OAAO,IAEf,CAES,MAAA,CAAO,EAAkB,GAChC,IAAM,EAAM,KAAK,IAAI,OAAO,EAAS,GACrC,OAAI,IAAQ,KAAK,IACR,KAEC,IAAK,KAAK,YAAoB,KAAK,MAAO,EAEtD,GAGW,GAAN,cAAoB,GACzB,WAAA,CACE,EACO,EACA,GAEP,MAAM,GAHC,KAAA,MACA,KAAA,KAGT,CAEA,WAAA,GACE,MAAM,IAAI,MAAM,aAClB,CAEA,KAAA,GACE,MAAM,IAAI,MAAM,aAClB,CAEA,SAAA,CAAU,EAAa,GACrB,MAAM,IAAI,MAAM,aAClB,CAES,YAAA,CAAa,GACpB,IAAM,EAAM,KAAK,IAAI,SAAS,GACxB,EAAM,KAAK,IAAI,SAAS,GAC9B,OAAO,KAAK,UAAU,EAAK,EAC7B,CAES,UAAA,CACP,EACA,EACA,GAEA,OACE,IAAU,MACV,KAAK,IAAI,YAAY,EAAO,EAAS,IACrC,KAAK,IAAI,YAAY,EAAO,EAAS,EAEzC,CAES,QAAA,CAAS,EAAwB,GACxC,IAAM,EAAe,KAAK,cACtB,GAAgB,GAClB,EAAI,OAAO,KAEb,KAAK,IAAI,SAAS,EAAK,GACvB,EAAI,OAAO,KAAK,SAChB,KAAK,IAAI,SAAS,EAAK,GACnB,GAAgB,GAClB,EAAI,OAAO,IAEf,CAES,MAAA,CAAO,EAAkB,GAChC,IAAM,EAAM,KAAK,IAAI,OAAO,EAAS,GAC/B,EAAM,KAAK,IAAI,OAAO,EAAS,GACrC,OAAI,IAAQ,KAAK,KAAO,IAAQ,KAAK,IAC5B,KAEC,IAAK,KAAK,YAAoB,KAAK,MAAO,EAAK,EAE3D,GAGW,GAAN,cAAsB,GAC3B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,WAAA,GACP,OACF,IAGW,GAAN,cAAyB,GAC9B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,WAAA,GACP,OAAO,CACT,GAGW,GAAN,cAAuB,GAC5B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,WAAA,GACP,OAAO,CACT,GAGW,GAAN,cAA6B,GAClC,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,WAAA,GACP,OAAO,CACT,GAGW,GAAN,cAAkB,GACvB,WAAA,CAAY,EAAqB,GAC/B,MAAM,EAAO,EACf,CAES,KAAA,GACP,MAAO,GACT,CAES,UAAA,CAAW,GAClB,OAAQ,CACV,GAGW,GAAN,cAAuB,GAC5B,WAAA,CAAY,EAAqB,GAC/B,MAAM,EAAO,EACf,CAES,KAAA,GACP,MAAO,MACT,GAGW,GAAN,cAAqB,GAC1B,WAAA,CAAY,EAAqB,GAC/B,MAAM,EAAO,EACf,CAES,KAAA,GACP,MAAO,GACT,CAES,UAAA,CAAW,GAClB,OAAQ,CACV,GAGW,GAAN,cAAkB,GACvB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,CAES,YAAA,CAAa,GACpB,OAAO,KAAK,IAAI,SAAS,IAAY,KAAK,IAAI,SAAS,EACzD,GAGW,GAAN,cAAuB,GAC5B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,OACT,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,CAES,YAAA,CAAa,GACpB,OAAO,KAAK,IAAI,SAAS,IAAY,KAAK,IAAI,SAAS,EACzD,GAGW,GAAN,cAAoB,GACzB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,GAGW,GAAN,cAAsB,GAC3B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,MACT,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,GACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAO,EAAM,CACf,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAO,GAAO,CAChB,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,GACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAO,EAAM,CACf,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAO,GAAO,CAChB,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAO,GAAO,CAChB,GAGW,GAAN,cAAiB,GACtB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,IACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAO,GAAO,CAChB,GAGW,GAAN,cAAkB,GACvB,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,GACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAQ,EAAc,CACxB,GAGW,GAAN,cAAuB,GAC5B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,KACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAQ,EAAe,CACzB,GAGW,GAAN,cAAuB,GAC5B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,GACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAQ,EAAe,CACzB,GAGW,GAAN,cAAqB,GAC1B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,GACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAQ,EAAe,CACzB,GAGW,GAAN,cAAqB,GAC1B,WAAA,CAAY,EAAqB,EAAU,GACzC,MAAM,EAAO,EAAK,EACpB,CAES,KAAA,GACP,MAAO,GACT,CAES,SAAA,CAAU,EAAa,GAC9B,OAAQ,EAAe,CACzB,GAMW,GAAN,cAAsB,GAG3B,WAAA,CACE,EACO,EACP,GA3hCJ,IAAA,EA6hCI,MAAM,GAHC,KAAA,MAJT,EAAA,KAAA,QAQE,KAAK,KAAO,OAAA,EAAA,MAAA,WAAM,eAAN,EAAuB,EACrC,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,IAAI,YACpB,EAAI,OAAY,GAAe,KAAK,MACtC,CAES,YAAA,CAAa,GACpB,OAAO,KAAK,IAAM,EAAQ,cAAc,KAAK,QAC/C,GAOW,GAAN,cAAoB,GACzB,WAAA,CACE,EACO,GAEP,MAAM,GAFC,KAAA,eAGT,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,cAClB,CAES,YAAA,CAAa,GACpB,OAAO,EAAQ,SAAS,KAAK,MAAO,KAAK,eAAe,SAAS,EACnE,CAES,UAAA,CACP,EACA,EACA,GAEA,OACE,IAAU,MACV,EACG,SAAS,KAAK,MAAO,KAAK,eAC1B,YAAY,EAAO,EAAS,EAEnC,GAMW,GAAN,cAAwB,GAC7B,WAAA,CACE,EACO,EACA,GAEP,MAAM,GAHC,KAAA,MACA,KAAA,MAGT,CAES,QAAA,CAAS,EAAwB,GACpC,KAAK,KACP,EAAI,OAAO,QAEb,EAAI,OAAY,GAAe,KAAK,MACtC,CAES,YAAA,CAAa,GACpB,OAAO,EAAQ,cAAc,KAAK,KAAM,KAAK,IAC/C,CAES,WAAA,GACP,QACF,GAUW,GAAN,cAAqB,GAC1B,WAAA,CACE,EACO,EACA,GAEP,MAAM,GAHC,KAAA,KACA,KAAA,KAGT,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,IAClB,CAES,YAAA,CAAa,GACpB,OAAO,KAAK,GAAG,KAAK,EACtB,GA2CW,GAAN,MAAM,UAAa,GACxB,WAAA,CACE,EACO,EACA,GAEP,MAAM,GAHC,KAAA,gBACA,KAAA,QAGT,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,eAlDb,SAAwB,EAAwB,GACrD,EAAI,OAAO,KACX,IAAS,MAAI,EAAG,EAAI,EAAI,OAAQ,IAC1B,GACF,EAAI,OAAO,KAEb,EAAI,GAAG,SAAS,EAAK,GAEvB,EAAI,OAAO,IACb,CATO,CAmDY,EAAK,KAAK,OAC3B,CAES,YAAA,CAAa,GAOpB,OANa,EAAQ,SACnB,KAAK,MACL,KAAK,cACL,KAAK,WAGK,OAAO,EAAS,KAAK,QAAQ,SAAS,EACpD,CAES,UAAA,CACP,EACA,EACA,GAEA,GAAI,IAAU,KACZ,SAEF,IAAS,MAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IACtC,GAAI,KAAK,OAAO,GAAG,YAAY,EAAO,EAAS,GAC7C,SAWJ,OARa,EAAQ,SACnB,KAAK,MACL,KAAK,cACL,KAAK,WAKK,YAAY,EAAO,EAAS,EAC1C,CAES,MAAA,CAAO,EAAkB,GAChC,IAAM,EA9EH,SACL,EACA,EACA,GAEA,IAAI,EAAkB,EACtB,IAAS,MAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,CACnC,IAAM,EAAI,EAAI,GAAG,OAAO,EAAS,GACjC,GAAI,IAAQ,EACV,EAAS,GAAK,OACL,OAAM,EAAI,GAAI,CACvB,EAAW,MAAM,EAAI,QACrB,QAAS,EAAI,EAAG,EAAI,EAAG,IACrB,EAAS,GAAK,EAAI,GAEpB,EAAS,GAAK,CAChB,CACF,CACA,OAAO,CACT,CAnBO,CA8EmC,EAAS,KAAK,OAAQ,GAC5D,OAAI,IAAmB,KAAK,OACnB,KAEF,IAAI,EAAK,KAAK,MAAO,KAAK,cAAe,EAClD,GAGW,GAAN,MAAM,UAAa,GACxB,WAAA,CACE,EACO,EACA,EACA,GAEP,MAAM,GAJC,KAAA,OACA,KAAA,SACA,KAAA,SAGT,CAES,QAAA,CAAS,EAAwB,GACpC,EAAW,GACb,EAAI,OAAO,KAEb,KAAK,KAAK,SAAS,EAAK,GACxB,EAAI,OAAO,KACX,KAAK,OAAO,SAAS,EAAK,GAC1B,EAAI,OAAO,KACX,KAAK,QAAQ,SAAS,EAAK,GACvB,EAAW,GACb,EAAI,OAAO,IAEf,CAES,YAAA,CAAa,GACpB,OAAI,KAAK,KAAK,SAAS,GACd,KAAK,OAAO,SAAS,GAErB,KAAK,QAAQ,SAAS,EAEjC,CAES,UAAA,CACP,EACA,EACA,GAEA,OACE,IAAU,MACV,KAAK,KAAK,YAAY,EAAO,EAAS,IACtC,KAAK,OAAO,YAAY,EAAO,EAAS,IACxC,KAAK,QAAQ,YAAY,EAAO,EAAS,EAE7C,CAES,MAAA,CAAO,EAAkB,GAChC,IAAM,EAAO,KAAK,KAAK,OAAO,EAAS,GACjC,EAAS,KAAK,OAAO,OAAO,EAAS,GACrC,EAAU,KAAK,QAAQ,OAAO,EAAS,GAC7C,OACE,IAAS,KAAK,MACd,IAAW,KAAK,QAChB,IAAY,KAAK,QAEV,KAEC,IAAI,EAAK,KAAK,MAAO,EAAM,EAAQ,EAE/C,GAGW,GAAN,cAAoB,GACzB,WAAA,CACE,EACO,GAEP,MAAM,GAFC,KAAA,KAGT,CAES,QAAA,CAAS,EAAwB,GACxC,cAAe,KAAK,KAClB,IAAK,SACL,IAAK,UACH,EAAI,OAAO,KAAK,IAAI,YACpB,MACF,IAAK,SACH,EAAI,OAAO,KACX,EAAI,OAAY,GAAa,KAAK,MAClC,EAAI,OAAO,KACX,MACF,QACE,MAAM,IAAI,MAAM,sBAEtB,CAES,YAAA,CAAa,GACpB,OAAO,KAAK,GACd,GAGW,GAAN,MAAM,UAAkB,GAC7B,WAAA,CACE,EACO,EACA,GAEP,MAAM,GAHC,KAAA,OACA,KAAA,OAGT,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KACX,EAAI,OAAY,GAAa,KAAK,KAAK,OACvC,EAAI,OAAO,KACX,KAAK,MAAM,SAAS,EAAK,GACzB,EAAI,OAAO,IACb,CAES,YAAA,CAAa,GACpB,OAAO,EAAQ,cAAc,KAAK,KAAK,KAAM,KAAK,MACpD,CAES,UAAA,CACP,EACA,EACA,GAEA,OACE,IAAU,MAAQ,KAAK,MAAM,YAAY,EAAO,EAAS,EAE7D,CAES,MAAA,CAAO,EAAkB,GAChC,IAAM,EAAQ,KAAK,MAAM,OAAO,EAAS,GACzC,OAAI,IAAU,KAAK,MACV,KAEC,IAAI,EAAU,KAAK,MAAO,KAAK,KAAM,EAEjD,GAGW,GAAN,cAA2B,GAChC,WAAA,CACE,EACO,EACA,EACA,GAEP,MAAM,GAJC,KAAA,OACA,KAAA,QACA,YAAA,CAGT,CAES,QAAA,CAAS,EAAwB,GACpC,KAAK,QACP,EAAI,OAAO,KAAK,MAElB,EAAI,OAAO,MACN,KAAK,QAAU,KAAK,OACvB,EAAI,OAAO,KAAK,MAChB,EAAI,OAAO,MAEb,EAAI,OAAO,KAAK,OAChB,EAAI,OAAO,IACb,CAES,YAAA,CAAa,GACpB,OAAO,EAAQ,iBAAiB,KAAK,KAAM,KAAK,MAAO,KAAK,OAC9D,GAGW,GAAN,cAAoB,GACzB,WAAA,CACE,EACO,GAEP,MAAM,GAFC,KAAA,OAGT,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KACX,EAAI,OAAO,KAAK,MAAM,WACxB,CAES,MAAA,CAAO,EAAkB,GAChC,IAAM,EAAI,EAAO,KAAK,OACtB,IAAK,EACH,MAAM,IAAI,MAAM,sBAAsB,KAAK,SAE7C,OAAO,CACT,GAGK,SAAS,GAAI,EAAqB,EAAS,GAChD,OACE,IAAO,EAAM,QACb,IAAO,EAAM,MACb,GAAM,EAAM,QACZ,GAAM,EAAM,KAEL,EAAM,OAEX,IAAO,EAAM,OAAS,IAAO,EAAM,IAC9B,EAEL,IAAO,EAAM,OAAS,IAAO,EAAM,IAC9B,EAEF,IAAI,GAAI,EAAO,EAAI,EAC5B,CAEO,SAAS,GAAI,EAAqB,EAAS,GAChD,OAAI,IAAO,EAAM,KACR,EAEL,IAAO,EAAM,KACR,EAEF,IAAI,GAAI,EAAO,EAAI,EAC5B,CAEO,SAAS,GAAI,EAAqB,EAAS,GAChD,OAAI,IAAO,EAAM,KACR,IAAI,GAAO,EAAO,GAEvB,IAAO,EAAM,KACR,EAEF,IAAI,GAAS,EAAO,EAAI,EACjC,CAEO,SAAS,GAAI,EAAqB,EAAS,GAChD,OAAI,IAAO,EAAM,MAAQ,IAAO,EAAM,KAC7B,EAAM,KAEX,IAAO,EAAM,IACR,EAEL,IAAO,EAAM,IACR,EAEF,IAAI,GAAS,EAAO,EAAI,EACjC,CAEO,SAAS,GAAI,EAAqB,EAAS,GAChD,OAAI,IAAO,EAAM,KACR,EAAM,KAEX,IAAO,EAAM,IACR,EAEF,IAAI,GAAO,EAAO,EAAI,EAC/B,CC57CO,IAAM,GAAN,MACL,WAAA,CAAY,GACV,QAAS,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAO,GAAG,MAAM,MAElB,OAAO,IACT,CAEA,UAAA,CAAW,GACT,OAAO,IACT,CAEA,UAAA,CAAW,GACT,OAAO,IACT,CAEA,QAAA,CAAS,GACP,OAAO,IACT,CAEA,UAAA,CAAW,GACT,OAAO,IACT,CAEA,YAAA,CAAa,GACX,OAAO,IACT,CAEA,QAAA,CAAS,GACP,OAAO,IACT,CAEA,QAAA,CAAS,GACP,OAAO,KAAK,SAAS,EACvB,CAEA,aAAA,CAAc,GACZ,OAAO,IACT,CAEA,QAAA,CAAS,GACP,OAAO,IACT,CAEA,WAAA,CAAY,GACV,OAAO,IACT,CAEA,cAAA,CAAe,GACb,OAAK,KAAA,YAAY,EAAK,QACf,IACT,CAEA,cAAA,CAAe,GACb,OAAK,KAAA,YAAY,EAAK,QACf,IACT,CAEA,SAAA,CAAU,GACR,OAAA,KAAK,YAAY,EAAK,QACf,IACT,CAEA,SAAA,CAAU,GACR,OAAO,IACT,GAGW,GAAN,cAA4B,GAGjC,WAAA,GACE,QAHF,EAAA,KAAA,WAIA,CAES,WAAA,CAAY,GACnB,IAAI,EAAa,KACjB,IAAS,MAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,IAAM,EAAS,EAAO,GAChB,EAAQ,EAAO,MAAM,MAC3B,GAAI,KAAK,MACP,MAAO,GAET,GAAI,EACF,EAAI,GAAK,OACA,OAAW,EAAO,CAC3B,EAAM,IAAI,MAAM,EAAO,QACvB,QAAS,EAAI,EAAG,EAAI,EAAG,IACrB,EAAI,GAAK,EAAO,GAElB,EAAI,GAAK,CACX,CACF,CACA,OAAO,GAAO,CAChB,CAES,UAAA,CAAW,GAClB,OAAO,CACT,CAES,QAAA,CAAS,GAChB,OAAO,CACT,CAES,UAAA,CAAW,GAClB,OAAO,CACT,CAES,UAAA,CAAW,GAClB,OAAO,CACT,CAES,YAAA,CAAa,GACpB,OAAO,CACT,CAES,QAAA,CAAS,GAChB,OAAO,CACT,CAES,QAAA,CAAS,GAChB,OAAO,CACT,CAES,aAAA,CAAc,GACrB,OAAO,CACT,CAES,QAAA,CAAS,GAChB,OAAO,CACT,CAES,WAAA,CAAY,GACnB,OAAO,CACT,CAES,cAAA,CAAe,GACtB,IAAM,EAAS,KAAK,YAAY,EAAK,QACrC,OAAI,KAAK,MACA,GAEL,IAAW,EAAK,OACX,EAEF,IAAI,GAAU,EACvB,CAES,cAAA,CAAe,GACtB,IAAM,EAAS,KAAK,YAAY,EAAK,QACrC,OAAI,KAAK,MACA,GAEL,IAAW,EAAK,OACX,EAEF,IAAI,GAAU,EACvB,CAES,SAAA,CAAU,GACjB,IAAM,EAAS,KAAK,YAAY,EAAK,QACrC,OAAI,KAAK,MACA,GAEL,IAAW,EAAK,OACX,EAEF,IAAI,GAAK,EAAK,KAAM,EAC7B,CAES,SAAA,CAAU,GACjB,OAAO,CACT,GAGW,GAAN,MAEL,QAAA,GACE,IAAM,EAAM,IAAS,GACrB,OAAA,KAAK,SAAS,MACP,EAAI,UACb,CAEA,WAAA,GACE,IAAM,EAAM,IAAS,GACrB,OAAK,KAAA,SAAS,MACP,EAAI,UACb,CAEA,MAAA,CAAO,EAA2B,GAChC,OAAO,IACT,CAEA,QAAA,CAAS,EAAwB,GAC/B,EAAI,OAAO,UACb,CAEA,MAAA,GACE,QACF,CAEA,SAAA,GACE,QACF,CAEA,KAAA,GACE,QACF,CAEA,OAAA,GACE,QACF,CAEA,WAAA,GACE,QACF,CAEA,KAAA,CAAM,GACJ,OAAO,IACT,GAGW,GAAN,MAAM,UAAc,GAGzB,mBAAA,GACE,OAAK,KAAK,QACR,KAAK,MAAQ,IAAI,GAEZ,KAAK,KACd,CAEQ,WAAA,GACN,OACF,CAES,MAAA,CAAO,EAA2B,GACzC,OAAO,IAAU,GAAM,EAAO,GAChC,CAES,QAAA,CAAS,EAAwB,GAEjC,MAAA,CAAM,GACb,OAAO,EAAQ,WAAW,KAC5B,GArBA,EADW,GACI,SADV,IAyBM,GAzBN,GAyB2B,SAErB,GAAN,MAAM,UAAc,GAGzB,mBAAA,GACE,OAAK,KAAK,QACR,KAAK,MAAQ,IAAI,GAEZ,KAAK,KACd,CAEQ,WAAA,GACN,OACF,CAES,MAAA,CAAO,EAA2B,GACzC,OAAO,IAAU,GAAM,EAAO,IAChC,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,IACb,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,WAAW,KAC5B,GAvBA,EADW,GACI,SADV,IA2BM,GA3BN,GA2B2B,SAErB,GAAN,cAAkB,GACvB,WAAA,CAAmB,GACjB,QADiB,KAAA,KAEnB,CAES,MAAA,CAAO,EAA2B,GACzC,OAAO,IAAU,GAAM,EAAO,KAAK,IACrC,CAES,QAAA,CAAS,EAAwB,GACpC,GACF,EAAI,OAAO,KACX,EAAI,OAAY,GAAa,KAAK,MAClC,EAAI,OAAO,MAEX,EAAI,OAAO,KAAK,IAEpB,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,SAAS,KAC1B,GAGI,GAAsC,GAE/B,GAAN,cAAoB,GACzB,WAAA,CAAmB,GAEb,GADJ,QADiB,KAAA,OAEb,GAAU,GACZ,MAAM,IAAI,MAAM,kBAElB,GAAU,GAAQ,IACpB,CAES,MAAA,CAAO,EAA2B,GACzC,OAAO,IAAU,GAAM,EAAO,KAAK,KACrC,CAES,QAAA,CAAS,EAAwB,GACpC,EACF,EAAI,OAAY,GAAe,KAAK,OAEpC,EAAI,OAAO,KAAK,KAEpB,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,WAAW,KAC5B,CAES,OAAA,GACP,QACF,GAGK,SAAS,GAAQ,GACtB,IAAI,EAAI,GAAU,GAClB,OAAK,IACH,EAAI,IAAI,GAAM,IAET,CACT,CAEO,IAAM,GAAN,cAAsB,GAG3B,WAAA,CACS,EACP,GAjXJ,IAAA,EAmXI,QAHO,KAAA,MAHT,EAAA,KAAA,QAOE,KAAK,KAAO,OAAA,EAAA,MAAA,WAAM,eAAN,EAAuB,EACrC,CAES,MAAA,CAAO,EAA2B,GACzC,OAAgB,GAAZ,KAAK,IACA,EAAM,KAEX,GAAoB,KAAb,KAAK,KACE,KAAZ,KAAK,IACA,EAEF,IAAU,GACf,EACA,EACA,IAAU,GAAM,EAAO,KAAK,IAAM,MAG/B,IAAU,GAAQ,EAAO,KAAK,IAAK,KAAK,KACjD,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,IAAI,YACpB,EAAI,OAAO,KAAK,KAClB,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,aAAa,KAC9B,CAES,SAAA,GACP,QACF,GAGW,GAAN,cAAkB,GACvB,WAAA,CAAmB,GACjB,QADiB,KAAA,KAEnB,CAES,MAAA,CAAO,EAA2B,GACzC,OAAgB,GAAZ,KAAK,IACA,EAAM,KAEC,GAAZ,KAAK,IACA,EAAM,IAER,IAAU,GAAM,EAAO,KAAK,IACrC,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,IAAI,WACtB,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,SAAS,KAC1B,CAES,KAAA,GACP,QACF,GAGW,GAAN,cAAkB,GACvB,WAAA,CAAY,GACV,MAAM,EACR,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,SAAS,KAC1B,GAGW,GAAN,cAAuB,GAC5B,WAAA,CAAmB,GACjB,QADiB,KAAA,KAEnB,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KACX,EAAI,OAAO,KAAK,IAClB,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,cAAc,KAC/B,GAGW,GAAN,cAAkB,GACvB,WAAA,CAAmB,GACjB,QADiB,KAAA,KAEnB,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,SACX,EAAI,OAAY,GAAa,KAAK,MAClC,EAAI,OAAO,KACb,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,SAAS,KAC1B,GAGW,GAAN,cAAqB,GAC1B,WAAA,CAAmB,GACjB,QADiB,KAAA,YAEnB,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,WAClB,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,YAAY,KAC7B,GAGK,SAAS,GACd,EACA,EACA,EACA,GA7eF,IAAA,EAAA,EA+eE,IAAM,EAAS,EAAO,OACtB,GAAI,EAAS,EAAG,CACd,OAAA,EAAA,EAAO,KAAP,EAAW,SAAS,EAAK,GACzB,QAAS,EAAI,EAAG,EAAI,EAAQ,IAC1B,EAAI,OAAO,GACX,OAAA,EAAA,EAAO,KAAP,EAAW,SAAS,EAAK,EAE7B,CACF,CAEO,IAAM,GAAN,cAAwB,GAC7B,WAAA,CAAmB,GACjB,QADiB,KAAA,QAEnB,CAES,QAAA,CAAS,EAAwB,GACxC,GAAW,EAAK,KAAK,OAAQ,IAAK,EACpC,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,eAAe,KAChC,CAES,WAAA,GACP,QACF,GAGW,GAAN,cAAwB,GAC7B,WAAA,CAAmB,GACjB,QADiB,KAAA,QAEnB,CAES,QAAA,CAAS,EAAwB,GACxC,GAAW,EAAK,KAAK,OAAQ,IAAK,EACpC,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,eAAe,KAChC,GAGW,GAAN,cAAmB,GACxB,WAAA,CACS,EACA,GAEP,QAHO,KAAA,OACA,KAAA,QAGT,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAY,GAAe,KAAK,OACpC,EAAI,OAAO,KACX,GAAW,EAAK,KAAK,OAAQ,IAAK,GAClC,EAAI,OAAO,IACb,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,UAAU,KAC3B,GAGW,GAAN,cAAmB,GACxB,WAAA,CAAmB,GACjB,QADiB,KAAA,MAEnB,CAES,MAAA,GACP,OAAO,KAAK,IACd,CAES,QAAA,CAAS,EAAwB,GAEtC,KAAK,gBAAsB,IAC3B,KAAK,gBAAsB,GAE3B,KAAK,KAAK,SAAS,EAAK,IAExB,EAAI,OAAO,gBACX,KAAK,KAAK,SAAS,EAAK,GACxB,EAAI,OAAO,KAEf,CAES,KAAA,CAAM,GACb,OAAO,EAAQ,UAAU,KAC3B,CAES,MAAA,GACP,QACF,GAMW,GAAN,cAAuB,GAC5B,WAAA,CAAmB,GACjB,QADiB,KAAA,MAEnB,CAES,QAAA,CAAS,EAAwB,GACxC,EAAI,OAAO,KAAK,MAAQ,IAC1B,GAGK,SAAS,GAAS,EAAU,GACjC,GAAI,EAAK,CACP,GAAI,EAAI,YAAa,CACnB,IAAM,EAAU,EAChB,OAAO,EAAQ,cAAc,EAAQ,SAAe,EAAQ,GAC9D,CACA,GAAI,EAAI,QACN,OAAQ,EAAY,GAExB,CACA,OACF,EAKO,SAAS,GAAmB,EAAU,GAC3C,OAAO,IAAI,GAAQ,GAAS,EAAK,GAAU,KAC7C,CAEO,IAAM,GAAkC,CAC7C,SAAU,GAAQ,YAClB,IAAK,GAAQ,OACb,OAAQ,GAAQ,UAChB,SAAU,GAAQ,YAClB,KAAM,GAAQ,QACd,MAAO,GAAQ,SACf,QAAS,GAAQ,WACjB,YAAa,GAAQ,eACrB,MAAO,GAAQ,SACf,UAAW,GAAQ,aACnB,YAAa,GAAQ,eACrB,KAAM,GAAQ,QACd,OAAQ,GAAQ,UAChB,WAAY,GAAQ,cACpB,UAAW,GAAQ,aACnB,WAAY,GAAQ,cACpB,KAAM,GAAQ,QACd,KAAM,GAAQ,QACd,MAAO,GAAQ,SACf,OAAQ,GAAQ,UAChB,QAAS,GAAQ,WACjB,UAAW,GAAQ,aACnB,OAAQ,GAAQ,SAChB,MAAO,GAAQ,SACf,KAAM,GAAQ,QACd,UAAW,GAAQ,aACnB,SAAU,GAAQ,YAClB,OAAQ,GAAQ,UAChB,KAAM,GAAQ,QACd,OAAQ,GAAQ,UAChB,OAAQ,GAAQ,UAChB,cAAe,GAAQ,iBACvB,QAAS,GAAQ,WACjB,QAAS,GAAQ,WACjB,OAAQ,GAAQ,UAChB,aAAc,GAAQ,gBACtB,WAAY,GAAQ,cACpB,aAAc,GAAQ,gBACtB,OAAQ,GAAQ,UAChB,KAAM,GAAQ,QACd,UAAW,GAAQ,aACnB,KAAM,GAAQ,QACd,KAAM,GAAQ,QACd,UAAW,GAAQ,aACnB,IAAK,GAAQ,OACb,OAAQ,GAAQ,UAChB,YAAa,GAAQ,eACrB,YAAa,GAAQ,eACrB,KAAM,GAAQ,QACd,OAAQ,GAAQ,UAChB,cAAe,GAAQ,iBACvB,cAAe,GAAQ,iBACvB,QAAS,GAAQ,WACjB,YAAa,GAAQ,eACrB,KAAM,GAAQ,QACd,SAAU,GAAQ,YAClB,OAAQ,GAAQ,UAChB,MAAO,GAAQ,SACf,KAAM,GAAQ,QACd,MAAO,GAAQ,SACf,WAAY,GAAQ,cACpB,YAAa,GAAQ,eACrB,MAAO,GAAQ,SACf,OAAQ,GAAQ,UAChB,QAAS,GAAQ,UACjB,IAAK,GAAQ,OACb,MAAO,GAAQ,SACf,cAAe,GAAQ,iBACvB,WAAY,GAAQ,cACpB,mBAAoB,GAAQ,sBAC5B,mBAAoB,GAAQ,sBAC5B,UAAW,GAAQ,aACnB,IAAK,GAAQ,OACb,YAAa,GAAQ,eACrB,MAAO,GAAQ,SACf,YAAa,GAAQ,eACrB,YAAa,GAAQ,eACrB,QAAS,GAAQ,WACjB,MAAO,GAAQ,SAGJ,GAA0B,IAAI,GAAQ,IAAK,KAE3C,GAAqB,IAAI,GAAQ,IAAK,OAEtC,GAAsB,IAAI,GAAQ,IAAK,OAEvC,GAAuB,IAAI,GAAQ,EAAG,MAEjB,IAAI,GAAO,cAEhC,OAAkB,CAC7B,YAAa,EACb,cAAe,EACf,MAAO,GAGF,SAAS,GAAkB,GAChC,OACE,IAAU,GAAM,SAChB,IAAU,GAAM,SAChB,IAAU,GAAM,QAChB,IAAU,GAAM,KAEpB,CAKO,SAAS,GAAkB,EAAe,GAG/C,OAFW,GAAgB,IAAU,OAAO,YACjC,GAAgB,IAAU,OAAO,UAE9C,CAEO,SAAS,GAAiB,GAC/B,OAAO,MAAA,WAAM,QAAS,GAAK,EAAK,WAAW,KAC7C,CCnuBA,IAAA,GAAA,GAAA,GAyDM,GAAN,MAAM,EAOI,WAAA,CAAY,EAAW,EAAW,GAJ1C,EAAA,KAAS,IACT,EAAA,KAAS,IACT,EAAA,KAAS,IAGP,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,QACvD,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,QACvD,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,OACzD,CAEA,cAAA,CAAe,EAAW,EAAW,GACnC,OAAO,IAAI,EAAU,EAAG,EAAG,EAC7B,CAEA,MAAA,CAAO,EAAY,EAAY,GAC7B,OAAO,IAAI,EAAU,EAAA,KAAK,IAAK,EAAI,EAAA,KAAK,IAAK,EAAI,EAAA,KAAK,IAAK,EAC7D,CAEA,KAAA,GACE,OAAO,KAAK,UAAU,CAAC,EAAA,KAAK,IAAI,EAAA,KAAK,IAAI,EAAA,KAAK,KAChD,CAEA,WAAA,CAAY,GACV,OAAO,IAAQ,GAAK,QAAS,CAC3B,IAAQ,GAAU,CACZ,GAAQ,QACZ,IAAQ,GAAI,EAAA,KAAK,IAAK,EAAU,KAChC,IAAQ,GAAI,EAAA,KAAK,IAAK,EAAU,KAChC,IAAQ,GAAI,EAAA,KAAK,IAAK,EAAU,QAClB,OAAV,EAAiB,CAAK,GAAO,IAAQ,GAAI,IAAU,MAG7D,GAhCS,GAAA,IACA,WAAA,IACA,WAAA,IAJT,UADI,GACY,MAAM,KADxB,IAzDA,GAAA,GAAA,GAAA,GAyDM,GAAN,GA4CM,GAAN,MAAM,EAQI,WAAA,CAAY,EAAW,EAAW,EAAW,GALrD,EAAA,KAAS,IACT,EAAA,KAAS,IACT,EAAA,KAAS,IACT,EAAA,KAAS,IAGP,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,QACvD,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,QACvD,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,QACvD,EAAA,KAAK,GAAK,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAU,OACzD,CAEA,cAAA,CAAe,EAAW,EAAW,EAAW,GAC9C,OAAO,IAAI,EAAU,EAAG,EAAG,EAAG,EAChC,CAEA,iBAAA,CAAkB,EAAW,EAAW,EAAW,GACjD,OAAO,IAAI,EACT,EAAI,EAAU,IACd,EAAI,EAAU,IACd,EAAI,EAAU,IACd,EAAI,EAAU,IAElB,CAMA,MAAA,GACE,IAAM,EAAY,EAAU,IAAM,EAAA,KAAK,IACvC,OAAO,GAAU,QACf,GAAU,IACR,KAAK,IACH,GAAU,IACV,KAAK,MAAO,EAAA,KAAK,IAAK,EAAa,EAAU,KAAO,EAAA,KAAK,KAE7D,GAAU,IACR,KAAK,IACH,GAAU,IACV,KAAK,MAAO,EAAA,KAAK,IAAK,EAAa,EAAU,KAAO,EAAA,KAAK,KAE7D,GAAU,IACR,KAAK,IACH,GAAU,IACV,KAAK,MAAO,EAAA,KAAK,IAAK,EAAa,EAAU,KAAO,EAAA,KAAK,KAGjE,CAEA,MAAA,CAAO,GACL,OACE,EAAA,KAAK,MAAO,EAAA,EAAM,KAClB,EAAA,KAAK,MAAO,EAAA,EAAM,KAClB,EAAA,KAAK,MAAO,EAAA,EAAM,KAClB,EAAA,KAAK,MAAO,EAAA,EAAM,GAEtB,CAEA,MAAA,GACE,MAAO,CAAE,EAAG,EAAA,KAAK,IAAI,EAAG,EAAA,KAAK,IAAI,EAAG,EAAA,KAAK,IAAI,EAAG,EAAA,KAAK,IACvD,GA7DS,GAAA,IACA,WAAA,IACA,WAAA,IAAA,QACA,GAAA,IAAA,QALT,EADI,GACY,MAAM,KADxB,IAAM,GAAN,GAmEA,SAAS,GAAY,GACnB,OAAO,aAAiB,GACpB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAE,MAC1B,aAAiB,IAAsB,MAAX,EAAE,KAC5B,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAE,IAAM,MAChC,IACR,CAEO,SAAS,GACd,GAEA,GAAkB,gBAAd,EAAK,KACP,OAAO,KAGT,IAAM,EAEmB,IAAvB,EAAK,OAAO,QAAgB,EAAK,OAAO,aAAmB,GACtD,EAAK,OAAO,GAAsB,OAEnC,EAAK,OACX,GAAI,EAAO,OAAS,GAAK,EAAO,OAAS,EACvC,OAAO,KAGT,IAAM,EAAI,GAAY,EAAO,IACvB,EAAI,GAAY,EAAO,IACvB,EAAI,GAAY,EAAO,IACvB,EAAI,GAAY,EAAO,IAC7B,GAAU,OAAN,GAAoB,OAAN,GAAoB,OAAN,GAAoB,OAAN,EAC5C,OAAO,KAGT,IAAI,EAAuB,KAC3B,GAAI,EAAO,QAAU,EAAG,CACtB,GAAI,EAAO,KAAY,GAAO,CAE5B,GAAsB,IAAlB,EAAO,OACT,OAAO,KAET,EAAQ,GAAY,EAAO,GAC7B,KAAO,CAEL,GAAsB,IAAlB,EAAO,OACT,OAAO,KAET,EAAQ,GAAY,EAAO,GAC7B,CACA,GAAc,OAAV,EACF,OAAO,IAEX,CAEA,MAAO,CAAE,KAAM,GAAU,WAAW,EAAG,EAAG,EAAG,GAAI,QACnD,CAEA,SAAU,GAAW,GACnB,IAAS,OAAK,EAAU,GAAK,EAAU,IACrC,QAAS,GAAK,EAAU,GAAK,EAAU,IACrC,IAAS,OAAK,EAAU,GAAK,EAAU,IACjC,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,KAAK,IAAI,KAAO,SACxC,CAAC,EAAG,EAAG,GAKvB,CA1OA,IAAA,GAAA,GAAA,GAAA,GA4Oa,GAAN,iBAAA,GAAA,EAAA,KAAA,IACL,EAAA,KAAA,GAAO,IAAI,IAAA,CAEX,kBAAA,CAAmB,GACjB,IAAM,EAAS,GAAgB,GAC/B,OAAK,EAGQ,EAAA,KAAK,GAAA,IAAL,KAAe,OAAO,MACvB,YAAY,EAAO,OAHtB,IAIX,CAaA,MAAA,GACE,IAAM,EAAwC,CAAC,EAC/C,OAAA,EAAA,KAAK,IAAK,SAAQ,CAAC,EAAO,KACxB,EAAO,GAAO,EAAM,YAEf,CACT,GA5BA,GAAA,IAAA,QADK,GAAA,IAAA,QAYL,GAAS,SAAC,GACR,IAAM,EAAO,EAAK,SACZ,EAAM,EAAK,QACX,EAAW,EAAA,KAAK,IAAK,IAAI,GAC/B,OAAI,EACK,EAAS,OAAO,GAAQ,EAAO,EAAA,KAAK,GAAA,IAAL,KAAwB,OAAM,IAEtE,EAAA,KAAK,IAAK,IAAI,EAAK,GACZ,EACT,EAUA,GAAkB,SAAC,EAAiB,GAClC,IAAS,MAAW,EAAG,GAAY,GAAU,IAAK,IAChD,IAAW,IAAC,EAAI,EAAI,KAAO,GAAW,GAAW,CAC/C,IAAM,EAAY,EAAS,OAAO,EAAI,EAAI,GACpC,EAAM,EAAU,QACtB,IAAK,EAAA,KAAK,IAAK,IAAI,GACjB,OAAA,EAAA,KAAK,IAAK,IAAI,EAAK,GACZ,CAEX,CAGF,OAAQ,EAAO,KACb,iDAAiD,KAAK,UAAU,EAAK,aAEhE,CACT,EA3RF,IAAA,GAAA,GAAA,GA8Ra,GAAN,cAAoC,GAKzC,WAAA,CAAY,GACV,QALF,EAAA,KAAS,IACT,EAAA,KAAS,GAAe,IAAI,KAC5B,EAAA,KAAA,OAIE,EAAA,KAAK,GAAS,MAAA,IAAS,IAAI,GAC7B,CAEA,KAAA,GACE,EAAA,KAAK,MACP,CACA,aAAA,GACE,OAAO,EAAA,KAAK,GACd,CAEA,gBAAA,CAAiB,EAAsB,GACrC,EAAA,KAAK,IAAa,IAAI,EAAc,EACtC,CACA,cAAA,GACE,GAA+B,IAA3B,EAAA,KAAK,IAAa,KACpB,OAAO,KAET,IAAM,EAAiC,CAAC,EACxC,OAAA,EAAA,KAAK,IAAa,SAAQ,CAAC,EAAO,KAChC,EAAO,GAAO,KAET,CACT,CAES,SAAA,CAAU,GACjB,IAAM,EAAS,EAAA,KAAK,IAAO,mBAAmB,GAC9C,OAAI,GACF,EAAA,KAAK,OACE,GAEF,MAAM,UAAU,EACzB,GArCS,GAAA,IAAA,QACA,GAAA,IAAA,QACT,GAAA,IAAA,QC3QK,IAAM,GAAN,MACL,WAAA,CACS,EACA,EACA,EACA,GAHA,KAAA,KACA,KAAA,KACA,KAAA,KACA,KAAA,IACN,GAGQ,GAAN,MACL,WAAA,CACS,EACA,GADA,KAAA,IACA,KAAA,GACN,GAGQ,GAAN,MACL,WAAA,CACS,EACA,EACA,EACA,GAHA,KAAA,OACA,KAAA,MACA,KAAA,QACA,KAAA,QACN,GAGQ,GAAN,MACL,WAAA,CACS,EACA,EACA,EACA,GAHA,KAAA,MACA,KAAA,OACA,KAAA,UACA,KAAA,SACN,GAOQ,GAAN,MAOL,WAAA,CACS,EACA,EACA,EACA,GAHA,KAAA,KACA,KAAA,KACA,KAAA,KACA,KAAA,KATT,EAAA,KAAuB,aAGvB,EAAA,KAAA,QAAwB,KAOrB,GAGE,SAAS,GAAe,EAAa,GAC1C,OAAO,EAAG,IAAI,EAAI,EAAG,IAAI,GAAK,EAAG,IAAI,EAAI,EAAG,IAAI,CAClD,CAEO,IAAM,GAAN,MAAM,EACX,WAAA,CAAmB,GAAA,KAAA,QAAkB,CAQrC,WAAA,CAAY,EAAgB,GAC1B,IAAM,EAAS,KAAK,OACd,EAAS,EAAO,OAClB,EAAO,EAAO,EAAS,GAC3B,QAAS,EAAI,EAAG,EAAI,EAAQ,IAAK,CAC/B,IACI,EADE,EAAO,EAAO,GAGlB,EADE,EAAK,EAAI,EAAK,EACZ,IAAI,GAAQ,EAAM,EAAM,EAAG,GAE3B,IAAI,GAAQ,EAAM,GAAU,KAElC,EAAI,KAAK,GACT,EAAO,CACT,CACF,CAEA,UAAA,CAAW,EAAiB,GAC1B,IAAM,EAAS,GACf,QAAW,KAAK,KAAK,OACnB,EAAO,KAAK,IAAI,GAAM,EAAE,EAAI,EAAS,EAAE,EAAI,IAE7C,OAAO,IAAI,EAAM,EACnB,GAGK,SAAS,GACd,EACA,EACA,EACA,GAGA,IAAM,EAAkB,GACxB,IAAS,MAAI,EAAG,EAAI,GAAO,IAAK,CAC9B,IAAM,EAAS,EAAJ,EAAQ,KAAK,GAAM,GAC9B,EAAO,KAAK,IAAI,GAAM,EAAK,EAAK,KAAK,IAAI,GAAI,EAAK,EAAK,KAAK,IAAI,IAClE,CACA,OAAO,IAAI,GAAM,EACnB,CAEO,SAAS,GACd,EACA,EACA,EACA,GAEA,OAAO,IAAI,GAAM,CACf,IAAI,GAAM,EAAI,GACd,IAAI,GAAM,EAAI,GACd,IAAI,GAAM,EAAI,GACd,IAAI,GAAM,EAAI,IAElB,CAWO,IAAM,GAAN,MACL,WAAA,CACS,EACA,EACA,EACA,GAHA,KAAA,IACA,KAAA,UACA,KAAA,UACA,KAAA,WACN,GAGE,SAAS,GAAW,EAAY,GACrC,IAAM,EACJ,EAAE,IAAI,GAAM,EAAE,KAAK,EAAI,EAAE,IAAI,IAAM,EAAI,EAAE,IAAI,IAAO,EAAE,KAAK,EAAI,EAAE,IAAI,GACvE,GAAI,MAAM,GACR,MAAM,IAAI,MAAM,oBAElB,OAAO,CACT,CAEO,SAAS,GACd,EACA,EACA,EACA,GAEA,IAAI,EACA,EACA,EACA,EACA,EAAE,KAAK,EAAI,GACL,EAAO,KAAK,mCAElB,EAAE,IAAI,GAAK,GAEb,EAAK,GAAW,EAAG,GACnB,EAAK,EAAE,UAEP,EAAK,EAAE,IAAI,EACX,EAAK,GAEH,EAAE,KAAK,GAAK,GAEd,EAAK,GAAW,EAAG,GACnB,EAAK,EAAE,UAEP,EAAK,EAAE,KAAK,EACZ,EAAK,GAEH,EAAK,GACP,EAAc,KAAK,IAAI,GAAiB,EAAI,EAAI,EAAE,SAAW,IAC7D,EAAc,KAAK,IAAI,GAAiB,EAAI,EAAI,EAAE,QAAS,MAE3D,EAAc,KAAK,IAAI,GAAiB,EAAI,EAAI,EAAE,SAAS,IAC3D,EAAc,KAAK,IAAI,GAAiB,EAAI,EAAI,EAAE,QAAS,IAE/D,CAEO,SAAS,GACd,EACA,EACA,GAEA,IAGI,EAHE,EAAa,EAAe,EAC5B,EAAsB,MAAM,GAC5B,EAAsB,MAAM,GAElC,IAAK,EAAI,EAAG,GAAK,EAAY,IAC3B,EAAU,GAAK,EACf,EAAU,GAAK,EAEjB,IAAM,EAAoB,GACtB,KACE,EAAoB,EAAc,OACxC,QAAS,EAAI,EAAG,EAAI,EAAmB,IAAK,CAC1C,IAAM,EAAe,EAAc,GACnC,EAAU,EAAa,UAAY,EAAa,QAChD,EAAU,EAAa,UAAY,EAAa,UAChD,IAAI,KACJ,IAAK,EAAI,EAAG,EAAI,EAAc,IAC5B,GAAI,EAAU,KAAO,EAAU,GAAI,CACjC,KACA,KACF,CAEF,GAAI,EACF,IAAK,EAAI,EAAc,GAAK,EAAY,IACtC,GAAI,EAAU,IAAM,EAAU,GAAI,CAChC,KACA,KACF,CAGA,GAAU,IACZ,EAAQ,KAAK,EAAa,GAC1B,EAAS,EAEb,CACA,OAAO,CACT,CAKO,SAAS,GAAK,EAAW,GAC9B,OAAO,EAAO,KAAK,KAAK,EAAI,GAAQ,EAAO,CAC7C,CAKO,SAAS,GAAM,EAAW,GAC/B,OAAO,EAAO,KAAK,MAAM,EAAI,GAAQ,EAAO,CAC9C,CASO,SAAS,GAAU,GACxB,OAAO,IAAI,GAAK,EAAI,IAAK,EAAI,GAAI,EAAI,IAAK,EAAI,GAChD,CAKO,SAAS,GAAY,GAC1B,OAAO,IAAI,IAAM,EAAI,GAAI,EAAI,IAAK,EAAI,GAAI,EAAI,GAChD,CAEO,SAAS,GAAY,GAC1B,OAAO,IAAI,GAAM,EAAM,OAAO,KAAK,GAnB9B,SAAqB,GAC1B,OAAO,IAAI,GAAM,EAAM,GAAI,EAAM,EACnC,CAFO,CAmBoD,KAC3D,CA6JO,SAAS,GAAU,EAAW,GACnC,IAAI,EAAI,EAAM,OAAS,EAInB,EAAW,IAAI,GAAK,EAAI,GAAI,EAAI,GAAI,EAAI,GAAI,EAAI,IACpD,KAAO,GAAK,GAAG,CACb,IAAM,EAAW,EACjB,EAAW,EAAM,IAEf,EAAS,GAAK,EAAS,GAAK,GAC3B,EAAS,IAAM,EAAS,IAAM,EAAS,IAAM,EAAS,MAEvD,EAAS,GAAK,EAAS,GACvB,EAAM,OAAO,EAAG,GAChB,EAAW,GAEb,GACF,CACF,CAKO,SAAS,GAAS,EAAe,GACtC,IAAI,EAAM,EACN,EAAO,EAAM,OACjB,KAAO,EAAM,GAAM,CACjB,IAAM,EAAM,KAAK,OAAO,EAAM,GAAQ,GAClC,GAAK,EAAM,GAAK,GAClB,EAAM,EAAM,EAEZ,EAAO,CAEX,CACA,OAAO,CACT,CAQO,SAAS,GACd,EACA,GAEA,IAAK,EAAM,OACT,OAAO,EAET,IACI,EACA,EAFA,EAAU,EAAK,GAGnB,IAAK,EAAI,EAAG,EAAI,EAAM,SACpB,EAAO,EAAM,KAEX,EAAK,GAAK,EAAK,IACf,EAAK,GAAK,IAAO,EAAK,IACtB,EAAK,GAAK,IAAO,EAAK,KALI,IAS1B,EAAU,KAAK,IAAI,EAAS,EAAK,IAGrC,IAAI,EAAa,EACjB,KAAO,EAAI,EAAM,SACf,EAAO,EAAM,KAEX,EAAK,IAAM,EAAK,IAChB,EAAK,GAAK,GAAM,EAAK,IACrB,EAAK,GAAK,GAAM,EAAK,KALA,IASrB,EAAa,EAAK,GAQtB,OAJE,EADE,IAAM,EAAM,OACD,EAAK,GAEL,KAAK,IAAI,EAAY,EAAK,IAErC,GAAc,EACT,KAEA,IAAI,GAAK,EAAK,GAAI,EAAS,EAAK,GAAI,EAE/C,CAQO,SAAS,GACd,EACA,GAEA,IAAK,EAAM,OACT,OAAO,EAET,IACI,EACA,EAFA,EAAa,EAAK,GAGtB,IAAK,EAAI,EAAM,OAAS,EAAG,GAAK,IAC9B,EAAO,EAAM,KACT,IAAM,EAAM,OAAS,GAAK,EAAK,GAAK,EAAK,QAG3C,EAAK,GAAK,EAAK,IACf,EAAK,GAAK,IAAO,EAAK,IACtB,EAAK,GAAK,IAAO,EAAK,IAPS,IAW/B,EAAa,KAAK,IAAI,EAAY,EAAK,IAG3C,IAAI,EAAU,KAAK,IAAI,EAAY,EAAK,IACxC,KAAO,GAAK,IACV,EAAO,EAAM,KAEX,EAAK,IAAM,EAAK,IAChB,EAAK,GAAK,GAAM,EAAK,IACrB,EAAK,GAAK,GAAM,EAAK,KALV,IASX,EAAU,EAAK,GAInB,OADA,EAAU,KAAK,IAAI,EAAS,EAAK,IAC7B,GAAc,EACT,KAEA,IAAI,GAAK,EAAK,GAAI,EAAS,EAAK,GAAI,EAE/C,CC1iBO,IAAM,GAAN,cAA6B,GAGlC,WAAA,GACE,QAHF,EAAA,KAAA,UAAsC,GAItC,CAES,UAAA,CAAW,GAClB,OAAK,KAAA,QAAQ,EAAM,SACZ,CACT,CAES,cAAA,CAAe,GACtB,OAAA,KAAK,YAAY,EAAK,QACf,CACT,GAgBW,GAAN,cAA6B,GAClC,WAAA,CAAmB,GACjB,QADiB,KAAA,OAEnB,CAES,QAAA,CAAS,GAChB,OAAA,KAAK,MAAQ,EAAI,IACV,CACT,GAGK,SAAS,GAAM,EAAc,GAClC,GAAI,EAAK,CACP,IAAM,EAAU,IAAI,GAAW,GAC/B,IACE,OAAA,EAAI,MAAM,GACH,EAAQ,KACjB,CAAS,SACC,EAAO,KAAK,EAAK,UAC3B,CACF,CACA,OAAO,CACT,CAEO,IAAM,GAAN,cAA+B,GAKpC,WAAA,GACE,QALF,EAAA,KAAmB,cACnB,EAAA,KAAA,SAAwB,IACxB,EAAA,KAAA,OAAsB,KAItB,CAES,YAAA,CAAa,GACpB,OAAI,KAAK,SACP,KAAK,OAAO,KAAK,GAEZ,IACT,CAES,QAAA,CAAS,GAChB,OAAI,KAAK,SAAsB,GAAX,EAAI,KACtB,KAAK,OAAO,KAAK,IAAQ,GAAQ,EAAG,OAE/B,IACT,CAES,cAAA,CAAe,GACtB,OAAK,KAAA,YAAY,EAAK,QACf,IACT,CAES,SAAA,CAAU,GACjB,OAAK,KAAK,UACR,KAAK,WACL,KAAK,YAAY,EAAK,QACtB,KAAK,WACL,KAAK,KAAO,EAAK,KAAK,eAEjB,IACT,CAEA,QAAA,CACE,EACA,EACA,EACA,EACA,GAEA,GAAI,KAAK,OAAO,OAAS,EAAG,CAC1B,IAAM,EAAoB,GAY1B,OAXA,KAAK,OAAO,SAAQ,CAAC,EAAO,KAC1B,GAAkB,KAAd,EAAM,KAAa,CACrB,IAAI,EAAM,EAAI,GAAK,EAAI,EAAQ,EACtB,GAAL,GAAuB,UAAb,KAAK,OACjB,EAAM,KAAK,MAAM,EAAQ,EAAQ,EAAS,GAAU,IAEtD,EAAQ,KAAM,EAAM,IAAM,EAAO,IACnC,MACE,EAAQ,KAAK,EAAM,IAAM,EAAQ,cAAc,EAAM,SAAM,IAGvD,KAAK,MACX,IAAK,UACH,GAAI,EAAQ,OAAS,GAAK,EAAG,CAC3B,IAAM,EAA+B,GACrC,QAAS,EAAI,EAAG,EAAI,EAAQ,OAAQ,GAAK,EACvC,EAAO,KACL,IAAiB,GAAM,EAAI,EAAQ,GAAI,EAAI,EAAQ,EAAI,KAG3D,OAAO,IAAiB,GAAM,EAChC,CACA,MACF,IAAK,YACH,GAAsB,GAAlB,EAAQ,OACV,OAAoB,GAClB,EAAI,EAAQ,GACZ,EAAI,EAAQ,GACZ,EAAI,EAAQ,GAAK,EAAQ,GACzB,EAAI,EAAQ,GAAK,EAAQ,IAG7B,MACF,IAAK,UACH,GAAsB,GAAlB,EAAQ,OACV,OAAoB,GAClB,EAAI,EAAQ,GACZ,EAAI,EAAQ,GACZ,EAAQ,GACR,EAAQ,IAGZ,MACF,IAAK,SACH,GAAsB,GAAlB,EAAQ,OACV,OAAoB,GAClB,EAAI,EAAQ,GACZ,EAAI,EAAQ,GACZ,EAAQ,GACR,EAAQ,IAKlB,CACA,OAAO,IACT,GAGK,SAAS,GACd,EACA,EACA,EACA,EACA,EACA,GAEA,GAAI,EAAK,CACP,IAAM,EAAU,IAAI,GACpB,IACE,OAAA,EAAI,MAAM,GACH,EAAQ,SAAS,EAAG,EAAG,EAAO,EAAQ,EAC/C,OAAS,GACC,EAAO,KAAK,EAAK,WAC3B,CACF,CACA,OAAoB,GAAa,EAAG,EAAG,EAAI,EAAO,EAAI,EACxD,CAEO,IAAM,GAAN,cAAkC,GAIvC,WAAA,CAA4B,GAC1B,QAD0B,KAAA,QAH5B,EAAA,KAAA,WAAsC,IACtC,EAAA,KAAA,OAAsB,KAItB,CAES,UAAA,CAAW,GAClB,OAAA,KAAK,KAAO,EAAM,WACd,KAAK,MACP,KAAK,SAAS,KAAK,MAAQ,EAE3B,KAAK,SAAS,KAAK,OAAS,KAAK,SAAS,KAAK,OAAS,GAAK,EAExD,CACT,CAES,QAAA,CAAS,GAChB,OAAI,KAAK,OACP,KAAK,SAAS,KAAK,OAAS,EAAI,KAAO,KAAK,MAAQ,EAAI,IAEnD,CACT,CAES,cAAA,CAAe,GACtB,OAAK,KAAA,YAAY,EAAK,QACf,CACT,GAGK,SAAS,GACd,EACA,GAEA,IAAM,EAAU,IAAI,GAAgB,GACpC,IACE,EAAI,MAAM,EACZ,CAAS,SACC,EAAO,KAAK,EAAK,cAC3B,CACA,OAAO,EAAQ,QACjB,CAEO,IAAM,GAAN,cAAsC,GAC3C,WAAA,CACS,EACA,GAEP,QAHO,KAAA,UACA,KAAA,aAGT,CAES,QAAA,CAAS,GAChB,OAAO,IAAQ,GAAI,KAAK,YAAY,aAAa,EAAI,IAAK,KAAK,SACjE,GCvOF,SAAS,GACP,GAEA,IAAM,EAAS,GACf,OAAA,OAAO,KAAK,GAAU,SAAS,IAC7B,EAAO,GAAQ,MAAM,KAAK,EAAS,OAE9B,CACT,CAQA,SAAS,GACP,EACA,GAEA,GAAsB,YAAlB,EAA6B,CAE/B,IAAM,EAAQ,EAAQ,cAEtB,OADgB,EAAM,iBAAiB,uBAC/B,SAAS,GAAW,EAAO,WAC5B,EAAM,aAAe,EAC9B,CAAO,CAEL,IAAM,EAAa,EAAQ,cACzB,uBAAuB,OAEzB,OAAO,GAAa,EAAW,aAAe,EAChD,CACF,CASO,IAAM,GAAN,MAKL,WAAA,CACkB,EACT,GADS,KAAA,WACT,KAAA,WANT,EAAA,KAAA,eAAyC,MACzC,EAAA,KAAqB,iBACrB,EAAA,KAAA,aAKG,GAEH,MAAA,CAAO,GACL,OAAI,OAAS,KAGR,GAIH,KAAK,WAAa,EAAM,UACxB,KAAK,WAAa,EAAM,UACxB,KAAK,aAAe,EAAM,YAC1B,KAAK,YAAc,EAAM,SAE7B,CAKA,UAAA,GACE,OAAO,KAAK,QACd,CAKA,OAAA,GACE,KAAK,WACP,CAKA,SAAA,GACE,KAAK,WACP,GAGI,GAAN,MACE,WAAA,CACkB,EACA,GADA,KAAA,eACA,aAAA,CACf,CAGH,YAAA,CAAa,EAAY,GACvB,EAAK,KAAK,aAAa,uBAAuB,kBAC5C,EACA,KAAK,SAEP,KAAK,aAAa,aAAa,GAAM,CACvC,CAEA,sBAAA,GACE,OAAO,KAAK,aAAa,wBAC3B,GAUI,GAAN,MAKE,WAAA,CACkB,EACA,EACA,EACA,GAHA,KAAA,eACA,KAAA,UACA,KAAA,YACA,KAAA,YARlB,EAAA,KAAkC,eAClC,EAAA,KAAA,oBAAwC,CAAC,GACzC,EAAA,KAAA,kBAAsC,CAAC,EAOpC,CAEH,SAAA,CAAU,GACR,KAAK,OAAS,CAChB,CAEQ,WAAA,CAAY,GAClB,IAAM,EAAI,EAAI,MAAM,gBACpB,OAAO,EAAI,EAAE,GAAK,IACpB,CAEQ,gBAAA,CAAiB,GACvB,IAAI,EAAgB,KAAK,aAAa,uBAAuB,aACtD,GAAW,EAAK,KAAK,SAC1B,KAAK,SAEP,MAAgC,MAA5B,EAAc,OAAO,KACvB,EAAgB,EAAc,UAAU,IAEnC,CACT,CAGA,iBAAA,CACE,EACA,GAEA,IAAM,EAAmB,KACvB,IAAM,EAAS,KAAK,aAAa,oBAAoB,GACrD,OAAO,GAAU,EAAO,OAAS,EAAO,EAAO,OAAS,GAAK,MAGzD,EAAO,IAAU,GACrB,KAAK,WACL,IAAM,EAAO,MACb,gBAAgB,KAOlB,OAAK,KAAA,aAAa,wBAAwB,GAJrB,GACZ,EAAO,EAAI,EAAI,OAAS,KAG4B,GACtD,CACT,CAGA,kBAAA,CACE,EACA,GAEA,IAAM,EAAoB,IACjB,KAAK,aAAa,oBAAoB,IAAS,GAGlD,EAAO,IAAU,GACrB,KAAK,WACL,IAAM,EAAO,MACb,iBAAiB,KAEnB,OAAA,KAAK,aAAa,wBAAwB,EAAM,EAAQ,GACjD,CACT,CAgBQ,iBAAA,CACN,EACA,EACA,GAEA,IAAI,EAAiB,KAAK,aAAa,aAAa,GACpD,OAAK,GAAkB,GAAkB,IACvC,KAAK,OAAO,sBAAsB,GAClC,EAAiB,KAAK,aAAa,aAAa,IAE3C,GAAkB,IAC3B,CAQQ,qBAAA,CACN,GAEA,OAAI,KAAK,aAAa,YAAY,aAAa,GACtC,KAAK,aAAa,oBAElB,KAAK,aAAa,iBAAiB,IAAkB,IAEhE,CASQ,iBAAA,CACN,EACA,GAEA,GAAI,KAAK,aAAa,YAAY,aAAa,GAAgB,CAE7D,IAAM,EACJ,KAAK,aAAa,YAAY,aAAa,GAC7C,GAAI,GAAY,EAAS,OAAS,EAAG,CAGnC,OAKS,GAPO,EAAS,GAGL,WAAlB,GACkB,UAAlB,GACkB,WAAlB,EAEyC,EAGF,UAC3C,CACA,MAAO,EACT,CAGE,GAAI,KAAiB,KAAK,aAAa,aAAc,CACnD,IAAM,EAAU,KAAK,aAAa,aAAa,GAC/C,gBAAO,EAAQ,GACX,EAAQ,GACR,EAAQ,SAAc,EAC5B,CACA,OAAO,IAEX,CAGA,mBAAA,CACE,EACA,EACA,GAEA,IAAM,EAAK,KAAK,YAAY,GACtB,EAAgB,KAAK,iBAAiB,GAIxC,EAAW,KAAK,kBAAkB,EAAI,MAC1C,GAAI,GAAY,EAAS,GAAO,CAG9B,IAAM,EAAiB,EAAS,GAChC,OAAO,IAAU,GACf,KAAK,UACL,EAAO,EAAe,EAAe,OAAS,IAAM,MAExD,CACA,IAAM,EAAO,IAAU,GACrB,KAAK,WACL,KAKE,GAFA,EAAW,KAAK,kBAAkB,EAAI,MAElC,EACF,IAAI,EAAS,GAAO,CAGlB,IAAM,EAAiB,EAAS,GAChC,OAAO,EAAO,EAAe,EAAe,OAAS,IAAM,KAC7D,CAAO,CACL,IAAM,EAAe,KAAK,sBAAsB,GAChD,GAAI,EAIF,IAFA,KAAK,aAAa,iBAAiB,GAE/B,EAAa,GAAO,CACtB,IAAM,EAAqB,EAAa,GACxC,OAAO,EACL,EAAmB,EAAmB,OAAS,IAAM,KAEzD,CAEE,OAAO,EAAO,GAIX,OAAA,KAAA,aAAa,2BAChB,MAGK,IAEX,EAKK,OAAA,KAAA,aAAa,2BAA2B,MACtC,OAGX,kBAAkB,QAAW,KAG/B,OAAA,KAAK,aAAa,0BAChB,EACA,EACA,EACA,GAEK,CACT,CAGA,oBAAA,CACE,EACA,EACA,GAEA,IAAM,EAAK,KAAK,YAAY,GACtB,EAAgB,KAAK,iBAAiB,GAC5C,OAAO,IAAU,GACf,KAAK,WACL,KACE,IAAM,EAAe,KAAK,sBAAsB,GAEhD,GAAK,EAIE,CACL,KAAK,aAAa,iBAAiB,GACnC,IAAM,EAAqB,EAAa,IAAS,GAM3C,EALkB,KAAK,kBAC3B,EACA,MAG4C,IAAS,GACvD,OAAO,EAAO,EAAmB,OAAO,GAC1C,CAZO,OAAA,KAAA,aAAa,2BAA2B,MACtC,OAaX,mBAAmB,QAAW,IAElC,CAGA,gBAAA,CAAiB,EAAa,GAC5B,IAAM,EAAgB,KAAK,iBAAiB,GAEtC,EAAO,IAAU,GACrB,KAAK,WACL,KAEE,GAAsB,iBAAlB,EAAkC,CAEpC,IAAM,EAAa,KAAK,kBAAkB,EAAe,UACnD,EAAc,KAAK,kBAAkB,EAAe,WACpD,EAAY,KAAK,kBAAkB,EAAe,SAGxD,GACiB,OAAf,GACgB,OAAhB,GACc,OAAd,EAEA,OAAK,KAAA,aAAa,2BAA2B,MACtC,KAGT,IAAM,GACH,MAAA,IAAc,KAAO,MAAA,IAAe,KAAO,MAAA,IAAa,IAC3D,KAAK,aAAa,iBAAiB,GAEnC,IAAM,EAAQ,EAAK,MAAW,GAC9B,OAAO,EAAQ,EAAM,GAAK,EAC5B,CAGA,IAAI,EAAW,KAAK,kBAAkB,EAAe,GACrD,OAAiB,OAAb,GAEF,KAAK,aAAa,iBAAiB,GAC5B,IAGP,KAAK,aAAa,2BAA2B,MACtC,QAGX,eAAe,QAAoB,KAGrC,OAAA,KAAK,aAAa,uBAChB,EACA,EACA,GAEK,CACT,CAMA,iBAAA,CAAkB,EAAc,GAC9B,OAAO,IAAU,GACf,KAAK,WACL,IACE,KAAK,gBAAgB,KAAK,kBAAmB,EAAM,IACrD,gBAAgB,KAAoB,IAExC,CAMA,oBAAA,CAAqB,EAAc,GACjC,OAAO,IAAU,GACf,KAAK,WACL,IAAM,KAAK,gBAAgB,KAAK,gBAAiB,EAAM,IACvD,mBAAmB,KAAoB,IAE3C,CAEQ,eAAA,CACN,EACA,EACA,GAEA,IAAM,EAAgB,EAAmB,GACzC,IAAK,EACH,MAAO,GAET,IAAM,EAAU,OAAO,KAAK,GACzB,KAAK,GAAM,SAAS,EAAG,MACvB,KAAU,IAEP,EAAc,KAAK,aAAa,YAChC,EAAkB,EAAY,YAChC,EAAY,OAAS,EACrB,EAAY,OACV,EAAiB,EAAY,YAC/B,EACA,KAAK,IACH,KACG,MAAM,KACP,EAAY,UAAU,iBACpB,IAAS,OAEX,KAAK,GAAM,SAAS,EAAE,aAAkB,GAAsB,OAGlE,GACA,KACA,KACA,KAEJ,UAAS,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,IAAM,EAAS,EAAQ,GACjB,EAAa,EAAI,EAAI,EAAQ,EAAI,IACjC,IAAa,EAAI,EAAQ,OAAS,EAAI,EAAQ,EAAI,IACxD,KAAI,EAAS,EACX,MAEF,GAAI,GAAU,EAAiB,CAK7B,GAJI,EAAc,IAChB,EAAc,EACd,GAEE,KAAc,EAChB,GAAI,IAAW,EACb,EAAc,MACT,CACD,EAAa,IACf,EAAc,GAGhB,IAAM,EAAkB,EAAY,UAAU,cAC5C,IAAS,MAAwB,OAEnC,GAAK,EAKE,CACL,IAAI,EACF,EAAY,UAAU,cACpB,IAAS,MAAwB,OASrC,GAPK,IAGH,EAA2B,EAAY,UAAU,cAC/C,IAAS,WAGT,EAEF,QACM,EAAU,EACd,EACA,EAAU,EAAQ,kBAElB,GAAI,IAAY,EAAiB,CAC/B,EAAc,EACd,KACF,CAGN,MA5BM,EAAc,IAChB,EAAc,EA4BpB,CAEF,EAAa,CACf,MAAW,EAAa,GAAkB,EAAa,KACrD,EAAc,EAAc,EAAa,EAAoB,EAEjE,CAYA,OATE,EACE,CACE,MAAO,EACP,MAAO,EACP,KAAM,EACN,eAAgB,GAChB,KACC,EAGT,CAMA,cAAA,CACE,EACA,EACA,IAGE,KAAK,kBAAkB,KAAU,KAAK,kBAAkB,GAAQ,KAC3D,GAAiB,CAC1B,CAMA,iBAAA,CAAkB,EAAc,IAE5B,KAAK,gBAAgB,KAAU,KAAK,gBAAgB,GAAQ,KACvD,GAAiB,OAAO,EACjC,GAGW,GAAN,MAsCL,WAAA,CACkB,GAAA,KAAA,yBAtClB,EAAA,KAA4D,gBAC5D,KAAA,KAAgE,oBAChE,KAAA,KAAuE,mBACvE,EAAA,KAAgD,0BAChD,EAAA,KAAiD,wBACjD,KAAA,KAAuD,+BACvD,EAAA,KAEI,sBACJ,EAAA,KAA0B,oBAC1B,EAAA,KAAA,6BAAuD,IACvD,EAAA,KAA8C,wBAC9C,EAAA,KAAqD,6BACrD,EAAA,KAAoE,2BACpE,EAAA,KAAkE,sBAClE,KAAA,KAAQ,oBAGF,IACN,EAAA,KAAQ,mBAGF,IAEN,EAAA,KAAQ,qBAKF,IAEN,EAAA,KAAQ,kBAIF,IAKJ,KAAK,oBAAoB,KAAU,CAAC,EACtC,CAEA,qBAAA,CAAsB,GACpB,OAAO,IAAI,GAAgB,KAAM,EACnC,CAEA,qBAAA,CACE,EACA,EACA,GAEA,OAAO,IAAI,GAAgB,KAAM,EAAS,EAAW,EACvD,CAEA,cAAA,CAAe,GACb,KAAK,YAAc,CACrB,CAEQ,iBAAA,CAAkB,EAAqB,GACzC,KAAK,oBAAoB,GAC3B,KAAK,oBAAoB,GAAa,KAAK,GAE3C,KAAK,oBAAoB,GAAe,CAAC,EAE7C,CAKA,mBAAA,CAAoB,GAClB,IAAM,EAAW,KAAK,oBAAoB,KACrC,GAAa,EAAS,OAGzB,EAAS,EAAS,OAAS,GAAK,EAFhC,KAAK,oBAAoB,KAAU,CAAC,EAIxC,CAOA,kBAAA,CACE,EACA,GAGA,KAAK,qBAAuB,GAAmB,KAAK,qBACpD,IAAI,EACE,EAAQ,EAAkB,iBAChC,GAAI,EAAO,CACT,IAAM,EAAW,EAAM,SAAS,GAC5B,IACF,EAAmB,GAAW,MAElC,CACA,GAAI,EACF,IAAW,SAAoB,EAC7B,KAAK,kBAAkB,EAAkB,EAAS,IAGtD,IAAI,EACE,EAAY,EAChB,qBAEF,GAAI,EAAW,CACb,IAAM,EAAe,EAAU,SAAS,GACpC,IACF,EAAuB,GAAW,MAEtC,CAII,EACI,SAAU,IACd,EAAa,KAAU,IAGzB,EAAe,GACf,EAAa,KAAU,GAEzB,IAAW,SAAwB,EAAc,CAC1C,KAAK,oBAAoB,IAC5B,KAAK,kBAAkB,EAAsB,GAE/C,IAAM,EAAgB,KAAK,oBAAoB,GAC/C,EAAc,EAAc,OAAS,IACnC,EAAa,EACjB,CACF,CAMA,gBAAA,CAAiB,GACf,KAAK,yBAAyB,KAAK,KAAK,qBACxC,KAAK,oBAAsB,GAAmB,EAChD,CAKA,eAAA,GACE,KAAK,oBAAsB,KAAK,yBAAyB,KAC3D,CAKA,gBAAA,CAAiB,GACf,IAAM,EAAiB,KAAK,qBAAqB,GAC7C,EAAe,KAAK,mBAAmB,GACtC,IACH,EAAe,KAAK,mBAAmB,GAAM,IAE/C,IAAI,KACJ,QAAS,EAAI,EAAG,EAAI,KAAK,kBAAkB,QAAU,CACnD,IAAM,EAAM,KAAK,kBAAkB,GACnC,GAAI,EAAI,WAAa,EAAI,CAGvB,GAFA,EAAI,UACJ,KAAK,kBAAkB,OAAO,EAAG,GAC7B,EAAgB,CAClB,IAAM,EAAI,EAAe,QAAQ,GAC7B,GAAK,GACP,EAAe,OAAO,EAAG,EAE7B,CACA,EAAa,KAAK,GAClB,IACF,MACE,GAEJ,CACK,GACH,KAAK,2BAA2B,KAEpC,CAMA,0BAAA,CAA2B,EAAY,GACrC,IAAK,KAAK,2BAA2B,MAAM,GAAQ,EAAI,WAAa,IAAK,CACvE,IAAM,EAAM,IAAI,GAAuB,EAAI,GAC3C,KAAK,2BAA2B,KAAK,EACvC,CACF,CAQA,UAAA,CAAW,EAAoB,GAC7B,IAAM,EAAM,OAAO,KAAK,KAAK,YAAY,cACzC,GAAI,EAAI,OAAS,EAAG,CAClB,IAAM,EAAsB,GAAmB,KAAK,qBACpD,EAAI,SAAS,IACX,KAAK,iBAAiB,GAAM,EAG5B,IAAM,EAAW,KAAK,YAAY,aAAa,GAC/C,GAAI,GAAY,EAAS,OAAS,EAAG,CACnC,IAAM,EAAU,EAAS,GACzB,KAAK,aAAa,GAAM,CACtB,QAAS,GAAyB,EAAS,WAC3C,OAAQ,GAAyB,EAAS,UAC1C,MAAO,GAAyB,EAAS,SACzC,OAAQ,GAAyB,EAAS,UAE9C,CAEA,IAAM,EAAe,KAAK,gBAAgB,GAC1C,GAAI,GAAgB,EAAa,UAAY,EAAW,CACtD,IAAM,EAAe,KAAK,mBAAmB,GAC7C,GAAI,EAAc,CAChB,IAII,EAJA,EAAiB,KAAK,qBAAqB,GAK/C,IAJK,IACH,EAAiB,KAAK,qBAAqB,GAAM,IAG3C,EAAM,EAAa,SACzB,EAAI,YACJ,EAAe,KAAK,EAExB,CACF,CACA,KAAK,gBAAgB,GAAM,CAAE,aAAY,eAE7C,CACA,IACI,EADE,EAAmB,KAAK,qBAE9B,KAAQ,EAAM,KAAK,2BAA2B,SAAU,CAItD,IAAI,EAHJ,EAAI,aAAe,EACnB,EAAI,WAAa,EACjB,EAAI,UAAY,EAEZ,EAAI,cACN,EAAM,KAAK,mBAAmB,EAAI,UAC7B,IACH,EAAM,KAAK,mBAAmB,EAAI,UAAY,MAGhD,EAAM,KAAK,qBAAqB,EAAI,UAC/B,IACH,EAAM,KAAK,qBAAqB,EAAI,UAAY,KAGhD,EAAI,OAAO,IAAO,EAAI,OAAO,MAC/B,EAAI,KAAK,EAEb,CACA,KAAK,YAAc,IACrB,CAKA,uBAAA,CAAwB,GAMtB,IAAI,EAAiC,GACzB,OAAO,KAAK,EAAK,cACzB,SAAS,IACX,IAAM,EAAS,KAAK,qBAAqB,GACrC,IACF,EAAO,EAAK,OAAO,OAGvB,EAAK,MACH,CAAC,EAAI,IAAO,EAAG,WAAa,EAAG,YAAc,EAAG,UAAY,EAAG,YAEjE,IAAM,EAKA,GACF,EAKA,KACJ,OAAA,EAAK,SAAS,IAET,GACD,EAAE,aAAe,EAAI,YACrB,EAAE,YAAc,EAAI,UAUpB,EAAE,KAAK,KAAK,IARZ,EAAI,CACF,WAAY,EAAI,WAChB,UAAW,EAAI,UACf,aAAc,EAAI,aAClB,KAAM,CAAC,IAET,EAAO,KAAK,OAKT,CACT,CAMA,qBAAA,CAAsB,GACpB,KAAK,uBAAuB,KAAK,KAAK,mBACtC,KAAK,kBAAoB,CAC3B,CAKA,oBAAA,GACE,KAAK,kBAAoB,KAAK,uBAAuB,KACvD,CAEA,uBAAA,CACE,EACA,EACA,GAEa,UAAT,EACF,KAAK,kBAAkB,KAAK,CAAE,OAAM,WAEpC,KAAK,iBAAiB,KAAK,CAAE,OAAM,UAEvC,CACA,yBAAA,CACE,EACA,EACA,EACA,GAEA,KAAK,mBAAmB,KAAK,CAAE,OAAM,OAAM,SAAQ,iBACrD,CAEA,sBAAA,CACE,EACA,EACA,GAEA,KAAK,gBAAgB,KAAK,CAAE,gBAAe,OAAM,iBACnD,CAEA,sBAAA,GACE,OAAO,KAAK,oBAAoB,KAAK,KACvC,CAEQ,mBAAA,CACN,EACA,EACA,GAEA,GAAI,aAAsB,GACxB,IAAgB,cAAZ,EAAK,IAAqB,CAC5B,IAAM,EAAO,EAAS,gBAAA,+BAA+B,QACrD,OAAA,EAAK,YAAc,EACnB,EAAK,aAAa,kBAAmB,EAAK,KAC1C,EAAK,aAAa,wBAAyB,GACpC,CACT,IAAW,EAAK,IAAI,WAAW,oBAAqB,CAClD,IAAM,EACJ,GACA,EAAS,iBAAiB,IAAS,MAAwB,OAC7D,IAAK,GAAgC,IAApB,EAAS,OACxB,OAAO,KAGT,IAAM,EADW,EAAS,EAAS,OAAS,GAChB,cAC5B,OAAK,KAAA,+BAA+B,GACpC,EAAW,MAAM,SAAW,GAC5B,EAAW,MAAM,WAAa,GACvB,CACT,CAAW,KAAK,IAAI,WAAW,mBAAoB,CACjD,IAAM,EAAO,EAAS,gBAA+B,uCACrD,OAAA,EAAK,YAAc,EACnB,EAAK,aAAa,GAAqB,EAAK,KACrC,CACT,CAAW,KAAK,IAAI,WAAW,gBAAiB,CAC9C,IAAM,EAAO,EAAS,gBAAA,+BAA+B,QACrD,OAAA,EAAK,YAAc,EACnB,EAAK,aAAa,GAAkB,EAAK,KAClC,CACT,EAGF,IAAM,EACJ,KAAK,kBAAkB,WAAW,GAAM,EAAE,OAAS,KAAS,EACxD,GACH,GACD,KAAK,iBAAiB,WAAW,GAAM,EAAE,OAAS,KAAS,EAE7D,GAAI,GAAqB,EAAkB,CACzC,IAAM,EAAO,EAAS,gBAAA,+BAA+B,QACrD,OAAA,EAAK,YAAc,EACnB,EAAK,aACH,EAAoB,GAAqB,GACzC,EAAK,KAEA,CACT,CACS,WAEX,CAEQ,8BAAA,CAA+B,GACrC,IAAM,EAAQ,EAAY,iBAAiB,IAAI,OAC/C,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAM,EAAK,aAAa,IACxB,EAAc,KAAK,iBAAiB,MAAM,GAAM,EAAE,KAAK,MAAQ,IAC/D,GAAO,MAAA,WAAa,MAAsB,IAC1C,EAAc,MAAA,WAAK,QAAQ,mBAAoB,IAC/C,EAAgB,KAAK,oBAAoB,GAC3C,IACF,EAAK,YAAc,EAAY,OAAO,GAE1C,CACA,IAAM,EAAc,EAAY,iBAC9B,IAAI,OAGN,QAAW,KAAQ,EACjB,EAAK,aAAa,OAGpB,IAAM,EAAkB,EAAY,iBAClC,IAAI,OAGN,IAAW,SAAQ,EACjB,EAAK,aAAa,MAEtB,CAEA,cAAA,CAAe,GAvjCjB,IAAA,EAwjCI,IAAM,EAAQ,EAAS,KAAK,iBAAiB,IAAI,OAC3C,EAAQ,EAAS,iBAAiB,kBACxC,IAAW,SAAQ,EAAO,CACxB,IAAM,EAAM,EAAK,aAAa,IACxB,EAAI,KAAK,kBAAkB,WAAW,GAAM,EAAE,KAAK,MAAQ,IAEjE,EAAK,YAAc,KAAK,kBAAkB,GAAG,OAAO,CAAC,GACvD,CAEA,IAAM,EAAe,EAAS,KAAK,iBACjC,IAAI,OAGN,IAAW,SAAQ,EAAc,CAC/B,IAAM,EAAM,EAAK,aAAa,IACxB,EAAO,KAAK,mBAAmB,MAAM,GAAM,EAAE,KAAK,MAAQ,IAChE,GAAI,GAAQ,EAAK,cAAe,CAC9B,IAAM,EAAe,KAAK,iBAAiB,EAAK,eAChD,GAAI,EAAc,CAChB,IAAM,EAAgB,EAAa,EAAK,MACpC,IACF,EAAK,YAAc,EAAK,OAAO,EAAI,EAAI,OAAS,IAEpD,CACF,CACF,CAEA,IAAM,EAAmB,EAAS,KAAK,iBACrC,IAAI,OAGN,IAAW,SAAQ,EAAkB,CACnC,IAAM,EAAM,EAAK,aAAa,IACxB,EAAO,KAAK,gBAAgB,MAAM,GAAM,EAAE,KAAK,MAAQ,IAC7D,GAAI,GAAQ,EAAK,cAAe,CAC9B,IAAM,EAAO,KAAK,aAAa,EAAK,eAChC,IACF,EAAK,YAAc,OAAA,EAAA,EAAK,EAAK,gBAAV,EAA4B,GAEnD,CACF,CACF,CAEA,sBAAA,CAAuB,GACrB,OAAO,IAAI,GAAiB,KAAM,EACpC,GAGW,GAAqB,iCACrB,GAAoB,gCACpB,GAAsB,kCACtB,GAAmB,+BAEnB,GACX,6CACW,GACX,0CAEI,GAAN,MACE,WAAA,CACkB,EACA,GADA,KAAA,eACA,KAAA,WACf,CAGH,WAAA,CAAY,GACV,IAAK,GAAe,EAAY,MAC9B,SAEF,IAAM,EAAW,EAAY,SAC7B,IAAK,GAAkC,IAAtB,EAAS,SACxB,SAEF,IAAM,EACH,EAAqB,aAAa,wBAClC,EAAqB,aAAa,OAClC,EAAqB,aAAa,QAIrC,IAHK,IAIF,KAAK,aAAa,mBAAmB,KACrC,KAAK,aAAa,qBAAqB,GAExC,SAEF,IAAM,EAAY,KAAK,aAAa,gBAAgB,GACpD,OAAK,GAGE,KAAK,WAAa,EAAU,SACrC,GCznCK,SAAS,GAAkB,GAEhC,IADA,EAAM,EAAI,OAAO,IACT,MAAM,sBACZ,OAAO,EAET,IAAM,EAAO,SAAS,EAAK,IAC3B,OAAI,MAAM,GACD,GAEI,IAAT,GAAe,GAAQ,OAAU,GAAQ,OAAW,EAAO,QACtD,IAEF,OAAO,cAAc,EAC9B,CAEO,SAAS,GAAY,GAC1B,OAAO,EAAI,QACT,4DACA,GAEJ,CAgEO,IAAM,GAAN,MAOL,WAAA,GANA,EAAA,KACA,UAAA,KAA2B,sBAC3B,EAAA,KAAA,MAAc,GACd,EAAA,KAAA,OAAe,IACf,EAAA,KAAmB,cAGjB,KAAK,KAAO,CACd,CAEA,QAAA,GACE,OAAQ,KAAK,MACX,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,QACE,MAAO,IACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,KACT,KAAK,GACH,MAAO,KACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KAAK,GACH,MAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,IACT,KACE,SAAO,KACT,KACE,SAAO,KACT,KACE,SAAO,KACT,KACE,SAAO,KACT,KAAK,GACH,MAAO,KACT,KAAK,GACH,MAAO,KACT,KAAK,GACH,MAAO,KACT,KAAK,GACH,MAAO,KACT,KACE,SAAO,KACT,KACE,SAAO,KACT,KACE,SAAO,UACT,KACE,SAAO,SACT,OACE,OAAO,KAAK,IAAI,WAAa,KAAK,KACpC,KACA,OACE,SAAO,KAAK,IAAI,WAClB,KAAK,GACH,MAAO,IAAM,KAAK,KACpB,KAAK,EACH,MAAO,IAAM,KAAK,KACpB,KAAK,EACH,OAAO,KAAK,KAAO,IACrB,KACE,QAAO,IAAM,KAAK,KACpB,KACE,QAAO,UACT,QACE,OAAO,KAAK,KAElB,GA8FK,SAAS,GAAY,EAAa,GACvC,IACI,EADE,EAAc,MAAM,KAE1B,IAAK,EAAI,EAAG,EAAI,IAAK,IACnB,EAAE,GAAK,EAGT,IADA,EAAK,IAAW,IAAP,EAAoB,GAAa,GACrC,EAAI,EAAG,EAAI,EAAK,OAAQ,GAAK,EAChC,EAAE,EAAK,IAAM,EAAK,EAAI,GAExB,OAAO,CACT,CAKO,IAAM,GAA0B,CACrC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,IAGF,GAAiB,IAAI,GAKd,IAAM,GAAyB,CACpC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAGF,GAAgB,IAAI,GAKb,IAAM,GAA8B,CACzC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAGF,GAAgB,IAAI,GAKb,IAAM,GAAyB,CACpC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAGF,GAAgB,IAAI,GAKb,IAAM,GAA4B,CACvC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAGF,GAAmB,IAAI,GAKhB,IAAM,GAAuB,CAClC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAGF,GAAc,IAAI,GAKX,IAAM,GAA0B,CACrC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAGF,GAAiB,IAAI,GAEd,IAAM,GAA2B,GAAY,GAAY,CAC9D,GACA,KAGW,GAAyB,GAAY,GAAY,CAC5D,GACA,KAGW,GAAuB,GAAY,GAAY,CAC1D,GACA,GACA,IACA,KAGW,GAAuB,GAAY,GAAY,CAC1D,GACA,KAGW,GAAyB,GAAY,GAAY,CAC5D,GACA,KAGW,GAA2B,GAAY,GAAa,CAC/D,GACA,KAGW,GAA+B,GAAY,GAAgB,CACtE,GACA,GACA,GACA,KAGW,GAA8B,GAAY,GAAc,CACnE,GACA,KAGW,GAAsB,GAAY,GAAY,CACzD,GACA,GACA,GACA,KAGW,GAA0B,GAAY,GAAc,CAC/D,GACA,KAGW,GAA+B,GAAY,GAAc,CACpE,GACA,KAGW,GAA+B,GAAY,GAAe,CACrE,GACA,GACA,GACA,KAGW,GAAwB,GAAY,GAAa,CAC5D,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KAGW,GAAwB,GAAY,GAAa,CAC5D,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KAGW,GAA2B,GAAY,GAAa,CAC/D,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KAGW,GAA2B,GAAY,GAAa,CAC/D,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KAGW,GAAuB,GAAY,GAAY,CAC1D,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KAGW,GAA6B,GAAY,GAAa,CACjE,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,IACA,GACA,IACA,KAGW,GAA8B,GAAY,GAAa,CAClE,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,KAGW,GAA8B,GAAY,GAAa,CAClE,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,KAGW,GAA2B,GAAY,GAAgB,CAClE,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KAKW,GAAN,MAOL,WAAA,CACS,EACS,GADT,KAAA,QACS,KAAA,UARlB,EAAA,kBACA,EAAA,KAAA,UACA,EAAA,KAAA,OAAe,GACf,EAAA,KAAe,UACf,EAAA,KAAA,WAAmB,GAMjB,KAAK,UAbyB,GAc9B,KAAK,OAAS,MAAM,KAAK,UAAY,GACrC,QAAS,EAAI,EAAG,GAAK,KAAK,UAAW,IACnC,KAAK,OAAO,GAAK,IAAI,EAEzB,CAEA,KAAA,GACE,OAAI,KAAK,MAAQ,KAAK,MACpB,KAAK,aAEA,KAAK,OAAO,KAAK,KAC1B,CAEA,QAAA,CAAS,GACP,OAAM,KAAK,KAAO,KAAK,KAAQ,KAAK,YAAc,GAChD,KAAK,aAEA,KAAK,OAAQ,KAAK,KAAO,EAAK,KAAK,UAC5C,CAEA,OAAA,GACE,KAAK,KAAQ,KAAK,KAAO,EAAK,KAAK,SACrC,CAEQ,UAAA,GACN,IAAI,EAAO,KAAK,KACZ,EAAO,KAAK,KACZ,EAAY,KAAK,UAMrB,GALI,GAAQ,EACV,GAAQ,EAER,IAEE,GAAQ,EACV,MAAM,IAAI,MAAM,qBAElB,IAAI,EAAU,GACR,EAAQ,KAAK,MACf,EAAW,KAAK,SACd,EAAS,KAAK,OAChB,EAAuB,EACvB,EAAwB,EACxB,EAAoB,GACpB,EAAmB,EACnB,KACA,EAAe,EAAO,GACtB,GACJ,SAAa,CACX,IAAM,EAAW,EAAM,WAAW,GAClC,OAAQ,EAAQ,IAAa,EAAQ,KACnC,KACE,KAAY,EAAM,UAAU,EAAe,GAGzC,EAFE,MAAM,GAEI,EAGA,GAEd,EAAU,GACV,MACF,KAAK,EACH,IACA,KACA,SACF,KAAK,EACH,EAAgB,IAChB,EAAU,GACV,SACF,KACE,IAAY,EACZ,EAAgB,IAChB,EAAU,GACV,SACF,KAAK,EACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,EAAY,EACZ,IAAkB,EAClB,EAAU,GACV,SACF,KAAK,GACH,EAAY,EACZ,IAAkB,EAClB,EAAU,GACV,SACF,KAAK,EACH,IAAkB,EAClB,EAAY,EACZ,EAAU,GACV,SACF,KACE,IAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,EACH,EAAgB,IAChB,EAAY,GACZ,MACF,KAAK,EACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAY,GACZ,MACF,KACE,KAAgB,IAChB,EAAY,GACZ,MACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAY,GACZ,MACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,MACF,KACE,KAAY,GACZ,EAAgB,IAChB,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAU,GACV,SACF,KAAK,GACH,EAAgB,IAChB,EAAY,EACZ,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,IACA,EAAY,GACZ,MACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,MACF,KACE,KAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAY,GACZ,MACF,KAAK,GACH,IAAkB,EAClB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,MACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,MACF,KACE,KAAgB,IAChB,EAAY,GACZ,MACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,MACF,KACE,KAAgB,IAChB,EAAe,EACf,EAAY,EACZ,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GACH,EAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KACE,KAAgB,IAChB,EAAY,GACZ,EAAU,GACV,SACF,KAAK,GAEH,MACF,KAAK,GACH,IACA,EAAa,EACX,GACA,GACF,MACF,KAAK,GAEH,EAAY,EACZ,EAAW,SAAS,EAAM,UAAU,EAAe,GAAW,IAC9D,MACF,KAAK,GAEH,EAAY,EACZ,EAAW,WAAW,EAAM,UAAU,EAAe,IACrD,MACF,KAAK,GAEH,IACA,SACF,KAAK,GACH,EAAY,EACZ,EAAW,WAAW,EAAM,UAAU,EAAe,IACrD,EAAgB,IAChB,EAAU,GACV,SACF,KAAK,GACH,EAAY,EACZ,EAAW,WAAW,EAAM,UAAU,EAAe,IACrD,EAAY,IACZ,EAAgB,IAChB,MACF,KAAK,GACH,IACA,EAAU,GACV,SACF,KAAK,GAMH,GAHA,EAAY,GAAY,EAAM,UAAU,EAAe,IAItC,KAAd,GAA+C,KAAb,GACpB,IAAd,GAC6B,MAA5B,EAAU,eACV,sEAAsE,KACpE,EAAM,UAAU,EAAW,IAE/B,CACA,EAAY,GACZ,IACA,QACF,CACA,MACF,KACE,KAAe,IACf,EAAU,GACV,SACF,KAAK,GAIH,EAAY,GAAY,EAAM,UAAU,EAAe,IACvD,MACF,KAAK,GACH,EAAY,EAAM,UAAU,EAAe,GAC3C,IACA,MACF,KAAK,GACH,EAAY,GAAY,EAAM,UAAU,EAAe,IACvD,IACA,MACF,KAAK,GACH,EAAe,EACf,GAAY,EACZ,EAAU,GACV,SACF,QACE,EAAe,EACf,GAAY,EACZ,EAAU,GACV,SACF,KACE,OACA,EAAY,GACZ,MACF,KACE,OACA,EAAY,GACZ,MACF,KAKE,MADA,EAAY,EAAM,UAAU,EAAe,GAC1B,GAAb,EAA8B,CAEhC,GADA,IAC+B,OAA3B,EAAU,cAAwB,CACpC,EAAU,GACV,QACF,CACA,EAAY,CACd,CACA,MACF,KAKE,MADA,EAAY,GAAY,EAAM,UAAU,EAAe,IACtC,GAAb,EAA8B,CAEhC,GADA,IAC+B,OAA3B,EAAU,cAAwB,CACpC,EAAU,GACV,QACF,CACA,EAAY,CACd,CACA,MACF,KACE,KAAU,GACV,IACA,SACF,KACE,KAAU,GACV,IACA,SACF,KACE,KAAU,GACV,IACA,SACF,KACE,KAAU,GACV,IACwB,MAApB,EAAM,KAER,EAAY,EACZ,EAAU,IAEZ,SACF,KAAK,GACH,EAAY,GACZ,EAAY,EAAM,UAAU,IAAiB,GAC7C,EAAU,GACV,MACF,KAAK,GACH,EAAY,GACZ,EAAY,EAAM,UAAU,IAAiB,GAC7C,EAAU,GACV,MACF,KACE,KAAY,EACZ,EAAU,GACV,IACA,SACF,KACE,KAAY,EACZ,EAAU,GACV,IACA,SACF,KAAK,GACH,EAAY,EACZ,EAAU,GACV,IACA,SACF,KAAK,GACH,EAAY,EACZ,EAAU,GACV,EAAe,IACf,SACF,KAAK,GACH,IACA,MACF,KAAK,GACH,GAAY,EACZ,MACF,KACE,KAAgB,IAChB,EAAU,GACV,SACF,KAAK,GACH,IAAkB,EAClB,EAAU,GACV,SACF,KAAK,GACH,IAAkB,EAClB,EAAU,GACV,SACF,KACE,KAAY,EACZ,EAAY,GAAY,EAAM,UAAU,EAAe,IACvD,IACA,MACF,KACE,OACA,MACF,KACE,KAAU,GACV,IACA,SACF,KACE,KAAU,GACV,IACA,SACF,QAEE,GA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EAAK,aAAa,eAAgB,GAClC,EAAK,aAAa,OAAQ,QACnB,CACT,CAMO,IAAK,GACV,OAAA,SAAW,WACX,EAAA,UAAY,YACZ,EAAA,YAAc,cACd,EAAA,aAAe,eAJL,GACV,KADU,CAUL,GA0DK,QACV,EAAA,IAAM,MACN,EAAA,OAAS,SACT,EAAA,KAAO,OACP,EAAA,MAAQ,QAJE,IAAA,IAAA,IAkKL,IAAM,SACX,IAgBM,EAAQ,CACZ,SACA,UACA,gBACA,iBACA,UACA,WACA,UACA,WACA,mBACA,mBACA,mBACA,mBACA,4BACA,6BACA,gCACA,+BACA,+BACA,6BACA,6BACA,2BACA,gBACA,iBAEF,MAxCc,CACZ,OACA,QACA,MACA,SACA,SACA,QACA,QACA,MACA,cACA,YACA,eACA,aACA,SACA,WA0BI,SAAS,IACb,EAAM,UAAU,QAChB,EAAM,WAAW,QACjB,EAAM,UAAU,cAChB,EAAM,UAAU,cAChB,EAAM,UAAU,aAAgB,IAE3B,CACT,EAjDa,GAgFA,GAA+D,CAC1E,kBAAmB,CACjB,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BAAgC,MAElC,WAAY,CACV,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BACE,SAEJ,aAAc,CACZ,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BACE,UAEJ,YAAa,CACX,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BAAgC,OAElC,mBAAoB,CAClB,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BAAgC,MAElC,YAAa,CACX,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BACE,SAEJ,eAAgB,CACd,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BACE,UAEJ,eAAgB,CACd,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BAAgC,OAElC,sBAAuB,CACrB,MAAO,EACP,cACA,iBACA,kBACA,mBACA,+BAAgC,MAElC,eAAgB,CACd,MAAO,GACP,cACA,iBACA,kBACA,mBACA,+BAAgC,OAElC,gBAAiB,CACf,MAAO,GACP,cACA,iBACA,kBACA,mBACA,+BACE,U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","file":"/npm/@vivliostyle/viewer@2.40.0/lib/js/vivliostyle-viewer.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@vivliostyle/viewer@2.40.0/lib/js/vivliostyle-viewer.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*!\n * Knockout JavaScript library v3.5.1\n * (c) The Knockout.js team - http://knockoutjs.com/\n * License: MIT (http://www.opensource.org/licenses/mit-license.php)\n */\n\n(function() {(function(n){var A=this||(0,eval)(\"this\"),w=A.document,R=A.navigator,v=A.jQuery,H=A.JSON;v||\"undefined\"===typeof jQuery||(v=jQuery);(function(n){\"function\"===typeof define&&define.amd?define([\"exports\",\"require\"],n):\"object\"===typeof exports&&\"object\"===typeof module?n(module.exports||exports):n(A.ko={})})(function(S,T){function K(a,c){return null===a||typeof a in W?a===c:!1}function X(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function Y(b,c){var d;return function(){clearTimeout(d);\nd=a.a.setTimeout(b,c)}}function Z(a,c){c&&\"change\"!==c?\"beforeChange\"===c?this.pc(a):this.gb(a,c):this.qc(a)}function aa(a,c){null!==c&&c.s&&c.s()}function ba(a,c){var d=this.qd,e=d[r];e.ra||(this.Qb&&this.mb[c]?(d.uc(c,a,this.mb[c]),this.mb[c]=null,--this.Qb):e.I[c]||d.uc(c,a,e.J?{da:a}:d.$c(a)),a.Ja&&a.gd())}var a=\"undefined\"!==typeof S?S:{};a.b=function(b,c){for(var d=b.split(\".\"),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.L=function(a,c,d){a[c]=d};a.version=\"3.5.1\";a.b(\"version\",\na.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1};a.a=function(){function b(a,b){for(var c in a)f.call(a,c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)f.call(b,c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var l=b[c].match(q)||[];a.a.D(d.match(q),function(b){a.a.Na(l,b,e)});b[c]=l.join(\" \")}var f=Object.prototype.hasOwnProperty,g={__proto__:[]}instanceof Array,h=\"function\"===typeof Symbol,m={},k={};m[R&&/Firefox\\/2/i.test(R.userAgent)?\n\"KeyboardEvent\":\"UIEvents\"]=[\"keyup\",\"keydown\",\"keypress\"];m.MouseEvents=\"click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave\".split(\" \");b(m,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)k[b[c]]=a});var l={propertychange:!0},p=w&&function(){for(var a=3,b=w.createElement(\"div\"),c=b.getElementsByTagName(\"i\");b.innerHTML=\"\\x3c!--[if gt IE \"+ ++a+\"]><i></i><![endif]--\\x3e\",c[0];);return 4<a?a:n}(),q=/\\S+/g,t;return{Jc:[\"authenticity_token\",/^__RequestVerificationToken(_.*)?$/],\nD:function(a,b,c){for(var d=0,e=a.length;d<e;d++)b.call(c,a[d],d,a)},A:\"function\"==typeof Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Lb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d,a))return a[d];return n},Pa:function(b,c){var d=a.a.A(b,c);0<d?b.splice(d,1):0===d&&b.shift()},wc:function(b){var c=[];b&&a.a.D(b,function(b){0>a.a.A(c,b)&&c.push(b)});return c},Mb:function(a,\nb,c){var d=[];if(a)for(var e=0,l=a.length;e<l;e++)d.push(b.call(c,a[e],e));return d},jb:function(a,b,c){var d=[];if(a)for(var e=0,l=a.length;e<l;e++)b.call(c,a[e],e)&&d.push(a[e]);return d},Nb:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},Na:function(b,c,d){var e=a.a.A(a.a.bc(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},Ba:g,extend:c,setPrototypeOf:d,Ab:g?d:c,P:b,Ga:function(a,b,c){if(!a)return a;var d={},e;for(e in a)f.call(a,e)&&(d[e]=\nb.call(c,a[e],e,a));return d},Tb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},Yb:function(b){b=a.a.la(b);for(var c=(b[0]&&b[0].ownerDocument||w).createElement(\"div\"),d=0,e=b.length;d<e;d++)c.appendChild(a.oa(b[d]));return c},Ca:function(b,c){for(var d=0,e=b.length,l=[];d<e;d++){var k=b[d].cloneNode(!0);l.push(c?a.oa(k):k)}return l},va:function(b,c){a.a.Tb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},Xc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],\nl=e.parentNode,k=0,f=c.length;k<f;k++)l.insertBefore(c[k],e);k=0;for(f=d.length;k<f;k++)a.removeNode(d[k])}},Ua:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},Zc:function(a,b){7>p?a.setAttribute(\"selected\",b):a.selected=b},Db:function(a){return null===a||a===n?\"\":a.trim?\na.trim():a.toString().replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")},Ud:function(a,b){a=a||\"\";return b.length>a.length?!1:a.substring(0,b.length)===b},vd:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(1!==a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},Sb:function(b){return a.a.vd(b,b.ownerDocument.documentElement)},kd:function(b){return!!a.a.Lb(b,a.a.Sb)},R:function(a){return a&&\na.tagName&&a.tagName.toLowerCase()},Ac:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Ac(b),c)},Gc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},B:function(b,c,d){var e=a.a.Ac(d);d=l[c];if(a.options.useOnlyNativeEvents||d||!v)if(d||\"function\"!=typeof b.addEventListener)if(\"undefined\"!=typeof b.attachEvent){var k=function(a){e.call(b,a)},f=\"on\"+c;b.attachEvent(f,\nk);a.a.K.za(b,function(){b.detachEvent(f,k)})}else throw Error(\"Browser doesn't support addEventListener or attachEvent\");else b.addEventListener(c,e,!1);else t||(t=\"function\"==typeof v(b).on?\"on\":\"bind\"),v(b)[t](c,e)},Fb:function(b,c){if(!b||!b.nodeType)throw Error(\"element must be a DOM node when calling triggerEvent\");var d;\"input\"===a.a.R(b)&&b.type&&\"click\"==c.toLowerCase()?(d=b.type,d=\"checkbox\"==d||\"radio\"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if(\"function\"==typeof w.createEvent)if(\"function\"==\ntypeof b.dispatchEvent)d=w.createEvent(k[c]||\"HTMLEvents\"),d.initEvent(c,!0,!0,A,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error(\"The supplied element doesn't support dispatchEvent\");else if(d&&b.click)b.click();else if(\"undefined\"!=typeof b.fireEvent)b.fireEvent(\"on\"+c);else throw Error(\"Browser doesn't support triggering events\");else v(b).trigger(c)},f:function(b){return a.O(b)?b():b},bc:function(b){return a.O(b)?b.v():b},Eb:function(b,c,d){var l;c&&(\"object\"===typeof b.classList?\n(l=b.classList[d?\"add\":\"remove\"],a.a.D(c.match(q),function(a){l.call(b.classList,a)})):\"string\"===typeof b.className.baseVal?e(b.className,\"baseVal\",c,d):e(b,\"className\",c,d))},Bb:function(b,c){var d=a.a.f(c);if(null===d||d===n)d=\"\";var e=a.h.firstChild(b);!e||3!=e.nodeType||a.h.nextSibling(e)?a.h.va(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Ad(b)},Yc:function(a,b){a.name=b;if(7>=p)try{var c=a.name.replace(/[&<>'\"]/g,function(a){return\"&#\"+a.charCodeAt(0)+\";\"});a.mergeAttributes(w.createElement(\"<input name='\"+\nc+\"'/>\"),!1)}catch(d){}},Ad:function(a){9<=p&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},wd:function(a){if(p){var b=a.style.width;a.style.width=0;a.style.width=b}},Pd:function(b,c){b=a.a.f(b);c=a.a.f(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},la:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Da:function(a){return h?Symbol(a):a},Zd:6===p,$d:7===p,W:p,Lc:function(b,c){for(var d=a.a.la(b.getElementsByTagName(\"input\")).concat(a.a.la(b.getElementsByTagName(\"textarea\"))),\ne=\"string\"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},l=[],k=d.length-1;0<=k;k--)e(d[k])&&l.push(d[k]);return l},Nd:function(b){return\"string\"==typeof b&&(b=a.a.Db(b))?H&&H.parse?H.parse(b):(new Function(\"return \"+b))():null},hc:function(b,c,d){if(!H||!H.stringify)throw Error(\"Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js\");\nreturn H.stringify(a.a.f(b),c,d)},Od:function(c,d,e){e=e||{};var l=e.params||{},k=e.includeFields||this.Jc,f=c;if(\"object\"==typeof c&&\"form\"===a.a.R(c))for(var f=c.action,h=k.length-1;0<=h;h--)for(var g=a.a.Lc(c,k[h]),m=g.length-1;0<=m;m--)l[g[m].name]=g[m].value;d=a.a.f(d);var p=w.createElement(\"form\");p.style.display=\"none\";p.action=f;p.method=\"post\";for(var q in d)c=w.createElement(\"input\"),c.type=\"hidden\",c.name=q,c.value=a.a.hc(a.a.f(d[q])),p.appendChild(c);b(l,function(a,b){var c=w.createElement(\"input\");\nc.type=\"hidden\";c.name=a;c.value=b;p.appendChild(c)});w.body.appendChild(p);e.submitter?e.submitter(p):p.submit();setTimeout(function(){p.parentNode.removeChild(p)},0)}}}();a.b(\"utils\",a.a);a.b(\"utils.arrayForEach\",a.a.D);a.b(\"utils.arrayFirst\",a.a.Lb);a.b(\"utils.arrayFilter\",a.a.jb);a.b(\"utils.arrayGetDistinctValues\",a.a.wc);a.b(\"utils.arrayIndexOf\",a.a.A);a.b(\"utils.arrayMap\",a.a.Mb);a.b(\"utils.arrayPushAll\",a.a.Nb);a.b(\"utils.arrayRemoveItem\",a.a.Pa);a.b(\"utils.cloneNodes\",a.a.Ca);a.b(\"utils.createSymbolOrString\",\na.a.Da);a.b(\"utils.extend\",a.a.extend);a.b(\"utils.fieldsIncludedWithJsonPost\",a.a.Jc);a.b(\"utils.getFormFields\",a.a.Lc);a.b(\"utils.objectMap\",a.a.Ga);a.b(\"utils.peekObservable\",a.a.bc);a.b(\"utils.postJson\",a.a.Od);a.b(\"utils.parseJson\",a.a.Nd);a.b(\"utils.registerEventHandler\",a.a.B);a.b(\"utils.stringifyJson\",a.a.hc);a.b(\"utils.range\",a.a.Pd);a.b(\"utils.toggleDomNodeCssClass\",a.a.Eb);a.b(\"utils.triggerEvent\",a.a.Fb);a.b(\"utils.unwrapObservable\",a.a.f);a.b(\"utils.objectForEach\",a.a.P);a.b(\"utils.addOrRemoveItem\",\na.a.Na);a.b(\"utils.setTextContent\",a.a.Bb);a.b(\"unwrap\",a.a.f);Function.prototype.bind||(Function.prototype.bind=function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.g=new function(){var b=0,c=\"__ko__\"+(new Date).getTime(),d={},e,f;a.a.W?(e=function(a,e){var f=a[c];if(!f||\"null\"===f||!d[f]){if(!e)return n;f=a[c]=\"ko\"+b++;d[f]=\n{}}return d[f]},f=function(a){var b=a[c];return b?(delete d[b],a[c]=null,!0):!1}):(e=function(a,b){var d=a[c];!d&&b&&(d=a[c]={});return d},f=function(a){return a[c]?(delete a[c],!0):!1});return{get:function(a,b){var c=e(a,!1);return c&&c[b]},set:function(a,b,c){(a=e(a,c!==n))&&(a[b]=c)},Ub:function(a,b,c){a=e(a,!0);return a[b]||(a[b]=c)},clear:f,Z:function(){return b++ +c}}};a.b(\"utils.domData\",a.a.g);a.b(\"utils.domData.clear\",a.a.g.clear);a.a.K=new function(){function b(b,c){var d=a.a.g.get(b,e);\nd===n&&c&&(d=[],a.a.g.set(b,e,d));return d}function c(c){var e=b(c,!1);if(e)for(var e=e.slice(0),k=0;k<e.length;k++)e[k](c);a.a.g.clear(c);a.a.K.cleanExternalData(c);g[c.nodeType]&&d(c.childNodes,!0)}function d(b,d){for(var e=[],l,f=0;f<b.length;f++)if(!d||8===b[f].nodeType)if(c(e[e.length]=l=b[f]),b[f]!==l)for(;f--&&-1==a.a.A(e,b[f]););}var e=a.a.g.Z(),f={1:!0,8:!0,9:!0},g={1:!0,9:!0};return{za:function(a,c){if(\"function\"!=typeof c)throw Error(\"Callback must be a function\");b(a,!0).push(c)},yb:function(c,\nd){var f=b(c,!1);f&&(a.a.Pa(f,d),0==f.length&&a.a.g.set(c,e,n))},oa:function(b){a.u.G(function(){f[b.nodeType]&&(c(b),g[b.nodeType]&&d(b.getElementsByTagName(\"*\")))});return b},removeNode:function(b){a.oa(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&\"function\"==typeof v.cleanData&&v.cleanData([a])}}};a.oa=a.a.K.oa;a.removeNode=a.a.K.removeNode;a.b(\"cleanNode\",a.oa);a.b(\"removeNode\",a.removeNode);a.b(\"utils.domNodeDisposal\",a.a.K);a.b(\"utils.domNodeDisposal.addDisposeCallback\",\na.a.K.za);a.b(\"utils.domNodeDisposal.removeDisposeCallback\",a.a.K.yb);(function(){var b=[0,\"\",\"\"],c=[1,\"<table>\",\"</table>\"],d=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],e=[1,\"<select multiple='multiple'>\",\"</select>\"],f={thead:c,tbody:c,tfoot:c,tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:d,th:d,option:e,optgroup:e},g=8>=a.a.W;a.a.ua=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var l=e[0];l.parentNode&&11!==l.parentNode.nodeType;)l=l.parentNode;\nl.parentNode&&l.parentNode.removeChild(l)}}else{(e=d)||(e=w);var l=e.parentWindow||e.defaultView||A,p=a.a.Db(c).toLowerCase(),q=e.createElement(\"div\"),t;t=(p=p.match(/^(?:\\x3c!--.*?--\\x3e\\s*?)*?<([a-z]+)[\\s>]/))&&f[p[1]]||b;p=t[0];t=\"ignored<div>\"+t[1]+c+t[2]+\"</div>\";\"function\"==typeof l.innerShiv?q.appendChild(l.innerShiv(t)):(g&&e.body.appendChild(q),q.innerHTML=t,g&&q.parentNode.removeChild(q));for(;p--;)q=q.lastChild;e=a.a.la(q.lastChild.childNodes)}return e};a.a.Md=function(b,c){var d=a.a.ua(b,\nc);return d.length&&d[0].parentElement||a.a.Yb(d)};a.a.fc=function(b,c){a.a.Tb(b);c=a.a.f(c);if(null!==c&&c!==n)if(\"string\"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ua(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b(\"utils.parseHtmlFragment\",a.a.ua);a.b(\"utils.setHtml\",a.a.fc);a.aa=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.aa.Uc(c.nodeValue);null!=f&&e.push({ud:c,Kd:f})}else if(1==c.nodeType)for(var f=0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],\ne)}var c={};return{Xb:function(a){if(\"function\"!=typeof a)throw Error(\"You can only pass a function to ko.memoization.memoize()\");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return\"\\x3c!--[ko_memo:\"+b+\"]--\\x3e\"},bd:function(a,b){var f=c[a];if(f===n)throw Error(\"Couldn't find any memo with ID \"+a+\". Perhaps it's already been unmemoized.\");try{return f.apply(null,b||[]),!0}finally{delete c[a]}},cd:function(c,e){var f=\n[];b(c,f);for(var g=0,h=f.length;g<h;g++){var m=f[g].ud,k=[m];e&&a.a.Nb(k,e);a.aa.bd(f[g].Kd,k);m.nodeValue=\"\";m.parentNode&&m.parentNode.removeChild(m)}},Uc:function(a){return(a=a.match(/^\\[ko_memo\\:(.*?)\\]$/))?a[1]:null}}}();a.b(\"memoization\",a.aa);a.b(\"memoization.memoize\",a.aa.Xb);a.b(\"memoization.unmemoize\",a.aa.bd);a.b(\"memoization.parseMemoText\",a.aa.Uc);a.b(\"memoization.unmemoizeDomNodeAndDescendants\",a.aa.cd);a.na=function(){function b(){if(f)for(var b=f,c=0,d;h<f;)if(d=e[h++]){if(h>b){if(5E3<=\n++c){h=f;a.a.Gc(Error(\"'Too much recursion' after processing \"+c+\" task groups.\"));break}b=f}try{d()}catch(p){a.a.Gc(p)}}}function c(){b();h=f=e.length=0}var d,e=[],f=0,g=1,h=0;A.MutationObserver?d=function(a){var b=w.createElement(\"div\");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle(\"foo\")}}(c):d=w&&\"onreadystatechange\"in w.createElement(\"script\")?function(a){var b=w.createElement(\"script\");b.onreadystatechange=function(){b.onreadystatechange=null;w.documentElement.removeChild(b);\nb=null;a()};w.documentElement.appendChild(b)}:function(a){setTimeout(a,0)};return{scheduler:d,zb:function(b){f||a.na.scheduler(c);e[f++]=b;return g++},cancel:function(a){a=a-(g-f);a>=h&&a<f&&(e[a]=null)},resetForTesting:function(){var a=f-h;h=f=e.length=0;return a},Sd:b}}();a.b(\"tasks\",a.na);a.b(\"tasks.schedule\",a.na.zb);a.b(\"tasks.runEarly\",a.na.Sd);a.Ta={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.$({read:b,write:function(e){clearTimeout(d);d=a.a.setTimeout(function(){b(e)},\nc)}})},rateLimit:function(a,c){var d,e,f;\"number\"==typeof c?d=c:(d=c.timeout,e=c.method);a.Hb=!1;f=\"function\"==typeof e?e:\"notifyWhenChangesStop\"==e?Y:X;a.ub(function(a){return f(a,d,c)})},deferred:function(b,c){if(!0!==c)throw Error(\"The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.\");b.Hb||(b.Hb=!0,b.ub(function(c){var e,f=!1;return function(){if(!f){a.na.cancel(e);e=a.na.zb(c);try{f=!0,b.notifySubscribers(n,\"dirty\")}finally{f=\n!1}}}}))},notify:function(a,c){a.equalityComparer=\"always\"==c?null:K}};var W={undefined:1,\"boolean\":1,number:1,string:1};a.b(\"extenders\",a.Ta);a.ic=function(b,c,d){this.da=b;this.lc=c;this.mc=d;this.Ib=!1;this.fb=this.Jb=null;a.L(this,\"dispose\",this.s);a.L(this,\"disposeWhenNodeIsRemoved\",this.l)};a.ic.prototype.s=function(){this.Ib||(this.fb&&a.a.K.yb(this.Jb,this.fb),this.Ib=!0,this.mc(),this.da=this.lc=this.mc=this.Jb=this.fb=null)};a.ic.prototype.l=function(b){this.Jb=b;a.a.K.za(b,this.fb=this.s.bind(this))};\na.T=function(){a.a.Ab(this,D);D.qb(this)};var D={qb:function(a){a.U={change:[]};a.sc=1},subscribe:function(b,c,d){var e=this;d=d||\"change\";var f=new a.ic(e,c?b.bind(c):b,function(){a.a.Pa(e.U[d],f);e.hb&&e.hb(d)});e.Qa&&e.Qa(d);e.U[d]||(e.U[d]=[]);e.U[d].push(f);return f},notifySubscribers:function(b,c){c=c||\"change\";\"change\"===c&&this.Gb();if(this.Wa(c)){var d=\"change\"===c&&this.ed||this.U[c].slice(0);try{a.u.xc();for(var e=0,f;f=d[e];++e)f.Ib||f.lc(b)}finally{a.u.end()}}},ob:function(){return this.sc},\nDd:function(a){return this.ob()!==a},Gb:function(){++this.sc},ub:function(b){var c=this,d=a.O(c),e,f,g,h,m;c.gb||(c.gb=c.notifySubscribers,c.notifySubscribers=Z);var k=b(function(){c.Ja=!1;d&&h===c&&(h=c.nc?c.nc():c());var a=f||m&&c.sb(g,h);m=f=e=!1;a&&c.gb(g=h)});c.qc=function(a,b){b&&c.Ja||(m=!b);c.ed=c.U.change.slice(0);c.Ja=e=!0;h=a;k()};c.pc=function(a){e||(g=a,c.gb(a,\"beforeChange\"))};c.rc=function(){m=!0};c.gd=function(){c.sb(g,c.v(!0))&&(f=!0)}},Wa:function(a){return this.U[a]&&this.U[a].length},\nBd:function(b){if(b)return this.U[b]&&this.U[b].length||0;var c=0;a.a.P(this.U,function(a,b){\"dirty\"!==a&&(c+=b.length)});return c},sb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},toString:function(){return\"[object Object]\"},extend:function(b){var c=this;b&&a.a.P(b,function(b,e){var f=a.Ta[b];\"function\"==typeof f&&(c=f(c,e)||c)});return c}};a.L(D,\"init\",D.qb);a.L(D,\"subscribe\",D.subscribe);a.L(D,\"extend\",D.extend);a.L(D,\"getSubscriptionsCount\",D.Bd);a.a.Ba&&a.a.setPrototypeOf(D,\nFunction.prototype);a.T.fn=D;a.Qc=function(a){return null!=a&&\"function\"==typeof a.subscribe&&\"function\"==typeof a.notifySubscribers};a.b(\"subscribable\",a.T);a.b(\"isSubscribable\",a.Qc);a.S=a.u=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{xc:b,end:c,cc:function(b){if(e){if(!a.Qc(b))throw Error(\"Only subscribable things can act as dependencies\");e.od.call(e.pd,b,b.fd||(b.fd=++f))}},G:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},qa:function(){if(e)return e.o.qa()},\nVa:function(){if(e)return e.o.Va()},Ya:function(){if(e)return e.Ya},o:function(){if(e)return e.o}}}();a.b(\"computedContext\",a.S);a.b(\"computedContext.getDependenciesCount\",a.S.qa);a.b(\"computedContext.getDependencies\",a.S.Va);a.b(\"computedContext.isInitial\",a.S.Ya);a.b(\"computedContext.registerDependency\",a.S.cc);a.b(\"ignoreDependencies\",a.Yd=a.u.G);var I=a.a.Da(\"_latestValue\");a.ta=function(b){function c(){if(0<arguments.length)return c.sb(c[I],arguments[0])&&(c.ya(),c[I]=arguments[0],c.xa()),this;\na.u.cc(c);return c[I]}c[I]=b;a.a.Ba||a.a.extend(c,a.T.fn);a.T.fn.qb(c);a.a.Ab(c,F);a.options.deferUpdates&&a.Ta.deferred(c,!0);return c};var F={equalityComparer:K,v:function(){return this[I]},xa:function(){this.notifySubscribers(this[I],\"spectate\");this.notifySubscribers(this[I])},ya:function(){this.notifySubscribers(this[I],\"beforeChange\")}};a.a.Ba&&a.a.setPrototypeOf(F,a.T.fn);var G=a.ta.Ma=\"__ko_proto__\";F[G]=a.ta;a.O=function(b){if((b=\"function\"==typeof b&&b[G])&&b!==F[G]&&b!==a.o.fn[G])throw Error(\"Invalid object that looks like an observable; possibly from another Knockout instance\");\nreturn!!b};a.Za=function(b){return\"function\"==typeof b&&(b[G]===F[G]||b[G]===a.o.fn[G]&&b.Nc)};a.b(\"observable\",a.ta);a.b(\"isObservable\",a.O);a.b(\"isWriteableObservable\",a.Za);a.b(\"isWritableObservable\",a.Za);a.b(\"observable.fn\",F);a.L(F,\"peek\",F.v);a.L(F,\"valueHasMutated\",F.xa);a.L(F,\"valueWillMutate\",F.ya);a.Ha=function(b){b=b||[];if(\"object\"!=typeof b||!(\"length\"in b))throw Error(\"The argument passed when initializing an observable array must be an array, or null, or undefined.\");b=a.ta(b);a.a.Ab(b,\na.Ha.fn);return b.extend({trackArrayChanges:!0})};a.Ha.fn={remove:function(b){for(var c=this.v(),d=[],e=\"function\"!=typeof b||a.O(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];if(e(g)){0===d.length&&this.ya();if(c[f]!==g)throw Error(\"Array modified during remove; cannot remove item\");d.push(g);c.splice(f,1);f--}}d.length&&this.xa();return d},removeAll:function(b){if(b===n){var c=this.v(),d=c.slice(0);this.ya();c.splice(0,c.length);this.xa();return d}return b?this.remove(function(c){return 0<=\na.a.A(b,c)}):[]},destroy:function(b){var c=this.v(),d=\"function\"!=typeof b||a.O(b)?function(a){return a===b}:b;this.ya();for(var e=c.length-1;0<=e;e--){var f=c[e];d(f)&&(f._destroy=!0)}this.xa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.A(b,c)}):[]},indexOf:function(b){var c=this();return a.a.A(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ya(),this.v()[d]=c,this.xa())},sorted:function(a){var c=this().slice(0);\nreturn a?c.sort(a):c.sort()},reversed:function(){return this().slice(0).reverse()}};a.a.Ba&&a.a.setPrototypeOf(a.Ha.fn,a.ta.fn);a.a.D(\"pop push reverse shift sort splice unshift\".split(\" \"),function(b){a.Ha.fn[b]=function(){var a=this.v();this.ya();this.zc(a,b,arguments);var d=a[b].apply(a,arguments);this.xa();return d===a?this:d}});a.a.D([\"slice\"],function(b){a.Ha.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.Pc=function(b){return a.O(b)&&\"function\"==typeof b.remove&&\"function\"==\ntypeof b.push};a.b(\"observableArray\",a.Ha);a.b(\"isObservableArray\",a.Pc);a.Ta.trackArrayChanges=function(b,c){function d(){function c(){if(m){var d=[].concat(b.v()||[]),e;if(b.Wa(\"arrayChange\")){if(!f||1<m)f=a.a.Pb(k,d,b.Ob);e=f}k=d;f=null;m=0;e&&e.length&&b.notifySubscribers(e,\"arrayChange\")}}e?c():(e=!0,h=b.subscribe(function(){++m},null,\"spectate\"),k=[].concat(b.v()||[]),f=null,g=b.subscribe(c))}b.Ob={};c&&\"object\"==typeof c&&a.a.extend(b.Ob,c);b.Ob.sparse=!0;if(!b.zc){var e=!1,f=null,g,h,m=0,\nk,l=b.Qa,p=b.hb;b.Qa=function(a){l&&l.call(b,a);\"arrayChange\"===a&&d()};b.hb=function(a){p&&p.call(b,a);\"arrayChange\"!==a||b.Wa(\"arrayChange\")||(g&&g.s(),h&&h.s(),h=g=null,e=!1,k=n)};b.zc=function(b,c,d){function l(a,b,c){return k[k.length]={status:a,value:b,index:c}}if(e&&!m){var k=[],p=b.length,g=d.length,h=0;switch(c){case \"push\":h=p;case \"unshift\":for(c=0;c<g;c++)l(\"added\",d[c],h+c);break;case \"pop\":h=p-1;case \"shift\":p&&l(\"deleted\",b[h],h);break;case \"splice\":c=Math.min(Math.max(0,0>d[0]?p+d[0]:\nd[0]),p);for(var p=1===g?p:Math.min(c+(d[1]||0),p),g=c+g-2,h=Math.max(p,g),U=[],L=[],n=2;c<h;++c,++n)c<p&&L.push(l(\"deleted\",b[c],c)),c<g&&U.push(l(\"added\",d[n],c));a.a.Kc(L,U);break;default:return}f=k}}}};var r=a.a.Da(\"_state\");a.o=a.$=function(b,c,d){function e(){if(0<arguments.length){if(\"function\"===typeof f)f.apply(g.nb,arguments);else throw Error(\"Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.\");return this}g.ra||\na.u.cc(e);(g.ka||g.J&&e.Xa())&&e.ha();return g.X}\"object\"===typeof b?d=b:(d=d||{},b&&(d.read=b));if(\"function\"!=typeof d.read)throw Error(\"Pass a function that returns the value of the ko.computed\");var f=d.write,g={X:n,sa:!0,ka:!0,rb:!1,jc:!1,ra:!1,wb:!1,J:!1,Wc:d.read,nb:c||d.owner,l:d.disposeWhenNodeIsRemoved||d.l||null,Sa:d.disposeWhen||d.Sa,Rb:null,I:{},V:0,Ic:null};e[r]=g;e.Nc=\"function\"===typeof f;a.a.Ba||a.a.extend(e,a.T.fn);a.T.fn.qb(e);a.a.Ab(e,C);d.pure?(g.wb=!0,g.J=!0,a.a.extend(e,da)):\nd.deferEvaluation&&a.a.extend(e,ea);a.options.deferUpdates&&a.Ta.deferred(e,!0);g.l&&(g.jc=!0,g.l.nodeType||(g.l=null));g.J||d.deferEvaluation||e.ha();g.l&&e.ja()&&a.a.K.za(g.l,g.Rb=function(){e.s()});return e};var C={equalityComparer:K,qa:function(){return this[r].V},Va:function(){var b=[];a.a.P(this[r].I,function(a,d){b[d.Ka]=d.da});return b},Vb:function(b){if(!this[r].V)return!1;var c=this.Va();return-1!==a.a.A(c,b)?!0:!!a.a.Lb(c,function(a){return a.Vb&&a.Vb(b)})},uc:function(a,c,d){if(this[r].wb&&\nc===this)throw Error(\"A 'pure' computed must not be called recursively\");this[r].I[a]=d;d.Ka=this[r].V++;d.La=c.ob()},Xa:function(){var a,c,d=this[r].I;for(a in d)if(Object.prototype.hasOwnProperty.call(d,a)&&(c=d[a],this.Ia&&c.da.Ja||c.da.Dd(c.La)))return!0},Jd:function(){this.Ia&&!this[r].rb&&this.Ia(!1)},ja:function(){var a=this[r];return a.ka||0<a.V},Rd:function(){this.Ja?this[r].ka&&(this[r].sa=!0):this.Hc()},$c:function(a){if(a.Hb){var c=a.subscribe(this.Jd,this,\"dirty\"),d=a.subscribe(this.Rd,\nthis);return{da:a,s:function(){c.s();d.s()}}}return a.subscribe(this.Hc,this)},Hc:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[r].Ic),this[r].Ic=a.a.setTimeout(function(){b.ha(!0)},c)):b.Ia?b.Ia(!0):b.ha(!0)},ha:function(b){var c=this[r],d=c.Sa,e=!1;if(!c.rb&&!c.ra){if(c.l&&!a.a.Sb(c.l)||d&&d()){if(!c.jc){this.s();return}}else c.jc=!1;c.rb=!0;try{e=this.zd(b)}finally{c.rb=!1}return e}},zd:function(b){var c=this[r],d=!1,e=c.wb?n:!c.V,d={qd:this,mb:c.I,Qb:c.V};a.u.xc({pd:d,\nod:ba,o:this,Ya:e});c.I={};c.V=0;var f=this.yd(c,d);c.V?d=this.sb(c.X,f):(this.s(),d=!0);d&&(c.J?this.Gb():this.notifySubscribers(c.X,\"beforeChange\"),c.X=f,this.notifySubscribers(c.X,\"spectate\"),!c.J&&b&&this.notifySubscribers(c.X),this.rc&&this.rc());e&&this.notifySubscribers(c.X,\"awake\");return d},yd:function(b,c){try{var d=b.Wc;return b.nb?d.call(b.nb):d()}finally{a.u.end(),c.Qb&&!b.J&&a.a.P(c.mb,aa),b.sa=b.ka=!1}},v:function(a){var c=this[r];(c.ka&&(a||!c.V)||c.J&&this.Xa())&&this.ha();return c.X},\nub:function(b){a.T.fn.ub.call(this,b);this.nc=function(){this[r].J||(this[r].sa?this.ha():this[r].ka=!1);return this[r].X};this.Ia=function(a){this.pc(this[r].X);this[r].ka=!0;a&&(this[r].sa=!0);this.qc(this,!a)}},s:function(){var b=this[r];!b.J&&b.I&&a.a.P(b.I,function(a,b){b.s&&b.s()});b.l&&b.Rb&&a.a.K.yb(b.l,b.Rb);b.I=n;b.V=0;b.ra=!0;b.sa=!1;b.ka=!1;b.J=!1;b.l=n;b.Sa=n;b.Wc=n;this.Nc||(b.nb=n)}},da={Qa:function(b){var c=this,d=c[r];if(!d.ra&&d.J&&\"change\"==b){d.J=!1;if(d.sa||c.Xa())d.I=null,d.V=\n0,c.ha()&&c.Gb();else{var e=[];a.a.P(d.I,function(a,b){e[b.Ka]=a});a.a.D(e,function(a,b){var e=d.I[a],m=c.$c(e.da);m.Ka=b;m.La=e.La;d.I[a]=m});c.Xa()&&c.ha()&&c.Gb()}d.ra||c.notifySubscribers(d.X,\"awake\")}},hb:function(b){var c=this[r];c.ra||\"change\"!=b||this.Wa(\"change\")||(a.a.P(c.I,function(a,b){b.s&&(c.I[a]={da:b.da,Ka:b.Ka,La:b.La},b.s())}),c.J=!0,this.notifySubscribers(n,\"asleep\"))},ob:function(){var b=this[r];b.J&&(b.sa||this.Xa())&&this.ha();return a.T.fn.ob.call(this)}},ea={Qa:function(a){\"change\"!=\na&&\"beforeChange\"!=a||this.v()}};a.a.Ba&&a.a.setPrototypeOf(C,a.T.fn);var N=a.ta.Ma;C[N]=a.o;a.Oc=function(a){return\"function\"==typeof a&&a[N]===C[N]};a.Fd=function(b){return a.Oc(b)&&b[r]&&b[r].wb};a.b(\"computed\",a.o);a.b(\"dependentObservable\",a.o);a.b(\"isComputed\",a.Oc);a.b(\"isPureComputed\",a.Fd);a.b(\"computed.fn\",C);a.L(C,\"peek\",C.v);a.L(C,\"dispose\",C.s);a.L(C,\"isActive\",C.ja);a.L(C,\"getDependenciesCount\",C.qa);a.L(C,\"getDependencies\",C.Va);a.xb=function(b,c){if(\"function\"===typeof b)return a.o(b,\nc,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.o(b,c)};a.b(\"pureComputed\",a.xb);(function(){function b(a,f,g){g=g||new d;a=f(a);if(\"object\"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case \"boolean\":case \"number\":case \"string\":case \"function\":h[c]=d;break;case \"object\":case \"undefined\":var l=g.get(d);h[c]=l!==\nn?l:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);\"function\"==typeof a.toJSON&&b(\"toJSON\")}else for(c in a)b(c)}function d(){this.keys=[];this.values=[]}a.ad=function(c){if(0==arguments.length)throw Error(\"When calling ko.toJS, pass the object you want to convert.\");return b(c,function(b){for(var c=0;a.O(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.ad(b);return a.a.hc(b,c,d)};d.prototype={constructor:d,save:function(b,c){var d=a.a.A(this.keys,\nb);0<=d?this.values[d]=c:(this.keys.push(b),this.values.push(c))},get:function(b){b=a.a.A(this.keys,b);return 0<=b?this.values[b]:n}}})();a.b(\"toJS\",a.ad);a.b(\"toJSON\",a.toJSON);a.Wd=function(b,c,d){function e(c){var e=a.xb(b,d).extend({ma:\"always\"}),h=e.subscribe(function(a){a&&(h.s(),c(a))});e.notifySubscribers(e.v());return h}return\"function\"!==typeof Promise||c?e(c.bind(d)):new Promise(e)};a.b(\"when\",a.Wd);(function(){a.w={M:function(b){switch(a.a.R(b)){case \"option\":return!0===b.__ko__hasDomDataOptionValue__?\na.a.g.get(b,a.c.options.$b):7>=a.a.W?b.getAttributeNode(\"value\")&&b.getAttributeNode(\"value\").specified?b.value:b.text:b.value;case \"select\":return 0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex]):n;default:return b.value}},cb:function(b,c,d){switch(a.a.R(b)){case \"option\":\"string\"===typeof c?(a.a.g.set(b,a.c.options.$b,n),\"__ko__hasDomDataOptionValue__\"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=c):(a.a.g.set(b,a.c.options.$b,c),b.__ko__hasDomDataOptionValue__=!0,b.value=\"number\"===\ntypeof c?c:\"\");break;case \"select\":if(\"\"===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.w.M(b.options[f]),h==c||\"\"===h&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e,6===a.a.W&&a.a.setTimeout(function(){b.selectedIndex=e},0);break;default:if(null===c||c===n)c=\"\";b.value=c}}}})();a.b(\"selectExtensions\",a.w);a.b(\"selectExtensions.readValue\",a.w.M);a.b(\"selectExtensions.writeValue\",a.w.cb);a.m=function(){function b(b){b=a.a.Db(b);123===b.charCodeAt(0)&&(b=b.slice(1,\n-1));b+=\"\\n,\";var c=[],d=b.match(e),p,q=[],h=0;if(1<d.length){for(var x=0,B;B=d[x];++x){var u=B.charCodeAt(0);if(44===u){if(0>=h){c.push(p&&q.length?{key:p,value:q.join(\"\")}:{unknown:p||q.join(\"\")});p=h=0;q=[];continue}}else if(58===u){if(!h&&!p&&1===q.length){p=q.pop();continue}}else if(47===u&&1<B.length&&(47===B.charCodeAt(1)||42===B.charCodeAt(1)))continue;else 47===u&&x&&1<B.length?(u=d[x-1].match(f))&&!g[u[0]]&&(b=b.substr(b.indexOf(B)+1),d=b.match(e),x=-1,B=\"/\"):40===u||123===u||91===u?++h:\n41===u||125===u||93===u?--h:p||q.length||34!==u&&39!==u||(B=B.slice(1,-1));q.push(B)}if(0<h)throw Error(\"Unbalanced parentheses, braces, or brackets\");}return c}var c=[\"true\",\"false\",\"null\",\"undefined\"],d=/^(?:[$_a-z][$\\w]*|(.+)(\\.\\s*[$_a-z][$\\w]*|\\[.+\\]))$/i,e=RegExp(\"\\\"(?:\\\\\\\\.|[^\\\"])*\\\"|'(?:\\\\\\\\.|[^'])*'|`(?:\\\\\\\\.|[^`])*`|/\\\\*(?:[^*]|\\\\*+[^*/])*\\\\*+/|//.*\\n|/(?:\\\\\\\\.|[^/])+/w*|[^\\\\s:,/][^,\\\"'`{}()/:[\\\\]]*[^\\\\s,\\\"'`{}()/:[\\\\]]|[^\\\\s]\",\"g\"),f=/[\\])\"'A-Za-z0-9_$]+$/,g={\"in\":1,\"return\":1,\"typeof\":1},\nh={};return{Ra:[],wa:h,ac:b,vb:function(e,f){function l(b,e){var f;if(!x){var k=a.getBindingHandler(b);if(k&&k.preprocess&&!(e=k.preprocess(e,b,l)))return;if(k=h[b])f=e,0<=a.a.A(c,f)?f=!1:(k=f.match(d),f=null===k?!1:k[1]?\"Object(\"+k[1]+\")\"+k[2]:f),k=f;k&&q.push(\"'\"+(\"string\"==typeof h[b]?h[b]:b)+\"':function(_z){\"+f+\"=_z}\")}g&&(e=\"function(){return \"+e+\" }\");p.push(\"'\"+b+\"':\"+e)}f=f||{};var p=[],q=[],g=f.valueAccessors,x=f.bindingParams,B=\"string\"===typeof e?b(e):e;a.a.D(B,function(a){l(a.key||a.unknown,\na.value)});q.length&&l(\"_ko_property_writers\",\"{\"+q.join(\",\")+\" }\");return p.join(\",\")},Id:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},eb:function(b,c,d,e,f){if(b&&a.O(b))!a.Za(b)||f&&b.v()===e||b(e);else if((b=c.get(\"_ko_property_writers\"))&&b[d])b[d](e)}}}();a.b(\"expressionRewriting\",a.m);a.b(\"expressionRewriting.bindingRewriteValidators\",a.m.Ra);a.b(\"expressionRewriting.parseObjectLiteral\",a.m.ac);a.b(\"expressionRewriting.preProcessBindings\",a.m.vb);a.b(\"expressionRewriting._twoWayBindings\",\na.m.wa);a.b(\"jsonExpressionRewriting\",a.m);a.b(\"jsonExpressionRewriting.insertPropertyAccessorsIntoJson\",a.m.vb);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(d,e){for(var f=d,h=1,g=[];f=f.nextSibling;){if(c(f)&&(a.a.g.set(f,k,!0),h--,0===h))return g;g.push(f);b(f)&&h++}if(!e)throw Error(\"Cannot find closing comment tag to match: \"+d.nodeValue);return null}function e(a,b){var c=d(a,b);return c?\n0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=w&&\"\\x3c!--test--\\x3e\"===w.createComment(\"test\").text,g=f?/^\\x3c!--\\s*ko(?:\\s+([\\s\\S]+))?\\s*--\\x3e$/:/^\\s*ko(?:\\s+([\\s\\S]+))?\\s*$/,h=f?/^\\x3c!--\\s*\\/ko\\s*--\\x3e$/:/^\\s*\\/ko\\s*$/,m={ul:!0,ol:!0},k=\"__ko_matchedEndComment__\";a.h={ea:{},childNodes:function(a){return b(a)?d(a):a.childNodes},Ea:function(c){if(b(c)){c=a.h.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.Tb(c)},va:function(c,d){if(b(c)){a.h.Ea(c);for(var e=\nc.nextSibling,f=0,k=d.length;f<k;f++)e.parentNode.insertBefore(d[f],e)}else a.a.va(c,d)},Vc:function(a,c){var d;b(a)?(d=a.nextSibling,a=a.parentNode):d=a.firstChild;d?c!==d&&a.insertBefore(c,d):a.appendChild(c)},Wb:function(c,d,e){e?(e=e.nextSibling,b(c)&&(c=c.parentNode),e?d!==e&&c.insertBefore(d,e):c.appendChild(d)):a.h.Vc(c,d)},firstChild:function(a){if(b(a))return!a.nextSibling||c(a.nextSibling)?null:a.nextSibling;if(a.firstChild&&c(a.firstChild))throw Error(\"Found invalid end comment, as the first child of \"+\na);return a.firstChild},nextSibling:function(d){b(d)&&(d=e(d));if(d.nextSibling&&c(d.nextSibling)){var f=d.nextSibling;if(c(f)&&!a.a.g.get(f,k))throw Error(\"Found end comment without a matching opening comment, as child of \"+d);return null}return d.nextSibling},Cd:b,Vd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},Sc:function(d){if(m[a.a.R(d)]){var f=d.firstChild;if(f){do if(1===f.nodeType){var k;k=f.firstChild;var h=null;if(k){do if(h)h.push(k);else if(b(k)){var g=e(k,!0);g?k=\ng:h=[k]}else c(k)&&(h=[k]);while(k=k.nextSibling)}if(k=h)for(h=f.nextSibling,g=0;g<k.length;g++)h?d.insertBefore(k[g],h):d.appendChild(k[g])}while(f=f.nextSibling)}}}}})();a.b(\"virtualElements\",a.h);a.b(\"virtualElements.allowedBindings\",a.h.ea);a.b(\"virtualElements.emptyNode\",a.h.Ea);a.b(\"virtualElements.insertAfter\",a.h.Wb);a.b(\"virtualElements.prepend\",a.h.Vc);a.b(\"virtualElements.setDomNodeChildren\",a.h.va);(function(){a.ga=function(){this.nd={}};a.a.extend(a.ga.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=\nb.getAttribute(\"data-bind\")||a.j.getComponentNameForNode(b);case 8:return a.h.Cd(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.j.tc(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.j.tc(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute(\"data-bind\");case 8:return a.h.Vd(b);default:return null}},\nparseBindingsString:function(b,c,d,e){try{var f=this.nd,g=b+(e&&e.valueAccessors||\"\"),h;if(!(h=f[g])){var m,k=\"with($context){with($data||{}){return{\"+a.m.vb(b,e)+\"}}}\";m=new Function(\"$context\",\"$element\",k);h=f[g]=m}return h(c,d)}catch(l){throw l.message=\"Unable to parse bindings.\\nBindings value: \"+b+\"\\nMessage: \"+l.message,l;}}});a.ga.instance=new a.ga})();a.b(\"bindingProvider\",a.ga);(function(){function b(b){var c=(b=a.a.g.get(b,z))&&b.N;c&&(b.N=null,c.Tc())}function c(c,d,e){this.node=c;this.yc=\nd;this.kb=[];this.H=!1;d.N||a.a.K.za(c,b);e&&e.N&&(e.N.kb.push(c),this.Kb=e)}function d(a){return function(){return a}}function e(a){return a()}function f(b){return a.a.Ga(a.u.G(b),function(a,c){return function(){return b()[c]}})}function g(b,c,e){return\"function\"===typeof b?f(b.bind(null,c,e)):a.a.Ga(b,d)}function h(a,b){return f(this.getBindings.bind(this,a,b))}function m(b,c){var d=a.h.firstChild(c);if(d){var e,f=a.ga.instance,l=f.preprocessNode;if(l){for(;e=d;)d=a.h.nextSibling(e),l.call(f,e);\nd=a.h.firstChild(c)}for(;e=d;)d=a.h.nextSibling(e),k(b,e)}a.i.ma(c,a.i.H)}function k(b,c){var d=b,e=1===c.nodeType;e&&a.h.Sc(c);if(e||a.ga.instance.nodeHasBindings(c))d=p(c,null,b).bindingContextForDescendants;d&&!u[a.a.R(c)]&&m(d,c)}function l(b){var c=[],d={},e=[];a.a.P(b,function ca(f){if(!d[f]){var k=a.getBindingHandler(f);k&&(k.after&&(e.push(f),a.a.D(k.after,function(c){if(b[c]){if(-1!==a.a.A(e,c))throw Error(\"Cannot combine the following bindings, because they have a cyclic dependency: \"+e.join(\", \"));\nca(c)}}),e.length--),c.push({key:f,Mc:k}));d[f]=!0}});return c}function p(b,c,d){var f=a.a.g.Ub(b,z,{}),k=f.hd;if(!c){if(k)throw Error(\"You cannot apply bindings multiple times to the same element.\");f.hd=!0}k||(f.context=d);f.Zb||(f.Zb={});var g;if(c&&\"function\"!==typeof c)g=c;else{var p=a.ga.instance,q=p.getBindingAccessors||h,m=a.$(function(){if(g=c?c(d,b):q.call(p,b,d)){if(d[t])d[t]();if(d[B])d[B]()}return g},null,{l:b});g&&m.ja()||(m=null)}var x=d,u;if(g){var J=function(){return a.a.Ga(m?m():\ng,e)},r=m?function(a){return function(){return e(m()[a])}}:function(a){return g[a]};J.get=function(a){return g[a]&&e(r(a))};J.has=function(a){return a in g};a.i.H in g&&a.i.subscribe(b,a.i.H,function(){var c=(0,g[a.i.H])();if(c){var d=a.h.childNodes(b);d.length&&c(d,a.Ec(d[0]))}});a.i.pa in g&&(x=a.i.Cb(b,d),a.i.subscribe(b,a.i.pa,function(){var c=(0,g[a.i.pa])();c&&a.h.firstChild(b)&&c(b)}));f=l(g);a.a.D(f,function(c){var d=c.Mc.init,e=c.Mc.update,f=c.key;if(8===b.nodeType&&!a.h.ea[f])throw Error(\"The binding '\"+\nf+\"' cannot be used with virtual elements\");try{\"function\"==typeof d&&a.u.G(function(){var a=d(b,r(f),J,x.$data,x);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error(\"Multiple bindings (\"+u+\" and \"+f+\") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.\");u=f}}),\"function\"==typeof e&&a.$(function(){e(b,r(f),J,x.$data,x)},null,{l:b})}catch(k){throw k.message='Unable to process binding \"'+f+\": \"+g[f]+'\"\\nMessage: '+k.message,\nk;}})}f=u===n;return{shouldBindDescendants:f,bindingContextForDescendants:f&&x}}function q(b,c){return b&&b instanceof a.fa?b:new a.fa(b,n,n,c)}var t=a.a.Da(\"_subscribable\"),x=a.a.Da(\"_ancestorBindingInfo\"),B=a.a.Da(\"_dataDependency\");a.c={};var u={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.c[b]};var J={};a.fa=function(b,c,d,e,f){function k(){var b=p?h():h,f=a.a.f(b);c?(a.a.extend(l,c),x in c&&(l[x]=c[x])):(l.$parents=[],l.$root=f,l.ko=a);l[t]=q;g?f=l.$data:(l.$rawData=\nb,l.$data=f);d&&(l[d]=f);e&&e(l,c,f);if(c&&c[t]&&!a.S.o().Vb(c[t]))c[t]();m&&(l[B]=m);return l.$data}var l=this,g=b===J,h=g?n:b,p=\"function\"==typeof h&&!a.O(h),q,m=f&&f.dataDependency;f&&f.exportDependencies?k():(q=a.xb(k),q.v(),q.ja()?q.equalityComparer=null:l[t]=n)};a.fa.prototype.createChildContext=function(b,c,d,e){!e&&c&&\"object\"==typeof c&&(e=c,c=e.as,d=e.extend);if(c&&e&&e.noChildContext){var f=\"function\"==typeof b&&!a.O(b);return new a.fa(J,this,null,function(a){d&&d(a);a[c]=f?b():b},e)}return new a.fa(b,\nthis,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)},e)};a.fa.prototype.extend=function(b,c){return new a.fa(J,this,null,function(c){a.a.extend(c,\"function\"==typeof b?b(c):b)},c)};var z=a.a.g.Z();c.prototype.Tc=function(){this.Kb&&this.Kb.N&&this.Kb.N.sd(this.node)};c.prototype.sd=function(b){a.a.Pa(this.kb,b);!this.kb.length&&this.H&&this.Cc()};c.prototype.Cc=function(){this.H=!0;this.yc.N&&!this.kb.length&&(this.yc.N=\nnull,a.a.K.yb(this.node,b),a.i.ma(this.node,a.i.pa),this.Tc())};a.i={H:\"childrenComplete\",pa:\"descendantsComplete\",subscribe:function(b,c,d,e,f){var k=a.a.g.Ub(b,z,{});k.Fa||(k.Fa=new a.T);f&&f.notifyImmediately&&k.Zb[c]&&a.u.G(d,e,[b]);return k.Fa.subscribe(d,e,c)},ma:function(b,c){var d=a.a.g.get(b,z);if(d&&(d.Zb[c]=!0,d.Fa&&d.Fa.notifySubscribers(b,c),c==a.i.H))if(d.N)d.N.Cc();else if(d.N===n&&d.Fa&&d.Fa.Wa(a.i.pa))throw Error(\"descendantsComplete event not supported for bindings on this node\");\n},Cb:function(b,d){var e=a.a.g.Ub(b,z,{});e.N||(e.N=new c(b,e,d[x]));return d[x]==e?d:d.extend(function(a){a[x]=e})}};a.Td=function(b){return(b=a.a.g.get(b,z))&&b.context};a.ib=function(b,c,d){1===b.nodeType&&a.h.Sc(b);return p(b,c,q(d))};a.ld=function(b,c,d){d=q(d);return a.ib(b,g(c,d,b),d)};a.Oa=function(a,b){1!==b.nodeType&&8!==b.nodeType||m(q(a),b)};a.vc=function(a,b,c){!v&&A.jQuery&&(v=A.jQuery);if(2>arguments.length){if(b=w.body,!b)throw Error(\"ko.applyBindings: could not find document.body; has the document been loaded?\");\n}else if(!b||1!==b.nodeType&&8!==b.nodeType)throw Error(\"ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node\");k(q(a,c),b)};a.Dc=function(b){return!b||1!==b.nodeType&&8!==b.nodeType?n:a.Td(b)};a.Ec=function(b){return(b=a.Dc(b))?b.$data:n};a.b(\"bindingHandlers\",a.c);a.b(\"bindingEvent\",a.i);a.b(\"bindingEvent.subscribe\",a.i.subscribe);a.b(\"bindingEvent.startPossiblyAsyncContentBinding\",a.i.Cb);a.b(\"applyBindings\",a.vc);a.b(\"applyBindingsToDescendants\",a.Oa);\na.b(\"applyBindingAccessorsToNode\",a.ib);a.b(\"applyBindingsToNode\",a.ld);a.b(\"contextFor\",a.Dc);a.b(\"dataFor\",a.Ec)})();(function(b){function c(c,e){var k=Object.prototype.hasOwnProperty.call(f,c)?f[c]:b,l;k?k.subscribe(e):(k=f[c]=new a.T,k.subscribe(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Gd:e};delete f[c];l||e?k.notifySubscribers(b):a.na.zb(function(){k.notifySubscribers(b)})}),l=!0)}function d(a,b){e(\"getConfig\",[a],function(c){c?e(\"loadComponent\",[a,c],function(a){b(a,\nc)}):b(null,null)})}function e(c,d,f,l){l||(l=a.j.loaders.slice(0));var g=l.shift();if(g){var q=g[c];if(q){var t=!1;if(q.apply(g,d.concat(function(a){t?f(null):null!==a?f(a):e(c,d,f,l)}))!==b&&(t=!0,!g.suppressLoaderExceptions))throw Error(\"Component loaders must supply values by invoking the callback, not by returning values synchronously.\");}else e(c,d,f,l)}else f(null)}var f={},g={};a.j={get:function(d,e){var f=Object.prototype.hasOwnProperty.call(g,d)?g[d]:b;f?f.Gd?a.u.G(function(){e(f.definition)}):\na.na.zb(function(){e(f.definition)}):c(d,e)},Bc:function(a){delete g[a]},oc:e};a.j.loaders=[];a.b(\"components\",a.j);a.b(\"components.get\",a.j.get);a.b(\"components.clearCachedDefinition\",a.j.Bc)})();(function(){function b(b,c,d,e){function g(){0===--B&&e(h)}var h={},B=2,u=d.template;d=d.viewModel;u?f(c,u,function(c){a.j.oc(\"loadTemplate\",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.j.oc(\"loadViewModel\",[b,c],function(a){h[m]=a;g()})}):g()}function c(a,b,d){if(\"function\"===typeof b)d(function(a){return new b(a)});\nelse if(\"function\"===typeof b[m])d(b[m]);else if(\"instance\"in b){var e=b.instance;d(function(){return e})}else\"viewModel\"in b?c(a,b.viewModel,d):a(\"Unknown viewModel value: \"+b)}function d(b){switch(a.a.R(b)){case \"script\":return a.a.ua(b.text);case \"textarea\":return a.a.ua(b.value);case \"template\":if(e(b.content))return a.a.Ca(b.content.childNodes)}return a.a.Ca(b.childNodes)}function e(a){return A.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){\"string\"===typeof b.require?\nT||A.require?(T||A.require)([b.require],function(a){a&&\"object\"===typeof a&&a.Xd&&a[\"default\"]&&(a=a[\"default\"]);c(a)}):a(\"Uses require, but no AMD loader is present\"):c(b)}function g(a){return function(b){throw Error(\"Component '\"+a+\"': \"+b);}}var h={};a.j.register=function(b,c){if(!c)throw Error(\"Invalid configuration for \"+b);if(a.j.tb(b))throw Error(\"Component \"+b+\" is already registered\");h[b]=c};a.j.tb=function(a){return Object.prototype.hasOwnProperty.call(h,a)};a.j.unregister=function(b){delete h[b];\na.j.Bc(b)};a.j.Fc={getConfig:function(b,c){c(a.j.tb(b)?h[b]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if(\"string\"===typeof c)f(a.a.ua(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.la(c.childNodes));else if(c.element)if(c=c.element,A.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if(\"string\"===typeof c){var h=w.getElementById(c);h?f(d(h)):b(\"Cannot find element with ID \"+c)}else b(\"Unknown element type: \"+\nc);else b(\"Unknown template value: \"+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var m=\"createViewModel\";a.b(\"components.register\",a.j.register);a.b(\"components.isRegistered\",a.j.tb);a.b(\"components.unregister\",a.j.unregister);a.b(\"components.defaultLoader\",a.j.Fc);a.j.loaders.push(a.j.Fc);a.j.dd=h})();(function(){function b(b,e){var f=b.getAttribute(\"params\");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ga(f,function(c){return a.o(c,null,{l:b})}),g=a.a.Ga(f,\nfunction(c){var e=c.v();return c.ja()?a.o({read:function(){return a.a.f(c())},write:a.Za(e)&&function(a){c()(a)},l:b}):e});Object.prototype.hasOwnProperty.call(g,\"$raw\")||(g.$raw=f);return g}return{$raw:{}}}a.j.getComponentNameForNode=function(b){var c=a.a.R(b);if(a.j.tb(c)&&(-1!=c.indexOf(\"-\")||\"[object HTMLUnknownElement]\"==\"\"+b||8>=a.a.W&&b.tagName===c))return c};a.j.tc=function(c,e,f,g){if(1===e.nodeType){var h=a.j.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the \"component\" binding on a custom element matching a component');\nvar m={name:h,params:b(e,f)};c.component=g?function(){return m}:m}}return c};var c=new a.ga;9>a.a.W&&(a.j.register=function(a){return function(b){return a.apply(this,arguments)}}(a.j.register),w.createDocumentFragment=function(b){return function(){var c=b(),f=a.j.dd,g;for(g in f);return c}}(w.createDocumentFragment))})();(function(){function b(b,c,d){c=c.template;if(!c)throw Error(\"Component '\"+b+\"' has no template\");b=a.a.Ca(c);a.h.va(d,b)}function c(a,b,c){var d=a.createViewModel;return d?d.call(a,\nb,c):b}var d=0;a.c.component={init:function(e,f,g,h,m){function k(){var a=l&&l.dispose;\"function\"===typeof a&&a.call(l);q&&q.s();p=l=q=null}var l,p,q,t=a.a.la(a.h.childNodes(e));a.h.Ea(e);a.a.K.za(e,k);a.o(function(){var g=a.a.f(f()),h,u;\"string\"===typeof g?h=g:(h=a.a.f(g.name),u=a.a.f(g.params));if(!h)throw Error(\"No component name specified\");var n=a.i.Cb(e,m),z=p=++d;a.j.get(h,function(d){if(p===z){k();if(!d)throw Error(\"Unknown component '\"+h+\"'\");b(h,d,e);var f=c(d,u,{element:e,templateNodes:t});\nd=n.createChildContext(f,{extend:function(a){a.$component=f;a.$componentTemplateNodes=t}});f&&f.koDescendantsComplete&&(q=a.i.subscribe(e,a.i.pa,f.koDescendantsComplete,f));l=f;a.Oa(d,e)}})},null,{l:e});return{controlsDescendantBindings:!0}}};a.h.ea.component=!0})();var V={\"class\":\"className\",\"for\":\"htmlFor\"};a.c.attr={update:function(b,c){var d=a.a.f(c())||{};a.a.P(d,function(c,d){d=a.a.f(d);var g=c.indexOf(\":\"),g=\"lookupNamespaceURI\"in b&&0<g&&b.lookupNamespaceURI(c.substr(0,g)),h=!1===d||null===\nd||d===n;h?g?b.removeAttributeNS(g,c):b.removeAttribute(c):d=d.toString();8>=a.a.W&&c in V?(c=V[c],h?b.removeAttribute(c):b[c]=d):h||(g?b.setAttributeNS(g,c,d):b.setAttribute(c,d));\"name\"===c&&a.a.Yc(b,h?\"\":d)})}};(function(){a.c.checked={after:[\"value\",\"attr\"],init:function(b,c,d){function e(){var e=b.checked,f=g();if(!a.S.Ya()&&(e||!m&&!a.S.qa())){var k=a.u.G(c);if(l){var q=p?k.v():k,z=t;t=f;z!==f?e&&(a.a.Na(q,f,!0),a.a.Na(q,z,!1)):a.a.Na(q,f,e);p&&a.Za(k)&&k(q)}else h&&(f===n?f=e:e||(f=n)),a.m.eb(k,\nd,\"checked\",f,!0)}}function f(){var d=a.a.f(c()),e=g();l?(b.checked=0<=a.a.A(d,e),t=e):b.checked=h&&e===n?!!d:g()===d}var g=a.xb(function(){if(d.has(\"checkedValue\"))return a.a.f(d.get(\"checkedValue\"));if(q)return d.has(\"value\")?a.a.f(d.get(\"value\")):b.value}),h=\"checkbox\"==b.type,m=\"radio\"==b.type;if(h||m){var k=c(),l=h&&a.a.f(k)instanceof Array,p=!(l&&k.push&&k.splice),q=m||l,t=l?g():n;m&&!b.name&&a.c.uniqueName.init(b,function(){return!0});a.o(e,null,{l:b});a.a.B(b,\"click\",e);a.o(f,null,{l:b});\nk=n}}};a.m.wa.checked=!0;a.c.checkedValue={update:function(b,c){b.value=a.a.f(c())}}})();a.c[\"class\"]={update:function(b,c){var d=a.a.Db(a.a.f(c()));a.a.Eb(b,b.__ko__cssValue,!1);b.__ko__cssValue=d;a.a.Eb(b,d,!0)}};a.c.css={update:function(b,c){var d=a.a.f(c());null!==d&&\"object\"==typeof d?a.a.P(d,function(c,d){d=a.a.f(d);a.a.Eb(b,c,d)}):a.c[\"class\"].update(b,c)}};a.c.enable={update:function(b,c){var d=a.a.f(c());d&&b.disabled?b.removeAttribute(\"disabled\"):d||b.disabled||(b.disabled=!0)}};a.c.disable=\n{update:function(b,c){a.c.enable.update(b,function(){return!a.a.f(c())})}};a.c.event={init:function(b,c,d,e,f){var g=c()||{};a.a.P(g,function(g){\"string\"==typeof g&&a.a.B(b,g,function(b){var k,l=c()[g];if(l){try{var p=a.a.la(arguments);e=f.$data;p.unshift(e);k=l.apply(e,p)}finally{!0!==k&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+\"Bubble\")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.c.foreach={Rc:function(b){return function(){var c=b(),d=a.a.bc(c);\nif(!d||\"number\"==typeof d.length)return{foreach:c,templateEngine:a.ba.Ma};a.a.f(c);return{foreach:d.data,as:d.as,noChildContext:d.noChildContext,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.ba.Ma}}},init:function(b,c){return a.c.template.init(b,a.c.foreach.Rc(c))},update:function(b,c,d,e,f){return a.c.template.update(b,a.c.foreach.Rc(c),d,e,f)}};a.m.Ra.foreach=!1;a.h.ea.foreach=\n!0;a.c.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if(\"activeElement\"in f){var g;try{g=f.activeElement}catch(l){g=f.body}e=g===b}f=c();a.m.eb(f,d,\"hasfocus\",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.B(b,\"focus\",f);a.a.B(b,\"focusin\",f);a.a.B(b,\"blur\",g);a.a.B(b,\"focusout\",g);b.__ko_hasfocusLastValue=!1},update:function(b,c){var d=!!a.a.f(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===\nd||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.u.G(a.a.Fb,null,[b,d?\"focusin\":\"focusout\"]))}};a.m.wa.hasfocus=!0;a.c.hasFocus=a.c.hasfocus;a.m.wa.hasFocus=\"hasfocus\";a.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.fc(b,c())}};(function(){function b(b,d,e){a.c[b]={init:function(b,c,h,m,k){var l,p,q={},t,x,n;if(d){m=h.get(\"as\");var u=h.get(\"noChildContext\");n=!(m&&u);q={as:m,noChildContext:u,exportDependencies:n}}x=(t=\n\"render\"==h.get(\"completeOn\"))||h.has(a.i.pa);a.o(function(){var h=a.a.f(c()),m=!e!==!h,u=!p,r;if(n||m!==l){x&&(k=a.i.Cb(b,k));if(m){if(!d||n)q.dataDependency=a.S.o();r=d?k.createChildContext(\"function\"==typeof h?h:c,q):a.S.qa()?k.extend(null,q):k}u&&a.S.qa()&&(p=a.a.Ca(a.h.childNodes(b),!0));m?(u||a.h.va(b,a.a.Ca(p)),a.Oa(r,b)):(a.h.Ea(b),t||a.i.ma(b,a.i.H));l=m}},null,{l:b});return{controlsDescendantBindings:!0}}};a.m.Ra[b]=!1;a.h.ea[b]=!0}b(\"if\");b(\"ifnot\",!1,!0);b(\"with\",!0)})();a.c.let={init:function(b,\nc,d,e,f){c=f.extend(c);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.let=!0;var Q={};a.c.options={init:function(b){if(\"select\"!==a.a.R(b))throw Error(\"options binding applies only to SELECT elements\");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.jb(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return\"function\"==d?b(a):\"string\"==d?a[b]:c}function g(c,d){if(x&&l)a.i.ma(b,a.i.H);else if(t.length){var e=\n0<=a.a.A(t,a.w.M(d[0]));a.a.Zc(d[0],e);x&&!e&&a.u.G(a.a.Fb,null,[b,\"change\"])}}var h=b.multiple,m=0!=b.length&&h?b.scrollTop:null,k=a.a.f(c()),l=d.get(\"valueAllowUnset\")&&d.has(\"value\"),p=d.get(\"optionsIncludeDestroyed\");c={};var q,t=[];l||(h?t=a.a.Mb(e(),a.w.M):0<=b.selectedIndex&&t.push(a.w.M(b.options[b.selectedIndex])));k&&(\"undefined\"==typeof k.length&&(k=[k]),q=a.a.jb(k,function(b){return p||b===n||null===b||!a.a.f(b._destroy)}),d.has(\"optionsCaption\")&&(k=a.a.f(d.get(\"optionsCaption\")),null!==\nk&&k!==n&&q.unshift(Q)));var x=!1;c.beforeRemove=function(a){b.removeChild(a)};k=g;d.has(\"optionsAfterRender\")&&\"function\"==typeof d.get(\"optionsAfterRender\")&&(k=function(b,c){g(0,c);a.u.G(d.get(\"optionsAfterRender\"),null,[c[0],b!==Q?b:n])});a.a.ec(b,q,function(c,e,g){g.length&&(t=!l&&g[0].selected?[a.w.M(g[0])]:[],x=!0);e=b.ownerDocument.createElement(\"option\");c===Q?(a.a.Bb(e,d.get(\"optionsCaption\")),a.w.cb(e,n)):(g=f(c,d.get(\"optionsValue\"),c),a.w.cb(e,a.a.f(g)),c=f(c,d.get(\"optionsText\"),g),\na.a.Bb(e,c));return[e]},c,k);if(!l){var B;h?B=t.length&&e().length<t.length:B=t.length&&0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex])!==t[0]:t.length||0<=b.selectedIndex;B&&a.u.G(a.a.Fb,null,[b,\"change\"])}(l||a.S.Ya())&&a.i.ma(b,a.i.H);a.a.wd(b);m&&20<Math.abs(m-b.scrollTop)&&(b.scrollTop=m)}};a.c.options.$b=a.a.g.Z();a.c.selectedOptions={init:function(b,c,d){function e(){var e=c(),f=[];a.a.D(b.getElementsByTagName(\"option\"),function(b){b.selected&&f.push(a.w.M(b))});a.m.eb(e,d,\"selectedOptions\",\nf)}function f(){var d=a.a.f(c()),e=b.scrollTop;d&&\"number\"==typeof d.length&&a.a.D(b.getElementsByTagName(\"option\"),function(b){var c=0<=a.a.A(d,a.w.M(b));b.selected!=c&&a.a.Zc(b,c)});b.scrollTop=e}if(\"select\"!=a.a.R(b))throw Error(\"selectedOptions binding applies only to SELECT elements\");var g;a.i.subscribe(b,a.i.H,function(){g?e():(a.a.B(b,\"change\",e),g=a.o(f,null,{l:b}))},null,{notifyImmediately:!0})},update:function(){}};a.m.wa.selectedOptions=!0;a.c.style={update:function(b,c){var d=a.a.f(c()||\n{});a.a.P(d,function(c,d){d=a.a.f(d);if(null===d||d===n||!1===d)d=\"\";if(v)v(b).css(c,d);else if(/^--/.test(c))b.style.setProperty(c,d);else{c=c.replace(/-(\\w)/g,function(a,b){return b.toUpperCase()});var g=b.style[c];b.style[c]=d;d===g||b.style[c]!=g||isNaN(d)||(b.style[c]=d+\"px\")}})}};a.c.submit={init:function(b,c,d,e,f){if(\"function\"!=typeof c())throw Error(\"The value for a submit binding must be a function\");a.a.B(b,\"submit\",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?\na.preventDefault():a.returnValue=!1)}})}};a.c.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Bb(b,c())}};a.h.ea.text=!0;(function(){if(A&&A.navigator){var b=function(a){if(a)return parseFloat(a[1])},c=A.navigator.userAgent,d,e,f,g,h;(d=A.opera&&A.opera.version&&parseInt(A.opera.version()))||(h=b(c.match(/Edge\\/([^ ]+)$/)))||b(c.match(/Chrome\\/([^ ]+)/))||(e=b(c.match(/Version\\/([^ ]+) Safari/)))||(f=b(c.match(/Firefox\\/([^ ]+)/)))||(g=a.a.W||b(c.match(/MSIE ([^ ]+)/)))||\n(g=b(c.match(/rv:([^ )]+)/)))}if(8<=g&&10>g)var m=a.a.g.Z(),k=a.a.g.Z(),l=function(b){var c=this.activeElement;(c=c&&a.a.g.get(c,k))&&c(b)},p=function(b,c){var d=b.ownerDocument;a.a.g.get(d,m)||(a.a.g.set(d,m,!0),a.a.B(d,\"selectionchange\",l));a.a.g.set(b,k,c)};a.c.textInput={init:function(b,c,k){function l(c,d){a.a.B(b,c,d)}function m(){var d=a.a.f(c());if(null===d||d===n)d=\"\";L!==n&&d===L?a.a.setTimeout(m,4):b.value!==d&&(y=!0,b.value=d,y=!1,v=b.value)}function r(){w||(L=b.value,w=a.a.setTimeout(z,\n4))}function z(){clearTimeout(w);L=w=n;var d=b.value;v!==d&&(v=d,a.m.eb(c(),k,\"textInput\",d))}var v=b.value,w,L,A=9==a.a.W?r:z,y=!1;g&&l(\"keypress\",z);11>g&&l(\"propertychange\",function(a){y||\"value\"!==a.propertyName||A(a)});8==g&&(l(\"keyup\",z),l(\"keydown\",z));p&&(p(b,A),l(\"dragend\",r));(!g||9<=g)&&l(\"input\",A);5>e&&\"textarea\"===a.a.R(b)?(l(\"keydown\",r),l(\"paste\",r),l(\"cut\",r)):11>d?l(\"keydown\",r):4>f?(l(\"DOMAutoComplete\",z),l(\"dragdrop\",z),l(\"drop\",z)):h&&\"number\"===b.type&&l(\"keydown\",r);l(\"change\",\nz);l(\"blur\",z);a.o(m,null,{l:b})}};a.m.wa.textInput=!0;a.c.textinput={preprocess:function(a,b,c){c(\"textInput\",a)}}})();a.c.uniqueName={init:function(b,c){if(c()){var d=\"ko_unique_\"+ ++a.c.uniqueName.rd;a.a.Yc(b,d)}}};a.c.uniqueName.rd=0;a.c.using={init:function(b,c,d,e,f){var g;d.has(\"as\")&&(g={as:d.get(\"as\"),noChildContext:d.get(\"noChildContext\")});c=f.createChildContext(c,g);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.using=!0;a.c.value={init:function(b,c,d){var e=a.a.R(b),f=\"input\"==\ne;if(!f||\"checkbox\"!=b.type&&\"radio\"!=b.type){var g=[],h=d.get(\"valueUpdate\"),m=!1,k=null;h&&(\"string\"==typeof h?g=[h]:g=a.a.wc(h),a.a.Pa(g,\"change\"));var l=function(){k=null;m=!1;var e=c(),f=a.w.M(b);a.m.eb(e,d,\"value\",f)};!a.a.W||!f||\"text\"!=b.type||\"off\"==b.autocomplete||b.form&&\"off\"==b.form.autocomplete||-1!=a.a.A(g,\"propertychange\")||(a.a.B(b,\"propertychange\",function(){m=!0}),a.a.B(b,\"focus\",function(){m=!1}),a.a.B(b,\"blur\",function(){m&&l()}));a.a.D(g,function(c){var d=l;a.a.Ud(c,\"after\")&&\n(d=function(){k=a.w.M(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.B(b,c,d)});var p;p=f&&\"file\"==b.type?function(){var d=a.a.f(c());null===d||d===n||\"\"===d?b.value=\"\":a.u.G(l)}:function(){var f=a.a.f(c()),g=a.w.M(b);if(null!==k&&f===k)a.a.setTimeout(p,0);else if(f!==g||g===n)\"select\"===e?(g=d.get(\"valueAllowUnset\"),a.w.cb(b,f,g),g||f===a.w.M(b)||a.u.G(l)):a.w.cb(b,f)};if(\"select\"===e){var q;a.i.subscribe(b,a.i.H,function(){q?d.get(\"valueAllowUnset\")?p():l():(a.a.B(b,\"change\",l),q=a.o(p,null,{l:b}))},\nnull,{notifyImmediately:!0})}else a.a.B(b,\"change\",l),a.o(p,null,{l:b})}else a.ib(b,{checkedValue:c})},update:function(){}};a.m.wa.value=!0;a.c.visible={update:function(b,c){var d=a.a.f(c()),e=\"none\"!=b.style.display;d&&!e?b.style.display=\"\":!d&&e&&(b.style.display=\"none\")}};a.c.hidden={update:function(b,c){a.c.visible.update(b,function(){return!a.a.f(c())})}};(function(b){a.c[b]={init:function(c,d,e,f,g){return a.c.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})(\"click\");\na.ca=function(){};a.ca.prototype.renderTemplateSource=function(){throw Error(\"Override renderTemplateSource\");};a.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error(\"Override createJavaScriptEvaluatorBlock\");};a.ca.prototype.makeTemplateSource=function(b,c){if(\"string\"==typeof b){c=c||w;var d=c.getElementById(b);if(!d)throw Error(\"Cannot find template with ID \"+b);return new a.C.F(d)}if(1==b.nodeType||8==b.nodeType)return new a.C.ia(b);throw Error(\"Unknown template type: \"+b);};a.ca.prototype.renderTemplate=\nfunction(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.ca.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data(\"isRewritten\")};a.ca.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data(\"isRewritten\",!0)};a.b(\"templateEngine\",a.ca);a.kc=function(){function b(b,c,d,h){b=a.m.ac(b);for(var m=a.m.Ra,k=0;k<b.length;k++){var l=b[k].key;if(Object.prototype.hasOwnProperty.call(m,\nl)){var p=m[l];if(\"function\"===typeof p){if(l=p(b[k].value))throw Error(l);}else if(!p)throw Error(\"This template engine does not support the '\"+l+\"' binding within its templates\");}}d=\"ko.__tr_ambtns(function($context,$element){return(function(){return{ \"+a.m.vb(b,{valueAccessors:!0})+\" } })()},'\"+d.toLowerCase()+\"')\";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\\d*)(?:\\s+(?!data-bind\\s*=\\s*)[a-z0-9\\-]+(?:=(?:\\\"[^\\\"]*\\\"|\\'[^\\']*\\'|[^>]*))?)*\\s+)data-bind\\s*=\\s*([\"'])([\\s\\S]*?)\\3/gi,\nd=/\\x3c!--\\s*ko\\b\\s*([\\s\\S]*?)\\s*--\\x3e/g;return{xd:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.kc.Ld(b,c)},d)},Ld:function(a,f){return a.replace(c,function(a,c,d,e,l){return b(l,c,d,f)}).replace(d,function(a,c){return b(c,\"\\x3c!-- ko --\\x3e\",\"#comment\",f)})},md:function(b,c){return a.aa.Xb(function(d,h){var m=d.nextSibling;m&&m.nodeName.toLowerCase()===c&&a.ib(m,b,h)})}}}();a.b(\"__tr_ambtns\",a.kc.md);(function(){a.C={};a.C.F=function(b){if(this.F=b){var c=\na.a.R(b);this.ab=\"script\"===c?1:\"textarea\"===c?2:\"template\"==c&&b.content&&11===b.content.nodeType?3:4}};a.C.F.prototype.text=function(){var b=1===this.ab?\"text\":2===this.ab?\"value\":\"innerHTML\";if(0==arguments.length)return this.F[b];var c=arguments[0];\"innerHTML\"===b?a.a.fc(this.F,c):this.F[b]=c};var b=a.a.g.Z()+\"_\";a.C.F.prototype.data=function(c){if(1===arguments.length)return a.a.g.get(this.F,b+c);a.a.g.set(this.F,b+c,arguments[1])};var c=a.a.g.Z();a.C.F.prototype.nodes=function(){var b=this.F;\nif(0==arguments.length){var e=a.a.g.get(b,c)||{},f=e.lb||(3===this.ab?b.content:4===this.ab?b:n);if(!f||e.jd){var g=this.text();g&&g!==e.bb&&(f=a.a.Md(g,b.ownerDocument),a.a.g.set(b,c,{lb:f,bb:g,jd:!0}))}return f}e=arguments[0];this.ab!==n&&this.text(\"\");a.a.g.set(b,c,{lb:e})};a.C.ia=function(a){this.F=a};a.C.ia.prototype=new a.C.F;a.C.ia.prototype.constructor=a.C.ia;a.C.ia.prototype.text=function(){if(0==arguments.length){var b=a.a.g.get(this.F,c)||{};b.bb===n&&b.lb&&(b.bb=b.lb.innerHTML);return b.bb}a.a.g.set(this.F,\nc,{bb:arguments[0]})};a.b(\"templateSources\",a.C);a.b(\"templateSources.domElement\",a.C.F);a.b(\"templateSources.anonymousTemplate\",a.C.ia)})();(function(){function b(b,c,d){var e;for(c=a.h.nextSibling(c);b&&(e=b)!==c;)b=a.h.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=a.ga.instance,m=h.preprocessNode;if(m){b(e,f,function(a,b){var c=a.previousSibling,d=m.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):\n(c.push(e,f),a.a.Ua(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.vc(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.aa.cd(b,[d])});a.a.Ua(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,m){m=m||{};var n=(b&&d(b)||f||{}).ownerDocument,B=m.templateEngine||g;a.kc.xd(f,B,n);f=B.renderTemplate(f,h,m,n);if(\"number\"!=typeof f.length||0<f.length&&\"number\"!=typeof f[0].nodeType)throw Error(\"Template engine must return an array of DOM nodes\");n=!1;switch(e){case \"replaceChildren\":a.h.va(b,\nf);n=!0;break;case \"replaceNode\":a.a.Xc(b,f);n=!0;break;case \"ignoreTargetNode\":break;default:throw Error(\"Unknown renderMode: \"+e);}n&&(c(f,h),m.afterRender&&a.u.G(m.afterRender,null,[f,h[m.as||\"$data\"]]),\"replaceChildren\"==e&&a.i.ma(b,a.i.H));return f}function f(b,c,d){return a.O(b)?b():\"function\"===typeof b?b(c,d):b}var g;a.gc=function(b){if(b!=n&&!(b instanceof a.ca))throw Error(\"templateEngine must inherit from ko.templateEngine\");g=b};a.dc=function(b,c,h,m,t){h=h||{};if((h.templateEngine||g)==\nn)throw Error(\"Set a template engine before calling renderTemplate\");t=t||\"replaceChildren\";if(m){var x=d(m);return a.$(function(){var g=c&&c instanceof a.fa?c:new a.fa(c,null,null,null,{exportDependencies:!0}),n=f(b,g.$data,g),g=e(m,t,n,g,h);\"replaceNode\"==t&&(m=g,x=d(m))},null,{Sa:function(){return!x||!a.a.Sb(x)},l:x&&\"replaceNode\"==t?x.parentNode:x})}return a.aa.Xb(function(d){a.dc(b,c,h,d,\"replaceNode\")})};a.Qd=function(b,d,g,h,m){function x(b,c){a.u.G(a.a.ec,null,[h,b,u,g,r,c]);a.i.ma(h,a.i.H)}\nfunction r(a,b){c(b,v);g.afterRender&&g.afterRender(b,a);v=null}function u(a,c){v=m.createChildContext(a,{as:z,noChildContext:g.noChildContext,extend:function(a){a.$index=c;z&&(a[z+\"Index\"]=c)}});var d=f(b,a,v);return e(h,\"ignoreTargetNode\",d,v,g)}var v,z=g.as,w=!1===g.includeDestroyed||a.options.foreachHidesDestroyed&&!g.includeDestroyed;if(w||g.beforeRemove||!a.Pc(d))return a.$(function(){var b=a.a.f(d)||[];\"undefined\"==typeof b.length&&(b=[b]);w&&(b=a.a.jb(b,function(b){return b===n||null===b||\n!a.a.f(b._destroy)}));x(b)},null,{l:h});x(d.v());var A=d.subscribe(function(a){x(d(),a)},null,\"arrayChange\");A.l(h);return A};var h=a.a.g.Z(),m=a.a.g.Z();a.c.template={init:function(b,c){var d=a.a.f(c());if(\"string\"==typeof d||\"name\"in d)a.h.Ea(b);else if(\"nodes\"in d){d=d.nodes||[];if(a.O(d))throw Error('The \"nodes\" option must be a plain, non-observable array.');var e=d[0]&&d[0].parentNode;e&&a.a.g.get(e,m)||(e=a.a.Yb(d),a.a.g.set(e,m,!0));(new a.C.ia(b)).nodes(e)}else if(d=a.h.childNodes(b),0<d.length)e=\na.a.Yb(d),(new a.C.ia(b)).nodes(e);else throw Error(\"Anonymous template defined, but no template content was provided\");return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.f(g);d=!0;e=null;\"string\"==typeof c?c={}:(g=\"name\"in c?c.name:b,\"if\"in c&&(d=a.a.f(c[\"if\"])),d&&\"ifnot\"in c&&(d=!a.a.f(c.ifnot)),d&&!g&&(d=!1));\"foreach\"in c?e=a.Qd(g,d&&c.foreach||[],c,b,f):d?(d=f,\"data\"in c&&(d=f.createChildContext(c.data,{as:c.as,noChildContext:c.noChildContext,exportDependencies:!0})),\ne=a.dc(g,d,c,b)):a.h.Ea(b);f=e;(c=a.a.g.get(b,h))&&\"function\"==typeof c.s&&c.s();a.a.g.set(b,h,!f||f.ja&&!f.ja()?n:f)}};a.m.Ra.template=function(b){b=a.m.ac(b);return 1==b.length&&b[0].unknown||a.m.Id(b,\"name\")?null:\"This template engine does not support anonymous templates nested within its templates\"};a.h.ea.template=!0})();a.b(\"setTemplateEngine\",a.gc);a.b(\"renderTemplate\",a.dc);a.a.Kc=function(a,c,d){if(a.length&&c.length){var e,f,g,h,m;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;m=c[g];++g)if(h.value===\nm.value){h.moved=m.index;m.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.Pb=function(){function b(b,d,e,f,g){var h=Math.min,m=Math.max,k=[],l,p=b.length,q,n=d.length,r=n-p||1,v=p+n+1,u,w,z;for(l=0;l<=p;l++)for(w=u,k.push(u=[]),z=h(n,l+r),q=m(0,l-1);q<=z;q++)u[q]=q?l?b[l-1]===d[q-1]?w[q-1]:h(w[q]||v,u[q-1]||v)+1:q+1:l+1;h=[];m=[];r=[];l=p;for(q=n;l||q;)n=k[l][q]-1,q&&n===k[l][q-1]?m.push(h[h.length]={status:e,value:d[--q],index:q}):l&&n===k[l-1][q]?r.push(h[h.length]={status:f,value:b[--l],index:l}):\n(--q,--l,g.sparse||h.push({status:\"retained\",value:d[q]}));a.a.Kc(r,m,!g.dontLimitMoves&&10*p);return h.reverse()}return function(a,d,e){e=\"boolean\"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,\"added\",\"deleted\",e):b(d,a,\"deleted\",\"added\",e)}}();a.b(\"utils.compareArrays\",a.a.Pb);(function(){function b(b,c,d,h,m){var k=[],l=a.$(function(){var l=c(d,m,a.a.Ua(k,b))||[];0<k.length&&(a.a.Xc(k,l),h&&a.u.G(h,null,[d,l,m]));k.length=0;a.a.Nb(k,l)},null,{l:b,Sa:function(){return!a.a.kd(k)}});\nreturn{Y:k,$:l.ja()?l:n}}var c=a.a.g.Z(),d=a.a.g.Z();a.a.ec=function(e,f,g,h,m,k){function l(b){y={Aa:b,pb:a.ta(w++)};v.push(y);r||F.push(y)}function p(b){y=t[b];w!==y.pb.v()&&D.push(y);y.pb(w++);a.a.Ua(y.Y,e);v.push(y)}function q(b,c){if(b)for(var d=0,e=c.length;d<e;d++)a.a.D(c[d].Y,function(a){b(a,d,c[d].Aa)})}f=f||[];\"undefined\"==typeof f.length&&(f=[f]);h=h||{};var t=a.a.g.get(e,c),r=!t,v=[],u=0,w=0,z=[],A=[],C=[],D=[],F=[],y,I=0;if(r)a.a.D(f,l);else{if(!k||t&&t._countWaitingForRemove){var E=\na.a.Mb(t,function(a){return a.Aa});k=a.a.Pb(E,f,{dontLimitMoves:h.dontLimitMoves,sparse:!0})}for(var E=0,G,H,K;G=k[E];E++)switch(H=G.moved,K=G.index,G.status){case \"deleted\":for(;u<K;)p(u++);H===n&&(y=t[u],y.$&&(y.$.s(),y.$=n),a.a.Ua(y.Y,e).length&&(h.beforeRemove&&(v.push(y),I++,y.Aa===d?y=null:C.push(y)),y&&z.push.apply(z,y.Y)));u++;break;case \"added\":for(;w<K;)p(u++);H!==n?(A.push(v.length),p(H)):l(G.value)}for(;w<f.length;)p(u++);v._countWaitingForRemove=I}a.a.g.set(e,c,v);q(h.beforeMove,D);a.a.D(z,\nh.beforeRemove?a.oa:a.removeNode);var M,O,P;try{P=e.ownerDocument.activeElement}catch(N){}if(A.length)for(;(E=A.shift())!=n;){y=v[E];for(M=n;E;)if((O=v[--E].Y)&&O.length){M=O[O.length-1];break}for(f=0;u=y.Y[f];M=u,f++)a.h.Wb(e,u,M)}for(E=0;y=v[E];E++){y.Y||a.a.extend(y,b(e,g,y.Aa,m,y.pb));for(f=0;u=y.Y[f];M=u,f++)a.h.Wb(e,u,M);!y.Ed&&m&&(m(y.Aa,y.Y,y.pb),y.Ed=!0,M=y.Y[y.Y.length-1])}P&&e.ownerDocument.activeElement!=P&&P.focus();q(h.beforeRemove,C);for(E=0;E<C.length;++E)C[E].Aa=d;q(h.afterMove,D);\nq(h.afterAdd,F)}})();a.b(\"utils.setDomNodeChildrenFromArrayMapping\",a.a.ec);a.ba=function(){this.allowTemplateRewriting=!1};a.ba.prototype=new a.ca;a.ba.prototype.constructor=a.ba;a.ba.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.W?0:b.nodes)?b.nodes():null)return a.a.la(c.cloneNode(!0).childNodes);b=b.text();return a.a.ua(b,e)};a.ba.Ma=new a.ba;a.gc(a.ba.Ma);a.b(\"nativeTemplateEngine\",a.ba);(function(){a.$a=function(){var a=this.Hd=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf(\"__\"))return 2}catch(a){}return 1}();\nthis.renderTemplateSource=function(b,e,f,g){g=g||w;f=f||{};if(2>a)throw Error(\"Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.\");var h=b.data(\"precompiled\");h||(h=b.text()||\"\",h=v.template(null,\"{{ko_with $item.koBindingContext}}\"+h+\"{{/ko_with}}\"),b.data(\"precompiled\",h));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(h,b,e);e.appendTo(g.createElement(\"div\"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return\"{{ko_code ((function() { return \"+\na+\" })()) }}\"};this.addTemplate=function(a,b){w.write(\"<script type='text/html' id='\"+a+\"'>\"+b+\"\\x3c/script>\")};0<a&&(v.tmpl.tag.ko_code={open:\"__.push($1 || '');\"},v.tmpl.tag.ko_with={open:\"with($1) {\",close:\"} \"})};a.$a.prototype=new a.ca;a.$a.prototype.constructor=a.$a;var b=new a.$a;0<b.Hd&&a.gc(b);a.b(\"jqueryTmplTemplateEngine\",a.$a)})()})})();})();\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko, { Observable, PureComputed } from \"knockout\";\n\ntype PresetSize = { name: string; description: string };\ntype Constants = {\n  customWidth: string;\n  customHeight: string;\n  customMargin: string;\n  baseFontSize: string;\n  baseLineHeight: string;\n  baseFontFamily: string;\n  viewerFontSize: number;\n  cropMarks: string;\n  bleed: string;\n  cropOffset: string;\n};\n\nenum Mode {\n  Default = \"\",\n  Auto = \"auto\",\n  Preset = \"preset\",\n  Custom = \"custom\",\n  Zero = \"0\",\n}\n\nconst PRESET_SIZE: Array<PresetSize> = [\n  { name: \"letter\", description: \"Letter\" },\n  { name: \"legal\", description: \"Legal\" },\n  { name: \"ledger\", description: \"Ledger\" },\n  { name: \"a10\", description: \"A10\" },\n  { name: \"a9\", description: \"A9\" },\n  { name: \"a8\", description: \"A8\" },\n  { name: \"a7\", description: \"A7\" },\n  { name: \"a6\", description: \"A6\" },\n  { name: \"a5\", description: \"A5\" },\n  { name: \"a4\", description: \"A4\" },\n  { name: \"a3\", description: \"A3\" },\n  { name: \"a2\", description: \"A2\" },\n  { name: \"a1\", description: \"A1\" },\n  { name: \"a0\", description: \"A0\" },\n  { name: \"b10\", description: \"B10 (ISO)\" },\n  { name: \"b9\", description: \"B9 (ISO)\" },\n  { name: \"b8\", description: \"B8 (ISO)\" },\n  { name: \"b7\", description: \"B7 (ISO)\" },\n  { name: \"b6\", description: \"B6 (ISO)\" },\n  { name: \"b5\", description: \"B5 (ISO)\" },\n  { name: \"b4\", description: \"B4 (ISO)\" },\n  { name: \"b3\", description: \"B3 (ISO)\" },\n  { name: \"b2\", description: \"B2 (ISO)\" },\n  { name: \"b1\", description: \"B1 (ISO)\" },\n  { name: \"b0\", description: \"B0 (ISO)\" },\n  { name: \"jis-b10\", description: \"JIS-B10\" },\n  { name: \"jis-b9\", description: \"JIS-B9\" },\n  { name: \"jis-b8\", description: \"JIS-B8\" },\n  { name: \"jis-b7\", description: \"JIS-B7\" },\n  { name: \"jis-b6\", description: \"JIS-B6\" },\n  { name: \"jis-b5\", description: \"JIS-B5\" },\n  { name: \"jis-b4\", description: \"JIS-B4\" },\n  { name: \"jis-b3\", description: \"JIS-B3\" },\n  { name: \"jis-b2\", description: \"JIS-B2\" },\n  { name: \"jis-b1\", description: \"JIS-B1\" },\n  { name: \"jis-b0\", description: \"JIS-B0\" },\n  { name: \"c10\", description: \"C10\" },\n  { name: \"c9\", description: \"C9\" },\n  { name: \"c8\", description: \"C8\" },\n  { name: \"c7\", description: \"C7\" },\n  { name: \"c6\", description: \"C6\" },\n  { name: \"c5\", description: \"C5\" },\n  { name: \"c4\", description: \"C4\" },\n  { name: \"c3\", description: \"C3\" },\n  { name: \"c2\", description: \"C2\" },\n  { name: \"c1\", description: \"C1\" },\n  { name: \"c0\", description: \"C0\" },\n];\n\nconst CONSTANTS: Constants = {\n  customWidth: \"210mm\",\n  customHeight: \"297mm\",\n  customMargin: \"10%\",\n  baseFontSize: \"12pt\",\n  baseLineHeight: \"1.2\",\n  baseFontFamily: \"serif\",\n  viewerFontSize: 16,\n  cropMarks: \"crop cross\",\n  bleed: \"3mm\",\n  cropOffset: \"9mm\",\n};\n\nclass PageStyle {\n  pageSizeMode: Observable<Mode>;\n  presetSize: Observable<PresetSize>;\n  isLandscape: Observable<boolean>;\n  customWidth: Observable<string>;\n  customHeight: Observable<string>;\n  pageSizeImportant: Observable<boolean>;\n  pageMarginMode: Observable<Mode>;\n  customMargin: Observable<string>;\n  pageMarginImportant: Observable<boolean>;\n  firstPageMarginZero: Observable<boolean>;\n  firstPageMarginZeroImportant: Observable<boolean>;\n  forceHtmlBodyMarginZero: Observable<boolean>;\n  widowsOrphans: Observable<string>;\n  widowsOrphansImportant: Observable<boolean>;\n  imageMaxSizeToFitPage: Observable<boolean>;\n  imageMaxSizeToFitPageImportant: Observable<boolean>;\n  imageKeepAspectRatio: Observable<boolean>;\n  imageKeepAspectRatioImportant: Observable<boolean>;\n  baseFontSize: Observable<string>;\n  baseFontSizeSpecified: Observable<boolean>;\n  baseFontSizeImportant: Observable<boolean>;\n  baseLineHeight: Observable<string>;\n  baseLineHeightSpecified: Observable<boolean>;\n  baseLineHeightImportant: Observable<boolean>;\n  baseFontFamily: Observable<string>;\n  baseFontFamilySpecified: Observable<boolean>;\n  baseFontFamilyImportant: Observable<boolean>;\n  cropMarks: Observable<string>;\n  cropMarksSpecified: Observable<boolean>;\n  cropMarksImportant: Observable<boolean>;\n  bleed: Observable<string>;\n  bleedSpecified: Observable<boolean>;\n  bleedImportant: Observable<boolean>;\n  cropOffset: Observable<string>;\n  cropOffsetSpecified: Observable<boolean>;\n  cropOffsetImportant: Observable<boolean>;\n  customStyleAsUserStyle: Observable<boolean>;\n  allImportant: Observable<boolean>;\n  pageOtherStyle: Observable<string>;\n  firstPageOtherStyle: Observable<string>;\n  rootOtherStyle: Observable<string>;\n  beforeOtherStyle: Observable<string>;\n  afterOtherStyle: Observable<string>;\n\n  cssText: PureComputed<string>;\n  setViewerFontSizeObservable: (\n    viewerFontSizeObservable: null | Observable<number | string>,\n  ) => void;\n  pageStyleRegExp: RegExp;\n  viewerFontSize: null | Observable<number | string>;\n  viewerFontSizePercent: PureComputed<number | string>;\n\n  static Mode = Mode;\n  static Constants = CONSTANTS;\n  static PresetSize = PRESET_SIZE;\n  PresetSize = PageStyle.PresetSize;\n\n  constructor(pageStyle?: PageStyle) {\n    this.pageSizeMode = ko.observable(Mode.Default);\n    this.presetSize = ko.observable(PRESET_SIZE[9]);\n    this.isLandscape = ko.observable(false);\n    this.customWidth = ko.observable(CONSTANTS.customWidth);\n    this.customHeight = ko.observable(CONSTANTS.customHeight);\n    this.pageSizeImportant = ko.observable(false);\n    this.pageMarginMode = ko.observable(Mode.Default);\n    this.customMargin = ko.observable(CONSTANTS.customMargin);\n    this.pageMarginImportant = ko.observable(false);\n    this.firstPageMarginZero = ko.observable(false);\n    this.firstPageMarginZeroImportant = ko.observable(false);\n    this.forceHtmlBodyMarginZero = ko.observable(false);\n    this.widowsOrphans = ko.observable(\"\");\n    this.widowsOrphansImportant = ko.observable(false);\n    this.imageMaxSizeToFitPage = ko.observable(false);\n    this.imageMaxSizeToFitPageImportant = ko.observable(false);\n    this.imageKeepAspectRatio = ko.observable(false);\n    this.imageKeepAspectRatioImportant = ko.observable(false);\n    this.baseFontSize = ko.observable(CONSTANTS.baseFontSize);\n    this.baseFontSizeSpecified = ko.observable(false);\n    this.baseFontSizeImportant = ko.observable(false);\n    this.baseLineHeight = ko.observable(CONSTANTS.baseLineHeight);\n    this.baseLineHeightSpecified = ko.observable(false);\n    this.baseLineHeightImportant = ko.observable(false);\n    this.baseFontFamily = ko.observable(CONSTANTS.baseFontFamily);\n    this.baseFontFamilySpecified = ko.observable(false);\n    this.baseFontFamilyImportant = ko.observable(false);\n    this.cropMarks = ko.observable(CONSTANTS.cropMarks);\n    this.cropMarksSpecified = ko.observable(false);\n    this.cropMarksImportant = ko.observable(false);\n    this.bleed = ko.observable(CONSTANTS.bleed);\n    this.bleedSpecified = ko.observable(false);\n    this.bleedImportant = ko.observable(false);\n    this.cropOffset = ko.observable(CONSTANTS.cropOffset);\n    this.cropOffsetSpecified = ko.observable(false);\n    this.cropOffsetImportant = ko.observable(false);\n    this.customStyleAsUserStyle = ko.observable(false);\n    this.allImportant = ko.observable(false);\n    this.pageOtherStyle = ko.observable(\"\");\n    this.firstPageOtherStyle = ko.observable(\"\");\n    this.rootOtherStyle = ko.observable(\"\");\n    this.beforeOtherStyle = ko.observable(\"\");\n    this.afterOtherStyle = ko.observable(\"\");\n\n    this.viewerFontSize = null;\n    this.setViewerFontSizeObservable = (viewerFontSizeObservable): void => {\n      this.viewerFontSize = viewerFontSizeObservable;\n      const elem = document.getElementsByName(\n        \"vivliostyle-settings_viewer-font-size\",\n      )[0] as HTMLInputElement;\n      if (elem) {\n        elem.value = this.fontSizePxToPercent(\n          Number(viewerFontSizeObservable()),\n          100,\n          5,\n        ).toString();\n      }\n    };\n\n    this.viewerFontSizePercent = ko.pureComputed({\n      read() {\n        if (!this.viewerFontSize) {\n          return 100;\n        }\n        const percent = this.fontSizePxToPercent(\n          Number(this.viewerFontSize()),\n          100,\n          5,\n        );\n        return percent;\n      },\n      write(viewerFontSizePercent) {\n        if (!this.viewerFontSize) {\n          return;\n        }\n        const percent = parseFloat(String(viewerFontSizePercent));\n        let fontSize = percent && this.fontSizePercentToPx(percent);\n        if (!fontSize || Number(fontSize) < 5 || Number(fontSize) > 72) {\n          const elem = document.getElementsByName(\n            \"vivliostyle-settings_viewer-font-size\",\n          )[0] as HTMLInputElement;\n          if (elem) {\n            elem.value = \"100\";\n          }\n          fontSize = CONSTANTS.viewerFontSize;\n        }\n        this.viewerFontSize(Number(fontSize));\n      },\n      owner: this,\n    });\n\n    this.cssText = ko.pureComputed({\n      read: this.toCSSText,\n      write: this.fromCSSText,\n      owner: this,\n    });\n\n    this.allImportant.subscribe((allImportant) => {\n      this.pageSizeImportant(allImportant);\n      this.pageMarginImportant(allImportant);\n      this.firstPageMarginZeroImportant(allImportant);\n      this.widowsOrphansImportant(allImportant);\n      this.imageMaxSizeToFitPageImportant(allImportant);\n      this.imageKeepAspectRatioImportant(allImportant);\n      this.baseFontSizeImportant(allImportant);\n      this.baseLineHeightImportant(allImportant);\n      this.baseFontFamilyImportant(allImportant);\n      this.cropMarksImportant(allImportant);\n      this.bleedImportant(allImportant);\n      this.cropOffsetImportant(allImportant);\n    });\n\n    this.cropMarksSpecified.subscribe((cropMarksSpecified) => {\n      if (cropMarksSpecified) {\n        // when marks is specified, bleed should also be specified\n        // because the CSS default bleed 6pt is not very good.\n        this.bleedSpecified(true);\n      } else {\n        // when marks is turned off, bleed and cropOffset should also be turned off.\n        this.bleedSpecified(false);\n        this.cropOffsetSpecified(false);\n      }\n    });\n\n    this.pageStyleRegExp = new RegExp(\n      // 1. beforeOtherStyle,\n      \"^((?:\\\\n|.)*?)\\\\/\\\\*<viewer>\\\\*\\\\/\\\\s*(?:@page\\\\s*\\\\{\\\\s*\" +\n        // 2. sizeW, sizeH, sizeImportant,\n        \"(?:size:\\\\s*([^\\\\s!;{}]+)(?:\\\\s+([^\\\\s!;{}]+))?\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?\" +\n        // 5. pageMargin, pageMarginImportant,\n        \"(?:margin:\\\\s*([^\\\\s!;{}]+(?:\\\\s+[^\\\\s!;{}]+)?(?:\\\\s+[^\\\\s!;{}]+)?(?:\\\\s+[^\\\\s!;{}]+)?)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?\" +\n        // 7. cropMarks, cropMarksImportant\n        \"(?:marks:\\\\s*([^\\\\s!;{}]+(?:\\\\s+[^\\\\s!;{}]+)?)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?\" +\n        // 9. bleed, bleedImportant\n        \"(?:bleed:\\\\s*([^\\\\s!;{}]+)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?\" +\n        // 11. cropOffset, cropOffsetImportant\n        \"(?:crop-offset:\\\\s*([^\\\\s!;{}]+)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?\" +\n        // 13. pageOtherStyle,\n        \"((?:[^{}]+|\\\\{[^{}]*\\\\})*)\\\\}\\\\s*)?\" +\n        // 14. firstPageMarginZero, firstPageMarginZeroImportant, firstPageOtherStyle,\n        \"(?:@page\\\\s*:first\\\\s*\\\\{\\\\s*(margin:\\\\s*0(?:\\\\w+|%)?\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?((?:[^{}]+|\\\\{[^{}]*\\\\})*)\\\\}\\\\s*)?\" +\n        // 17. forceHtmlBodyMarginZero,\n        \"((?:html|:root),\\\\s*body\\\\s*\\\\{\\\\s*margin:\\\\s*0(?:\\\\w+|%)?\\\\s*!important(?:;|(?=[\\\\s{}]))\\\\s*\\\\}\\\\s*)?\" +\n        // 18. baseFontSize, baseFontSizeImportant, baseLineHeight, baseLineHeightImportant, baseFontFamily, baseFontFamilyImportant, rootOtherStyle,\n        \"(?:(?:html|:root)\\\\s*\\\\{\\\\s*(?:font-size:\\\\s*(calc\\\\([^()]+\\\\)|[^\\\\s!;{}]+)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?(?:line-height:\\\\s*([^\\\\s!;{}]+)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?(?:font-family:\\\\s*([^!;{}]+)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?([^{}]*)\\\\}\\\\s*)?\" +\n        // body {font-size: inherit !important;} etc.\n        \"(?:body\\\\s*\\\\{\\\\s*(?:[-\\\\w]+:\\\\s*inherit\\\\s*!important(?:;|(?=[\\\\s{}]))\\\\s*)+\\\\}\\\\s*)?\" +\n        // 25. widowsOrphans, widowsOrphansImportant,\n        \"(?:\\\\*\\\\s*\\\\{\\\\s*widows:\\\\s*(1|999)\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*orphans:\\\\s*\\\\25\\\\s*\\\\26(?:;|(?=[\\\\s{}]))\\\\s*\\\\}\\\\s*)?\" +\n        // 27. imageMaxSizeToFitPage, imageMaxSizeToFitPageImportant, imageKeepAspectRatio, imageKeepAspectRatioImportant,\n        \"(?:img,\\\\s*svg\\\\s*\\\\{\\\\s*(max-inline-size:\\\\s*100%\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*max-block-size:\\\\s*100vb\\\\s*\\\\28(?:;|(?=[\\\\s{}]))\\\\s*)?(object-fit:\\\\s*contain\\\\s*(!important)?(?:;|(?=[\\\\s{}]))\\\\s*)?\\\\}\\\\s*)?\" +\n        // 31. afterOtherStyle\n        \"((?:\\\\n|.)*)$\",\n    );\n\n    if (pageStyle) {\n      this.copyFrom(pageStyle);\n    }\n  }\n\n  /**\n   * @param {number} px Font size in px unit\n   * @param {number=} cent When _N_ (e.g. 1) is specified, get \"per _N_\" value instead of percent\n   * @param {number=} precision When specified, converts result number to string with max _precision_ digits\n   * @returns {number|string} converted percent (or per _N_) value. Returns string when opt_precision is specified.\n   */\n  fontSizePxToPercent(\n    px: number,\n    cent?: number,\n    precision?: number,\n  ): number | string {\n    let percent: number | string =\n      (px / CONSTANTS.viewerFontSize) * (cent || 100);\n    if (precision) {\n      percent = percent\n        .toPrecision(precision)\n        .replace(/(?:\\.0*|(\\.\\d*?)0+)$/, \"$1\");\n    }\n    return percent;\n  }\n\n  /**\n   * @param {number} percent Font size in percent (or per _N_) unit\n   * @param {number=} cent When _N_ (e.g. 1) is specified, converts fromg \"per _N_\" value instead of percent\n   * @param {number=} precision When specified, converts result number to string with max _precision_ digits\n   * @returns {number|string} converted font size in px unit. Returns string when opt_precision is specified.\n   */\n  fontSizePercentToPx(\n    percent: number,\n    cent?: number,\n    precision?: number,\n  ): number | string {\n    let px: number | string =\n      (percent / (cent || 100)) * CONSTANTS.viewerFontSize;\n    if (precision) {\n      px = px.toPrecision(precision).replace(/(?:\\.0*|(\\.\\d*?)0+)$/, \"$1\");\n    }\n    return px;\n  }\n\n  fromCSSText(cssText: string): void {\n    const r = this.pageStyleRegExp.exec(cssText);\n    if (r) {\n      const [\n        ,\n        beforeOtherStyle,\n        sizeW_,\n        sizeH_,\n        sizeImportant,\n        pageMargin,\n        pageMarginImportant,\n        cropMarks,\n        cropMarksImportant,\n        bleed,\n        bleedImportant,\n        cropOffset,\n        cropOffsetImportant,\n        pageOtherStyle_,\n        firstPageMarginZero,\n        firstPageMarginZeroImportant,\n        firstPageOtherStyle_,\n        forceHtmlBodyMarginZero,\n        baseFontSize_,\n        baseFontSizeImportant,\n        baseLineHeight,\n        baseLineHeightImportant,\n        baseFontFamily_,\n        baseFontFamilyImportant,\n        rootOtherStyle_,\n        widowsOrphans,\n        widowsOrphansImportant,\n        imageMaxSizeToFitPage,\n        imageMaxSizeToFitPageImportant,\n        imageKeepAspectRatio,\n        imageKeepAspectRatioImportant,\n        afterOtherStyle_,\n      ] = r;\n      let afterOtherStyle = afterOtherStyle_;\n      let baseFontFamily = baseFontFamily_;\n      let baseFontSize = baseFontSize_;\n      let firstPageOtherStyle = firstPageOtherStyle_;\n      let pageOtherStyle = pageOtherStyle_;\n      let rootOtherStyle = rootOtherStyle_;\n      let sizeW = sizeW_;\n      let sizeH = sizeH_;\n\n      let countImportant = 0;\n      let countNotImportant = 0;\n\n      this.beforeOtherStyle(beforeOtherStyle);\n\n      if (sizeW == \"landscape\" || sizeW == \"portrait\") {\n        this.isLandscape(sizeW == \"landscape\");\n        sizeW = sizeH;\n        sizeH = null;\n      } else if (sizeH == \"landscape\" || sizeH == \"portrait\") {\n        this.isLandscape(sizeH == \"landscape\");\n        sizeH = null;\n      }\n      if (sizeW != null) {\n        if (sizeH == null) {\n          if (sizeW == \"auto\") {\n            this.pageSizeMode(Mode.Auto);\n          } else {\n            const presetSize = PRESET_SIZE.find(\n              (presetSize) =>\n                presetSize.name.toLowerCase() == sizeW.toLowerCase(),\n            );\n            if (presetSize) {\n              this.pageSizeMode(Mode.Preset);\n              this.presetSize(presetSize);\n            } else {\n              this.pageSizeMode(Mode.Custom);\n              this.customWidth(sizeW);\n              this.customHeight(sizeW);\n            }\n          }\n        } else {\n          this.pageSizeMode(Mode.Custom);\n          this.customWidth(sizeW);\n          this.customHeight(sizeH);\n        }\n        this.pageSizeImportant(!!sizeImportant);\n        if (sizeImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.pageSizeMode(Mode.Default);\n      }\n      if (pageMargin != null) {\n        this.pageMarginMode(pageMargin == \"0\" ? Mode.Zero : Mode.Custom);\n        if (pageMargin == \"0\") {\n          this.pageMarginMode(Mode.Zero);\n        } else {\n          this.pageMarginMode(Mode.Custom);\n          this.customMargin(pageMargin);\n        }\n        this.pageMarginImportant(!!pageMarginImportant);\n        if (pageMarginImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.pageMarginMode(Mode.Default);\n      }\n      if (cropMarks != null) {\n        this.cropMarksSpecified(true);\n        this.cropMarks(cropMarks);\n        this.cropMarksImportant(!!cropMarksImportant);\n        if (cropMarksImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.cropMarksSpecified(false);\n      }\n      if (bleed != null) {\n        this.bleedSpecified(true);\n        this.bleed(bleed);\n        this.bleedImportant(!!bleedImportant);\n        if (bleedImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.bleedSpecified(false);\n      }\n      if (cropOffset != null) {\n        this.cropOffsetSpecified(true);\n        this.cropOffset(cropOffset);\n        this.cropOffsetImportant(!!cropOffsetImportant);\n        if (cropOffsetImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.cropOffsetSpecified(false);\n      }\n      pageOtherStyle = pageOtherStyle || \"\";\n      this.pageOtherStyle(pageOtherStyle);\n\n      if (firstPageMarginZero) {\n        this.firstPageMarginZero(true);\n        this.firstPageMarginZeroImportant(!!firstPageMarginZeroImportant);\n        if (firstPageMarginZeroImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.firstPageMarginZero(false);\n      }\n      firstPageOtherStyle = firstPageOtherStyle || \"\";\n      this.firstPageOtherStyle(firstPageOtherStyle);\n\n      if (forceHtmlBodyMarginZero) {\n        this.forceHtmlBodyMarginZero(true);\n      } else {\n        this.forceHtmlBodyMarginZero(false);\n      }\n\n      if (baseFontSize != null) {\n        // This may be calc() e.g. \"calc(1.25 * 12pt)\" when viewer font size is 125%.\n        baseFontSize = baseFontSize.replace(\n          /^\\s*calc\\([.\\d]+\\s*\\*\\s*([.\\d]+\\w+)\\)\\s*$/,\n          \"$1\",\n        );\n        this.baseFontSizeSpecified(true);\n        this.baseFontSize(baseFontSize);\n        this.baseFontSizeImportant(!!baseFontSizeImportant);\n        if (baseFontSizeImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.baseFontSizeSpecified(false);\n      }\n      if (baseLineHeight != null) {\n        this.baseLineHeightSpecified(true);\n        this.baseLineHeight(baseLineHeight);\n        this.baseLineHeightImportant(!!baseLineHeightImportant);\n        if (baseLineHeightImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.baseLineHeightSpecified(false);\n      }\n      if (baseFontFamily != null) {\n        baseFontFamily = baseFontFamily.trim();\n        this.baseFontFamilySpecified(true);\n        this.baseFontFamily(baseFontFamily);\n        this.baseFontFamilyImportant(!!baseFontFamilyImportant);\n        if (baseFontFamilyImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.baseFontFamilySpecified(false);\n      }\n      rootOtherStyle = rootOtherStyle || \"\";\n      this.rootOtherStyle(rootOtherStyle);\n\n      if (widowsOrphans != null) {\n        this.widowsOrphans(widowsOrphans);\n        this.widowsOrphansImportant(!!widowsOrphansImportant);\n        if (widowsOrphansImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.widowsOrphans(Mode.Default);\n      }\n\n      if (imageMaxSizeToFitPage) {\n        this.imageMaxSizeToFitPage(true);\n        this.imageMaxSizeToFitPageImportant(!!imageMaxSizeToFitPageImportant);\n        if (imageMaxSizeToFitPageImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.imageMaxSizeToFitPage(false);\n      }\n\n      if (imageKeepAspectRatio) {\n        this.imageKeepAspectRatio(true);\n        this.imageKeepAspectRatioImportant(!!imageKeepAspectRatioImportant);\n        if (imageKeepAspectRatioImportant) countImportant++;\n        else countNotImportant++;\n      } else {\n        this.imageKeepAspectRatio(false);\n      }\n\n      afterOtherStyle =\n        afterOtherStyle.replace(/\\/\\*<\\/?viewer>\\*\\/\\n?/g, \"\") || \"\";\n      this.afterOtherStyle(afterOtherStyle);\n\n      this.allImportant(countImportant > 0 && countNotImportant == 0);\n    } else {\n      // When not match\n      const afterOtherStyle =\n        cssText.replace(/\\/\\*<\\/?viewer>\\*\\/\\n?/g, \"\") || \"\";\n      this.afterOtherStyle(afterOtherStyle);\n    }\n  }\n\n  toCSSText(): string {\n    function imp(important): string {\n      return important ? \" !important\" : \"\";\n    }\n\n    let cssText = this.beforeOtherStyle();\n    cssText += \"/*<viewer>*/\\n\";\n    if (\n      this.pageSizeMode() != Mode.Default ||\n      this.pageMarginMode() != Mode.Default ||\n      this.cropMarksSpecified() ||\n      this.bleedSpecified() ||\n      this.cropOffsetSpecified() ||\n      this.pageOtherStyle()\n    ) {\n      cssText += \"@page { \";\n      if (this.pageSizeMode() != Mode.Default) {\n        cssText += \"size: \";\n\n        switch (this.pageSizeMode()) {\n          case Mode.Auto:\n            cssText += \"auto\";\n            break;\n          case Mode.Preset:\n            cssText += this.presetSize().name;\n            if (this.isLandscape()) {\n              cssText += \" landscape\";\n            }\n            break;\n          case Mode.Custom:\n            cssText += `${this.customWidth()} ${this.customHeight()}`;\n            break;\n          default:\n            throw new Error(`Unknown pageSizeMode ${this.pageSizeMode()}`);\n        }\n        cssText += `${imp(this.pageSizeImportant())}; `;\n      }\n      if (this.pageMarginMode() != Mode.Default) {\n        cssText += \"margin: \";\n\n        switch (this.pageMarginMode()) {\n          case Mode.Auto:\n            cssText += \"auto\";\n            break;\n          case Mode.Zero:\n            cssText += \"0\";\n            break;\n          case Mode.Custom:\n            cssText += `${this.customMargin()}`;\n            break;\n          default:\n            throw new Error(`Unknown pageMarginMode ${this.pageMarginMode()}`);\n        }\n        cssText += `${imp(this.pageMarginImportant())}; `;\n      }\n      if (this.cropMarksSpecified()) {\n        cssText += `marks: ${this.cropMarks()}${imp(\n          this.cropMarksImportant(),\n        )}; `;\n      }\n      if (this.bleedSpecified()) {\n        cssText += `bleed: ${this.bleed()}${imp(this.bleedImportant())}; `;\n      }\n      if (this.cropOffsetSpecified()) {\n        cssText += `crop-offset: ${this.cropOffset()}${imp(\n          this.cropOffsetImportant(),\n        )}; `;\n      }\n      cssText += this.pageOtherStyle();\n      cssText += \"}\\n\";\n    }\n\n    if (this.firstPageMarginZero() || this.firstPageOtherStyle()) {\n      cssText += \"@page :first { \";\n      if (this.firstPageMarginZero()) {\n        cssText += `margin: 0${imp(this.firstPageMarginZeroImportant())}; `;\n      }\n      cssText += this.firstPageOtherStyle();\n      cssText += \"}\\n\";\n    }\n\n    if (this.forceHtmlBodyMarginZero()) {\n      cssText += \":root, body { margin: 0 !important; }\\n\";\n    }\n\n    if (\n      this.baseFontSizeSpecified() ||\n      this.baseLineHeightSpecified() ||\n      this.baseFontFamilySpecified() ||\n      this.rootOtherStyle()\n    ) {\n      cssText += \":root { \";\n      const baseFontSize = this.baseFontSize();\n      if (this.baseFontSizeSpecified()) {\n        if (\n          this.viewerFontSize &&\n          this.viewerFontSize() != CONSTANTS.viewerFontSize &&\n          !baseFontSize.endsWith(\"%\")\n        ) {\n          const perOne = this.fontSizePxToPercent(\n            Number(this.viewerFontSize()),\n            1,\n            5,\n          );\n          cssText += `font-size: calc(${perOne} * ${baseFontSize})${imp(\n            this.baseFontSizeImportant(),\n          )}; `;\n        } else {\n          cssText += `font-size: ${this.baseFontSize()}${imp(\n            this.baseFontSizeImportant(),\n          )}; `;\n        }\n      }\n      if (this.baseLineHeightSpecified()) {\n        cssText += `line-height: ${this.baseLineHeight()}${imp(\n          this.baseLineHeightImportant(),\n        )}; `;\n      }\n      if (this.baseFontFamilySpecified()) {\n        cssText += `font-family: ${this.baseFontFamily()}${imp(\n          this.baseFontFamilyImportant(),\n        )}; `;\n      }\n      cssText += this.rootOtherStyle();\n      cssText += \"}\\n\";\n    }\n    if (\n      (this.baseFontSizeSpecified() && this.baseFontSizeImportant()) ||\n      (this.baseLineHeightSpecified() && this.baseLineHeightImportant()) ||\n      (this.baseFontFamilySpecified() && this.baseFontFamilyImportant())\n    ) {\n      cssText += \"body { \";\n      if (this.baseFontSizeSpecified() && this.baseFontSizeImportant()) {\n        cssText += \"font-size: inherit !important; \";\n      }\n      if (this.baseLineHeightSpecified() && this.baseLineHeightImportant()) {\n        cssText += \"line-height: inherit !important; \";\n      }\n      if (this.baseFontFamilySpecified() && this.baseFontFamilyImportant()) {\n        cssText += \"font-family: inherit !important; \";\n      }\n      cssText += \"}\\n\";\n    }\n\n    if (this.widowsOrphans()) {\n      cssText += \"* { \";\n      cssText += `widows: ${this.widowsOrphans()}${imp(\n        this.widowsOrphansImportant(),\n      )}; `;\n      cssText += `orphans: ${this.widowsOrphans()}${imp(\n        this.widowsOrphansImportant(),\n      )}; `;\n      cssText += \"}\\n\";\n    }\n\n    if (this.imageMaxSizeToFitPage() || this.imageKeepAspectRatio()) {\n      cssText += \"img, svg { \";\n      if (this.imageMaxSizeToFitPage()) {\n        cssText += `max-inline-size: 100%${imp(\n          this.imageMaxSizeToFitPageImportant(),\n        )}; `;\n        cssText += `max-block-size: 100vb${imp(\n          this.imageMaxSizeToFitPageImportant(),\n        )}; `;\n      }\n      if (this.imageKeepAspectRatio()) {\n        cssText += `object-fit: contain${imp(\n          this.imageKeepAspectRatioImportant(),\n        )}; `;\n      }\n      cssText += \"}\\n\";\n    }\n\n    cssText += \"/*</viewer>*/\\n\";\n    cssText += this.afterOtherStyle();\n\n    return cssText;\n  }\n\n  copyFrom(other: PageStyle): void {\n    this.pageSizeMode(other.pageSizeMode());\n    this.presetSize(other.presetSize());\n    this.isLandscape(other.isLandscape());\n    this.customWidth(other.customWidth());\n    this.customHeight(other.customHeight());\n    this.pageSizeImportant(other.pageSizeImportant());\n    this.pageMarginMode(other.pageMarginMode());\n    this.customMargin(other.customMargin());\n    this.pageMarginImportant(other.pageMarginImportant());\n    this.firstPageMarginZero(other.firstPageMarginZero());\n    this.firstPageMarginZeroImportant(other.firstPageMarginZeroImportant());\n    this.forceHtmlBodyMarginZero(other.forceHtmlBodyMarginZero());\n    this.widowsOrphans(other.widowsOrphans());\n    this.widowsOrphansImportant(other.widowsOrphansImportant());\n    this.imageMaxSizeToFitPage(other.imageMaxSizeToFitPage());\n    this.imageMaxSizeToFitPageImportant(other.imageMaxSizeToFitPageImportant());\n    this.imageKeepAspectRatio(other.imageKeepAspectRatio());\n    this.imageKeepAspectRatioImportant(other.imageKeepAspectRatioImportant());\n    this.baseFontSize(other.baseFontSize());\n    this.baseFontSizeSpecified(other.baseFontSizeSpecified());\n    this.baseFontSizeImportant(other.baseFontSizeImportant());\n    this.baseLineHeight(other.baseLineHeight());\n    this.baseLineHeightSpecified(other.baseLineHeightSpecified());\n    this.baseLineHeightImportant(other.baseLineHeightImportant());\n    this.baseFontFamily(other.baseFontFamily());\n    this.baseFontFamilySpecified(other.baseFontFamilySpecified());\n    this.baseFontFamilyImportant(other.baseFontFamilyImportant());\n    this.cropMarks(other.cropMarks());\n    this.cropMarksSpecified(other.cropMarksSpecified());\n    this.cropMarksImportant(other.cropMarksImportant());\n    this.bleed(other.bleed());\n    this.bleedSpecified(other.bleedSpecified());\n    this.bleedImportant(other.bleedImportant());\n    this.cropOffset(other.cropOffset());\n    this.cropOffsetSpecified(other.cropOffsetSpecified());\n    this.cropOffsetImportant(other.cropOffsetImportant());\n    this.allImportant(other.allImportant());\n    this.pageOtherStyle(other.pageOtherStyle());\n    this.firstPageOtherStyle(other.firstPageOtherStyle());\n    this.rootOtherStyle(other.rootOtherStyle());\n    this.beforeOtherStyle(other.beforeOtherStyle());\n    this.afterOtherStyle(other.afterOtherStyle());\n\n    if (this.viewerFontSize && other.viewerFontSize) {\n      this.viewerFontSize(other.viewerFontSize());\n    }\n    // This must be last because DocumentOptions.updateCustomStyleSheetFromCSSText()\n    // is invoked by changes of other values and it uses customStyleAsUserStyle value.\n    this.customStyleAsUserStyle(other.customStyleAsUserStyle());\n  }\n\n  equivalentTo(other: PageStyle): boolean {\n    if (this.pageSizeMode() !== other.pageSizeMode()) return false;\n    if (\n      this.pageSizeMode() === Mode.Preset &&\n      this.presetSize() !== other.presetSize()\n    )\n      return false;\n    if (\n      this.pageSizeMode() === Mode.Preset &&\n      this.isLandscape() !== other.isLandscape()\n    )\n      return false;\n    if (\n      this.pageSizeMode() === Mode.Custom &&\n      this.customWidth() !== other.customWidth()\n    )\n      return false;\n    if (\n      this.pageSizeMode() === Mode.Custom &&\n      this.customHeight() !== other.customHeight()\n    )\n      return false;\n    if (this.pageSizeImportant() !== other.pageSizeImportant()) return false;\n\n    if (this.pageMarginMode() !== other.pageMarginMode()) return false;\n    if (\n      this.pageMarginMode() === Mode.Custom &&\n      this.customMargin() !== other.customMargin()\n    )\n      return false;\n    if (this.pageMarginImportant() !== other.pageMarginImportant())\n      return false;\n    if (this.firstPageMarginZero() !== other.firstPageMarginZero())\n      return false;\n    if (\n      this.firstPageMarginZeroImportant() !==\n      other.firstPageMarginZeroImportant()\n    )\n      return false;\n    if (this.forceHtmlBodyMarginZero() !== other.forceHtmlBodyMarginZero())\n      return false;\n\n    if (this.widowsOrphans() !== other.widowsOrphans()) return false;\n    if (this.widowsOrphansImportant() !== other.widowsOrphansImportant())\n      return false;\n\n    if (this.imageMaxSizeToFitPage() !== other.imageMaxSizeToFitPage())\n      return false;\n    if (\n      this.imageMaxSizeToFitPageImportant() !==\n      other.imageMaxSizeToFitPageImportant()\n    )\n      return false;\n    if (this.imageKeepAspectRatio() !== other.imageKeepAspectRatio())\n      return false;\n    if (\n      this.imageKeepAspectRatioImportant() !==\n      other.imageKeepAspectRatioImportant()\n    )\n      return false;\n\n    if (this.baseFontSizeSpecified() !== other.baseFontSizeSpecified())\n      return false;\n    if (\n      this.baseFontSizeSpecified() &&\n      this.baseFontSize() !== other.baseFontSize()\n    )\n      return false;\n    if (this.baseFontSizeImportant() !== other.baseFontSizeImportant())\n      return false;\n    if (this.baseLineHeightSpecified() !== other.baseLineHeightSpecified())\n      return false;\n    if (\n      this.baseLineHeightSpecified() &&\n      this.baseLineHeight() !== other.baseLineHeight()\n    )\n      return false;\n    if (this.baseLineHeightImportant() !== other.baseLineHeightImportant())\n      return false;\n    if (this.baseFontFamilySpecified() !== other.baseFontFamilySpecified())\n      return false;\n    if (\n      this.baseFontFamilySpecified() &&\n      this.baseFontFamily() !== other.baseFontFamily()\n    )\n      return false;\n    if (this.baseFontFamilyImportant() !== other.baseFontFamilyImportant())\n      return false;\n\n    if (this.cropMarksSpecified() !== other.cropMarksSpecified()) return false;\n    if (this.cropMarksSpecified() && this.cropMarks() !== other.cropMarks())\n      return false;\n    if (this.cropMarksImportant() !== other.cropMarksImportant()) return false;\n    if (this.bleedSpecified() !== other.bleedSpecified()) return false;\n    if (this.bleedSpecified() && this.bleed() !== other.bleed()) return false;\n    if (this.bleedImportant() !== other.bleedImportant()) return false;\n    if (this.cropOffsetSpecified() !== other.cropOffsetSpecified())\n      return false;\n    if (this.cropOffsetSpecified() && this.cropOffset() !== other.cropOffset())\n      return false;\n    if (this.cropOffsetImportant() !== other.cropOffsetImportant())\n      return false;\n\n    if (this.customStyleAsUserStyle() !== other.customStyleAsUserStyle())\n      return false;\n    if (this.allImportant() !== other.allImportant()) return false;\n    if (this.pageOtherStyle() !== other.pageOtherStyle()) return false;\n    if (this.firstPageOtherStyle() !== other.firstPageOtherStyle())\n      return false;\n    if (this.rootOtherStyle() !== other.rootOtherStyle()) return false;\n    if (this.beforeOtherStyle() !== other.beforeOtherStyle()) return false;\n    if (this.afterOtherStyle() !== other.afterOtherStyle()) return false;\n\n    if (\n      !this.viewerFontSize !== !other.viewerFontSize ||\n      (this.viewerFontSize && this.viewerFontSize() !== other.viewerFontSize())\n    )\n      return false;\n\n    return true;\n  }\n}\n\nexport default PageStyle;\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.i18nextko = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n(function () {\n  var i18n;\n  if (typeof require !== 'undefined') {\n    i18n = require('i18next');\n  } else {\n    i18n = window.i18n;\n  }\n  var ko, $;\n\n  var koBindingHandler = {\n    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n      ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n        var i = i18nextko._koElements.indexOf(element);\n        if (i >= 0) {\n          i18nextko._koElements.splice(i, 1);\n          i18nextko._koCallbacks.splice(i, 1);\n        }\n      });\n      i18nextko._koElements.push(element);\n      i18nextko._koCallbacks.push(ko.bindingHandlers['i18n'].update.bind(undefined, element, valueAccessor, allBindingsAccessor, viewModel, bindingContext));\n      koBindingHandler.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\n    },\n\n    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n      var value = ko.toJS(valueAccessor());\n      if (typeof value === 'string') {\n        element.innerHTML = i18n.t(value);\n      } else if (value.key) {\n        element.innerHTML = i18n.t(value.key, value.options);\n      } else {\n        for (var attr in value) {\n          var options = value[attr];\n          var translation;\n          if (typeof options === 'string') {\n            translation = i18n.t(options);\n          }\n          else {\n            translation = i18n.t(options.key, ko.toJS(options.options));\n          }\n          if (attr == 'html') {\n            element.innerHTML = translation;\n          }\n          else {\n            var div = document.createElement('div');\n            div.innerHTML = translation;\n            element.setAttribute(attr, div.innerText);\n          }\n        }\n      }\n    }\n  };\n\n  var i18nextko = {\n    _koElements: [],\n    _koCallbacks: [],\n\n    setLanguage: function (language) {\n      i18n.setLng(language);\n      i18nextko._language(language);\n      i18nextko._koCallbacks.forEach(function (c) {\n        return c.call(undefined);\n      });\n      if (typeof $ !== 'undefined' && typeof $.fn.i18n !== 'undefined') {\n        $('html').i18n();\n      }\n    },\n\n    init: function (resourceStore, language, knockout, jquery) {\n      ko = knockout || window.ko;\n      $ = jquery || window.$;\n\n      i18n.init({\n        compatibilityAPI: 'v1',\n        lng: language || 'en',\n        resStore: resourceStore\n      });\n\n      ko.bindingHandlers['i18n'] = koBindingHandler;\n      i18nextko._language = ko.observable(language);\n      i18nextko.setLanguage(language);\n    },\n\n    t: function () {\n      var args = arguments;\n      return ko.computed(function () {\n        i18nextko._language(); //to auto-update this computed observable on language changes\n        return i18n.t.apply(i18n, args);\n      });\n    },\n\n    i18n: i18n\n  };\n\n  if (typeof module !== 'undefined') {\n    module.exports = i18nextko;\n  } else {\n    window.i18nextko = i18nextko;\n  }\n})();\n\n},{\"i18next\":17}],2:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nfunction remove(arr, what) {\n  var found = arr.indexOf(what);\n\n  while (found !== -1) {\n    arr.splice(found, 1);\n    found = arr.indexOf(what);\n  }\n}\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  function Connector(backend, store, services) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    _classCallCheck(this, Connector);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.backend = backend;\n    _this.store = store;\n    _this.services = services;\n    _this.options = options;\n    _this.logger = _logger2.default.create('backendConnector');\n\n    _this.state = {};\n    _this.queue = [];\n\n    _this.backend && _this.backend.init && _this.backend.init(services, options.backend, options);\n    return _this;\n  }\n\n  Connector.prototype.queueLoad = function queueLoad(languages, namespaces, callback) {\n    var _this2 = this;\n\n    // find what needs to be loaded\n    var toLoad = [],\n        pending = [],\n        toLoadLanguages = [],\n        toLoadNamespaces = [];\n\n    languages.forEach(function (lng) {\n      var hasAllNamespaces = true;\n\n      namespaces.forEach(function (ns) {\n        var name = lng + '|' + ns;\n\n        if (_this2.store.hasResourceBundle(lng, ns)) {\n          _this2.state[name] = 2; // loaded\n        } else if (_this2.state[name] < 0) {\n            // nothing to do for err\n          } else if (_this2.state[name] === 1) {\n              if (pending.indexOf(name) < 0) pending.push(name);\n            } else {\n              _this2.state[name] = 1; // pending\n\n              hasAllNamespaces = false;\n\n              if (pending.indexOf(name) < 0) pending.push(name);\n              if (toLoad.indexOf(name) < 0) toLoad.push(name);\n              if (toLoadNamespaces.indexOf(ns) < 0) toLoadNamespaces.push(ns);\n            }\n      });\n\n      if (!hasAllNamespaces) toLoadLanguages.push(lng);\n    });\n\n    if (toLoad.length || pending.length) {\n      this.queue.push({\n        pending: pending,\n        loaded: {},\n        errors: [],\n        callback: callback\n      });\n    }\n\n    return {\n      toLoad: toLoad,\n      pending: pending,\n      toLoadLanguages: toLoadLanguages,\n      toLoadNamespaces: toLoadNamespaces\n    };\n  };\n\n  Connector.prototype.loaded = function loaded(name, err, data) {\n    var _this3 = this;\n\n    var _name$split = name.split('|');\n\n    var _name$split2 = _slicedToArray(_name$split, 2);\n\n    var lng = _name$split2[0];\n    var ns = _name$split2[1];\n\n\n    if (err) this.emit('failedLoading', lng, ns, err);\n\n    if (data) {\n      this.store.addResourceBundle(lng, ns, data);\n    }\n\n    // set loaded\n    this.state[name] = err ? -1 : 2;\n    // callback if ready\n    this.queue.forEach(function (q) {\n      utils.pushPath(q.loaded, [lng], ns);\n      remove(q.pending, name);\n\n      if (err) q.errors.push(err);\n\n      if (q.pending.length === 0 && !q.done) {\n        q.errors.length ? q.callback(q.errors) : q.callback();\n        _this3.emit('loaded', q.loaded);\n        q.done = true;\n      }\n    });\n\n    // remove done load requests\n    this.queue = this.queue.filter(function (q) {\n      return !q.done;\n    });\n  };\n\n  Connector.prototype.read = function read(lng, ns, fcName, tried, wait, callback) {\n    var _this4 = this;\n\n    if (!tried) tried = 0;\n    if (!wait) wait = 250;\n\n    if (!lng.length) return callback(null, {}); // noting to load\n\n    this.backend[fcName](lng, ns, function (err, data) {\n      if (err && data /* = retryFlag */ && tried < 5) {\n        setTimeout(function () {\n          _this4.read.call(_this4, lng, ns, fcName, ++tried, wait * 2, callback);\n        }, wait);\n        return;\n      }\n      callback(err, data);\n    });\n  };\n\n  Connector.prototype.load = function load(languages, namespaces, callback) {\n    var _this5 = this;\n\n    if (!this.backend) {\n      this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n      return callback && callback();\n    }\n    var options = _extends({}, this.backend.options, this.options.backend);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    var toLoad = this.queueLoad(languages, namespaces, callback);\n    if (!toLoad.toLoad.length) {\n      if (!toLoad.pending.length) callback(); // nothing to load and no pendings...callback now\n      return; // pendings will trigger callback\n    }\n\n    // load with multi-load\n    if (options.allowMultiLoading && this.backend.readMulti) {\n      this.read(toLoad.toLoadLanguages, toLoad.toLoadNamespaces, 'readMulti', null, null, function (err, data) {\n        if (err) _this5.logger.warn('loading namespaces ' + toLoad.toLoadNamespaces.join(', ') + ' for languages ' + toLoad.toLoadLanguages.join(', ') + ' via multiloading failed', err);\n        if (!err && data) _this5.logger.log('loaded namespaces ' + toLoad.toLoadNamespaces.join(', ') + ' for languages ' + toLoad.toLoadLanguages.join(', ') + ' via multiloading', data);\n\n        toLoad.toLoad.forEach(function (name) {\n          var _name$split3 = name.split('|');\n\n          var _name$split4 = _slicedToArray(_name$split3, 2);\n\n          var l = _name$split4[0];\n          var n = _name$split4[1];\n\n\n          var bundle = utils.getPath(data, [l, n]);\n          if (bundle) {\n            _this5.loaded(name, err, bundle);\n          } else {\n            var _err = 'loading namespace ' + n + ' for language ' + l + ' via multiloading failed';\n            _this5.loaded(name, _err);\n            _this5.logger.error(_err);\n          }\n        });\n      });\n    }\n\n    // load one by one\n    else {\n        (function () {\n          var readOne = function readOne(name) {\n            var _this6 = this;\n\n            var _name$split5 = name.split('|');\n\n            var _name$split6 = _slicedToArray(_name$split5, 2);\n\n            var lng = _name$split6[0];\n            var ns = _name$split6[1];\n\n\n            this.read(lng, ns, 'read', null, null, function (err, data) {\n              if (err) _this6.logger.warn('loading namespace ' + ns + ' for language ' + lng + ' failed', err);\n              if (!err && data) _this6.logger.log('loaded namespace ' + ns + ' for language ' + lng, data);\n\n              _this6.loaded(name, err, data);\n            });\n          };\n\n          ;\n\n          toLoad.toLoad.forEach(function (name) {\n            readOne.call(_this5, name);\n          });\n        })();\n      }\n  };\n\n  Connector.prototype.reload = function reload(languages, namespaces) {\n    var _this7 = this;\n\n    if (!this.backend) {\n      this.logger.warn('No backend was added via i18next.use. Will not load resources.');\n    }\n    var options = _extends({}, this.backend.options, this.options.backend);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    // load with multi-load\n    if (options.allowMultiLoading && this.backend.readMulti) {\n      this.read(languages, namespaces, 'readMulti', null, null, function (err, data) {\n        if (err) _this7.logger.warn('reloading namespaces ' + namespaces.join(', ') + ' for languages ' + languages.join(', ') + ' via multiloading failed', err);\n        if (!err && data) _this7.logger.log('reloaded namespaces ' + namespaces.join(', ') + ' for languages ' + languages.join(', ') + ' via multiloading', data);\n\n        languages.forEach(function (l) {\n          namespaces.forEach(function (n) {\n            var bundle = utils.getPath(data, [l, n]);\n            if (bundle) {\n              _this7.loaded(l + '|' + n, err, bundle);\n            } else {\n              var _err2 = 'reloading namespace ' + n + ' for language ' + l + ' via multiloading failed';\n              _this7.loaded(l + '|' + n, _err2);\n              _this7.logger.error(_err2);\n            }\n          });\n        });\n      });\n    }\n\n    // load one by one\n    else {\n        (function () {\n          var readOne = function readOne(name) {\n            var _this8 = this;\n\n            var _name$split7 = name.split('|');\n\n            var _name$split8 = _slicedToArray(_name$split7, 2);\n\n            var lng = _name$split8[0];\n            var ns = _name$split8[1];\n\n\n            this.read(lng, ns, 'read', null, null, function (err, data) {\n              if (err) _this8.logger.warn('reloading namespace ' + ns + ' for language ' + lng + ' failed', err);\n              if (!err && data) _this8.logger.log('reloaded namespace ' + ns + ' for language ' + lng, data);\n\n              _this8.loaded(name, err, data);\n            });\n          };\n\n          ;\n\n          languages.forEach(function (l) {\n            namespaces.forEach(function (n) {\n              readOne.call(_this7, l + '|' + n);\n            });\n          });\n        })();\n      }\n  };\n\n  Connector.prototype.saveMissing = function saveMissing(languages, namespace, key, fallbackValue) {\n    if (this.backend && this.backend.create) this.backend.create(languages, namespace, key, fallbackValue);\n\n    // write to store to avoid resending\n    if (!languages || !languages[0]) return;\n    this.store.addResource(languages[0], namespace, key, fallbackValue);\n  };\n\n  return Connector;\n}(_EventEmitter3.default);\n\nexports.default = Connector;\n},{\"./EventEmitter\":4,\"./logger\":14,\"./utils\":16}],3:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar Connector = function (_EventEmitter) {\n  _inherits(Connector, _EventEmitter);\n\n  function Connector(cache, store, services) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    _classCallCheck(this, Connector);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.cache = cache;\n    _this.store = store;\n    _this.services = services;\n    _this.options = options;\n    _this.logger = _logger2.default.create('cacheConnector');\n\n    _this.cache && _this.cache.init && _this.cache.init(services, options.cache, options);\n    return _this;\n  }\n\n  Connector.prototype.load = function load(languages, namespaces, callback) {\n    var _this2 = this;\n\n    if (!this.cache) return callback && callback();\n    var options = _extends({}, this.cache.options, this.options.cache);\n\n    if (typeof languages === 'string') languages = this.services.languageUtils.toResolveHierarchy(languages);\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    if (options.enabled) {\n      this.cache.load(languages, function (err, data) {\n        if (err) _this2.logger.error('loading languages ' + languages.join(', ') + ' from cache failed', err);\n        if (data) {\n          for (var l in data) {\n            for (var n in data[l]) {\n              if (n === 'i18nStamp') continue;\n              var bundle = data[l][n];\n              if (bundle) _this2.store.addResourceBundle(l, n, bundle);\n            }\n          }\n        }\n        if (callback) callback();\n      });\n    } else {\n      if (callback) callback();\n    }\n  };\n\n  Connector.prototype.save = function save() {\n    if (this.cache && this.options.cache && this.options.cache.enabled) this.cache.save(this.store.data);\n  };\n\n  return Connector;\n}(_EventEmitter3.default);\n\nexports.default = Connector;\n},{\"./EventEmitter\":4,\"./logger\":14,\"./utils\":16}],4:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar EventEmitter = function () {\n\tfunction EventEmitter() {\n\t\t_classCallCheck(this, EventEmitter);\n\n\t\tthis.observers = {};\n\t}\n\n\tEventEmitter.prototype.on = function on(events, listener) {\n\t\tvar _this = this;\n\n\t\tevents.split(' ').forEach(function (event) {\n\t\t\t_this.observers[event] = _this.observers[event] || [];\n\t\t\t_this.observers[event].push(listener);\n\t\t});\n\t};\n\n\tEventEmitter.prototype.off = function off(event, listener) {\n\t\tvar _this2 = this;\n\n\t\tif (!this.observers[event]) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.observers[event].forEach(function () {\n\t\t\tif (!listener) {\n\t\t\t\tdelete _this2.observers[event];\n\t\t\t} else {\n\t\t\t\tvar index = _this2.observers[event].indexOf(listener);\n\t\t\t\tif (index > -1) {\n\t\t\t\t\t_this2.observers[event].splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tEventEmitter.prototype.emit = function emit(event) {\n\t\tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t\t\targs[_key - 1] = arguments[_key];\n\t\t}\n\n\t\tif (this.observers[event]) {\n\t\t\tthis.observers[event].forEach(function (observer) {\n\t\t\t\tobserver.apply(undefined, args);\n\t\t\t});\n\t\t}\n\n\t\tif (this.observers['*']) {\n\t\t\tthis.observers['*'].forEach(function (observer) {\n\t\t\t\tvar _ref;\n\n\t\t\t\tobserver.apply(observer, (_ref = [event]).concat.apply(_ref, args));\n\t\t\t});\n\t\t}\n\t};\n\n\treturn EventEmitter;\n}();\n\nexports.default = EventEmitter;\n},{}],5:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Interpolator = function () {\n  function Interpolator() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n    _classCallCheck(this, Interpolator);\n\n    this.logger = _logger2.default.create('interpolator');\n\n    this.init(options, true);\n  }\n\n  Interpolator.prototype.init = function init() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var reset = arguments[1];\n\n    if (reset) {\n      this.options = options;\n      this.format = options.interpolation && options.interpolation.format || function (value) {\n        return value;\n      };\n    }\n    if (!options.interpolation) options.interpolation = { escapeValue: true };\n\n    var iOpts = options.interpolation;\n\n    this.escapeValue = iOpts.escapeValue;\n\n    this.prefix = iOpts.prefix ? utils.regexEscape(iOpts.prefix) : iOpts.prefixEscaped || '{{';\n    this.suffix = iOpts.suffix ? utils.regexEscape(iOpts.suffix) : iOpts.suffixEscaped || '}}';\n    this.formatSeparator = iOpts.formatSeparator ? utils.regexEscape(iOpts.formatSeparator) : iOpts.formatSeparator || ',';\n\n    this.unescapePrefix = iOpts.unescapeSuffix ? '' : iOpts.unescapePrefix || '-';\n    this.unescapeSuffix = this.unescapePrefix ? '' : iOpts.unescapeSuffix || '';\n\n    this.nestingPrefix = iOpts.nestingPrefix ? utils.regexEscape(iOpts.nestingPrefix) : iOpts.nestingPrefixEscaped || utils.regexEscape('$t(');\n    this.nestingSuffix = iOpts.nestingSuffix ? utils.regexEscape(iOpts.nestingSuffix) : iOpts.nestingSuffixEscaped || utils.regexEscape(')');\n\n    // the regexp\n    this.resetRegExp();\n  };\n\n  Interpolator.prototype.reset = function reset() {\n    if (this.options) this.init(this.options);\n  };\n\n  Interpolator.prototype.resetRegExp = function resetRegExp() {\n    // the regexp\n    var regexpStr = this.prefix + '(.+?)' + this.suffix;\n    this.regexp = new RegExp(regexpStr, 'g');\n\n    var regexpUnescapeStr = this.prefix + this.unescapePrefix + '(.+?)' + this.unescapeSuffix + this.suffix;\n    this.regexpUnescape = new RegExp(regexpUnescapeStr, 'g');\n\n    var nestingRegexpStr = this.nestingPrefix + '(.+?)' + this.nestingSuffix;\n    this.nestingRegexp = new RegExp(nestingRegexpStr, 'g');\n  };\n\n  Interpolator.prototype.interpolate = function interpolate(str, data, lng) {\n    var _this = this;\n\n    var match = void 0,\n        value = void 0;\n\n    function regexSafe(val) {\n      return val.replace(/\\$/g, '$$$$');\n    }\n\n    var handleFormat = function handleFormat(key) {\n      if (key.indexOf(_this.formatSeparator) < 0) return utils.getPath(data, key);\n\n      var p = key.split(_this.formatSeparator);\n      var k = p.shift().trim();\n      var f = p.join(_this.formatSeparator).trim();\n\n      return _this.format(utils.getPath(data, k), f, lng);\n    };\n\n    this.resetRegExp();\n\n    // unescape if has unescapePrefix/Suffix\n    while (match = this.regexpUnescape.exec(str)) {\n      var _value = handleFormat(match[1].trim());\n      str = str.replace(match[0], _value);\n      this.regexpUnescape.lastIndex = 0;\n    }\n\n    // regular escape on demand\n    while (match = this.regexp.exec(str)) {\n      value = handleFormat(match[1].trim());\n      if (typeof value !== 'string') value = utils.makeString(value);\n      if (!value) {\n        this.logger.warn('missed to pass in variable ' + match[1] + ' for interpolating ' + str);\n        value = '';\n      }\n      value = this.escapeValue ? regexSafe(utils.escape(value)) : regexSafe(value);\n      str = str.replace(match[0], value);\n      this.regexp.lastIndex = 0;\n    }\n    return str;\n  };\n\n  Interpolator.prototype.nest = function nest(str, fc) {\n    var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n    var match = void 0,\n        value = void 0;\n\n    var clonedOptions = JSON.parse(JSON.stringify(options));\n    clonedOptions.applyPostProcessor = false; // avoid post processing on nested lookup\n\n    function regexSafe(val) {\n      return val.replace(/\\$/g, '$$$$');\n    }\n\n    // if value is something like \"myKey\": \"lorem $(anotherKey, { \"count\": {{aValueInOptions}} })\"\n    function handleHasOptions(key) {\n      if (key.indexOf(',') < 0) return key;\n\n      var p = key.split(',');\n      key = p.shift();\n      var optionsString = p.join(',');\n      optionsString = this.interpolate(optionsString, clonedOptions);\n\n      try {\n        clonedOptions = JSON.parse(optionsString);\n      } catch (e) {\n        this.logger.error('failed parsing options string in nesting for key ' + key, e);\n      }\n\n      return key;\n    }\n\n    // regular escape on demand\n    while (match = this.nestingRegexp.exec(str)) {\n      value = fc(handleHasOptions.call(this, match[1].trim()), clonedOptions);\n      if (typeof value !== 'string') value = utils.makeString(value);\n      if (!value) {\n        this.logger.warn('missed to pass in variable ' + match[1] + ' for interpolating ' + str);\n        value = '';\n      }\n      value = this.escapeValue ? regexSafe(utils.escape(value)) : regexSafe(value);\n      str = str.replace(match[0], value);\n      this.regexp.lastIndex = 0;\n    }\n    return str;\n  };\n\n  return Interpolator;\n}();\n\nexports.default = Interpolator;\n},{\"./logger\":14,\"./utils\":16}],6:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction capitalize(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nvar LanguageUtil = function () {\n  function LanguageUtil(options) {\n    _classCallCheck(this, LanguageUtil);\n\n    this.options = options;\n\n    this.whitelist = this.options.whitelist || false;\n    this.logger = _logger2.default.create('languageUtils');\n  }\n\n  LanguageUtil.prototype.getLanguagePartFromCode = function getLanguagePartFromCode(code) {\n    if (code.indexOf('-') < 0) return code;\n\n    var specialCases = ['NB-NO', 'NN-NO', 'nb-NO', 'nn-NO', 'nb-no', 'nn-no'];\n    var p = code.split('-');\n    return this.formatLanguageCode(specialCases.indexOf(code) > -1 ? p[1].toLowerCase() : p[0]);\n  };\n\n  LanguageUtil.prototype.formatLanguageCode = function formatLanguageCode(code) {\n    // http://www.iana.org/assignments/language-tags/language-tags.xhtml\n    if (typeof code === 'string' && code.indexOf('-') > -1) {\n      var specialCases = ['hans', 'hant', 'latn', 'cyrl', 'cans', 'mong', 'arab'];\n      var p = code.split('-');\n\n      if (this.options.lowerCaseLng) {\n        p = p.map(function (part) {\n          return part.toLowerCase();\n        });\n      } else if (p.length === 2) {\n        p[0] = p[0].toLowerCase();\n        p[1] = p[1].toUpperCase();\n\n        if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n      } else if (p.length === 3) {\n        p[0] = p[0].toLowerCase();\n\n        // if lenght 2 guess it's a country\n        if (p[1].length === 2) p[1] = p[1].toUpperCase();\n        if (p[0] !== 'sgn' && p[2].length === 2) p[2] = p[2].toUpperCase();\n\n        if (specialCases.indexOf(p[1].toLowerCase()) > -1) p[1] = capitalize(p[1].toLowerCase());\n        if (specialCases.indexOf(p[2].toLowerCase()) > -1) p[2] = capitalize(p[2].toLowerCase());\n      }\n\n      return p.join('-');\n    } else {\n      return this.options.cleanCode || this.options.lowerCaseLng ? code.toLowerCase() : code;\n    }\n  };\n\n  LanguageUtil.prototype.isWhitelisted = function isWhitelisted(code, exactMatch) {\n    if (this.options.load === 'languageOnly' || this.options.nonExplicitWhitelist && !exactMatch) {\n      code = this.getLanguagePartFromCode(code);\n    }\n    return !this.whitelist || !this.whitelist.length || this.whitelist.indexOf(code) > -1 ? true : false;\n  };\n\n  LanguageUtil.prototype.toResolveHierarchy = function toResolveHierarchy(code, fallbackCode) {\n    var _this = this;\n\n    fallbackCode = fallbackCode || this.options.fallbackLng || [];\n    if (typeof fallbackCode === 'string') fallbackCode = [fallbackCode];\n\n    var codes = [];\n    var addCode = function addCode(code) {\n      var exactMatch = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];\n\n      if (_this.isWhitelisted(code, exactMatch)) {\n        codes.push(code);\n      } else {\n        _this.logger.warn('rejecting non-whitelisted language code: ' + code);\n      }\n    };\n\n    if (typeof code === 'string' && code.indexOf('-') > -1) {\n      if (this.options.load !== 'languageOnly') addCode(this.formatLanguageCode(code), true);\n      if (this.options.load !== 'currentOnly') addCode(this.getLanguagePartFromCode(code));\n    } else if (typeof code === 'string') {\n      addCode(this.formatLanguageCode(code));\n    }\n\n    fallbackCode.forEach(function (fc) {\n      if (codes.indexOf(fc) < 0) addCode(_this.formatLanguageCode(fc));\n    });\n\n    return codes;\n  };\n\n  return LanguageUtil;\n}();\n\n;\n\nexports.default = LanguageUtil;\n},{\"./logger\":14}],7:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// definition http://translate.sourceforge.net/wiki/l10n/pluralforms\n/* eslint-disable */\nvar sets = [{ lngs: ['ach', 'ak', 'am', 'arn', 'br', 'fil', 'gun', 'ln', 'mfe', 'mg', 'mi', 'oc', 'tg', 'ti', 'tr', 'uz', 'wa'], nr: [1, 2], fc: 1 }, { lngs: ['af', 'an', 'ast', 'az', 'bg', 'bn', 'ca', 'da', 'de', 'dev', 'el', 'en', 'eo', 'es', 'es_ar', 'et', 'eu', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'he', 'hi', 'hu', 'hy', 'ia', 'it', 'kn', 'ku', 'lb', 'mai', 'ml', 'mn', 'mr', 'nah', 'nap', 'nb', 'ne', 'nl', 'nn', 'no', 'nso', 'pa', 'pap', 'pms', 'ps', 'pt', 'pt_br', 'rm', 'sco', 'se', 'si', 'so', 'son', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'yo'], nr: [1, 2], fc: 2 }, { lngs: ['ay', 'bo', 'cgg', 'fa', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky', 'lo', 'ms', 'sah', 'su', 'th', 'tt', 'ug', 'vi', 'wo', 'zh'], nr: [1], fc: 3 }, { lngs: ['be', 'bs', 'dz', 'hr', 'ru', 'sr', 'uk'], nr: [1, 2, 5], fc: 4 }, { lngs: ['ar'], nr: [0, 1, 2, 3, 11, 100], fc: 5 }, { lngs: ['cs', 'sk'], nr: [1, 2, 5], fc: 6 }, { lngs: ['csb', 'pl'], nr: [1, 2, 5], fc: 7 }, { lngs: ['cy'], nr: [1, 2, 3, 8], fc: 8 }, { lngs: ['fr'], nr: [1, 2], fc: 9 }, { lngs: ['ga'], nr: [1, 2, 3, 7, 11], fc: 10 }, { lngs: ['gd'], nr: [1, 2, 3, 20], fc: 11 }, { lngs: ['is'], nr: [1, 2], fc: 12 }, { lngs: ['jv'], nr: [0, 1], fc: 13 }, { lngs: ['kw'], nr: [1, 2, 3, 4], fc: 14 }, { lngs: ['lt'], nr: [1, 2, 10], fc: 15 }, { lngs: ['lv'], nr: [1, 2, 0], fc: 16 }, { lngs: ['mk'], nr: [1, 2], fc: 17 }, { lngs: ['mnk'], nr: [0, 1, 2], fc: 18 }, { lngs: ['mt'], nr: [1, 2, 11, 20], fc: 19 }, { lngs: ['or'], nr: [2, 1], fc: 2 }, { lngs: ['ro'], nr: [1, 2, 20], fc: 20 }, { lngs: ['sl'], nr: [5, 1, 2, 3], fc: 21 }];\n\nvar _rulesPluralsTypes = {\n  1: function _(n) {\n    return Number(n > 1);\n  },\n  2: function _(n) {\n    return Number(n != 1);\n  },\n  3: function _(n) {\n    return 0;\n  },\n  4: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  5: function _(n) {\n    return Number(n === 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5);\n  },\n  6: function _(n) {\n    return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);\n  },\n  7: function _(n) {\n    return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  8: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);\n  },\n  9: function _(n) {\n    return Number(n >= 2);\n  },\n  10: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);\n  },\n  11: function _(n) {\n    return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);\n  },\n  12: function _(n) {\n    return Number(n % 10 != 1 || n % 100 == 11);\n  },\n  13: function _(n) {\n    return Number(n !== 0);\n  },\n  14: function _(n) {\n    return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);\n  },\n  15: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);\n  },\n  16: function _(n) {\n    return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);\n  },\n  17: function _(n) {\n    return Number(n == 1 || n % 10 == 1 ? 0 : 1);\n  },\n  18: function _(n) {\n    return Number(n == 0 ? 0 : n == 1 ? 1 : 2);\n  },\n  19: function _(n) {\n    return Number(n == 1 ? 0 : n === 0 || n % 100 > 1 && n % 100 < 11 ? 1 : n % 100 > 10 && n % 100 < 20 ? 2 : 3);\n  },\n  20: function _(n) {\n    return Number(n == 1 ? 0 : n === 0 || n % 100 > 0 && n % 100 < 20 ? 1 : 2);\n  },\n  21: function _(n) {\n    return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);\n  }\n};\n/* eslint-enable */\n\nfunction createRules() {\n  var l,\n      rules = {};\n  sets.forEach(function (set) {\n    set.lngs.forEach(function (l) {\n      return rules[l] = {\n        numbers: set.nr,\n        plurals: _rulesPluralsTypes[set.fc]\n      };\n    });\n  });\n  return rules;\n}\n\nvar PluralResolver = function () {\n  function PluralResolver(languageUtils) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, PluralResolver);\n\n    this.languageUtils = languageUtils;\n    this.options = options;\n\n    this.logger = _logger2.default.create('pluralResolver');\n\n    this.rules = createRules();\n  }\n\n  PluralResolver.prototype.addRule = function addRule(lng, obj) {\n    this.rules[lng] = obj;\n  };\n\n  PluralResolver.prototype.getRule = function getRule(code) {\n    return this.rules[this.languageUtils.getLanguagePartFromCode(code)];\n  };\n\n  PluralResolver.prototype.needsPlural = function needsPlural(code) {\n    var rule = this.getRule(code);\n\n    return rule && rule.numbers.length <= 1 ? false : true;\n  };\n\n  PluralResolver.prototype.getSuffix = function getSuffix(code, count) {\n    var _this = this;\n\n    var rule = this.getRule(code);\n\n    if (rule) {\n      var _ret = function () {\n        if (rule.numbers.length === 1) return {\n            v: ''\n          }; // only singular\n\n        var idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));\n        var suffix = rule.numbers[idx];\n\n        // special treatment for lngs only having singular and plural\n        if (rule.numbers.length === 2 && rule.numbers[0] === 1) {\n          if (suffix === 2) {\n            suffix = 'plural';\n          } else if (suffix === 1) {\n            suffix = '';\n          }\n        }\n\n        var returnSuffix = function returnSuffix() {\n          return _this.options.prepend && suffix.toString() ? _this.options.prepend + suffix.toString() : suffix.toString();\n        };\n\n        // COMPATIBILITY JSON\n        // v1\n        if (_this.options.compatibilityJSON === 'v1') {\n          if (suffix === 1) return {\n              v: ''\n            };\n          if (typeof suffix === 'number') return {\n              v: '_plural_' + suffix.toString()\n            };\n          return {\n            v: returnSuffix()\n          };\n        }\n        // v2\n        else if (_this.options.compatibilityJSON === 'v2' || rule.numbers.length === 2 && rule.numbers[0] === 1) {\n            return {\n              v: returnSuffix()\n            };\n          }\n          // v3 - gettext index\n          else if (rule.numbers.length === 2 && rule.numbers[0] === 1) {\n              return {\n                v: returnSuffix()\n              };\n            }\n        return {\n          v: _this.options.prepend && idx.toString() ? _this.options.prepend + idx.toString() : idx.toString()\n        };\n      }();\n\n      if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n    } else {\n      this.logger.warn('no plural rule found for: ' + code);\n      return '';\n    }\n  };\n\n  return PluralResolver;\n}();\n\n;\n\nexports.default = PluralResolver;\n},{\"./logger\":14}],8:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar ResourceStore = function (_EventEmitter) {\n  _inherits(ResourceStore, _EventEmitter);\n\n  function ResourceStore() {\n    var data = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var options = arguments.length <= 1 || arguments[1] === undefined ? { ns: ['translation'], defaultNS: 'translation' } : arguments[1];\n\n    _classCallCheck(this, ResourceStore);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.data = data;\n    _this.options = options;\n    return _this;\n  }\n\n  ResourceStore.prototype.addNamespaces = function addNamespaces(ns) {\n    if (this.options.ns.indexOf(ns) < 0) {\n      this.options.ns.push(ns);\n    }\n  };\n\n  ResourceStore.prototype.removeNamespaces = function removeNamespaces(ns) {\n    var index = this.options.ns.indexOf(ns);\n    if (index > -1) {\n      this.options.ns.splice(index, 1);\n    }\n  };\n\n  ResourceStore.prototype.getResource = function getResource(lng, ns, key) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    var keySeparator = options.keySeparator || this.options.keySeparator;\n    if (keySeparator === undefined) keySeparator = '.';\n\n    var path = [lng, ns];\n    if (key && typeof key !== 'string') path = path.concat(key);\n    if (key && typeof key === 'string') path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n    }\n\n    return utils.getPath(this.data, path);\n  };\n\n  ResourceStore.prototype.addResource = function addResource(lng, ns, key, value) {\n    var options = arguments.length <= 4 || arguments[4] === undefined ? { silent: false } : arguments[4];\n\n    var keySeparator = this.options.keySeparator;\n    if (keySeparator === undefined) keySeparator = '.';\n\n    var path = [lng, ns];\n    if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);\n\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n      value = ns;\n      ns = path[1];\n    }\n\n    this.addNamespaces(ns);\n\n    utils.setPath(this.data, path, value);\n\n    if (!options.silent) this.emit('added', lng, ns, key, value);\n  };\n\n  ResourceStore.prototype.addResources = function addResources(lng, ns, resources) {\n    for (var m in resources) {\n      if (typeof resources[m] === 'string') this.addResource(lng, ns, m, resources[m], { silent: true });\n    }\n    this.emit('added', lng, ns, resources);\n  };\n\n  ResourceStore.prototype.addResourceBundle = function addResourceBundle(lng, ns, resources, deep, overwrite) {\n    var path = [lng, ns];\n    if (lng.indexOf('.') > -1) {\n      path = lng.split('.');\n      deep = resources;\n      resources = ns;\n      ns = path[1];\n    }\n\n    this.addNamespaces(ns);\n\n    var pack = utils.getPath(this.data, path) || {};\n\n    if (deep) {\n      utils.deepExtend(pack, resources, overwrite);\n    } else {\n      pack = _extends({}, pack, resources);\n    }\n\n    utils.setPath(this.data, path, pack);\n\n    this.emit('added', lng, ns, resources);\n  };\n\n  ResourceStore.prototype.removeResourceBundle = function removeResourceBundle(lng, ns) {\n    if (this.hasResourceBundle(lng, ns)) {\n      delete this.data[lng][ns];\n    }\n    this.removeNamespaces(ns);\n\n    this.emit('removed', lng, ns);\n  };\n\n  ResourceStore.prototype.hasResourceBundle = function hasResourceBundle(lng, ns) {\n    return this.getResource(lng, ns) !== undefined;\n  };\n\n  ResourceStore.prototype.getResourceBundle = function getResourceBundle(lng, ns) {\n    if (!ns) ns = this.options.defaultNS;\n\n    // TODO: COMPATIBILITY remove extend in v2.1.0\n    if (this.options.compatibilityAPI === 'v1') return _extends({}, this.getResource(lng, ns));\n\n    return this.getResource(lng, ns);\n  };\n\n  ResourceStore.prototype.toJSON = function toJSON() {\n    return this.data;\n  };\n\n  return ResourceStore;\n}(_EventEmitter3.default);\n\nexports.default = ResourceStore;\n},{\"./EventEmitter\":4,\"./utils\":16}],9:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _postProcessor = require('./postProcessor');\n\nvar _postProcessor2 = _interopRequireDefault(_postProcessor);\n\nvar _v = require('./compatibility/v1');\n\nvar compat = _interopRequireWildcard(_v);\n\nvar _utils = require('./utils');\n\nvar utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar Translator = function (_EventEmitter) {\n  _inherits(Translator, _EventEmitter);\n\n  function Translator(services) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, Translator);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    utils.copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector'], services, _this);\n\n    _this.options = options;\n    _this.logger = _logger2.default.create('translator');\n    return _this;\n  }\n\n  Translator.prototype.changeLanguage = function changeLanguage(lng) {\n    if (lng) this.language = lng;\n  };\n\n  Translator.prototype.exists = function exists(key) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? { interpolation: {} } : arguments[1];\n\n    if (this.options.compatibilityAPI === 'v1') {\n      options = compat.convertTOptions(options);\n    }\n\n    return this.resolve(key, options) !== undefined;\n  };\n\n  Translator.prototype.extractFromKey = function extractFromKey(key, options) {\n    var nsSeparator = options.nsSeparator || this.options.nsSeparator;\n    if (nsSeparator === undefined) nsSeparator = ':';\n\n    var namespaces = options.ns || this.options.defaultNS;\n    if (nsSeparator && key.indexOf(nsSeparator) > -1) {\n      var parts = key.split(nsSeparator);\n      namespaces = parts[0];\n      key = parts[1];\n    }\n    if (typeof namespaces === 'string') namespaces = [namespaces];\n\n    return {\n      key: key,\n      namespaces: namespaces\n    };\n  };\n\n  Translator.prototype.translate = function translate(keys) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {\n      options = this.options.overloadTranslationOptionHandler(arguments);\n    } else if (this.options.compatibilityAPI === 'v1') {\n      options = compat.convertTOptions(options);\n    }\n\n    // non valid keys handling\n    if (keys === undefined || keys === null || keys === '') return '';\n    if (typeof keys === 'number') keys = String(keys);\n    if (typeof keys === 'string') keys = [keys];\n\n    // return key on CIMode\n    var lng = options.lng || this.language;\n    if (lng && lng.toLowerCase() === 'cimode') return keys[keys.length - 1];\n\n    // separators\n    var keySeparator = options.keySeparator || this.options.keySeparator || '.';\n\n    // get namespace(s)\n\n    var _extractFromKey = this.extractFromKey(keys[keys.length - 1], options);\n\n    var key = _extractFromKey.key;\n    var namespaces = _extractFromKey.namespaces;\n\n    var namespace = namespaces[namespaces.length - 1];\n\n    // resolve from store\n    var res = this.resolve(keys, options);\n\n    var resType = Object.prototype.toString.apply(res);\n    var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];\n    var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;\n\n    // object\n    if (res && typeof res !== 'string' && noObject.indexOf(resType) < 0 && !(joinArrays && resType === '[object Array]')) {\n      if (!options.returnObjects && !this.options.returnObjects) {\n        this.logger.warn('accessing an object - but returnObjects options is not enabled!');\n        return this.options.returnedObjectHandler ? this.options.returnedObjectHandler(key, res, options) : 'key \\'' + key + ' (' + this.language + ')\\' returned an object instead of string.';\n      }\n\n      var copy = resType === '[object Array]' ? [] : {}; // apply child translation on a copy\n\n      for (var m in res) {\n        copy[m] = this.translate('' + key + keySeparator + m, _extends({ joinArrays: false, ns: namespaces }, options));\n      }\n      res = copy;\n    }\n    // array special treatment\n    else if (joinArrays && resType === '[object Array]') {\n        res = res.join(joinArrays);\n        if (res) res = this.extendTranslation(res, key, options);\n      }\n      // string, empty or null\n      else {\n          var usedDefault = false,\n              usedKey = false;\n\n          // fallback value\n          if (!this.isValidLookup(res) && options.defaultValue !== undefined) {\n            usedDefault = true;\n            res = options.defaultValue;\n          }\n          if (!this.isValidLookup(res)) {\n            usedKey = true;\n            res = key;\n          }\n\n          // save missing\n          if (usedKey || usedDefault) {\n            this.logger.log('missingKey', lng, namespace, key, res);\n\n            var lngs = [];\n            if (this.options.saveMissingTo === 'fallback' && this.options.fallbackLng && this.options.fallbackLng[0]) {\n              for (var i = 0; i < this.options.fallbackLng.length; i++) {\n                lngs.push(this.options.fallbackLng[i]);\n              }\n            } else if (this.options.saveMissingTo === 'all') {\n              lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);\n            } else {\n              //(this.options.saveMissingTo === 'current' || (this.options.saveMissingTo === 'fallback' && this.options.fallbackLng[0] === false) ) {\n              lngs.push(options.lng || this.language);\n            }\n\n            if (this.options.saveMissing) {\n              if (this.options.missingKeyHandler) {\n                this.options.missingKeyHandler(lngs, namespace, key, res);\n              } else if (this.backendConnector && this.backendConnector.saveMissing) {\n                this.backendConnector.saveMissing(lngs, namespace, key, res);\n              }\n            }\n\n            this.emit('missingKey', lngs, namespace, key, res);\n          }\n\n          // extend\n          res = this.extendTranslation(res, key, options);\n\n          // append namespace if still key\n          if (usedKey && res === key && this.options.appendNamespaceToMissingKey) res = namespace + ':' + key;\n\n          // parseMissingKeyHandler\n          if (usedKey && this.options.parseMissingKeyHandler) res = this.options.parseMissingKeyHandler(res);\n        }\n\n    // return\n    return res;\n  };\n\n  Translator.prototype.extendTranslation = function extendTranslation(res, key, options) {\n    var _this2 = this;\n\n    if (options.interpolation) this.interpolator.init(options);\n\n    // interpolate\n    var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;\n    if (this.options.interpolation.defaultVariables) data = _extends({}, this.options.interpolation.defaultVariables, data);\n    res = this.interpolator.interpolate(res, data, this.language);\n\n    // nesting\n    res = this.interpolator.nest(res, function () {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _this2.translate.apply(_this2, args);\n    }, options);\n\n    if (options.interpolation) this.interpolator.reset();\n\n    // post process\n    var postProcess = options.postProcess || this.options.postProcess;\n    var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;\n\n    if (res !== undefined && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {\n      res = _postProcessor2.default.handle(postProcessorNames, res, key, options, this);\n    }\n\n    return res;\n  };\n\n  Translator.prototype.resolve = function resolve(keys) {\n    var _this3 = this;\n\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    var found = void 0;\n\n    if (typeof keys === 'string') keys = [keys];\n\n    // forEach possible key\n    keys.forEach(function (k) {\n      if (_this3.isValidLookup(found)) return;\n\n      var _extractFromKey2 = _this3.extractFromKey(k, options);\n\n      var key = _extractFromKey2.key;\n      var namespaces = _extractFromKey2.namespaces;\n\n      if (_this3.options.fallbackNS) namespaces = namespaces.concat(_this3.options.fallbackNS);\n\n      var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';\n      var needsContextHandling = options.context !== undefined && typeof options.context === 'string' && options.context !== '';\n\n      var codes = options.lngs ? options.lngs : _this3.languageUtils.toResolveHierarchy(options.lng || _this3.language);\n\n      namespaces.forEach(function (ns) {\n        if (_this3.isValidLookup(found)) return;\n\n        codes.forEach(function (code) {\n          if (_this3.isValidLookup(found)) return;\n\n          var finalKey = key;\n          var finalKeys = [finalKey];\n\n          var pluralSuffix = void 0;\n          if (needsPluralHandling) pluralSuffix = _this3.pluralResolver.getSuffix(code, options.count);\n\n          // fallback for plural if context not found\n          if (needsPluralHandling && needsContextHandling) finalKeys.push(finalKey + pluralSuffix);\n\n          // get key for context if needed\n          if (needsContextHandling) finalKeys.push(finalKey += '' + _this3.options.contextSeparator + options.context);\n\n          // get key for plural if needed\n          if (needsPluralHandling) finalKeys.push(finalKey += pluralSuffix);\n\n          // iterate over finalKeys starting with most specific pluralkey (-> contextkey only) -> singularkey only\n          var possibleKey = void 0;\n          while (possibleKey = finalKeys.pop()) {\n            if (_this3.isValidLookup(found)) continue;\n            found = _this3.getResource(code, ns, possibleKey, options);\n          }\n        });\n      });\n    });\n\n    return found;\n  };\n\n  Translator.prototype.isValidLookup = function isValidLookup(res) {\n    return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');\n  };\n\n  Translator.prototype.getResource = function getResource(code, ns, key) {\n    var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];\n\n    return this.resourceStore.getResource(code, ns, key, options);\n  };\n\n  return Translator;\n}(_EventEmitter3.default);\n\nexports.default = Translator;\n},{\"./EventEmitter\":4,\"./compatibility/v1\":10,\"./logger\":14,\"./postProcessor\":15,\"./utils\":16}],10:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.convertAPIOptions = convertAPIOptions;\nexports.convertJSONOptions = convertJSONOptions;\nexports.convertTOptions = convertTOptions;\nexports.appendBackwardsAPI = appendBackwardsAPI;\n\nvar _logger = require('../logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction convertInterpolation(options) {\n\n  options.interpolation = {\n    unescapeSuffix: 'HTML'\n  };\n\n  options.interpolation.prefix = options.interpolationPrefix || '__';\n  options.interpolation.suffix = options.interpolationSuffix || '__';\n  options.interpolation.escapeValue = options.escapeInterpolation || false;\n\n  options.interpolation.nestingPrefix = options.reusePrefix || '$t(';\n  options.interpolation.nestingSuffix = options.reuseSuffix || ')';\n\n  return options;\n}\n\nfunction convertAPIOptions(options) {\n  if (options.resStore) options.resources = options.resStore;\n\n  if (options.ns && options.ns.defaultNs) {\n    options.defaultNS = options.ns.defaultNs;\n    options.ns = options.ns.namespaces;\n  } else {\n    options.defaultNS = options.ns || 'translation';\n  }\n\n  if (options.fallbackToDefaultNS && options.defaultNS) options.fallbackNS = options.defaultNS;\n\n  options.saveMissing = options.sendMissing;\n  options.saveMissingTo = options.sendMissingTo || 'current';\n  options.returnNull = options.fallbackOnNull ? false : true;\n  options.returnEmptyString = options.fallbackOnEmpty ? false : true;\n  options.returnObjects = options.returnObjectTrees;\n  options.joinArrays = '\\n';\n\n  options.returnedObjectHandler = options.objectTreeKeyHandler;\n  options.parseMissingKeyHandler = options.parseMissingKey;\n  options.appendNamespaceToMissingKey = true;\n\n  options.nsSeparator = options.nsseparator;\n  options.keySeparator = options.keyseparator;\n\n  if (options.shortcutFunction === 'sprintf') {\n    options.overloadTranslationOptionHandler = function (args) {\n      var values = [];\n\n      for (var i = 1; i < args.length; i++) {\n        values.push(args[i]);\n      }\n\n      return {\n        postProcess: 'sprintf',\n        sprintf: values\n      };\n    };\n  }\n\n  options.whitelist = options.lngWhitelist;\n  options.preload = options.preload;\n  if (options.load === 'current') options.load = 'currentOnly';\n  if (options.load === 'unspecific') options.load = 'languageOnly';\n\n  // backend\n  options.backend = options.backend || {};\n  options.backend.loadPath = options.resGetPath || 'locales/__lng__/__ns__.json';\n  options.backend.addPath = options.resPostPath || 'locales/add/__lng__/__ns__';\n  options.backend.allowMultiLoading = options.dynamicLoad;\n\n  // cache\n  options.cache = options.cache || {};\n  options.cache.prefix = 'res_';\n  options.cache.expirationTime = 7 * 24 * 60 * 60 * 1000;\n  options.cache.enabled = options.useLocalStorage ? true : false;\n\n  options = convertInterpolation(options);\n  if (options.defaultVariables) options.interpolation.defaultVariables = options.defaultVariables;\n\n  // TODO: deprecation\n  // if (options.getAsync === false) throw deprecation error\n\n  return options;\n}\n\nfunction convertJSONOptions(options) {\n  options = convertInterpolation(options);\n  options.joinArrays = '\\n';\n\n  return options;\n}\n\nfunction convertTOptions(options) {\n  if (options.interpolationPrefix || options.interpolationSuffix || options.escapeInterpolation) {\n    options = convertInterpolation(options);\n  }\n\n  options.nsSeparator = options.nsseparator;\n  options.keySeparator = options.keyseparator;\n\n  options.returnObjects = options.returnObjectTrees;\n\n  return options;\n}\n\nfunction appendBackwardsAPI(i18n) {\n  i18n.lng = function () {\n    _logger2.default.deprecate('i18next.lng() can be replaced by i18next.language for detected language or i18next.languages for languages ordered by translation lookup.');\n    return i18n.services.languageUtils.toResolveHierarchy(i18n.language)[0];\n  };\n\n  i18n.preload = function (lngs, cb) {\n    _logger2.default.deprecate('i18next.preload() can be replaced with i18next.loadLanguages()');\n    i18n.loadLanguages(lngs, cb);\n  };\n\n  i18n.setLng = function (lng, options, callback) {\n    _logger2.default.deprecate('i18next.setLng() can be replaced with i18next.changeLanguage() or i18next.getFixedT() to get a translation function with fixed language or namespace.');\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (!options) options = {};\n\n    if (options.fixLng === true) {\n      if (callback) return callback(null, i18n.getFixedT(lng));\n    }\n\n    i18n.changeLanguage(lng, callback);\n  };\n\n  i18n.addPostProcessor = function (name, fc) {\n    _logger2.default.deprecate('i18next.addPostProcessor() can be replaced by i18next.use({ type: \\'postProcessor\\', name: \\'name\\', process: fc })');\n    i18n.use({\n      type: 'postProcessor',\n      name: name,\n      process: fc\n    });\n  };\n}\n},{\"../logger\":14}],11:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.get = get;\nexports.transformOptions = transformOptions;\nfunction get() {\n  return {\n    debug: false,\n    initImmediate: true,\n\n    ns: ['translation'],\n    defaultNS: ['translation'],\n    fallbackLng: ['dev'],\n    fallbackNS: false, // string or array of namespaces\n\n    whitelist: false, // array with whitelisted languages\n    nonExplicitWhitelist: false,\n    load: 'all', // | currentOnly | languageOnly\n    preload: false, // array with preload languages\n\n    keySeparator: '.',\n    nsSeparator: ':',\n    pluralSeparator: '_',\n    contextSeparator: '_',\n\n    saveMissing: false, // enable to send missing values\n    saveMissingTo: 'fallback', // 'current' || 'all'\n    missingKeyHandler: false, // function(lng, ns, key, fallbackValue) -> override if prefer on handling\n\n    postProcess: false, // string or array of postProcessor names\n    returnNull: true, // allows null value as valid translation\n    returnEmptyString: true, // allows empty string value as valid translation\n    returnObjects: false,\n    joinArrays: false, // or string to join array\n    returnedObjectHandler: function returnedObjectHandler() {}, // function(key, value, options) triggered if key returns object but returnObjects is set to false\n    parseMissingKeyHandler: false, // function(key) parsed a key that was not found in t() before returning\n    appendNamespaceToMissingKey: false,\n    overloadTranslationOptionHandler: function overloadTranslationOptionHandler(args) {\n      return { defaultValue: args[1] };\n    },\n\n    interpolation: {\n      escapeValue: true,\n      format: function format(value, _format, lng) {\n        return value;\n      },\n      prefix: '{{',\n      suffix: '}}',\n      formatSeparator: ',',\n      // prefixEscaped: '{{',\n      // suffixEscaped: '}}',\n      // unescapeSuffix: '',\n      unescapePrefix: '-',\n\n      nestingPrefix: '$t(',\n      nestingSuffix: ')',\n      // nestingPrefixEscaped: '$t(',\n      // nestingSuffixEscaped: ')',\n      defaultVariables: undefined // object that can have values to interpolate on - extends passed in interpolation data\n    }\n  };\n}\n\nfunction transformOptions(options) {\n  // create namespace object if namespace is passed in as string\n  if (typeof options.ns === 'string') options.ns = [options.ns];\n  if (typeof options.fallbackLng === 'string') options.fallbackLng = [options.fallbackLng];\n  if (typeof options.fallbackNS === 'string') options.fallbackNS = [options.fallbackNS];\n\n  // extend whitelist with cimode\n  if (options.whitelist && options.whitelist.indexOf('cimode') < 0) options.whitelist.push('cimode');\n\n  return options;\n}\n},{}],12:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar _EventEmitter2 = require('./EventEmitter');\n\nvar _EventEmitter3 = _interopRequireDefault(_EventEmitter2);\n\nvar _ResourceStore = require('./ResourceStore');\n\nvar _ResourceStore2 = _interopRequireDefault(_ResourceStore);\n\nvar _Translator = require('./Translator');\n\nvar _Translator2 = _interopRequireDefault(_Translator);\n\nvar _LanguageUtils = require('./LanguageUtils');\n\nvar _LanguageUtils2 = _interopRequireDefault(_LanguageUtils);\n\nvar _PluralResolver = require('./PluralResolver');\n\nvar _PluralResolver2 = _interopRequireDefault(_PluralResolver);\n\nvar _Interpolator = require('./Interpolator');\n\nvar _Interpolator2 = _interopRequireDefault(_Interpolator);\n\nvar _BackendConnector = require('./BackendConnector');\n\nvar _BackendConnector2 = _interopRequireDefault(_BackendConnector);\n\nvar _CacheConnector = require('./CacheConnector');\n\nvar _CacheConnector2 = _interopRequireDefault(_CacheConnector);\n\nvar _defaults2 = require('./defaults');\n\nvar _postProcessor = require('./postProcessor');\n\nvar _postProcessor2 = _interopRequireDefault(_postProcessor);\n\nvar _v = require('./compatibility/v1');\n\nvar compat = _interopRequireWildcard(_v);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }\n\nvar I18n = function (_EventEmitter) {\n  _inherits(I18n, _EventEmitter);\n\n  function I18n() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    _classCallCheck(this, I18n);\n\n    var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));\n\n    _this.options = (0, _defaults2.transformOptions)(options);\n    _this.services = {};\n    _this.logger = _logger2.default;\n    _this.modules = {};\n\n    if (callback && !_this.isInitialized) _this.init(options, callback);\n    return _this;\n  }\n\n  I18n.prototype.init = function init(options, callback) {\n    var _this2 = this;\n\n    if (typeof options === 'function') {\n      callback = options;\n      options = {};\n    }\n    if (!options) options = {};\n\n    if (options.compatibilityAPI === 'v1') {\n      this.options = _extends({}, (0, _defaults2.get)(), (0, _defaults2.transformOptions)(compat.convertAPIOptions(options)), {});\n    } else if (options.compatibilityJSON === 'v1') {\n      this.options = _extends({}, (0, _defaults2.get)(), (0, _defaults2.transformOptions)(compat.convertJSONOptions(options)), {});\n    } else {\n      this.options = _extends({}, (0, _defaults2.get)(), this.options, (0, _defaults2.transformOptions)(options));\n    }\n    if (!callback) callback = function callback() {};\n\n    function createClassOnDemand(ClassOrObject) {\n      if (!ClassOrObject) return;\n      if (typeof ClassOrObject === 'function') return new ClassOrObject();\n      return ClassOrObject;\n    }\n\n    // init services\n    if (!this.options.isClone) {\n      if (this.modules.logger) {\n        _logger2.default.init(createClassOnDemand(this.modules.logger), this.options);\n      } else {\n        _logger2.default.init(null, this.options);\n      }\n\n      var lu = new _LanguageUtils2.default(this.options);\n      this.store = new _ResourceStore2.default(this.options.resources, this.options);\n\n      var s = this.services;\n      s.logger = _logger2.default;\n      s.resourceStore = this.store;\n      s.resourceStore.on('added removed', function (lng, ns) {\n        s.cacheConnector.save();\n      });\n      s.languageUtils = lu;\n      s.pluralResolver = new _PluralResolver2.default(lu, { prepend: this.options.pluralSeparator, compatibilityJSON: this.options.compatibilityJSON });\n      s.interpolator = new _Interpolator2.default(this.options);\n\n      s.backendConnector = new _BackendConnector2.default(createClassOnDemand(this.modules.backend), s.resourceStore, s, this.options);\n      // pipe events from backendConnector\n      s.backendConnector.on('*', function (event) {\n        for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n\n      s.backendConnector.on('loaded', function (loaded) {\n        s.cacheConnector.save();\n      });\n\n      s.cacheConnector = new _CacheConnector2.default(createClassOnDemand(this.modules.cache), s.resourceStore, s, this.options);\n      // pipe events from backendConnector\n      s.cacheConnector.on('*', function (event) {\n        for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n          args[_key2 - 1] = arguments[_key2];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n\n      if (this.modules.languageDetector) {\n        s.languageDetector = createClassOnDemand(this.modules.languageDetector);\n        s.languageDetector.init(s, this.options.detection, this.options);\n      }\n\n      this.translator = new _Translator2.default(this.services, this.options);\n      // pipe events from translator\n      this.translator.on('*', function (event) {\n        for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n          args[_key3 - 1] = arguments[_key3];\n        }\n\n        _this2.emit.apply(_this2, [event].concat(args));\n      });\n    }\n\n    // append api\n    var storeApi = ['getResource', 'addResource', 'addResources', 'addResourceBundle', 'removeResourceBundle', 'hasResourceBundle', 'getResourceBundle'];\n    storeApi.forEach(function (fcName) {\n      _this2[fcName] = function () {\n        return this.store[fcName].apply(this.store, arguments);\n      };\n    });\n\n    // TODO: COMPATIBILITY remove this\n    if (this.options.compatibilityAPI === 'v1') compat.appendBackwardsAPI(this);\n\n    var load = function load() {\n      _this2.changeLanguage(_this2.options.lng, function (err, t) {\n        _this2.emit('initialized', _this2.options);\n        _this2.logger.log('initialized', _this2.options);\n\n        callback(err, t);\n      });\n    };\n\n    if (this.options.resources || !this.options.initImmediate) {\n      load();\n    } else {\n      setTimeout(load, 0);\n    }\n\n    return this;\n  };\n\n  I18n.prototype.loadResources = function loadResources(callback) {\n    var _this3 = this;\n\n    if (!callback) callback = function callback() {};\n\n    if (!this.options.resources) {\n      var _ret = function () {\n        if (_this3.language && _this3.language.toLowerCase() === 'cimode') return {\n            v: callback()\n          }; // avoid loading resources for cimode\n\n        var toLoad = [];\n\n        var append = function append(lng) {\n          var lngs = _this3.services.languageUtils.toResolveHierarchy(lng);\n          lngs.forEach(function (l) {\n            if (toLoad.indexOf(l) < 0) toLoad.push(l);\n          });\n        };\n\n        append(_this3.language);\n\n        if (_this3.options.preload) {\n          _this3.options.preload.forEach(function (l) {\n            append(l);\n          });\n        }\n\n        _this3.services.cacheConnector.load(toLoad, _this3.options.ns, function () {\n          _this3.services.backendConnector.load(toLoad, _this3.options.ns, callback);\n        });\n      }();\n\n      if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n    } else {\n      callback(null);\n    }\n  };\n\n  I18n.prototype.reloadResources = function reloadResources(lngs, ns) {\n    if (!lngs) lngs = this.languages;\n    if (!ns) ns = this.options.ns;\n    this.services.backendConnector.reload(lngs, ns);\n  };\n\n  I18n.prototype.use = function use(module) {\n    if (module.type === 'backend') {\n      this.modules.backend = module;\n    }\n\n    if (module.type === 'cache') {\n      this.modules.cache = module;\n    }\n\n    if (module.type === 'logger' || module.log && module.warn && module.warn) {\n      this.modules.logger = module;\n    }\n\n    if (module.type === 'languageDetector') {\n      this.modules.languageDetector = module;\n    }\n\n    if (module.type === 'postProcessor') {\n      _postProcessor2.default.addPostProcessor(module);\n    }\n\n    return this;\n  };\n\n  I18n.prototype.changeLanguage = function changeLanguage(lng, callback) {\n    var _this4 = this;\n\n    var done = function done(err) {\n      if (lng) {\n        _this4.emit('languageChanged', lng);\n        _this4.logger.log('languageChanged', lng);\n      }\n\n      if (callback) callback(err, function () {\n        for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n          args[_key4] = arguments[_key4];\n        }\n\n        return _this4.t.apply(_this4, args);\n      });\n    };\n\n    if (!lng && this.services.languageDetector) lng = this.services.languageDetector.detect();\n\n    if (lng) {\n      this.language = lng;\n      this.languages = this.services.languageUtils.toResolveHierarchy(lng);\n\n      this.translator.changeLanguage(lng);\n\n      if (this.services.languageDetector) this.services.languageDetector.cacheUserLanguage(lng);\n    }\n\n    this.loadResources(function (err) {\n      done(err);\n    });\n  };\n\n  I18n.prototype.getFixedT = function getFixedT(lng, ns) {\n    var _this5 = this;\n\n    var fixedT = function fixedT(key, options) {\n      options = options || {};\n      options.lng = options.lng || fixedT.lng;\n      options.ns = options.ns || fixedT.ns;\n      return _this5.t(key, options);\n    };\n    fixedT.lng = lng;\n    fixedT.ns = ns;\n    return fixedT;\n  };\n\n  I18n.prototype.t = function t() {\n    return this.translator && this.translator.translate.apply(this.translator, arguments);\n  };\n\n  I18n.prototype.exists = function exists() {\n    return this.translator && this.translator.exists.apply(this.translator, arguments);\n  };\n\n  I18n.prototype.setDefaultNamespace = function setDefaultNamespace(ns) {\n    this.options.defaultNS = ns;\n  };\n\n  I18n.prototype.loadNamespaces = function loadNamespaces(ns, callback) {\n    var _this6 = this;\n\n    if (!this.options.ns) return callback && callback();\n    if (typeof ns === 'string') ns = [ns];\n\n    ns.forEach(function (n) {\n      if (_this6.options.ns.indexOf(n) < 0) _this6.options.ns.push(n);\n    });\n\n    this.loadResources(callback);\n  };\n\n  I18n.prototype.loadLanguages = function loadLanguages(lngs, callback) {\n    if (typeof lngs === 'string') lngs = [lngs];\n    var preloaded = this.options.preload || [];\n\n    var newLngs = lngs.filter(function (lng) {\n      return preloaded.indexOf(lng) < 0;\n    });\n    // Exit early if all given languages are already preloaded\n    if (!newLngs.length) return callback();\n\n    this.options.preload = preloaded.concat(newLngs);\n    this.loadResources(callback);\n  };\n\n  I18n.prototype.dir = function dir(lng) {\n    if (!lng) lng = this.language;\n    if (!lng) return 'rtl';\n\n    var rtlLngs = ['ar', 'shu', 'sqr', 'ssh', 'xaa', 'yhd', 'yud', 'aao', 'abh', 'abv', 'acm', 'acq', 'acw', 'acx', 'acy', 'adf', 'ads', 'aeb', 'aec', 'afb', 'ajp', 'apc', 'apd', 'arb', 'arq', 'ars', 'ary', 'arz', 'auz', 'avl', 'ayh', 'ayl', 'ayn', 'ayp', 'bbz', 'pga', 'he', 'iw', 'ps', 'pbt', 'pbu', 'pst', 'prp', 'prd', 'ur', 'ydd', 'yds', 'yih', 'ji', 'yi', 'hbo', 'men', 'xmn', 'fa', 'jpr', 'peo', 'pes', 'prs', 'dv', 'sam'];\n\n    return rtlLngs.indexOf(this.services.languageUtils.getLanguagePartFromCode(lng)) >= 0 ? 'rtl' : 'ltr';\n  };\n\n  I18n.prototype.createInstance = function createInstance() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    return new I18n(options, callback);\n  };\n\n  I18n.prototype.cloneInstance = function cloneInstance() {\n    var _this7 = this;\n\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n    var callback = arguments[1];\n\n    var clone = new I18n(_extends({}, options, this.options, { isClone: true }), callback);\n    var membersToCopy = ['store', 'translator', 'services', 'language'];\n    membersToCopy.forEach(function (m) {\n      clone[m] = _this7[m];\n    });\n\n    return clone;\n  };\n\n  return I18n;\n}(_EventEmitter3.default);\n\nexports.default = new I18n();\n},{\"./BackendConnector\":2,\"./CacheConnector\":3,\"./EventEmitter\":4,\"./Interpolator\":5,\"./LanguageUtils\":6,\"./PluralResolver\":7,\"./ResourceStore\":8,\"./Translator\":9,\"./compatibility/v1\":10,\"./defaults\":11,\"./logger\":14,\"./postProcessor\":15}],13:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _i18next = require('./i18next');\n\nvar _i18next2 = _interopRequireDefault(_i18next);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _i18next2.default;\n},{\"./i18next\":12}],14:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar consoleLogger = {\n  type: 'logger',\n\n  log: function log(args) {\n    this._output('log', args);\n  },\n  warn: function warn(args) {\n    this._output('warn', args);\n  },\n  error: function error(args) {\n    this._output('error', args);\n  },\n  _output: function _output(type, args) {\n    if (console && console[type]) console[type].apply(console, Array.prototype.slice.call(args));\n  }\n};\n\nvar Logger = function () {\n  function Logger(concreteLogger) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    _classCallCheck(this, Logger);\n\n    this.subs = [];\n    this.init(concreteLogger, options);\n  }\n\n  Logger.prototype.init = function init(concreteLogger) {\n    var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n    this.prefix = options.prefix || 'i18next:';\n    this.logger = concreteLogger || consoleLogger;\n    this.options = options;\n    this.debug = options.debug === false ? false : true;\n  };\n\n  Logger.prototype.setDebug = function setDebug(bool) {\n    this.debug = bool;\n    this.subs.forEach(function (sub) {\n      sub.setDebug(bool);\n    });\n  };\n\n  Logger.prototype.log = function log() {\n    this.forward(arguments, 'log', '', true);\n  };\n\n  Logger.prototype.warn = function warn() {\n    this.forward(arguments, 'warn', '', true);\n  };\n\n  Logger.prototype.error = function error() {\n    this.forward(arguments, 'error', '');\n  };\n\n  Logger.prototype.deprecate = function deprecate() {\n    this.forward(arguments, 'warn', 'WARNING DEPRECATED: ', true);\n  };\n\n  Logger.prototype.forward = function forward(args, lvl, prefix, debugOnly) {\n    if (debugOnly && !this.debug) return;\n    if (typeof args[0] === 'string') args[0] = prefix + this.prefix + ' ' + args[0];\n    this.logger[lvl](args);\n  };\n\n  Logger.prototype.create = function create(moduleName) {\n    var sub = new Logger(this.logger, _extends({ prefix: this.prefix + ':' + moduleName + ':' }, this.options));\n    this.subs.push(sub);\n\n    return sub;\n  };\n\n  // createInstance(options = {}) {\n  //   return new Logger(options, callback);\n  // }\n\n  return Logger;\n}();\n\n;\n\nexports.default = new Logger();\n},{}],15:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n\n  processors: {},\n\n  addPostProcessor: function addPostProcessor(module) {\n    this.processors[module.name] = module;\n  },\n  handle: function handle(processors, value, key, options, translator) {\n    var _this = this;\n\n    processors.forEach(function (processor) {\n      if (_this.processors[processor]) value = _this.processors[processor].process(value, key, options, translator);\n    });\n\n    return value;\n  }\n};\n},{}],16:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeString = makeString;\nexports.copy = copy;\nexports.setPath = setPath;\nexports.pushPath = pushPath;\nexports.getPath = getPath;\nexports.deepExtend = deepExtend;\nexports.regexEscape = regexEscape;\nexports.escape = escape;\nfunction makeString(object) {\n  if (object == null) return '';\n  return '' + object;\n}\n\nfunction copy(a, s, t) {\n  a.forEach(function (m) {\n    if (s[m]) t[m] = s[m];\n  });\n}\n\nfunction getLastOfPath(object, path, Empty) {\n  function cleanKey(key) {\n    return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n  }\n\n  var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n  while (stack.length > 1) {\n    if (!object) return {};\n\n    var key = cleanKey(stack.shift());\n    if (!object[key] && Empty) object[key] = new Empty();\n    object = object[key];\n  }\n\n  if (!object) return {};\n  return {\n    obj: object,\n    k: cleanKey(stack.shift())\n  };\n}\n\nfunction setPath(object, path, newValue) {\n  var _getLastOfPath = getLastOfPath(object, path, Object);\n\n  var obj = _getLastOfPath.obj;\n  var k = _getLastOfPath.k;\n\n\n  obj[k] = newValue;\n}\n\nfunction pushPath(object, path, newValue, concat) {\n  var _getLastOfPath2 = getLastOfPath(object, path, Object);\n\n  var obj = _getLastOfPath2.obj;\n  var k = _getLastOfPath2.k;\n\n\n  obj[k] = obj[k] || [];\n  if (concat) obj[k] = obj[k].concat(newValue);\n  if (!concat) obj[k].push(newValue);\n}\n\nfunction getPath(object, path) {\n  var _getLastOfPath3 = getLastOfPath(object, path);\n\n  var obj = _getLastOfPath3.obj;\n  var k = _getLastOfPath3.k;\n\n\n  if (!obj) return undefined;\n  return obj[k];\n}\n\nfunction deepExtend(target, source, overwrite) {\n  for (var prop in source) {\n    if (prop in target) {\n      // If we reached a leaf string in target or source then replace with source or skip depending on the 'overwrite' switch\n      if (typeof target[prop] === 'string' || target[prop] instanceof String || typeof source[prop] === 'string' || source[prop] instanceof String) {\n        if (overwrite) target[prop] = source[prop];\n      } else {\n        deepExtend(target[prop], source[prop], overwrite);\n      }\n    } else {\n      target[prop] = source[prop];\n    }\n  }return target;\n}\n\nfunction regexEscape(str) {\n  return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n}\n\n/* eslint-disable */\nvar _entityMap = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  \"/\": '&#x2F;'\n};\n/* eslint-enable */\n\nfunction escape(data) {\n  if (typeof data === 'string') {\n    return data.replace(/[&<>\"'\\/]/g, function (s) {\n      return _entityMap[s];\n    });\n  } else {\n    return data;\n  }\n}\n},{}],17:[function(require,module,exports){\nmodule.exports = require('./dist/commonjs/index.js').default;\n\n},{\"./dist/commonjs/index.js\":13}]},{},[1])(1)\n});","/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Find the differences between two texts.  Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {Int|Object} [cursor_pos] Edit position in text1 or object with more info\n * @param {boolean} [cleanup] Apply semantic cleanup before returning.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2, cursor_pos, cleanup, _fix_unicode) {\n  // Check for equality\n  if (text1 === text2) {\n    if (text1) {\n      return [[DIFF_EQUAL, text1]];\n    }\n    return [];\n  }\n\n  if (cursor_pos != null) {\n    var editdiff = find_cursor_edit_diff(text1, text2, cursor_pos);\n    if (editdiff) {\n      return editdiff;\n    }\n  }\n\n  // Trim off common prefix (speedup).\n  var commonlength = diff_commonPrefix(text1, text2);\n  var commonprefix = text1.substring(0, commonlength);\n  text1 = text1.substring(commonlength);\n  text2 = text2.substring(commonlength);\n\n  // Trim off common suffix (speedup).\n  commonlength = diff_commonSuffix(text1, text2);\n  var commonsuffix = text1.substring(text1.length - commonlength);\n  text1 = text1.substring(0, text1.length - commonlength);\n  text2 = text2.substring(0, text2.length - commonlength);\n\n  // Compute the diff on the middle block.\n  var diffs = diff_compute_(text1, text2);\n\n  // Restore the prefix and suffix.\n  if (commonprefix) {\n    diffs.unshift([DIFF_EQUAL, commonprefix]);\n  }\n  if (commonsuffix) {\n    diffs.push([DIFF_EQUAL, commonsuffix]);\n  }\n  diff_cleanupMerge(diffs, _fix_unicode);\n  if (cleanup) {\n    diff_cleanupSemantic(diffs);\n  }\n  return diffs;\n}\n\n/**\n * Find the differences between two texts.  Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n  var diffs;\n\n  if (!text1) {\n    // Just add some text (speedup).\n    return [[DIFF_INSERT, text2]];\n  }\n\n  if (!text2) {\n    // Just delete some text (speedup).\n    return [[DIFF_DELETE, text1]];\n  }\n\n  var longtext = text1.length > text2.length ? text1 : text2;\n  var shorttext = text1.length > text2.length ? text2 : text1;\n  var i = longtext.indexOf(shorttext);\n  if (i !== -1) {\n    // Shorter text is inside the longer text (speedup).\n    diffs = [\n      [DIFF_INSERT, longtext.substring(0, i)],\n      [DIFF_EQUAL, shorttext],\n      [DIFF_INSERT, longtext.substring(i + shorttext.length)],\n    ];\n    // Swap insertions for deletions if diff is reversed.\n    if (text1.length > text2.length) {\n      diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n    }\n    return diffs;\n  }\n\n  if (shorttext.length === 1) {\n    // Single character string.\n    // After the previous speedup, the character can't be an equality.\n    return [\n      [DIFF_DELETE, text1],\n      [DIFF_INSERT, text2],\n    ];\n  }\n\n  // Check to see if the problem can be split in two.\n  var hm = diff_halfMatch_(text1, text2);\n  if (hm) {\n    // A half-match was found, sort out the return data.\n    var text1_a = hm[0];\n    var text1_b = hm[1];\n    var text2_a = hm[2];\n    var text2_b = hm[3];\n    var mid_common = hm[4];\n    // Send both pairs off for separate processing.\n    var diffs_a = diff_main(text1_a, text2_a);\n    var diffs_b = diff_main(text1_b, text2_b);\n    // Merge the results.\n    return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n  }\n\n  return diff_bisect_(text1, text2);\n}\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n  // Cache the text lengths to prevent multiple calls.\n  var text1_length = text1.length;\n  var text2_length = text2.length;\n  var max_d = Math.ceil((text1_length + text2_length) / 2);\n  var v_offset = max_d;\n  var v_length = 2 * max_d;\n  var v1 = new Array(v_length);\n  var v2 = new Array(v_length);\n  // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n  // integers and undefined.\n  for (var x = 0; x < v_length; x++) {\n    v1[x] = -1;\n    v2[x] = -1;\n  }\n  v1[v_offset + 1] = 0;\n  v2[v_offset + 1] = 0;\n  var delta = text1_length - text2_length;\n  // If the total number of characters is odd, then the front path will collide\n  // with the reverse path.\n  var front = delta % 2 !== 0;\n  // Offsets for start and end of k loop.\n  // Prevents mapping of space beyond the grid.\n  var k1start = 0;\n  var k1end = 0;\n  var k2start = 0;\n  var k2end = 0;\n  for (var d = 0; d < max_d; d++) {\n    // Walk the front path one step.\n    for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n      var k1_offset = v_offset + k1;\n      var x1;\n      if (k1 === -d || (k1 !== d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n        x1 = v1[k1_offset + 1];\n      } else {\n        x1 = v1[k1_offset - 1] + 1;\n      }\n      var y1 = x1 - k1;\n      while (\n        x1 < text1_length &&\n        y1 < text2_length &&\n        text1.charAt(x1) === text2.charAt(y1)\n      ) {\n        x1++;\n        y1++;\n      }\n      v1[k1_offset] = x1;\n      if (x1 > text1_length) {\n        // Ran off the right of the graph.\n        k1end += 2;\n      } else if (y1 > text2_length) {\n        // Ran off the bottom of the graph.\n        k1start += 2;\n      } else if (front) {\n        var k2_offset = v_offset + delta - k1;\n        if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] !== -1) {\n          // Mirror x2 onto top-left coordinate system.\n          var x2 = text1_length - v2[k2_offset];\n          if (x1 >= x2) {\n            // Overlap detected.\n            return diff_bisectSplit_(text1, text2, x1, y1);\n          }\n        }\n      }\n    }\n\n    // Walk the reverse path one step.\n    for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n      var k2_offset = v_offset + k2;\n      var x2;\n      if (k2 === -d || (k2 !== d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n        x2 = v2[k2_offset + 1];\n      } else {\n        x2 = v2[k2_offset - 1] + 1;\n      }\n      var y2 = x2 - k2;\n      while (\n        x2 < text1_length &&\n        y2 < text2_length &&\n        text1.charAt(text1_length - x2 - 1) ===\n          text2.charAt(text2_length - y2 - 1)\n      ) {\n        x2++;\n        y2++;\n      }\n      v2[k2_offset] = x2;\n      if (x2 > text1_length) {\n        // Ran off the left of the graph.\n        k2end += 2;\n      } else if (y2 > text2_length) {\n        // Ran off the top of the graph.\n        k2start += 2;\n      } else if (!front) {\n        var k1_offset = v_offset + delta - k2;\n        if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] !== -1) {\n          var x1 = v1[k1_offset];\n          var y1 = v_offset + x1 - k1_offset;\n          // Mirror x2 onto top-left coordinate system.\n          x2 = text1_length - x2;\n          if (x1 >= x2) {\n            // Overlap detected.\n            return diff_bisectSplit_(text1, text2, x1, y1);\n          }\n        }\n      }\n    }\n  }\n  // Diff took too long and hit the deadline or\n  // number of diffs equals number of characters, no commonality at all.\n  return [\n    [DIFF_DELETE, text1],\n    [DIFF_INSERT, text2],\n  ];\n}\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n  var text1a = text1.substring(0, x);\n  var text2a = text2.substring(0, y);\n  var text1b = text1.substring(x);\n  var text2b = text2.substring(y);\n\n  // Compute both diffs serially.\n  var diffs = diff_main(text1a, text2a);\n  var diffsb = diff_main(text1b, text2b);\n\n  return diffs.concat(diffsb);\n}\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n *     string.\n */\nfunction diff_commonPrefix(text1, text2) {\n  // Quick check for common null cases.\n  if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n    return 0;\n  }\n  // Binary search.\n  // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n  var pointermin = 0;\n  var pointermax = Math.min(text1.length, text2.length);\n  var pointermid = pointermax;\n  var pointerstart = 0;\n  while (pointermin < pointermid) {\n    if (\n      text1.substring(pointerstart, pointermid) ==\n      text2.substring(pointerstart, pointermid)\n    ) {\n      pointermin = pointermid;\n      pointerstart = pointermin;\n    } else {\n      pointermax = pointermid;\n    }\n    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  }\n\n  if (is_surrogate_pair_start(text1.charCodeAt(pointermid - 1))) {\n    pointermid--;\n  }\n\n  return pointermid;\n}\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n *     string and the start of the second string.\n * @private\n */\nfunction diff_commonOverlap_(text1, text2) {\n  // Cache the text lengths to prevent multiple calls.\n  var text1_length = text1.length;\n  var text2_length = text2.length;\n  // Eliminate the null case.\n  if (text1_length == 0 || text2_length == 0) {\n    return 0;\n  }\n  // Truncate the longer string.\n  if (text1_length > text2_length) {\n    text1 = text1.substring(text1_length - text2_length);\n  } else if (text1_length < text2_length) {\n    text2 = text2.substring(0, text1_length);\n  }\n  var text_length = Math.min(text1_length, text2_length);\n  // Quick check for the worst case.\n  if (text1 == text2) {\n    return text_length;\n  }\n\n  // Start by looking for a single character match\n  // and increase length until no match is found.\n  // Performance analysis: http://neil.fraser.name/news/2010/11/04/\n  var best = 0;\n  var length = 1;\n  while (true) {\n    var pattern = text1.substring(text_length - length);\n    var found = text2.indexOf(pattern);\n    if (found == -1) {\n      return best;\n    }\n    length += found;\n    if (\n      found == 0 ||\n      text1.substring(text_length - length) == text2.substring(0, length)\n    ) {\n      best = length;\n      length++;\n    }\n  }\n}\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n  // Quick check for common null cases.\n  if (!text1 || !text2 || text1.slice(-1) !== text2.slice(-1)) {\n    return 0;\n  }\n  // Binary search.\n  // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n  var pointermin = 0;\n  var pointermax = Math.min(text1.length, text2.length);\n  var pointermid = pointermax;\n  var pointerend = 0;\n  while (pointermin < pointermid) {\n    if (\n      text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n      text2.substring(text2.length - pointermid, text2.length - pointerend)\n    ) {\n      pointermin = pointermid;\n      pointerend = pointermin;\n    } else {\n      pointermax = pointermid;\n    }\n    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  }\n\n  if (is_surrogate_pair_end(text1.charCodeAt(text1.length - pointermid))) {\n    pointermid--;\n  }\n\n  return pointermid;\n}\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n *     text1, the suffix of text1, the prefix of text2, the suffix of\n *     text2 and the common middle.  Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n  var longtext = text1.length > text2.length ? text1 : text2;\n  var shorttext = text1.length > text2.length ? text2 : text1;\n  if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n    return null; // Pointless.\n  }\n\n  /**\n   * Does a substring of shorttext exist within longtext such that the substring\n   * is at least half the length of longtext?\n   * Closure, but does not reference any external variables.\n   * @param {string} longtext Longer string.\n   * @param {string} shorttext Shorter string.\n   * @param {number} i Start index of quarter length substring within longtext.\n   * @return {Array.<string>} Five element Array, containing the prefix of\n   *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n   *     of shorttext and the common middle.  Or null if there was no match.\n   * @private\n   */\n  function diff_halfMatchI_(longtext, shorttext, i) {\n    // Start with a 1/4 length substring at position i as a seed.\n    var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n    var j = -1;\n    var best_common = \"\";\n    var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n    while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n      var prefixLength = diff_commonPrefix(\n        longtext.substring(i),\n        shorttext.substring(j)\n      );\n      var suffixLength = diff_commonSuffix(\n        longtext.substring(0, i),\n        shorttext.substring(0, j)\n      );\n      if (best_common.length < suffixLength + prefixLength) {\n        best_common =\n          shorttext.substring(j - suffixLength, j) +\n          shorttext.substring(j, j + prefixLength);\n        best_longtext_a = longtext.substring(0, i - suffixLength);\n        best_longtext_b = longtext.substring(i + prefixLength);\n        best_shorttext_a = shorttext.substring(0, j - suffixLength);\n        best_shorttext_b = shorttext.substring(j + prefixLength);\n      }\n    }\n    if (best_common.length * 2 >= longtext.length) {\n      return [\n        best_longtext_a,\n        best_longtext_b,\n        best_shorttext_a,\n        best_shorttext_b,\n        best_common,\n      ];\n    } else {\n      return null;\n    }\n  }\n\n  // First check if the second quarter is the seed for a half-match.\n  var hm1 = diff_halfMatchI_(\n    longtext,\n    shorttext,\n    Math.ceil(longtext.length / 4)\n  );\n  // Check again based on the third quarter.\n  var hm2 = diff_halfMatchI_(\n    longtext,\n    shorttext,\n    Math.ceil(longtext.length / 2)\n  );\n  var hm;\n  if (!hm1 && !hm2) {\n    return null;\n  } else if (!hm2) {\n    hm = hm1;\n  } else if (!hm1) {\n    hm = hm2;\n  } else {\n    // Both matched.  Select the longest.\n    hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n  }\n\n  // A half-match was found, sort out the return data.\n  var text1_a, text1_b, text2_a, text2_b;\n  if (text1.length > text2.length) {\n    text1_a = hm[0];\n    text1_b = hm[1];\n    text2_a = hm[2];\n    text2_b = hm[3];\n  } else {\n    text2_a = hm[0];\n    text2_b = hm[1];\n    text1_a = hm[2];\n    text1_b = hm[3];\n  }\n  var mid_common = hm[4];\n  return [text1_a, text1_b, text2_a, text2_b, mid_common];\n}\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\nfunction diff_cleanupSemantic(diffs) {\n  var changes = false;\n  var equalities = []; // Stack of indices where equalities are found.\n  var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n  /** @type {?string} */\n  var lastequality = null;\n  // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  var pointer = 0; // Index of current position.\n  // Number of characters that changed prior to the equality.\n  var length_insertions1 = 0;\n  var length_deletions1 = 0;\n  // Number of characters that changed after the equality.\n  var length_insertions2 = 0;\n  var length_deletions2 = 0;\n  while (pointer < diffs.length) {\n    if (diffs[pointer][0] == DIFF_EQUAL) {\n      // Equality found.\n      equalities[equalitiesLength++] = pointer;\n      length_insertions1 = length_insertions2;\n      length_deletions1 = length_deletions2;\n      length_insertions2 = 0;\n      length_deletions2 = 0;\n      lastequality = diffs[pointer][1];\n    } else {\n      // An insertion or deletion.\n      if (diffs[pointer][0] == DIFF_INSERT) {\n        length_insertions2 += diffs[pointer][1].length;\n      } else {\n        length_deletions2 += diffs[pointer][1].length;\n      }\n      // Eliminate an equality that is smaller or equal to the edits on both\n      // sides of it.\n      if (\n        lastequality &&\n        lastequality.length <=\n          Math.max(length_insertions1, length_deletions1) &&\n        lastequality.length <= Math.max(length_insertions2, length_deletions2)\n      ) {\n        // Duplicate record.\n        diffs.splice(equalities[equalitiesLength - 1], 0, [\n          DIFF_DELETE,\n          lastequality,\n        ]);\n        // Change second copy to insert.\n        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n        // Throw away the equality we just deleted.\n        equalitiesLength--;\n        // Throw away the previous equality (it needs to be reevaluated).\n        equalitiesLength--;\n        pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n        length_insertions1 = 0; // Reset the counters.\n        length_deletions1 = 0;\n        length_insertions2 = 0;\n        length_deletions2 = 0;\n        lastequality = null;\n        changes = true;\n      }\n    }\n    pointer++;\n  }\n\n  // Normalize the diff.\n  if (changes) {\n    diff_cleanupMerge(diffs);\n  }\n  diff_cleanupSemanticLossless(diffs);\n\n  // Find any overlaps between deletions and insertions.\n  // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n  //   -> <del>abc</del>xxx<ins>def</ins>\n  // e.g: <del>xxxabc</del><ins>defxxx</ins>\n  //   -> <ins>def</ins>xxx<del>abc</del>\n  // Only extract an overlap if it is as big as the edit ahead or behind it.\n  pointer = 1;\n  while (pointer < diffs.length) {\n    if (\n      diffs[pointer - 1][0] == DIFF_DELETE &&\n      diffs[pointer][0] == DIFF_INSERT\n    ) {\n      var deletion = diffs[pointer - 1][1];\n      var insertion = diffs[pointer][1];\n      var overlap_length1 = diff_commonOverlap_(deletion, insertion);\n      var overlap_length2 = diff_commonOverlap_(insertion, deletion);\n      if (overlap_length1 >= overlap_length2) {\n        if (\n          overlap_length1 >= deletion.length / 2 ||\n          overlap_length1 >= insertion.length / 2\n        ) {\n          // Overlap found.  Insert an equality and trim the surrounding edits.\n          diffs.splice(pointer, 0, [\n            DIFF_EQUAL,\n            insertion.substring(0, overlap_length1),\n          ]);\n          diffs[pointer - 1][1] = deletion.substring(\n            0,\n            deletion.length - overlap_length1\n          );\n          diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n          pointer++;\n        }\n      } else {\n        if (\n          overlap_length2 >= deletion.length / 2 ||\n          overlap_length2 >= insertion.length / 2\n        ) {\n          // Reverse overlap found.\n          // Insert an equality and swap and trim the surrounding edits.\n          diffs.splice(pointer, 0, [\n            DIFF_EQUAL,\n            deletion.substring(0, overlap_length2),\n          ]);\n          diffs[pointer - 1][0] = DIFF_INSERT;\n          diffs[pointer - 1][1] = insertion.substring(\n            0,\n            insertion.length - overlap_length2\n          );\n          diffs[pointer + 1][0] = DIFF_DELETE;\n          diffs[pointer + 1][1] = deletion.substring(overlap_length2);\n          pointer++;\n        }\n      }\n      pointer++;\n    }\n    pointer++;\n  }\n}\n\nvar nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\nvar whitespaceRegex_ = /\\s/;\nvar linebreakRegex_ = /[\\r\\n]/;\nvar blanklineEndRegex_ = /\\n\\r?\\n$/;\nvar blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\nfunction diff_cleanupSemanticLossless(diffs) {\n  /**\n   * Given two strings, compute a score representing whether the internal\n   * boundary falls on logical boundaries.\n   * Scores range from 6 (best) to 0 (worst).\n   * Closure, but does not reference any external variables.\n   * @param {string} one First string.\n   * @param {string} two Second string.\n   * @return {number} The score.\n   * @private\n   */\n  function diff_cleanupSemanticScore_(one, two) {\n    if (!one || !two) {\n      // Edges are the best.\n      return 6;\n    }\n\n    // Each port of this function behaves slightly differently due to\n    // subtle differences in each language's definition of things like\n    // 'whitespace'.  Since this function's purpose is largely cosmetic,\n    // the choice has been made to use each language's native features\n    // rather than force total conformity.\n    var char1 = one.charAt(one.length - 1);\n    var char2 = two.charAt(0);\n    var nonAlphaNumeric1 = char1.match(nonAlphaNumericRegex_);\n    var nonAlphaNumeric2 = char2.match(nonAlphaNumericRegex_);\n    var whitespace1 = nonAlphaNumeric1 && char1.match(whitespaceRegex_);\n    var whitespace2 = nonAlphaNumeric2 && char2.match(whitespaceRegex_);\n    var lineBreak1 = whitespace1 && char1.match(linebreakRegex_);\n    var lineBreak2 = whitespace2 && char2.match(linebreakRegex_);\n    var blankLine1 = lineBreak1 && one.match(blanklineEndRegex_);\n    var blankLine2 = lineBreak2 && two.match(blanklineStartRegex_);\n\n    if (blankLine1 || blankLine2) {\n      // Five points for blank lines.\n      return 5;\n    } else if (lineBreak1 || lineBreak2) {\n      // Four points for line breaks.\n      return 4;\n    } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n      // Three points for end of sentences.\n      return 3;\n    } else if (whitespace1 || whitespace2) {\n      // Two points for whitespace.\n      return 2;\n    } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n      // One point for non-alphanumeric.\n      return 1;\n    }\n    return 0;\n  }\n\n  var pointer = 1;\n  // Intentionally ignore the first and last element (don't need checking).\n  while (pointer < diffs.length - 1) {\n    if (\n      diffs[pointer - 1][0] == DIFF_EQUAL &&\n      diffs[pointer + 1][0] == DIFF_EQUAL\n    ) {\n      // This is a single edit surrounded by equalities.\n      var equality1 = diffs[pointer - 1][1];\n      var edit = diffs[pointer][1];\n      var equality2 = diffs[pointer + 1][1];\n\n      // First, shift the edit as far left as possible.\n      var commonOffset = diff_commonSuffix(equality1, edit);\n      if (commonOffset) {\n        var commonString = edit.substring(edit.length - commonOffset);\n        equality1 = equality1.substring(0, equality1.length - commonOffset);\n        edit = commonString + edit.substring(0, edit.length - commonOffset);\n        equality2 = commonString + equality2;\n      }\n\n      // Second, step character by character right, looking for the best fit.\n      var bestEquality1 = equality1;\n      var bestEdit = edit;\n      var bestEquality2 = equality2;\n      var bestScore =\n        diff_cleanupSemanticScore_(equality1, edit) +\n        diff_cleanupSemanticScore_(edit, equality2);\n      while (edit.charAt(0) === equality2.charAt(0)) {\n        equality1 += edit.charAt(0);\n        edit = edit.substring(1) + equality2.charAt(0);\n        equality2 = equality2.substring(1);\n        var score =\n          diff_cleanupSemanticScore_(equality1, edit) +\n          diff_cleanupSemanticScore_(edit, equality2);\n        // The >= encourages trailing rather than leading whitespace on edits.\n        if (score >= bestScore) {\n          bestScore = score;\n          bestEquality1 = equality1;\n          bestEdit = edit;\n          bestEquality2 = equality2;\n        }\n      }\n\n      if (diffs[pointer - 1][1] != bestEquality1) {\n        // We have an improvement, save it back to the diff.\n        if (bestEquality1) {\n          diffs[pointer - 1][1] = bestEquality1;\n        } else {\n          diffs.splice(pointer - 1, 1);\n          pointer--;\n        }\n        diffs[pointer][1] = bestEdit;\n        if (bestEquality2) {\n          diffs[pointer + 1][1] = bestEquality2;\n        } else {\n          diffs.splice(pointer + 1, 1);\n          pointer--;\n        }\n      }\n    }\n    pointer++;\n  }\n}\n\n/**\n * Reorder and merge like edit sections.  Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n * @param {boolean} fix_unicode Whether to normalize to a unicode-correct diff\n */\nfunction diff_cleanupMerge(diffs, fix_unicode) {\n  diffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n  var pointer = 0;\n  var count_delete = 0;\n  var count_insert = 0;\n  var text_delete = \"\";\n  var text_insert = \"\";\n  var commonlength;\n  while (pointer < diffs.length) {\n    if (pointer < diffs.length - 1 && !diffs[pointer][1]) {\n      diffs.splice(pointer, 1);\n      continue;\n    }\n    switch (diffs[pointer][0]) {\n      case DIFF_INSERT:\n        count_insert++;\n        text_insert += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_DELETE:\n        count_delete++;\n        text_delete += diffs[pointer][1];\n        pointer++;\n        break;\n      case DIFF_EQUAL:\n        var previous_equality = pointer - count_insert - count_delete - 1;\n        if (fix_unicode) {\n          // prevent splitting of unicode surrogate pairs.  when fix_unicode is true,\n          // we assume that the old and new text in the diff are complete and correct\n          // unicode-encoded JS strings, but the tuple boundaries may fall between\n          // surrogate pairs.  we fix this by shaving off stray surrogates from the end\n          // of the previous equality and the beginning of this equality.  this may create\n          // empty equalities or a common prefix or suffix.  for example, if AB and AC are\n          // emojis, `[[0, 'A'], [-1, 'BA'], [0, 'C']]` would turn into deleting 'ABAC' and\n          // inserting 'AC', and then the common suffix 'AC' will be eliminated.  in this\n          // particular case, both equalities go away, we absorb any previous inequalities,\n          // and we keep scanning for the next equality before rewriting the tuples.\n          if (\n            previous_equality >= 0 &&\n            ends_with_pair_start(diffs[previous_equality][1])\n          ) {\n            var stray = diffs[previous_equality][1].slice(-1);\n            diffs[previous_equality][1] = diffs[previous_equality][1].slice(\n              0,\n              -1\n            );\n            text_delete = stray + text_delete;\n            text_insert = stray + text_insert;\n            if (!diffs[previous_equality][1]) {\n              // emptied out previous equality, so delete it and include previous delete/insert\n              diffs.splice(previous_equality, 1);\n              pointer--;\n              var k = previous_equality - 1;\n              if (diffs[k] && diffs[k][0] === DIFF_INSERT) {\n                count_insert++;\n                text_insert = diffs[k][1] + text_insert;\n                k--;\n              }\n              if (diffs[k] && diffs[k][0] === DIFF_DELETE) {\n                count_delete++;\n                text_delete = diffs[k][1] + text_delete;\n                k--;\n              }\n              previous_equality = k;\n            }\n          }\n          if (starts_with_pair_end(diffs[pointer][1])) {\n            var stray = diffs[pointer][1].charAt(0);\n            diffs[pointer][1] = diffs[pointer][1].slice(1);\n            text_delete += stray;\n            text_insert += stray;\n          }\n        }\n        if (pointer < diffs.length - 1 && !diffs[pointer][1]) {\n          // for empty equality not at end, wait for next equality\n          diffs.splice(pointer, 1);\n          break;\n        }\n        if (text_delete.length > 0 || text_insert.length > 0) {\n          // note that diff_commonPrefix and diff_commonSuffix are unicode-aware\n          if (text_delete.length > 0 && text_insert.length > 0) {\n            // Factor out any common prefixes.\n            commonlength = diff_commonPrefix(text_insert, text_delete);\n            if (commonlength !== 0) {\n              if (previous_equality >= 0) {\n                diffs[previous_equality][1] += text_insert.substring(\n                  0,\n                  commonlength\n                );\n              } else {\n                diffs.splice(0, 0, [\n                  DIFF_EQUAL,\n                  text_insert.substring(0, commonlength),\n                ]);\n                pointer++;\n              }\n              text_insert = text_insert.substring(commonlength);\n              text_delete = text_delete.substring(commonlength);\n            }\n            // Factor out any common suffixes.\n            commonlength = diff_commonSuffix(text_insert, text_delete);\n            if (commonlength !== 0) {\n              diffs[pointer][1] =\n                text_insert.substring(text_insert.length - commonlength) +\n                diffs[pointer][1];\n              text_insert = text_insert.substring(\n                0,\n                text_insert.length - commonlength\n              );\n              text_delete = text_delete.substring(\n                0,\n                text_delete.length - commonlength\n              );\n            }\n          }\n          // Delete the offending records and add the merged ones.\n          var n = count_insert + count_delete;\n          if (text_delete.length === 0 && text_insert.length === 0) {\n            diffs.splice(pointer - n, n);\n            pointer = pointer - n;\n          } else if (text_delete.length === 0) {\n            diffs.splice(pointer - n, n, [DIFF_INSERT, text_insert]);\n            pointer = pointer - n + 1;\n          } else if (text_insert.length === 0) {\n            diffs.splice(pointer - n, n, [DIFF_DELETE, text_delete]);\n            pointer = pointer - n + 1;\n          } else {\n            diffs.splice(\n              pointer - n,\n              n,\n              [DIFF_DELETE, text_delete],\n              [DIFF_INSERT, text_insert]\n            );\n            pointer = pointer - n + 2;\n          }\n        }\n        if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n          // Merge this equality with the previous one.\n          diffs[pointer - 1][1] += diffs[pointer][1];\n          diffs.splice(pointer, 1);\n        } else {\n          pointer++;\n        }\n        count_insert = 0;\n        count_delete = 0;\n        text_delete = \"\";\n        text_insert = \"\";\n        break;\n    }\n  }\n  if (diffs[diffs.length - 1][1] === \"\") {\n    diffs.pop(); // Remove the dummy entry at the end.\n  }\n\n  // Second pass: look for single edits surrounded on both sides by equalities\n  // which can be shifted sideways to eliminate an equality.\n  // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n  var changes = false;\n  pointer = 1;\n  // Intentionally ignore the first and last element (don't need checking).\n  while (pointer < diffs.length - 1) {\n    if (\n      diffs[pointer - 1][0] === DIFF_EQUAL &&\n      diffs[pointer + 1][0] === DIFF_EQUAL\n    ) {\n      // This is a single edit surrounded by equalities.\n      if (\n        diffs[pointer][1].substring(\n          diffs[pointer][1].length - diffs[pointer - 1][1].length\n        ) === diffs[pointer - 1][1]\n      ) {\n        // Shift the edit over the previous equality.\n        diffs[pointer][1] =\n          diffs[pointer - 1][1] +\n          diffs[pointer][1].substring(\n            0,\n            diffs[pointer][1].length - diffs[pointer - 1][1].length\n          );\n        diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n        diffs.splice(pointer - 1, 1);\n        changes = true;\n      } else if (\n        diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n        diffs[pointer + 1][1]\n      ) {\n        // Shift the edit over the next equality.\n        diffs[pointer - 1][1] += diffs[pointer + 1][1];\n        diffs[pointer][1] =\n          diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n          diffs[pointer + 1][1];\n        diffs.splice(pointer + 1, 1);\n        changes = true;\n      }\n    }\n    pointer++;\n  }\n  // If shifts were made, the diff needs reordering and another shift sweep.\n  if (changes) {\n    diff_cleanupMerge(diffs, fix_unicode);\n  }\n}\n\nfunction is_surrogate_pair_start(charCode) {\n  return charCode >= 0xd800 && charCode <= 0xdbff;\n}\n\nfunction is_surrogate_pair_end(charCode) {\n  return charCode >= 0xdc00 && charCode <= 0xdfff;\n}\n\nfunction starts_with_pair_end(str) {\n  return is_surrogate_pair_end(str.charCodeAt(0));\n}\n\nfunction ends_with_pair_start(str) {\n  return is_surrogate_pair_start(str.charCodeAt(str.length - 1));\n}\n\nfunction remove_empty_tuples(tuples) {\n  var ret = [];\n  for (var i = 0; i < tuples.length; i++) {\n    if (tuples[i][1].length > 0) {\n      ret.push(tuples[i]);\n    }\n  }\n  return ret;\n}\n\nfunction make_edit_splice(before, oldMiddle, newMiddle, after) {\n  if (ends_with_pair_start(before) || starts_with_pair_end(after)) {\n    return null;\n  }\n  return remove_empty_tuples([\n    [DIFF_EQUAL, before],\n    [DIFF_DELETE, oldMiddle],\n    [DIFF_INSERT, newMiddle],\n    [DIFF_EQUAL, after],\n  ]);\n}\n\nfunction find_cursor_edit_diff(oldText, newText, cursor_pos) {\n  // note: this runs after equality check has ruled out exact equality\n  var oldRange =\n    typeof cursor_pos === \"number\"\n      ? { index: cursor_pos, length: 0 }\n      : cursor_pos.oldRange;\n  var newRange = typeof cursor_pos === \"number\" ? null : cursor_pos.newRange;\n  // take into account the old and new selection to generate the best diff\n  // possible for a text edit.  for example, a text change from \"xxx\" to \"xx\"\n  // could be a delete or forwards-delete of any one of the x's, or the\n  // result of selecting two of the x's and typing \"x\".\n  var oldLength = oldText.length;\n  var newLength = newText.length;\n  if (oldRange.length === 0 && (newRange === null || newRange.length === 0)) {\n    // see if we have an insert or delete before or after cursor\n    var oldCursor = oldRange.index;\n    var oldBefore = oldText.slice(0, oldCursor);\n    var oldAfter = oldText.slice(oldCursor);\n    var maybeNewCursor = newRange ? newRange.index : null;\n    editBefore: {\n      // is this an insert or delete right before oldCursor?\n      var newCursor = oldCursor + newLength - oldLength;\n      if (maybeNewCursor !== null && maybeNewCursor !== newCursor) {\n        break editBefore;\n      }\n      if (newCursor < 0 || newCursor > newLength) {\n        break editBefore;\n      }\n      var newBefore = newText.slice(0, newCursor);\n      var newAfter = newText.slice(newCursor);\n      if (newAfter !== oldAfter) {\n        break editBefore;\n      }\n      var prefixLength = Math.min(oldCursor, newCursor);\n      var oldPrefix = oldBefore.slice(0, prefixLength);\n      var newPrefix = newBefore.slice(0, prefixLength);\n      if (oldPrefix !== newPrefix) {\n        break editBefore;\n      }\n      var oldMiddle = oldBefore.slice(prefixLength);\n      var newMiddle = newBefore.slice(prefixLength);\n      return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldAfter);\n    }\n    editAfter: {\n      // is this an insert or delete right after oldCursor?\n      if (maybeNewCursor !== null && maybeNewCursor !== oldCursor) {\n        break editAfter;\n      }\n      var cursor = oldCursor;\n      var newBefore = newText.slice(0, cursor);\n      var newAfter = newText.slice(cursor);\n      if (newBefore !== oldBefore) {\n        break editAfter;\n      }\n      var suffixLength = Math.min(oldLength - cursor, newLength - cursor);\n      var oldSuffix = oldAfter.slice(oldAfter.length - suffixLength);\n      var newSuffix = newAfter.slice(newAfter.length - suffixLength);\n      if (oldSuffix !== newSuffix) {\n        break editAfter;\n      }\n      var oldMiddle = oldAfter.slice(0, oldAfter.length - suffixLength);\n      var newMiddle = newAfter.slice(0, newAfter.length - suffixLength);\n      return make_edit_splice(oldBefore, oldMiddle, newMiddle, oldSuffix);\n    }\n  }\n  if (oldRange.length > 0 && newRange && newRange.length === 0) {\n    replaceRange: {\n      // see if diff could be a splice of the old selection range\n      var oldPrefix = oldText.slice(0, oldRange.index);\n      var oldSuffix = oldText.slice(oldRange.index + oldRange.length);\n      var prefixLength = oldPrefix.length;\n      var suffixLength = oldSuffix.length;\n      if (newLength < prefixLength + suffixLength) {\n        break replaceRange;\n      }\n      var newPrefix = newText.slice(0, prefixLength);\n      var newSuffix = newText.slice(newLength - suffixLength);\n      if (oldPrefix !== newPrefix || oldSuffix !== newSuffix) {\n        break replaceRange;\n      }\n      var oldMiddle = oldText.slice(prefixLength, oldLength - suffixLength);\n      var newMiddle = newText.slice(prefixLength, newLength - suffixLength);\n      return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldSuffix);\n    }\n  }\n\n  return null;\n}\n\nfunction diff(text1, text2, cursor_pos, cleanup) {\n  // only pass fix_unicode=true at the top level, not when diff_main is\n  // recursively invoked\n  return diff_main(text1, text2, cursor_pos, cleanup, true);\n}\n\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\nmodule.exports = diff;\n","/*\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nexport * from \"./vivliostyle/constants\";\nexport * from \"./vivliostyle/plugin\";\nexport * from \"./vivliostyle/profile\";\nexport * from \"./vivliostyle/core-viewer\";\nexport * from \"./vivliostyle/print\";\nexport * from \"./vivliostyle/assets\";\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Constants\n */\n\n/**\n * Debug flag.\n */\nexport let isDebug: boolean = false;\nexport function setDebug(value: boolean): void {\n  isDebug = value;\n}\n\n/**\n * Page progression direction.\n * @enum {string}\n */\nexport enum PageProgression {\n  LTR = \"ltr\",\n  RTL = \"rtl\",\n}\n\n/**\n * Return PageProgression corresponding to the specified string\n */\nexport function pageProgressionOf(str: string): PageProgression {\n  switch (str) {\n    case \"ltr\":\n      return PageProgression.LTR;\n    case \"rtl\":\n      return PageProgression.RTL;\n    default:\n      throw new Error(`unknown PageProgression: ${str}`);\n  }\n}\n\n/**\n * Page side (left/right).\n * @enum {string}\n */\nexport enum PageSide {\n  LEFT = \"left\",\n  RIGHT = \"right\",\n}\n\n/**\n * Viewer ready state.\n * @enum {string}\n */\nexport enum ReadyState {\n  LOADING = \"loading\",\n  INTERACTIVE = \"interactive\",\n  COMPLETE = \"complete\",\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Logging - Logging utility\n */\n\n/**\n * Log level.\n * @enum {number}\n */\nexport enum LogLevel {\n  DEBUG = 1,\n  INFO,\n  WARN,\n  ERROR,\n}\n\nexport type ErrorInfo = {\n  error: Error;\n  messages: any[];\n};\n\n/**\n * Class logging error, warning, information or debug messages.\n */\nexport class Logger {\n  private listeners: { [key in LogLevel]?: (p1: ErrorInfo) => void } = {};\n\n  constructor(private opt_console?: Console) {}\n\n  private consoleDebug(msg: any[]) {\n    if (this.opt_console) {\n      if (this.opt_console.debug) {\n        this.opt_console.debug(...msg);\n      } else {\n        this.opt_console.log(...msg);\n      }\n    } else {\n      console.debug(...msg); // eslint-disable-line no-console\n    }\n  }\n\n  private consoleInfo(msg: any[]) {\n    if (this.opt_console) {\n      if (this.opt_console.info) {\n        this.opt_console.info(...msg);\n      } else {\n        this.opt_console.log(...msg);\n      }\n    } else {\n      console.info(...msg); // eslint-disable-line no-console\n    }\n  }\n\n  private consoleWarn(msg: any[]) {\n    if (this.opt_console) {\n      if (this.opt_console.warn) {\n        this.opt_console.warn(...msg);\n      } else {\n        this.opt_console.log(...msg);\n      }\n    } else {\n      console.warn(...msg); // eslint-disable-line no-console\n    }\n  }\n\n  private consoleError(msg: any[]) {\n    if (this.opt_console) {\n      if (this.opt_console.error) {\n        this.opt_console.error(...msg);\n      } else {\n        this.opt_console.log(...msg);\n      }\n    } else {\n      console.error(...msg); // eslint-disable-line no-console\n    }\n  }\n\n  private triggerListeners(level: LogLevel, args: ErrorInfo) {\n    const listener = this.listeners[level];\n    if (listener) {\n      listener(args);\n    }\n  }\n\n  /**\n   * Add a listener function invoked when a log event with the specified level\n   * occurs.\n   */\n  addListener(level: LogLevel, listener: (p1: ErrorInfo) => void) {\n    this.listeners[level] = listener;\n  }\n\n  debug(...var_args: any[]) {\n    const args = argumentsToErrorInfo(arguments);\n    this.consoleDebug(buildMessageAndStackTrace(args));\n    this.triggerListeners(LogLevel.DEBUG, args);\n  }\n\n  info(...var_args: any[]) {\n    const args = argumentsToErrorInfo(arguments);\n    this.consoleInfo(buildMessageAndStackTrace(args));\n    this.triggerListeners(LogLevel.INFO, args);\n  }\n\n  warn(...var_args: any[]) {\n    const args = argumentsToErrorInfo(arguments);\n    this.consoleWarn(buildMessageAndStackTrace(args));\n    this.triggerListeners(LogLevel.WARN, args);\n  }\n\n  error(...var_args: any[]) {\n    const args = argumentsToErrorInfo(arguments);\n    this.consoleError(buildMessageAndStackTrace(args));\n    this.triggerListeners(LogLevel.ERROR, args);\n  }\n}\n\n/**\n * @param args\n */\nfunction argumentsToErrorInfo(args: IArguments): ErrorInfo {\n  const a = Array.from(args);\n  let e: Error = null;\n  if (a[0] instanceof Error) {\n    e = a.shift();\n  }\n  return { error: e, messages: a };\n}\n\nfunction buildMessageAndStackTrace(args: ErrorInfo): string[] {\n  const e = args.error;\n  const stack = e && (e[\"frameTrace\"] || e[\"stack\"]);\n  let messages = [].concat(args[\"messages\"]);\n  if (e) {\n    if (messages.length > 0) {\n      messages = messages.concat([\"\\n\"]);\n    }\n    messages = messages.concat([e[\"toString\"]()]);\n    if (stack) {\n      messages = messages.concat([\"\\n\"]).concat(stack);\n    }\n  }\n  return messages;\n}\n\nexport const logger = new Logger();\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Plugin - Plugin mechanism\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as Logging from \"./logging\";\nimport * as Task from \"./task\";\nimport { Layout, Vtree } from \"./types\";\n\n/**\n * Type of implemented hooks.\n * @enum {string}\n */\nexport enum HOOKS {\n  /**\n   * Called when a single property declaration is parsed.\n   *\n   * The hook is called with an object with the following properties:\n   *   {string} name: Property name\n   *   {!Css.Val} value: Property value\n   *   {boolean} important: Whether '!important' flag is present or not\n   * Functions called by this hook are expected to return a value with the same\n   * type as the above. The declaration is then replaced by the returned value.\n   *\n   * Note that a shorthand declaration is not directly passed to this hook.\n   * After the shorthand declaration is interpreted and broken into\n   * non-shorthand declarations, the hook is called for each of the\n   * non-shorthand declarations.\n   */\n  SIMPLE_PROPERTY = \"SIMPLE_PROPERTY\",\n\n  /**\n   * Called when a single document (i.e. a single spine item) has been fetched,\n   * before parsing.\n   *\n   * The hook is called with the Document object.\n   */\n  PREPROCESS_SINGLE_DOCUMENT = \"PREPROCESS_SINGLE_DOCUMENT\",\n\n  /**\n   * Called before creating a text node for modifying a text content.\n   *\n   * The hook is called with an object with the following properties:\n   *   {Vtree.NodeContext} nodeContext\n   *   {string} sourceTextContent\n   *\n   * Functions called by this hook are expected to return a\n   * Task.Result.<string>. The text content is then replaced by the\n   * returned value.\n   */\n  PREPROCESS_TEXT_CONTENT = \"PREPROCESS_TEXT_CONTENT\",\n\n  /**\n   * Called before creating a element for modifying a element style.\n   *\n   * The hook is called with an object with the following properties:\n   *   {Vtree.NodeContext} nodeContext\n   *   {!Object} style\n   */\n  PREPROCESS_ELEMENT_STYLE = \"PREPROCESS_ELEMENT_STYLE\",\n\n  /**\n   * Called before geting CssCascade.polyfilledInheritedProps.\n   *\n   * The hook return a array of polyfilled inherited property name.\n   */\n  POLYFILLED_INHERITED_PROPS = \"POLYFILLED_INHERITED_PROPS\",\n\n  /**\n   * Called when a Viewer is configured.\n   *\n   * The hook is called with an object with the following properties:\n   *  {Base.JSON} command\n   */\n  CONFIGURATION = \"CONFIGURATION\",\n\n  /**\n   * Called when resolving a text node breaker\n   * which detects an acceptable breakpoint and break text node at this point.\n   *\n   * The hook is called with an object with the following properties:\n   *  {Vtree.NodeContext} nodeContext\n   *\n   * Functions called by this hook are expected to\n   * return an instnce of {Layout.TextNodeBreaker} or null.\n   */\n  RESOLVE_TEXT_NODE_BREAKER = \"RESOLVE_TEXT_NODE_BREAKER\",\n\n  /**\n   * Called when resolving a formatting context.\n   *\n   * The hook is called with the following parameters:\n   *   nodeContext: a NodeContext object\n   *   firstTime: a boolean flag representing whether this node is encountered\n   * for the first time or not display: an Css.Ident value representing\n   * 'display' value of the node position: an Css.Ident value representing\n   * 'position' value of the node float: an Css.Ident value representing\n   * 'float' value of the node isRoot: a boolean flag representing whether this\n   * node is a root (of a flow) or not Functions called by this hook are\n   * expected to return a formatting context for the NodeContext.\n   */\n  RESOLVE_FORMATTING_CONTEXT = \"RESOLVE_FORMATTING_CONTEXT\",\n\n  /**\n   * Called when resolving a layout processor (LayoutProcessor) for\n   * a formatting context.\n   *\n   * The hook is called with a formatting context\n   * (Vtree.FormattingContext). Functions called by this hook are expected\n   * to return a layout processor corresponding to the formatting context.\n   */\n  RESOLVE_LAYOUT_PROCESSOR = \"RESOLVE_LAYOUT_PROCESSOR\",\n\n  /**\n   * Called after laid out a block contents.\n   *\n   * The hook is called with an object with the following properties:\n   *  {Vtree.NodeContext} nodeContext\n   *  {Array.<Vtree.NodeContext>} checkPoints\n   *  {Layout.Column} column\n   */\n  POST_LAYOUT_BLOCK = \"POST_LAYOUT_BLOCK\",\n}\n\nexport type PreProcessSingleDocumentHook = (p1: Document) => any;\n\nexport type PreProcessTextContentHook = (\n  p1: Vtree.NodeContext,\n  p2: string,\n) => Task.Result<string>;\n\nexport type PreProcessElementStyleHook = (\n  p1: Vtree.NodeContext,\n  p2: object,\n) => void;\n\nexport type PolyfilledInheritedPropsHook = () => string[];\n\nexport type ConfigurationHook = (p1: Base.JSON) => {\n  needResize: boolean | null | undefined;\n  needRefresh: boolean | null | undefined;\n};\n\nexport type ResolveTextNodeBreakerHook = (\n  p1: Vtree.NodeContext,\n) => Layout.TextNodeBreaker;\n\nexport type ResolveFormattingContextHook = (\n  p1: Vtree.NodeContext,\n  p2: boolean,\n  p3: Css.Val,\n  p4: Css.Ident,\n  p5: Css.Val,\n  p6: boolean,\n) => Vtree.FormattingContext;\n\nexport type ResolveLayoutProcessorHook = (\n  p1: Vtree.FormattingContext,\n) => LayoutProcessor.LayoutProcessor;\n\nexport type PostLayoutBlockHook = (\n  p1: Vtree.NodeContext,\n  p2: Vtree.NodeContext[],\n  p3: Layout.Column,\n) => void;\n\nconst hooks = {};\n\n/**\n * Register a function to a hook with the specified name.\n * The registered function is called at appropriate timings by the core code.\n * Arguments passed to the function depend on the hook.\n * When multiple functions are registered, they are called by the order in which\n * they are registered.\n * @param name Name of the hook.\n * @param fn Function to be registered to the hook.\n * @param atFirst If true, the function is registered at the first of the hook array.\n */\nexport function registerHook(\n  name: string,\n  fn: (...p1) => any,\n  atFirst?: boolean,\n): void {\n  if (!HOOKS[name]) {\n    Logging.logger.warn(new Error(`Skipping unknown plugin hook '${name}'.`));\n  } else {\n    let hooksForName = hooks[name];\n    if (!hooksForName) {\n      hooksForName = hooks[name] = [];\n    }\n    if (atFirst) {\n      hooksForName.unshift(fn);\n    } else {\n      hooksForName.push(fn);\n    }\n  }\n}\n\n/**\n * Remove a function already registered to the specified name.\n * Note that even if the same function are registered multiple times, this\n * method removes only the first one.\n * @param name Name of the hook.\n * @param fn Function to be removed from the hook.\n */\nexport function removeHook(name: string, fn: (...p1) => any): void {\n  if (!HOOKS[name]) {\n    Logging.logger.warn(new Error(`Ignoring unknown plugin hook '${name}'.`));\n  } else {\n    const hooksForName = hooks[name];\n    if (hooksForName) {\n      const index = hooksForName.indexOf(fn);\n      if (index >= 0) {\n        hooksForName.splice(index, 1);\n      }\n    }\n  }\n}\n\n/**\n * Get all hooks registered to the specified name.\n * This method is for internal use (from the core code).\n */\nexport function getHooksForName(name: string): ((...p1) => any)[] {\n  const hooksForName = hooks[name];\n  return hooksForName || [];\n}\n\n/**\n * Pubilc members of the bundled library.\n */\nexport const plugin = {\n  registerHook,\n  removeHook,\n};\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Profile - Utility for profiling\n */\nimport * as Logging from \"./logging\";\n\n/**\n * Performance profiler measuring execution time of the script.\n */\nexport class Profiler {\n  timestamps: { [key: string]: { [key: string]: number } } = {};\n  private registerTiming: (p1: string, p2: string, p3?: number) => any;\n  registerStartTiming: (name: string, timestamp?: number) => any;\n  registerEndTiming: (name: string, timestamp?: number) => any;\n\n  constructor(public readonly performanceInstance: Performance) {\n    this.registerTiming = noop;\n\n    // hack to export (non-prototype) methods\n    this[\"registerStartTiming\"] = this.registerStartTiming = noop;\n    this[\"registerEndTiming\"] = this.registerEndTiming = noop;\n  }\n\n  /**\n   * Registers start timing of some event, even if profile is disabled.\n   * @param name Name of event\n   * @param timestamp Used as the actual timestamp of the event if specified,\n   *     instead of \"now\"\n   */\n  forceRegisterStartTiming(name: string, timestamp?: number) {\n    registerTiming.call(this, name, \"start\", timestamp);\n  }\n\n  /**\n   * Registers end timing of some event, even if profile is disabled.\n   * @param name Name of event\n   * @param timestamp Used as the actual timestamp of the event if specified,\n   *     instead of \"now\"\n   */\n  forceRegisterEndTiming(name: string, timestamp?: number) {\n    registerTiming.call(this, name, \"end\", timestamp);\n  }\n\n  /**\n   * Log registered timings (start/end/duration).\n   * All values are printed in ms unit.\n   */\n  printTimings() {\n    const timestamps = this.timestamps;\n    let st = \"\";\n    Object.keys(timestamps).forEach((name) => {\n      const stamps = timestamps[name];\n      const l = stamps.length;\n      for (let i = 0; i < l; i++) {\n        const t = stamps[i];\n        st += name;\n        if (l > 1) {\n          st += `(${i})`;\n        }\n        st += ` => start: ${t[\"start\"]}, end: ${t[\"end\"]}, duration: ${\n          t[\"end\"] - t[\"start\"]\n        }\\n`;\n      }\n    });\n    Logging.logger.info(st);\n  }\n\n  /**\n   * Disable profiling.\n   */\n  disable() {\n    this.registerTiming = noop;\n\n    // hack to export (non-prototype) methods\n    this[\"registerStartTiming\"] = this.registerStartTiming = noop;\n    this[\"registerEndTiming\"] = this.registerEndTiming = noop;\n  }\n\n  /**\n   * Enable profiling.\n   */\n  enable() {\n    this.registerTiming = registerTiming;\n\n    // hack to export (non-prototype) methods\n    this[\"registerStartTiming\"] = this.registerStartTiming =\n      registerStartTiming;\n    this[\"registerEndTiming\"] = this.registerEndTiming = registerEndTiming;\n  }\n\n  /**\n   * Returns if profiling is enabled or not.\n   */\n  isEnabled(): boolean {\n    return this.registerStartTiming === registerStartTiming;\n  }\n}\n\nfunction noop(): void {}\n\n/**\n * Registers start/end timing of some event.\n * @this {Profile.Profiler}\n * @param name Name of event\n * @param startEnd Either of \"start\" or \"end\"\n * @param timestamp Used as the actual timestamp of the event if specified,\n *     instead of \"now\"\n */\nfunction registerTiming(\n  name: string,\n  startEnd: string,\n  timestamp?: number,\n): void {\n  if (!timestamp) {\n    timestamp = this.performanceInstance.now();\n  }\n  let timestamps = this.timestamps[name];\n  if (!timestamps) {\n    timestamps = this.timestamps[name] = [];\n  }\n  let t;\n  const l = timestamps.length;\n  for (let i = l - 1; i >= 0; i--) {\n    t = timestamps[i];\n    if (t && !t[startEnd]) {\n      break;\n    }\n    t = null;\n  }\n  if (!t) {\n    t = {};\n    timestamps.push(t);\n  }\n  t[startEnd] = timestamp;\n}\n\n/**\n * Registers start timing of some event.\n * @this {Profile.Profiler}\n * @param name Name of event\n * @param timestamp Used as the actual timestamp of the event if specified,\n *     instead of \"now\"\n */\nfunction registerStartTiming(name: string, timestamp?: number): void {\n  this.registerTiming(name, \"start\", timestamp);\n}\n\n/**\n * Registers end timing of some event.\n * @this {Profile.Profiler}\n * @param name Name of event\n * @param timestamp Used as the actual timestamp of the event if specified,\n *     instead of \"now\"\n */\nfunction registerEndTiming(name: string, timestamp?: number): void {\n  this.registerTiming(name, \"end\", timestamp);\n}\nconst fallbackPerformanceInstance = { now: Date.now } as Performance;\nconst performanceInstance = window && window.performance;\nexport const profiler = new Profiler(\n  performanceInstance || fallbackPerformanceInstance,\n);\nprofiler.forceRegisterStartTiming(\"load_vivliostyle\");\n\n/**\n * Pubilc members of the bundled library.\n */\nexport const profile = {\n  profiler: {\n    registerStartTiming: profiler.registerStartTiming,\n    registerEndTiming: profiler.registerEndTiming,\n    printTimings: profiler.printTimings,\n    disable: profiler.disable,\n    enable: profiler.enable,\n  },\n};\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Base - Common utilities.\n */\nimport * as Logging from \"./logging\";\nimport * as Asserts from \"./asserts\";\n\n/**\n * Browser type detection\n */\nexport const browserType: \"chromium\" | \"firefox\" | \"webkit\" | \"unknown\" =\n  navigator.userAgent.includes(\"Chrome\")\n    ? \"chromium\"\n    : navigator.userAgent.includes(\"Firefox\")\n      ? \"firefox\"\n      : navigator.userAgent.includes(\"AppleWebKit\")\n        ? \"webkit\"\n        : \"unknown\";\n\n/**\n * RegExp pattern for ::first-letter pseudo element:\n * https://drafts.csswg.org/css-pseudo-4/#first-letter-pseudo\n */\nexport const firstLetterPattern =\n  /^[\\s\\p{Zs}\\p{P}\\p{Mn}]*[\\p{L}\\p{N}]\\p{Mn}*(?:[\\s\\p{Zs}]*\\p{P}\\p{Mn}*)*/u;\n/**\n * Indicates the offset position of an element in a document\n */\nexport const ELEMENT_OFFSET_ATTR = \"data-adapt-eloff\";\n\nexport let emptyObj = {};\n\nexport type JSON = any;\n\nexport function jsonToString(json: JSON): string {\n  return JSON.stringify(json);\n}\n\nexport function stringToJSON(str: string): JSON {\n  return JSON.parse(str);\n}\n\nexport function stripFragment(url: string): string {\n  const r = url.match(/^([^#]*)/);\n  if (r) {\n    return r[1];\n  }\n  return url;\n}\n\nexport function stripFragmentAndQuery(url: string): string {\n  const r = url.match(/^([^#?]*)/);\n  if (r) {\n    return r[1];\n  }\n  return url;\n}\n\n/**\n * Base URL relative to which URLs of resources are resolved.\n */\nexport let baseURL = window.location.href;\nexport function setBaseURL(value: string): void {\n  baseURL = value;\n}\n\n/**\n * Base URL relative to which URLs of resources such as validation.txt and\n * user-agent.css are resolved.\n */\nexport let resourceBaseURL = window.location.href;\nexport function setResourceBaseURL(value: string): void {\n  resourceBaseURL = value;\n}\n\n/**\n * @param relURL relative URL\n * @param baseURL base (absolute) URL\n * @return resolved (absolute) URL\n */\nexport function resolveURL(relURL: string, baseURL: string): string {\n  if (/^data:/i.test(baseURL)) {\n    return relURL || baseURL;\n  }\n  if (!baseURL || relURL.match(/^\\w{2,}:/)) {\n    if (relURL.toLowerCase().match(\"^javascript:\")) {\n      return \"#\";\n    }\n    if (relURL.match(/^\\w{2,}:\\/\\/[^\\/]+$/)) {\n      relURL = `${relURL}/`;\n    }\n    return relURL;\n  }\n  if (baseURL.match(/^\\w{2,}:\\/\\/[^\\/]+$/)) {\n    baseURL = `${baseURL}/`;\n  }\n  let r: string[];\n  if (relURL.match(/^\\/\\//)) {\n    r = baseURL.match(/^(\\w{2,}:)\\/\\//);\n    if (r) {\n      return r[1] + relURL;\n    }\n    return relURL;\n  }\n  if (relURL.match(/^\\//)) {\n    r = baseURL.match(/^(\\w{2,}:\\/\\/[^\\/]+)\\//);\n    if (r) {\n      return r[1] + relURL;\n    }\n    return relURL;\n  }\n  if (relURL.match(/^\\.(\\/|$)/)) {\n    relURL = relURL.substr(2); // './foo' => 'foo'\n  }\n  baseURL = stripFragmentAndQuery(baseURL);\n  if (relURL.match(/^#/)) {\n    return baseURL + relURL;\n  }\n  let i = baseURL.lastIndexOf(\"/\");\n  if (i < 0) {\n    return relURL;\n  }\n  let url = baseURL.substr(0, i + 1) + relURL;\n  let urlOption = \"\";\n  r = url.match(/^([^?#]*)([?#].*)$/);\n  if (r) {\n    url = r[1];\n    urlOption = r[2];\n  }\n\n  while (true) {\n    i = url.indexOf(\"/../\");\n    if (i <= 0) {\n      break;\n    }\n    const j = url.lastIndexOf(\"/\", i - 1);\n    if (j <= 0) {\n      break;\n    }\n    url = url.substr(0, j) + url.substr(i + 3);\n  }\n  return url.replace(/\\/(\\.\\/)+/g, \"/\") + urlOption;\n}\n\n/**\n * Convert special URLs (e.g. GitHub, Gist) to their raw equivalents.\n * This is useful for fetching content from these services in a format\n * that can be easily processed by Vivliostyle.js.\n *\n * @param url URL to convert\n * @return converted URL\n */\nexport function convertSpecialURL(url: string): string {\n  let r: RegExpMatchArray;\n  if (\n    (r =\n      /^(https?:)\\/\\/github\\.com\\/([^/]+\\/[^/]+)\\/(blob\\/|tree\\/|raw\\/)?(.*)$/.exec(\n        url,\n      ))\n  ) {\n    // Convert GitHub URL to GitHub raw URL\n    url = `${r[1]}//raw.githubusercontent.com/${r[2]}/${r[3] ? \"\" : \"master/\"}${\n      r[4]\n    }`;\n  } else if (\n    (r =\n      /^(https?:)\\/\\/www\\.aozora\\.gr\\.jp\\/(cards\\/[^/]+\\/files\\/[^/.]+\\.html)$/.exec(\n        url,\n      ))\n  ) {\n    // Convert Aozorabunko (X)HTML URL to GitHub raw URL\n    url = `${r[1]}//raw.githubusercontent.com/aozorabunko/aozorabunko/master/${r[2]}`;\n  } else if (\n    (r =\n      /^(https?:)\\/\\/gist\\.github\\.com\\/([^/]+\\/\\w+)(\\/|$)(raw(\\/|$))?(.*)$/.exec(\n        url,\n      ))\n  ) {\n    // Convert Gist URL to Gist raw URL\n    url = `${r[1]}//gist.githubusercontent.com/${r[2]}/raw/${r[6]}`;\n  } else if (\n    (r =\n      /^(https?:)\\/\\/gist\\.github\\.com\\/([^/]+\\/\\w+)(?:#|%23)file-(.*)-(\\w+)$/.exec(\n        url,\n      ))\n  ) {\n    // Convert Gist URL with fragment to Gist raw URL\n    url = `${r[1]}//gist.githubusercontent.com/${r[2]}/raw/${r[3]}.${r[4]}`;\n  } else if (\n    (r =\n      /^(https?:)\\/\\/(?:[^/.]+\\.)?jsbin\\.com\\/(?!(?:blog|help)\\b)(\\w+)((\\/\\d+)?).*$/.exec(\n        url,\n      ))\n  ) {\n    // Convert JS Bin URL to JS Bin output URL\n    url = `${r[1]}//output.jsbin.com/${r[2]}${r[3]}/`;\n  }\n  return url;\n}\n\nexport interface DocumentURLTransformer {\n  transformFragment(fragment: string, baseURL: string): string;\n\n  transformURL(url: string, baseURL: string): string;\n\n  restoreURL(encoded: string): string[];\n}\n\n/**\n * Various namespaces.\n * @enum {string}\n */\nexport enum NS {\n  epub = \"http://www.idpf.org/2007/ops\",\n  EV = \"http://www.w3.org/2001/xml-events\",\n  MATHML = \"http://www.w3.org/1998/Math/MathML\",\n  XML = \"http://www.w3.org/XML/1998/namespace\",\n  XHTML = \"http://www.w3.org/1999/xhtml\",\n  XLINK = \"http://www.w3.org/1999/xlink\",\n  SHADOW = \"http://www.pyroxy.com/ns/shadow\",\n  SVG = \"http://www.w3.org/2000/svg\",\n  DC = \"http://purl.org/dc/elements/1.1/\",\n}\n\n/**\n * @param name parameter name\n * @param opt_url URL; window.location.href is used if not provided\n * @return parameter value\n */\nexport function getURLParam(name: string, opt_url?: string): string | null {\n  const rg = new RegExp(`#(.*&)?${escapeRegExp(name)}=([^#&]*)`);\n  const url = opt_url || window.location.href;\n  const r = url.match(rg);\n  if (r) {\n    return r[2];\n  }\n  return null;\n}\n\n/**\n * @param name parameter name\n * @param value parameter value\n * @return new url\n */\nexport function setURLParam(url: string, name: string, value: string): string {\n  const rg = new RegExp(`#(.*&)?${escapeRegExp(name)}=([^#&]*)`);\n  const r = url.match(rg);\n  if (r) {\n    const length = r[2].length;\n    const index = r.index + r[0].length - length;\n    return url.substr(0, index) + value + url.substr(index + length);\n  }\n  if (!url.match(/#/)) {\n    return `${url}#${name}=${value}`;\n  } else {\n    return `${url}&${name}=${value}`;\n  }\n}\n\nexport function asString(v: any): string | null {\n  if (v == null) {\n    return v;\n  }\n  return v.toString();\n}\n\nexport interface Comparable {\n  /**\n   * @return -1 when this less then other, 0 when this equals other\n   */\n  compare(other: Comparable): number;\n}\n\n/**\n * A priority queue.\n */\nexport class PriorityQueue {\n  queue: Comparable[] = [null];\n\n  length(): number {\n    return this.queue.length - 1;\n  }\n\n  add(item: Comparable): void {\n    let index = this.queue.length;\n    while (index > 1) {\n      const parentIndex = Math.floor(index / 2);\n      const parent = this.queue[parentIndex];\n      if (parent.compare(item) > 0) {\n        this.queue[index] = item;\n        return;\n      }\n      this.queue[index] = parent;\n      index = parentIndex;\n    }\n    this.queue[1] = item;\n  }\n\n  /**\n   * @return highest priority Comparable.\n   */\n  peek(): Comparable {\n    return this.queue[1];\n  }\n\n  /**\n   * Remove the highest-priority item from the queue.\n   * @return removed item.\n   */\n  remove(): Comparable {\n    const result = this.queue[1] as Comparable;\n    const curr = this.queue.pop() as Comparable;\n    const size = this.queue.length;\n    if (size > 1) {\n      let index = 1;\n      while (true) {\n        let childIndex = index * 2;\n        if (childIndex >= size) {\n          break;\n        }\n        if (this.queue[childIndex].compare(curr) > 0) {\n          if (\n            childIndex + 1 < size &&\n            this.queue[childIndex + 1].compare(\n              this.queue[childIndex] as Comparable,\n            ) > 0\n          ) {\n            childIndex++;\n          }\n        } else if (\n          childIndex + 1 < size &&\n          this.queue[childIndex + 1].compare(curr) > 0\n        ) {\n          childIndex++;\n        } else {\n          break;\n        }\n        this.queue[index] = this.queue[childIndex];\n        index = childIndex;\n      }\n      this.queue[index] = curr;\n    }\n    return result;\n  }\n}\n\nexport const knownPrefixes = [\"\", \"-webkit-\", \"-moz-\"];\n\nexport const propNameMap: { [key: string]: string[] } = {};\n\nexport function checkIfPropertySupported(\n  prefix: string,\n  prop: string,\n): boolean {\n  return CSS.supports(prefix + prop, \"unset\");\n}\n\nexport function getPrefixedPropertyNames(prop: string): string[] | null {\n  let prefixed = propNameMap[prop];\n  if (prefixed || prefixed === null) {\n    // null means the browser does not support the property\n    return prefixed;\n  }\n  switch (prop) {\n    case \"behavior\":\n    case \"template\":\n    case \"ua-list-item-count\":\n    case \"x-first-pseudo\":\n      propNameMap[prop] = null;\n      return null;\n    case \"text-combine-upright\":\n      // Special case for Safari\n      if (\n        checkIfPropertySupported(\"-webkit-\", \"text-combine\") &&\n        !checkIfPropertySupported(\"\", \"text-combine-upright\")\n      ) {\n        propNameMap[prop] = [\"-webkit-text-combine\"];\n        return [\"-webkit-text-combine\"];\n      }\n      break;\n  }\n  for (const prefix of knownPrefixes) {\n    if (checkIfPropertySupported(prefix, prop)) {\n      prefixed = [prefix + prop];\n      propNameMap[prop] = prefixed;\n      return prefixed;\n    }\n  }\n\n  // Not supported by the browser\n  Logging.logger.warn(\"Property not supported by the browser: \", prop);\n  propNameMap[prop] = null;\n  return null;\n}\n\nexport function setCSSProperty(\n  elem: Element,\n  prop: string,\n  value: string,\n): void {\n  const elemStyle = (elem as HTMLElement)?.style;\n  if (!elemStyle) {\n    return;\n  }\n  if (prop.startsWith(\"--\")) {\n    elemStyle.setProperty(prop, value || \" \");\n    return;\n  }\n  const prefixedPropertyNames = getPrefixedPropertyNames(prop);\n  if (!prefixedPropertyNames) {\n    return;\n  }\n  for (const prefixed of prefixedPropertyNames) {\n    switch (prefixed) {\n      case \"-webkit-text-combine\": // for Safari\n        switch (value) {\n          case \"all\":\n            value = \"horizontal\";\n            break;\n        }\n        break;\n      case \"text-combine-upright\":\n        switch (value) {\n          case \"all\":\n            // workaround for Chrome 93 bug https://crbug.com/1242755\n            elemStyle.setProperty(\"text-indent\", \"0\");\n            break;\n        }\n        break;\n    }\n    elemStyle.setProperty(prefixed, value);\n  }\n}\n\nexport function getCSSProperty(\n  elem: Element,\n  prop: string,\n  opt_value?: string,\n): string {\n  try {\n    const propertyNames = propNameMap[prop];\n    return (elem as HTMLElement).style.getPropertyValue(\n      propertyNames ? propertyNames[0] : prop,\n    );\n  } catch (err) {}\n  return opt_value || \"\";\n}\n\nexport function getLangAttribute(element: Element): string {\n  let lang = element.getAttributeNS(NS.XML, \"lang\");\n  if (!lang && element.namespaceURI == NS.XHTML) {\n    lang = element.getAttribute(\"lang\");\n  }\n  return lang;\n}\n\nexport class StringBuffer {\n  list: string[] = [];\n\n  append(str: string): StringBuffer {\n    this.list.push(str);\n    return this;\n  }\n\n  clear(): void {\n    this.list = [];\n  }\n\n  /** @override */\n  toString(): string {\n    const str = this.list.join(\"\");\n    this.list = [str];\n    return str;\n  }\n}\n\nexport function escapeChar(str: string): string {\n  // not called for surrogate pairs, no need to worry about them\n  return `\\\\${str.charCodeAt(0).toString(16)} `;\n}\n\nexport function escapeCSSIdent(name: string): string {\n  return name.replace(/[^-_a-zA-Z0-9\\u0080-\\uFFFF]/g, escapeChar);\n}\n\nexport function escapeCSSStr(str: string): string {\n  return str.replace(/[\\u0000-\\u001F\"\\\\]/g, escapeChar);\n}\n\nexport function lightURLEncode(str: string): string {\n  return str.replace(/[\\s+&?=#\\u007F-\\uFFFF]+/g, encodeURIComponent);\n}\n\nexport function isLetter(ch: string): boolean {\n  return !!ch.match(\n    /^[a-zA-Z\\u009E\\u009F\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u024F\\u037B-\\u037D\\u0386\\u0388-\\u0482\\u048A-\\u0527]$/,\n  );\n}\n\nexport function escapeCharToHex(str: string, prefix?: string): string {\n  prefix = typeof prefix === \"string\" ? prefix : \"\\\\u\";\n  return prefix + (65536 | str.charCodeAt(0)).toString(16).substr(1);\n}\n\nexport function escapeNameStrToHex(str: string, prefix?: string): string {\n  function escapeChar(s) {\n    return escapeCharToHex(s, prefix);\n  }\n  return str.replace(/[^-a-zA-Z0-9_]/g, escapeChar);\n}\n\nexport function escapeRegExp(str: string): string {\n  return escapeNameStrToHex(str);\n}\n\nexport function unescapeCharFromHex(str: string, prefix?: string): string {\n  prefix = typeof prefix === \"string\" ? prefix : \"\\\\u\";\n  if (str.indexOf(prefix) === 0) {\n    return String.fromCharCode(parseInt(str.substring(prefix.length), 16));\n  } else {\n    return str;\n  }\n}\n\nexport function unescapeStrFromHex(str: string, prefix?: string): string {\n  prefix = typeof prefix === \"string\" ? prefix : \"\\\\u\";\n\n  function unescapeChar(s) {\n    return unescapeCharFromHex(s, prefix);\n  }\n  const regexp = new RegExp(`${escapeRegExp(prefix)}[0-9a-fA-F]{4}`, \"g\");\n  return str.replace(regexp, unescapeChar);\n}\n\n/**\n * Function good is defined for ints from 0 to high-1. It is such that for\n * each i between 1 and high-1 !good(i-1) || good(i) is true. In other words,\n * it goes like false ... false true ... true.\n * Find i such that (i == 0 || !good(i-1)) && (i == h || good(i))\n * In other words, good(i) is the \"first\" good = true.\n */\nexport function binarySearch(\n  high: number,\n  good: (p1: number) => boolean,\n): number {\n  let l = 0;\n  let h = high;\n  while (true) {\n    Asserts.assert(l <= h);\n    Asserts.assert(l == 0 || !good(l - 1));\n    Asserts.assert(h == high || good(h));\n    if (l == h) {\n      return l;\n    }\n    const m = (l + h) >> 1;\n    if (good(m)) {\n      h = m;\n    } else {\n      l = m + 1;\n    }\n  }\n}\n\n/**\n * Function to sort numbers low to high\n */\nexport function numberCompare(a: number, b: number): number {\n  return a - b;\n}\n\n/**\n * Index array using key function. First encountered item wins on collision.\n * Elements with empty and null keys are dropped.\n */\nexport function indexArray<T>(\n  arr: T[],\n  key: (p1: T) => string | null,\n): { [key: string]: T } {\n  const map: { [key: string]: T } = {};\n  for (const v of arr) {\n    const k: string | null = key(v);\n    if (k && !map[k]) {\n      map[k] = v;\n    }\n  }\n  return map;\n}\n\n/**\n * Convert array of strings to an object with the values in the array set to\n * true.\n */\nexport function arrayToSet(arr: string[]): { [key: string]: boolean } {\n  const set: { [key: string]: boolean } = {};\n  for (let i = 0; i < arr.length; i++) {\n    set[arr[i]] = true;\n  }\n  return set;\n}\n\n/**\n * Index array using key function. Repeated indices are all combined into\n * arrays. Elements with empty and null keys are dropped. Ordering of the\n * elements in arrays is preserved.\n */\nexport function multiIndexArray<T>(\n  arr: T[],\n  key: (p1: T) => string | null,\n): { [key: string]: T[] } {\n  const map: { [key: string]: T[] } = {};\n  for (const v of arr) {\n    const k = key(v);\n    if (k) {\n      if (map[k]) {\n        map[k].push(v);\n      } else {\n        map[k] = [v];\n      }\n    }\n  }\n  return map;\n}\n\n/**\n * Apply function to each value of the object\n * @param fn second parameter is the key\n */\nexport function mapObj<P, R>(\n  obj: { [key: string]: P },\n  fn: (p1: P, p2: string) => R,\n): { [key: string]: R } {\n  const res: { [key: string]: R } = {};\n  for (const n in obj) {\n    res[n] = fn(obj[n], n);\n  }\n  return res;\n}\n\nexport function mapSize(obj: object): number {\n  let n = 0;\n  for (const key in obj) {\n    n++;\n  }\n  return n;\n}\n\nexport type Event = {\n  type: string;\n  target?;\n  currentTarget?;\n  preventDefault?;\n  newPage?;\n  anchorElement?;\n  href?;\n  content?;\n};\n\nexport type EventListener = (p1: Event) => void;\n\n/**\n * Extemely simple-minded EventTarget implementation. Consider using\n * goog.events.EventTarget if you are using Closure library.\n */\nexport class SimpleEventTarget {\n  listeners: { [key: string]: EventListener[] } = {};\n\n  dispatchEvent(evt: Event): void {\n    const list = this.listeners[evt.type];\n    if (list) {\n      evt.target = this;\n      evt.currentTarget = this;\n      for (let i = 0; i < list.length; i++) {\n        list[i](evt);\n      }\n    }\n  }\n\n  addEventListener(\n    type: string,\n    listener: EventListener,\n    capture?: boolean,\n  ): void {\n    if (capture) {\n      return;\n    }\n    const list = this.listeners[type];\n    if (list) {\n      if (!list.includes(listener)) {\n        list.push(listener);\n      }\n    } else {\n      this.listeners[type] = [listener];\n    }\n  }\n\n  removeEventListener(\n    type: string,\n    listener: EventListener,\n    capture?: boolean,\n  ): void {\n    if (capture) {\n      return;\n    }\n    const list = this.listeners[type];\n    if (list) {\n      const index = list.indexOf(listener);\n      if (index >= 0) {\n        list.splice(index, 1);\n      }\n    }\n  }\n}\nexport type EventTarget = SimpleEventTarget;\n\nexport const mediaTags = {\n  audio: true,\n  canvas: true,\n  embed: true,\n  iframe: true,\n  img: true,\n  math: true,\n  object: true,\n  picture: true,\n  svg: true,\n  video: true,\n};\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Cfi - Support for EPUB Canonical Fragment Identifiers.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\n\nexport type Position = {\n  node: Node;\n  offset: number;\n  after: boolean;\n  sideBias: string | null;\n  ref: Fragment;\n};\n\nexport function getId(node: Node): string | null {\n  if (node.nodeType == 1) {\n    const idtxt = (node as Element).getAttribute(\"id\");\n    if (idtxt) {\n      return idtxt;\n    }\n  }\n  return null;\n}\n\nexport function escapeChar(ch: string): string {\n  return `^${ch}`;\n}\n\nexport function escape(str: string): string {\n  return str.replace(/[\\[\\]\\(\\),=;^]/g, escapeChar);\n}\n\nexport function unescapeChar(str: string): string {\n  return str.substr(1);\n}\n\nexport function unescape(str: string): string {\n  if (!str) {\n    return str;\n  }\n  return str.replace(/\\^[\\[\\]\\(\\),=;^]/g, unescapeChar);\n}\n\nexport function parseExtVal(extstr: string): string | string[] {\n  const result = [];\n  do {\n    const r = extstr.match(/^(\\^,|[^,])*/);\n    const p = unescape(r[0]);\n    extstr = extstr.substr(r[0].length + 1);\n    if (!extstr && !result.length) {\n      return p;\n    }\n    result.push(p);\n  } while (extstr);\n  return result;\n}\n\nexport function parseExt(extstr: string): { [key: string]: string | string[] } {\n  const ext = {};\n  while (extstr) {\n    const r = extstr.match(/^;([^;=]+)=(([^;]|\\^;)*)/);\n    if (!r) {\n      return ext;\n    }\n    ext[r[1]] = parseExtVal(r[2]);\n    extstr = extstr.substr(r[0].length);\n  }\n  return ext;\n}\n\nexport interface Step {\n  appendTo(sb: Base.StringBuffer): void;\n\n  applyTo(pos: Position): boolean;\n}\n\nexport class RefStep implements Step {\n  appendTo(sb: Base.StringBuffer) {\n    sb.append(\"!\");\n  }\n\n  /** @override */\n  applyTo(pos: Position): boolean {\n    return false;\n  }\n}\n\nexport class ChildStep implements Step {\n  constructor(\n    public readonly index: number,\n    public readonly id: string | null,\n    public readonly sideBias: string | null,\n  ) {}\n\n  /** @override */\n  appendTo(sb: Base.StringBuffer): void {\n    sb.append(\"/\");\n    sb.append(this.index.toString());\n    if (this.id || this.sideBias) {\n      sb.append(\"[\");\n      if (this.id) {\n        sb.append(this.id);\n      }\n      if (this.sideBias) {\n        sb.append(\";s=\");\n        sb.append(this.sideBias);\n      }\n      sb.append(\"]\");\n    }\n  }\n\n  /** @override */\n  applyTo(pos: Position): boolean {\n    if (pos.node.nodeType != 1) {\n      throw new Error(\"E_CFI_NOT_ELEMENT\");\n    }\n    const elem = pos.node as Element;\n    const childElements = elem.children;\n    const childElementCount = childElements.length;\n    let child: Node;\n    const childIndex = Math.floor(this.index / 2) - 1;\n    if (childIndex < 0 || childElementCount == 0) {\n      child = elem.firstChild;\n      pos.node = child || elem;\n    } else {\n      child = childElements[Math.min(childIndex, childElementCount - 1)];\n      if (this.index & 1) {\n        const next = child.nextSibling;\n        if (!next || next.nodeType == 1) {\n          pos.after = true;\n        } else {\n          child = next;\n        }\n      }\n      pos.node = child;\n    }\n    if (this.id && (pos.after || this.id != getId(pos.node))) {\n      const movedNode = elem.ownerDocument.getElementById(this.id);\n      if (movedNode) {\n        pos.node = movedNode;\n      } else {\n        Logging.logger.warn(\"E_CFI_ID_MISMATCH:\", this.id);\n      }\n    }\n    pos.sideBias = this.sideBias;\n    return true;\n  }\n}\n\nexport class OffsetStep implements Step {\n  constructor(\n    public readonly offset: number,\n    public readonly textBefore: string | null,\n    public readonly textAfter: string | null,\n    public readonly sideBias: string | null,\n  ) {}\n\n  applyTo(pos: Position): boolean {\n    if (this.offset > 0 && !pos.after) {\n      let offset = this.offset;\n      let node = pos.node;\n      while (true) {\n        const nodeType = node.nodeType;\n        if (nodeType == 1) {\n          break;\n        }\n        const next = node.nextSibling;\n        if (3 <= nodeType && nodeType <= 5) {\n          const textLength = node.textContent.length;\n          if (offset <= textLength) {\n            break;\n          }\n          if (!next) {\n            offset = textLength;\n            break;\n          }\n          offset -= textLength;\n        }\n        if (!next) {\n          offset = 0;\n          break;\n        }\n        node = next;\n      }\n      pos.node = node;\n      pos.offset = offset;\n    }\n    pos.sideBias = this.sideBias;\n    return true;\n  }\n\n  /** @override */\n  appendTo(sb: Base.StringBuffer): void {\n    sb.append(\":\");\n    sb.append(this.offset.toString());\n    if (this.textBefore || this.textAfter || this.sideBias) {\n      sb.append(\"[\");\n      if (this.textBefore || this.textAfter) {\n        if (this.textBefore) {\n          sb.append(escape(this.textBefore));\n        }\n        sb.append(\",\");\n        if (this.textAfter) {\n          sb.append(escape(this.textAfter));\n        }\n      }\n      if (this.sideBias) {\n        sb.append(\";s=\");\n        sb.append(this.sideBias);\n      }\n      sb.append(\"]\");\n    }\n  }\n}\n\nexport class Fragment {\n  steps: Step[] = null;\n\n  fromString(fragstr: string): void {\n    let r = fragstr.match(/^#?epubcfi\\((.*)\\)$/);\n    if (!r) {\n      throw new Error(\"E_CFI_NOT_CFI\");\n    }\n    const str = decodeURIComponent(r[1]);\n    let i = 0;\n    const steps = [];\n    while (true) {\n      let ext: {\n        [key: string]: string | string[];\n      };\n      switch (str.charAt(i)) {\n        case \"/\": {\n          i++;\n          r = str\n            .substr(i)\n            .match(/^(0|[1-9][0-9]*)(\\[(.*?)(;([^\\]]|\\^\\])*)?\\])?/);\n          if (!r) {\n            throw new Error(\"E_CFI_NUMBER_EXPECTED\");\n          }\n          i += r[0].length;\n          const index = parseInt(r[1], 10);\n          const id = r[3];\n          ext = parseExt(r[4]);\n          steps.push(new ChildStep(index, id, Base.asString(ext[\"s\"])));\n          break;\n        }\n        case \":\": {\n          i++;\n          r = str\n            .substr(i)\n            .match(\n              /^(0|[1-9][0-9]*)(\\[((([^\\];,]|\\^[\\];,])*)(,(([^\\];,]|\\^[\\];,])*))?)(;([^]]|\\^\\])*)?\\])?/,\n            );\n          if (!r) {\n            throw new Error(\"E_CFI_NUMBER_EXPECTED\");\n          }\n          i += r[0].length;\n          const offset = parseInt(r[1], 10);\n          let textBefore = r[4];\n          if (textBefore) {\n            textBefore = unescape(textBefore);\n          }\n          let textAfter = r[7];\n          if (textAfter) {\n            textAfter = unescape(textAfter);\n          }\n          ext = parseExt(r[10]);\n          steps.push(\n            new OffsetStep(\n              offset,\n              textBefore,\n              textAfter,\n              Base.asString(ext[\"s\"]),\n            ),\n          );\n          break;\n        }\n        case \"!\":\n          i++;\n          steps.push(new RefStep());\n          break;\n        case \"~\":\n        case \"@\":\n\n        // Time/space terminus; only useful for highlights/selections which are\n        // not yet supported, skip for now. fall through\n        case \"\":\n          this.steps = steps;\n          return;\n        default:\n          throw new Error(\"E_CFI_PARSE_ERROR\");\n      }\n    }\n  }\n\n  navigate(doc: Document): Position {\n    const pos = {\n      node: doc.documentElement,\n      offset: 0,\n      after: false,\n      sideBias: null,\n      ref: null,\n    };\n    for (let i = 0; i < this.steps.length; i++) {\n      if (!this.steps[i].applyTo(pos)) {\n        pos.ref = new Fragment();\n        pos.ref.steps = this.steps.slice(i + 1);\n        break;\n      }\n    }\n    return pos;\n  }\n\n  trim(text: string, after: boolean): string {\n    return text\n      .replace(/\\s+/g, \" \")\n      .match(\n        after\n          ? /^[ -\\uD7FF\\uE000-\\uFFFF]{0,8}/\n          : /[ -\\uD7FF\\uE000-\\uFFFF]{0,8}$/,\n      )[0]\n      .replace(/^\\s/, \"\")\n      .replace(/\\s$/, \"\");\n  }\n\n  /**\n   * Initialize from a node and an offset.\n   */\n  prependPathFromNode(\n    node: Node,\n    offset: number,\n    after: boolean,\n    sideBias: string | null,\n  ) {\n    const steps = [];\n    let parent = node.parentNode;\n    let textBefore = \"\";\n    let textAfter = \"\";\n    while (node) {\n      switch (node.nodeType) {\n        case 3: // Text nodes\n        case 4:\n        case 5: {\n          const text = node.textContent;\n          const textLength = text.length;\n          if (after) {\n            offset += textLength;\n            if (!textBefore) {\n              textBefore = text;\n            }\n          } else {\n            if (offset > textLength) {\n              offset = textLength;\n            }\n            after = true;\n            textBefore = text.substr(0, offset);\n            textAfter = text.substr(offset);\n          }\n          node = node.previousSibling;\n          continue;\n        }\n        case 8: // Comment Node\n          node = node.previousSibling;\n          continue;\n      }\n      break;\n    }\n    if (offset > 0 || textBefore || textAfter) {\n      textBefore = this.trim(textBefore, false);\n      textAfter = this.trim(textAfter, true);\n      steps.push(new OffsetStep(offset, textBefore, textAfter, sideBias));\n      sideBias = null;\n    }\n    while (parent) {\n      if (!parent || parent.nodeType == 9) {\n        break;\n      }\n      const id = after ? null : getId(node);\n      let index = after ? 1 : 0;\n      while (node) {\n        if (node.nodeType == 1) {\n          index += 2;\n        }\n        node = node.previousSibling;\n      }\n      steps.push(new ChildStep(index, id, sideBias));\n      sideBias = null;\n      node = parent;\n      parent = parent.parentNode;\n      after = false;\n    }\n    steps.reverse();\n    if (this.steps) {\n      steps.push(new RefStep());\n      this.steps = steps.concat(this.steps);\n    } else {\n      this.steps = steps;\n    }\n  }\n\n  toString(): string {\n    if (!this.steps) {\n      return \"\";\n    }\n    const sb = new Base.StringBuffer();\n    sb.append(\"epubcfi(\");\n    for (let i = 0; i < this.steps.length; i++) {\n      this.steps[i].appendTo(sb);\n    }\n    sb.append(\")\");\n    return sb.toString().replace(/%/g, \"%25\");\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Exprs - `-epubx-expr` Adaptive Layout expressions.\n */\nimport * as Base from \"./base\";\n\nexport type Preferences = {\n  fontFamily: string;\n  lineHeight: number;\n  margin: number;\n  hyphenate: boolean;\n  columnWidth: number;\n  horizontal: boolean;\n  nightMode: boolean;\n  spreadView: boolean;\n  pageBorder: number;\n  enabledMediaTypes: { [key: string]: boolean };\n  defaultPaperSize?: { [key: string]: number };\n};\n\nexport function defaultPreferences(): Preferences {\n  return {\n    fontFamily: \"serif\",\n    lineHeight: 1.25,\n    margin: 8,\n    hyphenate: false,\n    columnWidth: 25,\n    horizontal: false,\n    nightMode: false,\n    spreadView: false,\n    pageBorder: 1,\n    enabledMediaTypes: { vivliostyle: true, print: true },\n    defaultPaperSize: undefined,\n  };\n}\n\nexport function clonePreferences(pref: Preferences): Preferences {\n  return {\n    fontFamily: pref.fontFamily,\n    lineHeight: pref.lineHeight,\n    margin: pref.margin,\n    hyphenate: pref.hyphenate,\n    columnWidth: pref.columnWidth,\n    horizontal: pref.horizontal,\n    nightMode: pref.nightMode,\n    spreadView: pref.spreadView,\n    pageBorder: pref.pageBorder,\n    enabledMediaTypes: Object.assign({}, pref.enabledMediaTypes),\n    defaultPaperSize: pref.defaultPaperSize\n      ? Object.assign({}, pref.defaultPaperSize)\n      : undefined,\n  };\n}\n\nexport const defaultPreferencesInstance = defaultPreferences();\n\ninterface Pending {}\ntype Special = Pending;\n\n/**\n * Special marker value that indicates that the expression result is being\n * calculated.\n */\n// eslint-disable-next-line no-redeclare\nexport const Special = {\n  PENDING: {} as Pending,\n};\n\nexport type Result = string | number | boolean | undefined;\n\nexport type PendingResult = Special | Result;\n\nexport function letterbox(\n  viewW: number,\n  viewH: number,\n  objW: number,\n  objH: number,\n): string {\n  const scale = Math.min((viewW - 0) / objW, (viewH - 0) / objH);\n  return `matrix(${scale},0,0,${scale},0,0)`;\n}\n\n/**\n * @return string that can be parsed as CSS string with value str\n */\nexport function cssString(str: string): string {\n  return `\"${Base.escapeCSSStr(`${str}`)}\"`;\n}\n\n/**\n * @return string that can be parsed as CSS name\n */\nexport function cssIdent(name: string): string {\n  return Base.escapeCSSIdent(`${name}`);\n}\n\nexport function makeQualifiedName(\n  objName: string | null,\n  memberName: string,\n): string {\n  if (objName) {\n    return `${Base.escapeCSSIdent(objName)}.${Base.escapeCSSIdent(memberName)}`;\n  }\n  return Base.escapeCSSIdent(memberName);\n}\n\nexport let nextKeyIndex: number = 0;\n\n/**\n * Lexical scope of the expression.\n */\nexport class LexicalScope {\n  scopeKey: string;\n  children: LexicalScope[] = [];\n  zero: Const;\n  one: Const;\n  _true: Const;\n  _false: Const;\n  values: { [key: string]: Val } = {};\n  funcs: { [key: string]: Val } = {};\n  builtIns: { [key: string]: (...p1: Result[]) => Result } = {};\n\n  constructor(\n    public parent: LexicalScope,\n    public resolver?: (p1: string, p2: boolean) => Val,\n  ) {\n    this.scopeKey = `S${nextKeyIndex++}`;\n    this.zero = new Const(this, 0);\n    this.one = new Const(this, 1);\n    this._true = new Const(this, true);\n    this._false = new Const(this, false);\n    if (parent) {\n      parent.children.push(this);\n    }\n    if (!parent) {\n      // root scope\n      const builtIns = this.builtIns;\n      builtIns[\"floor\"] = Math.floor;\n      builtIns[\"ceil\"] = Math.ceil;\n      builtIns[\"round\"] = Math.round;\n      builtIns[\"sqrt\"] = Math.sqrt;\n      builtIns[\"min\"] = Math.min;\n      builtIns[\"max\"] = Math.max;\n      builtIns[\"letterbox\"] = letterbox;\n      builtIns[\"css-string\"] = cssString;\n      builtIns[\"css-name\"] = cssIdent;\n      builtIns[\"typeof\"] = (x) => typeof x;\n      this.defineBuiltInName(\"page-width\", function () {\n        return this.pageWidth();\n      });\n      this.defineBuiltInName(\"page-height\", function () {\n        return this.pageHeight();\n      });\n      this.defineBuiltInName(\"pref-font-family\", function () {\n        return this.pref.fontFamily;\n      });\n      this.defineBuiltInName(\"pref-night-mode\", function () {\n        return this.pref.nightMode;\n      });\n      this.defineBuiltInName(\"pref-hyphenate\", function () {\n        return this.pref.hyphenate;\n      });\n      this.defineBuiltInName(\"pref-margin\", function () {\n        return this.pref.margin;\n      });\n      this.defineBuiltInName(\"pref-line-height\", function () {\n        return this.pref.lineHeight;\n      });\n      this.defineBuiltInName(\"pref-column-width\", function () {\n        return this.pref.columnWidth * this.fontSize;\n      });\n      this.defineBuiltInName(\"pref-horizontal\", function () {\n        return this.pref.horizontal;\n      });\n      this.defineBuiltInName(\"pref-spread-view\", function () {\n        return this.pref.spreadView;\n      });\n\n      // For env(pub-title) and env(doc-title)\n      this.defineBuiltInName(\"pub-title\", function () {\n        return cssString(this.pubTitle ? this.pubTitle : \"\");\n      });\n      this.defineBuiltInName(\"doc-title\", function () {\n        return cssString(this.docTitle ? this.docTitle : \"\");\n      });\n    }\n  }\n\n  defineBuiltInName(name: string, fn: () => Result) {\n    this.values[name] = new Native(this, fn, name);\n  }\n\n  defineName(qualifiedName: string, val: Val): void {\n    this.values[qualifiedName] = val;\n  }\n\n  defineFunc(qualifiedName: string, val: Val): void {\n    this.funcs[qualifiedName] = val;\n  }\n\n  defineBuiltIn(qualifiedName: string, fn: (...p1: Result[]) => Result): void {\n    this.builtIns[qualifiedName] = fn;\n  }\n}\n\nexport function isAbsoluteLengthUnit(unit: string): boolean {\n  switch (unit?.toLowerCase()) {\n    case \"px\":\n    case \"in\":\n    case \"pt\":\n    case \"pc\":\n    case \"cm\":\n    case \"mm\":\n    case \"q\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport function isViewportRelativeLengthUnit(unit: string): boolean {\n  switch (unit?.toLowerCase()) {\n    case \"vw\":\n    case \"vh\":\n    case \"vi\":\n    case \"vb\":\n    case \"vmin\":\n    case \"vmax\":\n    case \"pvw\":\n    case \"pvh\":\n    case \"pvi\":\n    case \"pvb\":\n    case \"pvmin\":\n    case \"pvmax\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport function isFontRelativeLengthUnit(unit: string): boolean {\n  switch (unit?.toLowerCase()) {\n    case \"em\":\n    case \"rem\":\n    case \"lh\":\n    case \"rlh\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport function isRootFontRelativeLengthUnit(unit: string): boolean {\n  switch (unit?.toLowerCase()) {\n    case \"rem\":\n    case \"rlh\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport const defaultUnitSizes: { [key: string]: number } = {\n  px: 1,\n  in: 96,\n  pt: 4 / 3,\n  pc: 96 / 6,\n  cm: 96 / 2.54,\n  mm: 96 / 25.4,\n  q: 96 / 2.54 / 40,\n  em: 16,\n  rem: 16,\n  lh: 20,\n  rlh: 20,\n  // <resolution>\n  dppx: 1,\n  dpi: 1 / 96,\n  dpcm: 2.54 / 96,\n};\n\n/**\n * Returns if a unit should be converted to px before applied to the raw DOM.\n */\nexport function needUnitConversion(unit: string): boolean {\n  switch (unit) {\n    case \"q\":\n      return !CSS.supports(\"font-size\", \"1q\");\n    case \"lh\":\n      return !CSS.supports(\"line-height\", \"1lh\");\n    case \"rem\":\n    case \"rlh\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport type ScopeContext = {\n  [key: string]: Result;\n};\n\n/**\n * Run-time instance of a scope and its children.\n */\nexport class Context {\n  protected actualPageWidth: number | null = null;\n  pageWidth: () => number;\n  protected actualPageHeight: number | null = null;\n  pageHeight: () => number;\n  initialFontSize: number;\n  rootFontSize: number | null = null;\n  isRelativeRootFontSize: boolean | null = null;\n  fontSize: () => number;\n  rootLineHeight: number | null = null;\n  pref: Preferences;\n  scopes: { [key: string]: ScopeContext } = {};\n  pageAreaWidth: number | null = null;\n  pageAreaHeight: number | null = null;\n  pageVertical: boolean | null = null;\n  pubTitle: string | null = null;\n  docTitle: string | null = null;\n\n  constructor(\n    public readonly rootScope: LexicalScope,\n    public readonly viewportWidth: number,\n    public readonly viewportHeight: number,\n    fontSize: number,\n  ) {\n    this.pageWidth = function () {\n      if (this.actualPageWidth) {\n        return this.actualPageWidth;\n      } else {\n        return this.pref.spreadView\n          ? Math.floor(viewportWidth / 2) - this.pref.pageBorder\n          : viewportWidth;\n      }\n    };\n    this.pageHeight = function () {\n      if (this.actualPageHeight) {\n        return this.actualPageHeight;\n      } else {\n        return viewportHeight;\n      }\n    };\n    this.initialFontSize = fontSize;\n    this.fontSize = function () {\n      if (this.rootFontSize) {\n        return this.rootFontSize;\n      } else {\n        return fontSize;\n      }\n    };\n    this.pref = defaultPreferencesInstance;\n  }\n\n  private getScopeContext(scope: LexicalScope): ScopeContext {\n    let s = this.scopes[scope.scopeKey];\n    if (!s) {\n      s = {};\n      this.scopes[scope.scopeKey] = s;\n    }\n    return s;\n  }\n\n  clearScope(scope: LexicalScope): void {\n    this.scopes[scope.scopeKey] = {};\n    for (let k = 0; k < scope.children.length; k++) {\n      this.clearScope(scope.children[k]);\n    }\n  }\n\n  queryUnitSize(unit: string, isRoot: boolean, vertical?: boolean): number {\n    if (isViewportRelativeLengthUnit(unit)) {\n      const pvw = this.pageWidth() / 100;\n      const pvh = this.pageHeight() / 100;\n      const vw = this.pageAreaWidth != null ? this.pageAreaWidth / 100 : pvw;\n      const vh = this.pageAreaHeight != null ? this.pageAreaHeight / 100 : pvh;\n      const isVertical = vertical ?? this.pageVertical;\n\n      switch (unit) {\n        case \"vw\":\n          return vw;\n        case \"vh\":\n          return vh;\n        case \"vi\":\n          return isVertical ? vh : vw;\n        case \"vb\":\n          return isVertical ? vw : vh;\n        case \"vmin\":\n          return vw < vh ? vw : vh;\n        case \"vmax\":\n          return vw > vh ? vw : vh;\n        case \"pvw\":\n          return pvw;\n        case \"pvh\":\n          return pvh;\n        case \"pvi\":\n          return isVertical ? pvh : pvw;\n        case \"pvb\":\n          return isVertical ? pvw : pvh;\n        case \"pvmin\":\n          return pvw < pvh ? pvw : pvh;\n        case \"pvmax\":\n          return pvw > pvh ? pvw : pvh;\n      }\n    }\n    if (unit == \"em\" || unit == \"rem\") {\n      return isRoot ? this.initialFontSize : this.fontSize();\n    }\n    if (unit == \"lh\" || unit == \"rlh\") {\n      // FIXME: \"lh\" unit is incorrect, treated same as \"rlh\"\n      return this.rootLineHeight;\n    }\n\n    return defaultUnitSizes[unit];\n  }\n\n  evalName(scope: LexicalScope, qualifiedName: string): Val {\n    do {\n      let val = scope.values[qualifiedName];\n      if (val) {\n        return val;\n      }\n      if (scope.resolver) {\n        val = scope.resolver.call(this, qualifiedName, false);\n        if (val) {\n          return val;\n        }\n      }\n      scope = scope.parent;\n    } while (scope);\n    throw new Error(`Name '${qualifiedName}' is undefined`);\n  }\n\n  /**\n   * @param noBuiltInEval don't evaluate built-ins (for dependency calculations)\n   */\n  evalCall(\n    scope: LexicalScope,\n    qualifiedName: string,\n    params: Val[],\n    noBuiltInEval: boolean,\n  ): Val {\n    do {\n      let body = scope.funcs[qualifiedName];\n      if (body) {\n        return body; // will be expanded by callee\n      }\n      if (scope.resolver) {\n        body = scope.resolver.call(this, qualifiedName, true);\n        if (body) {\n          return body;\n        }\n      }\n      const fn = scope.builtIns[qualifiedName];\n      if (fn) {\n        if (noBuiltInEval) {\n          return scope.zero;\n        }\n        const args = Array(params.length);\n        for (let i = 0; i < params.length; i++) {\n          args[i] = params[i].evaluate(this);\n        }\n        return new Const(scope, fn.apply(this, args));\n      }\n      scope = scope.parent;\n    } while (scope);\n    throw new Error(`Function '${qualifiedName}' is undefined`);\n  }\n\n  evalMediaName(name: string, not: boolean): boolean {\n    const enabled = name === \"all\" || !!this.pref.enabledMediaTypes[name];\n    return not ? !enabled : enabled;\n  }\n\n  evalMediaTest(feature: string, value: Val): boolean {\n    let prefix = \"\";\n    const r = feature.match(/^(min|max)-(.*)$/);\n    if (r) {\n      prefix = r[1];\n      feature = r[2];\n    }\n    let req: Result | null = null;\n    let actual: number | null = null;\n    switch (feature) {\n      case \"width\":\n      case \"height\":\n      case \"device-width\":\n      case \"device-height\":\n      case \"color\":\n        if (value) {\n          req = value.evaluate(this);\n        }\n        break;\n    }\n    switch (feature) {\n      case \"width\":\n        actual = this.pageWidth();\n        break;\n      case \"height\":\n        actual = this.pageHeight();\n        break;\n      case \"device-width\":\n        actual = window.screen.availWidth;\n        break;\n      case \"device-height\":\n        actual = window.screen.availHeight;\n        break;\n      case \"color\":\n        actual = window.screen.pixelDepth;\n        break;\n    }\n    if (actual != null && req != null) {\n      switch (prefix) {\n        case \"min\":\n          return actual >= Number(req);\n        case \"max\":\n          return actual <= Number(req);\n        default:\n          return actual == req;\n      }\n    } else if (actual != null && value == null) {\n      return actual !== 0;\n    }\n    return false;\n  }\n\n  evalSupportsTest(name: string, value: string, isFunc: boolean): boolean {\n    return false;\n  }\n\n  queryVal(scope: LexicalScope, key: string): Result | undefined {\n    const s = scope && this.scopes[scope.scopeKey];\n    return s ? s[key] : undefined;\n  }\n\n  storeVal(scope: LexicalScope, key: string, val: Result): void {\n    this.getScopeContext(scope)[key] = val;\n  }\n}\n\n//---------- name resolution --------------\nexport type DependencyCache = {\n  [key: string]: boolean | Special;\n};\n\nexport class Val {\n  key: string;\n\n  constructor(public scope: LexicalScope) {\n    this.scope = scope;\n    this.key = `_${nextKeyIndex++}`;\n  }\n\n  /** @override */\n  toString(): string {\n    const buf = new Base.StringBuffer();\n    this.appendTo(buf, 0);\n    return buf.toString();\n  }\n\n  appendTo(buf: Base.StringBuffer, priority: number): void {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  protected evaluateCore(context: Context): Result {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  expand(context: Context, params: Val[]): Val {\n    return this;\n  }\n\n  dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    return other === this;\n  }\n\n  dependOuter(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    const cached = dependencyCache[this.key];\n    if (cached != null) {\n      if (cached === Special.PENDING) {\n        return false;\n      }\n      return cached as boolean;\n    } else {\n      dependencyCache[this.key] = Special.PENDING;\n      const result = this.dependCore(other, context, dependencyCache);\n      dependencyCache[this.key] = result;\n      return result;\n    }\n  }\n\n  depend(other: Val, context: Context): boolean {\n    return this.dependOuter(other, context, {});\n  }\n\n  evaluate(context: Context): Result {\n    let result = context.queryVal(this.scope, this.key);\n    if (typeof result != \"undefined\") {\n      return result;\n    }\n    result = this.evaluateCore(context);\n    if (this.scope) {\n      context.storeVal(this.scope, this.key, result);\n    }\n    return result;\n  }\n\n  isMediaName(): boolean {\n    return false;\n  }\n}\n\nexport class Prefix extends Val {\n  constructor(\n    scope: LexicalScope,\n    public val: Val,\n  ) {\n    super(scope);\n  }\n\n  protected getOp(): string {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  evalPrefix(val: Result): Result {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  override evaluateCore(context: Context): Result {\n    const val = this.val.evaluate(context);\n    return this.evalPrefix(val);\n  }\n\n  override dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    return (\n      other === this || this.val.dependOuter(other, context, dependencyCache)\n    );\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    if (10 < priority) {\n      buf.append(\"(\");\n    }\n    buf.append(this.getOp());\n    this.val.appendTo(buf, 10);\n    if (10 < priority) {\n      buf.append(\")\");\n    }\n  }\n\n  override expand(context: Context, params: Val[]): Val {\n    const val = this.val.expand(context, params);\n    if (val === this.val) {\n      return this;\n    }\n    const r = new (this.constructor as any)(this.scope, val);\n    return r;\n  }\n}\n\nexport class Infix extends Val {\n  constructor(\n    scope: LexicalScope,\n    public lhs: Val,\n    public rhs: Val,\n  ) {\n    super(scope);\n  }\n\n  getPriority(): number {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  getOp(): string {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  evalInfix(lhs: Result, rhs: Result): Result {\n    throw new Error(\"F_ABSTRACT\");\n  }\n\n  override evaluateCore(context: Context): Result {\n    const lhs = this.lhs.evaluate(context);\n    const rhs = this.rhs.evaluate(context);\n    return this.evalInfix(lhs, rhs);\n  }\n\n  override dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    return (\n      other === this ||\n      this.lhs.dependOuter(other, context, dependencyCache) ||\n      this.rhs.dependOuter(other, context, dependencyCache)\n    );\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    const thisPriority = this.getPriority();\n    if (thisPriority <= priority) {\n      buf.append(\"(\");\n    }\n    this.lhs.appendTo(buf, thisPriority);\n    buf.append(this.getOp());\n    this.rhs.appendTo(buf, thisPriority);\n    if (thisPriority <= priority) {\n      buf.append(\")\");\n    }\n  }\n\n  override expand(context: Context, params: Val[]): Val {\n    const lhs = this.lhs.expand(context, params);\n    const rhs = this.rhs.expand(context, params);\n    if (lhs === this.lhs && rhs === this.rhs) {\n      return this;\n    }\n    const r = new (this.constructor as any)(this.scope, lhs, rhs);\n    return r;\n  }\n}\n\nexport class Logical extends Infix {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getPriority(): number {\n    return 1;\n  }\n}\n\nexport class Comparison extends Infix {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getPriority(): number {\n    return 2;\n  }\n}\n\nexport class Additive extends Infix {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getPriority(): number {\n    return 3;\n  }\n}\n\nexport class Multiplicative extends Infix {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getPriority(): number {\n    return 4;\n  }\n}\n\nexport class Not extends Prefix {\n  constructor(scope: LexicalScope, val: Val) {\n    super(scope, val);\n  }\n\n  override getOp(): string {\n    return \"!\";\n  }\n\n  override evalPrefix(val: Result): Result {\n    return !val;\n  }\n}\n\nexport class NotMedia extends Not {\n  constructor(scope: LexicalScope, val: Val) {\n    super(scope, val);\n  }\n\n  override getOp(): string {\n    return \"not \";\n  }\n}\n\nexport class Negate extends Prefix {\n  constructor(scope: LexicalScope, val: Val) {\n    super(scope, val);\n  }\n\n  override getOp(): string {\n    return \"-\";\n  }\n\n  override evalPrefix(val: Result): Result {\n    return -val;\n  }\n}\n\nexport class And extends Logical {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"&&\";\n  }\n\n  override evaluateCore(context: Context): Result {\n    return this.lhs.evaluate(context) && this.rhs.evaluate(context);\n  }\n}\n\nexport class AndMedia extends And {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \" and \";\n  }\n}\n\nexport class Or extends Logical {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"||\";\n  }\n\n  override evaluateCore(context: Context): Result {\n    return this.lhs.evaluate(context) || this.rhs.evaluate(context);\n  }\n}\n\nexport class Comma extends Or {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \", \";\n  }\n}\n\nexport class OrMedia extends Or {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \" or \";\n  }\n}\n\nexport class Lt extends Comparison {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"<\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return lhs < rhs;\n  }\n}\n\nexport class Le extends Comparison {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"<=\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return lhs <= rhs;\n  }\n}\n\nexport class Gt extends Comparison {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \">\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return lhs > rhs;\n  }\n}\n\nexport class Ge extends Comparison {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \">=\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return lhs >= rhs;\n  }\n}\n\nexport class Eq extends Comparison {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"==\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return lhs == rhs;\n  }\n}\n\nexport class Ne extends Comparison {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"!=\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return lhs != rhs;\n  }\n}\n\nexport class Add extends Additive {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"+\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return (lhs as any) + rhs;\n  }\n}\n\nexport class Subtract extends Additive {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \" - \";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return (lhs as any) - (rhs as any);\n  }\n}\n\nexport class Multiply extends Multiplicative {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"*\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return (lhs as any) * (rhs as any);\n  }\n}\n\nexport class Divide extends Multiplicative {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"/\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return (lhs as any) / (rhs as any);\n  }\n}\n\nexport class Modulo extends Multiplicative {\n  constructor(scope: LexicalScope, lhs: Val, rhs: Val) {\n    super(scope, lhs, rhs);\n  }\n\n  override getOp(): string {\n    return \"%\";\n  }\n\n  override evalInfix(lhs: Result, rhs: Result): Result {\n    return (lhs as any) % (rhs as any);\n  }\n}\n\n/**\n * Numerical value with a unit.\n */\nexport class Numeric extends Val {\n  unit: string;\n\n  constructor(\n    scope: LexicalScope,\n    public num: number,\n    unit: string,\n  ) {\n    super(scope);\n    this.unit = unit?.toLowerCase() ?? \"\";\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    buf.append(this.num.toString());\n    buf.append(Base.escapeCSSIdent(this.unit));\n  }\n\n  override evaluateCore(context: Context): Result {\n    return this.num * context.queryUnitSize(this.unit, false);\n  }\n}\n\n/**\n * Named value.\n * @param qualifiedName CSS-escaped name sequence separated by dots.\n */\nexport class Named extends Val {\n  constructor(\n    scope: LexicalScope,\n    public qualifiedName: string,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    buf.append(this.qualifiedName);\n  }\n\n  override evaluateCore(context: Context): Result {\n    return context.evalName(this.scope, this.qualifiedName).evaluate(context);\n  }\n\n  override dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    return (\n      other === this ||\n      context\n        .evalName(this.scope, this.qualifiedName)\n        .dependOuter(other, context, dependencyCache)\n    );\n  }\n}\n\n/**\n * Named value.\n */\nexport class MediaName extends Val {\n  constructor(\n    scope: LexicalScope,\n    public not: boolean,\n    public name: string,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    if (this.not) {\n      buf.append(\"not \");\n    }\n    buf.append(Base.escapeCSSIdent(this.name));\n  }\n\n  override evaluateCore(context: Context): Result {\n    return context.evalMediaName(this.name, this.not);\n  }\n\n  override isMediaName(): boolean {\n    return true;\n  }\n}\n\n/**\n * A value that is calculated by calling a JavaScript function. Note that the\n * result is cached and this function will be called only once between any\n * clears for its scope in the context.\n * @param fn function to call.\n * @param str a way to represent this value in toString() call.\n */\nexport class Native extends Val {\n  constructor(\n    scope: LexicalScope,\n    public fn: () => Result,\n    public str: string,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    buf.append(this.str);\n  }\n\n  override evaluateCore(context: Context): Result {\n    return this.fn.call(context);\n  }\n}\n\nexport function appendValArray(buf: Base.StringBuffer, arr: Val[]): void {\n  buf.append(\"(\");\n  for (let i = 0; i < arr.length; i++) {\n    if (i) {\n      buf.append(\",\");\n    }\n    arr[i].appendTo(buf, 0);\n  }\n  buf.append(\")\");\n}\n\nexport function expandValArray(\n  context: Context,\n  arr: Val[],\n  params: Val[],\n): Val[] {\n  let expanded: Val[] = arr;\n  for (let i = 0; i < arr.length; i++) {\n    const p = arr[i].expand(context, params);\n    if (arr !== expanded) {\n      expanded[i] = p;\n    } else if (p !== arr[i]) {\n      expanded = Array(arr.length);\n      for (let j = 0; j < i; j++) {\n        expanded[j] = arr[j];\n      }\n      expanded[i] = p;\n    }\n  }\n  return expanded;\n}\n\nexport function evalValArray(context: Context, arr: Val[]): Result[] {\n  const result: Result[] = Array(arr.length);\n  for (let i = 0; i < arr.length; i++) {\n    result[i] = arr[i].evaluate(context);\n  }\n  return result;\n}\n\nexport class Call extends Val {\n  constructor(\n    scope: LexicalScope,\n    public qualifiedName: string,\n    public params: Val[],\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    buf.append(this.qualifiedName);\n    appendValArray(buf, this.params);\n  }\n\n  override evaluateCore(context: Context): Result {\n    const body = context.evalCall(\n      this.scope,\n      this.qualifiedName,\n      this.params,\n      false,\n    );\n    return body.expand(context, this.params).evaluate(context);\n  }\n\n  override dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    if (other === this) {\n      return true;\n    }\n    for (let i = 0; i < this.params.length; i++) {\n      if (this.params[i].dependOuter(other, context, dependencyCache)) {\n        return true;\n      }\n    }\n    const body = context.evalCall(\n      this.scope,\n      this.qualifiedName,\n      this.params,\n      true,\n    );\n\n    // No expansion here!\n    return body.dependOuter(other, context, dependencyCache);\n  }\n\n  override expand(context: Context, params: Val[]): Val {\n    const expandedParams = expandValArray(context, this.params, params);\n    if (expandedParams === this.params) {\n      return this;\n    }\n    return new Call(this.scope, this.qualifiedName, expandedParams);\n  }\n}\n\nexport class Cond extends Val {\n  constructor(\n    scope: LexicalScope,\n    public cond: Val,\n    public ifTrue: Val,\n    public ifFalse: Val,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    if (priority > 0) {\n      buf.append(\"(\");\n    }\n    this.cond.appendTo(buf, 0);\n    buf.append(\"?\");\n    this.ifTrue.appendTo(buf, 0);\n    buf.append(\":\");\n    this.ifFalse.appendTo(buf, 0);\n    if (priority > 0) {\n      buf.append(\")\");\n    }\n  }\n\n  override evaluateCore(context: Context): Result {\n    if (this.cond.evaluate(context)) {\n      return this.ifTrue.evaluate(context);\n    } else {\n      return this.ifFalse.evaluate(context);\n    }\n  }\n\n  override dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    return (\n      other === this ||\n      this.cond.dependOuter(other, context, dependencyCache) ||\n      this.ifTrue.dependOuter(other, context, dependencyCache) ||\n      this.ifFalse.dependOuter(other, context, dependencyCache)\n    );\n  }\n\n  override expand(context: Context, params: Val[]): Val {\n    const cond = this.cond.expand(context, params);\n    const ifTrue = this.ifTrue.expand(context, params);\n    const ifFalse = this.ifFalse.expand(context, params);\n    if (\n      cond === this.cond &&\n      ifTrue === this.ifTrue &&\n      ifFalse === this.ifFalse\n    ) {\n      return this;\n    }\n    const r = new Cond(this.scope, cond, ifTrue, ifFalse);\n    return r;\n  }\n}\n\nexport class Const extends Val {\n  constructor(\n    scope: LexicalScope,\n    public val: Result,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    switch (typeof this.val) {\n      case \"number\":\n      case \"boolean\":\n        buf.append(this.val.toString());\n        break;\n      case \"string\":\n        buf.append('\"');\n        buf.append(Base.escapeCSSStr(this.val));\n        buf.append('\"');\n        break;\n      default:\n        throw new Error(\"F_UNEXPECTED_STATE\");\n    }\n  }\n\n  override evaluateCore(context: Context): Result {\n    return this.val;\n  }\n}\n\nexport class MediaTest extends Val {\n  constructor(\n    scope: LexicalScope,\n    public name: MediaName,\n    public value: Val,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    buf.append(\"(\");\n    buf.append(Base.escapeCSSStr(this.name.name));\n    buf.append(\":\");\n    this.value.appendTo(buf, 0);\n    buf.append(\")\");\n  }\n\n  override evaluateCore(context: Context): Result {\n    return context.evalMediaTest(this.name.name, this.value);\n  }\n\n  override dependCore(\n    other: Val,\n    context: Context,\n    dependencyCache: DependencyCache,\n  ): boolean {\n    return (\n      other === this || this.value.dependOuter(other, context, dependencyCache)\n    );\n  }\n\n  override expand(context: Context, params: Val[]): Val {\n    const value = this.value.expand(context, params);\n    if (value === this.value) {\n      return this;\n    }\n    const r = new MediaTest(this.scope, this.name, value);\n    return r;\n  }\n}\n\nexport class SupportsTest extends Val {\n  constructor(\n    scope: LexicalScope,\n    public name: string,\n    public value: string,\n    public isFunc: boolean,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    if (this.isFunc) {\n      buf.append(this.name);\n    }\n    buf.append(\"(\");\n    if (!this.isFunc && this.name) {\n      buf.append(this.name);\n      buf.append(\":\");\n    }\n    buf.append(this.value);\n    buf.append(\")\");\n  }\n\n  override evaluateCore(context: Context): Result {\n    return context.evalSupportsTest(this.name, this.value, this.isFunc);\n  }\n}\n\nexport class Param extends Val {\n  constructor(\n    scope: LexicalScope,\n    public index: number,\n  ) {\n    super(scope);\n  }\n\n  override appendTo(buf: Base.StringBuffer, priority: number): void {\n    buf.append(\"$\");\n    buf.append(this.index.toString());\n  }\n\n  override expand(context: Context, params: Val[]): Val {\n    const v = params[this.index];\n    if (!v) {\n      throw new Error(`Parameter missing: ${this.index}`);\n    }\n    return v as Val;\n  }\n}\n\nexport function and(scope: LexicalScope, v1: Val, v2: Val): Val {\n  if (\n    v1 === scope._false ||\n    v1 === scope.zero ||\n    v2 == scope._false ||\n    v2 == scope.zero\n  ) {\n    return scope._false;\n  }\n  if (v1 === scope._true || v1 === scope.one) {\n    return v2;\n  }\n  if (v2 === scope._true || v2 === scope.one) {\n    return v1;\n  }\n  return new And(scope, v1, v2);\n}\n\nexport function add(scope: LexicalScope, v1: Val, v2: Val): Val {\n  if (v1 === scope.zero) {\n    return v2;\n  }\n  if (v2 === scope.zero) {\n    return v1;\n  }\n  return new Add(scope, v1, v2);\n}\n\nexport function sub(scope: LexicalScope, v1: Val, v2: Val): Val {\n  if (v1 === scope.zero) {\n    return new Negate(scope, v2);\n  }\n  if (v2 === scope.zero) {\n    return v1;\n  }\n  return new Subtract(scope, v1, v2);\n}\n\nexport function mul(scope: LexicalScope, v1: Val, v2: Val): Val {\n  if (v1 === scope.zero || v2 === scope.zero) {\n    return scope.zero;\n  }\n  if (v1 === scope.one) {\n    return v2;\n  }\n  if (v2 === scope.one) {\n    return v1;\n  }\n  return new Multiply(scope, v1, v2);\n}\n\nexport function div(scope: LexicalScope, v1: Val, v2: Val): Val {\n  if (v1 === scope.zero) {\n    return scope.zero;\n  }\n  if (v2 === scope.one) {\n    return v1;\n  }\n  return new Divide(scope, v1, v2);\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Css - CSS Values and utilities to handle them.\n */\nimport * as Base from \"./base\";\nimport * as Exprs from \"./exprs\";\n\nexport class Visitor {\n  visitValues(values: Val[]): Val[] {\n    for (let i = 0; i < values.length; i++) {\n      values[i].visit(this);\n    }\n    return null;\n  }\n\n  visitEmpty(empty: Val): Val {\n    return null;\n  }\n\n  visitSlash(slash: Val): Val {\n    return null;\n  }\n\n  visitStr(str: Str): Val {\n    return null;\n  }\n\n  visitIdent(ident: Ident): Val {\n    return null;\n  }\n\n  visitNumeric(numeric: Numeric): Val {\n    return null;\n  }\n\n  visitNum(num: Num): Val {\n    return null;\n  }\n\n  visitInt(num: Int): Val {\n    return this.visitNum(num);\n  }\n\n  visitHexColor(color: HexColor): Val {\n    return null;\n  }\n\n  visitURL(url: URL): Val {\n    return null;\n  }\n\n  visitURange(urange: URange): Val {\n    return null;\n  }\n\n  visitSpaceList(list: SpaceList): Val {\n    this.visitValues(list.values);\n    return null;\n  }\n\n  visitCommaList(list: CommaList): Val {\n    this.visitValues(list.values);\n    return null;\n  }\n\n  visitFunc(func: Func): Val {\n    this.visitValues(func.values);\n    return null;\n  }\n\n  visitExpr(expr: Expr): Val {\n    return null;\n  }\n}\n\nexport class FilterVisitor extends Visitor {\n  error: boolean = false;\n\n  constructor() {\n    super();\n  }\n\n  override visitValues(values: Val[]): Val[] {\n    let arr: Val[] = null;\n    for (let i = 0; i < values.length; i++) {\n      const before = values[i];\n      const after = before.visit(this);\n      if (this.error) {\n        return [];\n      }\n      if (arr) {\n        arr[i] = after;\n      } else if (before !== after) {\n        arr = new Array(values.length);\n        for (let k = 0; k < i; k++) {\n          arr[k] = values[k];\n        }\n        arr[i] = after;\n      }\n    }\n    return arr || values;\n  }\n\n  override visitEmpty(empty: Val): Val {\n    return empty;\n  }\n\n  override visitStr(str: Str): Val {\n    return str;\n  }\n\n  override visitIdent(ident: Ident): Val {\n    return ident;\n  }\n\n  override visitSlash(slash: Val): Val {\n    return slash;\n  }\n\n  override visitNumeric(numeric: Numeric): Val {\n    return numeric;\n  }\n\n  override visitNum(num: Num): Val {\n    return num;\n  }\n\n  override visitInt(num: Int): Val {\n    return num;\n  }\n\n  override visitHexColor(color: HexColor): Val {\n    return color;\n  }\n\n  override visitURL(url: URL): Val {\n    return url;\n  }\n\n  override visitURange(urange: URange): Val {\n    return urange;\n  }\n\n  override visitSpaceList(list: SpaceList): Val {\n    const values = this.visitValues(list.values);\n    if (this.error) {\n      return empty;\n    }\n    if (values === list.values) {\n      return list;\n    }\n    return new SpaceList(values);\n  }\n\n  override visitCommaList(list: CommaList): Val {\n    const values = this.visitValues(list.values);\n    if (this.error) {\n      return empty;\n    }\n    if (values === list.values) {\n      return list;\n    }\n    return new CommaList(values);\n  }\n\n  override visitFunc(func: Func): Val {\n    const values = this.visitValues(func.values);\n    if (this.error) {\n      return empty;\n    }\n    if (values === func.values) {\n      return func;\n    }\n    return new Func(func.name, values);\n  }\n\n  override visitExpr(expr: Expr): Val {\n    return expr;\n  }\n}\n\nexport class Val {\n  /** @override */\n  toString(): string {\n    const buf = new Base.StringBuffer();\n    this.appendTo(buf, true);\n    return buf.toString();\n  }\n\n  stringValue(): string {\n    const buf = new Base.StringBuffer();\n    this.appendTo(buf, false);\n    return buf.toString();\n  }\n\n  toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    return null;\n  }\n\n  appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(\"[error]\");\n  }\n\n  isExpr(): boolean {\n    return false;\n  }\n\n  isNumeric(): boolean {\n    return false;\n  }\n\n  isNum(): boolean {\n    return false;\n  }\n\n  isIdent(): boolean {\n    return false;\n  }\n\n  isSpaceList(): boolean {\n    return false;\n  }\n\n  visit(visitor: Visitor): Val {\n    return this;\n  }\n}\n\nexport class Empty extends Val {\n  private static empty: Empty;\n\n  public static get instance(): Empty {\n    if (!this.empty) {\n      this.empty = new Empty();\n    }\n    return this.empty;\n  }\n\n  private constructor() {\n    super();\n  }\n\n  override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    return new Exprs.Const(scope, \"\");\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {}\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitEmpty(this);\n  }\n}\n\nexport const empty: Empty = Empty.instance;\n\nexport class Slash extends Val {\n  private static slash: Slash;\n\n  public static get instance(): Slash {\n    if (!this.slash) {\n      this.slash = new Slash();\n    }\n    return this.slash;\n  }\n\n  private constructor() {\n    super();\n  }\n\n  override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    return new Exprs.Const(scope, \"/\");\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(\"/\");\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitSlash(this);\n  }\n}\n\nexport const slash: Slash = Slash.instance;\n\nexport class Str extends Val {\n  constructor(public str: string) {\n    super();\n  }\n\n  override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    return new Exprs.Const(scope, this.str);\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    if (toString) {\n      buf.append('\"');\n      buf.append(Base.escapeCSSStr(this.str));\n      buf.append('\"');\n    } else {\n      buf.append(this.str);\n    }\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitStr(this);\n  }\n}\n\nconst nameTable: { [key: string]: Ident } = {};\n\nexport class Ident extends Val {\n  constructor(public name: string) {\n    super();\n    if (nameTable[name]) {\n      throw new Error(\"E_INVALID_CALL\");\n    }\n    nameTable[name] = this;\n  }\n\n  override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    return new Exprs.Const(scope, this.name);\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    if (toString) {\n      buf.append(Base.escapeCSSIdent(this.name));\n    } else {\n      buf.append(this.name);\n    }\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitIdent(this);\n  }\n\n  override isIdent(): boolean {\n    return true;\n  }\n}\n\nexport function getName(name: string): Ident {\n  let r = nameTable[name];\n  if (!r) {\n    r = new Ident(name);\n  }\n  return r;\n}\n\nexport class Numeric extends Val {\n  unit: string;\n\n  constructor(\n    public num: number,\n    unit: string,\n  ) {\n    super();\n    this.unit = unit?.toLowerCase() ?? \"\"; // units are case-insensitive in CSS\n  }\n\n  override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    if (this.num == 0) {\n      return scope.zero;\n    }\n    if (ref && this.unit == \"%\") {\n      if (this.num == 100) {\n        return ref;\n      }\n      return new Exprs.Multiply(\n        scope,\n        ref,\n        new Exprs.Const(scope, this.num / 100),\n      );\n    }\n    return new Exprs.Numeric(scope, this.num, this.unit);\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(this.num.toString());\n    buf.append(this.unit);\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitNumeric(this);\n  }\n\n  override isNumeric(): boolean {\n    return true;\n  }\n}\n\nexport class Num extends Val {\n  constructor(public num: number) {\n    super();\n  }\n\n  override toExpr(scope: Exprs.LexicalScope, ref: Exprs.Val): Exprs.Val {\n    if (this.num == 0) {\n      return scope.zero;\n    }\n    if (this.num == 1) {\n      return scope.one;\n    }\n    return new Exprs.Const(scope, this.num);\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(this.num.toString());\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitNum(this);\n  }\n\n  override isNum(): boolean {\n    return true;\n  }\n}\n\nexport class Int extends Num {\n  constructor(num: number) {\n    super(num);\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitInt(this);\n  }\n}\n\nexport class HexColor extends Val {\n  constructor(public hex: string) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(\"#\");\n    buf.append(this.hex);\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitHexColor(this);\n  }\n}\n\nexport class URL extends Val {\n  constructor(public url: string) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append('url(\"');\n    buf.append(Base.escapeCSSStr(this.url));\n    buf.append('\")');\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitURL(this);\n  }\n}\n\nexport class URange extends Val {\n  constructor(public urangeText: string) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(this.urangeText);\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitURange(this);\n  }\n}\n\nexport function appendList(\n  buf: Base.StringBuffer,\n  values: Val[],\n  separator: string,\n  toString: boolean,\n): void {\n  const length = values.length;\n  if (length > 0) {\n    values[0]?.appendTo(buf, toString);\n    for (let i = 1; i < length; i++) {\n      buf.append(separator);\n      values[i]?.appendTo(buf, toString);\n    }\n  }\n}\n\nexport class SpaceList extends Val {\n  constructor(public values: Val[]) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    appendList(buf, this.values, \" \", toString);\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitSpaceList(this);\n  }\n\n  override isSpaceList(): boolean {\n    return true;\n  }\n}\n\nexport class CommaList extends Val {\n  constructor(public values: Val[]) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    appendList(buf, this.values, \",\", toString);\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitCommaList(this);\n  }\n}\n\nexport class Func extends Val {\n  constructor(\n    public name: string,\n    public values: Val[],\n  ) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(Base.escapeCSSIdent(this.name));\n    buf.append(\"(\");\n    appendList(buf, this.values, \",\", toString);\n    buf.append(\")\");\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitFunc(this);\n  }\n}\n\nexport class Expr extends Val {\n  constructor(public expr: Exprs.Val) {\n    super();\n  }\n\n  override toExpr(): Exprs.Val {\n    return this.expr;\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    if (\n      this.expr instanceof Exprs.Const ||\n      this.expr instanceof Exprs.Numeric\n    ) {\n      this.expr.appendTo(buf, 0);\n    } else {\n      buf.append(\"-epubx-expr(\");\n      this.expr.appendTo(buf, 0);\n      buf.append(\")\");\n    }\n  }\n\n  override visit(visitor: Visitor): Val {\n    return visitor.visitExpr(this);\n  }\n\n  override isExpr(): boolean {\n    return true;\n  }\n}\n\n/**\n * Custom property value, may be arbitrary token\n */\nexport class AnyToken extends Val {\n  constructor(public text: string) {\n    super();\n  }\n\n  override appendTo(buf: Base.StringBuffer, toString: boolean): void {\n    buf.append(this.text || \" \");\n  }\n}\n\nexport function toNumber(val: Val, context: Exprs.Context): number {\n  if (val) {\n    if (val.isNumeric()) {\n      const numeric = val as Numeric;\n      return context.queryUnitSize(numeric.unit, false) * numeric.num;\n    }\n    if (val.isNum()) {\n      return (val as Num).num;\n    }\n  }\n  return 0;\n}\n\n/**\n * Convert numeric value to px\n */\nexport function convertNumericToPx(val: Val, context: Exprs.Context): Numeric {\n  return new Numeric(toNumber(val, context), \"px\");\n}\n\nexport const ident: { [key: string]: Ident } = {\n  absolute: getName(\"absolute\"),\n  all: getName(\"all\"),\n  always: getName(\"always\"),\n  anywhere: getName(\"anywhere\"),\n  auto: getName(\"auto\"),\n  avoid: getName(\"avoid\"),\n  balance: getName(\"balance\"),\n  balance_all: getName(\"balance-all\"),\n  block: getName(\"block\"),\n  block_end: getName(\"block-end\"),\n  block_start: getName(\"block-start\"),\n  both: getName(\"both\"),\n  bottom: getName(\"bottom\"),\n  border_box: getName(\"border-box\"),\n  break_all: getName(\"break-all\"),\n  break_word: getName(\"break-word\"),\n  clip: getName(\"clip\"),\n  crop: getName(\"crop\"),\n  cross: getName(\"cross\"),\n  column: getName(\"column\"),\n  discard: getName(\"discard\"),\n  exclusive: getName(\"exclusive\"),\n  _false: getName(\"false\"),\n  fixed: getName(\"fixed\"),\n  flex: getName(\"flex\"),\n  flow_root: getName(\"flow-root\"),\n  footnote: getName(\"footnote\"),\n  footer: getName(\"footer\"),\n  grid: getName(\"grid\"),\n  header: getName(\"header\"),\n  hidden: getName(\"hidden\"),\n  horizontal_tb: getName(\"horizontal-tb\"),\n  inherit: getName(\"inherit\"),\n  initial: getName(\"initial\"),\n  inline: getName(\"inline\"),\n  inline_block: getName(\"inline-block\"),\n  inline_end: getName(\"inline-end\"),\n  inline_start: getName(\"inline-start\"),\n  inside: getName(\"inside\"),\n  keep: getName(\"keep\"),\n  landscape: getName(\"landscape\"),\n  left: getName(\"left\"),\n  line: getName(\"line\"),\n  list_item: getName(\"list-item\"),\n  ltr: getName(\"ltr\"),\n  manual: getName(\"manual\"),\n  max_content: getName(\"max-content\"),\n  min_content: getName(\"min-content\"),\n  none: getName(\"none\"),\n  normal: getName(\"normal\"),\n  oeb_page_foot: getName(\"oeb-page-foot\"),\n  oeb_page_head: getName(\"oeb-page-head\"),\n  outside: getName(\"outside\"),\n  padding_box: getName(\"padding-box\"),\n  page: getName(\"page\"),\n  relative: getName(\"relative\"),\n  revert: getName(\"revert\"),\n  right: getName(\"right\"),\n  same: getName(\"same\"),\n  scale: getName(\"scale\"),\n  snap_block: getName(\"snap-block\"),\n  snap_inline: getName(\"snap-inline\"),\n  solid: getName(\"solid\"),\n  spread: getName(\"spread\"),\n  _static: getName(\"static\"),\n  rtl: getName(\"rtl\"),\n  table: getName(\"table\"),\n  table_caption: getName(\"table-caption\"),\n  table_cell: getName(\"table-cell\"),\n  table_footer_group: getName(\"table-footer-group\"),\n  table_header_group: getName(\"table-header-group\"),\n  table_row: getName(\"table-row\"),\n  top: getName(\"top\"),\n  transparent: getName(\"transparent\"),\n  unset: getName(\"unset\"),\n  vertical_lr: getName(\"vertical-lr\"),\n  vertical_rl: getName(\"vertical-rl\"),\n  visible: getName(\"visible\"),\n  _true: getName(\"true\"),\n};\n\nexport const hundredPercent: Numeric = new Numeric(100, \"%\");\n\nexport const fullWidth: Numeric = new Numeric(100, \"pvw\");\n\nexport const fullHeight: Numeric = new Numeric(100, \"pvh\");\n\nexport const numericZero: Numeric = new Numeric(0, \"px\");\n\nexport const fullURange: URange = new URange(\"U+0-10FFFF\");\n\nexport const processingOrder = {\n  \"font-size\": 1,\n  \"line-height\": 2,\n  color: 3,\n};\n\nexport function isDefaultingValue(value: Val): boolean {\n  return (\n    value === ident.inherit ||\n    value === ident.initial ||\n    value === ident.revert ||\n    value === ident.unset\n  );\n}\n\n/**\n * Function to sort property names in the order they should be processed\n */\nexport function processingOrderFn(name1: string, name2: string): number {\n  const n1 = processingOrder[name1] || Number.MAX_VALUE;\n  const n2 = processingOrder[name2] || Number.MAX_VALUE;\n  return n1 - n2;\n}\n\nexport function isCustomPropName(name: string): boolean {\n  return name?.length > 2 && name.startsWith(\"--\");\n}\n","/**\n * Copyright 2025 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/**\n * The Vivliostyle CMYK implementation primarily in this file is not \"true\"\n * CMYK support in the sense that the web browser outputs CMYK, but rather a\n * feature that enables post-processing to replace RGB with CMYK using RGB as\n * a key.\n *\n * This processing leverages the fact that Chromium can transparently reflect\n * `color(srgb ...)` into PDF. Each RGB component has 4 decimal places (the\n * 5th digit is half-up rounded). Specifically, this is based on reading the\n * source code at the following commits.\n *\n * | Repository              | Commit Hash                              |\n * | ----------------------- | ---------------------------------------- |\n * | Chromium                | a2652c6fc5817d5cc643c3935e1363ddc48abb6e |\n * | Skia (third_party/skia) | 3544942c9d424d37d82d756d6dbbbc04327e8dbb |\n *\n * This implementation has several inherent limitations.\n *\n * - The RGB display shown in the browser is merely a key and does not\n *   necessarily reproduce the color appearance after output. Also, it is not\n *   possible to use more than ((10^4)+1)^3 CMYK colors.\n * - Only Chromium is supported. Similar replacement may be possible by\n *   analyzing other web browser implementations, but this is currently\n *   outside the scope of this module.\n * - This implementation is not designed to create PDFs with mixed RGB and\n *   CMYK. If you use this feature, you should specify CMYK colors for all\n *   rendered objects.\n *   There is no way to distinguish between \"colors converted from CMYK to\n *   RGB\" and \"colors originally specified as RGB\" in the post-processing\n *   stage. If these colors collide, the post-processing stage has no choice\n *   but to replace both with CMYK.\n * - Raster images are not handled at all. In the first place, there is no\n *   raster image format (at the time of implementation) that can handle CMYK\n *   and be displayed in a web browser. The possibility of replacement in the\n *   post-processing stage is not ruled out.\n */\n\nimport * as Css from \"./css\";\nimport * as Logging from \"./logging\";\n\nclass SRGBValue {\n  static readonly MAX = 10000;\n\n  readonly #r: number;\n  readonly #g: number;\n  readonly #b: number;\n\n  private constructor(r: number, g: number, b: number) {\n    this.#r = Math.round(Math.max(0, Math.min(r, SRGBValue.MAX)));\n    this.#g = Math.round(Math.max(0, Math.min(g, SRGBValue.MAX)));\n    this.#b = Math.round(Math.max(0, Math.min(b, SRGBValue.MAX)));\n  }\n\n  static fromInt(r: number, g: number, b: number): SRGBValue {\n    return new SRGBValue(r, g, b);\n  }\n\n  offset(dr: number, dg: number, db: number): SRGBValue {\n    return new SRGBValue(this.#r + dr, this.#g + dg, this.#b + db);\n  }\n\n  toKey(): string {\n    return JSON.stringify([this.#r, this.#g, this.#b]);\n  }\n\n  toColorFunc(alpha: number | null): Css.Func {\n    return new Css.Func(\"color\", [\n      new Css.SpaceList([\n        Css.getName(\"srgb\"),\n        new Css.Num(this.#r / SRGBValue.MAX),\n        new Css.Num(this.#g / SRGBValue.MAX),\n        new Css.Num(this.#b / SRGBValue.MAX),\n        ...(alpha !== null ? [Css.slash, new Css.Num(alpha)] : []),\n      ]),\n    ]);\n  }\n}\n\nexport interface CMYKValueJSON {\n  c: number;\n  m: number;\n  y: number;\n  k: number;\n}\nclass CMYKValue {\n  static readonly MAX = 10000;\n\n  readonly #c: number;\n  readonly #m: number;\n  readonly #y: number;\n  readonly #k: number;\n\n  private constructor(c: number, m: number, y: number, k: number) {\n    this.#c = Math.round(Math.max(0, Math.min(c, CMYKValue.MAX)));\n    this.#m = Math.round(Math.max(0, Math.min(m, CMYKValue.MAX)));\n    this.#y = Math.round(Math.max(0, Math.min(y, CMYKValue.MAX)));\n    this.#k = Math.round(Math.max(0, Math.min(k, CMYKValue.MAX)));\n  }\n\n  static fromInt(c: number, m: number, y: number, k: number): CMYKValue {\n    return new CMYKValue(c, m, y, k);\n  }\n\n  static fromNumber(c: number, m: number, y: number, k: number): CMYKValue {\n    return new CMYKValue(\n      c * CMYKValue.MAX,\n      m * CMYKValue.MAX,\n      y * CMYKValue.MAX,\n      k * CMYKValue.MAX,\n    );\n  }\n\n  /**\n   * CSS Color Level 5 naive conversion.\n   * https://www.w3.org/TR/css-color-5/#cmyk-rgb\n   */\n  toSRGB(): SRGBValue {\n    const oneMinusK = CMYKValue.MAX - this.#k;\n    return SRGBValue.fromInt(\n      SRGBValue.MAX -\n        Math.min(\n          SRGBValue.MAX,\n          Math.round((this.#c * oneMinusK) / CMYKValue.MAX) + this.#k,\n        ),\n      SRGBValue.MAX -\n        Math.min(\n          SRGBValue.MAX,\n          Math.round((this.#m * oneMinusK) / CMYKValue.MAX) + this.#k,\n        ),\n      SRGBValue.MAX -\n        Math.min(\n          SRGBValue.MAX,\n          Math.round((this.#y * oneMinusK) / CMYKValue.MAX) + this.#k,\n        ),\n    );\n  }\n\n  equals(other: CMYKValue): boolean {\n    return (\n      this.#c === other.#c &&\n      this.#m === other.#m &&\n      this.#y === other.#y &&\n      this.#k === other.#k\n    );\n  }\n\n  toJSON(): CMYKValueJSON {\n    return { c: this.#c, m: this.#m, y: this.#y, k: this.#k };\n  }\n}\n\nfunction getNumValue(v: Css.Val): number | null {\n  return v instanceof Css.Num\n    ? Math.max(0, Math.min(1, v.num))\n    : v instanceof Css.Numeric && v.unit === \"%\"\n      ? Math.max(0, Math.min(1, v.num / 100))\n      : null;\n}\n\nexport function parseDeviceCmyk(\n  func: Css.Func,\n): { cmyk: CMYKValue; alpha: number | null } | null {\n  if (func.name !== \"device-cmyk\") {\n    return null;\n  }\n\n  const values =\n    // Modern syntax: space-separated values in a single SpaceList\n    func.values.length === 1 && func.values[0]! instanceof Css.SpaceList\n      ? (func.values[0]! as Css.SpaceList).values\n      : // Legacy syntax: comma-separated values directly in func.values\n        func.values;\n  if (values.length < 4 || values.length > 6) {\n    return null;\n  }\n\n  const c = getNumValue(values[0]!);\n  const m = getNumValue(values[1]!);\n  const y = getNumValue(values[2]!);\n  const k = getNumValue(values[3]!);\n  if (c === null || m === null || y === null || k === null) {\n    return null;\n  }\n\n  let alpha: number | null = null;\n  if (values.length >= 5) {\n    if (values[4]! === Css.slash) {\n      // Modern syntax: c m y k / alpha - must have exactly 6 values\n      if (values.length !== 6) {\n        return null;\n      }\n      alpha = getNumValue(values[5]!);\n    } else {\n      // Legacy syntax: c, m, y, k, alpha - must have exactly 5 values\n      if (values.length !== 5) {\n        return null;\n      }\n      alpha = getNumValue(values[4]!);\n    }\n    if (alpha === null) {\n      return null;\n    }\n  }\n\n  return { cmyk: CMYKValue.fromNumber(c, m, y, k), alpha };\n}\n\nfunction* getOffsets(distance: number): Generator<[number, number, number]> {\n  for (let r = -distance; r <= distance; r++) {\n    for (let g = -distance; g <= distance; g++) {\n      for (let b = -distance; b <= distance; b++) {\n        if (Math.abs(r) + Math.abs(g) + Math.abs(b) === distance) {\n          yield [r, g, b];\n        }\n      }\n    }\n  }\n}\n\nexport class CmykStore {\n  #map = new Map<string, CMYKValue>();\n\n  registerDeviceCmyk(func: Css.Func): Css.Func | null {\n    const result = parseDeviceCmyk(func);\n    if (!result) {\n      return null;\n    }\n    const srgb = this.#register(result.cmyk);\n    return srgb.toColorFunc(result.alpha);\n  }\n\n  #register(cmyk: CMYKValue): SRGBValue {\n    const srgb = cmyk.toSRGB();\n    const key = srgb.toKey();\n    const existing = this.#map.get(key);\n    if (existing) {\n      return existing.equals(cmyk) ? srgb : this.#findAvailableSlot(cmyk, srgb);\n    }\n    this.#map.set(key, cmyk);\n    return srgb;\n  }\n\n  toJSON(): Record<string, CMYKValueJSON> {\n    const result: Record<string, CMYKValueJSON> = {};\n    this.#map.forEach((value, key) => {\n      result[key] = value.toJSON();\n    });\n    return result;\n  }\n\n  #findAvailableSlot(cmyk: CMYKValue, baseSrgb: SRGBValue): SRGBValue {\n    for (let distance = 1; distance <= SRGBValue.MAX; distance++) {\n      for (const [dr, dg, db] of getOffsets(distance)) {\n        const candidate = baseSrgb.offset(dr, dg, db);\n        const key = candidate.toKey();\n        if (!this.#map.has(key)) {\n          this.#map.set(key, cmyk);\n          return candidate;\n        }\n      }\n    }\n\n    Logging.logger.warn(\n      `CmykStore: Exceeded trackable color limit for ${JSON.stringify(cmyk.toJSON())}`,\n    );\n    return baseSrgb;\n  }\n}\n\nexport class CmykFilterVisitor extends Css.FilterVisitor {\n  readonly #store: CmykStore;\n  readonly #conversions = new Map<string, string>();\n  #hasDeviceCmyk: boolean = false;\n\n  constructor(store?: CmykStore) {\n    super();\n    this.#store = store ?? new CmykStore();\n  }\n\n  reset(): void {\n    this.#hasDeviceCmyk = false;\n  }\n  hadDeviceCmyk(): boolean {\n    return this.#hasDeviceCmyk;\n  }\n\n  recordConversion(propertyName: string, originalValue: string): void {\n    this.#conversions.set(propertyName, originalValue);\n  }\n  getConversions(): Record<string, string> | null {\n    if (this.#conversions.size === 0) {\n      return null;\n    }\n    const result: Record<string, string> = {};\n    this.#conversions.forEach((value, key) => {\n      result[key] = value;\n    });\n    return result;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    const result = this.#store.registerDeviceCmyk(func);\n    if (result) {\n      this.#hasDeviceCmyk = true;\n      return result;\n    }\n    return super.visitFunc(func);\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview GeometryUtil - Geometric utilities.\n */\nimport * as Logging from \"./logging\";\n\nexport class Rect {\n  constructor(\n    public x1: number,\n    public y1: number,\n    public x2: number,\n    public y2: number,\n  ) {}\n}\n\nexport class Point {\n  constructor(\n    public x: number,\n    public y: number,\n  ) {}\n}\n\nexport class Insets {\n  constructor(\n    public left: number,\n    public top: number,\n    public right: number,\n    public bottom: number,\n  ) {}\n}\n\nexport class Segment {\n  constructor(\n    public low: Point,\n    public high: Point,\n    public winding: number,\n    public shapeId: number,\n  ) {}\n}\n\n/**\n * A single band for exclusion result. Left float is from the left box edge\n * to x1. Right float is from x2 to the right box edge.\n */\nexport class Band {\n  /** Left float. */\n  left: Element | null = null;\n\n  /** Right float. */\n  right: Element | null = null;\n\n  constructor(\n    public y1: number,\n    public y2: number,\n    public x1: number,\n    public x2: number,\n  ) {}\n}\n\nexport function segmentCompare(s1: Segment, s2: Segment): number {\n  return s1.low.y - s2.low.y || s1.low.x - s2.low.x;\n}\n\nexport class Shape {\n  constructor(public points: Point[]) {}\n\n  /**\n   * Converts this shape to a sequence of Segments and adds segments to the\n   * given array.\n   * @param arr array to add segments.\n   * @param id shapeId to write into segments.\n   */\n  addSegments(arr: Segment[], id: number): void {\n    const points = this.points;\n    const length = points.length;\n    let prev = points[length - 1];\n    for (let i = 0; i < length; i++) {\n      const curr = points[i];\n      let s: Segment;\n      if (prev.y < curr.y) {\n        s = new Segment(prev, curr, 1, id);\n      } else {\n        s = new Segment(curr, prev, -1, id);\n      }\n      arr.push(s);\n      prev = curr;\n    }\n  }\n\n  withOffset(offsetX: number, offsetY: number): Shape {\n    const points = [];\n    for (const p of this.points) {\n      points.push(new Point(p.x + offsetX, p.y + offsetY));\n    }\n    return new Shape(points);\n  }\n}\n\nexport function shapeForEllipse(\n  cx: number,\n  cy: number,\n  rx: number,\n  ry: number,\n): Shape {\n  const count = 20;\n  const points: Point[] = [];\n  for (let i = 0; i < count; i++) {\n    const a = (i * 2 * Math.PI) / count;\n    points.push(new Point(cx + rx * Math.sin(a), cy + ry * Math.cos(a)));\n  }\n  return new Shape(points);\n}\n\nexport function shapeForRect(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n): Shape {\n  return new Shape([\n    new Point(x1, y1),\n    new Point(x2, y1),\n    new Point(x2, y2),\n    new Point(x1, y2),\n  ]);\n}\n\nexport function shapeForRectObj(r: Rect): Shape {\n  return new Shape([\n    new Point(r.x1, r.y1),\n    new Point(r.x2, r.y1),\n    new Point(r.x2, r.y2),\n    new Point(r.x1, r.y2),\n  ]);\n}\n\nexport class BandIntersection {\n  constructor(\n    public x: number,\n    public winding: number,\n    public shapeId: number,\n    public lowOrHigh: number,\n  ) {}\n}\n\nexport function intersectY(s: Segment, y: number): number {\n  const x =\n    s.low.x + ((s.high.x - s.low.x) * (y - s.low.y)) / (s.high.y - s.low.y);\n  if (isNaN(x)) {\n    throw new Error(\"Bad intersection\");\n  }\n  return x;\n}\n\nexport function addBandIntersections(\n  intersections: BandIntersection[],\n  s: Segment,\n  y1: number,\n  y2: number,\n): void {\n  let x1: number;\n  let w1: number;\n  let x2: number;\n  let w2: number;\n  if (s.high.y < y1) {\n    Logging.logger.warn(\"Error: inconsistent segment (1)\");\n  }\n  if (s.low.y <= y1) {\n    // outside\n    x1 = intersectY(s, y1);\n    w1 = s.winding;\n  } else {\n    x1 = s.low.x;\n    w1 = 0;\n  }\n  if (s.high.y >= y2) {\n    // outside\n    x2 = intersectY(s, y2);\n    w2 = s.winding;\n  } else {\n    x2 = s.high.x;\n    w2 = 0;\n  }\n  if (x1 < x2) {\n    intersections.push(new BandIntersection(x1, w1, s.shapeId, -1));\n    intersections.push(new BandIntersection(x2, w2, s.shapeId, 1));\n  } else {\n    intersections.push(new BandIntersection(x2, w2, s.shapeId, -1));\n    intersections.push(new BandIntersection(x1, w1, s.shapeId, 1));\n  }\n}\n\nexport function mergeIntersections(\n  intersections: BandIntersection[],\n  includeCount: number,\n  excludeCount: number,\n): number[] {\n  const shapeCount = includeCount + excludeCount;\n  const windings1: number[] = Array(shapeCount);\n  const windings2: number[] = Array(shapeCount);\n  let i: number;\n  for (i = 0; i <= shapeCount; i++) {\n    windings1[i] = 0;\n    windings2[i] = 0;\n  }\n  const xranges: number[] = [];\n  let inside: boolean = false;\n  const intersectionCount = intersections.length;\n  for (let k = 0; k < intersectionCount; k++) {\n    const intersection = intersections[k];\n    windings1[intersection.shapeId] += intersection.winding;\n    windings2[intersection.shapeId] += intersection.lowOrHigh;\n    let stillInside = false;\n    for (i = 0; i < includeCount; i++) {\n      if (windings1[i] && !windings2[i]) {\n        stillInside = true;\n        break;\n      }\n    }\n    if (stillInside) {\n      for (i = includeCount; i <= shapeCount; i++) {\n        if (windings1[i] || windings2[i]) {\n          stillInside = false;\n          break;\n        }\n      }\n    }\n    if (inside != stillInside) {\n      xranges.push(intersection.x);\n      inside = stillInside;\n    }\n  }\n  return xranges;\n}\n\n/**\n * Round v up to make it a multiple of unit. If unit is zero, return v.\n */\nexport function ceil(v: number, unit: number): number {\n  return unit ? Math.ceil(v / unit) * unit : v;\n}\n\n/**\n * Round v down to make it a multiple of unit. If unit is zero, return v.\n */\nexport function floor(v: number, unit: number): number {\n  return unit ? Math.floor(v / unit) * unit : v;\n}\n\nexport function rotatePoint(point: Point): Point {\n  return new Point(point.y, -point.x);\n}\n\n/**\n * Vertical box to pseudo-horizontal coords.\n */\nexport function rotateBox(box: Rect): Rect {\n  return new Rect(box.y1, -box.x2, box.y2, -box.x1);\n}\n\n/**\n * Pseudo-horizontal coords to vertical.\n */\nexport function unrotateBox(box: Rect): Rect {\n  return new Rect(-box.y2, box.x1, -box.y1, box.x2);\n}\n\nexport function rotateShape(shape: Shape): Shape {\n  return new Shape(shape.points.map((point) => rotatePoint(point)));\n}\n\nexport function shapesToBands(\n  box: Rect,\n  include: Shape[],\n  exclude: Shape[],\n  granularity: number,\n  snapHeight: number,\n  vertical: boolean,\n): Band[] {\n  if (vertical) {\n    box = rotateBox(box);\n    include = include.map((shape) => rotateShape(shape));\n    exclude = exclude.map((shape) => rotateShape(shape));\n  }\n  const includeCount = include.length;\n  const excludeCount = exclude ? exclude.length : 0;\n  const result: Band[] = [];\n  const segments: Segment[] = [];\n  let i: number;\n  let k: number;\n  let segment: Segment;\n  for (i = 0; i < includeCount; i++) {\n    include[i].addSegments(segments, i);\n  }\n  for (i = 0; i < excludeCount; i++) {\n    exclude[i].addSegments(segments, i + includeCount);\n  }\n  const segmentCount = segments.length;\n  segments.sort(segmentCompare);\n  let lowestIncludeIndex = 0;\n  while (segments[lowestIncludeIndex].shapeId >= includeCount) {\n    lowestIncludeIndex++;\n  }\n  let y = segments[lowestIncludeIndex].low.y;\n  if (y > box.y1) {\n    result.push(new Band(box.y1, y, box.x2, box.x2));\n  }\n  let segmentIndex = 0;\n  const activeSegments: Segment[] = [];\n  while (\n    segmentIndex < segmentCount &&\n    (segment = segments[segmentIndex]).low.y < y\n  ) {\n    if (segment.high.y > y) {\n      activeSegments.push(segment);\n    }\n    segmentIndex++;\n  }\n\n  // process the segments from low to high y values\n  while (segmentIndex < segmentCount || activeSegments.length > 0) {\n    // calculate the height of the band to work with\n    let y2 = box.y2; // band bottom\n    // min possible y2\n    const y2min = Math.min(\n      ceil(Math.ceil(y + granularity), snapHeight),\n      box.y2,\n    );\n    for (k = 0; k < activeSegments.length && y2 > y2min; k++) {\n      segment = activeSegments[k];\n      if (segment.low.x == segment.high.x) {\n        // vertical\n        if (segment.high.y < y2) {\n          y2 = Math.max(floor(segment.high.y, snapHeight), y2min);\n        }\n      } else if (segment.low.x != segment.high.x) {\n        // TODO: should we compare y???\n        // slanted (not horizontal)\n        y2 = y2min;\n      }\n    }\n    if (y2 > box.y2) {\n      y2 = box.y2;\n    }\n\n    // include new segments, decreasing y2 if needed\n    while (\n      segmentIndex < segmentCount &&\n      (segment = segments[segmentIndex]).low.y < y2\n    ) {\n      if (segment.high.y < y) {\n        segmentIndex++;\n        continue;\n      }\n      if (segment.low.y < y2min) {\n        if (segment.low.y == segment.high.y && segment.low.y == y) {\n          // Horizontal segment that goes right at y is not active,\n          // but consume it anyway\n        } else {\n          activeSegments.push(segment);\n          y2 = y2min;\n        }\n        segmentIndex++;\n      } else {\n        // Do not consume it, consider bottom edge \"outside\"\n        const yn = floor(segment.low.y, snapHeight);\n        if (yn < y2) {\n          y2 = yn;\n        }\n        break;\n      }\n    }\n\n    // now look at the band with top at y and bottom at y2\n    // activeSegments should list all segments that intersect that band\n\n    // find all intersections with the band\n    const bandIntersections: BandIntersection[] = [];\n    for (k = 0; k < activeSegments.length; k++) {\n      addBandIntersections(bandIntersections, activeSegments[k], y, y2);\n    }\n    bandIntersections.sort(\n      (bi1, bi2) => bi1.x - bi2.x || bi1.lowOrHigh - bi2.lowOrHigh,\n    );\n    const xranges = mergeIntersections(\n      bandIntersections,\n      includeCount,\n      excludeCount,\n    );\n    if (xranges.length == 0) {\n      result.push(new Band(y, y2, box.x2, box.x2));\n    } else {\n      // get the widest\n      let width = 0;\n      let x = box.x1;\n      for (k = 0; k < xranges.length; k += 2) {\n        const rx = Math.max(box.x1, xranges[k]);\n        const rw = Math.min(box.x2, xranges[k + 1]) - rx;\n        if (rw > width) {\n          width = rw;\n          x = rx;\n        }\n      }\n      if (width == 0) {\n        // no space left\n        result.push(new Band(y, y2, box.x2, box.x2));\n      } else {\n        result.push(\n          new Band(y, y2, Math.max(x, box.x1), Math.min(x + width, box.x2)),\n        );\n      }\n    }\n    if (y2 == box.y2) {\n      break;\n    }\n    y = y2;\n    for (k = activeSegments.length - 1; k >= 0; k--) {\n      if (activeSegments[k].high.y <= y2) {\n        activeSegments.splice(k, 1);\n      }\n    }\n  }\n  normalize(box, result);\n  return result;\n}\n\nexport function normalize(box: Rect, bands: Band[]): void {\n  let k = bands.length - 1;\n\n  // Merge bands with the same x1, x2 and remove unneeded bands at the end.\n  // Create fictious last band to merge unneeded bands at the end\n  let currBand = new Band(box.y2, box.y2, box.x1, box.x2);\n  while (k >= 0) {\n    const prevBand = currBand; // result[k+1]\n    currBand = bands[k];\n    if (\n      currBand.y2 - currBand.y1 < 1 || // Remove bands with height less than 1px\n      (currBand.x1 == prevBand.x1 && currBand.x2 == prevBand.x2)\n    ) {\n      prevBand.y1 = currBand.y1; // merge\n      bands.splice(k, 1);\n      currBand = prevBand;\n    }\n    k--;\n  }\n}\n\n/**\n * Find the index of the bottommost band so that y < band.y2\n */\nexport function findBand(bands: Band[], y: number): number {\n  let low = 0;\n  let high = bands.length;\n  while (low < high) {\n    const mid = Math.floor((low + high) / 2);\n    if (y >= bands[mid].y2) {\n      low = mid + 1;\n    } else {\n      high = mid;\n    }\n  }\n  return low;\n}\n\n/**\n * Find the uppermost rectangle contained in the specified rect which occupies\n * full width of the rect without overlapping with any band in the specified\n * bands.\n * @returns Returns null if such rectangle does not exist.\n */\nexport function findUppermostFullyOpenRect(\n  bands: Band[],\n  rect: Rect,\n): Rect | null {\n  if (!bands.length) {\n    return rect;\n  }\n  let topEdge = rect.y1;\n  let band: Band;\n  let i: number;\n  for (i = 0; i < bands.length; i++) {\n    band = bands[i];\n    if (\n      band.y2 > rect.y1 &&\n      band.x1 - 0.1 <= rect.x1 &&\n      band.x2 + 0.1 >= rect.x2\n    ) {\n      break;\n    } else {\n      topEdge = Math.max(topEdge, band.y2);\n    }\n  }\n  let bottomEdge = topEdge;\n  for (; i < bands.length; i++) {\n    band = bands[i];\n    if (\n      band.y1 >= rect.y2 ||\n      band.x1 - 0.1 > rect.x1 ||\n      band.x2 + 0.1 < rect.x2\n    ) {\n      break;\n    } else {\n      bottomEdge = band.y2;\n    }\n  }\n  if (i === bands.length) {\n    bottomEdge = rect.y2;\n  } else {\n    bottomEdge = Math.min(bottomEdge, rect.y2);\n  }\n  if (bottomEdge <= topEdge) {\n    return null;\n  } else {\n    return new Rect(rect.x1, topEdge, rect.x2, bottomEdge);\n  }\n}\n\n/**\n * Find the bottommost rectangle contained in the specified rect which occupies\n * full width of the rect without overlapping with any band in the specified\n * bands.\n * @returns Returns null if such rectangle does not exist.\n */\nexport function findBottommostFullyOpenRect(\n  bands: Band[],\n  rect: Rect,\n): Rect | null {\n  if (!bands.length) {\n    return rect;\n  }\n  let bottomEdge = rect.y2;\n  let band: Band;\n  let i: number;\n  for (i = bands.length - 1; i >= 0; i--) {\n    band = bands[i];\n    if (i === bands.length - 1 && band.y2 < rect.y2) {\n      break;\n    } else if (\n      band.y1 < rect.y2 &&\n      band.x1 - 0.1 <= rect.x1 &&\n      band.x2 + 0.1 >= rect.x2\n    ) {\n      break;\n    } else {\n      bottomEdge = Math.min(bottomEdge, band.y1);\n    }\n  }\n  let topEdge = Math.min(bottomEdge, band.y2);\n  for (; i >= 0; i--) {\n    band = bands[i];\n    if (\n      band.y2 <= rect.y1 ||\n      band.x1 - 0.1 > rect.x1 ||\n      band.x2 + 0.1 < rect.x2\n    ) {\n      break;\n    } else {\n      topEdge = band.y1;\n    }\n  }\n  topEdge = Math.max(topEdge, rect.y1);\n  if (bottomEdge <= topEdge) {\n    return null;\n  } else {\n    return new Rect(rect.x1, topEdge, rect.x2, bottomEdge);\n  }\n}\n\n/**\n * @param side either \"left\" or \"right\"\n */\nexport function positionFloat(\n  box: Rect,\n  bands: Band[],\n  floatBox: Rect,\n  side: string,\n): boolean {\n  let y = floatBox.y1;\n  const floatWidth = floatBox.x2 - floatBox.x1;\n  const floatHeight = floatBox.y2 - floatBox.y1;\n  let index = findBand(bands, y);\n  while (true) {\n    // Check if it fits\n    const floatBottom = y + floatHeight;\n    if (floatBottom > box.y2) {\n      return false;\n    }\n\n    // does not fit vertically\n    let x1 = box.x1;\n    let x2 = box.x2;\n    for (let i = index; i < bands.length && bands[i].y1 < floatBottom; i++) {\n      const band = bands[i];\n      if (band.x1 > x1) {\n        x1 = band.x1;\n      }\n      if (band.x2 < x2) {\n        x2 = band.x2;\n      }\n    }\n    if (x1 + floatWidth <= x2 || index >= bands.length) {\n      if (side == \"left\") {\n        floatBox.x1 = x1;\n        floatBox.x2 = x1 + floatWidth;\n      } else {\n        floatBox.x1 = x2 - floatWidth;\n        floatBox.x2 = x2;\n      }\n      floatBox.y2 += y - floatBox.y1;\n      floatBox.y1 = y;\n      return true;\n    }\n    y = bands[index].y2;\n    index++;\n  }\n}\n\nexport function addFloatToBands(\n  box: Rect,\n  bands: Band[],\n  floatBox: Rect,\n  floatBands: Band[],\n  side: string,\n): void {\n  if (!floatBands) {\n    floatBands = [new Band(floatBox.y1, floatBox.y2, floatBox.x1, floatBox.x2)];\n  }\n  while (floatBands.length > 0 && floatBands[0].y2 <= box.y1) {\n    floatBands.shift();\n  }\n  if (floatBands.length == 0) {\n    return;\n  }\n  if (floatBands[0].y1 < box.y1) {\n    floatBands[0].y1 = box.y1;\n  }\n  let band: Band;\n  const lastY = bands.length == 0 ? box.y1 : bands[bands.length - 1].y2;\n  if (lastY < box.y2) {\n    // add the tail band that we typically don't keep, it will be cleared by\n    // normalize()\n    bands.push(new Band(lastY, box.y2, box.x1, box.x2));\n  }\n  let index = findBand(bands, floatBands[0].y1);\n  for (const floatBand of floatBands) {\n    if (index == bands.length) {\n      break;\n    }\n    if (bands[index].y1 < floatBand.y1) {\n      // split it\n      band = bands[index];\n      index++;\n      bands.splice(index, 0, new Band(floatBand.y1, band.y2, band.x1, band.x2));\n      band.y2 = floatBand.y1;\n    }\n    while (index < bands.length) {\n      band = bands[index++];\n      if (band.y2 > floatBand.y2) {\n        // split it\n        bands.splice(\n          index,\n          0,\n          new Band(floatBand.y2, band.y2, band.x1, band.x2),\n        );\n        band.y2 = floatBand.y2;\n      }\n      if (floatBand.x1 != floatBand.x2) {\n        // non-empty floatBand\n        if (side == \"left\") {\n          band.x1 = Math.min(floatBand.x2, box.x2);\n        } else {\n          band.x2 = Math.max(floatBand.x1, box.x1);\n        }\n      }\n      if (band.y2 == floatBand.y2) {\n        break;\n      }\n    }\n  }\n  normalize(box, bands);\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssProp - Support utilities to extract information\n * from various (parsed) CSS values.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as Exprs from \"./exprs\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Logging from \"./logging\";\n\n//---------------------- value parsers ----------------------------------\nexport class SetVisitor extends Css.Visitor {\n  propSet: { [key: string]: boolean } = {};\n\n  constructor() {\n    super();\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    this.propSet[ident.name] = true;\n    return ident;\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    this.visitValues(list.values);\n    return list;\n  }\n}\n\nexport function toSet(val: Css.Val): { [key: string]: boolean } {\n  if (val) {\n    const visitor = new SetVisitor();\n    try {\n      val.visit(visitor);\n      return visitor.propSet;\n    } catch (err) {\n      Logging.logger.warn(err, \"toSet:\");\n    }\n  }\n  return {};\n}\n\nexport class IntVisitor extends Css.Visitor {\n  constructor(public value: number) {\n    super();\n  }\n\n  override visitInt(num: Css.Int): Css.Val {\n    this.value = num.num;\n    return num;\n  }\n}\n\nexport function toInt(val: Css.Val, def: number): number {\n  if (val) {\n    const visitor = new IntVisitor(def);\n    try {\n      val.visit(visitor);\n      return visitor.value;\n    } catch (err) {\n      Logging.logger.warn(err, \"toInt: \");\n    }\n  }\n  return def;\n}\n\nexport class ShapeVisitor extends Css.Visitor {\n  collect: boolean = false;\n  coords: Css.Numeric[] = [];\n  name: string | null = null;\n\n  constructor() {\n    super();\n  }\n\n  override visitNumeric(numeric: Css.Numeric): Css.Val {\n    if (this.collect) {\n      this.coords.push(numeric);\n    }\n    return null;\n  }\n\n  override visitNum(num: Css.Num): Css.Val {\n    if (this.collect && num.num == 0) {\n      this.coords.push(new Css.Numeric(0, \"px\"));\n    }\n    return null;\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    this.visitValues(list.values);\n    return null;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    if (!this.collect) {\n      this.collect = true;\n      this.visitValues(func.values);\n      this.collect = false;\n      this.name = func.name.toLowerCase();\n    }\n    return null;\n  }\n\n  getShape(\n    x: number,\n    y: number,\n    width: number,\n    height: number,\n    context: Exprs.Context,\n  ): GeometryUtil.Shape {\n    if (this.coords.length > 0) {\n      const numbers: number[] = [];\n      this.coords.forEach((coord, i) => {\n        if (coord.unit == \"%\") {\n          let ref = i % 2 == 0 ? width : height;\n          if (i == 3 && this.name == \"circle\") {\n            ref = Math.sqrt((width * width + height * height) / 2);\n          }\n          numbers.push((coord.num * ref) / 100);\n        } else {\n          numbers.push(coord.num * context.queryUnitSize(coord.unit, false));\n        }\n      });\n      switch (this.name) {\n        case \"polygon\":\n          if (numbers.length % 2 == 0) {\n            const points: GeometryUtil.Point[] = [];\n            for (let k = 0; k < numbers.length; k += 2) {\n              points.push(\n                new GeometryUtil.Point(x + numbers[k], y + numbers[k + 1]),\n              );\n            }\n            return new GeometryUtil.Shape(points);\n          }\n          break;\n        case \"rectangle\":\n          if (numbers.length == 4) {\n            return GeometryUtil.shapeForRect(\n              x + numbers[0],\n              y + numbers[1],\n              x + numbers[0] + numbers[2],\n              y + numbers[1] + numbers[3],\n            );\n          }\n          break;\n        case \"ellipse\":\n          if (numbers.length == 4) {\n            return GeometryUtil.shapeForEllipse(\n              x + numbers[0],\n              y + numbers[1],\n              numbers[2],\n              numbers[3],\n            );\n          }\n          break;\n        case \"circle\":\n          if (numbers.length == 3) {\n            return GeometryUtil.shapeForEllipse(\n              x + numbers[0],\n              y + numbers[1],\n              numbers[2],\n              numbers[2],\n            );\n          }\n          break;\n      }\n    }\n    return null;\n  }\n}\n\nexport function toShape(\n  val: Css.Val,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  context: Exprs.Context,\n): GeometryUtil.Shape {\n  if (val) {\n    const visitor = new ShapeVisitor();\n    try {\n      val.visit(visitor);\n      return visitor.getShape(x, y, width, height, context);\n    } catch (err) {\n      Logging.logger.warn(err, \"toShape:\");\n    }\n  }\n  return GeometryUtil.shapeForRect(x, y, x + width, y + height);\n}\n\nexport class CountersVisitor extends Css.Visitor {\n  counters: { [key: string]: number } = {};\n  name: string | null = null;\n\n  constructor(public readonly reset: boolean) {\n    super();\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    this.name = ident.toString();\n    if (this.reset) {\n      this.counters[this.name] = 0;\n    } else {\n      this.counters[this.name] = (this.counters[this.name] || 0) + 1;\n    }\n    return ident;\n  }\n\n  override visitInt(num: Css.Int): Css.Val {\n    if (this.name) {\n      this.counters[this.name] += num.num - (this.reset ? 0 : 1);\n    }\n    return num;\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    this.visitValues(list.values);\n    return list;\n  }\n}\n\nexport function toCounters(\n  val: Css.Val,\n  reset: boolean,\n): { [key: string]: number } {\n  const visitor = new CountersVisitor(reset);\n  try {\n    val.visit(visitor);\n  } catch (err) {\n    Logging.logger.warn(err, \"toCounters:\");\n  }\n  return visitor.counters;\n}\n\nexport class UrlTransformVisitor extends Css.FilterVisitor {\n  constructor(\n    public baseUrl: string,\n    public transformer: Base.DocumentURLTransformer,\n  ) {\n    super();\n  }\n\n  override visitURL(url: Css.URL): Css.Val {\n    return new Css.URL(this.transformer.transformURL(url.url, this.baseUrl));\n  }\n}\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Counters, named strings, and running elements\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Exprs from \"./exprs\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport { Layout } from \"./types\";\n\n/**\n * Clone counter values.\n */\nfunction cloneCounterValues(\n  counters: CssCascade.CounterValues,\n): CssCascade.CounterValues {\n  const result = {};\n  Object.keys(counters).forEach((name) => {\n    result[name] = Array.from(counters[name]);\n  });\n  return result;\n}\n\n/**\n * Extract text content from an element for a specific pseudo-element.\n * @param element The DOM element to extract text from\n * @param pseudoElement The pseudo-element type: \"content\", \"before\", \"after\" or \"marker\"\n * @returns The extracted text, or empty string if not found\n */\nfunction extractPseudoElementText(\n  element: Element,\n  pseudoElement: \"content\" | \"before\" | \"after\" | \"marker\",\n): string {\n  if (pseudoElement === \"content\") {\n    // Get main content (excluding ::before and ::after)\n    const clone = element.cloneNode(true) as Element;\n    const pseudos = clone.querySelectorAll(\"[data-adapt-pseudo]\");\n    pseudos.forEach((pseudo) => pseudo.remove());\n    return clone.textContent || \"\";\n  } else {\n    // Extract ::before or ::after content\n    const pseudoElem = element.querySelector(\n      `[data-adapt-pseudo=\"${pseudoElement}\"]`,\n    );\n    return pseudoElem ? pseudoElem.textContent || \"\" : \"\";\n  }\n}\n\n/**\n * Class representing a reference by target-counter(s).\n * @param targetId ID of the referenced element (transformed by\n *     DocumentURLTransformer to handle a reference across multiple source\n *     documents)\n * @param resolved If the reference is already resolved or not\n */\nexport class TargetCounterReference {\n  pageCounters: CssCascade.CounterValues = null;\n  spineIndex: number = -1;\n  pageIndex: number = -1;\n\n  constructor(\n    public readonly targetId: string,\n    public resolved: boolean,\n  ) {}\n\n  equals(other: TargetCounterReference): boolean {\n    if (this === other) {\n      return true;\n    }\n    if (!other) {\n      return false;\n    }\n    return (\n      this.targetId === other.targetId &&\n      this.resolved === other.resolved &&\n      this.spineIndex === other.spineIndex &&\n      this.pageIndex === other.pageIndex\n    );\n  }\n\n  /**\n   * Returns if the reference is resolved or not.\n   */\n  isResolved(): boolean {\n    return this.resolved;\n  }\n\n  /**\n   * Marks that this reference is resolved.\n   */\n  resolve() {\n    this.resolved = true;\n  }\n\n  /**\n   * Marks that this reference is unresolved.\n   */\n  unresolve() {\n    this.resolved = false;\n  }\n}\n\nclass CounterListener implements CssCascade.CounterListener {\n  constructor(\n    public readonly counterStore: CounterStore,\n    public readonly baseURL: string,\n  ) {}\n\n  /** @override */\n  countersOfId(id: string, counters: CssCascade.CounterValues) {\n    id = this.counterStore.documentURLTransformer.transformFragment(\n      id,\n      this.baseURL,\n    );\n    this.counterStore.countersById[id] = counters;\n  }\n\n  getExprContentListener(): Vtree.ExprContentListener {\n    return this.counterStore.getExprContentListener();\n  }\n}\n\n/**\n * Map for named string name, element offset, and the string value\n */\ntype NamedRunningValues = {\n  [name: string]: { [elementOffset: number]: string };\n};\n\nclass CounterResolver implements CssCascade.CounterResolver {\n  styler: CssStyler.Styler | null = null;\n  namedStringValues: NamedRunningValues = {};\n  runningElements: NamedRunningValues = {};\n\n  constructor(\n    public readonly counterStore: CounterStore,\n    public readonly baseURL: string,\n    public readonly rootScope: Exprs.LexicalScope,\n    public readonly pageScope: Exprs.LexicalScope,\n  ) {}\n\n  setStyler(styler: CssStyler.Styler): void {\n    this.styler = styler;\n  }\n\n  private getFragment(url: string): string | null {\n    const r = url.match(/^[^#]*#(.*)$/);\n    return r ? r[1] : null;\n  }\n\n  private getTransformedId(url: string): string {\n    let transformedId = this.counterStore.documentURLTransformer.transformURL(\n      Base.resolveURL(url, this.baseURL),\n      this.baseURL,\n    );\n    if (transformedId.charAt(0) === \"#\") {\n      transformedId = transformedId.substring(1);\n    }\n    return transformedId;\n  }\n\n  /** @override */\n  getPageCounterVal(\n    name: string,\n    format: (p1: number | null) => string,\n  ): Exprs.Val {\n    const getCounterNumber = () => {\n      const values = this.counterStore.currentPageCounters[name];\n      return values && values.length ? values[values.length - 1] : null;\n    };\n\n    const expr = new Exprs.Native(\n      this.pageScope,\n      () => format(getCounterNumber()),\n      `page-counter-${name}`,\n    );\n\n    const arrayFormat = (arr: number[]) => {\n      return format(arr[arr.length - 1]);\n    };\n\n    this.counterStore.registerPageCounterExpr(name, arrayFormat, expr);\n    return expr;\n  }\n\n  /** @override */\n  getPageCountersVal(\n    name: string,\n    format: (p1: number[]) => string,\n  ): Exprs.Val {\n    const getCounterNumbers = () => {\n      return this.counterStore.currentPageCounters[name] || [];\n    };\n\n    const expr = new Exprs.Native(\n      this.pageScope,\n      () => format(getCounterNumbers()),\n      `page-counters-${name}`,\n    );\n    this.counterStore.registerPageCounterExpr(name, format, expr);\n    return expr;\n  }\n\n  /**\n   * Returns (non page-based) counter values for an element with the specified\n   * ID. Returns null if the style of the elements has not been calculated yet\n   * (i.e. the element does not exit or it is in a source document which is not\n   * loaded yet).\n   * @param id Original ID value\n   * @param transformedId ID transformed by DocumentURLTransformer to handle a\n   *     reference across multiple source documents\n   * @param lookForElement If true, look ahead for an element with the ID in the\n   *     current source document when such an element has not appeared yet. Do\n   *     not set to true during Styler.styleUntil is being called, since in that\n   *     case Styler.styleUntil can be called again and may lead to internal\n   *     inconsistency.\n   */\n  private getTargetCounters(\n    id: string | null,\n    transformedId: string,\n    lookForElement: boolean,\n  ): CssCascade.CounterValues | null {\n    let targetCounters = this.counterStore.countersById[transformedId];\n    if (!targetCounters && lookForElement && id) {\n      this.styler.styleUntilIdIsReached(id);\n      targetCounters = this.counterStore.countersById[transformedId];\n    }\n    return targetCounters || null;\n  }\n\n  /**\n   * Returns page-based counter values for an element with the specified ID.\n   * Returns null if the element has not been laid out yet.\n   * @param transformedId ID transformed by DocumentURLTransformer to handle a\n   *     reference across multiple source documents\n   */\n  private getTargetPageCounters(\n    transformedId: string,\n  ): CssCascade.CounterValues | null {\n    if (this.counterStore.currentPage.elementsById[transformedId]) {\n      return this.counterStore.currentPageCounters;\n    } else {\n      return this.counterStore.pageCountersById[transformedId] || null;\n    }\n  }\n\n  /**\n   * Returns page-based text content for an element with the specified ID.\n   * Returns null if the element has not been laid out yet.\n   * @param transformedId ID transformed by DocumentURLTransformer to handle a\n   *     reference across multiple source documents\n   * @param pseudoElement Pseudo-element to extract text from (content, before, after, first-letter, marker)\n   */\n  private getTargetPageText(\n    transformedId: string,\n    pseudoElement: string,\n  ): string | null {\n    if (this.counterStore.currentPage.elementsById[transformedId]) {\n      // Element is on current page - extract text for specific pseudo-element\n      const elements =\n        this.counterStore.currentPage.elementsById[transformedId];\n      if (elements && elements.length > 0) {\n        const element = elements[0];\n\n        if (\n          pseudoElement === \"before\" ||\n          pseudoElement === \"after\" ||\n          pseudoElement === \"marker\"\n        ) {\n          return extractPseudoElementText(element, pseudoElement);\n        }\n        // For content and other pseudo-elements, fall back to content (excluding ::before and ::after)\n        return extractPseudoElementText(element, \"content\");\n      }\n      return \"\";\n    } else {\n      // Check if the ID exists in pageTextById\n      // Need to distinguish between \"not yet laid out\" (undefined) and \"empty text\" (\"\")\n      if (transformedId in this.counterStore.pageTextById) {\n        const textMap = this.counterStore.pageTextById[transformedId];\n        return textMap[pseudoElement] !== undefined\n          ? textMap[pseudoElement]\n          : textMap[\"content\"] || \"\";\n      }\n      return null;\n    }\n  }\n\n  /** @override */\n  getTargetCounterVal(\n    url: string,\n    name: string,\n    format: (p1: number | null) => string,\n  ): Exprs.Val {\n    const id = this.getFragment(url);\n    const transformedId = this.getTransformedId(url);\n\n    // Since this method is executed during Styler.styleUntil is being called,\n    // set false to lookForElement argument.\n    let counters = this.getTargetCounters(id, transformedId, false);\n    if (counters && counters[name]) {\n      // Since an element-based counter is defined, any page-based counter is\n      // obscured even if it exists.\n      const countersOfName = counters[name];\n      return new Exprs.Const(\n        this.rootScope,\n        format(countersOfName[countersOfName.length - 1] || null),\n      );\n    }\n    const expr = new Exprs.Native(\n      this.pageScope,\n      () => {\n        // Since This block is evaluated during layout, lookForElement\n        // argument can be set to true.\n        counters = this.getTargetCounters(id, transformedId, true);\n\n        if (counters) {\n          if (counters[name]) {\n            // Since an element-based counter is defined, any page-based\n            // counter is obscured even if it exists.\n            const countersOfName = counters[name];\n            return format(countersOfName[countersOfName.length - 1] || null);\n          } else {\n            const pageCounters = this.getTargetPageCounters(transformedId);\n            if (pageCounters) {\n              // The target element has already been laid out.\n              this.counterStore.resolveReference(transformedId);\n\n              if (pageCounters[name]) {\n                const pageCountersOfName = pageCounters[name];\n                return format(\n                  pageCountersOfName[pageCountersOfName.length - 1] || null,\n                );\n              } else {\n                // No corresponding counter with the name.\n                return format(0);\n              }\n            } else {\n              // The target element has not been laid out yet.\n              this.counterStore.saveReferenceOfCurrentPage(\n                transformedId,\n                false,\n              );\n              return \"??\"; // TODO more reasonable placeholder?\n            }\n          }\n        } else {\n          // The style of target element has not been calculated yet.\n          // (The element is in another source document that is not parsed\n          // yet)\n          this.counterStore.saveReferenceOfCurrentPage(transformedId, false);\n          return \"??\"; // TODO more reasonable placeholder?\n        }\n      },\n      `target-counter-${name}-of-${url}`,\n    );\n\n    this.counterStore.registerTargetCounterExpr(\n      name,\n      format,\n      expr,\n      transformedId,\n    );\n    return expr;\n  }\n\n  /** @override */\n  getTargetCountersVal(\n    url: string,\n    name: string,\n    format: (p1: number[]) => string,\n  ): Exprs.Val {\n    const id = this.getFragment(url);\n    const transformedId = this.getTransformedId(url);\n    return new Exprs.Native(\n      this.pageScope,\n      () => {\n        const pageCounters = this.getTargetPageCounters(transformedId);\n\n        if (!pageCounters) {\n          // The target element has not been laid out yet.\n          this.counterStore.saveReferenceOfCurrentPage(transformedId, false);\n          return \"??\"; // TODO more reasonable placeholder?\n        } else {\n          this.counterStore.resolveReference(transformedId);\n          const pageCountersOfName = pageCounters[name] || [];\n          const elementCounters = this.getTargetCounters(\n            id,\n            transformedId,\n            true,\n          );\n          const elementCountersOfName = elementCounters[name] || [];\n          return format(pageCountersOfName.concat(elementCountersOfName));\n        }\n      },\n      `target-counters-${name}-of-${url}`,\n    );\n  }\n\n  /** @override */\n  getTargetTextVal(url: string, pseudoElement: string): Exprs.Val {\n    const transformedId = this.getTransformedId(url);\n\n    const expr = new Exprs.Native(\n      this.pageScope,\n      () => {\n        // Handle first-letter separately\n        if (pseudoElement === \"first-letter\") {\n          // Respect pseudo-elements\n          const beforeText = this.getTargetPageText(transformedId, \"before\");\n          const contentText = this.getTargetPageText(transformedId, \"content\");\n          const afterText = this.getTargetPageText(transformedId, \"after\");\n\n          // Check if target element has been laid out\n          if (\n            beforeText === null &&\n            contentText === null &&\n            afterText === null\n          ) {\n            this.counterStore.saveReferenceOfCurrentPage(transformedId, false);\n            return \"??\";\n          }\n\n          const text =\n            (beforeText ?? \"\") + (contentText ?? \"\") + (afterText ?? \"\");\n          this.counterStore.resolveReference(transformedId);\n\n          const match = text.match(Base.firstLetterPattern);\n          return match ? match[0] : \"\";\n        }\n\n        // For other pseudo-elements, get specific text\n        let pageText = this.getTargetPageText(transformedId, pseudoElement);\n        if (pageText !== null) {\n          // The target element has already been laid out.\n          this.counterStore.resolveReference(transformedId);\n          return pageText;\n        } else {\n          // The target element has not been laid out yet.\n          this.counterStore.saveReferenceOfCurrentPage(transformedId, false);\n          return \"??\"; // TODO more reasonable placeholder?\n        }\n      },\n      `target-text-${pseudoElement}-of-${url}`,\n    );\n\n    this.counterStore.registerTargetTextExpr(\n      pseudoElement,\n      expr,\n      transformedId,\n    );\n    return expr;\n  }\n\n  /**\n   * Get value of the CSS string() function\n   * https://drafts.csswg.org/css-gcpm-3/#using-named-strings\n   */\n  getNamedStringVal(name: string, retrievePosition: string): Exprs.Val {\n    return new Exprs.Native(\n      this.pageScope,\n      () =>\n        this.getRunningValue(this.namedStringValues, name, retrievePosition),\n      `named-string-${retrievePosition}-${name}`,\n    );\n  }\n\n  /**\n   * Get value of the CSS element() function\n   * https://drafts.csswg.org/css-gcpm-3/#running-elements\n   */\n  getRunningElementVal(name: string, retrievePosition: string): Exprs.Val {\n    return new Exprs.Native(\n      this.pageScope,\n      () => this.getRunningValue(this.runningElements, name, retrievePosition),\n      `running-element-${retrievePosition}-${name}`,\n    );\n  }\n\n  private getRunningValue(\n    namedRunningValues: NamedRunningValues,\n    name: string,\n    retrievePosition: string,\n  ): string {\n    const runningValues = namedRunningValues[name];\n    if (!runningValues) {\n      return \"\";\n    }\n    const offsets = Object.keys(runningValues)\n      .map((a) => parseInt(a, 10))\n      .sort(Base.numberCompare);\n\n    const currentPage = this.counterStore.currentPage;\n    const pageStartOffset = currentPage.isBlankPage\n      ? currentPage.offset - 1\n      : currentPage.offset;\n    const pageLastOffset = currentPage.isBlankPage\n      ? pageStartOffset\n      : Math.max(\n          pageStartOffset,\n          ...Array.from(\n            currentPage.container.querySelectorAll(\n              `[${Base.ELEMENT_OFFSET_ATTR}]`,\n            ),\n          ).map((e) => parseInt(e.getAttribute(Base.ELEMENT_OFFSET_ATTR), 10)),\n        );\n\n    let firstOffset = -1;\n    let startOffset = -1;\n    let lastOffset = -1;\n    let firstExceptOffset = -1;\n\n    for (let i = 0; i < offsets.length; i++) {\n      const offset = offsets[i];\n      const offsetPrev = i > 0 ? offsets[i - 1] : -1;\n      const offsetNext = i < offsets.length - 1 ? offsets[i + 1] : -1;\n      if (offset > pageLastOffset) {\n        break;\n      }\n      if (offset >= pageStartOffset) {\n        if (firstOffset < 0) {\n          firstOffset = offset;\n          firstExceptOffset = -1;\n        }\n        if (startOffset < 0) {\n          if (offset === pageStartOffset) {\n            startOffset = offset;\n          } else {\n            if (offsetPrev < firstOffset) {\n              startOffset = offsetPrev;\n            }\n            // Check if the element at the offset is at beginning of the page\n            const elementAtOffset = currentPage.container.querySelector(\n              `[${Base.ELEMENT_OFFSET_ATTR}=\"${offset}\"]`,\n            );\n            if (!elementAtOffset) {\n              // title or meta elements are not output, but should be treated as start\n              if (startOffset < 0) {\n                startOffset = offset;\n              }\n            } else {\n              let elementAtPageStartOffset =\n                currentPage.container.querySelector(\n                  `[${Base.ELEMENT_OFFSET_ATTR}=\"${pageStartOffset}\"]`,\n                );\n              if (!elementAtPageStartOffset) {\n                // The element at pageStartOffset is not found when page break occured\n                // within an element, so use the ancestor element with offset 0 instead.\n                elementAtPageStartOffset = currentPage.container.querySelector(\n                  `[${Base.ELEMENT_OFFSET_ATTR}=\"0\"]`,\n                );\n              }\n              if (elementAtPageStartOffset) {\n                // Find if the element at the offset is (the first child of)* the element at page start\n                for (\n                  let element = elementAtPageStartOffset;\n                  element;\n                  element = element.firstElementChild\n                ) {\n                  if (element === elementAtOffset) {\n                    startOffset = offset;\n                    break;\n                  }\n                }\n              }\n            }\n          }\n        }\n        lastOffset = offset;\n      } else if (offsetNext > pageLastOffset || offsetNext < 0) {\n        firstOffset = startOffset = lastOffset = firstExceptOffset = offset;\n      }\n    }\n\n    const runningValue =\n      runningValues[\n        {\n          first: firstOffset,\n          start: startOffset,\n          last: lastOffset,\n          \"first-except\": firstExceptOffset,\n        }[retrievePosition]\n      ] || \"\";\n\n    return runningValue;\n  }\n\n  /**\n   * Set named string for the CSS string-set property\n   * https://drafts.csswg.org/css-gcpm-3/#setting-named-strings-the-string-set-pro\n   */\n  setNamedString(\n    name: string,\n    stringValue: string,\n    elementOffset: number,\n  ): void {\n    const values =\n      this.namedStringValues[name] || (this.namedStringValues[name] = {});\n    values[elementOffset] = stringValue;\n  }\n\n  /**\n   * Set running element\n   * https://drafts.csswg.org/css-gcpm-3/#running-elements\n   */\n  setRunningElement(name: string, elementOffset: number): void {\n    const values =\n      this.runningElements[name] || (this.runningElements[name] = {});\n    values[elementOffset] = String(elementOffset);\n  }\n}\n\nexport class CounterStore {\n  countersById: { [key: string]: CssCascade.CounterValues } = {};\n  pageCountersById: { [key: string]: CssCascade.CounterValues } = {};\n  pageTextById: { [key: string]: { [pseudoElement: string]: string } } = {};\n  currentPageCounters: CssCascade.CounterValues = {};\n  previousPageCounters: CssCascade.CounterValues = {};\n  currentPageCountersStack: CssCascade.CounterValues[] = [];\n  pageIndicesById: {\n    [key: string]: { spineIndex: number; pageIndex: number };\n  } = {};\n  currentPage: Vtree.Page = null;\n  newReferencesOfCurrentPage: TargetCounterReference[] = [];\n  referencesToSolve: TargetCounterReference[] = [];\n  referencesToSolveStack: TargetCounterReference[][] = [];\n  unresolvedReferences: { [key: string]: TargetCounterReference[] } = {};\n  resolvedReferences: { [key: string]: TargetCounterReference[] } = {};\n  private pagesCounterExprs: {\n    expr: Exprs.Val;\n    format: (p1: number[]) => string;\n  }[] = [];\n  private pageCounterExprs: {\n    expr: Exprs.Val;\n    format: (p1: number[]) => string;\n  }[] = [];\n\n  private targetCounterExprs: {\n    name: string;\n    expr: Exprs.Val;\n    format: (p1: number) => string;\n    transformedId: string;\n  }[] = [];\n\n  private targetTextExprs: {\n    pseudoElement: string;\n    expr: Exprs.Val;\n    transformedId: string;\n  }[] = [];\n\n  constructor(\n    public readonly documentURLTransformer: Base.DocumentURLTransformer,\n  ) {\n    this.currentPageCounters[\"page\"] = [0];\n  }\n\n  createCounterListener(baseURL: string): CssCascade.CounterListener {\n    return new CounterListener(this, baseURL);\n  }\n\n  createCounterResolver(\n    baseURL: string,\n    rootScope: Exprs.LexicalScope,\n    pageScope: Exprs.LexicalScope,\n  ): CssCascade.CounterResolver {\n    return new CounterResolver(this, baseURL, rootScope, pageScope);\n  }\n\n  setCurrentPage(page: Vtree.Page) {\n    this.currentPage = page;\n  }\n\n  private definePageCounter(counterName: string, value: number) {\n    if (this.currentPageCounters[counterName]) {\n      this.currentPageCounters[counterName].push(value);\n    } else {\n      this.currentPageCounters[counterName] = [value];\n    }\n  }\n\n  /**\n   * Forcefully set the `page` page-based counter to the specified value.\n   */\n  forceSetPageCounter(pageNumber: number) {\n    const counters = this.currentPageCounters[\"page\"];\n    if (!counters || !counters.length) {\n      this.currentPageCounters[\"page\"] = [pageNumber];\n    } else {\n      counters[counters.length - 1] = pageNumber;\n    }\n  }\n\n  /**\n   * Update the page-based counters with 'counter-reset' and 'counter-increment'\n   * properties within the page context. Call before starting layout of the\n   * page.\n   */\n  updatePageCounters(\n    cascadedPageStyle: CssCascade.ElementStyle,\n    context: Exprs.Context,\n  ) {\n    // Save page counters to previousPageCounters before updating\n    this.previousPageCounters = cloneCounterValues(this.currentPageCounters);\n    let resetMap: { [key: string]: number };\n    const reset = cascadedPageStyle[\"counter-reset\"] as CssCascade.CascadeValue;\n    if (reset) {\n      const resetVal = reset.evaluate(context);\n      if (resetVal) {\n        resetMap = CssProp.toCounters(resetVal, true);\n      }\n    }\n    if (resetMap) {\n      for (const resetCounterName in resetMap) {\n        this.definePageCounter(resetCounterName, resetMap[resetCounterName]);\n      }\n    }\n    let incrementMap: { [key: string]: number };\n    const increment = cascadedPageStyle[\n      \"counter-increment\"\n    ] as CssCascade.CascadeValue;\n    if (increment) {\n      const incrementVal = increment.evaluate(context);\n      if (incrementVal) {\n        incrementMap = CssProp.toCounters(incrementVal, false);\n      }\n    }\n\n    // If 'counter-increment' for the builtin 'page' counter is absent, add it\n    // with value 1.\n    if (incrementMap) {\n      if (!(\"page\" in incrementMap)) {\n        incrementMap[\"page\"] = 1;\n      }\n    } else {\n      incrementMap = {};\n      incrementMap[\"page\"] = 1;\n    }\n    for (const incrementCounterName in incrementMap) {\n      if (!this.currentPageCounters[incrementCounterName]) {\n        this.definePageCounter(incrementCounterName, 0);\n      }\n      const counterValues = this.currentPageCounters[incrementCounterName];\n      counterValues[counterValues.length - 1] +=\n        incrementMap[incrementCounterName];\n    }\n  }\n\n  /**\n   * Save current page-based counters values and set them to the values passed\n   * in. The saved counter values can be restored by popPageCounters method.\n   */\n  pushPageCounters(counters: CssCascade.CounterValues) {\n    this.currentPageCountersStack.push(this.currentPageCounters);\n    this.currentPageCounters = cloneCounterValues(counters);\n  }\n\n  /**\n   * Restore previously saved page-based counter values.\n   */\n  popPageCounters() {\n    this.currentPageCounters = this.currentPageCountersStack.pop();\n  }\n\n  /**\n   * Resolve a reference with the specified ID.\n   */\n  resolveReference(id: string) {\n    const unresolvedRefs = this.unresolvedReferences[id];\n    let resolvedRefs = this.resolvedReferences[id];\n    if (!resolvedRefs) {\n      resolvedRefs = this.resolvedReferences[id] = [];\n    }\n    let pushed = false;\n    for (let i = 0; i < this.referencesToSolve.length; ) {\n      const ref = this.referencesToSolve[i];\n      if (ref.targetId === id) {\n        ref.resolve();\n        this.referencesToSolve.splice(i, 1);\n        if (unresolvedRefs) {\n          const j = unresolvedRefs.indexOf(ref);\n          if (j >= 0) {\n            unresolvedRefs.splice(j, 1);\n          }\n        }\n        resolvedRefs.push(ref);\n        pushed = true;\n      } else {\n        i++;\n      }\n    }\n    if (!pushed) {\n      this.saveReferenceOfCurrentPage(id, true);\n    }\n  }\n\n  /**\n   * Save a reference appeared in the current page.\n   * @param resolved If the reference is already resolved or not.\n   */\n  saveReferenceOfCurrentPage(id: string, resolved: boolean) {\n    if (!this.newReferencesOfCurrentPage.some((ref) => ref.targetId === id)) {\n      const ref = new TargetCounterReference(id, resolved);\n      this.newReferencesOfCurrentPage.push(ref);\n    }\n  }\n\n  /**\n   * Finish the current page; elements with ID are collected and saved with\n   * current page-based counter values internally.\n   * @param spineIndex Index of the currently laid out spine item\n   * @param pageIndex Index of the currently laid out page in its spine item\n   */\n  finishPage(spineIndex: number, pageIndex: number) {\n    const ids = Object.keys(this.currentPage.elementsById);\n    if (ids.length > 0) {\n      const currentPageCounters = cloneCounterValues(this.currentPageCounters);\n      ids.forEach((id) => {\n        this.pageCountersById[id] = currentPageCounters;\n\n        // Capture text content for target-text()\n        const elements = this.currentPage.elementsById[id];\n        if (elements && elements.length > 0) {\n          const element = elements[0];\n          this.pageTextById[id] = {\n            content: extractPseudoElementText(element, \"content\"),\n            before: extractPseudoElementText(element, \"before\"),\n            after: extractPseudoElementText(element, \"after\"),\n            marker: extractPseudoElementText(element, \"marker\"),\n          };\n        }\n\n        const oldPageIndex = this.pageIndicesById[id];\n        if (oldPageIndex && oldPageIndex.pageIndex < pageIndex) {\n          const resolvedRefs = this.resolvedReferences[id];\n          if (resolvedRefs) {\n            let unresolvedRefs = this.unresolvedReferences[id];\n            if (!unresolvedRefs) {\n              unresolvedRefs = this.unresolvedReferences[id] = [];\n            }\n            let ref: TargetCounterReference;\n            while ((ref = resolvedRefs.shift())) {\n              ref.unresolve();\n              unresolvedRefs.push(ref);\n            }\n          }\n        }\n        this.pageIndicesById[id] = { spineIndex, pageIndex };\n      });\n    }\n    const prevPageCounters = this.previousPageCounters;\n    let ref: TargetCounterReference;\n    while ((ref = this.newReferencesOfCurrentPage.shift())) {\n      ref.pageCounters = prevPageCounters;\n      ref.spineIndex = spineIndex;\n      ref.pageIndex = pageIndex;\n      let arr: TargetCounterReference[];\n      if (ref.isResolved()) {\n        arr = this.resolvedReferences[ref.targetId];\n        if (!arr) {\n          arr = this.resolvedReferences[ref.targetId] = [];\n        }\n      } else {\n        arr = this.unresolvedReferences[ref.targetId];\n        if (!arr) {\n          arr = this.unresolvedReferences[ref.targetId] = [];\n        }\n      }\n      if (arr.every((r) => !ref.equals(r))) {\n        arr.push(ref);\n      }\n    }\n    this.currentPage = null;\n  }\n\n  /**\n   * Returns unresolved references pointing to the specified page.\n   */\n  getUnresolvedRefsToPage(page: Vtree.Page): {\n    spineIndex: number;\n    pageIndex: number;\n    pageCounters: CssCascade.CounterValues;\n    refs: TargetCounterReference[];\n  }[] {\n    let refs: TargetCounterReference[] = [];\n    const ids = Object.keys(page.elementsById);\n    ids.forEach((id) => {\n      const idRefs = this.unresolvedReferences[id];\n      if (idRefs) {\n        refs = refs.concat(idRefs);\n      }\n    });\n    refs.sort(\n      (r1, r2) => r1.spineIndex - r2.spineIndex || r1.pageIndex - r2.pageIndex,\n    );\n    const result: {\n      spineIndex: number;\n      pageIndex: number;\n      pageCounters: CssCascade.CounterValues;\n      refs: TargetCounterReference[];\n    }[] = [];\n    let o: {\n      spineIndex: number;\n      pageIndex: number;\n      pageCounters: CssCascade.CounterValues;\n      refs: TargetCounterReference[];\n    } = null;\n    refs.forEach((ref) => {\n      if (\n        !o ||\n        o.spineIndex !== ref.spineIndex ||\n        o.pageIndex !== ref.pageIndex\n      ) {\n        o = {\n          spineIndex: ref.spineIndex,\n          pageIndex: ref.pageIndex,\n          pageCounters: ref.pageCounters,\n          refs: [ref],\n        };\n        result.push(o);\n      } else {\n        o.refs.push(ref);\n      }\n    });\n    return result;\n  }\n\n  /**\n   * Save current references to solve and set them to the values passed in.\n   * The saved references can be restored by popReferencesToSolve method.\n   */\n  pushReferencesToSolve(refs: TargetCounterReference[]) {\n    this.referencesToSolveStack.push(this.referencesToSolve);\n    this.referencesToSolve = refs;\n  }\n\n  /**\n   * Restore previously saved references to solve.\n   */\n  popReferencesToSolve() {\n    this.referencesToSolve = this.referencesToSolveStack.pop();\n  }\n\n  registerPageCounterExpr(\n    name: string,\n    format: (p1: number[]) => string,\n    expr: Exprs.Val,\n  ) {\n    if (name === \"pages\") {\n      this.pagesCounterExprs.push({ expr, format });\n    } else {\n      this.pageCounterExprs.push({ expr, format });\n    }\n  }\n  registerTargetCounterExpr(\n    name: string,\n    format: (p1: number) => string,\n    expr: Exprs.Val,\n    transformedId: string,\n  ) {\n    this.targetCounterExprs.push({ name, expr, format, transformedId });\n  }\n\n  registerTargetTextExpr(\n    pseudoElement: string,\n    expr: Exprs.Val,\n    transformedId: string,\n  ) {\n    this.targetTextExprs.push({ pseudoElement, expr, transformedId });\n  }\n\n  getExprContentListener(): Vtree.ExprContentListener {\n    return this.exprContentListener.bind(this);\n  }\n\n  private exprContentListener(\n    expr: Exprs.Val,\n    val: string,\n    document: Document,\n  ) {\n    if (expr instanceof Exprs.Native) {\n      if (expr.str == \"viv-leader\") {\n        const node = document.createElementNS(Base.NS.XHTML, \"span\");\n        node.textContent = val;\n        node.setAttribute(\"data-viv-leader\", expr.key);\n        node.setAttribute(\"data-viv-leader-value\", val);\n        return node;\n      } else if (expr.str.startsWith(\"running-element-\")) {\n        const elemList =\n          val &&\n          document.querySelectorAll(`[${Base.ELEMENT_OFFSET_ATTR}=\"${val}\"]`);\n        if (!elemList || elemList.length === 0) {\n          return null;\n        }\n        const lastElem = elemList[elemList.length - 1];\n        const clonedElem = lastElem.cloneNode(true) as HTMLElement;\n        this.fixPageCounterInRunningElement(clonedElem);\n        clonedElem.style.position = \"\";\n        clonedElem.style.visibility = \"\";\n        return clonedElem;\n      } else if (expr.str.startsWith(\"target-counter-\")) {\n        const node = document.createElementNS(Base.NS.XHTML, \"span\");\n        node.textContent = val;\n        node.setAttribute(TARGET_COUNTER_ATTR, expr.key);\n        return node;\n      } else if (expr.str.startsWith(\"target-text-\")) {\n        const node = document.createElementNS(Base.NS.XHTML, \"span\");\n        node.textContent = val;\n        node.setAttribute(TARGET_TEXT_ATTR, expr.key);\n        return node;\n      }\n    }\n\n    const foundPagesCounter =\n      this.pagesCounterExprs.findIndex((o) => o.expr === expr) >= 0;\n    const foundPageCounter =\n      !foundPagesCounter &&\n      this.pageCounterExprs.findIndex((o) => o.expr === expr) >= 0;\n\n    if (foundPagesCounter || foundPageCounter) {\n      const node = document.createElementNS(Base.NS.XHTML, \"span\");\n      node.textContent = val;\n      node.setAttribute(\n        foundPagesCounter ? PAGES_COUNTER_ATTR : PAGE_COUNTER_ATTR,\n        expr.key,\n      );\n      return node;\n    } else {\n      return null;\n    }\n  }\n\n  private fixPageCounterInRunningElement(runningElem: Element): void {\n    const nodes = runningElem.querySelectorAll(`[${PAGE_COUNTER_ATTR}]`);\n    for (const node of nodes) {\n      const key = node.getAttribute(PAGE_COUNTER_ATTR);\n      const counterExpr = this.pageCounterExprs.find((o) => o.expr.key === key);\n      const str = (counterExpr?.expr as Exprs.Native).str;\n      const counterName = str?.replace(/^page-counters?-/, \"\");\n      const counterValues = this.currentPageCounters[counterName];\n      if (counterValues) {\n        node.textContent = counterExpr.format(counterValues);\n      }\n    }\n    const targetNodes = runningElem.querySelectorAll(\n      `[${TARGET_COUNTER_ATTR}]`,\n    );\n\n    for (const node of targetNodes) {\n      node.setAttribute(TARGET_COUNTER_IN_RUNNING_ATTR, true);\n    }\n\n    const targetTextNodes = runningElem.querySelectorAll(\n      `[${TARGET_TEXT_ATTR}]`,\n    );\n\n    for (const node of targetTextNodes) {\n      node.setAttribute(TARGET_TEXT_IN_RUNNING_ATTR, true);\n    }\n  }\n\n  finishLastPage(viewport: Vgen.Viewport) {\n    const nodes = viewport.root.querySelectorAll(`[${PAGES_COUNTER_ATTR}]`);\n    const pages = viewport.contentContainer.childElementCount;\n    for (const node of nodes) {\n      const key = node.getAttribute(PAGES_COUNTER_ATTR);\n      const i = this.pagesCounterExprs.findIndex((o) => o.expr.key === key);\n      Asserts.assert(i >= 0);\n      node.textContent = this.pagesCounterExprs[i].format([pages]);\n    }\n\n    const runningNodes = viewport.root.querySelectorAll(\n      `[${TARGET_COUNTER_IN_RUNNING_ATTR}]`,\n    );\n\n    for (const node of runningNodes) {\n      const key = node.getAttribute(TARGET_COUNTER_ATTR);\n      const expr = this.targetCounterExprs.find((o) => o.expr.key === key);\n      if (expr && expr.transformedId) {\n        const counterValue = this.pageCountersById[expr.transformedId];\n        if (counterValue) {\n          const arr: number[] = counterValue[expr.name];\n          if (arr) {\n            node.textContent = expr.format(arr[arr.length - 1]);\n          }\n        }\n      }\n    }\n\n    const runningTextNodes = viewport.root.querySelectorAll(\n      `[${TARGET_TEXT_IN_RUNNING_ATTR}]`,\n    );\n\n    for (const node of runningTextNodes) {\n      const key = node.getAttribute(TARGET_TEXT_ATTR);\n      const expr = this.targetTextExprs.find((o) => o.expr.key === key);\n      if (expr && expr.transformedId) {\n        const text = this.pageTextById[expr.transformedId];\n        if (text) {\n          node.textContent = text[expr.pseudoElement] ?? \"\";\n        }\n      }\n    }\n  }\n\n  createLayoutConstraint(pageIndex: number): Layout.LayoutConstraint {\n    return new LayoutConstraint(this, pageIndex);\n  }\n}\n\nexport const PAGES_COUNTER_ATTR = \"data-vivliostyle-pages-counter\";\nexport const PAGE_COUNTER_ATTR = \"data-vivliostyle-page-counter\";\nexport const TARGET_COUNTER_ATTR = \"data-vivliostyle-target-counter\";\nexport const TARGET_TEXT_ATTR = \"data-vivliostyle-target-text\";\n\nexport const TARGET_COUNTER_IN_RUNNING_ATTR =\n  \"data-vivliostyle-target-counter-in-running\";\nexport const TARGET_TEXT_IN_RUNNING_ATTR =\n  \"data-vivliostyle-target-text-in-running\";\n\nclass LayoutConstraint implements Layout.LayoutConstraint {\n  constructor(\n    public readonly counterStore: CounterStore,\n    public readonly pageIndex: number,\n  ) {}\n\n  /** @override */\n  allowLayout(nodeContext: Vtree.NodeContext): boolean {\n    if (!nodeContext || nodeContext.after) {\n      return true;\n    }\n    const viewNode = nodeContext.viewNode;\n    if (!viewNode || viewNode.nodeType !== 1) {\n      return true;\n    }\n    const id =\n      (viewNode as Element).getAttribute(\"data-vivliostyle-id\") ||\n      (viewNode as Element).getAttribute(\"id\") ||\n      (viewNode as Element).getAttribute(\"name\");\n    if (!id) {\n      return true;\n    }\n    if (\n      !this.counterStore.resolvedReferences[id] &&\n      !this.counterStore.unresolvedReferences[id]\n    ) {\n      return true;\n    }\n    const pageIndex = this.counterStore.pageIndicesById[id];\n    if (!pageIndex) {\n      return true;\n    }\n    return this.pageIndex >= pageIndex.pageIndex;\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2017 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssTokenizer - CSS Tokenizer.\n */\n\n/** */\nexport interface TokenizerHandler {\n  error(mnemonics: string, token: Token): void;\n}\n\nexport function escapeParseSingle(str: string): string {\n  str = str.substr(1);\n  if (str.match(/^[^0-9a-fA-F\\n\\r]$/)) {\n    return str;\n  }\n  const code = parseInt(str, 16);\n  if (isNaN(code)) {\n    return \"\";\n  }\n  if (code === 0 || (code >= 0xd800 && code <= 0xdfff) || code > 0x10ffff) {\n    return \"\\uFFFD\";\n  }\n  return String.fromCodePoint(code);\n}\n\nexport function escapeParse(str: string): string {\n  return str.replace(\n    /\\\\([0-9a-fA-F]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?|[^0-9a-fA-F\\n\\r])/g,\n    escapeParseSingle,\n  );\n}\n\n/**\n * @enum {number}\n */\nexport enum TokenType {\n  EOF,\n  IDENT,\n  STR,\n  NUMERIC,\n  NUM,\n  INT,\n  FUNC,\n  HASH,\n  URL,\n  CLASS,\n  O_PAR,\n  C_PAR,\n  O_BRC,\n  C_BRC,\n  O_BRK,\n  C_BRK,\n  COMMA,\n  SEMICOL,\n  COLON,\n  SLASH,\n  AT,\n  PERCENT,\n  QMARK,\n  PLUS,\n  MINUS,\n  BAR_BAR,\n  AMP_AMP,\n  URANGE,\n\n  // those can have \"=\" at the end\n  BANG = 31,\n  DOLLAR,\n  HAT,\n  BAR,\n  TILDE,\n  STAR,\n  GT,\n  LT,\n  EQ,\n\n  // tokens above plus \"=\" at the end, order must be the same\n  BANG_EQ = 41,\n  DOLLAR_EQ,\n  HAT_EQ,\n  BAR_EQ,\n  TILDE_EQ,\n  STAR_EQ,\n  GT_EQ,\n  LT_EQ,\n  EQ_EQ,\n  COL_COL,\n  CDO,\n  CDC,\n  UNKNOWN,\n  INVALID,\n  LAST = 54,\n}\n\nexport class Token {\n  type: TokenType;\n  precededBySpace: boolean = false;\n  num: number = 0;\n  text: string = \"\";\n  position: number = 0;\n\n  constructor() {\n    this.type = TokenType.EOF;\n  }\n\n  toString(): string {\n    switch (this.type) {\n      case TokenType.O_PAR:\n        return \"(\";\n      case TokenType.C_PAR:\n        return \")\";\n      case TokenType.O_BRC:\n        return \"{\";\n      case TokenType.C_BRC:\n        return \"}\";\n      case TokenType.O_BRK:\n        return \"[\";\n      case TokenType.C_BRK:\n        return \"]\";\n      case TokenType.COMMA:\n        return \",\";\n      case TokenType.SEMICOL:\n        return \";\";\n      case TokenType.COLON:\n        return \":\";\n      case TokenType.SLASH:\n        return \"/\";\n      case TokenType.PERCENT:\n        return \"%\";\n      case TokenType.QMARK:\n        return \"?\";\n      case TokenType.PLUS:\n        return \"+\";\n      case TokenType.MINUS:\n        return \"-\";\n      case TokenType.BAR_BAR:\n        return \"||\";\n      case TokenType.AMP_AMP:\n        return \"&&\";\n      case TokenType.BANG:\n        return \"!\";\n      case TokenType.DOLLAR:\n        return \"$\";\n      case TokenType.HAT:\n        return \"^\";\n      case TokenType.BAR:\n        return \"|\";\n      case TokenType.TILDE:\n        return \"~\";\n      case TokenType.STAR:\n        return \"*\";\n      case TokenType.GT:\n        return \">\";\n      case TokenType.LT:\n        return \"<\";\n      case TokenType.EQ:\n        return \"=\";\n      case TokenType.BANG_EQ:\n        return \"!=\";\n      case TokenType.DOLLAR_EQ:\n        return \"$=\";\n      case TokenType.HAT_EQ:\n        return \"^=\";\n      case TokenType.BAR_EQ:\n        return \"|=\";\n      case TokenType.TILDE_EQ:\n        return \"~=\";\n      case TokenType.STAR_EQ:\n        return \"*=\";\n      case TokenType.GT_EQ:\n        return \">=\";\n      case TokenType.LT_EQ:\n        return \"<=\";\n      case TokenType.EQ_EQ:\n        return \"==\";\n      case TokenType.COL_COL:\n        return \"::\";\n      case TokenType.CDO:\n        return \"<!--\";\n      case TokenType.CDC:\n        return \"-->\";\n      case TokenType.NUMERIC:\n        return this.num.toString() + this.text;\n      case TokenType.NUM:\n      case TokenType.INT:\n        return this.num.toString();\n      case TokenType.AT:\n        return \"@\" + this.text;\n      case TokenType.HASH:\n        return \"#\" + this.text;\n      case TokenType.FUNC:\n        return this.text + \"(\";\n      case TokenType.CLASS:\n        return \".\" + this.text;\n      case TokenType.EOF:\n        return \"/*EOF*/\";\n      default:\n        return this.text;\n    }\n  }\n}\n\n/**\n * @enum {number}\n */\nexport enum Action {\n  SPACE = 1,\n  INT,\n  IDENT,\n  BANG,\n  HASH = 6,\n  DOLLAR,\n  PERCENT,\n  AMP,\n  O_PAR,\n  C_PAR,\n  STAR,\n  PLUS,\n  COMMA,\n  MINUS,\n  DOT,\n  SLASH,\n  COLON,\n  SEMICOL,\n  LT,\n  EQ,\n  GT,\n  QMARK,\n  AT,\n  O_BRK,\n  C_BRK,\n  O_BRC,\n  C_BRC,\n  BSLASH,\n  HAT,\n  BAR,\n  TILDE,\n  STR1,\n  STR2,\n  END,\n  EQTAIL,\n  ENDINT,\n  ENDNUM,\n  CONT,\n  UNIT,\n  PCUNIT,\n  NUMBER,\n  ENDIDNT,\n  IDNTESC,\n  ENDIDES,\n\n  // end of identifier with escapes\n  ENDSTR,\n  ENDESTR,\n\n  // end of string with escapes\n  STR1ESC,\n  STR2ESC,\n  BAR_BAR,\n  AMP_AMP,\n  FUNC,\n  FUNCES,\n  COMMENT,\n  COMMST,\n  ENDNOTK,\n  MINMIN,\n  TOINT,\n  TONUM,\n  TOIDENT,\n  TOIDES,\n  KILL1,\n  KILL2,\n  URL,\n  URL1,\n  URL2,\n  ENDURL,\n  TERMURL,\n  FINURL,\n  LT_BG,\n  LT_BG_M,\n  INVALID,\n  CHKPOSS,\n  CHKPOSN,\n  URLESC,\n  IDESCH,\n  COL_COL,\n  TOCLASS,\n  CHKSP,\n  EOF,\n  CDO,\n  CDC,\n}\n\nexport function makeActions(def: Action, spec: number[]): Action[] {\n  const a: number[] = Array(128);\n  let i: number;\n  for (i = 0; i < 128; i++) {\n    a[i] = def;\n  }\n  a[NaN] = def == Action.END ? Action.END : Action.INVALID;\n  for (i = 0; i < spec.length; i += 2) {\n    a[spec[i]] = spec[i + 1];\n  }\n  return a;\n}\n\n/**\n * Start of the token.\n */\nexport const actionsNormal: Action[] = [\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x00-0x07\n  Action.INVALID,\n  Action.SPACE,\n  Action.SPACE,\n  Action.INVALID,\n  Action.SPACE,\n  Action.SPACE,\n  Action.INVALID,\n  Action.INVALID, // 0x08-0x0F\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x10-0x17\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x18-0x1F\n  Action.SPACE,\n  Action.BANG,\n  Action.STR2,\n  Action.HASH,\n  Action.DOLLAR,\n  Action.PERCENT,\n  Action.AMP,\n  Action.STR1, // 0x20-0x27\n  Action.O_PAR,\n  Action.C_PAR,\n  Action.STAR,\n  Action.PLUS,\n  Action.COMMA,\n  Action.MINUS,\n  Action.DOT,\n  Action.SLASH, // 0x28-0x2F\n  Action.INT,\n  Action.INT,\n  Action.INT,\n  Action.INT,\n  Action.INT,\n  Action.INT,\n  Action.INT,\n  Action.INT, // 0x30-0x37\n  Action.INT,\n  Action.INT,\n  Action.COLON,\n  Action.SEMICOL,\n  Action.LT,\n  Action.EQ,\n  Action.GT,\n  Action.QMARK, // 0x38-0x3F\n  Action.AT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT, // 0x40-0x47\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT, // 0x48-0x4F\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT, // 0x50-0x57\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.O_BRK,\n  Action.BSLASH,\n  Action.C_BRK,\n  Action.HAT,\n  Action.IDENT, // 0x58-0x5F\n  Action.INVALID,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT, // 0x60-0x67\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT, // 0x68-0x6F\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT, // 0x70-0x77\n  Action.IDENT,\n  Action.IDENT,\n  Action.IDENT,\n  Action.O_BRC,\n  Action.BAR,\n  Action.C_BRC,\n  Action.TILDE,\n  Action.INVALID, // 0x78-0x7F\n];\n\nactionsNormal[NaN] = Action.EOF;\n\n/**\n * Inside identifier.\n */\nexport const actionsIdent: Action[] = [\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x00-0x07\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x08-0x0F\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x10-0x17\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x18-0x1F\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x20-0x27\n  Action.FUNC,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.CONT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x28-0x2F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x30-0x37\n  Action.CONT,\n  Action.CONT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x38-0x3F\n  Action.ENDIDNT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x40-0x47\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x48-0x4F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x50-0x57\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.ENDIDNT,\n  Action.IDNTESC,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.CONT, // 0x58-0x5F\n  Action.ENDIDNT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x60-0x67\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x68-0x6F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x70-0x77\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT,\n  Action.ENDIDNT, // 0x78-0x7F\n];\n\nactionsIdent[NaN] = Action.ENDIDNT;\n\n/**\n * After dot (either .class or .123)\n */\nexport const actionsNumOrClass: Action[] = [\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x00-0x07\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x08-0x0F\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x10-0x17\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x18-0x1F\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x20-0x27\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.TOCLASS,\n  Action.TONUM,\n  Action.INVALID, // 0x28-0x2F\n  Action.TONUM,\n  Action.TONUM,\n  Action.TONUM,\n  Action.TONUM,\n  Action.TONUM,\n  Action.TONUM,\n  Action.TONUM,\n  Action.TONUM, // 0x30-0x37\n  Action.TONUM,\n  Action.TONUM,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x38-0x3F\n  Action.INVALID,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS, // 0x40-0x47\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS, // 0x48-0x4F\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS, // 0x50-0x57\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.INVALID,\n  Action.TOIDES,\n  Action.INVALID,\n  Action.INVALID,\n  Action.TOCLASS, // 0x58-0x5F\n  Action.INVALID,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS, // 0x60-0x67\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS, // 0x68-0x6F\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS, // 0x70-0x77\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.TOCLASS,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID,\n  Action.INVALID, // 0x78-0x7F\n];\n\nactionsIdent[NaN] = Action.ENDIDNT;\n\n/**\n * after '-'\n */\nexport const actionsMinus: Action[] = [\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x00-0x07\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x08-0x0F\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x10-0x17\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x18-0x1F\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x20-0x27\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.MINMIN,\n  Action.TONUM,\n  Action.END, // 0x28-0x2F\n  Action.TOINT,\n  Action.TOINT,\n  Action.TOINT,\n  Action.TOINT,\n  Action.TOINT,\n  Action.TOINT,\n  Action.TOINT,\n  Action.TOINT, // 0x30-0x37\n  Action.TOINT,\n  Action.TOINT,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x38-0x3F\n  Action.END,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT, // 0x40-0x47\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT, // 0x48-0x4F\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT, // 0x50-0x57\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.END,\n  Action.TOIDES,\n  Action.END,\n  Action.END,\n  Action.TOIDENT, // 0x58-0x5F\n  Action.END,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT, // 0x60-0x67\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT, // 0x68-0x6F\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT, // 0x70-0x77\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.TOIDENT,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END,\n  Action.END, // 0x78-0x7F\n];\n\nactionsMinus[NaN] = Action.END;\n\n/**\n * Inside identifier with escape sequence\n */\nexport const actionsIdentEsc: Action[] = [\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x00-0x07\n  Action.ENDIDES,\n  Action.CHKPOSS,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x08-0x0F\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x10-0x17\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x18-0x1F\n  Action.CHKPOSS,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x20-0x27\n  Action.FUNCES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x28-0x2F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x30-0x37\n  Action.CONT,\n  Action.CONT,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x38-0x3F\n  Action.ENDIDES,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x40-0x47\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x48-0x4F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x50-0x57\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.ENDIDES,\n  Action.IDNTESC,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.CONT, // 0x58-0x5F\n  Action.ENDIDES,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x60-0x67\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x68-0x6F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x70-0x77\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES,\n  Action.ENDIDES, // 0x78-0x7F\n];\n\nactionsIdentEsc[NaN] = Action.ENDIDES;\n\n/**\n * Inside integer\n */\nexport const actionsInt: Action[] = [\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x00-0x07\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x08-0x0F\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x10-0x17\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x18-0x1F\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.PCUNIT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x20-0x27\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.NUMBER,\n  Action.ENDINT, // 0x28-0x2F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x30-0x37\n  Action.CONT,\n  Action.CONT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x38-0x3F\n  Action.ENDINT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x40-0x47\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x48-0x4F\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x50-0x57\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.UNIT, // 0x58-0x5F\n  Action.ENDINT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x60-0x67\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x68-0x6F\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x70-0x77\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT,\n  Action.ENDINT, // 0x78-0x7F\n];\n\nactionsInt[NaN] = Action.ENDINT;\n\n/**\n * inside real, after dot\n */\nexport const actionsNumber: Action[] = [\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x00-0x07\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x08-0x0F\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x10-0x17\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x18-0x1F\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.PCUNIT,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x20-0x27\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x28-0x2F\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT,\n  Action.CONT, // 0x30-0x37\n  Action.CONT,\n  Action.CONT,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x38-0x3F\n  Action.ENDNUM,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x40-0x47\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x48-0x4F\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x50-0x57\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.UNIT, // 0x58-0x5F\n  Action.ENDNUM,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x60-0x67\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x68-0x6F\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT, // 0x70-0x77\n  Action.UNIT,\n  Action.UNIT,\n  Action.UNIT,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM,\n  Action.ENDNUM, // 0x78-0x7F\n];\n\nactionsNumber[NaN] = Action.ENDNUM;\n\nexport const actionsCheckEq: Action[] = makeActions(Action.END, [\n  61 /*=*/,\n  Action.EQTAIL,\n]);\n\nexport const actionsColon: Action[] = makeActions(Action.END, [\n  58 /*:*/,\n  Action.COL_COL,\n]);\n\nexport const actionsBar: Action[] = makeActions(Action.END, [\n  61 /*=*/,\n  Action.EQTAIL,\n  124 /*|*/,\n  Action.BAR_BAR,\n]);\n\nexport const actionsAmp: Action[] = makeActions(Action.END, [\n  38 /*&*/,\n  Action.AMP_AMP,\n]);\n\nexport const actionsSlash: Action[] = makeActions(Action.END, [\n  42 /* * */,\n  Action.COMMENT,\n]);\n\nexport const actionsComment: Action[] = makeActions(Action.CONT, [\n  42 /* * */,\n  Action.COMMST,\n]);\n\nexport const actionsCommentStar: Action[] = makeActions(Action.COMMENT, [\n  42 /* * */,\n  Action.COMMST,\n  47 /* / */,\n  Action.ENDNOTK,\n]);\n\nexport const actionsMinusMinus: Action[] = makeActions(Action.KILL1, [\n  62 /* > */,\n  Action.CDC,\n]);\n\nexport const actionsLt: Action[] = makeActions(Action.END, [\n  61 /*=*/,\n  Action.EQTAIL,\n  33 /*!*/,\n  Action.LT_BG,\n]);\n\nexport const actionsLtBang: Action[] = makeActions(Action.KILL1, [\n  45 /*-*/,\n  Action.LT_BG_M,\n]);\n\nexport const actionsLtBangMinus: Action[] = makeActions(Action.KILL2, [\n  45 /*-*/,\n  Action.CDO,\n]);\n\nexport const actionsIdentEscChr: Action[] = makeActions(Action.IDESCH, [\n  10 /*LF*/,\n  Action.INVALID,\n  13 /*CR*/,\n  Action.INVALID,\n]);\n\nexport const actionsStr1: Action[] = makeActions(Action.CONT, [\n  39 /*'*/,\n  Action.ENDSTR,\n  10 /*LF*/,\n  Action.INVALID,\n  13 /*CR*/,\n  Action.INVALID,\n  92 /*\\*/,\n  Action.STR1ESC,\n]);\n\nexport const actionsStr2: Action[] = makeActions(Action.CONT, [\n  34 /*\"*/,\n  Action.ENDSTR,\n  10 /*LF*/,\n  Action.INVALID,\n  13 /*CR*/,\n  Action.INVALID,\n  92 /*\\*/,\n  Action.STR2ESC,\n]);\n\nexport const actionsStr1Esc: Action[] = makeActions(Action.CONT, [\n  39 /*'*/,\n  Action.ENDESTR,\n  10 /*LF*/,\n  Action.CHKPOSN,\n  13 /*CR*/,\n  Action.CHKPOSN,\n  92 /*\\*/,\n  Action.STR1ESC,\n]);\n\nexport const actionsStr2Esc: Action[] = makeActions(Action.CONT, [\n  34 /*\"*/,\n  Action.ENDESTR,\n  10 /*LF*/,\n  Action.CHKPOSN,\n  13 /*CR*/,\n  Action.CHKPOSN,\n  92 /*\\*/,\n  Action.STR2ESC,\n]);\n\nexport const actionsURL: Action[] = makeActions(Action.URL, [\n  9 /*tab*/,\n  Action.CONT,\n  32 /*sp*/,\n  Action.CONT,\n  34 /*\"*/,\n  Action.URL2,\n  39 /*'*/,\n  Action.URL1,\n  41 /*)*/,\n  Action.INVALID,\n  10 /*LF*/,\n  Action.CONT,\n  13 /*CR*/,\n  Action.CONT,\n]);\n\nexport const actionsURLInside: Action[] = makeActions(Action.CONT, [\n  41 /*)*/,\n  Action.ENDURL,\n  9 /*TAB*/,\n  Action.CHKSP,\n  10 /*LF*/,\n  Action.CHKSP,\n  13 /*CR*/,\n  Action.CHKSP,\n  32 /*sp*/,\n  Action.CHKSP,\n  92 /*\\*/,\n  Action.URLESC,\n  40 /*(*/,\n  Action.INVALID,\n  91 /*[*/,\n  Action.INVALID,\n  93 /*]*/,\n  Action.INVALID,\n  123 /*{*/,\n  Action.INVALID,\n  125 /*}*/,\n  Action.INVALID,\n  NaN,\n  Action.ENDURL,\n]);\n\nexport const actionsURLInside1: Action[] = makeActions(Action.CONT, [\n  39 /*'*/,\n  Action.TERMURL,\n  10 /*LF*/,\n  Action.CHKPOSN,\n  13 /*CR*/,\n  Action.CHKPOSN,\n  92 /*\\*/,\n  Action.URLESC,\n  NaN,\n  Action.ENDURL,\n]);\n\nexport const actionsURLInside2: Action[] = makeActions(Action.CONT, [\n  34 /*\"*/,\n  Action.TERMURL,\n  10 /*LF*/,\n  Action.CHKPOSN,\n  13 /*CR*/,\n  Action.CHKPOSN,\n  92 /*\\*/,\n  Action.URLESC,\n  NaN,\n  Action.ENDURL,\n]);\n\nexport const actionsURLTail: Action[] = makeActions(Action.INVALID, [\n  9 /*tab*/,\n  Action.CONT,\n  10 /*LF*/,\n  Action.CONT,\n  13 /*CR*/,\n  Action.CONT,\n  32 /*sp*/,\n  Action.CONT,\n  41 /*)*/,\n  Action.FINURL,\n]);\n\nexport const INITIAL_INDEX_MASK = 15;\n\nexport class Tokenizer {\n  indexMask: number;\n  buffer: Token[];\n  tail: number = 0; // available, ready to write\n  curr: number = 0; // ready to read\n  position: number = 0;\n\n  constructor(\n    public input: string,\n    public readonly handler: TokenizerHandler,\n  ) {\n    this.indexMask = INITIAL_INDEX_MASK;\n    this.buffer = Array(this.indexMask + 1);\n    for (let i = 0; i <= this.indexMask; i++) {\n      this.buffer[i] = new Token();\n    }\n  }\n\n  token(): Token {\n    if (this.tail == this.curr) {\n      this.fillBuffer();\n    }\n    return this.buffer[this.curr];\n  }\n\n  nthToken(n: number): Token {\n    if (((this.tail - this.curr) & this.indexMask) <= n) {\n      this.fillBuffer();\n    }\n    return this.buffer[(this.curr + n) & this.indexMask];\n  }\n\n  consume(): void {\n    this.curr = (this.curr + 1) & this.indexMask;\n  }\n\n  private fillBuffer(): void {\n    let tail = this.tail;\n    let head = this.curr;\n    let indexMask = this.indexMask;\n    if (tail >= head) {\n      head += indexMask;\n    } else {\n      head--;\n    }\n    if (head == tail) {\n      throw new Error(\"F_CSSTOK_INTERNAL\");\n    }\n    let actions = actionsNormal;\n    const input = this.input;\n    let position = this.position;\n    const buffer = this.buffer;\n    let tokenType: TokenType = TokenType.EOF;\n    let tokenPosition: number = 0;\n    let tokenText: string = \"\";\n    let tokenNum: number = 0;\n    let seenSpace = false;\n    let token: Token = buffer[tail];\n    let backslashPos = -9; // far enough before the start of the string\n    while (true) {\n      const charCode = input.charCodeAt(position);\n      switch (actions[charCode] || actions[65] /*A*/) {\n        case Action.INVALID:\n          tokenText = input.substring(tokenPosition, position);\n          if (isNaN(charCode)) {\n            // unclosed comment `/***[EOF]`, unclosed string `\"**[EOF]`\n            tokenType = TokenType.EOF;\n          } else {\n            // invalid, e.g, `.` in `:nth-child([.])` (Issue #597)\n            tokenType = TokenType.INVALID;\n          }\n          actions = actionsNormal;\n          break;\n        case Action.SPACE:\n          position++;\n          seenSpace = true;\n          continue;\n        case Action.INT:\n          tokenPosition = position++;\n          actions = actionsInt;\n          continue;\n        case Action.IDENT:\n          tokenType = TokenType.IDENT;\n          tokenPosition = position++;\n          actions = actionsIdent;\n          continue;\n        case Action.BANG:\n          tokenPosition = position++;\n          tokenType = TokenType.BANG;\n          actions = actionsCheckEq;\n          continue;\n        case Action.STR1:\n          tokenType = TokenType.STR;\n          tokenPosition = ++position; // after quote\n          actions = actionsStr1;\n          continue;\n        case Action.STR2:\n          tokenType = TokenType.STR;\n          tokenPosition = ++position; // after quote\n          actions = actionsStr2;\n          continue;\n        case Action.HASH:\n          tokenPosition = ++position; // after hash\n          tokenType = TokenType.HASH;\n          actions = actionsIdent;\n          continue;\n        case Action.DOLLAR:\n          tokenPosition = position++;\n          tokenType = TokenType.DOLLAR;\n          actions = actionsCheckEq;\n          continue;\n        case Action.PERCENT:\n          tokenPosition = position++;\n          tokenType = TokenType.PERCENT;\n          break;\n        case Action.AMP:\n          tokenPosition = position++;\n          tokenType = TokenType.DOLLAR;\n          actions = actionsAmp;\n          continue;\n        case Action.O_PAR:\n          tokenPosition = position++;\n          tokenType = TokenType.O_PAR;\n          break;\n        case Action.C_PAR:\n          tokenPosition = position++;\n          tokenType = TokenType.C_PAR;\n          break;\n        case Action.STAR:\n          tokenPosition = position++;\n          tokenType = TokenType.STAR;\n          actions = actionsCheckEq;\n          continue;\n        case Action.PLUS:\n          tokenPosition = position++;\n          tokenType = TokenType.PLUS;\n          break;\n        case Action.COMMA:\n          tokenPosition = position++;\n          tokenType = TokenType.COMMA;\n          break;\n        case Action.MINUS:\n          tokenType = TokenType.MINUS;\n          tokenPosition = position++;\n          actions = actionsMinus;\n          continue;\n        case Action.DOT:\n          tokenPosition = position++;\n          actions = actionsNumOrClass;\n          continue;\n        case Action.TOCLASS:\n          tokenPosition = position++;\n          tokenType = TokenType.CLASS;\n          actions = actionsIdent;\n          continue;\n        case Action.SLASH:\n          tokenPosition = position++;\n          tokenType = TokenType.SLASH;\n          actions = actionsSlash;\n          continue;\n        case Action.COLON:\n          tokenPosition = position++;\n          tokenType = TokenType.COLON;\n          actions = actionsColon;\n          continue;\n        case Action.COL_COL:\n          position++;\n          tokenType = TokenType.COL_COL;\n          break;\n        case Action.SEMICOL:\n          tokenPosition = position++;\n          tokenType = TokenType.SEMICOL;\n          break;\n        case Action.LT:\n          tokenPosition = position++;\n          tokenType = TokenType.LT;\n          actions = actionsLt;\n          continue;\n        case Action.EQ:\n          tokenPosition = position++;\n          tokenType = TokenType.EQ;\n          actions = actionsCheckEq;\n          continue;\n        case Action.GT:\n          tokenPosition = position++;\n          tokenType = TokenType.GT;\n          actions = actionsCheckEq;\n          continue;\n        case Action.QMARK:\n          tokenPosition = position++;\n          tokenType = TokenType.QMARK;\n          break;\n        case Action.AT:\n          tokenPosition = ++position; // after \"at\" sign\n          tokenType = TokenType.AT;\n          actions = actionsIdent;\n          continue;\n        case Action.O_BRK:\n          tokenPosition = position++;\n          tokenType = TokenType.O_BRK;\n          break;\n        case Action.C_BRK:\n          tokenPosition = position++;\n          tokenType = TokenType.C_BRK;\n          break;\n        case Action.O_BRC:\n          tokenPosition = position++;\n          tokenType = TokenType.O_BRC;\n          break;\n        case Action.C_BRC:\n          tokenPosition = position++;\n          tokenType = TokenType.C_BRC;\n          break;\n        case Action.BSLASH:\n          tokenPosition = position++;\n          backslashPos = tokenPosition;\n          tokenType = TokenType.IDENT;\n          actions = actionsIdentEscChr;\n          continue;\n        case Action.HAT:\n          tokenPosition = position++;\n          tokenType = TokenType.HAT;\n          actions = actionsCheckEq;\n          continue;\n        case Action.BAR:\n          tokenPosition = position++;\n          tokenType = TokenType.BAR;\n          actions = actionsBar;\n          continue;\n        case Action.TILDE:\n          tokenPosition = position++;\n          tokenType = TokenType.TILDE;\n          actions = actionsCheckEq;\n          continue;\n        case Action.END:\n          // don't consume current char\n          break;\n        case Action.EQTAIL:\n          position++;\n          tokenType = (tokenType +\n            TokenType.BANG_EQ -\n            TokenType.BANG) as TokenType;\n          break;\n        case Action.ENDINT:\n          // don't consume current char\n          tokenType = TokenType.INT;\n          tokenNum = parseInt(input.substring(tokenPosition, position), 10);\n          break;\n        case Action.ENDNUM:\n          // don't consume current char\n          tokenType = TokenType.NUM;\n          tokenNum = parseFloat(input.substring(tokenPosition, position));\n          break;\n        case Action.CONT:\n          // just consume current char\n          position++;\n          continue;\n        case Action.UNIT:\n          tokenType = TokenType.NUMERIC;\n          tokenNum = parseFloat(input.substring(tokenPosition, position));\n          tokenPosition = position++;\n          actions = actionsIdent;\n          continue;\n        case Action.PCUNIT:\n          tokenType = TokenType.NUMERIC;\n          tokenNum = parseFloat(input.substring(tokenPosition, position));\n          tokenText = \"%\";\n          tokenPosition = position++; // for consistency with alphabetic units\n          break;\n        case Action.NUMBER:\n          position++;\n          actions = actionsNumber;\n          continue;\n        case Action.ENDIDNT:\n          // don't consume current char\n          // tokenType should be set already\n          tokenText = escapeParse(input.substring(tokenPosition, position));\n\n          // unicode-range support\n          if (\n            (tokenType === TokenType.URANGE && charCode === 63) ||\n            (tokenType === TokenType.IDENT &&\n              tokenText.toLowerCase() === \"u\" &&\n              /^(\\bu\\+[?0-9a-f]+(-[?0-9a-f]+)?|,|\\s+|\\/\\*([^*]|\\*[^/])*\\*\\/)+[;}]/i.test(\n                input.substring(position - 1),\n              ))\n          ) {\n            tokenType = TokenType.URANGE;\n            position++;\n            continue;\n          }\n          break;\n        case Action.IDNTESC:\n          backslashPos = position++;\n          actions = actionsIdentEscChr;\n          continue;\n        case Action.ENDIDES:\n          // end of identifier with escapes\n          // don't consume current char\n          // tokenType should be set already\n          tokenText = escapeParse(input.substring(tokenPosition, position));\n          break;\n        case Action.ENDSTR:\n          tokenText = input.substring(tokenPosition, position); // consume closing quote\n          position++;\n          break;\n        case Action.ENDESTR:\n          tokenText = escapeParse(input.substring(tokenPosition, position)); // consume closing quote\n          position++;\n          break;\n        case Action.STR1ESC:\n          backslashPos = position;\n          position += 2; // consume character after backslash in any case\n          actions = actionsStr1Esc;\n          continue;\n        case Action.STR2ESC:\n          backslashPos = position;\n          position += 2; // consume character after backslash in any case\n          actions = actionsStr2Esc;\n          continue;\n        case Action.BAR_BAR:\n          position++;\n          tokenType = TokenType.BAR_BAR;\n          break;\n        case Action.AMP_AMP:\n          position++;\n          tokenType = TokenType.AMP_AMP;\n          break;\n        case Action.FUNC:\n          // tokenType can be TokenType.IDENT,\n          // TokenType.CLASS, TokenType.AT,\n          // TokenType.HASH, TokenType.NUMERIC\n          tokenText = input.substring(tokenPosition, position);\n          if (tokenType == TokenType.IDENT) {\n            position++; // consume\n            if (tokenText.toLowerCase() == \"url\") {\n              actions = actionsURL;\n              continue;\n            }\n            tokenType = TokenType.FUNC;\n          }\n          break;\n        case Action.FUNCES:\n          // tokenType can be TokenType.IDENT,\n          // TokenType.CLASS, TokenType.AT,\n          // TokenType.HASH, T_NUMERIC\n          tokenText = escapeParse(input.substring(tokenPosition, position));\n          if (tokenType == TokenType.IDENT) {\n            position++; // consume\n            if (tokenText.toLowerCase() == \"url\") {\n              actions = actionsURL;\n              continue;\n            }\n            tokenType = TokenType.FUNC;\n          }\n          break;\n        case Action.COMMENT:\n          actions = actionsComment;\n          position++;\n          continue;\n        case Action.COMMST:\n          actions = actionsCommentStar;\n          position++;\n          continue;\n        case Action.ENDNOTK:\n          actions = actionsNormal;\n          position++;\n          continue;\n        case Action.MINMIN:\n          actions = actionsMinusMinus;\n          position++;\n          if (input[position] !== \">\") {\n            // dashed-ident (custom property name)\n            tokenType = TokenType.IDENT;\n            actions = actionsIdent;\n          }\n          continue;\n        case Action.CDO:\n          tokenType = TokenType.CDO;\n          tokenText = input.substring(tokenPosition, ++position);\n          actions = actionsNormal;\n          break;\n        case Action.CDC:\n          tokenType = TokenType.CDC;\n          tokenText = input.substring(tokenPosition, ++position);\n          actions = actionsNormal;\n          break;\n        case Action.TOINT:\n          tokenType = TokenType.INT;\n          actions = actionsInt;\n          position++;\n          continue;\n        case Action.TONUM:\n          tokenType = TokenType.NUM;\n          actions = actionsNumber;\n          position++;\n          continue;\n        case Action.TOIDENT:\n          tokenType = TokenType.IDENT;\n          actions = actionsIdent;\n          position++;\n          continue;\n        case Action.TOIDES:\n          tokenType = TokenType.IDENT;\n          actions = actionsIdentEscChr;\n          backslashPos = position++;\n          continue;\n        case Action.KILL1:\n          position--;\n          break;\n        case Action.KILL2:\n          position -= 2;\n          break;\n        case Action.URL:\n          tokenPosition = position++;\n          actions = actionsURLInside;\n          continue;\n        case Action.URL1:\n          tokenPosition = ++position; // skip quote\n          actions = actionsURLInside1;\n          continue;\n        case Action.URL2:\n          tokenPosition = ++position; // skip quote\n          actions = actionsURLInside2;\n          continue;\n        case Action.ENDURL:\n          tokenType = TokenType.URL;\n          tokenText = escapeParse(input.substring(tokenPosition, position));\n          position++; // skip ')'\n          break;\n        case Action.FINURL:\n          position++; // skip ')'\n          break;\n        case Action.LT_BG:\n          actions = actionsLtBang;\n          position++;\n          continue;\n        case Action.LT_BG_M:\n          actions = actionsLtBangMinus;\n          position++;\n          continue;\n        case Action.CHKSP:\n          // newline in non-quoted URL - check if end of url\n          if (position - backslashPos < 8) {\n            // close enough: may be valid\n            if (\n              input\n                .substring(backslashPos + 1, position + 1)\n                .match(/^[0-9a-fA-F]{0,6}(\\r\\n|[\\n\\r])|[ \\t]$/)\n            ) {\n              // valid, keep going\n              position++;\n              continue;\n            }\n          }\n\n        // end of url\n        // fall through\n        case Action.TERMURL:\n          tokenType = TokenType.URL;\n          tokenText = escapeParse(input.substring(tokenPosition, position));\n          position++; // skip quote (or newline)\n          actions = actionsURLTail;\n          continue;\n        case Action.CHKPOSN:\n          // newline in string or quoted URL - check validity\n          position++;\n          if (position - backslashPos < 9) {\n            // close enough: may be valid\n            if (\n              input\n                .substring(backslashPos + 1, position)\n                .match(/^[0-9a-fA-F]{0,6}(\\r\\n|[\\n\\r])$/)\n            ) {\n              // valid, keep going\n              continue;\n            }\n          }\n\n          // invalid token\n          tokenType = TokenType.INVALID;\n          tokenText = \"E_CSS_UNEXPECTED_NEWLINE\";\n          actions = actionsNormal;\n          break;\n        case Action.CHKPOSS:\n          // space in identifier - check validity\n          if (position - backslashPos < 9) {\n            // close enough: may be valid\n            if (\n              input\n                .substring(backslashPos + 1, position + 1)\n                .match(/^[0-9a-fA-F]{0,6}[ \\t]$/)\n            ) {\n              // valid, keep going\n              position++;\n              actions = actionsIdent;\n              continue;\n            }\n          }\n\n          // end of identifier\n          // don't consume current char\n          // tokenType should be set already\n          tokenText = escapeParse(input.substring(tokenPosition, position));\n          break;\n        case Action.URLESC:\n          backslashPos = position++;\n          continue;\n        case Action.IDESCH:\n          position++;\n          actions = actionsIdentEsc;\n          continue;\n        default:\n          // EOF\n          if (actions !== actionsNormal) {\n            tokenType = TokenType.INVALID;\n            tokenText = \"E_CSS_UNEXPECTED_STATE\";\n            break;\n          }\n          tokenPosition = position;\n          tokenType = TokenType.EOF;\n      }\n      token.type = tokenType;\n      token.precededBySpace = seenSpace;\n      token.num = tokenNum;\n      token.text = tokenText;\n      token.position = tokenPosition;\n      tail++;\n      if (tail >= head) {\n        break;\n      }\n      actions = actionsNormal;\n      seenSpace = false;\n      token = buffer[tail & indexMask];\n    }\n    this.position = position;\n    this.tail = tail & indexMask;\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Task - Support for asynchronous execution and cooperative\n * multitasking.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\n\n/**\n * External timer. Only needed for testing.\n */\nexport interface Timer {\n  /**\n   * @return current time in milliseconds.\n   */\n  currentTime(): number;\n\n  /**\n   * Calls function after a given timeout.\n   * @param fn function to call.\n   * @param delay timeout in milliseconds.\n   * @return unique number that can be used to clear the timeout.\n   */\n  setTimeout(fn: () => void, delay: number): number;\n\n  /**\n   * Calls function after a given timeout.\n   * @param token timeout token.\n   */\n  clearTimeout(token: number): void;\n}\n\n/**\n * Result of an asynchronous function that may be available immediately or\n * some time later. Similar to Deferred.\n * @template T\n */\nexport interface Result<T> {\n  /**\n   * Call the given function when asynchronous function is finished. Callback\n   * is executed in the task's context.\n   */\n  then(callback: (p1: T) => void): void;\n\n  /**\n   * Call the given asynchronous function when some asynchronous function is\n   * finished. Callback is executed in the task's context.\n   * @template T1\n   */\n  thenAsync<T1>(callback: (p1: T) => Result<T1>): Result<T1>;\n\n  /**\n   * Produce a Result that resolves to the given value when this Result is\n   * resolved.\n   * @template T1\n   */\n  thenReturn<T1>(result: T1): Result<T1>;\n\n  /**\n   * Finish given frame with the result value when result becomes ready.\n   */\n  thenFinish(frame: Frame<T>): void;\n\n  /**\n   * Check if this Result is still pending.\n   */\n  isPending(): boolean;\n\n  /**\n   * If this Result is resolved, return the value that it holds.\n   */\n  get(): T | null;\n}\n\nexport let privateCurrentTask: Task | null = null;\n\nexport let primaryScheduler: Scheduler | null = null;\n\n/**\n * Returns current task.\n */\nexport function currentTask(): Task | null {\n  return privateCurrentTask;\n}\n\n/**\n * Create and return a new frame with the given name.\n */\nexport function newFrame<T>(name: string): Frame<T> {\n  if (!privateCurrentTask) {\n    throw new Error(\"E_TASK_NO_CONTEXT\");\n  }\n  if (!privateCurrentTask.name) {\n    privateCurrentTask.name = name;\n  }\n  const task = privateCurrentTask;\n  const frame = new Frame<T>(task, task.top, name);\n  task.top = frame;\n  frame.state = FrameState.ACTIVE;\n  return frame;\n}\n\nexport function newEventSource(): EventSource {\n  return new EventSource();\n}\n\nexport function newScheduler(opt_timer?: Timer): Scheduler {\n  return new Scheduler(opt_timer || new TimerImpl());\n}\n\n/**\n * @template T\n */\nexport function newResult<T>(opt_value: T): Result<T> {\n  return new SyncResultImpl<T>(opt_value);\n}\n\n/**\n * Creates a new frame and runs code in its context, catching synchronous and\n * asynchronous errors. If an error occurs, onErr is run (in the context of\n * the same frame). As usual, onErr is supposed either produce a result or raise\n * an exception.\n */\nexport function handle<T>(\n  name: any,\n  code: (p1: Frame<T>) => void,\n  onErr: (p1: Frame<T>, p2: Error) => void,\n): Result<T> {\n  const frame = newFrame<T>(name);\n  frame.handler = onErr;\n  try {\n    code(frame);\n  } catch (err) {\n    // synchronous exception\n    frame.task.raise(err as Error, frame);\n  }\n  return frame.result();\n}\n\nexport function start<T>(func: () => Result<T>, opt_name?: string): Task {\n  const scheduler = privateCurrentTask\n    ? privateCurrentTask.getScheduler()\n    : primaryScheduler || newScheduler();\n  return scheduler.run(func, opt_name);\n}\n\n/**\n * Frame state.\n * @enum {number}\n */\nexport enum FrameState {\n  INIT, // before newFrame call\n  ACTIVE, // before finish call\n  FINISHED, // before callback complete\n  DEAD, // when callback is complete\n}\nexport class TimerImpl implements Timer {\n  /** @override */\n  currentTime(): number {\n    return new Date().valueOf();\n  }\n\n  /** @override */\n  setTimeout(fn: () => void, delay: number) {\n    // HACK: casting to unknown type to prevent TypeScript error\n    // [TS2352] Conversion of type 'Timer' to type 'number' may be a mistake because neither type sufficiently overlaps with the other.\n    const timer: unknown = setTimeout(fn, delay);\n    return timer as number;\n  }\n\n  /** @override */\n  clearTimeout(token: number): void {\n    clearTimeout(token);\n  }\n}\n\n/**\n * A class to create tasks.\n */\nexport class Scheduler {\n  timeout: number = 1;\n  slice: number = 25;\n  sliceOverTime: number = 0;\n  queue: Base.PriorityQueue;\n  wakeupTime: number | null = null;\n  timeoutToken: number | null = null;\n  inTimeSlice: boolean = false;\n  order: number = 0;\n\n  constructor(public timer: Timer) {\n    this.queue = new Base.PriorityQueue();\n    if (!primaryScheduler) {\n      primaryScheduler = this;\n    }\n  }\n\n  /**\n   * Sets time slice length.\n   * @param slice length in milliseconds.\n   */\n  setSlice(slice: number) {\n    this.slice = slice;\n  }\n\n  /**\n   * Sets timeout between time slices.\n   * @param timeout in milliseconds.\n   */\n  setTimeout(timeout: number) {\n    this.timeout = timeout;\n  }\n\n  /**\n   * Checks if the current time slice is over.\n   */\n  isTimeSliceOver(): boolean {\n    const now = this.timer.currentTime();\n    return now >= this.sliceOverTime;\n  }\n\n  private arm(): void {\n    if (this.inTimeSlice) {\n      return;\n    }\n    const nextInQueue = this.queue.peek() as Continuation<any>;\n    const newTime = nextInQueue.scheduledTime;\n    const now = this.timer.currentTime();\n    if (this.timeoutToken != null) {\n      if (now + this.timeout > this.wakeupTime) {\n        return; // no use re-arming\n      }\n      this.timer.clearTimeout(this.timeoutToken);\n    }\n    let timeout = newTime - now;\n    if (timeout <= this.timeout) {\n      timeout = this.timeout;\n    }\n    this.wakeupTime = now + timeout;\n    this.timeoutToken = this.timer.setTimeout(() => {\n      this.timeoutToken = null;\n      this.doTimeSlice();\n    }, timeout);\n  }\n\n  schedule(continuation: Continuation<any>, opt_delay?: number): void {\n    const c = continuation as Continuation<any>;\n    const now = this.timer.currentTime();\n    c.order = this.order++;\n    c.scheduledTime = now + (opt_delay || 0);\n    this.queue.add(c);\n    this.arm();\n  }\n\n  private doTimeSlice(): void {\n    if (this.timeoutToken != null) {\n      this.timer.clearTimeout(this.timeoutToken);\n      this.timeoutToken = null;\n    }\n    this.inTimeSlice = true;\n    try {\n      let now = this.timer.currentTime();\n      this.sliceOverTime = now + this.slice;\n      while (this.queue.length()) {\n        const continuation = this.queue.peek() as Continuation<any>;\n        if (continuation.scheduledTime > now) {\n          break; // too early\n        }\n        this.queue.remove();\n        if (!continuation.canceled) {\n          continuation.resumeInternal();\n        }\n        now = this.timer.currentTime();\n        if (now >= this.sliceOverTime) {\n          break;\n        }\n      }\n    } catch (err) {\n      Logging.logger.error(err);\n    }\n    this.inTimeSlice = false;\n    if (this.queue.length()) {\n      this.arm();\n    }\n  }\n\n  run(func: () => Result<any>, opt_name?: string): Task {\n    const task = new Task(this, opt_name || \"\");\n    task.top = new Frame<any>(task, null, \"bootstrap\");\n    task.top.state = FrameState.ACTIVE;\n    task.top.then(() => {\n      const done = () => {\n        task.running = false;\n        for (const callback of task.callbacks) {\n          try {\n            callback();\n          } catch (err) {\n            Logging.logger.error(err);\n          }\n        }\n      };\n      try {\n        func().then((result) => {\n          task.result = result;\n          done();\n        });\n      } catch (err) {\n        task.raise(err as Error);\n        done();\n      }\n    });\n    const savedTask = privateCurrentTask;\n    privateCurrentTask = task;\n    this.schedule(task.top.suspend(\"bootstrap\"));\n    privateCurrentTask = savedTask;\n    return task;\n  }\n}\n\n/**\n * Task suspension point.\n * @template T\n */\nexport class Continuation<T> implements Base.Comparable {\n  scheduledTime: number = 0;\n  order: number = 0;\n  result: T = null;\n  canceled: boolean = false;\n\n  constructor(public task: Task) {}\n\n  /** @override */\n  compare(otherComp: Base.Comparable): number {\n    // earlier wins\n    const other = otherComp as Continuation<any>;\n    return other.scheduledTime - this.scheduledTime || other.order - this.order;\n  }\n\n  /**\n   * Continuation's task\n   */\n  getTask(): Task {\n    return this.task;\n  }\n\n  /**\n   * Schedule task continuation after the given (optional) delay.\n   * @param opt_delay optional delay in milliseconds.\n   */\n  schedule(result: T, opt_delay?: number) {\n    this.result = result;\n    this.task.scheduler.schedule(this, opt_delay);\n  }\n\n  resumeInternal(): boolean {\n    const task = this.task;\n    this.task = null;\n    if (task && task.continuation == this) {\n      task.continuation = null;\n      const savedTask = privateCurrentTask;\n      privateCurrentTask = task;\n      task.top.finish(this.result);\n      privateCurrentTask = savedTask;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Cancel continuation\n   */\n  cancel() {\n    this.canceled = true;\n  }\n}\n\n/**\n * An asynchronous, time-sliced task.\n */\nexport class Task {\n  callbacks: (() => void)[] = [];\n  exception: Error | null = null;\n  running: boolean = true;\n  result: any = null;\n  waitTarget: string | null = null;\n  top: Frame<any> | null = null;\n  continuation: Continuation<any> | null = null;\n\n  constructor(\n    public scheduler: Scheduler,\n    public name: string,\n  ) {}\n\n  /**\n   * @return task name.\n   */\n  getName(): string {\n    return this.name;\n  }\n\n  /**\n   * @param err exception to throw in the task's context.\n   */\n  interrupt(err: Error): void {\n    this.raise(err || new Error(\"E_TASK_INTERRUPT\"));\n    if (this !== privateCurrentTask && this.continuation) {\n      // blocked on something\n      this.continuation.cancel();\n      const continuation = new Continuation(this);\n      this.waitTarget = \"interrupt\";\n      this.continuation = continuation;\n      this.scheduler.schedule(continuation);\n    }\n  }\n\n  /**\n   * @return this task's scheduler.\n   */\n  getScheduler(): Scheduler {\n    return this.scheduler;\n  }\n\n  /**\n   * @return true if task is still running.\n   */\n  isRunning(): boolean {\n    return this.running;\n  }\n\n  /**\n   * Register a callback to be called when the task is done. Callback is not\n   * executed in any task context. Multiple callbacks can be registered and\n   * they will be called in the registration order.\n   */\n  whenDone(callback: () => void): void {\n    this.callbacks.push(callback);\n  }\n\n  /**\n   * Wait for task to finish (from another task).\n   */\n  join(): Result<any> {\n    const frame = newFrame<any>(\"Task.join\");\n    if (!this.running) {\n      frame.finish(this.result);\n    } else {\n      const continuation = frame.suspend(this);\n      this.whenDone(() => {\n        continuation.schedule(this.result);\n      });\n    }\n    return frame.result();\n  }\n\n  /**\n   * Unwind the stack. We have two stacks: async (maintained by frame\n   * parent link) and sync (regular JavaScript stack).\n   */\n  unwind() {\n    // We have a sequence of frames on the stack.\n    while (this.top && !this.top.handler) {\n      this.top = this.top.parent;\n    }\n    if (this.top && this.top.handler && this.exception) {\n      // found a handler\n      const err = this.exception;\n      this.exception = null;\n      this.top.handler(this.top, err);\n    } else {\n      if (this.exception) {\n        Logging.logger.error(\n          this.exception,\n          \"Unhandled exception in task\",\n          this.name,\n        );\n      }\n    }\n  }\n\n  raise(err: Error, opt_frame?: Frame<any>): void {\n    this.fillStack(err);\n    if (opt_frame) {\n      let f = this.top;\n      while (f && f != opt_frame) {\n        f = f.parent;\n      }\n      if (f == opt_frame) {\n        this.top = f;\n      }\n    }\n    this.exception = err;\n    this.unwind();\n  }\n\n  /**\n   * Fill the stack trace in the exception\n   * @param err exception\n   */\n  fillStack(err: Error) {\n    let out = err[\"frameTrace\"];\n    if (!out) {\n      out = err[\"stack\"] ? `${err[\"stack\"]}\\n\\t---- async ---\\n` : \"\";\n      for (let f = this.top; f; f = f.parent) {\n        out += \"\\t\";\n        out += f.getName();\n        out += \"\\n\";\n      }\n      err[\"frameTrace\"] = out;\n    }\n  }\n}\n\n/**\n * @template T\n */\nexport class SyncResultImpl<T> implements Result<T> {\n  constructor(public value: T) {}\n\n  /** @override */\n  then(callback: (T: any) => void) {\n    callback(this.value);\n  }\n\n  /** @override */\n  thenAsync<T1>(callback: (p1: T) => Result<T1>) {\n    return callback(this.value);\n  }\n\n  /** @override */\n  thenReturn<T1>(result: T1) {\n    return new SyncResultImpl(result);\n  }\n\n  /** @override */\n  thenFinish(frame: Frame<T>): void {\n    frame.finish(this.value);\n  }\n\n  /** @override */\n  isPending(): boolean {\n    return false;\n  }\n\n  /** @override */\n  get(): T | null {\n    return this.value;\n  }\n}\n\n/**\n * @template T\n */\nexport class ResultImpl<T> implements Result<T> {\n  constructor(public readonly frame: Frame<T>) {}\n\n  /** @override */\n  then(callback: (p1: T) => void): void {\n    this.frame.then(callback);\n  }\n\n  /** @override */\n  thenAsync<T1>(callback: (p1: T) => Result<T1>): Result<T1> {\n    if (this.isPending()) {\n      // thenAsync is special, do the trick with the context\n      const frame = new Frame<T | T1>(\n        this.frame.task,\n        this.frame.parent,\n        \"AsyncResult.thenAsync\",\n      );\n      frame.state = FrameState.ACTIVE;\n      this.frame.parent = frame as Frame<T>;\n      this.frame.then((res1) => {\n        callback(res1).then((res2) => {\n          frame.finish(res2);\n        });\n      });\n      return frame.result() as Result<T1>;\n    } else {\n      return callback(this.frame.res);\n    }\n  }\n\n  /** @override */\n  thenReturn<T1>(result: T1) {\n    if (this.isPending()) {\n      return this.thenAsync(() => new SyncResultImpl(result));\n    } else {\n      return new SyncResultImpl(result);\n    }\n  }\n\n  /** @override */\n  thenFinish(frame: Frame<T>): void {\n    if (this.isPending()) {\n      this.then((res) => {\n        frame.finish(res);\n      });\n    } else {\n      frame.finish(this.frame.res);\n    }\n  }\n\n  /** @override */\n  isPending(): boolean {\n    return this.frame.state == FrameState.ACTIVE;\n  }\n\n  /** @override */\n  get(): T | null {\n    if (this.isPending()) {\n      throw new Error(\"Result is pending\");\n    }\n    return this.frame.res;\n  }\n}\n\n/**\n * Asynchronous execution frame. Corresponds to an asynchronous function\n * invocation.\n * @template T\n */\nexport class Frame<T> {\n  res: T = null;\n  state: FrameState;\n  callback: ((p1: any) => void) | null = null;\n  handler: ((p1: Frame<any>, p2: Error) => void) | null = null;\n\n  constructor(\n    public task: Task,\n    public parent: Frame<T>,\n    public name: string,\n  ) {\n    this.state = FrameState.INIT;\n  }\n\n  private checkEnvironment(): void {\n    if (!privateCurrentTask) {\n      throw new Error(\"F_TASK_NO_CONTEXT\");\n    }\n    if (this !== privateCurrentTask.top) {\n      throw new Error(\"F_TASK_NOT_TOP_FRAME\");\n    }\n  }\n\n  /**\n   * @return to be returned as this asynchronous function return value.\n   */\n  result(): Result<T> {\n    return new ResultImpl<T>(this);\n  }\n\n  finish(res: T) {\n    this.checkEnvironment();\n    if (privateCurrentTask && !privateCurrentTask.exception) {\n      this.res = res;\n    }\n    this.state = FrameState.FINISHED;\n    const frame = this.parent;\n    if (privateCurrentTask) {\n      privateCurrentTask.top = frame;\n    }\n    if (this.callback) {\n      try {\n        this.callback(res);\n      } catch (err) {\n        this.task.raise(err as Error, frame);\n      }\n\n      // callback was called\n      this.state = FrameState.DEAD;\n    }\n  }\n\n  getTask(): Task {\n    return this.task;\n  }\n\n  /**\n   * @return frame name.\n   */\n  getName(): string {\n    return this.name;\n  }\n\n  getScheduler(): Scheduler {\n    return this.task.scheduler;\n  }\n\n  then(callback: (p1: T) => void): void {\n    // legal to call when currentTask is null\n    switch (this.state) {\n      case FrameState.ACTIVE:\n        if (this.callback) {\n          throw new Error(\"F_TASK_FRAME_ALREADY_HAS_CALLBACK\");\n        } else {\n          this.callback = callback;\n        }\n        break;\n      case FrameState.FINISHED: {\n        const task = this.task;\n        const frame = this.parent;\n        try {\n          callback(this.res);\n          this.state = FrameState.DEAD;\n        } catch (err) {\n          this.state = FrameState.DEAD;\n          task.raise(err as Error, frame);\n        }\n        break;\n      }\n      case FrameState.DEAD:\n        throw new Error(\"F_TASK_DEAD_FRAME\");\n      default:\n        throw new Error(`F_TASK_UNEXPECTED_FRAME_STATE ${this.state}`);\n    }\n  }\n\n  /**\n   * If this task was executed longer than task's slice parameter.\n   * @return holds true\n   */\n  timeSlice(): Result<boolean> {\n    const frame = newFrame<boolean>(\"Frame.timeSlice\");\n    const scheduler = frame.getScheduler();\n    if (scheduler.isTimeSliceOver()) {\n      Logging.logger.debug(\"-- time slice --\");\n      frame.suspend().schedule(true);\n    } else {\n      frame.finish(true);\n    }\n    return frame.result();\n  }\n\n  /**\n   * Yield to other tasks for the specified time.\n   * @param delay in milliseconds.\n   * @return holds true\n   */\n  sleep(delay: number): Result<boolean> {\n    const frame = newFrame<boolean>(\"Frame.sleep\");\n    frame.suspend().schedule(true, delay);\n    return frame.result();\n  }\n\n  /**\n   * Repeatedly execute the given function asynchronously until it returns\n   * false.\n   * @return holds true.\n   */\n  loop(func: () => Result<boolean>): Result<boolean> {\n    const frame = newFrame<boolean>(\"Frame.loop\");\n    const step = (more) => {\n      try {\n        while (more) {\n          const result = func();\n          if (result.isPending()) {\n            result.then(step);\n            return;\n          } else {\n            result.then((m) => {\n              more = m;\n            });\n          }\n        }\n        frame.finish(true);\n      } catch (err) {\n        frame.task.raise(err as Error, frame);\n      }\n    };\n    step(true);\n    return frame.result();\n  }\n\n  /**\n   * Similar to loop(), but provides a Frame for loop body function.\n   * @return holds true.\n   */\n  loopWithFrame(func: (p1: LoopBodyFrame) => void): Result<boolean> {\n    const task = privateCurrentTask;\n    if (!task) {\n      throw new Error(\"E_TASK_NO_CONTEXT\");\n    }\n    return this.loop(() => {\n      let result: Result<boolean>;\n      do {\n        const frame = new LoopBodyFrame(task as Task, task.top);\n        task.top = frame;\n        frame.state = FrameState.ACTIVE;\n        func(frame);\n        result = frame.result();\n      } while (!result.isPending() && result.get());\n      return result;\n    });\n  }\n\n  suspend(opt_waitTarget?: any): Continuation<T> {\n    this.checkEnvironment();\n    if (this.task.continuation) {\n      throw new Error(\"E_TASK_ALREADY_SUSPENDED\");\n    }\n    const continuation: Continuation<T> = new Continuation(this.task);\n    this.task.continuation = continuation;\n    privateCurrentTask = null;\n    this.task.waitTarget = opt_waitTarget || null;\n    return continuation;\n  }\n}\n\nexport class LoopBodyFrame extends Frame<boolean> {\n  constructor(task: Task, parent: Frame<boolean>) {\n    super(task, parent, \"loop\");\n  }\n\n  continueLoop(): void {\n    this.finish(true);\n  }\n\n  breakLoop(): void {\n    this.finish(false);\n  }\n}\n\nexport class EventItem {\n  next: EventItem = null;\n\n  constructor(public event: Base.Event) {}\n}\n\n/**\n * An class to listen to evens and present them as a readable asynchronous\n * stream to tasks.\n */\nexport class EventSource {\n  continuation: Continuation<boolean> = null;\n  listeners: {\n    target: Base.EventTarget;\n    type: string;\n    listener: Base.EventListener;\n  }[] = [];\n  head: EventItem;\n  tail: EventItem;\n\n  constructor() {\n    this.head = new EventItem(null);\n    this.tail = this.head;\n  }\n\n  /**\n   * Attaches as an event listener to an EventTarget.\n   */\n  attach(\n    target: Base.EventTarget,\n    type: string,\n    opt_preventDefault?: boolean,\n  ): void {\n    const listener = (event) => {\n      if (opt_preventDefault) {\n        event.preventDefault();\n      }\n      if (this.tail.event) {\n        this.tail.next = new EventItem(event);\n        this.tail = this.tail.next;\n      } else {\n        this.tail.event = event;\n        const continuation = this.continuation;\n        if (continuation) {\n          this.continuation = null;\n          continuation.schedule(true);\n        }\n      }\n    };\n    target.addEventListener(type, listener, false);\n    this.listeners.push({ target, type, listener });\n  }\n\n  detach(target: Base.EventTarget, type: string): void {\n    let i = 0;\n    let item: {\n      target: Base.SimpleEventTarget;\n      type: string;\n      listener: Base.EventListener;\n    } = null;\n    while (i < this.listeners.length) {\n      item = this.listeners[i];\n      if (item.type == type && item.target === target) {\n        this.listeners.splice(i, 1);\n        item.target.removeEventListener(item.type, item.listener, false);\n        return;\n      }\n      i++;\n    }\n    throw new Error(\"E_TASK_EVENT_SOURCE_NOT_ATTACHED\");\n  }\n\n  /**\n   * Read next dispatched event, blocking the current task if needed.\n   */\n  nextEvent(): Result<Base.Event> {\n    const frame: Frame<Base.Event> = newFrame(\"EventSource.nextEvent\");\n    const readEvent = () => {\n      if (this.head.event) {\n        const event = this.head.event;\n        if (this.head.next) {\n          this.head = this.head.next;\n        } else {\n          this.head.event = null;\n        }\n        frame.finish(event);\n      } else if (this.continuation) {\n        throw new Error(\"E_TASK_EVENT_SOURCE_OTHER_TASK_WAITING\");\n      } else {\n        const frameInternal: Frame<boolean> = newFrame(\n          \"EventSource.nextEventInternal\",\n        );\n        this.continuation = frameInternal.suspend(this);\n        frameInternal.result().then(readEvent);\n      }\n    };\n    readEvent();\n    return frame.result();\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview TaskUtil - Utilities asynchronous execution and cooperative\n * multitasking.\n */\nimport * as Logging from \"./logging\";\nimport * as Task from \"./task\";\n\n/**\n * A class that can fetch or compute a resource that may be needed by multiple\n * tasks. The first time a resource is requested, it is fetched and then given\n * to everyone requesting it.\n * @template T\n * @param fetch function that fetches/computes\n *    a resource; it will be run in a separate task.\n */\nexport class Fetcher<T> {\n  name: string;\n  arrived: boolean = false;\n  resource: T = null;\n  task: Task.Task = null;\n  piggybacks: ((p1: any) => void)[] | null = [];\n\n  constructor(\n    public readonly fetch: () => Task.Result<T>,\n    opt_name?: string,\n  ) {\n    this.name = opt_name;\n  }\n\n  /**\n   * Start fetching/computing a resource, don't block current task.\n   */\n  start(): void {\n    if (!this.task) {\n      this.task = Task.currentTask()\n        .getScheduler()\n        .run(() => {\n          const frame = Task.newFrame(\"Fetcher.run\");\n          this.fetch().then((resource) => {\n            const piggibacks = this.piggybacks;\n            this.arrived = true;\n            this.resource = resource;\n            this.task = null;\n            this.piggybacks = [];\n            if (piggibacks) {\n              for (let i = 0; i < piggibacks.length; i++) {\n                try {\n                  piggibacks[i](resource);\n                } catch (err) {\n                  Logging.logger.error(err, \"Error:\");\n                }\n              }\n            }\n            frame.finish(resource);\n          });\n          return frame.result();\n        }, this.name);\n    }\n  }\n\n  piggyback(fn: (p1: T) => void): void {\n    if (this.arrived) {\n      fn(this.resource);\n    } else {\n      this.piggybacks.push(fn);\n    }\n  }\n\n  /**\n   * Fetches the resource, waits for it to arrive if it is already being\n   * fetched.\n   */\n  get(): Task.Result<T> {\n    if (this.arrived) {\n      return Task.newResult(this.resource);\n    }\n    this.start();\n    return this.task.join() as Task.Result<T>;\n  }\n\n  hasArrived(): boolean {\n    return this.arrived;\n  }\n}\n\n/**\n * Wait for all Fetcher objects in the array to arrive\n */\nexport const waitForFetchers = <T>(\n  fetchers: Fetcher<T>[],\n): Task.Result<boolean> => {\n  if (fetchers.length == 0) {\n    return Task.newResult(true);\n  }\n  if (fetchers.length == 1) {\n    return fetchers[0].get().thenReturn(true);\n  }\n  const frame = Task.newFrame<boolean>(\"waitForFetches\");\n  let i = 0;\n  frame\n    .loop(() => {\n      while (i < fetchers.length) {\n        const fetcher = fetchers[i++];\n        if (!fetcher.hasArrived()) {\n          return fetcher.get().thenReturn(true);\n        }\n      }\n      return Task.newResult(false);\n    })\n    .then(() => {\n      frame.finish(true);\n    });\n  return frame.result();\n};\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Assets - Bundle resources\n */\n\n/** vivliostyle-viewport-screen.css */\nexport const VivliostyleViewportScreenCss = `\n@media screen {\n  [data-vivliostyle-viewer-viewport] {\n    background: #aaaaaa;\n  }\n\n  [data-vivliostyle-page-container] {\n    background: white;\n    z-index: 0;\n  }\n\n  [data-vivliostyle-viewer-viewport] {\n    box-sizing: border-box;\n    display: flex;\n    overflow: auto;\n    position: relative;\n  }\n\n  [data-vivliostyle-outer-zoom-box] {\n    margin: auto;\n    overflow: hidden;\n    flex: none;\n  }\n\n  [data-vivliostyle-viewer-viewport] [data-vivliostyle-spread-container] {\n    display: flex;\n    flex: none;\n    justify-content: center;\n    transform-origin: left top;\n  }\n\n  [data-vivliostyle-viewer-viewport][data-vivliostyle-page-progression=\"ltr\"]\n    [data-vivliostyle-spread-container] {\n    flex-direction: row;\n  }\n\n  [data-vivliostyle-viewer-viewport][data-vivliostyle-page-progression=\"rtl\"]\n    [data-vivliostyle-spread-container] {\n    flex-direction: row-reverse;\n  }\n\n  [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n    margin: 0 auto;\n    flex: none;\n    transform-origin: center top;\n  }\n\n  [data-vivliostyle-viewer-viewport][data-vivliostyle-spread-view=\"true\"]\n    [data-vivliostyle-spread-container]\n    [data-vivliostyle-page-container][data-vivliostyle-page-side=\"left\"] {\n    margin-right: 1px;\n    transform-origin: right top;\n  }\n\n  [data-vivliostyle-viewer-viewport][data-vivliostyle-spread-view=\"true\"]\n    [data-vivliostyle-spread-container]\n    [data-vivliostyle-page-container][data-vivliostyle-page-side=\"right\"] {\n    margin-left: 1px;\n    transform-origin: left top;\n  }\n\n  [data-vivliostyle-viewer-viewport][data-vivliostyle-spread-view=\"true\"]\n    [data-vivliostyle-spread-container]\n    [data-vivliostyle-page-container][data-vivliostyle-unpaired-page=\"true\"] {\n    margin-left: auto;\n    margin-right: auto;\n    transform-origin: center top;\n  }\n}\n`;\n\n/** vivliostyle-viewport.css */\nexport const VivliostyleViewportCss = `\n[data-vivliostyle-layout-box] {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  z-index: -1;\n  transform-origin: left top;\n}\n\n[data-vivliostyle-debug] [data-vivliostyle-layout-box] {\n  z-index: auto;\n}\n\n[data-vivliostyle-layout-box] [data-vivliostyle-page-container] {\n  margin: 0 auto 0 0;\n}\n\n[data-vivliostyle-spread-container] {\n  transform: scale(var(--viv-outputScale,1));\n  transform-origin: left top;\n}\n\n/* Emulate high pixel ratio using zoom & transform:scale() */\n@supports (zoom: 8) {\n  [data-vivliostyle-layout-box] {\n    zoom: calc(var(--viv-outputPixelRatio,1) / var(--viv-devicePixelRatio,1));\n    transform: scale(calc(var(--viv-devicePixelRatio,1) / var(--viv-outputPixelRatio,1)));\n  }\n  [data-vivliostyle-spread-container] {\n    zoom: calc(var(--viv-outputPixelRatio,1) / var(--viv-devicePixelRatio,1));\n    transform: scale(calc(var(--viv-outputScale,1) * var(--viv-devicePixelRatio,1) / var(--viv-outputPixelRatio,1)));\n  }\n  /* Workaround for Chromium's default border etc. widths not zoomed but scaled down */\n  [data-vivliostyle-spread-container] :where([style*=border],[style*=outline],[style*=rule]) {\n    border-width: medium;\n    outline-width: medium;\n    column-rule-width: medium;\n  }\n  [data-vivliostyle-spread-container] ::-webkit-scrollbar {\n    width: 8px;\n    height: 8px;\n  }\n  [data-vivliostyle-spread-container] ::-webkit-scrollbar-track {\n    background-color: #f4f4f4;\n  }\n  [data-vivliostyle-spread-container] ::-webkit-scrollbar-thumb {\n    border-radius: 4px;\n    background: #c7c7c7;\n  }\n  [data-vivliostyle-spread-container] ::-webkit-scrollbar-thumb:hover {\n    background: #7d7d7d;\n  }\n}\n\n[data-vivliostyle-page-container] {\n  position: relative;\n}\n\n[data-vivliostyle-bleed-box] {\n  position: absolute;\n  overflow: hidden;\n  background-origin: content-box !important;\n}\n\n[data-vivliostyle-page-box] ~ [data-vivliostyle-page-box] {\n  display: none;\n}\n\n[data-vivliostyle-toc-box] {\n  position: absolute;\n  left: 3px;\n  top: 3px;\n  overflow: scroll;\n  overflow-x: hidden;\n  background: rgba(248, 248, 248, 0.9);\n  border-radius: 2px;\n  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.4);\n}\n\n@media print {\n  [data-vivliostyle-toc-box] {\n    display: none;\n  }\n\n  [data-vivliostyle-outer-zoom-box],\n  [data-vivliostyle-spread-container] {\n    width: 100% !important;\n    height: 100% !important;\n  }\n\n  [data-vivliostyle-spread-container] {\n    --viv-outputScale: 1 !important;\n    --viv-devicePixelRatio: 1 !important;\n    zoom: normal !important;\n    transform: none !important;\n    print-color-adjust: exact;\n  }\n\n  @supports (zoom: 8) {\n    [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n      zoom: var(--viv-outputPixelRatio,1);\n      /* transform: scale(calc(1 / var(--viv-outputPixelRatio,1))); */\n      /* Use matrix instead of scale (Workaround for issue #1555) */\n      transform: matrix(calc(1 / var(--viv-outputPixelRatio,1)), 0, 5e-324, calc(1 / var(--viv-outputPixelRatio,1)), 0, 0);\n      transform-origin: left top;\n    }\n  }\n\n  [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n    display: block !important;\n    max-height: 100vh;\n  }\n\n  [data-vivliostyle-spread-container] [data-vivliostyle-page-container]:not(:last-child) {\n    break-after: page;\n  }\n\n  /* Gecko-only hack, see https://bugzilla.mozilla.org/show_bug.cgi?id=267029#c17 */\n  @-moz-document url-prefix()  {\n    [data-vivliostyle-spread-container] [data-vivliostyle-page-container]:nth-last-child(n + 2) {\n      top: -1px;\n      margin-top: 1px;\n      margin-bottom: -1px;\n    }\n    /* Workaround Gecko problem on page break */\n    [data-vivliostyle-spread-container] [data-vivliostyle-page-container] {\n      break-after: auto !important;\n      height: 100% !important;\n    }\n  }\n}\n`;\n\n/** validation.txt */\nexport const ValidationTxt = `\n/*\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * CSS property validation.\n */\nNUM = POS_NUM | ZERO | NEGATIVE;\nNNEG_NUM = POS_NUM | ZERO;\nINT = POS_INT | ZERO | NEGATIVE;\nNNEG_INT = POS_INT | ZERO;\nPERCENTAGE = POS_PERCENTAGE | ZERO | NEGATIVE;\nSTRICT_PERCENTAGE = POS_PERCENTAGE | ZERO_PERCENTAGE | NEGATIVE;\nNNEG_PERCENTAGE = POS_PERCENTAGE | ZERO;\nLENGTH = POS_LENGTH | ZERO | NEGATIVE;\nNNEG_LENGTH = POS_LENGTH | ZERO;\nPLENGTH = LENGTH | PERCENTAGE;\nPPLENGTH = POS_LENGTH | ZERO | POS_PERCENTAGE;\nALENGTH = LENGTH | auto;\nAPLENGTH = PLENGTH | auto;\nPAPLENGTH = PPLENGTH | auto;\nANGLE = POS_ANGLE | ZERO | NEGATIVE;\nLENGTH_OR_NUM = LENGTH | NUM;\nANGLE_OR_NUM = ANGLE | NUM;\nMIN_MAX_FIT_CONTENT = min-content | max-content | fit-content;\nBG_POSITION_TERM = PLENGTH | left | center | right | top | bottom;\nURI_OR_NONE = URI | none;\nIMAGE = URI | IMAGE_FUNCTION | none;\nbackground-attachment = COMMA( [scroll | fixed | local]+ );\nbackground-color = COLOR;\nbackground-image = COMMA( IMAGE+ );\nbackground-position = COMMA( SPACE(BG_POSITION_TERM{1,4})+ ); /* relaxed */\nbackground-repeat = COMMA( [repeat | repeat-x | repeat-y | no-repeat]+ );\nborder-collapse = collapse | separate;\nBORDER_SIDE_COLOR = COLOR;\nBORDER_SIDE_STYLE = none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset;\nBORDER_SIDE_WIDTH = thin: 1px | medium: 3px | thick: 5px | NNEG_LENGTH;\nborder-spacing = LENGTH LENGTH?;\nborder-top-color = BORDER_SIDE_COLOR;\nborder-right-color = BORDER_SIDE_COLOR;\nborder-bottom-color = BORDER_SIDE_COLOR;\nborder-left-color = BORDER_SIDE_COLOR;\nborder-top-style = BORDER_SIDE_STYLE;\nborder-right-style = BORDER_SIDE_STYLE;\nborder-bottom-style = BORDER_SIDE_STYLE;\nborder-left-style = BORDER_SIDE_STYLE;\nborder-top-width = BORDER_SIDE_WIDTH;\nborder-right-width = BORDER_SIDE_WIDTH;\nborder-bottom-width = BORDER_SIDE_WIDTH;\nborder-left-width = BORDER_SIDE_WIDTH;\nBORDER_RADIUS = PLENGTH{1,2};\nborder-top-left-radius = BORDER_RADIUS;\nborder-top-right-radius = BORDER_RADIUS;\nborder-bottom-right-radius = BORDER_RADIUS;\nborder-bottom-left-radius = BORDER_RADIUS;\nborder-image-source = IMAGE;\nborder-image-slice = [NUM | PERCENTAGE]{1,4} || fill; /* relaxed */\nborder-image-width = [NUM | PLENGTH | auto]{1,4};\nborder-image-outset = [NUM | LENGTH]{1,4};\nborder-image-repeat = [ stretch | repeat | round | space ]{1,2};\nbottom = APLENGTH;\ncaption-side = top | bottom;\nclip = rect(ALENGTH{4}) | rect(SPACE(ALENGTH{4})) | auto;\ncolor = COLOR;\nLIST_STYLE_TYPE = IDENT;\nTYPE_OR_UNIT_IN_ATTR = string | color | url | integer | number | length | angle | time | frequency;\nATTR = attr(SPACE(IDENT TYPE_OR_UNIT_IN_ATTR?) [ STRING | IDENT | COLOR | INT | NUM | PLENGTH | ANGLE | POS_TIME | FREQUENCY]?);\nCONTENT_LIST = [ STRING | URI | counter(IDENT LIST_STYLE_TYPE?) |\n    counters(IDENT STRING LIST_STYLE_TYPE?) | ATTR |\n    target-counter([ STRING | URI ] IDENT LIST_STYLE_TYPE?) |\n    target-counter(ATTR IDENT LIST_STYLE_TYPE?) |\n    target-counters([ STRING | URI ] IDENT STRING LIST_STYLE_TYPE?) |\n    target-counters(ATTR IDENT STRING LIST_STYLE_TYPE?) |\n    target-text([ STRING | URI ] [content | before | after | first-letter | marker]?) |\n    target-text(ATTR [content | before | after | first-letter | marker]?) |\n    leader([ dotted | solid | space ] | STRING ) |\n    open-quote | close-quote | no-open-quote | no-close-quote |\n    content([ text | before | after | first-letter | marker ]?) |\n    string(IDENT [first | start | last | first-except]?) |\n    element(IDENT [first | start | last | first-except]?) ]+;\nCONTENT = normal | none | CONTENT_LIST;\ncontent = CONTENT;\nCOUNTER = [ IDENT INT? ]+ | none;\ncounter-increment = COUNTER;\ncounter-reset = COUNTER;\ncounter-set = COUNTER;\ncursor = COMMA(URI* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize |\n    n-resize | se-resize | sw-resize | s-resize | w-resize | text | wait | help | progress ]);\ndirection = ltr | rtl;\ndisplay = inline | block | list-item | inline-block | table | inline-table | table-row-group |\n    table-header-group | table-footer-group | table-row | table-column-group | table-column |\n    table-cell | table-caption | none | oeb-page-head | oeb-page-foot | flex | inline-flex |\n    ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | run-in | compact | marker |\n    flow-root | grid | inline-grid | contents;\nempty-cells = show | hide;\nFAMILY = SPACE(IDENT+) | STRING;\nFAMILY_LIST = COMMA( FAMILY+ );\nfont-family = FAMILY_LIST;\nfont-size = xx-small | x-small | small | medium | large | x-large | xx-large | larger | smaller | PPLENGTH;\nfont-style = normal | italic | oblique;\nfont-weight = normal | bold | bolder | lighter | POS_NUM;\nheight = PAPLENGTH | MIN_MAX_FIT_CONTENT;\nleft = APLENGTH;\nletter-spacing = normal | LENGTH_OR_NUM;\nline-height = normal | POS_NUM | PPLENGTH;\nlist-style-image = IMAGE;\nlist-style-position = inside | outside;\nlist-style-type = LIST_STYLE_TYPE | STRING | none;\nmargin-right = APLENGTH;\nmargin-left = APLENGTH;\nmargin-top = APLENGTH;\nmargin-bottom = APLENGTH;\nNPLENGTH = none | PLENGTH;\nmax-height = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmax-width = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmin-height = APLENGTH | MIN_MAX_FIT_CONTENT;\nmin-width = APLENGTH | MIN_MAX_FIT_CONTENT;\norphans = POS_INT;\noutline-offset = LENGTH;\noutline-color = COLOR | invert;\noutline-style = BORDER_SIDE_STYLE;\noutline-width = BORDER_SIDE_WIDTH;\noverflow = visible | hidden | scroll | auto | clip;\npadding-right = PPLENGTH;\npadding-left = PPLENGTH;\npadding-top = PPLENGTH;\npadding-bottom = PPLENGTH;\nPAGE_BREAK = auto | always | avoid | left | right | recto | verso;\npage-break-after = PAGE_BREAK;\npage-break-before = PAGE_BREAK;\npage-break-inside = avoid | auto;\nposition = static | relative | absolute | fixed | running(IDENT);\nquotes = [STRING STRING]+ | none | auto;\nright = APLENGTH;\ntable-layout = auto | fixed;\ntext-align = left | right | center | justify | start | end | match-parent | inside | outside;\ntext-indent = PLENGTH;\ntext-transform = capitalize | uppercase | lowercase | none;\ntop = APLENGTH;\nvertical-align = baseline | sub | super | top | text-top | middle | bottom | text-bottom | PLENGTH;\nvisibility = visible | hidden | collapse;\nwhite-space = normal | pre | nowrap | pre-wrap | pre-line | break-spaces;\nwidows = POS_INT;\nwidth = PAPLENGTH | MIN_MAX_FIT_CONTENT;\nword-spacing = normal | LENGTH_OR_NUM;\nz-index = auto | INT;\n\n[epub,moz,webkit]hyphens = auto | manual | none;\n[webkit]hyphenate-character = auto | STRING;\n\n/* css-logical */\nmargin-block-start = APLENGTH;\nmargin-block-end = APLENGTH;\nmargin-inline-start = APLENGTH;\nmargin-inline-end = APLENGTH;\npadding-block-start = APLENGTH;\npadding-block-end = APLENGTH;\npadding-inline-start = APLENGTH;\npadding-inline-end = APLENGTH;\nborder-block-start-color = BORDER_SIDE_COLOR;\nborder-block-end-color = BORDER_SIDE_COLOR;\nborder-inline-start-color = BORDER_SIDE_COLOR;\nborder-inline-end-color = BORDER_SIDE_COLOR;\nborder-block-start-style = BORDER_SIDE_STYLE;\nborder-block-end-style = BORDER_SIDE_STYLE;\nborder-inline-start-style = BORDER_SIDE_STYLE;\nborder-inline-end-style = BORDER_SIDE_STYLE;\nborder-block-start-width = BORDER_SIDE_WIDTH;\nborder-block-end-width = BORDER_SIDE_WIDTH;\nborder-inline-start-width = BORDER_SIDE_WIDTH;\nborder-inline-end-width = BORDER_SIDE_WIDTH;\nblock-start = APLENGTH;\nblock-end = APLENGTH;\ninline-start = APLENGTH;\ninline-end = APLENGTH;\nblock-size = PAPLENGTH | MIN_MAX_FIT_CONTENT;\ninline-size = PAPLENGTH | MIN_MAX_FIT_CONTENT;\nmax-block-size = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmax-inline-size = NPLENGTH | MIN_MAX_FIT_CONTENT;\nmin-block-size = APLENGTH | MIN_MAX_FIT_CONTENT;\nmin-inline-size = APLENGTH | MIN_MAX_FIT_CONTENT;\n\nmargin-inside = auto | APLENGTH;\nmargin-outside = auto | APLENGTH;\npadding-inside = PPLENGTH;\npadding-outside = PPLENGTH;\nborder-inside-color = BORDER_SIDE_COLOR;\nborder-outside-color = BORDER_SIDE_COLOR;\nborder-inside-style = BORDER_SIDE_STYLE;\nborder-outside-style = BORDER_SIDE_STYLE;\nborder-inside-width = BORDER_SIDE_WIDTH;\nborder-outside-width = BORDER_SIDE_WIDTH;\ninside = APLENGTH;\noutside = APLENGTH;\n\nSHAPE = auto | rectangle( PLENGTH{4} ) |  ellipse( PLENGTH{4} ) |  circle( PLENGTH{3} ) |\n    polygon( SPACE(PLENGTH+)+ );\n[epubx]shape-inside = SHAPE;\n[epubx,webkit]shape-outside = SHAPE;\n[epubx]wrap-flow = auto | both | start | end | maximum | clear | around /* epub al */;\n\nTRANSFORM_FUNCTION = matrix(NUM{6}) | translate(PLENGTH{1,2}) | translateX(PLENGTH) | translateY(PLENGTH) |\n scale(NUM{1,2}) | scaleX(NUM) | scaleY(NUM) | rotate(ANGLE) | skewX(ANGLE) | skewY(ANGLE);\n[epub]transform = none | TRANSFORM_FUNCTION+;\n[epub]transform-origin = [[[ top | bottom | left | right] PLENGTH?] | center | PLENGTH]{1,2}; /* relaxed */\n\nBOX = border-box | padding-box | content-box;\nSHADOW = SPACE(inset || LENGTH{2,4} || COLOR); /* relaxed */\n[webkit]background-size = COMMA( SPACE( [PLENGTH | auto ]{1,2} | cover | contain)+ );\n[webkit]background-origin = COMMA( BOX+ );\n[webkit]background-clip = COMMA( BOX+ );\n[webkit]box-shadow = none | COMMA( SHADOW+ );\ntext-shadow = none |  COMMA( SHADOW+ );\n[webkit]box-decoration-break = slice | clone;\nFILTER_FUNCTION = blur(LENGTH) | brightness(NUM | PERCENTAGE) | contrast(NUM | PERCENTAGE) | drop-shadow(SPACE(LENGTH{2,3} COLOR?))\n                | grayscale(NUM | PERCENTAGE) | hue-rotate(ANGLE) | invert(NUM | PERCENTAGE) | opacity(NUM | PERCENTAGE)\n                | saturate(NUM | PERCENTAGE) | sepia(NUM | PERCENTAGE);\nFILTER_FUNCTION_LIST = FILTER_FUNCTION+;\n[webkit]filter = none | FILTER_FUNCTION_LIST;\n\nopacity = NUM;\n\n[moz,webkit]column-width = LENGTH | auto;\n[moz,webkit]column-count = INT | auto;\n[moz,webkit]column-gap = LENGTH | normal;\n[moz,webkit]column-rule-color = COLOR;\n[moz,webkit]column-rule-style = BORDER_SIDE_STYLE;\n[moz,webkit]column-rule-width = BORDER_SIDE_WIDTH;\nBREAK = auto | avoid | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region;\nbreak-before = BREAK;\nbreak-after = BREAK;\nbreak-inside = auto | avoid | avoid-page | avoid-column | avoid-region;\n[webkit]column-span = none | auto | all;\n[moz]column-fill = auto | balance | balance-all;\nmargin-break = auto | keep | discard;\n\nsrc = COMMA([SPACE(URI format(STRING+)?) | local(FAMILY)]+); /* for font-face */\n\n[epubx,webkit]flow-from = IDENT;\n[epubx,webkit]flow-into = IDENT;\n[epubx]flow-linger = INT | none;\n[epubx]flow-priority = INT;\n[epubx]flow-options = none | [ exclusive || last || static ];\n[epubx]page = INT | auto | IDENT; /* page: IDENT is for CSS Paged Media */\n[epubx]min-page-width = LENGTH;\n[epubx]min-page-height = LENGTH;\n[epubx]required = true | false;\n[epubx]enabled = true | false;\n[epubx]conflicting-partitions = COMMA(IDENT+);\n[epubx]required-partitions = COMMA(IDENT+);\n[epubx]snap-height = LENGTH | none;\n[epubx]snap-width = LENGTH | none;\n[epubx]flow-consume = all | some;\n[epubx]utilization = NUM;\n[epubx]text-zoom = font-size | scale;\n\n[adapt]template = URI_OR_NONE | footnote;\n[adapt]behavior = IDENT;\n\n/* CSS Fonts */\nCOMMON_LIG_VALUES        = [ common-ligatures | no-common-ligatures ];\nDISCRETIONARY_LIG_VALUES = [ discretionary-ligatures | no-discretionary-ligatures ];\nHISTORICAL_LIG_VALUES    = [ historical-ligatures | no-historical-ligatures ];\nCONTEXTUAL_ALT_VALUES    = [ contextual | no-contextual ];\nfont-variant-ligatures = normal | none | [ COMMON_LIG_VALUES || DISCRETIONARY_LIG_VALUES || HISTORICAL_LIG_VALUES || CONTEXTUAL_ALT_VALUES ];\nfont-variant-caps = normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps;\nNUMERIC_FIGURE_VALUES   = [ lining-nums | oldstyle-nums ];\nNUMERIC_SPACING_VALUES  = [ proportional-nums | tabular-nums ];\nNUMERIC_FRACTION_VALUES = [ diagonal-fractions | stacked-fractions ];\nfont-variant-numeric = normal | [ NUMERIC_FIGURE_VALUES || NUMERIC_SPACING_VALUES || NUMERIC_FRACTION_VALUES || ordinal || slashed-zero ];\nEAST_ASIAN_VARIANT_VALUES = [ jis78 | jis83 | jis90 | jis04 | simplified | traditional ];\nEAST_ASIAN_WIDTH_VALUES   = [ full-width | proportional-width ];\nfont-variant-east-asian = normal | [ EAST_ASIAN_VARIANT_VALUES || EAST_ASIAN_WIDTH_VALUES || ruby ];\nfont-variant_css2 = normal | small-caps; /* for font shorthand */\nfont-size-adjust = none | NNEG_NUM;\n[webkit]font-kerning = auto | normal | none;\nfont-feature-settings = COMMA( normal | SPACE( STRING [ on | off | INT ]? )+ );\nFONT_STRETCH_CSS3_VALUES = normal | wider | narrower | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded;\nfont-stretch = FONT_STRETCH_CSS3_VALUES | PERCENTAGE;\nfont-stretch_css3 = FONT_STRETCH_CSS3_VALUES; /* for font shorthand */\nfont-display = [ auto | block | swap | fallback | optional ];\nunicode-range = COMMA( URANGE+ );\n\n/* CSS Images */\nimage-resolution = RESOLUTION;\nobject-fit = fill | contain | cover | none | scale-down;\nobject-position = COMMA( SPACE(BG_POSITION_TERM{1,4})+ ); /* relaxed */\n\n/* CSS Paged Media */\nPAGE_SIZE = a10 | a9 | a8 | a7 | a6 | a5 | a4 | a3 | a2 | a1 | a0\n          | b10 | b9 | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0\n          | c10 | c9 | c8 | c7 | c6 | c5 | c4 | c3 | c2 | c1 | c0\n          | jis-b10 | jis-b9 | jis-b8 | jis-b7 | jis-b6 | jis-b5 | jis-b4 | jis-b3 | jis-b2 | jis-b1 | jis-b0\n          | letter | legal | ledger;\nbleed = auto | LENGTH;\nmarks = none | [ crop || cross ];\nsize = POS_LENGTH{1,2} | auto | [ PAGE_SIZE || [ portrait | landscape ] ];\ncrop-offset = auto | LENGTH;\ncrop-marks-line-color = auto | COLOR;\n\n/* CSS Page Floats */\nclear = none | left | right | top | bottom | inline-start | inline-end | block-start | block-end | inside | outside | both | all | same | column | region | page;\nfloat-reference = inline | column | region | page;\nfloat = none | footnote | [ block-start || block-end || inline-start || inline-end || snap-block || snap-inline || left || right || top || bottom || inside || outside ];\nfloat-min-wrap-block = PPLENGTH;\n\n/* CSS Ruby */\nruby-align = start | center | space-between | space-around;\nruby-position = over | under | inter-character;\n\n/* CSS Size Adjust */\n[moz,webkit]text-size-adjust = auto | none | POS_PERCENTAGE;\n\n/* CSS Text */\n[webkit]line-break = auto | loose | normal | strict | anywhere;\noverflow-wrap = normal | break-word | anywhere;\n[moz]tab-size = NNEG_INT | NNEG_LENGTH;\n[moz]text-align-last = auto | start | end | left | right | center | justify | inside | outside;\ntext-justify = auto | none | inter-word | inter-character;\nword-break = normal | keep-all | break-all | break-word;\ntext-spacing-trim = auto | normal | space-all | trim-both | trim-auto |\n    [[ trim-start | space-start | space-first ] ||\n     [ trim-end | space-end | allow-end ] ||\n     [ trim-adjacent | space-adjacent ]];\ntext-autospace = normal | auto | no-autospace |\n    [[ ideograph-alpha || ideograph-numeric || punctuation ] || [ insert | replace ]];\nhanging-punctuation = none | [ first || [ force-end | allow-end ] || last ];\n\n/* CSS Text Decoration */\n[webkit]text-decoration-color = COLOR;\n[webkit]text-decoration-line = none | [ underline || overline || line-through || blink ];\n[webkit]text-decoration-skip = none | [ objects || spaces || ink || edges || box-decoration ];\n[webkit]text-decoration-style = solid | double | dotted | dashed | wavy;\n[webkit]text-decoration-thickness = from-font | APLENGTH;\n[epub,webkit]text-emphasis-color = COLOR;\n[webkit]text-emphasis-position = [ over | under ] [ right | left ];\n[epub,webkit]text-emphasis-style = none | [[ filled | open ] || [ dot | circle | double-circle | triangle | sesame ]] | STRING;\n[webkit]text-underline-position = auto | [ under || [ left | right ]];\n\n[webkit]initial-letter = normal | [ POS_NUM POS_INT? ];\n\n/* CSS Transforms */\n[webkit]backface-visibility = visible | hidden;\n\n/* CSS UI */\n[moz,webkit]box-sizing = content-box | padding-box | border-box;\ntext-overflow = [clip | ellipsis | STRING]{1,2};\n\n/* CSS Writing Modes */\n[epub,webkit]text-combine = none | horizontal;\ntext-combine-upright = none | all; /* relaxed */\n[epub,webkit]text-orientation = mixed | upright | sideways-right | sideways-left | sideways | use-glyph-orientation /* the following values are kept for backward-compatibility */ | vertical-right | rotate-right | rotate-left | rotate-normal | auto;\nunicode-bidi = normal | embed | isolate | bidi-override | isolate-override | plaintext;\n[epub,webkit]writing-mode = horizontal-tb | vertical-rl | lr-tb | rl-tb | tb-rl | lr | rl | tb;\n\n/* CSS Flex box */\nFLEX_BASIS = content | PAPLENGTH;\nflex-direction = row | row-reverse | column | column-reverse;\nflex-wrap = nowrap | wrap | wrap-reverse;\norder = INT;\nflex-grow = NNEG_NUM;\nflex-shrink = NNEG_NUM;\nflex-basis = FLEX_BASIS;\nflex = none | [ [ NNEG_NUM NNEG_NUM? ] || FLEX_BASIS ];\njustify-content = flex-start | flex-end | center | space-between | space-around;\nalign-items = flex-start | flex-end | center | baseline | stretch;\nalign-self = auto | flex-start | flex-end | center | baseline | stretch;\nalign-content = flex-start | flex-end | center | space-between | space-around | stretch;\n\n/* Pointer Events */\ntouch-action = auto | none | [ pan-x || pan-y ] | manipulation;\n\n/* SVG 2 */\nOPACITY_VALUE = NUM | PERCENTAGE;\nDASH_ARRAY = COMMA( SPACE( [ LENGTH | PERCENTAGE | NUM ]+ )+ );\nPAINT = none | child | child(INT) | COLOR | SPACE( URI [none | COLOR]? ) | context-fill | context-stroke;\ncolor-interpolation = auto | sRGB | linearRGB;\ncolor-rendering = auto | optimizeSpeed | optimizeQuality;\nfill = PAINT;\nfill-opacity = OPACITY_VALUE;\nfill-rule = nonzero | evenodd;\nglyph-orientation-vertical = auto | NUM | ANGLE;\nimage-rendering = auto | optimizeSpeed | optimizeQuality | crisp-edges | pixelated;\nmarker-start = none | URI;\nmarker-mid = none | URI;\nmarker-end = none | URI;\npointer-events = bounding-box | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | none;\npaint-order = normal | [ fill || stroke || markers ];\nshape-rendering = auto | optimizeSpeed | crispEdges | geometricPrecision;\nstop-color = COLOR;\nstop-opacity = OPACITY_VALUE;\nstroke = PAINT;\nstroke-dasharray = none | DASH_ARRAY;\nstroke-dashoffset = PERCENTAGE | LENGTH_OR_NUM;\nstroke-linecap = butt | round | square;\nstroke-linejoin = miter | round | bevel;\nstroke-miterlimit = NUM;\nstroke-opacity = OPACITY_VALUE;\nstroke-width = PERCENTAGE | LENGTH_OR_NUM;\ntext-anchor = start | middle | end;\ntext-rendering = auto | optimizeSpeed | optimizeLegibility | geometricPrecision;\nvector-effect = none | SPACE( [ non-scaling-stroke | non-scaling-size | non-rotation | fixed-position ]+ [ viewport | screen ]? );\n\n/* SVG 1.1 */\nalignment-baseline = auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical;\nbaseline-shift = baseline | sub | super | PERCENTAGE | LENGTH_OR_NUM;\ndominant-baseline = auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge;\nmask = none | URI;\n\n/* css-masking-1 */\nSHAPE_RADIUS = PLENGTH | closest-side | farthest-side;\nFILL_RULE = nonzero | evenodd;\nSHAPE_BOX = BOX | margin-box;\nGEOMETRY_BOX = SHAPE_BOX | fill-box | stroke-box | view-box;\nBASIC_SHAPE =\n    inset( SPACE( PLENGTH{1,4} [ round PLENGTH{1,4} [ SLASH PLENGTH{1,4} ]? ]? ) )\n  | circle(  SPACE( [SHAPE_RADIUS]?    [at BG_POSITION_TERM{1,4}]? ) )\n  | ellipse( SPACE( SHAPE_RADIUS{2}? [at BG_POSITION_TERM{1,4}]? ) )\n  | polygon( FILL_RULE? COMMA( SPACE( PLENGTH{2} )+ )+ );\n[webkit]clip-path = none | URI | [ BASIC_SHAPE || GEOMETRY_BOX ];\nclip-rule = nonzero | evenodd;\n\n/* filters */\nflood-color = COLOR;\nflood-opacity = OPACITY_VALUE;\nlighting-color = COLOR;\n\n/* compositing-1 */\nBLEND_MODE = normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity;\nmix-blend-mode = BLEND_MODE;\nisolation = auto | isolate;\nbackground-blend-mode = COMMA( BLEND_MODE+ );\n\n/* CSS GCPM */\nstring-set = COMMA( SPACE( IDENT CONTENT_LIST )+ | none );\nfootnote-policy = auto | line;\n\n/* CSS Repeated Headers and Footers */\n[viv]repeat-on-break = auto | none | header | footer;\n\n/* Compatibility */\n[webkit]text-fill-color = COLOR;\n[webkit]text-stroke-color = COLOR;\n[webkit]text-stroke-width = BORDER_SIDE_WIDTH;\n\nDEFAULTS\n\nbackground-attachment: scroll;\nbackground-color: transparent;\nbackground-image: none;\nbackground-repeat: repeat;\nbackground-position: 0% 0%;\nbackground-clip: border-box;\nbackground-origin: padding-box;\nbackground-size: auto;\nborder-top-color: currentColor;\nborder-right-color: currentColor;\nborder-bottom-color: currentColor;\nborder-left-color: currentColor;\nborder-top-style: none;\nborder-right-style: none;\nborder-bottom-style: none;\nborder-left-style: none;\nborder-top-width: 3px;\nborder-right-width: 3px;\nborder-bottom-width: 3px;\nborder-left-width: 3px;\nborder-top-left-radius: 0;\nborder-top-right-radius: 0;\nborder-bottom-right-radius: 0;\nborder-bottom-left-radius: 0;\nborder-image-source: none;\nborder-image-slice: 100%;\nborder-image-width: 1;\nborder-image-outset: 0;\nborder-image-repeat: stretch;\ncolumn-count: auto;\ncolumn-gap: normal;\ncolumn-width: auto;\ncolumn-rule-color: currentColor;\ncolumn-rule-style: none;\ncolumn-rule-width: 3px;\ncolumn-fill: balance;\noutline-color: currentColor;\noutline-style: none;\noutline-width: 3px;\nflex-direction: row;\nflex-wrap: nowrap;\nfont-family: serif;\nfont-style: normal;\nfont-size: medium;\nfont-size-adjust: none;\nfont-kerning: auto;\nfont-feature-settings: normal;\nfont-variant-ligatures: normal;\nfont-variant-caps: normal;\nfont-variant-numeric: normal;\nfont-variant-east-asian: normal;\nfont-weight: normal;\nfont-stretch: normal;\nline-height: normal;\nlist-style-image: none;\nlist-style-position: outside;\nlist-style-type: disc;\nmargin-bottom: auto;\nmargin-left: auto;\nmargin-right: auto;\nmargin-top: auto;\npadding-bottom: auto;\npadding-left: auto;\npadding-right: auto;\npadding-top: auto;\ntext-autospace: normal;\ntext-emphasis-color: currentColor;\ntext-emphasis-style: none;\ntext-spacing-trim: normal;\ntext-stroke-color: currentColor;\ntext-stroke-width: 0;\nmarker-start: none;\nmarker-mid: none;\nmarker-end: none;\n\n/* css-logical */\nborder-block-start-color: currentColor;\nborder-block-end-color: currentColor;\nborder-inline-start-color: currentColor;\nborder-inline-end-color: currentColor;\nborder-inside-color: currentColor;\nborder-outside-color: currentColor;\nborder-block-start-style: none;\nborder-block-end-style: none;\nborder-inline-start-style: none;\nborder-inline-end-style: none;\nborder-inside-style: none;\nborder-outside-style: none;\nborder-block-start-width: 3px;\nborder-block-end-width: 3px;\nborder-inline-start-width: 3px;\nborder-inline-end-width: 3px;\nborder-inside-width: 3px;\nborder-outside-width: 3px;\n\nSHORTHANDS\n\nall = ALL;\nbackground = COMMA background-image [background-position [ / background-size ]] background-repeat\n     background-attachment [background-origin background-clip] background-color; /* background-color is a special case, see the code */\nborder-top = border-top-width border-top-style border-top-color;\nborder-right = border-right-width border-right-style border-right-color;\nborder-bottom = border-bottom-width border-bottom-style border-bottom-color;\nborder-left = border-left-width border-left-style border-left-color;\nborder-inside = border-inside-width border-inside-style border-inside-color;\nborder-outside = border-outside-width border-outside-style border-outside-color;\nborder-width = INSETS border-top-width border-right-width border-bottom-width border-left-width;\nborder-style = INSETS border-top-style border-right-style border-bottom-style border-left-style;\nborder-color = INSETS border-top-color border-right-color border-bottom-color border-left-color;\nborder = border-width border-style border-color;\nborder-image = border-image-source border-image-slice [ / border-image-width [ / border-image-outset ] ]\n     border-image-repeat;\nborder-radius = INSETS_SLASH border-top-left-radius border-top-right-radius\n     border-bottom-right-radius border-bottom-left-radius;\n[moz,webkit]columns = column-width column-count;\n[moz,webkit]column-rule = column-rule-width column-rule-style column-rule-color;\nflex-flow = flex-direction flex-wrap;\noeb-column-number = column-count;\noutline = outline-width outline-style outline-color;\nlist-style = list-style-position list-style-type list-style-image;\nmargin = INSETS margin-top margin-right margin-bottom margin-left;\npadding = INSETS padding-top padding-right padding-bottom padding-left;\nfont = FONT font-style font-variant_css2 font-weight font-stretch_css3 /* font-size line-height font-family are special-cased */;\nfont-variant = font-variant-ligatures font-variant-caps font-variant-numeric font-variant-east-asian;\n[epub,webkit]text-emphasis = text-emphasis-style text-emphasis-color;\nmarker = INSETS marker-start marker-mid marker-end;\n[webkit]text-stroke = text-stroke-width text-stroke-color;\ntext-decoration = text-decoration-line text-decoration-color text-decoration-style text-decoration-thickness;\ntext-spacing = TEXT_SPACING text-autospace text-spacing-trim;\n\n/* css-logical */\nmargin-block = INSETS margin-block-start margin-block-end;\nmargin-inline = INSETS margin-inline-start margin-inline-end;\npadding-block = INSETS padding-block-start padding-block-end;\npadding-inline = INSETS padding-inline-start padding-inline-end;\nborder-block-width = INSETS border-block-start-width border-block-end-width;\nborder-block-style = INSETS border-block-start-style border-block-end-style;\nborder-block-color = INSETS border-block-start-color border-block-end-color;\nborder-inline-width = INSETS border-inline-start-width border-inline-end-width;\nborder-inline-style = INSETS border-inline-start-style border-inline-end-style;\nborder-inline-color = INSETS border-inline-start-color border-inline-end-color;\nborder-block = border-block-width border-block-style border-block-color;\nborder-inline = border-inline-width border-inline-style border-inline-color;\nborder-block-start = border-block-start-width border-block-start-style border-block-start-color;\nborder-block-end = border-block-end-width border-block-end-style border-block-end-color;\nborder-inline-start = border-inline-start-width border-inline-start-style border-inline-start-color;\nborder-inline-end = border-inline-end-width border-inline-end-style border-inline-end-color;\ninset-block-start = block-start;\ninset-block-end = block-end;\ninset-inline-start = inline-start;\ninset-inline-end = inline-end;\ninset-inside = inside;\ninset-outside = outside;\ninset-block = INSETS block-start block-end;\ninset-inline = INSETS inline-start inline-end;\ninset = INSETS top right bottom left;\n\n/* old names  */\nword-wrap = overflow-wrap;\n[adapt,webkit]margin-before = margin-block-start;\n[adapt,webkit]margin-after = margin-block-end;\n[adapt,webkit]margin-start = margin-inline-start;\n[adapt,webkit]margin-end = margin-inline-end;\n[adapt,webkit]padding-before = padding-block-start;\n[adapt,webkit]padding-after = padding-block-end;\n[adapt,webkit]padding-start = padding-inline-start;\n[adapt,webkit]padding-end = padding-inline-end;\n[adapt,webkit]border-before-color = border-block-start-color;\n[adapt,webkit]border-after-color = border-block-end-color;\n[adapt,webkit]border-start-color = border-inline-start-color;\n[adapt,webkit]border-end-color = border-inline-end-color;\n[adapt,webkit]border-before-style = border-block-start-style;\n[adapt,webkit]border-after-style = border-block-end-style;\n[adapt,webkit]border-start-style = border-inline-start-style;\n[adapt,webkit]border-end-style = border-inline-end-style;\n[adapt,webkit]border-before-width = border-block-start-width;\n[adapt,webkit]border-after-width = border-block-end-width;\n[adapt,webkit]border-start-width = border-inline-start-width;\n[adapt,webkit]border-end-width = border-inline-end-width;\n[adapt,webkit]before = block-start;\n[adapt,webkit]after = block-end;\n[adapt,webkit]start = inline-start;\n[adapt,webkit]end = inline-end;\n\n`;\n\n/** user-agent.xml */\nexport const UserAgentXml = `\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:s=\"http://www.pyroxy.com/ns/shadow\">\n<head>\n<style><![CDATA[\n\n.-vivliostyle-footnote-content {\n  float: footnote;\n}\n\n.-vivliostyle-table-cell-container {\n  display: block;\n}\n\n]]></style>\n</head>\n<body>\n\n<s:template id=\"footnote\"><s:content/><s:include class=\"-vivliostyle-footnote-content\"/></s:template>\n\n<s:template id=\"table-cell\"><div data-vivliostyle-flow-root=\"true\" class=\"-vivliostyle-table-cell-container\"><s:content/></div></s:template>\n\n</body>\n</html>`;\n\n/** user-agent-page.css */\nexport const UserAgentPageCss = `\n@namespace \"http://www.w3.org/1999/xhtml\";\n\n:root {\n  hyphens: -epubx-expr(pref-hyphenate? \"auto\": \"manual\");\n}\n:root[data-vivliostyle-epub-spine-properties~=\"page-spread-left\"] {\n  break-before: left;\n}\n:root[data-vivliostyle-epub-spine-properties~=\"page-spread-right\"] {\n  break-before: right;\n}\n\n@-adapt-footnote-area {\n  display: block;\n  margin-block-start: 0.5em;\n  margin-block-end: 0.5em;\n}\n\n@-adapt-footnote-area ::before {\n  display: block;\n  border-block-start-width: 1px;\n  border-block-start-style: solid;\n  border-block-start-color: black;\n  margin-block-end: 0.4em;\n  margin-inline-start: 0;\n  margin-inline-end: 60%;\n}\n\n/* default page master */\n@-epubx-page-master :background-host {\n  @-epubx-partition :layout-host {\n    -epubx-flow-from: body;\n    top: -epubx-expr(header.margin-bottom-edge);\n    bottom: -epubx-expr(page-height - footer.margin-top-edge);\n    left: 0px;\n    right: 0px;\n    column-width: 25em;\n  }\n  @-epubx-partition footer :oeb-page-foot {\n    writing-mode: horizontal-tb;\n    -epubx-flow-from: oeb-page-foot;\n    bottom: 0px;\n    left: 0px;\n    right: 0px;\n  }\n  @-epubx-partition header :oeb-page-head {\n    writing-mode: horizontal-tb;\n    -epubx-flow-from: oeb-page-head;\n    top: 0px;\n    left: 0px;\n    right: 0px;\n  }\n}\n\n@page {\n  @top-left-corner {\n    text-align: right;\n    vertical-align: middle;\n  }\n  @top-left {\n    text-align: left;\n    vertical-align: middle;\n  }\n  @top-center {\n    text-align: center;\n    vertical-align: middle;\n  }\n  @top-right {\n    text-align: right;\n    vertical-align: middle;\n  }\n  @top-right-corner {\n    text-align: left;\n    vertical-align: middle;\n  }\n  @left-top {\n    text-align: center;\n    vertical-align: top;\n  }\n  @left-middle {\n    text-align: center;\n    vertical-align: middle;\n  }\n  @left-bottom {\n    text-align: center;\n    vertical-align: bottom;\n  }\n  @right-top {\n    text-align: center;\n    vertical-align: top;\n  }\n  @right-middle {\n    text-align: center;\n    vertical-align: middle;\n  }\n  @right-bottom {\n    text-align: center;\n    vertical-align: bottom;\n  }\n  @bottom-left-corner {\n    text-align: right;\n    vertical-align: middle;\n  }\n  @bottom-left {\n    text-align: left;\n    vertical-align: middle;\n  }\n  @bottom-center {\n    text-align: center;\n    vertical-align: middle;\n  }\n  @bottom-right {\n    text-align: right;\n    vertical-align: middle;\n  }\n  @bottom-right-corner {\n    text-align: left;\n    vertical-align: middle;\n  }\n}\n\n@media print {\n  @page {\n    margin: 10%;\n  }\n}\n`;\n\n/** user-agent-base.css */\nexport const UserAgentBaseCss = `\n@namespace \"http://www.w3.org/1999/xhtml\";\n@namespace m \"http://www.w3.org/1998/Math/MathML\";\n@namespace epub \"http://www.idpf.org/2007/ops\";\n\nhtml,\naddress,\nblockquote,\nbody,\ndd,\ndiv,\ndl,\ndt,\nfieldset,\nform,\nframe,\nframeset,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nnoframes,\nol,\np,\nul,\ncenter,\ndir,\nhr,\nmenu,\npre,\ndetails,\ndialog,\nlegend,\nlisting,\noptgroup,\noption,\nplaintext,\nsearch,\nxmp,\narticle,\nsection,\nnav,\naside,\nhgroup,\nfooter,\nheader,\nfigure,\nfigcaption,\nmain {\n  display: block;\n}\nli {\n  display: list-item;\n}\nhead {\n  display: none !important;\n}\ntable {\n  display: table;\n}\ntr {\n  display: table-row;\n}\nthead {\n  display: table-header-group;\n  break-after: avoid;\n}\ntbody {\n  display: table-row-group;\n}\ntfoot {\n  display: table-footer-group;\n  break-before: avoid;\n}\ncol {\n  display: table-column;\n}\ncolgroup {\n  display: table-column-group;\n}\ntd,\nth {\n  display: table-cell;\n}\ncaption {\n  display: table-caption;\n  text-align: center;\n}\nth {\n  font-weight: bolder;\n  text-align: center;\n}\n*[hidden],\nlink,\nstyle,\nscript {\n  display: none;\n}\nh1 {\n  font-size: 2em;\n  margin-block: 0.67em;\n}\nh2 {\n  font-size: 1.5em;\n  margin-block: 0.83em;\n}\nh3 {\n  font-size: 1.17em;\n  margin-block: 1em;\n}\nh4 {\n  font-size: 1em;\n  margin-block: 1.33em;\n}\nh5 {\n  font-size: 0.83em;\n  margin-block: 1.67em;\n}\nh6 {\n  font-size: 0.67em;\n  margin-block: 2.33em;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-weight: bold;\n  break-after: avoid;\n}\np,\nblockquote,\nfigure,\nul,\nol,\ndl,\ndir,\nmenu {\n  margin-block: 1em;\n}\nb,\nstrong {\n  font-weight: bolder;\n}\nblockquote,\nfigure {\n  margin-inline: 40px;\n}\ni,\ncite,\ndfn,\nem,\nvar,\naddress {\n  font-style: italic;\n}\npre,\ntt,\ncode,\nkbd,\nsamp {\n  font-family: monospace;\n  text-spacing: none;\n  hanging-punctuation: none;\n}\nlisting,\nplaintext,\nxmp,\npre {\n  white-space: pre;\n}\npre[wrap] {\n  white-space: pre-wrap;\n}\nbutton,\ntextarea,\ninput,\nselect {\n  display: inline-block;\n}\nbig {\n  font-size: 1.17em;\n}\nsmall,\nsub,\nsup {\n  font-size: 0.83em;\n}\nsub {\n  vertical-align: sub;\n}\nsup {\n  vertical-align: super;\n}\ntable {\n  box-sizing: border-box;\n  border-spacing: 2px;\n  border-collapse: separate;\n  text-indent: initial;\n}\nthead,\ntbody,\ntfoot,\ntable > tr {\n  vertical-align: middle;\n}\ntr,\ntd,\nth {\n  vertical-align: inherit;\n}\ns,\nstrike,\ndel {\n  text-decoration: line-through;\n}\nhr {\n  border-style: inset;\n  border-width: 1px;\n  margin-block: 0.5em;\n}\nhr[color],\nhr[noshade] {\n  border-style: solid;\n}\nol,\nul,\ndir,\nmenu {\n  padding-inline-start: 40px;\n}\ndd {\n  margin-inline-start: 40px;\n}\nol ul,\nul ol,\nul ul,\nol ol {\n  margin-block: 0;\n}\nul {\n  list-style-type: disc;\n}\nol ul,\nul ul {\n  list-style-type: circle;\n}\nol ol ul,\nol ul ul,\nul ol ul,\nul ul ul {\n  list-style-type: square;\n}\nol { list-style-type: decimal; }\nol[type=\"1\"], li[type=\"1\"] { list-style-type: decimal; }\nol[type=a], li[type=a] { list-style-type: lower-alpha; }\nol[type=A], li[type=A] { list-style-type: upper-alpha; }\nol[type=i], li[type=i] { list-style-type: lower-roman; }\nol[type=I], li[type=I] { list-style-type: upper-roman; }\nul[type=none], li[type=none] { list-style-type: none; }\nul[type=disc], li[type=disc] { list-style-type: disc; }\nul[type=circle], li[type=circle] { list-style-type: circle; }\nul[type=square], li[type=square] { list-style-type: square; }\nu,\nins {\n  text-decoration: underline;\n}\ncenter {\n  text-align: center;\n}\nq::before {\n  content: open-quote;\n}\nq::after {\n  content: close-quote;\n}\n\nruby {\n  display: ruby;\n}\nrp {\n  display: none;\n}\nrbc {\n  display: ruby-base-container;\n}\nrtc {\n  display: ruby-text-container;\n}\nrb {\n  display: ruby-base;\n  white-space: nowrap;\n}\nrt {\n  display: ruby-text;\n}\nrtc,\nrt {\n  text-emphasis: none;\n  white-space: nowrap;\n  line-height: 1;\n}\nrtc,\nrt {\n  font-size: 50%;\n}\nrtc:lang(zh-TW),\nrt:lang(zh-TW) {\n  font-size: 30%;\n}\nrtc > rt,\nrtc > rt:lang(zh-TW) {\n  font-size: 100%;\n}\n\n/* Bidi settings */\nbdo[dir=\"ltr\"] {\n  direction: ltr;\n  unicode-bidi: bidi-override;\n}\nbdo[dir=\"rtl\"] {\n  direction: rtl;\n  unicode-bidi: bidi-override;\n}\n*[dir=\"ltr\"] {\n  direction: ltr;\n  unicode-bidi: isolate;\n}\n*[dir=\"rtl\"] {\n  direction: rtl;\n  unicode-bidi: isolate;\n}\n\n/* MathML */\nm|math[display=\"block\"] {\n  display: block;\n  display: block math;\n}\n\n/*------------------ epub-specific ---------------------*/\n\na[epub|type=\"noteref\"],\na[epub\\\\:type=\"noteref\"] {\n  font-size: 0.75em;\n  vertical-align: super;\n  line-height: 0.01;\n}\n\na[epub|type=\"noteref\"]:href-epub-type(footnote, aside),\na[epub\\\\:type=\"noteref\"]:href-epub-type(footnote, aside) {\n  -adapt-template: footnote;\n  text-decoration: none;\n}\n\naside[epub|type=\"footnote\"],\naside[epub\\\\:type=\"footnote\"] {\n  display: none;\n}\n\naside[epub|type=\"footnote\"]:footnote-content,\naside[epub\\\\:type=\"footnote\"]:footnote-content {\n  display: block;\n  margin: 0.25em;\n  font-size: 1.2em;\n  line-height: 1.2;\n}\n\nepub|trigger {\n  display: none;\n}\n\nepub|switch {\n  display: inline;\n}\n\nepub|default {\n  display: inline;\n}\n\nepub|case {\n  display: none;\n}\n\nepub|case[required-namespace::supported] {\n  display: inline;\n}\n\nepub|case[required-namespace::supported] ~ epub|case {\n  display: none;\n}\n\nepub|case[required-namespace::supported] ~ epub|default {\n  display: none;\n}\n`;\n\n/** user-agent-toc.css */\nexport const UserAgentTocCss = `\n@namespace \"http://www.w3.org/1999/xhtml\";\n\n*:not([data-vivliostyle-role=doc-toc],\n  [data-vivliostyle-role=doc-toc] *,\n  :has([data-vivliostyle-role=doc-toc]),\n  :is(h1,h2,h3,h4,h5,h6):has(+:not(nav)[data-vivliostyle-role=doc-toc])) {\n  display: none;\n}\n\n[hidden] {\n  display: revert;\n}\n\n[data-vivliostyle-role=doc-toc] li a {\n  -adapt-behavior: toc-node-anchor;\n}\n\n[data-vivliostyle-role=doc-toc] li {\n  -adapt-behavior: toc-node;\n}\n\n[data-vivliostyle-role=doc-toc] li > :not(ul,ol):first-child {\n  -adapt-behavior: toc-node-first-child;\n}\n\n[data-vivliostyle-role=doc-toc] :is(ol,ul),\n[data-vivliostyle-role=doc-toc]:is(ol,ul) {\n  -adapt-behavior: toc-container;\n}\n`;\n\n/** vivliostyle-polyfill.css */\nexport const VivliostylePolyfillCss = `\n[data-viv-margin-discard~=\"block-start\"] {\n  margin-block-start: 0 !important;\n}\n[data-viv-margin-discard~=\"block-end\"] {\n  margin-block-end: 0 !important;\n}\n[data-viv-margin-discard~=\"inline-start\"] {\n  margin-inline-start: 0 !important;\n}\n[data-viv-margin-discard~=\"inline-end\"] {\n  margin-inline-end: 0 !important;\n}\n\n[data-viv-box-break~=\"inline-start\"]:not([data-viv-box-break~=\"clone\"]) {\n  margin-inline-start: 0 !important;\n  padding-inline-start: 0 !important;\n  border-inline-start-width: 0 !important;\n  border-start-start-radius: 0 !important;\n  border-end-start-radius: 0 !important;\n}\n[data-viv-box-break~=\"inline-end\"]:not([data-viv-box-break~=\"clone\"]) {\n  margin-inline-end: 0 !important;\n  padding-inline-end: 0 !important;\n  border-inline-end-width: 0 !important;\n  border-start-end-radius: 0 !important;\n  border-end-end-radius: 0 !important;\n}\n[data-viv-box-break~=\"block-start\"]:not([data-viv-box-break~=\"clone\"]):not(table[style*=\"border-collapse: collapse\"]:has(>thead)) {\n  margin-block-start: 0 !important;\n  padding-block-start: 0 !important;\n  border-block-start-width: 0 !important;\n  border-start-start-radius: 0 !important;\n  border-start-end-radius: 0 !important;\n}\n[data-viv-box-break~=\"block-end\"]:not([data-viv-box-break~=\"clone\"]):not(table[style*=\"border-collapse: collapse\"]:has(>tfoot)) {\n  margin-block-end: 0 !important;\n  padding-block-end: 0 !important;\n  border-block-end-width: 0 !important;\n  border-end-start-radius: 0 !important;\n  border-end-end-radius: 0 !important;\n}\n[data-viv-box-break~=\"block-start\"][data-viv-box-break~=\"text-start\"] {\n  text-indent: 0 !important;\n}\n[data-viv-box-break~=\"block-end\"][data-viv-box-break~=\"text-end\"][data-viv-box-break~=\"justify\"] {\n  text-align-last: justify !important;\n}\n[data-viv-box-break~=\"block-end\"][data-viv-box-break~=\"text-end\"][data-viv-box-break~=\"justify\"] > * {\n  text-align-last: auto;\n}\n[data-viv-box-break~=\"block-end\"][data-viv-box-break~=\"text-end\"]:not([data-viv-box-break~=\"justify\"]) {\n  text-align-last: auto !important;\n}\n\nspan.viv-anonymous-block {\n  display: block;\n}\n\n[data-vivliostyle-page-container] {\n  text-spacing-trim: space-all;\n  text-autospace: no-autospace;\n}\nviv-ts-open.viv-ts-auto > viv-ts-inner,\nviv-ts-open.viv-ts-trim > viv-ts-inner {\n  margin-inline-start: -0.5em;\n}\nviv-ts-close.viv-ts-auto > viv-ts-inner,\nviv-ts-close.viv-ts-trim > viv-ts-inner {\n  letter-spacing: -0.5em;\n}\nviv-ts-close.viv-hang-end > viv-ts-inner,\nviv-ts-close.viv-hang-last > viv-ts-inner {\n  letter-spacing: -1em;\n}\nviv-ts-open.viv-ts-auto::before,\nviv-ts-close.viv-ts-auto::after,\nviv-ts-close.viv-hang-end::after {\n  content: \" \";\n  font-family: Courier, monospace;\n  word-spacing: normal;\n  letter-spacing: -0.11em;\n  line-height: 0;\n  text-orientation: mixed;\n  visibility: hidden;\n}\nviv-ts-close.viv-hang-end:not(.viv-hang-hw)::after {\n  letter-spacing: 0.4em;\n}\nviv-ts-close.viv-hang-hw > viv-ts-inner {\n  letter-spacing: -0.5em;\n}\nviv-ts-open.viv-hang-first > viv-ts-inner {\n  display: inline-block;\n  line-height: 1;\n  inline-size: 1em;\n  text-indent: 0;\n  text-align: end;\n  text-align-last: end;\n  margin-inline-start: -1em;\n}\nviv-ts-thin-sp::after {\n  content: \" \";\n  font-family: Times, serif;\n  word-spacing: normal;\n  letter-spacing: -0.125em;\n  line-height: 0;\n  text-orientation: mixed;\n  visibility: hidden;\n}\n[style*=text-decoration] :is(viv-ts-thin-sp, viv-ts-close.viv-ts-auto)::after {\n  visibility: visible;\n}\n\nspan[data-viv-leader] {\n  text-combine-upright: none;\n  text-orientation: mixed;\n  white-space: pre;\n}\n\n/* ::marker */\n/* Mozilla Bullet font (https://github.com/mozilla/gecko-dev/blob/master/layout/style/res/Mozilla_Bullet.woff2) */\n@font-face {\n  font-family: \"-viv-moz-bullet\";\n  src: url(\"data:font/woff2;base64,d09GMgABAAAAAAScAAsAAAAACfAAAARNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAhBIRCAqGMIRJATYCJAMsCxgABCAFhF4HaBsuCMgehXEsLOlXaXd7sgbPQ172fjLwdhYFM92mABaiTuRVdO5/mx9I5UJiJom3phLRQw/TSF2M/vo25+pNyWkNws81NrUDAAf0QOdfcf7nmPEyBPZtCbbZEDuosskKZG922ZhBenh05qcSXktf6s3Oy9dAkWsyDzMoM5QTKcwKNjFayUPSREGFhUMrdE8MJsH052qGcYNO3pbEaYIBoDTItIKGAqhDdKHRD0kkKg6QGSCWEfueTNr3P6OvYaIbDH/8ULEAbjQtUt+hT/qmX/SH/twwMLDqN4jxzXjy4PHtltSA6lINqkpRd7N7onVBP20y7YBWyDIHFEBjqKBFMmECfQcTZtD3MmEB/SATVtCPM2ED/TQTdtCfS0/pEsN4ySin3r8q8xHE+0D0XMg8gJi4YrNpNv3qetXuDyeo6OBNZrq5gi7ouC1zcmB2Fd+FewIhcUIfszpF1hzXhrmMCwxaznRyZjig6Y2W7+bBn2DL8fJu/2oHbWc6X80+LUTXcVzv8O3IOy4qKVyFw/DHaMtfzNQEi5gbFT/EDpiofbpkYq2dQui6WcpfxrVBEJ/KxbLA4ZroZoVx+iE+QeTIiI7oKuoUIk/a1ekEOoNFjozm0suYYUelq13/88K1c3PTH9O9Q0d5LZbu7+J2aT7XP23KyQs+34WTU7r8d/k0l6dLl98Dn+/BSUZc7U0mm7FqhSMO9EHV/j5FB4qYX4aXNaKwz/4RRfAWsW8xGW+hvr8PTAf6IP9mRpkDwwv7QFz9HRuOeGWfd8rkyYsWTVy4vpG/pgVNWzBx0aTeIgeq58XFVfZXVduwuOq51a77aT0XLVw4v1PBFjRsQzO+tVeVp3KIwqfKbd6sdjzGvFSuPMquGpMT29lkrhwbE5uz6cGHhIETB06oUk+6tHLJgfnu/3nVnJzYxiXNjQNjYqsu+vCgYKDla5uUOzTNDZg46eCBd3d3gSk9Kz/bFiv8hvOzCT5eqyjBGerT+EiG/JGqwbC+UQ6Bv9bmKGWMj8Yn+fPVRJxKBGqTFXQyM9DhHSlvEHmLVxyYjY/Fdd3hACfLyP3VVZLvVR7B0pxSsGIBqHhwT5sSMOMkRG0BJhpsWMkEO24KwE0pqp3tIYTWCIjJjuBiGNTKTj8JoBLKAn4TmPFnj9oywZwFGx4egp1g3oObeLHdwUO2pFcYTITZCa2c1GQbNg6RCsu9bpikThhAWnLaBi3LM8+5VbMU6rUn30owOC83ULcfBlClb5BBre46BinaWRal85SUvlCbUx1Nbyj2HWCxBTkEgWScQKzsTioJW0IanAYRZqET4mZLSKU2JABII9np01lQ7lOt3srtM1KAeqgQPhYJSMCZJRuAukRZB1CF35gB1MJBr4ilIPZchNyIlDkpRt+3s96cz9K8XKQvCdZfcqWxgtLoXZ2AoKAyVSRRxSRmsYjVOriP089q3z6gdMjE5KI7kzumWzpnAwAAAA==\") format(\"woff2\");\n}\n[data-adapt-pseudo=\"marker\"] {\n  unicode-bidi: isolate;\n  font-variant-numeric: tabular-nums;\n  white-space: pre;\n  text-transform: none;\n}\n[data-adapt-pseudo=\"marker\"]._viv-marker-bullet {\n  font-family: \"-viv-moz-bullet\";\n  font-style: normal;\n  font-weight: normal;\n}\n[data-adapt-pseudo=\"marker\"]._viv-marker-outside {\n  position: absolute;\n  text-indent: 0;\n}\n[data-adapt-pseudo=\"marker\"] > ._viv-marker-outside-content {\n  position: absolute;\n  inset-inline-end: 0;\n}\n\n/* initial-letter */\n[style*=\"--viv-initialLetter\"]:has(>[data-adapt-pseudo=\"first-letter\"])::first-letter {\n  -webkit-initial-letter: var(--viv-initialLetter);\n  initial-letter: var(--viv-initialLetter);\n}\n`;\n\nexport const UserAgentCounterStylesCss =\n  // CSS Counter Styles Module Level 3\n  // https://drafts.csswg.org/css-counter-styles/\n  String.raw`\n@counter-style decimal-leading-zero {\n  system: extends decimal;\n  pad: 2 '0';\n}\n@counter-style arabic-indic {\n  system: numeric;\n  symbols: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩;\n}\n@counter-style armenian {\n  system: additive;\n  range: 1 9999;\n  additive-symbols: 9000 Ք, 8000 Փ, 7000 Ւ, 6000 Ց, 5000 Ր, 4000 Տ, 3000 Վ, 2000 Ս, 1000 Ռ, 900 Ջ, 800 Պ, 700 Չ, 600 Ո, 500 Շ, 400 Ն, 300 Յ, 200 Մ, 100 Ճ, 90 Ղ, 80 Ձ, 70 Հ, 60 Կ, 50 Ծ, 40 Խ, 30 Լ, 20 Ի, 10 Ժ, 9 Թ, 8 Ը, 7 Է, 6 Զ, 5 Ե, 4 Դ, 3 Գ, 2 Բ, 1 Ա;\n}\n@counter-style upper-armenian {\n  system: extends armenian;\n}\n@counter-style lower-armenian {\n  system: additive;\n  range: 1 9999;\n  additive-symbols: 9000 ք, 8000 փ, 7000 ւ, 6000 ց, 5000 ր, 4000 տ, 3000 վ, 2000 ս, 1000 ռ, 900 ջ, 800 պ, 700 չ, 600 ո, 500 շ, 400 ն, 300 յ, 200 մ, 100 ճ, 90 ղ, 80 ձ, 70 հ, 60 կ, 50 ծ, 40 խ, 30 լ, 20 ի, 10 ժ, 9 թ, 8 ը, 7 է, 6 զ, 5 ե, 4 դ, 3 գ, 2 բ, 1 ա;\n}\n@counter-style bengali {\n  system: numeric;\n  symbols: ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯;\n}\n@counter-style cambodian {\n  system: numeric;\n  symbols: ០ ១ ២ ៣ ៤ ៥ ៦ ៧ ៨ ៩;\n}\n@counter-style khmer {\n  system: extends cambodian;\n}\n@counter-style cjk-decimal {\n  system: numeric;\n  range: 0 infinite;\n  symbols: 〇 一 二 三 四 五 六 七 八 九;\n  suffix: \"、\";\n}\n@counter-style devanagari {\n  system: numeric;\n  symbols: ० १ २ ३ ४ ५ ६ ७ ८ ९;\n}\n@counter-style georgian {\n  system: additive;\n  range: 1 19999;\n  additive-symbols: 10000 ჵ, 9000 ჰ, 8000 ჯ, 7000 ჴ, 6000 ხ, 5000 ჭ, 4000 წ, 3000 ძ, 2000 ც, 1000 ჩ, 900 შ, 800 ყ, 700 ღ, 600 ქ, 500 ფ, 400 ჳ, 300 ტ, 200 ს, 100 რ, 90 ჟ, 80 პ, 70 ო, 60 ჲ, 50 ნ, 40 მ, 30 ლ, 20 კ, 10 ი, 9 თ, 8 ჱ, 7 ზ, 6 ვ, 5 ე, 4 დ, 3 გ, 2 ბ, 1 ა;\n}\n@counter-style gujarati {\n  system: numeric;\n  symbols: ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯;\n}\n@counter-style gurmukhi {\n  system: numeric;\n  symbols: ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯;\n}\n@counter-style hebrew {\n  system: additive;\n  range: 1 10999;\n  additive-symbols: 10000 \\5D9\\5F3, 9000 \\5D8\\5F3, 8000 \\5D7\\5F3, 7000 \\5D6\\5F3, 6000 \\5D5\\5F3, 5000 \\5D4\\5F3, 4000 \\5D3\\5F3, 3000 \\5D2\\5F3, 2000 \\5D1\\5F3, 1000 \\5D0\\5F3, 400 \\5EA, 300 \\5E9, 200 \\5E8, 100 \\5E7, 90 \\5E6, 80 \\5E4, 70 \\5E2, 60 \\5E1, 50 \\5E0, 40 \\5DE, 30 \\5DC, 20 \\5DB, 19 \\5D9\\5D8, 18 \\5D9\\5D7, 17 \\5D9\\5D6, 16 \\5D8\\5D6, 15 \\5D8\\5D5, 10 \\5D9, 9 \\5D8, 8 \\5D7, 7 \\5D6, 6 \\5D5, 5 \\5D4, 4 \\5D3, 3 \\5D2, 2 \\5D1, 1 \\5D0;\n}\n@counter-style kannada {\n  system: numeric;\n  symbols: ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯;\n}\n@counter-style lao {\n  system: numeric;\n  symbols: ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙;\n}\n@counter-style malayalam {\n  system: numeric;\n  symbols: ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯;\n}\n@counter-style mongolian {\n  system: numeric;\n  symbols: ᠐ ᠑ ᠒ ᠓ ᠔ ᠕ ᠖ ᠗ ᠘ ᠙;\n}\n@counter-style myanmar {\n  system: numeric;\n  symbols: ၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉;\n}\n@counter-style oriya {\n  system: numeric;\n  symbols: ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯;\n}\n@counter-style persian {\n  system: numeric;\n  symbols: ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹;\n}\n@counter-style lower-roman {\n  system: additive;\n  range: 1 3999;\n  additive-symbols: 1000 m, 900 cm, 500 d, 400 cd, 100 c, 90 xc, 50 l, 40 xl, 10 x, 9 ix, 5 v, 4 iv, 1 i;\n}\n@counter-style upper-roman {\n  system: additive;\n  range: 1 3999;\n  additive-symbols: 1000 M, 900 CM, 500 D, 400 CD, 100 C, 90 XC, 50 L, 40 XL, 10 X, 9 IX, 5 V, 4 IV, 1 I;\n}\n@counter-style tamil {\n  system: numeric;\n  symbols: ௦ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯;\n}\n@counter-style telugu {\n  system: numeric;\n  symbols: ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯;\n}\n@counter-style thai {\n  system: numeric;\n  symbols: ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙;\n}\n@counter-style tibetan {\n  system: numeric;\n  symbols: ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩;\n}\n@counter-style lower-alpha {\n  system: alphabetic;\n  symbols: 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;\n}\n@counter-style lower-latin {\n  system: extends lower-alpha;\n}\n@counter-style upper-alpha {\n  system: alphabetic;\n  symbols: 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;\n}\n@counter-style upper-latin {\n  system: extends upper-alpha;\n}\n@counter-style lower-greek {\n  system: alphabetic;\n  symbols: α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω;\n}\n@counter-style hiragana {\n  system: alphabetic;\n  symbols: あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ ゐ ゑ を ん;\n  suffix: \"、\";\n}\n@counter-style hiragana-iroha {\n  system: alphabetic;\n  symbols: い ろ は に ほ へ と ち り ぬ る を わ か よ た れ そ つ ね な ら む う ゐ の お く や ま け ふ こ え て あ さ き ゆ め み し ゑ ひ も せ す;\n  suffix: \"、\";\n}\n@counter-style katakana {\n  system: alphabetic;\n  symbols: ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヰ ヱ ヲ ン;\n  suffix: \"、\";\n}\n@counter-style katakana-iroha {\n  system: alphabetic;\n  symbols: イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ヰ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヱ ヒ モ セ ス;\n  suffix: \"、\";\n}\n@counter-style cjk-earthly-branch {\n  system: fixed;\n  symbols: 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥;\n  suffix: \"、\";\n  fallback: cjk-decimal;\n}\n@counter-style cjk-heavenly-stem {\n  system: fixed;\n  symbols: 甲 乙 丙 丁 戊 己 庚 辛 壬 癸;\n  suffix: \"、\";\n  fallback: cjk-decimal;\n}\n@counter-style japanese-informal {\n  system: additive;\n  range: -9999 9999;\n  additive-symbols: 9000 九千, 8000 八千, 7000 七千, 6000 六千, 5000 五千, 4000 四千, 3000 三千, 2000 二千, 1000 千, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 三百, 200 二百, 100 百, 90 九十, 80 八十, 70 七十, 60 六十, 50 五十, 40 四十, 30 三十, 20 二十, 10 十, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 三, 2 二, 1 一, 0 〇;\n  suffix: \"、\";\n  negative: マイナス;\n  fallback: cjk-decimal;\n}\n@counter-style japanese-formal {\n  system: additive;\n  range: -9999 9999;\n  additive-symbols: 9000 九阡, 8000 八阡, 7000 七阡, 6000 六阡, 5000 伍阡, 4000 四阡, 3000 参阡, 2000 弐阡, 1000 壱阡, 900 九百, 800 八百, 700 七百, 600 六百, 500 伍百, 400 四百, 300 参百, 200 弐百, 100 壱百, 90 九拾, 80 八拾, 70 七拾, 60 六拾, 50 伍拾, 40 四拾, 30 参拾, 20 弐拾, 10 壱拾, 9 九, 8 八, 7 七, 6 六, 5 伍, 4 四, 3 参, 2 弐, 1 壱, 0 零;\n  suffix: \"、\";\n  negative: マイナス;\n  fallback: cjk-decimal;\n}\n@counter-style korean-hangul-formal {\n  system: additive;\n  range: -9999 9999;\n  additive-symbols: 9000 구천, 8000 팔천, 7000 칠천, 6000 육천, 5000 오천, 4000 사천, 3000 삼천, 2000 이천, 1000 일천, 900 구백, 800 팔백, 700 칠백, 600 육백, 500 오백, 400 사백, 300 삼백, 200 이백, 100 일백, 90 구십, 80 팔십, 70 칠십, 60 육십, 50 오십, 40 사십, 30 삼십, 20 이십, 10 일십, 9 구, 8 팔, 7 칠, 6 육, 5 오, 4 사, 3 삼, 2 이, 1 일, 0 영;\n  suffix: ', ';\n  negative: \"마이너스 \";\n  fallback: cjk-decimal;\n}\n@counter-style korean-hanja-informal {\n  system: additive;\n  range: -9999 9999;\n  additive-symbols: 9000 九千, 8000 八千, 7000 七千, 6000 六千, 5000 五千, 4000 四千, 3000 三千, 2000 二千, 1000 千, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 三百, 200 二百, 100 百, 90 九十, 80 八十, 70 七十, 60 六十, 50 五十, 40 四十, 30 三十, 20 二十, 10 十, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 三, 2 二, 1 一, 0 零;\n  suffix: ', ';\n  negative: \"마이너스 \";\n  fallback: cjk-decimal;\n}\n@counter-style korean-hanja-formal {\n  system: additive;\n  range: -9999 9999;\n  additive-symbols: 9000 九仟, 8000 八仟, 7000 七仟, 6000 六仟, 5000 五仟, 4000 四仟, 3000 參仟, 2000 貳仟, 1000 壹仟, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 參百, 200 貳百, 100 壹百, 90 九拾, 80 八拾, 70 七拾, 60 六拾, 50 五拾, 40 四拾, 30 參拾, 20 貳拾, 10 壹拾, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 參, 2 貳, 1 壹, 0 零;\n  suffix: ', ';\n  negative: \"마이너스 \";\n  fallback: cjk-decimal;\n}\n` +\n  // Ready-made Counter Styles\n  // https://www.w3.org/TR/predefined-counter-styles/\n  // Includes only definitions supported in older versions.\n  `\n@counter-style lower-armenian {\n  system: additive;\n  range: 1 9999;\n  additive-symbols: 9000 ք, 8000 փ, 7000 ւ, 6000 ց, 5000 ր, 4000 տ, 3000 վ, 2000 ս, 1000 ռ, 900 ջ, 800 պ, 700 չ, 600 ո, 500 շ, 400 ն, 300 յ, 200 մ, 100 ճ, 90 ղ, 80 ձ, 70 հ, 60 կ, 50 ծ, 40 խ, 30 լ, 20 ի, 10 ժ, 9 թ, 8 ը, 7 է, 6 զ, 5 ե, 4 դ, 3 գ, 2 բ, 1 ա;\n}\n@counter-style upper-armenian {\n  system: additive;\n  range: 1 9999;\n  additive-symbols: 9000 Ք, 8000 Փ, 7000 Ւ, 6000 Ց, 5000 Ր, 4000 Տ, 3000 Վ, 2000 Ս, 1000 Ռ, 900 Ջ, 800 Պ, 700 Չ, 600 Ո, 500 Շ, 400 Ն, 300 Յ, 200 Մ, 100 Ճ, 90 Ղ, 80 Ձ, 70 Հ, 60 Կ, 50 Ծ, 40 Խ, 30 Լ, 20 Ի, 10 Ժ, 9 Թ, 8 Ը, 7 Է, 6 Զ, 5 Ե, 4 Դ, 3 Գ, 2 Բ, 1 Ա;\n}\n@counter-style lower-russian {\n  system: alphabetic;\n  symbols: а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ э ю я;\n  suffix: ') ';\n}\n@counter-style upper-russian {\n  system: alphabetic;\n  symbols: А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я;\n}`;\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Net - Fetch resource from a URL.\n */\nimport * as Base from \"./base\";\nimport * as Logging from \"./logging\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport { Net, XmlDoc } from \"./types\";\nimport { UserAgentXml } from \"./assets\";\n\n/**\n * @enum {string}\n */\nexport enum FetchResponseType {\n  DEFAULT = \"\",\n  ARRAYBUFFER = \"arraybuffer\",\n  BLOB = \"blob\",\n  DOCUMENT = \"document\",\n  JSON = \"json\",\n  TEXT = \"text\",\n}\n\nexport type FetchResponse = Net.FetchResponse;\n\nexport function fetchFromURL(\n  url: string,\n  opt_type?: FetchResponseType,\n  opt_method?: string,\n): Task.Result<FetchResponse> {\n  const frame: Task.Frame<FetchResponse> = Task.newFrame(\"fetchFromURL\");\n  const requestInit: RequestInit = {\n    method: opt_method || \"GET\",\n    mode: \"cors\",\n  };\n\n  const continuation = frame.suspend();\n  const response: FetchResponse = {\n    status: 0,\n    statusText: \"\",\n    url,\n    contentType: null,\n    responseText: null,\n    responseXML: null,\n    responseBlob: null,\n  };\n\n  fetch(url, requestInit)\n    .then((res) => {\n      response.status = res.status;\n      response.url = res.url;\n      response.statusText = res.statusText;\n      response.contentType = res.headers\n        .get(\"Content-Type\")\n        ?.replace(/;.*$/, \"\")\n        .toLowerCase();\n\n      if (!res.ok) {\n        // TODO: Handle error response\n        return res.text();\n      }\n      if (opt_type === FetchResponseType.BLOB) {\n        return res.blob();\n      }\n      if (opt_type === FetchResponseType.ARRAYBUFFER) {\n        return res.arrayBuffer();\n      }\n      if (opt_type === FetchResponseType.JSON) {\n        return res.json();\n      }\n\n      // Aozorabunko's (X)HTML support\n      if (\n        /\\/aozorabunko\\/[^/]+\\/cards\\/[^/]+\\/files\\/[^/.]+\\.html$/.test(url)\n      ) {\n        response.contentType = \"text/html\";\n        return res.arrayBuffer().then((buffer) => {\n          const decoder = new TextDecoder(\"Shift_JIS\");\n          const text = decoder.decode(buffer);\n          return text;\n        });\n      }\n      // Treat `data:,<h1>Hello</h1>` as text/html\n      if (/^data:,(<|%3c)/i.test(url)) {\n        response.contentType = \"text/html\";\n      }\n\n      return res.text();\n    })\n    .then((fetchedContent) => {\n      if (\n        opt_type === FetchResponseType.BLOB &&\n        fetchedContent instanceof Blob\n      ) {\n        response.responseBlob = fetchedContent;\n      } else if (\n        opt_type === FetchResponseType.ARRAYBUFFER &&\n        fetchedContent instanceof ArrayBuffer\n      ) {\n        response.responseBlob = makeBlob([fetchedContent]);\n      } else if (opt_type === FetchResponseType.JSON) {\n        response.responseText = JSON.stringify(fetchedContent);\n      } else if (typeof fetchedContent === \"string\") {\n        response.responseText = fetchedContent;\n      }\n      continuation.schedule(response);\n    })\n    .catch((e) => {\n      Logging.logger.warn(e, `Error fetching ${url}`);\n      continuation.schedule(response);\n    });\n  return frame.result();\n}\n\nexport function makeBlob(parts: BlobPart[], opt_type?: string): Blob {\n  const type = opt_type || \"application/octet-stream\";\n  return new Blob(parts, { type });\n}\n\nexport function readBlob(blob: Blob): Task.Result<ArrayBuffer> {\n  const frame: Task.Frame<ArrayBuffer> = Task.newFrame(\"readBlob\");\n  const fileReader = new FileReader();\n  const continuation = frame.suspend(fileReader);\n  fileReader.addEventListener(\n    \"load\",\n    () => {\n      continuation.schedule(fileReader.result as ArrayBuffer);\n    },\n    false,\n  );\n  fileReader.readAsArrayBuffer(blob);\n  return frame.result();\n}\n\nexport function revokeObjectURL(url: string): void {\n  URL.revokeObjectURL(url);\n}\n\n/**\n * @return url\n */\nexport function createObjectURL(blob: Blob): string {\n  return URL.createObjectURL(blob);\n}\n\n/**\n * @template Resource\n */\nexport class ResourceStore<Resource> implements Net.ResourceStore<Resource> {\n  resources: { [key: string]: Resource } = {};\n  fetchers: { [key: string]: TaskUtil.Fetcher<Resource> } = {};\n\n  constructor(\n    public readonly parser: (\n      p1: FetchResponse,\n      p2: ResourceStore<Resource>,\n    ) => Task.Result<Resource>,\n    public readonly type: FetchResponseType,\n  ) {}\n\n  /**\n   * @return resource for the given URL\n   */\n  load(\n    url: string,\n    opt_required?: boolean,\n    opt_message?: string,\n  ): Task.Result<Resource> {\n    url = Base.stripFragment(url);\n    const resource = this.resources[url];\n    if (typeof resource != \"undefined\") {\n      return Task.newResult(resource);\n    }\n    return this.fetch(url, opt_required, opt_message).get();\n  }\n\n  private fetchInner(\n    url: string,\n    opt_required?: boolean,\n    opt_message?: string,\n  ): Task.Result<Resource> {\n    const frame: Task.Frame<Resource> = Task.newFrame(\"fetch\");\n\n    // Hack for TOCView.showTOC()\n    const isTocBox = url.endsWith(\"?viv-toc-box\");\n    if (isTocBox) {\n      url = url.replace(\"?viv-toc-box\", \"\");\n    }\n    const userAgentXmlUrl = Base.resolveURL(\n      \"user-agent.xml\",\n      Base.resourceBaseURL,\n    );\n    const isUserAgentXml = !isTocBox && url === userAgentXmlUrl;\n    if (isUserAgentXml) {\n      // Change \"user-agent.xml\" URL to data URL\n      url = `data:application/xml,${encodeURIComponent(UserAgentXml)}`;\n    }\n\n    fetchFromURL(url, this.type).then((response) => {\n      if (response.status >= 400) {\n        if (opt_required) {\n          throw new Error(\n            (opt_message || `Failed to fetch required resource: ${url}`) +\n              ` (${response.status}${\n                response.statusText ? \" \" + response.statusText : \"\"\n              })`,\n          );\n        }\n      }\n      if (isTocBox) {\n        // Hack for TOCView.showTOC()\n        url += \"?viv-toc-box\";\n        response.url += \"?viv-toc-box\";\n      } else if (isUserAgentXml) {\n        // Restore \"user-agent.xml\" URL\n        response.url = url = userAgentXmlUrl;\n      }\n      this.parser(response, this).then((resource) => {\n        delete this.fetchers[url];\n        this.resources[url] = resource;\n        frame.finish(resource);\n      });\n    });\n    return frame.result();\n  }\n\n  /**\n   * @return fetcher for the resource for the given URL\n   */\n  fetch(\n    url: string,\n    opt_required?: boolean,\n    opt_message?: string,\n  ): TaskUtil.Fetcher<Resource> {\n    url = Base.stripFragment(url);\n    const resource = this.resources[url];\n    if (resource) {\n      return null;\n    }\n    let fetcher = this.fetchers[url];\n    if (!fetcher) {\n      fetcher = new TaskUtil.Fetcher(\n        () => this.fetchInner(url, opt_required, opt_message),\n        `Fetch ${url}`,\n      );\n      this.fetchers[url] = fetcher;\n      fetcher.start();\n    }\n    return fetcher;\n  }\n\n  get(url: string): XmlDoc.XMLDocHolder {\n    const resource: unknown = this.resources[Base.stripFragment(url)];\n    return resource as XmlDoc.XMLDocHolder;\n  }\n\n  delete(url: string) {\n    delete this.resources[Base.stripFragment(url)];\n  }\n}\n\nexport type JSONStore = ResourceStore<Base.JSON>;\n\nexport function parseJSONResource(\n  response: FetchResponse,\n  store: JSONStore,\n): Task.Result<Base.JSON> {\n  const text = response.responseText;\n  return Task.newResult(text ? Base.stringToJSON(text) : null);\n}\n\nexport function newJSONStore(): JSONStore {\n  return new ResourceStore(parseJSONResource, FetchResponseType.TEXT);\n}\n\n/**\n * @return holding event type (load/error/abort)\n */\nexport function loadElement(\n  elem: Element,\n  src?: string,\n  alt?: string,\n): TaskUtil.Fetcher<string> {\n  const fetcher = new TaskUtil.Fetcher(\n    () => {\n      const frame: Task.Frame<string> = Task.newFrame(\"loadElement\");\n      const continuation = frame.suspend(elem);\n      let done = false;\n      let timeoutId: number | null = null;\n      const handler = (evt: Event) => {\n        if (done) {\n          return;\n        } else {\n          done = true;\n        }\n        // Clear timeout to prevent unnecessary callback execution\n        if (timeoutId !== null) {\n          clearTimeout(timeoutId);\n          timeoutId = null;\n        }\n        continuation.schedule(evt ? evt.type : \"timeout\");\n      };\n      elem.addEventListener(\"load\", handler, false);\n      elem.addEventListener(\"error\", handler, false);\n      elem.addEventListener(\"abort\", handler, false);\n      if (elem.namespaceURI == Base.NS.SVG) {\n        if (src) {\n          elem.setAttributeNS(Base.NS.XLINK, \"xlink:href\", src);\n        }\n        // SVG handlers are not reliable\n        timeoutId = setTimeout(handler, 300);\n      } else if (elem.localName === \"script\") {\n        timeoutId = setTimeout(handler, 3000);\n      } else if (src) {\n        if (elem.localName === \"img\") {\n          const imgElem = elem as HTMLImageElement;\n          // Remove loading=\"lazy\" attribute to ensure images load immediately\n          // for proper pagination (Vivliostyle needs image dimensions for layout)\n          if (imgElem.loading === \"lazy\") {\n            imgElem.loading = \"eager\";\n          }\n          imgElem.src = src;\n          if (alt) {\n            imgElem.alt = alt;\n          }\n          // Handle already cached images\n          if (imgElem.complete) {\n            // Image already loaded (from cache)\n            setTimeout(() => handler(new Event(\"load\")), 0);\n          } else {\n            // Set a longer timeout to handle slow networks and large images\n            timeoutId = setTimeout(handler, 30000);\n          }\n        } else {\n          (elem as any).src = src;\n          if (alt) {\n            (elem as any).alt = alt;\n          }\n        }\n      }\n      return frame.result();\n    },\n    `loadElement ${src || elem.localName}`,\n  );\n  fetcher.start();\n  return fetcher;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssParser - CSS Parser.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Exprs from \"./exprs\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport { TokenType } from \"./css-tokenizer\";\n\n/**\n * User agent stylesheet base specificity.\n */\nexport const SPECIFICITY_USER_AGENT: number = 0;\n\n/**\n * User stylesheet base specificity.\n */\nexport const SPECIFICITY_USER: number = 0x1000000;\n\n/**\n * Author stylesheet (\"normal\" stylesheet) base specificity.\n */\nexport const SPECIFICITY_AUTHOR: number = 0x2000000;\n\n/**\n * Style attribute base specificity.\n */\nexport const SPECIFICITY_STYLE: number = 0x3000000;\n\n/**\n * Style attribute base specificity when !important is used.\n */\nexport const SPECIFICITY_STYLE_IMPORTANT: number = 0x4000000;\n\n/**\n * Author stylesheet base specificity when !important is used.\n */\nexport const SPECIFICITY_AUTHOR_IMPORTANT: number = 0x5000000;\n\n/**\n * User stylesheet base specificity when !important is used.\n */\nexport const SPECIFICITY_USER_IMPORTANT: number = 0x6000000;\n\n/**\n * @enum {string}\n */\nexport enum StylesheetFlavor {\n  USER_AGENT = \"UA\",\n  USER = \"User\",\n  AUTHOR = \"Author\",\n}\n\nexport class ParserHandler implements CssTokenizer.TokenizerHandler {\n  flavor: StylesheetFlavor;\n\n  constructor(public scope: Exprs.LexicalScope) {\n    this.flavor = StylesheetFlavor.AUTHOR;\n  }\n\n  getCurrentToken(): CssTokenizer.Token {\n    return null;\n  }\n\n  getScope(): Exprs.LexicalScope {\n    return this.scope;\n  }\n\n  error(mnemonics: string, token: CssTokenizer.Token): void {}\n\n  startStylesheet(flavor: StylesheetFlavor): void {\n    this.flavor = flavor;\n  }\n\n  tagSelector(ns: string | null, name: string | null): void {}\n\n  classSelector(name: string): void {}\n\n  pseudoclassSelector(name: string, params: (number | string)[]): void {}\n\n  pseudoelementSelector(name: string, params: (number | string)[]): void {}\n\n  idSelector(id: string): void {}\n\n  attributeSelector(\n    ns: string,\n    name: string,\n    op: TokenType,\n    value: string | null,\n  ): void {}\n\n  descendantSelector(): void {}\n\n  childSelector(): void {}\n\n  adjacentSiblingSelector(): void {}\n\n  followingSiblingSelector(): void {}\n\n  nextSelector(): void {}\n\n  startSelectorRule(): void {}\n\n  startFontFaceRule(): void {}\n\n  startCounterStyleRule(name: string): void {}\n\n  startFootnoteRule(pseudoelem: string | null): void {}\n\n  startViewportRule(): void {}\n\n  startDefineRule(): void {}\n\n  startRegionRule(): void {}\n\n  startPageRule(): void {}\n\n  startPageMarginBoxRule(name: string): void {}\n\n  startWhenRule(expr: Css.Expr): void {}\n\n  startMediaRule(expr: Css.Expr): void {\n    this.startWhenRule(expr);\n  }\n\n  startFlowRule(flowName: string): void {}\n\n  startPageTemplateRule(): void {}\n\n  startPageMasterRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {}\n\n  startPartitionRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {}\n\n  startPartitionGroupRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {}\n\n  startRuleBody(): void {}\n\n  property(name: string, value: Css.Val, important: boolean): void {}\n\n  endRule(): void {}\n\n  /**\n   * @param funcName The name of the function taking a selector list as argument\n   * @param params Optional parameters (e.g., [a, b] for nth-child(An+B of S))\n   */\n  startFuncWithSelector(funcName: string, params?: (number | string)[]): void {}\n\n  endFuncWithSelector(): void {}\n\n  /**\n   * For relational pseudo-class `:has()` support\n   */\n  pushSelectorText(selectorText: string) {}\n\n  getImportantSpecificity(): number {\n    switch (this.flavor) {\n      case StylesheetFlavor.USER_AGENT:\n        return SPECIFICITY_USER_AGENT;\n      case StylesheetFlavor.USER:\n        return SPECIFICITY_USER_IMPORTANT;\n      default:\n        return SPECIFICITY_AUTHOR_IMPORTANT;\n    }\n  }\n\n  getBaseSpecificity(): number {\n    switch (this.flavor) {\n      case StylesheetFlavor.USER_AGENT:\n        return SPECIFICITY_USER_AGENT;\n      case StylesheetFlavor.USER:\n        return SPECIFICITY_USER;\n      default:\n        return SPECIFICITY_AUTHOR;\n    }\n  }\n}\n\nexport class DispatchParserHandler extends ParserHandler {\n  stack: ParserHandler[] = [];\n  tokenizer: CssTokenizer.Tokenizer = null;\n  slave: ParserHandler = null;\n\n  constructor() {\n    super(null);\n  }\n\n  pushHandler(slave: ParserHandler): void {\n    this.stack.push(this.slave);\n    this.slave = slave;\n  }\n\n  popHandler(): void {\n    this.slave = this.stack.pop();\n  }\n\n  override getCurrentToken(): CssTokenizer.Token {\n    if (this.tokenizer) {\n      return this.tokenizer.token();\n    }\n    return null;\n  }\n\n  override getScope(): Exprs.LexicalScope {\n    return this.slave.getScope();\n  }\n\n  /**\n   * Forwards call to slave.\n   * @override\n   */\n  error(mnemonics: string, token: CssTokenizer.Token): void {\n    this.slave.error(mnemonics, token);\n  }\n\n  /**\n   * Called by a slave.\n   */\n  errorMsg(mnemonics: string, token: CssTokenizer.Token): void {\n    Logging.logger.warn(mnemonics, token?.toString() ?? \"\");\n  }\n\n  override startStylesheet(flavor: StylesheetFlavor): void {\n    super.startStylesheet(flavor);\n    if (this.stack.length > 0) {\n      // This can occur as a result of an error\n      this.slave = this.stack[0];\n      this.stack = [];\n    }\n    this.slave.startStylesheet(flavor);\n  }\n\n  override tagSelector(ns: string | null, name: string | null): void {\n    this.slave.tagSelector(ns, name);\n  }\n\n  override classSelector(name: string): void {\n    this.slave.classSelector(name);\n  }\n\n  override pseudoclassSelector(\n    name: string,\n    params: (number | string)[],\n  ): void {\n    this.slave.pseudoclassSelector(name, params);\n  }\n\n  override pseudoelementSelector(\n    name: string,\n    params: (number | string)[],\n  ): void {\n    this.slave.pseudoelementSelector(name, params);\n  }\n\n  override idSelector(id: string): void {\n    this.slave.idSelector(id);\n  }\n\n  override attributeSelector(\n    ns: string,\n    name: string,\n    op: TokenType,\n    value: string | null,\n  ): void {\n    this.slave.attributeSelector(ns, name, op, value);\n  }\n\n  override descendantSelector(): void {\n    this.slave.descendantSelector();\n  }\n\n  override childSelector(): void {\n    this.slave.childSelector();\n  }\n\n  override adjacentSiblingSelector(): void {\n    this.slave.adjacentSiblingSelector();\n  }\n\n  override followingSiblingSelector(): void {\n    this.slave.followingSiblingSelector();\n  }\n\n  override nextSelector(): void {\n    this.slave.nextSelector();\n  }\n\n  override startSelectorRule(): void {\n    this.slave.startSelectorRule();\n  }\n\n  override startFontFaceRule(): void {\n    this.slave.startFontFaceRule();\n  }\n\n  override startCounterStyleRule(name: string): void {\n    this.slave.startCounterStyleRule(name);\n  }\n\n  override startFootnoteRule(pseudoelem: string | null): void {\n    this.slave.startFootnoteRule(pseudoelem);\n  }\n\n  override startViewportRule(): void {\n    this.slave.startViewportRule();\n  }\n\n  override startDefineRule(): void {\n    this.slave.startDefineRule();\n  }\n\n  override startRegionRule(): void {\n    this.slave.startRegionRule();\n  }\n\n  override startPageRule(): void {\n    this.slave.startPageRule();\n  }\n\n  override startPageMarginBoxRule(name: string): void {\n    this.slave.startPageMarginBoxRule(name);\n  }\n\n  override startWhenRule(expr: Css.Expr): void {\n    this.slave.startWhenRule(expr);\n  }\n\n  override startFlowRule(flowName: string): void {\n    this.slave.startFlowRule(flowName);\n  }\n\n  override startPageTemplateRule(): void {\n    this.slave.startPageTemplateRule();\n  }\n\n  override startPageMasterRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    this.slave.startPageMasterRule(name, pseudoName, classes);\n  }\n\n  override startPartitionRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    this.slave.startPartitionRule(name, pseudoName, classes);\n  }\n\n  override startPartitionGroupRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    this.slave.startPartitionGroupRule(name, pseudoName, classes);\n  }\n\n  override startRuleBody(): void {\n    this.slave.startRuleBody();\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    this.slave.property(name, value, important);\n  }\n\n  override endRule(): void {\n    this.slave.endRule();\n  }\n\n  override startFuncWithSelector(\n    funcName: string,\n    params?: (number | string)[],\n  ): void {\n    this.slave.startFuncWithSelector(funcName, params);\n  }\n\n  override endFuncWithSelector(): void {\n    this.slave.endFuncWithSelector();\n  }\n\n  override pushSelectorText(selectorText: string): void {\n    this.slave.pushSelectorText(selectorText);\n  }\n}\n\nexport class SkippingParserHandler extends ParserHandler {\n  depth: number = 0;\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    public owner: DispatchParserHandler,\n    public readonly topLevel,\n  ) {\n    super(scope);\n    if (owner) {\n      this.flavor = owner.flavor;\n    }\n  }\n\n  override getCurrentToken(): CssTokenizer.Token {\n    return this.owner?.getCurrentToken();\n  }\n\n  override error(mnemonics: string, token: CssTokenizer.Token): void {\n    this.owner?.errorMsg(mnemonics, token);\n  }\n\n  override startRuleBody(): void {\n    this.depth++;\n  }\n\n  override endRule(): void {\n    if (--this.depth == 0 && !this.topLevel) {\n      this.owner.popHandler();\n    }\n  }\n}\n\nexport class SlaveParserHandler extends SkippingParserHandler {\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: DispatchParserHandler,\n    topLevel: boolean,\n  ) {\n    super(scope, owner, topLevel);\n  }\n\n  report(message: string): void {\n    this.error(message, this.getCurrentToken());\n  }\n\n  reportAndSkip(message: string): void {\n    this.report(message);\n    this.owner.pushHandler(\n      new SkippingParserHandler(this.scope, this.owner, false),\n    );\n  }\n\n  override startSelectorRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_SELECTOR\");\n  }\n\n  override startFontFaceRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_FONT_FACE\");\n  }\n\n  override startCounterStyleRule(name: string): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_COUNTER_STYLE\");\n  }\n\n  override startFootnoteRule(pseudoelem: string | null): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_FOOTNOTE\");\n  }\n\n  override startViewportRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_VIEWPORT\");\n  }\n\n  override startDefineRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_DEFINE\");\n  }\n\n  override startRegionRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_REGION\");\n  }\n\n  override startPageRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE\");\n  }\n\n  override startWhenRule(expr: Css.Expr): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_WHEN\");\n  }\n\n  override startFlowRule(flowName: string): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_FLOW\");\n  }\n\n  override startPageTemplateRule(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE_TEMPLATE\");\n  }\n\n  override startPageMasterRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_PAGE_MASTER\");\n  }\n\n  override startPartitionRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_PARTITION\");\n  }\n\n  override startPartitionGroupRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_PARTITION_GROUP\");\n  }\n\n  override startFuncWithSelector(\n    funcName: string,\n    params?: (number | string)[],\n  ): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_SELECTOR_FUNC\");\n  }\n\n  override endFuncWithSelector(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_END_SELECTOR_FUNC\");\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    this.error(\"E_CSS_UNEXPECTED_PROPERTY\", this.getCurrentToken());\n  }\n}\n\nexport const actionsBase: Action[] = [];\n\nexport const actionsStyleAttribute: Action[] = [];\n\nexport const actionsSelector: Action[] = [];\n\nexport const actionsSelectorInFunc: Action[] = [];\n\nexport const actionsSelectorCont: Action[] = [];\n\nexport const actionsSelectorStart: Action[] = [];\n\nexport const actionsPropVal: Action[] = [];\n\nexport const actionsExprVal: Action[] = [];\n\nexport const actionsExprOp: Action[] = [];\n\nexport const actionsError: Action[] = [];\n\nexport const actionsErrorDecl: Action[] = [];\n\nexport const actionsErrorSelector: Action[] = [];\n\nexport const priority: number[] = [];\n\n/**\n * @enum {number}\n */\nexport enum Action {\n  SELECTOR_NAME_1 = 1,\n  SELECTOR_NAME,\n  SELECTOR_ANY_1,\n  SELECTOR_ANY,\n  SELECTOR_ID_1,\n  SELECTOR_ID,\n  SELECTOR_CLASS_1,\n  SELECTOR_CLASS,\n  SELECTOR_ATTR_1,\n  SELECTOR_ATTR,\n  SELECTOR_CHILD,\n  SELECTOR_SIBLING,\n  SELECTOR_BODY,\n  SELECTOR_PSEUDOCLASS,\n  VAL_IDENT,\n  VAL_HASH,\n  VAL_NUM,\n  VAL_INT,\n  VAL_NUMERIC,\n  VAL_STR,\n  VAL_URL,\n  VAL_COMMA,\n  VAL_SLASH,\n  VAL_FUNC,\n  VAL_C_PAR,\n  VAL_END,\n  RULE_END,\n  IDENT,\n  SELECTOR_START,\n  AT,\n  EXPR_IDENT,\n  EXPR_NUM,\n  EXPR_NUMERIC,\n  EXPR_STR,\n  EXPR_PARAM,\n  EXPR_PREFIX,\n  EXPR_INFIX,\n  EXPR_FUNC,\n  EXPR_C_PAR,\n  EXPR_O_PAR,\n  SELECTOR_NEXT,\n  SELECTOR_PSEUDOELEM,\n  EXPR_O_BRC,\n  VAL_FINISH,\n  EXPR_INFIX_NAME,\n  PROP,\n  VAL_BANG,\n  VAL_BRC,\n  EXPR_SEMICOL,\n  ERROR_PUSH,\n  ERROR_POP,\n  ERROR_POP_DECL,\n  ERROR_SEMICOL,\n  VAL_PLUS,\n  SELECTOR_PSEUDOCLASS_1,\n  SELECTOR_FOLLOWING_SIBLING,\n  VAL_URANGE,\n  SELECTOR_PSEUDOELEM_1,\n  DONE = 200,\n}\n\nexport const OP_MEDIA_AND: number = TokenType.LAST + 1;\nexport const OP_MEDIA_OR: number = TokenType.LAST + 2;\nexport const OP_MEDIA_NOT: number = TokenType.LAST + 3;\n\n(() => {\n  actionsBase[TokenType.IDENT] = Action.IDENT;\n  actionsBase[TokenType.STAR] = Action.SELECTOR_START;\n  actionsBase[TokenType.HASH] = Action.SELECTOR_START;\n  actionsBase[TokenType.CLASS] = Action.SELECTOR_START;\n  actionsBase[TokenType.O_BRK] = Action.SELECTOR_START;\n  actionsBase[TokenType.COLON] = Action.SELECTOR_START;\n  actionsBase[TokenType.COL_COL] = Action.SELECTOR_START;\n  actionsBase[TokenType.AT] = Action.AT;\n  actionsBase[TokenType.C_BRC] = Action.RULE_END;\n  actionsBase[TokenType.EOF] = Action.DONE;\n  actionsStyleAttribute[TokenType.IDENT] = Action.PROP;\n  actionsStyleAttribute[TokenType.EOF] = Action.DONE;\n  actionsSelectorStart[TokenType.IDENT] = Action.SELECTOR_NAME;\n  actionsSelectorStart[TokenType.STAR] = Action.SELECTOR_ANY;\n  actionsSelectorStart[TokenType.HASH] = Action.SELECTOR_ID;\n  actionsSelectorStart[TokenType.CLASS] = Action.SELECTOR_CLASS;\n  actionsSelectorStart[TokenType.O_BRK] = Action.SELECTOR_ATTR;\n  actionsSelectorStart[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS;\n  actionsSelectorStart[TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM;\n\n  actionsSelector[TokenType.GT] = Action.SELECTOR_CHILD;\n  actionsSelector[TokenType.PLUS] = Action.SELECTOR_SIBLING;\n  actionsSelector[TokenType.TILDE] = Action.SELECTOR_FOLLOWING_SIBLING;\n  actionsSelector[TokenType.IDENT] = Action.SELECTOR_NAME_1;\n  actionsSelector[TokenType.STAR] = Action.SELECTOR_ANY_1;\n  actionsSelector[TokenType.HASH] = Action.SELECTOR_ID_1;\n  actionsSelector[TokenType.CLASS] = Action.SELECTOR_CLASS_1;\n  actionsSelector[TokenType.O_BRK] = Action.SELECTOR_ATTR_1;\n  actionsSelector[TokenType.O_BRC] = Action.SELECTOR_BODY;\n  actionsSelector[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS_1;\n  actionsSelector[TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM_1;\n  actionsSelector[TokenType.COMMA] = Action.SELECTOR_NEXT;\n  actionsSelectorInFunc[TokenType.GT] = Action.SELECTOR_CHILD;\n  actionsSelectorInFunc[TokenType.PLUS] = Action.SELECTOR_SIBLING;\n  actionsSelectorInFunc[TokenType.TILDE] = Action.SELECTOR_FOLLOWING_SIBLING;\n  actionsSelectorInFunc[TokenType.IDENT] = Action.SELECTOR_NAME_1;\n  actionsSelectorInFunc[TokenType.STAR] = Action.SELECTOR_ANY_1;\n  actionsSelectorInFunc[TokenType.HASH] = Action.SELECTOR_ID_1;\n  actionsSelectorInFunc[TokenType.CLASS] = Action.SELECTOR_CLASS_1;\n  actionsSelectorInFunc[TokenType.O_BRK] = Action.SELECTOR_ATTR_1;\n  actionsSelectorInFunc[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS_1;\n  actionsSelectorCont[TokenType.IDENT] = Action.SELECTOR_NAME;\n  actionsSelectorCont[TokenType.STAR] = Action.SELECTOR_ANY;\n  actionsSelectorCont[TokenType.HASH] = Action.SELECTOR_ID;\n  actionsSelectorCont[TokenType.CLASS] = Action.SELECTOR_CLASS;\n  actionsSelectorCont[TokenType.COLON] = Action.SELECTOR_PSEUDOCLASS;\n  actionsSelectorCont[TokenType.COL_COL] = Action.SELECTOR_PSEUDOELEM;\n  actionsSelectorCont[TokenType.O_BRK] = Action.SELECTOR_ATTR;\n  actionsSelectorCont[TokenType.O_BRC] = Action.SELECTOR_BODY;\n  actionsPropVal[TokenType.IDENT] = Action.VAL_IDENT;\n  actionsPropVal[TokenType.HASH] = Action.VAL_HASH;\n  actionsPropVal[TokenType.NUM] = Action.VAL_NUM;\n  actionsPropVal[TokenType.INT] = Action.VAL_INT;\n  actionsPropVal[TokenType.NUMERIC] = Action.VAL_NUMERIC;\n  actionsPropVal[TokenType.STR] = Action.VAL_STR;\n  actionsPropVal[TokenType.URL] = Action.VAL_URL;\n  actionsPropVal[TokenType.URANGE] = Action.VAL_URANGE;\n  actionsPropVal[TokenType.COMMA] = Action.VAL_COMMA;\n  actionsPropVal[TokenType.SLASH] = Action.VAL_SLASH;\n  actionsPropVal[TokenType.FUNC] = Action.VAL_FUNC;\n  actionsPropVal[TokenType.C_PAR] = Action.VAL_C_PAR;\n  actionsPropVal[TokenType.SEMICOL] = Action.VAL_END;\n  actionsPropVal[TokenType.C_BRC] = Action.VAL_BRC;\n  actionsPropVal[TokenType.BANG] = Action.VAL_BANG;\n  actionsPropVal[TokenType.PLUS] = Action.VAL_PLUS;\n  actionsPropVal[TokenType.EOF] = Action.VAL_FINISH;\n  actionsExprVal[TokenType.IDENT] = Action.EXPR_IDENT;\n  actionsExprVal[TokenType.NUM] = Action.EXPR_NUM;\n  actionsExprVal[TokenType.INT] = Action.EXPR_NUM;\n  actionsExprVal[TokenType.NUMERIC] = Action.EXPR_NUMERIC;\n  actionsExprVal[TokenType.STR] = Action.EXPR_STR;\n  actionsExprVal[TokenType.O_PAR] = Action.EXPR_O_PAR;\n  actionsExprVal[TokenType.FUNC] = Action.EXPR_FUNC;\n  actionsExprVal[TokenType.BANG] = Action.EXPR_PREFIX;\n  actionsExprVal[TokenType.MINUS] = Action.EXPR_PREFIX;\n  actionsExprVal[TokenType.DOLLAR] = Action.EXPR_PARAM;\n  actionsExprOp[TokenType.IDENT] = Action.EXPR_INFIX_NAME;\n  actionsExprOp[TokenType.COMMA] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.GT] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.LT] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.GT_EQ] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.LT_EQ] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.EQ] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.EQ_EQ] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.BANG_EQ] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.AMP_AMP] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.BAR_BAR] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.PLUS] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.MINUS] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.SLASH] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.PERCENT] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.STAR] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.COLON] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.QMARK] = Action.EXPR_INFIX;\n  actionsExprOp[TokenType.C_PAR] = Action.EXPR_C_PAR;\n  actionsExprOp[TokenType.O_BRC] = Action.EXPR_O_BRC;\n  actionsExprOp[TokenType.SEMICOL] = Action.EXPR_SEMICOL;\n  actionsError[TokenType.EOF] = Action.DONE;\n  actionsError[TokenType.O_BRC] = Action.ERROR_PUSH;\n  actionsError[TokenType.C_BRC] = Action.ERROR_POP;\n  actionsError[TokenType.O_BRK] = Action.ERROR_PUSH;\n  actionsError[TokenType.C_BRK] = Action.ERROR_POP;\n  actionsError[TokenType.O_PAR] = Action.ERROR_PUSH;\n  actionsError[TokenType.C_PAR] = Action.ERROR_POP;\n  actionsError[TokenType.SEMICOL] = Action.ERROR_SEMICOL;\n  actionsErrorDecl[TokenType.EOF] = Action.DONE;\n  actionsErrorDecl[TokenType.O_BRC] = Action.ERROR_PUSH;\n  actionsErrorDecl[TokenType.C_BRC] = Action.ERROR_POP_DECL;\n  actionsErrorDecl[TokenType.O_BRK] = Action.ERROR_PUSH;\n  actionsErrorDecl[TokenType.C_BRK] = Action.ERROR_POP;\n  actionsErrorDecl[TokenType.O_PAR] = Action.ERROR_PUSH;\n  actionsErrorDecl[TokenType.C_PAR] = Action.ERROR_POP;\n  actionsErrorDecl[TokenType.SEMICOL] = Action.ERROR_SEMICOL;\n  actionsErrorSelector[TokenType.EOF] = Action.DONE;\n  actionsErrorSelector[TokenType.O_BRC] = Action.ERROR_PUSH;\n  actionsErrorSelector[TokenType.C_BRC] = Action.ERROR_POP;\n  actionsErrorSelector[TokenType.O_BRK] = Action.ERROR_PUSH;\n  actionsErrorSelector[TokenType.C_BRK] = Action.ERROR_POP;\n  actionsErrorSelector[TokenType.O_PAR] = Action.ERROR_PUSH;\n  actionsErrorSelector[TokenType.C_PAR] = Action.ERROR_POP;\n  priority[TokenType.C_PAR] = 0;\n  priority[TokenType.COMMA] = 0;\n  priority[TokenType.QMARK] = 1;\n  priority[TokenType.COLON] = 1;\n  priority[TokenType.AMP_AMP] = 2;\n  priority[TokenType.BAR_BAR] = 2;\n  priority[TokenType.LT] = 3;\n  priority[TokenType.GT] = 3;\n  priority[TokenType.LT_EQ] = 3;\n  priority[TokenType.GT_EQ] = 3;\n  priority[TokenType.EQ] = 3;\n  priority[TokenType.EQ_EQ] = 3;\n  priority[TokenType.BANG_EQ] = 3;\n  priority[TokenType.PLUS] = 4;\n  priority[TokenType.MINUS] = 4;\n  priority[TokenType.STAR] = 5;\n  priority[TokenType.SLASH] = 5;\n  priority[TokenType.PERCENT] = 5;\n  priority[TokenType.EOF] = 6;\n  priority[OP_MEDIA_AND] = 2;\n  priority[OP_MEDIA_OR] = 2;\n})();\n\n/**\n * @enum {number}\n */\nexport enum ExprContext {\n  PROP,\n  WHEN,\n  MEDIA,\n  IMPORT,\n  SUPPORTS,\n}\n\nexport class Parser {\n  valStack: any[] = [];\n  namespacePrefixToURI: { [key: string]: string } = {};\n  defaultNamespaceURI: string | null = null;\n  propName: string | null = null;\n  propImportant: boolean = false;\n  exprContext: ExprContext;\n  result: Css.Val = null;\n  importReady: boolean = false;\n  importURL: string | null = null;\n  importCondition: Css.Expr = null;\n  errorBrackets: number[] = [];\n  ruleStack: string[] = [];\n  regionRule: boolean = false;\n  pageRule: boolean = false;\n  inStyleDeclaration: boolean = false;\n\n  constructor(\n    public actions: Action[],\n    public tokenizer: CssTokenizer.Tokenizer,\n    public readonly handler: ParserHandler,\n    public baseURL: string,\n  ) {\n    this.exprContext = ExprContext.MEDIA;\n  }\n\n  extractVals(sep: string, index: number): Css.Val[] {\n    const arr: Css.Val[] = [];\n    const valStack = this.valStack;\n    while (index < valStack.length) {\n      arr.push(valStack[index++] as Css.Val);\n      if (index === valStack.length) {\n        break;\n      }\n      if (valStack[index++] !== sep) {\n        throw new Error(\"Unexpected state\");\n      }\n      if (index === valStack.length) {\n        // keep last comma in `var(--b , )`\n        arr.push(Css.empty);\n      }\n    }\n    return arr;\n  }\n\n  valStackReduce(sep: string, token: CssTokenizer.Token): Css.Val {\n    const valStack = this.valStack;\n    let index = valStack.length;\n    let parLevel = 0;\n    let v;\n    do {\n      v = valStack[--index];\n      if (sep === \")\" && v instanceof Css.AnyToken) {\n        // For nested parens in calc() (Issue #1014)\n        if (v.text === \")\") {\n          parLevel++;\n        } else if (v.text === \"(\") {\n          if (parLevel === 0) {\n            return null;\n          }\n          parLevel--;\n        }\n      }\n    } while (typeof v != \"undefined\" && typeof v != \"string\");\n    let count = valStack.length - (index + 1);\n    if (count > 1) {\n      valStack.splice(\n        index + 1,\n        count,\n        new Css.SpaceList(valStack.slice(index + 1, valStack.length)),\n      );\n    }\n    if (sep == \",\") {\n      return null;\n    }\n    index++;\n    do {\n      v = valStack[--index];\n    } while (typeof v != \"undefined\" && (typeof v != \"string\" || v == \",\"));\n    count = valStack.length - (index + 1);\n    if (v == \"(\") {\n      if (sep != \")\") {\n        if (token.type !== TokenType.EOF) {\n          this.handler.error(\"E_CSS_MISMATCHED_C_PAR\", token);\n          this.actions = actionsErrorDecl;\n        }\n      }\n      const func = new Css.Func(\n        valStack[index - 1] as string,\n        this.extractVals(\",\", index + 1),\n      );\n      valStack.splice(index - 1, count + 2, func);\n\n      // Check invalid var()\n      if (func.name === \"var\") {\n        const name = func.values[0] instanceof Css.Ident && func.values[0].name;\n        if (!Css.isCustomPropName(name) || name === this.propName) {\n          this.handler.error(`E_CSS_INVALID_VAR ${func.toString()}`, token);\n          this.actions = actionsErrorDecl;\n        }\n      }\n      return func;\n    }\n    if (sep != \";\" || index >= 0) {\n      this.handler.error(\"E_CSS_UNEXPECTED_VAL_END\", token);\n      this.actions = actionsErrorDecl;\n      return null;\n    }\n    if (count > 1) {\n      return new Css.CommaList(this.extractVals(\",\", index + 1));\n    }\n    const val = valStack[0];\n    if (val instanceof Css.Val) {\n      return val;\n    } else if (!val) {\n      return Css.empty;\n    } else {\n      // custom property value can be arbitrary token e.g. \",\"\n      return new Css.AnyToken(val.toString());\n    }\n  }\n\n  exprError(mnemonics: string, token: CssTokenizer.Token) {\n    this.actions = this.propName ? actionsErrorDecl : actionsError;\n    // this.handler.error(mnemonics, token);\n    // (should not throw error by expression syntax errors)\n    Logging.logger.warn(mnemonics, token.toString());\n  }\n\n  exprStackReduce(op: number, token: CssTokenizer.Token): boolean {\n    const valStack = this.valStack;\n    const handler = this.handler;\n    let val = valStack.pop() as Exprs.Val;\n    let val2: Exprs.Val;\n    while (true) {\n      let tok = valStack.pop();\n      if (op == TokenType.C_PAR) {\n        const args: Exprs.Val[] = [val];\n        while (tok == TokenType.COMMA) {\n          args.unshift(valStack.pop());\n          tok = valStack.pop();\n        }\n        if (typeof tok == \"string\") {\n          if (tok == \"{\") {\n            // reached CSS portion of the stack\n            while (args.length >= 2) {\n              const e1 = args.shift();\n              const e2 = args.shift();\n              const er = new Exprs.Comma(handler.getScope(), e1, e2);\n              args.unshift(er);\n            }\n            valStack.push(new Css.Expr(args[0]));\n            return true;\n          } else if (tok == \"(\") {\n            // call\n            const name2 = valStack.pop() as string;\n            const name1 = valStack.pop() as string | null;\n            val = new Exprs.Call(\n              handler.getScope(),\n              Exprs.makeQualifiedName(name1, name2),\n              args,\n            );\n            op = TokenType.EOF;\n            continue;\n          }\n        }\n        if (tok == TokenType.O_PAR) {\n          if (val.isMediaName()) {\n            val = new Exprs.MediaTest(\n              handler.getScope(),\n              val as Exprs.MediaName,\n              null,\n            );\n          }\n          op = TokenType.EOF;\n          continue;\n        }\n      } else {\n        if (typeof tok == \"string\") {\n          // reached CSS portion of the stack or a call\n          valStack.push(tok);\n          break;\n        }\n      }\n      if ((tok as number) < 0) {\n        // prefix\n        if (tok == -TokenType.BANG) {\n          val = new Exprs.Not(handler.getScope(), val);\n        } else if (tok == -TokenType.MINUS) {\n          val = new Exprs.Negate(handler.getScope(), val);\n        } else if (tok == -OP_MEDIA_NOT) {\n          // `not` operator in `@media` or `@supports`\n          val = new Exprs.NotMedia(handler.getScope(), val);\n        } else {\n          this.exprError(\"F_UNEXPECTED_STATE\", token);\n          return false;\n        }\n      } else {\n        // infix\n        if (priority[op] > priority[tok as number]) {\n          valStack.push(tok);\n          break;\n        }\n        val2 = valStack.pop() as Exprs.Val;\n        switch (tok) {\n          case TokenType.AMP_AMP:\n            val = new Exprs.And(handler.getScope(), val2, val);\n            break;\n          case OP_MEDIA_AND:\n            // `and` operator in `@media` or `@supports`\n            val = new Exprs.AndMedia(handler.getScope(), val2, val);\n            break;\n          case OP_MEDIA_OR:\n            // `or` operator in `@media` or `@supports`\n            val = new Exprs.OrMedia(handler.getScope(), val2, val);\n            break;\n          case TokenType.BAR_BAR:\n            val = new Exprs.Or(handler.getScope(), val2, val);\n            break;\n          case TokenType.LT:\n            val = new Exprs.Lt(handler.getScope(), val2, val);\n            break;\n          case TokenType.GT:\n            val = new Exprs.Gt(handler.getScope(), val2, val);\n            break;\n          case TokenType.LT_EQ:\n            val = new Exprs.Le(handler.getScope(), val2, val);\n            break;\n          case TokenType.GT_EQ:\n            val = new Exprs.Ge(handler.getScope(), val2, val);\n            break;\n          case TokenType.EQ:\n          case TokenType.EQ_EQ:\n            val = new Exprs.Eq(handler.getScope(), val2, val);\n            break;\n          case TokenType.BANG_EQ:\n            val = new Exprs.Ne(handler.getScope(), val2, val);\n            break;\n          case TokenType.PLUS:\n            val = new Exprs.Add(handler.getScope(), val2, val);\n            break;\n          case TokenType.MINUS:\n            val = new Exprs.Subtract(handler.getScope(), val2, val);\n            break;\n          case TokenType.STAR:\n            val = new Exprs.Multiply(handler.getScope(), val2, val);\n            break;\n          case TokenType.SLASH:\n            val = new Exprs.Divide(handler.getScope(), val2, val);\n            break;\n          case TokenType.PERCENT:\n            val = new Exprs.Modulo(handler.getScope(), val2, val);\n            break;\n          case TokenType.COLON:\n            if (valStack.length > 1) {\n              switch (valStack[valStack.length - 1]) {\n                case TokenType.QMARK:\n                  valStack.pop();\n                  val = new Exprs.Cond(\n                    handler.getScope(),\n                    valStack.pop() as Exprs.Val,\n                    val2,\n                    val,\n                  );\n                  break;\n                case TokenType.O_PAR:\n                  if (val2.isMediaName()) {\n                    val = new Exprs.MediaTest(\n                      handler.getScope(),\n                      val2 as Exprs.MediaName,\n                      val,\n                    );\n                  } else {\n                    this.exprError(\"E_CSS_MEDIA_TEST\", token);\n                    return false;\n                  }\n                  break;\n              }\n            } else {\n              this.exprError(\"E_CSS_EXPR_COND\", token);\n              return false;\n            }\n            break;\n          case TokenType.QMARK:\n            if (op != TokenType.COLON) {\n              this.exprError(\"E_CSS_EXPR_COND\", token);\n              return false;\n            }\n\n          // fall through\n          case TokenType.O_PAR:\n            // don't reduce\n            valStack.push(val2);\n            valStack.push(tok);\n            valStack.push(val);\n            return false;\n          default:\n            this.exprError(\"F_UNEXPECTED_STATE\", token);\n            return false;\n        }\n      }\n    }\n    valStack.push(val);\n    return false;\n  }\n\n  readSupportsTest(token: CssTokenizer.Token): Exprs.SupportsTest {\n    // `@supports (prop-name:...)`\n    // `@supports func-name(...)`\n    const isFunc = token.type === TokenType.FUNC;\n    const tokenizer = this.tokenizer;\n    let startPosition: number;\n    let name: string;\n    if (isFunc) {\n      name = token.text;\n      startPosition = token.position + name.length + 1;\n    } else if (token.type === TokenType.O_PAR) {\n      const token1 = tokenizer.nthToken(1);\n      const token2 = tokenizer.nthToken(2);\n      if (token1.type === TokenType.IDENT && token2.type === TokenType.COLON) {\n        tokenizer.consume();\n        tokenizer.consume();\n        name = token1.text;\n        startPosition = token2.position + 1;\n      } else if (\n        token1.type === TokenType.O_PAR ||\n        token1.type === TokenType.FUNC ||\n        (token1.type === TokenType.IDENT &&\n          token1.text.toLowerCase() === \"not\" &&\n          (token2.type === TokenType.O_PAR || token2.type === TokenType.FUNC))\n      ) {\n        return null;\n      } else {\n        // Unknown `(...)` syntax, read until `)` and evaluate to false\n        startPosition = token.position + 1;\n      }\n    } else {\n      return null;\n    }\n    let parLevel = 0;\n    let tokenN: CssTokenizer.Token;\n    let commaCount = 0;\n    while (parLevel >= 0) {\n      tokenizer.consume();\n      tokenN = tokenizer.token();\n      switch (tokenN.type) {\n        case TokenType.C_PAR:\n          parLevel--;\n          break;\n        case TokenType.O_PAR:\n        case TokenType.FUNC:\n          parLevel++;\n          break;\n        case TokenType.COMMA:\n          if (parLevel === 0) {\n            commaCount++;\n          }\n          break;\n        case TokenType.EOF:\n          this.exprError(\"E_CSS_UNEXPECTED_EOF\", tokenN);\n          return null;\n      }\n    }\n    tokenizer.consume();\n    const endPosition = tokenN.position;\n    const value =\n      isFunc && name === \"selector\" && commaCount > 0\n        ? \"\" // selector() with multiple selectors doesn't work\n        : tokenizer.input.substring(startPosition, endPosition).trim();\n    const supportsTest = new Exprs.SupportsTest(\n      this.handler.getScope(),\n      name,\n      value,\n      isFunc,\n    );\n    return supportsTest;\n  }\n\n  readPseudoParams(): (number | string)[] {\n    const arr = [];\n    while (true) {\n      const token = this.tokenizer.token();\n      switch (token.type) {\n        case TokenType.IDENT:\n          arr.push(token.text);\n          break;\n        case TokenType.PLUS:\n          arr.push(\"+\");\n          break;\n        case TokenType.NUM:\n        case TokenType.INT:\n          arr.push(token.num);\n          break;\n        default:\n          return arr;\n      }\n      this.tokenizer.consume();\n    }\n  }\n\n  /**\n   * Read `an+b` argument of pseudoclasses. Roughly based on the algorithm at\n   * https://drafts.csswg.org/css-syntax/#the-anb-type\n   */\n  private readNthPseudoParams(): number[] | null {\n    let hasLeadingPlus = false;\n    let token = this.tokenizer.token();\n    if (token.type === TokenType.PLUS) {\n      // '+'\n      hasLeadingPlus = true;\n      this.tokenizer.consume();\n      token = this.tokenizer.token();\n    } else if (\n      token.type === TokenType.IDENT &&\n      (token.text === \"even\" || token.text === \"odd\")\n    ) {\n      // 'even' or 'odd'\n      this.tokenizer.consume();\n      return [2, token.text === \"odd\" ? 1 : 0];\n    }\n    switch (token.type) {\n      case TokenType.NUMERIC:\n        if (hasLeadingPlus && token.num < 0) {\n          // reject '+-an'\n          return null;\n        }\n\n      // FALLTHROUGH\n      case TokenType.IDENT:\n        if (hasLeadingPlus && token.text.charAt(0) === \"-\") {\n          // reject '+-n'\n          return null;\n        }\n        if (token.text === \"n\" || token.text === \"-n\") {\n          // 'an', 'an +b', 'an -b', 'n', 'n +b', 'n -b', '-n', '-n +b' '-n -b'\n          if (hasLeadingPlus && token.precededBySpace) {\n            // reject '+ an'\n            return null;\n          }\n          let a = token.text === \"-n\" ? -1 : 1;\n          if (token.type === TokenType.NUMERIC) {\n            a = token.num;\n          }\n          let b = 0;\n          this.tokenizer.consume();\n          token = this.tokenizer.token();\n          const hasMinusSign = token.type === TokenType.MINUS;\n          const hasSign = token.type === TokenType.PLUS || hasMinusSign;\n          if (hasSign) {\n            // 'an +b', 'an - b'\n            this.tokenizer.consume();\n            token = this.tokenizer.token();\n          }\n          if (token.type === TokenType.INT) {\n            b = token.num;\n\n            if (1 / b === 1 / -0) {\n              // negative zero: 'an -0'\n              b = 0;\n              if (hasSign) {\n                return null; // reject 'an + -0', 'an - -0'\n              }\n            } else if (b < 0) {\n              // negative: 'an -b'\n              if (hasSign) {\n                return null; // reject 'an + -b', 'an - -b'\n              }\n            } else if (b >= 0) {\n              // positive or positive zero: 'an +b'\n              if (!hasSign) {\n                return null;\n              }\n            }\n            this.tokenizer.consume();\n          } else if (hasSign) {\n            // reject 'an + (non-integer)'\n            return null;\n          }\n          return [a, hasMinusSign && b > 0 ? -b : b];\n        } else if (token.text === \"n-\" || token.text === \"-n-\") {\n          // 'an- b', '-n- b'\n          if (hasLeadingPlus && token.precededBySpace) {\n            // reject '+ an- b'\n            return null;\n          }\n          let a = token.text === \"-n-\" ? -1 : 1;\n          if (token.type === TokenType.NUMERIC) {\n            a = token.num;\n          }\n          this.tokenizer.consume();\n          token = this.tokenizer.token();\n          if (token.type === TokenType.INT) {\n            if (token.num < 0 || 1 / token.num === 1 / -0) {\n              // reject 'an- -b', 'an- -0'\n              return null;\n            } else {\n              this.tokenizer.consume();\n              return [a, token.num];\n            }\n          }\n        } else {\n          let r = token.text.match(/^n(-[0-9]+)$/);\n          if (r) {\n            // 'n-b', 'an-b'\n            if (hasLeadingPlus && token.precededBySpace) {\n              // reject '+ an-b'\n              return null;\n            }\n            this.tokenizer.consume();\n            return [\n              token.type === TokenType.NUMERIC ? token.num : 1,\n              parseInt(r[1], 10),\n            ];\n          }\n          r = token.text.match(/^-n(-[0-9]+)$/);\n\n          // '-n-b'\n          if (r) {\n            this.tokenizer.consume();\n            return [-1, parseInt(r[1], 10)];\n          }\n        }\n        return null;\n      case TokenType.INT:\n        if (hasLeadingPlus && (token.precededBySpace || token.num < 0)) {\n          return null;\n        }\n        this.tokenizer.consume();\n        return [0, token.num];\n    }\n    return null;\n  }\n\n  makeCondition(classes: string | null, condition: Exprs.Val): Css.Expr {\n    const scope = this.handler.getScope();\n    if (!scope) {\n      return null;\n    }\n    condition = condition || scope._true;\n    if (classes) {\n      const classList = classes.split(/\\s+/);\n      for (const className of classList) {\n        switch (className) {\n          case \"vertical\":\n            condition = Exprs.and(\n              scope,\n              condition,\n              new Exprs.Not(scope, new Exprs.Named(scope, \"pref-horizontal\")),\n            );\n            break;\n          case \"horizontal\":\n            condition = Exprs.and(\n              scope,\n              condition,\n              new Exprs.Named(scope, \"pref-horizontal\"),\n            );\n            break;\n          case \"day\":\n            condition = Exprs.and(\n              scope,\n              condition,\n              new Exprs.Not(scope, new Exprs.Named(scope, \"pref-night-mode\")),\n            );\n            break;\n          case \"night\":\n            condition = Exprs.and(\n              scope,\n              condition,\n              new Exprs.Named(scope, \"pref-night-mode\"),\n            );\n            break;\n          default:\n            condition = scope._false;\n        }\n      }\n    }\n    if (condition === scope._true) {\n      return null;\n    }\n    return new Css.Expr(condition);\n  }\n\n  isInsidePropertyOnlyRule(): boolean {\n    switch (this.ruleStack[this.ruleStack.length - 1]) {\n      case \"[selector]\":\n      case \"font-face\":\n      case \"counter-style\":\n      case \"-epubx-flow\":\n      case \"-epubx-viewport\":\n      case \"-epubx-define\":\n      case \"-adapt-footnote-area\":\n        return true;\n    }\n    return false;\n  }\n\n  runParser(\n    count: number,\n    parsingValue: boolean,\n    parsingStyleAttr: boolean,\n    parsingMediaQuery: boolean,\n    parsingFunctionParam: boolean,\n    parsingRelationalSelector?: boolean,\n  ): boolean {\n    const handler = this.handler;\n    const tokenizer = this.tokenizer;\n    const valStack = this.valStack;\n    let token: CssTokenizer.Token;\n    let token1: CssTokenizer.Token;\n    let ns: string | null;\n    let text: string | null;\n    let num: number;\n    let val: Css.Val;\n    let params: (number | string)[];\n    let selectorStartPosition: number | null = null;\n\n    if (parsingStyleAttr) {\n      this.inStyleDeclaration = true;\n    }\n    if (parsingMediaQuery) {\n      this.exprContext = ExprContext.MEDIA;\n      this.valStack.push(\"{\");\n    }\n\n    for (; count > 0; --count) {\n      token = tokenizer.token();\n\n      // For relational pseudo-class `:has()` support\n      if (parsingFunctionParam && selectorStartPosition === null) {\n        // token.position may be token's start position + 1\n        selectorStartPosition = token.position - 1;\n        if (tokenizer.input[selectorStartPosition] === \"(\") {\n          selectorStartPosition++;\n        }\n      }\n\n      // Do not stop parsing on invalid property syntax as long as brackets are balanced.\n      if (\n        this.actions === actionsPropVal &&\n        this.errorBrackets.length > 0 &&\n        (token.type === this.errorBrackets[this.errorBrackets.length - 1] ||\n          token.type === TokenType.SEMICOL ||\n          token.type === TokenType.BANG)\n      ) {\n        if (token.type === this.errorBrackets[this.errorBrackets.length - 1]) {\n          this.errorBrackets.pop();\n          if (token.type === TokenType.C_PAR) {\n            // For nested func in parens (Issue #1014)\n            if (this.valStackReduce(\")\", token)) {\n              tokenizer.consume();\n              continue;\n            }\n          }\n        }\n        valStack.push(new Css.AnyToken(token.toString()));\n        tokenizer.consume();\n        continue;\n      }\n\n      switch (this.actions[token.type]) {\n        case Action.IDENT:\n          // figure out if this is a property assignment or selector\n          if (\n            !this.inStyleDeclaration ||\n            tokenizer.nthToken(1).type != TokenType.COLON\n          ) {\n            // cannot be property assignment\n            if (this.isInsidePropertyOnlyRule()) {\n              handler.error(\"E_CSS_COLON_EXPECTED\", tokenizer.nthToken(1));\n              this.actions = actionsErrorDecl;\n            } else {\n              this.actions = actionsSelectorStart;\n              handler.startSelectorRule();\n            }\n            continue;\n          }\n          // property assignment\n          this.propName = token.text;\n          this.propImportant = false;\n          tokenizer.consume();\n          tokenizer.consume();\n          this.actions = actionsPropVal;\n          valStack.splice(0, valStack.length);\n          continue;\n        case Action.PROP:\n          // figure out if this is a property assignment or selector\n          if (tokenizer.nthToken(1).type != TokenType.COLON) {\n            // cannot be property assignment\n            this.actions = actionsErrorDecl;\n            handler.error(\"E_CSS_COLON_EXPECTED\", tokenizer.nthToken(1));\n            continue;\n          }\n          this.propName = token.text;\n          this.propImportant = false;\n          tokenizer.consume();\n          tokenizer.consume();\n          this.actions = actionsPropVal;\n          valStack.splice(0, valStack.length);\n          continue;\n        case Action.SELECTOR_START:\n          // don't consume, process again\n          this.actions = actionsSelectorStart;\n          handler.startSelectorRule();\n          continue;\n        case Action.SELECTOR_NAME_1:\n          if (!token.precededBySpace) {\n            this.actions = actionsErrorSelector;\n            handler.error(\"E_CSS_SPACE_EXPECTED\", token);\n            continue;\n          }\n          handler.descendantSelector();\n\n        // fall through\n        case Action.SELECTOR_NAME:\n          if (tokenizer.nthToken(1).type == TokenType.BAR) {\n            tokenizer.consume();\n            tokenizer.consume();\n            ns = this.namespacePrefixToURI[token.text];\n            if (ns != null) {\n              token = tokenizer.token();\n              switch (token.type) {\n                case TokenType.IDENT:\n                  handler.tagSelector(ns, token.text);\n                  if (parsingFunctionParam) {\n                    this.actions = actionsSelectorInFunc;\n                  } else {\n                    this.actions = actionsSelector;\n                  }\n                  tokenizer.consume();\n                  break;\n                case TokenType.STAR:\n                  handler.tagSelector(ns, null);\n                  if (parsingFunctionParam) {\n                    this.actions = actionsSelectorInFunc;\n                  } else {\n                    this.actions = actionsSelector;\n                  }\n                  tokenizer.consume();\n                  break;\n                default:\n                  this.actions = actionsError;\n                  handler.error(\"E_CSS_NAMESPACE\", token);\n              }\n            } else {\n              this.actions = actionsError;\n              handler.error(\"E_CSS_UNDECLARED_PREFIX\", token);\n            }\n          } else {\n            handler.tagSelector(this.defaultNamespaceURI, token.text);\n            if (parsingFunctionParam) {\n              this.actions = actionsSelectorInFunc;\n            } else {\n              this.actions = actionsSelector;\n            }\n            tokenizer.consume();\n          }\n          continue;\n        case Action.SELECTOR_ANY_1:\n          if (!token.precededBySpace) {\n            this.actions = actionsErrorSelector;\n            handler.error(\"E_CSS_SPACE_EXPECTED\", token);\n            continue;\n          }\n          handler.descendantSelector();\n\n        // fall through\n        case Action.SELECTOR_ANY:\n          if (tokenizer.nthToken(1).type == TokenType.BAR) {\n            tokenizer.consume();\n            tokenizer.consume();\n            token = tokenizer.token();\n            switch (token.type) {\n              case TokenType.IDENT:\n                handler.tagSelector(null, token.text);\n                if (parsingFunctionParam) {\n                  this.actions = actionsSelectorInFunc;\n                } else {\n                  this.actions = actionsSelector;\n                }\n                tokenizer.consume();\n                break;\n              case TokenType.STAR:\n                handler.tagSelector(null, null);\n                if (parsingFunctionParam) {\n                  this.actions = actionsSelectorInFunc;\n                } else {\n                  this.actions = actionsSelector;\n                }\n                tokenizer.consume();\n                break;\n              default:\n                this.actions = actionsError;\n                handler.error(\"E_CSS_NAMESPACE\", token);\n            }\n          } else {\n            handler.tagSelector(this.defaultNamespaceURI, null);\n            if (parsingFunctionParam) {\n              this.actions = actionsSelectorInFunc;\n            } else {\n              this.actions = actionsSelector;\n            }\n            tokenizer.consume();\n          }\n          continue;\n        case Action.SELECTOR_ID_1:\n          if (token.precededBySpace) {\n            handler.descendantSelector();\n          }\n\n        // fall through\n        case Action.SELECTOR_ID:\n          if (!token.text) {\n            handler.error(\"E_CSS_SYNTAX\", token);\n            tokenizer.consume();\n            continue;\n          }\n          handler.idSelector(token.text);\n          if (parsingFunctionParam) {\n            this.actions = actionsSelectorInFunc;\n          } else {\n            this.actions = actionsSelector;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_CLASS_1:\n          if (token.precededBySpace) {\n            handler.descendantSelector();\n          }\n\n        // fall through\n        case Action.SELECTOR_CLASS:\n          handler.classSelector(token.text);\n          if (parsingFunctionParam) {\n            this.actions = actionsSelectorInFunc;\n          } else {\n            this.actions = actionsSelector;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_PSEUDOCLASS_1:\n          if (token.precededBySpace) {\n            handler.descendantSelector();\n          }\n\n        // fall through\n        case Action.SELECTOR_PSEUDOCLASS:\n          tokenizer.consume();\n          token = tokenizer.token();\n          pseudoclassType: switch (token.type) {\n            case TokenType.IDENT:\n              handler.pseudoclassSelector(token.text, null);\n              tokenizer.consume();\n              if (parsingFunctionParam) {\n                this.actions = actionsSelectorInFunc;\n              } else {\n                this.actions = actionsSelector;\n              }\n              continue;\n            case TokenType.FUNC:\n              text = token.text;\n              tokenizer.consume();\n              switch (text) {\n                case \"is\":\n                case \"not\":\n                case \"where\":\n                case \"has\":\n                  this.actions = actionsSelectorStart;\n                  handler.startFuncWithSelector(text);\n                  if (\n                    this.runParser(\n                      Number.POSITIVE_INFINITY,\n                      false,\n                      false,\n                      false,\n                      true,\n                      text === \"has\",\n                    )\n                  ) {\n                    this.actions = actionsSelector;\n                  } else {\n                    this.actions = actionsErrorSelector;\n                  }\n                  continue;\n                case \"lang\":\n                case \"href-epub-type\":\n                  token = tokenizer.token();\n                  if (token.type === TokenType.IDENT) {\n                    params = [token.text];\n                    tokenizer.consume();\n                    if (\n                      text === \"href-epub-type\" &&\n                      tokenizer.token().type === TokenType.COMMA\n                    ) {\n                      tokenizer.consume();\n                      token = tokenizer.token();\n                      if (token.type === TokenType.IDENT) {\n                        params.push(token.text);\n                        tokenizer.consume();\n                      }\n                    }\n                    break;\n                  } else {\n                    break pseudoclassType;\n                  }\n                case \"nth-child\":\n                case \"nth-of-type\":\n                case \"nth-last-child\":\n                case \"nth-last-of-type\":\n                case \"nth\":\n                  params = this.readNthPseudoParams();\n                  if (!params) {\n                    break pseudoclassType;\n                  } else if (\n                    text === \"nth-child\" ||\n                    text === \"nth-last-child\"\n                  ) {\n                    // check for optional \"of S\" syntax\n                    token1 = tokenizer.nthToken(0);\n                    if (\n                      token1.type === TokenType.IDENT &&\n                      token1.text === \"of\"\n                    ) {\n                      tokenizer.consume();\n\n                      // parse selector list like :is()\n                      this.actions = actionsSelectorStart;\n                      handler.startFuncWithSelector(text as string, params);\n                      if (\n                        this.runParser(\n                          Number.POSITIVE_INFINITY,\n                          false,\n                          false,\n                          false,\n                          true,\n                          false,\n                        )\n                      ) {\n                        if (parsingFunctionParam) {\n                          this.actions = actionsSelectorInFunc;\n                        } else {\n                          this.actions = actionsSelector;\n                        }\n                      } else {\n                        this.actions = actionsErrorSelector;\n                      }\n                      continue;\n                    }\n                    break;\n                  } else if (text === \"nth\") {\n                    // check for optional \"of <page-type>\" syntax for :nth() page selector\n                    token1 = tokenizer.nthToken(0);\n                    if (\n                      token1.type === TokenType.IDENT &&\n                      token1.text === \"of\"\n                    ) {\n                      tokenizer.consume();\n                      token1 = tokenizer.token();\n                      if (token1.type === TokenType.IDENT) {\n                        params.push(token1.text); // add page type name to params\n                        tokenizer.consume();\n                      } else {\n                        // Invalid \":nth(... of ...)\" syntax: \"of\" must be followed by an identifier\n                        break pseudoclassType;\n                      }\n                    }\n                    break;\n                  } else {\n                    break;\n                  }\n                default:\n                  // TODO\n                  params = this.readPseudoParams();\n              }\n              token = tokenizer.token();\n              if (token.type == TokenType.C_PAR) {\n                handler.pseudoclassSelector(text as string, params);\n                tokenizer.consume();\n                if (parsingFunctionParam) {\n                  this.actions = actionsSelectorInFunc;\n                } else {\n                  this.actions = actionsSelector;\n                }\n                continue;\n              }\n              break;\n          }\n          handler.error(\"E_CSS_PSEUDOCLASS_SYNTAX\", token);\n          this.actions = actionsError;\n          continue;\n        case Action.SELECTOR_PSEUDOELEM_1:\n          if (token.precededBySpace) {\n            handler.descendantSelector();\n          }\n\n        // fall through\n        case Action.SELECTOR_PSEUDOELEM:\n          tokenizer.consume();\n          token = tokenizer.token();\n          switch (token.type) {\n            case TokenType.IDENT:\n              handler.pseudoelementSelector(token.text, null);\n              if (parsingFunctionParam) {\n                this.actions = actionsSelectorInFunc;\n              } else {\n                this.actions = actionsSelector;\n              }\n              tokenizer.consume();\n              continue;\n            case TokenType.FUNC:\n              text = token.text;\n              tokenizer.consume();\n              if (text == \"nth-fragment\") {\n                params = this.readNthPseudoParams();\n                if (params === null) {\n                  break;\n                }\n              } else {\n                params = this.readPseudoParams();\n              }\n              token = tokenizer.token();\n              if (token.type == TokenType.C_PAR) {\n                handler.pseudoelementSelector(text as string, params);\n                if (parsingFunctionParam) {\n                  this.actions = actionsSelectorInFunc;\n                } else {\n                  this.actions = actionsSelector;\n                }\n                tokenizer.consume();\n                continue;\n              }\n              break;\n          }\n          handler.error(\"E_CSS_PSEUDOELEM_SYNTAX\", token);\n          this.actions = actionsError;\n          continue;\n        case Action.SELECTOR_ATTR_1:\n          if (token.precededBySpace) {\n            handler.descendantSelector();\n          }\n\n        // fall through\n        case Action.SELECTOR_ATTR:\n          tokenizer.consume();\n          token = tokenizer.token();\n          if (token.type == TokenType.IDENT) {\n            text = token.text;\n            tokenizer.consume();\n          } else if (token.type == TokenType.STAR) {\n            text = null;\n            tokenizer.consume();\n          } else if (token.type == TokenType.BAR) {\n            text = \"\";\n          } else {\n            this.actions = actionsErrorSelector;\n            handler.error(\"E_CSS_ATTR\", token);\n            tokenizer.consume();\n            continue;\n          }\n          token = tokenizer.token();\n          if (token.type == TokenType.BAR) {\n            ns = text && this.namespacePrefixToURI[text];\n            // if ns === null, it's wildcard namespace\n            if (ns === undefined) {\n              this.actions = actionsErrorSelector;\n              handler.error(\"E_CSS_UNDECLARED_PREFIX\", token);\n              tokenizer.consume();\n              continue;\n            }\n            tokenizer.consume();\n            token = tokenizer.token();\n            if (token.type != TokenType.IDENT) {\n              this.actions = actionsErrorSelector;\n              handler.error(\"E_CSS_ATTR_NAME_EXPECTED\", token);\n              continue;\n            }\n            text = token.text;\n            tokenizer.consume();\n            token = tokenizer.token();\n          } else {\n            ns = \"\";\n          }\n          switch (token.type) {\n            case TokenType.EQ:\n            case TokenType.TILDE_EQ:\n            case TokenType.BAR_EQ:\n            case TokenType.HAT_EQ:\n            case TokenType.DOLLAR_EQ:\n            case TokenType.STAR_EQ:\n            case TokenType.COL_COL:\n              num = token.type;\n              tokenizer.consume();\n              token = tokenizer.token();\n              break;\n            case TokenType.C_BRK:\n              handler.attributeSelector(\n                ns as string,\n                text as string,\n                TokenType.EOF,\n                null,\n              );\n              if (parsingFunctionParam) {\n                this.actions = actionsSelectorInFunc;\n              } else {\n                this.actions = actionsSelector;\n              }\n              tokenizer.consume();\n              continue;\n            default:\n              this.actions = actionsErrorSelector;\n              handler.error(\"E_CSS_ATTR_OP_EXPECTED\", token);\n              continue;\n          }\n          switch (token.type) {\n            case TokenType.IDENT:\n            case TokenType.STR:\n              handler.attributeSelector(\n                ns as string,\n                text as string,\n                num,\n                token.text,\n              );\n              tokenizer.consume();\n              token = tokenizer.token();\n              break;\n            default:\n              this.actions = actionsErrorSelector;\n              handler.error(\"E_CSS_ATTR_VAL_EXPECTED\", token);\n              continue;\n          }\n          if (token.type != TokenType.C_BRK) {\n            this.actions = actionsErrorSelector;\n            handler.error(\"E_CSS_ATTR\", token);\n            continue;\n          }\n          if (parsingFunctionParam) {\n            this.actions = actionsSelectorInFunc;\n          } else {\n            this.actions = actionsSelector;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_CHILD:\n          handler.childSelector();\n          this.actions = actionsSelectorCont;\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_SIBLING:\n          handler.adjacentSiblingSelector();\n          this.actions = actionsSelectorCont;\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_FOLLOWING_SIBLING:\n          handler.followingSiblingSelector();\n          this.actions = actionsSelectorCont;\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_BODY:\n          if (this.regionRule) {\n            this.ruleStack.push(\"-epubx-region\");\n            this.regionRule = false;\n          } else if (this.pageRule) {\n            this.ruleStack.push(\"page\");\n            this.pageRule = false;\n            this.inStyleDeclaration = true;\n          } else {\n            this.ruleStack.push(\"[selector]\");\n            this.inStyleDeclaration = true;\n          }\n          handler.startRuleBody();\n          this.actions = actionsBase;\n          tokenizer.consume();\n          continue;\n        case Action.SELECTOR_NEXT:\n          handler.nextSelector();\n          this.actions = actionsSelectorStart;\n          tokenizer.consume();\n          continue;\n        case Action.VAL_IDENT:\n          valStack.push(Css.getName(token.text));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_HASH:\n          num = parseInt(token.text, 16);\n          valStack.push(new Css.HexColor(token.text));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_NUM:\n          valStack.push(new Css.Num(token.num));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_INT:\n          valStack.push(new Css.Int(token.num));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_NUMERIC:\n          valStack.push(new Css.Numeric(token.num, token.text));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_STR:\n          valStack.push(new Css.Str(token.text));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_URL:\n          valStack.push(new Css.URL(Base.resolveURL(token.text, this.baseURL)));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_URANGE:\n          valStack.push(new Css.URange(token.text));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_COMMA:\n          this.valStackReduce(\",\", token);\n          valStack.push(\",\");\n          tokenizer.consume();\n          continue;\n        case Action.VAL_SLASH:\n          valStack.push(Css.slash);\n          tokenizer.consume();\n          continue;\n        case Action.VAL_FUNC:\n          text = token.text.toLowerCase();\n          if (text == \"-epubx-expr\" || text == \"env\") {\n            // special case\n            this.actions = actionsExprVal;\n            this.exprContext = ExprContext.PROP;\n            valStack.push(\"{\");\n          } else {\n            valStack.push(text);\n            valStack.push(\"(\");\n            if (this.errorBrackets.length > 0) {\n              // For nested func in parens (Issue #1014)\n              this.errorBrackets.push(TokenType.C_PAR);\n            }\n          }\n          tokenizer.consume();\n          continue;\n        case Action.VAL_C_PAR:\n          this.valStackReduce(\")\", token);\n          tokenizer.consume();\n          continue;\n        case Action.VAL_BANG:\n          tokenizer.consume();\n          token = tokenizer.token();\n          token1 = tokenizer.nthToken(1);\n          if (\n            token.type == TokenType.IDENT &&\n            token.text.toLowerCase() == \"important\" &&\n            (token1.type == TokenType.SEMICOL ||\n              token1.type == TokenType.EOF ||\n              token1.type == TokenType.C_BRC)\n          ) {\n            tokenizer.consume();\n            this.propImportant = true;\n            continue;\n          }\n          this.exprError(\"E_CSS_SYNTAX\", token);\n          continue;\n        case Action.VAL_PLUS:\n          token1 = tokenizer.nthToken(1);\n          switch (token1.type) {\n            case TokenType.NUM:\n            case TokenType.NUMERIC:\n            case TokenType.INT:\n              if (!token1.precededBySpace) {\n                // Plus before number, ignore\n                tokenizer.consume();\n                continue;\n              }\n          }\n          // this.exprError(\"E_CSS_UNEXPECTED_PLUS\", token);\n          valStack.push(new Css.AnyToken(\"+\"));\n          tokenizer.consume();\n          continue;\n        case Action.VAL_END:\n          tokenizer.consume();\n\n        // fall through\n        case Action.VAL_BRC:\n          val = this.valStackReduce(\";\", token);\n          if (val && this.propName) {\n            handler.property(this.propName as string, val, this.propImportant);\n          }\n          this.actions = parsingStyleAttr ? actionsStyleAttribute : actionsBase;\n          continue;\n        case Action.VAL_FINISH:\n          tokenizer.consume();\n\n          // for implicit closing parens, e.g. style=\"color: var(--a, var(--b\"\n          while (valStack.length > 0) {\n            const len = valStack.length;\n            val = this.valStackReduce(\";\", token);\n            if (!val || valStack.length === len) {\n              break;\n            }\n          }\n          if (parsingValue) {\n            this.result = val;\n            return true;\n          }\n          if (this.propName && val) {\n            handler.property(this.propName as string, val, this.propImportant);\n          }\n          return true;\n        case Action.EXPR_IDENT:\n          token1 = tokenizer.nthToken(1);\n          if (token1.type == TokenType.CLASS) {\n            if (\n              tokenizer.nthToken(2).type == TokenType.O_PAR &&\n              !tokenizer.nthToken(2).precededBySpace\n            ) {\n              valStack.push(token.text, token1.text, \"(\");\n              tokenizer.consume();\n            } else {\n              valStack.push(\n                new Exprs.Named(\n                  handler.getScope(),\n                  Exprs.makeQualifiedName(token.text, token1.text),\n                ),\n              );\n              this.actions = actionsExprOp;\n            }\n            tokenizer.consume();\n          } else {\n            if (\n              this.exprContext == ExprContext.MEDIA ||\n              this.exprContext == ExprContext.IMPORT\n            ) {\n              if (token.text.toLowerCase() == \"not\") {\n                tokenizer.consume();\n                valStack.push(\n                  new Exprs.MediaName(handler.getScope(), true, token1.text),\n                );\n              } else {\n                if (token.text.toLowerCase() == \"only\") {\n                  tokenizer.consume();\n                  token = token1;\n                }\n                valStack.push(\n                  new Exprs.MediaName(handler.getScope(), false, token.text),\n                );\n              }\n            } else if (\n              this.exprContext === ExprContext.SUPPORTS &&\n              token.text.toLowerCase() === \"not\" &&\n              valStack[valStack.length - 1] !== OP_MEDIA_AND &&\n              valStack[valStack.length - 1] !== OP_MEDIA_OR &&\n              (token1.type === TokenType.O_PAR ||\n                token1.type === TokenType.FUNC)\n            ) {\n              // for `@supports not (...)`\n              valStack.push(-OP_MEDIA_NOT);\n              tokenizer.consume();\n              continue;\n            } else {\n              valStack.push(new Exprs.Named(handler.getScope(), token.text));\n            }\n            this.actions = actionsExprOp;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_FUNC:\n          if (this.exprContext === ExprContext.SUPPORTS) {\n            // `@supports selector(...)`\n            valStack.push(this.readSupportsTest(token));\n            this.actions = actionsExprOp;\n            continue;\n          }\n          valStack.push(null, token.text, \"(\");\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_NUM:\n          valStack.push(new Exprs.Const(handler.getScope(), token.num));\n          tokenizer.consume();\n          this.actions = actionsExprOp;\n          continue;\n        case Action.EXPR_NUMERIC:\n          text = token.text;\n          if (text == \"%\") {\n            if (this.propName && this.propName.match(/height|^(top|bottom)$/)) {\n              text = \"vh\";\n            } else {\n              text = \"vw\";\n            }\n          }\n          valStack.push(new Exprs.Numeric(handler.getScope(), token.num, text));\n          tokenizer.consume();\n          this.actions = actionsExprOp;\n          continue;\n        case Action.EXPR_STR:\n          valStack.push(new Exprs.Const(handler.getScope(), token.text));\n          tokenizer.consume();\n          this.actions = actionsExprOp;\n          continue;\n        case Action.EXPR_PARAM:\n          tokenizer.consume();\n          token = tokenizer.token();\n          if (token.type != TokenType.INT || token.precededBySpace) {\n            this.exprError(\"E_CSS_SYNTAX\", token);\n          } else {\n            valStack.push(new Exprs.Param(handler.getScope(), token.num));\n            tokenizer.consume();\n            this.actions = actionsExprOp;\n          }\n          continue;\n        case Action.EXPR_PREFIX:\n          valStack.push(-token.type);\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_INFIX:\n          this.actions = actionsExprVal;\n          this.exprStackReduce(token.type, token);\n          valStack.push(token.type);\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_INFIX_NAME:\n          // `and` or `or` operator in `@media` or `@supports`\n          if (\n            token.text.toLowerCase() === \"and\" &&\n            valStack[valStack.length - 2] !== OP_MEDIA_OR &&\n            valStack[valStack.length - 2] !== -OP_MEDIA_NOT\n          ) {\n            this.actions = actionsExprVal;\n            this.exprStackReduce(OP_MEDIA_AND, token);\n            valStack.push(OP_MEDIA_AND);\n            tokenizer.consume();\n          } else if (\n            token.text.toLowerCase() === \"or\" &&\n            valStack[valStack.length - 2] !== OP_MEDIA_AND &&\n            valStack[valStack.length - 2] !== -OP_MEDIA_NOT\n          ) {\n            this.actions = actionsExprVal;\n            this.exprStackReduce(OP_MEDIA_OR, token);\n            valStack.push(OP_MEDIA_OR);\n            tokenizer.consume();\n          } else {\n            this.exprError(\"E_CSS_SYNTAX\", token);\n          }\n          continue;\n        case Action.EXPR_C_PAR:\n          if (this.exprStackReduce(token.type, token)) {\n            this.actions = actionsPropVal;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_O_BRC:\n          if (this.exprStackReduce(TokenType.C_PAR, token)) {\n            if (this.propName || this.exprContext == ExprContext.IMPORT) {\n              this.exprError(\"E_CSS_UNEXPECTED_BRC\", token);\n            } else {\n              if (this.exprContext == ExprContext.WHEN) {\n                handler.startWhenRule(valStack.pop() as Css.Expr);\n              } else {\n                handler.startMediaRule(valStack.pop() as Css.Expr);\n              }\n              this.ruleStack.push(\"media\");\n              handler.startRuleBody();\n              this.actions = actionsBase;\n            }\n          }\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_SEMICOL:\n          if (this.exprStackReduce(TokenType.C_PAR, token)) {\n            if (this.propName || this.exprContext != ExprContext.IMPORT) {\n              this.exprError(\"E_CSS_UNEXPECTED_SEMICOL\", token);\n              // `@media ...;` and `@supports ...;` should be ok\n              this.actions = actionsBase;\n              tokenizer.consume();\n              return false;\n            } else {\n              this.importCondition = valStack.pop() as Css.Expr;\n              this.importReady = true;\n              this.actions = actionsBase;\n              tokenizer.consume();\n              return false;\n            }\n          }\n          tokenizer.consume();\n          continue;\n        case Action.EXPR_O_PAR:\n          if (this.exprContext === ExprContext.SUPPORTS) {\n            // `@supports (...)`\n            const supportsTest = this.readSupportsTest(token);\n            if (supportsTest) {\n              valStack.push(supportsTest);\n              this.actions = actionsExprOp;\n              continue;\n            }\n          }\n          valStack.push(token.type);\n          tokenizer.consume();\n          continue;\n        case Action.RULE_END:\n          this.actions = actionsBase;\n          tokenizer.consume();\n          handler.endRule();\n          this.inStyleDeclaration = false;\n          if (this.ruleStack.length) {\n            this.ruleStack.pop();\n            switch (this.ruleStack[this.ruleStack.length - 1]) {\n              case \"page\":\n              case \"-epubx-page-master\":\n              case \"-epubx-partition-group\":\n                this.inStyleDeclaration = true;\n            }\n          }\n          continue;\n        case Action.AT:\n          text = token.text.toLowerCase();\n          switch (text) {\n            case \"import\":\n              tokenizer.consume();\n              token = tokenizer.token();\n              if (token.type == TokenType.STR || token.type == TokenType.URL) {\n                this.importURL = token.text;\n                tokenizer.consume();\n                token = tokenizer.token();\n                if (\n                  token.type == TokenType.SEMICOL ||\n                  token.type == TokenType.EOF\n                ) {\n                  this.importReady = true;\n                  tokenizer.consume();\n                  return false;\n                } else {\n                  this.propName = null; // signals @ rule\n                  this.exprContext = ExprContext.IMPORT;\n                  this.actions = actionsExprVal;\n                  valStack.push(\"{\");\n                  continue;\n                }\n              }\n              handler.error(\"E_CSS_IMPORT_SYNTAX\", token);\n              this.actions = actionsError;\n              continue;\n            case \"namespace\":\n              tokenizer.consume();\n              token = tokenizer.token();\n              switch (token.type) {\n                case TokenType.IDENT:\n                  text = token.text; // Prefix\n                  tokenizer.consume();\n                  token = tokenizer.token();\n                  if (\n                    (token.type == TokenType.STR ||\n                      token.type == TokenType.URL) &&\n                    tokenizer.nthToken(1).type == TokenType.SEMICOL\n                  ) {\n                    this.namespacePrefixToURI[text] = token.text;\n                    tokenizer.consume();\n                    tokenizer.consume();\n                    continue;\n                  }\n                  break;\n                case TokenType.STR:\n                case TokenType.URL:\n                  if (tokenizer.nthToken(1).type == TokenType.SEMICOL) {\n                    this.defaultNamespaceURI = token.text;\n                    tokenizer.consume();\n                    tokenizer.consume();\n                    continue;\n                  }\n                  break;\n              }\n              handler.error(\"E_CSS_NAMESPACE_SYNTAX\", token);\n              this.actions = actionsError;\n              continue;\n            case \"charset\":\n              // Useless in EPUB (only UTF-8 or UTF-16 is allowed anyway and\n              // we are at the mercy of the browser charset handling anyway).\n              tokenizer.consume();\n              token = tokenizer.token();\n              if (\n                token.type == TokenType.STR &&\n                tokenizer.nthToken(1).type == TokenType.SEMICOL\n              ) {\n                text = token.text.toLowerCase();\n                if (text != \"utf-8\" && text != \"utf-16\") {\n                  handler.error(`E_CSS_UNEXPECTED_CHARSET ${text}`, token);\n                }\n                tokenizer.consume();\n                tokenizer.consume();\n                continue;\n              }\n              handler.error(\"E_CSS_CHARSET_SYNTAX\", token);\n              this.actions = actionsError;\n              continue;\n            case \"font-face\":\n            case \"-epubx-page-template\":\n            case \"-epubx-define\":\n            case \"-epubx-viewport\":\n              if (tokenizer.nthToken(1).type == TokenType.O_BRC) {\n                tokenizer.consume();\n                tokenizer.consume();\n                switch (text) {\n                  case \"font-face\":\n                    handler.startFontFaceRule();\n                    this.inStyleDeclaration = true;\n                    break;\n                  case \"-epubx-page-template\":\n                    handler.startPageTemplateRule();\n                    break;\n                  case \"-epubx-define\":\n                    handler.startDefineRule();\n                    this.inStyleDeclaration = true;\n                    break;\n                  case \"-epubx-viewport\":\n                    handler.startViewportRule();\n                    this.inStyleDeclaration = true;\n                    break;\n                }\n                this.ruleStack.push(text);\n                handler.startRuleBody();\n                continue;\n              }\n              break;\n            case \"-adapt-footnote-area\":\n              tokenizer.consume();\n              token = tokenizer.token();\n              switch (token.type) {\n                case TokenType.O_BRC:\n                  tokenizer.consume();\n                  handler.startFootnoteRule(null);\n                  this.ruleStack.push(text);\n                  handler.startRuleBody();\n                  this.inStyleDeclaration = true;\n                  continue;\n                case TokenType.COL_COL:\n                  tokenizer.consume();\n                  token = tokenizer.token();\n                  if (\n                    token.type == TokenType.IDENT &&\n                    tokenizer.nthToken(1).type == TokenType.O_BRC\n                  ) {\n                    text = token.text;\n                    tokenizer.consume();\n                    tokenizer.consume();\n                    handler.startFootnoteRule(text);\n                    this.ruleStack.push(\"-adapt-footnote-area\");\n                    handler.startRuleBody();\n                    this.inStyleDeclaration = true;\n                    continue;\n                  }\n                  break;\n              }\n              break;\n            case \"-epubx-region\":\n              tokenizer.consume();\n              handler.startRegionRule();\n              this.regionRule = true;\n              this.actions = actionsSelectorStart;\n              continue;\n            case \"page\":\n              tokenizer.consume();\n              handler.startPageRule();\n              this.pageRule = true;\n              this.actions = actionsSelectorCont;\n              continue;\n            case \"top-left-corner\":\n            case \"top-left\":\n            case \"top-center\":\n            case \"top-right\":\n            case \"top-right-corner\":\n            case \"right-top\":\n            case \"right-middle\":\n            case \"right-bottom\":\n            case \"bottom-right-corner\":\n            case \"bottom-right\":\n            case \"bottom-center\":\n            case \"bottom-left\":\n            case \"bottom-left-corner\":\n            case \"left-bottom\":\n            case \"left-middle\":\n            case \"left-top\":\n              tokenizer.consume();\n              token = tokenizer.token();\n              if (token.type == TokenType.O_BRC) {\n                tokenizer.consume();\n                handler.startPageMarginBoxRule(text);\n                this.ruleStack.push(text);\n                handler.startRuleBody();\n                this.inStyleDeclaration = true;\n                continue;\n              }\n              break;\n            case \"-epubx-when\":\n              tokenizer.consume();\n              this.propName = null; // signals @ rule\n              this.exprContext = ExprContext.WHEN;\n              this.actions = actionsExprVal;\n              valStack.push(\"{\");\n              continue;\n            case \"media\":\n              tokenizer.consume();\n              this.propName = null; // signals @ rule\n              this.exprContext = ExprContext.MEDIA;\n              this.actions = actionsExprVal;\n              valStack.push(\"{\");\n              continue;\n            case \"supports\":\n              tokenizer.consume();\n              this.propName = null; // signals @ rule\n              this.exprContext = ExprContext.SUPPORTS;\n              this.actions = actionsExprVal;\n              valStack.push(\"{\");\n              continue;\n            case \"-epubx-flow\":\n              if (\n                tokenizer.nthToken(1).type == TokenType.IDENT &&\n                tokenizer.nthToken(2).type == TokenType.O_BRC\n              ) {\n                handler.startFlowRule(tokenizer.nthToken(1).text);\n                tokenizer.consume();\n                tokenizer.consume();\n                tokenizer.consume();\n                this.ruleStack.push(text);\n                handler.startRuleBody();\n                this.inStyleDeclaration = true;\n                continue;\n              }\n              break;\n            case \"counter-style\":\n              if (\n                tokenizer.nthToken(1).type == TokenType.IDENT &&\n                tokenizer.nthToken(2).type == TokenType.O_BRC\n              ) {\n                handler.startCounterStyleRule(tokenizer.nthToken(1).text);\n                tokenizer.consume();\n                tokenizer.consume();\n                tokenizer.consume();\n                this.ruleStack.push(text);\n                handler.startRuleBody();\n                this.inStyleDeclaration = true;\n                continue;\n              }\n              break;\n            case \"-epubx-page-master\":\n            case \"-epubx-partition\":\n            case \"-epubx-partition-group\": {\n              tokenizer.consume();\n              token = tokenizer.token();\n              let ruleName: string | null = null;\n              let rulePseudoName: string | null = null;\n              const classes: string[] = [];\n              if (token.type == TokenType.IDENT) {\n                ruleName = token.text;\n                tokenizer.consume();\n                token = tokenizer.token();\n              }\n              if (\n                token.type == TokenType.COLON &&\n                tokenizer.nthToken(1).type == TokenType.IDENT\n              ) {\n                rulePseudoName = tokenizer.nthToken(1).text;\n                tokenizer.consume();\n                tokenizer.consume();\n                token = tokenizer.token();\n              }\n              while (\n                token.type == TokenType.FUNC &&\n                token.text.toLowerCase() == \"class\" &&\n                tokenizer.nthToken(1).type == TokenType.IDENT &&\n                tokenizer.nthToken(2).type == TokenType.C_PAR\n              ) {\n                classes.push(tokenizer.nthToken(1).text);\n                tokenizer.consume();\n                tokenizer.consume();\n                tokenizer.consume();\n                token = tokenizer.token();\n              }\n              if (token.type == TokenType.O_BRC) {\n                tokenizer.consume();\n                switch (text) {\n                  case \"-epubx-page-master\":\n                    handler.startPageMasterRule(\n                      ruleName,\n                      rulePseudoName,\n                      classes,\n                    );\n                    break;\n                  case \"-epubx-partition\":\n                    handler.startPartitionRule(\n                      ruleName,\n                      rulePseudoName,\n                      classes,\n                    );\n                    break;\n                  case \"-epubx-partition-group\":\n                    handler.startPartitionGroupRule(\n                      ruleName,\n                      rulePseudoName,\n                      classes,\n                    );\n                    break;\n                }\n                this.ruleStack.push(text);\n                handler.startRuleBody();\n                this.inStyleDeclaration = true;\n                continue;\n              }\n              break;\n            }\n            case \"\":\n              // No text after @\n              handler.error(`E_CSS_UNEXPECTED_AT${text}`, token);\n\n              // Error recovery using selector rules.\n              this.actions = actionsErrorSelector;\n              continue;\n            default:\n              handler.error(`E_CSS_AT_UNKNOWN ${text}`, token);\n              this.actions = actionsError;\n              continue;\n          }\n          handler.error(`E_CSS_AT_SYNTAX ${text}`, token);\n          this.actions = actionsError;\n          continue;\n        case Action.ERROR_PUSH:\n          // Open bracket while skipping error syntax\n          this.errorBrackets.push(token.type + 1);\n\n          // Expected closing bracket\n          tokenizer.consume();\n          continue;\n        case Action.ERROR_POP_DECL:\n          // Close bracket while skipping error syntax in declaration\n          if (this.errorBrackets.length == 0) {\n            this.actions = actionsBase;\n\n            // Don't consume closing brace\n            continue;\n          }\n\n        // fall through\n        case Action.ERROR_POP:\n          if (\n            parsingFunctionParam &&\n            this.errorBrackets.length == 0 &&\n            token.type == TokenType.C_PAR\n          ) {\n            tokenizer.consume();\n            handler.endFuncWithSelector();\n            return true;\n          }\n          // Close bracket while skipping error syntax\n          if (\n            this.errorBrackets.length > 0 &&\n            this.errorBrackets[this.errorBrackets.length - 1] == token.type\n          ) {\n            this.errorBrackets.pop();\n          }\n          if (this.errorBrackets.length == 0 && token.type == TokenType.C_BRC) {\n            this.actions = actionsBase;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.ERROR_SEMICOL:\n          if (this.errorBrackets.length == 0) {\n            this.actions = actionsBase;\n          }\n          tokenizer.consume();\n          continue;\n        case Action.DONE:\n          return true;\n        default:\n          if (parsingMediaQuery) {\n            if (this.exprStackReduce(TokenType.C_PAR, token)) {\n              this.result = valStack.pop() as Css.Val;\n              return true;\n            }\n            return false;\n          }\n          if (parsingFunctionParam) {\n            switch (token.type) {\n              case TokenType.COMMA:\n              case TokenType.C_PAR:\n                if (this.actions === actionsSelectorStart) {\n                  handler.error(\"E_CSS_SYNTAX\", token);\n                } else {\n                  const selectorText = tokenizer.input.substring(\n                    selectorStartPosition,\n                    token.position,\n                  );\n                  handler.pushSelectorText(selectorText);\n                  selectorStartPosition = token.position + 1;\n                }\n                if (token.type === TokenType.COMMA) {\n                  handler.nextSelector();\n                  this.actions = actionsSelectorStart;\n                  tokenizer.consume();\n                  continue;\n                } else {\n                  handler.endFuncWithSelector();\n                  tokenizer.consume();\n                  return true;\n                }\n              case TokenType.GT:\n              case TokenType.PLUS:\n              case TokenType.TILDE:\n                if (parsingRelationalSelector) {\n                  // :has() takes relational selectors e.g. `:has(> F)`\n                  this.actions = actionsSelector;\n                  continue;\n                }\n                break;\n              case TokenType.O_BRC:\n              case TokenType.O_BRK:\n              case TokenType.O_PAR:\n                this.errorBrackets.push(token.type + 1);\n                break;\n            }\n            handler.error(\"E_CSS_SYNTAX\", token);\n            tokenizer.consume();\n            this.actions = actionsErrorSelector;\n            continue;\n          }\n          if (\n            this.actions !== actionsError &&\n            this.actions !== actionsErrorSelector &&\n            this.actions !== actionsErrorDecl\n          ) {\n            if (token.type == TokenType.INVALID) {\n              handler.error(\"E_CSS_SYNTAX\", token);\n            } else if (this.actions === actionsPropVal) {\n              // Do not stop parsing on invalid property syntax as long as brackets are balanced.\n              switch (token.type) {\n                case TokenType.O_PAR:\n                case TokenType.O_BRC:\n                case TokenType.O_BRK:\n                  this.errorBrackets.push(token.type + 1);\n                  break;\n              }\n              valStack.push(new Css.AnyToken(token.toString()));\n              tokenizer.consume();\n              continue;\n            } else if (\n              token.type === TokenType.O_BRC &&\n              this.actions == actionsExprVal &&\n              valStack.length > 0\n            ) {\n              // `@media {...}` and `@supports {...}` should be ok\n              handler.startMediaRule(valStack.pop() as Css.Expr);\n              this.ruleStack.push(\"media\");\n              handler.startRuleBody();\n              this.actions = actionsBase;\n              tokenizer.consume();\n              continue;\n            } else if (\n              token.type === TokenType.SEMICOL &&\n              this.actions == actionsExprVal\n            ) {\n              // `@media;` and `@supports;` should be ok\n              this.actions = actionsBase;\n              tokenizer.consume();\n              return false;\n            } else {\n              handler.error(\"E_CSS_SYNTAX\", token);\n            }\n            if (this.isInsidePropertyOnlyRule()) {\n              this.actions = actionsErrorDecl;\n            } else {\n              this.actions = actionsErrorSelector;\n            }\n            continue; // Let error-recovery to re-process the offending token\n          }\n          tokenizer.consume();\n          continue;\n      }\n    }\n    return false; // Not done yet.\n  }\n}\n\nexport class ErrorHandler extends ParserHandler {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super(null);\n  }\n\n  override error(mnemonics: string, token: CssTokenizer.Token): void {\n    // throw new Error(mnemonics + \" \" + token);\n    Logging.logger.warn(mnemonics, token.toString());\n  }\n\n  override getScope(): Exprs.LexicalScope {\n    return this.scope;\n  }\n}\n\nexport function parseStylesheet(\n  tokenizer: CssTokenizer.Tokenizer,\n  handler: ParserHandler,\n  baseURL: string,\n  classes: string | null,\n  media: string | null,\n): Task.Result<boolean> {\n  const frame: Task.Frame<boolean> = Task.newFrame(\"parseStylesheet\");\n  const parser = new Parser(actionsBase, tokenizer, handler, baseURL);\n  let condition: Css.Expr = null;\n  if (media) {\n    condition = parseMediaQuery(\n      new CssTokenizer.Tokenizer(media, handler),\n      handler,\n      baseURL,\n    );\n  }\n  condition = parser.makeCondition(classes, condition && condition.toExpr());\n  if (condition) {\n    handler.startMediaRule(condition);\n    handler.startRuleBody();\n  }\n  frame\n    .loop(() => {\n      while (!parser.runParser(100, false, false, false, false)) {\n        if (parser.importReady) {\n          const resolvedURL = Base.resolveURL(\n            parser.importURL as string,\n            baseURL,\n          );\n          if (parser.importCondition) {\n            handler.startMediaRule(parser.importCondition);\n            handler.startRuleBody();\n          }\n          const innerFrame: Task.Frame<boolean> = Task.newFrame(\n            \"parseStylesheet.import\",\n          );\n          parseStylesheetFromURL(resolvedURL, handler, null, null).then(() => {\n            if (parser.importCondition) {\n              handler.endRule();\n            }\n            parser.importReady = false;\n            parser.importURL = null;\n            parser.importCondition = null;\n            innerFrame.finish(true);\n          });\n          return innerFrame.result();\n        }\n        const r = frame.timeSlice();\n        if (r.isPending) {\n          return r;\n        }\n      }\n      return Task.newResult(false);\n    })\n    .then(() => {\n      if (condition) {\n        handler.endRule();\n      }\n      frame.finish(true);\n    });\n  return frame.result();\n}\n\nexport function parseStylesheetFromText(\n  text: string,\n  handler: ParserHandler,\n  baseURL: string,\n  classes: string | null,\n  media: string | null,\n): Task.Result<boolean> {\n  return Task.handle(\n    \"parseStylesheetFromText\",\n    (frame) => {\n      const tok = new CssTokenizer.Tokenizer(text, handler);\n      parseStylesheet(tok, handler, baseURL, classes, media).thenFinish(frame);\n    },\n    (frame, err) => {\n      Logging.logger.warn(err, `Failed to parse stylesheet text: ${text}`);\n      frame.finish(false);\n    },\n  );\n}\n\nexport function parseStylesheetFromURL(\n  url: string,\n  handler: ParserHandler,\n  classes: string | null,\n  media: string | null,\n): Task.Result<boolean> {\n  return Task.handle(\n    \"parseStylesheetFromURL\",\n    (frame) => {\n      Net.fetchFromURL(url).then((response) => {\n        if (!response.responseText) {\n          frame.finish(true);\n        } else {\n          parseStylesheetFromText(\n            response.responseText,\n            handler,\n            url,\n            classes,\n            media,\n          ).then((result) => {\n            if (!result) {\n              Logging.logger.warn(`Failed to parse stylesheet from ${url}`);\n            }\n            frame.finish(true);\n          });\n        }\n      });\n    },\n    (frame, err) => {\n      Logging.logger.warn(err, \"Exception while fetching and parsing:\", url);\n      frame.finish(true);\n    },\n  );\n}\n\nexport function parseValue(\n  scope: Exprs.LexicalScope,\n  tokenizer: CssTokenizer.Tokenizer,\n  baseURL: string,\n): Css.Val {\n  const parser = new Parser(\n    actionsPropVal,\n    tokenizer,\n    new ErrorHandler(scope),\n    baseURL,\n  );\n  parser.runParser(Number.POSITIVE_INFINITY, true, false, false, false);\n  return parser.result;\n}\n\nexport function parseStyleAttribute(\n  tokenizer: CssTokenizer.Tokenizer,\n  handler: ParserHandler,\n  baseURL: string,\n): void {\n  const parser = new Parser(actionsStyleAttribute, tokenizer, handler, baseURL);\n  parser.runParser(Number.POSITIVE_INFINITY, false, true, false, false);\n}\n\nexport function parseMediaQuery(\n  tokenizer: CssTokenizer.Tokenizer,\n  handler: ParserHandler,\n  baseURL: string,\n): Css.Expr {\n  const parser = new Parser(actionsExprVal, tokenizer, handler, baseURL);\n  parser.runParser(Number.POSITIVE_INFINITY, false, false, true, false);\n  return parser.result as Css.Expr;\n}\n\nexport const numProp: { [key: string]: boolean } = {\n  \"z-index\": true,\n  \"column-count\": true,\n  \"flow-linger\": true,\n  opacity: true,\n  page: true,\n  \"flow-priority\": true,\n  utilization: true,\n};\n\nexport function takesOnlyNum(propName: string): boolean {\n  return !!numProp[propName];\n}\n\n/**\n * @return val\n */\nexport function evaluateExprToCSS(\n  context: Exprs.Context,\n  val: Exprs.Val,\n  propName: string,\n): Css.Val {\n  // Preserve viv-leader expressions as Css.Expr (Issue #1563)\n  // leader() must be processed by ContentPropertyHandler, not evaluated here\n  if (val instanceof Exprs.Native && val.str === \"viv-leader\") {\n    return new Css.Expr(val);\n  }\n  const result = val.evaluate(context);\n  switch (typeof result) {\n    case \"number\":\n      if (!takesOnlyNum(propName)) {\n        return new Css.Numeric(result as number, \"px\");\n      } else if (result == Math.round(result as number)) {\n        return new Css.Int(result as number);\n      } else {\n        return new Css.Num(result as number);\n      }\n    case \"string\":\n      if (!result) {\n        return Css.empty;\n      }\n\n      // TODO: where baseURL should come from???\n      return parseValue(\n        val.scope,\n        new CssTokenizer.Tokenizer(result as string, null),\n        \"\",\n      );\n    case \"boolean\":\n      return result ? Css.ident._true : Css.ident._false;\n    case \"undefined\":\n      return Css.empty;\n  }\n  throw new Error(\"E_UNEXPECTED\");\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssLogicalUtil - Utilities related to CSS Logical Properties and Values https://drafts.csswg.org/css-logical/\n */\ntype ConversionMap = {\n  regexp: RegExp;\n  to: string;\n};\n\nfunction createRegExpMap(\n  valueMaps: {\n    [key: string]: { [key: string]: { logical: string; physical: string }[] };\n  },\n  toPhysical: boolean,\n): { [key: string]: { [key: string]: ConversionMap[] } } {\n  const map = {};\n  Object.keys(valueMaps as object).forEach((writingMode) => {\n    const dest = (map[writingMode] = {});\n    const src = valueMaps[writingMode];\n    Object.keys(src as object).forEach((direction) => {\n      dest[direction] = src[direction].map((p) => {\n        const from = toPhysical ? p.logical : p.physical;\n        const to = toPhysical ? p.physical : p.logical;\n        return { regexp: new RegExp(`(-?)${from}(-?)`), to: `\\$1${to}\\$2` };\n      });\n    });\n  });\n  return map;\n}\n\nfunction convert(\n  value: string,\n  writingMode: string,\n  direction: string | null,\n  maps: { [key: string]: { [key: string]: ConversionMap[] } },\n): string {\n  const maps2 = maps[writingMode];\n  if (!maps2) {\n    throw new Error(`unknown writing-mode: ${writingMode}`);\n  }\n  const map = maps2[direction || \"ltr\"];\n  if (!map) {\n    throw new Error(`unknown direction: ${direction}`);\n  }\n  for (const p of map) {\n    const replaced = value.replace(p.regexp, p.to);\n    if (replaced !== value) {\n      return replaced;\n    }\n  }\n  return value;\n}\nconst values: {\n  [key: string]: { [key: string]: { logical: string; physical: string }[] };\n} = {\n  \"horizontal-tb\": {\n    ltr: [\n      { logical: \"inline-start\", physical: \"left\" },\n      { logical: \"inline-end\", physical: \"right\" },\n      { logical: \"block-start\", physical: \"top\" },\n      { logical: \"block-end\", physical: \"bottom\" },\n      { logical: \"inline-size\", physical: \"width\" },\n      { logical: \"block-size\", physical: \"height\" },\n    ],\n    rtl: [\n      { logical: \"inline-start\", physical: \"right\" },\n      { logical: \"inline-end\", physical: \"left\" },\n      { logical: \"block-start\", physical: \"top\" },\n      { logical: \"block-end\", physical: \"bottom\" },\n      { logical: \"inline-size\", physical: \"width\" },\n      { logical: \"block-size\", physical: \"height\" },\n    ],\n  },\n  \"vertical-rl\": {\n    ltr: [\n      { logical: \"inline-start\", physical: \"top\" },\n      { logical: \"inline-end\", physical: \"bottom\" },\n      { logical: \"block-start\", physical: \"right\" },\n      { logical: \"block-end\", physical: \"left\" },\n      { logical: \"inline-size\", physical: \"height\" },\n      { logical: \"block-size\", physical: \"width\" },\n    ],\n    rtl: [\n      { logical: \"inline-start\", physical: \"bottom\" },\n      { logical: \"inline-end\", physical: \"top\" },\n      { logical: \"block-start\", physical: \"right\" },\n      { logical: \"block-end\", physical: \"left\" },\n      { logical: \"inline-size\", physical: \"height\" },\n      { logical: \"block-size\", physical: \"width\" },\n    ],\n  },\n  \"vertical-lr\": {\n    ltr: [\n      { logical: \"inline-start\", physical: \"top\" },\n      { logical: \"inline-end\", physical: \"bottom\" },\n      { logical: \"block-start\", physical: \"left\" },\n      { logical: \"block-end\", physical: \"right\" },\n      { logical: \"inline-size\", physical: \"height\" },\n      { logical: \"block-size\", physical: \"width\" },\n    ],\n    rtl: [\n      { logical: \"inline-start\", physical: \"bottom\" },\n      { logical: \"inline-end\", physical: \"top\" },\n      { logical: \"block-start\", physical: \"left\" },\n      { logical: \"block-end\", physical: \"right\" },\n      { logical: \"inline-size\", physical: \"height\" },\n      { logical: \"block-size\", physical: \"width\" },\n    ],\n  },\n};\nconst toPhysicalMaps = createRegExpMap(values, true);\n\nexport function toPhysical(\n  value: string,\n  writingMode: string,\n  direction?: string | null,\n): string {\n  return convert(value, writingMode, direction || null, toPhysicalMaps);\n}\nconst toLogicalMaps = createRegExpMap(values, false);\n\nexport function toLogical(\n  value: string,\n  writingMode: string,\n  direction?: string | null,\n): string {\n  return convert(value, writingMode, direction || null, toLogicalMaps);\n}\nconst lineRelativeValues: {\n  [key: string]: { logical: string; physical: string }[];\n} = {\n  \"horizontal-tb\": [\n    { logical: \"line-left\", physical: \"left\" },\n    { logical: \"line-right\", physical: \"right\" },\n    { logical: \"over\", physical: \"top\" },\n    { logical: \"under\", physical: \"bottom\" },\n  ],\n  \"vertical-rl\": [\n    { logical: \"line-left\", physical: \"top\" },\n    { logical: \"line-right\", physical: \"bottom\" },\n    { logical: \"over\", physical: \"right\" },\n    { logical: \"under\", physical: \"left\" },\n  ],\n  \"vertical-lr\": [\n    { logical: \"line-left\", physical: \"top\" },\n    { logical: \"line-right\", physical: \"bottom\" },\n    { logical: \"over\", physical: \"right\" },\n    { logical: \"under\", physical: \"left\" },\n  ],\n};\n\nexport function toLineRelative(value: string, writingMode: string): string {\n  const maps = lineRelativeValues[writingMode];\n  if (!maps) {\n    throw new Error(`unknown writing-mode: ${writingMode}`);\n  }\n  for (let i = 0; i < maps.length; i++) {\n    if (maps[i].physical === value) {\n      return maps[i].logical;\n    }\n  }\n  return value;\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Sizing - CSS Intrinsic & Extrinsic Sizing\n */\nimport * as Base from \"./base\";\nimport * as Vtree from \"./vtree\";\n\n/**\n * Box sizes defined in css-sizing.\n * @enum {string}\n */\nexport enum Size {\n  MAX_CONTENT_INLINE_SIZE = \"max-content inline size\",\n  MAX_CONTENT_BLOCK_SIZE = \"max-content block size\",\n  MAX_CONTENT_WIDTH = \"max-content width\",\n  MAX_CONTENT_HEIGHT = \"max-content height\",\n  MIN_CONTENT_INLINE_SIZE = \"min-content inline size\",\n  MIN_CONTENT_BLOCK_SIZE = \"min-content block size\",\n  MIN_CONTENT_WIDTH = \"min-content width\",\n  MIN_CONTENT_HEIGHT = \"min-content height\",\n  FIT_CONTENT_INLINE_SIZE = \"fit-content inline size\",\n  FIT_CONTENT_BLOCK_SIZE = \"fit-content block size\",\n  FIT_CONTENT_WIDTH = \"fit-content width\",\n  FIT_CONTENT_HEIGHT = \"fit-content height\",\n}\n\n/**\n * Get specified sizes for the element.\n */\nexport function getSize(\n  clientLayout: Vtree.ClientLayout,\n  element: Element,\n  sizes: Size[],\n): { [key in Size]: number } {\n  const element1 = element as HTMLElement;\n  const original = {\n    width: element1.style.width,\n    height: element1.style.height,\n  };\n\n  function getComputedValue(name: string): string {\n    return clientLayout.getElementComputedStyle(element).getPropertyValue(name);\n  }\n\n  const writingModeValue = getComputedValue(\"writing-mode\");\n  const isVertical = writingModeValue !== \"horizontal-tb\";\n  const inlineSizeName = isVertical ? \"height\" : \"width\";\n  const blockSizeName = isVertical ? \"width\" : \"height\";\n\n  function getSizeValue(\n    sizeName: \"width\" | \"height\",\n    minMaxFitContent: \"min-content\" | \"max-content\" | \"fit-content\",\n  ): string {\n    element1.style[sizeName] = minMaxFitContent;\n    const r = getComputedValue(sizeName);\n    element1.style[sizeName] = original[sizeName];\n    return r;\n  }\n\n  const result = {} as { [key in Size]: number };\n  for (const size of sizes) {\n    let r: string;\n    switch (size) {\n      case Size.MAX_CONTENT_INLINE_SIZE:\n        r = getSizeValue(inlineSizeName, \"max-content\");\n        break;\n      case Size.MIN_CONTENT_INLINE_SIZE:\n        r = getSizeValue(inlineSizeName, \"min-content\");\n        break;\n      case Size.FIT_CONTENT_INLINE_SIZE:\n        r = getSizeValue(inlineSizeName, \"fit-content\");\n        break;\n      case Size.MAX_CONTENT_BLOCK_SIZE:\n        r = getSizeValue(blockSizeName, \"max-content\");\n        break;\n      case Size.MIN_CONTENT_BLOCK_SIZE:\n        r = getSizeValue(blockSizeName, \"min-content\");\n        break;\n      case Size.FIT_CONTENT_BLOCK_SIZE:\n        r = getSizeValue(blockSizeName, \"fit-content\");\n        break;\n      case Size.MAX_CONTENT_WIDTH:\n        r = getSizeValue(\"width\", \"max-content\");\n        break;\n      case Size.MAX_CONTENT_HEIGHT:\n        r = getSizeValue(\"height\", \"max-content\");\n        break;\n      case Size.MIN_CONTENT_WIDTH:\n        r = getSizeValue(\"width\", \"min-content\");\n        break;\n      case Size.MIN_CONTENT_HEIGHT:\n        r = getSizeValue(\"height\", \"min-content\");\n        break;\n      case Size.FIT_CONTENT_WIDTH:\n        r = getSizeValue(\"width\", \"fit-content\");\n        break;\n      case Size.FIT_CONTENT_HEIGHT:\n        r = getSizeValue(\"height\", \"fit-content\");\n        break;\n    }\n    // Workaround for the case that the element has an image that is\n    // not loaded yet. Use 1px instead of 0px to avoid wrong layout.\n    if (\n      r === \"0px\" &&\n      element.childNodes.length === 1 &&\n      element.firstElementChild?.localName === \"img\" &&\n      !(element.firstElementChild as HTMLImageElement).complete\n    ) {\n      r = \"1px\";\n    }\n    result[size] = parseFloat(r);\n  }\n\n  return result;\n}\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Break - Control fragmentation.\n */\nimport * as Css from \"./css\";\nimport * as Plugin from \"./plugin\";\n\n/**\n * Check if style=\"box-decoration-break: clone\" is set\n */\nexport function isCloneBoxDecorationBreak(element: Element): boolean {\n  return (\n    (element as HTMLElement)?.style?.[\"box-decoration-break\"] === \"clone\" ||\n    (element as HTMLElement)?.style?.[\"-webkit-box-decoration-break\"] ===\n      \"clone\"\n  );\n}\n\n/**\n * data-viv-box-break attribute\n *\n * Value: [ [inline-start || inline-end] |\n *          [block-start text-start? || block-end text-end?] justify? ]\n *        clone?\n *\n * inline-start, inline-end, block-start, block-end: the side at which a box break occurs\n * text-start: the fragment starts with text or inline box\n * text-end: the fragment ends with text or inline box\n * justify: the computed value of `text-align` property is `justify`\n * clone: the computed value of `box-decoration-break` property is `clone`\n */\ntype BoxBreakFlag =\n  | \"inline-start\"\n  | \"inline-end\"\n  | \"block-start\"\n  | \"block-end\"\n  | \"text-start\"\n  | \"text-end\"\n  | \"justify\"\n  | \"clone\";\n\nexport function getBoxBreakFlags(element: Element): BoxBreakFlag[] {\n  const val = element.getAttribute(\"data-viv-box-break\");\n  return (val ? val.split(\" \") : []) as BoxBreakFlag[];\n}\n\nexport function setBoxBreakFlags(\n  element: Element,\n  boxBreakFlags: BoxBreakFlag[],\n): void {\n  element.setAttribute(\"data-viv-box-break\", boxBreakFlags.join(\" \"));\n}\n\nexport function setBoxBreakFlag(\n  element: Element,\n  boxBreakFlag: BoxBreakFlag,\n): void {\n  const boxBreakFlags = getBoxBreakFlags(element);\n  if (!boxBreakFlags.includes(boxBreakFlag)) {\n    boxBreakFlags.push(boxBreakFlag);\n    setBoxBreakFlags(element, boxBreakFlags);\n  }\n}\n\n/**\n * data-viv-margin-discard attribute\n *\n * Value: block-start || block-end || inline-start || inline-end\n *\n * block-start: the block-start margin is discarded\n * block-end: the block-end margin is discarded\n * inline-start: the inline-start margin is discarded\n * inline-end: the inline-end margin is discarded\n */\ntype MarginDiscardFlag =\n  | \"block-start\"\n  | \"block-end\"\n  | \"inline-start\"\n  | \"inline-end\";\n\nexport function getMarginDiscardFlags(element: Element): MarginDiscardFlag[] {\n  const val = element.getAttribute(\"data-viv-margin-discard\");\n  return (val ? val.split(\" \") : []) as MarginDiscardFlag[];\n}\n\nexport function setMarginDiscardFlags(\n  element: Element,\n  marginDiscardFlags: MarginDiscardFlag[],\n): void {\n  element.setAttribute(\"data-viv-margin-discard\", marginDiscardFlags.join(\" \"));\n}\n\nexport function setMarginDiscardFlag(\n  element: Element,\n  marginDiscardFlag: MarginDiscardFlag,\n): void {\n  const MarginDiscardFlags = getMarginDiscardFlags(element);\n  if (!MarginDiscardFlags.includes(marginDiscardFlag)) {\n    MarginDiscardFlags.push(marginDiscardFlag);\n    setMarginDiscardFlags(element, MarginDiscardFlags);\n  }\n}\n\n/**\n * Convert old page-break-* properties to break-* properties with appropriate\n * values as specified by CSS Fragmentation module:\n * https://drafts.csswg.org/css-break/#page-break-properties\n */\nexport function convertPageBreakAliases(original: {\n  name: string;\n  value: Css.Val;\n  important: boolean;\n}): { name: string; value: Css.Val; important: boolean } {\n  const name = original[\"name\"];\n  const value = original[\"value\"];\n  switch (name) {\n    case \"page-break-before\":\n    case \"page-break-after\":\n    case \"page-break-inside\":\n      return {\n        name: name.replace(/^page-/, \"\"),\n        value: value === Css.ident.always ? Css.ident.page : value,\n        important: original[\"important\"],\n      };\n    default:\n      return original;\n  }\n}\n\nexport const forcedBreakValues: { [key: string]: boolean | null } = {\n  page: true,\n  left: true,\n  right: true,\n  recto: true,\n  verso: true,\n  column: true,\n  region: true,\n};\n\n/**\n * Returns if the value is one of the forced break values.\n * @param value The break value to be judged. Treats null as 'auto'.\n */\nexport function isForcedBreakValue(value: string | null): boolean {\n  return !!forcedBreakValues[value];\n}\n\nexport const spreadBreakValues: { [key: string]: boolean | null } = {\n  left: true,\n  right: true,\n  recto: true,\n  verso: true,\n};\n\n/**\n * Returns if the value is one of left/right/recto/verso values.\n * @param value The break value to be judged. Treats null as 'auto'.\n */\nexport function isSpreadBreakValue(value: string | null): boolean {\n  return !!spreadBreakValues[value];\n}\n\nexport const avoidBreakValues: { [key: string]: boolean | null } = {\n  avoid: true,\n  \"avoid-page\": true,\n  \"avoid-column\": true,\n  \"avoid-region\": true,\n};\n\n/**\n * Returns if the value is one of the avoid break values.\n * @param value The break value to be judged. Treats null as 'auto'.\n */\nexport function isAvoidBreakValue(value: string | null): boolean {\n  return !!avoidBreakValues[value];\n}\n\n/**\n * Resolves the effective break value given two break values at a single break\n * point. The order of the arguments are relevant, since a value specified on\n * the latter element takes precedence over one on the former. A forced break\n * value is chosen if present. Otherwise, an avoid break value is chosen if\n * present. See CSS Fragmentation Module for the rule:\n *  https://drafts.csswg.org/css-break/#forced-breaks\n *  https://drafts.csswg.org/css-break/#unforced-breaks\n * Note that though the spec requires to honor multiple break values at a single\n * break point, the current implementation choose one of them and discard the\n * others.\n * @param first The break value specified on the former element. null means\n *     'auto' (not specified)\n * @param second The break value specified on the latter element. null means\n *     'auto' (not specified)\n */\nexport function resolveEffectiveBreakValue(\n  first: string | null,\n  second: string | null,\n): string | null {\n  if (!first) {\n    return second;\n  } else if (!second) {\n    return first;\n  } else if (isSpreadBreakValue(second)) {\n    return second;\n  } else if (isSpreadBreakValue(first)) {\n    return first;\n  } else {\n    const firstIsForcedBreakValue = isForcedBreakValue(first);\n    const secondIsForcedBreakValue = isForcedBreakValue(second);\n    if (firstIsForcedBreakValue && secondIsForcedBreakValue) {\n      switch (second) {\n        case \"column\":\n          // \"column\" is the weakest value\n          return first;\n        case \"region\":\n          // \"region\" is stronger than \"column\" but weaker than page\n          // values\n          return first === \"column\" ? second : first;\n        default:\n          // page values are strongest\n          return second;\n      }\n    } else if (secondIsForcedBreakValue) {\n      return second;\n    } else if (firstIsForcedBreakValue) {\n      return first;\n    } else if (isAvoidBreakValue(second)) {\n      return second;\n    } else if (isAvoidBreakValue(first)) {\n      return first;\n    } else {\n      return second;\n    }\n  }\n}\n\nexport function breakValueToStartBreakType(breakValue: string | null): string {\n  return isForcedBreakValue(breakValue) ? breakValue : \"auto\";\n}\n\nPlugin.registerHook(\"SIMPLE_PROPERTY\", convertPageBreakAliases);\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Diff utility\n */\n\nimport fastdiff from \"fast-diff\";\n\nexport type Change = (number | string)[];\n\nexport function diffChars(originalText: string, newText: string): Change[] {\n  return fastdiff(originalText, newText, 0);\n}\n\nexport function restoreOriginalText(changes: Change[]): string {\n  return changes.reduce((result, item) => {\n    if (item[0] === fastdiff.INSERT) {\n      return result;\n    }\n    return result + item[1];\n  }, \"\");\n}\n\nexport function restoreNewText(changes: Change[]): string {\n  return changes.reduce((result, item) => {\n    if (item[0] === fastdiff.DELETE) {\n      return result;\n    }\n    return result + item[1];\n  }, \"\");\n}\n\nexport function resolveNewIndex(changes: Change[], oldIndex: number): number {\n  return resolveIndex(changes, oldIndex, 1);\n}\n\nexport function resolveOriginalIndex(\n  changes: Change[],\n  newIndex: number,\n): number {\n  return resolveIndex(changes, newIndex, -1);\n}\n\nexport function resolveIndex(\n  changes: Change[],\n  index: number,\n  coef: number,\n): number {\n  let diff = 0;\n  let current = 0;\n  changes.some((change) => {\n    for (let i = 0; i < (change[1] as string).length; i++) {\n      switch ((change[0] as number) * coef) {\n        case fastdiff.INSERT:\n          diff++;\n          break;\n        case fastdiff.DELETE:\n          diff--;\n          current++;\n          break;\n        case fastdiff.EQUAL:\n          current++;\n          break;\n      }\n      if (current > index) {\n        return true;\n      }\n    }\n    return false;\n  });\n  return Math.max(Math.min(index, current - 1) + diff, 0);\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Types - Type definiions.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as Diff from \"./diff\";\nimport * as Exprs from \"./exprs\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\n\nexport type FormattingContextType =\n  | \"Block\"\n  | \"RepetitiveElementsOwner\"\n  | \"Table\";\n\nexport type FragmentLayoutConstraintType =\n  | \"AfterIfContinue\"\n  | \"EntireTable\"\n  | \"RepetitiveElementsOwner\"\n  | \"TableRow\";\n\nexport namespace CssCascade {\n  export type ElementStyle = { [key: string]: any };\n}\n\nexport namespace CssStyler {\n  export interface AbstractStyler {\n    getStyle(element: Element, deep: boolean): CssCascade.ElementStyle;\n    processContent(\n      element: Element,\n      styles: { [key: string]: Css.Val },\n      nodeContext: Vtree.NodeContext,\n    );\n  }\n}\n\nexport namespace Layout {\n  /**\n   * Represents a constraint on layout\n   */\n  export interface LayoutConstraint {\n    /**\n     * Returns if this constraint allows the node context to be laid out at the\n     * current position.\n     */\n    allowLayout(nodeContext: Vtree.NodeContext): boolean;\n  }\n  /**\n   * Represents constraints on laying out fragments\n   */\n  export interface FragmentLayoutConstraint {\n    flagmentLayoutConstraintType: FragmentLayoutConstraintType;\n    allowLayout(\n      nodeContext: Vtree.NodeContext,\n      overflownNodeContext: Vtree.NodeContext,\n      column: Column,\n    ): boolean;\n    nextCandidate(nodeContext: Vtree.NodeContext): boolean;\n    postLayout(\n      allowed: boolean,\n      positionAfter: Vtree.NodeContext,\n      initialPosition: Vtree.NodeContext,\n      column: Column,\n    );\n    finishBreak(\n      nodeContext: Vtree.NodeContext,\n      column: Column,\n    ): Task.Result<boolean>;\n    equalsTo(constraint: FragmentLayoutConstraint): boolean;\n    getPriorityOfFinishBreak(): number;\n  }\n\n  /**\n   * Potential breaking position.\n   */\n  export interface BreakPosition {\n    /**\n     * @return break position, if found\n     */\n    findAcceptableBreak(column: Column, penalty: number): Vtree.NodeContext;\n    /**\n     * @return penalty for this break position\n     */\n    getMinBreakPenalty(): number;\n    calculateOffset(column: Column): { current: number; minimum: number };\n    breakPositionChosen(column: Column): void;\n  }\n\n  export interface AbstractBreakPosition extends BreakPosition {\n    getNodeContext(): Vtree.NodeContext;\n  }\n\n  export type BreakPositionAndNodeContext = {\n    breakPosition: BreakPosition;\n    nodeContext: Vtree.NodeContext;\n  };\n\n  /**\n   * Potential breaking position inside CSS box (between lines).\n   * @param checkPoints array of breaking points for\n   *    breakable block\n   */\n  export interface BoxBreakPosition extends AbstractBreakPosition {\n    breakNodeContext: Vtree.NodeContext;\n    readonly checkPoints: Vtree.NodeContext[];\n    readonly penalty: number;\n  }\n\n  /**\n   * Potential edge breaking position.\n   */\n  export interface EdgeBreakPosition extends AbstractBreakPosition {\n    overflowIfRepetitiveElementsDropped: boolean;\n    readonly position: Vtree.NodeContext;\n    readonly breakOnEdge: string | null;\n    overflows: boolean;\n    readonly computedBlockSize: number;\n  }\n\n  export interface Column extends Vtree.Container {\n    last: Node;\n    viewDocument: Document;\n    flowRootFormattingContext: Vtree.FormattingContext;\n    isFloat: boolean;\n    isFootnote: boolean;\n    startEdge: number;\n    endEdge: number;\n    beforeEdge: number;\n    afterEdge: number;\n    footnoteEdge: number;\n    box: GeometryUtil.Rect;\n    chunkPositions: Vtree.ChunkPosition[];\n    bands: GeometryUtil.Band[];\n    overflown: boolean;\n    breakPositions: BreakPosition[];\n    pageBreakType: string | null;\n    forceNonfitting: boolean;\n    leftFloatEdge: number;\n    /**\n     * bottom of the bottommost left float\n     */\n    rightFloatEdge: number;\n    /**\n     * bottom of the bottommost right float\n     */\n    bottommostFloatTop: number;\n    /**\n     * Top of the bottommost float\n     */\n    stopAtOverflow: boolean;\n    lastAfterPosition: Vtree.NodePosition | null;\n    fragmentLayoutConstraints: FragmentLayoutConstraint[];\n    pseudoParent: Column;\n    nodeContextOverflowingDueToRepetitiveElements: Vtree.NodeContext | null;\n    blockDistanceToBlockEndFloats: number;\n    computedBlockSize: number;\n\n    layoutContext: Vtree.LayoutContext;\n    clientLayout: Vtree.ClientLayout;\n    readonly layoutConstraint: LayoutConstraint;\n    readonly pageFloatLayoutContext: PageFloats.PageFloatLayoutContext;\n\n    getTopEdge(): number;\n    getBottomEdge(): number;\n    getLeftEdge(): number;\n    getRightEdge(): number;\n    isFloatNodeContext(nodeContext: Vtree.NodeContext): boolean;\n    stopByOverflow(nodeContext: Vtree.NodeContext): boolean;\n    isOverflown(edge: number): boolean;\n    getExclusions(): GeometryUtil.Shape[];\n    openAllViews(position: Vtree.NodePosition): Task.Result<Vtree.NodeContext>;\n    calculateOffsetInNodeForNodeContext(position: Vtree.NodePosition): number;\n    /**\n     * @param count first-XXX nesting identifier\n     */\n    maybePeelOff(\n      position: Vtree.NodeContext,\n      count: number,\n    ): Task.Result<Vtree.NodeContext>;\n    /**\n     * Builds the view until a CSS box edge is reached.\n     * @param position start source position.\n     * @param checkPoints array to append possible breaking points.\n     * @return holding box edge position reached or null if the source is exhausted.\n     */\n    buildViewToNextBlockEdge(\n      position: Vtree.NodeContext,\n      checkPoints: Vtree.NodeContext[],\n    ): Task.Result<Vtree.NodeContext>;\n    nextInTree(\n      position: Vtree.NodeContext,\n      atUnforcedBreak?: boolean,\n    ): Task.Result<Vtree.NodeContext>;\n    /**\n     * Builds the view for a single unbreakable element.\n     * @param position start source position.\n     * @return holding box edge position reached or null if the source is exhausted.\n     */\n    buildDeepElementView(\n      position: Vtree.NodeContext,\n    ): Task.Result<Vtree.NodeContext>;\n\n    /**\n     * Create a single floating element (for exclusion areas).\n     * @param ref container's child to insert float before (can be null).\n     * @param side float side (\"left\" or \"right\").\n     * @param width float inline dimension.\n     * @param height float box progression dimension.\n     * @return newly created float element.\n     */\n    createFloat(\n      ref: Node,\n      side: string,\n      width: number,\n      height: number,\n    ): Element;\n    /**\n     * Remove all the exclusion floats.\n     */\n    killFloats(): void;\n    /**\n     * Create exclusion floats for a column.\n     */\n    createFloats(): void;\n    /**\n     * @param nodeContext position after the block\n     * @param checkPoints array of possible breaking points.\n     * @param index index of the breaking point\n     * @param boxOffset box offset\n     * @return edge position\n     */\n    calculateEdge(\n      nodeContext: Vtree.NodeContext,\n      checkPoints: Vtree.NodeContext[],\n      index: number,\n      boxOffset: number,\n    ): number;\n    /**\n     * Parse CSS computed length (in pixels)\n     * @param val CSS length in \"px\"\n     * @return parsed and adjusted length value in pixels or 0 if not parsable\n     */\n    parseComputedLength(val: string): number;\n    /**\n     * Reads element's computed CSS margin.\n     */\n    getComputedMargin(element: Element): GeometryUtil.Insets;\n    /**\n     * Reads element's computed padding + borders.\n     */\n    getComputedPaddingBorder(element: Element): GeometryUtil.Insets;\n    /**\n     * Reads element's computed CSS insets(margins + border + padding or margins :\n     * depends on box-sizing)\n     */\n    getComputedInsets(element: Element): GeometryUtil.Insets;\n    /**\n     * Set element's computed CSS insets to Column Container\n     */\n    setComputedInsets(element: Element, container: Column): void;\n    /**\n     * Set element's computed width and height to Column Container\n     */\n    setComputedWidthAndHeight(element: Element, container: Column): void;\n    /**\n     * Layout a single unbreakable element.\n     */\n    layoutUnbreakable(\n      nodeContextIn: Vtree.NodeContext,\n    ): Task.Result<Vtree.NodeContext>;\n    /**\n     * Layout a single float element.\n     */\n    layoutFloat(nodeContext: Vtree.NodeContext): Task.Result<Vtree.NodeContext>;\n\n    setupFloatArea(\n      area: PageFloatArea,\n      floatReference: PageFloats.FloatReference,\n      floatSide: string,\n      anchorEdge: number | null,\n      strategy: PageFloats.PageFloatLayoutStrategy,\n      condition: PageFloats.PageFloatPlacementCondition,\n    ): boolean;\n    createPageFloatArea(\n      float: PageFloats.PageFloat | null,\n      floatSide: string,\n      anchorEdge: number | null,\n      strategy: PageFloats.PageFloatLayoutStrategy,\n      condition: PageFloats.PageFloatPlacementCondition,\n    ): PageFloatArea | null;\n    layoutSinglePageFloatFragment(\n      continuations: PageFloats.PageFloatContinuation[],\n      floatSide: string,\n      clearSide: string | null,\n      allowFragmented: boolean,\n      strategy: PageFloats.PageFloatLayoutStrategy,\n      anchorEdge: number | null,\n      pageFloatFragment?: PageFloats.PageFloatFragment | null,\n    ): Task.Result<SinglePageFloatLayoutResult>;\n    layoutPageFloatInner(\n      continuation: PageFloats.PageFloatContinuation,\n      strategy: PageFloats.PageFloatLayoutStrategy,\n      anchorEdge: number | null,\n      pageFloatFragment?: PageFloats.PageFloatFragment,\n    ): Task.Result<boolean>;\n    setFloatAnchorViewNode(nodeContext: Vtree.NodeContext): Vtree.NodeContext;\n    resolveFloatReferenceFromColumnSpan(\n      floatReference: PageFloats.FloatReference,\n      columnSpan: Css.Val,\n      nodeContext: Vtree.NodeContext,\n    ): Task.Result<PageFloats.FloatReference>;\n    layoutPageFloat(\n      nodeContext: Vtree.NodeContext,\n    ): Task.Result<Vtree.NodeContext>;\n    processLineStyling(\n      nodeContext: Vtree.NodeContext,\n      resNodeContext: Vtree.NodeContext,\n      checkPoints: Vtree.NodeContext[],\n    ): Task.Result<Vtree.NodeContext>;\n    isLoneImage(checkPoints: Vtree.NodeContext[]): boolean;\n    getTrailingMarginEdgeAdjustment(\n      trailingEdgeContexts: Vtree.NodeContext[],\n    ): number;\n    /**\n     * Layout a single CSS box.\n     */\n    layoutBreakableBlock(\n      nodeContext: Vtree.NodeContext,\n    ): Task.Result<Vtree.NodeContext>;\n    postLayoutBlock(\n      nodeContext: Vtree.NodeContext,\n      checkPoints: Vtree.NodeContext[],\n    ): void;\n    findEndOfLine(\n      linePosition: number,\n      checkPoints: Vtree.NodeContext[],\n      isUpdateMaxReachedAfterEdge: boolean,\n    ): {\n      nodeContext: Vtree.NodeContext;\n      index: number;\n      checkPointIndex: number;\n    };\n    findAcceptableBreakInside(\n      checkPoints: Vtree.NodeContext[],\n      edgePosition: number,\n      force: boolean,\n    ): Vtree.NodeContext;\n    resolveTextNodeBreaker(nodeContext: Vtree.NodeContext): TextNodeBreaker;\n    /**\n     * Read ranges skipping special elments\n     */\n    getRangeBoxes(start: Node, end: Node): Vtree.ClientRect[];\n    /**\n     * Give block's initial and final nodes, find positions of the line bottoms.\n     * This is, of course, somewhat hacky implementation.\n     * @return position of line breaks\n     */\n    findLinePositions(checkPoints: Vtree.NodeContext[]): number[];\n    calculateClonedPaddingBorder(nodeContext: Vtree.NodeContext): number;\n    findBoxBreakPosition(\n      bp: BoxBreakPosition,\n      force: boolean,\n    ): Vtree.NodeContext;\n    getAfterEdgeOfBlockContainer(nodeContext: Vtree.NodeContext): number;\n    findFirstOverflowingEdgeAndCheckPoint(checkPoints: Vtree.NodeContext[]): {\n      edge: number;\n      checkPoint: Vtree.NodeContext | null;\n    };\n    findEdgeBreakPosition(bp: EdgeBreakPosition): Vtree.NodeContext;\n    /**\n     * Finalize a line break.\n     * @return holing true\n     */\n    finishBreak(\n      nodeContext: Vtree.NodeContext,\n      forceRemoveSelf: boolean,\n      endOfColumn: boolean,\n    ): Task.Result<boolean>;\n    findAcceptableBreakPosition(): BreakPositionAndNodeContext;\n    doFinishBreak(\n      nodeContext: Vtree.NodeContext,\n      overflownNodeContext: Vtree.NodeContext,\n      initialNodeContext: Vtree.NodeContext,\n      initialComputedBlockSize: number,\n    ): Task.Result<Vtree.NodeContext>;\n    /**\n     * Determines if a page break is acceptable at this position\n     */\n    isBreakable(flowPosition: Vtree.NodeContext): boolean;\n    /**\n     * Determines if an indent value is zero\n     */\n    zeroIndent(val: string | number): boolean;\n    /**\n     * @return true if overflows\n     */\n    checkOverflowAndSaveEdge(\n      nodeContext: Vtree.NodeContext,\n      trailingEdgeContexts: Vtree.NodeContext[],\n    ): boolean;\n    /**\n     * Save a possible page break position on a CSS block edge. Check if it\n     * overflows.\n     * @return true if overflows\n     */\n    checkOverflowAndSaveEdgeAndBreakPosition(\n      nodeContext: Vtree.NodeContext,\n      trailingEdgeContexts: Vtree.NodeContext[],\n      saveEvenOverflown: boolean,\n      breakAtTheEdge: string | null,\n    ): boolean;\n    applyClearance(nodeContext: Vtree.NodeContext): boolean;\n    isBFC(formattingContext: Vtree.FormattingContext): boolean;\n    /**\n     * Skips positions until either the start of unbreakable block or inline\n     * content. Also sets breakBefore on the result combining break-before and\n     * break-after properties from all elements that meet at the edge.\n     */\n    skipEdges(\n      nodeContext: Vtree.NodeContext,\n      leadingEdge: boolean,\n      forcedBreakValue: string | null,\n    ): Task.Result<Vtree.NodeContext>;\n    /**\n     * Skips non-renderable positions until it hits the end of the flow or some\n     * renderable content. Returns the nodeContext that was passed in if some\n     * content remains and null if all content could be skipped.\n     */\n    skipTailEdges(\n      nodeContext: Vtree.NodeContext,\n    ): Task.Result<Vtree.NodeContext>;\n    layoutFloatOrFootnote(\n      nodeContext: Vtree.NodeContext,\n    ): Task.Result<Vtree.NodeContext>;\n    /**\n     * Layout next portion of the source.\n     */\n    layoutNext(\n      nodeContext: Vtree.NodeContext,\n      leadingEdge: boolean,\n      forcedBreakValue?: string | null,\n    ): Task.Result<Vtree.NodeContext>;\n    clearOverflownViewNodes(\n      nodeContext: Vtree.NodeContext,\n      removeSelf: boolean,\n    ): void;\n    initGeom(): void;\n    init(): void;\n    /**\n     * Save the potential breaking position at the edge. Should, in general, save\n     * \"after\" position but only after skipping all of the \"before\" ones and\n     * getting to the non-empty content (to get breakAtEdge right).\n     */\n    saveEdgeBreakPosition(\n      position: Vtree.NodeContext,\n      breakAtEdge: string | null,\n      overflows: boolean,\n    ): void;\n    /**\n     * @param checkPoints array of breaking points for breakable block\n     */\n    saveBoxBreakPosition(checkPoints: Vtree.NodeContext[]): void;\n    updateMaxReachedAfterEdge(afterEdge: number): void;\n    /**\n     * @param chunkPosition starting position.\n     * @return holding end position.\n     */\n    layout(\n      chunkPosition: Vtree.ChunkPosition,\n      leadingEdge: boolean,\n      breakAfter?: string | null,\n    ): Task.Result<Vtree.ChunkPosition>;\n    isFullWithPageFloats(): boolean;\n    getMaxBlockSizeOfPageFloats(): number;\n    doFinishBreakOfFragmentLayoutConstraints(nodeContext): void;\n    /**\n     * @param nodeContext starting position.\n     * @return holding end position.\n     */\n    doLayout(\n      nodeContext: Vtree.NodeContext,\n      leadingEdge: boolean,\n      breakAfter?: string | null,\n    ): Task.Result<{\n      nodeContext: Vtree.NodeContext;\n      overflownNodeContext: Vtree.NodeContext;\n    }>;\n    /**\n     * Re-layout already laid-out chunks. Return the position of the last flow if\n     * there is an overflow.\n     * TODO: deal with chunks that did not fit at all.\n     * @return holding end position.\n     */\n    redoLayout(): Task.Result<Vtree.ChunkPosition>;\n    saveDistanceToBlockEndFloats(): void;\n    collectElementsOffset(): RepetitiveElement.ElementsOffset[];\n  }\n\n  export type SinglePageFloatLayoutResult = {\n    floatArea: PageFloatArea | null;\n    pageFloatFragment: PageFloats.PageFloatFragment | null;\n    newPosition: Vtree.ChunkPosition | null;\n  };\n\n  /**\n   * breaking point resolver for Text Node.\n   */\n  export interface TextNodeBreaker {\n    breakTextNode(\n      textNode: Text,\n      nodeContext: Vtree.NodeContext,\n      low: number,\n      checkPoints: Vtree.NodeContext[],\n      checkpointIndex: number,\n      force: boolean,\n    ): Vtree.NodeContext;\n    breakAfterSoftHyphen(\n      textNode: Text,\n      text: string,\n      viewIndex: number,\n      nodeContext: Vtree.NodeContext,\n    ): number;\n    breakAfterOtherCharacter(\n      textNode: Text,\n      text: string,\n      viewIndex: number,\n      nodeContext: Vtree.NodeContext,\n    ): number;\n    updateNodeContext(\n      nodeContext: Vtree.NodeContext,\n      viewIndex: number,\n      textNode: Text,\n    ): Vtree.NodeContext;\n  }\n\n  export interface LayoutMode {\n    doLayout(\n      nodeContext: Vtree.NodeContext,\n      column: Layout.Column,\n    ): Task.Result<Vtree.NodeContext>;\n    accept(nodeContext: Vtree.NodeContext, column: Layout.Column): boolean;\n    postLayout(\n      positionAfter: Vtree.NodeContext,\n      initialPosition: Vtree.NodeContext,\n      column: Layout.Column,\n      accepted: boolean,\n    ): boolean;\n  }\n\n  export interface PageFloatArea extends Column {\n    adjustContentRelativeSize: boolean;\n    readonly floatSide: string;\n    readonly parentContainer: Vtree.Container;\n\n    convertPercentageSizesToPx(target: Element): void;\n    fixFloatSizeAndPosition(nodeContext: Vtree.NodeContext): void;\n    getContentInlineSize(): number;\n  }\n}\n\nexport namespace LayoutProcessor {\n  export interface BlockFormattingContext extends Vtree.FormattingContext {}\n\n  export function isInstanceOfBlockFormattingContext(\n    object: Vtree.FormattingContext,\n  ): object is BlockFormattingContext {\n    return object && object.formattingContextType === \"Block\";\n  }\n}\n\nexport namespace Net {\n  export type FetchResponse = {\n    status: number;\n    statusText: string | null;\n    url: string;\n    contentType: string | null;\n    responseText: string | null;\n    responseXML: Document;\n    responseBlob: Blob;\n  };\n\n  export interface ResourceStore<Resource> {\n    resources: { [key: string]: Resource };\n    fetchers: { [key: string]: TaskUtil.Fetcher<Resource> };\n    readonly parser: (\n      p1: FetchResponse,\n      p2: ResourceStore<Resource>,\n    ) => Task.Result<Resource>;\n    readonly type: XMLHttpRequestResponseType;\n\n    /**\n     * @return resource for the given URL\n     */\n    load(\n      url: string,\n      opt_required?: boolean,\n      opt_message?: string,\n    ): Task.Result<Resource>;\n    /**\n     * @return fetcher for the resource for the given URL\n     */\n    fetch(\n      url: string,\n      opt_required?: boolean,\n      opt_message?: string,\n    ): TaskUtil.Fetcher<Resource>;\n    get(url: string): XmlDoc.XMLDocHolder;\n    delete(url: string): void;\n  }\n}\n\nexport namespace PageFloats {\n  /**\n   * @enum {string}\n   */\n  export enum FloatReference {\n    INLINE = \"inline\",\n    COLUMN = \"column\",\n    REGION = \"region\",\n    PAGE = \"page\",\n  }\n\n  export type PageFloatID = string;\n\n  export interface PageFloat {\n    order: number | null;\n    id: PageFloatID | null;\n    readonly nodePosition: Vtree.NodePosition;\n    readonly floatReference: FloatReference;\n    readonly floatSide: string;\n    readonly clearSide: string | null;\n    readonly flowName: string;\n    readonly floatMinWrapBlock: Css.Numeric | null;\n\n    getOrder(): number;\n    getId(): PageFloatID;\n    isAllowedOnContext(pageFloatLayoutContext: PageFloatLayoutContext): boolean;\n    isAllowedToPrecede(other: PageFloat): boolean;\n  }\n\n  export interface PageFloatFragment {\n    readonly floatReference: FloatReference;\n    readonly floatSide: string;\n    readonly clearSide: string | null;\n    readonly continuations: PageFloatContinuation[];\n    readonly area: Vtree.Container;\n    readonly continues: boolean;\n\n    hasFloat(float: PageFloat): boolean;\n    findNotAllowedFloat(context: PageFloatLayoutContext): PageFloat | null;\n    getOuterShape(): GeometryUtil.Shape;\n    getOuterRect(): GeometryUtil.Rect;\n    getOrder(): number;\n    shouldBeStashedBefore(float: PageFloat): boolean;\n    addContinuations(continuations: PageFloatContinuation[]): void;\n    getFlowName(): string;\n  }\n\n  export interface PageFloatContinuation {\n    readonly float: PageFloat;\n    readonly nodePosition: Vtree.NodePosition;\n\n    equals(other: PageFloatContinuation | null): boolean;\n  }\n\n  export type PageFloatPlacementCondition = {\n    [key: string]: boolean;\n  };\n\n  export interface PageFloatLayoutContext {\n    writingMode: Css.Val;\n    direction: Css.Val;\n    floatFragments: PageFloatFragment[];\n    readonly parent: PageFloatLayoutContext;\n    readonly flowName: string | null;\n    readonly generatingNodePosition: Vtree.NodePosition | null;\n\n    getContainer(floatReference?: FloatReference): Vtree.Container;\n    setContainer(container: Vtree.Container);\n    addPageFloat(float: PageFloat): void;\n    getPageFloatLayoutContext(\n      floatReference: FloatReference,\n    ): PageFloatLayoutContext;\n    findPageFloatByNodePosition(\n      nodePosition: Vtree.NodePosition,\n    ): PageFloat | null;\n    isForbidden(float: PageFloat): boolean;\n    addPageFloatFragment(\n      floatFragment: PageFloatFragment,\n      dontInvalidate?: boolean,\n    ): void;\n    removePageFloatFragment(\n      floatFragment: PageFloatFragment,\n      dontInvalidate?: boolean,\n    ): void;\n    findPageFloatFragment(float: PageFloat): PageFloatFragment | null;\n    hasFloatFragments(condition?: (p1: PageFloatFragment) => boolean): boolean;\n    hasContinuingFloatFragmentsInFlow(flowName: string): boolean;\n    registerPageFloatAnchor(float: PageFloat, anchorViewNode: Node): void;\n    collectPageFloatAnchors(): any;\n    isAnchorAlreadyAppeared(floatId: PageFloatID): boolean;\n    deferPageFloat(continuation: PageFloatContinuation): void;\n    hasPrecedingFloatsDeferredToNext(\n      float: PageFloat,\n      ignoreReference?: boolean,\n    ): boolean;\n    getLastFollowingFloatInFragments(float: PageFloat): PageFloat | null;\n    getDeferredPageFloatContinuations(\n      flowName?: string | null,\n    ): PageFloatContinuation[];\n    getPageFloatContinuationsDeferredToNext(\n      flowName?: string | null,\n    ): PageFloatContinuation[];\n    getFloatsDeferredToNextInChildContexts(): PageFloat[];\n    checkAndForbidNotAllowedFloat(): boolean;\n    checkAndForbidFloatFollowingDeferredFloat(): boolean;\n    finish(): void;\n    hasSameContainerAs(other: PageFloatLayoutContext): boolean;\n    invalidate(): void;\n    detachChildren(): PageFloatLayoutContext[];\n    attachChildren(children: PageFloatLayoutContext[]): void;\n    isInvalidated(): boolean;\n    validate(): void;\n    removeEndFloatFragments(floatSide: string): void;\n    stashEndFloatFragments(float: PageFloat): void;\n    restoreStashedFragments(floatReference: FloatReference): void;\n    discardStashedFragments(floatReference: FloatReference): void;\n    getStashedFloatFragments(\n      floatReference: FloatReference,\n    ): PageFloatFragment[];\n    /**\n     * @param anchorEdge Null indicates that the anchor is not in the current\n     *     container.\n     * @return Logical float side (snap-block is resolved when init=false). Null\n     *     indicates that the float area does not fit inside the container\n     */\n    setFloatAreaDimensions(\n      area: Layout.PageFloatArea,\n      floatReference: FloatReference,\n      floatSide: string,\n      anchorEdge: number | null,\n      init: boolean,\n      force: boolean,\n      condition: PageFloatPlacementCondition,\n    ): string | null;\n    getFloatFragmentExclusions(): GeometryUtil.Shape[];\n    getMaxReachedAfterEdge(): number;\n    getBlockStartEdgeOfBlockEndFloats(): number;\n    getPageFloatClearEdge(clear: string, column: Layout.Column): number;\n    getPageFloatPlacementCondition(\n      float: PageFloat,\n      floatSide: string,\n      clearSide: string | null,\n    ): PageFloatPlacementCondition;\n    getLayoutConstraints(): Layout.LayoutConstraint[];\n    addLayoutConstraint(\n      layoutConstraint: Layout.LayoutConstraint,\n      floatReference: FloatReference,\n    ): void;\n    getMaxBlockSizeOfPageFloats(): number;\n    lock(): void;\n    unlock(): void;\n    isLocked(): boolean;\n  }\n\n  export interface PageFloatLayoutStrategy {\n    appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean;\n    appliesToFloat(float: PageFloat): boolean;\n    createPageFloat(\n      nodeContext: Vtree.NodeContext,\n      pageFloatLayoutContext: PageFloatLayoutContext,\n      column: Layout.Column,\n    ): Task.Result<PageFloat>;\n    createPageFloatFragment(\n      continuations: PageFloatContinuation[],\n      floatSide: string,\n      clearSide: string | null,\n      floatArea: Layout.PageFloatArea,\n      continues: boolean,\n    ): PageFloatFragment;\n    findPageFloatFragment(\n      float: PageFloat,\n      pageFloatLayoutContext: PageFloatLayoutContext,\n    ): PageFloatFragment | null;\n    adjustPageFloatArea(\n      floatArea: Layout.PageFloatArea,\n      floatContainer: Vtree.Container,\n      column: Layout.Column,\n    );\n    forbid(float: PageFloat, pageFloatLayoutContext: PageFloatLayoutContext);\n  }\n}\n\nexport namespace Selectors {\n  export interface AfterIfContinues {\n    readonly sourceNode: Element;\n    readonly styler: PseudoElement.PseudoelementStyler;\n\n    createElement(\n      column: Layout.Column,\n      parentNodeContext: Vtree.NodeContext,\n    ): Task.Result<Element>;\n  }\n\n  export interface AfterIfContinuesLayoutConstraint\n    extends Layout.FragmentLayoutConstraint {\n    nodeContext: Vtree.NodeContext;\n    afterIfContinues: AfterIfContinues;\n    pseudoElementHeight: number;\n\n    getRepetitiveElements(): AfterIfContinuesElementsOffset;\n  }\n\n  export function isInstanceOfAfterIfContinuesLayoutConstraint(\n    object: Layout.FragmentLayoutConstraint,\n  ): object is AfterIfContinuesLayoutConstraint {\n    return object && object.flagmentLayoutConstraintType == \"AfterIfContinue\";\n  }\n\n  export interface AfterIfContinuesElementsOffset\n    extends RepetitiveElement.ElementsOffset {\n    nodeContext: Vtree.NodeContext;\n    pseudoElementHeight: number;\n\n    affectTo(nodeContext: Vtree.NodeContext): boolean;\n  }\n}\n\nexport namespace PseudoElement {\n  export interface PseudoelementStyler extends CssStyler.AbstractStyler {\n    contentProcessed: { [key: string]: boolean };\n    readonly element: Element;\n    style: CssCascade.ElementStyle;\n    styler: CssStyler.AbstractStyler;\n    readonly context: Exprs.Context;\n    readonly exprContentListener: Vtree.ExprContentListener;\n  }\n}\n\nexport namespace RepetitiveElement {\n  export interface RepetitiveElementsOwnerFormattingContext\n    extends Vtree.FormattingContext {\n    isRoot: boolean;\n    repetitiveElements: RepetitiveElements;\n    readonly parent: Vtree.FormattingContext;\n    readonly rootSourceNode: Element;\n    getRepetitiveElements(): RepetitiveElements;\n    getRootViewNode(position: Vtree.NodeContext): Element | null;\n    getRootNodeContext(\n      nodeContext: Vtree.NodeContext,\n    ): Vtree.NodeContext | null;\n    initializeRepetitiveElements(vertical: boolean): void;\n  }\n\n  export function isInstanceOfRepetitiveElementsOwnerFormattingContext(\n    object: Vtree.FormattingContext,\n  ): object is RepetitiveElementsOwnerFormattingContext {\n    if (!object) {\n      return false;\n    }\n    const type = object.formattingContextType;\n    return (\n      type === \"RepetitiveElementsOwner\" ||\n      Table.isInstanceOfTableFormattingContext(object)\n    ); // subset\n  }\n\n  export interface ElementsOffset {\n    calculateOffset(nodeContext: Vtree.NodeContext): number;\n    calculateMinimumOffset(nodeContext: Vtree.NodeContext): number;\n  }\n\n  export interface RepetitiveElements extends ElementsOffset {\n    isSkipHeader: boolean;\n    isSkipFooter: boolean;\n    enableSkippingFooter: boolean;\n    enableSkippingHeader: boolean;\n    doneInitialLayout: boolean;\n    firstContentSourceNode: Element | null;\n    lastContentSourceNode: Element | null;\n    allowInsert: boolean;\n    allowInsertRepeatitiveElements: boolean;\n    ownerSourceNode: Element;\n\n    setHeaderNodeContext(nodeContext: Vtree.NodeContext): void;\n    setFooterNodeContext(nodeContext: Vtree.NodeContext): void;\n    updateHeight(column: Layout.Column): void;\n    prepareLayoutFragment(): void;\n    appendHeaderToFragment(\n      rootNodeContext: Vtree.NodeContext,\n      firstChild: Node | null,\n      column: Layout.Column,\n    ): Task.Result<boolean>;\n    appendFooterToFragment(\n      rootNodeContext: Vtree.NodeContext,\n      firstChild: Node | null,\n      column: Layout.Column,\n    ): Task.Result<boolean>;\n    appendElementToFragment(\n      nodePosition: Vtree.NodePosition,\n      rootNodeContext: Vtree.NodeContext,\n      firstChild: Node | null,\n      column: Layout.Column,\n    ): Task.Result<boolean>;\n    moveChildren(from: Element, to: Element, firstChild: Node | null): void;\n    isAfterLastContent(nodeContext: Vtree.NodeContext): boolean;\n    isFirstContentNode(nodeContext: Vtree.NodeContext): boolean;\n    isEnableToUpdateState(): boolean;\n    updateState(): void;\n    preventSkippingHeader(): void;\n    preventSkippingFooter(): void;\n    isHeaderRegistered(): boolean;\n    isFooterRegistered(): boolean;\n    isHeaderSourceNode(node: Node): boolean;\n    isFooterSourceNode(node: Node): boolean;\n  }\n\n  export interface RepetitiveElementsOwnerLayoutConstraint\n    extends Layout.FragmentLayoutConstraint {\n    getRepetitiveElements(): RepetitiveElements;\n  }\n\n  export function isInstanceOfRepetitiveElementsOwnerLayoutConstraint(\n    object: Layout.FragmentLayoutConstraint,\n  ): object is RepetitiveElementsOwnerLayoutConstraint {\n    if (!object) {\n      return false;\n    }\n    const type = object.flagmentLayoutConstraintType;\n    return (\n      type === \"RepetitiveElementsOwner\" ||\n      Table.isInstanceOfTableRowLayoutConstraint(object)\n    ); // subset\n  }\n}\n\nexport namespace Table {\n  export interface TableFormattingContext\n    extends RepetitiveElement.RepetitiveElementsOwnerFormattingContext {\n    // FIXME\n  }\n\n  export function isInstanceOfTableFormattingContext(\n    object: Vtree.FormattingContext,\n  ): object is TableFormattingContext {\n    return object && object.formattingContextType === \"Table\";\n  }\n\n  export interface TableRowLayoutConstraint\n    extends RepetitiveElement.RepetitiveElementsOwnerLayoutConstraint {\n    cellFragmentLayoutConstraints: {\n      constraints: Layout.FragmentLayoutConstraint[];\n      breakPosition: Vtree.NodeContext;\n    }[];\n\n    removeDummyRowNodes(nodeContext: Vtree.NodeContext): void;\n    getElementsOffsetsForTableCell(\n      column: Layout.Column,\n    ): RepetitiveElement.ElementsOffset[];\n  }\n\n  export function isInstanceOfTableRowLayoutConstraint(\n    object: Layout.FragmentLayoutConstraint,\n  ): object is TableRowLayoutConstraint {\n    return object && object.flagmentLayoutConstraintType === \"TableRow\";\n  }\n}\n\nexport namespace Vtree {\n  export type ClientRect = {\n    left: number;\n    top: number;\n    right: number;\n    bottom: number;\n    width: number;\n    height: number;\n  };\n\n  /**\n   * Interface to read the position assigned to the elements and ranges by the\n   * browser.\n   */\n  export interface ClientLayout {\n    layoutBox: Element;\n    window: Window;\n    pixelRatio: number;\n    scaleRatio: number;\n    layoutUnitPerPixel: number;\n    getRangeClientRects(range: Range): ClientRect[];\n    getElementClientRect(element: Element): ClientRect;\n    /**\n     * @return element's computed style\n     */\n    getElementComputedStyle(element: Element): CSSStyleDeclaration;\n    /**\n     * Adjust length value with rendering precision.\n     * @param value Length value to adjust\n     * @return Adjusted length value\n     */\n    adjustLengthValue(value: number): number;\n  }\n\n  /**\n   * Styling, creating a single node's view, etc.\n   */\n  export interface LayoutContext {\n    /**\n     * Creates a functionally equivalent, but uninitialized layout context,\n     * suitable for building a separate column.\n     */\n    clone(): LayoutContext;\n    /**\n     * Set the current source node and create a view. Parameter firstTime\n     * is true (and possibly offsetInNode > 0) if node was broken on\n     * the previous page.\n     * @return true if children should be processed as well\n     */\n    setCurrent(\n      nodeContext: NodeContext,\n      firstTime: boolean,\n      atUnforcedBreak?: boolean,\n    ): Task.Result<boolean>;\n    /**\n     * Set the container element that holds view elements produced from the\n     * source.\n     */\n    setViewRoot(viewRoot: Element, isFootnote: boolean);\n    /**\n     * Moves to the next view node, creating it and appending it to the view tree\n     * if needed.\n     * @return that corresponds to the next view node\n     */\n    nextInTree(\n      nodeContext: NodeContext,\n      atUnforcedBreak?: boolean,\n    ): Task.Result<NodeContext>;\n    /**\n     * Apply pseudo-element styles (if any).\n     * @param target element to apply styles to\n     */\n    applyPseudoelementStyle(\n      nodeContext: NodeContext,\n      pseudoName: string,\n      target: Element,\n    ): void;\n    /**\n     * Apply styles to footnote container.\n     * @param target element to apply styles to\n     * @return vertical\n     */\n    applyFootnoteStyle(\n      vertical: boolean,\n      rtl: boolean,\n      target: Element,\n    ): boolean;\n    /**\n     * Peel off innermost first-XXX pseudoelement, create and create view nodes\n     * after the end of that pseudoelement.\n     */\n    peelOff(\n      nodeContext: NodeContext,\n      nodeOffset: number,\n    ): Task.Result<NodeContext>;\n    /**\n     * Process a block-end edge of a fragmented block.\n     */\n    processFragmentedBlockEdge(nodeContext: NodeContext);\n    convertLengthToPx(\n      numeric: Css.Numeric,\n      viewNode: Node,\n      clientLayout: ClientLayout,\n    ): number | Css.Numeric;\n    /**\n     * Returns if two NodePositions represents the same position in the document.\n     */\n    isSameNodePosition(\n      nodePosition1: NodePosition,\n      nodePosition2: NodePosition,\n    ): boolean;\n    addEventListener(\n      type: string,\n      listener: Base.EventListener,\n      capture?: boolean,\n    ): void;\n    removeEventListener(\n      type: string,\n      listener: Base.EventListener,\n      capture?: boolean,\n    ): void;\n    dispatchEvent(evt: Base.Event): void;\n  }\n\n  /**\n   * Formatting context.\n   */\n  export interface FormattingContext {\n    formattingContextType: FormattingContextType;\n    getName(): string;\n    isFirstTime(nodeContext: NodeContext, firstTime: boolean): boolean;\n    getParent(): FormattingContext;\n    saveState(): any;\n    restoreState(state: any);\n  }\n\n  export type NodePositionStep = {\n    node: Node;\n    shadowType: ShadowType;\n    shadowContext: ShadowContext | null;\n    nodeShadow: ShadowContext | null;\n    shadowSibling: NodePositionStep | null;\n    formattingContext: FormattingContext | null;\n    fragmentIndex: number;\n  };\n\n  export type NodePosition = {\n    steps: NodePositionStep[];\n    offsetInNode: number;\n    after: boolean;\n    preprocessedTextContent: Diff.Change[] | null;\n  };\n\n  /**\n   * Handling of purely whitespace sequences between blocks\n   * @enum {number}\n   */\n  export enum Whitespace {\n    /**\n     * Whitespace sequence between blocks is ignored\n     */\n    IGNORE,\n    /**\n     * Whitespace sequence between blocks is ignored unless it containes newline\n     */\n    NEWLINE,\n    /**\n     * Whitespace sequence between blocks is preserved\n     */\n    PRESERVE,\n  }\n\n  export interface Container {\n    left: number;\n    top: number;\n    marginLeft: number;\n    marginRight: number;\n    marginTop: number;\n    marginBottom: number;\n    borderLeft: number;\n    borderRight: number;\n    borderTop: number;\n    borderBottom: number;\n    paddingLeft: number;\n    paddingRight: number;\n    paddingTop: number;\n    paddingBottom: number;\n    width: number;\n    height: number;\n    originX: number;\n    originY: number;\n    exclusions: GeometryUtil.Shape[];\n    innerShape: GeometryUtil.Shape;\n    computedBlockSize: number;\n    snapWidth: number;\n    snapHeight: number;\n    snapOffsetX: number;\n    snapOffsetY: number;\n    vertical: boolean; // vertical writing\n    rtl: boolean;\n    element: HTMLElement;\n    borderBoxSizing: boolean;\n\n    getInsetTop(): number;\n    getInsetBottom(): number;\n    getInsetLeft(): number;\n    getInsetRight(): number;\n    getInsetBefore(): number;\n    getInsetAfter(): number;\n    getInsetStart(): number;\n    getInsetEnd(): number;\n    getBeforeEdge(box: ClientRect): number;\n    getAfterEdge(box: ClientRect): number;\n    getStartEdge(box: ClientRect): number;\n    getEndEdge(box: ClientRect): number;\n    getInlineSize(box: ClientRect): number;\n    getBoxSize(box: ClientRect): number;\n    getBoxDir(): number;\n    getInlineDir(): number;\n    copyFrom(other: Container): void;\n    setVerticalPosition(top: number, height: number): void;\n    setHorizontalPosition(left: number, width: number): void;\n    setBlockPosition(start: number, extent: number): void;\n    setInlinePosition(start: number, extent: number): void;\n    clear(): void;\n    getInnerShape(): GeometryUtil.Shape;\n    getInnerRect(): GeometryUtil.Rect;\n    getPaddingRect(): GeometryUtil.Rect;\n    getOuterShape(\n      outerShapeProp: Css.Val,\n      context: Exprs.Context,\n    ): GeometryUtil.Shape;\n    getOuterRect(): GeometryUtil.Rect;\n  }\n\n  /**\n   * @enum {number}\n   */\n  export enum ShadowType {\n    NONE,\n    CONTENT,\n    ROOTLESS,\n    ROOTED,\n  }\n\n  /**\n   * Data about shadow tree instance.\n   */\n  export interface ShadowContext {\n    readonly owner: Element;\n    readonly root: Element;\n    readonly xmldoc: XmlDoc.XMLDocHolder;\n    readonly parentShadow: ShadowContext;\n    subShadow: ShadowContext;\n    readonly type: Vtree.ShadowType;\n    readonly styler: CssStyler.AbstractStyler;\n\n    equals(other: ShadowContext): boolean;\n  }\n\n  /**\n   * Information about :first-letter or :first-line pseudoelements\n   * @param count 0 - first-letter, 1 or more - first line(s)\n   */\n  export interface FirstPseudo {\n    readonly outer: FirstPseudo;\n    readonly count: number;\n  }\n\n  /**\n   * NodeContext represents a position in the document + layout-related\n   * information attached to it. When after=false and offsetInNode=0, the\n   * position is inside the element (node), but just before its first child.\n   * When offsetInNode>0 it represents offset in the textual content of the\n   * node. When after=true it represents position right after the last child\n   * of the node. boxOffset is incremented by 1 for any valid node position.\n   */\n  export interface NodeContext {\n    // position itself\n    offsetInNode: number;\n    after: boolean;\n    shadowType: ShadowType; // parent's shadow type\n    shadowContext: Vtree.ShadowContext;\n    nodeShadow: Vtree.ShadowContext;\n    shadowSibling: NodeContext; // next \"sibling\" in the shadow tree\n    // other stuff\n    shared: boolean;\n    inline: boolean;\n    overflow: boolean;\n    breakPenalty: number;\n    display: string | null;\n    floatReference: PageFloats.FloatReference;\n    floatSide: string | null;\n    clearSide: string | null;\n    floatMinWrapBlock: Css.Numeric | null;\n    columnSpan: Css.Val | null;\n    verticalAlign: string;\n    captionSide: string;\n    inlineBorderSpacing: number;\n    blockBorderSpacing: number;\n    flexContainer: boolean;\n    whitespace: Whitespace;\n    hyphenateCharacter: string | null;\n    breakWord: boolean;\n    establishesBFC: boolean;\n    containingBlockForAbsolute: boolean;\n    breakBefore: string | null;\n    breakAfter: string | null;\n    viewNode: Node;\n    clearSpacer: Node;\n    inheritedProps: { [key: string]: number | string | Css.Val };\n    vertical: boolean;\n    direction: string;\n    firstPseudo: FirstPseudo;\n    lang: string | null;\n    preprocessedTextContent: Diff.Change[] | null;\n    formattingContext: FormattingContext;\n    repeatOnBreak: string | null;\n    pluginProps: {\n      [key: string]: string | number | undefined | null | (number | null)[];\n    };\n    fragmentIndex: number;\n    afterIfContinues: Selectors.AfterIfContinues;\n    footnotePolicy: Css.Ident | null;\n    pageType: string | null;\n\n    sourceNode: Node;\n    parent: NodeContext;\n    boxOffset: number;\n\n    resetView(): void;\n    modify(): NodeContext;\n    copy(): NodeContext;\n    clone(): NodeContext;\n    toNodePositionStep(): NodePositionStep;\n    toNodePosition(): NodePosition;\n    isInsideBFC(): boolean;\n    getContainingBlockForAbsolute(): NodeContext;\n    belongsTo(formattingContext: FormattingContext): boolean;\n  }\n\n  export interface ChunkPosition {\n    floats: NodePosition[];\n    primary: NodePosition;\n\n    clone(): ChunkPosition;\n    isSamePosition(other: ChunkPosition): boolean;\n  }\n\n  export type ExprContentListener = (\n    p1: Exprs.Val,\n    p2: string,\n    p3: Document,\n  ) => Node | null;\n}\n\nexport namespace XmlDoc {\n  export interface XMLDocHolder {\n    lang: string | null;\n    totalOffset: number;\n    root: Element;\n    body: Element;\n    head: Element;\n    last: Element;\n    lastOffset: number;\n    idMap: { [key: string]: Element };\n    readonly store: XMLDocStore;\n    readonly url: string;\n    readonly document: Document;\n\n    doc(): NodeList;\n    getElementOffset(element: Element): number;\n    getNodeOffset(srcNode: Node, offsetInNode: number, after: boolean): number;\n    getTotalOffset(): number;\n    /**\n     * @return last node such that its offset is less or equal to the given\n     */\n    getNodeByOffset(offset: number): Node;\n    /**\n     * Get element by URL in the source document(s). URL must be in either '#id'\n     * or 'url#id' form.\n     */\n    getElement(url: string): Element | null;\n  }\n\n  export interface Predicate {\n    readonly fn: (p1: Node) => boolean;\n\n    check(node: Node): boolean;\n    withAttribute(name: string, value: string): Predicate;\n    withChild(name: string, opt_childPredicate?: Predicate): Predicate;\n  }\n\n  export interface NodeList {\n    readonly nodes: Node[];\n\n    asArray(): Node[];\n    size(): number;\n    /**\n     * Filter with predicate\n     */\n    predicate(pr: Predicate): NodeList;\n    forEachNode(fn: (p1: Node, p2: (p1: Node) => void) => void): NodeList;\n    forEach<T>(fn: (p1: Node) => T): T[];\n    forEachNonNull<T>(fn: (p1: Node) => T): T[];\n    child(tag: string): NodeList;\n    childElements(): NodeList;\n    attribute(name: string): (string | null)[];\n    textContent(): (string | null)[];\n  }\n\n  export type XMLDocStore = Net.ResourceStore<XMLDocHolder>;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Vtree - Basic view tree data structures and support utilities.\n */\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as Constants from \"./constants\";\nimport * as Css from \"./css\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Diff from \"./diff\";\nimport * as Exprs from \"./exprs\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as TaskUtil from \"./task-util\";\nimport { assert } from \"./asserts\";\nimport {\n  CssStyler,\n  PageFloats,\n  PseudoElement,\n  Selectors,\n  Vtree,\n  XmlDoc,\n} from \"./types\";\n\nexport const delayedProps = {\n  transform: true,\n  \"transform-origin\": true,\n};\n\nexport const delayedPropsIfRelativePositioned = {\n  top: true,\n  bottom: true,\n  left: true,\n  right: true,\n};\n\nexport class DelayedItem {\n  constructor(\n    public target: Element,\n    public name: string,\n    public value: Css.Val,\n  ) {}\n}\n\nexport type PageHyperlinkEvent = {\n  type: string;\n  target;\n  currentTarget;\n  anchorElement: Element;\n  href: string;\n};\n\nexport type Trigger = {\n  observer: string;\n  event: string;\n  action: string;\n  ref: string;\n};\n\nexport const actions = {\n  show: function (obj) {\n    obj.style.visibility = \"visible\";\n  },\n  hide: function (obj) {\n    obj.style.visibility = \"hidden\";\n  },\n  play: function (obj) {\n    obj.currentTime = 0;\n    obj.play();\n  },\n  pause: function (obj) {\n    obj.pause();\n  },\n  resume: function (obj) {\n    obj.play();\n  },\n  mute: function (obj) {\n    obj.muted = true;\n  },\n  unmute: function (obj) {\n    obj.muted = false;\n  },\n};\n\nexport function makeListener(\n  refs: Element[],\n  action: string,\n): EventListener | null {\n  const actionFn = actions[action];\n  if (actionFn) {\n    return () => {\n      for (let k = 0; k < refs.length; k++) {\n        try {\n          actionFn(refs[k]);\n        } catch (err) {}\n      }\n    };\n  }\n  return null;\n}\n\nexport class Page extends Base.SimpleEventTarget {\n  private static AUTO_PAGE_WIDTH_ATTRIBUTE: string =\n    \"data-vivliostyle-auto-page-width\";\n  private static AUTO_PAGE_HEIGHT_ATTRIBUTE: string =\n    \"data-vivliostyle-auto-page-height\";\n  pageAreaElement: HTMLElement | null = null;\n  delayedItems: DelayedItem[] = [];\n  hrefHandler: (e: Event) => void;\n  elementsById: { [key: string]: Element[] } = {};\n  dimensions: { width: number; height: number } = { width: 0, height: 0 };\n  isFirstPage: boolean = false;\n  isLastPage: boolean = false;\n  isBlankPage: boolean = false;\n  isAutoPageWidth: boolean = true;\n  isAutoPageHeight: boolean = true;\n  spineIndex: number = 0;\n  position: LayoutPosition = null;\n  offset: number = -1;\n  side: Constants.PageSide | null = null;\n  fetchers: TaskUtil.Fetcher<{}>[] = [];\n  marginBoxes: {\n    top: { [key: string]: Container };\n    bottom: { [key: string]: Container };\n    left: { [key: string]: Container };\n    right: { [key: string]: Container };\n  } = { top: {}, bottom: {}, left: {}, right: {} };\n  pageType: string | null = null;\n\n  constructor(\n    public readonly container: HTMLElement,\n    public readonly bleedBox: HTMLElement,\n  ) {\n    super();\n    this.hrefHandler = (e: Event) => {\n      const anchorElement = e.currentTarget as Element;\n      const href =\n        anchorElement.getAttribute(\"href\") ||\n        anchorElement.getAttributeNS(Base.NS.XLINK, \"href\");\n      if (href) {\n        const evt = {\n          type: \"hyperlink\",\n          target: null,\n          currentTarget: null,\n          anchorElement,\n          href,\n          preventDefault() {\n            e.preventDefault();\n          },\n        };\n        this.dispatchEvent(evt);\n      }\n    };\n  }\n\n  setAutoPageWidth(isAuto: boolean) {\n    this.isAutoPageWidth = isAuto;\n    if (isAuto) {\n      this.container.setAttribute(Page.AUTO_PAGE_WIDTH_ATTRIBUTE, \"true\");\n    } else {\n      this.container.removeAttribute(Page.AUTO_PAGE_WIDTH_ATTRIBUTE);\n    }\n  }\n\n  setAutoPageHeight(isAuto: boolean) {\n    this.isAutoPageHeight = isAuto;\n    if (isAuto) {\n      this.container.setAttribute(Page.AUTO_PAGE_HEIGHT_ATTRIBUTE, \"true\");\n    } else {\n      this.container.removeAttribute(Page.AUTO_PAGE_HEIGHT_ATTRIBUTE);\n    }\n  }\n\n  registerElementWithId(element: Element, id: string) {\n    const arr = this.elementsById[id];\n    if (!arr) {\n      this.elementsById[id] = [element];\n    } else {\n      arr.push(element);\n    }\n  }\n\n  finish(triggers: Trigger[], clientLayout: ClientLayout): void {\n    // Remove ID of elements which eventually did not fit in the page\n    // (Some nodes may have been removed after registration if they did not fit\n    // in the page)\n    Object.keys(this.elementsById).forEach((id) => {\n      const elems = this.elementsById[id];\n      for (let i = 0; i < elems.length; ) {\n        if (this.container.contains(elems[i])) {\n          i++;\n        } else {\n          elems.splice(i, 1);\n        }\n      }\n      if (elems.length === 0) {\n        delete this.elementsById[id];\n      }\n    });\n    const list = this.delayedItems;\n    for (let i = 0; i < list.length; i++) {\n      const item = list[i];\n      if (\n        item.target === this.container &&\n        item.name === \"transform\" &&\n        !this.isAutoPageWidth &&\n        !this.isAutoPageHeight\n      ) {\n        // When fixed page size is specified, cancel the transform property\n        // set at OPFView.makePage() for the specified viewport size\n        // (e.g. `<meta name=\"viewport\" content=\"width=1307, height=1920\"/>`)\n        // to avoid wrong page resizing.\n        continue;\n      }\n      Base.setCSSProperty(item.target, item.name, item.value.toString());\n    }\n\n    // use size of the container of the PageMasterInstance\n    const rect = clientLayout.getElementClientRect(this.container);\n    this.dimensions.width = rect.width;\n    this.dimensions.height = rect.height;\n    for (let i = 0; i < triggers.length; i++) {\n      const trigger = triggers[i];\n      const refs = this.elementsById[trigger.ref];\n      const observers = this.elementsById[trigger.observer];\n      if (refs && observers) {\n        const listener = makeListener(refs, trigger.action);\n        if (listener) {\n          for (let k = 0; k < observers.length; k++) {\n            observers[k].addEventListener(trigger.event, listener, false);\n          }\n        }\n      }\n    }\n  }\n}\n\nexport type Spread = {\n  left: Page;\n  right: Page;\n};\n\nexport const Whitespace = Vtree.Whitespace;\nexport type Whitespace = Vtree.Whitespace; // eslint-disable-line no-redeclare\n\n/**\n * Resolves Whitespace value from a value of 'white-space' property\n * @param whitespace The value of 'white-space' property\n */\nexport function whitespaceFromPropertyValue(\n  whitespace: string,\n): Whitespace | null {\n  switch (whitespace) {\n    case \"normal\":\n    case \"nowrap\":\n      return Whitespace.IGNORE;\n    case \"pre-line\":\n      return Whitespace.NEWLINE;\n    case \"pre\":\n    case \"pre-wrap\":\n    case \"break-spaces\":\n      return Whitespace.PRESERVE;\n    default:\n      return null;\n  }\n}\n\nexport function canIgnore(node: Node, whitespace?: Whitespace): boolean {\n  if (!node) {\n    return true;\n  }\n  if (node.nodeType == 1) {\n    return false;\n  }\n  const text = node.textContent;\n  switch (whitespace) {\n    case Whitespace.PRESERVE:\n      return text.length == 0;\n    case Whitespace.NEWLINE:\n      return !!text.match(/^[ \\t]*$/);\n    case Whitespace.IGNORE:\n    default:\n      return !!text.match(/^[ \\t\\r\\n\\f]*$/);\n  }\n}\n\nexport class Flow {\n  forcedBreakOffsets = [] as number[];\n  formattingContext: FormattingContext | null = null;\n\n  constructor(\n    public readonly flowName: string,\n    public readonly parentFlowName: string | null,\n  ) {}\n}\n\nexport class FlowChunk {\n  startPage: number = -1;\n\n  constructor(\n    public flowName: string,\n    public element: Element,\n    public startOffset: number,\n    public priority: number,\n    public linger: number,\n    public exclusive: boolean,\n    public repeated: boolean,\n    public last: boolean,\n    public breakBefore: string | null,\n  ) {}\n\n  isBetter(other: FlowChunk): boolean {\n    if (!this.exclusive) {\n      return false;\n    }\n    if (!other.exclusive) {\n      return true;\n    }\n    if (this.priority > other.priority) {\n      return true;\n    }\n    return this.last;\n  }\n}\n\nexport type ClientRect = Vtree.ClientRect;\n\nexport function clientrectIncreasingTop(\n  r1: ClientRect,\n  r2: ClientRect,\n): number {\n  return r1.top - r2.top;\n}\n\nexport function clientrectDecreasingRight(\n  r1: ClientRect,\n  r2: ClientRect,\n): number {\n  return r2.right - r1.right;\n}\n\n/**\n * Interface to read the position assigned to the elements and ranges by the\n * browser.\n */\nexport type ClientLayout = Vtree.ClientLayout;\n\n/**\n * Styling, creating a single node's view, etc.\n */\nexport type LayoutContext = Vtree.LayoutContext;\n\n/**\n * Formatting context.\n */\nexport type FormattingContext = Vtree.FormattingContext;\n\nexport function eachAncestorFormattingContext(\n  nodeContext: NodeContext,\n  callback: (p1: FormattingContext) => any,\n): void {\n  if (!nodeContext) {\n    return;\n  }\n  for (let fc = nodeContext.formattingContext; fc; fc = fc.getParent()) {\n    callback(fc);\n  }\n}\n\nexport type NodePositionStep = Vtree.NodePositionStep;\n\nexport function isSameNodePositionStep(\n  nps1: NodePositionStep,\n  nps2: NodePositionStep,\n): boolean {\n  if (nps1 === nps2) {\n    return true;\n  }\n  if (!nps1 || !nps2) {\n    return false;\n  }\n  return (\n    (nps1.node === nps2.node ||\n      // Fix for issue #869\n      (!!nps1.shadowContext &&\n        !!nps2.shadowContext &&\n        nps1.shadowType === Vtree.ShadowType.ROOTLESS &&\n        nps2.shadowType === Vtree.ShadowType.ROOTLESS &&\n        (nps1.node as Element)?.outerHTML ===\n          (nps2.node as Element)?.outerHTML)) &&\n    nps1.shadowType === nps2.shadowType &&\n    isSameShadowContext(nps1.shadowContext, nps2.shadowContext) &&\n    isSameShadowContext(nps1.nodeShadow, nps2.nodeShadow) &&\n    isSameNodePositionStep(nps1.shadowSibling, nps2.shadowSibling)\n  );\n}\n\nexport type NodePosition = Vtree.NodePosition;\n\nexport function isSameNodePosition(\n  np1: NodePosition | null,\n  np2: NodePosition | null,\n): boolean {\n  if (np1 === np2) {\n    return true;\n  }\n  if (!np1 || !np2) {\n    return false;\n  }\n  if (\n    np1.offsetInNode !== np2.offsetInNode ||\n    np1.after !== np2.after ||\n    np1.steps.length !== np2.steps.length\n  ) {\n    return false;\n  }\n  for (let i = 0; i < np1.steps.length; i++) {\n    if (!isSameNodePositionStep(np1.steps[i], np2.steps[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function newNodePositionFromNode(node: Node): NodePosition {\n  const step: NodePositionStep = {\n    node,\n    shadowType: ShadowType.NONE,\n    shadowContext: null,\n    nodeShadow: null,\n    shadowSibling: null,\n    formattingContext: null,\n    fragmentIndex: 0,\n  };\n  return {\n    steps: [step],\n    offsetInNode: 0,\n    after: false,\n    preprocessedTextContent: null,\n  };\n}\n\nexport function newNodePositionFromNodeContext(\n  nodeContext: Vtree.NodeContext,\n  initialFragmentIndex: number | null,\n): NodePosition {\n  const step: NodePositionStep = {\n    node: nodeContext.sourceNode,\n    shadowType: ShadowType.NONE,\n    shadowContext: nodeContext.shadowContext,\n    nodeShadow: null,\n    shadowSibling: null,\n    formattingContext: null,\n    fragmentIndex:\n      initialFragmentIndex != null\n        ? initialFragmentIndex\n        : nodeContext.fragmentIndex,\n  };\n  return {\n    steps: [step],\n    offsetInNode: 0,\n    after: false,\n    preprocessedTextContent: nodeContext.preprocessedTextContent,\n  };\n}\n\nexport function makeNodeContextFromNodePositionStep(\n  step: NodePositionStep,\n  parent: Vtree.NodeContext,\n): NodeContext {\n  const nodeContext = new NodeContext(step.node, parent as NodeContext, 0);\n  nodeContext.shadowType = step.shadowType;\n  nodeContext.shadowContext = step.shadowContext;\n  nodeContext.nodeShadow = step.nodeShadow;\n  nodeContext.shadowSibling = step.shadowSibling\n    ? makeNodeContextFromNodePositionStep(step.shadowSibling, parent.copy())\n    : null;\n  nodeContext.formattingContext = step.formattingContext;\n  nodeContext.fragmentIndex = step.fragmentIndex + 1;\n  return nodeContext;\n}\n\nexport const ShadowType = Vtree.ShadowType;\nexport type ShadowType = Vtree.ShadowType; // eslint-disable-line no-redeclare\n\n/**\n * Data about shadow tree instance.\n */\nexport class ShadowContext implements Vtree.ShadowContext {\n  subShadow: ShadowContext = null;\n\n  constructor(\n    public readonly owner: Element,\n    public readonly root: Element,\n    public readonly xmldoc: XmlDoc.XMLDocHolder,\n    public readonly parentShadow: ShadowContext,\n    superShadow: ShadowContext,\n    public readonly type: ShadowType,\n    public readonly styler: CssStyler.AbstractStyler,\n  ) {\n    if (superShadow) {\n      superShadow.subShadow = this;\n    }\n  }\n\n  equals(other: ShadowContext): boolean {\n    if (!other) {\n      return false;\n    }\n    return (\n      this.owner === other.owner &&\n      this.xmldoc === other.xmldoc &&\n      this.type === other.type &&\n      isSameShadowContext(this.parentShadow, other.parentShadow)\n    );\n  }\n}\n\nexport function isSameShadowContext(\n  sc1: Vtree.ShadowContext,\n  sc2: Vtree.ShadowContext,\n): boolean {\n  return sc1 === sc2 || (!!sc1 && !!sc2 && sc1.equals(sc2));\n}\n\n/**\n * Information about :first-letter or :first-line pseudoelements\n * @param count 0 - first-letter, 1 or more - first line(s)\n */\nexport class FirstPseudo implements Vtree.FirstPseudo {\n  constructor(\n    public readonly outer: FirstPseudo,\n    public readonly count: number,\n  ) {}\n}\n\n/**\n * NodeContext represents a position in the document + layout-related\n * information attached to it. When after=false and offsetInNode=0, the\n * position is inside the element (node), but just before its first child.\n * When offsetInNode>0 it represents offset in the textual content of the\n * node. When after=true it represents position right after the last child\n * of the node. boxOffset is incremented by 1 for any valid node position.\n */\nexport class NodeContext implements Vtree.NodeContext {\n  // position itself\n  offsetInNode: number = 0;\n  after: boolean = false;\n  shadowType: ShadowType;\n\n  // parent's shadow type\n  shadowContext: Vtree.ShadowContext;\n  nodeShadow: Vtree.ShadowContext = null;\n  shadowSibling: NodeContext = null;\n\n  // next \"sibling\" in the shadow tree\n  // other stuff\n  shared: boolean = false;\n  inline: boolean = true;\n  overflow: boolean = false;\n  breakPenalty: number;\n  display: string | null = null;\n  floatReference: PageFloats.FloatReference;\n  floatSide: string | null = null;\n  clearSide: string | null = null;\n  floatMinWrapBlock: Css.Numeric | null = null;\n  columnSpan: Css.Val | null = null;\n  verticalAlign: string = \"baseline\";\n  captionSide: string = \"top\";\n  inlineBorderSpacing: number = 0;\n  blockBorderSpacing: number = 0;\n  flexContainer: boolean = false;\n  whitespace: Whitespace;\n  hyphenateCharacter: string | null;\n  breakWord: boolean;\n  establishesBFC: boolean = false;\n  containingBlockForAbsolute: boolean = false;\n  breakBefore: string | null = null;\n  breakAfter: string | null = null;\n  viewNode: Node = null;\n  clearSpacer: Node = null;\n  inheritedProps: { [key: string]: number | string | Css.Val };\n  vertical: boolean;\n  direction: string;\n  firstPseudo: FirstPseudo;\n  lang: string | null = null;\n  preprocessedTextContent: Diff.Change[] | null = null;\n  formattingContext: FormattingContext;\n  repeatOnBreak: string | null = null;\n  pluginProps: {\n    [key: string]: string | number | undefined | null | (number | null)[];\n  } = {};\n  fragmentIndex: number = 1;\n  afterIfContinues: Selectors.AfterIfContinues = null;\n  footnotePolicy: Css.Ident | null = null;\n  pageType: string | null;\n\n  constructor(\n    public sourceNode: Node,\n    public parent: NodeContext,\n    public boxOffset: number,\n  ) {\n    this.shadowType = ShadowType.NONE;\n    this.shadowContext = parent ? parent.shadowContext : null;\n    this.breakPenalty = parent ? parent.breakPenalty : 0;\n    this.floatReference = PageFloats.FloatReference.INLINE;\n    this.whitespace = parent ? parent.whitespace : Whitespace.IGNORE;\n    this.hyphenateCharacter = parent ? parent.hyphenateCharacter : null;\n    this.breakWord = parent ? parent.breakWord : false;\n    this.inheritedProps = parent ? parent.inheritedProps : {};\n    this.vertical = parent ? parent.vertical : false;\n    this.direction = parent ? parent.direction : \"ltr\";\n    this.firstPseudo = parent ? parent.firstPseudo : null;\n    this.formattingContext = parent ? parent.formattingContext : null;\n    this.pageType = parent ? parent.pageType : null;\n  }\n\n  resetView(): void {\n    this.inline = true;\n    this.breakPenalty = this.parent ? this.parent.breakPenalty : 0;\n    this.viewNode = null;\n    this.clearSpacer = null;\n    this.offsetInNode = 0;\n    this.after = false;\n    this.display = null;\n    this.floatReference = PageFloats.FloatReference.INLINE;\n    this.floatSide = null;\n    this.clearSide = null;\n    this.floatMinWrapBlock = null;\n    this.columnSpan = null;\n    this.verticalAlign = \"baseline\";\n    this.flexContainer = false;\n    this.whitespace = this.parent ? this.parent.whitespace : Whitespace.IGNORE;\n    this.hyphenateCharacter = this.parent\n      ? this.parent.hyphenateCharacter\n      : null;\n    this.breakWord = this.parent ? this.parent.breakWord : false;\n    this.breakBefore = null;\n    this.breakAfter = null;\n    this.nodeShadow = null;\n    this.establishesBFC = false;\n    this.containingBlockForAbsolute = false;\n    this.vertical = this.parent ? this.parent.vertical : false;\n    this.nodeShadow = null;\n    this.preprocessedTextContent = null;\n    this.formattingContext = this.parent ? this.parent.formattingContext : null;\n    this.repeatOnBreak = null;\n    this.pluginProps = {};\n    this.fragmentIndex = 1;\n    this.afterIfContinues = null;\n    this.footnotePolicy = null;\n  }\n\n  private cloneItem(): NodeContext {\n    const np = new NodeContext(this.sourceNode, this.parent, this.boxOffset);\n    np.offsetInNode = this.offsetInNode;\n    np.after = this.after;\n    np.nodeShadow = this.nodeShadow;\n    np.shadowType = this.shadowType;\n    np.shadowContext = this.shadowContext;\n    np.shadowSibling = this.shadowSibling;\n    np.inline = this.inline;\n    np.breakPenalty = this.breakPenalty;\n    np.display = this.display;\n    np.floatReference = this.floatReference;\n    np.floatSide = this.floatSide;\n    np.clearSide = this.clearSide;\n    np.floatMinWrapBlock = this.floatMinWrapBlock;\n    np.columnSpan = this.columnSpan;\n    np.verticalAlign = this.verticalAlign;\n    np.captionSide = this.captionSide;\n    np.inlineBorderSpacing = this.inlineBorderSpacing;\n    np.blockBorderSpacing = this.blockBorderSpacing;\n    np.establishesBFC = this.establishesBFC;\n    np.containingBlockForAbsolute = this.containingBlockForAbsolute;\n    np.flexContainer = this.flexContainer;\n    np.whitespace = this.whitespace;\n    np.hyphenateCharacter = this.hyphenateCharacter;\n    np.breakWord = this.breakWord;\n    np.breakBefore = this.breakBefore;\n    np.breakAfter = this.breakAfter;\n    np.viewNode = this.viewNode;\n    np.clearSpacer = this.clearSpacer;\n    np.firstPseudo = this.firstPseudo;\n    np.vertical = this.vertical;\n    np.overflow = this.overflow;\n    np.preprocessedTextContent = this.preprocessedTextContent;\n    np.formattingContext = this.formattingContext;\n    np.repeatOnBreak = this.repeatOnBreak;\n    np.pluginProps = Object.create(this.pluginProps);\n    np.fragmentIndex = this.fragmentIndex;\n    np.afterIfContinues = this.afterIfContinues;\n    np.footnotePolicy = this.footnotePolicy;\n    return np;\n  }\n\n  modify(): NodeContext {\n    if (!this.shared) {\n      return this;\n    }\n    return this.cloneItem();\n  }\n\n  copy(): NodeContext {\n    let np: NodeContext = this;\n    do {\n      if (np.shared) {\n        break;\n      }\n      np.shared = true;\n      np = np.parent;\n    } while (np);\n    return this;\n  }\n\n  clone(): NodeContext {\n    const np = this.cloneItem();\n    let npc = np;\n    let npp: NodeContext;\n    while ((npp = npc.parent) != null) {\n      npp = npp.cloneItem();\n      npc.parent = npp;\n      npc = npp;\n    }\n    return np;\n  }\n\n  toNodePositionStep(): NodePositionStep {\n    return {\n      node: this.sourceNode,\n      shadowType: this.shadowType,\n      shadowContext: this.shadowContext,\n      nodeShadow: this.nodeShadow,\n      shadowSibling: this.shadowSibling\n        ? this.shadowSibling.toNodePositionStep()\n        : null,\n      formattingContext: this.formattingContext,\n\n      // fragmentIndex needs to be reset to 0 if this viewNode has been removed\n      // from the view tree by forced break processing. (Issue #1557)\n      fragmentIndex:\n        this.viewNode?.parentNode === null ? 0 : this.fragmentIndex,\n    };\n  }\n\n  toNodePosition(): NodePosition {\n    let nc: NodeContext = this;\n    const steps = [];\n\n    // Fix for issue #703\n    if (\n      nc.shadowType === Vtree.ShadowType.ROOTLESS &&\n      (nc.floatReference !== PageFloats.FloatReference.INLINE ||\n        nc.floatSide === \"footnote\") &&\n      (nc.shadowContext?.styler as PseudoElement.PseudoelementStyler)?.style?.[\n        \"_pseudos\"\n      ]\n    ) {\n      nc = nc.parent;\n    }\n\n    do {\n      // We need fully \"peeled\" path, so don't record first-XXX pseudoelement\n      // containers\n      if (\n        !nc.firstPseudo ||\n        !nc.parent ||\n        nc.parent.firstPseudo === nc.firstPseudo\n      ) {\n        steps.push(nc.toNodePositionStep());\n      }\n      nc = nc.parent;\n    } while (nc);\n    const actualOffsetInNode = this.preprocessedTextContent\n      ? Diff.resolveOriginalIndex(\n          this.preprocessedTextContent,\n          this.offsetInNode,\n        )\n      : this.offsetInNode;\n    return {\n      steps,\n      offsetInNode: actualOffsetInNode,\n      after: this.after,\n      preprocessedTextContent: this.preprocessedTextContent,\n    };\n  }\n\n  isInsideBFC(): boolean {\n    let parent = this.parent;\n    while (parent) {\n      if (parent.establishesBFC) {\n        return true;\n      }\n      parent = parent.parent;\n    }\n    return false;\n  }\n\n  getContainingBlockForAbsolute(): NodeContext {\n    let parent = this.parent;\n    while (parent) {\n      if (parent.containingBlockForAbsolute) {\n        return parent;\n      }\n      parent = parent.parent;\n    }\n    return null;\n  }\n\n  belongsTo(formattingContext: FormattingContext): boolean {\n    return (\n      this.formattingContext === formattingContext &&\n      !!this.parent &&\n      this.parent.formattingContext === formattingContext\n    );\n  }\n}\n\nexport class ChunkPosition implements Vtree.ChunkPosition {\n  floats: NodePosition[] = null;\n\n  constructor(public primary: NodePosition) {}\n\n  clone(): ChunkPosition {\n    const result = new ChunkPosition(this.primary);\n    if (this.floats) {\n      result.floats = [];\n      for (let i = 0; i < this.floats.length; ++i) {\n        result.floats[i] = this.floats[i];\n      }\n    }\n    return result;\n  }\n\n  isSamePosition(other: ChunkPosition): boolean {\n    if (!other) {\n      return false;\n    }\n    if (this === other) {\n      return true;\n    }\n    if (!isSameNodePosition(this.primary, other.primary)) {\n      return false;\n    }\n    if (this.floats) {\n      if (!other.floats || this.floats.length !== other.floats.length) {\n        return false;\n      }\n      for (let i = 0; i < this.floats.length; i++) {\n        if (!isSameNodePosition(this.floats[i], other.floats[i])) {\n          return false;\n        }\n      }\n    } else if (other.floats) {\n      return false;\n    }\n    return true;\n  }\n}\n\nexport class FlowChunkPosition {\n  constructor(\n    public chunkPosition: ChunkPosition,\n    public readonly flowChunk: FlowChunk,\n  ) {}\n\n  clone(): FlowChunkPosition {\n    return new FlowChunkPosition(this.chunkPosition.clone(), this.flowChunk);\n  }\n\n  isSamePosition(other: FlowChunkPosition): boolean {\n    return (\n      !!other &&\n      (this === other || this.chunkPosition.isSamePosition(other.chunkPosition))\n    );\n  }\n}\n\nexport class FlowPosition {\n  positions: FlowChunkPosition[] = [];\n  startBreakType: string | null = null;\n  breakAfter: string | null = null;\n\n  clone(): FlowPosition {\n    const newfp = new FlowPosition();\n    const arr = this.positions;\n    const newarr = newfp.positions;\n    for (let i = 0; i < arr.length; i++) {\n      newarr[i] = arr[i].clone();\n    }\n    newfp.startBreakType = this.startBreakType;\n    newfp.breakAfter = this.breakAfter;\n    return newfp;\n  }\n\n  isSamePosition(other: FlowPosition): boolean {\n    if (this === other) {\n      return true;\n    }\n    if (!other || this.positions.length !== other.positions.length) {\n      return false;\n    }\n    for (let i = 0; i < this.positions.length; i++) {\n      if (!this.positions[i].isSamePosition(other.positions[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  hasContent(offset: number): boolean {\n    return (\n      this.positions.length > 0 &&\n      this.positions[0].flowChunk.startOffset <= offset\n    );\n  }\n}\n\nexport class LayoutPosition {\n  /**\n   * One-based, incremented before layout.\n   */\n  page: number = 0;\n  flows: { [key: string]: Flow } = {};\n  flowPositions: { [key: string]: FlowPosition } = {};\n  isBlankPage: boolean = false;\n\n  /**\n   * flowPositions is built up to this offset.\n   */\n  highestSeenOffset: number = 0;\n\n  // FIXME: This properties seem to be not used\n  highestSeenNode: Node;\n  lookupPositionOffset: number;\n\n  clone(): LayoutPosition {\n    const newcp = new LayoutPosition();\n    newcp.page = this.page;\n    newcp.isBlankPage = this.isBlankPage;\n    newcp.highestSeenNode = this.highestSeenNode;\n    newcp.highestSeenOffset = this.highestSeenOffset;\n    newcp.lookupPositionOffset = this.lookupPositionOffset;\n    newcp.flows = this.flows;\n    for (const name in this.flowPositions) {\n      newcp.flowPositions[name] = this.flowPositions[name].clone();\n    }\n    return newcp;\n  }\n\n  isSamePosition(other: LayoutPosition): boolean {\n    if (this === other) {\n      return true;\n    }\n    if (\n      !other ||\n      this.page !== other.page\n      // Removed:\n      //   || this.highestSeenOffset !== other.highestSeenOffset\n      // to prevent unnecessary re-layout (Issue #681-case2)\n    ) {\n      return false;\n    }\n    const thisFlowNames = Object.keys(this.flowPositions);\n    const otherFlowNames = Object.keys(other.flowPositions);\n    if (thisFlowNames.length !== otherFlowNames.length) {\n      return false;\n    }\n    for (const flowName of thisFlowNames) {\n      if (\n        !this.flowPositions[flowName].isSamePosition(\n          other.flowPositions[flowName],\n        )\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * @param name flow name.\n   */\n  hasContent(name: string, offset: number): boolean {\n    const flowPos = this.flowPositions[name];\n    if (!flowPos) {\n      return false;\n    }\n    return flowPos.hasContent(offset);\n  }\n\n  startSideOfFlow(name: string): string {\n    const startBreakType = this.flowPositions[name]?.startBreakType;\n    return startBreakType && Break.isSpreadBreakValue(startBreakType)\n      ? startBreakType\n      : \"any\";\n  }\n\n  firstFlowChunkOfFlow(name: string): FlowChunk | null {\n    const flowPos = this.flowPositions[name];\n    if (!flowPos) {\n      return null;\n    }\n    const flowChunkPosition = flowPos.positions[0];\n    if (!flowChunkPosition) {\n      return null;\n    }\n    return flowChunkPosition.flowChunk;\n  }\n}\n\nexport class Container implements Vtree.Container {\n  left: number = 0;\n  top: number = 0;\n  marginLeft: number = 0;\n  marginRight: number = 0;\n  marginTop: number = 0;\n  marginBottom: number = 0;\n  borderLeft: number = 0;\n  borderRight: number = 0;\n  borderTop: number = 0;\n  borderBottom: number = 0;\n  paddingLeft: number = 0;\n  paddingRight: number = 0;\n  paddingTop: number = 0;\n  paddingBottom: number = 0;\n  width: number = 0;\n  height: number = 0;\n  originX: number = 0;\n  originY: number = 0;\n  exclusions: GeometryUtil.Shape[] = null;\n  innerShape: GeometryUtil.Shape = null;\n  computedBlockSize: number = 0;\n  snapWidth: number = 0;\n  snapHeight: number = 0;\n  snapOffsetX: number = 0;\n  snapOffsetY: number = 0;\n  vertical: boolean = false; // vertical writing\n  rtl: boolean = false;\n  borderBoxSizing: boolean = false;\n\n  constructor(public element: HTMLElement) {}\n\n  getInsetTop() {\n    return (\n      this.marginTop +\n      (this.borderBoxSizing ? 0 : this.borderTop + this.paddingTop)\n    );\n  }\n\n  getInsetBottom() {\n    return (\n      this.marginBottom +\n      (this.borderBoxSizing ? 0 : this.borderBottom + this.paddingBottom)\n    );\n  }\n\n  getInsetLeft() {\n    return (\n      this.marginLeft +\n      (this.borderBoxSizing ? 0 : this.borderLeft + this.paddingLeft)\n    );\n  }\n\n  getInsetRight() {\n    return (\n      this.marginRight +\n      (this.borderBoxSizing ? 0 : this.borderRight + this.paddingRight)\n    );\n  }\n\n  getInsetBefore() {\n    if (this.vertical) {\n      return this.getInsetRight();\n    } else {\n      return this.getInsetTop();\n    }\n  }\n\n  getInsetAfter() {\n    if (this.vertical) {\n      return this.getInsetLeft();\n    } else {\n      return this.getInsetBottom();\n    }\n  }\n\n  getInsetStart() {\n    if (this.vertical) {\n      return this.getInsetTop();\n    } else {\n      return this.getInsetLeft();\n    }\n  }\n\n  getInsetEnd() {\n    if (this.vertical) {\n      return this.getInsetBottom();\n    } else {\n      return this.getInsetRight();\n    }\n  }\n\n  getBeforeEdge(box: ClientRect): number {\n    return this.vertical ? box.right : box.top;\n  }\n\n  getAfterEdge(box: ClientRect): number {\n    return this.vertical ? box.left : box.bottom;\n  }\n\n  getStartEdge(box: ClientRect): number {\n    return this.vertical\n      ? this.rtl\n        ? box.bottom\n        : box.top\n      : this.rtl\n        ? box.right\n        : box.left;\n  }\n\n  getEndEdge(box: ClientRect): number {\n    return this.vertical\n      ? this.rtl\n        ? box.top\n        : box.bottom\n      : this.rtl\n        ? box.left\n        : box.right;\n  }\n\n  getInlineSize(box: ClientRect): number {\n    return this.vertical ? box.bottom - box.top : box.right - box.left;\n  }\n\n  getBoxSize(box: ClientRect): number {\n    return this.vertical ? box.right - box.left : box.bottom - box.top;\n  }\n\n  getBoxDir(): number {\n    return this.vertical ? -1 : 1;\n  }\n\n  getInlineDir(): number {\n    return this.rtl ? -1 : 1;\n  }\n\n  copyFrom(other: Container): void {\n    this.element = other.element;\n    this.left = other.left;\n    this.top = other.top;\n    this.marginLeft = other.marginLeft;\n    this.marginRight = other.marginRight;\n    this.marginTop = other.marginTop;\n    this.marginBottom = other.marginBottom;\n    this.borderLeft = other.borderLeft;\n    this.borderRight = other.borderRight;\n    this.borderTop = other.borderTop;\n    this.borderBottom = other.borderBottom;\n    this.paddingLeft = other.paddingLeft;\n    this.paddingRight = other.paddingRight;\n    this.paddingTop = other.paddingTop;\n    this.paddingBottom = other.paddingBottom;\n    this.width = other.width;\n    this.height = other.height;\n    this.originX = other.originX;\n    this.originY = other.originY;\n    this.innerShape = other.innerShape;\n    this.exclusions = other.exclusions;\n    this.computedBlockSize = other.computedBlockSize;\n    this.snapWidth = other.snapWidth;\n    this.snapHeight = other.snapHeight;\n    this.vertical = other.vertical;\n    this.rtl = other.rtl;\n    this.borderBoxSizing = other.borderBoxSizing;\n  }\n\n  setVerticalPosition(top: number, height: number): void {\n    this.top = top;\n    this.height = height;\n    Base.setCSSProperty(this.element, \"top\", `${top}px`);\n    Base.setCSSProperty(this.element, \"height\", `${height}px`);\n  }\n\n  setHorizontalPosition(left: number, width: number): void {\n    this.left = left;\n    this.width = width;\n    Base.setCSSProperty(this.element, \"left\", `${left}px`);\n    Base.setCSSProperty(this.element, \"width\", `${width}px`);\n  }\n\n  setBlockPosition(start: number, extent: number): void {\n    if (this.vertical) {\n      const outerExtent =\n        extent +\n        this.marginLeft +\n        this.marginRight +\n        (this.borderBoxSizing\n          ? 0\n          : this.paddingLeft +\n            this.paddingRight +\n            this.borderLeft +\n            this.borderRight);\n      this.setHorizontalPosition(\n        start + outerExtent * this.getBoxDir(),\n        extent,\n      );\n    } else {\n      this.setVerticalPosition(start, extent);\n    }\n  }\n\n  setInlinePosition(start: number, extent: number): void {\n    if (this.vertical) {\n      if (this.rtl) {\n        const outerExtent =\n          extent +\n          this.marginTop +\n          this.marginBottom +\n          (this.borderBoxSizing\n            ? 0\n            : this.paddingTop +\n              this.paddingBottom +\n              this.borderTop +\n              this.borderBottom);\n        this.setVerticalPosition(\n          start + outerExtent * this.getInlineDir(),\n          extent,\n        );\n      } else {\n        this.setVerticalPosition(start, extent);\n      }\n    } else if (this.rtl) {\n      const outerExtent =\n        extent +\n        this.marginLeft +\n        this.marginRight +\n        (this.borderBoxSizing\n          ? 0\n          : this.paddingLeft +\n            this.paddingRight +\n            this.borderLeft +\n            this.borderRight);\n      this.setHorizontalPosition(\n        start + outerExtent * this.getInlineDir(),\n        extent,\n      );\n    } else {\n      this.setHorizontalPosition(start, extent);\n    }\n  }\n\n  clear() {\n    const parent = this.element;\n    let c: Node;\n    while ((c = parent.lastChild)) {\n      parent.removeChild(c);\n    }\n  }\n\n  getInnerShape(): GeometryUtil.Shape {\n    const rect = this.getInnerRect();\n    if (this.innerShape) {\n      return this.innerShape.withOffset(rect.x1, rect.y1);\n    }\n    return GeometryUtil.shapeForRect(rect.x1, rect.y1, rect.x2, rect.y2);\n  }\n\n  getInnerRect(): GeometryUtil.Rect {\n    const offsetX = this.originX + this.left + this.getInsetLeft();\n    const offsetY = this.originY + this.top + this.getInsetTop();\n    return new GeometryUtil.Rect(\n      offsetX,\n      offsetY,\n      offsetX + this.width,\n      offsetY + this.height,\n    );\n  }\n\n  getPaddingRect(): GeometryUtil.Rect {\n    const paddingX =\n      this.originX + this.left + this.marginLeft + this.borderLeft;\n    const paddingY = this.originY + this.top + this.marginTop + this.borderTop;\n    const paddingWidth = this.paddingLeft + this.width + this.paddingRight;\n    const paddingHeight = this.paddingTop + this.height + this.paddingBottom;\n    return new GeometryUtil.Rect(\n      paddingX,\n      paddingY,\n      paddingX + paddingWidth,\n      paddingY + paddingHeight,\n    );\n  }\n\n  getOuterShape(\n    outerShapeProp: Css.Val,\n    context: Exprs.Context,\n  ): GeometryUtil.Shape {\n    const rect = this.getOuterRect();\n    return CssProp.toShape(\n      outerShapeProp,\n      rect.x1,\n      rect.y1,\n      rect.x2 - rect.x1,\n      rect.y2 - rect.y1,\n      context,\n    );\n  }\n\n  getOuterRect(): GeometryUtil.Rect {\n    const outerX = this.originX + this.left;\n    const outerY = this.originY + this.top;\n    const outerWidth = this.getInsetLeft() + this.width + this.getInsetRight();\n    const outerHeight =\n      this.getInsetTop() + this.height + this.getInsetBottom();\n    return new GeometryUtil.Rect(\n      outerX,\n      outerY,\n      outerX + outerWidth,\n      outerY + outerHeight,\n    );\n  }\n}\n\nexport type ExprContentListener = Vtree.ExprContentListener;\n\nexport class ContentPropertyHandler extends Css.Visitor {\n  constructor(\n    public readonly elem: Element,\n    public readonly context: Exprs.Context,\n    public readonly rootContentValue: Css.Val,\n    public readonly exprContentListener: ExprContentListener,\n  ) {\n    super();\n  }\n\n  private visitStrInner(str: string, node?: Node | null) {\n    if (!node) {\n      if (this.elem.lastChild?.nodeType === 3) {\n        this.elem.lastChild.textContent += str;\n        return;\n      }\n      node = this.elem.ownerDocument.createTextNode(str);\n    }\n    this.elem.appendChild(node);\n  }\n\n  override visitStr(str: Css.Str): Css.Val {\n    this.visitStrInner(str.str);\n    return null;\n  }\n\n  override visitURL(url: Css.URL): Css.Val {\n    if (this.rootContentValue instanceof Css.URL) {\n      this.elem.setAttribute(\"src\", url.url);\n    } else {\n      const img = this.elem.ownerDocument.createElementNS(Base.NS.XHTML, \"img\");\n      img.setAttribute(\"src\", url.url);\n      this.elem.appendChild(img);\n    }\n    return null;\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    this.visitValues(list.values);\n    return null;\n  }\n\n  override visitExpr(expr: Css.Expr): Css.Val {\n    const ex = expr.toExpr();\n    let val = ex.evaluate(this.context);\n    if (typeof val === \"string\") {\n      if (ex instanceof Exprs.Named) {\n        // For env(pub-title) and env(doc-title)\n        // Need to unquote the result. To be consistent with cssparse.evaluateExprToCSS()\n        val = CssParser.parseValue(\n          ex.scope,\n          new CssTokenizer.Tokenizer(val, null),\n          \"\",\n        ).stringValue();\n      }\n      assert(this.elem.ownerDocument);\n      const node = this.exprContentListener(ex, val, this.elem.ownerDocument);\n      if (\n        !node &&\n        val &&\n        ex instanceof Exprs.Native &&\n        ex.str.startsWith(\"running-element-\")\n      ) {\n        // Prevent wrong running element output when the element is not found (Issue #1196)\n        val = \"\";\n      }\n      this.visitStrInner(val, node);\n    }\n    return null;\n  }\n}\n\nexport function nonTrivialContent(val: Css.Val | null | undefined): boolean {\n  return (\n    val != null &&\n    val !== Css.empty &&\n    val !== Css.ident.normal &&\n    val !== Css.ident.none &&\n    !Css.isDefaultingValue(val)\n  );\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview PageFloats - CSS Page Floats\n */\nimport * as Asserts from \"./asserts\";\nimport * as Css from \"./css\";\nimport * as Constants from \"./constants\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Logging from \"./logging\";\nimport * as CssLogicalUtil from \"./css-logical-util\";\nimport * as Sizing from \"./sizing\";\nimport * as Task from \"./task\";\nimport * as VtreeImpl from \"./vtree\";\nimport { Layout as LayoutType, PageFloats, Vtree } from \"./types\";\n\nexport const FloatReference = PageFloats.FloatReference;\nexport type FloatReference = PageFloats.FloatReference; // eslint-disable-line no-redeclare\n\ntype PageFloatID = PageFloats.PageFloatID;\n\nexport function floatReferenceOf(str: string): FloatReference {\n  switch (str) {\n    case \"inline\":\n      return FloatReference.INLINE;\n    case \"column\":\n      return FloatReference.COLUMN;\n    case \"region\":\n      return FloatReference.REGION;\n    case \"page\":\n      return FloatReference.PAGE;\n    default:\n      throw new Error(`Unknown float-reference: ${str}`);\n  }\n}\n\nexport function isPageFloat(floatReference: FloatReference): boolean {\n  switch (floatReference) {\n    case FloatReference.INLINE:\n      return false;\n    case FloatReference.COLUMN:\n    case FloatReference.REGION:\n    case FloatReference.PAGE:\n      return true;\n    default:\n      throw new Error(`Unknown float-reference: ${floatReference}`);\n  }\n}\n\n/**\n * Interpret a float value with the writing-mode and direction assuming the\n * float-reference is inline and returns \"left\" or \"right\".\n */\nexport function resolveInlineFloatDirection(\n  floatSide: string,\n  vertical: boolean,\n  direction: string,\n  pageSide: Constants.PageSide,\n): string {\n  const writingMode = vertical ? \"vertical-rl\" : \"horizontal-tb\";\n  if (floatSide === \"top\" || floatSide === \"bottom\") {\n    floatSide = CssLogicalUtil.toLogical(floatSide, writingMode, direction);\n  }\n  if (floatSide === \"block-start\") {\n    floatSide = \"inline-start\";\n  }\n  if (floatSide === \"block-end\") {\n    floatSide = \"inline-end\";\n  }\n  if (floatSide === \"inline-start\" || floatSide === \"inline-end\") {\n    const physicalValue = CssLogicalUtil.toPhysical(\n      floatSide,\n      writingMode,\n      direction,\n    );\n    const lineRelativeValue = CssLogicalUtil.toLineRelative(\n      physicalValue,\n      writingMode,\n    );\n    if (lineRelativeValue === \"line-left\") {\n      floatSide = \"left\";\n    } else if (lineRelativeValue === \"line-right\") {\n      floatSide = \"right\";\n    }\n  } else if (floatSide === \"inside\") {\n    floatSide = pageSide === \"left\" ? \"right\" : \"left\";\n  } else if (floatSide === \"outside\") {\n    floatSide = pageSide === \"left\" ? \"left\" : \"right\";\n  }\n  if (floatSide !== \"left\" && floatSide !== \"right\") {\n    Logging.logger.warn(`Invalid float value: ${floatSide}. Fallback to left.`);\n    floatSide = \"left\";\n  }\n  return floatSide;\n}\n\nexport class PageFloat implements PageFloats.PageFloat {\n  order: number | null = null;\n  id: PageFloatID | null = null;\n\n  constructor(\n    public readonly nodePosition: Vtree.NodePosition,\n    public readonly floatReference: FloatReference,\n    public readonly floatSide: string,\n    public readonly clearSide: string | null,\n    public readonly flowName: string,\n    public readonly floatMinWrapBlock: Css.Numeric | null,\n  ) {}\n\n  getOrder(): number {\n    if (this.order === null) {\n      throw new Error(\"The page float is not yet added\");\n    }\n    return this.order;\n  }\n\n  getId(): PageFloatID {\n    if (!this.id) {\n      throw new Error(\"The page float is not yet added\");\n    }\n    return this.id;\n  }\n\n  isAllowedOnContext(pageFloatLayoutContext: PageFloatLayoutContext): boolean {\n    return pageFloatLayoutContext.isAnchorAlreadyAppeared(this.getId());\n  }\n\n  isAllowedToPrecede(other: PageFloat): boolean {\n    return false;\n  }\n}\n\nexport class PageFloatStore {\n  private floats: PageFloat[] = [];\n  private nextPageFloatIndex: number = 0;\n\n  private nextOrder(): number {\n    return this.nextPageFloatIndex++;\n  }\n\n  private createPageFloatId(order: number): PageFloatID {\n    return `pf${order}`;\n  }\n\n  addPageFloat(float: PageFloat) {\n    const index = this.floats.findIndex((f) =>\n      VtreeImpl.isSameNodePosition(f.nodePosition, float.nodePosition),\n    );\n    if (index >= 0) {\n      throw new Error(\n        \"A page float with the same source node is already registered\",\n      );\n    } else {\n      const order = (float.order = this.nextOrder());\n      float.id = this.createPageFloatId(order);\n      this.floats.push(float);\n    }\n  }\n\n  findPageFloatByNodePosition(\n    nodePosition: Vtree.NodePosition,\n  ): PageFloat | null {\n    const index = this.floats.findIndex((f) =>\n      VtreeImpl.isSameNodePosition(f.nodePosition, nodePosition),\n    );\n    return index >= 0 ? this.floats[index] : null;\n  }\n\n  findPageFloatById(id: PageFloatID) {\n    const index = this.floats.findIndex((f) => f.id === id);\n    return index >= 0 ? this.floats[index] : null;\n  }\n}\n\n/**\n * @param continues Represents whether the float is fragmented and continues\n *     after this fragment\n */\nexport class PageFloatFragment implements PageFloats.PageFloatFragment {\n  constructor(\n    public readonly floatReference: FloatReference,\n    public readonly floatSide: string,\n    public readonly clearSide: string | null,\n    public readonly continuations: PageFloatContinuation[],\n    public readonly area: Vtree.Container,\n    public readonly continues: boolean,\n  ) {}\n\n  hasFloat(float: PageFloat): boolean {\n    return this.continuations.some((c) => c.float === float);\n  }\n\n  findNotAllowedFloat(context: PageFloatLayoutContext): PageFloat | null {\n    for (let i = this.continuations.length - 1; i >= 0; i--) {\n      const f = this.continuations[i].float;\n      if (!f.isAllowedOnContext(context)) {\n        return f;\n      }\n    }\n    return null;\n  }\n\n  getOuterShape(): GeometryUtil.Shape {\n    return this.area.getOuterShape(null, null);\n  }\n\n  getOuterRect(): GeometryUtil.Rect {\n    return this.area.getOuterRect();\n  }\n\n  getOrder(): number {\n    const floats = this.continuations.map((c) => c.float);\n    return Math.min.apply(\n      null,\n      floats.map((f) => f.getOrder()),\n    );\n  }\n\n  shouldBeStashedBefore(float: PageFloat): boolean {\n    return this.getOrder() < float.getOrder();\n  }\n\n  addContinuations(continuations: PageFloatContinuation[]) {\n    continuations.forEach((c) => {\n      this.continuations.push(c);\n    });\n  }\n\n  getFlowName(): string {\n    const flowName = this.continuations[0].float.flowName;\n    Asserts.assert(\n      this.continuations.every((c) => c.float.flowName === flowName),\n    );\n    return flowName;\n  }\n}\n\nexport class PageFloatContinuation implements PageFloats.PageFloatContinuation {\n  constructor(\n    public readonly float: PageFloat,\n    public readonly nodePosition: Vtree.NodePosition,\n  ) {}\n\n  equals(other: PageFloatContinuation | null): boolean {\n    if (!other) {\n      return false;\n    }\n    if (this === other) {\n      return true;\n    }\n    return (\n      this.float === other.float &&\n      VtreeImpl.isSameNodePosition(this.nodePosition, other.nodePosition)\n    );\n  }\n}\n\nexport type PageFloatPlacementCondition =\n  PageFloats.PageFloatPlacementCondition;\n\n/**\n * @param generatingNodePosition Source NodePosition generating the context.\n *     Specify when a column context is generated by a non-root element (for\n *     example page floats)\n */\nexport class PageFloatLayoutContext\n  implements PageFloats.PageFloatLayoutContext\n{\n  private children: PageFloatLayoutContext[] = [];\n  writingMode: Css.Val;\n  direction: Css.Val;\n  private invalidated: boolean = false;\n  private floatStore: PageFloatStore;\n  private forbiddenFloats: PageFloatID[] = [];\n  floatFragments: PageFloatFragment[] = [];\n  private stashedFloatFragments: PageFloatFragment[] = [];\n  private floatAnchors: { [key in PageFloatID]: Node } = {};\n  private floatsDeferredToNext: PageFloatContinuation[] = [];\n  private floatsDeferredFromPrevious: PageFloatContinuation[];\n  private layoutConstraints: LayoutType.LayoutConstraint[] = [];\n  private locked: boolean = false;\n\n  constructor(\n    public readonly parent: PageFloatLayoutContext,\n    private readonly floatReference: FloatReference | null,\n    private container: Vtree.Container,\n    public readonly flowName: string | null,\n    public readonly generatingNodePosition: Vtree.NodePosition | null,\n    writingMode: Css.Val | null,\n    direction: Css.Val | null,\n  ) {\n    if (parent) {\n      parent.children.push(this);\n    }\n    this.writingMode =\n      writingMode || (parent && parent.writingMode) || Css.ident.horizontal_tb;\n    this.direction = direction || (parent && parent.direction) || Css.ident.ltr;\n    this.floatStore = parent ? parent.floatStore : new PageFloatStore();\n    const previousSibling = this.getPreviousSibling();\n    this.floatsDeferredFromPrevious = previousSibling\n      ? [].concat(previousSibling.floatsDeferredToNext)\n      : [];\n  }\n\n  private getParent(floatReference: FloatReference): PageFloatLayoutContext {\n    if (!this.parent) {\n      throw new Error(`No PageFloatLayoutContext for ${floatReference}`);\n    }\n    return this.parent;\n  }\n\n  private getPreviousSiblingOf(\n    child: PageFloatLayoutContext | null,\n    floatReference: FloatReference | null,\n    flowName: string | null,\n    generatingNodePosition: Vtree.NodePosition | null,\n  ): PageFloatLayoutContext | null {\n    let index = this.children.indexOf(child as PageFloatLayoutContext);\n    if (index < 0) {\n      index = this.children.length;\n    }\n    for (let i = index - 1; i >= 0; i--) {\n      let result = this.children[i];\n      if (\n        result.floatReference === floatReference &&\n        result.flowName === flowName &&\n        VtreeImpl.isSameNodePosition(\n          result.generatingNodePosition,\n          generatingNodePosition,\n        )\n      ) {\n        return result;\n      } else {\n        result = result.getPreviousSiblingOf(\n          null,\n          floatReference,\n          flowName,\n          generatingNodePosition,\n        );\n        if (result) {\n          return result;\n        }\n      }\n    }\n    return null;\n  }\n\n  private getPreviousSibling(): PageFloatLayoutContext | null {\n    let child: PageFloatLayoutContext = this;\n    let parent = this.parent;\n    let result: PageFloatLayoutContext;\n    while (parent) {\n      result = parent.getPreviousSiblingOf(\n        child,\n        this.floatReference,\n        this.flowName,\n        this.generatingNodePosition,\n      );\n      if (result) {\n        return result;\n      }\n      child = parent;\n      parent = parent.parent;\n    }\n    return null;\n  }\n\n  getContainer(floatReference?: FloatReference): Vtree.Container {\n    if (!floatReference || floatReference === this.floatReference) {\n      return this.container;\n    }\n    return this.getParent(floatReference).getContainer(floatReference);\n  }\n\n  setContainer(container: Vtree.Container) {\n    this.container = container;\n    this.reattachFloatFragments();\n  }\n\n  addPageFloat(float: PageFloat) {\n    this.floatStore.addPageFloat(float);\n  }\n\n  getPageFloatLayoutContext(\n    floatReference: FloatReference,\n  ): PageFloatLayoutContext {\n    if (floatReference === this.floatReference) {\n      return this;\n    }\n    return this.getParent(floatReference).getPageFloatLayoutContext(\n      floatReference,\n    );\n  }\n\n  findPageFloatByNodePosition(\n    nodePosition: Vtree.NodePosition,\n  ): PageFloat | null {\n    return this.floatStore.findPageFloatByNodePosition(nodePosition);\n  }\n\n  private forbid(float: PageFloat) {\n    const id = float.getId();\n    const floatReference = float.floatReference;\n    if (floatReference === this.floatReference) {\n      if (!this.forbiddenFloats.includes(id)) {\n        this.forbiddenFloats.push(id);\n        const strategy = new PageFloatLayoutStrategyResolver().findByFloat(\n          float,\n        );\n        strategy.forbid(float, this);\n      }\n    } else {\n      const parent = this.getParent(floatReference);\n      parent.forbid(float);\n    }\n  }\n\n  isForbidden(float: PageFloat): boolean {\n    const id = float.getId();\n    const floatReference = float.floatReference;\n    if (floatReference === this.floatReference) {\n      return this.forbiddenFloats.includes(id);\n    } else {\n      const parent = this.getParent(floatReference);\n      return parent.isForbidden(float);\n    }\n  }\n\n  addPageFloatFragment(\n    floatFragment: PageFloatFragment,\n    dontInvalidate?: boolean,\n  ) {\n    const floatReference = floatFragment.floatReference;\n    if (floatReference !== this.floatReference) {\n      const parent = this.getParent(floatReference);\n      parent.addPageFloatFragment(floatFragment, dontInvalidate);\n    } else if (!this.floatFragments.includes(floatFragment)) {\n      this.floatFragments.push(floatFragment);\n      this.floatFragments.sort((fr1, fr2) => fr1.getOrder() - fr2.getOrder());\n    }\n    if (!dontInvalidate) {\n      this.invalidate();\n    }\n  }\n\n  removePageFloatFragment(\n    floatFragment: PageFloatFragment,\n    dontInvalidate?: boolean,\n  ) {\n    const floatReference = floatFragment.floatReference;\n    if (floatReference !== this.floatReference) {\n      const parent = this.getParent(floatReference);\n      parent.removePageFloatFragment(floatFragment, dontInvalidate);\n    } else {\n      const index = this.floatFragments.indexOf(floatFragment);\n      if (index >= 0) {\n        const fragment = this.floatFragments.splice(index, 1)[0];\n        const element = fragment.area && fragment.area.element;\n        if (element && element.parentNode) {\n          element.parentNode.removeChild(element);\n        }\n        if (!dontInvalidate) {\n          this.invalidate();\n        }\n      }\n    }\n  }\n\n  findPageFloatFragment(float: PageFloat): PageFloatFragment | null {\n    if (float.floatReference !== this.floatReference) {\n      const parent = this.getParent(float.floatReference);\n      return parent.findPageFloatFragment(float);\n    }\n    const index = this.floatFragments.findIndex((f) => f.hasFloat(float));\n    if (index >= 0) {\n      return this.floatFragments[index];\n    } else {\n      return null;\n    }\n  }\n\n  hasFloatFragments(condition?: (p1: PageFloatFragment) => boolean): boolean {\n    if (this.floatFragments.length > 0) {\n      if (!condition || this.floatFragments.some(condition)) {\n        return true;\n      }\n    }\n    if (this.parent) {\n      return this.parent.hasFloatFragments(condition);\n    } else {\n      return false;\n    }\n  }\n\n  hasContinuingFloatFragmentsInFlow(flowName: string): boolean {\n    return this.hasFloatFragments(\n      (fragment) => fragment.continues && fragment.getFlowName() === flowName,\n    );\n  }\n\n  registerPageFloatAnchor(float: PageFloat, anchorViewNode: Node) {\n    this.floatAnchors[float.getId()] = anchorViewNode;\n  }\n\n  collectPageFloatAnchors() {\n    const anchors = Object.assign({}, this.floatAnchors);\n    return this.children.reduce(\n      (prev, child) => Object.assign(prev, child.collectPageFloatAnchors()),\n      anchors,\n    );\n  }\n\n  isAnchorAlreadyAppeared(floatId: PageFloatID) {\n    const deferredFloats = this.getDeferredPageFloatContinuations();\n    if (deferredFloats.some((cont) => cont.float.getId() === floatId)) {\n      return true;\n    }\n    const floatAnchors = this.collectPageFloatAnchors();\n    const anchorViewNode = floatAnchors[floatId];\n    if (!anchorViewNode) {\n      return false;\n    }\n    if (this.container && this.container.element) {\n      return this.container.element.contains(anchorViewNode);\n    }\n    return false;\n  }\n\n  deferPageFloat(continuation: PageFloatContinuation) {\n    const float = continuation.float;\n    if (float.floatReference === this.floatReference) {\n      const index = this.floatsDeferredToNext.findIndex(\n        (c) => c.float === float,\n      );\n      if (index >= 0) {\n        this.floatsDeferredToNext.splice(index, 1, continuation);\n      } else {\n        this.floatsDeferredToNext.push(continuation);\n      }\n    } else {\n      const parent = this.getParent(float.floatReference);\n      parent.deferPageFloat(continuation);\n    }\n  }\n\n  hasPrecedingFloatsDeferredToNext(\n    float: PageFloat,\n    ignoreReference?: boolean,\n  ): boolean {\n    if (!ignoreReference && float.floatReference !== this.floatReference) {\n      return this.getParent(\n        float.floatReference,\n      ).hasPrecedingFloatsDeferredToNext(float, false);\n    }\n    const order = float.getOrder();\n    const hasPrecedingFloatsDeferredToNext = this.floatsDeferredToNext.some(\n      (c) => c.float.getOrder() < order && !float.isAllowedToPrecede(c.float),\n    );\n    if (hasPrecedingFloatsDeferredToNext) {\n      return true;\n    } else if (this.parent) {\n      return this.parent.hasPrecedingFloatsDeferredToNext(float, true);\n    } else {\n      return false;\n    }\n  }\n\n  getLastFollowingFloatInFragments(float: PageFloat): PageFloat | null {\n    const order = float.getOrder();\n    let lastFollowing: PageFloat = null;\n    this.floatFragments.forEach((fragment) => {\n      fragment.continuations.forEach((c) => {\n        const f = c.float;\n        const o = f.getOrder();\n        if (o > order && (!lastFollowing || o > lastFollowing.getOrder())) {\n          lastFollowing = f;\n        }\n      });\n    });\n    if (this.parent) {\n      const lastFollowingOfParent =\n        this.parent.getLastFollowingFloatInFragments(float);\n      if (\n        lastFollowingOfParent &&\n        (!lastFollowing ||\n          lastFollowingOfParent.getOrder() > lastFollowing.getOrder())\n      ) {\n        lastFollowing = lastFollowingOfParent;\n      }\n    }\n    return lastFollowing;\n  }\n\n  getDeferredPageFloatContinuations(\n    flowName?: string | null,\n  ): PageFloatContinuation[] {\n    flowName = flowName || this.flowName;\n    let result = this.floatsDeferredFromPrevious.filter(\n      (cont) => !flowName || cont.float.flowName === flowName,\n    );\n    if (this.parent) {\n      result = this.parent\n        .getDeferredPageFloatContinuations(flowName)\n        .concat(result);\n    }\n    return result.sort((c1, c2) => c1.float.getOrder() - c2.float.getOrder());\n  }\n\n  getPageFloatContinuationsDeferredToNext(\n    flowName?: string | null,\n  ): PageFloatContinuation[] {\n    flowName = flowName || this.flowName;\n    const result = this.floatsDeferredToNext.filter(\n      (cont) => !flowName || cont.float.flowName === flowName,\n    );\n    if (this.parent) {\n      return this.parent\n        .getPageFloatContinuationsDeferredToNext(flowName)\n        .concat(result);\n    } else {\n      return result;\n    }\n  }\n\n  getFloatsDeferredToNextInChildContexts(): PageFloat[] {\n    let result = [];\n    const done = [];\n    for (let i = this.children.length - 1; i >= 0; i--) {\n      const child = this.children[i];\n      if (done.includes(child.flowName)) {\n        continue;\n      }\n      done.push(child.flowName);\n      result = result.concat(child.floatsDeferredToNext.map((c) => c.float));\n      result = result.concat(child.getFloatsDeferredToNextInChildContexts());\n    }\n    return result;\n  }\n\n  checkAndForbidNotAllowedFloat(): boolean {\n    if (this.checkAndForbidFloatFollowingDeferredFloat()) {\n      return true;\n    }\n    for (let i = this.floatFragments.length - 1; i >= 0; i--) {\n      const fragment = this.floatFragments[i];\n      const notAllowedFloat = fragment.findNotAllowedFloat(this);\n      if (notAllowedFloat) {\n        if (this.locked) {\n          this.invalidate();\n        } else {\n          this.removePageFloatFragment(fragment);\n          this.forbid(notAllowedFloat);\n\n          // If the removed float is a block-end/inline-end float,\n          // we should re-layout preceding floats with the same float direction.\n          this.removeEndFloatFragments(fragment.floatSide);\n        }\n        return true;\n      }\n    }\n    if (this.floatReference === FloatReference.REGION && this.parent.locked) {\n      return this.parent.checkAndForbidNotAllowedFloat();\n    }\n    return false;\n  }\n\n  checkAndForbidFloatFollowingDeferredFloat(): boolean {\n    const deferredFloats = this.getFloatsDeferredToNextInChildContexts();\n    const floatsInFragments = this.floatFragments.reduce(\n      (r, fr) => r.concat(fr.continuations.map((c) => c.float)),\n      [],\n    );\n    floatsInFragments.sort((f1, f2) => f2.getOrder() - f1.getOrder());\n    for (const float of floatsInFragments) {\n      const order = float.getOrder();\n      if (\n        deferredFloats.some(\n          (d) => !float.isAllowedToPrecede(d) && order > d.getOrder(),\n        )\n      ) {\n        if (this.locked) {\n          this.invalidate();\n        } else {\n          this.forbid(float);\n          const fragment = this.findPageFloatFragment(float);\n          Asserts.assert(fragment);\n          this.removePageFloatFragment(fragment);\n        }\n        return true;\n      }\n    }\n    return false;\n  }\n\n  finish() {\n    if (this.checkAndForbidNotAllowedFloat()) {\n      return;\n    }\n    for (let i = this.floatsDeferredToNext.length - 1; i >= 0; i--) {\n      const continuation = this.floatsDeferredToNext[i];\n      if (!continuation.float.isAllowedOnContext(this)) {\n        if (this.locked) {\n          this.invalidate();\n          return;\n        }\n        this.floatsDeferredToNext.splice(i, 1);\n      }\n    }\n    this.floatsDeferredFromPrevious.forEach((continuation) => {\n      if (\n        this.floatsDeferredToNext.findIndex((c) => continuation.equals(c)) >= 0\n      ) {\n        return;\n      }\n      if (this.floatFragments.some((f) => f.hasFloat(continuation.float))) {\n        return;\n      }\n      this.floatsDeferredToNext.push(continuation);\n    });\n  }\n\n  hasSameContainerAs(other: PageFloatLayoutContext): boolean {\n    return (\n      !!this.container &&\n      !!other.container &&\n      this.container.element === other.container.element\n    );\n  }\n\n  invalidate() {\n    this.invalidated = true;\n    if (this.locked) {\n      return;\n    }\n    if (this.container) {\n      this.children.forEach((child) => {\n        // Since the same container element is shared by a region page float\n        // layout context and a column page float layout context in a single\n        // column region, view elements of float fragments of the child (column)\n        // context need to be removed here.\n        if (this.hasSameContainerAs(child)) {\n          child.floatFragments.forEach((fragment) => {\n            const elem = fragment.area.element;\n            if (elem && elem.parentNode) {\n              elem.parentNode.removeChild(elem);\n            }\n          });\n        }\n      });\n      this.container.clear();\n    }\n    this.children.forEach((child) => {\n      child.layoutConstraints.splice(0);\n    });\n    this.children.splice(0);\n    Object.keys(this.floatAnchors).forEach((k) => {\n      delete this.floatAnchors[k];\n    });\n  }\n\n  detachChildren(): PageFloatLayoutContext[] {\n    const children = this.children.splice(0);\n    children.forEach((child) => {\n      child.floatFragments.forEach((fragment) => {\n        const elem = fragment.area.element;\n        if (elem && elem.parentNode) {\n          elem.parentNode.removeChild(elem);\n        }\n      });\n    });\n    return children;\n  }\n\n  attachChildren(children: PageFloatLayoutContext[]) {\n    children.forEach((child) => {\n      this.children.push(child);\n      child.reattachFloatFragments();\n    });\n  }\n\n  isInvalidated() {\n    return this.invalidated || (!!this.parent && this.parent.isInvalidated());\n  }\n\n  validate() {\n    this.invalidated = false;\n  }\n\n  private toLogical(side: string): string {\n    const writingMode = this.writingMode.toString();\n    const direction = this.direction.toString();\n\n    if (side === \"inside\" || side === \"outside\") {\n      const isLeftPage = !!this.container.element.closest(\n        \"[data-vivliostyle-page-side='left']\",\n      );\n      side =\n        side === \"inside\"\n          ? isLeftPage\n            ? \"right\"\n            : \"left\"\n          : isLeftPage\n            ? \"left\"\n            : \"right\";\n    }\n    return CssLogicalUtil.toLogical(side, writingMode, direction);\n  }\n\n  private toPhysical(side: string): string {\n    const writingMode = this.writingMode.toString();\n    const direction = this.direction.toString();\n    return CssLogicalUtil.toPhysical(side, writingMode, direction);\n  }\n\n  private toLogicalFloatSides(floatSide: string): string[] {\n    const sides = floatSide.split(\" \");\n\n    // Convert to logical sides and remove duplicates\n    const logicalSides: string[] = [];\n    for (const side of sides) {\n      const logicalSide = this.toLogical(side);\n      if (!logicalSides.includes(logicalSide)) {\n        logicalSides.push(logicalSide);\n      }\n    }\n\n    // Convert \"block-start block-end\" to \"snap-block\" and\n    // \"inline-start inline-end\" to \"snap-inline\".\n    // More precisely, when multiple \"*block*\" values are found\n    // convert the first one to \"snap-block\" and remove the rest,\n    // and when multiple \"*inline*\" values are found convert the\n    // first one to \"snap-inline\" and remove the rest.\n    const logicalFloatSides: string[] = [];\n    let foundSnapBlock = false;\n    let foundSnapInline = false;\n    for (let i = 0; i < logicalSides.length; i++) {\n      const side = logicalSides[i];\n      if (side.includes(\"block\")) {\n        if (!foundSnapBlock) {\n          // Convert to \"snap-block\" if another block side is found\n          if (logicalSides.slice(i + 1).some((s) => s.includes(\"block\"))) {\n            logicalFloatSides.push(\"snap-block\");\n            foundSnapBlock = true;\n          } else {\n            logicalFloatSides.push(side);\n          }\n        }\n      } else if (side.includes(\"inline\")) {\n        if (!foundSnapInline) {\n          // Convert to \"snap-inline\" if another inline side is found\n          if (logicalSides.slice(i + 1).some((s) => s.includes(\"inline\"))) {\n            logicalFloatSides.push(\"snap-inline\");\n            foundSnapInline = true;\n          } else {\n            logicalFloatSides.push(side);\n          }\n        }\n      }\n    }\n\n    return logicalFloatSides;\n  }\n\n  removeEndFloatFragments(floatSide: string) {\n    const logicalFloatSide = this.toLogicalFloatSides(floatSide)[0];\n    if (logicalFloatSide === \"block-end\" || logicalFloatSide === \"inline-end\") {\n      let i = 0;\n      while (i < this.floatFragments.length) {\n        const fragment = this.floatFragments[i];\n        const fragmentFloatSide = this.toLogicalFloatSides(\n          fragment.floatSide,\n        )[0];\n        if (fragmentFloatSide === logicalFloatSide) {\n          this.removePageFloatFragment(fragment);\n        } else {\n          i++;\n        }\n      }\n    }\n  }\n\n  stashEndFloatFragments(float: PageFloat) {\n    const floatReference = float.floatReference;\n    if (floatReference !== this.floatReference) {\n      this.getParent(floatReference).stashEndFloatFragments(float);\n      return;\n    }\n    const logicalFloatSide = this.toLogicalFloatSides(float.floatSide)[0];\n    if (\n      logicalFloatSide === \"block-end\" ||\n      logicalFloatSide === \"snap-block\" ||\n      logicalFloatSide === \"inline-end\" ||\n      logicalFloatSide === \"snap-inline\"\n    ) {\n      let i = 0;\n      while (i < this.floatFragments.length) {\n        const fragment = this.floatFragments[i];\n        const fragmentFloatSide = this.toLogicalFloatSides(\n          fragment.floatSide,\n        )[0];\n        if (\n          (fragmentFloatSide === logicalFloatSide ||\n            (logicalFloatSide === \"snap-block\" &&\n              fragmentFloatSide === \"block-end\") ||\n            (logicalFloatSide === \"snap-inline\" &&\n              fragmentFloatSide === \"inline-end\")) &&\n          fragment.shouldBeStashedBefore(float)\n        ) {\n          this.stashedFloatFragments.push(fragment);\n          this.floatFragments.splice(i, 1);\n        } else {\n          i++;\n        }\n      }\n    }\n  }\n\n  restoreStashedFragments(floatReference: FloatReference) {\n    if (floatReference !== this.floatReference) {\n      this.getParent(floatReference).restoreStashedFragments(floatReference);\n      return;\n    }\n    this.stashedFloatFragments.forEach((stashed) => {\n      this.addPageFloatFragment(stashed, true);\n    });\n    this.stashedFloatFragments.splice(0);\n  }\n\n  discardStashedFragments(floatReference: FloatReference) {\n    if (floatReference !== this.floatReference) {\n      this.getParent(floatReference).discardStashedFragments(floatReference);\n      return;\n    }\n    this.stashedFloatFragments.splice(0);\n  }\n\n  getStashedFloatFragments(\n    floatReference: FloatReference,\n  ): PageFloatFragment[] {\n    if (floatReference === this.floatReference) {\n      return this.stashedFloatFragments\n        .concat()\n        .sort((fr1, fr2) => fr2.getOrder() - fr1.getOrder()); // return in reverse order\n    } else {\n      return this.getParent(floatReference).getStashedFloatFragments(\n        floatReference,\n      );\n    }\n  }\n\n  private getLimitValue(\n    side: string,\n    side2: string | null,\n    layoutContext: Vtree.LayoutContext,\n    clientLayout: Vtree.ClientLayout,\n    condition?: (p1: PageFloatFragment, p2: PageFloatLayoutContext) => boolean,\n  ): number {\n    Asserts.assert(this.container);\n    const logicalSide = this.toLogical(side);\n    const physicalSide = this.toPhysical(side);\n    const logicalSide2 = side2 && this.toLogical(side2);\n    const physicalSide2 = side2 && this.toPhysical(side2);\n    const limit = this.getLimitValueInner(\n      logicalSide,\n      logicalSide2,\n      layoutContext,\n      clientLayout,\n      condition,\n    );\n    if (this.parent && this.parent.container) {\n      const parentLimit = this.parent.getLimitValue(\n        physicalSide,\n        physicalSide2,\n        layoutContext,\n        clientLayout,\n        condition,\n      );\n      switch (physicalSide) {\n        case \"top\":\n          return Math.max(limit, parentLimit);\n        case \"left\":\n          return Math.max(limit, parentLimit);\n        case \"bottom\":\n          return Math.min(limit, parentLimit);\n        case \"right\":\n          return Math.min(limit, parentLimit);\n        default:\n          Asserts.fail(\"Should be unreachable\");\n      }\n    }\n    return limit;\n  }\n\n  private getLimitValueInner(\n    logicalSide: string,\n    logicalSide2: string | null,\n    layoutContext: Vtree.LayoutContext,\n    clientLayout: Vtree.ClientLayout,\n    condition?: (p1: PageFloatFragment, p2: PageFloatLayoutContext) => boolean,\n  ): number {\n    Asserts.assert(this.container);\n    const limits = this.getLimitValuesInner(\n      layoutContext,\n      clientLayout,\n      condition,\n      logicalSide,\n      logicalSide2,\n    );\n    switch (logicalSide) {\n      case \"block-start\":\n        return this.container.vertical ? limits.right : limits.top;\n      case \"block-end\":\n        return this.container.vertical ? limits.left : limits.bottom;\n      case \"inline-start\":\n        return this.container.vertical\n          ? this.container.rtl\n            ? limits.bottom\n            : limits.top\n          : this.container.rtl\n            ? limits.right\n            : limits.left;\n      case \"inline-end\":\n        return this.container.vertical\n          ? this.container.rtl\n            ? limits.top\n            : limits.bottom\n          : this.container.rtl\n            ? limits.left\n            : limits.right;\n      default:\n        throw new Error(`Unknown logical side: ${logicalSide}`);\n    }\n  }\n\n  private getLimitValuesInner(\n    layoutContext: Vtree.LayoutContext,\n    clientLayout: Vtree.ClientLayout,\n    condition?: (p1: PageFloatFragment, p2: PageFloatLayoutContext) => boolean,\n    logicalSide?: string,\n    logicalSide2?: string,\n  ): {\n    top: number;\n    left: number;\n    bottom: number;\n    right: number;\n    floatMinWrapBlockStart: number;\n    floatMinWrapBlockEnd: number;\n  } {\n    Asserts.assert(this.container);\n    const offsetX = this.container.originX;\n    const offsetY = this.container.originY;\n    const paddingRect = this.container.getPaddingRect();\n    let limits = {\n      top: paddingRect.y1 - offsetY,\n      left: paddingRect.x1 - offsetX,\n      bottom: paddingRect.y2 - offsetY,\n      right: paddingRect.x2 - offsetX,\n      floatMinWrapBlockStart: 0,\n      floatMinWrapBlockEnd: 0,\n    };\n\n    function resolveLengthPercentage(numeric, viewNode, containerLength) {\n      if (numeric.unit === \"%\") {\n        return (containerLength * numeric.num) / 100;\n      } else {\n        return layoutContext.convertLengthToPx(numeric, viewNode, clientLayout);\n      }\n    }\n    const fragments = this.floatFragments;\n    if (fragments.length > 0) {\n      limits = fragments.reduce((l, f) => {\n        if (condition && !condition(f, this)) {\n          return l;\n        }\n        const [logicalFloatSide, logicalFloatSide2] = this.toLogicalFloatSides(\n          f.floatSide,\n        );\n        if (\n          logicalFloatSide2 &&\n          ((logicalSide &&\n            logicalFloatSide2.includes(\"block\") ===\n              logicalSide.includes(\"block\") &&\n            logicalFloatSide2 !== logicalSide) ||\n            (logicalSide2 &&\n              logicalFloatSide2.includes(\"block\") ===\n                logicalSide2.includes(\"block\") &&\n              logicalFloatSide2 !== logicalSide2))\n        ) {\n          // Preceding page floats on the opposite side should not affect\n          // the positioning limit. (Issue #1549)\n          return l;\n        }\n        const area = f.area;\n        const floatMinWrapBlock = f.continuations[0].float.floatMinWrapBlock;\n        let top = l.top;\n        let left = l.left;\n        let bottom = l.bottom;\n        let right = l.right;\n        let floatMinWrapBlockStart = l.floatMinWrapBlockStart;\n        let floatMinWrapBlockEnd = l.floatMinWrapBlockEnd;\n        switch (logicalFloatSide) {\n          case \"inline-start\":\n            if (area.vertical) {\n              top = Math.max(top, area.top + area.height);\n            } else {\n              left = Math.max(left, area.left + area.width);\n            }\n            break;\n          case \"block-start\":\n            if (area.vertical) {\n              if (floatMinWrapBlock && area.left < right) {\n                floatMinWrapBlockStart = resolveLengthPercentage(\n                  floatMinWrapBlock,\n                  (area as any).rootViewNodes[0],\n                  paddingRect.x2 - paddingRect.x1,\n                ) as number;\n              }\n              right = Math.min(right, area.left);\n            } else {\n              if (floatMinWrapBlock && area.top + area.height > top) {\n                floatMinWrapBlockStart = resolveLengthPercentage(\n                  floatMinWrapBlock,\n                  (area as any).rootViewNodes[0],\n                  paddingRect.y2 - paddingRect.y1,\n                ) as number;\n              }\n              top = Math.max(top, area.top + area.height);\n            }\n            break;\n          case \"inline-end\":\n            if (area.vertical) {\n              bottom = Math.min(bottom, area.top);\n            } else {\n              right = Math.min(right, area.left);\n            }\n            break;\n          case \"block-end\":\n            if (area.vertical) {\n              if (floatMinWrapBlock && area.left + area.width > left) {\n                floatMinWrapBlockEnd = resolveLengthPercentage(\n                  floatMinWrapBlock,\n                  (area as any).rootViewNodes[0],\n                  paddingRect.x2 - paddingRect.x1,\n                ) as number;\n              }\n              left = Math.max(left, area.left + area.width);\n            } else {\n              if (floatMinWrapBlock && area.top < bottom) {\n                floatMinWrapBlockEnd = resolveLengthPercentage(\n                  floatMinWrapBlock,\n                  (area as any).rootViewNodes[0],\n                  paddingRect.y2 - paddingRect.y1,\n                ) as number;\n              }\n              bottom = Math.min(bottom, area.top);\n            }\n            break;\n          default:\n            throw new Error(`Unknown logical float side: ${logicalFloatSide}`);\n        }\n        return {\n          top,\n          left,\n          bottom,\n          right,\n          floatMinWrapBlockStart,\n          floatMinWrapBlockEnd,\n        };\n      }, limits);\n    }\n    limits.left += offsetX;\n    limits.right += offsetX;\n    limits.top += offsetY;\n    limits.bottom += offsetY;\n    return limits;\n  }\n\n  /**\n   * @param anchorEdge Null indicates that the anchor is not in the current\n   *     container.\n   * @return Logical float side (snap-block is resolved when init=false). Null\n   *     indicates that the float area does not fit inside the container\n   */\n  setFloatAreaDimensions(\n    area: LayoutType.PageFloatArea,\n    floatReference: FloatReference,\n    floatSide: string,\n    anchorEdge: number | null,\n    init: boolean,\n    force: boolean,\n    condition: PageFloatPlacementCondition,\n  ): string | null {\n    if (floatReference !== this.floatReference) {\n      const parent = this.getParent(floatReference);\n      return parent.setFloatAreaDimensions(\n        area,\n        floatReference,\n        floatSide,\n        anchorEdge,\n        init,\n        force,\n        condition,\n      );\n    }\n    const logicalFloatSides = this.toLogicalFloatSides(floatSide);\n    if (logicalFloatSides[0] === \"snap-block\") {\n      if (!condition[\"block-start\"] && !condition[\"block-end\"]) {\n        return null;\n      }\n    } else if (logicalFloatSides[0].includes(\"block\")) {\n      if (!condition[logicalFloatSides[0]]) {\n        return null;\n      }\n    }\n    Asserts.assert(area.clientLayout);\n\n    // Preceding page floats on the opposite side should not affect\n    // the positioning limit unless clear:inline-start/end is specified.\n    // (Issue #1549, #1550)\n    const inlineSideForBlockLimit = logicalFloatSides.find(\n      (s) =>\n        s.includes(\"inline\") &&\n        condition[s === \"inline-start\" ? \"inline-end\" : \"inline-start\"],\n    );\n    const blockSideForInlineLimit = logicalFloatSides.find((s) =>\n      s.includes(\"block\"),\n    );\n\n    let blockStart = this.getLimitValue(\n      \"block-start\",\n      inlineSideForBlockLimit,\n      area.layoutContext,\n      area.clientLayout,\n    );\n    let blockEnd = this.getLimitValue(\n      \"block-end\",\n      inlineSideForBlockLimit,\n      area.layoutContext,\n      area.clientLayout,\n    );\n    let inlineStart = this.getLimitValue(\n      \"inline-start\",\n      blockSideForInlineLimit,\n      area.layoutContext,\n      area.clientLayout,\n    );\n    let inlineEnd = this.getLimitValue(\n      \"inline-end\",\n      blockSideForInlineLimit,\n      area.layoutContext,\n      area.clientLayout,\n    );\n    const blockOffset = area.vertical ? area.originX : area.originY;\n    const inlineOffset = area.vertical ? area.originY : area.originX;\n    blockStart = area.vertical\n      ? Math.min(\n          blockStart,\n          area.left +\n            area.getInsetLeft() +\n            area.width +\n            area.getInsetRight() +\n            blockOffset,\n        )\n      : Math.max(blockStart, area.top + blockOffset);\n    blockEnd = area.vertical\n      ? Math.max(blockEnd, area.left + blockOffset)\n      : Math.min(\n          blockEnd,\n          area.top +\n            area.getInsetTop() +\n            area.height +\n            area.getInsetBottom() +\n            blockOffset,\n        );\n\n    function limitBlockStartEndValueWithOpenRect(getRect, rect) {\n      let openRect = getRect(area.bands, rect);\n      if (openRect) {\n        if (area.vertical) {\n          openRect = GeometryUtil.unrotateBox(openRect);\n        }\n        blockStart = area.vertical\n          ? Math.min(blockStart, openRect.x2)\n          : Math.max(blockStart, openRect.y1);\n        blockEnd = area.vertical\n          ? Math.max(blockEnd, openRect.x1)\n          : Math.min(blockEnd, openRect.y2);\n        return true;\n      } else {\n        return force;\n      }\n    }\n    let blockSize: number;\n    let inlineSize: number;\n    let outerBlockSize: number;\n    let outerInlineSize: number;\n    if (init) {\n      const rect = area.vertical\n        ? GeometryUtil.rotateBox(\n            new GeometryUtil.Rect(blockEnd, inlineStart, blockStart, inlineEnd),\n          )\n        : new GeometryUtil.Rect(inlineStart, blockStart, inlineEnd, blockEnd);\n      if (\n        logicalFloatSides[0] === \"block-start\" ||\n        logicalFloatSides[0] === \"snap-block\" ||\n        logicalFloatSides[0] === \"inline-start\" ||\n        logicalFloatSides[0] === \"snap-inline\"\n      ) {\n        if (\n          !limitBlockStartEndValueWithOpenRect(\n            GeometryUtil.findUppermostFullyOpenRect,\n            rect,\n          )\n        ) {\n          return null;\n        }\n      }\n      if (\n        logicalFloatSides[0] === \"block-end\" ||\n        logicalFloatSides[0] === \"snap-block\" ||\n        logicalFloatSides[0] === \"inline-end\" ||\n        logicalFloatSides[0] === \"snap-inline\"\n      ) {\n        if (\n          !limitBlockStartEndValueWithOpenRect(\n            GeometryUtil.findBottommostFullyOpenRect,\n            rect,\n          )\n        ) {\n          return null;\n        }\n      }\n      outerBlockSize = (blockEnd - blockStart) * area.getBoxDir();\n      blockSize = outerBlockSize - area.getInsetBefore() - area.getInsetAfter();\n      outerInlineSize = (inlineEnd - inlineStart) * area.getInlineDir();\n      inlineSize = outerInlineSize - area.getInsetStart() - area.getInsetEnd();\n      if (!force && (blockSize <= 0 || inlineSize <= 0)) {\n        return null;\n      }\n    } else {\n      blockSize = area.computedBlockSize;\n      outerBlockSize = blockSize + area.getInsetBefore() + area.getInsetAfter();\n      const availableBlockSize = (blockEnd - blockStart) * area.getBoxDir();\n      if (logicalFloatSides[0] === \"snap-block\") {\n        if (anchorEdge === null) {\n          // Deferred from previous container\n          logicalFloatSides[0] = \"block-start\";\n        } else {\n          const containerRect = this.container.getPaddingRect();\n          const fromStart =\n            this.container.getBoxDir() *\n            (anchorEdge -\n              (this.container.vertical ? containerRect.x2 : containerRect.y1));\n          const fromEnd =\n            this.container.getBoxDir() *\n            ((this.container.vertical ? containerRect.x1 : containerRect.y2) -\n              anchorEdge -\n              outerBlockSize);\n          if (fromStart <= fromEnd) {\n            logicalFloatSides[0] = \"block-start\";\n          } else {\n            logicalFloatSides[0] = \"block-end\";\n          }\n        }\n        if (!condition[logicalFloatSides[0]]) {\n          if (condition[\"block-end\"]) {\n            logicalFloatSides[0] = \"block-end\";\n          } else {\n            return null;\n          }\n        }\n      } else if (logicalFloatSides[0] === \"snap-inline\") {\n        if (anchorEdge === null) {\n          // Deferred from previous container\n          logicalFloatSides[0] = \"inline-start\";\n        } else {\n          // FIXME: snap-inline should be resolved based on the anchor's inline position\n          if (condition[\"inline-start\"]) {\n            logicalFloatSides[0] = \"inline-start\";\n          } else if (condition[\"inline-end\"]) {\n            logicalFloatSides[0] = \"inline-end\";\n          } else {\n            return null;\n          }\n        }\n      }\n      if (!force && availableBlockSize < outerBlockSize) {\n        return null;\n      }\n      if (\n        logicalFloatSides[0] === \"inline-start\" ||\n        logicalFloatSides[0] === \"inline-end\" ||\n        logicalFloatSides[1]\n      ) {\n        // If the page float is \"inline-start\" or \"inline-end\" or has two sides\n        // (e.g. \"block-start inline-end\"), the inline size is determined by the content size.\n        inlineSize = Sizing.getSize(area.clientLayout, area.element, [\n          Sizing.Size.FIT_CONTENT_INLINE_SIZE,\n        ])[Sizing.Size.FIT_CONTENT_INLINE_SIZE];\n      } else if (area.adjustContentRelativeSize) {\n        inlineSize = area.getContentInlineSize();\n      } else {\n        inlineSize = area.vertical ? area.height : area.width;\n      }\n      outerInlineSize = inlineSize + area.getInsetStart() + area.getInsetEnd();\n      const availableInlineSize =\n        (inlineEnd - inlineStart) * area.getInlineDir();\n      if (!force && availableInlineSize < outerInlineSize) {\n        return null;\n      }\n    }\n    blockStart -= blockOffset;\n    blockEnd -= blockOffset;\n    inlineStart -= inlineOffset;\n    inlineEnd -= inlineOffset;\n\n    if (\n      logicalFloatSides.some(\n        (s) => s === \"inline-start\" || s === \"snap-inline\",\n      ) ||\n      (logicalFloatSides.length === 1 &&\n        (logicalFloatSides[0] === \"block-start\" ||\n          logicalFloatSides[0] === \"snap-block\"))\n    ) {\n      area.setInlinePosition(inlineStart, inlineSize);\n    } else if (\n      logicalFloatSides.some((s) => s === \"inline-end\") ||\n      (logicalFloatSides.length === 1 && logicalFloatSides[0] === \"block-end\")\n    ) {\n      area.setInlinePosition(\n        inlineEnd - outerInlineSize * area.getInlineDir(),\n        inlineSize,\n      );\n    }\n    if (\n      logicalFloatSides.some(\n        (s) => s === \"block-start\" || s === \"snap-block\",\n      ) ||\n      (logicalFloatSides.length === 1 &&\n        (logicalFloatSides[0] === \"inline-start\" ||\n          logicalFloatSides[0] === \"snap-inline\"))\n    ) {\n      area.setBlockPosition(blockStart, blockSize);\n    } else if (\n      logicalFloatSides.some((s) => s === \"block-end\") ||\n      (logicalFloatSides.length === 1 && logicalFloatSides[0] === \"inline-end\")\n    ) {\n      area.setBlockPosition(\n        blockEnd - outerBlockSize * area.getBoxDir(),\n        blockSize,\n      );\n    }\n\n    return logicalFloatSides.join(\" \");\n  }\n\n  getFloatFragmentExclusions(): GeometryUtil.Shape[] {\n    const result = this.floatFragments.map((fragment) =>\n      fragment.getOuterShape(),\n    );\n    if (this.parent) {\n      return this.parent.getFloatFragmentExclusions().concat(result);\n    } else {\n      return result;\n    }\n  }\n\n  private reattachFloatFragments() {\n    const parent = this.container.element && this.container.element.parentNode;\n    if (parent) {\n      this.floatFragments.forEach((fragment) => {\n        parent.appendChild(fragment.area.element);\n      });\n    }\n  }\n\n  getMaxReachedAfterEdge(): number {\n    const isVertical = this.getContainer().vertical;\n    return this.floatFragments.reduce(\n      (edge, fragment) => {\n        const rect = fragment.getOuterRect();\n        if (isVertical) {\n          return Math.min(edge, rect.x1);\n        } else {\n          return Math.max(edge, rect.y2);\n        }\n      },\n      isVertical ? Infinity : 0,\n    );\n  }\n\n  getBlockStartEdgeOfBlockEndFloats(): number {\n    const isVertical = this.getContainer().vertical;\n    return this.floatFragments\n      .filter((fragment) => fragment.floatSide === \"block-end\")\n      .reduce(\n        (edge, fragment) => {\n          const rect = fragment.getOuterRect();\n          if (isVertical) {\n            return Math.max(edge, rect.x2);\n          } else {\n            return Math.min(edge, rect.y1);\n          }\n        },\n        isVertical ? 0 : Infinity,\n      );\n  }\n\n  getPageFloatClearEdge(clear: string, column: LayoutType.Column): number {\n    function isContinuationOfAlreadyAppearedFloat(\n      context: PageFloatLayoutContext,\n    ) {\n      return (continuation: PageFloatContinuation) =>\n        context.isAnchorAlreadyAppeared(continuation.float.getId());\n    }\n\n    function isFragmentWithAlreadyAppearedFloat(\n      fragment: PageFloatFragment,\n      context: PageFloatLayoutContext,\n    ) {\n      if (\n        (clear === \"inline-start\" &&\n          (fragment.floatSide.includes(\"inline-end\") ||\n            fragment.floatSide === \"block-end\")) ||\n        (clear === \"inline-end\" &&\n          (fragment.floatSide.includes(\"inline-start\") ||\n            fragment.floatSide === \"block-start\"))\n      ) {\n        // Clear page-floats by clear:inline-start/end on non-page-float elements.\n        // (Issue #1550)\n        return false;\n      }\n      return fragment.continuations.some(\n        isContinuationOfAlreadyAppearedFloat(context),\n      );\n    }\n    const columnRect = column.getPaddingRect();\n    const columnBlockEnd = column.vertical ? columnRect.x1 : columnRect.y2;\n    let context: PageFloatLayoutContext = this;\n    while (context) {\n      if (\n        context.floatsDeferredToNext.some(\n          isContinuationOfAlreadyAppearedFloat(context),\n        )\n      ) {\n        return columnBlockEnd;\n      }\n      context = context.parent;\n    }\n\n    function hasFragmentWithAlreadyAppearedFloat(\n      context: PageFloatLayoutContext,\n    ) {\n      return (\n        context.floatFragments.some((fragment) =>\n          isFragmentWithAlreadyAppearedFloat(fragment, context),\n        ) ||\n        context.children.some((child) =>\n          hasFragmentWithAlreadyAppearedFloat(child),\n        )\n      );\n    }\n\n    // Support clear:column/region/page for page floats. (Issue #1551)\n    if (clear === \"column\" || clear === \"region\" || clear === \"page\") {\n      for (context = this; context; context = context.parent) {\n        if (context.floatReference === clear) {\n          if (hasFragmentWithAlreadyAppearedFloat(context)) {\n            return columnBlockEnd;\n          }\n          break;\n        }\n      }\n    }\n\n    Asserts.assert(column.clientLayout);\n    const blockStartLimit = this.getLimitValue(\n      \"block-start\",\n      null,\n      column.layoutContext,\n      column.clientLayout,\n      isFragmentWithAlreadyAppearedFloat,\n    );\n    const blockEndLimit = this.getLimitValue(\n      \"block-end\",\n      null,\n      column.layoutContext,\n      column.clientLayout,\n      isFragmentWithAlreadyAppearedFloat,\n    );\n    if (\n      blockEndLimit * column.getBoxDir() <\n      columnBlockEnd * column.getBoxDir()\n    ) {\n      return columnBlockEnd;\n    } else {\n      return blockStartLimit;\n    }\n  }\n\n  getPageFloatPlacementCondition(\n    float: PageFloat,\n    floatSide: string,\n    clearSide: string | null,\n  ): PageFloatPlacementCondition {\n    if (float.floatReference !== this.floatReference) {\n      const parent = this.getParent(float.floatReference);\n      return parent.getPageFloatPlacementCondition(float, floatSide, clearSide);\n    }\n    const result: PageFloatPlacementCondition = {\n      \"block-start\": true,\n      \"block-end\": true,\n      \"inline-start\": true,\n      \"inline-end\": true,\n    };\n    if (!clearSide) {\n      return result;\n    }\n    const logicalFloatSide = this.toLogicalFloatSides(floatSide)[0];\n    const logicalClearSide = this.toLogical(clearSide);\n    let logicalSides: string[];\n    if (logicalClearSide === \"all\") {\n      logicalSides = [\"block-start\", \"block-end\", \"inline-start\", \"inline-end\"];\n    } else if (logicalClearSide === \"both\") {\n      logicalSides = [\"inline-start\", \"inline-end\"];\n    } else if (logicalClearSide === \"same\") {\n      if (logicalFloatSide === \"snap-block\") {\n        logicalSides = [\"block-start\", \"block-end\"];\n      } else {\n        logicalSides = [logicalFloatSide];\n      }\n    } else {\n      logicalSides = [logicalClearSide];\n    }\n    const floatOrder = float.getOrder();\n\n    function isPrecedingFragment(\n      side: string | null,\n    ): (p1: PageFloatFragment) => boolean {\n      return (fragment) =>\n        (!side || fragment.floatSide.includes(side)) &&\n        fragment.getOrder() < floatOrder;\n    }\n\n    function hasPrecedingFragmentInChildren(\n      context: PageFloatLayoutContext,\n      side: string | null,\n    ): boolean {\n      return context.children.some(\n        (child) =>\n          child.floatFragments.some(isPrecedingFragment(side)) ||\n          hasPrecedingFragmentInChildren(child, side),\n      );\n    }\n\n    function hasPrecedingFragmentInParents(\n      context: PageFloatLayoutContext,\n      side: string | null,\n    ): boolean {\n      const parent = context.parent;\n      return (\n        !!parent &&\n        (parent.floatFragments.some(isPrecedingFragment(side)) ||\n          hasPrecedingFragmentInParents(parent, side))\n      );\n    }\n\n    // Support clear:column/region/page for page floats. (Issue #1551)\n    if (\n      clearSide === \"column\" ||\n      clearSide === \"region\" ||\n      clearSide === \"page\"\n    ) {\n      for (\n        let context: PageFloatLayoutContext = this;\n        context;\n        context = context.parent\n      ) {\n        if (context.floatReference === clearSide) {\n          if (\n            context.floatFragments.some(isPrecedingFragment(null)) ||\n            hasPrecedingFragmentInChildren(context, null)\n          ) {\n            result[\"block-start\"] = false;\n            result[\"block-end\"] = false;\n            result[\"inline-start\"] = false;\n            result[\"inline-end\"] = false;\n          }\n          break;\n        }\n      }\n      return result;\n    }\n\n    logicalSides.forEach((side) => {\n      switch (side) {\n        case \"block-start\":\n          result[side] = !hasPrecedingFragmentInChildren(this, side);\n          break;\n        case \"block-end\":\n          result[side] = !hasPrecedingFragmentInParents(this, side);\n          break;\n        case \"inline-start\":\n        case \"inline-end\":\n          // Support clear:inline-start/end for page floats. (Issue #1550)\n          result[side] = !this.floatFragments.some(isPrecedingFragment(side));\n          break;\n        default:\n          throw new Error(`Unexpected side: ${side}`);\n      }\n    });\n    return result;\n  }\n\n  getLayoutConstraints(): LayoutType.LayoutConstraint[] {\n    const constraints = this.parent ? this.parent.getLayoutConstraints() : [];\n    return constraints.concat(this.layoutConstraints);\n  }\n\n  addLayoutConstraint(\n    layoutConstraint: LayoutType.LayoutConstraint,\n    floatReference: FloatReference,\n  ) {\n    if (floatReference === this.floatReference) {\n      this.layoutConstraints.push(layoutConstraint);\n    } else {\n      this.getParent(floatReference).addLayoutConstraint(\n        layoutConstraint,\n        floatReference,\n      );\n    }\n  }\n\n  isColumnFullWithPageFloats(column: LayoutType.Column): boolean {\n    const layoutContext = column.layoutContext;\n    const clientLayout = column.clientLayout;\n    Asserts.assert(clientLayout);\n    let context: PageFloatLayoutContext = this;\n    let limits: {\n      top: number;\n      left: number;\n      bottom: number;\n      right: number;\n      floatMinWrapBlockStart: number;\n      floatMinWrapBlockEnd: number;\n    } = null;\n    while (context && context.container) {\n      const l = context.getLimitValuesInner(layoutContext, clientLayout);\n      if (limits) {\n        if (column.vertical) {\n          if (l.right < limits.right) {\n            limits.right = l.right;\n            limits.floatMinWrapBlockStart = l.floatMinWrapBlockStart;\n          }\n          if (l.left > limits.left) {\n            limits.left = l.left;\n            limits.floatMinWrapBlockEnd = l.floatMinWrapBlockEnd;\n          }\n        } else {\n          if (l.top > limits.top) {\n            limits.top = l.top;\n            limits.floatMinWrapBlockStart = l.floatMinWrapBlockStart;\n          }\n          if (l.bottom < limits.bottom) {\n            limits.bottom = l.bottom;\n            limits.floatMinWrapBlockEnd = l.floatMinWrapBlockEnd;\n          }\n        }\n      } else {\n        limits = l;\n      }\n      context = context.parent;\n    }\n    const floatMinWrapBlock = Math.max(\n      limits.floatMinWrapBlockStart,\n      limits.floatMinWrapBlockEnd,\n    );\n    const blockSpace = column.vertical\n      ? limits.right - limits.left\n      : limits.bottom - limits.top;\n    return blockSpace <= floatMinWrapBlock;\n  }\n\n  getMaxBlockSizeOfPageFloats(): number {\n    const isVertical = this.getContainer().vertical;\n    if (!this.floatFragments.length) {\n      return 0;\n    }\n    return Math.max.apply(\n      null,\n      this.floatFragments.map((fragment) => {\n        const area = fragment.area;\n        if (isVertical) {\n          return area.width;\n        } else {\n          return area.height;\n        }\n      }),\n    );\n  }\n\n  lock() {\n    this.locked = true;\n  }\n\n  unlock() {\n    this.locked = false;\n  }\n\n  isLocked(): boolean {\n    return this.locked;\n  }\n}\n\nexport interface PageFloatLayoutStrategy\n  extends PageFloats.PageFloatLayoutStrategy {}\n\nconst pageFloatLayoutStrategies: PageFloatLayoutStrategy[] = [];\n\nexport class PageFloatLayoutStrategyResolver {\n  static register(strategy: PageFloatLayoutStrategy) {\n    pageFloatLayoutStrategies.push(strategy);\n  }\n\n  findByNodeContext(nodeContext: Vtree.NodeContext): PageFloatLayoutStrategy {\n    for (let i = pageFloatLayoutStrategies.length - 1; i >= 0; i--) {\n      const strategy = pageFloatLayoutStrategies[i];\n      if (strategy.appliesToNodeContext(nodeContext)) {\n        return strategy;\n      }\n    }\n    throw new Error(`No PageFloatLayoutStrategy found for ${nodeContext}`);\n  }\n\n  findByFloat(float: PageFloat): PageFloatLayoutStrategy {\n    for (let i = pageFloatLayoutStrategies.length - 1; i >= 0; i--) {\n      const strategy = pageFloatLayoutStrategies[i];\n      if (strategy.appliesToFloat(float)) {\n        return strategy;\n      }\n    }\n    throw new Error(`No PageFloatLayoutStrategy found for ${float}`);\n  }\n}\n\nexport class NormalPageFloatLayoutStrategy implements PageFloatLayoutStrategy {\n  /** @override */\n  appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean {\n    return isPageFloat(nodeContext.floatReference);\n  }\n\n  /** @override */\n  appliesToFloat(float: PageFloat): boolean {\n    return true;\n  }\n\n  /** @override */\n  createPageFloat(\n    nodeContext: Vtree.NodeContext,\n    pageFloatLayoutContext: PageFloatLayoutContext,\n    column: LayoutType.Column,\n  ): Task.Result<PageFloat> {\n    let floatReference = nodeContext.floatReference;\n    Asserts.assert(nodeContext.floatSide);\n    const floatSide: string = nodeContext.floatSide;\n    const nodePosition = nodeContext.toNodePosition();\n    return column\n      .resolveFloatReferenceFromColumnSpan(\n        floatReference,\n        nodeContext.columnSpan,\n        nodeContext,\n      )\n      .thenAsync((ref) => {\n        floatReference = ref;\n        Asserts.assert(pageFloatLayoutContext.flowName);\n        const float = new PageFloat(\n          nodePosition,\n          floatReference,\n          floatSide,\n          nodeContext.clearSide,\n          pageFloatLayoutContext.flowName,\n          nodeContext.floatMinWrapBlock,\n        );\n        pageFloatLayoutContext.addPageFloat(float);\n        return Task.newResult(float);\n      });\n  }\n\n  /** @override */\n  createPageFloatFragment(\n    continuations: PageFloatContinuation[],\n    floatSide: string,\n    clearSide: string | null,\n    floatArea: LayoutType.PageFloatArea,\n    continues: boolean,\n  ): PageFloatFragment {\n    const f = continuations[0].float;\n    return new PageFloatFragment(\n      f.floatReference,\n      floatSide,\n      clearSide,\n      continuations,\n      floatArea,\n      continues,\n    );\n  }\n\n  /** @override */\n  findPageFloatFragment(\n    float: PageFloat,\n    pageFloatLayoutContext: PageFloatLayoutContext,\n  ): PageFloatFragment | null {\n    return pageFloatLayoutContext.findPageFloatFragment(float);\n  }\n\n  /** @override */\n  adjustPageFloatArea(\n    floatArea: LayoutType.PageFloatArea,\n    floatContainer: Vtree.Container,\n    column: LayoutType.Column,\n  ) {}\n\n  /** @override */\n  forbid(float: PageFloat, pageFloatLayoutContext: PageFloatLayoutContext) {}\n}\n\nPageFloatLayoutStrategyResolver.register(new NormalPageFloatLayoutStrategy());\n","/**\n * Copyright 2017 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Footnotes\n */\nimport * as Asserts from \"./asserts\";\nimport * as Css from \"./css\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Task from \"./task\";\nimport * as Vtree from \"./vtree\";\nimport { Layout } from \"./types\";\n\nconst PageFloatFragment = PageFloats.PageFloatFragment;\n\nexport class Footnote extends PageFloats.PageFloat {\n  constructor(\n    nodePosition: Vtree.NodePosition,\n    floatReference: PageFloats.FloatReference,\n    flowName: string,\n    public readonly footnotePolicy: Css.Ident | null,\n    floatMinWrapBlock: Css.Numeric | null,\n  ) {\n    super(\n      nodePosition,\n      floatReference,\n      \"block-end\",\n      null,\n      flowName,\n      floatMinWrapBlock,\n    );\n  }\n\n  override isAllowedToPrecede(other: PageFloats.PageFloat): boolean {\n    return !(other instanceof Footnote);\n  }\n}\n\n/**\n * @extends PageFloatFragment\n */\nexport class FootnoteFragment extends PageFloatFragment {\n  constructor(\n    floatReference: PageFloats.FloatReference,\n    continuations: PageFloats.PageFloatContinuation[],\n    area: Vtree.Container,\n    continues: boolean,\n  ) {\n    super(floatReference, \"block-end\", null, continuations, area, continues);\n  }\n\n  override getOrder(): number {\n    return Infinity;\n  }\n\n  override shouldBeStashedBefore(float: PageFloats.PageFloat): boolean {\n    if (float instanceof Footnote) {\n      return true;\n    } else {\n      return this.getOrder() < float.getOrder();\n    }\n  }\n}\n\nexport class LineFootnotePolicyLayoutConstraint\n  implements Layout.LayoutConstraint\n{\n  constructor(public readonly footnote: Footnote) {}\n\n  allowLayout(nodeContext: Vtree.NodeContext): boolean {\n    const nodePosition = nodeContext.toNodePosition();\n    return !Vtree.isSameNodePosition(nodePosition, this.footnote.nodePosition);\n  }\n}\n\nexport class FootnoteLayoutStrategy\n  implements PageFloats.PageFloatLayoutStrategy\n{\n  /** @override */\n  appliesToNodeContext(nodeContext: Vtree.NodeContext): boolean {\n    return nodeContext.floatSide === \"footnote\";\n  }\n\n  /** @override */\n  appliesToFloat(float: PageFloats.PageFloat): boolean {\n    return float instanceof Footnote;\n  }\n\n  /** @override */\n  createPageFloat(\n    nodeContext: Vtree.NodeContext,\n    pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    column: Layout.Column,\n  ): Task.Result<PageFloats.PageFloat> {\n    let floatReference = PageFloats.FloatReference.REGION;\n\n    // If the region context has the same container as the page context,\n    // use the page context as the context for the footnote.\n    const regionContext =\n      pageFloatLayoutContext.getPageFloatLayoutContext(floatReference);\n    const pageContext = pageFloatLayoutContext.getPageFloatLayoutContext(\n      PageFloats.FloatReference.PAGE,\n    );\n    if (pageContext.hasSameContainerAs(regionContext)) {\n      floatReference = PageFloats.FloatReference.PAGE;\n    }\n    const nodePosition = nodeContext.toNodePosition();\n    Asserts.assert(pageFloatLayoutContext.flowName);\n    const float: PageFloats.PageFloat = new Footnote(\n      nodePosition,\n      floatReference,\n      pageFloatLayoutContext.flowName,\n      nodeContext.footnotePolicy,\n      nodeContext.floatMinWrapBlock,\n    );\n    pageFloatLayoutContext.addPageFloat(float);\n    return Task.newResult(float);\n  }\n\n  /** @override */\n  createPageFloatFragment(\n    continuations: PageFloats.PageFloatContinuation[],\n    floatSide: string,\n    clearSide: string | null,\n    floatArea: Layout.PageFloatArea,\n    continues: boolean,\n  ): PageFloats.PageFloatFragment {\n    const f = continuations[0].float;\n    return new FootnoteFragment(\n      f.floatReference,\n      continuations,\n      floatArea,\n      continues,\n    );\n  }\n\n  /** @override */\n  findPageFloatFragment(\n    float: PageFloats.PageFloat,\n    pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  ): PageFloats.PageFloatFragment | null {\n    const context = pageFloatLayoutContext.getPageFloatLayoutContext(\n      float.floatReference,\n    );\n    const fragments = context.floatFragments.filter(\n      (fr) => fr instanceof FootnoteFragment,\n    );\n    Asserts.assert(fragments.length <= 1);\n    return fragments[0] || null;\n  }\n\n  /** @override */\n  adjustPageFloatArea(\n    floatArea: Layout.PageFloatArea,\n    floatContainer: Vtree.Container,\n    column: Layout.Column,\n  ) {\n    floatArea.isFootnote = true;\n    floatArea.adjustContentRelativeSize = false;\n    const element = floatArea.element;\n    Asserts.assert(element);\n    floatArea.vertical = column.layoutContext.applyFootnoteStyle(\n      floatContainer.vertical,\n      (column.layoutContext as any).nodeContext &&\n        (column.layoutContext as any).nodeContext.direction === \"rtl\",\n      element,\n    );\n    floatArea.convertPercentageSizesToPx(element);\n    column.setComputedInsets(element, floatArea);\n    column.setComputedWidthAndHeight(element, floatArea);\n  }\n\n  /** @override */\n  forbid(\n    float: PageFloats.PageFloat,\n    pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  ) {\n    const footnote = float as Footnote;\n    switch (footnote.footnotePolicy) {\n      case Css.ident.line: {\n        const constraint = new LineFootnotePolicyLayoutConstraint(footnote);\n        pageFloatLayoutContext.addLayoutConstraint(\n          constraint,\n          footnote.floatReference,\n        );\n        break;\n      }\n    }\n  }\n}\n\nPageFloats.PageFloatLayoutStrategyResolver.register(\n  new FootnoteLayoutStrategy(),\n);\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Display - CSS Display Module\n */\nimport * as Css from \"./css\";\n\nexport const FLOW_ROOT_ATTR = \"data-vivliostyle-flow-root\";\n\nexport function isFlowRoot(element: Element): boolean {\n  return element.getAttribute(FLOW_ROOT_ATTR) === \"true\";\n}\n\n/**\n * 'Blockify' a display value.\n * cf. https://drafts.csswg.org/css-display/#transformations\n *     https://drafts.csswg.org/css2/visuren.html#dis-pos-flo\n */\nexport function blockify(display: Css.Ident): Css.Ident {\n  const displayStr = display?.toString() || \"block\";\n  let blockifiedStr: string;\n  switch (displayStr) {\n    case \"inline-flex\":\n      blockifiedStr = \"flex\";\n      break;\n    case \"inline-grid\":\n      blockifiedStr = \"grid\";\n      break;\n    case \"inline-table\":\n      blockifiedStr = \"table\";\n      break;\n    case \"inline\":\n    case \"table-row-group\":\n    case \"table-column\":\n    case \"table-column-group\":\n    case \"table-header-group\":\n    case \"table-footer-group\":\n    case \"table-row\":\n    case \"table-cell\":\n    case \"table-caption\":\n    case \"inline-block\":\n      blockifiedStr = \"block\";\n      break;\n    default:\n      blockifiedStr = displayStr;\n  }\n  return Css.getName(blockifiedStr);\n}\n\n/**\n * Judge if the generated box is absolutely positioned.\n */\nexport function isAbsolutelyPositioned(position: Css.Val): boolean {\n  return position === Css.ident.absolute || position === Css.ident.fixed;\n}\n\n/**\n * Check if the position value is 'running()'.\n * https://drafts.csswg.org/css-gcpm/#running-elements\n */\nexport function isRunning(position: Css.Val): boolean {\n  return position instanceof Css.Func && position.name === \"running\";\n}\n\n/**\n * Get computed values of display, position and float.\n * cf. https://drafts.csswg.org/css-display/#transformations\n *     https://drafts.csswg.org/css2/visuren.html#dis-pos-flo\n */\nexport function getComputedDisplayValue(\n  display: Css.Ident,\n  position: Css.Ident,\n  float: Css.Val,\n  isRoot: boolean,\n): { display: Css.Ident; position: Css.Ident; float: Css.Val } {\n  if (display === Css.ident.none) {\n    // no need to convert values when 'display' is 'none'\n  } else if (isAbsolutelyPositioned(position)) {\n    float = Css.ident.none;\n    display = blockify(display);\n  } else if (\n    (float && float !== Css.ident.none && !Css.isDefaultingValue(float)) ||\n    isRoot\n  ) {\n    display = blockify(display);\n  }\n  return { display, position, float };\n}\n\n/**\n * Judges if the generated box is block.\n */\nexport function isBlock(\n  display: Css.Ident,\n  position: Css.Ident,\n  float: Css.Val,\n  isRoot: boolean,\n): boolean {\n  return (\n    getComputedDisplayValue(display, position, float, isRoot).display ===\n    Css.ident.block\n  );\n}\n\nfunction isDisplayType(\n  display: Css.Val | string | undefined,\n): display is Css.Ident | Css.SpaceList | string {\n  return (\n    display instanceof Css.Ident ||\n    display instanceof Css.SpaceList ||\n    typeof display === \"string\"\n  );\n}\n\nexport function isInlineLevel(display: Css.Val | string | undefined): boolean {\n  if (!isDisplayType(display)) {\n    return false;\n  }\n  const displayStr = display.toString();\n  switch (displayStr) {\n    case \"inline\":\n    case \"inline-block\":\n    case \"inline-flex\":\n    case \"inline-grid\":\n    case \"ruby\":\n    case \"inline-table\":\n      return true;\n    default:\n      // For display values like \"inline list-item\"\n      return displayStr.includes(\"inline\");\n  }\n}\n\n/**\n * Check if the display value includes \"list-item\", like \"inline list-item\".\n */\nexport function isListItem(display: Css.Val | string | undefined): boolean {\n  if (!isDisplayType(display)) {\n    return false;\n  }\n  const displayStr = display.toString();\n  return displayStr.includes(\"list-item\");\n}\n\nexport function isBlockLevel(display: Css.Val | string | undefined): boolean {\n  if (!isDisplayType(display)) {\n    return false;\n  }\n  switch (display.toString()) {\n    case \"block\":\n    case \"flex\":\n    case \"grid\":\n    case \"table\":\n    case \"list-item\":\n    case \"flow-root\":\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport function isRubyInternalDisplay(\n  display: Css.Val | string | undefined,\n): boolean {\n  if (!isDisplayType(display)) {\n    return false;\n  }\n  switch (display.toString()) {\n    case \"ruby-base\":\n    case \"ruby-text\":\n    case \"ruby-base-container\":\n    case \"ruby-text-container\":\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Judges if the generated box establishes a new block formatting context.\n */\nexport function establishesBFC(\n  display: Css.Val,\n  position: Css.Ident,\n  float: Css.Val,\n  overflow: Css.Ident,\n  writingMode?: Css.Ident,\n  parentWritingMode?: Css.Ident,\n  isFlowRoot?: boolean,\n): boolean {\n  writingMode = writingMode || parentWritingMode || Css.ident.horizontal_tb;\n  return (\n    !!isFlowRoot ||\n    (!!float && float !== Css.ident.none && !Css.isDefaultingValue(float)) ||\n    isAbsolutelyPositioned(position) ||\n    display === Css.ident.inline_block ||\n    display === Css.ident.table_cell ||\n    display === Css.ident.table_caption ||\n    display == Css.ident.flex ||\n    display == Css.ident.grid ||\n    display == Css.ident.flow_root ||\n    ((display === Css.ident.block || display === Css.ident.list_item) &&\n      !!overflow &&\n      overflow !== Css.ident.visible &&\n      overflow !== Css.ident.clip &&\n      !Css.isDefaultingValue(overflow)) ||\n    (!!parentWritingMode && writingMode !== parentWritingMode)\n  );\n}\n\n/**\n * Judges if the generated box establishes a containing block for descendant\n * boxes with 'position: absolute'.\n */\nexport function establishesCBForAbsolute(position: Css.Ident): boolean {\n  return (\n    position === Css.ident.relative ||\n    position === Css.ident.absolute ||\n    position === Css.ident.fixed\n  );\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutHelper - Helper functions of Layout.\n */\nimport * as Base from \"./base\";\nimport * as Display from \"./display\";\nimport { Layout, Vtree } from \"./types\";\n\n/**\n * A large gap value used to separate columns when using the browser's\n * multi-column feature for page/column breaking.\n * This value should be significantly larger than any objects in the layout\n * to prevent overlapping content between columns, but not too large to cause\n * problems with browser rendering limits.\n */\nconst BIG_GAP = 100000;\n\n/**\n * Enable page/column breaking using the browser's multi-column feature.\n * This function sets CSS properties on the column element to create a\n * single-column (column-count: 1) that splits into multiple columns\n * when content overflows the column's size. The large column gap\n * (column-gap) ensures that the browser creates new columns\n * apart from the original column position, and it helps determine\n * page/column breaking positions in our layout processing.\n */\nexport function setBrowserColumnBreaking(column: Vtree.Container): void {\n  const style = column.element.style;\n  style.columnGap = `${BIG_GAP - (column.vertical ? column.height : column.width)}px`;\n  style.columnFill = \"auto\";\n  style.columnCount = \"1\";\n  // Workaround for Safari/WebKit(< 26.2) bug (column-count: 1 should create a multi-column container)\n  // https://bugs.webkit.org/show_bug.cgi?id=299836\n  style.columnWidth = \"0\";\n}\n\n/**\n * Disable the browser's multi-column feature for page/column breaking.\n * This function resets the CSS properties set by `setBrowserColumnBreaking`.\n */\nexport function unsetBrowserColumnBreaking(column: Vtree.Container): void {\n  const style = column.element.style;\n  style.columnWidth = \"\";\n  style.columnCount = \"\";\n  style.columnGap = \"\";\n  style.columnFill = \"\";\n}\n\n/**\n * Check if the browser's multi-column feature is being used for page/column breaking.\n */\nexport function isUsingBrowserColumnBreaking(column: Vtree.Container): boolean {\n  return column.element.style.columnCount === \"1\";\n}\n\n/**\n * Mark the column as a root column for Vivliostyle layout processing.\n */\nexport function setAsRootColumn(column: Vtree.Container): void {\n  column.element.setAttribute(\"data-vivliostyle-column\", \"true\");\n}\n\n/**\n * Check if the column is marked as a root column for Vivliostyle layout processing.\n */\nexport function isRootColumn(column: Vtree.Container): boolean {\n  return column.element.hasAttribute(\"data-vivliostyle-column\");\n}\n\n/**\n * Check if the client rectangle of an element or range is located\n * in a column beyond the current one due to the browser's column breaking.\n *\n * @param rect - The client rectangle to check.\n * @param vertical - Whether the layout is vertical.\n * @return the number of columns the end edge of the rectangle is after the current column.\n */\nexport function checkIfBeyondColumnBreaks(\n  rect: Vtree.ClientRect,\n  vertical: boolean,\n): number {\n  const distance = vertical\n    ? rect.bottom\n    : Math.max(Math.abs(rect.left), Math.abs(rect.right));\n  return Math.round(distance / BIG_GAP);\n}\n\n/**\n * Adjust the client rectangle of an element or range to account for\n * the browser's column breaking.\n * This function modifies the rectangle's coordinates to ensure that\n * if the rectangle is located in a column beyond the current one,\n * its position in the block-progression direction is moved accordingly\n * so that overflow checks can be performed based solely on the\n * block-progression position.\n *\n * @param rect - The client rectangle to check.\n * @param vertical - Whether the layout is vertical.\n * @return the number of columns the start edge of the rectangle is after the current column.\n */\nexport function adjustRectForColumnBreaking(\n  rect: Vtree.ClientRect,\n  vertical: boolean,\n): number {\n  const columnOverEnd = checkIfBeyondColumnBreaks(rect, vertical);\n  if (columnOverEnd === 0) {\n    return 0;\n  }\n  const distanceStart = vertical\n    ? rect.top\n    : Math.min(Math.abs(rect.left), Math.abs(rect.right));\n  const columnOverStart = Math.round(distanceStart / BIG_GAP);\n  const shiftStart = columnOverStart * BIG_GAP;\n  let shiftEnd = columnOverEnd * BIG_GAP;\n  if (vertical) {\n    // vertical writing mode, columns are top to bottom\n    rect.top -= shiftStart;\n    rect.bottom -= shiftEnd;\n    if (rect.bottom < rect.top) {\n      rect.bottom += BIG_GAP;\n    }\n    rect.right -= shiftStart;\n    rect.left -= shiftEnd;\n  } else if (rect.left < -BIG_GAP / 2) {\n    // columns are right to left\n    rect.right += shiftStart;\n    rect.left += shiftEnd;\n    if (rect.left > rect.right) {\n      rect.left -= BIG_GAP;\n    }\n    rect.top += shiftStart;\n    rect.bottom += shiftEnd;\n  } else {\n    // columns are left to right\n    rect.left -= shiftStart;\n    rect.right -= shiftEnd;\n    if (rect.right < rect.left) {\n      rect.right += BIG_GAP;\n    }\n    rect.top += shiftStart;\n    rect.bottom += shiftEnd;\n  }\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n\n  return columnOverStart;\n}\n\n/**\n * Adjust multiple client rectangles for column breaking.\n */\nexport function adjustRectsForColumnBreaking(\n  rects: Vtree.ClientRect[],\n  vertical: boolean,\n): void {\n  for (let i = 0; i < rects.length; i++) {\n    adjustRectForColumnBreaking(rects[i], vertical);\n  }\n}\n\n/**\n * Get the client rectangle of an element, adjusted for column breaking.\n */\nexport function getElementClientRectAdjusted(\n  clientLayout: Vtree.ClientLayout,\n  element: Element,\n  vertical: boolean,\n): Vtree.ClientRect {\n  const rect = clientLayout.getElementClientRect(element);\n  const columnOver = adjustRectForColumnBreaking(rect, vertical);\n\n  // Workaround for Chromium bug on table fragmentation:\n  //   https://issues.chromium.org/issues/458852795\n  // To prevent the table cell from moving to the next column without breaking inside the cell due to the bug,\n  // we try to reduce the column height so that a column break inside the cell can occur.\n  if (columnOver === 1) {\n    let style = clientLayout.getElementComputedStyle(element);\n    if (\n      style.display === \"table-cell\" ||\n      (element.className === \"-vivliostyle-table-cell-container\" &&\n        element.parentElement?.parentElement &&\n        (style = clientLayout.getElementComputedStyle(\n          element.parentElement.parentElement,\n        )).display === \"table-cell\")\n    ) {\n      const columnElem = element.closest(\n        \"[data-vivliostyle-column]\",\n      ) as HTMLElement;\n      const columnStyle = columnElem?.style;\n      const blockSizeP = vertical ? \"width\" : \"height\";\n      const columnHeight = columnStyle && parseFloat(columnStyle[blockSizeP]);\n      if (columnHeight) {\n        let columnHeight2 = columnHeight;\n        let columnOver2 = columnOver;\n        const paddingBlockEnd = parseFloat(style.paddingBlockEnd);\n        const borderBlockEndWidth = parseFloat(style.borderBlockEndWidth);\n        let count = Math.ceil(paddingBlockEnd + borderBlockEndWidth);\n        while (\n          count-- > 0 &&\n          columnOver2 === columnOver &&\n          --columnHeight2 > 0\n        ) {\n          columnStyle[blockSizeP] = `${columnHeight2}px`;\n          const rect2 = clientLayout.getElementClientRect(element);\n          columnOver2 = adjustRectForColumnBreaking(rect2, vertical);\n          if (\n            columnOver2 < columnOver ||\n            (columnOver2 === columnOver &&\n              (vertical ? rect2.right > rect.right : rect2.top < rect.top))\n          ) {\n            columnElem.setAttribute(\n              \"data-vivliostyle-column-height-adjusted\",\n              \"true\",\n            );\n            return rect2;\n          }\n        }\n        columnStyle[blockSizeP] = `${columnHeight}px`;\n      }\n    }\n  }\n  return rect;\n}\n\n/**\n * Clear forced column breaks between two nodes.\n * This is used to prevent unnecessary blank pages.\n */\nexport function clearForcedColumnBreaks(prevNode: Node, currNode: Node): void {\n  if (prevNode.nodeType === 1) {\n    const elem = prevNode as HTMLElement;\n    if (elem.style?.breakAfter === \"column\") {\n      elem.style.breakAfter = \"\";\n    }\n  }\n  if (currNode.nodeType === 1) {\n    const elem = currNode as HTMLElement;\n    if (elem.style?.breakBefore === \"column\") {\n      elem.style.breakBefore = \"\";\n    }\n  }\n}\n\n/**\n * Find the nearest ancestor element that establishes a multi-column\n * layout but is not the root column element.\n */\nexport function findAncestorNonRootMultiColumn(node: Node): Element | null {\n  for (\n    let elem = node.nodeType === 1 ? (node as Element) : node.parentElement;\n    elem;\n    elem = elem.parentElement\n  ) {\n    const style = (elem as HTMLElement).style;\n    if (!style) {\n      break;\n    }\n    if (elem.hasAttribute(\"data-vivliostyle-column\")) {\n      // This is the root column element.\n      break;\n    }\n    if (\n      !isNaN(parseFloat(style.columnCount)) ||\n      !isNaN(parseFloat(style.columnWidth))\n    ) {\n      return elem;\n    }\n    if (style.position === \"absolute\") {\n      break;\n    }\n  }\n  return null;\n}\n\n/**\n * Fix overflow caused by forced column breaks in non-root multi-column elements.\n */\nexport function fixOverflowAtForcedColumnBreak(node: Node): void {\n  if (node.nodeType !== 1) {\n    return;\n  }\n  const element = node as HTMLElement;\n  const elementStyle = element.style;\n  const breakBeforeColumn = elementStyle?.breakBefore === \"column\";\n  const prevElem = element.previousElementSibling as HTMLElement;\n  const breakAfterColumn = prevElem && prevElem.style?.breakAfter === \"column\";\n  if (!breakBeforeColumn && !breakAfterColumn) {\n    return;\n  }\n  const nonRootMultiColumn = findAncestorNonRootMultiColumn(element);\n  if (!nonRootMultiColumn) {\n    return;\n  }\n  const multiColumnStyle =\n    nonRootMultiColumn.ownerDocument.defaultView.getComputedStyle(\n      nonRootMultiColumn,\n    );\n  const { writingMode, direction, columnGap, fontSize } = multiColumnStyle;\n  const vertical =\n    writingMode === \"vertical-rl\" || writingMode === \"vertical-lr\";\n  const isRtl = direction === \"rtl\";\n  const halfGap = (parseFloat(columnGap) || parseFloat(fontSize) || 16) / 2;\n\n  // Check if the element is overflowing the multi-column box\n  const multiColumnRect = nonRootMultiColumn.getBoundingClientRect();\n  const elementRect = element.getBoundingClientRect();\n  const columnOverflow = vertical\n    ? elementRect.top > multiColumnRect.bottom + halfGap\n    : isRtl\n      ? elementRect.right < multiColumnRect.left - halfGap\n      : elementRect.left > multiColumnRect.right + halfGap;\n  if (columnOverflow) {\n    // Fix overflow by removing the forced breaks and adding a large margin.\n    // This large margin will cause a page break in our layout processing.\n    if (breakBeforeColumn) {\n      elementStyle.breakBefore = \"\";\n    }\n    if (breakAfterColumn && prevElem) {\n      prevElem.style.breakAfter = \"\";\n    }\n    elementStyle.marginBlockStart = `${BIG_GAP}px`;\n  }\n}\n\n/**\n * Calculate the position of the \"after\" edge in the block-progression.\n * Returns the edge position in pixels if it was determined successfully,\n * and returns NaN if the position could not be determined and the node\n * should be considered zero-height.\n */\nexport function calculateEdge(\n  nodeContext: Vtree.NodeContext,\n  clientLayout: Vtree.ClientLayout,\n  extraOffset: number,\n  vertical: boolean,\n): number {\n  const node = nodeContext.viewNode;\n  if (!node) {\n    return NaN;\n  }\n\n  // NOTE: Do not replace `node.nodeType === 1` with `node instanceof Element`,\n  // which does not work when the node is inside iframe. (Issue #1000)\n\n  const element = node.nodeType === 1 ? (node as Element) : node.parentElement;\n  if (element && element.namespaceURI === Base.NS.XHTML) {\n    const style = (element as HTMLElement).style;\n    if (\n      element.localName === \"br\" ||\n      element.localName === \"wbr\" ||\n      (style &&\n        Display.isInlineLevel(style.display) &&\n        /^([\\d\\.]|super|(text-)?top)/.test(style.verticalAlign))\n    ) {\n      // Avoid incorrect edge calculation at BR or WBR element,\n      // or inline element with positive vertical-align (issue #811).\n      return NaN;\n    }\n  }\n  if (node === element) {\n    if (nodeContext.after || !nodeContext.inline) {\n      if (\n        nodeContext.after &&\n        !nodeContext.inline &&\n        element.querySelector(\"ruby\")\n      ) {\n        // Workaround for issue #987 (unnecessary break caused by ruby)\n        const parentNode = element.parentNode;\n        const nextSibling = element.nextSibling;\n        parentNode.removeChild(element);\n        parentNode.insertBefore(element, nextSibling);\n      }\n      const cbox = getElementClientRectAdjusted(\n        clientLayout,\n        element,\n        vertical,\n      );\n      if (\n        cbox.left === 0 &&\n        cbox.top === 0 &&\n        cbox.right === 0 &&\n        cbox.bottom === 0\n      ) {\n        // getBoundingClientRect() returns 0,0,0,0 for WBR element (Chrome)\n        // (Fix for issue #802)\n        return NaN;\n      }\n      if (cbox.right >= cbox.left && cbox.bottom >= cbox.top) {\n        if (nodeContext.after) {\n          return vertical ? cbox.left : cbox.bottom;\n        } else {\n          return vertical ? cbox.right : cbox.top;\n        }\n      }\n    }\n    return NaN;\n  } else {\n    let edge = NaN;\n    const range = node.ownerDocument.createRange();\n    const length = node.textContent.length;\n    if (!length) {\n      return NaN;\n    }\n    if (nodeContext.after) {\n      extraOffset += length;\n    }\n    if (extraOffset >= length) {\n      extraOffset = length - 1;\n    }\n    range.setStart(node, extraOffset);\n    range.setEnd(node, extraOffset + 1);\n    let boxes = clientLayout.getRangeClientRects(range);\n\n    // Adjust boxes' positions for column breaking\n    adjustRectsForColumnBreaking(boxes, vertical);\n\n    boxes = boxes.filter((box) => box.right > box.left && box.bottom > box.top);\n    if (!boxes.length) {\n      return NaN;\n    }\n    if (vertical) {\n      edge = Math.min.apply(\n        null,\n        boxes.map((box) => box.left),\n      );\n    } else {\n      edge = Math.max.apply(\n        null,\n        boxes.map((box) => box.bottom),\n      );\n    }\n    return edge;\n  }\n}\n\nexport function getElementHeight(\n  element: Element,\n  column: Layout.Column,\n  vertical: boolean,\n): number {\n  const usingBrowserColumnBreaking = isUsingBrowserColumnBreaking(column);\n  if (usingBrowserColumnBreaking) {\n    unsetBrowserColumnBreaking(column);\n  }\n  const rect = column.clientLayout.getElementClientRect(element);\n  if (usingBrowserColumnBreaking) {\n    setBrowserColumnBreaking(column);\n  }\n  const margin = column.getComputedMargin(element);\n  return vertical\n    ? rect[\"width\"] + margin[\"left\"] + margin[\"right\"]\n    : rect[\"height\"] + margin[\"top\"] + margin[\"bottom\"];\n}\n\nexport function isOrphan(node: Node): boolean {\n  while (node) {\n    if (node.parentNode === node.ownerDocument) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n  return true;\n}\n\nexport function removeFollowingSiblings(\n  parentNode: Node,\n  viewNode: Node,\n): void {\n  if (!parentNode) {\n    return;\n  }\n  for (\n    let lastChild = parentNode.lastChild, prevSibling = lastChild;\n    lastChild !== viewNode;\n    lastChild = prevSibling\n  ) {\n    prevSibling = lastChild.previousSibling;\n    if (\n      lastChild.nodeType === 1 &&\n      (lastChild as Element).hasAttribute(\"data-vivliostyle-float-box-moved\") &&\n      (viewNode as HTMLElement).style?.display === \"inline\"\n    ) {\n      // Do not remove float box moved after parent inline (Issue #1383, #1422)\n      continue;\n    }\n    parentNode.removeChild(lastChild);\n  }\n}\n\n/**\n * Marks an element as \"special\". It should not be used in bbox calculations.\n */\nexport const SPECIAL_ATTR = \"data-adapt-spec\";\n\nexport function isSpecial(e: Element): boolean {\n  return !!e.getAttribute(SPECIAL_ATTR);\n}\n\nexport function isOutOfFlow(node: Node): boolean {\n  if (!(node?.nodeType === 1)) return false;\n  const e = node as HTMLElement;\n  if (isSpecial(e)) return true;\n  const position = e.style?.position;\n  return position === \"absolute\" || position === \"fixed\";\n}\n\nexport function isSpecialNodeContext(nodeContext: Vtree.NodeContext): boolean {\n  const viewNode = nodeContext?.viewNode;\n  return viewNode?.nodeType === 1 && isSpecial(viewNode as Element);\n}\n\nexport function isSpecialInlineDisplay(display: string): boolean {\n  return (\n    display !== \"inline\" &&\n    (Display.isInlineLevel(display) || Display.isRubyInternalDisplay(display))\n  );\n}\n\nexport function findAncestorSpecialInlineNodeContext(\n  nodeContext: Vtree.NodeContext,\n): Vtree.NodeContext | null {\n  for (let p = nodeContext.parent; p; p = p.parent) {\n    if (\n      (p.display !== \"inline\" || p.vertical !== p.parent?.vertical) &&\n      Display.isInlineLevel(p.display)\n    ) {\n      return p;\n    }\n  }\n  return null;\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview BreakPosition - Definitions of BreakPosition.\n */\nimport * as Break from \"./break\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport { Layout, RepetitiveElement, Vtree } from \"./types\";\n\n/**\n * Potential breaking position.\n */\nexport type BreakPosition = Layout.BreakPosition;\n\nexport abstract class AbstractBreakPosition\n  implements Layout.AbstractBreakPosition\n{\n  abstract findAcceptableBreak(\n    column: Layout.Column,\n    penalty: number,\n  ): Vtree.NodeContext;\n\n  abstract getMinBreakPenalty(): number;\n\n  calculateOffset(column): { current: number; minimum: number } {\n    return calculateOffset(\n      this.getNodeContext(),\n      column.collectElementsOffset(),\n    );\n  }\n\n  /** @override */\n  breakPositionChosen(column: Layout.Column): void {}\n\n  getNodeContext(): Vtree.NodeContext {\n    return null;\n  }\n}\n\nexport function calculateOffset(\n  nodeContext: Vtree.NodeContext,\n  elementsOffsets: RepetitiveElement.ElementsOffset[],\n): { current: number; minimum: number } {\n  return {\n    current: elementsOffsets.reduce(\n      (val, repetitiveElement) =>\n        val + repetitiveElement.calculateOffset(nodeContext),\n      0,\n    ),\n    minimum: elementsOffsets.reduce(\n      (val, repetitiveElement) =>\n        val + repetitiveElement.calculateMinimumOffset(nodeContext),\n      0,\n    ),\n  };\n}\n\n/**\n * Potential edge breaking position.\n */\nexport class EdgeBreakPosition\n  extends AbstractBreakPosition\n  implements Layout.EdgeBreakPosition\n{\n  overflowIfRepetitiveElementsDropped: boolean;\n  protected isEdgeUpdated: boolean = false;\n  private edge: number = 0;\n\n  constructor(\n    public readonly position: Vtree.NodeContext,\n    public readonly breakOnEdge: string | null,\n    public overflows: boolean,\n    public readonly computedBlockSize: number,\n  ) {\n    super();\n    this.overflowIfRepetitiveElementsDropped = overflows;\n  }\n\n  override findAcceptableBreak(\n    column: Layout.Column,\n    penalty: number,\n  ): Vtree.NodeContext {\n    this.updateOverflows(column);\n    if (penalty < this.getMinBreakPenalty()) {\n      return null;\n    }\n    return column.findEdgeBreakPosition(this);\n  }\n\n  override getMinBreakPenalty(): number {\n    if (!this.isEdgeUpdated) {\n      throw new Error(\"EdgeBreakPosition.prototype.updateEdge not called\");\n    }\n    const preferDropping =\n      this.isFirstContentOfRepetitiveElementsOwner() &&\n      !this.overflowIfRepetitiveElementsDropped;\n    return (\n      (Break.isAvoidBreakValue(this.breakOnEdge) ? 1 : 0) +\n      (this.overflows && !preferDropping ? 3 : 0) +\n      (this.position.parent ? this.position.parent.breakPenalty : 0)\n    );\n  }\n\n  private updateEdge(column: Layout.Column) {\n    const clonedPaddingBorder = column.calculateClonedPaddingBorder(\n      this.position,\n    );\n    this.edge =\n      LayoutHelper.calculateEdge(\n        this.position,\n        column.clientLayout,\n        0,\n        column.vertical,\n      ) + clonedPaddingBorder;\n\n    if (!this.position.after && !this.position.inline) {\n      // Subtract marginBlockStart from the edge (Issue #611)\n      const marginBlockStart = column.parseComputedLength(\n        column.clientLayout.getElementComputedStyle(\n          this.position.viewNode as Element,\n        ).marginBlockStart,\n      );\n      this.edge -= (column.vertical ? -1 : 1) * marginBlockStart;\n    } else if (\n      this.position.after &&\n      this.position.shadowContext?.root.id === \"table-cell\"\n    ) {\n      // Add table's borderBlockEnd etc. to the edge\n      const cell = column.element.parentElement;\n      const table = cell?.closest(\n        \"table, [style*='display: table;']\",\n      ) as HTMLElement;\n      if (table) {\n        const collapse = table.style.borderCollapse === \"collapse\";\n        let padding = 0;\n        let border = 0;\n        for (let elem = cell; elem; elem = elem.parentElement) {\n          const style = column.clientLayout.getElementComputedStyle(elem);\n          if (elem === cell || (elem === table && !collapse)) {\n            padding += column.parseComputedLength(style.paddingBlockEnd);\n          }\n          if (elem === table && !collapse) {\n            padding += column.parseComputedLength(\n              style.borderSpacing.replace(/^\\S+ (\\S+)$/, \"$1\"),\n            );\n          }\n          if (collapse) {\n            border = Math.max(\n              border,\n              column.parseComputedLength(style.borderBlockEndWidth),\n            );\n          } else if (elem === cell || elem === table) {\n            border += column.parseComputedLength(style.borderBlockEndWidth);\n          }\n          if (elem === table) break;\n        }\n        this.edge += (column.vertical ? -1 : 1) * (padding + border);\n      }\n    }\n\n    this.isEdgeUpdated = true;\n  }\n\n  private updateOverflows(column: Layout.Column) {\n    if (!this.isEdgeUpdated) {\n      this.updateEdge(column);\n    }\n    const edge = this.edge;\n    const offsets = this.calculateOffset(column);\n    this.overflowIfRepetitiveElementsDropped = column.isOverflown(\n      edge + (column.vertical ? -1 : 1) * offsets.minimum,\n    );\n    this.overflows = this.position.overflow = column.isOverflown(\n      edge + (column.vertical ? -1 : 1) * offsets.current,\n    );\n  }\n\n  override getNodeContext(): Vtree.NodeContext {\n    return this.position;\n  }\n\n  private isFirstContentOfRepetitiveElementsOwner(): boolean {\n    const nodeContext = this.getNodeContext();\n    if (!nodeContext || !nodeContext.parent) {\n      return false;\n    }\n    const { formattingContext } = nodeContext.parent;\n    if (\n      !RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n        formattingContext,\n      )\n    ) {\n      return false;\n    }\n\n    const repetitiveElements = formattingContext.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return false;\n    }\n    return repetitiveElements.isFirstContentNode(nodeContext);\n  }\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutProcessor - Definitions of LayoutProcessor.\n */\nimport * as BreakPosition from \"./break-position\";\nimport * as Display from \"./display\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as Plugin from \"./plugin\";\nimport * as Task from \"./task\";\nimport { FormattingContextType, Layout, LayoutProcessor, Vtree } from \"./types\";\n\n/**\n * Processor doing some special layout (e.g. table layout)\n */\n// eslint-disable-next-line no-redeclare\nexport interface LayoutProcessor {\n  /**\n   * Do actual layout in the column starting from given NodeContext.\n   */\n  layout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n    leadingEdge: boolean,\n  ): Task.Result<Vtree.NodeContext>;\n\n  /**\n   * Potential edge breaking position.\n   */\n  createEdgeBreakPosition(\n    position: Vtree.NodeContext,\n    breakOnEdge: string | null,\n    overflows: boolean,\n    columnBlockSize: number,\n  ): Layout.BreakPosition;\n\n  /**\n   * process nodecontext at the start of a non inline element.\n   * @return return true if you skip the subsequent nodes\n   */\n  startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean;\n\n  /**\n   * process nodecontext after a non inline element.\n   * @return return true if you skip the subsequent nodes\n   */\n  afterNonInlineElementNode(\n    nodeContext: Vtree.NodeContext,\n    stopAtOverflow: boolean,\n  ): boolean;\n\n  /**\n   * @return holing true\n   */\n  finishBreak(\n    column: Layout.Column,\n    nodeContext: Vtree.NodeContext,\n    forceRemoveSelf: boolean,\n    endOfColumn: boolean,\n  ): Task.Result<boolean>;\n\n  clearOverflownViewNodes(\n    column: Layout.Column,\n    parentNodeContext: Vtree.NodeContext,\n    nodeContext: Vtree.NodeContext,\n    removeSelf: boolean,\n  );\n}\n\n/**\n * Resolver finding an appropriate LayoutProcessor given a formatting context\n */\nexport class LayoutProcessorResolver {\n  /**\n   * Find LayoutProcessor corresponding to given formatting context.\n   */\n  find(formattingContext: Vtree.FormattingContext): LayoutProcessor {\n    const hooks: Plugin.ResolveLayoutProcessorHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n    );\n    for (let i = 0; i < hooks.length; i++) {\n      const processor = hooks[i](formattingContext);\n      if (processor) {\n        return processor;\n      }\n    }\n    throw new Error(\n      `No processor found for a formatting context: ${formattingContext.getName()}`,\n    );\n  }\n}\n\nexport class BlockLayoutProcessor implements LayoutProcessor {\n  /** @override */\n  layout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n    leadingEdge: boolean,\n  ): Task.Result<Vtree.NodeContext> {\n    if (column.isFloatNodeContext(nodeContext)) {\n      return column.layoutFloatOrFootnote(nodeContext);\n    } else if (column.isBreakable(nodeContext)) {\n      return column.layoutBreakableBlock(nodeContext);\n    } else {\n      return column.layoutUnbreakable(nodeContext);\n    }\n  }\n\n  /** @override */\n  createEdgeBreakPosition(\n    position: Vtree.NodeContext,\n    breakOnEdge: string | null,\n    overflows: boolean,\n    columnBlockSize: number,\n  ): Layout.BreakPosition {\n    return new BreakPosition.EdgeBreakPosition(\n      position.copy(),\n      breakOnEdge,\n      overflows,\n      columnBlockSize,\n    );\n  }\n\n  /** @override */\n  startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n    return false;\n  }\n\n  /** @override */\n  afterNonInlineElementNode(\n    nodeContext: Vtree.NodeContext,\n    stopAtOverflow: boolean,\n  ): boolean {\n    return false;\n  }\n\n  /** @override */\n  clearOverflownViewNodes(\n    column: Layout.Column,\n    parentNodeContext: Vtree.NodeContext,\n    nodeContext: Vtree.NodeContext,\n    removeSelf: boolean,\n  ) {\n    if (!nodeContext.viewNode) {\n      return;\n    }\n    if (!nodeContext.viewNode.parentNode) {\n      return;\n    }\n    // Fix for issue #740\n    if (\n      nodeContext.shadowType === Vtree.ShadowType.ROOTLESS &&\n      LayoutHelper.isSpecialNodeContext(nodeContext)\n    ) {\n      return;\n    }\n    let node = nodeContext.viewNode;\n    if (node.parentElement?.localName === \"viv-ts-inner\") {\n      // special element for text-spacing\n      node = node.parentElement.parentElement;\n    }\n    const parentNode = node.parentNode;\n    LayoutHelper.removeFollowingSiblings(parentNode, node);\n    if (removeSelf) {\n      parentNode.removeChild(node);\n    }\n  }\n\n  /**\n   * @return holing true\n   * @override\n   */\n  finishBreak(\n    column: Layout.Column,\n    nodeContext: Vtree.NodeContext,\n    forceRemoveSelf: boolean,\n    endOfColumn: boolean,\n  ): Task.Result<boolean> {\n    const removeSelf =\n      forceRemoveSelf ||\n      (nodeContext.viewNode != null &&\n        nodeContext.viewNode.nodeType == 1 &&\n        !nodeContext.after);\n    column.clearOverflownViewNodes(nodeContext, removeSelf);\n    if (endOfColumn) {\n      column.layoutContext.processFragmentedBlockEdge(nodeContext);\n    }\n    return Task.newResult(true);\n  }\n}\n\nexport class BlockFormattingContext\n  implements LayoutProcessor.BlockFormattingContext\n{\n  formattingContextType: FormattingContextType = \"Block\";\n\n  constructor(private readonly parent: Vtree.FormattingContext) {}\n\n  /** @override */\n  getName(): string {\n    return \"Block formatting context (BlockFormattingContext)\";\n  }\n\n  /** @override */\n  isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n    return firstTime;\n  }\n\n  /** @override */\n  getParent(): Vtree.FormattingContext {\n    return this.parent;\n  }\n\n  /** @override */\n  saveState(): any {}\n\n  /** @override */\n  restoreState(state: any) {}\n}\n\nexport const blockLayoutProcessor = new BlockLayoutProcessor();\n\nexport const isInstanceOfBlockFormattingContext =\n  LayoutProcessor.isInstanceOfBlockFormattingContext;\n\nPlugin.registerHook(\n  Plugin.HOOKS.RESOLVE_FORMATTING_CONTEXT,\n  (nodeContext, firstTime, display, position, floatSide, isRoot) => {\n    const parent = nodeContext.parent;\n    if (!parent && nodeContext.formattingContext) {\n      return null;\n    } else if (\n      parent &&\n      nodeContext.formattingContext !== parent.formattingContext\n    ) {\n      return null;\n    } else if (\n      nodeContext.establishesBFC ||\n      (!nodeContext.formattingContext &&\n        Display.isBlock(display, position, floatSide, isRoot))\n    ) {\n      return new BlockFormattingContext(\n        parent ? parent.formattingContext : null,\n      );\n    } else {\n      return null;\n    }\n  },\n);\n\nPlugin.registerHook(\n  Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n  (formattingContext) => {\n    if (formattingContext instanceof BlockFormattingContext) {\n      return blockLayoutProcessor;\n    }\n    return null;\n  },\n);\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutRetryers - Definitions of LayoutRetryer.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Task from \"./task\";\nimport { Layout, Vtree } from \"./types\";\n\n/**\n * @abstract\n */\nexport abstract class AbstractLayoutRetryer {\n  initialBreakPositions: Layout.BreakPosition[] = null;\n  initialStateOfFormattingContext: Vtree.NodeContext = null;\n  initialPosition: Vtree.NodeContext;\n  initialFragmentLayoutConstraints: Layout.FragmentLayoutConstraint[];\n\n  layout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    this.prepareLayout(nodeContext, column);\n    return this.tryLayout(nodeContext, column);\n  }\n\n  private tryLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const frame = Task.newFrame<Vtree.NodeContext>(\n      \"AbstractLayoutRetryer.tryLayout\",\n    );\n    this.saveState(nodeContext, column);\n    const mode = this.resolveLayoutMode(nodeContext);\n    mode.doLayout(nodeContext, column).then((positionAfter) => {\n      let accepted = mode.accept(positionAfter, column);\n      accepted = mode.postLayout(\n        positionAfter,\n        this.initialPosition,\n        column,\n        accepted,\n      );\n      if (accepted) {\n        frame.finish(positionAfter);\n      } else {\n        Asserts.assert(this.initialPosition);\n        this.clearNodes(this.initialPosition);\n        this.restoreState(nodeContext, column);\n        this.tryLayout(this.initialPosition, column).thenFinish(frame);\n      }\n    });\n    return frame.result();\n  }\n\n  /**\n   * @abstract\n   */\n  abstract resolveLayoutMode(nodeContext: Vtree.NodeContext): Layout.LayoutMode;\n\n  prepareLayout(nodeContext: Vtree.NodeContext, column: Layout.Column) {}\n\n  clearNodes(initialPosition: Vtree.NodeContext) {\n    const viewNode =\n      initialPosition.viewNode || initialPosition.parent.viewNode;\n    let child: Node;\n    while ((child = viewNode.lastChild)) {\n      viewNode.removeChild(child);\n    }\n    let sibling: Node;\n    while ((sibling = viewNode.nextSibling)) {\n      sibling.parentNode.removeChild(sibling);\n    }\n  }\n\n  saveState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n    this.initialPosition = nodeContext.copy();\n    this.initialBreakPositions = [].concat(column.breakPositions);\n    this.initialFragmentLayoutConstraints = [].concat(\n      column.fragmentLayoutConstraints,\n    );\n    if (nodeContext.formattingContext) {\n      this.initialStateOfFormattingContext =\n        nodeContext.formattingContext.saveState();\n    }\n  }\n\n  restoreState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n    column.breakPositions = this.initialBreakPositions;\n    column.fragmentLayoutConstraints = this.initialFragmentLayoutConstraints;\n    if (nodeContext.formattingContext) {\n      nodeContext.formattingContext.restoreState(\n        this.initialStateOfFormattingContext,\n      );\n    }\n  }\n}\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview LayoutUtil - Utilities related to layout.\n */\nimport * as Break from \"./break\";\nimport * as Task from \"./task\";\nimport * as VtreeImpl from \"./vtree\";\nimport { Layout, Vtree } from \"./types\";\n\nexport type LayoutIteratorState = {\n  nodeContext: Vtree.NodeContext;\n  atUnforcedBreak: boolean;\n  break: boolean;\n  leadingEdge?: boolean;\n  breakAtTheEdge?: string | null;\n  onStartEdges?: boolean;\n  leadingEdgeContexts?: Vtree.NodeContext[];\n  lastAfterNodeContext?: Vtree.NodeContext | null;\n};\n\nexport class LayoutIteratorStrategy {\n  initialState(initialNodeContext: Vtree.NodeContext): LayoutIteratorState {\n    return {\n      nodeContext: initialNodeContext,\n      atUnforcedBreak: false,\n      break: false,\n    };\n  }\n\n  startNonDisplayableNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  afterNonDisplayableNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  startIgnoredTextNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  afterIgnoredTextNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  startNonElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  afterNonElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  startInlineElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  afterInlineElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  startNonInlineElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  afterNonInlineElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  finish(state: LayoutIteratorState): void | Task.Result<boolean> {}\n}\n\nexport class LayoutIterator {\n  constructor(\n    private readonly strategy: LayoutIteratorStrategy,\n    private readonly layoutContext: Vtree.LayoutContext,\n  ) {}\n\n  iterate(\n    initialNodeContext: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    const strategy = this.strategy;\n    const state = strategy.initialState(initialNodeContext);\n    const frame: Task.Frame<Vtree.NodeContext> =\n      Task.newFrame(\"LayoutIterator\");\n    frame\n      .loopWithFrame((loopFrame) => {\n        let r: void | Task.Result<boolean>;\n        while (state.nodeContext) {\n          if (!state.nodeContext.viewNode) {\n            if (state.nodeContext.after) {\n              r = strategy.afterNonDisplayableNode(state);\n            } else {\n              r = strategy.startNonDisplayableNode(state);\n            }\n          } else if (state.nodeContext.viewNode.nodeType !== 1) {\n            if (\n              VtreeImpl.canIgnore(\n                state.nodeContext.viewNode,\n                state.nodeContext.whitespace,\n              )\n            ) {\n              if (state.nodeContext.after) {\n                r = strategy.afterIgnoredTextNode(state);\n              } else {\n                r = strategy.startIgnoredTextNode(state);\n              }\n            } else {\n              if (state.nodeContext.after) {\n                r = strategy.afterNonElementNode(state);\n              } else {\n                r = strategy.startNonElementNode(state);\n              }\n            }\n          } else {\n            if (state.nodeContext.inline) {\n              if (state.nodeContext.after) {\n                r = strategy.afterInlineElementNode(state);\n              } else {\n                r = strategy.startInlineElementNode(state);\n              }\n            } else {\n              if (state.nodeContext.after) {\n                r = strategy.afterNonInlineElementNode(state);\n              } else {\n                r = strategy.startNonInlineElementNode(state);\n              }\n            }\n          }\n          const cont = r && r.isPending() ? r : Task.newResult(true);\n          const nextResult = cont.thenAsync(() => {\n            if (state.break) {\n              return Task.newResult(null);\n            }\n            return this.layoutContext.nextInTree(\n              state.nodeContext,\n              state.atUnforcedBreak,\n            );\n          });\n          if (nextResult.isPending()) {\n            nextResult.then((nextNodeContext) => {\n              if (state.break) {\n                loopFrame.breakLoop();\n              } else {\n                state.nodeContext = nextNodeContext;\n                loopFrame.continueLoop();\n              }\n            });\n            return;\n          } else if (state.break) {\n            loopFrame.breakLoop();\n            return;\n          } else {\n            state.nodeContext = nextResult.get();\n          }\n        }\n        strategy.finish(state);\n        loopFrame.breakLoop();\n      })\n      .then(() => {\n        frame.finish(state.nodeContext);\n      });\n    return frame.result();\n  }\n}\n\nexport class EdgeSkipper extends LayoutIteratorStrategy {\n  constructor(protected readonly leadingEdge?: boolean) {\n    super();\n  }\n\n  startNonInlineBox(state: LayoutIteratorState): void | Task.Result<boolean> {}\n\n  endEmptyNonInlineBox(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {}\n\n  endNonInlineBox(state: LayoutIteratorState): void | Task.Result<boolean> {}\n\n  initialState(initialNodeContext: Vtree.NodeContext): LayoutIteratorState {\n    return {\n      nodeContext: initialNodeContext,\n      atUnforcedBreak: !!this.leadingEdge && initialNodeContext.after,\n      break: false,\n      leadingEdge: this.leadingEdge,\n      breakAtTheEdge: null,\n      onStartEdges: false,\n      leadingEdgeContexts: [],\n      lastAfterNodeContext: null,\n    };\n  }\n\n  /**\n   * @return Returns true if a forced break occurs.\n   */\n  processForcedBreak(\n    state: LayoutIteratorState,\n    column: Layout.Column,\n  ): boolean {\n    const needForcedBreak =\n      !state.leadingEdge && Break.isForcedBreakValue(state.breakAtTheEdge);\n    if (needForcedBreak) {\n      const nodeContext = (state.nodeContext =\n        state.leadingEdgeContexts[0] || state.nodeContext);\n      nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n      column.pageBreakType = state.breakAtTheEdge;\n    }\n    return needForcedBreak;\n  }\n\n  /**\n   * @return Returns true if the node overflows the column.\n   */\n  saveEdgeAndProcessOverflow(\n    state: LayoutIteratorState,\n    column: Layout.Column,\n  ): boolean {\n    const overflow = column.checkOverflowAndSaveEdgeAndBreakPosition(\n      state.lastAfterNodeContext,\n      null,\n      true,\n      state.breakAtTheEdge,\n    );\n    if (overflow) {\n      state.nodeContext = (\n        state.lastAfterNodeContext || state.nodeContext\n      ).modify();\n      state.nodeContext.overflow = true;\n    }\n    return overflow;\n  }\n\n  /**\n   * @returns Returns true if the layout constraint is violated.\n   */\n  processLayoutConstraint(\n    state: LayoutIteratorState,\n    layoutConstraint: Layout.LayoutConstraint,\n    column: Layout.Column,\n  ): boolean {\n    let nodeContext = state.nodeContext;\n    const violateConstraint = !layoutConstraint.allowLayout(nodeContext);\n    if (violateConstraint) {\n      column.checkOverflowAndSaveEdgeAndBreakPosition(\n        state.lastAfterNodeContext,\n        null,\n        false,\n        state.breakAtTheEdge,\n      );\n      nodeContext = state.nodeContext = nodeContext.modify();\n      nodeContext.overflow = true;\n    }\n    return violateConstraint;\n  }\n\n  override startNonElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    state.onStartEdges = false;\n  }\n\n  override startNonInlineElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    state.leadingEdgeContexts.push(state.nodeContext.copy());\n    state.breakAtTheEdge = Break.resolveEffectiveBreakValue(\n      state.breakAtTheEdge,\n      state.nodeContext.breakBefore,\n    );\n    state.onStartEdges = true;\n    return this.startNonInlineBox(state);\n  }\n\n  override afterNonInlineElementNode(\n    state: LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    let r: void | Task.Result<boolean>;\n    let cont: Task.Result<boolean>;\n    if (state.onStartEdges) {\n      r = this.endEmptyNonInlineBox(state);\n      cont = r && r.isPending() ? r : Task.newResult(true);\n      cont = cont.thenAsync(() => {\n        if (!state.break) {\n          state.leadingEdgeContexts = [];\n          state.leadingEdge = false;\n          state.atUnforcedBreak = false;\n          state.breakAtTheEdge = null;\n        }\n        return Task.newResult(true);\n      });\n    } else {\n      r = this.endNonInlineBox(state);\n      cont = r && r.isPending() ? r : Task.newResult(true);\n    }\n    return cont.thenAsync(() => {\n      if (!state.break) {\n        state.onStartEdges = false;\n        state.lastAfterNodeContext = state.nodeContext.copy();\n        state.breakAtTheEdge = Break.resolveEffectiveBreakValue(\n          state.breakAtTheEdge,\n          state.nodeContext.breakAfter,\n        );\n      }\n      return Task.newResult(true);\n    });\n  }\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Shared - Global variables of Vivliostyle.js\n */\nimport { RepetitiveElement } from \"./types\";\n\nexport let repetitiveElementsCache: {\n  root: Element;\n  elements: RepetitiveElement.RepetitiveElements;\n}[] = [];\n\nexport function clearRepetitiveElementsCache(): void {\n  repetitiveElementsCache = [];\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Matchers - Definitions of Matcher.\n */\nimport * as Asserts from \"./asserts\";\n\n/**\n * Checkes whether given order can be represented as an+b with a non-negative\n * interger n\n */\nexport function matchANPlusB(order: number, a: number, b: number): boolean {\n  order -= b;\n  if (a === 0) {\n    return order === 0;\n  } else {\n    return order % a === 0 && order / a >= 0;\n  }\n}\n\nexport interface Matcher {\n  matches(): boolean;\n}\n\nexport class AnyMatcher implements Matcher {\n  constructor(public readonly matchers: Matcher[]) {}\n\n  /** @override */\n  matches(): boolean {\n    return this.matchers.some((matcher) => matcher.matches());\n  }\n}\n\nexport class AllMatcher implements Matcher {\n  constructor(public readonly matchers: Matcher[]) {}\n\n  /** @override */\n  matches(): boolean {\n    return this.matchers.every((matcher) => matcher.matches());\n  }\n}\n\nexport class NthFragmentMatcher implements Matcher {\n  static fragmentIndices = {};\n\n  static registerFragmentIndex(\n    elementOffset: number,\n    fragmentIndex: number,\n    priority: number,\n  ) {\n    const indices = NthFragmentMatcher.fragmentIndices;\n    if (\n      !indices[elementOffset] ||\n      indices[elementOffset].priority <= priority\n    ) {\n      indices[elementOffset] = { fragmentIndex, priority };\n    }\n  }\n\n  static clearFragmentIndices() {\n    NthFragmentMatcher.fragmentIndices = {};\n  }\n\n  constructor(\n    public readonly elementOffset: number,\n    public readonly a: number,\n    public readonly b: number,\n  ) {}\n\n  /** @override */\n  matches(): boolean {\n    const entry = NthFragmentMatcher.fragmentIndices[this.elementOffset];\n    return (\n      entry != null &&\n      entry.fragmentIndex != null &&\n      matchANPlusB(entry.fragmentIndex, this.a, this.b)\n    );\n  }\n}\n\nexport class MatcherBuilder {\n  static buildViewConditionMatcher(\n    elementOffset: number,\n    viewCondition: string,\n  ): Matcher {\n    const strs = viewCondition.split(\"_\");\n    if (strs[0] == \"NFS\") {\n      return new NthFragmentMatcher(\n        elementOffset,\n        parseInt(strs[1], 10),\n        parseInt(strs[2], 10),\n      );\n    } else {\n      Asserts.fail(`unknown view condition. condition=${viewCondition}`);\n      return null;\n    }\n  }\n\n  static buildAllMatcher(matchers: Matcher[]): Matcher {\n    return new AllMatcher(matchers);\n  }\n\n  static buildAnyMatcher(matchers: Matcher[]): Matcher {\n    return new AnyMatcher(matchers);\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssCascade - CSS Cascade.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as CounterStyle from \"./counter-style\";\nimport * as Css from \"./css\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Display from \"./display\";\nimport * as Exprs from \"./exprs\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as Logging from \"./logging\";\nimport * as Matchers from \"./matchers\";\nimport * as Plugin from \"./plugin\";\nimport * as Vtree from \"./vtree\";\nimport { CssStyler, Layout } from \"./types\";\nimport { TokenType } from \"./css-tokenizer\";\nimport { AbstractStyler } from \"./css-styler\";\n\nexport type ElementStyle = {\n  [key: string]:\n    | CascadeValue\n    | CascadeValue[]\n    | ElementStyleMap\n    | { matcher: Matchers.Matcher; styles: ElementStyle }[];\n};\n\nexport const inheritedProps = {\n  \"border-collapse\": true,\n  \"border-spacing\": true,\n  \"caption-side\": true,\n  \"clip-rule\": true,\n  color: true,\n  \"color-interpolation\": true,\n  \"color-rendering\": true,\n  cursor: true,\n  direction: true,\n  \"empty-cells\": true,\n  fill: true,\n  \"fill-opacity\": true,\n  \"fill-rule\": true,\n  \"font-kerning\": true,\n  \"font-size\": true,\n  \"font-size-adjust\": true,\n  \"font-family\": true,\n  \"font-feature-settings\": true,\n  \"font-style\": true,\n  \"font-stretch\": true,\n  \"font-variant-ligatures\": true,\n  \"font-variant-caps\": true,\n  \"font-variant-numeric\": true,\n  \"font-variant-east-asian\": true,\n  \"font-weight\": true,\n  \"glyph-orientation-vertical\": true,\n  \"hanging-punctuation\": true,\n  hyphens: true,\n  \"hyphenate-character\": true,\n  \"hyphenate-limit-chars\": true,\n  \"hyphenate-limit-last\": true,\n  \"image-rendering\": true,\n  \"image-resolution\": true,\n  \"letter-spacing\": true,\n  \"line-break\": true,\n  \"line-height\": true,\n  \"list-style-image\": true,\n  \"list-style-position\": true,\n  \"list-style-type\": true,\n  marker: true,\n  \"marker-end\": true,\n  \"marker-mid\": true,\n  \"marker-start\": true,\n  orphans: true,\n  \"overflow-wrap\": true,\n  \"paint-order\": true,\n  \"pointer-events\": true,\n  quotes: true,\n  \"ruby-align\": true,\n  \"ruby-position\": true,\n  \"shape-rendering\": true,\n  stroke: true,\n  \"stroke-dasharray\": true,\n  \"stroke-dashoffset\": true,\n  \"stroke-linecap\": true,\n  \"stroke-linejoin\": true,\n  \"stroke-miterlimit\": true,\n  \"stroke-opacity\": true,\n  \"stroke-width\": true,\n  \"tab-size\": true,\n  \"text-align\": true,\n  \"text-align-last\": true,\n  \"text-anchor\": true,\n  \"text-autospace\": true,\n  \"text-decoration-skip\": true,\n  \"text-decoration-skip-ink\": true,\n  \"text-emphasis-color\": true,\n  \"text-emphasis-position\": true,\n  \"text-emphasis-style\": true,\n  \"text-fill-color\": true,\n  \"text-combine-upright\": true,\n  \"text-indent\": true,\n  \"text-justify\": true,\n  \"text-orientation\": true,\n  \"text-rendering\": true,\n  \"text-shadow\": true,\n  \"text-size-adjust\": true,\n  \"text-spacing-trim\": true,\n  \"text-stroke-color\": true,\n  \"text-stroke-width\": true,\n  \"text-transform\": true,\n  \"text-underline-offset\": true,\n  \"text-underline-position\": true,\n  \"text-wrap\": true,\n  \"text-wrap-mode\": true,\n  \"text-wrap-style\": true,\n  visibility: true,\n  \"white-space\": true,\n  widows: true,\n  \"word-break\": true,\n  \"word-spacing\": true,\n  \"writing-mode\": true,\n};\n\nexport const polyfilledInheritedProps = [\n  \"image-resolution\",\n  \"orphans\",\n  \"widows\",\n];\n\nexport function getPolyfilledInheritedProps(): string[] {\n  const hooks: Plugin.PolyfilledInheritedPropsHook[] = Plugin.getHooksForName(\n    Plugin.HOOKS.POLYFILLED_INHERITED_PROPS,\n  );\n  return hooks.reduce(\n    (props, f) => props.concat(f()),\n    [].concat(polyfilledInheritedProps),\n  );\n}\n\nexport const supportedNamespaces = {\n  \"http://www.idpf.org/2007/ops\": true,\n  \"http://www.w3.org/1999/xhtml\": true,\n  \"http://www.w3.org/2000/svg\": true,\n  \"http://www.w3.org/1998/Math/MathML\": true,\n};\n\nexport const coupledPatterns = [\n  \"margin-%\",\n  \"padding-%\",\n  \"border-%-width\",\n  \"border-%-style\",\n  \"border-%-color\",\n  \"%\",\n];\n\nexport const coupledExtentPatterns = [\"max-%\", \"min-%\", \"%\"];\n\nexport const geomNames: { [key: string]: boolean } = (() => {\n  const sides = [\"left\", \"right\", \"top\", \"bottom\"];\n  const names = {\n    width: true,\n    height: true,\n    \"max-width\": true,\n    \"max-height\": true,\n    \"min-width\": true,\n    \"min-height\": true,\n  };\n  for (let i = 0; i < coupledPatterns.length; i++) {\n    for (let k = 0; k < sides.length; k++) {\n      const name = coupledPatterns[i].replace(\"%\", sides[k]);\n      names[name] = true;\n    }\n  }\n  return names;\n})();\n\nexport function buildCouplingMap(\n  sideMap: { [key: string]: string },\n  extentMap: { [key: string]: string },\n): { [key: string]: string } {\n  const map: { [key: string]: string } = {};\n  for (const pattern of coupledPatterns) {\n    for (const side in sideMap) {\n      const name1 = pattern.replace(\"%\", side);\n      const name2 = pattern.replace(\"%\", sideMap[side]);\n      map[name1] = name2;\n      map[name2] = name1;\n    }\n  }\n  for (const extentPattern of coupledExtentPatterns) {\n    for (const extent in extentMap) {\n      const name1 = extentPattern.replace(\"%\", extent);\n      const name2 = extentPattern.replace(\"%\", extentMap[extent]);\n      map[name1] = name2;\n      map[name2] = name1;\n    }\n  }\n  return map;\n}\n\nexport const couplingMapVert = buildCouplingMap(\n  {\n    \"block-start\": \"right\",\n    \"block-end\": \"left\",\n    \"inline-start\": \"top\",\n    \"inline-end\": \"bottom\",\n  },\n  { \"block-size\": \"width\", \"inline-size\": \"height\" },\n);\n\nexport const couplingMapHor = buildCouplingMap(\n  {\n    \"block-start\": \"top\",\n    \"block-end\": \"bottom\",\n    \"inline-start\": \"left\",\n    \"inline-end\": \"right\",\n  },\n  { \"block-size\": \"height\", \"inline-size\": \"width\" },\n);\n\nexport const couplingMapVertRtl = buildCouplingMap(\n  {\n    \"block-start\": \"right\",\n    \"block-end\": \"left\",\n    \"inline-start\": \"bottom\",\n    \"inline-end\": \"top\",\n  },\n  { \"block-size\": \"width\", \"inline-size\": \"height\" },\n);\n\nexport const couplingMapHorRtl = buildCouplingMap(\n  {\n    \"block-start\": \"top\",\n    \"block-end\": \"bottom\",\n    \"inline-start\": \"right\",\n    \"inline-end\": \"left\",\n  },\n  { \"block-size\": \"height\", \"inline-size\": \"width\" },\n);\n\nconst couplingMapLeftPage = buildCouplingMap(\n  { inside: \"right\", outside: \"left\" },\n  {},\n);\n\nconst couplingMapRightPage = buildCouplingMap(\n  { inside: \"left\", outside: \"right\" },\n  {},\n);\n\nexport class CascadeValue {\n  constructor(\n    public readonly value: Css.Val,\n    public readonly priority: number,\n  ) {}\n\n  getBaseValue(): CascadeValue {\n    return this;\n  }\n\n  filterValue(visitor: Css.Visitor): CascadeValue {\n    const value = this.value.visit(visitor);\n    if (value === this.value) {\n      return this;\n    }\n    return new CascadeValue(value, this.priority);\n  }\n\n  increaseSpecificity(specificity: number): CascadeValue {\n    if (specificity == 0) {\n      return this;\n    }\n    return new CascadeValue(this.value, this.priority + specificity);\n  }\n\n  evaluate(\n    context: Exprs.Context,\n    propName?: string,\n    percentRef?: number,\n    vertical?: boolean,\n  ): Css.Val {\n    if (propName && Css.isCustomPropName(propName)) {\n      return this.value;\n    }\n    return evaluateCSSToCSS(\n      context,\n      this.value,\n      propName,\n      percentRef,\n      vertical,\n    );\n  }\n\n  isEnabled(context: Exprs.Context): boolean {\n    return true;\n  }\n}\n\n/**\n * Internal subclass of CascadeValue. Should never be seen outside of the\n * cascade engine.\n */\nexport class ConditionalCascadeValue extends CascadeValue {\n  constructor(\n    value: Css.Val,\n    priority: number,\n    public readonly condition: Exprs.Val,\n  ) {\n    super(value, priority);\n  }\n\n  override getBaseValue(): CascadeValue {\n    return new CascadeValue(this.value, this.priority);\n  }\n\n  override filterValue(visitor: Css.Visitor): CascadeValue {\n    const value = this.value.visit(visitor);\n    if (value === this.value) {\n      return this;\n    }\n    return new ConditionalCascadeValue(value, this.priority, this.condition);\n  }\n\n  override increaseSpecificity(specificity: number): CascadeValue {\n    if (specificity == 0) {\n      return this;\n    }\n    return new ConditionalCascadeValue(\n      this.value,\n      this.priority + specificity,\n      this.condition,\n    );\n  }\n\n  isEnabled(context: Exprs.Context): boolean {\n    try {\n      return !!this.condition.evaluate(context);\n    } catch (err) {\n      Logging.logger.warn(err);\n    }\n    return false;\n  }\n}\n\n/**\n * @param tv current value (cannot be conditional)\n * @param av cascaded value (can be conditional)\n */\nexport function cascadeValues(\n  context: Exprs.Context,\n  tv: CascadeValue,\n  av: CascadeValue,\n): CascadeValue {\n  if ((!tv || av.priority >= tv.priority) && av.isEnabled(context)) {\n    return av.getBaseValue();\n  }\n  return tv;\n}\n\n/**\n * setProp with priority checking.\n * If context is given it is same as\n * setProp(style, name, cascadeValues(context, getProp(style, name), value))\n */\nexport function setPropCascadeValue(\n  style: ElementStyle,\n  name: string,\n  value: CascadeValue,\n  context?: Exprs.Context,\n): void {\n  if (!style) {\n    return;\n  }\n  if (!value) {\n    delete style[name];\n  } else {\n    const tv = style[name] as CascadeValue;\n    if (!tv || value.priority >= tv.priority) {\n      if (context) {\n        if (value.isEnabled(context)) {\n          style[name] = value.getBaseValue();\n        }\n      } else {\n        style[name] = value;\n      }\n    }\n  }\n}\n\nexport type ElementStyleMap = {\n  [key: string]: ElementStyle;\n};\n\nexport const SPECIALS = {\n  \"region-id\": true,\n  \"fragment-selector-id\": true,\n};\n\nexport function isSpecialName(name: string): boolean {\n  return !!SPECIALS[name];\n}\n\nexport function isMapName(name: string): boolean {\n  return name.charAt(0) === \"_\" && name !== \"_viewConditionalStyles\";\n}\n\nexport function isPropName(name: string): boolean {\n  return name.charAt(0) !== \"_\" && !SPECIALS[name];\n}\n\nexport function isInherited(name: string): boolean {\n  return !!inheritedProps[name] || Css.isCustomPropName(name);\n}\n\nexport function getProp(style: ElementStyle, name: string): CascadeValue {\n  return style[name] as CascadeValue;\n}\n\nexport function setProp(\n  style: ElementStyle,\n  name: string,\n  value: CascadeValue,\n): void {\n  if (!value) {\n    delete style[name];\n  } else {\n    style[name] = value;\n  }\n}\n\nexport function getStyleMap(\n  style: ElementStyle,\n  name: string,\n): ElementStyleMap {\n  return style[name] as ElementStyleMap;\n}\n\nexport function getMutableStyleMap(\n  style: ElementStyle,\n  name: string,\n): ElementStyleMap {\n  let r = style[name] as ElementStyleMap;\n  if (!r) {\n    r = {};\n    style[name] = r;\n  }\n  return r;\n}\n\nexport const getViewConditionalStyleMap = (\n  style: ElementStyle,\n): { matcher: Matchers.Matcher; styles: ElementStyle }[] => {\n  let r = style[\"_viewConditionalStyles\"] as {\n    matcher: Matchers.Matcher;\n    styles: ElementStyle;\n  }[];\n  if (!r) {\n    r = [];\n    style[\"_viewConditionalStyles\"] = r;\n  }\n  return r;\n};\n\nexport function getSpecial(style: ElementStyle, name: string): CascadeValue[] {\n  return style[name] as CascadeValue[];\n}\n\nexport function getMutableSpecial(\n  style: ElementStyle,\n  name: string,\n): CascadeValue[] {\n  let r = style[name] as CascadeValue[];\n  if (!r) {\n    r = [];\n    style[name] = r;\n  }\n  return r;\n}\n\nexport function mergeIn(\n  context: Exprs.Context,\n  target: ElementStyle,\n  style: ElementStyle,\n  specificity: number,\n  pseudoelement: string | null,\n  regionId: string | null,\n  viewConditionMatcher: Matchers.Matcher | null,\n): void {\n  const hierarchy = [\n    { id: pseudoelement, styleKey: \"_pseudos\" },\n    { id: regionId, styleKey: \"_regions\" },\n  ];\n  hierarchy.forEach((item) => {\n    if (item.id) {\n      const styleMap = getMutableStyleMap(target, item.styleKey);\n      target = styleMap[item.id];\n      if (!target) {\n        target = {} as ElementStyle;\n        styleMap[item.id] = target;\n      }\n    }\n  });\n  if (viewConditionMatcher) {\n    const styleMap = getViewConditionalStyleMap(target);\n    target = {} as ElementStyle;\n    styleMap.push({\n      styles: target,\n      matcher: viewConditionMatcher,\n    });\n  }\n  for (const prop in style) {\n    if (isMapName(prop)) {\n      continue;\n    }\n    if (isSpecialName(prop)) {\n      // special properties: list of all assigned values\n      const as = getSpecial(style, prop);\n      const ts = getMutableSpecial(target, prop);\n      Array.prototype.push.apply(ts, as);\n    } else {\n      // regular properties: higher priority wins\n      const cascval = getProp(style, prop);\n      if (!cascval.isEnabled(context)) {\n        continue;\n      }\n      const av = cascval.increaseSpecificity(specificity);\n      setPropCascadeValue(target, prop, av, context);\n\n      // Expand shorthand property (its value contains variables).\n      const propListLH = (\n        context as Exprs.Context & {\n          style: { validatorSet: CssValidator.ValidatorSet };\n        }\n      ).style?.validatorSet.shorthands[prop]?.propList;\n      if (propListLH) {\n        for (const propLH of propListLH) {\n          const avLH = new CascadeValue(Css.empty, av.priority);\n          setPropCascadeValue(target, propLH, avLH, context);\n        }\n      }\n    }\n  }\n}\n\nexport function mergeAll(\n  context: Exprs.Context,\n  styles: ElementStyle[],\n): ElementStyle {\n  const target = {} as ElementStyle;\n  for (let k = 0; k < styles.length; k++) {\n    mergeIn(context, target, styles[k], 0, null, null, null);\n  }\n  return target;\n}\n\nexport function chainActions(\n  chain: ChainedAction[],\n  action: CascadeAction,\n): CascadeAction {\n  if (chain.length > 0) {\n    chain.sort((a, b) => b.getPriority() - a.getPriority());\n    let chained: ChainedAction | null = null;\n    for (let i = chain.length - 1; i >= 0; i--) {\n      chained = chain[i];\n      chained.chained = action;\n      action = chained;\n    }\n    return chained;\n  }\n  return action;\n}\n\nexport class InheritanceVisitor extends Css.FilterVisitor {\n  propName: string = \"\";\n\n  constructor(\n    public readonly props: ElementStyle,\n    public readonly context: Exprs.Context,\n  ) {\n    super();\n  }\n\n  setPropName(name: string): void {\n    this.propName = name;\n  }\n\n  private getFontSize() {\n    const cascval = getProp(this.props, \"font-size\");\n    if (!cascval.value.isNumeric()) {\n      // FIXME: cascval may be Ident value e.g. \"smaller\"\n      return Exprs.defaultUnitSizes[\"em\"];\n    }\n    const n = cascval.value as Css.Numeric;\n    if (!Exprs.isAbsoluteLengthUnit(n.unit)) {\n      throw new Error(\"Unexpected state\");\n    }\n    return n.num * Exprs.defaultUnitSizes[n.unit];\n  }\n\n  override visitNumeric(numeric: Css.Numeric): Css.Val {\n    Asserts.assert(this.context);\n    if (this.propName === \"font-size\") {\n      return convertFontSizeToPx(numeric, this.getFontSize(), this.context);\n    } else if (\n      numeric.unit === \"em\" ||\n      numeric.unit === \"rem\" ||\n      numeric.unit === \"lh\" ||\n      numeric.unit === \"rlh\"\n    ) {\n      return convertFontRelativeLengthToPx(\n        numeric,\n        this.getFontSize(),\n        this.context,\n      );\n    }\n    return numeric;\n  }\n\n  override visitExpr(expr: Css.Expr): Css.Val {\n    if (this.propName == \"font-size\") {\n      const val = evaluateCSSToCSS(this.context, expr, this.propName);\n      return val.visit(this);\n    }\n    return expr;\n  }\n}\n\nexport function convertFontRelativeLengthToPx(\n  numeric: Css.Numeric,\n  baseFontSize: number,\n  context: Exprs.Context,\n): Css.Numeric {\n  const unit = numeric.unit;\n  const num = numeric.num;\n  if (unit === \"em\") {\n    return new Css.Numeric(num * baseFontSize, \"px\");\n  } else if (unit === \"rem\") {\n    return new Css.Numeric(num * context.fontSize(), \"px\");\n  } else if (unit === \"rlh\") {\n    return new Css.Numeric(num * context.rootLineHeight, \"px\");\n  } else {\n    return numeric;\n  }\n}\n\nexport function convertFontSizeToPx(\n  numeric: Css.Numeric,\n  parentFontSize: number,\n  context: Exprs.Context,\n): Css.Numeric {\n  numeric = convertFontRelativeLengthToPx(numeric, parentFontSize, context);\n  const unit = numeric.unit;\n  const num = numeric.num;\n  if (unit === \"px\") {\n    return numeric;\n  } else if (unit === \"%\") {\n    return new Css.Numeric((num / 100) * parentFontSize, \"px\");\n  } else {\n    return new Css.Numeric(num * context.queryUnitSize(unit, false), \"px\");\n  }\n}\n\nexport type ActionTable = {\n  [key: string]: CascadeAction;\n};\n\nexport class CascadeAction {\n  apply(cascadeInstance: CascadeInstance): void {}\n\n  mergeWith(other: CascadeAction): CascadeAction {\n    return new CompoundAction([this, other]);\n  }\n\n  clone(): CascadeAction {\n    // Mutable actions will override\n    return this;\n  }\n}\n\nexport class ConditionItemAction extends CascadeAction {\n  constructor(public readonly conditionItem: ConditionItem) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    cascadeInstance.pushConditionItem(\n      this.conditionItem.fresh(cascadeInstance),\n    );\n  }\n}\n\nexport class CompoundAction extends CascadeAction {\n  constructor(public readonly list: CascadeAction[]) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    for (let i = 0; i < this.list.length; i++) {\n      this.list[i].apply(cascadeInstance);\n    }\n  }\n\n  override mergeWith(other: CascadeAction): CascadeAction {\n    this.list.push(other);\n    return this;\n  }\n\n  override clone(): CascadeAction {\n    return new CompoundAction([].concat(this.list));\n  }\n}\n\nexport class ApplyRuleAction extends CascadeAction {\n  constructor(\n    public readonly style: ElementStyle,\n    public readonly specificity: number,\n    public readonly pseudoelement: string | null,\n    public readonly regionId: string | null,\n    public readonly viewConditionId: string | null,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    mergeIn(\n      cascadeInstance.context,\n      cascadeInstance.currentStyle,\n      this.style,\n      this.specificity,\n      this.pseudoelement,\n      this.regionId,\n      cascadeInstance.buildViewConditionMatcher(this.viewConditionId),\n    );\n  }\n}\n\nexport class ChainedAction extends CascadeAction {\n  chained: CascadeAction = null;\n\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    this.chained.apply(cascadeInstance);\n  }\n\n  getPriority(): number {\n    return 0;\n  }\n\n  makePrimary(cascade: Cascade): boolean {\n    // cannot be made primary\n    return false;\n  }\n}\n\nexport class CheckClassAction extends ChainedAction {\n  constructor(public readonly className: string) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.currentClassNames.includes(this.className)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 10;\n  }\n  // class should be checked after id\n\n  override makePrimary(cascade: Cascade): boolean {\n    if (this.chained) {\n      cascade.insertInTable(cascade.classes, this.className, this.chained);\n    }\n    return true;\n  }\n}\n\nexport class CheckIdAction extends ChainedAction {\n  constructor(public readonly id: string) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (\n      cascadeInstance.currentId == this.id ||\n      cascadeInstance.currentXmlId == this.id\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 11;\n  }\n  // id should be checked after :root\n\n  override makePrimary(cascade: Cascade): boolean {\n    if (this.chained) {\n      cascade.insertInTable(cascade.ids, this.id, this.chained);\n    }\n    return true;\n  }\n}\n\nexport class CheckLocalNameAction extends ChainedAction {\n  constructor(public readonly localName: string) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.currentLocalName == this.localName) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 8;\n  }\n  // tag is a pretty good thing to check, after epub:type\n\n  override makePrimary(cascade: Cascade): boolean {\n    if (this.chained) {\n      cascade.insertInTable(cascade.tags, this.localName, this.chained);\n    }\n    return true;\n  }\n}\n\nexport class CheckNSTagAction extends ChainedAction {\n  constructor(\n    public readonly ns: string,\n    public readonly localName: string,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (\n      cascadeInstance.currentLocalName == this.localName &&\n      cascadeInstance.currentNamespace == this.ns\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 8;\n  }\n  // tag is a pretty good thing to check, after epub:type\n\n  override makePrimary(cascade: Cascade): boolean {\n    if (this.chained) {\n      let prefix = cascade.nsPrefix[this.ns];\n      if (!prefix) {\n        prefix = `ns${cascade.nsCount++}:`;\n        cascade.nsPrefix[this.ns] = prefix;\n      }\n      const nsTag = prefix + this.localName;\n      cascade.insertInTable(cascade.nstags, nsTag, this.chained);\n    }\n    return true;\n  }\n}\n\nexport class CheckTargetEpubTypeAction extends ChainedAction {\n  constructor(\n    public readonly epubTypePatt: RegExp,\n    public readonly targetLocalName?: string,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    const elem = cascadeInstance.currentElement;\n    if (elem instanceof HTMLAnchorElement) {\n      if (\n        elem.hash &&\n        elem.href == elem.baseURI.replace(/#.*$/, \"\") + elem.hash\n      ) {\n        const id = elem.hash.substring(1);\n        const target = elem.ownerDocument.getElementById(id);\n        if (\n          target &&\n          (!this.targetLocalName || target.localName == this.targetLocalName)\n        ) {\n          const epubType =\n            target.getAttributeNS(Base.NS.epub, \"type\") ||\n            target.getAttribute(\"epub:type\");\n          if (epubType && epubType.match(this.epubTypePatt)) {\n            this.chained.apply(cascadeInstance);\n          }\n        }\n      }\n    }\n  }\n}\n\nexport class CheckNamespaceAction extends ChainedAction {\n  constructor(public readonly ns: string) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.currentNamespace == this.ns) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n}\n\nfunction checkAttribute(\n  element: Element,\n  ns: string | null,\n  name: string,\n  pred: (element: Element, ns: string, name: string) => boolean,\n): boolean {\n  if (!element) {\n    return false;\n  }\n  if (ns !== null) {\n    return pred(element, ns, name);\n  }\n  // For wildcard namespace\n  for (const qname of element.getAttributeNames()) {\n    if (qname === name || qname.endsWith(`:${name}`)) {\n      if (\n        pred(\n          element,\n          qname === name ? \"\" : element.lookupNamespaceURI(qname.split(\":\")[0]),\n          name,\n        )\n      ) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nexport class CheckAttributePresentAction extends ChainedAction {\n  constructor(\n    public readonly ns: string,\n    public readonly name: string,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (\n      checkAttribute(\n        cascadeInstance.currentElement,\n        this.ns,\n        this.name,\n        (element, ns, name) => element.hasAttributeNS(ns, name),\n      )\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n}\n\nexport class CheckAttributeEqAction extends ChainedAction {\n  constructor(\n    public readonly ns: string,\n    public readonly name: string,\n    public readonly value: string,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (\n      checkAttribute(\n        cascadeInstance.currentElement,\n        this.ns,\n        this.name,\n        (element, ns, name) => element.getAttributeNS(ns, name) == this.value,\n      )\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    if (this.name == \"type\" && this.ns == Base.NS.epub) {\n      return 9; // epub:type is a pretty good thing to check\n    }\n    return 0;\n  }\n\n  override makePrimary(cascade: Cascade): boolean {\n    if (this.name == \"type\" && this.ns == Base.NS.epub) {\n      if (this.chained) {\n        cascade.insertInTable(cascade.epubtypes, this.value, this.chained);\n      }\n      return true;\n    }\n    return false;\n  }\n}\n\nexport class CheckNamespaceSupportedAction extends ChainedAction {\n  constructor(\n    public readonly ns: string,\n    public readonly name: string,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (\n      checkAttribute(\n        cascadeInstance.currentElement,\n        this.ns,\n        this.name,\n        (element, ns, name) =>\n          !!supportedNamespaces[element.getAttributeNS(ns, name)],\n      )\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 0;\n  }\n\n  override makePrimary(cascade: Cascade): boolean {\n    return false;\n  }\n}\n\nexport class CheckAttributeRegExpAction extends ChainedAction {\n  constructor(\n    public readonly ns: string,\n    public readonly name: string,\n    public readonly regexp: RegExp,\n  ) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (\n      checkAttribute(\n        cascadeInstance.currentElement,\n        this.ns,\n        this.name,\n        (element, ns, name) =>\n          !!element.getAttributeNS(ns, name)?.match(this.regexp),\n      )\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n}\n\nexport class CheckLangAction extends ChainedAction {\n  constructor(public readonly langRegExp: RegExp) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.lang.match(this.langRegExp)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n}\n\nexport class IsFirstAction extends ChainedAction {\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.isFirst) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 6;\n  }\n}\n\nexport class IsRootAction extends ChainedAction {\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.isRoot) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 12; // :root is the first thing to check\n  }\n}\n\nexport class IsNthAction extends ChainedAction {\n  constructor(\n    public readonly a: number,\n    public readonly b: number,\n  ) {\n    super();\n  }\n\n  /**\n   * Checkes whether given order can be represented as an+b with a non-negative\n   * interger n\n   */\n  protected matchANPlusB(order: number): boolean {\n    return Matchers.matchANPlusB(order, this.a, this.b);\n  }\n}\n\nexport class IsNthSiblingAction extends IsNthAction {\n  constructor(a: number, b: number) {\n    super(a, b);\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (this.matchANPlusB(cascadeInstance.currentSiblingOrder)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\nexport class IsNthSiblingOfTypeAction extends IsNthAction {\n  constructor(a: number, b: number) {\n    super(a, b);\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    const order =\n      cascadeInstance.currentSiblingTypeCounts[\n        cascadeInstance.currentNamespace\n      ][cascadeInstance.currentLocalName];\n    if (this.matchANPlusB(order)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\nexport class IsNthLastSiblingAction extends IsNthAction {\n  constructor(a: number, b: number) {\n    super(a, b);\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    let order = cascadeInstance.currentFollowingSiblingOrder;\n    if (order === null) {\n      order = cascadeInstance.currentFollowingSiblingOrder =\n        cascadeInstance.currentElement.parentNode.childElementCount -\n        cascadeInstance.currentSiblingOrder +\n        1;\n    }\n    if (this.matchANPlusB(order)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 4;\n  }\n}\n\nexport class IsNthLastSiblingOfTypeAction extends IsNthAction {\n  constructor(a: number, b: number) {\n    super(a, b);\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    const counts = cascadeInstance.currentFollowingSiblingTypeCounts;\n    if (!counts[cascadeInstance.currentNamespace]) {\n      let elem = cascadeInstance.currentElement;\n      do {\n        const ns = elem.namespaceURI;\n        const localName = elem.localName;\n        let nsCounts = counts[ns];\n        if (!nsCounts) {\n          nsCounts = counts[ns] = {};\n        }\n        nsCounts[localName] = (nsCounts[localName] || 0) + 1;\n      } while ((elem = elem.nextElementSibling));\n    }\n    if (\n      this.matchANPlusB(\n        counts[cascadeInstance.currentNamespace][\n          cascadeInstance.currentLocalName\n        ],\n      )\n    ) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 4;\n  }\n}\n\nexport class IsEmptyAction extends ChainedAction {\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    let node: Node | null = cascadeInstance.currentElement.firstChild;\n    while (node) {\n      switch (node.nodeType) {\n        case Node.ELEMENT_NODE:\n          return;\n        case Node.TEXT_NODE:\n          if ((node as Text).length > 0) {\n            return;\n          }\n      }\n      node = node.nextSibling;\n    }\n    this.chained.apply(cascadeInstance);\n  }\n\n  override getPriority(): number {\n    return 4;\n  }\n}\n\nexport class IsEnabledAction extends ChainedAction {\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    const elem = cascadeInstance.currentElement;\n    if ((elem as any).disabled === false) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\nexport class IsDisabledAction extends ChainedAction {\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    const elem = cascadeInstance.currentElement;\n    if ((elem as any).disabled === true) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\nexport class IsCheckedAction extends ChainedAction {\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    const elem = cascadeInstance.currentElement;\n    if ((elem as any).selected === true || (elem as any).checked === true) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\nexport class CheckConditionAction extends ChainedAction {\n  constructor(public readonly condition: string) {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    if (cascadeInstance.conditions[this.condition]) {\n      try {\n        cascadeInstance.dependentConditions.push(this.condition);\n        this.chained.apply(cascadeInstance);\n      } finally {\n        cascadeInstance.dependentConditions.pop();\n      }\n    }\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\nexport class CheckAppliedAction extends CascadeAction {\n  applied = false;\n\n  constructor() {\n    super();\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    this.applied = true;\n  }\n\n  override clone(): CascadeAction {\n    const cloned = new CheckAppliedAction();\n    cloned.applied = this.applied;\n    return cloned;\n  }\n}\n\n/**\n * Cascade Action for :is() and similar pseudo-classes\n */\nexport class MatchesAction extends ChainedAction {\n  checkAppliedAction: CheckAppliedAction;\n  firstActions: CascadeAction[] = [];\n\n  constructor(chains: ChainedAction[][]) {\n    super();\n    this.checkAppliedAction = new CheckAppliedAction();\n    for (const chain of chains) {\n      this.firstActions.push(chainActions(chain, this.checkAppliedAction));\n    }\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    for (const firstAction of this.firstActions) {\n      firstAction.apply(cascadeInstance);\n      if (this.checkAppliedAction.applied) {\n        break;\n      }\n    }\n    if (this.checkAppliedAction.applied === this.positive()) {\n      this.chained.apply(cascadeInstance);\n    }\n    this.checkAppliedAction.applied = false;\n  }\n\n  override getPriority(): number {\n    return Math.max(\n      ...this.firstActions.map((firstAction) =>\n        firstAction instanceof ChainedAction ? firstAction.getPriority() : 0,\n      ),\n    );\n  }\n\n  positive(): boolean {\n    return true;\n  }\n\n  relational(): boolean {\n    return false;\n  }\n}\n\n/**\n * Cascade Action for :not() pseudo-class\n */\nexport class MatchesNoneAction extends MatchesAction {\n  override positive(): boolean {\n    return false;\n  }\n}\n\n/**\n * Cascade Action for :has() pseudo-class\n */\nexport class MatchesRelationalAction extends MatchesAction {\n  constructor(public selectorTexts: string[]) {\n    super([]);\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    for (const selectorText of this.selectorTexts) {\n      let selectorWithScope: string;\n      let scopingRoot: ParentNode;\n      if (/^\\s*[+~]/.test(selectorText)) {\n        // :has(+ F) or :has(~ F)\n        scopingRoot = cascadeInstance.currentElement.parentNode;\n        const index = Array.from(scopingRoot.children).indexOf(\n          cascadeInstance.currentElement,\n        );\n        selectorWithScope = `:scope > :nth-child(${index + 1}) ${selectorText}`;\n      } else {\n        // :has(F) or :has(> F)\n        scopingRoot = cascadeInstance.currentElement;\n        selectorWithScope = `:scope ${selectorText}`;\n      }\n      try {\n        if (scopingRoot.querySelector(selectorWithScope)) {\n          this.checkAppliedAction.apply(cascadeInstance);\n          break;\n        }\n      } catch (e) {}\n    }\n    if (this.checkAppliedAction.applied) {\n      this.chained.apply(cascadeInstance);\n    }\n    this.checkAppliedAction.applied = false;\n  }\n\n  override relational(): boolean {\n    return true;\n  }\n}\n\n/**\n * Cascade Action for :nth-child(An+B of S) pseudo-class\n */\nexport class IsNthSiblingOfSelectorAction extends IsNthAction {\n  checkAppliedAction: CheckAppliedAction;\n  firstActions: CascadeAction[] = [];\n\n  constructor(a: number, b: number, chains: ChainedAction[][]) {\n    super(a, b);\n    this.checkAppliedAction = new CheckAppliedAction();\n    for (const chain of chains) {\n      this.firstActions.push(chainActions(chain, this.checkAppliedAction));\n    }\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    // Check if current element matches the selector\n    for (const firstAction of this.firstActions) {\n      firstAction.apply(cascadeInstance);\n      if (this.checkAppliedAction.applied) {\n        break;\n      }\n    }\n    if (!this.checkAppliedAction.applied) {\n      return; // Element doesn't match selector, so :nth-child(of S) doesn't match\n    }\n    this.checkAppliedAction.applied = false;\n\n    // Count siblings that match the selector\n    const elem = cascadeInstance.currentElement;\n    let order = 1;\n    let sibling = elem.previousElementSibling;\n    while (sibling) {\n      if (this.matchesSelector(sibling, cascadeInstance)) {\n        order++;\n      }\n      sibling = sibling.previousElementSibling;\n    }\n\n    if (this.matchANPlusB(order)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  protected matchesSelector(\n    element: Element,\n    cascadeInstance: CascadeInstance,\n  ): boolean {\n    // Temporarily save and restore cascade state to test against sibling\n    const savedElement = cascadeInstance.currentElement;\n    const savedNS = cascadeInstance.currentNamespace;\n    const savedLocalName = cascadeInstance.currentLocalName;\n    const savedId = cascadeInstance.currentId;\n    const savedClassNames = cascadeInstance.currentClassNames;\n    const savedSiblingOrder = cascadeInstance.currentSiblingOrder;\n\n    cascadeInstance.currentElement = element;\n    cascadeInstance.currentNamespace = element.namespaceURI || \"\";\n    cascadeInstance.currentLocalName = element.localName;\n    cascadeInstance.currentId = element.id;\n    cascadeInstance.currentClassNames = element.classList\n      ? Array.from(element.classList)\n      : [];\n\n    // Calculate sibling order for the element\n    let siblingOrder = 1;\n    let sib = element.previousElementSibling;\n    while (sib) {\n      siblingOrder++;\n      sib = sib.previousElementSibling;\n    }\n    cascadeInstance.currentSiblingOrder = siblingOrder;\n\n    for (const firstAction of this.firstActions) {\n      firstAction.apply(cascadeInstance);\n      if (this.checkAppliedAction.applied) {\n        break;\n      }\n    }\n    const matched = this.checkAppliedAction.applied;\n    this.checkAppliedAction.applied = false;\n\n    // Restore cascade state\n    cascadeInstance.currentElement = savedElement;\n    cascadeInstance.currentNamespace = savedNS;\n    cascadeInstance.currentLocalName = savedLocalName;\n    cascadeInstance.currentId = savedId;\n    cascadeInstance.currentClassNames = savedClassNames;\n    cascadeInstance.currentSiblingOrder = savedSiblingOrder;\n\n    return matched;\n  }\n\n  override getPriority(): number {\n    return 5;\n  }\n}\n\n/**\n * Cascade Action for :nth-last-child(An+B of S) pseudo-class\n */\nexport class IsNthLastSiblingOfSelectorAction extends IsNthSiblingOfSelectorAction {\n  constructor(a: number, b: number, chains: ChainedAction[][]) {\n    super(a, b, chains);\n  }\n\n  override apply(cascadeInstance: CascadeInstance): void {\n    // Check if current element matches the selector\n    for (const firstAction of this.firstActions) {\n      firstAction.apply(cascadeInstance);\n      if (this.checkAppliedAction.applied) {\n        break;\n      }\n    }\n    if (!this.checkAppliedAction.applied) {\n      return; // Element doesn't match selector, so :nth-last-child(of S) doesn't match\n    }\n    this.checkAppliedAction.applied = false;\n\n    // Count siblings (from end) that match the selector\n    const elem = cascadeInstance.currentElement;\n    let order = 1;\n    let sibling = elem.nextElementSibling;\n    while (sibling) {\n      if (this.matchesSelector(sibling, cascadeInstance)) {\n        order++;\n      }\n      sibling = sibling.nextElementSibling;\n    }\n\n    if (this.matchANPlusB(order)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 4;\n  }\n}\n\n/**\n * An object that is notified as elements are pushed and popped and typically\n * controls a \"named condition\" (which is a count associated with a name).\n */\nexport interface ConditionItem {\n  /**\n   * Returns a \"fresh\" copy of this item. May be this if immutable.\n   */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem;\n\n  /**\n   * Depth is 0 for element itself and its siblings, 1 for direct children and\n   * -1 for the parent.\n   */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean;\n\n  /**\n   * @return return true if no more notifications are desired\n   */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean;\n}\n\nexport class AbstractConditionItem {\n  constructor(\n    public readonly condition: string,\n    public readonly viewConditionId: string | null,\n    public readonly viewCondition: Matchers.Matcher,\n  ) {}\n\n  increment(cascadeInstance: CascadeInstance) {\n    cascadeInstance.increment(this.condition, this.viewCondition);\n  }\n\n  decrement(cascadeInstance: CascadeInstance) {\n    cascadeInstance.decrement(this.condition, this.viewCondition);\n  }\n\n  buildViewConditionMatcher(\n    cascadeInstance: CascadeInstance,\n  ): Matchers.Matcher {\n    return cascadeInstance.buildViewConditionMatcher(this.viewConditionId);\n  }\n}\n\nexport class DescendantConditionItem\n  extends AbstractConditionItem\n  implements ConditionItem\n{\n  constructor(\n    condition: string,\n    viewConditionId: string | null,\n    viewCondition: Matchers.Matcher,\n  ) {\n    super(condition, viewConditionId, viewCondition);\n  }\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return new DescendantConditionItem(\n      this.condition,\n      this.viewConditionId,\n      this.buildViewConditionMatcher(cascadeInstance),\n    );\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      this.increment(cascadeInstance);\n    }\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      this.decrement(cascadeInstance);\n      return true;\n    }\n    return false;\n  }\n}\n\nexport class ChildConditionItem\n  extends AbstractConditionItem\n  implements ConditionItem\n{\n  constructor(\n    condition: string,\n    viewConditionId: string | null,\n    viewCondition: Matchers.Matcher,\n  ) {\n    super(condition, viewConditionId, viewCondition);\n  }\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return new ChildConditionItem(\n      this.condition,\n      this.viewConditionId,\n      this.buildViewConditionMatcher(cascadeInstance),\n    );\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      this.increment(cascadeInstance);\n    } else if (depth == 1) {\n      this.decrement(cascadeInstance);\n    }\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      this.decrement(cascadeInstance);\n      return true;\n    } else if (depth == 1) {\n      this.increment(cascadeInstance);\n    }\n    return false;\n  }\n}\n\nexport class AdjacentSiblingConditionItem\n  extends AbstractConditionItem\n  implements ConditionItem\n{\n  fired: boolean = false;\n\n  constructor(\n    condition: string,\n    viewConditionId: string | null,\n    viewCondition: Matchers.Matcher,\n  ) {\n    super(condition, viewConditionId, viewCondition);\n  }\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return new AdjacentSiblingConditionItem(\n      this.condition,\n      this.viewConditionId,\n      this.buildViewConditionMatcher(cascadeInstance),\n    );\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (this.fired) {\n      this.decrement(cascadeInstance);\n      return true;\n    }\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (this.fired) {\n      this.decrement(cascadeInstance);\n      return true;\n    }\n    if (depth == 0) {\n      // Leaving element that triggered this item.\n      this.fired = true;\n      this.increment(cascadeInstance);\n    }\n    return false;\n  }\n}\n\nexport class FollowingSiblingConditionItem\n  extends AbstractConditionItem\n  implements ConditionItem\n{\n  fired: boolean = false;\n\n  constructor(\n    condition: string,\n    viewConditionId: string | null,\n    viewCondition: Matchers.Matcher,\n  ) {\n    super(condition, viewConditionId, viewCondition);\n  }\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return new FollowingSiblingConditionItem(\n      this.condition,\n      this.viewConditionId,\n      this.buildViewConditionMatcher(cascadeInstance),\n    );\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (this.fired) {\n      if (depth == -1) {\n        this.increment(cascadeInstance);\n      } else if (depth == 0) {\n        this.decrement(cascadeInstance);\n      }\n    }\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (this.fired) {\n      if (depth == -1) {\n        this.decrement(cascadeInstance);\n        return true;\n      } else if (depth == 0) {\n        this.increment(cascadeInstance);\n      }\n    } else {\n      if (depth == 0) {\n        // Leaving element that triggered this item.\n        this.fired = true;\n        this.increment(cascadeInstance);\n      }\n    }\n    return false;\n  }\n}\n\n/**\n * Not a true condition item, this class manages proper handling of \"after\"\n * pseudoelement.\n */\nexport class AfterPseudoelementItem implements ConditionItem {\n  constructor(\n    public readonly afterprop: ElementStyle,\n    public readonly element: Element,\n  ) {}\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return this;\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      cascadeInstance.processPseudoelementProps(this.afterprop, this.element);\n      return true;\n    }\n    return false;\n  }\n}\n\n/**\n * Not a true condition item, this class restores current language.\n */\nexport class RestoreLangItem implements ConditionItem {\n  constructor(public readonly lang: string) {}\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return this;\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      cascadeInstance.lang = this.lang;\n      return true;\n    }\n    return false;\n  }\n}\n\n/**\n * Not a true condition item, this class manages inheritance of quotes property\n */\nexport class QuotesScopeItem implements ConditionItem {\n  constructor(public readonly oldQuotes: Css.Str[]) {}\n\n  /** @override */\n  fresh(cascadeInstance: CascadeInstance): ConditionItem {\n    return this;\n  }\n\n  /** @override */\n  push(cascadeInstance: CascadeInstance, depth: number): boolean {\n    return false;\n  }\n\n  /** @override */\n  pop(cascadeInstance: CascadeInstance, depth: number): boolean {\n    if (depth == 0) {\n      cascadeInstance.quotes = this.oldQuotes;\n      return true;\n    }\n    return false;\n  }\n}\nexport type CounterValues = {\n  [key: string]: number[];\n};\n\nexport interface CounterListener {\n  countersOfId(id: string, counters: CounterValues);\n\n  getExprContentListener(): Vtree.ExprContentListener;\n}\n\nexport interface CounterResolver {\n  setStyler(styler: CssStyler.AbstractStyler): void;\n\n  /**\n   * Returns an Exprs.Val, whose value is calculated at the layout time by\n   * retrieving the innermost page-based counter (null if it does not exist) by\n   * its name and formatting the value into a string.\n   * @param name Name of the page-based counter to be retrieved\n   * @param format A function that formats the counter value into a string\n   */\n  getPageCounterVal(\n    name: string,\n    format: (p1: number | null) => string,\n  ): Exprs.Val;\n\n  /**\n   * Returns an Exprs.Val, whose value is calculated at the layout time by\n   * retrieving the page-based counters by its name and formatting the values\n   * into a string.\n   * @param name Name of the page-based counters to be retrieved\n   * @param format A function that formats the counter values (passed as an\n   *     array ordered by the nesting depth with the outermost counter first and\n   *     the innermost last) into a string\n   */\n  getPageCountersVal(name: string, format: (p1: number[]) => string): Exprs.Val;\n\n  getTargetCounterVal(\n    url: string,\n    name: string,\n    format: (p1: number | null) => string,\n  ): Exprs.Val;\n\n  getTargetCountersVal(\n    url: string,\n    name: string,\n    format: (p1: number[]) => string,\n  ): Exprs.Val;\n\n  /**\n   * Get value of the CSS target-text() function\n   * https://drafts.csswg.org/css-content-3/#target-text\n   * @param url Target URL (with fragment identifier)\n   * @param pseudoElement Pseudo-element selector ('content', 'before', 'after', 'first-letter', 'marker')\n   */\n  getTargetTextVal(url: string, pseudoElement: string): Exprs.Val;\n\n  /**\n   * Get value of the CSS string() function\n   * https://drafts.csswg.org/css-gcpm-3/#using-named-strings\n   */\n  getNamedStringVal(name: string, retrievePosition: string): Exprs.Val;\n\n  /**\n   * Set named string for the CSS string-set property\n   * https://drafts.csswg.org/css-gcpm-3/#setting-named-strings-the-string-set-pro\n   */\n  setNamedString(\n    name: string,\n    stringValue: string,\n    elementOffset: number,\n  ): void;\n\n  /**\n   * Get value of the CSS element() function\n   * https://drafts.csswg.org/css-gcpm-3/#running-elements\n   */\n  getRunningElementVal(name: string, retrievePosition: string): Exprs.Val;\n\n  /**\n   * Set running element\n   * https://drafts.csswg.org/css-gcpm-3/#running-elements\n   */\n  setRunningElement(name: string, elementOffset: number): void;\n}\n\nexport class AttrValueFilterVisitor extends Css.FilterVisitor {\n  constructor(public element: Element) {\n    super();\n  }\n\n  private createValueFromString(str: string | null, type: string): Css.Val {\n    switch (type) {\n      case \"url\":\n        if (str) {\n          return new Css.URL(str); // TODO should convert to absolute path\n        }\n        return new Css.URL(\"about:invalid\");\n      case \"string\":\n      default:\n        if (str) {\n          return new Css.Str(str);\n        }\n        return new Css.Str(\"\");\n    }\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    if (func.name !== \"attr\") {\n      return super.visitFunc(func);\n    }\n    let type = \"string\";\n    let attributeName: string | null = null;\n    let defaultValue: Css.Val = null;\n    if (func.values[0] instanceof Css.SpaceList) {\n      const values = (func.values[0] as Css.SpaceList).values;\n      if (values.length >= 2) {\n        type = values[1].stringValue();\n      }\n      attributeName = values[0].stringValue();\n    } else {\n      attributeName = func.values[0].stringValue();\n    }\n    if (func.values.length > 1) {\n      defaultValue = this.createValueFromString(\n        func.values[1].stringValue(),\n        type,\n      );\n    } else {\n      defaultValue = this.createValueFromString(null, type);\n    }\n    if (this.element && this.element.hasAttribute(attributeName)) {\n      return this.createValueFromString(\n        this.element.getAttribute(attributeName),\n        type,\n      );\n    }\n    return defaultValue;\n  }\n}\n\n/**\n * Get concatenated string value from CSS `string-set` and `content` property\n */\nfunction getStringValueFromCssContentVal(val: Css.Val): string {\n  // When this function is called, CSS `content()`, `attr()`, `counter()`\n  // values are already resolved to strings values. Remaining non-string values\n  // are ignored.\n  if (Vtree.nonTrivialContent(val)) {\n    if (val instanceof Css.Str) {\n      return val.stringValue();\n    }\n    if (val instanceof Css.SpaceList) {\n      return val.values.map((v) => getStringValueFromCssContentVal(v)).join(\"\");\n    }\n  }\n  return \"\";\n}\n\nexport class ContentPropVisitor extends Css.FilterVisitor {\n  constructor(\n    public cascade: CascadeInstance,\n    public element: Element,\n    public readonly counterResolver: CounterResolver,\n  ) {\n    super();\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    const cascade = this.cascade;\n    const quotes = cascade.quotes;\n    const maxDepth = Math.floor(quotes.length / 2) - 1;\n    switch (ident.name) {\n      case \"open-quote\": {\n        const result = quotes[2 * Math.min(maxDepth, cascade.quoteDepth)];\n        cascade.quoteDepth++;\n        return result;\n      }\n      case \"close-quote\":\n        if (cascade.quoteDepth > 0) {\n          cascade.quoteDepth--;\n        }\n        return quotes[2 * Math.min(maxDepth, cascade.quoteDepth) + 1];\n      case \"no-open-quote\":\n        cascade.quoteDepth++;\n        return new Css.Str(\"\");\n      case \"no-close-quote\":\n        if (cascade.quoteDepth > 0) {\n          cascade.quoteDepth--;\n        }\n        return new Css.Str(\"\");\n    }\n    return ident;\n  }\n\n  private format(num: number, type: string): string {\n    return this.cascade.counterStyleStore.format(type, num);\n  }\n\n  visitFuncCounter(values: Css.Val[]): Css.Val {\n    const counterName = values[0].toString();\n    const type = values.length > 1 ? values[1].stringValue() : \"decimal\";\n    const arr = this.cascade.counters[counterName];\n    if (arr && arr.length) {\n      const numval = (arr && arr.length && arr[arr.length - 1]) || 0;\n      return new Css.Str(this.format(numval, type));\n    } else {\n      const c = new Css.Expr(\n        this.counterResolver.getPageCounterVal(counterName, (numval) =>\n          this.format(numval || 0, type),\n        ),\n      );\n      return new Css.SpaceList([c]);\n    }\n  }\n\n  visitFuncCounters(values: Css.Val[]): Css.Val {\n    const counterName = values[0].toString();\n    const separator = values[1].stringValue();\n    const type = values.length > 2 ? values[2].stringValue() : \"decimal\";\n    const arr = this.cascade.counters[counterName];\n    const sb = new Base.StringBuffer();\n    if (arr && arr.length) {\n      for (let i = 0; i < arr.length; i++) {\n        if (i > 0) {\n          sb.append(separator);\n        }\n        sb.append(this.format(arr[i], type));\n      }\n    }\n    const c = new Css.Expr(\n      this.counterResolver.getPageCountersVal(counterName, (numvals) => {\n        const parts = [] as string[];\n        if (numvals.length) {\n          for (let i = 0; i < numvals.length; i++) {\n            parts.push(this.format(numvals[i], type));\n          }\n        }\n        const elementCounters = sb.toString();\n        if (elementCounters.length) {\n          parts.push(elementCounters);\n        }\n        if (parts.length) {\n          return parts.join(separator);\n        } else {\n          return this.format(0, type);\n        }\n      }),\n    );\n    return new Css.SpaceList([c]);\n  }\n\n  visitFuncTargetCounter(values: Css.Val[]): Css.Val {\n    const targetUrl = values[0];\n    let targetUrlStr: string;\n    if (targetUrl instanceof Css.URL) {\n      targetUrlStr = targetUrl.url;\n    } else {\n      targetUrlStr = targetUrl.stringValue();\n    }\n    const counterName = values[1].toString();\n    const type = values.length > 2 ? values[2].stringValue() : \"decimal\";\n    const c = new Css.Expr(\n      this.counterResolver.getTargetCounterVal(\n        targetUrlStr,\n        counterName,\n        (numval) => this.format(numval || 0, type),\n      ),\n    );\n    return new Css.SpaceList([c]);\n  }\n\n  visitFuncTargetCounters(values: Css.Val[]): Css.Val {\n    const targetUrl = values[0];\n    let targetUrlStr: string;\n    if (targetUrl instanceof Css.URL) {\n      targetUrlStr = targetUrl.url;\n    } else {\n      targetUrlStr = targetUrl.stringValue();\n    }\n    const counterName = values[1].toString();\n    const separator = values[2].stringValue();\n    const type = values.length > 3 ? values[3].stringValue() : \"decimal\";\n    const c = new Css.Expr(\n      this.counterResolver.getTargetCountersVal(\n        targetUrlStr,\n        counterName,\n        (numvals) => {\n          const parts = numvals.map((numval) => this.format(numval, type));\n          if (parts.length) {\n            return parts.join(separator);\n          } else {\n            return this.format(0, type);\n          }\n        },\n      ),\n    );\n    return new Css.SpaceList([c]);\n  }\n\n  /**\n   * CSS `target-text()` function\n   * https://drafts.csswg.org/css-content-3/#target-text\n   */\n  visitFuncTargetText(values: Css.Val[]): Css.Val {\n    const targetUrl = values[0];\n    let targetUrlStr: string;\n    if (targetUrl instanceof Css.URL) {\n      targetUrlStr = targetUrl.url;\n    } else {\n      targetUrlStr = targetUrl.stringValue();\n    }\n    const pseudoElement =\n      values.length > 1 ? values[1].stringValue() : \"content\";\n    const c = new Css.Expr(\n      this.counterResolver.getTargetTextVal(targetUrlStr, pseudoElement),\n    );\n    return new Css.SpaceList([c]);\n  }\n\n  /**\n   * CSS `string()` function\n   * https://drafts.csswg.org/css-gcpm-3/#using-named-strings\n   */\n  visitFuncString(values: Css.Val[]): Css.Val {\n    const name = values.length > 0 ? values[0].stringValue() : \"\";\n    const retrievePosition =\n      values.length > 1 ? values[1].stringValue() : \"first\";\n\n    return new Css.Expr(\n      this.counterResolver.getNamedStringVal(name, retrievePosition),\n    );\n  }\n\n  /**\n   * CSS `element()` function\n   * https://drafts.csswg.org/css-gcpm-3/#running-elements\n   */\n  visitFuncElement(values: Css.Val[]): Css.Val {\n    const name = values.length > 0 ? values[0].stringValue() : \"\";\n    const retrievePosition =\n      values.length > 1 ? values[1].stringValue() : \"first\";\n\n    return new Css.Expr(\n      this.counterResolver.getRunningElementVal(name, retrievePosition),\n    );\n  }\n\n  /**\n   * CSS `content()` function\n   * https://drafts.csswg.org/css-gcpm-3/#content-function-header\n   */\n  visitFuncContent(values: Css.Val[]): Css.Val {\n    const pseudoName = values.length > 0 ? values[0].stringValue() : \"text\";\n    let stringValue = \"\";\n    switch (pseudoName) {\n      case \"text\":\n        stringValue = this.element.textContent;\n        break;\n      case \"before\":\n      case \"after\":\n      case \"marker\":\n        {\n          const pseudos = getStyleMap(this.cascade.currentStyle, \"_pseudos\");\n          const val = (pseudos?.[pseudoName]?.[\"content\"] as CascadeValue)\n            ?.value;\n          stringValue = getStringValueFromCssContentVal(val);\n        }\n        break;\n      case \"first-letter\":\n        {\n          // Respect ::before/after pseudo-elements (Issue #1174)\n          const pseudos = getStyleMap(this.cascade.currentStyle, \"_pseudos\");\n          const r = (\n            getStringValueFromCssContentVal(\n              (pseudos?.[\"before\"]?.[\"content\"] as CascadeValue)?.value,\n            ) ||\n            this.element.textContent ||\n            getStringValueFromCssContentVal(\n              (pseudos?.[\"after\"]?.[\"content\"] as CascadeValue)?.value,\n            )\n          ).match(Base.firstLetterPattern);\n          stringValue = r ? r[0] : \"\";\n        }\n        break;\n    }\n    return new Css.Str(stringValue);\n  }\n\n  /**\n   * CSS `leader()` function\n   * https://www.w3.org/TR/css-content-3/#leaders\n   */\n  visitFuncLeader(values: Css.Val[]): Css.Val {\n    let leader: string = \"\";\n    if (values[0] instanceof Css.Ident) {\n      switch (values[0].stringValue()) {\n        case \"dotted\":\n          leader = \".\";\n          break;\n        case \"solid\":\n          leader = \"_\";\n          break;\n        case \"space\":\n          leader = \" \";\n          break;\n      }\n    } else if (values[0] instanceof Css.Str) {\n      leader = values[0].stringValue();\n    }\n    if (leader.length == 0) {\n      return new Css.Str(\"\");\n    }\n    return new Css.Expr(new Exprs.Native(null, () => leader, \"viv-leader\"));\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    switch (func.name) {\n      case \"counter\":\n        if (func.values.length <= 2) {\n          return this.visitFuncCounter(func.values);\n        }\n        break;\n      case \"counters\":\n        if (func.values.length <= 3) {\n          return this.visitFuncCounters(func.values);\n        }\n        break;\n      case \"target-counter\":\n        if (func.values.length <= 3) {\n          return this.visitFuncTargetCounter(func.values);\n        }\n        break;\n      case \"target-counters\":\n        if (func.values.length <= 4) {\n          return this.visitFuncTargetCounters(func.values);\n        }\n        break;\n      case \"target-text\":\n        if (func.values.length >= 1 && func.values.length <= 2) {\n          return this.visitFuncTargetText(func.values);\n        }\n        break;\n      case \"string\":\n        if (func.values.length <= 2) {\n          return this.visitFuncString(func.values);\n        }\n        break;\n      case \"element\":\n        if (func.values.length <= 2) {\n          return this.visitFuncElement(func.values);\n        }\n        break;\n      case \"content\":\n        if (func.values.length <= 1) {\n          return this.visitFuncContent(func.values);\n        }\n        break;\n      case \"leader\":\n        if (func.values.length <= 1) {\n          return this.visitFuncLeader(func.values);\n        }\n        break;\n    }\n    // Logging.logger.warn(\"E_CSS_CONTENT_PROP:\", func.toString());\n    return func;\n  }\n}\n\n/**\n * Get the total width of a node's content\n * @param node The node to measure (Element or Text)\n * @param clientLayout The client layout interface for accessing DOM\n * @param writingMode The writing mode (vertical-rl, vertical-lr, or horizontal)\n * @returns The total width (or height for vertical writing modes)\n */\nfunction getContentWidth(\n  node: Node,\n  clientLayout: Vtree.ClientLayout,\n  writingMode: string,\n): number {\n  let rects: { width: number; height: number }[];\n\n  if (node.nodeType === 1) {\n    rects = Array.from((node as Element).getClientRects());\n  } else {\n    const range = node.ownerDocument.createRange();\n    range.selectNodeContents(node);\n    rects = clientLayout.getRangeClientRects(range);\n  }\n\n  const totalWidth = rects.reduce(\n    (acc, rect) =>\n      acc +\n      (writingMode === \"vertical-rl\" || writingMode === \"vertical-lr\"\n        ? rect.height\n        : rect.width),\n    0,\n  );\n\n  return totalWidth;\n}\n\n/**\n * POST_LAYOUT_BLOCK hook function for CSS leader()\n * @param nodeContext\n * @param checkPoints\n * @param column\n */\nconst postLayoutBlockLeader: Plugin.PostLayoutBlockHook = (\n  nodeContext: Vtree.NodeContext,\n  checkPoints: Vtree.NodeContext[],\n  column: Layout.Column,\n) => {\n  const leaders: Vtree.NodeContext[] = checkPoints.filter(\n    (c) =>\n      c.after &&\n      c.viewNode.nodeType === 1 &&\n      (c.viewNode as Element).getAttribute(\"data-viv-leader\"),\n  );\n  for (const c of leaders) {\n    // we want to access the bottom block element, which contains single leader().\n    let container = c.parent;\n    while (container && container.inline) {\n      container = container.parent;\n    }\n    const leaderElem = c.viewNode as HTMLElement;\n    const pseudoElem = leaderElem.parentElement;\n    const pseudoName = pseudoElem.getAttribute(\"data-adapt-pseudo\");\n    const leader = leaderElem.getAttribute(\"data-viv-leader-value\");\n    const { writingMode, direction, marginInlineEnd } =\n      column.clientLayout.getElementComputedStyle(pseudoElem);\n\n    function setLeaderTextContent(leaderStr: string): void {\n      if (direction === \"rtl\") {\n        // in RTL direction, enclose the leader with U+200F (RIGHT-TO-LEFT MARK)\n        // to ensure RTL order around the leader.\n        const RLM = \"\\u200f\";\n        leaderElem.textContent =\n          (leaderStr.startsWith(RLM) ? \"\" : RLM) +\n          leaderStr +\n          (leaderStr.endsWith(RLM) ? \"\" : RLM);\n      } else {\n        leaderElem.textContent = leaderStr;\n      }\n    }\n\n    // prevent leader layout problem (Issue #1117)\n    leaderElem.style.marginInlineStart = \"1px\";\n\n    // reset the expanded leader\n    setLeaderTextContent(leader);\n    // setting inline-block removes the pseudo CONTENT from normal text flow\n    pseudoElem.style.display = \"inline-block\";\n    pseudoElem.style.textIndent = \"0\"; // cancel inherited text-indent\n\n    // Workaround for Issue #1598:\n    // In multi-column layout with column-fill: balance, changing leader length\n    // triggers column rebalancing, making the initially measured `box` unreliable.\n    // Temporarily switch column-fill to auto to prevent rebalancing during\n    // leader calculation.\n    // Note: findAncestorNonRootMultiColumn is correct here. Root-level multi-column\n    // is handled by Vivliostyle's own column balancing (ColumnBalancer), not the\n    // browser's column-fill: balance, so this issue only affects non-root multi-column.\n    const columnContainer = LayoutHelper.findAncestorNonRootMultiColumn(\n      container.viewNode,\n    ) as HTMLElement | null;\n    const originalColumnFill = columnContainer?.style.columnFill || null;\n    if (columnContainer) {\n      columnContainer.style.columnFill = \"auto\";\n    }\n\n    const box = column.clientLayout.getElementClientRect(\n      container.viewNode as Element,\n    );\n    const innerInit = column.clientLayout.getElementClientRect(pseudoElem);\n    const innerMarginInlineEnd = column.parseComputedLength(marginInlineEnd);\n\n    // Calculate width of following inline siblings (Issue #1563)\n    const inlineNodes: Node[] = [];\n\n    // Find the topmost inline ancestor (child of block ancestor) that contains pseudoElement\n    let topmostInlineAncestor: Element = pseudoElem.parentElement;\n    while (\n      topmostInlineAncestor.parentElement &&\n      topmostInlineAncestor.parentElement !== (container.viewNode as Element)\n    ) {\n      topmostInlineAncestor = topmostInlineAncestor.parentElement;\n    }\n\n    // Start collecting siblings from the next sibling of the topmost inline ancestor\n    let sibling = topmostInlineAncestor.nextSibling;\n\n    // Collect all following inline siblings\n    while (sibling) {\n      if (sibling.nodeType === 1) {\n        // Node.ELEMENT_NODE\n        const elem = sibling as Element;\n        const { display, float, position } =\n          column.clientLayout.getElementComputedStyle(elem);\n\n        // Skip out-of-flow elements\n        if (\n          float !== \"none\" ||\n          position === \"absolute\" ||\n          position === \"fixed\"\n        ) {\n          sibling = sibling.nextSibling;\n          continue;\n        }\n\n        // Collect inline-level elements\n        if (Display.isInlineLevel(display)) {\n          inlineNodes.push(elem);\n        } else if (Display.isBlockLevel(display)) {\n          break;\n        }\n      } else if (sibling.nodeType === 3) {\n        // Node.TEXT_NODE\n        const text = sibling as Text;\n        if (text.length > 0) {\n          inlineNodes.push(text);\n        }\n      }\n      sibling = sibling.nextSibling;\n    }\n\n    // Measure the width of following siblings by reducing each node's actual width\n    let followingInlineSiblingsWidth = inlineNodes.reduce(\n      (acc, node) =>\n        acc + getContentWidth(node, column.clientLayout, writingMode),\n      0,\n    );\n\n    // For ::before or content (non-::after), add parent element's remaining width\n    // (content + ::after for ::before, ::after for content)\n    if (pseudoName !== \"after\") {\n      const parentWidth = getContentWidth(\n        topmostInlineAncestor,\n        column.clientLayout,\n        writingMode,\n      );\n      const pseudoWidth = getContentWidth(\n        pseudoElem,\n        column.clientLayout,\n        writingMode,\n      );\n\n      followingInlineSiblingsWidth += parentWidth - pseudoWidth;\n    }\n\n    // capture the line boundary\n    // Some leader text (\"_\" e.g.) creates higher top than container.\n    if (writingMode === \"vertical-rl\" || writingMode === \"vertical-lr\") {\n      if (direction === \"rtl\") {\n        box.top += innerMarginInlineEnd;\n      } else {\n        box.bottom -= innerMarginInlineEnd;\n      }\n      box.top = Math.min(innerInit.top, box.top);\n      box.bottom = Math.max(innerInit.bottom, box.bottom);\n    } else {\n      if (direction === \"rtl\") {\n        box.left += innerMarginInlineEnd;\n      } else {\n        box.right -= innerMarginInlineEnd;\n      }\n      box.left = Math.min(innerInit.left, box.left);\n      box.right = Math.max(innerInit.right, box.right);\n    }\n\n    function overrun() {\n      const inner = column.clientLayout.getElementClientRect(pseudoElem);\n      if (writingMode === \"vertical-rl\" || writingMode === \"vertical-lr\") {\n        if (direction === \"rtl\") {\n          inner.top -= followingInlineSiblingsWidth;\n        } else {\n          inner.bottom += followingInlineSiblingsWidth;\n        }\n      } else {\n        if (direction === \"rtl\") {\n          inner.left -= followingInlineSiblingsWidth;\n        } else {\n          inner.right += followingInlineSiblingsWidth;\n        }\n      }\n      if (\n        box.left > inner.left ||\n        box.right < inner.right ||\n        box.top > inner.top ||\n        box.bottom < inner.bottom\n      ) {\n        return true;\n      }\n      return false;\n    }\n\n    function setLeader() {\n      // min-max search\n      let lower: number;\n      let upper: number;\n      let templeader = leader.repeat(10000);\n      setLeaderTextContent(templeader);\n      if (overrun()) {\n        lower = 1;\n        upper = 10000;\n      } else {\n        return;\n      }\n      // leader is set to overrun state here\n      for (let i = 0; i < 16; i++) {\n        let templeader = \"\";\n        const mid = Math.floor((lower + upper) / 2);\n        for (let j = 0; j < mid; j++) {\n          templeader += leader;\n        }\n        setLeaderTextContent(templeader);\n        if (overrun()) {\n          upper = mid;\n        } else {\n          if (lower == mid) {\n            return;\n          }\n          lower = mid;\n        }\n      }\n      setLeaderTextContent(leader);\n    }\n\n    // set the expanded leader\n    setLeader();\n\n    // Without inline-end, we use margin-inline-start to adjust the position.\n    // To get the margin size, set float, calculate then cancel float.\n    const innerInline = column.clientLayout.getElementClientRect(pseudoElem);\n    if (direction == \"rtl\") {\n      pseudoElem.style.float = \"left\";\n    } else {\n      pseudoElem.style.float = \"right\";\n    }\n    const innerAligned = column.clientLayout.getElementClientRect(pseudoElem);\n    // When float is applied, the content will be removed from the normal\n    // text flow, and box inset will be also removed.\n    // When content comes back to the normal text flow, then inset effects again.\n    function getInset(side: string): number {\n      let inset = 0;\n      let p = pseudoElem.parentElement;\n      while (p && p !== container.viewNode) {\n        inset += column.getComputedInsets(p)[side];\n        p = p.parentElement;\n      }\n      return inset;\n    }\n    let padding = 0;\n    if (direction == \"rtl\") {\n      if (writingMode == \"vertical-rl\" || writingMode == \"vertical-lr\") {\n        padding = innerInline.top - innerAligned.top - getInset(\"top\");\n      } else {\n        padding = innerInline.left - innerAligned.left - getInset(\"left\");\n      }\n    } else {\n      if (writingMode == \"vertical-rl\" || writingMode == \"vertical-lr\") {\n        padding = innerAligned.bottom - innerInline.bottom - getInset(\"bottom\");\n      } else {\n        padding = innerAligned.right - innerInline.right - getInset(\"right\");\n      }\n    }\n    padding -= followingInlineSiblingsWidth;\n    padding = Math.max(0, padding - 0.1); // prevent line wrapping (Issue #1112)\n    pseudoElem.style.float = \"\";\n    leaderElem.style.marginInlineStart = `${padding}px`;\n\n    // Restore column-fill\n    if (columnContainer) {\n      if (originalColumnFill) {\n        columnContainer.style.columnFill = originalColumnFill;\n      } else {\n        columnContainer.style.removeProperty(\"column-fill\");\n      }\n    }\n  }\n};\n\nPlugin.registerHook(Plugin.HOOKS.POST_LAYOUT_BLOCK, postLayoutBlockLeader);\n\nexport function roman(num: number): string {\n  if (num <= 0 || num != Math.round(num) || num > 3999) {\n    return \"\";\n  }\n  const digits = [\"I\", \"V\", \"X\", \"L\", \"C\", \"D\", \"M\"];\n  let offset = 0;\n  let acc = \"\";\n  while (num > 0) {\n    let digit = num % 10;\n    num = (num - digit) / 10;\n    let result = \"\";\n    if (digit == 9) {\n      result += digits[offset] + digits[offset + 2];\n    } else if (digit == 4) {\n      result += digits[offset] + digits[offset + 1];\n    } else {\n      if (digit >= 5) {\n        result += digits[offset + 1];\n        digit -= 5;\n      }\n      while (digit > 0) {\n        result += digits[offset];\n        digit--;\n      }\n    }\n    acc = result + acc;\n    offset += 2;\n  }\n  return acc;\n}\n\n/**\n * Fitting order and specificity in the same number. Order is recorded in the\n * fractional part. Select value so that\n *\n *   0x7FFFFFFF != 0x7FFFFFFF + ORDER_INCREMENT\n *\n */\nexport const ORDER_INCREMENT = 1 / 0x100000;\n\nexport function copyTable(src: ActionTable, dst: ActionTable): void {\n  for (const n in src) {\n    dst[n] = src[n].clone();\n  }\n}\n\nexport class Cascade {\n  nsCount: number = 0;\n  nsPrefix: { [key: string]: string } = {};\n  tags: ActionTable = {};\n  nstags: ActionTable = {};\n  epubtypes: ActionTable = {};\n  classes: ActionTable = {};\n  ids: ActionTable = {};\n  pagetypes: ActionTable = {};\n  order: number = 0;\n\n  clone(): Cascade {\n    const r = new Cascade();\n    r.nsCount = this.nsCount;\n    for (const p in this.nsPrefix) {\n      r.nsPrefix[p] = this.nsPrefix[p];\n    }\n    copyTable(this.tags, r.tags);\n    copyTable(this.nstags, r.nstags);\n    copyTable(this.epubtypes, r.epubtypes);\n    copyTable(this.classes, r.classes);\n    copyTable(this.ids, r.ids);\n    copyTable(this.pagetypes, r.pagetypes);\n    r.order = this.order;\n    return r;\n  }\n\n  insertInTable(table: ActionTable, key: string, action: CascadeAction): void {\n    const a = table[key];\n    if (a) {\n      action = a.mergeWith(action);\n    }\n    table[key] = action;\n  }\n\n  createInstance(\n    context: Exprs.Context,\n    counterListener: CounterListener,\n    counterResolver: CounterResolver,\n    lang,\n    counterStyleStore: CounterStyle.CounterStyleStore,\n    cmykStore: CmykStore.CmykStore,\n  ): CascadeInstance {\n    return new CascadeInstance(\n      this,\n      context,\n      counterListener,\n      counterResolver,\n      lang,\n      counterStyleStore,\n      cmykStore,\n    );\n  }\n\n  nextOrder(): number {\n    return (this.order += ORDER_INCREMENT);\n  }\n}\n\nexport class CascadeInstance {\n  code: Cascade;\n  stack = [[], []] as ConditionItem[][];\n  conditions = {} as { [key: string]: number };\n  currentElement: Element | null = null;\n  currentElementOffset: number | null = null;\n  currentStyle: ElementStyle | null = null;\n  currentClassNames: string[] | null = null;\n  currentLocalName: string = \"\";\n  currentNamespace: string = \"\";\n  currentId: string = \"\";\n  currentXmlId: string = \"\";\n  currentNSTag: string = \"\";\n  currentEpubTypes: string[] | null = null;\n  currentPageType: string | null = null;\n  previousPageType: string | null = null;\n  firstPageType: string | null = null;\n  pageTypePageCounts: { [pageType: string]: number } = {};\n  isFirst: boolean = true;\n  isRoot: boolean = true;\n  counters: CounterValues = {};\n  counterScoping: { [key: string]: boolean }[] = [{}];\n  quotes: Css.Str[];\n  quoteDepth: number = 0;\n  lang: string = \"\";\n  siblingOrderStack: number[] = [0];\n  currentSiblingOrder: number = 0;\n  siblingTypeCountsStack: { [key: string]: { [key: string]: number } }[] = [{}];\n  currentSiblingTypeCounts: { [key: string]: { [key: string]: number } };\n  currentFollowingSiblingOrder: number | null = null;\n  followingSiblingOrderStack: (number | null)[];\n  followingSiblingTypeCountsStack: {\n    [key: string]: { [key: string]: number };\n  }[] = [{}];\n  currentFollowingSiblingTypeCounts: {\n    [key: string]: { [key: string]: number };\n  };\n  viewConditions: { [key: string]: Matchers.Matcher[] } = {};\n  dependentConditions: string[] = [];\n  elementStack: Element[];\n\n  constructor(\n    cascade: Cascade,\n    public readonly context: Exprs.Context,\n    public readonly counterListener: CounterListener,\n    public readonly counterResolver: CounterResolver,\n    lang: string,\n    public readonly counterStyleStore: CounterStyle.CounterStyleStore,\n    public readonly cmykStore: CmykStore.CmykStore,\n  ) {\n    this.code = cascade;\n    this.quotes = [\n      new Css.Str(\"\\u201c\"),\n      new Css.Str(\"\\u201d\"),\n      new Css.Str(\"\\u2018\"),\n      new Css.Str(\"\\u2019\"),\n    ];\n    this.currentSiblingTypeCounts = this.siblingTypeCountsStack[0];\n    this.followingSiblingOrderStack = [this.currentFollowingSiblingOrder];\n    this.currentFollowingSiblingTypeCounts = this.siblingTypeCountsStack[0];\n    if (VIVLIOSTYLE_DEBUG) {\n      this.elementStack = [];\n    }\n  }\n\n  pushConditionItem(item: ConditionItem): void {\n    this.stack[this.stack.length - 1].push(item);\n  }\n\n  increment(condition: string, viewCondition: Matchers.Matcher): void {\n    this.conditions[condition] = (this.conditions[condition] || 0) + 1;\n    if (!viewCondition) {\n      return;\n    }\n    if (this.viewConditions[condition]) {\n      this.viewConditions[condition].push(viewCondition);\n    } else {\n      this.viewConditions[condition] = [viewCondition];\n    }\n  }\n\n  decrement(condition: string, viewCondition: Matchers.Matcher): void {\n    this.conditions[condition]--;\n    if (!this.viewConditions[condition]) {\n      return;\n    }\n    this.viewConditions[condition] = this.viewConditions[condition].filter(\n      (item) => item !== viewCondition,\n    );\n    if (this.viewConditions[condition].length === 0) {\n      delete this.viewConditions[condition];\n    }\n  }\n\n  buildViewConditionMatcher(viewConditionId: string | null): Matchers.Matcher {\n    let matcher: Matchers.Matcher = null;\n    if (viewConditionId) {\n      Asserts.assert(this.currentElementOffset);\n      matcher = Matchers.MatcherBuilder.buildViewConditionMatcher(\n        this.currentElementOffset,\n        viewConditionId,\n      );\n    }\n    const dependentConditionMatchers = this.dependentConditions\n      .map((conditionId) => {\n        const conditions = this.viewConditions[conditionId];\n        if (conditions && conditions.length > 0) {\n          return conditions.length === 1\n            ? conditions[0]\n            : Matchers.MatcherBuilder.buildAnyMatcher([].concat(conditions));\n        } else {\n          return null;\n        }\n      })\n      .filter((item) => item);\n    if (dependentConditionMatchers.length <= 0) {\n      return matcher;\n    }\n    if (matcher === null) {\n      return dependentConditionMatchers.length === 1\n        ? dependentConditionMatchers[0]\n        : Matchers.MatcherBuilder.buildAllMatcher(dependentConditionMatchers);\n    }\n    return Matchers.MatcherBuilder.buildAllMatcher(\n      [matcher].concat(dependentConditionMatchers),\n    );\n  }\n\n  applyAction(table: ActionTable, key: string): void {\n    const action = table[key];\n    if (action) {\n      action.apply(this);\n    }\n  }\n\n  pushRule(\n    classes: string[],\n    pageType: string | null,\n    baseStyle: ElementStyle,\n  ): void {\n    this.currentElement = null;\n    this.currentElementOffset = null;\n    this.currentStyle = baseStyle;\n    this.currentNamespace = \"\";\n    this.currentLocalName = \"\";\n    this.currentId = \"\";\n    this.currentXmlId = \"\";\n    this.currentClassNames = classes;\n    this.currentNSTag = \"\";\n    this.currentEpubTypes = EMPTY;\n    this.currentPageType = pageType;\n    this.applyActions();\n  }\n\n  defineCounter(counterName: string, value: number) {\n    let scoping = this.counterScoping[this.counterScoping.length - 1];\n    if (!scoping) {\n      scoping = {};\n      this.counterScoping[this.counterScoping.length - 1] = scoping;\n    }\n    if (this.counters[counterName]) {\n      if (scoping[counterName]) {\n        this.counters[counterName].pop();\n      }\n      this.counters[counterName].push(value);\n    } else {\n      this.counters[counterName] = [value];\n    }\n    scoping[counterName] = true;\n  }\n\n  pushCounters(props: ElementStyle): void {\n    let displayVal: Css.Val = Css.ident.inline;\n    const display = props[\"display\"] as CascadeValue;\n    if (display) {\n      displayVal = display.evaluate(this.context);\n    }\n    // Ignore counter-* on 'display: none' elements and their descendants\n    if (displayVal === Css.ident.none) {\n      this.currentElement.setAttribute(\"data-viv-display-none\", \"true\");\n      this.counterScoping.push(null);\n      return;\n    } else if (this.currentElement.closest(\"[data-viv-display-none]\")) {\n      this.counterScoping.push(null);\n      return;\n    }\n    let floatVal: Css.Val = Css.ident.inline;\n    const float = props[\"float\"] as CascadeValue;\n    if (float) {\n      floatVal = float.evaluate(this.context);\n    }\n    let resetMap: { [key: string]: number } = null;\n    let incrementMap: { [key: string]: number } = null;\n    let setMap: { [key: string]: number } = null;\n    const reset = props[\"counter-reset\"] as CascadeValue;\n    if (reset) {\n      const resetVal = reset.evaluate(this.context);\n      if (resetVal) {\n        resetMap = CssProp.toCounters(resetVal, true);\n      }\n    }\n    const set = props[\"counter-set\"] as CascadeValue;\n    if (set) {\n      const setVal = set.evaluate(this.context);\n      if (setVal) {\n        setMap = CssProp.toCounters(setVal, false);\n      }\n    }\n    const increment = props[\"counter-increment\"] as CascadeValue;\n    if (increment) {\n      const incrementVal = increment.evaluate(this.context);\n      if (incrementVal) {\n        incrementMap = CssProp.toCounters(incrementVal, false);\n      }\n    }\n    if (\n      (this.currentLocalName == \"ol\" || this.currentLocalName == \"ul\") &&\n      this.currentNamespace == Base.NS.XHTML\n    ) {\n      if (!resetMap) {\n        resetMap = {};\n      }\n      resetMap[\"list-item\"] = ((this.currentElement as any)?.start ?? 1) - 1;\n    }\n    if (Display.isListItem(displayVal)) {\n      if (!incrementMap) {\n        incrementMap = {};\n      }\n      incrementMap[\"list-item\"] = incrementMap[\"list-item\"] ?? 1;\n      if (\n        /^\\s*[-+]?\\d/.test(this.currentElement?.getAttribute(\"value\") ?? \"\")\n      ) {\n        if (!setMap) {\n          setMap = {};\n        }\n        setMap[\"list-item\"] = (this.currentElement as any).value;\n      }\n    }\n    if (this.currentElement?.parentNode.nodeType === Node.DOCUMENT_NODE) {\n      if (!resetMap) {\n        resetMap = {};\n      }\n      // `counter-reset: footnote 0` is implicitly applied on the root element\n      if (resetMap[\"footnote\"] === undefined) {\n        resetMap[\"footnote\"] = 0;\n      }\n    }\n    if (floatVal === Css.ident.footnote) {\n      if (!incrementMap) {\n        incrementMap = {};\n      }\n      // `counter-increment: footnote 1` is implicitly applied on the\n      // element (or pseudo element) with `float: footnote`,\n      // unless `counter-increment: footnote` is explicitly specified\n      // on the element (parent element of the pseudo element).\n      if (incrementMap[\"footnote\"] === undefined) {\n        const incrPropValue = (\n          this.currentStyle[\"counter-increment\"] as CascadeValue\n        )?.value;\n        if (\n          !incrPropValue ||\n          !(\n            incrPropValue === Css.ident.footnote ||\n            (incrPropValue instanceof Css.SpaceList &&\n              incrPropValue.values.includes(Css.ident.footnote))\n          )\n        ) {\n          incrementMap[\"footnote\"] = 1;\n        }\n      }\n    }\n    if (resetMap) {\n      for (const resetCounterName in resetMap) {\n        this.defineCounter(resetCounterName, resetMap[resetCounterName]);\n      }\n    }\n    if (incrementMap) {\n      for (const incrementCounterName in incrementMap) {\n        if (!this.counters[incrementCounterName]) {\n          this.defineCounter(incrementCounterName, 0);\n        }\n        const counterValues = this.counters[incrementCounterName];\n        counterValues[counterValues.length - 1] +=\n          incrementMap[incrementCounterName];\n      }\n    }\n    if (setMap) {\n      for (const setCounterName in setMap) {\n        if (!this.counters[setCounterName]) {\n          this.defineCounter(setCounterName, setMap[setCounterName]);\n        } else {\n          const counterValues = this.counters[setCounterName];\n          counterValues[counterValues.length - 1] = setMap[setCounterName];\n        }\n      }\n    }\n    if (Display.isListItem(displayVal)) {\n      const listItemCounts = this.counters[\"list-item\"];\n      const listItemCount = listItemCounts[listItemCounts.length - 1];\n      props[\"ua-list-item-count\"] = new CascadeValue(\n        new Css.Num(listItemCount),\n        0,\n      );\n      // Ensure that ::marker pseudo-element exists for the list item\n      const pseudos = getMutableStyleMap(props, \"_pseudos\");\n      if (!pseudos[\"marker\"]) {\n        pseudos[\"marker\"] = {};\n      }\n    }\n    this.counterScoping.push(null);\n  }\n\n  popCounters(): void {\n    const scoping = this.counterScoping.pop();\n    if (scoping) {\n      for (const counterName in scoping) {\n        const arr = this.counters[counterName];\n        if (arr) {\n          if (arr.length == 1) {\n            delete this.counters[counterName];\n          } else {\n            arr.pop();\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Process CSS string-set property\n   * https://drafts.csswg.org/css-gcpm-3/#setting-named-strings-the-string-set-pro\n   */\n  setNamedStrings(props: ElementStyle): void {\n    let stringSet = props[\"string-set\"] as CascadeValue;\n    if (!stringSet) {\n      return;\n    }\n    stringSet = stringSet.filterValue(\n      new ContentPropVisitor(this, this.currentElement, this.counterResolver),\n    );\n    const sets =\n      stringSet.value instanceof Css.CommaList\n        ? stringSet.value.values\n        : [stringSet.value];\n\n    for (const set of sets) {\n      if (set instanceof Css.SpaceList) {\n        const name = set.values[0].stringValue();\n        const stringValue = set.values\n          .slice(1)\n          .map((v) => getStringValueFromCssContentVal(v))\n          .join(\"\");\n        this.counterResolver.setNamedString(\n          name,\n          stringValue,\n          this.currentElementOffset,\n        );\n      }\n    }\n    delete props[\"string-set\"];\n  }\n\n  /**\n   * Process CSS running elements\n   * https://drafts.csswg.org/css-gcpm-3/#running-elements\n   */\n  setRunningElement(props: ElementStyle): void {\n    const position = props[\"position\"] as CascadeValue;\n    if (\n      position?.value instanceof Css.Func &&\n      position.value.name === \"running\"\n    ) {\n      const name = position.value.values[0].stringValue();\n      this.counterResolver.setRunningElement(name, this.currentElementOffset);\n    }\n  }\n\n  processPseudoelementProps(pseudoprops: ElementStyle, element: Element): void {\n    this.pushCounters(pseudoprops);\n    const content = pseudoprops[\"content\"] as CascadeValue;\n    if (content) {\n      pseudoprops[\"content\"] = content.filterValue(\n        new ContentPropVisitor(this, element, this.counterResolver),\n      );\n    }\n    this.popCounters();\n  }\n\n  pushElement(\n    styler: CssStyler.AbstractStyler,\n    element: Element,\n    baseStyle: ElementStyle,\n    elementOffset: number,\n  ): void {\n    if (VIVLIOSTYLE_DEBUG) {\n      this.elementStack.push(element);\n    }\n\n    // do not apply page rules\n    this.currentPageType = null;\n    this.currentElement = element;\n    this.currentElementOffset = elementOffset;\n    this.currentStyle = baseStyle;\n    this.currentNamespace = element.namespaceURI;\n    this.currentLocalName = element.localName;\n    const prefix = this.code.nsPrefix[this.currentNamespace];\n    if (prefix) {\n      this.currentNSTag = prefix + this.currentLocalName;\n    } else {\n      this.currentNSTag = \"\";\n    }\n    this.currentId = element.getAttribute(\"id\");\n    this.currentXmlId = element.getAttributeNS(Base.NS.XML, \"id\");\n    const classes = element.getAttribute(\"class\");\n    if (classes) {\n      this.currentClassNames = classes.split(/\\s+/);\n    } else {\n      this.currentClassNames = EMPTY;\n    }\n    const types = element.getAttributeNS(Base.NS.epub, \"type\");\n    if (types) {\n      this.currentEpubTypes = types.split(/\\s+/);\n    } else {\n      this.currentEpubTypes = EMPTY;\n    }\n    const lang = Base.getLangAttribute(element);\n    if (lang) {\n      this.stack[this.stack.length - 1].push(new RestoreLangItem(this.lang));\n      this.lang = lang.toLowerCase();\n    }\n    const isRoot = this.isRoot;\n    const siblingOrderStack = this.siblingOrderStack;\n    this.currentSiblingOrder = ++siblingOrderStack[\n      siblingOrderStack.length - 1\n    ];\n    siblingOrderStack.push(0);\n    const siblingTypeCountsStack = this.siblingTypeCountsStack;\n    const currentSiblingTypeCounts = (this.currentSiblingTypeCounts =\n      siblingTypeCountsStack[siblingTypeCountsStack.length - 1]);\n    let currentNamespaceTypeCounts =\n      currentSiblingTypeCounts[this.currentNamespace];\n    if (!currentNamespaceTypeCounts) {\n      currentNamespaceTypeCounts = currentSiblingTypeCounts[\n        this.currentNamespace\n      ] = {};\n    }\n    currentNamespaceTypeCounts[this.currentLocalName] =\n      (currentNamespaceTypeCounts[this.currentLocalName] || 0) + 1;\n    siblingTypeCountsStack.push({});\n    const followingSiblingOrderStack = this.followingSiblingOrderStack;\n    if (\n      followingSiblingOrderStack[followingSiblingOrderStack.length - 1] !== null\n    ) {\n      this.currentFollowingSiblingOrder = --followingSiblingOrderStack[\n        followingSiblingOrderStack.length - 1\n      ];\n    } else {\n      this.currentFollowingSiblingOrder = null;\n    }\n    followingSiblingOrderStack.push(null);\n    const followingSiblingTypeCountsStack =\n      this.followingSiblingTypeCountsStack;\n    const currentFollowingSiblingTypeCounts =\n      (this.currentFollowingSiblingTypeCounts =\n        followingSiblingTypeCountsStack[\n          followingSiblingTypeCountsStack.length - 1\n        ]);\n    if (\n      currentFollowingSiblingTypeCounts &&\n      currentFollowingSiblingTypeCounts[this.currentNamespace]\n    ) {\n      currentFollowingSiblingTypeCounts[this.currentNamespace][\n        this.currentLocalName\n      ]--;\n    }\n    followingSiblingTypeCountsStack.push({});\n    this.applyActions();\n\n    // Substitute var()\n    this.applyVarFilter([this.currentStyle], styler, element);\n\n    // Calculate calc()\n    this.applyCalcFilter(this.currentStyle, this.context);\n\n    // Convert device-cmyk() to color(srgb ...)\n    this.applyCmykFilter(this.currentStyle, this.currentElement);\n\n    this.applyAttrFilter(element);\n    const quotesCasc = baseStyle[\"quotes\"] as CascadeValue;\n    let itemToPushLast: QuotesScopeItem | null = null;\n    if (quotesCasc) {\n      const quotesVal = quotesCasc.evaluate(this.context);\n      if (quotesVal) {\n        itemToPushLast = new QuotesScopeItem(this.quotes);\n        if (quotesVal === Css.ident.none) {\n          this.quotes = [new Css.Str(\"\"), new Css.Str(\"\")];\n        } else if (\n          quotesVal === Css.ident.auto ||\n          quotesVal === Css.ident.initial\n        ) {\n          this.quotes = [\n            new Css.Str(\"\\u201c\"),\n            new Css.Str(\"\\u201d\"),\n            new Css.Str(\"\\u2018\"),\n            new Css.Str(\"\\u2019\"),\n          ];\n          // FIXME: quotes:auto should be based on the content language\n        } else if (quotesVal instanceof Css.SpaceList) {\n          this.quotes = (quotesVal as Css.SpaceList).values as Css.Str[];\n        }\n      }\n    }\n    this.pushCounters(this.currentStyle);\n    const id =\n      this.currentId || this.currentXmlId || element.getAttribute(\"name\") || \"\";\n    if (isRoot || id) {\n      const counters: CounterValues = {};\n      Object.keys(this.counters).forEach((name) => {\n        counters[name] = Array.from(this.counters[name]);\n      });\n      this.counterListener.countersOfId(id, counters);\n    }\n    const pseudos = getStyleMap(this.currentStyle, \"_pseudos\");\n    if (pseudos) {\n      let before = true;\n      for (const pseudoName of pseudoNames) {\n        if (!pseudoName) {\n          // content\n          before = false;\n        }\n        const pseudoProps = pseudos[pseudoName];\n        if (pseudoProps) {\n          if (\n            ((pseudoName === \"before\" || pseudoName === \"after\") &&\n              !Vtree.nonTrivialContent(\n                (pseudoProps[\"content\"] as CascadeValue)?.value,\n              )) ||\n            (pseudoName === \"marker\" &&\n              !Display.isListItem(\n                getProp(this.currentStyle, \"display\")?.value,\n              )) ||\n            ((pseudoName === \"footnote-call\" ||\n              pseudoName === \"footnote-marker\") &&\n              getProp(this.currentStyle, \"float\")?.value !== Css.ident.footnote)\n          ) {\n            delete pseudos[pseudoName];\n          } else if (before) {\n            this.processPseudoelementProps(pseudoProps, element);\n\n            if (pseudoName === \"marker\") {\n              // Make marker content from list-style-* properties\n              this.processMarkerPseudoelementProps(\n                pseudoProps,\n                element,\n                styler,\n              );\n            } else if (\n              pseudoName === \"first-letter\" &&\n              pseudoProps[\"initial-letter\"]\n            ) {\n              // initial-letter on ::first-letter\n              const initialLetter = pseudoProps[\n                \"initial-letter\"\n              ] as CascadeValue;\n              const initialLetterVal = initialLetter.evaluate(this.context);\n              if (\n                initialLetterVal !== Css.ident.normal &&\n                !Css.isDefaultingValue(initialLetterVal)\n              ) {\n                this.currentStyle[\"--viv-initialLetter\"] = new CascadeValue(\n                  initialLetterVal,\n                  0,\n                );\n              }\n              delete pseudoProps[\"initial-letter\"];\n            }\n          } else {\n            this.stack[this.stack.length - 2].push(\n              new AfterPseudoelementItem(pseudoProps, element),\n            );\n          }\n        }\n      }\n    }\n\n    // process CSS string-set property\n    this.setNamedStrings(this.currentStyle);\n\n    // process CSS running elements\n    this.setRunningElement(this.currentStyle);\n\n    if (itemToPushLast) {\n      this.stack[this.stack.length - 2].push(itemToPushLast);\n    }\n  }\n\n  processMarkerPseudoelementProps(\n    pseudoProps: ElementStyle,\n    element: Element,\n    styler: CssStyler.AbstractStyler,\n  ): void {\n    if (\n      !Vtree.nonTrivialContent(\n        (pseudoProps[\"content\"] as CascadeValue)?.value,\n      ) &&\n      Display.isListItem((this.currentStyle[\"display\"] as CascadeValue)?.value)\n    ) {\n      // If no ::marker content is specified and the element is a list-item,\n      // make content from list-style-type or list-style-image.\n      const listStyleType = this.getInheritedPropertyValue(\n        \"list-style-type\",\n        styler,\n        element,\n      );\n      const listStyleImage = this.getInheritedPropertyValue(\n        \"list-style-image\",\n        styler,\n        element,\n      );\n      if (listStyleImage instanceof Css.URL) {\n        // list-style-image: <URL>\n        // -> content: <URL> \" \"\n        pseudoProps[\"content\"] = new CascadeValue(\n          new Css.SpaceList([listStyleImage, new Css.Str(\" \")]),\n          0,\n        );\n      } else if (listStyleType instanceof Css.Str) {\n        // list-style-type: <string>\n        pseudoProps[\"content\"] = new CascadeValue(listStyleType, 0);\n      } else if (\n        listStyleType instanceof Css.Ident &&\n        listStyleType !== Css.ident.none\n      ) {\n        // list-style-type: <counter-style>\n        const listItemCount = (\n          (this.currentStyle[\"ua-list-item-count\"] as CascadeValue)\n            ?.value as Css.Num\n        )?.num;\n        if (listItemCount != null) {\n          pseudoProps[\"content\"] = new CascadeValue(\n            new Css.Str(\n              this.counterStyleStore.formatMarker(\n                listStyleType.name,\n                listItemCount,\n              ),\n            ),\n            0,\n          );\n        }\n        // This is used in the marker layout processing in\n        // `PseudoelementStyler.processMarker()` in pseudo-element.ts.\n        pseudoProps[\"list-style-type\"] = new CascadeValue(listStyleType, 0);\n      }\n    }\n\n    // list-style-position\n    if (!Display.isInlineLevel(getProp(this.currentStyle, \"display\")?.value)) {\n      const listStylePosition = this.getInheritedPropertyValue(\n        \"list-style-position\",\n        styler,\n        element,\n      );\n      if (listStylePosition) {\n        // This is used in the marker layout processing in\n        // `PseudoelementStyler.processMarker()` in pseudo-element.ts.\n        pseudoProps[\"list-style-position\"] = new CascadeValue(\n          listStylePosition,\n          0,\n        );\n      }\n    }\n  }\n\n  /**\n   * Get inherited property value\n   * @param propName\n   * @param styler\n   * @param element\n   * @returns the inherited property value, or the initial value (or null) if not found\n   */\n  getInheritedPropertyValue(\n    propName: string,\n    styler: CssStyler.AbstractStyler,\n    element: Element,\n  ): Css.Val | null {\n    for (let e = element; e; e = e.parentElement) {\n      const style =\n        e === this.currentElement\n          ? this.currentStyle\n          : styler.getStyle(e, false);\n      const prop = style[propName] as CascadeValue;\n      if (prop) {\n        const val = prop.evaluate(this.context, propName);\n        if (\n          val === Css.ident.inherit ||\n          val === Css.ident.unset ||\n          val === Css.ident.revert\n        ) {\n          continue;\n        } else if (val === Css.ident.initial) {\n          break;\n        }\n        return val;\n      }\n    }\n    const validatorSet = (\n      styler as AbstractStyler & { validatorSet: CssValidator.ValidatorSet }\n    ).validatorSet;\n    return validatorSet?.defaultValues[propName] ?? null;\n  }\n\n  private applyAttrFilterInner(\n    visitor: Css.Visitor,\n    elementStyle: ElementStyle,\n  ): void {\n    for (const propName in elementStyle) {\n      if (isPropName(propName) && !Css.isCustomPropName(propName)) {\n        elementStyle[propName] = (\n          elementStyle[propName] as CascadeValue\n        ).filterValue(visitor);\n      }\n    }\n  }\n\n  private applyAttrFilter(element: Element): void {\n    const visitor = new AttrValueFilterVisitor(element);\n    const currentStyle = this.currentStyle;\n    const pseudoMap = getStyleMap(currentStyle, \"_pseudos\");\n    for (const pseudoName in pseudoMap) {\n      this.applyAttrFilterInner(visitor, pseudoMap[pseudoName]);\n    }\n    this.applyAttrFilterInner(visitor, currentStyle);\n  }\n\n  /**\n   * Substitute all variables in property values in elementStyle\n   */\n  applyVarFilter(\n    elementStyles: ElementStyle[],\n    styler: CssStyler.AbstractStyler,\n    element: Element | null,\n  ): void {\n    const elementStyle = elementStyles[0];\n    const visitor = new VarFilterVisitor(elementStyles, styler, element);\n    const LIMIT_LOOP = 32; // prevent cyclic or too deep dependency\n    const propsLH: ElementStyle = {}; // for shorthand -> longhand cascade\n\n    for (const name in elementStyle) {\n      if (isMapName(name)) {\n        const pseudoMap = getStyleMap(elementStyle, name);\n        for (const pseudoName in pseudoMap) {\n          this.applyVarFilter(\n            [pseudoMap[pseudoName], ...elementStyles],\n            styler,\n            element,\n          );\n        }\n      } else if (isPropName(name)) {\n        const cascVal = getProp(elementStyle, name);\n        let value = cascVal.value;\n\n        for (let i = 0; ; i++) {\n          if (i >= LIMIT_LOOP) {\n            value = Css.empty;\n            break;\n          }\n          const after = value.visit(visitor);\n          if (visitor.error) {\n            // invalid or unresolved variable found\n            value = Css.empty;\n            visitor.error = false;\n            break;\n          }\n          if (after === value) {\n            // no variable, or all variables substituted\n            break;\n          }\n          // variables substituted, but the substituted value may contain variables\n          value = after;\n        }\n        if (value !== cascVal.value) {\n          // all variables substituted\n          const validatorSet = (styler as any)\n            .validatorSet as CssValidator.ValidatorSet;\n          const shorthand = validatorSet?.shorthands[name]?.clone();\n          if (shorthand) {\n            if (Css.isDefaultingValue(value)) {\n              for (const nameLH of shorthand.propList) {\n                const avLH = new CascadeValue(value, cascVal.priority);\n                const tvLH = getProp(elementStyle, nameLH);\n                setProp(\n                  propsLH,\n                  nameLH,\n                  cascadeValues(this.context, tvLH, avLH),\n                );\n              }\n              delete elementStyle[name];\n            } else {\n              // The var()-substituted value may have complex structure\n              // (e.g. SpaceList in SpaceList) that ShorthandValidator\n              // cannot handle, so use toString and parseValue.\n              const valueSH = CssParser.parseValue(\n                (styler as any).scope,\n                new CssTokenizer.Tokenizer(value.toString(), null),\n                \"\",\n              );\n              if (valueSH) {\n                valueSH.visit(shorthand);\n                if (!shorthand.error) {\n                  for (const nameLH of shorthand.propList) {\n                    const avLH = new CascadeValue(\n                      shorthand.values[nameLH] ??\n                        validatorSet.defaultValues[nameLH] ??\n                        Css.ident.initial,\n                      cascVal.priority,\n                    );\n                    const tvLH = getProp(elementStyle, nameLH);\n                    setProp(\n                      propsLH,\n                      nameLH,\n                      cascadeValues(this.context, tvLH, avLH),\n                    );\n                  }\n                  delete elementStyle[name];\n                }\n              }\n            }\n          } else {\n            elementStyle[name] = new CascadeValue(value, cascVal.priority);\n          }\n        }\n        if (propsLH[name]) {\n          const av = getProp(elementStyle, name);\n          if (av && av.value !== Css.empty) {\n            setPropCascadeValue(propsLH, name, av, this.context);\n          }\n        }\n      }\n    }\n    // Update elementStyle with shorthand -> longhand cascade result\n    for (const name in propsLH) {\n      elementStyle[name] = propsLH[name];\n    }\n  }\n\n  /**\n   * Calculate all calc() in property values in elementStyle\n   */\n  applyCalcFilter(elementStyle: ElementStyle, context: Exprs.Context): void {\n    const visitor = new CalcFilterVisitor(context);\n    for (const name in elementStyle) {\n      if (isMapName(name)) {\n        const pseudoMap = getStyleMap(elementStyle, name);\n        for (const pseudoName in pseudoMap) {\n          this.applyCalcFilter(pseudoMap[pseudoName], context);\n        }\n      } else if (isPropName(name) && !Css.isCustomPropName(name)) {\n        const cascVal = getProp(elementStyle, name);\n        const value = cascVal.value.visit(visitor);\n        if (value !== cascVal.value) {\n          elementStyle[name] = new CascadeValue(value, cascVal.priority);\n        }\n      }\n    }\n  }\n\n  applyCmykFilter(elementStyle: ElementStyle, element?: Element): void {\n    const visitor = new CmykStore.CmykFilterVisitor(this.cmykStore);\n    this.applyCmykFilterInternal(elementStyle, visitor, \"\");\n    if (element) {\n      const conversions = visitor.getConversions();\n      if (conversions) {\n        element.setAttribute(\n          \"data-viv-device-cmyk\",\n          JSON.stringify(conversions),\n        );\n      }\n    }\n  }\n\n  private applyCmykFilterInternal(\n    elementStyle: ElementStyle,\n    visitor: CmykStore.CmykFilterVisitor,\n    pseudoPrefix: string,\n  ): void {\n    for (const name in elementStyle) {\n      if (isMapName(name)) {\n        const pseudoMap = getStyleMap(elementStyle, name);\n        for (const pseudoName in pseudoMap) {\n          this.applyCmykFilterInternal(\n            pseudoMap[pseudoName],\n            visitor,\n            `::${pseudoName}:`,\n          );\n        }\n      } else if (isPropName(name) && !Css.isCustomPropName(name)) {\n        const cascVal = getProp(elementStyle, name);\n        const originalValue = cascVal.value.toString();\n        visitor.reset();\n        const value = cascVal.value.visit(visitor);\n        if (value !== cascVal.value) {\n          if (visitor.hadDeviceCmyk()) {\n            visitor.recordConversion(pseudoPrefix + name, originalValue);\n          }\n          elementStyle[name] = new CascadeValue(value, cascVal.priority);\n        }\n      }\n    }\n  }\n\n  private applyActions(): void {\n    let i: number;\n    for (i = 0; i < this.currentClassNames.length; i++) {\n      this.applyAction(this.code.classes, this.currentClassNames[i]);\n    }\n    for (i = 0; i < this.currentEpubTypes.length; i++) {\n      this.applyAction(this.code.epubtypes, this.currentEpubTypes[i]);\n    }\n    this.applyAction(this.code.ids, this.currentId);\n    this.applyAction(this.code.tags, this.currentLocalName);\n    if (this.currentLocalName != \"\") {\n      // Universal selector does not apply to page-master-related rules.\n      this.applyAction(this.code.tags, \"*\");\n    }\n    this.applyAction(this.code.nstags, this.currentNSTag);\n\n    // Apply page rules only when currentPageType is not null\n    if (this.currentPageType !== null) {\n      this.applyAction(this.code.pagetypes, this.currentPageType);\n\n      // We represent page rules without selectors by *, though it is illegal in\n      // CSS\n      this.applyAction(this.code.pagetypes, \"*\");\n    }\n\n    this.stack.push([]);\n    for (let depth = 1; depth >= -1; --depth) {\n      const list = this.stack[this.stack.length - depth - 2];\n      i = 0;\n      while (i < list.length) {\n        if (list[i].push(this, depth)) {\n          // done\n          list.splice(i, 1);\n        } else {\n          i++;\n        }\n      }\n    }\n    this.isFirst = true;\n    this.isRoot = false;\n  }\n\n  private pop(): void {\n    for (let depth = 1; depth >= -1; --depth) {\n      const list = this.stack[this.stack.length - depth - 2];\n      let i = 0;\n      while (i < list.length) {\n        if (list[i].pop(this, depth)) {\n          // done\n          list.splice(i, 1);\n        } else {\n          i++;\n        }\n      }\n    }\n    this.stack.pop();\n    this.isFirst = false;\n  }\n\n  popRule(): void {\n    this.pop();\n  }\n\n  popElement(element: Element): void {\n    if (VIVLIOSTYLE_DEBUG) {\n      const e = this.elementStack.pop();\n      if (e !== element) {\n        throw new Error(\"Invalid call to popElement\");\n      }\n    }\n    this.siblingOrderStack.pop();\n    this.siblingTypeCountsStack.pop();\n    this.followingSiblingOrderStack.pop();\n    this.followingSiblingTypeCountsStack.pop();\n    this.pop();\n    this.popCounters();\n  }\n}\n\nexport const EMPTY: string[] = [];\n\n/**\n * Pseudoelement names in the order they should be processed, empty string is\n * the place where the element's DOM children are processed.\n */\nexport const pseudoNames = [\n  \"before\",\n  \"transclusion-before\",\n  \"footnote-call\",\n  \"footnote-marker\",\n  \"marker\",\n  \"inner\",\n  \"first-letter\",\n  \"first-line\",\n  \"\", // content\n  \"transclusion-after\",\n  \"after\",\n];\n\n/**\n * @enum {number}\n */\nexport enum ParseState {\n  TOP,\n  SELECTOR,\n  RULE,\n}\n\n/**\n * Cascade for base User Agent stylesheet.\n */\nexport let uaBaseCascade: Cascade = null;\nexport function setUABaseCascade(value: Cascade): void {\n  uaBaseCascade = value;\n}\n\n//------------- parsing ------------\nexport class CascadeParserHandler\n  extends CssParser.SlaveParserHandler\n  implements CssValidator.PropertyReceiver\n{\n  chain: ChainedAction[] = null;\n  specificity: number = 0;\n  elementStyle: ElementStyle = null;\n  conditionCount: number = 0;\n  pseudoelement: string | null = null;\n  footnoteContent: boolean = false;\n  cascade: Cascade;\n  state: ParseState;\n  viewConditionId: string | null = null;\n  insideSelectorRule: ParseState;\n  invalid: boolean = false; // for `@supports selector()` check\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    public readonly condition: Exprs.Val,\n    parent: CascadeParserHandler,\n    public readonly regionId: string | null,\n    public readonly validatorSet: CssValidator.ValidatorSet,\n    topLevel: boolean,\n  ) {\n    super(scope, owner, topLevel);\n    this.cascade = parent\n      ? parent.cascade\n      : uaBaseCascade\n        ? uaBaseCascade.clone()\n        : new Cascade();\n    this.state = ParseState.TOP;\n  }\n\n  protected insertNonPrimary(action: CascadeAction): void {\n    this.cascade.insertInTable(this.cascade.tags, \"*\", action);\n  }\n\n  processChain(action: CascadeAction): void {\n    const chained = chainActions(this.chain, action);\n    if (\n      chained !== action &&\n      (chained as ChainedAction).makePrimary(this.cascade)\n    ) {\n      return;\n    }\n    this.insertNonPrimary(chained);\n  }\n\n  isInsideSelectorRule(mnemonics: string): boolean {\n    if (this.state != ParseState.TOP) {\n      this.reportAndSkip(mnemonics);\n      return true;\n    }\n    return false;\n  }\n\n  override tagSelector(ns: string | null, name: string | null): void {\n    if (!name && !ns) {\n      return;\n    }\n    if (name) {\n      this.specificity += 1;\n    }\n    if (name && ns) {\n      this.chain.push(new CheckNSTagAction(ns, name.toLowerCase()));\n    } else if (name) {\n      this.chain.push(new CheckLocalNameAction(name.toLowerCase()));\n    } else {\n      this.chain.push(new CheckNamespaceAction(ns as string));\n    }\n  }\n\n  invalidSelector(message: string): void {\n    Logging.logger.warn(message);\n    this.chain.push(new CheckConditionAction(\"\")); // always fails\n    this.setInvalid();\n  }\n\n  setInvalid(): void {\n    this.invalid = true;\n    for (\n      let handler: CascadeParserHandler = this;\n      handler instanceof MatchesParameterParserHandler;\n      handler = handler.parent\n    ) {\n      handler.parent.invalid = true;\n    }\n  }\n\n  override classSelector(name: string): void {\n    if (this.pseudoelement) {\n      this.invalidSelector(`::${this.pseudoelement} followed by .${name}`);\n      return;\n    }\n    this.specificity += 256;\n    this.chain.push(new CheckClassAction(name));\n  }\n\n  override pseudoclassSelector(\n    name: string,\n    params: (number | string)[],\n  ): void {\n    if (this.pseudoelement) {\n      this.invalidSelector(`::${this.pseudoelement} followed by :${name}`);\n      return;\n    }\n    switch (name.toLowerCase()) {\n      case \"enabled\":\n        this.chain.push(new IsEnabledAction());\n        break;\n      case \"disabled\":\n        this.chain.push(new IsDisabledAction());\n        break;\n      case \"checked\":\n        this.chain.push(new IsCheckedAction());\n        break;\n      case \"root\":\n      case \"scope\":\n        this.chain.push(new IsRootAction());\n        break;\n      case \"link\":\n        this.chain.push(new CheckLocalNameAction(\"a\"));\n        this.chain.push(new CheckAttributePresentAction(\"\", \"href\"));\n        break;\n      case \"-adapt-href-epub-type\":\n      case \"href-epub-type\":\n        if (params && params.length >= 1 && typeof params[0] == \"string\") {\n          const value = params[0] as string;\n          const patt = new RegExp(`(^|\\\\s)${Base.escapeRegExp(value)}(\\$|\\\\s)`);\n          const targetLocalName = params[1] as string;\n          this.chain.push(new CheckTargetEpubTypeAction(patt, targetLocalName));\n        } else {\n          this.chain.push(new CheckConditionAction(\"\")); // always fails\n        }\n        break;\n      case \"-adapt-footnote-content\":\n      case \"footnote-content\":\n        // content inside the footnote\n        this.footnoteContent = true;\n        break;\n      case \"visited\":\n      case \"active\":\n      case \"hover\":\n      case \"focus\":\n        this.chain.push(new CheckConditionAction(\"\")); // always fails\n        break;\n      case \"lang\":\n        if (params && params.length == 1 && typeof params[0] == \"string\") {\n          const langValue = params[0] as string;\n          this.chain.push(\n            new CheckLangAction(\n              new RegExp(\n                `^${Base.escapeRegExp(langValue.toLowerCase())}(\\$|-)`,\n              ),\n            ),\n          );\n        } else {\n          this.chain.push(new CheckConditionAction(\"\")); // always fails\n        }\n        break;\n      case \"nth-child\":\n      case \"nth-last-child\":\n      case \"nth-of-type\":\n      case \"nth-last-of-type\": {\n        const ActionClass = nthSelectorActionClasses[name.toLowerCase()];\n        if (params && params.length == 2) {\n          this.chain.push(\n            new ActionClass(params[0] as number, params[1] as number),\n          );\n        } else {\n          this.chain.push(new CheckConditionAction(\"\")); // always fails\n        }\n        break;\n      }\n      case \"first-child\":\n        this.chain.push(new IsFirstAction());\n        break;\n      case \"last-child\":\n        this.chain.push(new IsNthLastSiblingAction(0, 1));\n        break;\n      case \"first-of-type\":\n        this.chain.push(new IsNthSiblingOfTypeAction(0, 1));\n        break;\n      case \"last-of-type\":\n        this.chain.push(new IsNthLastSiblingOfTypeAction(0, 1));\n        break;\n      case \"only-child\":\n        this.chain.push(new IsFirstAction());\n        this.chain.push(new IsNthLastSiblingAction(0, 1));\n        break;\n      case \"only-of-type\":\n        this.chain.push(new IsNthSiblingOfTypeAction(0, 1));\n        this.chain.push(new IsNthLastSiblingOfTypeAction(0, 1));\n        break;\n      case \"empty\":\n        this.chain.push(new IsEmptyAction());\n        break;\n      case \"before\":\n      case \"after\":\n      case \"first-line\":\n      case \"first-letter\":\n        this.pseudoelementSelector(name, params);\n        return;\n      default: // always fails\n        this.invalidSelector(`Unknown pseudo-class :${name}`);\n        return;\n    }\n    this.specificity += 256;\n  }\n\n  override pseudoelementSelector(\n    name: string,\n    params: (number | string)[],\n  ): void {\n    switch (name) {\n      case \"before\":\n      case \"after\":\n      case \"first-line\":\n      case \"first-letter\":\n      case \"footnote-call\":\n      case \"footnote-marker\":\n      case \"marker\":\n      case \"inner\":\n      case \"after-if-continues\":\n        if (!this.pseudoelement) {\n          this.pseudoelement = name;\n        } else {\n          this.invalidSelector(\n            `Double pseudo-element ::${this.pseudoelement}::${name}`,\n          );\n          return;\n        }\n        break;\n      case \"first-n-lines\":\n        if (params && params.length == 1 && typeof params[0] == \"number\") {\n          const n = Math.round(params[0] as number);\n          if (n > 0 && n == params[0]) {\n            if (!this.pseudoelement) {\n              this.pseudoelement = `first-${n}-lines`;\n            } else {\n              this.invalidSelector(\n                `Double pseudo-element ::${this.pseudoelement}::${name}`,\n              );\n              return;\n            }\n            break;\n          }\n        }\n        this.chain.push(new CheckConditionAction(\"\")); // always fails\n        break;\n      case \"nth-fragment\":\n        if (params && params.length == 2) {\n          this.viewConditionId = `NFS_${params[0]}_${params[1]}`;\n        } else {\n          this.chain.push(new CheckConditionAction(\"\")); // always fails\n        }\n        break;\n      default: // always fails\n        this.invalidSelector(`Unknown pseudo-element ::${name}`);\n        return;\n    }\n    this.specificity += 1;\n  }\n\n  override idSelector(id: string): void {\n    this.specificity += 65536;\n    this.chain.push(new CheckIdAction(id));\n  }\n\n  override attributeSelector(\n    ns: string,\n    name: string,\n    op: TokenType,\n    value: string | null,\n  ): void {\n    this.specificity += 256;\n    name = name.toLowerCase();\n    value = value || \"\";\n    let action;\n    switch (op) {\n      case TokenType.EOF:\n        action = new CheckAttributePresentAction(ns, name);\n        break;\n      case TokenType.EQ:\n        action = new CheckAttributeEqAction(ns, name, value);\n        break;\n      case TokenType.TILDE_EQ:\n        if (!value || value.match(/\\s/)) {\n          action = new CheckConditionAction(\"\"); // always fails\n        } else {\n          action = new CheckAttributeRegExpAction(\n            ns,\n            name,\n            new RegExp(`(^|\\\\s)${Base.escapeRegExp(value)}(\\$|\\\\s)`),\n          );\n        }\n        break;\n      case TokenType.BAR_EQ:\n        action = new CheckAttributeRegExpAction(\n          ns,\n          name,\n          new RegExp(`^${Base.escapeRegExp(value)}(\\$|-)`),\n        );\n        break;\n      case TokenType.HAT_EQ:\n        if (!value) {\n          action = new CheckConditionAction(\"\"); // always fails\n        } else {\n          action = new CheckAttributeRegExpAction(\n            ns,\n            name,\n            new RegExp(`^${Base.escapeRegExp(value)}`),\n          );\n        }\n        break;\n      case TokenType.DOLLAR_EQ:\n        if (!value) {\n          action = new CheckConditionAction(\"\"); // always fails\n        } else {\n          action = new CheckAttributeRegExpAction(\n            ns,\n            name,\n            new RegExp(`${Base.escapeRegExp(value)}\\$`),\n          );\n        }\n        break;\n      case TokenType.STAR_EQ:\n        if (!value) {\n          action = new CheckConditionAction(\"\"); // always fails\n        } else {\n          action = new CheckAttributeRegExpAction(\n            ns,\n            name,\n            new RegExp(Base.escapeRegExp(value)),\n          );\n        }\n        break;\n      case TokenType.COL_COL:\n        if (value == \"supported\") {\n          action = new CheckNamespaceSupportedAction(ns, name);\n        } else {\n          this.invalidSelector(`Unsupported :: attr selector op: ${value}`);\n          return;\n        }\n        break;\n      default:\n        this.invalidSelector(`Unsupported attr selector: ${op}`);\n        return;\n    }\n    this.chain.push(action);\n  }\n\n  override descendantSelector(): void {\n    const condition = `d${conditionCount++}`;\n    this.processChain(\n      new ConditionItemAction(\n        new DescendantConditionItem(condition, this.viewConditionId, null),\n      ),\n    );\n    this.chain = [new CheckConditionAction(condition)];\n    this.viewConditionId = null;\n  }\n\n  override childSelector(): void {\n    const condition = `c${conditionCount++}`;\n    this.processChain(\n      new ConditionItemAction(\n        new ChildConditionItem(condition, this.viewConditionId, null),\n      ),\n    );\n    this.chain = [new CheckConditionAction(condition)];\n    this.viewConditionId = null;\n  }\n\n  override adjacentSiblingSelector(): void {\n    const condition = `a${conditionCount++}`;\n    this.processChain(\n      new ConditionItemAction(\n        new AdjacentSiblingConditionItem(condition, this.viewConditionId, null),\n      ),\n    );\n    this.chain = [new CheckConditionAction(condition)];\n    this.viewConditionId = null;\n  }\n\n  override followingSiblingSelector(): void {\n    const condition = `f${conditionCount++}`;\n    this.processChain(\n      new ConditionItemAction(\n        new FollowingSiblingConditionItem(\n          condition,\n          this.viewConditionId,\n          null,\n        ),\n      ),\n    );\n    this.chain = [new CheckConditionAction(condition)];\n    this.viewConditionId = null;\n  }\n\n  override nextSelector(): void {\n    this.finishChain();\n    this.pseudoelement = null;\n    this.footnoteContent = false;\n    this.specificity = 0;\n    this.chain = [];\n  }\n\n  override startSelectorRule(): void {\n    if (this.isInsideSelectorRule(\"E_CSS_UNEXPECTED_SELECTOR\")) {\n      return;\n    }\n    this.state = ParseState.SELECTOR;\n    this.elementStyle = {} as ElementStyle;\n    this.pseudoelement = null;\n    this.specificity = 0;\n    this.footnoteContent = false;\n    this.chain = [];\n    this.invalid = false;\n  }\n\n  override error(mnemonics: string, token: CssTokenizer.Token): void {\n    super.error(mnemonics, token);\n    if (this.state == ParseState.SELECTOR) {\n      this.state = ParseState.TOP;\n    }\n    this.setInvalid();\n  }\n\n  override startStylesheet(flavor: CssParser.StylesheetFlavor): void {\n    super.startStylesheet(flavor);\n    this.state = ParseState.TOP;\n  }\n\n  override startRuleBody(): void {\n    this.finishChain();\n    super.startRuleBody();\n    if (this.state == ParseState.SELECTOR) {\n      this.state = ParseState.TOP;\n    }\n  }\n\n  override endRule(): void {\n    super.endRule();\n    this.insideSelectorRule = ParseState.TOP;\n  }\n\n  finishChain(): void {\n    if (this.chain) {\n      this.processChain(this.makeApplyRuleAction(this.specificity));\n      this.chain = null;\n      this.pseudoelement = null;\n      this.viewConditionId = null;\n      this.footnoteContent = false;\n      this.specificity = 0;\n    }\n  }\n\n  protected makeApplyRuleAction(specificity: number): ApplyRuleAction {\n    let regionId = this.regionId;\n    if (this.footnoteContent) {\n      if (regionId) {\n        regionId = \"xxx-bogus-xxx\";\n      } else {\n        regionId = \"footnote\";\n      }\n    }\n    return new ApplyRuleAction(\n      this.elementStyle,\n      specificity,\n      this.pseudoelement,\n      regionId,\n      this.viewConditionId,\n    );\n  }\n\n  special(name: string, value: Css.Val) {\n    let val: CascadeValue;\n    if (!this.condition) {\n      val = new CascadeValue(value, 0);\n    } else {\n      val = new ConditionalCascadeValue(value, 0, this.condition);\n    }\n    const arr = getMutableSpecial(this.elementStyle, name);\n    arr.push(val);\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    this.validatorSet.validatePropertyAndHandleShorthand(\n      name,\n      value,\n      important,\n      this,\n    );\n  }\n\n  /** @override */\n  invalidPropertyValue(name: string, value: Css.Val): void {\n    this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n  }\n\n  /** @override */\n  unknownProperty(name: string, value: Css.Val): void {\n    this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n  }\n\n  /** @override */\n  simpleProperty(name: string, value: Css.Val, important): void {\n    if (\n      name == \"display\" &&\n      (value === Css.ident.oeb_page_head || value === Css.ident.oeb_page_foot)\n    ) {\n      this.simpleProperty(\n        \"flow-options\",\n        new Css.SpaceList([Css.ident.exclusive, Css.ident._static]),\n        important,\n      );\n      this.simpleProperty(\"flow-into\", value, important);\n      value = Css.ident.block;\n    }\n    const hooks = Plugin.getHooksForName(\"SIMPLE_PROPERTY\");\n    hooks.forEach((hook) => {\n      const original = { name: name, value: value, important: important };\n      const converted = hook(original);\n      name = converted[\"name\"];\n      value = converted[\"value\"];\n      important = converted[\"important\"];\n    });\n    const specificity = important\n      ? this.getImportantSpecificity()\n      : this.getBaseSpecificity();\n    const priority = specificity + this.cascade.nextOrder();\n    const cascval = this.condition\n      ? new ConditionalCascadeValue(value, priority, this.condition)\n      : new CascadeValue(value, priority);\n    setPropCascadeValue(this.elementStyle, name, cascval);\n  }\n\n  finish(): Cascade {\n    return this.cascade;\n  }\n\n  override startFuncWithSelector(\n    funcName: string,\n    params?: (number | string)[],\n  ): void {\n    let parameterParserHandler: MatchesParameterParserHandler;\n    switch (funcName) {\n      case \"is\":\n        parameterParserHandler = new MatchesParameterParserHandler(this);\n        break;\n      case \"not\":\n        parameterParserHandler = new NotParameterParserHandler(this);\n        break;\n      case \"where\":\n        parameterParserHandler = new WhereParameterParserHandler(this);\n        break;\n      case \"has\":\n        parameterParserHandler = new HasParameterParserHandler(this);\n        break;\n      case \"nth-child\":\n        if (params && params.length >= 2) {\n          parameterParserHandler = new NthChildOfSelectorParameterParserHandler(\n            this,\n            params[0] as number,\n            params[1] as number,\n          );\n        }\n        break;\n      case \"nth-last-child\":\n        if (params && params.length >= 2) {\n          parameterParserHandler =\n            new NthLastChildOfSelectorParameterParserHandler(\n              this,\n              params[0] as number,\n              params[1] as number,\n            );\n        }\n        break;\n    }\n    if (parameterParserHandler) {\n      parameterParserHandler.startSelectorRule();\n      this.owner.pushHandler(parameterParserHandler);\n    }\n  }\n}\n\nexport const nthSelectorActionClasses: { [key: string]: typeof IsNthAction } = {\n  \"nth-child\": IsNthSiblingAction,\n  \"nth-of-type\": IsNthSiblingOfTypeAction,\n  \"nth-last-child\": IsNthLastSiblingAction,\n  \"nth-last-of-type\": IsNthLastSiblingOfTypeAction,\n};\n\nexport let conditionCount: number = 0;\n\n/**\n * Cascade Parser Handler for :is() and similar pseudo-classes parameter\n */\nexport class MatchesParameterParserHandler extends CascadeParserHandler {\n  parentChain: ChainedAction[];\n  chains: ChainedAction[][] = [];\n  maxSpecificity: number = 0;\n  selectorTexts: string[] = [];\n\n  constructor(public readonly parent: CascadeParserHandler) {\n    super(\n      parent.scope,\n      parent.owner,\n      parent.condition,\n      parent,\n      parent.regionId,\n      parent.validatorSet,\n      false,\n    );\n    this.parentChain = parent.chain;\n  }\n\n  override nextSelector(): void {\n    if (this.chain) {\n      this.chains.push(this.chain);\n    }\n    this.maxSpecificity = Math.max(this.maxSpecificity, this.specificity);\n    this.chain = [];\n    this.pseudoelement = null;\n    this.viewConditionId = null;\n    this.footnoteContent = false;\n    this.specificity = 0;\n  }\n\n  override endFuncWithSelector(): void {\n    if (this.chain) {\n      this.chains.push(this.chain);\n    }\n    if (this.chains.length > 0) {\n      this.maxSpecificity = Math.max(this.maxSpecificity, this.specificity);\n      this.parentChain.push(\n        this.relational()\n          ? new MatchesRelationalAction(this.selectorTexts)\n          : this.positive()\n            ? new MatchesAction(this.chains)\n            : new MatchesNoneAction(this.chains),\n      );\n      if (this.increasingSpecificity()) {\n        this.parent.specificity += this.maxSpecificity;\n      }\n    } else {\n      // func argument is empty or all invalid\n      this.parentChain.push(new CheckConditionAction(\"\")); // always fails\n    }\n\n    this.owner.popHandler();\n  }\n\n  override startRuleBody(): void {\n    this.reportAndSkip(\"E_CSS_UNEXPECTED_RULE_BODY\");\n  }\n\n  override error(mnemonics: string, token: CssTokenizer.Token): void {\n    super.error(mnemonics, token);\n    this.chain = null;\n    this.pseudoelement = null;\n    this.viewConditionId = null;\n    this.footnoteContent = false;\n    this.specificity = 0;\n\n    let forgiving = false;\n    for (\n      let handler: CascadeParserHandler = this;\n      handler instanceof MatchesParameterParserHandler;\n      handler = handler.parent\n    ) {\n      if (handler.forgiving()) {\n        forgiving = true;\n        break;\n      }\n    }\n    if (!forgiving) {\n      this.owner.popHandler();\n    }\n  }\n\n  override pushSelectorText(selectorText: string): void {\n    // selectorText is used only for relational pseudo-class `:has()`\n    if (this.chain && this.relational()) {\n      this.selectorTexts.push(selectorText);\n    }\n  }\n\n  /**\n   * @returns true unless this is `:not()`\n   */\n  positive(): boolean {\n    return true;\n  }\n\n  /**\n   * @returns true unless this is `:where()`\n   */\n  increasingSpecificity(): boolean {\n    return true;\n  }\n\n  /**\n   * @returns true if this takes a forgiving selector list (:is/where/has)\n   */\n  forgiving(): boolean {\n    return true;\n  }\n\n  /**\n   * @returns true if this is `:has()`\n   */\n  relational(): boolean {\n    return false;\n  }\n}\n\n/**\n * Cascade Parser Handler for :not() pseudo-class parameter\n */\nexport class NotParameterParserHandler extends MatchesParameterParserHandler {\n  override positive(): boolean {\n    return false;\n  }\n\n  forgiving(): boolean {\n    return false;\n  }\n}\n\n/**\n * Cascade Parser Handler for :where() pseudo-class parameter\n */\nexport class WhereParameterParserHandler extends MatchesParameterParserHandler {\n  override increasingSpecificity(): boolean {\n    return false;\n  }\n}\n\n/**\n * Cascade Parser Handler for :has() pseudo-class parameter\n */\nexport class HasParameterParserHandler extends MatchesParameterParserHandler {\n  override relational(): boolean {\n    return true;\n  }\n}\n\n/**\n * Cascade Parser Handler for :nth-child(An+B of S) pseudo-class parameter\n */\nexport class NthChildOfSelectorParameterParserHandler extends MatchesParameterParserHandler {\n  constructor(\n    parent: CascadeParserHandler,\n    public readonly a: number,\n    public readonly b: number,\n  ) {\n    super(parent);\n  }\n\n  override endFuncWithSelector(): void {\n    if (this.chain) {\n      this.chains.push(this.chain);\n    }\n    if (this.chains.length > 0) {\n      this.maxSpecificity = Math.max(this.maxSpecificity, this.specificity);\n      this.parentChain.push(\n        new IsNthSiblingOfSelectorAction(this.a, this.b, this.chains),\n      );\n      // :nth-child(An+B of S) specificity: pseudo-class + most specific selector in S\n      this.parent.specificity += 256 + this.maxSpecificity;\n    } else {\n      // func argument is empty or all invalid\n      this.parentChain.push(new CheckConditionAction(\"\")); // always fails\n    }\n\n    this.owner.popHandler();\n  }\n\n  override forgiving(): boolean {\n    return true;\n  }\n}\n\n/**\n * Cascade Parser Handler for :nth-last-child(An+B of S) pseudo-class parameter\n */\nexport class NthLastChildOfSelectorParameterParserHandler extends NthChildOfSelectorParameterParserHandler {\n  override endFuncWithSelector(): void {\n    if (this.chain) {\n      this.chains.push(this.chain);\n    }\n    if (this.chains.length > 0) {\n      this.maxSpecificity = Math.max(this.maxSpecificity, this.specificity);\n      this.parentChain.push(\n        new IsNthLastSiblingOfSelectorAction(this.a, this.b, this.chains),\n      );\n      // :nth-last-child(An+B of S) specificity: pseudo-class + most specific selector in S\n      this.parent.specificity += 256 + this.maxSpecificity;\n    } else {\n      // func argument is empty or all invalid\n      this.parentChain.push(new CheckConditionAction(\"\")); // always fails\n    }\n\n    this.owner.popHandler();\n  }\n}\n\nexport class DefineParserHandler extends CssParser.SlaveParserHandler {\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n  ) {\n    super(scope, owner, false);\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    if (this.scope.values[name]) {\n      this.error(`E_CSS_NAME_REDEFINED ${name}`, this.getCurrentToken());\n    } else {\n      const unit = name.match(/height|^(top|bottom)$/) ? \"vh\" : \"vw\";\n      const dim = new Exprs.Numeric(this.scope, 100, unit);\n      this.scope.defineName(name, value.toExpr(this.scope, dim));\n    }\n  }\n}\n\nexport class PropSetParserHandler\n  extends CssParser.SlaveParserHandler\n  implements CssValidator.PropertyReceiver\n{\n  order: number;\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    public readonly condition: Exprs.Val,\n    public readonly elementStyle: ElementStyle,\n    public readonly validatorSet: CssValidator.ValidatorSet,\n    public readonly ruleType?: string,\n  ) {\n    super(scope, owner, false);\n    this.order = 0;\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    if (important) {\n      Logging.logger.warn(\"E_IMPORTANT_NOT_ALLOWED\");\n    } else {\n      this.validatorSet.validatePropertyAndHandleShorthand(\n        name,\n        value,\n        important,\n        this,\n      );\n    }\n  }\n\n  /** @override */\n  invalidPropertyValue(name: string, value: Css.Val): void {\n    Logging.logger.warn(\n      \"E_INVALID_PROPERTY_VALUE\",\n      `${name}:`,\n      value.toString(),\n    );\n  }\n\n  /** @override */\n  unknownProperty(name: string, value: Css.Val): void {\n    Logging.logger.warn(\"E_INVALID_PROPERTY\", `${name}:`, value.toString());\n  }\n\n  /** @override */\n  simpleProperty(name: string, value: Css.Val, important): void {\n    let specificity = important\n      ? this.getImportantSpecificity()\n      : this.getBaseSpecificity();\n    specificity += this.order;\n    this.order += ORDER_INCREMENT;\n    const cascval = this.condition\n      ? new ConditionalCascadeValue(value, specificity, this.condition)\n      : new CascadeValue(value, specificity);\n    setPropCascadeValue(this.elementStyle, name, cascval);\n  }\n}\n\nexport class PropertyParserHandler\n  extends CssParser.ErrorHandler\n  implements CssValidator.PropertyReceiver\n{\n  elementStyle = {} as ElementStyle;\n  order: number = 0;\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    public readonly validatorSet: CssValidator.ValidatorSet,\n  ) {\n    super(scope);\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    this.validatorSet.validatePropertyAndHandleShorthand(\n      name,\n      value,\n      important,\n      this,\n    );\n  }\n\n  /** @override */\n  invalidPropertyValue(name: string, value: Css.Val): void {\n    Logging.logger.warn(\n      \"E_INVALID_PROPERTY_VALUE\",\n      `${name}:`,\n      value.toString(),\n    );\n  }\n\n  /** @override */\n  unknownProperty(name: string, value: Css.Val): void {\n    Logging.logger.warn(\"E_INVALID_PROPERTY\", `${name}:`, value.toString());\n  }\n\n  /** @override */\n  simpleProperty(name: string, value: Css.Val, important): void {\n    let specificity = important\n      ? CssParser.SPECIFICITY_STYLE_IMPORTANT\n      : CssParser.SPECIFICITY_STYLE;\n    specificity += this.order;\n    this.order += ORDER_INCREMENT;\n    const cascval = new CascadeValue(value, specificity);\n    setPropCascadeValue(this.elementStyle, name, cascval);\n  }\n}\n\nexport function forEachViewConditionalStyles(\n  style: ElementStyle,\n  callback: (p1: ElementStyle) => any,\n): void {\n  const viewConditionalStyles = getViewConditionalStyleMap(style);\n  if (!viewConditionalStyles) {\n    return;\n  }\n  viewConditionalStyles.forEach((entry) => {\n    if (!entry.matcher.matches()) {\n      return;\n    }\n    callback(entry.styles);\n  });\n}\n\nexport function mergeViewConditionalStyles(\n  cascMap: { [key: string]: CascadeValue },\n  context: Exprs.Context,\n  style: ElementStyle,\n): void {\n  forEachViewConditionalStyles(style, (viewConditionalStyles) => {\n    mergeStyle(cascMap, viewConditionalStyles, context);\n  });\n}\n\nexport function parseStyleAttribute(\n  scope: Exprs.LexicalScope,\n  validatorSet: CssValidator.ValidatorSet,\n  baseURL: string,\n  styleAttrValue: string,\n): ElementStyle {\n  const handler = new PropertyParserHandler(scope, validatorSet);\n  const tokenizer = new CssTokenizer.Tokenizer(styleAttrValue, handler);\n  try {\n    CssParser.parseStyleAttribute(tokenizer, handler, baseURL);\n  } catch (err) {\n    Logging.logger.warn(err, \"Style attribute parse error:\");\n  }\n  return handler.elementStyle;\n}\n\nexport function isVertical(\n  cascaded: { [key: string]: CascadeValue },\n  context: Exprs.Context,\n  vertical: boolean,\n): boolean {\n  const writingModeCasc = cascaded[\"writing-mode\"];\n  if (writingModeCasc) {\n    const writingMode = writingModeCasc.evaluate(context, \"writing-mode\");\n    if (\n      writingMode &&\n      writingMode !== Css.ident.inherit &&\n      writingMode !== Css.ident.revert &&\n      writingMode !== Css.ident.unset\n    ) {\n      return writingMode === Css.ident.vertical_rl;\n    }\n  }\n  return vertical;\n}\n\nexport function isRtl(\n  cascaded: { [key: string]: CascadeValue },\n  context: Exprs.Context,\n  rtl: boolean,\n): boolean {\n  const directionCasc = cascaded[\"direction\"];\n  if (directionCasc) {\n    const direction = directionCasc.evaluate(context, \"direction\");\n    if (\n      direction &&\n      direction !== Css.ident.inherit &&\n      direction !== Css.ident.revert &&\n      direction !== Css.ident.unset\n    ) {\n      return direction === Css.ident.rtl;\n    }\n  }\n  return rtl;\n}\n\nexport function flattenCascadedStyle(\n  style: ElementStyle,\n  context: Exprs.Context,\n  regionIds: string[],\n  isFootnote: boolean,\n  nodeContext: Vtree.NodeContext,\n): { [key: string]: CascadeValue } {\n  const cascMap = {} as { [key: string]: CascadeValue };\n  for (const n in style) {\n    if (isPropName(n)) {\n      cascMap[n] = getProp(style, n);\n    }\n  }\n  mergeViewConditionalStyles(cascMap, context, style);\n  forEachStylesInRegion(\n    style,\n    regionIds,\n    isFootnote,\n    (regionId, regionStyle) => {\n      mergeStyle(cascMap, regionStyle, context);\n      mergeViewConditionalStyles(cascMap, context, regionStyle);\n    },\n  );\n  return cascMap;\n}\n\nexport function forEachStylesInRegion(\n  style: ElementStyle,\n  regionIds: string[],\n  isFootnote: boolean,\n  callback: (p1: string, p2: ElementStyle) => any,\n): void {\n  const regions = getStyleMap(style, \"_regions\");\n  if ((regionIds || isFootnote) && regions) {\n    if (isFootnote) {\n      const footnoteRegion = [\"footnote\"];\n      if (!regionIds) {\n        regionIds = footnoteRegion;\n      } else {\n        regionIds = regionIds.concat(footnoteRegion);\n      }\n    }\n    for (const regionId of regionIds) {\n      const regionStyle = regions[regionId];\n      if (regionStyle) {\n        callback(regionId, regionStyle);\n      }\n    }\n  }\n}\n\nexport function mergeStyle(\n  to: { [key: string]: CascadeValue },\n  from: ElementStyle,\n  context: Exprs.Context,\n): void {\n  for (const property in from) {\n    if (isPropName(property)) {\n      const newVal = getProp(from, property);\n      const oldVal = to[property];\n      to[property] = cascadeValues(context, oldVal, newVal as CascadeValue);\n    }\n  }\n}\n\n/**\n * Convert logical properties to physical ones, taking specificity into account.\n * @param src Source properties map\n * @param dest Destination map\n * @param transform If supplied, property values are transformed by this\n *     function before inserted into the destination map. The first parameter is\n *     the property name and the second one is the property value.\n * @template T\n */\nexport const convertToPhysical = <T>(\n  src: { [key: string]: CascadeValue },\n  dest: { [key: string]: T },\n  vertical: boolean,\n  rtl: boolean,\n  leftPageSide: boolean,\n  transform: (p1: string, p2: CascadeValue) => T,\n) => {\n  // for logical properties\n  const couplingMap1 = vertical\n    ? rtl\n      ? couplingMapVertRtl\n      : couplingMapVert\n    : rtl\n      ? couplingMapHorRtl\n      : couplingMapHor;\n\n  // for margin-inside/outside properties\n  const couplingMap2 = leftPageSide\n    ? couplingMapLeftPage\n    : couplingMapRightPage;\n\n  for (const propName in src) {\n    let cascVal = src[propName];\n    if (!cascVal) {\n      continue;\n    }\n    const coupledName1 =\n      couplingMap1[propName] ?? couplingMap1[couplingMap2[propName]];\n    const coupledName2 =\n      couplingMap2[propName] ?? couplingMap2[couplingMap1[propName]];\n    let coupledName = coupledName1 ?? coupledName2;\n    let targetName: string;\n    if (coupledName) {\n      let coupledCascVal = src[coupledName];\n      if (coupledCascVal && coupledCascVal.priority > cascVal.priority) {\n        continue;\n      }\n      if (coupledName1 && coupledName2 && coupledName1 !== coupledName2) {\n        coupledName = coupledName2;\n        coupledCascVal = src[coupledName];\n        if (coupledCascVal && coupledCascVal.priority > cascVal.priority) {\n          continue;\n        }\n      }\n      targetName = geomNames[coupledName1]\n        ? coupledName1\n        : geomNames[coupledName2]\n          ? coupledName2\n          : propName;\n    } else {\n      targetName = propName;\n      if (\n        propName.startsWith(\"text-align\") &&\n        (cascVal.value === Css.ident.inside ||\n          cascVal.value === Css.ident.outside)\n      ) {\n        cascVal = new CascadeValue(\n          leftPageSide === (cascVal.value === Css.ident.inside)\n            ? Css.ident.right\n            : Css.ident.left,\n          cascVal.priority,\n        );\n      }\n    }\n    dest[targetName] = transform(propName, cascVal);\n  }\n};\n\n/**\n * Convert var() to its value\n */\nexport class VarFilterVisitor extends Css.FilterVisitor {\n  constructor(\n    public elementStyles: ElementStyle[],\n    public styler: CssStyler.AbstractStyler,\n    public element: Element | null,\n  ) {\n    super();\n  }\n\n  private getVarValue(name: string): Css.Val {\n    let elem = this.element ?? ((this.styler as any).root as Element);\n    if (this.elementStyles?.length) {\n      for (const style of this.elementStyles) {\n        const val = (style[name] as CascadeValue)?.value;\n        if (val) {\n          return val;\n        }\n      }\n      if (this.element) {\n        elem = this.element.parentElement;\n      }\n    }\n    for (; elem; elem = elem.parentElement) {\n      const val = (this.styler.getStyle(elem, false)?.[name] as CascadeValue)\n        ?.value;\n      if (val) {\n        return val;\n      }\n    }\n    return null;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    if (func.name !== \"var\") {\n      return super.visitFunc(func);\n    }\n    const name = func.values[0] instanceof Css.Ident && func.values[0].name;\n    if (!name || !Css.isCustomPropName(name)) {\n      this.error = true;\n      return Css.empty;\n    }\n    const varVal = this.getVarValue(name);\n    if (varVal) {\n      return varVal;\n    }\n    // fallback value\n    if (func.values.length < 2) {\n      this.error = true;\n      return Css.empty;\n    }\n    if (func.values.length === 2) {\n      return func.values[1];\n    } else {\n      return new Css.CommaList(func.values.slice(1));\n    }\n  }\n}\n\n/**\n * Convert calc() to its value\n */\nexport class CalcFilterVisitor extends Css.FilterVisitor {\n  constructor(\n    public context: Exprs.Context,\n    public resolveViewportUnit?: boolean,\n    public percentRef?: number,\n    public vertical?: boolean,\n  ) {\n    super();\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    // convert func args\n    let value = super.visitFunc(func);\n    if (func.name !== \"calc\") {\n      return value;\n    }\n    const exprText = value.toString().replace(/^calc\\b/, \"-epubx-expr\");\n    if (\n      /\\d(%|em|ex|cap|ch|ic|lh|p?v[whbi]|p?vmin|p?vmax)\\W|\\Wvar\\(\\s*--/i.test(\n        exprText,\n      )\n    ) {\n      return value;\n    }\n    const exprVal = CssParser.parseValue(\n      this.context.rootScope,\n      new CssTokenizer.Tokenizer(exprText, null),\n      \"\",\n    );\n    if (exprVal instanceof Css.Expr) {\n      try {\n        const exprResult = exprVal.expr.evaluate(this.context);\n        if (typeof exprResult === \"number\" && !isNaN(exprResult)) {\n          if (/\\d(px|in|pt|pc|cm|mm|q|rem|rlh)\\W/i.test(exprText)) {\n            // length value\n            value = new Css.Numeric(exprResult, \"px\");\n          } else if (!/\\d[a-z]/i.test(exprText)) {\n            // unitless number\n            value = new Css.Num(exprResult);\n          }\n          // otherwise, keep the original calc() expression\n        }\n      } catch (err) {\n        Logging.logger.warn(err);\n      }\n    }\n    return value;\n  }\n\n  override visitNumeric(numeric: Css.Numeric): Css.Val {\n    if (\n      this.resolveViewportUnit &&\n      (Exprs.isViewportRelativeLengthUnit(numeric.unit) ||\n        Exprs.isRootFontRelativeLengthUnit(numeric.unit))\n    ) {\n      return new Css.Numeric(\n        numeric.num *\n          this.context.queryUnitSize(numeric.unit, false, this.vertical),\n        \"px\",\n      );\n    }\n    if (typeof this.percentRef === \"number\" && numeric.unit === \"%\") {\n      return new Css.Numeric((numeric.num * this.percentRef) / 100, \"px\");\n    }\n    return numeric;\n  }\n}\n\nexport function evaluateCSSToCSS(\n  context: Exprs.Context,\n  val: Css.Val,\n  propName?: string,\n  percentRef?: number,\n  vertical?: boolean,\n): Css.Val {\n  try {\n    if (val instanceof Css.Expr) {\n      if (\n        val.expr instanceof Exprs.Native &&\n        (val.expr.str.startsWith(\"named-string-\") ||\n          val.expr.str.startsWith(\"running-element-\"))\n      ) {\n        return val;\n      }\n      return CssParser.evaluateExprToCSS(context, val.expr, propName);\n    }\n    if (\n      val instanceof Css.Numeric ||\n      val instanceof Css.Func ||\n      val instanceof Css.SpaceList ||\n      val instanceof Css.CommaList\n    ) {\n      return val.visit(\n        new CalcFilterVisitor(context, true, percentRef, vertical),\n      );\n    }\n  } catch (err) {\n    Logging.logger.warn(err);\n    return Css.empty;\n  }\n  return val;\n}\n","/**\n * Copyright 2021 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview TextPolyfill - CSS text-spacing and hanging-punctuation support.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as Plugin from \"./plugin\";\nimport * as Vtree from \"./vtree\";\n\ntype PropertyValue = string | number | Css.Val;\n\ntype HangingPunctuation = {\n  first: boolean;\n  forceEnd: boolean; // force-end\n  allowEnd: boolean; // allow-end\n  last: boolean;\n};\n\nconst HANGING_PUNCTUATION_NONE: HangingPunctuation = {\n  first: false,\n  forceEnd: false,\n  allowEnd: false,\n  last: false,\n};\n\nfunction hangingPunctuationFromPropertyValue(\n  value: PropertyValue,\n): HangingPunctuation {\n  const cssval =\n    value instanceof Css.Val\n      ? value\n      : typeof value === \"string\"\n        ? Css.getName(value)\n        : Css.ident.none;\n\n  if (cssval === Css.ident.none) {\n    return HANGING_PUNCTUATION_NONE;\n  }\n  const values = cssval instanceof Css.SpaceList ? cssval.values : [cssval];\n  const hangingPunctuation: HangingPunctuation = Object.create(\n    HANGING_PUNCTUATION_NONE,\n  );\n\n  for (const val of values) {\n    if (val instanceof Css.Ident) {\n      switch (val.name) {\n        case \"first\":\n          hangingPunctuation.first = true;\n          break;\n        case \"force-end\":\n          hangingPunctuation.forceEnd = true;\n          hangingPunctuation.allowEnd = false;\n          break;\n        case \"allow-end\":\n          hangingPunctuation.forceEnd = false;\n          hangingPunctuation.allowEnd = true;\n          break;\n        case \"last\":\n          hangingPunctuation.last = true;\n          break;\n      }\n    }\n  }\n  return hangingPunctuation;\n}\n\nfunction isHangingPunctuationNone(\n  hangingPunctuation: HangingPunctuation,\n): boolean {\n  return (\n    !hangingPunctuation.first &&\n    !hangingPunctuation.last &&\n    !hangingPunctuation.forceEnd &&\n    !hangingPunctuation.allowEnd\n  );\n}\n\ntype SpacingTrim = {\n  trimStart: boolean; // trim-start\n  spaceFirst: boolean; // space-first\n  trimEnd: boolean; // trim-end\n  allowEnd: boolean; // allow-end\n  trimAdjacent: boolean; // trim-adjacent\n  // TODO: add support for:\n  //   trimAll: boolean; // trim-all\n};\n\n/**\n * text-spacing-trim: space-all\n * space-all = space-start space-end space-adjacent\n */\nconst SPACING_TRIM_NONE: SpacingTrim = {\n  trimStart: false,\n  spaceFirst: false,\n  trimEnd: false,\n  allowEnd: false,\n  trimAdjacent: false,\n};\n\n/**\n * text-spacing-trim: normal\n * normal = space-start allow-end trim-adjacent\n */\nconst SPACING_TRIM_NORMAL: SpacingTrim = {\n  trimStart: false,\n  spaceFirst: false,\n  trimEnd: false,\n  allowEnd: true,\n  trimAdjacent: true,\n};\n\n/**\n * text-spacing-trim: trim-both\n * trim-both = trim-start trim-end trim-adjacent\n *\n * NOTE: Values `trim-auto` (deprecated) and `auto` are treated as `trim-both`.\n */\nconst SPACING_TRIM_BOTH: SpacingTrim = {\n  trimStart: true,\n  spaceFirst: false,\n  trimEnd: true,\n  allowEnd: false,\n  trimAdjacent: true,\n};\n\nfunction spacingTrimFromPropertyValue(value: PropertyValue): SpacingTrim {\n  const cssval =\n    value instanceof Css.Val\n      ? value\n      : typeof value === \"string\"\n        ? Css.getName(value)\n        : Css.ident.normal;\n\n  if (cssval === Css.ident.normal) {\n    return SPACING_TRIM_NORMAL;\n  }\n  if (cssval === Css.ident.auto) {\n    return SPACING_TRIM_BOTH;\n  }\n  const values = cssval instanceof Css.SpaceList ? cssval.values : [cssval];\n  const textSpacing: SpacingTrim = Object.create(SPACING_TRIM_NORMAL);\n\n  for (const val of values) {\n    if (val instanceof Css.Ident) {\n      switch (val.name) {\n        case \"trim-both\":\n        case \"trim-auto\":\n          return SPACING_TRIM_BOTH;\n        case \"space-all\":\n          return SPACING_TRIM_NONE;\n        case \"trim-start\":\n          textSpacing.trimStart = true;\n          textSpacing.spaceFirst = false;\n          break;\n        case \"space-start\":\n          textSpacing.trimStart = false;\n          textSpacing.spaceFirst = false;\n          break;\n        case \"space-first\":\n          textSpacing.trimStart = false;\n          textSpacing.spaceFirst = true;\n          break;\n        case \"trim-end\":\n          textSpacing.trimEnd = true;\n          textSpacing.allowEnd = false;\n          break;\n        case \"space-end\":\n          textSpacing.trimEnd = false;\n          textSpacing.allowEnd = false;\n          break;\n        case \"allow-end\":\n          textSpacing.trimEnd = false;\n          textSpacing.allowEnd = true;\n          break;\n        case \"trim-adjacent\":\n          textSpacing.trimAdjacent = true;\n          break;\n        case \"space-adjacent\":\n          textSpacing.trimAdjacent = false;\n          break;\n      }\n    }\n  }\n\n  return textSpacing;\n}\n\ntype Autospace = {\n  ideographAlpha: boolean;\n  ideographNumeric: boolean;\n  // TODO: add support for:\n  //   punctuation: boolean;\n  //   replace: boolean;\n};\n\n/**\n * text-autospace: no-autospace (none)\n */\nconst AUTOSPACE_NONE: Autospace = {\n  ideographAlpha: false,\n  ideographNumeric: false,\n};\n\n/**\n * text-autospace: normal\n */\nconst AUTOSPACE_NORMAL: Autospace = {\n  ideographAlpha: true,\n  ideographNumeric: true,\n};\n\nfunction autospaceFromPropertyValue(value: PropertyValue): Autospace {\n  const cssval =\n    value instanceof Css.Val\n      ? value\n      : typeof value === \"string\"\n        ? Css.getName(value)\n        : Css.ident.normal;\n\n  if (cssval === Css.ident.normal || cssval === Css.ident.auto) {\n    return AUTOSPACE_NORMAL;\n  }\n  if (cssval === Css.ident.none) {\n    return AUTOSPACE_NONE;\n  }\n\n  const values = cssval instanceof Css.SpaceList ? cssval.values : [cssval];\n  const autospace: Autospace = Object.create(AUTOSPACE_NONE);\n\n  for (const val of values) {\n    if (val instanceof Css.Ident) {\n      switch (val.name) {\n        case \"no-autospace\":\n          return AUTOSPACE_NONE;\n        case \"ideograph-alpha\":\n          autospace.ideographAlpha = true;\n          break;\n        case \"ideograph-numeric\":\n          autospace.ideographNumeric = true;\n          break;\n      }\n    }\n  }\n\n  return autospace;\n}\n\nfunction isTextSpacingNone(\n  autospace: Autospace,\n  spacingTrim: SpacingTrim,\n): boolean {\n  return (\n    !autospace.ideographAlpha &&\n    !autospace.ideographNumeric &&\n    !spacingTrim.trimStart &&\n    !spacingTrim.spaceFirst &&\n    !spacingTrim.trimEnd &&\n    !spacingTrim.allowEnd &&\n    !spacingTrim.trimAdjacent\n  );\n}\n\nfunction normalizeLang(lang: string): string | null {\n  if (lang) {\n    // Normalize CJK lang\n    lang = lang.toLowerCase();\n    if (/^zh\\b.*-(hant|tw|hk)\\b/.test(lang)) {\n      return \"zh-hant\";\n    }\n    if (/^zh\\b/.test(lang)) {\n      return \"zh-hans\";\n    }\n    if (/^ja\\b/.test(lang)) {\n      return \"ja\";\n    }\n    if (/^ko\\b/.test(lang)) {\n      return \"ko\";\n    }\n    return lang;\n  }\n  return null;\n}\n\nclass TextSpacingPolyfill {\n  getPolyfilledInheritedProps() {\n    return [\"hanging-punctuation\", \"text-autospace\", \"text-spacing-trim\"];\n  }\n\n  preprocessSingleDocument(document: Document): void {\n    if (!document.body) {\n      return;\n    }\n    this.preprocessForTextSpacing(document.body);\n  }\n\n  preprocessForTextSpacing(element: Element): void {\n    // Split text nodes by punctuations and ideograph/non-ideograph boundary\n    const nodeIter = element.ownerDocument.createNodeIterator(\n      element,\n      NodeFilter.SHOW_TEXT,\n    );\n    for (let node = nodeIter.nextNode(); node; node = nodeIter.nextNode()) {\n      if (\n        node.parentElement.namespaceURI !== Base.NS.XHTML ||\n        node.parentElement.dataset?.[\"mathTypeset\"] === \"true\"\n      ) {\n        continue;\n      }\n      const textArr = node.textContent\n        .replace(\n          /(?![()\\[\\]{}])[\\p{Ps}\\p{Pe}\\p{Pf}\\p{Pi}、。，．：；､｡\\u3000]\\p{M}*(?=\\P{M})|.(?=(?![()\\[\\]{}])[\\p{Ps}\\p{Pe}\\p{Pf}\\p{Pi}、。，．：；､｡\\u3000])|(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF]\\p{M}*(?=(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])[\\p{L}\\p{Nd}])|(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])[\\p{L}\\p{Nd}]\\p{M}*(?=(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF])/gsu,\n          \"$&\\x00\",\n        )\n        .split(\"\\x00\");\n\n      if (textArr.length > 1) {\n        const lastIndex = textArr.length - 1;\n        for (let i = 0; i < lastIndex; i++) {\n          node.parentNode.insertBefore(\n            document.createTextNode(textArr[i]),\n            node,\n          );\n        }\n        node.textContent = textArr[lastIndex];\n      }\n    }\n  }\n\n  processGeneratedContent(\n    element: HTMLElement,\n    autospaceVal: Css.Val,\n    spacingTrimVal: Css.Val,\n    hangingPunctuationVal: Css.Val,\n    lang: string,\n    vertical: boolean,\n  ): void {\n    lang = normalizeLang(lang);\n    const autospace = autospaceFromPropertyValue(autospaceVal);\n    const spacingTrim = spacingTrimFromPropertyValue(spacingTrimVal);\n    const hangingPunctuation = hangingPunctuationFromPropertyValue(\n      hangingPunctuationVal,\n    );\n\n    if (\n      isHangingPunctuationNone(hangingPunctuation) &&\n      isTextSpacingNone(autospace, spacingTrim)\n    ) {\n      return;\n    }\n\n    this.preprocessForTextSpacing(element);\n\n    const whiteSpaceSave = element.style.whiteSpace;\n    if ((vertical ? element.offsetHeight : element.offsetWidth) === 0) {\n      // Prevent wrong line wrapping\n      element.style.whiteSpace = \"pre\";\n    }\n\n    const nodeIter = element.ownerDocument.createNodeIterator(\n      element,\n      NodeFilter.SHOW_TEXT,\n    );\n    let prevNode: Node = null;\n    let nextNode: Node = null;\n    for (let node = nodeIter.nextNode(); node; node = nextNode) {\n      nextNode = nodeIter.nextNode();\n      const isFirstInBlock = !prevNode;\n      const isFirstAfterForcedLineBreak =\n        !prevNode || /\\n$/.test(prevNode.textContent);\n      const isLastBeforeForcedLineBreak =\n        !nextNode || /^\\n/.test(nextNode.textContent);\n      const isLastInBlock = !nextNode;\n      this.processTextSpacing(\n        node,\n        isFirstInBlock || isFirstAfterForcedLineBreak,\n        isFirstInBlock,\n        isFirstAfterForcedLineBreak,\n        isLastBeforeForcedLineBreak,\n        isLastInBlock,\n        prevNode,\n        nextNode,\n        autospace,\n        spacingTrim,\n        hangingPunctuation,\n        lang,\n        vertical,\n      );\n      prevNode = node;\n    }\n\n    element.style.whiteSpace = whiteSpaceSave;\n  }\n\n  postLayoutBlock(\n    nodeContext: Vtree.NodeContext,\n    checkPoints: Vtree.NodeContext[],\n  ): void {\n    const isFirstFragment =\n      !nodeContext ||\n      (nodeContext.fragmentIndex === 1 && checkIfFirstInBlock());\n    const isAfterForcedLineBreak =\n      isFirstFragment || checkIfAfterForcedLineBreak();\n\n    function isOutOfLine(node: Node): boolean {\n      if (node?.nodeType !== 1) {\n        return false;\n      }\n      const elem = node as HTMLElement;\n      if (elem.hasAttribute(LayoutHelper.SPECIAL_ATTR)) {\n        return true;\n      }\n      const { position, float } = elem.style ?? {};\n      return (\n        position === \"absolute\" ||\n        position === \"fixed\" ||\n        (float && float !== \"none\")\n      );\n    }\n\n    function checkIfFirstInBlock(): boolean {\n      const p = checkPoints[0];\n      for (let pp = p; ; pp = pp.parent) {\n        if (!pp || !pp.inline) {\n          if (pp?.fragmentIndex !== 1) {\n            // This block is not the first fragment\n            return false;\n          }\n          break;\n        }\n      }\n      if (!p.inline) {\n        // This is at the start of the block\n        return true;\n      }\n      for (\n        let prev = p.viewNode.previousSibling;\n        prev;\n        prev = prev.previousSibling\n      ) {\n        if (Vtree.canIgnore(prev, p.whitespace)) {\n          continue;\n        }\n        if (!isOutOfLine(prev)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function checkIfAfterForcedLineBreak(): boolean {\n      let p = checkPoints[0];\n      let prevNode: Node;\n      while (p && p.inline) {\n        prevNode = p.viewNode?.previousSibling;\n        if (prevNode) {\n          if (\n            prevNode.nodeType === 3 &&\n            /^[ \\t\\r\\n\\f]*$/.test(prevNode.textContent) &&\n            p.whitespace !== Vtree.Whitespace.PRESERVE\n          ) {\n            prevNode = prevNode.previousSibling;\n          }\n          if (prevNode) {\n            break;\n          }\n        }\n        p = p.parent;\n      }\n\n      while (prevNode) {\n        if (prevNode.nodeType === 1) {\n          if ((prevNode as Element).localName === \"br\") {\n            return true;\n          }\n          const display = (prevNode as HTMLElement).style?.display;\n          if (display && display !== \"inline\") {\n            return !/^(inline|ruby)\\b/.test(display);\n          }\n        } else if (prevNode.nodeType === 3) {\n          if (p.whitespace === Vtree.Whitespace.PRESERVE) {\n            if (/\\n$/.test(prevNode.textContent)) {\n              return true;\n            }\n          } else if (p.whitespace === Vtree.Whitespace.NEWLINE) {\n            if (/\\n[ \\t\\r\\n\\f]*$/.test(prevNode.textContent)) {\n              return true;\n            }\n          }\n        }\n        prevNode = prevNode.lastChild;\n      }\n      return false;\n    }\n\n    let iFirst = -1;\n    for (let i = 0; i < checkPoints.length; i++) {\n      const p = checkPoints[i];\n      if (\n        !p.after &&\n        p.inline &&\n        !p.display &&\n        p.parent &&\n        p.viewNode.parentNode &&\n        p.viewNode.nodeType === Node.TEXT_NODE &&\n        !Vtree.canIgnore(p.viewNode, p.whitespace)\n      ) {\n        const lang = normalizeLang(\n          p.lang ??\n            p.parent.lang ??\n            nodeContext?.lang ??\n            nodeContext?.parent?.lang,\n        );\n        const autospace = autospaceFromPropertyValue(\n          p.inheritedProps[\"text-autospace\"],\n        );\n        const spacingTrim = spacingTrimFromPropertyValue(\n          p.inheritedProps[\"text-spacing-trim\"],\n        );\n        const hangingPunctuation = hangingPunctuationFromPropertyValue(\n          p.inheritedProps[\"hanging-punctuation\"],\n        );\n\n        if (\n          isHangingPunctuationNone(hangingPunctuation) &&\n          isTextSpacingNone(autospace, spacingTrim)\n        ) {\n          continue;\n        }\n        if (/\\b(flex|grid)\\b/.test(p.parent.display)) {\n          // Cannot process if parent is flex or grid. (Issue #926)\n          continue;\n        }\n\n        if (iFirst < 0) {\n          iFirst = i;\n        }\n        let prevNode: Node = null;\n        let nextNode: Node = null;\n        let isFirstAfterBreak = i === iFirst;\n        let isFirstInBlock = i === iFirst && isFirstFragment;\n        let isFirstAfterForcedLineBreak =\n          i === iFirst && isAfterForcedLineBreak;\n        let isLastBeforeForcedLineBreak = false;\n        let isLastInBlock = false;\n\n        function checkIfFirstAfterForcedLineBreak(\n          prevP: Vtree.NodeContext,\n        ): boolean {\n          if (prevP.viewNode?.nodeType === 1) {\n            return (prevP.viewNode as Element).localName === \"br\";\n          }\n          if (prevP.viewNode?.nodeType === 3) {\n            if (prevP.whitespace === Vtree.Whitespace.PRESERVE) {\n              if (/\\n$/.test(prevP.viewNode.textContent)) {\n                return true;\n              }\n            } else if (prevP.whitespace === Vtree.Whitespace.NEWLINE) {\n              if (/\\n[ \\t\\r\\n\\f]*$/.test(prevP.viewNode.textContent)) {\n                return true;\n              }\n            }\n            if (\n              (prevP.viewNode as Element).previousElementSibling?.localName ===\n              \"br\"\n            ) {\n              return Vtree.canIgnore(prevP.viewNode, prevP.whitespace);\n            }\n          }\n          return false;\n        }\n\n        function checkIfLastBeforeForcedLineBreak(\n          nextP: Vtree.NodeContext,\n        ): boolean {\n          if (nextP.viewNode?.nodeType === 1) {\n            return (nextP.viewNode as Element).localName === \"br\";\n          }\n          if (nextP.viewNode?.nodeType === 3) {\n            if (nextP.whitespace === Vtree.Whitespace.PRESERVE) {\n              if (/^\\n/.test(nextP.viewNode.textContent)) {\n                return true;\n              }\n            } else if (nextP.whitespace === Vtree.Whitespace.NEWLINE) {\n              if (/^[ \\t\\r\\n\\f]*\\n/.test(nextP.viewNode.textContent)) {\n                return true;\n              }\n            }\n            if (\n              (nextP.viewNode as Element).nextElementSibling?.localName === \"br\"\n            ) {\n              return Vtree.canIgnore(nextP.viewNode, nextP.whitespace);\n            }\n          }\n          return false;\n        }\n\n        for (let prev = i - 1; prev >= 0; prev--) {\n          const prevP = checkPoints[prev];\n          if (checkIfFirstAfterForcedLineBreak(prevP)) {\n            isFirstAfterForcedLineBreak = true;\n            break;\n          }\n          if (\n            !prevP.display &&\n            prevP.viewNode.nodeType === Node.TEXT_NODE &&\n            prevP.viewNode.textContent.length > 0\n          ) {\n            prevNode = prevP.viewNode;\n            break;\n          }\n          if (\n            (prevP.display && !/^(inline|ruby)\\b/.test(prevP.display)) ||\n            (prevP.viewNode?.nodeType === 1 &&\n              ((prevP.viewNode as Element).localName === \"br\" ||\n                Base.mediaTags[(prevP.viewNode as Element).localName]))\n          ) {\n            break;\n          }\n          if (prev === 0) {\n            isFirstAfterBreak = true;\n            if (isFirstFragment) {\n              isFirstInBlock = true;\n              isFirstAfterForcedLineBreak = true;\n            }\n          }\n        }\n        for (let next = i + 1; next < checkPoints.length; next++) {\n          const nextP = checkPoints[next];\n          if (checkIfLastBeforeForcedLineBreak(nextP)) {\n            isLastBeforeForcedLineBreak = true;\n            break;\n          }\n          if (\n            nextP.viewNode !== p.viewNode &&\n            !nextP.display &&\n            nextP.viewNode.nodeType === Node.TEXT_NODE &&\n            nextP.viewNode.textContent.length > 0\n          ) {\n            nextNode = nextP.viewNode;\n            break;\n          }\n          if (\n            (nextP.display && !/^(inline|ruby)\\b/.test(nextP.display)) ||\n            (nextP.viewNode?.nodeType === 1 &&\n              ((nextP.viewNode as Element).localName === \"br\" ||\n                Base.mediaTags[(nextP.viewNode as Element).localName]))\n          ) {\n            if (\n              next === checkPoints.length - 1 &&\n              isOutOfLine(nextP.viewNode)\n            ) {\n              isLastInBlock = true;\n            }\n            break;\n          }\n          if (next === checkPoints.length - 1) {\n            isLastBeforeForcedLineBreak = true;\n            isLastInBlock = true;\n            for (\n              let nextNext = nextP.viewNode.nextSibling;\n              nextNext;\n              nextNext = nextNext.nextSibling\n            ) {\n              if (!isOutOfLine(nextNext)) {\n                isLastInBlock = false;\n                break;\n              }\n            }\n          }\n        }\n        if (p.parent?.display === \"inline-block\") {\n          if (!isFirstInBlock) {\n            let firstInInlineBlock = p.parent.viewNode.firstChild;\n            while (Vtree.canIgnore(firstInInlineBlock, p.whitespace)) {\n              firstInInlineBlock = firstInInlineBlock.nextSibling;\n            }\n            if (p.viewNode === firstInInlineBlock) {\n              isFirstInBlock = true;\n            }\n          }\n          if (!isLastInBlock) {\n            let lastInInlineBlock = p.parent.viewNode.lastChild;\n            while (Vtree.canIgnore(lastInInlineBlock, p.whitespace)) {\n              lastInInlineBlock = lastInInlineBlock.previousSibling;\n            }\n            if (p.viewNode === lastInInlineBlock) {\n              isLastInBlock = true;\n            }\n          }\n        }\n        const columnOver = this.processTextSpacing(\n          p.viewNode,\n          isFirstAfterBreak,\n          isFirstInBlock,\n          isFirstAfterForcedLineBreak,\n          isLastBeforeForcedLineBreak,\n          isLastInBlock,\n          prevNode,\n          nextNode,\n          autospace,\n          spacingTrim,\n          hangingPunctuation,\n          lang,\n          p.vertical,\n        );\n        if (columnOver > 0) {\n          // Stop processing if the node is moved to next column\n          // because it will be processed again in the next column.\n          // (Issue #1256)\n          break;\n        }\n      }\n    }\n  }\n\n  private processTextSpacing(\n    textNode: Node,\n    isFirstAfterBreak: boolean,\n    isFirstInBlock: boolean,\n    isFirstAfterForcedLineBreak: boolean,\n    isLastBeforeForcedLineBreak: boolean,\n    isLastInBlock: boolean,\n    prevNode: Node,\n    nextNode: Node,\n    autospace: Autospace,\n    spacingTrim: SpacingTrim,\n    hangingPunctuation: HangingPunctuation,\n    lang: string,\n    vertical: boolean,\n  ): number {\n    const text = textNode.textContent;\n    const document = textNode.ownerDocument;\n    let columnOver = 0;\n    let currRange: Range;\n    let prevRange: Range;\n    let nextRange: Range;\n\n    function isAtStartOfLine(): boolean {\n      if (isFirstAfterBreak) {\n        return true;\n      }\n      if (!prevNode) {\n        return false;\n      }\n      if (!currRange) {\n        currRange = document.createRange();\n        currRange.selectNode(textNode);\n      }\n      const rect = currRange.getClientRects()[0];\n      if (!rect) {\n        return false;\n      }\n      if (!prevRange) {\n        prevRange = document.createRange();\n        prevRange.selectNode(prevNode);\n      }\n      const prevRects = prevRange.getClientRects();\n      const prevRect = prevRects[prevRects.length - 1];\n      if (!prevRect) {\n        return false;\n      }\n      columnOver ||= LayoutHelper.checkIfBeyondColumnBreaks(prevRect, vertical);\n      return vertical\n        ? rect.top < prevRect.top + prevRect.height - rect.width ||\n            rect.left + rect.width < prevRect.left + rect.width / 10 ||\n            rect.left > prevRect.left + prevRect.width - rect.width / 10\n        : rect.left < prevRect.left + prevRect.width - rect.height ||\n            rect.top > prevRect.top + prevRect.height - rect.height / 10 ||\n            rect.top + rect.height < prevRect.top + rect.height / 10;\n    }\n\n    function isAtEndOfLine(): boolean {\n      if (!nextNode) {\n        return false;\n      }\n      if (!currRange) {\n        currRange = document.createRange();\n        currRange.selectNode(textNode);\n      }\n      const rect = currRange.getClientRects()[0];\n      if (!rect) {\n        return false;\n      }\n      columnOver ||= LayoutHelper.checkIfBeyondColumnBreaks(rect, vertical);\n      if (!nextRange) {\n        nextRange = document.createRange();\n        nextRange.selectNode(nextNode);\n      }\n      const nextRect = nextRange.getClientRects()[0];\n      if (!nextRect) {\n        return false;\n      }\n      return vertical\n        ? rect.top + rect.height > nextRect.top + rect.width ||\n            rect.left > nextRect.left + nextRect.width - rect.width / 10 ||\n            rect.left + rect.width < nextRect.left + rect.width / 10\n        : rect.left + rect.width > nextRect.left + rect.height ||\n            rect.top + rect.height < nextRect.top + rect.height / 10 ||\n            rect.top > nextRect.top + nextRect.height - rect.height / 10;\n    }\n\n    let punctProcessing = false;\n    let hangingFirst = false;\n    let hangingLast = false;\n    let hangingEnd = false;\n    let tagName: \"viv-ts-open\" | \"viv-ts-close\";\n\n    if (\n      isFirstInBlock &&\n      hangingPunctuation.first &&\n      /^[\\p{Ps}\\p{Pf}\\p{Pi}'\"\\u3000]\\p{M}*$/u.test(text)\n    ) {\n      // hanging-punctuation: first\n      tagName = \"viv-ts-open\";\n      punctProcessing = true;\n      hangingFirst = true;\n    } else if (\n      isLastInBlock &&\n      hangingPunctuation.last &&\n      /^[\\p{Pe}\\p{Pf}\\p{Pi}'\"]\\p{M}*$/u.test(text)\n    ) {\n      // hanging-punctuation: last\n      tagName = \"viv-ts-close\";\n      punctProcessing = true;\n      hangingLast = true;\n    } else if (\n      (hangingPunctuation.forceEnd || hangingPunctuation.allowEnd) &&\n      /^[、。，．､｡]\\p{M}*$/u.test(text)\n    ) {\n      // hanging-punctuation: force-end | allow-end\n      tagName = \"viv-ts-close\";\n      punctProcessing = true;\n      hangingEnd = true;\n    } else if (\n      (spacingTrim.trimStart ||\n        spacingTrim.spaceFirst ||\n        spacingTrim.trimAdjacent) &&\n      /^[‘“〝（［｛｟〈〈《「『【〔〖〘〚]\\p{M}*$/u.test(text)\n    ) {\n      // fullwidth opening punctuation\n      tagName = \"viv-ts-open\";\n      punctProcessing = true;\n    } else if (\n      (spacingTrim.trimEnd ||\n        spacingTrim.allowEnd ||\n        spacingTrim.trimAdjacent) &&\n      (/^[’”〞〟）］｝｠〉〉》」』】〕〗〙〛]\\p{M}*$/u.test(text) ||\n        (lang === \"zh-hans\" && /^[：；]\\p{M}*$/u.test(text)) ||\n        (lang !== \"zh-hant\" && /^[、。，．]\\p{M}*$/u.test(text)))\n    ) {\n      // fullwidth closing punctuation\n      tagName = \"viv-ts-close\";\n      punctProcessing = true;\n    }\n\n    if (punctProcessing) {\n      if (textNode.parentElement.localName === \"viv-ts-inner\") {\n        // Already processed\n        return 0;\n      }\n      // Wrap the textNode as `<{tagName}><viv-ts-inner>{text}<viv-ts-inner></{tagName}>`\n      const outerElem = document.createElement(tagName);\n      const innerElem = document.createElement(\"viv-ts-inner\");\n      outerElem.appendChild(innerElem);\n      textNode.parentNode.insertBefore(outerElem, textNode);\n      innerElem.appendChild(textNode);\n\n      // Check if the punctuation is almost full width\n      function checkFullWidth(elem: HTMLElement): boolean {\n        const fontSize = parseFloat(\n          document.defaultView.getComputedStyle(elem).fontSize,\n        );\n        const fullWidthThreshold = fontSize * 0.7;\n        return (\n          (vertical ? elem.offsetHeight : elem.offsetWidth) > fullWidthThreshold\n        );\n      }\n      const isFullWidth = checkFullWidth(innerElem);\n\n      function linePosition(): number {\n        return vertical ? outerElem.offsetLeft : outerElem.offsetTop;\n      }\n\n      if (isFullWidth || hangingFirst || hangingLast || hangingEnd) {\n        if (tagName === \"viv-ts-open\") {\n          if (hangingFirst) {\n            outerElem.className = \"viv-hang-first\";\n          } else if (isFirstInBlock || isFirstAfterForcedLineBreak) {\n            if (spacingTrim.trimStart) {\n              outerElem.className = \"viv-ts-trim\";\n            } else {\n              outerElem.className = \"viv-ts-space\";\n            }\n          } else if (\n            !(spacingTrim.trimStart || spacingTrim.spaceFirst) &&\n            isAtStartOfLine()\n          ) {\n            outerElem.className = \"viv-ts-space\";\n          } else if (\n            spacingTrim.trimAdjacent &&\n            prevNode &&\n            /[\\p{Ps}\\p{Pi}\\p{Pe}\\p{Pf}\\u00B7\\u2027\\u30FB\\u3000：；、。，．]\\p{M}*$/u.test(\n              prevNode.textContent,\n            ) &&\n            // exclude non-fullwidth closing punctuations (Issue #1003)\n            (!/[\\p{Pe}\\p{Pf}]\\p{M}*$/u.test(prevNode.textContent) ||\n              (prevNode.parentElement.localName === \"viv-ts-inner\" &&\n                checkFullWidth(prevNode.parentElement)))\n          ) {\n            outerElem.className = \"viv-ts-trim\";\n          } else if (\n            (spacingTrim.trimStart || spacingTrim.spaceFirst) &&\n            isAtStartOfLine()\n          ) {\n            const linePos = linePosition();\n            outerElem.className = \"viv-ts-auto\";\n            if (linePos === linePosition() && !isAtStartOfLine()) {\n              // workaround for issues #1005 and #1010\n              outerElem.className = \"viv-ts-trim\";\n            }\n          }\n        } else if (tagName === \"viv-ts-close\") {\n          if (hangingLast) {\n            outerElem.className = isFullWidth\n              ? \"viv-hang-last\"\n              : \"viv-hang-last viv-hang-hw\";\n          } else if (isLastInBlock || isLastBeforeForcedLineBreak) {\n            const linePos = linePosition();\n            if (hangingEnd) {\n              outerElem.className = isFullWidth\n                ? hangingPunctuation.allowEnd && spacingTrim.allowEnd\n                  ? \"viv-ts-auto\"\n                  : \"viv-hang-end\"\n                : \"viv-hang-end viv-hang-hw\";\n              if (hangingPunctuation.allowEnd && linePos === linePosition()) {\n                if (spacingTrim.trimEnd) {\n                  outerElem.className = \"viv-ts-trim\";\n                } else if (spacingTrim.allowEnd) {\n                  outerElem.className = \"viv-hang-end\";\n                  if (linePos === linePosition()) {\n                    outerElem.className = \"\";\n                  }\n                } else {\n                  outerElem.className = \"viv-ts-space\";\n                }\n              }\n            } else if (spacingTrim.trimEnd) {\n              outerElem.className = \"viv-ts-trim\";\n            } else if (spacingTrim.allowEnd) {\n              outerElem.className = \"viv-ts-auto\";\n              if (linePos === linePosition()) {\n                outerElem.className = \"\";\n              }\n            } else {\n              outerElem.className = \"viv-ts-space\";\n            }\n          } else if (\n            nextNode &&\n            /^[\\p{Pe}\\p{Pf}\\u00B7\\u2027\\u30FB\\u3000：；、。，．]/u.test(\n              nextNode.textContent,\n            )\n          ) {\n            if (isFullWidth && spacingTrim.trimAdjacent) {\n              outerElem.className = \"viv-ts-trim\";\n            }\n          } else if (hangingEnd) {\n            const atEnd = isAtEndOfLine();\n            const atEndNoHang = atEnd && hangingPunctuation.allowEnd;\n            if (!atEndNoHang) {\n              outerElem.className = isFullWidth\n                ? \"viv-hang-end\"\n                : \"viv-hang-end viv-hang-hw\";\n            }\n            if (!isFullWidth) {\n              if (!atEnd && !isAtEndOfLine()) {\n                outerElem.className = \"\";\n              }\n            } else if (atEndNoHang && spacingTrim.trimEnd) {\n              outerElem.className = \"viv-ts-auto\";\n            } else if (!atEndNoHang && !isAtEndOfLine()) {\n              outerElem.className = \"\";\n            } else if (!atEnd && hangingPunctuation.allowEnd) {\n              if (!spacingTrim.trimEnd) {\n                outerElem.className = \"viv-ts-space\";\n                if (!isAtEndOfLine()) {\n                  if (spacingTrim.allowEnd) {\n                    outerElem.className = \"viv-ts-auto\";\n                    if (!isAtEndOfLine()) {\n                      outerElem.className = \"viv-hang-end\";\n                    }\n                  } else {\n                    outerElem.className = \"viv-hang-end\";\n                  }\n                }\n              } else {\n                outerElem.className = \"viv-ts-auto\";\n                if (!isAtEndOfLine()) {\n                  outerElem.className = \"viv-hang-end\";\n                }\n              }\n            }\n          } else if (spacingTrim.trimEnd || spacingTrim.allowEnd) {\n            if (isAtEndOfLine()) {\n              if (spacingTrim.allowEnd) {\n                outerElem.className = \"viv-ts-space\";\n              } else {\n                outerElem.className = \"viv-ts-auto\";\n              }\n            } else {\n              const linePos = linePosition();\n              outerElem.className = \"viv-ts-auto\";\n              if (linePos === linePosition()) {\n                outerElem.className = \"\";\n              }\n            }\n          }\n        }\n      }\n    }\n\n    let spaceIdeoAlnumProcessing = false;\n\n    function checkUpright(elem: Element): boolean {\n      const style = elem?.ownerDocument.defaultView?.getComputedStyle(elem);\n      return (\n        !!style &&\n        (style.textOrientation === \"upright\" ||\n          style.textCombineUpright === \"all\" ||\n          style[\"-webkit-text-combine\"] === \"horizontal\")\n      );\n    }\n\n    function checkNonZeroMarginBorderPadding(\n      node1: Node,\n      node2: Node,\n    ): boolean {\n      if (node1.nodeType === 1) {\n        const style = document.defaultView.getComputedStyle(node1 as Element);\n        if (\n          parseFloat(style.marginInlineEnd) ||\n          parseFloat(style.borderInlineEndWidth) ||\n          parseFloat(style.paddingInlineEnd)\n        ) {\n          return true;\n        }\n      }\n      const parent1 = node1.parentElement;\n      if (parent1 && !parent1.contains(node2)) {\n        return checkNonZeroMarginBorderPadding(parent1, node2);\n      }\n      if (node2.nodeType === 1) {\n        const style = document.defaultView.getComputedStyle(node2 as Element);\n        if (\n          parseFloat(style.marginInlineStart) ||\n          parseFloat(style.borderInlineStartWidth) ||\n          parseFloat(style.paddingInlineStart)\n        ) {\n          return true;\n        }\n      }\n      const parent2 = node2.parentElement;\n      if (parent2 && !parent2.contains(node1)) {\n        return checkNonZeroMarginBorderPadding(node1, parent2);\n      }\n      return false;\n    }\n\n    if (autospace.ideographAlpha || autospace.ideographNumeric) {\n      if (\n        prevNode &&\n        /^(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF]/u.test(text) &&\n        ((autospace.ideographAlpha &&\n          /(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])\\p{L}\\p{M}*$/u.test(\n            prevNode.textContent,\n          )) ||\n          (autospace.ideographNumeric &&\n            /(?![\\uFF01-\\uFF60])\\p{Nd}\\p{M}*$/u.test(prevNode.textContent))) &&\n        !(vertical && checkUpright(prevNode.parentElement)) &&\n        !checkNonZeroMarginBorderPadding(prevNode, textNode)\n      ) {\n        textNode.parentNode.insertBefore(\n          document.createElement(\"viv-ts-thin-sp\"),\n          textNode,\n        );\n        spaceIdeoAlnumProcessing = true;\n      }\n      if (\n        nextNode &&\n        /(?!\\p{P})[\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF]\\p{M}*$/u.test(text) &&\n        ((autospace.ideographAlpha &&\n          /^(?![\\p{sc=Han}\\u3041-\\u30FF\\u31C0-\\u31FF\\uFF01-\\uFF60])\\p{L}/u.test(\n            nextNode.textContent,\n          )) ||\n          (autospace.ideographNumeric &&\n            /^(?![\\uFF01-\\uFF60])\\p{Nd}/u.test(nextNode.textContent))) &&\n        !(vertical && checkUpright(nextNode.parentElement)) &&\n        !checkNonZeroMarginBorderPadding(textNode, nextNode)\n      ) {\n        textNode.parentNode.insertBefore(\n          document.createElement(\"viv-ts-thin-sp\"),\n          textNode.nextSibling,\n        );\n        spaceIdeoAlnumProcessing = true;\n      }\n    }\n    return columnOver;\n  }\n\n  registerHooks() {\n    Plugin.registerHook(\n      Plugin.HOOKS.POLYFILLED_INHERITED_PROPS,\n      this.getPolyfilledInheritedProps.bind(this),\n    );\n    Plugin.registerHook(\n      Plugin.HOOKS.PREPROCESS_SINGLE_DOCUMENT,\n      this.preprocessSingleDocument.bind(this),\n    );\n    Plugin.registerHook(\n      Plugin.HOOKS.POST_LAYOUT_BLOCK,\n      this.postLayoutBlock.bind(this),\n      true, // text-spacing must be processed before others (Issue #1105)\n    );\n  }\n}\n\nconst textPolyfill = new TextSpacingPolyfill();\ntextPolyfill.registerHooks();\n\nexport function preprocessForTextSpacing(element: Element): void {\n  textPolyfill.preprocessForTextSpacing(element);\n}\n\nexport function processGeneratedContent(\n  element: HTMLElement,\n  textAutospace: Css.Val,\n  textSpacingTrim: Css.Val,\n  hangingPunctuation: Css.Val,\n  lang: string,\n  vertical: boolean,\n): void {\n  textPolyfill.processGeneratedContent(\n    element,\n    textAutospace,\n    textSpacingTrim,\n    hangingPunctuation,\n    lang,\n    vertical,\n  );\n}\n","/**\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview PseudoElement - CSS pseudo elements.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Exprs from \"./exprs\";\nimport * as TextPolyfill from \"./text-polyfill\";\nimport * as Vtree from \"./vtree\";\nimport { PseudoElement } from \"./types\";\n\nexport const document = new DOMParser().parseFromString(\n  `<root xmlns=\"${Base.NS.SHADOW}\"/>`,\n  \"text/xml\",\n);\n\n/**\n * Pseudoelement names in the order they should be inserted in the shadow DOM,\n * empty string is the place where the element's DOM children are processed.\n */\nexport const pseudoNames = [\n  \"footnote-marker\",\n  \"marker\",\n  \"first-5-lines\",\n  \"first-4-lines\",\n  \"first-3-lines\",\n  \"first-2-lines\",\n  \"first-line\",\n  \"first-letter\",\n  \"before\",\n  \"\",\n  /* content */\n  \"after\",\n];\n\nexport const PSEUDO_ATTR = \"data-adapt-pseudo\";\n\nexport function getPseudoName(element: Element): string {\n  return element.getAttribute(PSEUDO_ATTR) || \"\";\n}\n\nexport function setPseudoName(element: Element, name: string): void {\n  element.setAttribute(PSEUDO_ATTR, name);\n}\n\nexport class PseudoelementStyler implements PseudoElement.PseudoelementStyler {\n  contentProcessed: { [key: string]: boolean } = {};\n\n  // after content: update style\n\n  constructor(\n    public readonly element: Element,\n    public style: CssCascade.ElementStyle,\n    public styler: CssStyler.AbstractStyler,\n    public readonly context: Exprs.Context,\n    public readonly exprContentListener: Vtree.ExprContentListener,\n  ) {}\n\n  /** @override */\n  getStyle(element: Element, deep: boolean): CssCascade.ElementStyle {\n    const pseudoName = getPseudoName(element);\n    if (this.styler && pseudoName && pseudoName.match(/after$/)) {\n      this.style = this.styler.getStyle(this.element, true);\n      this.styler = null;\n    }\n    const pseudoMap = CssCascade.getStyleMap(this.style, \"_pseudos\");\n    const style = pseudoMap?.[pseudoName] || ({} as CssCascade.ElementStyle);\n    if (pseudoName.match(/^first-/) && !style[\"x-first-pseudo\"]) {\n      let nest = 1;\n      let r: RegExpMatchArray;\n      if (pseudoName == \"first-letter\") {\n        nest = 0;\n      } else if ((r = pseudoName.match(/^first-([0-9]+)-lines$/)) != null) {\n        nest = (r[1] as any) - 0;\n      }\n      style[\"x-first-pseudo\"] = new CssCascade.CascadeValue(\n        new Css.Int(nest),\n        0,\n      );\n    }\n    return style;\n  }\n\n  /** @override */\n  processContent(\n    element: Element,\n    styles: { [key: string]: Css.Val },\n    nodeContext: Vtree.NodeContext,\n  ) {\n    const pseudoName = getPseudoName(element);\n    if (!this.contentProcessed[pseudoName]) {\n      this.contentProcessed[pseudoName] = true;\n      if (pseudoName === \"marker\") {\n        this.processMarker(element, styles, nodeContext);\n      }\n      const contentVal = styles[\"content\"];\n      if (Vtree.nonTrivialContent(contentVal)) {\n        contentVal.visit(\n          new Vtree.ContentPropertyHandler(\n            (element.classList.contains(\"_viv-marker-outside\") &&\n              element.firstElementChild) ||\n              element,\n            this.context,\n            contentVal,\n            this.exprContentListener,\n          ),\n        );\n        // text-spacing & hanging-punctuation support\n        TextPolyfill.preprocessForTextSpacing(element);\n      }\n    }\n  }\n\n  /**\n   * ::marker support\n   */\n  private processMarker(\n    element: Element,\n    styles: { [key: string]: Css.Val },\n    nodeContext: Vtree.NodeContext,\n  ): void {\n    const content = styles[\"content\"];\n    const listStylePosition = styles[\"list-style-position\"];\n    const listStyleType = styles[\"list-style-type\"];\n\n    if (Vtree.nonTrivialContent(content)) {\n      if (content instanceof Css.URL) {\n        // content: <URL>\n        //\n        // Wrap URL in a SpaceList to ensure that img element is generated as\n        // a child of the marker pseudo-element.\n        styles[\"content\"] = new Css.SpaceList([content]);\n      } else if (content instanceof Css.Str) {\n        // content: <string>\n        //\n        // The content string may have been made from list-style-type in\n        // `CascadeInstance.processMarkerPseudoelementProps()` in css-cascade.ts.\n        if (listStyleType instanceof Css.Ident) {\n          const lowerName = listStyleType.name.toLowerCase();\n          if (\n            lowerName === \"disc\" ||\n            lowerName === \"circle\" ||\n            lowerName === \"square\" ||\n            lowerName === \"disclosure-open\" ||\n            lowerName === \"disclosure-closed\"\n          ) {\n            // Use special font for bullet symbols.\n            element.classList.add(\"_viv-marker-bullet\");\n            if (\n              lowerName === \"disclosure-open\" ||\n              lowerName === \"disclosure-closed\"\n            ) {\n              const rtl = nodeContext.direction === \"rtl\";\n              const vertical = nodeContext.vertical;\n              // Change disclosure triangles for rtl or vertical text.\n              styles[\"content\"] = new Css.Str(\n                lowerName === \"disclosure-open\"\n                  ? vertical\n                    ? \"◂ \"\n                    : \"▾ \"\n                  : vertical\n                    ? rtl\n                      ? \"▴ \"\n                      : \"▾ \"\n                    : rtl\n                      ? \"◂ \"\n                      : \"▸ \",\n              );\n            }\n          }\n        }\n      }\n    }\n\n    if (listStylePosition === Css.ident.outside) {\n      // Use special styling to simulate outside markers.\n      element.classList.add(\"_viv-marker-outside\");\n      // Create a span to hold the marker content.\n      const span = element.ownerDocument.createElementNS(Base.NS.XHTML, \"span\");\n      span.classList.add(\"_viv-marker-outside-content\");\n      element.appendChild(span);\n\n      // Prevent text-spacing-trim and hanging-punctuation from trimming or\n      // hanging the suffix \"、\" of counter styles such as \"cjk-decimal\".\n      const textSpacingTrim = nodeContext.inheritedProps[\"text-spacing-trim\"];\n      if (textSpacingTrim && textSpacingTrim !== \"space-all\") {\n        styles[\"text-spacing-trim\"] = Css.ident.normal;\n      }\n      const hangingPunctuation =\n        nodeContext.inheritedProps[\"hanging-punctuation\"];\n      if (hangingPunctuation) {\n        styles[\"hanging-punctuation\"] = Css.ident.none;\n      }\n    }\n\n    // These are used only temporarily to generate content from list-style-*,\n    // so remove them after processing.\n    delete styles[\"list-style-position\"];\n    delete styles[\"list-style-type\"];\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Layout - Fills a column with styled content.\n * This file does not communicate with the styling system directly.\n * Instead it goes through the layout interface that gives it one view tree\n * node at a time.\n */\nimport * as LayoutRetryers from \"./layout-retryers\";\nimport * as Asserts from \"./asserts\";\nimport * as Shared from \"./shared\";\nimport * as Sizing from \"./sizing\";\nimport * as Break from \"./break\";\nimport * as Logging from \"./logging\";\nimport * as Diff from \"./diff\";\nimport * as Base from \"./base\";\nimport * as BreakPosition from \"./break-position\";\nimport * as Css from \"./css\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Plugin from \"./plugin\";\nimport * as Matchers from \"./matchers\";\nimport * as PseudoElement from \"./pseudo-element\";\nimport * as Task from \"./task\";\nimport * as Vgen from \"./vgen\";\nimport * as VtreeImpl from \"./vtree\";\nimport {\n  FragmentLayoutConstraintType,\n  Layout,\n  RepetitiveElement,\n  Selectors,\n  Table,\n  Vtree,\n} from \"./types\";\n\nexport const isInstanceOfAfterIfContinuesLayoutConstraint =\n  Selectors.isInstanceOfAfterIfContinuesLayoutConstraint;\nexport const registerFragmentIndex =\n  Matchers.NthFragmentMatcher.registerFragmentIndex;\nexport const clearFragmentIndices =\n  Matchers.NthFragmentMatcher.clearFragmentIndices;\n\nexport class AfterIfContinues implements Selectors.AfterIfContinues {\n  constructor(\n    public readonly sourceNode: Element,\n    public readonly styler: PseudoElement.PseudoelementStyler,\n  ) {}\n\n  createElement(\n    column: Layout.Column,\n    parentNodeContext: Vtree.NodeContext,\n  ): Task.Result<Element> {\n    const doc = parentNodeContext.viewNode.ownerDocument;\n    const viewRoot = doc.createElement(\"div\");\n    const pseudoColumn = new PseudoColumn(column, viewRoot, parentNodeContext);\n    const initialPageBreakType = pseudoColumn.getColumn().pageBreakType;\n    pseudoColumn.getColumn().pageBreakType = null;\n    return pseudoColumn\n      .layout(this.createNodePositionForPseudoElement(), true)\n      .thenAsync(() => {\n        this.styler.contentProcessed[\"after-if-continues\"] = false;\n        pseudoColumn.getColumn().pageBreakType = initialPageBreakType;\n        const pseudoElement = viewRoot.firstChild as Element;\n        Base.setCSSProperty(pseudoElement, \"display\", \"block\");\n        return Task.newResult(pseudoElement);\n      });\n  }\n\n  private createNodePositionForPseudoElement(): Vtree.ChunkPosition {\n    const sourceNode = PseudoElement.document.createElementNS(\n      Base.NS.XHTML,\n      \"div\",\n    );\n    PseudoElement.setPseudoName(sourceNode, \"after-if-continues\");\n    const shadowContext = this.createShadowContext(sourceNode);\n    const step = {\n      node: sourceNode,\n      shadowType: shadowContext.type,\n      shadowContext,\n      nodeShadow: null,\n      shadowSibling: null,\n    };\n    const nodePosition = {\n      steps: [step],\n      offsetInNode: 0,\n      after: false,\n      preprocessedTextContent: null,\n    };\n    return new VtreeImpl.ChunkPosition(nodePosition as any);\n  }\n\n  private createShadowContext(root: Element): Vtree.ShadowContext {\n    return new VtreeImpl.ShadowContext(\n      this.sourceNode,\n      root,\n      null,\n      null,\n      null,\n      Vtree.ShadowType.ROOTED,\n      this.styler,\n    );\n  }\n}\n\nexport class AfterIfContinuesLayoutConstraint\n  implements Selectors.AfterIfContinuesLayoutConstraint\n{\n  flagmentLayoutConstraintType: FragmentLayoutConstraintType =\n    \"AfterIfContinue\";\n\n  constructor(\n    public nodeContext: Vtree.NodeContext,\n    public afterIfContinues: Selectors.AfterIfContinues,\n    public pseudoElementHeight: number,\n  ) {}\n\n  /** @override */\n  allowLayout(\n    nodeContext: Vtree.NodeContext,\n    overflownNodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): boolean {\n    if (\n      (overflownNodeContext && !nodeContext) ||\n      (nodeContext && nodeContext.overflow)\n    ) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  /** @override */\n  nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n    return false;\n  }\n\n  /** @override */\n  postLayout(\n    allowed: boolean,\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: Layout.Column,\n  ) {}\n\n  /** @override */\n  finishBreak(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<boolean> {\n    if (!this.getRepetitiveElements().affectTo(nodeContext)) {\n      return Task.newResult(true);\n    }\n    return this.afterIfContinues\n      .createElement(column, this.nodeContext)\n      .thenAsync((element) => {\n        this.nodeContext.viewNode.appendChild(element);\n        return Task.newResult(true);\n      });\n  }\n\n  getRepetitiveElements() {\n    return new AfterIfContinuesElementsOffset(\n      this.nodeContext,\n      this.pseudoElementHeight,\n    );\n  }\n\n  /** @override */\n  equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n    if (!(constraint instanceof AfterIfContinuesLayoutConstraint)) {\n      return false;\n    }\n    return (\n      this.afterIfContinues ==\n      (constraint as AfterIfContinuesLayoutConstraint).afterIfContinues\n    );\n  }\n\n  /** @override */\n  getPriorityOfFinishBreak(): number {\n    return 9;\n  }\n}\n\nexport class AfterIfContinuesElementsOffset\n  implements Selectors.AfterIfContinuesElementsOffset\n{\n  constructor(\n    public nodeContext,\n    public pseudoElementHeight,\n  ) {}\n\n  /** @override */\n  calculateOffset(nodeContext: Vtree.NodeContext): number {\n    if (!this.affectTo(nodeContext)) {\n      return 0;\n    }\n    return this.pseudoElementHeight;\n  }\n\n  /** @override */\n  calculateMinimumOffset(nodeContext: Vtree.NodeContext): number {\n    return this.calculateOffset(nodeContext);\n  }\n\n  affectTo(nodeContext: Vtree.NodeContext): boolean {\n    if (!nodeContext) {\n      return false;\n    }\n    const sourceNode = nodeContext.shadowContext\n      ? nodeContext.shadowContext.owner\n      : nodeContext.sourceNode;\n    if (sourceNode === this.nodeContext.sourceNode) {\n      return !!nodeContext.after;\n    }\n    for (let n = sourceNode.parentNode; n; n = n.parentNode) {\n      if (n === this.nodeContext.sourceNode) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n\nfunction processAfterIfContinuesOfNodeContext(\n  nodeContext: Vtree.NodeContext,\n  column: Layout.Column,\n): Task.Result<Vtree.NodeContext> {\n  if (\n    !nodeContext ||\n    !nodeContext.afterIfContinues ||\n    nodeContext.after ||\n    column.isFloatNodeContext(nodeContext)\n  ) {\n    return Task.newResult(nodeContext);\n  }\n  const afterIfContinues = nodeContext.afterIfContinues;\n  return afterIfContinues\n    .createElement(column, nodeContext)\n    .thenAsync((pseudoElement) => {\n      Asserts.assert(nodeContext !== null);\n      const pseudoElementHeight = calculatePseudoElementHeight(\n        nodeContext,\n        column,\n        pseudoElement,\n      );\n      column.fragmentLayoutConstraints.push(\n        new AfterIfContinuesLayoutConstraint(\n          nodeContext as Vtree.NodeContext,\n          afterIfContinues,\n          pseudoElementHeight,\n        ),\n      );\n      return Task.newResult(nodeContext);\n    });\n}\n\nexport function processAfterIfContinues(\n  result: Task.Result<Vtree.NodeContext>,\n  column: Layout.Column,\n): Task.Result<Vtree.NodeContext> {\n  return result.thenAsync((nodeContext) =>\n    processAfterIfContinuesOfNodeContext(nodeContext, column),\n  );\n}\n\nexport function processAfterIfContinuesOfAncestors(\n  nodeContext: Vtree.NodeContext,\n  column: Layout.Column,\n): Task.Result<boolean> {\n  const frame: Task.Frame<boolean> = Task.newFrame(\n    \"processAfterIfContinuesOfAncestors\",\n  );\n  let current: Vtree.NodeContext = nodeContext;\n  frame\n    .loop(() => {\n      if (current !== null) {\n        const result = processAfterIfContinuesOfNodeContext(current, column);\n        current = current.parent;\n        return result.thenReturn(true);\n      } else {\n        return Task.newResult(false);\n      }\n    })\n    .then(() => {\n      frame.finish(true);\n    });\n  return frame.result();\n}\n\nexport function calculatePseudoElementHeight(\n  nodeContext: Vtree.NodeContext,\n  column: Layout.Column,\n  pseudoElement: Element,\n): number {\n  const parentNode = nodeContext.viewNode as Element;\n  parentNode.appendChild(pseudoElement);\n  const height = LayoutHelper.getElementHeight(\n    pseudoElement,\n    column,\n    nodeContext.vertical,\n  );\n  parentNode.removeChild(pseudoElement);\n  return height;\n}\n\n/**\n * Represents a constraint on layout\n */\nexport type LayoutConstraint = Layout.LayoutConstraint;\n\n/**\n * Represents a constraint that allows layout if all the constraints it contains\n * allow layout.\n */\nexport class AllLayoutConstraint implements LayoutConstraint {\n  constructor(public readonly constraints: LayoutConstraint[]) {}\n\n  /** @override */\n  allowLayout(nodeContext: Vtree.NodeContext): boolean {\n    return this.constraints.every((c) => c.allowLayout(nodeContext));\n  }\n}\n\n/**\n * Represents constraints on laying out fragments\n */\nexport type FragmentLayoutConstraint = Layout.FragmentLayoutConstraint;\n\nexport type BreakPositionAndNodeContext = Layout.BreakPositionAndNodeContext;\n\n/**\n * Potential breaking position inside CSS box (between lines).\n * @param checkPoints array of breaking points for breakable block\n */\nexport class BoxBreakPosition\n  extends BreakPosition.AbstractBreakPosition\n  implements Layout.BoxBreakPosition\n{\n  private alreadyEvaluated: boolean = false;\n  breakNodeContext: Vtree.NodeContext = null;\n\n  constructor(\n    public readonly checkPoints: Vtree.NodeContext[],\n    public readonly penalty: number,\n  ) {\n    super();\n  }\n\n  override findAcceptableBreak(\n    column: Column,\n    penalty: number,\n  ): Vtree.NodeContext {\n    if (penalty < this.getMinBreakPenalty()) {\n      return null;\n    }\n    if (!this.alreadyEvaluated) {\n      this.breakNodeContext = column.findBoxBreakPosition(this, penalty > 0);\n      this.alreadyEvaluated =\n        !!this.breakNodeContext || penalty > 0 || !!column.pseudoParent;\n    }\n    return this.breakNodeContext;\n  }\n\n  override getMinBreakPenalty(): number {\n    return this.penalty;\n  }\n\n  override getNodeContext(): Vtree.NodeContext {\n    return this.alreadyEvaluated\n      ? this.breakNodeContext\n      : this.checkPoints[this.checkPoints.length - 1];\n  }\n}\n\nexport function validateCheckPoints(checkPoints: Vtree.NodeContext[]): void {\n  for (let i = 1; i < checkPoints.length; i++) {\n    const cp0 = checkPoints[i - 1];\n    const cp1 = checkPoints[i];\n    if (cp0 === cp1) {\n      Logging.logger.warn(\"validateCheckPoints: duplicate entry\");\n    } else if (cp0.boxOffset >= cp1.boxOffset) {\n      Logging.logger.warn(\"validateCheckPoints: incorrect boxOffset\");\n    } else if (cp0.sourceNode == cp1.sourceNode) {\n      if (cp1.after) {\n        if (cp0.after) {\n          Logging.logger.warn(\"validateCheckPoints: duplicate after points\");\n        }\n      } else {\n        if (!cp0.after) {\n          if (\n            cp1.boxOffset - cp0.boxOffset !=\n            cp1.offsetInNode - cp0.offsetInNode\n          ) {\n            Logging.logger.warn(\n              \"validateCheckPoints: boxOffset inconsistent with offsetInNode\",\n            );\n          }\n        }\n      }\n    }\n  }\n}\n\nexport class Column extends VtreeImpl.Container implements Layout.Column {\n  last: Node;\n  viewDocument: Document;\n  flowRootFormattingContext: Vtree.FormattingContext = null;\n  isFloat: boolean = false;\n  isFootnote: boolean = false;\n  startEdge: number = 0;\n  endEdge: number = 0;\n  beforeEdge: number = 0;\n  afterEdge: number = 0;\n  footnoteEdge: number = 0;\n  box: GeometryUtil.Rect = null;\n  chunkPositions: Vtree.ChunkPosition[] = null;\n  bands: GeometryUtil.Band[] = null;\n  overflown: boolean = false;\n  breakPositions: BreakPosition.BreakPosition[] = null;\n  pageBreakType: string | null = null;\n  forceNonfitting: boolean = true;\n  leftFloatEdge: number = 0; // bottom of the bottommost left float\n  rightFloatEdge: number = 0; // bottom of the bottommost right float\n  bottommostFloatTop: number = 0; // Top of the bottommost float\n  stopAtOverflow: boolean = true;\n  lastAfterPosition: Vtree.NodePosition | null = null;\n  fragmentLayoutConstraints: FragmentLayoutConstraint[] = [];\n  pseudoParent: Column = null;\n  nodeContextOverflowingDueToRepetitiveElements: Vtree.NodeContext | null =\n    null;\n  blockDistanceToBlockEndFloats: number = NaN;\n  breakAtTheEdgeBeforeFloat: string | null = null;\n\n  constructor(\n    element: HTMLElement,\n    public layoutContext: Vtree.LayoutContext,\n    public clientLayout: Vtree.ClientLayout,\n    public readonly layoutConstraint: LayoutConstraint,\n    public readonly pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  ) {\n    super(element);\n    if (new.target === Column) {\n      // Mark the column as a root column only when instantiated directly\n      // (excluding PageFloatArea).\n      LayoutHelper.setAsRootColumn(this);\n    }\n    this.last = element.lastChild;\n    this.viewDocument = element.ownerDocument;\n    pageFloatLayoutContext.setContainer(this);\n  }\n\n  getTopEdge(): number {\n    return this.vertical\n      ? this.rtl\n        ? this.endEdge\n        : this.startEdge\n      : this.beforeEdge;\n  }\n\n  getBottomEdge(): number {\n    return this.vertical\n      ? this.rtl\n        ? this.startEdge\n        : this.endEdge\n      : this.afterEdge;\n  }\n\n  getLeftEdge(): number {\n    return this.vertical\n      ? this.afterEdge\n      : this.rtl\n        ? this.endEdge\n        : this.startEdge;\n  }\n\n  getRightEdge(): number {\n    return this.vertical\n      ? this.beforeEdge\n      : this.rtl\n        ? this.startEdge\n        : this.endEdge;\n  }\n\n  isFloatNodeContext(nodeContext: Vtree.NodeContext): boolean {\n    return !!nodeContext.floatSide && (!this.isFloat || !!nodeContext.parent);\n  }\n\n  stopByOverflow(nodeContext: Vtree.NodeContext): boolean {\n    return this.stopAtOverflow && !!nodeContext && nodeContext.overflow;\n  }\n\n  isOverflown(edge: number): boolean {\n    if (this.vertical) {\n      return edge < this.footnoteEdge;\n    } else {\n      return edge > this.footnoteEdge;\n    }\n  }\n\n  getExclusions(): GeometryUtil.Shape[] {\n    const pageFloatExclusions =\n      this.pageFloatLayoutContext.getFloatFragmentExclusions();\n    return this.exclusions.concat(pageFloatExclusions);\n  }\n\n  openAllViews(position: Vtree.NodePosition): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"openAllViews\");\n    const steps = position.steps;\n    this.layoutContext.setViewRoot(this.element, this.isFootnote);\n    let stepIndex = steps.length - 1;\n    let nodeContext: Vtree.NodeContext = null;\n    frame\n      .loop(() => {\n        while (stepIndex >= 0) {\n          const prevContext = nodeContext;\n          const step = steps[stepIndex];\n          nodeContext = VtreeImpl.makeNodeContextFromNodePositionStep(\n            step,\n            prevContext,\n          );\n          if (\n            stepIndex === steps.length - 1 &&\n            !nodeContext.formattingContext\n          ) {\n            nodeContext.formattingContext = this.flowRootFormattingContext;\n          }\n          if (stepIndex == 0) {\n            nodeContext.offsetInNode =\n              this.calculateOffsetInNodeForNodeContext(position);\n            nodeContext.after = position.after;\n            nodeContext.preprocessedTextContent =\n              position.preprocessedTextContent;\n            if (nodeContext.after) {\n              break;\n            }\n          }\n          const r = this.layoutContext.setCurrent(\n            nodeContext,\n            stepIndex == 0 && nodeContext.offsetInNode == 0,\n          );\n          stepIndex--;\n          if (r.isPending()) {\n            return r;\n          }\n        }\n        return Task.newResult(false);\n      })\n      .then(() => {\n        Asserts.assert(nodeContext);\n        frame.finish(nodeContext);\n      });\n    return frame.result();\n  }\n\n  calculateOffsetInNodeForNodeContext(position: Vtree.NodePosition): number {\n    return position.preprocessedTextContent\n      ? Diff.resolveNewIndex(\n          position.preprocessedTextContent,\n          position.offsetInNode,\n        )\n      : position.offsetInNode;\n  }\n\n  /**\n   * @param count first-XXX nesting identifier\n   */\n  maybePeelOff(\n    position: Vtree.NodeContext,\n    count: number,\n  ): Task.Result<Vtree.NodeContext> {\n    if (\n      position.firstPseudo &&\n      position.inline &&\n      !position.after &&\n      position.firstPseudo.count == 0\n    ) {\n      // first char\n      if (position.viewNode.nodeType != 1) {\n        const text = position.viewNode.textContent;\n        const r = text.match(Base.firstLetterPattern);\n        let firstLetterLength = r ? r[0].length : 0;\n        if (\n          !r &&\n          position.sourceNode?.nodeType === 3 &&\n          position.sourceNode.nextSibling?.nodeType === 3 &&\n          text === position.sourceNode.textContent\n        ) {\n          // The text '“Foo' may be split to '“' and 'Foo'\n          const text2 = text + position.sourceNode.nextSibling.textContent;\n          const r2 = text2.match(Base.firstLetterPattern);\n          if (r2) {\n            const firstLetterText = r2[0];\n            firstLetterLength = firstLetterText.length;\n            position.sourceNode.textContent = firstLetterText;\n            position.viewNode.textContent = firstLetterText;\n            position.sourceNode.nextSibling.textContent =\n              text2.substr(firstLetterLength);\n          }\n        }\n        return this.layoutContext.peelOff(position, firstLetterLength);\n      }\n    }\n    return Task.newResult(position) as Task.Result<Vtree.NodeContext>;\n  }\n\n  /**\n   * Builds the view until a CSS box edge is reached.\n   * @param position start source position.\n   * @param checkPoints array to append possible breaking points.\n   * @return holding box edge position reached or null if the source is exhausted.\n   */\n  buildViewToNextBlockEdge(\n    position: Vtree.NodeContext,\n    checkPoints: Vtree.NodeContext[],\n  ): Task.Result<Vtree.NodeContext> {\n    let violateConstraint = false;\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n      \"buildViewToNextBlockEdge\",\n    );\n    frame\n      .loopWithFrame((bodyFrame) => {\n        if (\n          position.viewNode &&\n          !LayoutHelper.isSpecialNodeContext(position) &&\n          // Prevent breaking inside SVG etc. (Issue #1406)\n          position.viewNode.parentElement?.namespaceURI === Base.NS.XHTML\n        ) {\n          checkPoints.push(position.copy());\n\n          // Prevent performance degradation when the text block is very large.\n          // (Issue #1256)\n          const CHECKPOINTS_THRESHOLD = 1000;\n          if (checkPoints.length > CHECKPOINTS_THRESHOLD) {\n            const element =\n              position.viewNode.nodeType === 1\n                ? (position.viewNode as Element)\n                : position.viewNode.parentElement;\n            const rect = this.clientLayout.getElementClientRect(element);\n\n            // Check if the box position is beyond column breaks with\n            // the browser's column breaking.\n            const columnOver = LayoutHelper.checkIfBeyondColumnBreaks(\n              rect,\n              this.vertical,\n            );\n            if (columnOver >= 2) {\n              // When the box position is beyond two or more column breaks,\n              // it should not be necessary to continue processing further\n              // because it will be processed again in the next column.\n              // Exit the loop\n              bodyFrame.breakLoop();\n              return;\n            }\n          }\n        }\n        this.maybePeelOff(position, 0).then((position1Param) => {\n          const position1 = position1Param as Vtree.NodeContext;\n          if (position1 !== position) {\n            position = position1;\n            if (!LayoutHelper.isSpecialNodeContext(position)) {\n              checkPoints.push(position.copy());\n            }\n          }\n          this.nextInTree(position).then((positionParam) => {\n            position = positionParam as Vtree.NodeContext;\n            if (!position) {\n              // Exit the loop\n              bodyFrame.breakLoop();\n              return;\n            }\n            if (\n              violateConstraint ||\n              !this.layoutConstraint.allowLayout(position)\n            ) {\n              violateConstraint = true;\n              position = position.modify();\n              position.overflow = true;\n            }\n            if (\n              this.isFloatNodeContext(position) &&\n              // Exclude normal floats (fix for issue #611)\n              (PageFloats.isPageFloat(position.floatReference) ||\n                position.floatSide === \"footnote\")\n            ) {\n              this.layoutFloatOrFootnote(position).then((positionParam) => {\n                position = positionParam as Vtree.NodeContext;\n                if (this.pageFloatLayoutContext.isInvalidated()) {\n                  position = null;\n                }\n                if (!position) {\n                  bodyFrame.breakLoop();\n                  return;\n                }\n                bodyFrame.continueLoop();\n              });\n            } else if (!position.inline) {\n              // Exit the loop\n              bodyFrame.breakLoop();\n            } else {\n              // Continue the loop\n              bodyFrame.continueLoop();\n            }\n          });\n        });\n      })\n      .then(() => {\n        frame.finish(position);\n      });\n    return frame.result();\n  }\n\n  nextInTree(\n    position: Vtree.NodeContext,\n    atUnforcedBreak?: boolean,\n  ): Task.Result<Vtree.NodeContext> {\n    const cont = this.layoutContext.nextInTree(position, atUnforcedBreak);\n    return processAfterIfContinues(cont, this);\n  }\n\n  /**\n   * Builds the view for a single unbreakable element.\n   * @param position start source position.\n   * @return holding box edge position reached or null if the source is exhausted.\n   */\n  buildDeepElementView(\n    position: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    if (!position.viewNode) {\n      return Task.newResult(position);\n    }\n    let checkPoints: Vtree.NodeContext[] = [];\n    const sourceNode = position.sourceNode;\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n      \"buildDeepElementView\",\n    );\n\n    // TODO: end the loop based on depth, not sourceNode comparison\n    frame\n      .loopWithFrame((bodyFrame) => {\n        if (\n          position.viewNode &&\n          position.inline &&\n          !LayoutHelper.isSpecialNodeContext(position)\n        ) {\n          checkPoints.push(position.copy());\n        } else {\n          if (checkPoints.length > 0) {\n            this.postLayoutBlock(position, checkPoints);\n          }\n          checkPoints = [];\n        }\n        this.maybePeelOff(position, 0).then((position1Param) => {\n          const position1 = position1Param as Vtree.NodeContext;\n          if (position1 !== position) {\n            let p = position1;\n            while (p && p.sourceNode != sourceNode) {\n              p = p.parent;\n            }\n            if (p == null) {\n              // outside of the subtree\n              position = position1;\n              bodyFrame.breakLoop();\n              return;\n            }\n            if (!LayoutHelper.isSpecialNodeContext(position1)) {\n              checkPoints.push(position1.copy());\n            }\n          }\n          this.nextInTree(position1).then((positionParam) => {\n            position = positionParam as Vtree.NodeContext;\n            if (!position || position.sourceNode == sourceNode) {\n              bodyFrame.breakLoop();\n            } else if (!this.layoutConstraint.allowLayout(position)) {\n              position = position.modify();\n              position.overflow = true;\n              if (this.stopAtOverflow) {\n                bodyFrame.breakLoop();\n              } else {\n                bodyFrame.continueLoop();\n              }\n            } else {\n              bodyFrame.continueLoop();\n            }\n          });\n        });\n      })\n      .then(() => {\n        if (checkPoints.length > 0) {\n          this.postLayoutBlock(position, checkPoints);\n        }\n        frame.finish(position);\n      });\n    return frame.result();\n  }\n\n  /**\n   * Create a single floating element (for exclusion areas).\n   * @param ref container's child to insert float before (can be null).\n   * @param side float side (\"left\" or \"right\").\n   * @param width float inline dimension.\n   * @param height float box progression dimension.\n   * @return newly created float element.\n   */\n  createFloat(ref: Node, side: string, width: number, height: number): Element {\n    const div = this.viewDocument.createElement(\"div\");\n    if (this.vertical) {\n      if (height >= this.height) {\n        height -= 0.1;\n      }\n      if (height < 1) {\n        height = 0;\n      }\n      Base.setCSSProperty(div, \"height\", `${width}px`);\n      Base.setCSSProperty(div, \"width\", `${height}px`);\n    } else {\n      if (width >= this.width) {\n        width -= 0.1;\n      }\n      if (width < 1) {\n        width = 0;\n      }\n      Base.setCSSProperty(div, \"width\", `${width}px`);\n      Base.setCSSProperty(div, \"height\", `${height}px`);\n    }\n    Base.setCSSProperty(div, \"float\", side);\n    Base.setCSSProperty(div, \"clear\", side);\n\n    // enable to visualize\n    // Base.setCSSProperty(div, \"background-color\", \"#50F0FF\");\n    this.element.insertBefore(div, ref);\n    return div;\n  }\n\n  /**\n   * Remove all the exclusion floats.\n   */\n  killFloats(): void {\n    let c: Node = this.element.firstChild;\n    while (c) {\n      const nc = c.nextSibling;\n      if (c.nodeType == 1) {\n        const e = c as HTMLElement;\n        const f = e.style.cssFloat;\n        if (f == \"left\" || f == \"right\" || f === \"none\") {\n          this.element.removeChild(e);\n        } else {\n          break;\n        }\n      }\n      c = nc;\n    }\n  }\n\n  /**\n   * Create exclusion floats for a column.\n   */\n  createFloats(): void {\n    const ref = this.element.firstChild;\n    const bands = this.bands;\n    const x1 = this.vertical ? this.getTopEdge() : this.getLeftEdge();\n    const x2 = this.vertical ? this.getBottomEdge() : this.getRightEdge();\n    let foundNonZeroWidthBand: GeometryUtil.Band = null;\n\n    for (const band of bands) {\n      const height = band.y2 - band.y1;\n      band.left = this.createFloat(ref, \"left\", band.x1 - x1, height);\n      band.right = this.createFloat(ref, \"right\", x2 - band.x2, height);\n\n      // Hacky workaround for issue #1071\n      // (Top page float should not absorb margin/border/padding of the block below)\n      if (band.x1 < x2 && band.x2 > x1) {\n        foundNonZeroWidthBand = band;\n      } else if (!foundNonZeroWidthBand) {\n        Base.setCSSProperty(band.right, \"float\", \"none\");\n      }\n    }\n\n    if (foundNonZeroWidthBand) {\n      // Update footnoteEdge (Fix for issue #1298)\n      const lastBand = bands[bands.length - 1];\n      const y2 = this.vertical ? -this.getLeftEdge() : this.getBottomEdge();\n      if (foundNonZeroWidthBand !== lastBand && lastBand.y2 >= y2) {\n        this.footnoteEdge = this.vertical\n          ? -foundNonZeroWidthBand.y2\n          : foundNonZeroWidthBand.y2;\n      }\n    }\n  }\n\n  /**\n   * @param nodeContext position after the block\n   * @param checkPoints array of possible breaking points.\n   * @param index index of the breaking point\n   * @param boxOffset box offset\n   * @return edge position\n   */\n  calculateEdge(\n    nodeContext: Vtree.NodeContext,\n    checkPoints: Vtree.NodeContext[],\n    index: number,\n    boxOffset: number,\n  ): number {\n    let edge: number;\n    if (nodeContext && LayoutHelper.isOrphan(nodeContext.viewNode)) {\n      return NaN;\n    } else if (nodeContext && nodeContext.after && !nodeContext.inline) {\n      edge = LayoutHelper.calculateEdge(\n        nodeContext,\n        this.clientLayout,\n        0,\n        this.vertical,\n      );\n      if (!isNaN(edge)) {\n        return edge;\n      }\n    }\n    nodeContext = checkPoints[index];\n    let offset = boxOffset - nodeContext.boxOffset;\n    while (true) {\n      edge = LayoutHelper.calculateEdge(\n        nodeContext,\n        this.clientLayout,\n        offset,\n        this.vertical,\n      );\n      if (!isNaN(edge)) {\n        return edge;\n      }\n      if (offset > 0) {\n        offset--;\n        continue;\n      }\n      index--;\n      if (index < 0) {\n        return this.beforeEdge;\n      }\n      nodeContext = checkPoints[index];\n      if (nodeContext.viewNode.nodeType != 1) {\n        offset = nodeContext.viewNode.textContent.length;\n      }\n    }\n  }\n\n  /**\n   * Parse CSS computed length (in pixels)\n   * @param val CSS length in \"px\"\n   * @return parsed and adjusted length value in pixels or 0 if not parsable\n   */\n  parseComputedLength(val: string): number {\n    const r = val.match(/^(-?[0-9]*(\\.[0-9]*)?)px$/);\n    if (r) {\n      return this.clientLayout.adjustLengthValue(parseFloat(r[0]));\n    }\n    return 0;\n  }\n\n  /**\n   * Reads element's computed CSS margin.\n   */\n  getComputedMargin(element: Element): GeometryUtil.Insets {\n    const style = this.clientLayout.getElementComputedStyle(element);\n    const insets = new GeometryUtil.Insets(0, 0, 0, 0);\n    if (style) {\n      insets.left = this.parseComputedLength(style.marginLeft);\n      insets.top = this.parseComputedLength(style.marginTop);\n      insets.right = this.parseComputedLength(style.marginRight);\n      insets.bottom = this.parseComputedLength(style.marginBottom);\n    }\n    return insets;\n  }\n\n  /**\n   * Reads element's computed padding + borders.\n   */\n  getComputedPaddingBorder(element: Element): GeometryUtil.Insets {\n    const style = this.clientLayout.getElementComputedStyle(element);\n    const insets = new GeometryUtil.Insets(0, 0, 0, 0);\n    if (style) {\n      insets.left =\n        this.parseComputedLength(style.borderLeftWidth) +\n        this.parseComputedLength(style.paddingLeft);\n      insets.top =\n        this.parseComputedLength(style.borderTopWidth) +\n        this.parseComputedLength(style.paddingTop);\n      insets.right =\n        this.parseComputedLength(style.borderRightWidth) +\n        this.parseComputedLength(style.paddingRight);\n      insets.bottom =\n        this.parseComputedLength(style.borderBottomWidth) +\n        this.parseComputedLength(style.paddingBottom);\n    }\n    return insets;\n  }\n\n  /**\n   * Reads element's computed CSS insets(margins + border + padding or margins :\n   * depends on box-sizing)\n   */\n  getComputedInsets(element: Element): GeometryUtil.Insets {\n    const style = this.clientLayout.getElementComputedStyle(element);\n    const insets = new GeometryUtil.Insets(0, 0, 0, 0);\n    if (style) {\n      if (style.boxSizing == \"border-box\") {\n        return this.getComputedMargin(element);\n      }\n      insets.left =\n        this.parseComputedLength(style.marginLeft) +\n        this.parseComputedLength(style.borderLeftWidth) +\n        this.parseComputedLength(style.paddingLeft);\n      insets.top =\n        this.parseComputedLength(style.marginTop) +\n        this.parseComputedLength(style.borderTopWidth) +\n        this.parseComputedLength(style.paddingTop);\n      insets.right =\n        this.parseComputedLength(style.marginRight) +\n        this.parseComputedLength(style.borderRightWidth) +\n        this.parseComputedLength(style.paddingRight);\n      insets.bottom =\n        this.parseComputedLength(style.marginBottom) +\n        this.parseComputedLength(style.borderBottomWidth) +\n        this.parseComputedLength(style.paddingBottom);\n    }\n    return insets;\n  }\n\n  /**\n   * Set element's computed CSS insets to Column Container\n   */\n  setComputedInsets(element: Element, container: Column) {\n    const style = this.clientLayout.getElementComputedStyle(element);\n    if (style) {\n      container.marginLeft = this.parseComputedLength(style.marginLeft);\n      container.borderLeft = this.parseComputedLength(style.borderLeftWidth);\n      container.paddingLeft = this.parseComputedLength(style.paddingLeft);\n      container.marginTop = this.parseComputedLength(style.marginTop);\n      container.borderTop = this.parseComputedLength(style.borderTopWidth);\n      container.paddingTop = this.parseComputedLength(style.paddingTop);\n      container.marginRight = this.parseComputedLength(style.marginRight);\n      container.borderRight = this.parseComputedLength(style.borderRightWidth);\n      container.paddingRight = this.parseComputedLength(style.paddingRight);\n      container.marginBottom = this.parseComputedLength(style.marginBottom);\n      container.borderBottom = this.parseComputedLength(\n        style.borderBottomWidth,\n      );\n      container.paddingBottom = this.parseComputedLength(style.paddingBottom);\n    }\n  }\n\n  /**\n   * Set element's computed width and height to Column Container\n   */\n  setComputedWidthAndHeight(element: Element, container: Column) {\n    const style = this.clientLayout.getElementComputedStyle(element);\n    if (style) {\n      container.width = this.parseComputedLength(style.width);\n      container.height = this.parseComputedLength(style.height);\n    }\n  }\n\n  /**\n   * Layout a single unbreakable element.\n   */\n  layoutUnbreakable(\n    nodeContextIn: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    return this.buildDeepElementView(nodeContextIn);\n  }\n\n  /**\n   * Layout a single float element.\n   */\n  layoutFloat(nodeContext: Vtree.NodeContext): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"layoutFloat\");\n    const element = nodeContext.viewNode as Element;\n    const floatSide = PageFloats.resolveInlineFloatDirection(\n      nodeContext.floatSide,\n      nodeContext.vertical,\n      nodeContext.direction,\n      (this.layoutContext as Vgen.ViewFactory).page.side,\n    );\n    Base.setCSSProperty(element, \"float\", \"none\");\n    Base.setCSSProperty(element, \"display\", \"inline-block\");\n    Base.setCSSProperty(element, \"vertical-align\", \"top\");\n    this.buildDeepElementView(nodeContext).then((nodeContextAfter) => {\n      const floatBBox = LayoutHelper.getElementClientRectAdjusted(\n        this.clientLayout,\n        element,\n        this.vertical,\n      );\n      const margin = this.getComputedMargin(element);\n      let floatBox = new GeometryUtil.Rect(\n        floatBBox.left - margin.left,\n        floatBBox.top - margin.top,\n        floatBBox.right + margin.right,\n        floatBBox.bottom + margin.bottom,\n      );\n      let x1 = this.rtl ? this.endEdge : this.startEdge;\n      let x2 = this.rtl ? this.startEdge : this.endEdge;\n      let parent = nodeContext.parent;\n      while (parent && parent.inline) {\n        parent = parent.parent;\n      }\n      if (parent) {\n        // Position it at the parent element's edge.\n        // We need to get the edge of the parent's content area, calling\n        // getElementClientRect will also give us borders. Avoid it by creating\n        // a temporary element and using it for measurment.\n        const probe = parent.viewNode.ownerDocument.createElement(\"div\");\n        probe.style.left = \"0px\";\n        probe.style.top = \"0px\";\n        if (this.vertical) {\n          probe.style.bottom = \"0px\";\n          probe.style.width = \"1px\";\n        } else {\n          probe.style.right = \"0px\";\n          probe.style.height = \"1px\";\n        }\n        parent.viewNode.appendChild(probe);\n        const parentBox = LayoutHelper.getElementClientRectAdjusted(\n          this.clientLayout,\n          probe,\n          this.vertical,\n        );\n        x1 = Math.max(\n          this.rtl ? this.getEndEdge(parentBox) : this.getStartEdge(parentBox),\n          x1,\n        );\n        x2 = Math.min(\n          this.rtl ? this.getStartEdge(parentBox) : this.getEndEdge(parentBox),\n          x2,\n        );\n        parent.viewNode.removeChild(probe);\n        const floatBoxMeasure = this.vertical\n          ? floatBox.y2 - floatBox.y1\n          : floatBox.x2 - floatBox.x1;\n        if (floatSide == \"left\") {\n          x2 = Math.max(x2, x1 + floatBoxMeasure);\n        } else {\n          x1 = Math.min(x1, x2 - floatBoxMeasure);\n        }\n\n        // Move the float below the block parent.\n        // Otherwise, if the float is attached to an inline box with 'position:\n        // relative', the absolute positioning of the float gets broken, since\n        // the inline parent can be pushed horizontally by exclusion floats\n        // after the layout of the float is done.\n        if (parent !== nodeContext.parent && !nodeContext.firstPseudo) {\n          // Unless float is specified on ::first-letter (Fix for issue #923)\n          parent.viewNode.appendChild(element);\n\n          // Mark the moved float box so that it is not removed wrongly\n          // when page breaking occurs inside the inline parent.\n          // (Issue #1383, #1422)\n          element.setAttribute(\"data-vivliostyle-float-box-moved\", \"true\");\n        }\n      }\n\n      // box is rotated for vertical orientation\n      let box = new GeometryUtil.Rect(\n        x1,\n        this.getBoxDir() * this.beforeEdge,\n        x2,\n        this.getBoxDir() * this.afterEdge,\n      );\n      let floatHorBox = floatBox;\n      if (this.vertical) {\n        floatHorBox = GeometryUtil.rotateBox(floatBox);\n      }\n      const dir = this.getBoxDir();\n      if (floatHorBox.y1 < this.bottommostFloatTop * dir) {\n        const boxExtent = floatHorBox.y2 - floatHorBox.y1;\n        floatHorBox.y1 = this.bottommostFloatTop * dir;\n        floatHorBox.y2 = floatHorBox.y1 + boxExtent;\n      }\n      GeometryUtil.positionFloat(box, this.bands, floatHorBox, floatSide);\n      if (this.vertical) {\n        floatBox = GeometryUtil.unrotateBox(floatHorBox);\n      }\n      const insets = this.getComputedInsets(element);\n      Base.setCSSProperty(\n        element,\n        \"width\",\n        `${floatBox.x2 - floatBox.x1 - insets.left - insets.right}px`,\n      );\n      Base.setCSSProperty(\n        element,\n        \"height\",\n        `${floatBox.y2 - floatBox.y1 - insets.top - insets.bottom}px`,\n      );\n      Base.setCSSProperty(element, \"position\", \"absolute\");\n      Asserts.assert(nodeContext.display);\n      Base.setCSSProperty(element, \"display\", nodeContext.display);\n      let offsets;\n      let containingBlockForAbsolute: Vtree.NodeContext = null;\n      if (parent) {\n        if (parent.containingBlockForAbsolute) {\n          containingBlockForAbsolute = parent;\n        } else {\n          containingBlockForAbsolute = parent.getContainingBlockForAbsolute();\n        }\n      }\n      if (containingBlockForAbsolute) {\n        const probe =\n          containingBlockForAbsolute.viewNode.ownerDocument.createElement(\n            \"div\",\n          );\n        probe.style.position = \"absolute\";\n        if (containingBlockForAbsolute.vertical) {\n          probe.style.right = \"0\";\n        } else {\n          probe.style.left = \"0\";\n        }\n        probe.style.top = \"0\";\n        containingBlockForAbsolute.viewNode.appendChild(probe);\n        offsets = LayoutHelper.getElementClientRectAdjusted(\n          this.clientLayout,\n          probe,\n          this.vertical,\n        );\n        containingBlockForAbsolute.viewNode.removeChild(probe);\n      } else {\n        offsets = {\n          left: this.getLeftEdge() - this.paddingLeft,\n          right: this.getRightEdge() + this.paddingRight,\n          top: this.getTopEdge() - this.paddingTop,\n        };\n      }\n      if (\n        containingBlockForAbsolute\n          ? containingBlockForAbsolute.vertical\n          : this.vertical\n      ) {\n        Base.setCSSProperty(\n          element,\n          \"right\",\n          `${offsets.right - floatBox.x2}px`,\n        );\n      } else {\n        Base.setCSSProperty(element, \"left\", `${floatBox.x1 - offsets.left}px`);\n      }\n      Base.setCSSProperty(element, \"top\", `${floatBox.y1 - offsets.top}px`);\n      if (nodeContext.clearSpacer) {\n        nodeContext.clearSpacer.parentNode.removeChild(nodeContext.clearSpacer);\n        nodeContext.clearSpacer = null;\n      }\n      const floatBoxEdge = this.vertical ? floatBox.x1 : floatBox.y2;\n      const floatBoxTop = this.vertical ? floatBox.x2 : floatBox.y1;\n\n      // TODO: subtract after margin when determining overflow.\n      if (!this.isOverflown(floatBoxEdge) || this.breakPositions.length == 0) {\n        // no overflow\n        this.killFloats();\n        box = new GeometryUtil.Rect(\n          this.getLeftEdge(),\n          this.getTopEdge(),\n          this.getRightEdge(),\n          this.getBottomEdge(),\n        );\n        if (this.vertical) {\n          box = GeometryUtil.rotateBox(box);\n        }\n        GeometryUtil.addFloatToBands(\n          box,\n          this.bands,\n          floatHorBox,\n          null,\n          floatSide,\n        );\n        this.createFloats();\n        if (floatSide == \"left\") {\n          this.leftFloatEdge = floatBoxEdge;\n        } else {\n          this.rightFloatEdge = floatBoxEdge;\n        }\n        this.bottommostFloatTop = floatBoxTop;\n        this.updateMaxReachedAfterEdge(floatBoxEdge);\n        frame.finish(nodeContextAfter);\n      } else {\n        nodeContext = nodeContext.modify();\n        nodeContext.overflow = true;\n        frame.finish(nodeContext);\n      }\n    });\n    return frame.result();\n  }\n\n  setupFloatArea(\n    area: PageFloatArea,\n    floatReference: PageFloats.FloatReference,\n    floatSide: string,\n    anchorEdge: number | null,\n    strategy: PageFloats.PageFloatLayoutStrategy,\n    condition: PageFloats.PageFloatPlacementCondition,\n  ): boolean {\n    const floatLayoutContext = this.pageFloatLayoutContext;\n    const floatContainer = floatLayoutContext.getContainer(floatReference);\n    const element = area.element;\n    floatContainer.element.parentNode.appendChild(element);\n    area.isFloat = true;\n    area.originX = floatContainer.originX;\n    area.originY = floatContainer.originY;\n    area.vertical = floatContainer.vertical;\n    area.rtl = floatContainer.rtl;\n    area.marginLeft = area.marginRight = area.marginTop = area.marginBottom = 0;\n    area.borderLeft = area.borderRight = area.borderTop = area.borderBottom = 0;\n    area.paddingLeft =\n      area.paddingRight =\n      area.paddingTop =\n      area.paddingBottom =\n        0;\n    area.exclusions = (floatContainer.exclusions || []).concat();\n    area.forceNonfitting = !floatLayoutContext.hasFloatFragments();\n    area.innerShape = null;\n    const containingBlockRect = floatContainer.getPaddingRect();\n    area.setHorizontalPosition(\n      containingBlockRect.x1 - floatContainer.originX,\n      containingBlockRect.x2 - containingBlockRect.x1,\n    );\n    area.setVerticalPosition(\n      containingBlockRect.y1 - floatContainer.originY,\n      containingBlockRect.y2 - containingBlockRect.y1,\n    );\n    strategy.adjustPageFloatArea(area, floatContainer, this);\n\n    // Calculate bands from the exclusions before setting float area dimensions\n    area.init();\n    const fitWithinContainer = !!floatLayoutContext.setFloatAreaDimensions(\n      area,\n      floatReference,\n      floatSide,\n      anchorEdge,\n      true,\n      !floatLayoutContext.hasFloatFragments(),\n      condition,\n    );\n    if (fitWithinContainer) {\n      // New dimensions have been set, remove exclusion floats and re-init\n      area.killFloats();\n      area.init();\n    } else {\n      floatContainer.element.parentNode.removeChild(element);\n    }\n    return fitWithinContainer;\n  }\n\n  createPageFloatArea(\n    float: PageFloats.PageFloat | null,\n    floatSide: string,\n    anchorEdge: number | null,\n    strategy: PageFloats.PageFloatLayoutStrategy,\n    condition: PageFloats.PageFloatPlacementCondition,\n  ): PageFloatArea | null {\n    const floatAreaElement = this.element.ownerDocument.createElement(\"div\");\n    Base.setCSSProperty(floatAreaElement, \"position\", \"absolute\");\n    const parentPageFloatLayoutContext =\n      this.pageFloatLayoutContext.getPageFloatLayoutContext(\n        float.floatReference,\n      );\n\n    // TODO: establish how to specify an appropriate generating element for the\n    // new page float layout context\n    const pageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n      null,\n      PageFloats.FloatReference.COLUMN,\n      null,\n      this.pageFloatLayoutContext.flowName,\n      float.nodePosition,\n      null,\n      null,\n    );\n    const parentContainer = parentPageFloatLayoutContext.getContainer();\n    const floatArea = new PageFloatArea(\n      floatSide,\n      floatAreaElement,\n      this.layoutContext.clone(),\n      this.clientLayout,\n      this.layoutConstraint,\n      pageFloatLayoutContext,\n      parentContainer,\n    );\n    pageFloatLayoutContext.setContainer(floatArea);\n    if (\n      this.setupFloatArea(\n        floatArea,\n        float.floatReference,\n        floatSide,\n        anchorEdge,\n        strategy,\n        condition,\n      )\n    ) {\n      return floatArea;\n    } else {\n      return null;\n    }\n  }\n\n  layoutSinglePageFloatFragment(\n    continuations: PageFloats.PageFloatContinuation[],\n    floatSide: string,\n    clearSide: string | null,\n    allowFragmented: boolean,\n    strategy: PageFloats.PageFloatLayoutStrategy,\n    anchorEdge: number | null,\n    pageFloatFragment?: PageFloats.PageFloatFragment | null,\n  ): Task.Result<SinglePageFloatLayoutResult> {\n    const context = this.pageFloatLayoutContext;\n    const originalContinuations = pageFloatFragment\n      ? pageFloatFragment.continuations\n      : [];\n    continuations = originalContinuations.concat(continuations);\n    const firstFloat = continuations[0].float;\n    const condition = context.getPageFloatPlacementCondition(\n      firstFloat,\n      floatSide,\n      clearSide,\n    );\n    const floatArea = this.createPageFloatArea(\n      firstFloat,\n      floatSide,\n      anchorEdge,\n      strategy,\n      condition,\n    );\n    const result: SinglePageFloatLayoutResult = {\n      floatArea,\n      pageFloatFragment: null,\n      newPosition: null,\n    };\n    if (!floatArea) {\n      return Task.newResult(result);\n    }\n    const frame = Task.newFrame<SinglePageFloatLayoutResult>(\n      \"layoutSinglePageFloatFragment\",\n    );\n    let failed = false;\n    let i = 0;\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (i >= continuations.length) {\n          loopFrame.breakLoop();\n          return;\n        }\n        const c = continuations[i];\n        const floatChunkPosition = new VtreeImpl.ChunkPosition(c.nodePosition);\n        floatArea.layout(floatChunkPosition, true).then((newPosition) => {\n          result.newPosition = newPosition;\n          if (!newPosition || allowFragmented) {\n            i++;\n            loopFrame.continueLoop();\n          } else {\n            failed = true;\n            loopFrame.breakLoop();\n          }\n        });\n      })\n      .then(() => {\n        if (!failed) {\n          Asserts.assert(floatArea);\n          const logicalFloatSide = context.setFloatAreaDimensions(\n            floatArea,\n            firstFloat.floatReference,\n            floatSide,\n            anchorEdge,\n            false,\n            allowFragmented,\n            condition,\n          );\n          if (!logicalFloatSide) {\n            failed = true;\n          } else {\n            const newFragment = strategy.createPageFloatFragment(\n              continuations,\n              logicalFloatSide,\n              clearSide,\n              floatArea,\n              !!result.newPosition,\n            );\n            context.addPageFloatFragment(newFragment, true);\n            result.pageFloatFragment = newFragment;\n          }\n        }\n        frame.finish(result);\n      });\n    return frame.result();\n  }\n\n  layoutPageFloatInner(\n    continuation: PageFloats.PageFloatContinuation,\n    strategy: PageFloats.PageFloatLayoutStrategy,\n    anchorEdge: number | null,\n    pageFloatFragment?: PageFloats.PageFloatFragment,\n  ): Task.Result<boolean> {\n    const context = this.pageFloatLayoutContext;\n    const float = continuation.float;\n    context.stashEndFloatFragments(float);\n\n    function cancelLayout(floatArea, pageFloatFragment) {\n      if (pageFloatFragment) {\n        context.removePageFloatFragment(pageFloatFragment, true);\n      } else if (floatArea) {\n        floatArea.element.parentNode.removeChild(floatArea.element);\n      }\n      context.restoreStashedFragments(float.floatReference);\n      context.deferPageFloat(continuation);\n    }\n    const frame: Task.Frame<boolean> = Task.newFrame(\"layoutPageFloatInner\");\n    this.layoutSinglePageFloatFragment(\n      [continuation],\n      float.floatSide,\n      float.clearSide,\n      !context.hasFloatFragments(),\n      strategy,\n      anchorEdge,\n      pageFloatFragment,\n    ).then((result) => {\n      const floatArea = result.floatArea;\n      const newFragment = result.pageFloatFragment;\n      const newPosition = result.newPosition;\n      if (newFragment) {\n        this.layoutStashedPageFloats(float.floatReference, [\n          pageFloatFragment,\n        ]).then((success) => {\n          if (success) {\n            // Add again to invalidate the context\n            Asserts.assert(newFragment);\n            context.addPageFloatFragment(newFragment);\n            context.discardStashedFragments(float.floatReference);\n            if (newPosition) {\n              const continuation = new PageFloats.PageFloatContinuation(\n                float,\n                newPosition.primary,\n              );\n              context.deferPageFloat(continuation);\n            }\n            frame.finish(true);\n          } else {\n            cancelLayout(floatArea, newFragment);\n            frame.finish(false);\n          }\n        });\n      } else {\n        cancelLayout(floatArea, newFragment);\n        frame.finish(false);\n      }\n    });\n    return frame.result();\n  }\n\n  /**\n   * @returns Represents if the layout was succeeded or not\n   */\n  private layoutStashedPageFloats(\n    floatReference: PageFloats.FloatReference,\n    excluded: PageFloats.PageFloatFragment[],\n  ): Task.Result<boolean> {\n    const context = this.pageFloatLayoutContext;\n    const stashedFloatFragments =\n      context.getStashedFloatFragments(floatReference);\n    const newFloatAreas = [];\n    const newFragments = [];\n    let failed = false;\n    const frame = Task.newFrame<boolean>(\"layoutStashedPageFloats\");\n    let i = 0;\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (i >= stashedFloatFragments.length) {\n          loopFrame.breakLoop();\n          return;\n        }\n        const stashedFragment = stashedFloatFragments[i];\n        if (excluded.includes(stashedFragment)) {\n          i++;\n          loopFrame.continueLoop();\n          return;\n        }\n        const strategy =\n          new PageFloats.PageFloatLayoutStrategyResolver().findByFloat(\n            stashedFragment.continuations[0].float,\n          );\n\n        // Value of 'clear' is irrelevant when laying out stashed floats\n        // since whether the 'clear' value allows placing the float\n        // here is already resolved.\n\n        // NOTE: added clearSide for issue #1550\n        this.layoutSinglePageFloatFragment(\n          stashedFragment.continuations,\n          stashedFragment.floatSide,\n          stashedFragment.clearSide,\n          false,\n          strategy,\n          null,\n        ).then((result) => {\n          const floatArea = result.floatArea;\n          if (floatArea) {\n            newFloatAreas.push(floatArea);\n          }\n          const fragment = result.pageFloatFragment;\n          if (fragment) {\n            newFragments.push(fragment);\n            i++;\n            loopFrame.continueLoop();\n          } else {\n            failed = true;\n            loopFrame.breakLoop();\n          }\n        });\n      })\n      .then(() => {\n        if (failed) {\n          newFragments.forEach((fragment) => {\n            context.removePageFloatFragment(fragment, true);\n          });\n          newFloatAreas.forEach((area) => {\n            const elem = area.element;\n            if (elem && elem.parentNode) {\n              elem.parentNode.removeChild(elem);\n            }\n          });\n        } else {\n          stashedFloatFragments.forEach((fragment) => {\n            const elem = fragment.area.element;\n            if (elem && elem.parentNode) {\n              elem.parentNode.removeChild(elem);\n            }\n          });\n        }\n        frame.finish(!failed);\n      });\n    return frame.result();\n  }\n\n  setFloatAnchorViewNode(nodeContext: Vtree.NodeContext): Vtree.NodeContext {\n    const parent = nodeContext.viewNode.parentNode;\n    const anchor = parent.ownerDocument.createElement(\"span\");\n    anchor.setAttribute(LayoutHelper.SPECIAL_ATTR, \"1\");\n    if (nodeContext.floatSide === \"footnote\") {\n      // Defaults for footnote-call, can be overriden by the stylesheet.\n      this.layoutContext.applyPseudoelementStyle(\n        nodeContext,\n        \"footnote-call\",\n        anchor,\n      );\n    }\n    parent.appendChild(anchor);\n    parent.removeChild(nodeContext.viewNode);\n    const nodeContextAfter = nodeContext.modify();\n    nodeContextAfter.after = true;\n    nodeContextAfter.viewNode = anchor;\n    return nodeContextAfter;\n  }\n\n  resolveFloatReferenceFromColumnSpan(\n    floatReference: PageFloats.FloatReference,\n    columnSpan: Css.Val,\n    nodeContext: Vtree.NodeContext,\n  ): Task.Result<PageFloats.FloatReference> {\n    const frame = Task.newFrame(\n      \"resolveFloatReferenceFromColumnSpan\",\n    ) as Task.Frame<PageFloats.FloatReference>;\n    const columnContext = this.pageFloatLayoutContext;\n    const regionContext = columnContext.getPageFloatLayoutContext(\n      PageFloats.FloatReference.REGION,\n    );\n    const isRegionWider =\n      columnContext.getContainer().width < regionContext.getContainer().width;\n    if (isRegionWider && floatReference === PageFloats.FloatReference.COLUMN) {\n      if (columnSpan === Css.ident.auto) {\n        this.buildDeepElementView(nodeContext.copy()).then((position) => {\n          const element = position.viewNode as Element;\n          let inlineSize = Sizing.getSize(this.clientLayout, element, [\n            Sizing.Size.MIN_CONTENT_INLINE_SIZE,\n          ])[Sizing.Size.MIN_CONTENT_INLINE_SIZE];\n          const margin = this.getComputedMargin(element);\n          if (this.vertical) {\n            inlineSize += margin.top + margin.bottom;\n          } else {\n            inlineSize += margin.left + margin.right;\n          }\n          if (inlineSize > this.width) {\n            frame.finish(PageFloats.FloatReference.REGION);\n          } else {\n            frame.finish(floatReference);\n          }\n        });\n      } else if (columnSpan === Css.ident.all) {\n        frame.finish(PageFloats.FloatReference.REGION);\n      } else {\n        frame.finish(floatReference);\n      }\n    } else {\n      frame.finish(floatReference);\n    }\n    return frame.result();\n  }\n\n  layoutPageFloat(\n    nodeContext: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    const context = this.pageFloatLayoutContext;\n    const strategy =\n      new PageFloats.PageFloatLayoutStrategyResolver().findByNodeContext(\n        nodeContext,\n      );\n    let cont: Task.Result<PageFloats.PageFloat>;\n    const float = context.findPageFloatByNodePosition(\n      nodeContext.toNodePosition(),\n    );\n    if (!float) {\n      cont = strategy.createPageFloat(nodeContext, context, this);\n    } else {\n      cont = Task.newResult(float);\n    }\n    return cont.thenAsync((float) => {\n      const nodePosition = VtreeImpl.newNodePositionFromNodeContext(\n        nodeContext,\n        0,\n      );\n      const nodeContextAfter = this.setFloatAnchorViewNode(nodeContext);\n      const pageFloatFragment = strategy.findPageFloatFragment(float, context);\n      const continuation = new PageFloats.PageFloatContinuation(\n        float,\n        nodePosition,\n      );\n      if (pageFloatFragment && pageFloatFragment.hasFloat(float)) {\n        context.registerPageFloatAnchor(float, nodeContextAfter.viewNode);\n        return Task.newResult(nodeContextAfter as Vtree.NodeContext);\n      } else if (\n        context.isForbidden(float) ||\n        context.hasPrecedingFloatsDeferredToNext(float)\n      ) {\n        context.deferPageFloat(continuation);\n        context.registerPageFloatAnchor(float, nodeContextAfter.viewNode);\n        return Task.newResult(nodeContextAfter as Vtree.NodeContext);\n      } else if (this.nodeContextOverflowingDueToRepetitiveElements) {\n        return Task.newResult(null);\n      } else {\n        const edge = LayoutHelper.calculateEdge(\n          nodeContextAfter,\n          this.clientLayout,\n          0,\n          this.vertical,\n        );\n        if (this.isOverflown(edge)) {\n          return Task.newResult(nodeContextAfter);\n        } else {\n          return this.layoutPageFloatInner(\n            continuation,\n            strategy,\n            edge,\n            pageFloatFragment,\n          ).thenAsync((success) => {\n            Asserts.assert(float);\n            if (!success) {\n              context.registerPageFloatAnchor(float, nodeContextAfter.viewNode);\n              return Task.newResult(nodeContextAfter);\n            } else {\n              return Task.newResult(null);\n            }\n          });\n        }\n      }\n    });\n  }\n\n  processLineStyling(\n    nodeContext: Vtree.NodeContext,\n    resNodeContext: Vtree.NodeContext,\n    checkPoints: Vtree.NodeContext[],\n  ): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> =\n      Task.newFrame(\"processLineStyling\");\n    if (VIVLIOSTYLE_DEBUG) {\n      validateCheckPoints(checkPoints);\n    }\n    let lastCheckPoints = checkPoints.concat([]); // make a copy\n    checkPoints.splice(0, checkPoints.length); // make empty\n    let totalLineCount = 0;\n    let firstPseudo = nodeContext.firstPseudo; // :first-letter is not processed here\n    if (firstPseudo.count == 0) {\n      firstPseudo = firstPseudo.outer; // move to line pseudoelement (if any)\n    }\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (!firstPseudo) {\n          loopFrame.breakLoop();\n          return;\n        }\n        const linePositions = this.findLinePositions(lastCheckPoints);\n        const count = firstPseudo.count - totalLineCount;\n        if (linePositions.length <= count) {\n          loopFrame.breakLoop();\n          return;\n        }\n        const lineBreak = this.findAcceptableBreakInside(\n          lastCheckPoints,\n          linePositions[count - 1],\n          true,\n        );\n        if (lineBreak == null) {\n          loopFrame.breakLoop();\n          return;\n        }\n        this.finishBreak(lineBreak, false, false).then(() => {\n          totalLineCount += count;\n          this.layoutContext\n            .peelOff(lineBreak, 0)\n            .then((resNodeContextParam) => {\n              nodeContext = resNodeContextParam;\n              firstPseudo = nodeContext.firstPseudo;\n              lastCheckPoints = []; // Wipe out line breaks inside pseudoelements\n              this.buildViewToNextBlockEdge(nodeContext, lastCheckPoints).then(\n                (resNodeContextParam) => {\n                  resNodeContext = resNodeContextParam;\n                  loopFrame.continueLoop();\n                },\n              );\n            });\n        });\n      })\n      .then(() => {\n        Array.prototype.push.apply(checkPoints, lastCheckPoints);\n        if (VIVLIOSTYLE_DEBUG) {\n          validateCheckPoints(checkPoints);\n        }\n        frame.finish(resNodeContext);\n      });\n    return frame.result();\n  }\n\n  isLoneImage(checkPoints: Vtree.NodeContext[]): boolean {\n    if (checkPoints.length != 2 && this.breakPositions.length > 0) {\n      return false;\n    }\n    return (\n      checkPoints[0].sourceNode == checkPoints[1].sourceNode &&\n      Base.mediaTags[(checkPoints[0].sourceNode as Element).localName]\n    );\n  }\n\n  getTrailingMarginEdgeAdjustment(\n    trailingEdgeContexts: Vtree.NodeContext[],\n  ): number {\n    // Margins push the computed height, but are not counted as overflow. We\n    // need to find the overall collapsed margin from all enclosed blocks.\n    let maxPos = 0;\n    let minNeg = 0;\n    for (let i = trailingEdgeContexts.length - 1; i >= 0; i--) {\n      const nodeContext = trailingEdgeContexts[i];\n      if (\n        !nodeContext.after ||\n        !nodeContext.viewNode ||\n        nodeContext.viewNode.nodeType != 1\n      ) {\n        break;\n      }\n      const margin = this.getComputedMargin(nodeContext.viewNode as Element);\n      const m = this.vertical ? -margin.left : margin.bottom;\n      if (m > 0) {\n        maxPos = Math.max(maxPos, m);\n      } else {\n        minNeg = Math.min(minNeg, m);\n      }\n    }\n    return maxPos + minNeg;\n  }\n\n  /**\n   * Layout a single CSS box.\n   */\n  layoutBreakableBlock(\n    nodeContext: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n      \"layoutBreakableBlock\",\n    );\n    const checkPoints: Vtree.NodeContext[] = [];\n    this.buildViewToNextBlockEdge(nodeContext, checkPoints).then(\n      (resNodeContext) => {\n        // at this point a single block was appended to the column\n        // flowPosition is either null or\n        //  - if !after: contains view for the next block element\n        //  - if after: contains view for the enclosing block element\n        const checkPointIndex = checkPoints.length - 1;\n        if (checkPointIndex < 0) {\n          frame.finish(resNodeContext);\n          return;\n        }\n\n        // Text-spacing etc. must be done before calculating edge. (Issue #898)\n        this.postLayoutBlock(resNodeContext, checkPoints);\n\n        // Record the height\n        // TODO: should this be done after first-line calculation?\n        let edge = this.calculateEdge(\n          resNodeContext,\n          checkPoints,\n          checkPointIndex,\n          checkPoints[checkPointIndex].boxOffset,\n        );\n        let overflown = false;\n        if (\n          !resNodeContext ||\n          !LayoutHelper.isOrphan(resNodeContext.viewNode)\n        ) {\n          const offsets = BreakPosition.calculateOffset(\n            resNodeContext,\n            this.collectElementsOffset(),\n          );\n          overflown = this.isOverflown(\n            edge + (this.vertical ? -1 : 1) * offsets.minimum,\n          );\n          if (\n            this.isOverflown(\n              edge + (this.vertical ? -1 : 1) * offsets.current,\n            ) &&\n            !this.nodeContextOverflowingDueToRepetitiveElements\n          ) {\n            this.nodeContextOverflowingDueToRepetitiveElements = resNodeContext;\n          }\n        }\n        if (resNodeContext == null) {\n          edge += this.getTrailingMarginEdgeAdjustment(checkPoints);\n        }\n        this.updateMaxReachedAfterEdge(edge);\n        let lineCont: Task.Result<Vtree.NodeContext>;\n        if (nodeContext.firstPseudo) {\n          // possibly need to deal with :first-line and friends\n          lineCont = this.processLineStyling(\n            nodeContext,\n            resNodeContext,\n            checkPoints,\n          );\n        } else {\n          lineCont = Task.newResult(resNodeContext);\n        }\n        lineCont.then((nodeContext) => {\n          // Text-spacing etc. must be done before calculating edge. (Issue #898)\n          // this.postLayoutBlock(nodeContext, checkPoints);\n\n          if (checkPoints.length > 0) {\n            this.saveBoxBreakPosition(checkPoints);\n\n            // TODO: how to signal overflow in the last pagargaph???\n            if (overflown && !this.isLoneImage(checkPoints) && nodeContext) {\n              nodeContext = nodeContext.modify();\n              nodeContext.overflow = true;\n            }\n          }\n          frame.finish(nodeContext);\n        });\n      },\n    );\n    return frame.result();\n  }\n\n  postLayoutBlock(\n    nodeContext: Vtree.NodeContext,\n    checkPoints: Vtree.NodeContext[],\n  ) {\n    const hooks: Plugin.PostLayoutBlockHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.POST_LAYOUT_BLOCK,\n    );\n    hooks.forEach((hook) => {\n      hook(nodeContext, checkPoints, this);\n    });\n  }\n\n  findEndOfLine(\n    linePosition: number,\n    checkPoints: Vtree.NodeContext[],\n    isUpdateMaxReachedAfterEdge: boolean,\n  ): {\n    nodeContext: Vtree.NodeContext;\n    index: number;\n    checkPointIndex: number;\n  } {\n    if (VIVLIOSTYLE_DEBUG) {\n      validateCheckPoints(checkPoints);\n    }\n\n    // Workaround for Blink not returning correct fractional values for\n    // Range.getClientRects.\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=629828\n    const effectiveLinePosition = this.vertical\n      ? linePosition - 1\n      : linePosition + 1;\n\n    // find the first character which is out\n    let lowCP = 0;\n    let low = checkPoints[0].boxOffset;\n    let low1 = lowCP;\n    let highCP = checkPoints.length - 1;\n    let high = checkPoints[highCP].boxOffset;\n    let mid: number;\n    while (low < high) {\n      mid = low + Math.ceil((high - low) / 2);\n\n      // find the node which contains mid index\n      low1 = lowCP;\n      let high1 = highCP;\n      while (low1 < high1) {\n        const mid1 = low1 + Math.ceil((high1 - low1) / 2);\n        if (checkPoints[mid1].boxOffset > mid) {\n          high1 = mid1 - 1;\n        } else {\n          low1 = mid1;\n        }\n      }\n      const edge = this.calculateEdge(null, checkPoints, low1, mid);\n      if (\n        this.vertical\n          ? edge <= effectiveLinePosition\n          : edge >= effectiveLinePosition\n      ) {\n        high = mid - 1;\n        while (checkPoints[low1].boxOffset == mid) {\n          low1--;\n        }\n        highCP = low1;\n      } else {\n        if (isUpdateMaxReachedAfterEdge) {\n          this.updateMaxReachedAfterEdge(edge);\n        }\n        low = mid;\n        lowCP = low1;\n      }\n    }\n    return {\n      nodeContext: checkPoints[low1],\n      index: low,\n      checkPointIndex: low1,\n    };\n  }\n\n  findAcceptableBreakInside(\n    checkPoints: Vtree.NodeContext[],\n    edgePosition: number,\n    force: boolean,\n  ): Vtree.NodeContext {\n    const position = this.findEndOfLine(edgePosition, checkPoints, true);\n    let nodeContext = position.nodeContext;\n\n    if (\n      position.checkPointIndex === 0 &&\n      position.index === nodeContext.boxOffset\n    ) {\n      // Prevent wrong break at beginning of paragraph (Issue #1401, #1406)\n      return null;\n    }\n\n    const viewNode = nodeContext.viewNode;\n    if (\n      viewNode.nodeType != 1 &&\n      viewNode.parentElement?.localName !== \"viv-ts-inner\"\n    ) {\n      const textNode = viewNode as Text;\n      const textNodeBreaker = this.resolveTextNodeBreaker(nodeContext);\n      nodeContext = textNodeBreaker.breakTextNode(\n        textNode,\n        nodeContext,\n        position.index,\n        checkPoints,\n        position.checkPointIndex,\n        force,\n      );\n    } else {\n      // Fix for issue #821, #885, #1459\n      const p = LayoutHelper.findAncestorSpecialInlineNodeContext(nodeContext);\n      if (p) {\n        if (\n          this.breakPositions?.[0] instanceof BoxBreakPosition &&\n          p?.viewNode.contains(this.breakPositions[0].checkPoints[0].viewNode)\n        ) {\n          // Prevent breaks at beginning of the column\n          return null;\n        }\n        // Prevent breaks inside inline-blocks\n        nodeContext = p;\n\n        // Prevent breaks at beginning of paragraph content (Issue #1459)\n        while (!nodeContext.after && nodeContext.inline && nodeContext.parent) {\n          let node = nodeContext.viewNode?.previousSibling;\n          while (\n            node &&\n            (VtreeImpl.canIgnore(node, nodeContext.parent.whitespace) ||\n              LayoutHelper.isOutOfFlow(node))\n          ) {\n            node = node.previousSibling;\n          }\n          if (node) {\n            break;\n          }\n          nodeContext = nodeContext.parent;\n        }\n      }\n    }\n    this.clearOverflownViewNodes(nodeContext, false);\n    return nodeContext;\n  }\n\n  resolveTextNodeBreaker(nodeContext: Vtree.NodeContext): TextNodeBreaker {\n    const hooks: Plugin.ResolveTextNodeBreakerHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.RESOLVE_TEXT_NODE_BREAKER,\n    );\n    return hooks.reduce(\n      (prev, hook) => hook(nodeContext) || prev,\n      TextNodeBreaker.instance,\n    );\n  }\n\n  /**\n   * Read ranges skipping special elements\n   */\n  getRangeBoxes(start: Node, end: Node): Vtree.ClientRect[] {\n    const arr = [];\n    const range = start.ownerDocument.createRange();\n    let wentUp = false;\n    let node = start;\n    let lastGood: Node = null;\n    let haveStart = false;\n    let endNotReached = true;\n    while (endNotReached) {\n      let seekRange = true;\n      do {\n        let next: Node = null;\n        if (node == end) {\n          if (end.nodeType === 1) {\n            // If end is an element, continue traversing its children to find\n            // the last text node inside it. Finish when end has no child or\n            // when came back from its children (wentUp==true).\n            endNotReached = !(!end.firstChild || wentUp);\n          } else {\n            endNotReached = false;\n          }\n        }\n        const element = node.nodeType === 1 ? (node as Element) : null;\n        if (!element) {\n          if (!haveStart) {\n            if (node.parentNode == null) {\n              endNotReached = false;\n            } else {\n              range.setStartBefore(node);\n              haveStart = true;\n            }\n          }\n          lastGood = node;\n        } else if (wentUp) {\n          wentUp = false;\n        } else if (LayoutHelper.isSpecial(element)) {\n          // Skip special\n          seekRange = !haveStart;\n        } else if (\n          !element.firstChild ||\n          Base.mediaTags[element.localName] ||\n          /^r(uby|[bt]c?)$/.test(element.localName) ||\n          LayoutHelper.isSpecialInlineDisplay(\n            this.clientLayout.getElementComputedStyle(element).display,\n          )\n        ) {\n          // img, ruby, inline-block, etc.\n          seekRange = !haveStart;\n          if (seekRange) {\n            if (element.localName === \"ruby\" && node.firstChild) {\n              // Fix for issue #985\n              node = node.firstChild;\n            }\n            range.setStartBefore(node);\n            haveStart = true;\n            lastGood = node;\n          } else if (!/^r(uby|tc?)$/.test(element.localName)) {\n            // Fix for issue #1319 and #1401\n            lastGood = node;\n          }\n          if (node.contains(end)) {\n            endNotReached = false;\n          }\n        } else {\n          next = node.firstChild;\n        }\n        if (!next) {\n          next = node.nextSibling;\n          if (!next) {\n            wentUp = true;\n            next = node.parentNode;\n          }\n        }\n        node = next;\n      } while (seekRange && endNotReached);\n      if (haveStart) {\n        range.setEndAfter(lastGood);\n        const boxList = this.clientLayout.getRangeClientRects(range);\n\n        // Adjust boxes' positions for column breaking\n        LayoutHelper.adjustRectsForColumnBreaking(boxList, this.vertical);\n\n        for (let i = 0; i < boxList.length; i++) {\n          arr.push(boxList[i]);\n        }\n        haveStart = false;\n      }\n    }\n    return arr;\n  }\n\n  /**\n   * Give block's initial and final nodes, find positions of the line bottoms.\n   * This is, of course, somewhat hacky implementation.\n   * @return position of line breaks\n   */\n  findLinePositions(checkPoints: Vtree.NodeContext[]): number[] {\n    const LOW_OVERLAP = 0.2;\n    const MID_OVERLAP = 0.6;\n    const positions = [];\n    const boxes = this.getRangeBoxes(\n      checkPoints[0].viewNode,\n      checkPoints[checkPoints.length - 1].viewNode,\n    );\n    boxes.sort(\n      this.vertical\n        ? VtreeImpl.clientrectDecreasingRight\n        : VtreeImpl.clientrectIncreasingTop,\n    );\n    let lineBefore = 0;\n    let lineAfter = 0;\n    let lineEnd = 0;\n    let lineLength = 0;\n    let i = 0;\n    const dir = this.getBoxDir();\n    while (true) {\n      if (i < boxes.length) {\n        const box = boxes[i];\n        let overlap = 1;\n        if (lineLength > 0) {\n          const boxSize = Math.max(this.getBoxSize(box), 1);\n          if (dir * this.getBeforeEdge(box) < dir * lineBefore) {\n            overlap = (dir * (this.getAfterEdge(box) - lineBefore)) / boxSize;\n          } else if (dir * this.getAfterEdge(box) > dir * lineAfter) {\n            overlap = (dir * (lineAfter - this.getBeforeEdge(box))) / boxSize;\n          } else {\n            overlap = 1;\n          }\n        }\n        if (\n          lineLength == 0 ||\n          overlap >= MID_OVERLAP ||\n          (overlap >= LOW_OVERLAP && this.getStartEdge(box) >= lineEnd - 1)\n        ) {\n          lineEnd = this.getEndEdge(box);\n          if (this.vertical) {\n            lineBefore =\n              lineLength == 0 ? box.right : Math.max(lineBefore, box.right);\n            lineAfter =\n              lineLength == 0 ? box.left : Math.min(lineAfter, box.left);\n          } else {\n            lineBefore =\n              lineLength == 0 ? box.top : Math.min(lineBefore, box.top);\n            lineAfter =\n              lineLength == 0 ? box.bottom : Math.max(lineAfter, box.bottom);\n          }\n          lineLength++;\n          i++;\n          continue;\n        }\n      }\n\n      // Add line\n      if (lineLength > 0) {\n        positions.push(lineAfter);\n        lineLength = 0;\n      }\n      if (i >= boxes.length) {\n        break;\n      }\n    }\n    positions.sort(Base.numberCompare);\n    if (this.vertical) {\n      positions.reverse();\n    }\n    return positions;\n  }\n\n  calculateClonedPaddingBorder(nodeContext: Vtree.NodeContext): number {\n    let clonedPaddingBorder = 0;\n    for (let nc = nodeContext; nc; nc = nc.parent) {\n      if (\n        !nc.inline &&\n        Break.isCloneBoxDecorationBreak(nc.viewNode as Element)\n      ) {\n        const paddingBorders = this.getComputedPaddingBorder(\n          nc.viewNode as Element,\n        );\n        clonedPaddingBorder += nc.vertical\n          ? -paddingBorders.left\n          : paddingBorders.bottom;\n        if (nc.display === \"table\") {\n          clonedPaddingBorder += (nc.vertical ? -1 : 1) * nc.blockBorderSpacing;\n        }\n      }\n    }\n    return clonedPaddingBorder;\n  }\n\n  private getOffsetByRepetitiveElements(\n    bp?: BreakPosition.BreakPosition,\n  ): number {\n    let offset: { current: number; minimum: number };\n    if (bp) {\n      offset = bp.calculateOffset(this);\n    } else {\n      offset = BreakPosition.calculateOffset(\n        null,\n        this.collectElementsOffset(),\n      );\n    }\n    return offset.current;\n  }\n\n  findBoxBreakPosition(\n    bp: BoxBreakPosition,\n    force: boolean,\n  ): Vtree.NodeContext {\n    // Workaround for issue #816 (Text with ruby overflowed at column/page break)\n    const parentNode = this.element.parentNode;\n    const nextSibling = this.element.nextSibling;\n    parentNode.removeChild(this.element);\n    parentNode.insertBefore(this.element, nextSibling);\n\n    const checkPoints = bp.checkPoints;\n    let block = checkPoints[0];\n    while (block.parent && block.inline) {\n      block = block.parent;\n    }\n    let widows: number;\n    let orphans: number;\n    if (force) {\n      // Last resort, ignore widows/orphans\n      widows = 1;\n      orphans = 1;\n    } else {\n      // Get widows/orphans settings from the block element\n      widows = Math.max(\n        ((block.inheritedProps[\"widows\"] as number) || 2) - 0,\n        1,\n      );\n      orphans = Math.max(\n        ((block.inheritedProps[\"orphans\"] as number) || 2) - 0,\n        1,\n      );\n    }\n\n    // In case of box-decoration-break: clone, width (or height in vertical\n    // writing mode) of cloned paddings and borders should be taken into\n    // account.\n    const clonedPaddingBorder = this.calculateClonedPaddingBorder(block);\n\n    // Select the first overflowing line break position\n    const linePositions = this.findLinePositions(checkPoints);\n    let edge = this.footnoteEdge - clonedPaddingBorder;\n    const dir = this.getBoxDir();\n    const repetitiveElementsOffset = this.getOffsetByRepetitiveElements(bp);\n    edge -= dir * repetitiveElementsOffset;\n\n    // If an \"overflowing\" checkpoint (e.g. not allowed by LayoutConstraint)\n    // exists before the edge, a line containing the checkpoint should be\n    // deferred to the next column.\n    const firstOverflowing =\n      this.findFirstOverflowingEdgeAndCheckPoint(checkPoints);\n    if (isNaN(firstOverflowing.edge)) {\n      firstOverflowing.edge = dir * Infinity;\n    }\n    let lineIndex = Base.binarySearch(linePositions.length, (i) => {\n      const p = linePositions[i];\n      return this.vertical\n        ? p < edge || p <= firstOverflowing.edge\n        : p > edge || p >= firstOverflowing.edge;\n    });\n\n    // If no break point is found due to the \"overflowing\" checkpoint,\n    // give up deferring a line containing the checkpoint and try to cut the\n    // line just before it.\n    const forceCutBeforeOverflowing = lineIndex <= 0;\n    if (forceCutBeforeOverflowing) {\n      lineIndex = Base.binarySearch(linePositions.length, (i) =>\n        this.vertical ? linePositions[i] < edge : linePositions[i] > edge,\n      );\n    }\n\n    // Workaround for the case of block child after text in parent block\n    // (Issue #1036)\n    let lastNode = checkPoints[checkPoints.length - 1].viewNode;\n    if (lastNode?.parentElement.localName === \"viv-ts-inner\") {\n      lastNode = lastNode.parentElement.parentElement;\n    }\n    if (\n      (lineIndex === linePositions.length && lastNode.nextSibling) ||\n      (lineIndex >= linePositions.length - 1 &&\n        lastNode.parentElement.querySelector(\".MJXc-display\")) // for MathJax\n    ) {\n      // Prevent unnecessary page break before the last line\n      // when a block box (may be generated by MathJax) exists\n      // just after the text or inline box.\n      widows = 0;\n    }\n\n    // First edge after the one that both fits and satisfies widows constraint.\n    lineIndex = Math.min(linePositions.length - widows, lineIndex);\n    if (lineIndex < orphans) {\n      // Not enough lines to satisfy orphans constraint, cannot break here.\n      return null;\n    }\n    edge = linePositions[lineIndex - 1];\n    let nodeContext: Vtree.NodeContext;\n    if (forceCutBeforeOverflowing) {\n      nodeContext = firstOverflowing.checkPoint;\n    } else {\n      nodeContext = this.findAcceptableBreakInside(bp.checkPoints, edge, force);\n    }\n    if (nodeContext) {\n      // When line-height is small, the edge calculated above (using Range)\n      // can be larger than the edge of the block container containing the text.\n      // We update the edge by measuring the block edge.\n      const blockEdge = this.getAfterEdgeOfBlockContainer(nodeContext);\n      if (!isNaN(blockEdge) && dir * (edge - blockEdge) > 0) {\n        edge = blockEdge;\n      }\n      this.computedBlockSize =\n        dir * (edge - this.beforeEdge) + repetitiveElementsOffset;\n    }\n    return nodeContext;\n  }\n\n  getAfterEdgeOfBlockContainer(nodeContext: Vtree.NodeContext): number {\n    let blockParent = nodeContext;\n    do {\n      blockParent = blockParent.parent;\n    } while (blockParent && blockParent.inline);\n    if (blockParent) {\n      blockParent = blockParent.copy().modify();\n      blockParent.after = true;\n      return LayoutHelper.calculateEdge(\n        blockParent,\n        this.clientLayout,\n        0,\n        this.vertical,\n      );\n    } else {\n      return NaN;\n    }\n  }\n\n  findFirstOverflowingEdgeAndCheckPoint(checkPoints: Vtree.NodeContext[]): {\n    edge: number;\n    checkPoint: Vtree.NodeContext | null;\n  } {\n    const index = checkPoints.findIndex((cp) => cp.overflow);\n    if (index < 0) {\n      return { edge: NaN, checkPoint: null };\n    }\n    const cp = checkPoints[index];\n    return {\n      edge: this.calculateEdge(null, checkPoints, index, cp.boxOffset),\n      checkPoint: cp,\n    };\n  }\n\n  findEdgeBreakPosition(\n    bp: BreakPosition.EdgeBreakPosition,\n  ): Vtree.NodeContext {\n    this.computedBlockSize =\n      bp.computedBlockSize + this.getOffsetByRepetitiveElements(bp);\n    return bp.position;\n  }\n\n  /**\n   * Finalize a line break.\n   * @return holing true\n   */\n  finishBreak(\n    nodeContext: Vtree.NodeContext,\n    forceRemoveSelf: boolean,\n    endOfColumn: boolean,\n  ): Task.Result<boolean> {\n    Asserts.assert(nodeContext.formattingContext);\n    const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n      nodeContext.formattingContext,\n    );\n    let result = layoutProcessor.finishBreak(\n      this,\n      nodeContext,\n      forceRemoveSelf,\n      endOfColumn,\n    );\n    if (!result) {\n      result = LayoutProcessor.blockLayoutProcessor.finishBreak(\n        this,\n        nodeContext,\n        forceRemoveSelf,\n        endOfColumn,\n      );\n    }\n    return result;\n  }\n\n  findAcceptableBreakPosition(): BreakPositionAndNodeContext {\n    let bp: Layout.BreakPosition = null;\n    let nodeContext: Vtree.NodeContext = null;\n    let penalty = 0;\n    let nextPenalty = 0;\n    do {\n      penalty = nextPenalty;\n      nextPenalty = Number.MAX_VALUE;\n      for (\n        let i = this.breakPositions.length - 1;\n        i >= 0 && !nodeContext;\n        --i\n      ) {\n        bp = this.breakPositions[i];\n        nodeContext = bp.findAcceptableBreak(this, penalty);\n        const minPenalty = bp.getMinBreakPenalty();\n        if (minPenalty > penalty) {\n          nextPenalty = Math.min(nextPenalty, minPenalty);\n        }\n      }\n    } while (\n      // Don't need to find a non-optimal break position if\n      // forceNonfitting=false\n      nextPenalty > penalty &&\n      !nodeContext &&\n      this.forceNonfitting\n    );\n    return { breakPosition: nodeContext ? bp : null, nodeContext };\n  }\n\n  doFinishBreak(\n    nodeContext: Vtree.NodeContext,\n    overflownNodeContext: Vtree.NodeContext,\n    initialNodeContext: Vtree.NodeContext,\n    initialComputedBlockSize: number,\n  ): Task.Result<Vtree.NodeContext> {\n    if (\n      this.pageFloatLayoutContext.isInvalidated() ||\n      this.pageBreakType ||\n      !overflownNodeContext\n    ) {\n      return Task.newResult(nodeContext);\n    }\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"doFinishBreak\");\n    let forceRemoveSelf = false;\n    if (!nodeContext) {\n      // Last resort\n      if (this.forceNonfitting) {\n        Logging.logger.warn(\"Could not find any page breaks?!!\");\n        this.skipTailEdges(overflownNodeContext).then((nodeContext) => {\n          if (nodeContext) {\n            nodeContext = nodeContext.modify();\n            nodeContext.overflow = false;\n            this.finishBreak(nodeContext, forceRemoveSelf, true).then(() => {\n              frame.finish(nodeContext);\n            });\n          } else {\n            frame.finish(nodeContext);\n          }\n        });\n        return frame.result();\n      } else {\n        nodeContext = initialNodeContext;\n        forceRemoveSelf = true;\n        this.computedBlockSize = initialComputedBlockSize;\n      }\n    }\n    this.finishBreak(nodeContext, forceRemoveSelf, true).then(() => {\n      frame.finish(nodeContext);\n    });\n    return frame.result();\n  }\n\n  /**\n   * Determines if a page break is acceptable at this position\n   */\n  isBreakable(flowPosition: Vtree.NodeContext): boolean {\n    for (let nc = flowPosition; nc; nc = nc.parent) {\n      if (LayoutHelper.isOutOfFlow(nc.viewNode)) {\n        return false;\n      }\n    }\n    if (flowPosition.after) {\n      return true; // may be an empty block\n    }\n    switch ((flowPosition.sourceNode as Element).namespaceURI) {\n      case Base.NS.SVG:\n        return false;\n    }\n    return !flowPosition.flexContainer;\n  }\n\n  /**\n   * Determines if an indent value is zero\n   */\n  zeroIndent(val: string | number): boolean {\n    const s = val.toString();\n    return s == \"\" || s == \"auto\" || !!s.match(/^0+(.0*)?[^0-9]/);\n  }\n\n  /**\n   * @return true if overflows\n   */\n  checkOverflowAndSaveEdge(\n    nodeContext: Vtree.NodeContext,\n    trailingEdgeContexts: Vtree.NodeContext[],\n  ): boolean {\n    if (!nodeContext) {\n      return false;\n    }\n    for (let nc = nodeContext; nc; nc = nc.parent) {\n      if (LayoutHelper.isOutOfFlow(nc.viewNode)) {\n        return false;\n      }\n    }\n    if (LayoutHelper.isOrphan(nodeContext.viewNode)) {\n      return false;\n    }\n    let edge = LayoutHelper.calculateEdge(\n      nodeContext,\n      this.clientLayout,\n      0,\n      this.vertical,\n    );\n    const offsets = BreakPosition.calculateOffset(\n      nodeContext,\n      this.collectElementsOffset(),\n    );\n    const overflown = this.isOverflown(\n      edge + (this.vertical ? -1 : 1) * offsets.minimum,\n    );\n    if (\n      this.isOverflown(edge + (this.vertical ? -1 : 1) * offsets.current) &&\n      !this.nodeContextOverflowingDueToRepetitiveElements\n    ) {\n      this.nodeContextOverflowingDueToRepetitiveElements = nodeContext;\n    } else if (trailingEdgeContexts) {\n      // If the edge does not overflow add the trailing margin, which is\n      // truncated to the remaining fragmentainer extent.\n      const marginEdge =\n        edge + this.getTrailingMarginEdgeAdjustment(trailingEdgeContexts);\n      const footnoteEdge =\n        this.footnoteEdge - this.getBoxDir() * offsets.current;\n      edge = this.vertical\n        ? Math.min(edge, Math.max(marginEdge, footnoteEdge))\n        : Math.max(edge, Math.min(marginEdge, footnoteEdge));\n    }\n    this.updateMaxReachedAfterEdge(edge);\n    return overflown;\n  }\n\n  /**\n   * Save a possible page break position on a CSS block edge. Check if it\n   * overflows.\n   * @return true if overflows\n   */\n  checkOverflowAndSaveEdgeAndBreakPosition(\n    nodeContext: Vtree.NodeContext,\n    trailingEdgeContexts: Vtree.NodeContext[],\n    saveEvenOverflown: boolean,\n    breakAtTheEdge: string | null,\n  ): boolean {\n    if (!nodeContext) {\n      return false;\n    }\n    if (LayoutHelper.isOrphan(nodeContext.viewNode)) {\n      return false;\n    }\n    const overflown = this.checkOverflowAndSaveEdge(\n      nodeContext,\n      trailingEdgeContexts,\n    );\n    if (saveEvenOverflown || !overflown) {\n      this.saveEdgeBreakPosition(nodeContext, breakAtTheEdge, overflown);\n    }\n    return overflown;\n  }\n\n  applyClearance(nodeContext: Vtree.NodeContext): boolean {\n    if (!nodeContext.viewNode.parentNode) {\n      // Cannot do clearance for nodes without parents\n      return false;\n    }\n    if (nodeContext.floatReference !== PageFloats.FloatReference.INLINE) {\n      // For page floats, clearance is handled differently\n      return false;\n    }\n\n    // measure where the edge of the element would be without clearance\n    const margin = this.getComputedMargin(nodeContext.viewNode as Element);\n    const spacer = nodeContext.viewNode.ownerDocument.createElement(\"div\");\n    if (this.vertical) {\n      spacer.style.bottom = \"0px\";\n      spacer.style.width = \"1px\";\n      spacer.style.marginRight = `${margin.right}px`;\n    } else {\n      spacer.style.right = \"0px\";\n      spacer.style.height = \"1px\";\n      spacer.style.marginTop = `${margin.top}px`;\n    }\n    nodeContext.viewNode.parentNode.insertBefore(spacer, nodeContext.viewNode);\n    let spacerBox = LayoutHelper.getElementClientRectAdjusted(\n      this.clientLayout,\n      spacer,\n      this.vertical,\n    );\n    const edge = this.getBeforeEdge(spacerBox);\n    const dir = this.getBoxDir();\n    const clear =\n      nodeContext.clearSide === \"same\"\n        ? nodeContext.floatSide\n        : nodeContext.clearSide;\n    const clearLR =\n      /^(top|bottom|inside|outside|(block|inline)-(start|end))$/.test(clear)\n        ? PageFloats.resolveInlineFloatDirection(\n            clear,\n            nodeContext.vertical,\n            nodeContext.direction,\n            (this.layoutContext as Vgen.ViewFactory).page.side,\n          )\n        : clear;\n\n    const clearLogical =\n      clearLR === \"left\" || clearLR === \"right\"\n        ? (nodeContext.direction === \"rtl\") === (clearLR === \"left\")\n          ? \"inline-end\"\n          : \"inline-start\"\n        : clearLR;\n\n    let clearEdge = this.pageFloatLayoutContext.getPageFloatClearEdge(\n      clearLogical,\n      this,\n    );\n\n    switch (clearLR) {\n      case \"left\":\n        clearEdge = dir * Math.max(clearEdge * dir, this.leftFloatEdge * dir);\n        break;\n      case \"right\":\n        clearEdge = dir * Math.max(clearEdge * dir, this.rightFloatEdge * dir);\n        break;\n      default:\n        clearEdge =\n          dir *\n          Math.max(\n            clearEdge * dir,\n            Math.max(this.rightFloatEdge * dir, this.leftFloatEdge * dir),\n          );\n    }\n\n    // edge holds the position where element border \"before\" edge will be\n    // without clearance. clearEdge is the \"after\" edge of the float to clear.\n\n    // tolerance to avoid unnecessary clearance due to the pixel rounding errors\n    // (Issue #1608)\n    const tolerance = 1 / (this.clientLayout.pixelRatio || 1);\n    if (edge * dir + tolerance > clearEdge * dir) {\n      // No need for clearance\n      nodeContext.viewNode.parentNode.removeChild(spacer);\n      return false;\n    } else {\n      // Need some clearance, determine how much. Add the clearance node,\n      // measure its after edge and adjust after margin (required due to\n      // possible margin collapse before clearance was introduced).\n      const height = Math.max(1, (clearEdge - edge) * dir);\n      if (this.vertical) {\n        spacer.style.width = `${height}px`;\n      } else {\n        spacer.style.height = `${height}px`;\n      }\n      spacerBox = LayoutHelper.getElementClientRectAdjusted(\n        this.clientLayout,\n        spacer,\n        this.vertical,\n      );\n      const afterEdge = this.getAfterEdge(spacerBox);\n      if (!nodeContext.floatSide) {\n        if (this.vertical) {\n          let wAdj = afterEdge - margin.right - clearEdge;\n          if (wAdj > 0 == margin.right >= 0) {\n            // In addition to collapsed portion\n            wAdj += margin.right;\n          }\n          spacer.style.marginLeft = `${wAdj}px`;\n        } else {\n          let hAdj = clearEdge - (afterEdge + margin.top);\n          if (hAdj > 0 == margin.top >= 0) {\n            // In addition to collapsed portion\n            hAdj += margin.top;\n          }\n          spacer.style.marginBottom = `${hAdj}px`;\n        }\n      }\n      nodeContext.clearSpacer = spacer;\n      return true;\n    }\n  }\n\n  isBFC(formattingContext: Vtree.FormattingContext): boolean {\n    if (LayoutProcessor.isInstanceOfBlockFormattingContext(formattingContext)) {\n      return true;\n    }\n    if (\n      RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n        formattingContext,\n      )\n    ) {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Skips positions until either the start of unbreakable block or inline\n   * content. Also sets breakBefore on the result combining break-before and\n   * break-after properties from all elements that meet at the edge.\n   */\n  skipEdges(\n    nodeContext: Vtree.NodeContext,\n    leadingEdge: boolean,\n    forcedBreakValue: string | null,\n  ): Task.Result<Vtree.NodeContext> {\n    const fc = nodeContext.after\n      ? nodeContext.parent?.formattingContext\n      : nodeContext.formattingContext;\n    if (fc && !this.isBFC(fc)) {\n      return Task.newResult(nodeContext);\n    }\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"skipEdges\");\n\n    // If a forced break occurred at the end of the previous column,\n    // nodeContext.after should be false.\n    let atUnforcedBreak =\n      !forcedBreakValue && leadingEdge && nodeContext && nodeContext.after;\n    let breakAtTheEdge = forcedBreakValue;\n    let lastAfterNodeContext: Vtree.NodeContext = null;\n    let leadingEdgeContexts: Vtree.NodeContext[] = [];\n    let trailingEdgeContexts: Vtree.NodeContext[] = [];\n    let onStartEdges = false;\n\n    function needForcedBreak(): boolean {\n      // leadingEdge=true means that we are at the beginning of the new column\n      // and hence must avoid a break (Otherwise leading to an infinite loop)\n      return (\n        !!forcedBreakValue ||\n        (!leadingEdge &&\n          Break.isForcedBreakValue(breakAtTheEdge) &&\n          // prevent unnecessary breaks at the beginning of the column/page\n          // after out-of-flow elements, e.g. position:absolute or running().\n          // (Issue #1176)\n          !atLeadingEdgeIgnoringOutOfFlow())\n      );\n    }\n\n    function atLeadingEdgeIgnoringOutOfFlow(): boolean {\n      if (!lastAfterNodeContext) {\n        return false;\n      }\n      // Exclude if itself is a float (Issue #1288)\n      if (nodeContext.floatSide) {\n        return false;\n      }\n      for (let nc = lastAfterNodeContext; nc?.parent; nc = nc.parent) {\n        let node = nc.after ? nc.viewNode : nc.viewNode?.previousSibling;\n        while (\n          node &&\n          (VtreeImpl.canIgnore(node, nc.parent.whitespace) ||\n            LayoutHelper.isOutOfFlow(node))\n        ) {\n          node = node.previousSibling;\n        }\n        if (node) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    const processForcedBreak = () => {\n      nodeContext = leadingEdgeContexts[0] || nodeContext;\n      nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n      this.pageBreakType = breakAtTheEdge;\n    };\n\n    frame\n      .loopWithFrame((loopFrame) => {\n        while (nodeContext) {\n          Asserts.assert(nodeContext.formattingContext);\n          const layoutProcessor =\n            new LayoutProcessor.LayoutProcessorResolver().find(\n              nodeContext.formattingContext,\n            );\n\n          // A code block to be able to use break. Break moves to the next\n          // node position.\n          do {\n            if (!nodeContext.viewNode) {\n              // Non-displayable content, skip\n              break;\n            }\n            if (nodeContext.inline && nodeContext.viewNode.nodeType != 1) {\n              if (\n                VtreeImpl.canIgnore(\n                  nodeContext.viewNode,\n                  nodeContext.whitespace,\n                )\n              ) {\n                // Ignorable text content, skip\n                break;\n              }\n              if (!nodeContext.after) {\n                // Leading edge of non-empty block -> finished going through\n                // all starting edges of the box\n                if (needForcedBreak()) {\n                  processForcedBreak();\n                } else if (\n                  this.checkOverflowAndSaveEdgeAndBreakPosition(\n                    lastAfterNodeContext,\n                    null,\n                    true,\n                    breakAtTheEdge,\n                  )\n                ) {\n                  nodeContext = (\n                    this.stopAtOverflow\n                      ? lastAfterNodeContext || nodeContext\n                      : nodeContext\n                  ).modify();\n                  nodeContext.overflow = true;\n                } else {\n                  nodeContext = nodeContext.modify();\n                  nodeContext.breakBefore = breakAtTheEdge;\n                }\n                loopFrame.breakLoop();\n                return;\n              }\n            }\n            if (!nodeContext.after) {\n              if (nodeContext.floatSide) {\n                // Save break-after:avoid* value at before the float\n                // (Fix for issue #904)\n                this.breakAtTheEdgeBeforeFloat = Break.isAvoidBreakValue(\n                  breakAtTheEdge,\n                )\n                  ? breakAtTheEdge\n                  : null;\n              }\n              if (layoutProcessor) {\n                if (layoutProcessor.startNonInlineElementNode(nodeContext)) {\n                  break;\n                }\n              }\n              if (nodeContext.clearSide) {\n                // clear\n                if (\n                  this.applyClearance(nodeContext) &&\n                  leadingEdge &&\n                  this.breakPositions.length === 0\n                ) {\n                  this.saveEdgeBreakPosition(\n                    nodeContext.copy(),\n                    breakAtTheEdge,\n                    false,\n                  );\n                }\n              }\n              // Check break opportunity between anonymous block box and block-level box\n              // (Issue #611)\n              if (\n                !nodeContext.inline &&\n                !nodeContext.repeatOnBreak &&\n                (lastAfterNodeContext\n                  ? LayoutHelper.findAncestorSpecialInlineNodeContext(\n                      lastAfterNodeContext,\n                    )\n                  : this.breakPositions[\n                      this.breakPositions.length - 1\n                    ] instanceof BoxBreakPosition)\n              ) {\n                this.saveEdgeBreakPosition(\n                  nodeContext.copy(),\n                  breakAtTheEdge,\n                  false,\n                );\n              }\n              if (\n                !this.isBFC(nodeContext.formattingContext) ||\n                RepetitiveElement.isInstanceOfRepetitiveElementsOwnerFormattingContext(\n                  nodeContext.formattingContext,\n                ) ||\n                this.isFloatNodeContext(nodeContext) ||\n                nodeContext.flexContainer ||\n                // Check empty block box (Issue #749)\n                (!nodeContext.nodeShadow &&\n                  !(nodeContext.sourceNode as Element).firstElementChild &&\n                  VtreeImpl.canIgnore(\n                    nodeContext.sourceNode.firstChild,\n                    nodeContext.whitespace,\n                  ))\n              ) {\n                // new formatting context, or float or flex container,\n                // or empty block box (unbreakable)\n                leadingEdgeContexts.push(nodeContext.copy());\n                breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                  breakAtTheEdge,\n                  nodeContext.breakBefore,\n                );\n\n                // check if a forced break must occur before the block.\n                if (needForcedBreak()) {\n                  processForcedBreak();\n                } else if (\n                  this.checkOverflowAndSaveEdgeAndBreakPosition(\n                    lastAfterNodeContext,\n                    null,\n                    true,\n                    breakAtTheEdge,\n                  ) ||\n                  !this.layoutConstraint.allowLayout(nodeContext)\n                ) {\n                  // overflow\n                  nodeContext = (\n                    this.stopAtOverflow\n                      ? lastAfterNodeContext || nodeContext\n                      : nodeContext\n                  ).modify();\n                  nodeContext.overflow = true;\n                }\n                loopFrame.breakLoop();\n                return;\n              }\n            }\n            if (nodeContext.viewNode.nodeType != 1) {\n              // not an element\n              break;\n            }\n            const viewElement = nodeContext.viewNode as HTMLElement;\n            const style = viewElement.style;\n            if (nodeContext.after) {\n              if (nodeContext.floatSide) {\n                // Restore break-after:avoid* value at before the float\n                // (Fix for issue #904)\n                breakAtTheEdge =\n                  breakAtTheEdge ?? this.breakAtTheEdgeBeforeFloat;\n                this.breakAtTheEdgeBeforeFloat = null;\n              }\n              const element = nodeContext.sourceNode as Element;\n              // Make breakable after svg and math elements\n              // (Fix for issue #750)\n              if (\n                element.localName === \"svg\" ||\n                element.localName === \"math\" ||\n                element.getAttribute(\"data-math-typeset\") === \"true\"\n              ) {\n                onStartEdges = false;\n                lastAfterNodeContext = nodeContext.copy();\n                trailingEdgeContexts.push(lastAfterNodeContext);\n                breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                  null,\n                  nodeContext.breakAfter,\n                );\n                this.checkOverflowAndSaveEdgeAndBreakPosition(\n                  lastAfterNodeContext,\n                  null,\n                  !this.stopAtOverflow,\n                  breakAtTheEdge,\n                );\n                break;\n              }\n              // Skip an empty inline box at the start of a block\n              // (An anonymous block consisting entirely of\n              // collapsible white space is removed from the rendering tree)\n              if (nodeContext.inline) {\n                break;\n              }\n              if (layoutProcessor) {\n                if (\n                  layoutProcessor.afterNonInlineElementNode(\n                    nodeContext,\n                    this.stopAtOverflow,\n                  )\n                ) {\n                  break;\n                }\n              }\n\n              // Trailing edge\n              if (onStartEdges) {\n                // finished going through all starting edges of the box.\n                // check if a forced break must occur before the block.\n                if (needForcedBreak()) {\n                  processForcedBreak();\n                  loopFrame.breakLoop();\n                  return;\n                }\n\n                // since a break did not occur, move to the next edge. this\n                // edge is no longer the leading edge.\n                leadingEdgeContexts = [];\n                leadingEdge = false;\n                atUnforcedBreak = false;\n                breakAtTheEdge = null;\n              }\n              onStartEdges = false; // we are now on end edges.\n              lastAfterNodeContext = nodeContext.copy();\n              trailingEdgeContexts.push(lastAfterNodeContext);\n              breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                breakAtTheEdge,\n                nodeContext.breakAfter,\n              );\n              if (\n                style &&\n                !(\n                  this.zeroIndent(style.paddingBottom) &&\n                  this.zeroIndent(style.borderBottomWidth)\n                )\n              ) {\n                // Non-zero trailing inset.\n                // Margins don't collapse across non-zero borders and\n                // paddings.\n                trailingEdgeContexts = [lastAfterNodeContext];\n              }\n            } else {\n              // Leading edge\n              leadingEdgeContexts.push(nodeContext.copy());\n              breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                breakAtTheEdge,\n                nodeContext.breakBefore,\n              );\n\n              // Prevent unnecessary blank pages by removing unnecessary forced column breaks\n              if (\n                lastAfterNodeContext &&\n                Break.isForcedBreakValue(breakAtTheEdge)\n              ) {\n                LayoutHelper.clearForcedColumnBreaks(\n                  lastAfterNodeContext.viewNode,\n                  nodeContext.viewNode,\n                );\n              }\n\n              if (\n                (nodeContext.pageType != nodeContext.parent?.pageType || // Fix for issue #771\n                  !Break.isForcedBreakValue(breakAtTheEdge)) && // Fix for issue #722\n                !this.layoutConstraint.allowLayout(nodeContext)\n              ) {\n                this.checkOverflowAndSaveEdgeAndBreakPosition(\n                  lastAfterNodeContext,\n                  null,\n                  !this.stopAtOverflow,\n                  breakAtTheEdge,\n                );\n                nodeContext = nodeContext.modify();\n                nodeContext.overflow = true;\n                if (this.stopAtOverflow) {\n                  loopFrame.breakLoop();\n                  return;\n                }\n              }\n              const viewTag = (nodeContext.viewNode as Element).localName;\n              if (Base.mediaTags[viewTag]) {\n                // elements that have inherent content\n                // check if a forced break must occur before the block.\n                if (needForcedBreak()) {\n                  processForcedBreak();\n                } else if (\n                  this.checkOverflowAndSaveEdgeAndBreakPosition(\n                    lastAfterNodeContext,\n                    null,\n                    true,\n                    breakAtTheEdge,\n                  )\n                ) {\n                  // overflow\n                  nodeContext = (\n                    this.stopAtOverflow\n                      ? lastAfterNodeContext || nodeContext\n                      : nodeContext\n                  ).modify();\n                  nodeContext.overflow = true;\n                }\n                loopFrame.breakLoop();\n                return;\n              }\n              if (\n                style &&\n                !(\n                  this.zeroIndent(style.paddingTop) &&\n                  this.zeroIndent(style.borderTopWidth)\n                )\n              ) {\n                // Non-zero leading inset\n                atUnforcedBreak = false;\n                trailingEdgeContexts = [];\n              }\n              onStartEdges = true; // we are now on starting edges.\n            }\n          } while (false); // End of block of code to use break\n\n          const nextResult = this.nextInTree(nodeContext, atUnforcedBreak);\n          if (nextResult.isPending()) {\n            nextResult.then((nodeContextParam) => {\n              nodeContext = nodeContextParam;\n              loopFrame.continueLoop();\n            });\n            return;\n          } else {\n            nodeContext = nextResult.get();\n          }\n        }\n\n        if (\n          this.checkOverflowAndSaveEdgeAndBreakPosition(\n            lastAfterNodeContext,\n            trailingEdgeContexts,\n            !this.stopAtOverflow,\n            breakAtTheEdge,\n          )\n        ) {\n          if (lastAfterNodeContext && this.stopAtOverflow) {\n            nodeContext = lastAfterNodeContext.modify();\n            nodeContext.overflow = true;\n          } else {\n            // TODO: what to return here??\n          }\n        } else if (Break.isForcedBreakValue(breakAtTheEdge)) {\n          this.pageBreakType = breakAtTheEdge;\n        }\n        loopFrame.breakLoop();\n      })\n      .then(() => {\n        if (lastAfterNodeContext) {\n          this.lastAfterPosition = lastAfterNodeContext.toNodePosition();\n        }\n        frame.finish(nodeContext);\n      });\n    return frame.result();\n  }\n\n  /**\n   * Skips non-renderable positions until it hits the end of the flow or some\n   * renderable content. Returns the nodeContext that was passed in if some\n   * content remains and null if all content could be skipped.\n   */\n  skipTailEdges(\n    nodeContext: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    let resultNodeContext = nodeContext.copy();\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"skipEdges\");\n    let breakAtTheEdge: string | null = null;\n    let onStartEdges = false;\n    frame\n      .loopWithFrame((loopFrame) => {\n        while (nodeContext) {\n          // A code block to be able to use break. Break moves to the next\n          // node position.\n          do {\n            if (!nodeContext.viewNode) {\n              // Non-displayable content, skip\n              break;\n            }\n            if (nodeContext.inline && nodeContext.viewNode.nodeType != 1) {\n              if (\n                VtreeImpl.canIgnore(\n                  nodeContext.viewNode,\n                  nodeContext.whitespace,\n                )\n              ) {\n                // Ignorable text content, skip\n                break;\n              }\n              if (!nodeContext.after) {\n                // Leading edge of non-empty block -> finished going through\n                // all starting edges of the box\n                if (Break.isForcedBreakValue(breakAtTheEdge)) {\n                  this.pageBreakType = breakAtTheEdge;\n                }\n                loopFrame.breakLoop();\n                return;\n              }\n            }\n            if (!nodeContext.after) {\n              if (\n                this.isFloatNodeContext(nodeContext) ||\n                nodeContext.flexContainer\n              ) {\n                // float or flex container (unbreakable)\n                breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                  breakAtTheEdge,\n                  nodeContext.breakBefore,\n                );\n\n                // check if a forced break must occur before the block.\n                if (Break.isForcedBreakValue(breakAtTheEdge)) {\n                  this.pageBreakType = breakAtTheEdge;\n                }\n                loopFrame.breakLoop();\n                return;\n              }\n            }\n            if (nodeContext.viewNode.nodeType != 1) {\n              // not an element\n              break;\n            }\n            const style = (nodeContext.viewNode as HTMLElement).style;\n            if (nodeContext.after) {\n              // Trailing edge\n              if (onStartEdges) {\n                // finished going through all starting edges of the box.\n                // check if a forced break must occur before the block.\n                if (Break.isForcedBreakValue(breakAtTheEdge)) {\n                  this.pageBreakType = breakAtTheEdge;\n                  loopFrame.breakLoop();\n                  return;\n                }\n\n                // since a break did not occur, move to the next edge.\n                breakAtTheEdge = null;\n              }\n              onStartEdges = false; // we are now on end edges.\n              breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                breakAtTheEdge,\n                nodeContext.breakAfter,\n              );\n            } else {\n              // Leading edge\n              breakAtTheEdge = Break.resolveEffectiveBreakValue(\n                breakAtTheEdge,\n                nodeContext.breakBefore,\n              );\n              const viewTag = (nodeContext.viewNode as Element).localName;\n              if (Base.mediaTags[viewTag]) {\n                // elements that have inherent content\n                // check if a forced break must occur before the block.\n                if (Break.isForcedBreakValue(breakAtTheEdge)) {\n                  this.pageBreakType = breakAtTheEdge;\n                }\n                loopFrame.breakLoop();\n                return;\n              }\n              if (\n                style &&\n                !(\n                  this.zeroIndent(style.paddingTop) &&\n                  this.zeroIndent(style.borderTopWidth)\n                )\n              ) {\n                // Non-zero leading inset\n                loopFrame.breakLoop();\n                return;\n              }\n            }\n            onStartEdges = true; // we are now on starting edges.\n          } while (false); // End of block of code to use break\n\n          const nextResult = this.layoutContext.nextInTree(nodeContext);\n          if (nextResult.isPending()) {\n            nextResult.then((nodeContextParam) => {\n              nodeContext = nodeContextParam;\n              loopFrame.continueLoop();\n            });\n            return;\n          } else {\n            nodeContext = nextResult.get();\n          }\n        }\n        resultNodeContext = null;\n        loopFrame.breakLoop();\n      })\n      .then(() => {\n        frame.finish(resultNodeContext);\n      });\n    return frame.result();\n  }\n\n  layoutFloatOrFootnote(\n    nodeContext: Vtree.NodeContext,\n  ): Task.Result<Vtree.NodeContext> {\n    if (\n      PageFloats.isPageFloat(nodeContext.floatReference) ||\n      nodeContext.floatSide === \"footnote\"\n    ) {\n      return this.layoutPageFloat(nodeContext);\n    } else {\n      return this.layoutFloat(nodeContext);\n    }\n  }\n\n  /**\n   * Layout next portion of the source.\n   */\n  layoutNext(\n    nodeContext: Vtree.NodeContext,\n    leadingEdge: boolean,\n    forcedBreakValue?: string | null,\n  ): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"layoutNext\");\n    this.skipEdges(nodeContext, leadingEdge, forcedBreakValue || null).then(\n      (nodeContextParam) => {\n        nodeContext = nodeContextParam as Vtree.NodeContext;\n        if (\n          !nodeContext ||\n          this.pageBreakType ||\n          this.stopByOverflow(nodeContext)\n        ) {\n          // finished all content, explicit page break or overflow (automatic\n          // page break)\n          frame.finish(nodeContext);\n        } else {\n          const formattingContext = nodeContext.formattingContext;\n          Asserts.assert(formattingContext);\n          const layoutProcessor =\n            new LayoutProcessor.LayoutProcessorResolver().find(\n              formattingContext,\n            );\n          layoutProcessor\n            .layout(nodeContext, this, leadingEdge)\n            .thenFinish(frame);\n        }\n      },\n    );\n    return frame.result();\n  }\n\n  clearOverflownViewNodes(\n    nodeContext: Vtree.NodeContext,\n    removeSelf: boolean,\n  ): void {\n    if (!nodeContext) {\n      return;\n    }\n    for (\n      let parent = nodeContext.parent;\n      nodeContext;\n      nodeContext = parent, parent = parent ? parent.parent : null\n    ) {\n      const formattingContext = (parent || nodeContext).formattingContext;\n      Asserts.assert(formattingContext);\n      const layoutProcessor =\n        new LayoutProcessor.LayoutProcessorResolver().find(formattingContext);\n      layoutProcessor.clearOverflownViewNodes(\n        this,\n        parent,\n        nodeContext,\n        removeSelf,\n      );\n      removeSelf = false;\n    }\n  }\n\n  initGeom(): void {\n    // TODO: we should be able to avoid querying the layout engine at this\n    // point. Create an element that fills the content area and query its size.\n    // Calling getElementClientRect on the container element includes element\n    // padding which is wrong for our purposes.\n    const probe = this.element.ownerDocument.createElement(\"div\");\n    probe.style.position = \"absolute\";\n    probe.style.top = `${this.paddingTop}px`;\n    probe.style.right = `${this.paddingRight}px`;\n    probe.style.bottom = `${this.paddingBottom}px`;\n    probe.style.left = `${this.paddingLeft}px`;\n    this.element.appendChild(probe);\n    const columnBBox = this.clientLayout.getElementClientRect(probe);\n    this.element.removeChild(probe);\n    const offsetX = this.originX + this.left + this.getInsetLeft();\n    const offsetY = this.originY + this.top + this.getInsetTop();\n    this.box = new GeometryUtil.Rect(\n      offsetX,\n      offsetY,\n      offsetX + this.width,\n      offsetY + this.height,\n    );\n    this.startEdge = columnBBox\n      ? this.vertical\n        ? this.rtl\n          ? columnBBox.bottom\n          : columnBBox.top\n        : this.rtl\n          ? columnBBox.right\n          : columnBBox.left\n      : 0;\n    this.endEdge = columnBBox\n      ? this.vertical\n        ? this.rtl\n          ? columnBBox.top\n          : columnBBox.bottom\n        : this.rtl\n          ? columnBBox.left\n          : columnBBox.right\n      : 0;\n    this.beforeEdge = columnBBox\n      ? this.vertical\n        ? columnBBox.right\n        : columnBBox.top\n      : 0;\n    this.afterEdge = columnBBox\n      ? this.vertical\n        ? columnBBox.left\n        : columnBBox.bottom\n      : 0;\n    this.leftFloatEdge = this.beforeEdge;\n    this.rightFloatEdge = this.beforeEdge;\n    this.bottommostFloatTop = this.beforeEdge;\n    this.footnoteEdge = this.afterEdge;\n    this.bands = GeometryUtil.shapesToBands(\n      this.box,\n      [this.getInnerShape()],\n      this.getExclusions(),\n      8,\n      this.snapHeight,\n      this.vertical,\n    );\n    this.createFloats();\n  }\n\n  init(): void {\n    this.chunkPositions = [];\n    Base.setCSSProperty(this.element, \"width\", `${this.width}px`);\n    Base.setCSSProperty(this.element, \"height\", `${this.height}px`);\n    this.initGeom();\n    this.computedBlockSize = 0;\n    this.overflown = false;\n    this.pageBreakType = null;\n    this.lastAfterPosition = null;\n  }\n\n  /**\n   * Save the potential breaking position at the edge. Should, in general, save\n   * \"after\" position but only after skipping all of the \"before\" ones and\n   * getting to the non-empty content (to get breakAtEdge right).\n   */\n  saveEdgeBreakPosition(\n    position: Vtree.NodeContext,\n    breakAtEdge: string | null,\n    overflows: boolean,\n  ): void {\n    Asserts.assert(position.formattingContext);\n    const copy = position.copy();\n    const layoutProcessor = new LayoutProcessor.LayoutProcessorResolver().find(\n      position.formattingContext,\n    );\n    const clonedPaddingBorder = this.calculateClonedPaddingBorder(copy);\n    const bp = layoutProcessor.createEdgeBreakPosition(\n      copy,\n      breakAtEdge,\n      overflows,\n      this.computedBlockSize + clonedPaddingBorder,\n    );\n    this.breakPositions.push(bp);\n  }\n\n  /**\n   * @param checkPoints array of breaking points for breakable block\n   */\n  saveBoxBreakPosition(checkPoints: Vtree.NodeContext[]): void {\n    let penalty = checkPoints[0].breakPenalty;\n    if (penalty) {\n      // Fix for issue #546\n      let block = checkPoints[0];\n      while (block.parent && block.inline) {\n        block = block.parent;\n      }\n      penalty = block.breakPenalty;\n    }\n    const bp = new BoxBreakPosition(checkPoints, penalty);\n    this.breakPositions.push(bp);\n  }\n\n  updateMaxReachedAfterEdge(afterEdge: number) {\n    if (!isNaN(afterEdge)) {\n      const size = this.getBoxDir() * (afterEdge - this.beforeEdge);\n      this.computedBlockSize = Math.max(size, this.computedBlockSize);\n    }\n  }\n\n  /**\n   * @param chunkPosition starting position.\n   * @return holding end position.\n   */\n  layout(\n    chunkPosition: Vtree.ChunkPosition,\n    leadingEdge: boolean,\n    breakAfter?: string | null,\n  ): Task.Result<Vtree.ChunkPosition> {\n    this.chunkPositions.push(chunkPosition); // So we can re-layout this column later\n    if (chunkPosition.primary.after) {\n      this.lastAfterPosition = chunkPosition.primary;\n    }\n    if (this.stopAtOverflow && this.overflown) {\n      return Task.newResult(chunkPosition as Vtree.ChunkPosition);\n    }\n    if (this.isFullWithPageFloats()) {\n      if (\n        chunkPosition.primary.after &&\n        chunkPosition.primary.steps.length === 1\n      ) {\n        // End of contents\n        return Task.newResult(null as Vtree.ChunkPosition);\n      } else {\n        return Task.newResult(chunkPosition as Vtree.ChunkPosition);\n      }\n    }\n\n    if (LayoutHelper.isRootColumn(this)) {\n      // Enable page/column breaking using the browser's multi-column feature.\n      LayoutHelper.setBrowserColumnBreaking(this);\n    }\n\n    const frame: Task.Frame<Vtree.ChunkPosition> = Task.newFrame(\"layout\");\n\n    // ------ start the column -----------\n    this.openAllViews(chunkPosition.primary).then((nodeContext) => {\n      let initialNodeContext: Vtree.NodeContext = null;\n      if (nodeContext.viewNode) {\n        initialNodeContext = nodeContext.copy();\n      } else {\n        const nextInTreeListener = (evt) => {\n          if (evt.nodeContext.viewNode) {\n            initialNodeContext = evt.nodeContext;\n            this.layoutContext.removeEventListener(\n              \"nextInTree\",\n              nextInTreeListener,\n            );\n          }\n        };\n        this.layoutContext.addEventListener(\"nextInTree\", nextInTreeListener);\n      }\n      const retryer = new ColumnLayoutRetryer(leadingEdge, breakAfter);\n      retryer.layout(nodeContext, this).then((nodeContextParam) => {\n        if (LayoutHelper.isRootColumn(this)) {\n          // Unset browser's multi-column if it caused column overflow.\n          // (Fix for issue #1637)\n          const rect =\n            this.element.lastElementChild &&\n            this.clientLayout.getElementClientRect(\n              this.element.lastElementChild,\n            );\n          const columnOver =\n            rect && LayoutHelper.checkIfBeyondColumnBreaks(rect, this.vertical);\n          if (columnOver) {\n            LayoutHelper.unsetBrowserColumnBreaking(this);\n          }\n        }\n        this.doFinishBreak(\n          nodeContextParam,\n          retryer.context.overflownNodeContext,\n          initialNodeContext,\n          retryer.initialComputedBlockSize,\n        ).then((positionAfter) => {\n          let cont: Task.Result<boolean> = null;\n          if (!this.pseudoParent) {\n            cont = this.doFinishBreakOfFragmentLayoutConstraints(positionAfter);\n          } else {\n            cont = Task.newResult(null);\n          }\n          cont.then(() => {\n            if (this.pageFloatLayoutContext.isInvalidated()) {\n              frame.finish(null);\n              return;\n            }\n            if (!positionAfter) {\n              frame.finish(null);\n            } else {\n              this.overflown = true;\n              const result = new VtreeImpl.ChunkPosition(\n                positionAfter.toNodePosition(),\n              );\n              frame.finish(result);\n            }\n          });\n        });\n      });\n    });\n    return frame.result();\n  }\n\n  isFullWithPageFloats(): boolean {\n    return this.pageFloatLayoutContext.isColumnFullWithPageFloats(this);\n  }\n\n  getMaxBlockSizeOfPageFloats(): number {\n    return this.pageFloatLayoutContext.getMaxBlockSizeOfPageFloats();\n  }\n\n  doFinishBreakOfFragmentLayoutConstraints(\n    nodeContext: Vtree.NodeContext,\n  ): Task.Result<boolean> {\n    const frame: Task.Frame<boolean> = Task.newFrame(\n      \"doFinishBreakOfFragmentLayoutConstraints\",\n    );\n    const sortedFragmentLayoutConstraints = [].concat(\n      this.fragmentLayoutConstraints,\n    );\n    sortedFragmentLayoutConstraints.sort(\n      (a, b) => a.getPriorityOfFinishBreak() - b.getPriorityOfFinishBreak(),\n    );\n    let i = 0;\n    frame\n      .loop(() => {\n        if (i < sortedFragmentLayoutConstraints.length) {\n          const result = sortedFragmentLayoutConstraints[i++].finishBreak(\n            nodeContext,\n            this,\n          );\n          return result.thenReturn(true);\n        } else {\n          return Task.newResult(false);\n        }\n      })\n      .then(() => {\n        frame.finish(true);\n      });\n    return frame.result();\n  }\n\n  /**\n   * @param nodeContext starting position.\n   * @return holding end position.\n   */\n  doLayout(\n    nodeContext: Vtree.NodeContext,\n    leadingEdge: boolean,\n    breakAfter?: string | null,\n  ): Task.Result<{\n    nodeContext: Vtree.NodeContext;\n    overflownNodeContext: Vtree.NodeContext;\n  }> {\n    const frame: Task.Frame<{\n      nodeContext: Vtree.NodeContext;\n      overflownNodeContext: Vtree.NodeContext;\n    }> = Task.newFrame(\"doLayout\");\n    let overflownNodeContext: Vtree.NodeContext = null;\n\n    // ------ init backtracking list -----\n    this.breakPositions = [];\n    this.nodeContextOverflowingDueToRepetitiveElements = null;\n\n    // ------- fill the column -------------\n    frame\n      .loopWithFrame((loopFrame) => {\n        while (nodeContext) {\n          // fill a single block\n          let pending = true;\n          this.layoutNext(nodeContext, leadingEdge, breakAfter || null).then(\n            (nodeContextParam) => {\n              leadingEdge = false;\n              breakAfter = null;\n              if (\n                this.nodeContextOverflowingDueToRepetitiveElements &&\n                this.stopAtOverflow\n              ) {\n                this.pageBreakType = null;\n                nodeContext =\n                  this.nodeContextOverflowingDueToRepetitiveElements;\n                nodeContext.overflow = true;\n              } else {\n                nodeContext = nodeContextParam;\n              }\n              if (this.pageFloatLayoutContext.isInvalidated()) {\n                loopFrame.breakLoop();\n              } else if (this.pageBreakType) {\n                // explicit page break\n                loopFrame.breakLoop(); // Loop end\n              } else if (nodeContext && this.stopByOverflow(nodeContext)) {\n                // overflow (implicit page break): back up and find a\n                // page break\n                overflownNodeContext = nodeContext;\n                const bp = this.findAcceptableBreakPosition();\n                nodeContext = bp.nodeContext;\n                if (bp.breakPosition) {\n                  bp.breakPosition.breakPositionChosen(this);\n                }\n                loopFrame.breakLoop(); // Loop end\n              } else {\n                if (pending) {\n                  // Sync case\n                  pending = false;\n                } else {\n                  // Async case\n                  loopFrame.continueLoop();\n                }\n              }\n            },\n          );\n          if (pending) {\n            // Async case and loop end\n            pending = false;\n            return;\n          }\n        }\n\n        // Sync case\n        this.computedBlockSize += this.getOffsetByRepetitiveElements();\n        loopFrame.breakLoop();\n      })\n      .then(() => {\n        frame.finish({ nodeContext, overflownNodeContext });\n      });\n    return frame.result();\n  }\n\n  /**\n   * Re-layout already laid-out chunks. Return the position of the last flow if\n   * there is an overflow.\n   * TODO: deal with chunks that did not fit at all.\n   * @return holding end position.\n   */\n  redoLayout(): Task.Result<Vtree.ChunkPosition> {\n    const chunkPositions = this.chunkPositions;\n    let last: Node = this.element.lastChild;\n    while (last != this.last) {\n      const prev = last.previousSibling;\n      if (\n        !(\n          this.element === last.parentNode &&\n          (this.layoutContext as Vgen.ViewFactory).isPseudoelement(last)\n        )\n      ) {\n        this.element.removeChild(last);\n      }\n      last = prev;\n    }\n    this.killFloats();\n    this.init();\n    const frame: Task.Frame<Vtree.ChunkPosition> = Task.newFrame(\"redoLayout\");\n    let i = 0;\n    let res: Vtree.ChunkPosition = null;\n    let leadingEdge = true;\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (i < chunkPositions.length) {\n          const chunkPosition = chunkPositions[i++];\n          this.layout(chunkPosition, leadingEdge).then((pos) => {\n            leadingEdge = false;\n            if (pos) {\n              res = pos;\n              loopFrame.breakLoop();\n            } else {\n              loopFrame.continueLoop();\n            }\n          });\n          return;\n        }\n        loopFrame.breakLoop();\n      })\n      .then(() => {\n        frame.finish(res);\n      });\n    return frame.result();\n  }\n\n  saveDistanceToBlockEndFloats() {\n    const blockStartEdgeOfBlockEndFloats =\n      this.pageFloatLayoutContext.getBlockStartEdgeOfBlockEndFloats();\n    if (\n      blockStartEdgeOfBlockEndFloats > 0 &&\n      isFinite(blockStartEdgeOfBlockEndFloats)\n    ) {\n      this.blockDistanceToBlockEndFloats =\n        this.getBoxDir() *\n        (blockStartEdgeOfBlockEndFloats -\n          this.beforeEdge -\n          this.computedBlockSize);\n    }\n  }\n\n  collectElementsOffset(): RepetitiveElement.ElementsOffset[] {\n    const repetitiveElements: RepetitiveElement.ElementsOffset[] = [];\n    for (let current: Column = this; current; current = current.pseudoParent) {\n      current.fragmentLayoutConstraints.forEach((constraint) => {\n        if (\n          RepetitiveElement.isInstanceOfRepetitiveElementsOwnerLayoutConstraint(\n            constraint,\n          )\n        ) {\n          const repetitiveElement = constraint.getRepetitiveElements();\n          repetitiveElements.push(repetitiveElement);\n        }\n        if (\n          Selectors.isInstanceOfAfterIfContinuesLayoutConstraint(constraint)\n        ) {\n          const repetitiveElement = constraint.getRepetitiveElements();\n          repetitiveElements.push(repetitiveElement);\n        }\n        if (Table.isInstanceOfTableRowLayoutConstraint(constraint)) {\n          constraint\n            .getElementsOffsetsForTableCell(this)\n            .forEach((repetitiveElement) => {\n              repetitiveElements.push(repetitiveElement);\n            });\n        }\n      });\n    }\n    return repetitiveElements;\n  }\n}\n\n/**\n * Represents a \"pseudo\"-column nested inside a real column.\n * This class is created to handle parallel fragmented flows (e.g. table columns\n * in a single table row). A pseudo-column behaves in the same way as the\n * original column, sharing its properties. Property changes on the\n * pseudo-column are not propagated to the original column. The LayoutContext of\n * the original column is also cloned and used by the pseudo-column, not to\n * propagate state changes of the LayoutContext caused by the pseudo-column.\n * @param column The original (parent) column\n * @param viewRoot Root element for the pseudo-column, i.e., the root of the\n *     fragmented flow.\n * @param parentNodeContext A NodeContext generating this PseudoColumn\n */\nexport class PseudoColumn {\n  startNodeContexts: Vtree.NodeContext[] = [];\n  private column: Layout.Column;\n  constructor(\n    column: Layout.Column,\n    viewRoot: HTMLElement,\n    parentNodeContext: Vtree.NodeContext,\n  ) {\n    this.column = Object.create(column) as Layout.Column;\n    this.column.element = viewRoot;\n    this.column.layoutContext = column.layoutContext.clone();\n    this.column.stopAtOverflow = false;\n    this.column.flowRootFormattingContext = parentNodeContext.formattingContext;\n    this.column.pseudoParent = column;\n    const parentClonedPaddingBorder =\n      this.column.calculateClonedPaddingBorder(parentNodeContext);\n    this.column.footnoteEdge =\n      this.column.footnoteEdge - parentClonedPaddingBorder;\n    const pseudoColumn = this;\n    this.column.openAllViews = function (position) {\n      return Column.prototype.openAllViews\n        .call(this, position)\n        .thenAsync((result) => {\n          pseudoColumn.startNodeContexts.push(result.copy());\n          return Task.newResult(result);\n        });\n    };\n  }\n  /**\n   * @param chunkPosition starting position.\n   * @return holding end position.\n   */\n  layout(\n    chunkPosition: Vtree.ChunkPosition,\n    leadingEdge: boolean,\n  ): Task.Result<Vtree.ChunkPosition> {\n    return this.column.layout(chunkPosition, leadingEdge);\n  }\n  findAcceptableBreakPosition(\n    allowBreakAtStartPosition: boolean,\n  ): Layout.BreakPositionAndNodeContext {\n    const p = this.column.findAcceptableBreakPosition();\n    if (allowBreakAtStartPosition) {\n      const startNodeContext = this.startNodeContexts[0].copy();\n      const bp = new BreakPosition.EdgeBreakPosition(\n        startNodeContext,\n        null,\n        startNodeContext.overflow,\n        0,\n      );\n      bp.findAcceptableBreak(this.column, 0);\n      if (!p.nodeContext) {\n        return { breakPosition: bp, nodeContext: startNodeContext };\n      }\n    }\n    return p;\n  }\n  /**\n   * @return holing true\n   */\n  finishBreak(\n    nodeContext: Vtree.NodeContext,\n    forceRemoveSelf: boolean,\n    endOfColumn: boolean,\n  ): Task.Result<boolean> {\n    return this.column.finishBreak(nodeContext, forceRemoveSelf, endOfColumn);\n  }\n  doFinishBreakOfFragmentLayoutConstraints(positionAfter: Vtree.NodeContext) {\n    this.column.doFinishBreakOfFragmentLayoutConstraints(positionAfter);\n  }\n  isStartNodeContext(nodeContext: Vtree.NodeContext): boolean {\n    const startNodeContext = this.startNodeContexts[0];\n    return (\n      startNodeContext.viewNode === nodeContext.viewNode &&\n      startNodeContext.after === nodeContext.after &&\n      startNodeContext.offsetInNode === nodeContext.offsetInNode\n    );\n  }\n  isLastAfterNodeContext(nodeContext: Vtree.NodeContext): boolean {\n    return VtreeImpl.isSameNodePosition(\n      nodeContext.toNodePosition(),\n      this.column.lastAfterPosition,\n    );\n  }\n  getColumnElement(): Element {\n    return this.column.element;\n  }\n  getColumn(): Layout.Column {\n    return this.column;\n  }\n}\n\nexport type SinglePageFloatLayoutResult = Layout.SinglePageFloatLayoutResult;\n\n/**\n * breaking point resolver for Text Node.\n */\nexport class TextNodeBreaker implements Layout.TextNodeBreaker {\n  breakTextNode(\n    textNode: Text,\n    nodeContext: Vtree.NodeContext,\n    low: number,\n    checkPoints: Vtree.NodeContext[],\n    checkpointIndex: number,\n    force: boolean,\n  ): Vtree.NodeContext {\n    if (nodeContext.after) {\n      nodeContext.offsetInNode = textNode.length;\n    } else {\n      // Character with index low is the last one that fits.\n      let viewIndex = low - nodeContext.boxOffset;\n      const text = textNode.data;\n      if (text.charCodeAt(viewIndex) == 173) {\n        viewIndex = this.breakAfterSoftHyphen(\n          textNode,\n          text,\n          viewIndex,\n          nodeContext,\n        );\n      } else {\n        viewIndex = this.breakAfterOtherCharacter(\n          textNode,\n          text,\n          viewIndex,\n          nodeContext,\n        );\n      }\n      if (viewIndex > 0) {\n        nodeContext = this.updateNodeContext(nodeContext, viewIndex, textNode);\n      }\n    }\n    return nodeContext;\n  }\n\n  breakAfterSoftHyphen(\n    textNode: Text,\n    text: string,\n    viewIndex: number,\n    nodeContext: Vtree.NodeContext,\n  ): number {\n    // convert trailing soft hyphen to a real hyphen\n    const checkJoiningType =\n      // /[\\p{Joining_Type=D}\\p{Joining_Type=C}]\\p{Mn}*$/\n      // eslint-disable-next-line no-misleading-character-class\n      /[\\u0620\\u0626\\u0628\\u062A-\\u062E\\u0633-\\u0647\\u0649\\u064A\\u066E\\u066F\\u0678-\\u0687\\u069A-\\u06BF\\u06C1\\u06C2\\u06CC\\u06CE\\u06D0\\u06D1\\u06FA-\\u06FC\\u06FF\\u0712-\\u0714\\u071A-\\u071D\\u071F-\\u0727\\u0729\\u072B\\u072D\\u072E\\u074E-\\u0758\\u075C-\\u076A\\u076D-\\u0770\\u0772\\u0775-\\u0777\\u077A-\\u077F\\u07CA-\\u07EA\\u07FA\\u0841-\\u0845\\u0848\\u084A-\\u0853\\u0855\\u0860\\u0862-\\u0865\\u0868\\u0883-\\u0886\\u0889-\\u088D\\u08A0-\\u08A9\\u08AF\\u08B0\\u08B3-\\u08B8\\u08BA-\\u08C8\\u1807\\u180A\\u1820-\\u1878\\u1887-\\u18A8\\u18AA\\u200D\\uA840-\\uA871\\u{10AC0}-\\u{10AC4}\\u{10AD3}-\\u{10AD6}\\u{10AD8}-\\u{10ADC}\\u{10ADE}-\\u{10AE0}\\u{10AEB}-\\u{10AEE}\\u{10B80}\\u{10B82}\\u{10B86}-\\u{10B88}\\u{10B8A}\\u{10B8B}\\u{10B8D}\\u{10B90}\\u{10BAD}\\u{10BAE}\\u{10D01}-\\u{10D21}\\u{10D23}\\u{10EC3}\\u{10EC4}\\u{10F30}-\\u{10F32}\\u{10F34}-\\u{10F44}\\u{10F51}-\\u{10F53}\\u{10F70}-\\u{10F73}\\u{10F76}-\\u{10F81}\\u{10FB0}\\u{10FB2}\\u{10FB3}\\u{10FB8}\\u{10FBB}\\u{10FBC}\\u{10FBE}\\u{10FBF}\\u{10FC1}\\u{10FC4}\\u{10FCA}\\u{1E900}-\\u{1E943}]\\p{Mn}*$/u;\n    const zwj = checkJoiningType.test(text.slice(0, viewIndex)) ? \"\\u200D\" : \"\";\n    textNode.replaceData(\n      viewIndex,\n      text.length - viewIndex,\n      !nodeContext.breakWord\n        ? zwj + resolveHyphenateCharacter(nodeContext)\n        : \"\",\n    );\n    if (zwj) {\n      const p = nodeContext.preprocessedTextContent[0][1] as string;\n      nodeContext.preprocessedTextContent[0][1] =\n        p.slice(0, viewIndex + 1) + zwj + p.slice(viewIndex + 1);\n    }\n    return viewIndex + 1;\n  }\n\n  breakAfterOtherCharacter(\n    textNode: Text,\n    text: string,\n    viewIndex: number,\n    nodeContext: Vtree.NodeContext,\n  ): number {\n    // keep the trailing character (it may be a space or not)\n    const ch0 = text.charAt(viewIndex);\n    viewIndex++;\n    const ch1 = text.charAt(viewIndex);\n\n    // If automatic hyphen was inserted here, add a real hyphen.\n    textNode.replaceData(\n      viewIndex,\n      text.length - viewIndex,\n      !nodeContext.breakWord && Base.isLetter(ch0) && Base.isLetter(ch1)\n        ? resolveHyphenateCharacter(nodeContext)\n        : \"\",\n    );\n    return viewIndex;\n  }\n\n  updateNodeContext(\n    nodeContext: Vtree.NodeContext,\n    viewIndex: number,\n    textNode: Text,\n  ): Vtree.NodeContext {\n    nodeContext = nodeContext.modify();\n    nodeContext.offsetInNode += viewIndex;\n    nodeContext.breakBefore = null;\n    return nodeContext;\n  }\n\n  static instance: TextNodeBreaker;\n}\nTextNodeBreaker.instance = new TextNodeBreaker();\n\nexport function resolveHyphenateCharacter(\n  nodeContext: Vtree.NodeContext,\n): string {\n  return (\n    nodeContext.hyphenateCharacter ||\n    (nodeContext.parent && nodeContext.parent.hyphenateCharacter) ||\n    \"-\"\n  );\n}\n\nexport class ColumnLayoutRetryer extends LayoutRetryers.AbstractLayoutRetryer {\n  breakAfter: string | null;\n  private initialPageBreakType: string | null = null;\n  initialComputedBlockSize: number = 0;\n  private initialOverflown: boolean = false;\n  context: { overflownNodeContext: Vtree.NodeContext } = {\n    overflownNodeContext: null,\n  };\n\n  constructor(\n    public readonly leadingEdge: boolean,\n    breakAfter?: string | null,\n  ) {\n    super();\n    this.breakAfter = breakAfter || null;\n  }\n\n  override resolveLayoutMode(\n    nodeContext: Vtree.NodeContext,\n  ): Layout.LayoutMode {\n    return new DefaultLayoutMode(\n      this.leadingEdge,\n      this.breakAfter,\n      this.context,\n    );\n  }\n\n  override prepareLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ) {\n    column.fragmentLayoutConstraints = [];\n    if (!column.pseudoParent) {\n      Shared.clearRepetitiveElementsCache();\n    }\n  }\n\n  override clearNodes(initialPosition: Vtree.NodeContext) {\n    super.clearNodes(initialPosition);\n    let nodeContext = initialPosition;\n    while (nodeContext) {\n      const viewNode = nodeContext.viewNode;\n      if (viewNode) {\n        LayoutHelper.removeFollowingSiblings(viewNode.parentNode, viewNode);\n      }\n      nodeContext = nodeContext.parent;\n    }\n  }\n\n  override saveState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n    super.saveState(nodeContext, column);\n    this.initialPageBreakType = column.pageBreakType;\n    this.initialComputedBlockSize = column.computedBlockSize;\n    this.initialOverflown = column.overflown;\n  }\n\n  override restoreState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n    super.restoreState(nodeContext, column);\n    column.pageBreakType = this.initialPageBreakType;\n    column.computedBlockSize = this.initialComputedBlockSize;\n    column.overflown = this.initialOverflown;\n  }\n}\n\nexport class DefaultLayoutMode implements Layout.LayoutMode {\n  constructor(\n    public readonly leadingEdge: boolean,\n    public readonly breakAfter: string | null,\n    public readonly context: { overflownNodeContext: Vtree.NodeContext },\n  ) {}\n\n  /** @override */\n  doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\n      \"DefaultLayoutMode.doLayout\",\n    );\n\n    processAfterIfContinuesOfAncestors(nodeContext, column).then(() => {\n      column\n        .doLayout(nodeContext, this.leadingEdge, this.breakAfter)\n        .then((result) => {\n          this.context.overflownNodeContext = result.overflownNodeContext;\n          frame.finish(result.nodeContext);\n        });\n    });\n    return frame.result();\n  }\n\n  /** @override */\n  accept(nodeContext: Vtree.NodeContext, column: Layout.Column): boolean {\n    if (column.pageFloatLayoutContext.isInvalidated() || column.pageBreakType) {\n      return true;\n    }\n    if (column.fragmentLayoutConstraints.length <= 0) {\n      return true;\n    }\n    return column.fragmentLayoutConstraints.every((constraint) =>\n      constraint.allowLayout(\n        nodeContext,\n        this.context.overflownNodeContext,\n        column,\n      ),\n    );\n  }\n\n  /** @override */\n  postLayout(\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: Layout.Column,\n    accepted: boolean,\n  ): boolean {\n    if (!accepted) {\n      const hasNextCandidate = column.fragmentLayoutConstraints.some(\n        (constraint) => constraint.nextCandidate(positionAfter),\n      );\n\n      // If there is no next candidate, we accept the current layout trial.\n      // Later Column#doFinishBreak decides whether the overflowing content\n      // should be placed as is or be deferred to the next column,\n      // depending on the value of Column#forceNonfitting.\n      accepted = !hasNextCandidate;\n    }\n    column.fragmentLayoutConstraints.forEach((constraint) => {\n      constraint.postLayout(accepted, positionAfter, initialPosition, column);\n    });\n    return accepted;\n  }\n}\n\nexport class PageFloatArea extends Column implements Layout.PageFloatArea {\n  private rootViewNodes: Element[] = [];\n  private floatMargins: GeometryUtil.Insets[] = [];\n  adjustContentRelativeSize: boolean = true;\n\n  constructor(\n    public readonly floatSide: string,\n    element: HTMLElement,\n    layoutContext: Vtree.LayoutContext,\n    clientLayout: Vtree.ClientLayout,\n    layoutConstraint: LayoutConstraint,\n    pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    public readonly parentContainer: Vtree.Container,\n  ) {\n    super(\n      element,\n      layoutContext,\n      clientLayout,\n      layoutConstraint,\n      pageFloatLayoutContext,\n    );\n  }\n\n  override openAllViews(\n    position: Vtree.NodePosition,\n  ): Task.Result<Vtree.NodeContext> {\n    return super.openAllViews(position).thenAsync((nodeContext) => {\n      if (nodeContext) {\n        this.fixFloatSizeAndPosition(nodeContext);\n      }\n      return Task.newResult(nodeContext);\n    });\n  }\n\n  convertPercentageSizesToPx(target: Element) {\n    const containingBlockRect = this.parentContainer.getPaddingRect();\n    const refWidth = containingBlockRect.x2 - containingBlockRect.x1;\n    const refHeight = containingBlockRect.y2 - containingBlockRect.y1;\n\n    function convertPercentageToPx(props: string[], refValue: number) {\n      props.forEach((propName) => {\n        const valueString = Base.getCSSProperty(target, propName);\n        if (valueString && valueString.charAt(valueString.length - 1) === \"%\") {\n          const percentageValue = parseFloat(valueString);\n          const value = (refValue * percentageValue) / 100;\n          Base.setCSSProperty(target, propName, `${value}px`);\n        }\n      });\n    }\n    convertPercentageToPx([\"width\", \"max-width\", \"min-width\"], refWidth);\n    convertPercentageToPx([\"height\", \"max-height\", \"min-height\"], refHeight);\n    convertPercentageToPx(\n      [\n        \"margin-top\",\n        \"margin-right\",\n        \"margin-bottom\",\n        \"margin-left\",\n        \"padding-top\",\n        \"padding-right\",\n        \"padding-bottom\",\n        \"padding-left\",\n      ],\n      this.vertical ? refHeight : refWidth,\n    );\n    [\"margin-top\", \"margin-right\", \"margin-bottom\", \"margin-left\"].forEach(\n      (propName) => {\n        const value = Base.getCSSProperty(target, propName);\n        if (value === \"auto\") {\n          Base.setCSSProperty(target, propName, \"0\");\n        }\n      },\n    );\n  }\n\n  fixFloatSizeAndPosition(nodeContext: Vtree.NodeContext) {\n    while (nodeContext.parent) {\n      nodeContext = nodeContext.parent;\n    }\n    Asserts.assert(nodeContext.viewNode.nodeType === 1);\n    const rootViewNode = nodeContext.viewNode as Element;\n    this.rootViewNodes.push(rootViewNode);\n    if (this.adjustContentRelativeSize) {\n      this.convertPercentageSizesToPx(rootViewNode);\n    }\n    this.floatMargins.push(this.getComputedMargin(rootViewNode));\n    if (this.adjustContentRelativeSize) {\n      const floatSide = this.floatSide;\n      const isVertical = this.parentContainer.vertical;\n      if (isVertical) {\n        if (floatSide === \"block-end\" || floatSide === \"left\") {\n          const height = Base.getCSSProperty(rootViewNode, \"height\");\n          if (height !== \"\" && height !== \"auto\") {\n            Base.setCSSProperty(rootViewNode, \"margin-top\", \"auto\");\n          }\n        }\n      } else {\n        if (floatSide === \"block-end\" || floatSide === \"bottom\") {\n          const width = Base.getCSSProperty(rootViewNode, \"width\");\n          if (width !== \"\" && width !== \"auto\") {\n            Base.setCSSProperty(rootViewNode, \"margin-left\", \"auto\");\n          }\n        }\n      }\n    }\n  }\n\n  getContentInlineSize(): number {\n    return Math.max.apply(\n      null,\n      this.rootViewNodes.map((r, i) => {\n        const box = LayoutHelper.getElementClientRectAdjusted(\n          this.clientLayout,\n          r,\n          this.vertical,\n        );\n        const margin = this.floatMargins[i];\n        return this.vertical\n          ? margin.top + box.height + margin.bottom\n          : margin.left + box.width + margin.right;\n      }),\n    );\n  }\n}\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview RepetitiveElement - Elements repeated in every fragment\n * by repeat-on-break property.\n */\nimport * as Asserts from \"./asserts\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as LayoutRetryers from \"./layout-retryers\";\nimport * as LayoutUtil from \"./layout-util\";\nimport * as Plugin from \"./plugin\";\nimport * as Shared from \"./shared\";\nimport * as Task from \"./task\";\nimport * as VtreeImpl from \"./vtree\";\nimport * as Layout from \"./layout\";\nimport {\n  FormattingContextType,\n  FragmentLayoutConstraintType,\n  Layout as LayoutType,\n  RepetitiveElement,\n  Table,\n  Vtree,\n} from \"./types\";\n\nexport class RepetitiveElementsOwnerFormattingContext\n  implements RepetitiveElement.RepetitiveElementsOwnerFormattingContext\n{\n  formattingContextType: FormattingContextType = \"RepetitiveElementsOwner\";\n  isRoot: boolean = false;\n  repetitiveElements: RepetitiveElement.RepetitiveElements = null;\n\n  constructor(\n    public readonly parent: Vtree.FormattingContext,\n    public readonly rootSourceNode: Element,\n  ) {}\n\n  /** @override */\n  getName(): string {\n    return \"Repetitive elements owner formatting context (RepetitiveElementsOwnerFormattingContext)\";\n  }\n\n  /** @override */\n  isFirstTime(nodeContext: Vtree.NodeContext, firstTime: boolean): boolean {\n    return firstTime;\n  }\n\n  /** @override */\n  getParent(): Vtree.FormattingContext {\n    return this.parent;\n  }\n\n  getRepetitiveElements(): RepetitiveElement.RepetitiveElements {\n    return this.repetitiveElements;\n  }\n\n  getRootViewNode(position: Vtree.NodeContext): Element | null {\n    const root = this.getRootNodeContext(position);\n    return root ? (root.viewNode as Element) : null;\n  }\n\n  getRootNodeContext(nodeContext: Vtree.NodeContext): Vtree.NodeContext | null {\n    do {\n      if (\n        !nodeContext.belongsTo(this) &&\n        nodeContext.sourceNode === this.rootSourceNode\n      ) {\n        return nodeContext;\n      }\n    } while ((nodeContext = nodeContext.parent));\n    return null;\n  }\n\n  initializeRepetitiveElements(vertical: boolean) {\n    if (this.repetitiveElements) {\n      return;\n    }\n    const found = Shared.repetitiveElementsCache.some((entry) => {\n      if (entry.root === this.rootSourceNode) {\n        this.repetitiveElements = entry.elements;\n        return true;\n      }\n      return false;\n    });\n    if (!found) {\n      this.repetitiveElements = new RepetitiveElements(\n        vertical,\n        this.rootSourceNode,\n      );\n      Shared.repetitiveElementsCache.push({\n        root: this.rootSourceNode,\n        elements: this.repetitiveElements,\n      });\n    }\n  }\n\n  /** @override */\n  saveState(): any {}\n\n  /** @override */\n  restoreState(state: any) {}\n}\n\nexport type ElementsOffset = RepetitiveElement.ElementsOffset;\n\nexport class RepetitiveElements\n  implements RepetitiveElement.RepetitiveElements\n{\n  private headerSourceNode: Element | null = null;\n  private footerSourceNode: Element | null = null;\n  private headerViewNode: Element | null = null;\n  private footerViewNode: Element | null = null;\n  private headerNodePosition: Vtree.NodePosition | null = null;\n  private footerNodePosition: Vtree.NodePosition | null = null;\n  private headerHeight: number = 0;\n  private footerHeight: number = 0;\n  isSkipHeader: boolean = false;\n  isSkipFooter: boolean = false;\n  enableSkippingFooter: boolean = true;\n  enableSkippingHeader: boolean = true;\n  doneInitialLayout: boolean = false;\n  firstContentSourceNode: Element | null = null;\n  lastContentSourceNode: Element | null = null;\n  private affectedNodeCache: {\n    nodeContext: Vtree.NodeContext;\n    result: boolean;\n  }[] = [];\n  private afterLastContentNodeCache: {\n    nodeContext: Vtree.NodeContext;\n    result: boolean;\n  }[] = [];\n  allowInsert: boolean = false;\n  allowInsertRepeatitiveElements: boolean;\n\n  constructor(\n    private readonly vertical: boolean,\n    public ownerSourceNode: Element,\n  ) {}\n\n  setHeaderNodeContext(nodeContext: Vtree.NodeContext) {\n    if (this.headerNodePosition) {\n      return; // use first one.\n    }\n    this.headerNodePosition = VtreeImpl.newNodePositionFromNodeContext(\n      nodeContext,\n      0,\n    );\n    this.headerSourceNode = nodeContext.sourceNode as Element;\n    this.headerViewNode = nodeContext.viewNode as Element;\n  }\n\n  setFooterNodeContext(nodeContext: Vtree.NodeContext) {\n    if (this.footerNodePosition) {\n      return; // use first one.\n    }\n    this.footerNodePosition = VtreeImpl.newNodePositionFromNodeContext(\n      nodeContext,\n      0,\n    );\n    this.footerSourceNode = nodeContext.sourceNode as Element;\n    this.footerViewNode = nodeContext.viewNode as Element;\n  }\n\n  updateHeight(column: LayoutType.Column) {\n    if (this.headerViewNode) {\n      this.headerHeight = LayoutHelper.getElementHeight(\n        this.headerViewNode,\n        column,\n        this.vertical,\n      );\n      this.headerViewNode = null;\n    }\n    if (this.footerViewNode) {\n      this.footerHeight = LayoutHelper.getElementHeight(\n        this.footerViewNode,\n        column,\n        this.vertical,\n      );\n      this.footerViewNode = null;\n    }\n  }\n\n  prepareLayoutFragment() {\n    this.isSkipHeader = this.isSkipFooter = false;\n    this.enableSkippingFooter = true;\n    this.enableSkippingHeader = true;\n  }\n\n  appendHeaderToFragment(\n    rootNodeContext: Vtree.NodeContext,\n    firstChild: Node | null,\n    column: LayoutType.Column,\n  ): Task.Result<boolean> {\n    if (!this.headerNodePosition || this.isSkipHeader) {\n      return Task.newResult(true);\n    }\n    return this.appendElementToFragment(\n      this.headerNodePosition,\n      rootNodeContext,\n      firstChild,\n      column,\n    );\n  }\n\n  appendFooterToFragment(\n    rootNodeContext: Vtree.NodeContext,\n    firstChild: Node | null,\n    column: LayoutType.Column,\n  ): Task.Result<boolean> {\n    if (!this.footerNodePosition || this.isSkipFooter) {\n      return Task.newResult(true);\n    }\n    return this.appendElementToFragment(\n      this.footerNodePosition,\n      rootNodeContext,\n      firstChild,\n      column,\n    );\n  }\n\n  appendElementToFragment(\n    nodePosition: Vtree.NodePosition,\n    rootNodeContext: Vtree.NodeContext,\n    firstChild: Node | null,\n    column: LayoutType.Column,\n  ): Task.Result<boolean> {\n    const doc = rootNodeContext.viewNode.ownerDocument;\n    const rootViewNode = rootNodeContext.viewNode as Element;\n    const viewRoot = doc.createElement(\"div\");\n    rootViewNode.appendChild(viewRoot);\n    const pseudoColumn = new Layout.PseudoColumn(\n      column,\n      viewRoot,\n      rootNodeContext,\n    );\n    const initialPageBreakType = pseudoColumn.getColumn().pageBreakType;\n    pseudoColumn.getColumn().pageBreakType = null;\n    this.allowInsertRepeatitiveElements = true;\n    return pseudoColumn\n      .layout(new VtreeImpl.ChunkPosition(nodePosition), true)\n      .thenAsync(() => {\n        this.allowInsertRepeatitiveElements = false;\n        rootViewNode.removeChild(viewRoot);\n        this.moveChildren(viewRoot, rootViewNode, firstChild);\n        pseudoColumn.getColumn().pageBreakType = initialPageBreakType;\n        return Task.newResult(true);\n      });\n  }\n\n  moveChildren(from: Element, to: Element, firstChild: Node | null) {\n    if (!to) {\n      return;\n    }\n    while (from.firstChild) {\n      const child = from.firstChild;\n      from.removeChild(child);\n      (child as Element).setAttribute(LayoutHelper.SPECIAL_ATTR, \"1\");\n      if (firstChild) {\n        to.insertBefore(child, firstChild);\n      } else {\n        to.appendChild(child);\n      }\n    }\n  }\n\n  /** @override */\n  calculateOffset(nodeContext: Vtree.NodeContext): number {\n    let offset = 0;\n    if (nodeContext && !this.affectTo(nodeContext)) {\n      return offset;\n    }\n    if (\n      !this.isSkipFooter ||\n      (nodeContext && this.isAfterLastContent(nodeContext))\n    ) {\n      offset += this.footerHeight;\n    }\n    if (!this.isSkipHeader) {\n      offset += this.headerHeight;\n    }\n    return offset;\n  }\n\n  /** @override */\n  calculateMinimumOffset(nodeContext: Vtree.NodeContext): number {\n    let offset = 0;\n    if (nodeContext && !this.affectTo(nodeContext)) {\n      return offset;\n    }\n    if (\n      !this.enableSkippingFooter &&\n      nodeContext &&\n      this.isAfterLastContent(nodeContext)\n    ) {\n      offset += this.footerHeight;\n    }\n    if (!this.enableSkippingHeader) {\n      offset += this.headerHeight;\n    }\n    return offset;\n  }\n\n  isAfterLastContent(nodeContext: Vtree.NodeContext): boolean {\n    return this.findResultFromCache(\n      nodeContext,\n      this.afterLastContentNodeCache,\n      (nc) =>\n        this.isAfterNodeContextOf(\n          this.lastContentSourceNode as Element,\n          nodeContext,\n          false,\n        ),\n    );\n  }\n\n  private affectTo(nodeContext: Vtree.NodeContext): boolean {\n    return this.findResultFromCache(nodeContext, this.affectedNodeCache, (nc) =>\n      this.isAfterNodeContextOf(this.ownerSourceNode, nodeContext, true),\n    );\n  }\n\n  private findResultFromCache(\n    nodeContext: Vtree.NodeContext,\n    cache: { nodeContext: Vtree.NodeContext; result: boolean }[],\n    calculator: (p1: Vtree.NodeContext) => boolean,\n  ): boolean {\n    const cacheEntry = cache.filter(\n      (cache) =>\n        cache.nodeContext.sourceNode === nodeContext.sourceNode &&\n        cache.nodeContext.after === nodeContext.after,\n    );\n    if (cacheEntry.length > 0) {\n      return cacheEntry[0].result;\n    } else {\n      const result = calculator(nodeContext);\n      cache.push({ nodeContext, result });\n      return result;\n    }\n  }\n\n  private isAfterNodeContextOf(\n    node: Element,\n    nodeContext: Vtree.NodeContext,\n    includeChildren: boolean,\n  ): boolean {\n    const parentsOfNode = [];\n    for (let n: Node | null = node; n; n = n.parentNode) {\n      if (nodeContext.sourceNode === n) {\n        return nodeContext.after;\n      } else {\n        parentsOfNode.push(n);\n      }\n    }\n    for (\n      let currentParent: Node | null = nodeContext.sourceNode;\n      currentParent;\n      currentParent = currentParent.parentNode\n    ) {\n      const index = parentsOfNode.indexOf(currentParent);\n      if (index >= 0) {\n        return includeChildren ? index === 0 : false;\n      } else {\n        for (\n          let current: Element | null = currentParent as Element;\n          current;\n          current = current.previousElementSibling\n        ) {\n          if (parentsOfNode.includes(current)) {\n            return true;\n          }\n        }\n      }\n    }\n    return nodeContext.after;\n  }\n\n  isFirstContentNode(nodeContext: Vtree.NodeContext): boolean {\n    return (\n      nodeContext && this.firstContentSourceNode === nodeContext.sourceNode\n    );\n  }\n\n  isEnableToUpdateState(): boolean {\n    if (\n      (!this.isSkipFooter &&\n        this.enableSkippingFooter &&\n        this.footerNodePosition) ||\n      (!this.isSkipHeader &&\n        this.enableSkippingHeader &&\n        this.headerNodePosition)\n    ) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  updateState() {\n    if (\n      !this.isSkipFooter &&\n      this.enableSkippingFooter &&\n      this.footerNodePosition\n    ) {\n      this.isSkipFooter = true;\n    } else if (\n      !this.isSkipHeader &&\n      this.enableSkippingHeader &&\n      this.headerNodePosition\n    ) {\n      this.isSkipHeader = true;\n    }\n  }\n\n  preventSkippingHeader() {\n    this.isSkipHeader = false;\n    this.enableSkippingHeader = false;\n  }\n\n  preventSkippingFooter() {\n    this.isSkipFooter = false;\n    this.enableSkippingFooter = false;\n  }\n\n  isHeaderRegistered(): boolean {\n    return !!this.headerNodePosition;\n  }\n\n  isFooterRegistered(): boolean {\n    return !!this.footerNodePosition;\n  }\n\n  isHeaderSourceNode(node: Node): boolean {\n    return this.headerSourceNode === node;\n  }\n\n  isFooterSourceNode(node: Node): boolean {\n    return this.footerSourceNode === node;\n  }\n}\n\n/**\n * @abstract\n */\nexport abstract class LayoutEntireBlock implements LayoutType.LayoutMode {\n  constructor(\n    public formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n  ) {}\n\n  /** @override */\n  abstract doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext>;\n\n  /** @override */\n  accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n    return !!nodeContext;\n  }\n\n  /** @override */\n  postLayout(\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: LayoutType.Column,\n    accepted: boolean,\n  ): boolean {\n    const repetitiveElements = this.formattingContext.getRepetitiveElements();\n    if (repetitiveElements) {\n      Asserts.assert(column.clientLayout);\n      if (!repetitiveElements.doneInitialLayout) {\n        repetitiveElements.updateHeight(column);\n        repetitiveElements.doneInitialLayout = true;\n      }\n    }\n    return accepted;\n  }\n}\n\n/**\n * @abstract\n */\nexport abstract class LayoutFragmentedBlock implements LayoutType.LayoutMode {\n  constructor(\n    public formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n  ) {}\n\n  /** @override */\n  abstract doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext>;\n\n  /** @override */\n  accept(nodeContext: Vtree.NodeContext, column: LayoutType.Column): boolean {\n    return true;\n  }\n\n  /** @override */\n  postLayout(\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: LayoutType.Column,\n    accepted: boolean,\n  ): boolean {\n    return accepted;\n  }\n}\n\nexport class LayoutEntireOwnerBlock extends LayoutEntireBlock {\n  constructor(\n    formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n    public readonly processor: RepetitiveElementsOwnerLayoutProcessor,\n  ) {\n    super(formattingContext);\n  }\n\n  override doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    // FIXME: LayoutEntireBlock.prototype.doLayout is undefined because it's abstract method.\n    //        Probably, removing this call is ok.\n    // LayoutEntireBlock.prototype.doLayout.call(this, nodeContext, column);\n    return this.processor.doInitialLayout(nodeContext, column);\n  }\n\n  override accept(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): boolean {\n    return false;\n  }\n}\n\nexport class LayoutFragmentedOwnerBlock extends LayoutFragmentedBlock {\n  constructor(\n    formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n    public readonly processor: RepetitiveElementsOwnerLayoutProcessor,\n  ) {\n    super(formattingContext);\n  }\n\n  override doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    if (!nodeContext.belongsTo(this.formattingContext) && !nodeContext.after) {\n      column.fragmentLayoutConstraints.unshift(\n        new RepetitiveElementsOwnerLayoutConstraint(nodeContext),\n      );\n    }\n    return this.processor.doLayout(nodeContext, column);\n  }\n}\n\nexport class RepetitiveElementsOwnerLayoutConstraint\n  implements RepetitiveElement.RepetitiveElementsOwnerLayoutConstraint\n{\n  flagmentLayoutConstraintType: FragmentLayoutConstraintType =\n    \"RepetitiveElementsOwner\";\n  nodeContext: Vtree.NodeContext;\n\n  constructor(nodeContext: Vtree.NodeContext) {\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      nodeContext.formattingContext,\n    );\n    this.nodeContext = formattingContext.getRootNodeContext(nodeContext);\n  }\n\n  /** @override */\n  allowLayout(\n    nodeContext: Vtree.NodeContext,\n    overflownNodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): boolean {\n    const repetitiveElements = this.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return true;\n    }\n    if (LayoutHelper.isOrphan(this.nodeContext.viewNode)) {\n      return true;\n    }\n    if (!repetitiveElements.isEnableToUpdateState()) {\n      return true;\n    }\n    if (\n      (overflownNodeContext && !nodeContext) ||\n      (nodeContext && nodeContext.overflow)\n    ) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  /** @override */\n  nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n    const repetitiveElements = this.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return false;\n    }\n    if (repetitiveElements.isEnableToUpdateState()) {\n      repetitiveElements.updateState();\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  /** @override */\n  postLayout(\n    allowed: boolean,\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ) {\n    const repetitiveElements = this.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return;\n    }\n    if (allowed) {\n      if (column.stopAtOverflow) {\n        if (\n          positionAfter == null ||\n          repetitiveElements.isAfterLastContent(positionAfter)\n        ) {\n          repetitiveElements.preventSkippingFooter();\n        }\n      }\n    }\n  }\n\n  /** @override */\n  finishBreak(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<boolean> {\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      this.nodeContext.formattingContext,\n    );\n    const repetitiveElements = this.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return Task.newResult(true);\n    }\n    const rootNodeContext = this.nodeContext;\n    return appendHeader(formattingContext, rootNodeContext, column).thenAsync(\n      () =>\n        appendFooter(formattingContext, rootNodeContext, column).thenAsync(\n          () => {\n            repetitiveElements.prepareLayoutFragment();\n            return Task.newResult(true);\n          },\n        ),\n    );\n  }\n\n  getRepetitiveElements(): RepetitiveElement.RepetitiveElements {\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      this.nodeContext.formattingContext,\n    );\n    return formattingContext.getRepetitiveElements();\n  }\n\n  /** @override */\n  equalsTo(constraint: LayoutType.FragmentLayoutConstraint): boolean {\n    if (!(constraint instanceof RepetitiveElementsOwnerLayoutConstraint)) {\n      return false;\n    }\n    return (\n      getRepetitiveElementsOwnerFormattingContext(\n        this.nodeContext.formattingContext,\n      ) ===\n      getRepetitiveElementsOwnerFormattingContext(\n        constraint.nodeContext.formattingContext,\n      )\n    );\n  }\n\n  /** @override */\n  getPriorityOfFinishBreak(): number {\n    return 10;\n  }\n}\n\nexport class RepetitiveElementsOwnerLayoutRetryer extends LayoutRetryers.AbstractLayoutRetryer {\n  constructor(\n    public readonly formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n    private readonly processor: RepetitiveElementsOwnerLayoutProcessor,\n  ) {\n    super();\n  }\n\n  override resolveLayoutMode(\n    nodeContext: Vtree.NodeContext,\n  ): LayoutType.LayoutMode {\n    const repetitiveElements = this.formattingContext.getRepetitiveElements();\n    if (\n      !nodeContext.belongsTo(this.formattingContext) &&\n      !repetitiveElements.doneInitialLayout\n    ) {\n      return new LayoutEntireOwnerBlock(this.formattingContext, this.processor);\n    } else {\n      if (\n        !nodeContext.belongsTo(this.formattingContext) &&\n        !nodeContext.after\n      ) {\n        if (repetitiveElements) {\n          repetitiveElements.preventSkippingHeader();\n        }\n      }\n      return new LayoutFragmentedOwnerBlock(\n        this.formattingContext,\n        this.processor,\n      );\n    }\n  }\n}\n\nexport class EntireBlockLayoutStrategy extends LayoutUtil.EdgeSkipper {\n  constructor(\n    public readonly formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n    public readonly column: LayoutType.Column,\n  ) {\n    super();\n  }\n\n  override startNonInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    const formattingContext = this.formattingContext;\n    const nodeContext = state.nodeContext;\n    const repetitiveElements = formattingContext.getRepetitiveElements();\n    if (\n      nodeContext.parent &&\n      formattingContext.rootSourceNode === nodeContext.parent.sourceNode\n    ) {\n      switch (nodeContext.repeatOnBreak) {\n        case \"header\":\n          if (!repetitiveElements.isHeaderRegistered()) {\n            repetitiveElements.setHeaderNodeContext(nodeContext);\n            return Task.newResult(true);\n          } else {\n            nodeContext.repeatOnBreak = \"none\";\n          }\n          break;\n        case \"footer\":\n          if (!repetitiveElements.isFooterRegistered()) {\n            repetitiveElements.setFooterNodeContext(nodeContext);\n            return Task.newResult(true);\n          } else {\n            nodeContext.repeatOnBreak = \"none\";\n          }\n          break;\n      }\n      if (!repetitiveElements.firstContentSourceNode) {\n        repetitiveElements.firstContentSourceNode =\n          nodeContext.sourceNode as Element;\n      }\n    }\n    return LayoutUtil.EdgeSkipper.prototype.startNonInlineElementNode.call(\n      this,\n      state,\n    );\n  }\n\n  override afterNonInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    const formattingContext = this.formattingContext;\n    const nodeContext = state.nodeContext;\n    if (nodeContext.sourceNode === formattingContext.rootSourceNode) {\n      formattingContext.getRepetitiveElements().lastContentSourceNode =\n        state.lastAfterNodeContext &&\n        (state.lastAfterNodeContext.sourceNode as Element);\n      state.break = true;\n    }\n    if (\n      nodeContext.repeatOnBreak === \"header\" ||\n      nodeContext.repeatOnBreak === \"footer\"\n    ) {\n      return Task.newResult(true);\n    } else {\n      return LayoutUtil.EdgeSkipper.prototype.afterNonInlineElementNode.call(\n        this,\n        state,\n      );\n    }\n  }\n}\n\nexport class FragmentedBlockLayoutStrategy extends LayoutUtil.EdgeSkipper {\n  constructor(\n    public readonly formattingContext: RepetitiveElementsOwnerFormattingContext,\n    public readonly column: LayoutType.Column,\n  ) {\n    super();\n  }\n}\n\nexport class RepetitiveElementsOwnerLayoutProcessor\n  extends LayoutProcessor.BlockLayoutProcessor\n  implements LayoutProcessor.LayoutProcessor\n{\n  layout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n    leadingEdge: boolean,\n  ): Task.Result<Vtree.NodeContext> {\n    if (column.isFloatNodeContext(nodeContext)) {\n      return column.layoutFloatOrFootnote(nodeContext);\n    }\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const rootViewNode = formattingContext.getRootViewNode(nodeContext);\n    if (!rootViewNode) {\n      return column.buildDeepElementView(nodeContext);\n    } else {\n      if (leadingEdge) {\n        appendHeaderToAncestors(nodeContext.parent, column);\n      }\n      if (!nodeContext.belongsTo(formattingContext)) {\n        return new RepetitiveElementsOwnerLayoutRetryer(\n          formattingContext,\n          this,\n        ).layout(nodeContext, column);\n      } else {\n        return LayoutProcessor.BlockLayoutProcessor.prototype.layout.call(\n          this,\n          nodeContext,\n          column,\n          leadingEdge,\n        );\n      }\n    }\n  }\n\n  startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n    const formattingContext =\n      getRepetitiveElementsOwnerFormattingContextOrNull(nodeContext);\n    const repetitiveElements = formattingContext.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return false;\n    }\n    if (\n      !repetitiveElements.allowInsertRepeatitiveElements &&\n      (repetitiveElements.isHeaderSourceNode(nodeContext.sourceNode) ||\n        repetitiveElements.isFooterSourceNode(nodeContext.sourceNode))\n    ) {\n      nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n    }\n    return false;\n  }\n\n  doInitialLayout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const frame = Task.newFrame<Vtree.NodeContext>(\n      \"BlockLayoutProcessor.doInitialLayout\",\n    );\n    this.layoutEntireBlock(nodeContext, column).thenFinish(frame);\n    return frame.result();\n  }\n\n  private layoutEntireBlock(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const strategy = new EntireBlockLayoutStrategy(formattingContext, column);\n    const iterator = new LayoutUtil.LayoutIterator(\n      strategy,\n      column.layoutContext,\n    );\n    return iterator.iterate(nodeContext);\n  }\n\n  doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: LayoutType.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getRepetitiveElementsOwnerFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"doLayout\");\n    const cont = column.layoutContext.nextInTree(nodeContext, false);\n    Layout.processAfterIfContinues(cont, column).then((resNodeContext) => {\n      let nextNodeContext = resNodeContext;\n      frame\n        .loopWithFrame((loopFrame) => {\n          while (nextNodeContext) {\n            let pending = true;\n            column\n              .layoutNext(nextNodeContext, false)\n              .then((nodeContextParam) => {\n                nextNodeContext = nodeContextParam;\n                if (column.pageFloatLayoutContext.isInvalidated()) {\n                  loopFrame.breakLoop();\n                } else if (column.pageBreakType) {\n                  loopFrame.breakLoop(); // Loop end\n                } else if (\n                  nextNodeContext &&\n                  column.stopByOverflow(nextNodeContext)\n                ) {\n                  loopFrame.breakLoop(); // Loop end\n                } else if (\n                  nextNodeContext &&\n                  nextNodeContext.after &&\n                  nextNodeContext.sourceNode == formattingContext.rootSourceNode\n                ) {\n                  loopFrame.breakLoop(); // Loop end\n                } else {\n                  if (pending) {\n                    // Sync case\n                    pending = false;\n                  } else {\n                    // Async case\n                    loopFrame.continueLoop();\n                  }\n                }\n              });\n            if (pending) {\n              // Async case and loop end\n              pending = false;\n              return;\n            }\n          }\n\n          // Sync case\n          loopFrame.breakLoop();\n        })\n        .then(() => {\n          frame.finish(nextNodeContext);\n        });\n    });\n    return frame.result();\n  }\n\n  override finishBreak(\n    column: LayoutType.Column,\n    nodeContext: Vtree.NodeContext,\n    forceRemoveSelf: boolean,\n    endOfColumn: boolean,\n  ): Task.Result<boolean> | null {\n    return LayoutProcessor.BlockLayoutProcessor.prototype.finishBreak.call(\n      this,\n      column,\n      nodeContext,\n      forceRemoveSelf,\n      endOfColumn,\n    );\n  }\n\n  override clearOverflownViewNodes(\n    column: LayoutType.Column,\n    parentNodeContext: Vtree.NodeContext,\n    nodeContext: Vtree.NodeContext,\n    removeSelf: boolean,\n  ) {\n    LayoutProcessor.BlockLayoutProcessor.prototype.clearOverflownViewNodes(\n      column,\n      parentNodeContext,\n      nodeContext,\n      removeSelf,\n    );\n  }\n}\n\nfunction eachAncestorNodeContext(\n  nodeContext: Vtree.NodeContext,\n  callback: (\n    p1: RepetitiveElementsOwnerFormattingContext,\n    p2: Vtree.NodeContext,\n  ) => any,\n): void {\n  for (let nc = nodeContext; nc; nc = nc.parent) {\n    const formattingContext = nc.formattingContext;\n    if (\n      formattingContext &&\n      formattingContext instanceof RepetitiveElementsOwnerFormattingContext &&\n      !nc.belongsTo(formattingContext)\n    ) {\n      callback(formattingContext, nc);\n    }\n  }\n}\n\nexport function appendHeaderToAncestors(\n  nodeContext: Vtree.NodeContext,\n  column: LayoutType.Column,\n): void {\n  if (!nodeContext) {\n    return;\n  }\n  eachAncestorNodeContext(\n    nodeContext.after ? nodeContext.parent : nodeContext,\n    (formattingContext, nc) => {\n      if (Table.isInstanceOfTableFormattingContext(formattingContext)) {\n        return;\n      }\n      column.fragmentLayoutConstraints.push(\n        new RepetitiveElementsOwnerLayoutConstraint(nc),\n      );\n    },\n  );\n}\n\nexport function appendHeader(\n  formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n  nodeContext: Vtree.NodeContext,\n  column: LayoutType.Column,\n): Task.Result<boolean> {\n  const repetitiveElements = formattingContext.getRepetitiveElements();\n  if (repetitiveElements) {\n    const rootNodeContext = formattingContext.getRootNodeContext(nodeContext);\n    if (rootNodeContext.viewNode) {\n      const firstChild = rootNodeContext.viewNode.firstChild;\n      return repetitiveElements.appendHeaderToFragment(\n        rootNodeContext,\n        firstChild,\n        column,\n      );\n    }\n  }\n  return Task.newResult(true);\n}\n\nexport function appendFooter(\n  formattingContext: RepetitiveElement.RepetitiveElementsOwnerFormattingContext,\n  nodeContext: Vtree.NodeContext,\n  column: LayoutType.Column,\n): Task.Result<boolean> {\n  const repetitiveElements = formattingContext.getRepetitiveElements();\n  if (repetitiveElements) {\n    if (!repetitiveElements.isSkipFooter) {\n      const rootNodeContext = formattingContext.getRootNodeContext(nodeContext);\n      if (rootNodeContext.viewNode) {\n        return repetitiveElements.appendFooterToFragment(\n          rootNodeContext,\n          null,\n          column,\n        );\n      }\n    }\n  }\n  return Task.newResult(true);\n}\n\nfunction getRepetitiveElementsOwnerFormattingContextOrNull(\n  nodeContext: Vtree.NodeContext,\n): RepetitiveElement.RepetitiveElementsOwnerFormattingContext | null {\n  const formattingContext = nodeContext.formattingContext;\n  if (!formattingContext) {\n    return null;\n  }\n  if (\n    !(formattingContext instanceof RepetitiveElementsOwnerFormattingContext)\n  ) {\n    return null;\n  }\n  return formattingContext;\n}\n\nfunction getRepetitiveElementsOwnerFormattingContext(\n  formattingContext: Vtree.FormattingContext,\n): RepetitiveElement.RepetitiveElementsOwnerFormattingContext {\n  Asserts.assert(\n    formattingContext instanceof RepetitiveElementsOwnerFormattingContext,\n  );\n  return formattingContext as RepetitiveElement.RepetitiveElementsOwnerFormattingContext;\n}\n\nconst repetitiveLayoutProcessor = new RepetitiveElementsOwnerLayoutProcessor();\n\nPlugin.registerHook(\n  Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n  (formattingContext) => {\n    if (\n      formattingContext instanceof RepetitiveElementsOwnerFormattingContext &&\n      !Table.isInstanceOfTableFormattingContext(formattingContext)\n    ) {\n      return repetitiveLayoutProcessor;\n    }\n    return null;\n  },\n);\n","/**\n * Copyright 2016 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Table - Table formatting context and layout.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as BreakPosition from \"./break-position\";\nimport * as Css from \"./css\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as LayoutRetryers from \"./layout-retryers\";\nimport * as LayoutUtil from \"./layout-util\";\nimport * as Plugin from \"./plugin\";\nimport * as RepetitiveElementImpl from \"./repetitive-element\";\nimport * as Task from \"./task\";\nimport * as Vgen from \"./vgen\";\nimport * as VtreeImpl from \"./vtree\";\nimport * as Layout from \"./layout\";\nimport {\n  FormattingContextType,\n  FragmentLayoutConstraintType,\n  Layout as LayoutType,\n  RepetitiveElement,\n  Table,\n  Vtree,\n} from \"./types\";\n\nexport class TableRow {\n  cells: TableCell[] = [];\n\n  constructor(\n    public readonly rowIndex: number,\n    public readonly sourceNode: Node,\n  ) {}\n\n  addCell(cell: TableCell) {\n    this.cells.push(cell);\n  }\n\n  getMinimumHeight(): number {\n    return Math.min.apply(\n      null,\n      this.cells.map((c) => c.height),\n    );\n  }\n}\n\nexport class TableCell {\n  viewElement: Element | null;\n  colSpan: number;\n  rowSpan: number;\n  height: number = 0;\n  anchorSlot: TableSlot = null;\n\n  constructor(\n    public readonly rowIndex: number,\n    public readonly columnIndex: number,\n    viewElement: Element,\n  ) {\n    this.viewElement = viewElement;\n    this.colSpan = (viewElement as HTMLTableCellElement).colSpan || 1;\n    this.rowSpan = (viewElement as HTMLTableCellElement).rowSpan || 1;\n  }\n\n  setHeight(height: number) {\n    this.height = height;\n  }\n\n  setAnchorSlot(slot: TableSlot) {\n    this.anchorSlot = slot;\n  }\n}\n\nexport class TableSlot {\n  constructor(\n    public readonly rowIndex: number,\n    public readonly columnIndex: number,\n    public readonly cell: TableCell,\n  ) {}\n}\n\nexport class TableCellFragment {\n  pseudoColumn: Layout.PseudoColumn;\n  empty: boolean = false;\n\n  constructor(\n    public readonly column: Layout.Column,\n    pseudoColumnContainer: HTMLElement,\n    public readonly cellNodeContext: Vtree.NodeContext,\n  ) {\n    this.pseudoColumn = new Layout.PseudoColumn(\n      column,\n      pseudoColumnContainer,\n      cellNodeContext,\n    );\n  }\n\n  findAcceptableBreakPosition(): Layout.BreakPositionAndNodeContext {\n    const element = this.cellNodeContext.viewNode as HTMLElement;\n    const { verticalAlign, alignContent } = element.style;\n    if (verticalAlign !== \"top\" && verticalAlign !== \"baseline\") {\n      Base.setCSSProperty(element, \"vertical-align\", \"top\");\n    }\n    if (alignContent && alignContent !== \"normal\") {\n      Base.setCSSProperty(element, \"align-content\", \"normal\");\n    }\n    const bp = this.pseudoColumn.findAcceptableBreakPosition(true);\n    Base.setCSSProperty(element, \"vertical-align\", verticalAlign);\n    if (alignContent && alignContent !== \"normal\") {\n      Base.setCSSProperty(element, \"align-content\", alignContent);\n    }\n    return bp;\n  }\n}\n\nexport class TableCaptionView {\n  constructor(\n    public readonly viewNode: Element,\n    public readonly side: string,\n  ) {}\n}\n\nexport class BetweenTableRowBreakPosition extends BreakPosition.EdgeBreakPosition {\n  private formattingContext: TableFormattingContext;\n\n  acceptableCellBreakPositions: Layout.BreakPositionAndNodeContext[] = null;\n  private rowIndex: number | null = null;\n\n  constructor(\n    position: Vtree.NodeContext,\n    breakOnEdge: string | null,\n    overflows: boolean,\n    columnBlockSize: number,\n  ) {\n    super(position, breakOnEdge, overflows, columnBlockSize);\n    this.formattingContext =\n      position.formattingContext as TableFormattingContext;\n  }\n\n  override findAcceptableBreak(\n    column: Layout.Column,\n    penalty: number,\n  ): Vtree.NodeContext {\n    const breakNodeContext = super.findAcceptableBreak(column, penalty);\n    if (penalty < this.getMinBreakPenalty()) {\n      return null;\n    }\n    const allCellsBreakable = this.getAcceptableCellBreakPositions().every(\n      (bp) => !!bp.nodeContext,\n    );\n    if (allCellsBreakable) {\n      return breakNodeContext;\n    } else {\n      return null;\n    }\n  }\n\n  override getMinBreakPenalty(): number {\n    let penalty = super.getMinBreakPenalty();\n    this.getAcceptableCellBreakPositions().forEach((bp) => {\n      penalty += bp.breakPosition.getMinBreakPenalty();\n    });\n    const cellFragments = this.getCellFragments();\n    penalty += Math.max(\n      0,\n      ...cellFragments.map((cf) => cf.cellNodeContext.breakPenalty),\n    );\n    return penalty;\n  }\n\n  getAcceptableCellBreakPositions(): Layout.BreakPositionAndNodeContext[] {\n    if (!this.acceptableCellBreakPositions) {\n      const formattingContext = this.formattingContext;\n      const cellFragments = this.getCellFragments();\n      this.acceptableCellBreakPositions = cellFragments.map((cellFragment) =>\n        cellFragment.findAcceptableBreakPosition(),\n      );\n    }\n    return this.acceptableCellBreakPositions;\n  }\n\n  private getRowIndex(): number {\n    if (this.rowIndex != null) {\n      return this.rowIndex;\n    }\n    return (this.rowIndex = this.formattingContext.findRowIndexBySourceNode(\n      this.position.sourceNode,\n    ));\n  }\n\n  private getCellFragments() {\n    return this.formattingContext\n      .getRowSpanningCellsOverflowingTheRow(this.getRowIndex())\n      .map(\n        this.formattingContext.getCellFragmentOfCell,\n        this.formattingContext,\n      );\n  }\n}\n\nexport class InsideTableRowBreakPosition extends BreakPosition.AbstractBreakPosition {\n  acceptableCellBreakPositions: Layout.BreakPositionAndNodeContext[] = null;\n\n  constructor(\n    public readonly rowIndex: number,\n    public readonly beforeNodeContext: Vtree.NodeContext,\n    public readonly formattingContext: TableFormattingContext,\n  ) {\n    super();\n  }\n\n  override findAcceptableBreak(\n    column: Layout.Column,\n    penalty: number,\n  ): Vtree.NodeContext {\n    if (\n      this !== column.breakPositions[0] && // Fix for issue #1458, case 2\n      penalty < this.getMinBreakPenalty()\n    ) {\n      return null;\n    }\n    const cellFragments = this.getCellFragments();\n    const acceptableCellBreakPositions = this.getAcceptableCellBreakPositions();\n    const allCellsBreakable =\n      acceptableCellBreakPositions.every((bp) => !!bp.nodeContext) &&\n      acceptableCellBreakPositions.some((bp, index) => {\n        const pseudoColumn = cellFragments[index].pseudoColumn;\n        const nodeContext = bp.nodeContext;\n        return (\n          !pseudoColumn.isStartNodeContext(nodeContext) &&\n          !pseudoColumn.isLastAfterNodeContext(nodeContext)\n        );\n      });\n    this.beforeNodeContext.overflow = acceptableCellBreakPositions.some(\n      (bp) => bp.nodeContext && bp.nodeContext.overflow,\n    );\n    if (allCellsBreakable) {\n      return this.beforeNodeContext;\n    } else {\n      return null;\n    }\n  }\n\n  override getMinBreakPenalty(): number {\n    const formattingContext = this.formattingContext;\n    const row = formattingContext.getRowByIndex(this.rowIndex);\n    let penalty = this.beforeNodeContext.breakPenalty;\n\n    const breakPositions = this.getAcceptableCellBreakPositions();\n    const cellFragments = this.getCellFragments();\n    penalty += Math.max(\n      0,\n      ...cellFragments.map((cf) => cf.cellNodeContext.breakPenalty),\n    );\n\n    // If there is a box break in a row-spanning cell, do not add penalty.\n    // This is to prevent the cell content from disappearing due to the situation\n    // that a box break occurs in a row-spanning cell but the row break fails.\n    // (Issue #1403)\n    const foundBoxBreakInRowSpanningCell = breakPositions.some(\n      (bp, i) =>\n        bp.breakPosition instanceof Layout.BoxBreakPosition &&\n        (cellFragments[i].cellNodeContext.sourceNode as HTMLTableCellElement)\n          .rowSpan > 1,\n    );\n\n    breakPositions.forEach((bp, i) => {\n      let penalty1 = bp.breakPosition.getMinBreakPenalty();\n      if (\n        foundBoxBreakInRowSpanningCell &&\n        bp.breakPosition instanceof BreakPosition.EdgeBreakPosition &&\n        bp.breakPosition.overflows &&\n        penalty1 >= 3\n      ) {\n        // When a box break occurs in a row-spanning cell, the height of the row group decreases,\n        // and the overflows flag that was set before the box break may be no longer valid.\n        // So,check the overflow again, and if the cell does not overflow, reduce the penalty.\n        // (Issue #1403)\n        const overflows = cellFragments[i].column.checkOverflowAndSaveEdge(\n          bp.nodeContext,\n          null,\n        );\n        if (!overflows) {\n          penalty1 -= 3;\n        }\n      }\n      penalty += penalty1;\n    });\n    return penalty;\n  }\n\n  getAcceptableCellBreakPositions(): Layout.BreakPositionAndNodeContext[] {\n    if (!this.acceptableCellBreakPositions) {\n      const cellFragments = this.getCellFragments();\n      this.acceptableCellBreakPositions = cellFragments.map((cellFragment) =>\n        cellFragment.findAcceptableBreakPosition(),\n      );\n    }\n    return this.acceptableCellBreakPositions;\n  }\n\n  private getCellFragments() {\n    return this.formattingContext\n      .getCellsFallingOnRow(this.rowIndex)\n      .map(\n        this.formattingContext.getCellFragmentOfCell,\n        this.formattingContext,\n      );\n  }\n}\n\nexport type BrokenTableCellPosition = {\n  cellNodePosition: Vtree.NodePosition;\n  breakChunkPosition: Vtree.ChunkPosition;\n  cell: TableCell;\n};\n\n/**\n * @param tableSourceNode Source node of the table\n */\nexport class TableFormattingContext\n  extends RepetitiveElementImpl.RepetitiveElementsOwnerFormattingContext\n  implements Table.TableFormattingContext\n{\n  formattingContextType: FormattingContextType = \"Table\";\n  vertical: boolean = false;\n  columnCount: number = -1;\n  tableWidth: number = 0;\n  captions: TableCaptionView[] = [];\n  colGroups: DocumentFragment | null = null;\n  colWidths: number[] | null = null;\n  inlineBorderSpacing: number = 0;\n  rows: TableRow[] = [];\n  slots: TableSlot[][] = [];\n  cellFragments: TableCellFragment[][] = [];\n  lastRowViewNode: Element | null = null;\n  cellBreakPositions: BrokenTableCellPosition[] = [];\n  repetitiveElements: RepetitiveElement.RepetitiveElements | null = null;\n\n  constructor(\n    parent: Vtree.FormattingContext,\n    public readonly tableSourceNode: Element,\n  ) {\n    super(parent, tableSourceNode);\n  }\n\n  override getName(): string {\n    return \"Table formatting context (Table.TableFormattingContext)\";\n  }\n\n  override isFirstTime(\n    nodeContext: Vtree.NodeContext,\n    firstTime: boolean,\n  ): boolean {\n    if (!firstTime) {\n      return firstTime;\n    }\n    switch (nodeContext.display) {\n      case \"table-row\":\n        return this.cellBreakPositions.length === 0;\n      case \"table-cell\":\n        return !this.cellBreakPositions.some(\n          (p) => p.cellNodePosition.steps[0].node === nodeContext.sourceNode,\n        );\n      default:\n        return firstTime;\n    }\n  }\n\n  override getParent(): Vtree.FormattingContext {\n    return this.parent;\n  }\n\n  finishFragment() {\n    this.cellFragments = [];\n  }\n\n  addRow(rowIndex: number, row: TableRow) {\n    this.rows[rowIndex] = row;\n  }\n\n  getRowSlots(rowIndex: number): TableSlot[] {\n    let rowSlots = this.slots[rowIndex];\n    if (!rowSlots) {\n      rowSlots = this.slots[rowIndex] = [];\n    }\n    return rowSlots;\n  }\n\n  addCell(rowIndex: number, cell: TableCell) {\n    let row = this.rows[rowIndex];\n    if (!row) {\n      this.addRow(rowIndex, new TableRow(rowIndex, null));\n      row = this.rows[rowIndex];\n    }\n    Asserts.assert(row);\n    row.addCell(cell);\n    const rowUpper = rowIndex + cell.rowSpan;\n    let rowSlots = this.getRowSlots(rowIndex);\n    let startColIndex = 0;\n    while (rowSlots[startColIndex]) {\n      startColIndex++;\n    }\n    for (; rowIndex < rowUpper; rowIndex++) {\n      rowSlots = this.getRowSlots(rowIndex);\n      for (let i = startColIndex; i < startColIndex + cell.colSpan; i++) {\n        const slot = (rowSlots[i] = new TableSlot(rowIndex, i, cell));\n        if (!cell.anchorSlot) {\n          cell.setAnchorSlot(slot);\n        }\n      }\n    }\n  }\n\n  getRowByIndex(index: number): TableRow {\n    const row = this.rows[index];\n    Asserts.assert(row);\n    return row;\n  }\n\n  findRowIndexBySourceNode(sourceNode: Node): number {\n    return this.rows.findIndex((row) => sourceNode === row.sourceNode);\n  }\n\n  addCellFragment(\n    rowIndex: number,\n    columnIndex: number,\n    cellFragment: TableCellFragment,\n  ) {\n    let list = this.cellFragments[rowIndex];\n    if (!list) {\n      list = this.cellFragments[rowIndex] = [];\n    }\n    list[columnIndex] = cellFragment;\n  }\n\n  getCellsFallingOnRow(rowIndex: number): TableCell[] {\n    const rowSlots = this.getRowSlots(rowIndex);\n    return rowSlots.reduce((uniqueCells, slot) => {\n      if (slot.cell !== uniqueCells[uniqueCells.length - 1]) {\n        return uniqueCells.concat(slot.cell);\n      } else {\n        return uniqueCells;\n      }\n    }, []);\n  }\n\n  getRowSpanningCellsOverflowingTheRow(rowIndex: number): TableCell[] {\n    return this.getCellsFallingOnRow(rowIndex).filter(\n      (cell) => cell.rowIndex + cell.rowSpan - 1 > rowIndex,\n    );\n  }\n\n  getCellFragmentOfCell(cell: TableCell): TableCellFragment {\n    return (\n      this.cellFragments[cell.rowIndex] &&\n      this.cellFragments[cell.rowIndex][cell.columnIndex]\n    );\n  }\n\n  getColumnCount(): number {\n    if (this.columnCount < 0) {\n      this.columnCount = Math.max.apply(\n        null,\n        this.rows.map((row) =>\n          row.cells.reduce((sum, c) => sum + c.colSpan, 0),\n        ),\n      );\n    }\n    return this.columnCount;\n  }\n\n  updateCellSizes(clientLayout: Vtree.ClientLayout) {\n    this.rows.forEach((row) => {\n      row.cells.forEach((cell) => {\n        const rect = LayoutHelper.getElementClientRectAdjusted(\n          clientLayout,\n          cell.viewElement as Element,\n          this.vertical,\n        );\n        cell.viewElement = null;\n        cell.setHeight(this.vertical ? rect[\"width\"] : rect[\"height\"]);\n      });\n    });\n  }\n\n  /**\n   * @return position\n   */\n  findCellFromColumn(\n    column: Layout.Column,\n  ): { rowIndex: number; columnIndex: number } | null {\n    if (!column) {\n      return null;\n    }\n    let tableCell: TableCell = null;\n    let row = 0;\n    let col = 0;\n    loop: for (row = 0; row < this.cellFragments.length; row++) {\n      if (!this.cellFragments[row]) {\n        continue;\n      }\n      for (col = 0; col < this.cellFragments[row].length; col++) {\n        if (!this.cellFragments[row][col]) {\n          continue;\n        }\n        if (column === this.cellFragments[row][col].pseudoColumn.getColumn()) {\n          tableCell = this.rows[row].cells[col];\n          break loop;\n        }\n      }\n    }\n    if (!tableCell) {\n      return null;\n    }\n    for (; row < this.slots.length; row++) {\n      for (; col < this.slots[row].length; col++) {\n        const slot = this.slots[row][col];\n        if (slot.cell === tableCell) {\n          return { rowIndex: slot.rowIndex, columnIndex: slot.columnIndex };\n        }\n      }\n    }\n    return null;\n  }\n\n  collectElementsOffsetOfUpperCells(\n    position: { rowIndex: number; columnIndex: number } | null,\n  ): RepetitiveElement.ElementsOffset[] {\n    const collected = [];\n    return this.slots.reduce((repetitiveElements, row, index) => {\n      if (index >= position.rowIndex) {\n        return repetitiveElements;\n      }\n      const cellFragment =\n        row[position.columnIndex] &&\n        this.getCellFragmentOfCell(row[position.columnIndex].cell);\n      if (!cellFragment || collected.includes(cellFragment)) {\n        return repetitiveElements;\n      }\n      this.collectElementsOffsetFromColumn(\n        cellFragment.pseudoColumn.getColumn(),\n        repetitiveElements,\n      );\n      collected.push(cellFragment);\n      return repetitiveElements;\n    }, [] as RepetitiveElement.ElementsOffset[]);\n  }\n\n  collectElementsOffsetOfHighestColumn(): RepetitiveElement.ElementsOffset[] {\n    const elementsInColumn = [];\n    this.rows.forEach((row) => {\n      row.cells.forEach((cell, index) => {\n        if (!elementsInColumn[index]) {\n          elementsInColumn[index] = { collected: [], elements: [] };\n        }\n        const state = elementsInColumn[index];\n        const cellFragment = this.getCellFragmentOfCell(cell);\n        if (!cellFragment || state.collected.includes(cellFragment)) {\n          return;\n        }\n        this.collectElementsOffsetFromColumn(\n          cellFragment.pseudoColumn.getColumn(),\n          state.elements,\n        );\n        state.collected.push(cellFragment);\n      });\n    });\n    return [\n      new ElementsOffsetOfTableCell(\n        elementsInColumn.map((entry) => entry.elements),\n      ),\n    ];\n  }\n\n  private collectElementsOffsetFromColumn(\n    column: LayoutType.Column,\n    repetitiveElements: RepetitiveElement.ElementsOffset[],\n  ) {\n    column.fragmentLayoutConstraints.forEach((constraint) => {\n      if (\n        RepetitiveElement.isInstanceOfRepetitiveElementsOwnerLayoutConstraint(\n          constraint,\n        )\n      ) {\n        const repetitiveElement = constraint.getRepetitiveElements();\n        repetitiveElements.push(repetitiveElement);\n      }\n      if (Table.isInstanceOfTableRowLayoutConstraint(constraint)) {\n        constraint\n          .getElementsOffsetsForTableCell(null)\n          .forEach((repetitiveElement) => {\n            repetitiveElements.push(repetitiveElement);\n          });\n      }\n    });\n  }\n\n  override saveState(): any {\n    return [].concat(this.cellBreakPositions);\n  }\n\n  override restoreState(state: any) {\n    this.cellBreakPositions = state as BrokenTableCellPosition[];\n  }\n}\n\nexport class ElementsOffsetOfTableCell\n  implements RepetitiveElement.ElementsOffset\n{\n  constructor(\n    public readonly repeatitiveElementsInColumns: RepetitiveElement.ElementsOffset[][],\n  ) {}\n\n  /** @override */\n  calculateOffset(nodeContext: Vtree.NodeContext): number {\n    return this.calculateMaxOffsetOfColumn(\n      nodeContext,\n      (offsets) => offsets.current,\n    );\n  }\n\n  /** @override */\n  calculateMinimumOffset(nodeContext: Vtree.NodeContext): number {\n    return this.calculateMaxOffsetOfColumn(\n      nodeContext,\n      (offsets) => offsets.minimum,\n    );\n  }\n\n  private calculateMaxOffsetOfColumn(nodeContext, resolver) {\n    let maxOffset = 0;\n    this.repeatitiveElementsInColumns.forEach((repetitiveElements) => {\n      const offsets = BreakPosition.calculateOffset(\n        nodeContext,\n        repetitiveElements,\n      );\n      maxOffset = Math.max(maxOffset, resolver(offsets));\n    });\n    return maxOffset;\n  }\n}\n\nfunction getTableFormattingContext(\n  formattingContext: Vtree.FormattingContext,\n): TableFormattingContext {\n  Asserts.assert(formattingContext instanceof TableFormattingContext);\n  return formattingContext as TableFormattingContext;\n}\n\nfunction isTableRowGrouping(display: string | null): boolean {\n  return (\n    display === \"table-row-group\" ||\n    display === \"table-header-group\" ||\n    display === \"table-footer-group\"\n  );\n}\n\nfunction isTableRoot(display: string | null): boolean {\n  return display === \"table\" || display === \"inline-table\";\n}\n\nfunction isValidParentOfTableRow(display: string | null): boolean {\n  return isTableRowGrouping(display) || isTableRoot(display);\n}\n\nfunction skipNestedTable(\n  state: LayoutUtil.LayoutIteratorState,\n  formattingContext: TableFormattingContext,\n  column: Layout.Column,\n): Task.Result<boolean> | null {\n  const nodeContext = state.nodeContext;\n  const display = nodeContext.display;\n  const parentDisplay = nodeContext.parent ? nodeContext.parent.display : null;\n\n  // Is inline-table nested in another table?\n  let isNestedInlineTable = false;\n  if (\n    parentDisplay === \"inline-table\" &&\n    !(nodeContext.formattingContext instanceof TableFormattingContext)\n  ) {\n    for (let nc = nodeContext.parent; nc; nc = nc.parent) {\n      if (nc.formattingContext instanceof TableFormattingContext) {\n        isNestedInlineTable = nc.formattingContext === formattingContext;\n        break;\n      }\n    }\n  }\n  const isNestedTable =\n    isNestedInlineTable ||\n    (display === \"table-row\" && !isValidParentOfTableRow(parentDisplay)) ||\n    (display === \"table-cell\" &&\n      parentDisplay !== \"table-row\" &&\n      !isValidParentOfTableRow(parentDisplay)) ||\n    (nodeContext.formattingContext instanceof TableFormattingContext &&\n      nodeContext.formattingContext !== formattingContext);\n  if (isNestedTable) {\n    return column\n      .buildDeepElementView(nodeContext)\n      .thenAsync((nodeContextAfter) => {\n        state.nodeContext = nodeContextAfter;\n        return Task.newResult(true);\n      });\n  } else {\n    return null;\n  }\n}\n\nexport class EntireTableLayoutStrategy extends LayoutUtil.EdgeSkipper {\n  rowIndex: number = -1;\n  columnIndex: number = 0;\n  inRow: boolean = false;\n  checkPoints: Vtree.NodeContext[] = [];\n  inHeaderOrFooter: boolean = false;\n\n  constructor(\n    public readonly formattingContext: TableFormattingContext,\n    public readonly column: Layout.Column,\n  ) {\n    super();\n  }\n\n  override startNonInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    const formattingContext = this.formattingContext;\n    const r = skipNestedTable(state, formattingContext, this.column);\n    if (r) {\n      return r;\n    }\n    this.postLayoutBlockContents(state);\n    const nodeContext = state.nodeContext;\n    const display = nodeContext.display;\n    const repetitiveElements = formattingContext.getRepetitiveElements();\n    switch (display) {\n      case \"table\":\n        formattingContext.inlineBorderSpacing = nodeContext.inlineBorderSpacing;\n        break;\n      case \"table-caption\": {\n        const captionView = new TableCaptionView(\n          nodeContext.viewNode as Element,\n          nodeContext.captionSide,\n        );\n        formattingContext.captions.push(captionView);\n        break;\n      }\n      case \"table-header-group\":\n        if (!repetitiveElements.isHeaderRegistered()) {\n          this.inHeaderOrFooter = true;\n          repetitiveElements.setHeaderNodeContext(nodeContext);\n        }\n        return Task.newResult(true);\n      case \"table-footer-group\":\n        if (!repetitiveElements.isFooterRegistered()) {\n          this.inHeaderOrFooter = true;\n          repetitiveElements.setFooterNodeContext(nodeContext);\n        }\n        return Task.newResult(true);\n      case \"table-row\":\n        if (!this.inHeaderOrFooter) {\n          this.inRow = true;\n          this.rowIndex++;\n          Asserts.assert(nodeContext.sourceNode);\n          this.columnIndex = 0;\n          formattingContext.addRow(\n            this.rowIndex,\n            new TableRow(this.rowIndex, nodeContext.sourceNode),\n          );\n          if (!repetitiveElements.firstContentSourceNode) {\n            repetitiveElements.firstContentSourceNode =\n              nodeContext.sourceNode as Element;\n          }\n        }\n        break;\n    }\n    return super.startNonInlineElementNode(state);\n  }\n\n  override afterNonInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    const formattingContext = this.formattingContext;\n    const nodeContext = state.nodeContext;\n    const display = nodeContext.display;\n    const clientLayout = this.column.clientLayout;\n    this.postLayoutBlockContents(state);\n    if (nodeContext.sourceNode === formattingContext.tableSourceNode) {\n      const computedStyle = clientLayout.getElementComputedStyle(\n        formattingContext.getRootViewNode(nodeContext) as Element,\n      );\n      formattingContext.tableWidth = parseFloat(\n        computedStyle[formattingContext.vertical ? \"height\" : \"width\"],\n      );\n      formattingContext.getRepetitiveElements().lastContentSourceNode =\n        state.lastAfterNodeContext &&\n        (state.lastAfterNodeContext.sourceNode as Element);\n      state.break = true;\n    } else {\n      switch (display) {\n        case \"table-header-group\":\n        case \"table-footer-group\":\n          if (this.inHeaderOrFooter) {\n            this.inHeaderOrFooter = false;\n            return Task.newResult(true);\n          }\n          break;\n        case \"table-row\":\n          if (!this.inHeaderOrFooter) {\n            formattingContext.lastRowViewNode = nodeContext.viewNode as Element;\n            this.inRow = false;\n          }\n          break;\n        case \"table-cell\":\n          if (!this.inHeaderOrFooter) {\n            if (!this.inRow) {\n              this.rowIndex++;\n              this.columnIndex = 0;\n              this.inRow = true;\n            }\n            const elem = nodeContext.viewNode as Element;\n            formattingContext.addCell(\n              this.rowIndex,\n              new TableCell(this.rowIndex, this.columnIndex, elem),\n            );\n            this.columnIndex++;\n          }\n          break;\n      }\n    }\n    return super.afterNonInlineElementNode(state);\n  }\n\n  override startNonElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    this.registerCheckPoint(state);\n  }\n\n  override afterNonElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    this.registerCheckPoint(state);\n  }\n\n  override startInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    this.registerCheckPoint(state);\n  }\n\n  override afterInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    this.registerCheckPoint(state);\n  }\n\n  registerCheckPoint(state: LayoutUtil.LayoutIteratorState) {\n    const nodeContext = state.nodeContext;\n    if (\n      nodeContext &&\n      nodeContext.viewNode &&\n      !LayoutHelper.isSpecialNodeContext(nodeContext)\n    ) {\n      this.checkPoints.push(nodeContext.clone());\n    }\n  }\n\n  postLayoutBlockContents(state: LayoutUtil.LayoutIteratorState) {\n    if (this.checkPoints.length > 0) {\n      this.column.postLayoutBlock(state.nodeContext, this.checkPoints);\n    }\n    this.checkPoints = [];\n  }\n}\n\nexport class TableLayoutStrategy extends LayoutUtil.EdgeSkipper {\n  private static ignoreList: { [key: string]: boolean } = {\n    \"table-caption\": true,\n    \"table-column-group\": true,\n    \"table-column\": true,\n  };\n  inRow: boolean = false;\n  currentRowIndex: number = -1;\n  currentColumnIndex: number = 0;\n  originalStopAtOverflow: boolean;\n  inHeader: boolean;\n  inFooter: boolean;\n\n  constructor(\n    public readonly formattingContext: TableFormattingContext,\n    public readonly column: Layout.Column,\n  ) {\n    super(true);\n    this.originalStopAtOverflow = column.stopAtOverflow;\n    column.stopAtOverflow = false;\n  }\n\n  resetColumn() {\n    this.column.stopAtOverflow = this.originalStopAtOverflow;\n  }\n\n  getColSpanningCellWidth(cell: TableCell): number {\n    const colWidths = this.formattingContext.colWidths;\n    Asserts.assert(colWidths);\n    let width = 0;\n    for (let i = 0; i < cell.colSpan; i++) {\n      width += colWidths[cell.anchorSlot.columnIndex + i];\n    }\n    width += this.formattingContext.inlineBorderSpacing * (cell.colSpan - 1);\n    return width;\n  }\n\n  layoutCell(\n    cell: TableCell,\n    cellNodeContext: Vtree.NodeContext,\n    startChunkPosition: Vtree.ChunkPosition,\n  ): Task.Result<boolean> {\n    const rowIndex = cell.rowIndex;\n    const columnIndex = cell.columnIndex;\n    const colSpan = cell.colSpan;\n    const cellViewNode = cellNodeContext.viewNode as Element;\n    const verticalAlign = cellNodeContext.verticalAlign;\n    if (colSpan > 1) {\n      Base.setCSSProperty(cellViewNode, \"box-sizing\", \"border-box\");\n      Base.setCSSProperty(\n        cellViewNode,\n        this.formattingContext.vertical ? \"height\" : \"width\",\n        `${this.getColSpanningCellWidth(cell)}px`,\n      );\n    }\n    const pseudoColumnContainer =\n      cellViewNode.ownerDocument.createElement(\"div\");\n    cellViewNode.appendChild(pseudoColumnContainer);\n    const cellFragment = new TableCellFragment(\n      this.column,\n      pseudoColumnContainer,\n      cellNodeContext,\n    );\n    this.formattingContext.addCellFragment(rowIndex, columnIndex, cellFragment);\n    if (\n      startChunkPosition.primary.steps.length === 1 &&\n      startChunkPosition.primary.after\n    ) {\n      // Contents of the cell have ended in the previous fragment\n      cellFragment.empty = true;\n    }\n    return cellFragment.pseudoColumn\n      .layout(startChunkPosition, true)\n      .thenReturn(true);\n  }\n\n  hasBrokenCellAtSlot(slotIndex): boolean {\n    const cellBreakPosition = this.formattingContext.cellBreakPositions[0];\n    if (cellBreakPosition) {\n      return cellBreakPosition.cell.anchorSlot.columnIndex === slotIndex;\n    }\n    return false;\n  }\n\n  private extractRowSpanningCellBreakPositions(): BrokenTableCellPosition[][] {\n    const cellBreakPositions = this.formattingContext.cellBreakPositions;\n    if (cellBreakPositions.length === 0) {\n      return [];\n    }\n    const rowSpanningCellBreakPositions = [];\n    let i = 0;\n    do {\n      const p = cellBreakPositions[i];\n      const rowIndex = p.cell.rowIndex;\n      if (rowIndex < this.currentRowIndex) {\n        let arr = rowSpanningCellBreakPositions[rowIndex];\n        if (!arr) {\n          arr = rowSpanningCellBreakPositions[rowIndex] = [];\n        }\n        arr.push(p);\n        cellBreakPositions.splice(i, 1);\n      } else {\n        i++;\n      }\n    } while (i < cellBreakPositions.length);\n    return rowSpanningCellBreakPositions;\n  }\n\n  layoutRowSpanningCellsFromPreviousFragment(\n    state: LayoutUtil.LayoutIteratorState,\n  ): Task.Result<boolean> {\n    const formattingContext = this.formattingContext;\n    const rowSpanningCellBreakPositions =\n      this.extractRowSpanningCellBreakPositions();\n    const rowCount = rowSpanningCellBreakPositions.reduce((s) => s + 1, 0);\n    if (rowCount === 0) {\n      return Task.newResult(true);\n    }\n    const layoutContext = this.column.layoutContext;\n    const currentRow = state.nodeContext;\n    currentRow.viewNode.parentNode.removeChild(currentRow.viewNode);\n    const frame = Task.newFrame<boolean>(\n      \"layoutRowSpanningCellsFromPreviousFragment\",\n    );\n    let cont = Task.newResult(true);\n    let spanningCellRowIndex = 0;\n    const occupiedSlotIndices = [];\n    rowSpanningCellBreakPositions.forEach((rowCellBreakPositions) => {\n      cont = cont.thenAsync(() => {\n        // Is it always correct to assume steps[1] to be the row?\n        const rowNodeContext = VtreeImpl.makeNodeContextFromNodePositionStep(\n          rowCellBreakPositions[0].cellNodePosition.steps[1],\n          currentRow.parent,\n        );\n        return layoutContext.setCurrent(rowNodeContext, false).thenAsync(() => {\n          let cont1 = Task.newResult(true);\n          let columnIndex = 0;\n\n          function addDummyCellUntil(upperColumnIndex) {\n            while (columnIndex < upperColumnIndex) {\n              if (!occupiedSlotIndices.includes(columnIndex)) {\n                const dummy =\n                  rowNodeContext.viewNode.ownerDocument.createElement(\"td\");\n                Base.setCSSProperty(dummy, \"padding\", \"0\");\n                rowNodeContext.viewNode.appendChild(dummy);\n              }\n              columnIndex++;\n            }\n          }\n          rowCellBreakPositions.forEach((cellBreakPosition) => {\n            cont1 = cont1.thenAsync(() => {\n              const cell = cellBreakPosition.cell;\n              addDummyCellUntil(cell.anchorSlot.columnIndex);\n              const cellNodePosition = cellBreakPosition.cellNodePosition;\n              const cellNodeContext =\n                VtreeImpl.makeNodeContextFromNodePositionStep(\n                  cellNodePosition.steps[0],\n                  rowNodeContext,\n                );\n              cellNodeContext.offsetInNode = cellNodePosition.offsetInNode;\n              cellNodeContext.after = cellNodePosition.after;\n              cellNodeContext.fragmentIndex =\n                cellNodePosition.steps[0].fragmentIndex + 1;\n              return layoutContext\n                .setCurrent(cellNodeContext, false)\n                .thenAsync(() => {\n                  const breakChunkPosition =\n                    cellBreakPosition.breakChunkPosition;\n                  for (let i = 0; i < cell.colSpan; i++) {\n                    occupiedSlotIndices.push(columnIndex + i);\n                  }\n                  columnIndex += cell.colSpan;\n                  return this.layoutCell(\n                    cell,\n                    cellNodeContext,\n                    breakChunkPosition,\n                  ).thenAsync(() => {\n                    (cellNodeContext.viewNode as HTMLTableCellElement).rowSpan =\n                      cell.rowIndex +\n                      cell.rowSpan -\n                      this.currentRowIndex +\n                      rowCount -\n                      spanningCellRowIndex;\n                    return Task.newResult(true);\n                  });\n                });\n            });\n          });\n          return cont1.thenAsync(() => {\n            addDummyCellUntil(formattingContext.getColumnCount());\n            spanningCellRowIndex++;\n            return Task.newResult(true);\n          });\n        });\n      });\n    });\n    cont.then(() => {\n      layoutContext\n        .setCurrent(currentRow, true, state.atUnforcedBreak)\n        .then(() => {\n          frame.finish(true);\n        });\n    });\n    return frame.result();\n  }\n\n  startTableRow(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean> {\n    if (this.inHeader || this.inFooter) {\n      return Task.newResult(true);\n    }\n    const nodeContext = state.nodeContext;\n    const formattingContext = this.formattingContext;\n    if (this.currentRowIndex < 0) {\n      Asserts.assert(nodeContext.sourceNode);\n      this.currentRowIndex = formattingContext.findRowIndexBySourceNode(\n        nodeContext.sourceNode,\n      );\n    } else {\n      this.currentRowIndex++;\n    }\n    this.currentColumnIndex = 0;\n    this.inRow = true;\n    return this.layoutRowSpanningCellsFromPreviousFragment(state).thenAsync(\n      () => {\n        this.registerCellFragmentIndex();\n        const overflown = this.column.checkOverflowAndSaveEdgeAndBreakPosition(\n          state.lastAfterNodeContext,\n          null,\n          true,\n          state.breakAtTheEdge,\n        );\n        if (\n          overflown &&\n          formattingContext.getRowSpanningCellsOverflowingTheRow(\n            this.currentRowIndex - 1,\n          ).length === 0\n        ) {\n          this.resetColumn();\n          nodeContext.overflow = true;\n          state.break = true;\n        }\n        return Task.newResult(true);\n      },\n    );\n  }\n\n  private registerCellFragmentIndex() {\n    const cells = this.formattingContext.getRowByIndex(\n      this.currentRowIndex,\n    ).cells;\n    cells.forEach((cell) => {\n      const cellBreakPosition =\n        this.formattingContext.cellBreakPositions[cell.columnIndex];\n      if (\n        cellBreakPosition &&\n        cellBreakPosition.cell.anchorSlot.columnIndex ==\n          cell.anchorSlot.columnIndex\n      ) {\n        const tdNodeStep = cellBreakPosition.cellNodePosition.steps[0];\n        const offset = (\n          this.column.layoutContext as Vgen.ViewFactory\n        ).xmldoc.getElementOffset(tdNodeStep.node as Element);\n        Layout.registerFragmentIndex(offset, tdNodeStep.fragmentIndex + 1, 1);\n      }\n    });\n  }\n\n  startTableCell(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean> {\n    if (this.inHeader || this.inFooter) {\n      return Task.newResult(true);\n    }\n    const nodeContext = state.nodeContext;\n    if (!this.inRow) {\n      if (this.currentRowIndex < 0) {\n        this.currentRowIndex = 0;\n      } else {\n        this.currentRowIndex++;\n      }\n      this.currentColumnIndex = 0;\n      this.inRow = true;\n    }\n    const cell = this.formattingContext.getRowByIndex(this.currentRowIndex)\n      .cells[this.currentColumnIndex];\n    if (!cell) {\n      // Fix for Issue #712\n      state.break = true;\n      return Task.newResult(true);\n    }\n    const afterNodeContext = nodeContext.copy().modify();\n    afterNodeContext.after = true;\n    state.nodeContext = afterNodeContext;\n    const frame = Task.newFrame<boolean>(\"startTableCell\");\n    let cont: Task.Result<Vtree.ChunkPosition>;\n    if (this.hasBrokenCellAtSlot(cell.anchorSlot.columnIndex)) {\n      const cellBreakPosition =\n        this.formattingContext.cellBreakPositions.shift();\n      nodeContext.fragmentIndex =\n        cellBreakPosition.cellNodePosition.steps[0].fragmentIndex + 1;\n      cont = Task.newResult(cellBreakPosition.breakChunkPosition);\n    } else {\n      cont = this.column\n        .nextInTree(nodeContext, state.atUnforcedBreak)\n        .thenAsync((nextNodeContext) => {\n          if (nextNodeContext.viewNode) {\n            nodeContext.viewNode.removeChild(nextNodeContext.viewNode);\n          }\n          const startNodePosition = VtreeImpl.newNodePositionFromNodeContext(\n            nextNodeContext,\n            0,\n          );\n          return Task.newResult(new VtreeImpl.ChunkPosition(startNodePosition));\n        });\n    }\n    cont.then((startChunkPosition) => {\n      Asserts.assert(nodeContext);\n      this.layoutCell(cell, nodeContext, startChunkPosition).then(() => {\n        this.afterNonInlineElementNode(state);\n        this.currentColumnIndex++;\n        frame.finish(true);\n      });\n    });\n    return frame.result();\n  }\n\n  startNonInlineBox(\n    state: LayoutUtil.LayoutIteratorState,\n  ): Task.Result<boolean> {\n    const r = skipNestedTable(\n      state,\n      getTableFormattingContext(this.formattingContext),\n      this.column,\n    );\n    if (r) {\n      return r;\n    }\n    const nodeContext = state.nodeContext;\n    const repetitiveElements = this.formattingContext.getRepetitiveElements();\n    const display = nodeContext.display;\n    if (\n      display === \"table-header-group\" &&\n      repetitiveElements &&\n      repetitiveElements.isHeaderSourceNode(nodeContext.sourceNode)\n    ) {\n      this.inHeader = true;\n      return Task.newResult(true);\n    } else if (\n      display === \"table-footer-group\" &&\n      repetitiveElements &&\n      repetitiveElements.isFooterSourceNode(nodeContext.sourceNode)\n    ) {\n      this.inFooter = true;\n      return Task.newResult(true);\n    } else if (display === \"table-row\") {\n      return this.startTableRow(state);\n    } else if (display === \"table-cell\") {\n      return this.startTableCell(state);\n    } else {\n      return Task.newResult(true);\n    }\n  }\n\n  endNonInlineBox(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean> {\n    const nodeContext = state.nodeContext;\n    const display = nodeContext.display;\n    if (display === \"table-row\") {\n      this.inRow = false;\n      if (!this.inHeader && !this.inFooter) {\n        const beforeNodeContext = nodeContext.copy().modify();\n        beforeNodeContext.after = false;\n        const bp = new InsideTableRowBreakPosition(\n          this.currentRowIndex,\n          beforeNodeContext,\n          this.formattingContext,\n        );\n        this.column.breakPositions.push(bp);\n      }\n    }\n    return Task.newResult(true);\n  }\n\n  afterNonInlineElementNode(\n    state: LayoutUtil.LayoutIteratorState,\n  ): void | Task.Result<boolean> {\n    const nodeContext = state.nodeContext;\n    const repetitiveElements = this.formattingContext.getRepetitiveElements();\n    const display = nodeContext.display;\n    if (display === \"table-header-group\") {\n      if (\n        repetitiveElements &&\n        !repetitiveElements.allowInsertRepeatitiveElements &&\n        repetitiveElements.isHeaderSourceNode(nodeContext.sourceNode)\n      ) {\n        this.inHeader = false;\n        nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n      } else {\n        Base.setCSSProperty(\n          nodeContext.viewNode as Element,\n          \"display\",\n          \"table-row-group\",\n        );\n      }\n    } else if (display === \"table-footer-group\") {\n      if (\n        repetitiveElements &&\n        !repetitiveElements.allowInsertRepeatitiveElements &&\n        repetitiveElements.isFooterSourceNode(nodeContext.sourceNode)\n      ) {\n        this.inFooter = false;\n        nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n      } else {\n        Base.setCSSProperty(\n          nodeContext.viewNode as Element,\n          \"display\",\n          \"table-row-group\",\n        );\n      }\n    }\n    if (display && TableLayoutStrategy.ignoreList[display]) {\n      nodeContext.viewNode.parentNode.removeChild(nodeContext.viewNode);\n    } else if (\n      nodeContext.sourceNode === this.formattingContext.tableSourceNode\n    ) {\n      nodeContext.overflow = this.column.checkOverflowAndSaveEdge(\n        nodeContext,\n        null,\n      );\n      this.resetColumn();\n      state.break = true;\n    } else {\n      return super.afterNonInlineElementNode(state);\n    }\n    return Task.newResult(true);\n  }\n}\n\ntype TableLayoutOption = {\n  calculateBreakPositionsInside: boolean;\n};\nconst tableLayoutOptionCache: {\n  root: Node;\n  tableLayoutOption: TableLayoutOption;\n}[] = [];\n\nfunction getTableLayoutOption(\n  tableRootSourceNode: Node,\n): TableLayoutOption | null {\n  const i = tableLayoutOptionCache.findIndex(\n    (c) => c.root === tableRootSourceNode,\n  );\n  const pair = tableLayoutOptionCache[i];\n  return pair ? pair.tableLayoutOption : null;\n}\n\nfunction clearTableLayoutOptionCache(tableRootSourceNode: Node): void {\n  const i = tableLayoutOptionCache.findIndex(\n    (c) => c.root === tableRootSourceNode,\n  );\n  if (i >= 0) {\n    tableLayoutOptionCache.splice(i, 1);\n  }\n}\n\nexport class TableLayoutProcessor implements LayoutProcessor.LayoutProcessor {\n  private layoutEntireTable(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getTableFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const strategy = new EntireTableLayoutStrategy(formattingContext, column);\n    const iterator = new LayoutUtil.LayoutIterator(\n      strategy,\n      column.layoutContext,\n    );\n    return iterator.iterate(nodeContext);\n  }\n\n  private getColumnWidths(\n    lastRow: Element,\n    columnCount: number,\n    vertical: boolean,\n    clientLayout: Vtree.ClientLayout,\n  ): number[] {\n    const doc = lastRow.ownerDocument;\n    const dummyRow = doc.createElement(\"tr\");\n    const dummyCells = [];\n    for (let i = 0; i < columnCount; i++) {\n      const cell = doc.createElement(\"td\");\n      dummyRow.appendChild(cell);\n      dummyCells.push(cell);\n    }\n    lastRow.parentNode.insertBefore(dummyRow, lastRow.nextSibling);\n    const colWidths = dummyCells.map((cell) => {\n      const rect = LayoutHelper.getElementClientRectAdjusted(\n        clientLayout,\n        cell,\n        vertical,\n      );\n      const width = vertical ? rect[\"height\"] : rect[\"width\"];\n      // Workaround for issue #958\n      // Non-integer width causes problem, so return rounded-up value.\n      return Math.ceil(width);\n    });\n    lastRow.parentNode.removeChild(dummyRow);\n    return colWidths;\n  }\n\n  private getColGroupElements(tableElement: Element): Element[] {\n    const colGroups = [];\n    let child = tableElement.firstElementChild;\n    while (child) {\n      if (child.localName === \"colgroup\") {\n        colGroups.push(child);\n      }\n      child = child.nextElementSibling;\n    }\n    return colGroups;\n  }\n\n  private normalizeAndGetColElements(colGroups: Element[]): Element[] {\n    const cols = [];\n    colGroups.forEach((colGroup) => {\n      // Replace colgroup[span=n] with colgroup with n col elements\n      let span = (colGroup as any).span;\n      colGroup.removeAttribute(\"span\");\n      let col = colGroup.firstElementChild;\n      while (col) {\n        if (col.localName === \"col\") {\n          // Replace col[span=n] with n col elements\n          let s = (col as any).span;\n          col.removeAttribute(\"span\");\n          span -= s;\n          while (s-- > 1) {\n            const cloned = col.cloneNode(true);\n            colGroup.insertBefore(cloned, col);\n            cols.push(cloned);\n          }\n          cols.push(col);\n        }\n        col = col.nextElementSibling;\n      }\n      while (span-- > 0) {\n        col = colGroup.ownerDocument.createElement(\"col\");\n        colGroup.appendChild(col);\n        cols.push(col);\n      }\n    });\n    return cols;\n  }\n\n  private addMissingColElements(\n    cols: Element[],\n    colGroups: Element[],\n    columnCount: number,\n    tableElement: Element,\n  ) {\n    if (cols.length < columnCount) {\n      const colGroup = tableElement.ownerDocument.createElement(\"colgroup\");\n      colGroups.push(colGroup);\n      for (let i = cols.length; i < columnCount; i++) {\n        const col = tableElement.ownerDocument.createElement(\"col\");\n        colGroup.appendChild(col);\n        cols.push(col);\n      }\n    }\n  }\n\n  /**\n   * Measure width of columns and normalize colgroup and col elements so that\n   * each column has a corresponding col element with the width specified.\n   */\n  normalizeColGroups(\n    formattingContext: TableFormattingContext,\n    tableElement: Element,\n    column: Layout.Column,\n  ) {\n    const vertical = formattingContext.vertical;\n    const lastRow = formattingContext.lastRowViewNode;\n    if (!lastRow) {\n      return;\n    }\n    Asserts.assert(lastRow);\n    formattingContext.lastRowViewNode = null;\n    const doc = lastRow.ownerDocument;\n    const fragment = doc.createDocumentFragment();\n\n    // Count columns\n    const columnCount = formattingContext.getColumnCount();\n    if (!(columnCount > 0)) {\n      formattingContext.colGroups = fragment;\n      return;\n    }\n\n    // Measure column widths\n    const colWidths = (formattingContext.colWidths = this.getColumnWidths(\n      lastRow,\n      columnCount,\n      vertical,\n      column.clientLayout,\n    ));\n\n    // Normalize colgroup and col elements\n    const colGroups = this.getColGroupElements(tableElement);\n    const cols = this.normalizeAndGetColElements(colGroups);\n\n    // Add missing col elements for remaining columns\n    this.addMissingColElements(cols, colGroups, columnCount, tableElement);\n\n    // Assign width to col elements\n    cols.forEach((col, i) => {\n      Base.setCSSProperty(\n        col,\n        vertical ? \"height\" : \"width\",\n        `${colWidths[i]}px`,\n      );\n    });\n    colGroups.forEach((colGroup) => {\n      fragment.appendChild(colGroup.cloneNode(true));\n    });\n    formattingContext.colGroups = fragment;\n  }\n\n  doInitialLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getTableFormattingContext(\n      nodeContext.formattingContext,\n    );\n    formattingContext.vertical = nodeContext.vertical;\n    formattingContext.initializeRepetitiveElements(nodeContext.vertical);\n    Asserts.assert(nodeContext.sourceNode);\n    const tableLayoutOption = getTableLayoutOption(nodeContext.sourceNode);\n    clearTableLayoutOptionCache(nodeContext.sourceNode);\n    const frame = Task.newFrame<Vtree.NodeContext>(\n      \"TableLayoutProcessor.doInitialLayout\",\n    );\n    const initialNodeContext = nodeContext.copy();\n    this.layoutEntireTable(nodeContext, column).then((nodeContextAfter) => {\n      const tableElement = nodeContextAfter.viewNode as Element;\n      const tableBBox = LayoutHelper.getElementClientRectAdjusted(\n        column.clientLayout,\n        tableElement,\n        column.vertical,\n      );\n      let edge = column.vertical ? tableBBox.left : tableBBox.bottom;\n      edge +=\n        (column.vertical ? -1 : 1) *\n        BreakPosition.calculateOffset(\n          nodeContext,\n          column.collectElementsOffset(),\n        ).current;\n      if (\n        !column.isOverflown(edge) &&\n        (!tableLayoutOption || !tableLayoutOption.calculateBreakPositionsInside)\n      ) {\n        column.breakPositions.push(\n          new EntireTableBreakPosition(initialNodeContext),\n        );\n        frame.finish(nodeContextAfter);\n        return;\n      }\n      this.normalizeColGroups(formattingContext, tableElement, column);\n      formattingContext.updateCellSizes(column.clientLayout);\n      frame.finish(null);\n    });\n    return frame.result();\n  }\n\n  addCaptions(\n    formattingContext: TableFormattingContext,\n    rootViewNode: Element,\n    firstChild: Node | null,\n  ) {\n    const captions = formattingContext.captions;\n    captions.forEach((caption, i) => {\n      if (caption) {\n        rootViewNode.insertBefore(caption.viewNode, firstChild);\n        if (caption.side === \"top\") {\n          captions[i] = null;\n        }\n      }\n    });\n  }\n\n  addColGroups(\n    formattingContext: TableFormattingContext,\n    rootViewNode: Element,\n    firstChild: Node | null,\n  ) {\n    if (\n      formattingContext.colGroups &&\n      this.getColGroupElements(rootViewNode).length === 0\n    ) {\n      rootViewNode.insertBefore(\n        formattingContext.colGroups.cloneNode(true),\n        firstChild,\n      );\n      // Set table-layout to fixed so that the widths of the columns\n      // are respected. (Fix for issue #1475)\n      Base.setCSSProperty(rootViewNode, \"table-layout\", \"fixed\");\n      Base.setCSSProperty(\n        rootViewNode,\n        formattingContext.vertical ? \"height\" : \"width\",\n        `${formattingContext.tableWidth}px`,\n      );\n    }\n  }\n\n  removeColGroups(\n    formattingContext: TableFormattingContext,\n    rootViewNode: Element,\n  ) {\n    if (formattingContext.colGroups && rootViewNode) {\n      const colGroups = this.getColGroupElements(rootViewNode);\n      if (colGroups) {\n        colGroups.forEach((colGroup) => {\n          rootViewNode.removeChild(colGroup);\n        });\n      }\n    }\n  }\n\n  doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getTableFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const rootViewNode = formattingContext.getRootViewNode(\n      nodeContext,\n    ) as Element;\n    const firstChild = rootViewNode.firstChild;\n    this.addCaptions(formattingContext, rootViewNode, firstChild);\n    this.addColGroups(formattingContext, rootViewNode, firstChild);\n    const strategy = new TableLayoutStrategy(formattingContext, column);\n    const iterator = new LayoutUtil.LayoutIterator(\n      strategy,\n      column.layoutContext,\n    );\n    const frame = Task.newFrame<Vtree.NodeContext>(\n      \"TableFormattingContext.doLayout\",\n    );\n    iterator.iterate(nodeContext).thenFinish(frame);\n    return frame.result();\n  }\n\n  /** @override */\n  layout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n    leadingEdge: boolean,\n  ): Task.Result<Vtree.NodeContext> {\n    const formattingContext = getTableFormattingContext(\n      nodeContext.formattingContext,\n    );\n    const rootViewNode = formattingContext.getRootViewNode(nodeContext);\n    const frame = Task.newFrame<Vtree.NodeContext>(\n      \"TableFormattingContext.layout\",\n    );\n    let cont: Task.Result<Vtree.NodeContext>;\n    if (!rootViewNode) {\n      cont = column.buildDeepElementView(nodeContext);\n    } else {\n      if (leadingEdge) {\n        RepetitiveElementImpl.appendHeaderToAncestors(\n          nodeContext.parent,\n          column,\n        );\n      }\n      cont = new LayoutRetryer(formattingContext, this).layout(\n        nodeContext,\n        column,\n      );\n    }\n    cont.then((result) => {\n      frame.finish(result);\n\n      // Restore column box size if it was modified in `LayoutHelper.getElementClientRectAdjusted()`.\n      if (\n        column.element.hasAttribute(\"data-vivliostyle-column-height-adjusted\")\n      ) {\n        Base.setCSSProperty(column.element, \"width\", `${column.width}px`);\n        Base.setCSSProperty(column.element, \"height\", `${column.height}px`);\n        column.element.removeAttribute(\n          \"data-vivliostyle-column-height-adjusted\",\n        );\n      }\n    });\n    return frame.result();\n  }\n\n  /** @override */\n  createEdgeBreakPosition(\n    position: Vtree.NodeContext,\n    breakOnEdge: string | null,\n    overflows: boolean,\n    columnBlockSize: number,\n  ): LayoutType.BreakPosition {\n    return new BetweenTableRowBreakPosition(\n      position,\n      breakOnEdge,\n      overflows,\n      columnBlockSize,\n    );\n  }\n\n  /** @override */\n  startNonInlineElementNode(nodeContext: Vtree.NodeContext): boolean {\n    return false;\n  }\n\n  /** @override */\n  afterNonInlineElementNode(\n    nodeContext: Vtree.NodeContext,\n    stopAtOverflow: boolean,\n  ): boolean {\n    adjustRowHeight(nodeContext);\n    return false;\n  }\n\n  /** @override */\n  finishBreak(\n    column: Layout.Column,\n    nodeContext: Vtree.NodeContext,\n    forceRemoveSelf: boolean,\n    endOfColumn: boolean,\n  ): Task.Result<boolean> {\n    const formattingContext = getTableFormattingContext(\n      nodeContext.formattingContext,\n    );\n    if (nodeContext.display === \"table-row\") {\n      Asserts.assert(nodeContext.sourceNode);\n      const rowIndex = formattingContext.findRowIndexBySourceNode(\n        nodeContext.sourceNode,\n      );\n      formattingContext.cellBreakPositions = [];\n      let cells: TableCell[];\n      if (!nodeContext.after) {\n        cells = formattingContext.getCellsFallingOnRow(rowIndex);\n      } else {\n        cells =\n          formattingContext.getRowSpanningCellsOverflowingTheRow(rowIndex);\n      }\n      if (cells.length) {\n        const frame = Task.newFrame<boolean>(\n          \"TableLayoutProcessor.finishBreak\",\n        );\n        let i = 0;\n        frame\n          .loopWithFrame((loopFrame) => {\n            if (i === cells.length) {\n              loopFrame.breakLoop();\n              return;\n            }\n            const cell = cells[i++];\n            const cellFragment = formattingContext.getCellFragmentOfCell(cell);\n            const breakNodeContext =\n              cellFragment.findAcceptableBreakPosition().nodeContext;\n            Asserts.assert(breakNodeContext);\n            const cellNodeContext = cellFragment.cellNodeContext;\n            const cellNodePosition = cellNodeContext.toNodePosition();\n            const breakChunkPosition = new VtreeImpl.ChunkPosition(\n              breakNodeContext.toNodePosition(),\n            );\n            formattingContext.cellBreakPositions.push({\n              cellNodePosition,\n              breakChunkPosition,\n              cell,\n            } as BrokenTableCellPosition);\n            const cellViewNode =\n              cellNodeContext.viewNode as HTMLTableCellElement;\n            cellFragment.column.layoutContext.processFragmentedBlockEdge(\n              cellFragment.cellNodeContext,\n            );\n            if (rowIndex < cell.rowIndex + cell.rowSpan - 1) {\n              cellViewNode.rowSpan = rowIndex - cell.rowIndex + 1;\n            }\n            if (!cellFragment.empty) {\n              cellFragment.pseudoColumn\n                .finishBreak(breakNodeContext, false, true)\n                .then(() => {\n                  Asserts.assert(cellFragment);\n                  adjustCellHeight(\n                    cellFragment,\n                    formattingContext,\n                    breakNodeContext,\n                  );\n                  loopFrame.continueLoop();\n                });\n            } else {\n              loopFrame.continueLoop();\n            }\n          })\n          .then(() => {\n            column.clearOverflownViewNodes(nodeContext, false);\n            column.layoutContext.processFragmentedBlockEdge(nodeContext);\n            adjustRowHeight(nodeContext);\n            formattingContext.finishFragment();\n            frame.finish(true);\n          });\n        return frame.result();\n      }\n    }\n    adjustRowHeight(nodeContext);\n    formattingContext.finishFragment();\n    return LayoutProcessor.blockLayoutProcessor.finishBreak(\n      column,\n      nodeContext,\n      forceRemoveSelf,\n      endOfColumn,\n    );\n  }\n\n  /** @override */\n  clearOverflownViewNodes(\n    column: Layout.Column,\n    parentNodeContext: Vtree.NodeContext,\n    nodeContext: Vtree.NodeContext,\n    removeSelf: boolean,\n  ) {\n    LayoutProcessor.BlockLayoutProcessor.prototype.clearOverflownViewNodes(\n      column,\n      parentNodeContext,\n      nodeContext,\n      removeSelf,\n    );\n  }\n}\n\nfunction adjustCellHeight(\n  cellFragment: TableCellFragment,\n  formattingContext: TableFormattingContext,\n  breakNodeContext: Vtree.NodeContext,\n): void {\n  const repetitiveElements = formattingContext.getRepetitiveElements();\n  if (\n    !repetitiveElements ||\n    !(\n      repetitiveElements.isHeaderRegistered() ||\n      repetitiveElements.isFooterRegistered()\n    ) // Fix for issue #1458, case 1\n  ) {\n    return;\n  }\n  const vertical = formattingContext.vertical;\n  const column = cellFragment.column;\n  const cellContentElement = cellFragment.pseudoColumn.getColumnElement();\n  const cellElement = cellFragment.cellNodeContext.viewNode as Element;\n  const cellElementRect = LayoutHelper.getElementClientRectAdjusted(\n    column.clientLayout,\n    cellElement,\n    vertical,\n  );\n  const padding = column.getComputedPaddingBorder(cellElement);\n  if (vertical) {\n    const width =\n      cellElementRect.right -\n      column.footnoteEdge -\n      repetitiveElements.calculateOffset(breakNodeContext) -\n      padding.right;\n    Base.setCSSProperty(cellContentElement, \"max-width\", `${width}px`);\n  } else {\n    const height =\n      column.footnoteEdge -\n      repetitiveElements.calculateOffset(breakNodeContext) -\n      cellElementRect.top -\n      padding.top;\n    Base.setCSSProperty(cellContentElement, \"max-height\", `${height}px`);\n  }\n}\n\n/**\n * Adjusts the height of a table row to prevent another preceding row\n * containing fragmented rowspanning cells and dummy empty cells which\n * should have zero height from having non-zero height due to\n * Chromium's behavior when rowspanning cells exist.\n * (Fix for issue #1458, case 3)\n *\n * @param nodeContext - node context of table or table-row\n */\nfunction adjustRowHeight(nodeContext: Vtree.NodeContext): void {\n  const tbodyElement =\n    nodeContext.display === \"table-row\"\n      ? nodeContext.viewNode.parentElement\n      : nodeContext.display === \"table\"\n        ? (nodeContext.viewNode as Element).querySelector(\"tbody\")\n        : null;\n  if (!tbodyElement) {\n    return;\n  }\n  // Find row elements that only have rowspanning cells and empty cells.\n  let spanStartRows: NodeListOf<HTMLTableRowElement>;\n  try {\n    spanStartRows = tbodyElement.querySelectorAll(\n      \":scope>tr:has(>:empty):not(:has(>:not([rowspan]:not([rowspan='1']),:empty)))\",\n    );\n  } catch (e) {\n    // Do nothing if the browser does not support `:has()` to avoid error.\n    // (Workaround for issue #1509)\n    return;\n  }\n  if (spanStartRows.length === 0) {\n    return;\n  }\n  const spanStartRowHeight = Array.from(spanStartRows).reduce(\n    (totalHeight, rowElement) => {\n      const rect = rowElement.getBoundingClientRect();\n      const height = nodeContext.vertical ? rect.width : rect.height;\n      return totalHeight + height;\n    },\n    0,\n  );\n  const spanStartLastRow = spanStartRows[spanStartRows.length - 1];\n  const spanStartLastRowIndex = Array.from(tbodyElement.children).indexOf(\n    spanStartLastRow,\n  );\n  const rowSpan = Array.from(spanStartLastRow.children).reduce((r, cell) => {\n    const span = (cell as HTMLTableCellElement).rowSpan;\n    return span > 1 &&\n      spanStartLastRowIndex + span < tbodyElement.childElementCount\n      ? Math.max(r, span)\n      : r;\n  }, 0);\n  // Find the row element that needs to be adjusted.\n  let rowToBeAdjusted = rowSpan\n    ? tbodyElement.children[spanStartLastRowIndex + rowSpan - 1]\n    : tbodyElement.lastElementChild;\n  if (\n    rowToBeAdjusted != tbodyElement.lastElementChild &&\n    rowToBeAdjusted.querySelector(\":scope>*>div>div\")\n  ) {\n    for (\n      let row = rowToBeAdjusted;\n      row && row !== tbodyElement.lastElementChild;\n      row = row.nextElementSibling\n    ) {\n      if (row.querySelector(\":scope>[rowspan]:not([rowspan='1'])\")) {\n        rowToBeAdjusted = row;\n        break;\n      }\n    }\n  }\n  const rowRect = rowToBeAdjusted.getBoundingClientRect();\n  const rowHeight = nodeContext.vertical ? rowRect.width : rowRect.height;\n  const newRowHeight = spanStartRowHeight + rowHeight;\n  Base.setCSSProperty(\n    rowToBeAdjusted,\n    nodeContext.vertical ? \"width\" : \"height\",\n    `${newRowHeight}px`,\n  );\n}\n\nexport class LayoutRetryer extends LayoutRetryers.AbstractLayoutRetryer {\n  constructor(\n    private tableFormattingContext: TableFormattingContext,\n    private readonly processor: TableLayoutProcessor,\n  ) {\n    super();\n  }\n\n  override resolveLayoutMode(\n    nodeContext: Vtree.NodeContext,\n  ): LayoutType.LayoutMode {\n    const repetitiveElements =\n      this.tableFormattingContext.getRepetitiveElements();\n    if (!repetitiveElements || !repetitiveElements.doneInitialLayout) {\n      return new LayoutEntireTable(this.tableFormattingContext, this.processor);\n    } else {\n      if (\n        nodeContext.sourceNode ===\n          this.tableFormattingContext.tableSourceNode &&\n        !nodeContext.after\n      ) {\n        if (repetitiveElements) {\n          repetitiveElements.preventSkippingHeader();\n        }\n      }\n      return new LayoutFragmentedTable(\n        this.tableFormattingContext,\n        this.processor,\n      );\n    }\n  }\n\n  override clearNodes(initialPosition: Vtree.NodeContext) {\n    super.clearNodes(initialPosition);\n    const rootViewNode =\n      this.tableFormattingContext.getRootViewNode(initialPosition);\n    this.processor.removeColGroups(this.tableFormattingContext, rootViewNode);\n  }\n\n  override restoreState(nodeContext: Vtree.NodeContext, column: Layout.Column) {\n    super.restoreState(nodeContext, column);\n    this.tableFormattingContext.finishFragment();\n  }\n}\n\nexport class LayoutEntireTable extends RepetitiveElementImpl.LayoutEntireBlock {\n  constructor(\n    formattingContext: TableFormattingContext,\n    public readonly processor: TableLayoutProcessor,\n  ) {\n    super(formattingContext);\n  }\n\n  override doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    return this.processor.doInitialLayout(nodeContext, column);\n  }\n}\n\nexport class EntireTableBreakPosition extends BreakPosition.EdgeBreakPosition {\n  constructor(tableNodeContext: Vtree.NodeContext) {\n    super(tableNodeContext, null, tableNodeContext.overflow, 0);\n  }\n\n  override getMinBreakPenalty(): number {\n    if (!this.isEdgeUpdated) {\n      throw new Error(\"EdgeBreakPosition.prototype.updateEdge not called\");\n    }\n    return (\n      (this.overflows ? 3 : 0) +\n      (this.position.parent ? this.position.parent.breakPenalty : 0)\n    );\n  }\n\n  override breakPositionChosen(column: Layout.Column): void {\n    column.fragmentLayoutConstraints.push(\n      new EntireTableLayoutConstraint(this.position.sourceNode),\n    );\n  }\n}\n\nexport class EntireTableLayoutConstraint\n  implements Layout.FragmentLayoutConstraint\n{\n  flagmentLayoutConstraintType: FragmentLayoutConstraintType = \"EntireTable\";\n\n  constructor(public tableRootNode: Node) {}\n\n  /** @override */\n  allowLayout(\n    nodeContext: Vtree.NodeContext,\n    overflownNodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): boolean {\n    // If the nodeContext overflows, any EntireTableLayoutConstraint should not\n    // be registered in the first place. See\n    // TableLayoutProcessor.prototype.doInitialLayout.\n\n    Asserts.assert(!nodeContext.overflow);\n    return false;\n  }\n\n  /** @override */\n  nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n    return true;\n  }\n\n  /** @override */\n  postLayout(\n    allowed: boolean,\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: Layout.Column,\n  ) {\n    Asserts.assert(positionAfter.sourceNode);\n    tableLayoutOptionCache.push({\n      root: positionAfter.sourceNode,\n      tableLayoutOption: {\n        calculateBreakPositionsInside: true,\n      } as TableLayoutOption,\n    });\n  }\n\n  /** @override */\n  finishBreak(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<boolean> {\n    return Task.newResult(true);\n  }\n\n  /** @override */\n  equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n    return (\n      constraint instanceof EntireTableLayoutConstraint &&\n      constraint.tableRootNode === this.tableRootNode\n    );\n  }\n\n  /** @override */\n  getPriorityOfFinishBreak(): number {\n    return 0;\n  }\n}\n\nexport class LayoutFragmentedTable extends RepetitiveElementImpl.LayoutFragmentedBlock {\n  constructor(\n    formattingContext: TableFormattingContext,\n    public readonly processor: TableLayoutProcessor,\n  ) {\n    super(formattingContext);\n  }\n\n  override doLayout(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<Vtree.NodeContext> {\n    const repetitiveElements = this.formattingContext.getRepetitiveElements();\n    if (\n      repetitiveElements &&\n      !repetitiveElements.isAfterLastContent(nodeContext)\n    ) {\n      const constraint = new TableRowLayoutConstraint(nodeContext);\n      if (\n        !column.fragmentLayoutConstraints.some((c) => constraint.equalsTo(c))\n      ) {\n        column.fragmentLayoutConstraints.unshift(constraint);\n      }\n    }\n    return this.processor.doLayout(nodeContext, column);\n  }\n}\n\nexport class TableRowLayoutConstraint\n  extends RepetitiveElementImpl.RepetitiveElementsOwnerLayoutConstraint\n  implements Table.TableRowLayoutConstraint\n{\n  flagmentLayoutConstraintType: FragmentLayoutConstraintType = \"TableRow\";\n  cellFragmentLayoutConstraints: {\n    constraints: Layout.FragmentLayoutConstraint[];\n    breakPosition: Vtree.NodeContext;\n  }[] = [];\n\n  constructor(nodeContext: Vtree.NodeContext) {\n    super(nodeContext);\n  }\n\n  override allowLayout(\n    nodeContext: Vtree.NodeContext,\n    overflownNodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): boolean {\n    const repetitiveElements = this.getRepetitiveElements();\n    if (!repetitiveElements) {\n      return true;\n    }\n    if (column.pseudoParent) {\n      return true;\n    }\n    if (LayoutHelper.isOrphan(this.nodeContext.viewNode)) {\n      return true;\n    }\n    if (!repetitiveElements.isEnableToUpdateState()) {\n      return true;\n    }\n    if (\n      (overflownNodeContext && !nodeContext) ||\n      (nodeContext && nodeContext.overflow)\n    ) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  override nextCandidate(nodeContext: Vtree.NodeContext): boolean {\n    const formattingContext = getTableFormattingContext(\n      this.nodeContext.formattingContext,\n    );\n    const cellFragmentConstraints = this.collectCellFragmentLayoutConstraints(\n      nodeContext,\n      formattingContext,\n    );\n    if (\n      cellFragmentConstraints.some((entry) =>\n        entry.constraints.some((constraint) =>\n          constraint.nextCandidate(nodeContext),\n        ),\n      )\n    ) {\n      return true;\n    }\n    return super.nextCandidate(nodeContext);\n  }\n\n  override postLayout(\n    allowed: boolean,\n    positionAfter: Vtree.NodeContext,\n    initialPosition: Vtree.NodeContext,\n    column: Layout.Column,\n  ) {\n    const formattingContext = getTableFormattingContext(\n      this.nodeContext.formattingContext,\n    );\n    this.cellFragmentLayoutConstraints =\n      this.collectCellFragmentLayoutConstraints(\n        positionAfter,\n        formattingContext,\n      );\n    this.cellFragmentLayoutConstraints.forEach((entry) => {\n      entry.constraints.forEach((constraint) => {\n        constraint.postLayout(\n          allowed,\n          entry.breakPosition,\n          initialPosition,\n          column,\n        );\n      });\n    });\n    if (!allowed) {\n      const rootViewNode = formattingContext.getRootViewNode(this.nodeContext);\n      new TableLayoutProcessor().removeColGroups(\n        formattingContext,\n        rootViewNode as Element,\n      );\n      this.removeDummyRowNodes(initialPosition);\n    }\n    super.postLayout(allowed, positionAfter, initialPosition, column);\n  }\n\n  override finishBreak(\n    nodeContext: Vtree.NodeContext,\n    column: Layout.Column,\n  ): Task.Result<boolean> {\n    const formattingContext = getTableFormattingContext(\n      this.nodeContext.formattingContext,\n    );\n    const frame: Task.Frame<boolean> = Task.newFrame(\"finishBreak\");\n    const constraints = this.cellFragmentLayoutConstraints.reduce(\n      (array, entry) =>\n        array.concat(\n          entry.constraints.map((constraint) => ({\n            constraint,\n            breakPosition: entry.breakPosition,\n          })),\n        ),\n      [],\n    );\n    let i = 0;\n    frame\n      .loop(() => {\n        if (i < constraints.length) {\n          const entry = constraints[i++];\n          return entry.constraint\n            .finishBreak(entry.breakPosition, column)\n            .thenReturn(true);\n        } else {\n          return Task.newResult(false);\n        }\n      })\n      .then(() => {\n        frame.finish(true);\n      });\n    return frame\n      .result()\n      .thenAsync(() => super.finishBreak(nodeContext, column));\n  }\n\n  removeDummyRowNodes(nodeContext: Vtree.NodeContext) {\n    if (\n      !nodeContext ||\n      nodeContext.display !== \"table-row\" ||\n      !nodeContext.viewNode\n    ) {\n      return;\n    }\n    while ((nodeContext.viewNode as Element).previousElementSibling) {\n      const dummyNode = (nodeContext.viewNode as Element)\n        .previousElementSibling;\n      if (dummyNode.parentNode) {\n        dummyNode.parentNode.removeChild(dummyNode);\n      }\n    }\n  }\n\n  private collectCellFragmentLayoutConstraints(\n    nodeContext: Vtree.NodeContext,\n    formattingContext: TableFormattingContext,\n  ): {\n    constraints: Layout.FragmentLayoutConstraint[];\n    breakPosition: Vtree.NodeContext;\n  }[] {\n    return this.getCellFragemnts(nodeContext, formattingContext).map(\n      (entry) => ({\n        constraints:\n          entry.fragment.pseudoColumn.getColumn().fragmentLayoutConstraints,\n        breakPosition: entry.breakPosition,\n      }),\n    );\n  }\n\n  private getCellFragemnts(\n    nodeContext: Vtree.NodeContext,\n    formattingContext: TableFormattingContext,\n  ): { fragment: TableCellFragment; breakPosition: Vtree.NodeContext }[] {\n    let rowIndex = Number.MAX_VALUE;\n    if (nodeContext && nodeContext.display === \"table-row\") {\n      Asserts.assert(nodeContext.sourceNode);\n      rowIndex =\n        formattingContext.findRowIndexBySourceNode(nodeContext.sourceNode) + 1;\n    }\n    rowIndex = Math.min(formattingContext.cellFragments.length, rowIndex);\n    const cellFragments = [];\n    for (let i = 0; i < rowIndex; i++) {\n      if (!formattingContext.cellFragments[i]) {\n        continue;\n      }\n      formattingContext.cellFragments[i].forEach((cellFragment) => {\n        if (!cellFragment) {\n          return;\n        }\n        cellFragments.push({\n          fragment: cellFragment,\n          breakPosition: cellFragment.findAcceptableBreakPosition().nodeContext,\n        });\n      });\n    }\n    return cellFragments;\n  }\n\n  getElementsOffsetsForTableCell(\n    column: Layout.Column,\n  ): RepetitiveElement.ElementsOffset[] {\n    const formattingContext = getTableFormattingContext(\n      this.nodeContext.formattingContext,\n    );\n    const position = formattingContext.findCellFromColumn(column);\n    if (position) {\n      return formattingContext.collectElementsOffsetOfUpperCells(position);\n    } else {\n      return formattingContext.collectElementsOffsetOfHighestColumn();\n    }\n  }\n\n  override equalsTo(constraint: Layout.FragmentLayoutConstraint): boolean {\n    if (!(constraint instanceof TableRowLayoutConstraint)) {\n      return false;\n    }\n    return (\n      getTableFormattingContext(this.nodeContext.formattingContext) ===\n      getTableFormattingContext(constraint.nodeContext.formattingContext)\n    );\n  }\n}\n\nconst tableLayoutProcessor = new TableLayoutProcessor();\n\nfunction resolveFormattingContextHook(\n  nodeContext: Vtree.NodeContext,\n  firstTime: boolean,\n  display: Css.Ident,\n  position: Css.Ident,\n  floatSide: Css.Val,\n  isRoot: boolean,\n): TableFormattingContext | null {\n  if (!firstTime) {\n    return null;\n  }\n  if (display === Css.ident.table) {\n    const parent = nodeContext.parent;\n    return new TableFormattingContext(\n      parent ? parent.formattingContext : null,\n      nodeContext.sourceNode as Element,\n    );\n  }\n  return null;\n}\n\nfunction resolveLayoutProcessor(\n  formattingContext,\n): TableLayoutProcessor | null {\n  if (formattingContext instanceof TableFormattingContext) {\n    return tableLayoutProcessor;\n  }\n  return null;\n}\n\nPlugin.registerHook(\n  Plugin.HOOKS.RESOLVE_FORMATTING_CONTEXT,\n  resolveFormattingContextHook,\n);\n\nPlugin.registerHook(\n  Plugin.HOOKS.RESOLVE_LAYOUT_PROCESSOR,\n  resolveLayoutProcessor,\n);\n","/**\n * Copyright 2017 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview MathUtil - Math utilities\n */\n\n/** */\nexport function mean(array: number[]): number {\n  return array.reduce((prev, curr) => prev + curr, 0) / array.length;\n}\n\nexport function variance(array: number[]): number {\n  const meanValue = mean(array);\n  return mean(\n    array.map((x) => {\n      const d = x - meanValue;\n      return d * d;\n    }),\n  );\n}\n","/**\n * Copyright 2017 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Columns - Control column layout.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Css from \"./css\";\nimport * as MathUtil from \"./math-util\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Task from \"./task\";\nimport * as Vtree from \"./vtree\";\nimport { Layout } from \"./types\";\n\nexport type ColumnLayoutResult = {\n  columns: Layout.Column[];\n  position: Vtree.LayoutPosition;\n  columnPageFloatLayoutContexts?: PageFloats.PageFloatLayoutContext[];\n};\n\nexport type ColumnGenerator = () => Task.Result<ColumnLayoutResult | null>;\n\nexport class ColumnBalancingTrialResult {\n  constructor(\n    public readonly layoutResult: ColumnLayoutResult,\n    public readonly penalty: number,\n  ) {}\n}\n\nfunction getBlockSize(container: Vtree.Container): number {\n  if (container.vertical) {\n    return container.width;\n  } else {\n    return container.height;\n  }\n}\n\nfunction setBlockSize(container: Vtree.Container, size: number) {\n  if (container.vertical) {\n    container.width = size;\n  } else {\n    container.height = size;\n  }\n}\n\nexport abstract class ColumnBalancer {\n  originalContainerBlockSize: number;\n\n  constructor(\n    public readonly layoutContainer: Vtree.Container,\n    public readonly columnGenerator: ColumnGenerator,\n    public readonly regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  ) {\n    this.originalContainerBlockSize = getBlockSize(layoutContainer);\n  }\n\n  balanceColumns(\n    layoutResult: ColumnLayoutResult,\n  ): Task.Result<ColumnLayoutResult> {\n    const frame: Task.Frame<ColumnLayoutResult> = Task.newFrame(\n      \"ColumnBalancer#balanceColumns\",\n    );\n    this.preBalance(layoutResult);\n    this.savePageFloatLayoutContexts(layoutResult);\n    this.layoutContainer.clear();\n    const candidates = [this.createTrialResult(layoutResult)];\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (!this.hasNextCandidate(candidates)) {\n          loopFrame.breakLoop();\n          return;\n        }\n        this.updateCondition(candidates);\n        this.columnGenerator().then((layoutResult) => {\n          this.savePageFloatLayoutContexts(layoutResult);\n          this.layoutContainer.clear();\n          if (!layoutResult) {\n            loopFrame.breakLoop();\n            return;\n          }\n          candidates.push(this.createTrialResult(layoutResult));\n          loopFrame.continueLoop();\n        });\n      })\n      .then(() => {\n        const result = candidates.reduce(\n          (prev, curr) => (curr.penalty < prev.penalty ? curr : prev),\n          candidates[0],\n        );\n        this.restoreContents(result.layoutResult);\n        this.postBalance();\n        frame.finish(result.layoutResult);\n      });\n    return frame.result();\n  }\n\n  private createTrialResult(\n    layoutResult: ColumnLayoutResult,\n  ): ColumnBalancingTrialResult {\n    const penalty = this.calculatePenalty(layoutResult);\n    return new ColumnBalancingTrialResult(layoutResult, penalty);\n  }\n\n  protected preBalance(layoutResult: ColumnLayoutResult) {}\n\n  protected abstract calculatePenalty(layoutResult: ColumnLayoutResult): number;\n\n  protected abstract hasNextCandidate(\n    candidates: ColumnBalancingTrialResult[],\n  ): boolean;\n\n  protected abstract updateCondition(\n    candidates: ColumnBalancingTrialResult[],\n  ): void;\n\n  protected postBalance() {\n    setBlockSize(this.layoutContainer, this.originalContainerBlockSize);\n  }\n\n  savePageFloatLayoutContexts(layoutResult: ColumnLayoutResult | null) {\n    const children = this.regionPageFloatLayoutContext.detachChildren();\n    if (layoutResult) {\n      layoutResult.columnPageFloatLayoutContexts = children;\n    }\n  }\n\n  private restoreContents(newLayoutResult: ColumnLayoutResult) {\n    const parent = this.layoutContainer.element;\n    newLayoutResult.columns.forEach((c) => {\n      parent.appendChild(c.element);\n    });\n    Asserts.assert(newLayoutResult.columnPageFloatLayoutContexts);\n    this.regionPageFloatLayoutContext.attachChildren(\n      newLayoutResult.columnPageFloatLayoutContexts,\n    );\n  }\n}\nconst COLUMN_LENGTH_STEP = 1;\n\nexport function canReduceContainerSize(\n  candidates: ColumnBalancingTrialResult[],\n): boolean {\n  const lastCandidate = candidates[candidates.length - 1];\n  if (lastCandidate.penalty === 0) {\n    return false;\n  }\n  const secondLastCandidate = candidates[candidates.length - 2];\n  if (\n    secondLastCandidate &&\n    lastCandidate.penalty >= secondLastCandidate.penalty\n  ) {\n    return false;\n  }\n  const columns = lastCandidate.layoutResult.columns;\n  const maxColumnBlockSize = Math.max.apply(\n    null,\n    columns.map((c) => c.computedBlockSize),\n  );\n  const maxPageFloatBlockSize = Math.max.apply(\n    null,\n    columns.map((c) => c.getMaxBlockSizeOfPageFloats()),\n  );\n  return maxColumnBlockSize > maxPageFloatBlockSize + COLUMN_LENGTH_STEP;\n}\n\nexport function reduceContainerSize(\n  candidates: ColumnBalancingTrialResult[],\n  container: Vtree.Container,\n): void {\n  const columns = candidates[candidates.length - 1].layoutResult.columns;\n  const maxColumnBlockSize = Math.max.apply(\n    null,\n    columns.map((c) => {\n      if (!isNaN(c.blockDistanceToBlockEndFloats)) {\n        return (\n          c.computedBlockSize -\n          c.blockDistanceToBlockEndFloats +\n          COLUMN_LENGTH_STEP\n        );\n      } else {\n        return c.computedBlockSize;\n      }\n    }),\n  );\n  const newEdge = maxColumnBlockSize - COLUMN_LENGTH_STEP;\n  if (newEdge < getBlockSize(container)) {\n    setBlockSize(container, newEdge);\n  } else {\n    setBlockSize(container, getBlockSize(container) - 1);\n  }\n  if (container.vertical) {\n    const outerWidth = parseFloat(container.element.style?.width);\n    container.originX = outerWidth - container.width;\n  }\n}\n\nexport class BalanceLastColumnBalancer extends ColumnBalancer {\n  originalPosition: Vtree.LayoutPosition | null = null;\n  foundUpperBound: boolean = false;\n\n  constructor(\n    columnGenerator: ColumnGenerator,\n    regionPageFloatLayoutContext,\n    layoutContainer: Vtree.Container,\n    public readonly columnCount: number,\n  ) {\n    super(layoutContainer, columnGenerator, regionPageFloatLayoutContext);\n  }\n\n  override preBalance(layoutResult: ColumnLayoutResult) {\n    const columns = layoutResult.columns;\n    const totalBlockSize = columns.reduce(\n      (prev, c) => prev + c.computedBlockSize,\n      0,\n    );\n    setBlockSize(this.layoutContainer, totalBlockSize / this.columnCount);\n    this.originalPosition = layoutResult.position;\n  }\n\n  private checkPosition(position: Vtree.LayoutPosition | null): boolean {\n    if (this.originalPosition) {\n      return this.originalPosition.isSamePosition(position);\n    } else {\n      return position === null;\n    }\n  }\n\n  override calculatePenalty(layoutResult: ColumnLayoutResult): number {\n    if (!this.checkPosition(layoutResult.position)) {\n      return Infinity;\n    }\n    const columns = layoutResult.columns;\n    if (isLastColumnLongerThanAnyOtherColumn(columns)) {\n      return Infinity;\n    }\n    return Math.max.apply(\n      null,\n      columns.map((c) => c.computedBlockSize),\n    );\n  }\n\n  override hasNextCandidate(candidates: ColumnBalancingTrialResult[]): boolean {\n    if (candidates.length === 1) {\n      return true;\n    } else if (this.foundUpperBound) {\n      return canReduceContainerSize(candidates);\n    } else {\n      const lastCandidate = candidates[candidates.length - 1];\n      if (this.checkPosition(lastCandidate.layoutResult.position)) {\n        if (\n          !isLastColumnLongerThanAnyOtherColumn(\n            lastCandidate.layoutResult.columns,\n          )\n        ) {\n          this.foundUpperBound = true;\n          return true;\n        }\n      }\n      return (\n        getBlockSize(this.layoutContainer) < this.originalContainerBlockSize\n      );\n    }\n  }\n\n  override updateCondition(candidates: ColumnBalancingTrialResult[]): void {\n    if (this.foundUpperBound) {\n      reduceContainerSize(candidates, this.layoutContainer);\n    } else {\n      const newEdge = Math.min(\n        this.originalContainerBlockSize,\n        getBlockSize(this.layoutContainer) +\n          this.originalContainerBlockSize * 0.1,\n      );\n      setBlockSize(this.layoutContainer, newEdge);\n    }\n  }\n}\n\nfunction isLastColumnLongerThanAnyOtherColumn(\n  columns: Layout.Column[],\n): boolean {\n  if (columns.length <= 1) {\n    return false;\n  }\n  const lastColumnBlockSize = columns[columns.length - 1].computedBlockSize;\n  const otherColumns = columns.slice(0, columns.length - 1);\n\n  // The computedBlockSize of the last column may be a little larger than\n  // the others even though columns are balanced, because of the issue\n  // that only the last column's computedBlockSize includes the last\n  // half-leading space.\n  // To work around this, we add an error margin to the other columns.\n  const errorMargin = 6;\n  return otherColumns.every(\n    (c) => lastColumnBlockSize > c.computedBlockSize + errorMargin,\n  );\n}\n\nexport class BalanceNonLastColumnBalancer extends ColumnBalancer {\n  constructor(\n    columnGenerator: ColumnGenerator,\n    regionPageFloatLayoutContext,\n    layoutContainer: Vtree.Container,\n  ) {\n    super(layoutContainer, columnGenerator, regionPageFloatLayoutContext);\n  }\n\n  override calculatePenalty(layoutResult: ColumnLayoutResult): number {\n    if (layoutResult.columns.every((c) => c.computedBlockSize === 0)) {\n      return Infinity;\n    }\n    const computedBlockSizes = layoutResult.columns\n      .filter((c) => !c.pageBreakType)\n      .map((c) => c.computedBlockSize);\n    return MathUtil.variance(computedBlockSizes);\n  }\n\n  override hasNextCandidate(candidates: ColumnBalancingTrialResult[]): boolean {\n    return canReduceContainerSize(candidates);\n  }\n\n  override updateCondition(candidates: ColumnBalancingTrialResult[]): void {\n    reduceContainerSize(candidates, this.layoutContainer);\n  }\n}\n\nexport function createColumnBalancer(\n  columnCount: number,\n  columnFill: Css.Ident,\n  columnGenerator: ColumnGenerator,\n  regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  layoutContainer: Vtree.Container,\n  columns: Layout.Column[],\n  flowPosition: Vtree.FlowPosition,\n): ColumnBalancer | null {\n  if (columnFill === Css.ident.auto) {\n    return null;\n  } else {\n    // TODO: how to handle a case where no more in-flow contents but some\n    // page floats\n    const noMoreContent = flowPosition.positions.length === 0;\n    const lastColumn = columns[columns.length - 1];\n    const isLastColumnForceBroken = !!(lastColumn && lastColumn.pageBreakType);\n    if (noMoreContent || isLastColumnForceBroken) {\n      return new BalanceLastColumnBalancer(\n        columnGenerator,\n        regionPageFloatLayoutContext,\n        layoutContainer,\n        columnCount,\n      );\n    } else if (columnFill === Css.ident.balance_all) {\n      return new BalanceNonLastColumnBalancer(\n        columnGenerator,\n        regionPageFloatLayoutContext,\n        layoutContainer,\n      );\n    } else {\n      Asserts.assert(columnFill === Css.ident.balance);\n      return null;\n    }\n  }\n}\n","/**\n * Copyright 2025 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/**\n * Not implemented:\n *\n * - Support using <image> in <symbol>\n *     https://drafts.csswg.org/css-counter-styles/#typedef-symbol\n *\n * - Make the disclosure-open/closed values respond to writing modes\n *     https://drafts.csswg.org/css-counter-styles/#disclosure-open\n *   CounterStyle.format may require the writing mode as an argument.\n *   It may be necessary to extend it so that the caller can obtain the writing mode.\n *\n * - Use grapheme clusters for character counting in CounterStyle.#applyPadding.\n *     https://drafts.csswg.org/css-counter-styles/#counter-style-pad\n *   Intl.Segmenter may be useful. CounterStyle.format may require the lang as an argument.\n *\n * - Implement symbols() for defining anonymous counter styles\n *     https://drafts.csswg.org/css-counter-styles/#symbols-function\n *   Extending CounterStyle.defineAnonymous( ... ) should work.\n */\n\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\n\ntype SetElement<T> = T extends ReadonlySet<infer U> ? U : never;\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#non-overridable-counter-style-names\n */\nconst nonOverridableNameList = [\n  \"decimal\",\n  \"disc\",\n  \"square\",\n  \"circle\",\n  \"disclosure-open\",\n  \"disclosure-closed\",\n] as const;\nconst nonOverridableNames: ReadonlySet<\n  (typeof nonOverridableNameList)[number]\n> = new Set(nonOverridableNameList);\n\nfunction validateNameForDefinition(name: string): boolean {\n  // case-insensitive for none\n  // case-sensitive for non-overridable\n  return !(\n    name.toLowerCase() === \"none\" ||\n    nonOverridableNames.has(\n      // @ts-expect-error check membership\n      name,\n    )\n  );\n}\n\nconst systemsDefinedBySingleIdentList = [\n  \"cyclic\",\n  \"numeric\",\n  \"alphabetic\",\n  \"symbolic\",\n  \"additive\",\n  \"fixed\",\n] as const;\nconst systemsDefinedBySingleIdent: ReadonlySet<\n  (typeof systemsDefinedBySingleIdentList)[number]\n> = new Set(systemsDefinedBySingleIdentList);\n\nconst systemsDefinedBySpaceListList = [\n  // [ fixed <integer> ]\n  \"fixed\",\n  // [ extends <counter-style-name> ]\n  \"extends\",\n] as const;\nconst systemsDefinedBySpaceList: ReadonlySet<\n  (typeof systemsDefinedBySpaceListList)[number]\n> = new Set(systemsDefinedBySpaceListList);\n\nconst notCaseInsensitiveMatchForNoneBrand = Symbol();\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#typedef-counter-style-name\n */\ntype CounterStyleName = Css.Ident & {\n  [notCaseInsensitiveMatchForNoneBrand]: unknown;\n};\nfunction validateCounterStyleName(value: Css.Val): value is CounterStyleName {\n  return value instanceof Css.Ident && value.name.toLowerCase() !== \"none\";\n}\nfunction extractCounterStyleName(name: CounterStyleName): string {\n  return name.name;\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-system\n */\ntype CyclicSystemValue = Css.Ident & { name: \"cyclic\" };\ntype FixedSystemValue =\n  | (Css.Ident & { name: \"fixed\" })\n  | (Css.SpaceList & { values: [Css.Ident & { name: \"fixed\" }, Css.Int] });\ntype SymbolicSystemValue = Css.Ident & { name: \"symbolic\" };\ntype AlphabeticSystemValue = Css.Ident & { name: \"alphabetic\" };\ntype NumericSystemValue = Css.Ident & { name: \"numeric\" };\ntype AdditiveSystemValue = Css.Ident & { name: \"additive\" };\ntype ExtendsSystemValue = Css.SpaceList & {\n  values: [Css.Ident & { name: \"extends\" }, CounterStyleName];\n};\n\ntype SystemDescriptorValue =\n  | CyclicSystemValue\n  | FixedSystemValue\n  | SymbolicSystemValue\n  | AlphabeticSystemValue\n  | NumericSystemValue\n  | AdditiveSystemValue\n  | ExtendsSystemValue;\n\nfunction validateSystem(value: Css.Val): value is SystemDescriptorValue {\n  if (value instanceof Css.Ident) {\n    return systemsDefinedBySingleIdent.has(\n      // @ts-expect-error check membership\n      value.name,\n    );\n  }\n  if (value instanceof Css.SpaceList && value.values.length === 2) {\n    const first = value.values[0]!;\n    const second = value.values[1]!;\n    if (first instanceof Css.Ident) {\n      const name = first.name;\n      return (\n        systemsDefinedBySpaceList.has(\n          // @ts-expect-error check membership\n          name,\n        ) &&\n        ((name === \"fixed\" && second instanceof Css.Int) ||\n          (name === \"extends\" && validateCounterStyleName(second)))\n      );\n    }\n  }\n  return false;\n}\n\n// Descriptors type with specific system value\ntype SystemDescriptors<T extends SystemDescriptorValue> =\n  CssCascade.ElementStyle & {\n    system: CssCascade.CascadeValue & { value: T };\n  };\n\ntype CyclicDescriptors = SystemDescriptors<CyclicSystemValue>;\ntype FixedDescriptors = SystemDescriptors<FixedSystemValue>;\ntype SymbolicDescriptors =\n  | CssCascade.ElementStyle\n  | SystemDescriptors<SymbolicSystemValue>;\ntype AlphabeticDescriptors = SystemDescriptors<AlphabeticSystemValue>;\ntype NumericDescriptors = SystemDescriptors<NumericSystemValue>;\ntype AdditiveDescriptors = SystemDescriptors<AdditiveSystemValue>;\ntype ExtendsDescriptors = SystemDescriptors<ExtendsSystemValue>;\n\nfunction isCyclicDescriptors(\n  descriptors: CssCascade.ElementStyle,\n): descriptors is CyclicDescriptors {\n  const system = getDescriptorValue(descriptors, \"system\");\n  return system instanceof Css.Ident && system.name === \"cyclic\";\n}\n\nfunction isFixedDescriptors(\n  descriptors: CssCascade.ElementStyle,\n): descriptors is FixedDescriptors {\n  const system = getDescriptorValue(descriptors, \"system\");\n  if (system instanceof Css.Ident && system.name === \"fixed\") {\n    return true;\n  }\n  if (system instanceof Css.SpaceList && system.values.length === 2) {\n    const [first, second] = system.values;\n    return (\n      first instanceof Css.Ident &&\n      first.name === \"fixed\" &&\n      second instanceof Css.Int\n    );\n  }\n  return false;\n}\n\nfunction extractFixedFirstSymbolValue(descriptors: FixedDescriptors): number {\n  const system = getDescriptorValue(descriptors, \"system\") as FixedSystemValue;\n  if (system instanceof Css.Ident) {\n    return 1;\n  }\n  return system.values[1].num;\n}\n\nfunction isAlphabeticDescriptors(\n  descriptors: CssCascade.ElementStyle,\n): descriptors is AlphabeticDescriptors {\n  const system = getDescriptorValue(descriptors, \"system\");\n  return system instanceof Css.Ident && system.name === \"alphabetic\";\n}\n\nfunction isNumericDescriptors(\n  descriptors: CssCascade.ElementStyle,\n): descriptors is NumericDescriptors {\n  const system = getDescriptorValue(descriptors, \"system\");\n  return system instanceof Css.Ident && system.name === \"numeric\";\n}\n\nfunction isAdditiveDescriptors(\n  descriptors: CssCascade.ElementStyle,\n): descriptors is AdditiveDescriptors {\n  const system = getDescriptorValue(descriptors, \"system\");\n  return system instanceof Css.Ident && system.name === \"additive\";\n}\n\nfunction isExtendsDescriptors(\n  descriptors: CssCascade.ElementStyle,\n): descriptors is ExtendsDescriptors {\n  const system = getDescriptorValue(descriptors, \"system\");\n  if (system instanceof Css.SpaceList && system.values.length === 2) {\n    const [first, second] = system.values;\n    return (\n      first instanceof Css.Ident &&\n      first.name === \"extends\" &&\n      validateCounterStyleName(second)\n    );\n  }\n  return false;\n}\n\nfunction extractExtendsBaseName(descriptors: ExtendsDescriptors): string {\n  const system = getDescriptorValue(\n    descriptors,\n    \"system\",\n  ) as ExtendsSystemValue;\n  return extractCounterStyleName(system.values[1]);\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#typedef-symbol\n */\ntype SymbolType = Css.Str | Css.Ident;\nfunction validateSymbol(value: Css.Val): value is SymbolType {\n  return value instanceof Css.Str || value instanceof Css.Ident;\n}\nfunction extractSymbol(symbol: SymbolType): string {\n  // > Identifiers are rendered as strings containing the same characters.\n  return symbol instanceof Css.Str ? symbol.str : symbol.name;\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-negative\n */\ntype NegativeDescriptorValue =\n  | SymbolType\n  | (Css.SpaceList & { values: [SymbolType, SymbolType] });\nfunction validateNegative(value: Css.Val): value is NegativeDescriptorValue {\n  if (validateSymbol(value)) {\n    return true;\n  }\n  if (value instanceof Css.SpaceList && value.values.length === 2) {\n    const first = value.values[0]!;\n    const second = value.values[1]!;\n    return validateSymbol(first) && validateSymbol(second);\n  }\n  return false;\n}\ntype Negative = Readonly<{ prefix: string; suffix: string | null }>;\nfunction extractNegative(negative: NegativeDescriptorValue): Negative {\n  if (validateSymbol(negative)) {\n    return { prefix: extractSymbol(negative), suffix: null };\n  } else {\n    const first = negative.values[0];\n    const second = negative.values[1];\n    return {\n      prefix: extractSymbol(first),\n      suffix: extractSymbol(second),\n    };\n  }\n}\n\ntype RangeBound = Css.Int | (Css.Ident & { name: \"infinite\" });\nfunction validateRangeBound(value: Css.Val): value is RangeBound {\n  return (\n    value instanceof Css.Int ||\n    (value instanceof Css.Ident && value.name === \"infinite\")\n  );\n}\nfunction extractRangeBound(bound: RangeBound, isLower: boolean): number {\n  return bound instanceof Css.Int ? bound.num : isLower ? -Infinity : Infinity;\n}\n\nconst upperAtOrAboveLowerBrand = Symbol();\ntype RangeTuple = Css.SpaceList & {\n  values: [RangeBound, RangeBound] & {\n    [upperAtOrAboveLowerBrand]: unknown;\n  };\n};\nfunction validateRangeTuple(value: Css.Val): value is RangeTuple {\n  if (!(value instanceof Css.SpaceList && value.values.length === 2)) {\n    return false;\n  }\n  const first = value.values[0]!;\n  const second = value.values[1]!;\n  if (!(validateRangeBound(first) && validateRangeBound(second))) {\n    return false;\n  }\n  const lower = extractRangeBound(first, true);\n  const upper = extractRangeBound(second, false);\n  if (lower > upper) {\n    return false;\n  }\n  return true;\n}\nfunction extractRangeTuple(tuple: RangeTuple): RangeItem {\n  return {\n    lower: extractRangeBound(tuple.values[0], true),\n    upper: extractRangeBound(tuple.values[1], false),\n  };\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-range\n */\ntype RangeDescriptorValue =\n  | (Css.Ident & { name: \"auto\" })\n  | RangeTuple\n  | (Css.CommaList & { values: [RangeTuple, ...RangeTuple[]] });\nfunction validateRange(value: Css.Val): value is RangeDescriptorValue {\n  return (\n    (value instanceof Css.Ident && value.name === \"auto\") ||\n    validateRangeTuple(value) ||\n    (value instanceof Css.CommaList &&\n      value.values.length >= 1 &&\n      value.values.every((tuple) => validateRangeTuple(tuple)))\n  );\n}\ntype RangeItem = Readonly<{ lower: number; upper: number }>;\ntype Range = readonly [RangeItem, ...RangeItem[]];\nfunction extractRange(range: RangeDescriptorValue): Range | null {\n  if (range instanceof Css.Ident) {\n    return null;\n  }\n  // > The range of the counter style is the union of all the ranges defined in the list.\n  const tuples = validateRangeTuple(range) ? [range] : range.values;\n  return tuples.map((tuple) => extractRangeTuple(tuple)) as unknown as Range;\n}\n\nconst nonNegativeBrand = Symbol();\ntype NonNegativeInt = Css.Int & { [nonNegativeBrand]: unknown };\n/**\n * <integer [0,inf]> && <symbol>\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-pad\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-additive-symbols\n */\ntype NonNegativeIntAndSymbolSet = Css.SpaceList & {\n  values: [NonNegativeInt, SymbolType] | [SymbolType, NonNegativeInt];\n};\nfunction validateNonNegativeIntAndSymbolSet(\n  value: Css.Val,\n): value is NonNegativeIntAndSymbolSet {\n  if (!(value instanceof Css.SpaceList && value.values.length === 2)) {\n    return false;\n  }\n  const first = value.values[0]!;\n  const second = value.values[1]!;\n  return (\n    (first instanceof Css.Int && first.num >= 0 && validateSymbol(second)) ||\n    (validateSymbol(first) && second instanceof Css.Int && second.num >= 0)\n  );\n}\nfunction extractNonNegativeIntAndSymbolSet(\n  set: NonNegativeIntAndSymbolSet,\n): readonly [number, string] {\n  const [first, second] = set.values;\n  return first instanceof Css.Int\n    ? [first.num, extractSymbol(second as SymbolType)]\n    : [(second as NonNegativeInt).num, extractSymbol(first as SymbolType)];\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-pad\n */\ntype PadDescriptorValue = NonNegativeIntAndSymbolSet;\nfunction validatePad(value: Css.Val): value is PadDescriptorValue {\n  return validateNonNegativeIntAndSymbolSet(value);\n}\ntype Pad = Readonly<{ minLength: number; symbol: string }>;\nfunction extractPad(pad: PadDescriptorValue): Pad {\n  const [minLength, symbol] = extractNonNegativeIntAndSymbolSet(pad);\n  return { minLength, symbol };\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-symbols\n */\ntype SymbolsDescriptorValue =\n  | SymbolType\n  | (Omit<Css.SpaceList, \"values\"> & {\n      values: readonly [SymbolType, ...SymbolType[]];\n    });\nfunction validateSymbols(value: Css.Val): value is SymbolsDescriptorValue {\n  return (\n    validateSymbol(value) ||\n    (value instanceof Css.SpaceList &&\n      value.values.length >= 1 &&\n      value.values.every((val) => validateSymbol(val)))\n  );\n}\nfunction extractSymbols(\n  symbols: SymbolsDescriptorValue,\n): readonly [string, ...string[]] {\n  return validateSymbol(symbols)\n    ? [extractSymbol(symbols)]\n    : (symbols.values.map((symbol) => extractSymbol(symbol)) as [\n        string,\n        ...string[],\n      ]);\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#additive-tuple\n */\ntype AdditiveTuple = NonNegativeIntAndSymbolSet;\nconst strictlyDescendingWeightOrderBrand = Symbol();\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-additive-symbols\n */\ntype AdditiveSymbolsDescriptorValue =\n  | AdditiveTuple\n  | (Omit<Css.CommaList, \"values\"> & {\n      values: [AdditiveTuple, ...AdditiveTuple[]] & {\n        [strictlyDescendingWeightOrderBrand]: unknown;\n      };\n    });\nfunction validateAdditiveSymbols(\n  value: Css.Val,\n): value is AdditiveSymbolsDescriptorValue {\n  if (validateNonNegativeIntAndSymbolSet(value)) {\n    return true;\n  }\n  if (value instanceof Css.CommaList && value.values.length >= 1) {\n    let prevWeight = Infinity;\n    for (const set of value.values) {\n      if (!validateNonNegativeIntAndSymbolSet(set)) {\n        return false;\n      }\n      const [weight] = extractNonNegativeIntAndSymbolSet(set);\n      // must be in strictly descending weight order\n      if (weight >= prevWeight) {\n        return false;\n      }\n      prevWeight = weight;\n    }\n    return true;\n  }\n  return false;\n}\ntype AdditiveSymbol = Readonly<{ weight: number; symbol: string }>;\nfunction extractAdditiveSymbols(\n  additiveSymbols: AdditiveSymbolsDescriptorValue,\n): readonly [AdditiveSymbol, ...AdditiveSymbol[]] {\n  if (validateNonNegativeIntAndSymbolSet(additiveSymbols)) {\n    const [weight, symbol] = extractNonNegativeIntAndSymbolSet(additiveSymbols);\n    return [{ weight, symbol }];\n  } else {\n    return additiveSymbols.values.map((set) => {\n      const [weight, symbol] = extractNonNegativeIntAndSymbolSet(set);\n      return { weight, symbol };\n    }) as [AdditiveSymbol, ...AdditiveSymbol[]];\n  }\n}\n\nconst speakAsIdentList = [\n  \"auto\",\n  \"bullets\",\n  \"numbers\",\n  \"words\",\n  \"spell-out\",\n] as const;\nconst speakAsIdents: ReadonlySet<(typeof speakAsIdentList)[number]> = new Set(\n  speakAsIdentList,\n);\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#descdef-counter-style-speak-as\n */\ntype SpeakAsDescriptorValue =\n  | (Css.Ident & {\n      name: SetElement<typeof speakAsIdents>;\n    })\n  | CounterStyleName;\nfunction validateSpeakAs(value: Css.Val): value is SpeakAsDescriptorValue {\n  return (\n    (value instanceof Css.Ident &&\n      speakAsIdents.has(\n        // @ts-expect-error check membership\n        value.name,\n      )) ||\n    validateCounterStyleName(value)\n  );\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/\n */\nexport function validateDescriptorValue(name: string, value: Css.Val): boolean {\n  switch (name) {\n    case \"system\":\n      return validateSystem(value);\n    case \"negative\":\n      return validateNegative(value);\n    case \"prefix\":\n    case \"suffix\":\n      return validateSymbol(value);\n    case \"range\":\n      return validateRange(value);\n    case \"pad\":\n      return validatePad(value);\n    case \"fallback\":\n      return validateCounterStyleName(value);\n    case \"symbols\":\n      return validateSymbols(value);\n    case \"additive-symbols\":\n      return validateAdditiveSymbols(value);\n    case \"speak-as\":\n      return validateSpeakAs(value);\n    default:\n      // accept without validation\n      return true;\n  }\n}\n\nfunction getDescriptorValue(\n  descriptors: CssCascade.ElementStyle,\n  name: string,\n): Css.Val | null {\n  const cascadeValue = (\n    descriptors[name] as CssCascade.CascadeValue | undefined\n  )?.value;\n  if (cascadeValue == null) {\n    return null;\n  }\n  return cascadeValue;\n}\n\nfunction isInRange(value: number, range: Range): boolean {\n  // > The range of the counter style is the union of all the ranges defined in the list.\n  return range.some(({ lower, upper }) => value >= lower && value <= upper);\n}\n\ntype CounterStyleStoreMap = Map<string, CounterStyle>;\n\nfunction getDecimal(store: CounterStyleStoreMap): CounterStyle {\n  let decimal = store.get(\"decimal\");\n  if (!decimal) {\n    decimal = CounterStyle.createDecimal(store);\n    store.set(\"decimal\", decimal);\n  }\n  return decimal;\n}\n\nabstract class CounterStyle {\n  protected readonly _store: CounterStyleStoreMap;\n\n  #negative: Negative | null;\n  #prefix: string | null;\n  #suffix: string | null;\n  #range: Range | null;\n  #pad: Pad | null;\n  #fallbackName: string | null;\n  #symbols: readonly [string, ...string[]] | null;\n  #additiveSymbols: readonly [AdditiveSymbol, ...AdditiveSymbol[]] | null;\n\n  protected constructor(\n    store: CounterStyleStoreMap,\n    descriptors: CssCascade.ElementStyle,\n  ) {\n    this._store = store;\n\n    const negative = getDescriptorValue(descriptors, \"negative\");\n    this.#negative =\n      negative && validateNegative(negative) ? extractNegative(negative) : null;\n\n    const prefix = getDescriptorValue(descriptors, \"prefix\");\n    this.#prefix =\n      prefix && validateSymbol(prefix) ? extractSymbol(prefix) : null;\n\n    const suffix = getDescriptorValue(descriptors, \"suffix\");\n    this.#suffix =\n      suffix && validateSymbol(suffix) ? extractSymbol(suffix) : null;\n\n    const range = getDescriptorValue(descriptors, \"range\");\n    this.#range = range && validateRange(range) ? extractRange(range) : null;\n\n    const pad = getDescriptorValue(descriptors, \"pad\");\n    this.#pad = pad && validatePad(pad) ? extractPad(pad) : null;\n\n    const fallbackName = getDescriptorValue(descriptors, \"fallback\");\n    this.#fallbackName =\n      fallbackName && validateCounterStyleName(fallbackName)\n        ? extractCounterStyleName(fallbackName)\n        : null;\n\n    const symbols = getDescriptorValue(descriptors, \"symbols\");\n    this.#symbols =\n      symbols && validateSymbols(symbols) ? extractSymbols(symbols) : null;\n\n    const additiveSymbols = getDescriptorValue(descriptors, \"additive-symbols\");\n    this.#additiveSymbols =\n      additiveSymbols && validateAdditiveSymbols(additiveSymbols)\n        ? extractAdditiveSymbols(additiveSymbols)\n        : null;\n  }\n\n  static create(\n    store: CounterStyleStoreMap,\n    descriptors: CssCascade.ElementStyle,\n  ): CounterStyle {\n    if (isCyclicDescriptors(descriptors)) {\n      return new Cyclic(store, descriptors);\n    }\n    if (isFixedDescriptors(descriptors)) {\n      return new Fixed(store, descriptors);\n    }\n    if (isAlphabeticDescriptors(descriptors)) {\n      return new Alphabetic(store, descriptors);\n    }\n    if (isNumericDescriptors(descriptors)) {\n      return new Numeric(store, descriptors);\n    }\n    if (isAdditiveDescriptors(descriptors)) {\n      return new Additive(store, descriptors);\n    }\n    if (isExtendsDescriptors(descriptors)) {\n      return new Extends(store, descriptors);\n    }\n    // default\n    return new Symbolic(store, descriptors);\n  }\n\n  static readonly #DECIMAL_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"numeric\"), 0),\n    symbols: new CssCascade.CascadeValue(\n      new Css.SpaceList([\n        new Css.Str(\"0\"),\n        new Css.Str(\"1\"),\n        new Css.Str(\"2\"),\n        new Css.Str(\"3\"),\n        new Css.Str(\"4\"),\n        new Css.Str(\"5\"),\n        new Css.Str(\"6\"),\n        new Css.Str(\"7\"),\n        new Css.Str(\"8\"),\n        new Css.Str(\"9\"),\n      ]),\n      0,\n    ),\n  };\n  static createDecimal(store: CounterStyleStoreMap): CounterStyle {\n    return new Numeric(\n      store,\n      CounterStyle.#DECIMAL_DESCRIPTORS as NumericDescriptors,\n    );\n  }\n\n  static readonly #DISC_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"cyclic\"), 0),\n    symbols: new CssCascade.CascadeValue(new Css.Str(\"\\u2022\"), 0),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\" \"), 0),\n  };\n  static createDisc(store: CounterStyleStoreMap): CounterStyle {\n    return new Cyclic(\n      store,\n      CounterStyle.#DISC_DESCRIPTORS as CyclicDescriptors,\n    );\n  }\n\n  static readonly #SQUARE_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"cyclic\"), 0),\n    symbols: new CssCascade.CascadeValue(new Css.Str(\"\\u25AA\"), 0),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\" \"), 0),\n  };\n  static createSquare(store: CounterStyleStoreMap): CounterStyle {\n    return new Cyclic(\n      store,\n      CounterStyle.#SQUARE_DESCRIPTORS as CyclicDescriptors,\n    );\n  }\n\n  static readonly #CIRCLE_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"cyclic\"), 0),\n    symbols: new CssCascade.CascadeValue(new Css.Str(\"\\u25E6\"), 0),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\" \"), 0),\n  };\n  static createCircle(store: CounterStyleStoreMap): CounterStyle {\n    return new Cyclic(\n      store,\n      CounterStyle.#CIRCLE_DESCRIPTORS as CyclicDescriptors,\n    );\n  }\n\n  static readonly #DISCLOSURE_OPEN_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"cyclic\"), 0),\n    symbols: new CssCascade.CascadeValue(new Css.Str(\"\\u25BE\"), 0),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\" \"), 0),\n  };\n  static createDisclosureOpen(store: CounterStyleStoreMap): CounterStyle {\n    return new Cyclic(\n      store,\n      CounterStyle.#DISCLOSURE_OPEN_DESCRIPTORS as CyclicDescriptors,\n    );\n  }\n\n  static readonly #DISCLOSURE_CLOSED_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"cyclic\"), 0),\n    symbols: new CssCascade.CascadeValue(new Css.Str(\"\\u25B8\"), 0),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\" \"), 0),\n  };\n  static createDisclosureClosed(store: CounterStyleStoreMap): CounterStyle {\n    return new Cyclic(\n      store,\n      this.#DISCLOSURE_CLOSED_DESCRIPTORS as CyclicDescriptors,\n    );\n  }\n\n  static readonly #NONE_DESCRIPTORS: CssCascade.ElementStyle = {\n    system: new CssCascade.CascadeValue(Css.getName(\"cyclic\"), 0),\n    symbols: new CssCascade.CascadeValue(new Css.Str(\"\"), 0),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\"\"), 0),\n  };\n  static createNone(store: CounterStyleStoreMap): CounterStyle {\n    return new Cyclic(\n      store,\n      CounterStyle.#NONE_DESCRIPTORS as CyclicDescriptors,\n    );\n  }\n\n  static get CHINESE_LONGHAND_NAMES(): typeof ChineseLonghand.NAMES {\n    return ChineseLonghand.NAMES;\n  }\n  static createChineseLonghand(\n    store: CounterStyleStoreMap,\n    name: SetElement<typeof ChineseLonghand.NAMES>,\n  ): CounterStyle {\n    return new ChineseLonghand(store, name);\n  }\n\n  static createEthiopicNumeric(store: CounterStyleStoreMap): CounterStyle {\n    return new EthiopicNumeric(store);\n  }\n\n  protected _getNegative(): Negative | null {\n    return this.#negative;\n  }\n  protected static _getNegativeFrom(style: CounterStyle): Negative | null {\n    return style._getNegative();\n  }\n  #getNegative(): Negative {\n    return this._getNegative() ?? { prefix: \"-\", suffix: null };\n  }\n\n  protected _getPrefix(): string | null {\n    return this.#prefix;\n  }\n  protected static _getPrefixFrom(style: CounterStyle): string | null {\n    return style._getPrefix();\n  }\n  #getPrefix(): string {\n    return this._getPrefix() ?? \"\";\n  }\n\n  protected _getSuffix(): string | null {\n    return this.#suffix;\n  }\n  protected static _getSuffixFrom(style: CounterStyle): string | null {\n    return style._getSuffix();\n  }\n  #getSuffix(): string {\n    return this._getSuffix() ?? \". \";\n  }\n\n  protected abstract _getAutoRange(): Range;\n  protected static _getAutoRangeFrom(style: CounterStyle): Range {\n    return style._getAutoRange();\n  }\n  protected _getRange(): Range | null {\n    return this.#range;\n  }\n  protected static _getRangeFrom(style: CounterStyle): Range | null {\n    return style._getRange();\n  }\n  #getRange(): Range {\n    return this._getRange() ?? this._getAutoRange();\n  }\n\n  protected _getPad(): Pad | null {\n    return this.#pad;\n  }\n  protected static _getPadFrom(style: CounterStyle): Pad | null {\n    return style._getPad();\n  }\n  #getPad(): Pad {\n    return this._getPad() ?? { minLength: 0, symbol: \"\" };\n  }\n\n  protected _getFallback(): CounterStyle | null {\n    return this._store.get(this.#fallbackName) ?? null;\n  }\n  protected static _getFallbackFrom(style: CounterStyle): CounterStyle | null {\n    return style._getFallback();\n  }\n  #getFallback(): CounterStyle {\n    return this._getFallback() ?? getDecimal(this._store);\n  }\n\n  protected _getSymbols(): readonly [string, ...string[]] | null {\n    return this.#symbols;\n  }\n  protected static _getSymbolsFrom(\n    style: CounterStyle,\n  ): readonly [string, ...string[]] | null {\n    return style._getSymbols();\n  }\n\n  protected _getAdditiveSymbols():\n    | readonly [AdditiveSymbol, ...AdditiveSymbol[]]\n    | null {\n    return this.#additiveSymbols;\n  }\n  protected static _getAdditiveSymbolsFrom(\n    style: CounterStyle,\n  ): readonly [AdditiveSymbol, ...AdditiveSymbol[]] | null {\n    return style._getAdditiveSymbols();\n  }\n\n  /**\n   * @see https://drafts.csswg.org/css-counter-styles-3/#generate-a-counter\n   * @see https://drafts.csswg.org/css-counter-styles-3/#counter-style-pad\n   */\n  #applyPadding(initialRep: string, usesNegative: boolean): string {\n    const { minLength, symbol: padSymbol } = this.#getPad();\n    if (minLength === 0 || padSymbol === \"\") {\n      return initialRep;\n    }\n\n    const { prefix: negPrefix, suffix: negSuffix } = this.#getNegative();\n    const negativeLength = usesNegative\n      ? [...negPrefix].length + (negSuffix ? [...negSuffix].length : 0)\n      : 0;\n\n    const diff = minLength - [...initialRep].length - negativeLength;\n    if (diff <= 0) {\n      return initialRep;\n    }\n\n    const padLength = [...padSymbol].length;\n    const count = Math.ceil(diff / padLength);\n    return padSymbol.repeat(count) + initialRep;\n  }\n\n  /**\n   * @see https://drafts.csswg.org/css-counter-styles-3/#use-a-negative-sign\n   */\n  protected abstract _usesNegativeSign(value: number): boolean;\n  protected static _useNegativeSignFrom(\n    style: CounterStyle,\n    value: number,\n  ): boolean {\n    return style._usesNegativeSign(value);\n  }\n\n  /**\n   * @see https://drafts.csswg.org/css-counter-styles-3/#generate-a-counter\n   */\n  protected abstract _generateInitialRepresentation(\n    value: number,\n  ): string | null;\n  protected static _generateInitialRepresentationFrom(\n    style: CounterStyle,\n    value: number,\n  ): string | null {\n    return style._generateInitialRepresentation(value);\n  }\n\n  /**\n   * Format a counter value to its string representation.\n   * @see https://drafts.csswg.org/css-counter-styles-3/#generate-a-counter\n   */\n  format(value: number): string {\n    return this.#format(value, new Set());\n  }\n  #format(value: number, visited: Set<CounterStyle>): string {\n    // Detect fallback loop\n    if (visited.has(this)) {\n      // Clear the visited set when falling back to decimal to avoid infinite recursion\n      return getDecimal(this._store).#format(value, new Set());\n    }\n    visited.add(this);\n\n    if (!isInRange(value, this.#getRange())) {\n      const fallback = this.#getFallback();\n      return fallback.#format(value, visited);\n    }\n\n    const usesNegative = this._usesNegativeSign(value);\n    const absValue = usesNegative ? Math.abs(value) : value;\n\n    const initialRep = this._generateInitialRepresentation(absValue);\n    if (initialRep === null) {\n      const fallback = this.#getFallback();\n      return fallback.#format(value, visited);\n    }\n\n    let padded = this.#applyPadding(initialRep, usesNegative);\n\n    if (usesNegative) {\n      const { prefix: negPrefix, suffix: negSuffix } = this.#getNegative();\n      padded = negPrefix + padded + (negSuffix ?? \"\");\n    }\n\n    return padded;\n  }\n\n  /**\n   * Format a counter value with prefix and suffix for use in ::marker.\n   * Unlike format(), this includes the prefix and suffix descriptors.\n   * @see https://drafts.csswg.org/css-counter-styles-3/#counter-style-prefix\n   * @see https://drafts.csswg.org/css-counter-styles-3/#counter-style-suffix\n   */\n  formatMarker(value: number): string {\n    return this.#getPrefix() + this.format(value) + this.#getSuffix();\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#cyclic-system\n */\nclass Cyclic extends CounterStyle {\n  constructor(store: CounterStyleStoreMap, descriptors: CyclicDescriptors) {\n    super(store, descriptors);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: -Infinity, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(_: number): boolean {\n    return false;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const symbols = this._getSymbols();\n    // > If the system is cyclic, the symbols descriptor must contain at least one counter symbol,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (!symbols || symbols.length === 0) {\n      return null;\n    }\n    const n = symbols.length;\n    // to get proper mathematical modulo for negative values\n    const idx = (((value - 1) % n) + n) % n;\n    return symbols[idx];\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#fixed-system\n */\nclass Fixed extends CounterStyle {\n  #firstSymbolValue: number;\n\n  constructor(store: CounterStyleStoreMap, descriptors: FixedDescriptors) {\n    super(store, descriptors);\n    this.#firstSymbolValue = extractFixedFirstSymbolValue(descriptors);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: -Infinity, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(_: number): boolean {\n    return false;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const symbols = this._getSymbols();\n    // > If the system is fixed, the symbols descriptor must contain at least one counter symbol,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (!symbols || symbols.length === 0) {\n      return null;\n    }\n    const idx = value - this.#firstSymbolValue;\n    return symbols[idx] ?? null;\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#symbolic-system\n */\nclass Symbolic extends CounterStyle {\n  // Symbolic is the default system, so it accepts any ElementStyle\n  // (including those without a system descriptor)\n  constructor(store: CounterStyleStoreMap, descriptors: SymbolicDescriptors) {\n    super(store, descriptors);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: 1, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(value: number): boolean {\n    return value < 0;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const symbols = this._getSymbols();\n    // > If the system is symbolic, the symbols descriptor must contain at least one counter symbol,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (!symbols || symbols.length === 0) {\n      return null;\n    }\n    // > This system is defined only over strictly positive counter values.\n    if (value < 1) {\n      return null;\n    }\n    const n = symbols.length;\n    const chosen = symbols[(value - 1) % n];\n    const count = Math.ceil(value / n);\n    return chosen.repeat(count);\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#alphabetic-system\n */\nclass Alphabetic extends CounterStyle {\n  constructor(store: CounterStyleStoreMap, descriptors: AlphabeticDescriptors) {\n    super(store, descriptors);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: 1, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(value: number): boolean {\n    return value < 0;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const symbols = this._getSymbols();\n    // > If the system is alphabetic, the symbols descriptor must contain at least two counter symbols,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (!symbols || symbols.length < 2) {\n      return null;\n    }\n    // > This system is defined only over strictly positive counter values.\n    if (value < 1) {\n      return null;\n    }\n    const n = symbols.length;\n    let s = \"\";\n    let v = value;\n    while (v !== 0) {\n      v = v - 1;\n      s = symbols[v % n] + s;\n      v = Math.floor(v / n);\n    }\n    return s;\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#numeric-system\n */\nclass Numeric extends CounterStyle {\n  constructor(store: CounterStyleStoreMap, descriptors: NumericDescriptors) {\n    super(store, descriptors);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: -Infinity, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(value: number): boolean {\n    return value < 0;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const symbols = this._getSymbols();\n    // > If the system is numeric, the symbols descriptor must contain at least two counter symbols,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (!symbols || symbols.length < 2) {\n      return null;\n    }\n    const n = symbols.length;\n    if (value === 0) {\n      return symbols[0];\n    }\n    let s = \"\";\n    let v = value;\n    while (v !== 0) {\n      s = symbols[v % n] + s;\n      v = Math.floor(v / n);\n    }\n    return s;\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#additive-system\n */\nclass Additive extends CounterStyle {\n  constructor(store: CounterStyleStoreMap, descriptors: AdditiveDescriptors) {\n    super(store, descriptors);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: 0, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(value: number): boolean {\n    return value < 0;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const tuples = this._getAdditiveSymbols();\n    // > If the system is additive, the additive-symbols descriptor must contain at least one additive tuple,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (!tuples || tuples.length === 0) {\n      return null;\n    }\n\n    let s = \"\";\n\n    if (value === 0) {\n      const zeroTuple = tuples.find((t) => t.weight === 0);\n      return zeroTuple ? zeroTuple.symbol : null;\n    }\n\n    let remaining = value;\n    for (const tuple of tuples) {\n      const { weight, symbol } = tuple;\n      if (weight === 0 || weight > remaining) {\n        continue;\n      }\n      const reps = Math.floor(remaining / weight);\n      s += symbol.repeat(reps);\n      remaining -= weight * reps;\n      if (remaining === 0) {\n        return s;\n      }\n    }\n\n    return null;\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles/#extends-system\n */\nclass Extends extends CounterStyle {\n  #baseName: string;\n\n  constructor(store: CounterStyleStoreMap, descriptors: ExtendsDescriptors) {\n    super(store, descriptors);\n    const baseName = extractExtendsBaseName(descriptors);\n    // > If the specified <counter-style-name> is an ASCII case-insensitive match\n    // > for disc, circle, square, disclosure-open, or disclosure-closed ...\n    const lowerName = baseName.toLowerCase();\n    if (\n      lowerName === \"disc\" ||\n      lowerName === \"circle\" ||\n      lowerName === \"square\" ||\n      lowerName === \"disclosure-open\" ||\n      lowerName === \"disclosure-closed\"\n    ) {\n      this.#baseName = lowerName;\n    } else {\n      this.#baseName = baseName;\n    }\n  }\n\n  #resolveBaseStyle(visited: Set<CounterStyle> = new Set()): CounterStyle {\n    // Detect cycle\n    if (visited.has(this)) {\n      return getDecimal(this._store);\n    }\n    visited.add(this);\n\n    const targetStyle = this._store.get(this.#baseName);\n    if (!targetStyle) {\n      return getDecimal(this._store);\n    }\n\n    if (targetStyle instanceof Extends) {\n      return targetStyle.#resolveBaseStyle(visited);\n    }\n\n    return targetStyle;\n  }\n\n  protected override _getNegative(): Negative | null {\n    return (\n      super._getNegative() ??\n      CounterStyle._getNegativeFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getPrefix(): string | null {\n    return (\n      super._getPrefix() ??\n      CounterStyle._getPrefixFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getSuffix(): string | null {\n    return (\n      super._getSuffix() ??\n      CounterStyle._getSuffixFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getAutoRange(): Range {\n    return CounterStyle._getAutoRangeFrom(this.#resolveBaseStyle());\n  }\n  protected override _getRange(): Range | null {\n    return (\n      super._getRange() ?? CounterStyle._getRangeFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getPad(): Pad | null {\n    return (\n      super._getPad() ?? CounterStyle._getPadFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getFallback(): CounterStyle | null {\n    return (\n      super._getFallback() ??\n      CounterStyle._getFallbackFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getSymbols(): readonly [string, ...string[]] | null {\n    return (\n      super._getSymbols() ??\n      CounterStyle._getSymbolsFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _getAdditiveSymbols():\n    | readonly [AdditiveSymbol, ...AdditiveSymbol[]]\n    | null {\n    return (\n      super._getAdditiveSymbols() ??\n      CounterStyle._getAdditiveSymbolsFrom(this.#resolveBaseStyle())\n    );\n  }\n\n  protected override _usesNegativeSign(value: number): boolean {\n    return CounterStyle._useNegativeSignFrom(this.#resolveBaseStyle(), value);\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    // > If a @counter-style uses the extends system, it must not contain a symbols or additive-symbols descriptor,\n    // > otherwise the rule does not define a counter style (but is still a valid rule).\n    if (super._getSymbols() || super._getAdditiveSymbols()) {\n      return null;\n    }\n\n    return CounterStyle._generateInitialRepresentationFrom(\n      this.#resolveBaseStyle(),\n      value,\n    );\n  }\n}\n\ntype ChineseLonghandSetting = Readonly<{\n  chars: Readonly<{\n    digits: readonly [\n      string,\n      string,\n      string,\n      string,\n      string,\n      string,\n      string,\n      string,\n      string,\n      string,\n    ];\n    markers: readonly [string, string, string, string];\n    informal: boolean;\n  }>;\n  descriptors: CssCascade.ElementStyle;\n}>;\n\nconst chineseLonghandNameList = [\n  \"simp-chinese-informal\",\n  \"simp-chinese-formal\",\n  \"trad-chinese-informal\",\n  \"trad-chinese-formal\",\n  \"cjk-ideographic\",\n] as const;\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#limited-chinese\n */\nclass ChineseLonghand extends CounterStyle {\n  static readonly #SIMP_CHINESE_INFORMAL: ChineseLonghandSetting = {\n    chars: {\n      digits: [\n        \"\\u96F6\",\n        \"\\u4E00\",\n        \"\\u4E8C\",\n        \"\\u4E09\",\n        \"\\u56DB\",\n        \"\\u4E94\",\n        \"\\u516D\",\n        \"\\u4E03\",\n        \"\\u516B\",\n        \"\\u4E5D\",\n      ],\n      markers: [\"\", \"\\u5341\", \"\\u767E\", \"\\u5343\"],\n      informal: true,\n    },\n    descriptors: {\n      suffix: new CssCascade.CascadeValue(new Css.Str(\"\\u3001\"), 0),\n      fallback: new CssCascade.CascadeValue(Css.getName(\"cjk-decimal\"), 0),\n      range: new CssCascade.CascadeValue(\n        new Css.SpaceList([new Css.Int(-9999), new Css.Int(9999)]),\n        0,\n      ),\n      negative: new CssCascade.CascadeValue(new Css.Str(\"\\u8D1F\"), 0),\n    },\n  };\n  static readonly #SIMP_CHINESE_FORMAL: ChineseLonghandSetting = {\n    chars: {\n      digits: [\n        \"\\u96F6\",\n        \"\\u58F9\",\n        \"\\u8D30\",\n        \"\\u53C1\",\n        \"\\u8086\",\n        \"\\u4F0D\",\n        \"\\u9646\",\n        \"\\u67D2\",\n        \"\\u634C\",\n        \"\\u7396\",\n      ],\n      markers: [\"\", \"\\u62FE\", \"\\u4F70\", \"\\u4EDF\"],\n      informal: false,\n    },\n    descriptors: {\n      suffix: new CssCascade.CascadeValue(new Css.Str(\"\\u3001\"), 0),\n      fallback: new CssCascade.CascadeValue(Css.getName(\"cjk-decimal\"), 0),\n      range: new CssCascade.CascadeValue(\n        new Css.SpaceList([new Css.Int(-9999), new Css.Int(9999)]),\n        0,\n      ),\n      negative: new CssCascade.CascadeValue(new Css.Str(\"\\u8D1F\"), 0),\n    },\n  };\n  static readonly #TRAD_CHINESE_INFORMAL: ChineseLonghandSetting = {\n    chars: {\n      digits: [\n        \"\\u96F6\",\n        \"\\u4E00\",\n        \"\\u4E8C\",\n        \"\\u4E09\",\n        \"\\u56DB\",\n        \"\\u4E94\",\n        \"\\u516D\",\n        \"\\u4E03\",\n        \"\\u516B\",\n        \"\\u4E5D\",\n      ],\n      markers: [\"\", \"\\u5341\", \"\\u767E\", \"\\u5343\"],\n      informal: true,\n    },\n    descriptors: {\n      suffix: new CssCascade.CascadeValue(new Css.Str(\"\\u3001\"), 0),\n      fallback: new CssCascade.CascadeValue(Css.getName(\"cjk-decimal\"), 0),\n      range: new CssCascade.CascadeValue(\n        new Css.SpaceList([new Css.Int(-9999), new Css.Int(9999)]),\n        0,\n      ),\n      negative: new CssCascade.CascadeValue(new Css.Str(\"\\u8CA0\"), 0),\n    },\n  };\n  static readonly #TRAD_CHINESE_FORMAL: ChineseLonghandSetting = {\n    chars: {\n      digits: [\n        \"\\u96F6\",\n        \"\\u58F9\",\n        \"\\u8CB3\",\n        \"\\u53C3\",\n        \"\\u8086\",\n        \"\\u4F0D\",\n        \"\\u9678\",\n        \"\\u67D2\",\n        \"\\u634C\",\n        \"\\u7396\",\n      ],\n      markers: [\"\", \"\\u62FE\", \"\\u4F70\", \"\\u4EDF\"],\n      informal: false,\n    },\n    descriptors: {\n      suffix: new CssCascade.CascadeValue(new Css.Str(\"\\u3001\"), 0),\n      fallback: new CssCascade.CascadeValue(Css.getName(\"cjk-decimal\"), 0),\n      range: new CssCascade.CascadeValue(\n        new Css.SpaceList([new Css.Int(-9999), new Css.Int(9999)]),\n        0,\n      ),\n      negative: new CssCascade.CascadeValue(new Css.Str(\"\\u8CA0\"), 0),\n    },\n  };\n  static readonly NAMES: ReadonlySet<(typeof chineseLonghandNameList)[number]> =\n    new Set(chineseLonghandNameList);\n  static readonly #SETTINGS: ReadonlyMap<\n    SetElement<typeof ChineseLonghand.NAMES>,\n    ChineseLonghandSetting\n  > = new Map([\n    [\"simp-chinese-informal\", ChineseLonghand.#SIMP_CHINESE_INFORMAL],\n    [\"simp-chinese-formal\", ChineseLonghand.#SIMP_CHINESE_FORMAL],\n    [\"trad-chinese-informal\", ChineseLonghand.#TRAD_CHINESE_INFORMAL],\n    [\"trad-chinese-formal\", ChineseLonghand.#TRAD_CHINESE_FORMAL],\n    // > This counter style is identical to trad-chinese-informal. (It exists for legacy reasons.)\n    [\"cjk-ideographic\", ChineseLonghand.#TRAD_CHINESE_INFORMAL],\n  ]);\n\n  #chars: ChineseLonghandSetting[\"chars\"];\n\n  constructor(\n    store: CounterStyleStoreMap,\n    name: SetElement<typeof ChineseLonghand.NAMES>,\n  ) {\n    const { chars, descriptors } = ChineseLonghand.#SETTINGS.get(name)!;\n    super(store, descriptors);\n    this.#chars = chars;\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: -9999, upper: 9999 }];\n  }\n\n  protected override _usesNegativeSign(value: number): boolean {\n    return value < 0;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    const chars = this.#chars;\n\n    // Step 1: If the counter value is 0, return the character for 0\n    if (value === 0) {\n      return chars.digits[0];\n    }\n\n    // Build representation with digit markers\n    // Process each digit from thousands to ones\n    const digits: { digit: number; position: number }[] = [];\n    let pos = 0;\n    let temp = value;\n    while (temp > 0) {\n      digits.unshift({ digit: temp % 10, position: pos });\n      temp = Math.floor(temp / 10);\n      pos++;\n    }\n\n    // For informal styles, if value is 10-19, remove tens digit (leave marker)\n    const removeTensDigit = chars.informal && value >= 10 && value <= 19;\n\n    // Build the result string\n    let result = \"\";\n    let lastWasZero = false;\n\n    for (let i = 0; i < digits.length; i++) {\n      const { digit, position } = digits[i];\n      const isLastDigit = i === digits.length - 1;\n\n      if (digit === 0) {\n        // Collapse consecutive zeros and drop trailing zeros\n        if (!isLastDigit && !lastWasZero) {\n          // Mark that we encountered a zero (will add it if followed by non-zero)\n          lastWasZero = true;\n        }\n      } else {\n        // Add collapsed zero if needed\n        if (lastWasZero) {\n          result += chars.digits[0];\n          lastWasZero = false;\n        }\n\n        // Skip tens digit for informal 10-19\n        if (removeTensDigit && position === 1) {\n          // Add only the marker, not the digit\n          result += chars.markers[position];\n        } else {\n          // Add digit + marker\n          result += chars.digits[digit];\n          if (position > 0) {\n            result += chars.markers[position];\n          }\n        }\n      }\n    }\n\n    return result;\n  }\n}\n\n/**\n * @see https://drafts.csswg.org/css-counter-styles-3/#ethiopic-numeric-counter-style\n */\nclass EthiopicNumeric extends CounterStyle {\n  static readonly #DESCRIPTORS = {\n    range: new CssCascade.CascadeValue(\n      new Css.SpaceList([new Css.Int(1), Css.getName(\"infinite\")]),\n      0,\n    ),\n    suffix: new CssCascade.CascadeValue(new Css.Str(\"/ \"), 0),\n  } as const;\n\n  static readonly #TENS = [\n    \"\", // 0\n    \"\\u1372\", // 10\n    \"\\u1373\", // 20\n    \"\\u1374\", // 30\n    \"\\u1375\", // 40\n    \"\\u1376\", // 50\n    \"\\u1377\", // 60\n    \"\\u1378\", // 70\n    \"\\u1379\", // 80\n    \"\\u137A\", // 90\n  ] as const;\n\n  static readonly #UNITS = [\n    \"\", // 0\n    \"\\u1369\", // 1\n    \"\\u136A\", // 2\n    \"\\u136B\", // 3\n    \"\\u136C\", // 4\n    \"\\u136D\", // 5\n    \"\\u136E\", // 6\n    \"\\u136F\", // 7\n    \"\\u1370\", // 8\n    \"\\u1371\", // 9\n  ] as const;\n\n  static readonly #HUNDRED = \"\\u137B\"; // U+137B (odd index separator / 100)\n  static readonly #TEN_THOUSAND = \"\\u137C\"; // U+137C (even index separator / 10000)\n\n  constructor(store: CounterStyleStoreMap) {\n    super(store, EthiopicNumeric.#DESCRIPTORS);\n  }\n\n  protected override _getAutoRange(): Range {\n    return [{ lower: 1, upper: Infinity }];\n  }\n\n  protected override _usesNegativeSign(_: number): boolean {\n    // > The ethiopic-numeric counter style is defined for all positive non-zero numbers.\n    return false;\n  }\n\n  protected override _generateInitialRepresentation(\n    value: number,\n  ): string | null {\n    // > The ethiopic-numeric counter style is defined for all positive non-zero numbers.\n    if (value < 1) {\n      return null;\n    }\n\n    // Step 1: If the number is 1, return U+1369\n    if (value === 1) {\n      return EthiopicNumeric.#UNITS[1];\n    }\n\n    // Step 2: Split the number into groups of two digits, starting with the least significant\n    const groups: number[] = [];\n    let remaining = value;\n    while (remaining > 0) {\n      groups.push(remaining % 100);\n      remaining = Math.floor(remaining / 100);\n    }\n\n    // groups[0] is least significant, groups[length-1] is most significant\n    const numGroups = groups.length;\n\n    // Build output from most significant to least significant\n    let result = \"\";\n    for (let i = numGroups - 1; i >= 0; i--) {\n      const groupValue = groups[i];\n      const isOddIndex = i % 2 === 1;\n      const isMostSignificant = i === numGroups - 1;\n\n      // Step 4: Determine if digits should be removed\n      // - If the group has the value zero\n      // - If the group is the most significant one and has the value 1\n      // - If the group has an odd index and has the value 1\n      const removeDigits =\n        groupValue === 0 ||\n        (isMostSignificant && groupValue === 1) ||\n        (isOddIndex && groupValue === 1);\n\n      // Step 5: For each remaining digit, substitute the relevant ethiopic character\n      if (!removeDigits) {\n        const tens = Math.floor(groupValue / 10);\n        const units = groupValue % 10;\n        result += EthiopicNumeric.#TENS[tens] + EthiopicNumeric.#UNITS[units];\n      }\n\n      // Step 6 & 7: Append separators\n      if (isOddIndex) {\n        // Step 6: For odd index groups, except those with original value 0, append U+137B\n        if (groupValue !== 0) {\n          result += EthiopicNumeric.#HUNDRED;\n        }\n      } else {\n        // Step 7: For even index groups, except group 0, append U+137C\n        if (i !== 0) {\n          result += EthiopicNumeric.#TEN_THOUSAND;\n        }\n      }\n    }\n\n    return result;\n  }\n}\n\nexport class CounterStyleStore {\n  #store: CounterStyleStoreMap;\n\n  constructor() {\n    this.#store = new Map();\n\n    this.#store.set(\"none\", CounterStyle.createNone(this.#store));\n\n    // non-overridable counter-style names\n    // https://drafts.csswg.org/css-counter-styles/#non-overridable-counter-style-names\n    this.#store.set(\"decimal\", CounterStyle.createDecimal(this.#store));\n    this.#store.set(\"disc\", CounterStyle.createDisc(this.#store));\n    this.#store.set(\"square\", CounterStyle.createSquare(this.#store));\n    this.#store.set(\"circle\", CounterStyle.createCircle(this.#store));\n    this.#store.set(\n      \"disclosure-open\",\n      CounterStyle.createDisclosureOpen(this.#store),\n    );\n    this.#store.set(\n      \"disclosure-closed\",\n      CounterStyle.createDisclosureClosed(this.#store),\n    );\n\n    // Chinese longhand styles\n    // https://drafts.csswg.org/css-counter-styles/#limited-chinese\n    for (const name of CounterStyle.CHINESE_LONGHAND_NAMES) {\n      this.#store.set(\n        name,\n        CounterStyle.createChineseLonghand(this.#store, name),\n      );\n    }\n\n    // Ethiopic numeric counter style\n    // https://drafts.csswg.org/css-counter-styles/#ethiopic-numeric-counter-style\n    this.#store.set(\n      \"ethiopic-numeric\",\n      CounterStyle.createEthiopicNumeric(this.#store),\n    );\n  }\n\n  define(\n    name: string,\n    descriptors: CssCascade.ElementStyle,\n  ): CounterStyle | null {\n    if (!validateNameForDefinition(name)) {\n      return null;\n    }\n    const counterStyle = CounterStyle.create(this.#store, descriptors);\n    this.#store.set(name, counterStyle);\n    return counterStyle;\n  }\n\n  getStyle(name: string): CounterStyle | null {\n    return this.#store.get(name) ?? null;\n  }\n\n  /**\n   * Format a counter value using the specified counter style.\n   * @see https://drafts.csswg.org/css-counter-styles/\n   */\n  format(name: string, value: number): string {\n    return (this.getStyle(name) ?? getDecimal(this.#store)).format(value);\n  }\n\n  /**\n   * Format a counter value with prefix and suffix for use in ::marker.\n   * Not yet in use, but will be used in the future. #732\n   * @see https://drafts.csswg.org/css-counter-styles/\n   */\n  formatMarker(name: string, value: number): string {\n    return (this.getStyle(name) ?? getDecimal(this.#store)).formatMarker(value);\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssStyler - Apply CSS cascade to a document incrementally and\n * cache the result.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as CounterStyle from \"./counter-style\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Display from \"./display\";\nimport * as Exprs from \"./exprs\";\nimport * as Vtree from \"./vtree\";\nimport { CssStyler, XmlDoc } from \"./types\";\n\nexport class SlipRange {\n  endStuckFixed: number;\n  endFixed: number;\n  endSlipped: number;\n\n  constructor(endStuckFixed, endFixed, endSlipped) {\n    this.endStuckFixed = endStuckFixed;\n    this.endFixed = endFixed;\n    this.endSlipped = endSlipped;\n  }\n}\n\n/**\n * Maps all ints in a range (\"fixed\") to ints with slippage (\"slipped\")\n */\nexport class SlipMap {\n  map = [] as SlipRange[];\n\n  getMaxFixed(): number {\n    if (this.map.length == 0) {\n      return 0;\n    }\n    const range = this.map[this.map.length - 1];\n    return range.endFixed;\n  }\n\n  getMaxSlipped(): number {\n    if (this.map.length == 0) {\n      return 0;\n    }\n    const range = this.map[this.map.length - 1];\n    return range.endSlipped;\n  }\n\n  addStuckRange(endFixed: number): void {\n    if (this.map.length == 0) {\n      this.map.push(new SlipRange(endFixed, endFixed, endFixed));\n    } else {\n      const range = this.map[this.map.length - 1];\n      const endSlipped = range.endSlipped + endFixed - range.endFixed;\n      if (range.endFixed == range.endStuckFixed) {\n        range.endFixed = endFixed;\n        range.endStuckFixed = endFixed;\n        range.endSlipped = endSlipped;\n      } else {\n        this.map.push(new SlipRange(endFixed, endFixed, endSlipped));\n      }\n    }\n  }\n\n  addSlippedRange(endFixed: number): void {\n    if (this.map.length == 0) {\n      this.map.push(new SlipRange(endFixed, 0, 0));\n    } else {\n      this.map[this.map.length - 1].endFixed = endFixed;\n    }\n  }\n\n  slippedByFixed(fixed: number): number {\n    const index = Base.binarySearch(\n      this.map.length,\n      (index) => fixed <= this.map[index].endFixed,\n    );\n    const range = this.map[index];\n    return range.endSlipped - Math.max(0, range.endStuckFixed - fixed);\n  }\n\n  /**\n   * Smallest fixed for a given slipped.\n   */\n  fixedBySlipped(slipped: number): number {\n    const index = Base.binarySearch(\n      this.map.length,\n      (index) => slipped <= this.map[index].endSlipped,\n    );\n    const range = this.map[index];\n    return range.endStuckFixed - (range.endSlipped - slipped);\n  }\n}\n\nexport interface FlowListener {\n  encounteredFlowChunk(flowChunk: Vtree.FlowChunk, flow: Vtree.Flow): void;\n}\n\nexport interface AbstractStyler extends CssStyler.AbstractStyler {}\n\n/**\n * Represent a box generated by a (pseudo)element. When constructed, a box\n * corresponding to `::before` pseudoelement is also constructed and stored in\n * `beforeBox` property, whereas one corresponding `::after` pseudoelement is\n * not constructed and `afterBox` property is `null`. `afterBox` is constructed\n * by `buildAfterPseudoElementBox` method.\n * @param style Cascaded style values for the box.\n * @param offset The start offset of the box. It coincides with the start offset\n *     of the element if the box is generated by the element or the `::before`\n *     pseudoelement. When the box corresponds to the `::after` pseudoelement,\n *     the offset is just after the content before the `::after` pseudoelement.\n * @param isRoot True if the box is generated by the root element (not\n *     pseudoelement).\n * @param flowChunk FlowChunk to which the box belongs to.\n * @param atBlockStart True if the box is right after the block start edge.\n * @param atFlowStart True if the box is right after the flow start.\n * @param isParentBoxDisplayed True if the parent box has a displayed box.\n */\nexport class Box {\n  flowName: string;\n  isBlockValue: boolean | null = null;\n  hasBoxValue: boolean | null = null;\n  styleValues = {} as { [key: string]: Css.Val };\n  beforeBox: Box = null;\n  afterBox: Box = null;\n  breakBefore: string | null = null;\n\n  constructor(\n    public readonly context: Exprs.Context,\n    public readonly style: CssCascade.ElementStyle,\n    public readonly offset: number,\n    public readonly isRoot: boolean,\n    public readonly flowChunk: Vtree.FlowChunk,\n    public readonly atBlockStart: boolean,\n    public readonly atFlowStart: boolean,\n    public readonly isParentBoxDisplayed: boolean,\n  ) {\n    this.flowName = flowChunk.flowName;\n    if (this.hasBox()) {\n      const pseudoMap = style[\"_pseudos\"];\n      if (pseudoMap) {\n        if (pseudoMap[\"before\"]) {\n          const beforeBox = new Box(\n            context,\n            pseudoMap[\"before\"],\n            offset,\n            false,\n            flowChunk,\n            this.isBlock(),\n            atFlowStart,\n            true,\n          );\n          const beforeContent = beforeBox.styleValue(\"content\");\n          if (Vtree.nonTrivialContent(beforeContent)) {\n            this.beforeBox = beforeBox;\n            this.breakBefore = beforeBox.breakBefore;\n          }\n        }\n      }\n    }\n    this.breakBefore = Break.resolveEffectiveBreakValue(\n      this.getBreakValue(\"before\"),\n      this.breakBefore,\n    );\n    if (this.atFlowStart && Break.isForcedBreakValue(this.breakBefore)) {\n      flowChunk.breakBefore = Break.resolveEffectiveBreakValue(\n        flowChunk.breakBefore,\n        this.breakBefore,\n      );\n    }\n  }\n\n  /**\n   * Build a box corresponding to `::after` pseudoelement and stores it in\n   * `afterBox` property.\n   * @param offset The start offset of the `::after` pseudoelement box, which is\n   *     just after the content before the `::after` pseudoelement.\n   * @param atBlockStart True if the box is right after the block start edge.\n   * @param atFlowStart True if the box is right after the flow start.\n   */\n  buildAfterPseudoElementBox(\n    offset: number,\n    atBlockStart: boolean,\n    atFlowStart: boolean,\n  ) {\n    if (this.hasBox()) {\n      const pseudoMap = this.style[\"_pseudos\"];\n      if (pseudoMap) {\n        if (pseudoMap[\"after\"]) {\n          const afterBox = new Box(\n            this.context,\n            pseudoMap[\"after\"],\n            offset,\n            false,\n            this.flowChunk,\n            atBlockStart,\n            atFlowStart,\n            true,\n          );\n          const afterContent = afterBox.styleValue(\"content\");\n          if (Vtree.nonTrivialContent(afterContent)) {\n            this.afterBox = afterBox;\n          }\n        }\n      }\n    }\n  }\n\n  styleValue(name: string, defaultValue?: Css.Val): Css.Val | null {\n    if (!(name in this.styleValues)) {\n      const cv = this.style[name] as CssCascade.CascadeValue;\n      this.styleValues[name] = cv\n        ? cv.evaluate(this.context, name)\n        : defaultValue || null;\n    }\n    return this.styleValues[name];\n  }\n\n  displayValue(): Css.Val {\n    return this.styleValue(\"display\", Css.ident.inline);\n  }\n\n  isBlock(): boolean {\n    if (this.isBlockValue === null) {\n      const display = this.displayValue() as Css.Ident;\n      const position = this.styleValue(\"position\") as Css.Ident;\n      const float = this.styleValue(\"float\") as Css.Ident;\n      this.isBlockValue = Display.isBlock(\n        display,\n        position,\n        float,\n        this.isRoot,\n      );\n    }\n    return this.isBlockValue;\n  }\n\n  hasBox(): boolean {\n    if (this.hasBoxValue === null) {\n      this.hasBoxValue =\n        this.isParentBoxDisplayed &&\n        this.displayValue() !== Css.ident.none &&\n        !Display.isRunning(this.styleValue(\"position\"));\n    }\n    return this.hasBoxValue;\n  }\n\n  getBreakValue(edge: string): string | null {\n    let breakValue: string | null = null;\n    if (this.isBlock()) {\n      const val = this.styleValue(`break-${edge}`);\n      if (val) {\n        breakValue = val.toString();\n      }\n    }\n    return breakValue;\n  }\n}\n\n/**\n * Manages boxes generated by elements as a stack.\n */\nexport class BoxStack {\n  stack = [] as Box[];\n  atBlockStart: boolean = true; // indicates if the next pushed box will be at the block start\n  atFlowStart: boolean = true; // indicates if the next pushed box will be at the flow start\n  atStartStack = [] as { atBlockStart: boolean; atFlowStart: boolean }[]; // pushed when a new flow starts\n\n  constructor(public readonly context: Exprs.Context) {}\n\n  /**\n   * Returns if the stack is empty.\n   */\n  empty(): boolean {\n    return this.stack.length === 0;\n  }\n\n  /**\n   * Returns the last box in the stack.\n   */\n  lastBox(): Box | undefined {\n    return this.stack[this.stack.length - 1];\n  }\n\n  /**\n   * Returns the flow name of the last box in the stack.\n   */\n  lastFlowName(): string | null {\n    const lastBox = this.lastBox();\n    return lastBox ? lastBox.flowChunk.flowName : null;\n  }\n\n  /**\n   * Returns if the last box in the stack is displayed.\n   */\n  isCurrentBoxDisplayed(): boolean {\n    return this.stack.every((box) => box.displayValue() !== Css.ident.none);\n  }\n\n  /**\n   * Create a new box and push it to the stack.\n   * @param style Cascaded style values for the box.\n   * @param offset The start offset of the box.\n   * @param isRoot True if the box is generated by the root element\n   * @param newFlowChunk Specify if the element is a flow element (i.e. the\n   *     element is specified a new `flow-into` value)\n   */\n  push(\n    style: CssCascade.ElementStyle,\n    offset: number,\n    isRoot: boolean,\n    newFlowChunk?: Vtree.FlowChunk,\n  ): Box {\n    const lastBox = this.lastBox();\n    if (newFlowChunk && lastBox && newFlowChunk.flowName !== lastBox.flowName) {\n      this.atStartStack.push({\n        atBlockStart: this.atBlockStart,\n        atFlowStart: this.atFlowStart,\n      });\n    }\n    const flowChunk = newFlowChunk || lastBox.flowChunk;\n    const isAtFlowStart = this.atFlowStart || !!newFlowChunk;\n    const isParentBoxDisplayed = this.isCurrentBoxDisplayed();\n    const box = new Box(\n      this.context,\n      style,\n      offset,\n      isRoot,\n      flowChunk,\n      isAtFlowStart || this.atBlockStart,\n      isAtFlowStart,\n      isParentBoxDisplayed,\n    );\n    this.stack.push(box);\n    this.atBlockStart = box.hasBox()\n      ? !box.beforeBox && box.isBlock()\n      : this.atBlockStart;\n    this.atFlowStart = box.hasBox()\n      ? !box.beforeBox && isAtFlowStart\n      : this.atFlowStart;\n    return box;\n  }\n\n  encounteredTextNode(node: Node) {\n    const box = this.lastBox();\n    if (\n      (node.nodeType === Node.TEXT_NODE ||\n        node.nodeType === Node.CDATA_SECTION_NODE) &&\n      (this.atBlockStart || this.atFlowStart) &&\n      box.hasBox()\n    ) {\n      const whitespaceValue = box\n        .styleValue(\"white-space\", Css.ident.normal)\n        .toString();\n      const whitespace = Vtree.whitespaceFromPropertyValue(whitespaceValue);\n      if (whitespace && !Vtree.canIgnore(node, whitespace)) {\n        this.atBlockStart = false;\n        this.atFlowStart = false;\n      }\n    }\n  }\n\n  /**\n   * Pop the last box.\n   */\n  pop(offset: number): Box {\n    const box = this.stack.pop();\n    box.buildAfterPseudoElementBox(offset, this.atBlockStart, this.atFlowStart);\n    if (this.atFlowStart && box.afterBox) {\n      const breakBefore = box.afterBox.getBreakValue(\"before\");\n      box.flowChunk.breakBefore = Break.resolveEffectiveBreakValue(\n        box.flowChunk.breakBefore,\n        breakBefore,\n      );\n    }\n    const parent = this.lastBox();\n    if (parent) {\n      if (parent.flowName === box.flowName) {\n        if (box.hasBox()) {\n          this.atBlockStart = this.atFlowStart = false;\n        }\n      } else {\n        const atStart = this.atStartStack.pop();\n        this.atBlockStart = atStart.atBlockStart;\n        this.atFlowStart = atStart.atFlowStart;\n      }\n    }\n    return box;\n  }\n\n  /**\n   * Find the start offset of the nearest block start edge to which the\n   * `break-before` value of the box should be propagated. This method can be\n   * called when after pushing the box into the stack or after popping the box\n   * out of the stack.\n   */\n  nearestBlockStartOffset(box: Box): number {\n    if (!box.atBlockStart) {\n      return box.offset;\n    }\n    let i = this.stack.length - 1;\n    let parent = this.stack[i];\n\n    // When called just after the box is popped out, the last box in the stack\n    // is different from the box and it is the parent of the box. When called\n    // after the box is pushed, the last box in the stack is identical to the\n    // box and the parent of the box is a box right before the specified box.\n    if (parent === box) {\n      i--;\n      parent = this.stack[i];\n    }\n    while (i >= 0) {\n      if (parent.flowName !== box.flowName) {\n        return box.offset;\n      }\n      if (!parent.atBlockStart) {\n        return parent.offset;\n      }\n      if (parent.isRoot) {\n        return parent.offset;\n      }\n      box = parent;\n      parent = this.stack[--i];\n    }\n    throw new Error(\"No block start offset found!\");\n  }\n}\n\nexport class Styler implements AbstractStyler {\n  root: Element;\n  cascadeHolder: CssCascade.Cascade;\n  last: Node;\n  rootStyle = {} as CssCascade.ElementStyle;\n  styleMap: { [key: string]: CssCascade.ElementStyle } = {};\n  flows = {} as { [key: string]: Vtree.Flow };\n  flowChunks = [] as Vtree.FlowChunk[];\n  flowListener: FlowListener = null;\n  flowToReach: string | null = null;\n  idToReach: string | null = null;\n  cascade: CssCascade.CascadeInstance;\n  offsetMap: SlipMap;\n  primary: boolean = true;\n  primaryStack = [] as boolean[];\n  rootBackgroundAssigned: boolean = false;\n  rootLayoutAssigned: boolean = false;\n  lastOffset: number;\n  breakBeforeValues = {} as { [key: number]: string | null };\n  boxStack: BoxStack;\n  bodyReached: boolean = true;\n\n  constructor(\n    public readonly xmldoc: XmlDoc.XMLDocHolder,\n    cascade: CssCascade.Cascade,\n    public readonly scope: Exprs.LexicalScope,\n    public readonly context: Exprs.Context,\n    public readonly primaryFlows: { [key: string]: boolean },\n    public readonly validatorSet: CssValidator.ValidatorSet,\n    public readonly counterListener: CssCascade.CounterListener,\n    counterResolver: CssCascade.CounterResolver,\n    counterStyleStore: CounterStyle.CounterStyleStore,\n    cmykStore: CmykStore.CmykStore,\n  ) {\n    this.root = xmldoc.root;\n    this.cascadeHolder = cascade;\n    this.last = this.root;\n    this.cascade = cascade.createInstance(\n      context,\n      counterListener,\n      counterResolver,\n      xmldoc.lang,\n      counterStyleStore,\n      cmykStore,\n    );\n    this.offsetMap = new SlipMap();\n    const rootOffset = xmldoc.getElementOffset(this.root);\n    this.lastOffset = rootOffset;\n    this.boxStack = new BoxStack(context);\n    this.offsetMap.addStuckRange(rootOffset);\n    const style = this.getAttrStyle(this.root);\n    this.cascade.pushElement(this, this.root, style, rootOffset);\n    this.postprocessTopStyle(style, false);\n    switch (this.root.namespaceURI) {\n      case Base.NS.XHTML:\n        this.bodyReached = false;\n        break;\n    }\n    this.primaryStack.push(true);\n    this.styleMap = {};\n    this.styleMap[`e${rootOffset}`] = style;\n    this.lastOffset++;\n    this.replayFlowElementsFromOffset(-1);\n  }\n\n  hasProp(\n    style: CssCascade.ElementStyle,\n    map: CssValidator.ValueMap,\n    name: string,\n  ): boolean {\n    const cascVal = style[name] as CssCascade.CascadeValue;\n    return cascVal && cascVal.evaluate(this.context) !== map[name];\n  }\n\n  transferPropsToRoot(\n    srcStyle: CssCascade.ElementStyle,\n    map: CssValidator.ValueMap,\n  ): void {\n    for (const pname in map) {\n      const cascval = srcStyle[pname];\n      if (cascval) {\n        this.rootStyle[pname] = cascval;\n        delete srcStyle[pname];\n      } else {\n        const val = map[pname];\n        if (val) {\n          this.rootStyle[pname] = new CssCascade.CascadeValue(\n            val,\n            CssParser.SPECIFICITY_AUTHOR,\n          );\n        }\n      }\n    }\n  }\n\n  /**\n   * Transfer properties that should be applied on the container (partition)\n   * level to this.rootStyle.\n   * @param elemStyle (source) element style\n   */\n  postprocessTopStyle(\n    elemStyle: CssCascade.ElementStyle,\n    isBody: boolean,\n  ): void {\n    if (isBody) {\n      for (const propName of [\"writing-mode\", \"direction\"]) {\n        if (elemStyle[propName] && !(isBody && this.rootStyle[propName])) {\n          // Copy it over, but keep it at the root element as well.\n          this.rootStyle[propName] = elemStyle[propName];\n        }\n      }\n    } else {\n      for (const propName in elemStyle) {\n        if (CssCascade.isInherited(propName)) {\n          this.rootStyle[propName] = elemStyle[propName];\n        }\n      }\n    }\n    if (!this.rootBackgroundAssigned) {\n      const backgroundColor = this.hasProp(\n        elemStyle,\n        this.validatorSet.backgroundProps,\n        \"background-color\",\n      )\n        ? (elemStyle[\"background-color\"] as CssCascade.CascadeValue).evaluate(\n            this.context,\n          )\n        : (null as Css.Val);\n      const backgroundImage = this.hasProp(\n        elemStyle,\n        this.validatorSet.backgroundProps,\n        \"background-image\",\n      )\n        ? (elemStyle[\"background-image\"] as CssCascade.CascadeValue).evaluate(\n            this.context,\n          )\n        : (null as Css.Val);\n      if (\n        (backgroundColor && !Css.isDefaultingValue(backgroundColor)) ||\n        (backgroundImage && !Css.isDefaultingValue(backgroundImage))\n      ) {\n        this.transferPropsToRoot(elemStyle, this.validatorSet.backgroundProps);\n        this.rootBackgroundAssigned = true;\n      }\n    }\n    if (!this.rootLayoutAssigned) {\n      for (let i = 0; i < columnProps.length; i++) {\n        if (\n          this.hasProp(elemStyle, this.validatorSet.layoutProps, columnProps[i])\n        ) {\n          this.transferPropsToRoot(elemStyle, this.validatorSet.layoutProps);\n          this.rootLayoutAssigned = true;\n          break;\n        }\n      }\n    }\n    if (!isBody) {\n      // root element\n      const fontSize = elemStyle[\"font-size\"] as CssCascade.CascadeValue;\n      let isRelativeFontSize = true;\n      if (fontSize && !Css.isDefaultingValue(fontSize.value)) {\n        const val = fontSize.evaluate(this.context);\n        if (val instanceof Css.Numeric) {\n          let px = val.num;\n          switch (val.unit) {\n            case \"em\":\n            case \"rem\":\n              px *= this.context.initialFontSize;\n              break;\n            case \"%\":\n              px *= this.context.initialFontSize / 100;\n              break;\n            case \"lh\":\n            case \"rlh\":\n              px *=\n                (this.context.initialFontSize * Exprs.defaultUnitSizes[\"lh\"]) /\n                Exprs.defaultUnitSizes[\"em\"];\n              break;\n            default: {\n              const unitSize = Exprs.defaultUnitSizes[val.unit];\n              if (unitSize) {\n                px *= unitSize;\n              }\n              isRelativeFontSize = false;\n            }\n          }\n          this.context.rootFontSize = px;\n          this.context.isRelativeRootFontSize = isRelativeFontSize;\n        }\n      }\n      const rootFontSize =\n        this.context.rootFontSize ?? this.context.initialFontSize;\n      const lineHeight = elemStyle[\"line-height\"] as CssCascade.CascadeValue;\n      if (lineHeight && !Css.isDefaultingValue(lineHeight.value)) {\n        const val = lineHeight.evaluate(this.context);\n        if (val instanceof Css.Num) {\n          this.context.rootLineHeight = val.num * rootFontSize;\n        } else if (val instanceof Css.Numeric) {\n          let px = val.num;\n          switch (val.unit) {\n            case \"em\":\n            case \"rem\":\n              px *= rootFontSize;\n              break;\n            case \"%\":\n              px *= rootFontSize / 100;\n              break;\n            case \"lh\":\n            case \"rlh\":\n              px *= this.context.initialFontSize * this.context.pref.lineHeight;\n              break;\n            default: {\n              const unitSize = Exprs.defaultUnitSizes[val.unit];\n              if (unitSize) {\n                px *= unitSize;\n              }\n            }\n          }\n          this.context.rootLineHeight = px;\n        }\n      } else {\n        this.context.rootLineHeight =\n          this.context.fontSize() * this.context.pref.lineHeight;\n      }\n    }\n  }\n\n  getTopContainerStyle(): CssCascade.ElementStyle {\n    let offset = 0;\n    while (!this.bodyReached) {\n      offset += 5000;\n      if (this.styleUntil(offset, 0) == Number.POSITIVE_INFINITY) {\n        break;\n      }\n    }\n    return this.rootStyle;\n  }\n\n  getAttrStyle(elem: Element): CssCascade.ElementStyle {\n    // skip cases in which elements for XML other than HTML or SVG\n    // have 'style' attribute not for CSS declaration\n    if ((elem as any).style instanceof CSSStyleDeclaration) {\n      const styleAttrValue = elem.getAttribute(\"style\");\n      if (styleAttrValue) {\n        return CssCascade.parseStyleAttribute(\n          this.scope,\n          this.validatorSet,\n          this.xmldoc.url,\n          styleAttrValue,\n        );\n      }\n    }\n    return {} as CssCascade.ElementStyle;\n  }\n\n  /**\n   * @return currently reached offset\n   */\n  getReachedOffset(): number {\n    return this.lastOffset;\n  }\n\n  /**\n   * Replay flow elements that were encountered since the given offset\n   */\n  replayFlowElementsFromOffset(offset: number): void {\n    if (offset >= this.lastOffset) {\n      return;\n    }\n    const context = this.context;\n    const rootOffset = this.xmldoc.getElementOffset(this.root);\n    if (offset < rootOffset) {\n      const rootStyle = this.getStyle(this.root, false);\n      Asserts.assert(rootStyle);\n      const flowName = CssCascade.getProp(rootStyle, \"flow-into\");\n      const flowNameStr = flowName\n        ? flowName.evaluate(context, \"flow-into\").toString()\n        : \"body\";\n      const newFlowChunk = this.encounteredFlowElement(\n        flowNameStr,\n        rootStyle,\n        this.root,\n        rootOffset,\n      );\n      if (this.boxStack.empty()) {\n        this.boxStack.push(rootStyle, rootOffset, true, newFlowChunk);\n      }\n    }\n    let node = this.xmldoc.getNodeByOffset(offset);\n    let nodeOffset = this.xmldoc.getNodeOffset(node, 0, false);\n    if (nodeOffset >= this.lastOffset) {\n      return;\n    }\n    while (true) {\n      if (node.nodeType != 1) {\n        nodeOffset += node.textContent.length;\n      } else {\n        const elem = node as Element;\n        if (VIVLIOSTYLE_DEBUG) {\n          if (nodeOffset != this.xmldoc.getElementOffset(elem)) {\n            throw new Error(\"Inconsistent offset\");\n          }\n        }\n        const style = this.getStyle(elem, false);\n        const flowName = style[\"flow-into\"] as CssCascade.CascadeValue;\n        if (flowName) {\n          const flowNameStr = flowName\n            .evaluate(context, \"flow-into\")\n            .toString();\n          this.encounteredFlowElement(flowNameStr, style, elem, nodeOffset);\n        }\n        nodeOffset++;\n      }\n      if (nodeOffset >= this.lastOffset) {\n        break;\n      }\n      let next: Node = node.firstChild;\n      if (next == null) {\n        while (true) {\n          next = node.nextSibling;\n          if (next) {\n            break;\n          }\n          node = node.parentNode;\n          if (node === this.root) {\n            return;\n          }\n        }\n      }\n      node = next;\n    }\n  }\n\n  resetFlowChunkStream(flowListener: FlowListener): void {\n    this.flowListener = flowListener;\n    for (let i = 0; i < this.flowChunks.length; i++) {\n      this.flowListener.encounteredFlowChunk(\n        this.flowChunks[i],\n        this.flows[this.flowChunks[i].flowName],\n      );\n    }\n  }\n\n  styleUntilFlowIsReached(flowName: string) {\n    this.flowToReach = flowName;\n    let offset = 0;\n    while (true) {\n      if (this.flowToReach == null) {\n        break;\n      }\n      offset += 5000;\n      if (this.styleUntil(offset, 0) == Number.POSITIVE_INFINITY) {\n        break;\n      }\n    }\n  }\n\n  styleUntilIdIsReached(id: string) {\n    if (!id) {\n      return;\n    }\n    this.idToReach = id;\n    let offset = 0;\n    while (true) {\n      if (!this.idToReach) {\n        break;\n      }\n      offset += 5000;\n      if (this.styleUntil(offset, 0) === Number.POSITIVE_INFINITY) {\n        break;\n      }\n    }\n    this.idToReach = null;\n  }\n\n  private encounteredFlowElement(\n    flowName: string,\n    style: CssCascade.ElementStyle,\n    elem: Element,\n    startOffset: number,\n  ): Vtree.FlowChunk {\n    let priority = 0;\n    let linger = Number.POSITIVE_INFINITY;\n    let exclusive = false;\n    let repeated = false;\n    let last = false;\n    const optionsCV = style[\"flow-options\"] as CssCascade.CascadeValue;\n    if (optionsCV) {\n      const options = CssProp.toSet(\n        optionsCV.evaluate(this.context, \"flow-options\"),\n      );\n      exclusive = !!options[\"exclusive\"];\n      repeated = !!options[\"static\"];\n      last = !!options[\"last\"];\n    }\n    const lingerCV = style[\"flow-linger\"] as CssCascade.CascadeValue;\n    if (lingerCV) {\n      linger = CssProp.toInt(\n        lingerCV.evaluate(this.context, \"flow-linger\"),\n        Number.POSITIVE_INFINITY,\n      );\n    }\n    const priorityCV = style[\"flow-priority\"] as CssCascade.CascadeValue;\n    if (priorityCV) {\n      priority = CssProp.toInt(\n        priorityCV.evaluate(this.context, \"flow-priority\"),\n        0,\n      );\n    }\n    const breakBefore = this.breakBeforeValues[startOffset] || null;\n    let flow = this.flows[flowName];\n    if (!flow) {\n      const parentFlowName = this.boxStack.lastFlowName();\n      flow = this.flows[flowName] = new Vtree.Flow(flowName, parentFlowName);\n    }\n    const flowChunk = new Vtree.FlowChunk(\n      flowName,\n      elem,\n      startOffset,\n      priority,\n      linger,\n      exclusive,\n      repeated,\n      last,\n      breakBefore,\n    );\n    this.flowChunks.push(flowChunk);\n    if (this.flowToReach == flowName) {\n      this.flowToReach = null;\n    }\n    if (this.flowListener) {\n      this.flowListener.encounteredFlowChunk(flowChunk, flow);\n    }\n    return flowChunk;\n  }\n\n  registerForcedBreakOffset(\n    breakValue: string | null,\n    offset: number,\n    flowName: string,\n  ) {\n    if (Break.isForcedBreakValue(breakValue)) {\n      const forcedBreakOffsets = this.flows[flowName].forcedBreakOffsets;\n      if (\n        forcedBreakOffsets.length === 0 ||\n        forcedBreakOffsets[forcedBreakOffsets.length - 1] < offset\n      ) {\n        forcedBreakOffsets.push(offset);\n      }\n    }\n    const previousValue = this.breakBeforeValues[offset];\n    this.breakBeforeValues[offset] = Break.resolveEffectiveBreakValue(\n      previousValue,\n      breakValue,\n    );\n  }\n\n  /**\n   * @param startOffset current position in the document\n   * @param lookup lookup window size for the next page\n   * @return lookup offset in the document for the next page\n   */\n  styleUntil(startOffset: number, lookup: number): number {\n    let targetSlippedOffset = -1;\n    let slippedOffset: number;\n    if (startOffset <= this.lastOffset) {\n      slippedOffset = this.offsetMap.slippedByFixed(startOffset);\n      targetSlippedOffset = slippedOffset + lookup;\n      if (targetSlippedOffset < this.offsetMap.getMaxSlipped()) {\n        // got to the desired point\n        return this.offsetMap.fixedBySlipped(targetSlippedOffset);\n      }\n    }\n    if (this.last == null) {\n      return Number.POSITIVE_INFINITY;\n    }\n    const context = this.context;\n    while (true) {\n      let next: Node = this.last.firstChild;\n      if (next == null) {\n        while (true) {\n          if (this.last.nodeType == 1) {\n            this.cascade.popElement(this.last as Element);\n            this.primary = this.primaryStack.pop();\n            const box = this.boxStack.pop(this.lastOffset);\n            let breakAfter: string | null = null;\n            if (box.afterBox) {\n              const afterPseudoBreakBefore =\n                box.afterBox.getBreakValue(\"before\");\n              this.registerForcedBreakOffset(\n                afterPseudoBreakBefore,\n                box.afterBox.atBlockStart\n                  ? this.boxStack.nearestBlockStartOffset(box)\n                  : box.afterBox.offset,\n                box.flowName,\n              );\n              breakAfter = box.afterBox.getBreakValue(\"after\");\n            }\n            breakAfter = Break.resolveEffectiveBreakValue(\n              breakAfter,\n              box.getBreakValue(\"after\"),\n            );\n            this.registerForcedBreakOffset(\n              breakAfter,\n              this.lastOffset,\n              box.flowName,\n            );\n          }\n          next = this.last.nextSibling;\n          if (next) {\n            break;\n          }\n          this.last = this.last.parentNode;\n          if (this.last === this.root) {\n            this.last = null;\n            if (startOffset < this.lastOffset) {\n              if (targetSlippedOffset < 0) {\n                slippedOffset = this.offsetMap.slippedByFixed(startOffset);\n                targetSlippedOffset = slippedOffset + lookup;\n              }\n              if (targetSlippedOffset <= this.offsetMap.getMaxSlipped()) {\n                // got to the desired point\n                return this.offsetMap.fixedBySlipped(targetSlippedOffset);\n              }\n            }\n            return Number.POSITIVE_INFINITY;\n          }\n        }\n      }\n      this.last = next;\n      if (this.last.nodeType != 1) {\n        this.lastOffset += this.last.textContent.length;\n        this.boxStack.encounteredTextNode(this.last);\n        if (this.primary) {\n          this.offsetMap.addStuckRange(this.lastOffset);\n        } else {\n          this.offsetMap.addSlippedRange(this.lastOffset);\n        }\n      } else {\n        const elem = this.last as Element;\n        const style = this.getAttrStyle(elem);\n        this.primaryStack.push(this.primary);\n        this.cascade.pushElement(this, elem, style, this.lastOffset);\n        const id =\n          elem.getAttribute(\"id\") || elem.getAttributeNS(Base.NS.XML, \"id\");\n        if (id && id === this.idToReach) {\n          this.idToReach = null;\n        }\n        if (\n          !this.bodyReached &&\n          elem.localName == \"body\" &&\n          elem.parentNode == this.root\n        ) {\n          this.postprocessTopStyle(style, true);\n          this.bodyReached = true;\n        }\n        let box: Box;\n        const flowName = style[\"flow-into\"] as CssCascade.CascadeValue;\n        if (flowName) {\n          const flowNameStr = flowName\n            .evaluate(context, \"flow-into\")\n            .toString();\n          const newFlowChunk = this.encounteredFlowElement(\n            flowNameStr,\n            style,\n            elem,\n            this.lastOffset,\n          );\n          this.primary = !!this.primaryFlows[flowNameStr];\n          box = this.boxStack.push(\n            style,\n            this.lastOffset,\n            elem === this.root,\n            newFlowChunk,\n          );\n        } else {\n          box = this.boxStack.push(style, this.lastOffset, elem === this.root);\n\n          // For not ignoring break-before on :root (issue #666)\n          if (elem === this.xmldoc.body) {\n            box.breakBefore = Break.resolveEffectiveBreakValue(\n              box.flowChunk.breakBefore,\n              box.breakBefore,\n            );\n          }\n        }\n        const blockStartOffset = this.boxStack.nearestBlockStartOffset(box);\n\n        if (blockStartOffset === 0) {\n          // Named page type at first page\n          const pageCV = style[\"page\"] as CssCascade.CascadeValue;\n          const pageType =\n            pageCV &&\n            !Css.isDefaultingValue(pageCV.value) &&\n            pageCV.value.toString();\n          if (pageType && pageType.toLowerCase() !== \"auto\") {\n            this.cascade.firstPageType = pageType;\n          }\n        }\n\n        this.registerForcedBreakOffset(\n          box.breakBefore,\n          blockStartOffset,\n          box.flowName,\n        );\n        if (box.beforeBox) {\n          const beforePseudoBreakAfter = box.beforeBox.getBreakValue(\"after\");\n          this.registerForcedBreakOffset(\n            beforePseudoBreakAfter,\n            box.beforeBox.atBlockStart ? blockStartOffset : box.offset,\n            box.flowName,\n          );\n        }\n        if (this.primary) {\n          if (box.displayValue() === Css.ident.none) {\n            this.primary = false;\n          }\n        }\n        if (VIVLIOSTYLE_DEBUG) {\n          const offset = this.xmldoc.getElementOffset(this.last as Element);\n          if (offset != this.lastOffset) {\n            throw new Error(\"Inconsistent offset\");\n          }\n        }\n        this.styleMap[`e${this.lastOffset}`] = style;\n        this.lastOffset++;\n        if (this.primary) {\n          this.offsetMap.addStuckRange(this.lastOffset);\n        } else {\n          this.offsetMap.addSlippedRange(this.lastOffset);\n        }\n        if (this.bodyReached && blockStartOffset === 0) {\n          // body reached but the named page type at first page is not determined\n          // (Fix for issue #770)\n          continue;\n        }\n        if (startOffset < this.lastOffset) {\n          if (targetSlippedOffset < 0) {\n            slippedOffset = this.offsetMap.slippedByFixed(startOffset);\n            targetSlippedOffset = slippedOffset + lookup;\n          }\n          if (targetSlippedOffset <= this.offsetMap.getMaxSlipped()) {\n            // got to the desired point\n            return this.offsetMap.fixedBySlipped(targetSlippedOffset);\n          }\n        }\n      }\n    }\n  }\n\n  /** @override */\n  getStyle(element: Element, deep: boolean): CssCascade.ElementStyle {\n    let offset = this.xmldoc.getElementOffset(element);\n    const key = `e${offset}`;\n    if (deep) {\n      offset = this.xmldoc.getNodeOffset(element, 0, true);\n    }\n    if (this.lastOffset <= offset) {\n      this.styleUntil(offset, 0);\n    }\n    return this.styleMap[key];\n  }\n\n  /** @override */\n  processContent(\n    element: Element,\n    styles: { [key: string]: Css.Val },\n    nodeContext: Vtree.NodeContext,\n  ) {}\n}\n\nexport const columnProps = [\"column-count\", \"column-width\", \"column-fill\"];\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssValidator - Parse validation rules (validation.txt), validate\n * properties and shorthands.\n */\nimport * as CounterStyle from \"./counter-style\";\nimport * as Css from \"./css\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as Base from \"./base\";\nimport { ValidationTxt } from \"./assets\";\nimport { TokenType } from \"./css-tokenizer\";\n\nexport interface PropertyReceiver {\n  unknownProperty(name: string, value: Css.Val): void;\n\n  invalidPropertyValue(name: string, value: Css.Val): void;\n\n  simpleProperty(name: string, value: Css.Val, important): void;\n}\n\nexport class Node {\n  success: Node = null;\n  failure: Node = null;\n  code: number = 0;\n\n  constructor(public validator: PropertyValidator) {}\n\n  isSpecial(): boolean {\n    return this.code != 0;\n  }\n\n  markAsStartGroup(): void {\n    this.code = -1;\n  }\n\n  isStartGroup(): boolean {\n    return this.code == -1;\n  }\n\n  markAsEndGroup(): void {\n    this.code = -2;\n  }\n\n  isEndGroup(): boolean {\n    return this.code == -2;\n  }\n\n  markAsStartAlternate(index: number): void {\n    this.code = 2 * index + 1;\n  }\n\n  isStartAlternate(): boolean {\n    return this.code > 0 && this.code % 2 != 0;\n  }\n\n  markAsEndAlternate(index: number): void {\n    this.code = 2 * index + 2;\n  }\n\n  isEndAlternate(): boolean {\n    return this.code > 0 && this.code % 2 == 0;\n  }\n\n  getAlternate(): number {\n    return Math.floor((this.code - 1) / 2);\n  }\n}\n\nexport class Connection {\n  what: number = -1;\n\n  constructor(\n    public where: number,\n    public success: boolean,\n  ) {}\n}\n\n/**\n * @enum {number}\n */\nexport enum Add {\n  FOLLOW = 1,\n  OPTIONAL,\n  REPEATED,\n  ALTERNATE,\n}\n\n/**\n * A class to build a list validator from other validators.\n */\nexport class ValidatingGroup {\n  nodes: Node[] = [];\n  connections: Connection[] = [];\n  match: number[] = []; // connector indicies\n  nomatch: number[] = []; // connector indicies\n  error: number[] = []; // connector indicies\n  emptyHead: boolean = true;\n\n  connect(arr: number[], nodeIndex: number): void {\n    for (let i = 0; i < arr.length; i++) {\n      this.connections[arr[i]].what = nodeIndex;\n    }\n    arr.splice(0, arr.length);\n  }\n\n  clone(): ValidatingGroup {\n    const group = new ValidatingGroup();\n    for (let i = 0; i < this.nodes.length; i++) {\n      const node = this.nodes[i];\n      const clonedNode = new Node(node.validator);\n      clonedNode.code = node.code;\n      group.nodes.push(clonedNode);\n    }\n    for (let i = 0; i < this.connections.length; i++) {\n      const connection = this.connections[i];\n      const groupConnection = new Connection(\n        connection.where,\n        connection.success,\n      );\n      groupConnection.what = connection.what;\n      group.connections.push(groupConnection);\n    }\n    group.match.push(...this.match);\n    group.nomatch.push(...this.nomatch);\n    group.error.push(...this.error);\n    return group;\n  }\n\n  /**\n   * Add \"special\" validation node to a given array (match, nomatch, or error).\n   * @param start if this a start or the end of a clause/group\n   * @param clause 0 indicates group start/end, otherwise clause index\n   */\n  private addSpecialToArr(arr: number[], start: boolean, clause: number): void {\n    const index = this.nodes.length;\n    const node = new Node(ALWAYS_FAIL);\n    if (clause >= 0) {\n      if (start) {\n        node.markAsStartAlternate(clause);\n      } else {\n        node.markAsEndAlternate(clause);\n      }\n    } else {\n      if (start) {\n        node.markAsStartGroup();\n      } else {\n        node.markAsEndGroup();\n      }\n    }\n    this.nodes.push(node);\n    this.connect(arr, index);\n    const success = new Connection(index, true);\n    const failure = new Connection(index, false);\n    arr.push(this.connections.length);\n    this.connections.push(failure);\n    arr.push(this.connections.length);\n    this.connections.push(success);\n  }\n\n  endSpecialGroup(): void {\n    const arrs = [this.match, this.nomatch, this.error];\n    for (let i = 0; i < arrs.length; i++) {\n      this.addSpecialToArr(arrs[i], false, -1);\n    }\n  }\n\n  startSpecialGroup(): void {\n    if (this.nodes.length) {\n      throw new Error(\"invalid call\");\n    }\n    this.addSpecialToArr(this.match, true, -1);\n  }\n\n  endClause(clause: number): void {\n    this.addSpecialToArr(this.match, false, clause);\n  }\n\n  startClause(clause: number): void {\n    if (this.nodes.length) {\n      throw new Error(\"invalid call\");\n    }\n    const node = new Node(ALWAYS_FAIL);\n    node.markAsStartAlternate(clause);\n    this.nodes.push(node);\n    const success = new Connection(0, true);\n    const failure = new Connection(0, false);\n    this.nomatch.push(this.connections.length);\n    this.connections.push(failure);\n    this.match.push(this.connections.length);\n    this.connections.push(success);\n  }\n\n  addPrimitive(validator: PropertyValidator): void {\n    const index = this.nodes.length;\n    this.nodes.push(new Node(validator));\n    const success = new Connection(index, true);\n    const failure = new Connection(index, false);\n    this.connect(this.match, index);\n    if (this.emptyHead) {\n      // if did not validate -> no match\n      this.nomatch.push(this.connections.length);\n      this.emptyHead = false;\n    } else {\n      // if did not validate -> failure\n      this.error.push(this.connections.length);\n    }\n    this.connections.push(failure);\n    this.match.push(this.connections.length);\n    this.connections.push(success);\n  }\n\n  isSimple(): boolean {\n    return this.nodes.length == 1 && !this.nodes[0].isSpecial();\n  }\n\n  isPrimitive(): boolean {\n    return (\n      this.isSimple() && this.nodes[0].validator instanceof PrimitiveValidator\n    );\n  }\n\n  addGroup(group: ValidatingGroup, how: Add): void {\n    if (group.nodes.length == 0) {\n      return;\n    }\n    const index = this.nodes.length;\n\n    // optimization for alternate primitive validators\n    if (\n      how == Add.ALTERNATE &&\n      index == 1 &&\n      group.isPrimitive() &&\n      this.isPrimitive()\n    ) {\n      this.nodes[0].validator = (\n        this.nodes[0].validator as PrimitiveValidator\n      ).combine(group.nodes[0].validator as PrimitiveValidator);\n      return;\n    }\n    for (let i = 0; i < group.nodes.length; i++) {\n      this.nodes.push(group.nodes[i]);\n    }\n\n    // nodes[index] is group start\n    if (how == Add.ALTERNATE) {\n      this.emptyHead = true;\n      this.connect(this.nomatch, index);\n    } else {\n      this.connect(this.match, index);\n    }\n    const connectionIndex = this.connections.length;\n    for (let i = 0; i < group.connections.length; i++) {\n      const connection = group.connections[i];\n      connection.where += index;\n      if (connection.what >= 0) {\n        connection.what += index;\n      }\n      this.connections.push(connection);\n    }\n    for (let i = 0; i < group.match.length; i++) {\n      this.match.push(group.match[i] + connectionIndex);\n    }\n    if (how == Add.REPEATED) {\n      this.connect(this.match, index);\n    }\n    if (how == Add.OPTIONAL || how == Add.REPEATED) {\n      for (let i = 0; i < group.nomatch.length; i++) {\n        this.match.push(group.nomatch[i] + connectionIndex);\n      }\n    } else if (this.emptyHead) {\n      for (let i = 0; i < group.nomatch.length; i++) {\n        this.nomatch.push(group.nomatch[i] + connectionIndex);\n      }\n      this.emptyHead = group.emptyHead;\n    } else {\n      for (let i = 0; i < group.nomatch.length; i++) {\n        this.error.push(group.nomatch[i] + connectionIndex);\n      }\n    }\n    for (let i = 0; i < group.error.length; i++) {\n      this.error.push(group.error[i] + connectionIndex);\n    }\n\n    // invalidate group\n    group.nodes = null;\n    group.connections = null;\n  }\n\n  /**\n   * @return how\n   */\n  finish(successTerminal: Node, failTerminal: Node): Node {\n    const index = this.nodes.length;\n    this.nodes.push(successTerminal);\n    this.nodes.push(failTerminal);\n    this.connect(this.match, index);\n    this.connect(this.nomatch, index + 1);\n    this.connect(this.error, index + 1);\n    for (const connection of this.connections) {\n      if (connection.success) {\n        this.nodes[connection.where].success = this.nodes[connection.what];\n      } else {\n        this.nodes[connection.where].failure = this.nodes[connection.what];\n      }\n    }\n\n    // make sure that our data structure is correct\n    for (let j = 0; j < index; j++) {\n      if (this.nodes[j].failure == null || this.nodes[j].success == null) {\n        throw new Error(\"Invalid validator state\");\n      }\n    }\n    return this.nodes[0];\n  }\n}\n\nexport const ALLOW_EMPTY = 0x01;\n\nexport const ALLOW_STR = 0x02;\n\nexport const ALLOW_IDENT = 0x04;\n\nexport const ALLOW_POS_NUMERIC = 0x08;\n\nexport const ALLOW_POS_NUM = 0x10;\n\nexport const ALLOW_POS_INT = 0x20;\n\nexport const ALLOW_COLOR = 0x40;\n\nexport const ALLOW_URL = 0x80;\n\nexport const ALLOW_NEGATIVE = 0x100;\n\nexport const ALLOW_ZERO = 0x200;\n\nexport const ALLOW_ZERO_PERCENT = 0x400;\n\nexport const ALLOW_SLASH = 0x800;\n\nexport const ALLOW_URANGE = 0x1000;\n\nexport const ALLOW_IMAGE = 0x2000;\n\nexport type ValueMap = {\n  [key: string]: Css.Val;\n};\n\n/**\n * Abstract class to validate simple CSS property value (not a shorthand)\n */\nexport class PropertyValidator extends Css.Visitor {\n  constructor() {\n    super();\n  }\n\n  /**\n   * Validate a subsequence of the given values from the given index. Return the\n   * list of matched values or null if there is no match.\n   */\n  validateForShorthand(values: Css.Val[], index: number): Css.Val[] {\n    const rval = values[index].visit(this);\n    if (rval) {\n      return [rval];\n    }\n    return null;\n  }\n}\n\n/**\n * Validate a primitive CSS value (not a list or function).\n * @param allowed mask of ALLOW_*** constants.\n */\nexport class PrimitiveValidator extends PropertyValidator {\n  constructor(\n    public readonly allowed: number,\n    public readonly idents: ValueMap,\n    public readonly units: ValueMap,\n  ) {\n    super();\n  }\n\n  override visitEmpty(empty: Css.Val): Css.Val {\n    if (this.allowed & ALLOW_EMPTY) {\n      return empty;\n    }\n    return null;\n  }\n\n  override visitSlash(slash: Css.Val): Css.Val {\n    if (this.allowed & ALLOW_SLASH) {\n      return slash;\n    }\n    return null;\n  }\n\n  override visitStr(str: Css.Str): Css.Val {\n    if (this.allowed & ALLOW_STR) {\n      return str;\n    }\n    return null;\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    const val = this.idents[ident.name.toLowerCase()];\n    if (val) {\n      return val;\n    }\n    if (this.allowed & ALLOW_IDENT) {\n      return ident;\n    }\n    if (this.allowed & ALLOW_COLOR) {\n      if (CSS.supports(\"color\", ident.name)) {\n        return ident;\n      }\n    }\n    return null;\n  }\n\n  override visitNumeric(numeric: Css.Numeric): Css.Val {\n    if (numeric.num == 0 && !(this.allowed & ALLOW_ZERO)) {\n      if (numeric.unit == \"%\" && this.allowed & ALLOW_ZERO_PERCENT) {\n        return numeric;\n      }\n      return null;\n    }\n    if (numeric.num < 0 && !(this.allowed & ALLOW_NEGATIVE)) {\n      return null;\n    }\n    if (this.units[numeric.unit]) {\n      return numeric;\n    }\n    return null;\n  }\n\n  override visitNum(num: Css.Num): Css.Val {\n    if (num.num == 0) {\n      return this.allowed & ALLOW_ZERO ? num : null;\n    }\n    if (num.num <= 0 && !(this.allowed & ALLOW_NEGATIVE)) {\n      return null;\n    }\n    if (this.allowed & ALLOW_POS_NUM) {\n      return num;\n    }\n    return null;\n  }\n\n  override visitInt(num: Css.Int): Css.Val {\n    if (num.num == 0) {\n      return this.allowed & ALLOW_ZERO ? num : null;\n    }\n    if (num.num <= 0 && !(this.allowed & ALLOW_NEGATIVE)) {\n      return null;\n    }\n    if (this.allowed & (ALLOW_POS_INT | ALLOW_POS_NUM)) {\n      return num;\n    }\n    const val = this.idents[`${num.num}`];\n    if (val) {\n      return val;\n    }\n    return null;\n  }\n\n  override visitHexColor(color: Css.HexColor): Css.Val {\n    if (this.allowed & ALLOW_COLOR) {\n      if (/^([0-9A-F]{3,4}|([0-9A-F]{2}){3,4})$/i.test(color.hex)) {\n        return color;\n      }\n    }\n    return null;\n  }\n\n  override visitURL(url: Css.URL): Css.Val {\n    if (this.allowed & ALLOW_URL) {\n      return url;\n    }\n    return null;\n  }\n\n  override visitURange(urange: Css.URange): Css.Val {\n    if (this.allowed & ALLOW_URANGE) {\n      return urange;\n    }\n    return null;\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    return null;\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    return null;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    if (this.allowed & ALLOW_COLOR) {\n      if (func.name === \"device-cmyk\") {\n        if (\n          CSS.supports(\"color\", \"color(srgb 0 0 0)\") &&\n          CmykStore.parseDeviceCmyk(func) !== null\n        ) {\n          return func;\n        }\n        return null;\n      }\n      if (CSS.supports(\"color\", func.toString())) {\n        return func;\n      }\n    }\n    if (this.allowed & ALLOW_IMAGE) {\n      // CSS.supports() doesn't understand device-cmyk(), so we need to\n      // substitute it with a valid color for structure validation.\n      const tempFunc = func.visit(new CmykStore.CmykFilterVisitor());\n      if (CSS.supports(\"background-image\", tempFunc.toString())) {\n        return func;\n      }\n    }\n    if (\n      func.name === \"calc\" &&\n      this.allowed &\n        (ALLOW_POS_NUMERIC |\n          ALLOW_POS_NUM |\n          ALLOW_POS_INT |\n          ALLOW_NEGATIVE |\n          ALLOW_ZERO |\n          ALLOW_ZERO_PERCENT)\n    ) {\n      return func;\n    }\n    return null;\n  }\n\n  override visitExpr(expr: Css.Expr): Css.Val {\n    if (this.allowed & 0x7fe) {\n      // ALLOW_STR|ALLOW_IDENT|...|ALLOW_ZERO_PERCENT\n      return expr;\n    }\n    return null;\n  }\n\n  combine(other: PrimitiveValidator): PrimitiveValidator {\n    const idents: ValueMap = {};\n    const units: ValueMap = {};\n    for (const ident in this.idents) {\n      idents[ident] = this.idents[ident];\n    }\n    for (const ident in other.idents) {\n      idents[ident] = other.idents[ident];\n    }\n    for (const unit in this.units) {\n      units[unit] = this.units[unit];\n    }\n    for (const unit in other.units) {\n      units[unit] = other.units[unit];\n    }\n    return new PrimitiveValidator(this.allowed | other.allowed, idents, units);\n  }\n}\n\nconst NO_IDENTS: ValueMap = {};\n\nexport const ALWAYS_FAIL = new PrimitiveValidator(0, NO_IDENTS, NO_IDENTS);\n\n/**\n * Base class for list validation.\n */\nexport class ListValidator extends PropertyValidator {\n  successTerminal: Node;\n  failureTerminal: Node;\n  first: Node;\n\n  constructor(group: ValidatingGroup) {\n    super();\n    this.successTerminal = new Node(null);\n    this.failureTerminal = new Node(null);\n    this.first = group.finish(this.successTerminal, this.failureTerminal);\n  }\n\n  validateList(arr: Css.Val[], slice: boolean, startIndex: number): Css.Val[] {\n    let out: Css.Val[] = slice ? [] : arr;\n    let current = this.first;\n    let index = startIndex;\n    let alternativeStack: string[][] = null;\n    let alternatives: string[] = null;\n    while (\n      current !== this.successTerminal &&\n      current !== this.failureTerminal\n    ) {\n      if (index >= arr.length) {\n        current = current.failure;\n        continue;\n      }\n      const inval = arr[index];\n      let outval = inval;\n      if (current.isSpecial()) {\n        let success = true;\n        if (current.isStartGroup()) {\n          if (alternativeStack) {\n            alternativeStack.push(alternatives);\n          } else {\n            alternativeStack = [alternatives];\n          }\n          alternatives = [];\n        } else if (current.isEndGroup()) {\n          if (alternativeStack.length > 0) {\n            alternatives = alternativeStack.pop();\n          } else {\n            alternatives = null;\n          }\n        } else if (current.isEndAlternate()) {\n          alternatives[current.getAlternate()] = \"taken\";\n        } else {\n          success = alternatives[current.getAlternate()] == null;\n        }\n        current = success ? current.success : current.failure;\n      } else {\n        if (\n          index == 0 &&\n          !slice &&\n          current.validator instanceof SpaceListValidator &&\n          this instanceof SpaceListValidator\n        ) {\n          // Special nesting case: validate the input space list as a whole.\n          outval = new Css.SpaceList(arr).visit(current.validator);\n          if (outval) {\n            index = arr.length;\n            current = current.success;\n            continue;\n          }\n        } else if (\n          index == 0 &&\n          !slice &&\n          current.validator instanceof CommaListValidator &&\n          this instanceof SpaceListValidator\n        ) {\n          // Special nesting case: validate the input comma list as a whole.\n          outval = new Css.CommaList(arr).visit(current.validator);\n          if (outval) {\n            index = arr.length;\n            current = current.success;\n            continue;\n          }\n        } else {\n          outval = inval.visit(current.validator);\n        }\n        if (!outval) {\n          current = current.failure;\n          continue;\n        }\n        if (outval !== inval && arr === out) {\n          // startIndex is zero here\n          out = [];\n          for (let k = 0; k < index; k++) {\n            out[k] = arr[k];\n          }\n        }\n        if (arr !== out) {\n          out[index - startIndex] = outval;\n        }\n        index++;\n        current = current.success;\n      }\n    }\n    if (current === this.successTerminal) {\n      if (slice ? out.length > 0 : index == arr.length) {\n        return out;\n      }\n    }\n    return null;\n  }\n\n  validateSingle(inval: Css.Val): Css.Val {\n    // no need to worry about \"specials\"\n    let outval: Css.Val = null;\n    let current = this.first;\n    while (\n      current !== this.successTerminal &&\n      current !== this.failureTerminal\n    ) {\n      if (!inval) {\n        current = current.failure;\n        continue;\n      }\n      if (current.isSpecial()) {\n        current = current.success;\n        continue;\n      }\n      outval = inval.visit(current.validator);\n      if (!outval) {\n        current = current.failure;\n        continue;\n      }\n      inval = null;\n      current = current.success;\n    }\n    if (current === this.successTerminal) {\n      return outval;\n    }\n    return null;\n  }\n\n  override visitEmpty(empty: Css.Val): Css.Val {\n    return this.validateSingle(empty);\n  }\n\n  override visitSlash(slash: Css.Val): Css.Val {\n    return this.validateSingle(slash);\n  }\n\n  override visitStr(str: Css.Str): Css.Val {\n    return this.validateSingle(str);\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    return this.validateSingle(ident);\n  }\n\n  override visitNumeric(numeric: Css.Numeric): Css.Val {\n    return this.validateSingle(numeric);\n  }\n\n  override visitNum(num: Css.Num): Css.Val {\n    return this.validateSingle(num);\n  }\n\n  override visitInt(num: Css.Int): Css.Val {\n    return this.validateSingle(num);\n  }\n\n  override visitHexColor(color: Css.HexColor): Css.Val {\n    return this.validateSingle(color);\n  }\n\n  override visitURL(url: Css.URL): Css.Val {\n    return this.validateSingle(url);\n  }\n\n  override visitURange(urange: Css.URange): Css.Val {\n    return this.validateSingle(urange);\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    return null;\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    return null;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    return this.validateSingle(func);\n  }\n\n  override visitExpr(expr: Css.Expr): Css.Val {\n    return null;\n  }\n}\n\nexport class SpaceListValidator extends ListValidator {\n  constructor(group: ValidatingGroup) {\n    super(group);\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    const arr = this.validateList(list.values, false, 0);\n    if (arr === list.values) {\n      return list;\n    }\n    if (!arr) {\n      return null;\n    }\n    return new Css.SpaceList(arr);\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    // Special Case : Issue #156\n    let node = this.first;\n    let hasCommaListValidator = false;\n    while (node) {\n      if (node.validator instanceof CommaListValidator) {\n        hasCommaListValidator = true;\n        break;\n      }\n      node = node.failure;\n    }\n    if (hasCommaListValidator) {\n      const arr = this.validateList(list.values, false, 0);\n      if (arr === list.values) {\n        return list;\n      }\n      if (!arr) {\n        return null;\n      }\n      return new Css.CommaList(arr);\n    }\n    return null;\n  }\n\n  override validateForShorthand(values: Css.Val[], index: number): Css.Val[] {\n    return this.validateList(values, true, index);\n  }\n}\n\nexport class CommaListValidator extends ListValidator {\n  constructor(group: ValidatingGroup) {\n    super(group);\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    return this.validateSingle(list);\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    const arr = this.validateList(list.values, false, 0);\n    if (arr === list.values) {\n      return list;\n    }\n    if (!arr) {\n      return null;\n    }\n    return new Css.CommaList(arr);\n  }\n\n  override validateForShorthand(values: Css.Val[], index: number): Css.Val[] {\n    let current = this.first;\n    let rval: Css.Val[];\n    while (current !== this.failureTerminal) {\n      rval = current.validator.validateForShorthand(values, index);\n      if (rval) {\n        return rval;\n      }\n      current = current.failure;\n    }\n    return null;\n  }\n}\n\nexport class FuncValidator extends ListValidator {\n  constructor(\n    public readonly name: string,\n    group: ValidatingGroup,\n  ) {\n    super(group);\n  }\n\n  override validateSingle(inval: Css.Val): Css.Val {\n    return null;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    if (func.name.toLowerCase() != this.name) {\n      return null;\n    }\n    const arr = this.validateList(func.values, false, 0);\n    if (arr === func.values) {\n      return func;\n    }\n    if (!arr) {\n      return null;\n    }\n    return new Css.Func(func.name, arr);\n  }\n}\n\n//----------------------- Shorthands\n//------------------------------------------------------------\nexport class ShorthandSyntaxNode {\n  /**\n   * @return new index.\n   */\n  tryParse(\n    values: Css.Val[],\n    index: number,\n    shorthandValidator: ShorthandValidator,\n  ): number {\n    return index;\n  }\n\n  success(rval: Css.Val, shorthandValidator: ShorthandValidator): void {}\n}\n\nexport class ShorthandSyntaxProperty extends ShorthandSyntaxNode {\n  validator: PropertyValidator;\n\n  constructor(\n    validatorSet: ValidatorSet,\n    public readonly name: string,\n  ) {\n    super();\n    this.validator = validatorSet.validators[this.name];\n  }\n\n  override tryParse(\n    values: Css.Val[],\n    index: number,\n    shorthandValidator: ShorthandValidator,\n  ): number {\n    if (shorthandValidator.values[this.name]) {\n      return index;\n    }\n    const rvals = this.validator.validateForShorthand(values, index);\n    if (rvals) {\n      const len = rvals.length;\n      const rval = len > 1 ? new Css.SpaceList(rvals) : rvals[0];\n      this.success(rval, shorthandValidator);\n      return index + len;\n    }\n    return index;\n  }\n\n  override success(\n    rval: Css.Val,\n    shorthandValidator: ShorthandValidator,\n  ): void {\n    shorthandValidator.values[this.name] = rval;\n  }\n}\n\nexport class ShorthandSyntaxPropertyN extends ShorthandSyntaxProperty {\n  constructor(\n    validatorSet: ValidatorSet,\n    public readonly names: string[],\n  ) {\n    super(validatorSet, names[0]);\n  }\n\n  override success(\n    rval: Css.Val,\n    shorthandValidator: ShorthandValidator,\n  ): void {\n    for (let i = 0; i < this.names.length; i++) {\n      shorthandValidator.values[this.names[i]] = rval;\n    }\n  }\n}\n\nexport class ShorthandSyntaxCompound extends ShorthandSyntaxNode {\n  constructor(\n    public readonly nodes: ShorthandSyntaxNode[],\n    public readonly slash: boolean,\n  ) {\n    super();\n  }\n\n  override tryParse(\n    values: Css.Val[],\n    index: number,\n    shorthandValidator: ShorthandValidator,\n  ): number {\n    const index0 = index;\n    if (this.slash) {\n      if (values[index] == Css.slash) {\n        if (++index == values.length) {\n          return index0;\n        }\n      } else {\n        return index0;\n      }\n    }\n    let newIndex = this.nodes[0].tryParse(values, index, shorthandValidator);\n    if (newIndex == index) {\n      return index0;\n    }\n    index = newIndex;\n    for (let i = 1; i < this.nodes.length && index < values.length; i++) {\n      newIndex = this.nodes[i].tryParse(values, index, shorthandValidator);\n      if (newIndex == index) {\n        break;\n      }\n      index = newIndex;\n    }\n    return index;\n  }\n}\n\nexport class ShorthandValidator extends Css.Visitor {\n  syntax: ShorthandSyntaxNode[] = null;\n  propList: string[] = null;\n  error: boolean = false;\n  values: ValueMap = {};\n  validatorSet: ValidatorSet = null;\n\n  setOwner(validatorSet: ValidatorSet) {\n    this.validatorSet = validatorSet;\n  }\n\n  syntaxNodeForProperty(name: string): ShorthandSyntaxNode {\n    return new ShorthandSyntaxProperty(this.validatorSet, name);\n  }\n\n  clone(): this {\n    const other = new (this.constructor as any)();\n    other.syntax = this.syntax;\n    other.propList = this.propList;\n    other.validatorSet = this.validatorSet;\n    return other;\n  }\n\n  init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n    this.syntax = syntax;\n    this.propList = propList;\n  }\n\n  finish(important: boolean, receiver: PropertyReceiver): boolean {\n    if (!this.error) {\n      for (const name of this.propList) {\n        receiver.simpleProperty(\n          name,\n          this.values[name] ??\n            this.validatorSet.defaultValues[name] ??\n            Css.ident.initial,\n          important,\n        );\n      }\n      return true;\n    }\n    return false;\n  }\n\n  propagateDefaultingValue(\n    value: Css.Val,\n    important: boolean,\n    receiver: PropertyReceiver,\n  ): void {\n    for (const name of this.propList) {\n      receiver.simpleProperty(name, value, important);\n    }\n  }\n\n  validateList(list: Css.Val[]): number {\n    this.error = true;\n    return 0;\n  }\n\n  validateSingle(val: Css.Val): Css.Val {\n    this.validateList([val]);\n    return null;\n  }\n\n  override visitEmpty(empty: Css.Val): Css.Val {\n    return this.validateSingle(empty);\n  }\n\n  override visitStr(str: Css.Str): Css.Val {\n    return this.validateSingle(str);\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    return this.validateSingle(ident);\n  }\n\n  override visitNumeric(numeric: Css.Numeric): Css.Val {\n    return this.validateSingle(numeric);\n  }\n\n  override visitNum(num: Css.Num): Css.Val {\n    return this.validateSingle(num);\n  }\n\n  override visitInt(num: Css.Int): Css.Val {\n    return this.validateSingle(num);\n  }\n\n  override visitHexColor(color: Css.HexColor): Css.Val {\n    return this.validateSingle(color);\n  }\n\n  override visitURL(url: Css.URL): Css.Val {\n    return this.validateSingle(url);\n  }\n\n  override visitSpaceList(list: Css.SpaceList): Css.Val {\n    this.validateList(list.values);\n    return null;\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    this.error = true;\n    return null;\n  }\n\n  override visitFunc(func: Css.Func): Css.Val {\n    return this.validateSingle(func);\n  }\n\n  override visitExpr(expr: Css.Expr): Css.Val {\n    return this.validateSingle(expr);\n  }\n}\n\nexport class SimpleShorthandValidator extends ShorthandValidator {\n  constructor() {\n    super();\n  }\n\n  override validateList(list: Css.Val[]): number {\n    let index = 0;\n    let i = 0;\n    while (index < list.length) {\n      const newIndex = this.syntax[i].tryParse(list, index, this);\n      if (newIndex > index) {\n        index = newIndex;\n        i = 0;\n        continue;\n      }\n      if (++i == this.syntax.length) {\n        this.error = true;\n        break;\n      }\n    }\n    return index;\n  }\n}\n\nexport class InsetsShorthandValidator extends ShorthandValidator {\n  constructor() {\n    super();\n  }\n\n  override validateList(list: Css.Val[]): number {\n    if (list.length > this.syntax.length || list.length == 0) {\n      this.error = true;\n      return 0;\n    }\n    for (let i = 0; i < this.syntax.length; i++) {\n      let index = i;\n      while (index >= list.length) {\n        index = index == 1 ? 0 : index - 2;\n      }\n      if (this.syntax[i].tryParse(list, index, this) != index + 1) {\n        this.error = true;\n        return 0;\n      }\n    }\n    return list.length;\n  }\n\n  createSyntaxNode(): ShorthandSyntaxPropertyN {\n    return new ShorthandSyntaxPropertyN(this.validatorSet, this.propList);\n  }\n}\n\nexport class InsetsSlashShorthandValidator extends ShorthandValidator {\n  constructor() {\n    super();\n  }\n\n  override validateList(list: Css.Val[]): number {\n    let slashIndex = list.length;\n    for (let i = 0; i < list.length; i++) {\n      if (list[i] === Css.slash) {\n        slashIndex = i;\n        break;\n      }\n    }\n    if (slashIndex > this.syntax.length || list.length == 0) {\n      this.error = true;\n      return 0;\n    }\n    for (let i = 0; i < this.syntax.length; i++) {\n      let index0 = i;\n      while (index0 >= slashIndex) {\n        index0 = index0 == 1 ? 0 : index0 - 2;\n      }\n      let index1: number;\n      if (slashIndex + 1 < list.length) {\n        index1 = slashIndex + i + 1;\n        while (index1 >= list.length) {\n          index1 = index1 - (index1 == slashIndex + 2 ? 1 : 2);\n        }\n      } else {\n        index1 = index0;\n      }\n      const vals = [list[index0], list[index1]];\n      if (this.syntax[i].tryParse(vals, 0, this) != 2) {\n        this.error = true;\n        return 0;\n      }\n    }\n    return list.length;\n  }\n}\n\nexport class CommaShorthandValidator extends SimpleShorthandValidator {\n  constructor() {\n    super();\n  }\n\n  mergeIn(acc: { [key: string]: Css.Val[] }, values: ValueMap) {\n    for (const name of this.propList) {\n      const val =\n        values[name] ??\n        this.validatorSet.defaultValues[name] ??\n        Css.ident.initial;\n      let arr = acc[name];\n      if (!arr) {\n        arr = [];\n        acc[name] = arr;\n      }\n      arr.push(val);\n    }\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    const acc: { [key: string]: Css.Val[] } = {};\n    for (let i = 0; i < list.values.length; i++) {\n      this.values = {};\n      if (list.values[i] instanceof Css.CommaList) {\n        this.error = true;\n      } else {\n        list.values[i].visit(this);\n        this.mergeIn(acc, this.values);\n        if (this.values[\"background-color\"] && i != list.values.length - 1) {\n          this.error = true;\n        }\n      }\n      if (this.error) {\n        return null;\n      }\n    }\n    this.values = {};\n    for (const name in acc) {\n      if (name == \"background-color\") {\n        this.values[name] = acc[name].pop();\n      } else {\n        this.values[name] = new Css.CommaList(acc[name]);\n      }\n    }\n    return null;\n  }\n}\n\nexport class FontShorthandValidator extends SimpleShorthandValidator {\n  constructor() {\n    super();\n  }\n\n  override init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n    super.init(syntax, propList);\n    this.propList.push(\n      \"font-family\",\n      \"line-height\",\n      \"font-size\",\n      \"font-stretch\",\n      \"font-variant-ligatures\",\n      \"font-variant-caps\",\n      \"font-variant-numeric\",\n      \"font-variant-east-asian\",\n    );\n  }\n\n  override validateList(list: Css.Val[]): number {\n    let index = super.validateList(list);\n\n    const fontVariant = this.values[\"font-variant_css2\"];\n    if (fontVariant) {\n      delete this.values[\"font-variant_css2\"];\n      this.values[\"font-variant-caps\"] = fontVariant;\n    }\n    const fontStretch = this.values[\"font-stretch_css3\"];\n    if (fontStretch) {\n      delete this.values[\"font-stretch_css3\"];\n      this.values[\"font-stretch\"] = fontStretch;\n    }\n\n    // must at least have font-size and font-family at the end\n    if (index + 2 > list.length) {\n      this.error = true;\n      return index;\n    }\n    this.error = false;\n    const validators = this.validatorSet.validators;\n    if (!list[index].visit(validators[\"font-size\"])) {\n      this.error = true;\n      return index;\n    }\n    this.values[\"font-size\"] = list[index++];\n    if (list[index] === Css.slash) {\n      index++;\n\n      // must at least have line-height and font-family at the end\n      if (index + 2 > list.length) {\n        this.error = true;\n        return index;\n      }\n      if (!list[index].visit(validators[\"line-height\"])) {\n        this.error = true;\n        return index;\n      }\n      this.values[\"line-height\"] = list[index++];\n    }\n    const fontFamily =\n      index == list.length - 1\n        ? list[index]\n        : new Css.SpaceList(list.slice(index, list.length));\n    if (!fontFamily.visit(validators[\"font-family\"])) {\n      this.error = true;\n      return index;\n    }\n    this.values[\"font-family\"] = fontFamily;\n    return list.length;\n  }\n\n  override visitCommaList(list: Css.CommaList): Css.Val {\n    list.values[0].visit(this);\n    if (this.error) {\n      return null;\n    }\n    const familyList = [this.values[\"font-family\"]];\n    for (let i = 1; i < list.values.length; i++) {\n      familyList.push(list.values[i]);\n    }\n    const family = new Css.CommaList(familyList);\n    if (!family.visit(this.validatorSet.validators[\"font-family\"])) {\n      this.error = true;\n    } else {\n      this.values[\"font-family\"] = family;\n    }\n    return null;\n  }\n\n  override visitIdent(ident: Css.Ident): Css.Val {\n    const props = this.validatorSet.systemFonts[ident.name];\n    if (props) {\n      for (const name in props) {\n        this.values[name] = props[name];\n      }\n    } else {\n      this.error = true;\n    }\n    return null;\n  }\n}\n\nexport class TextSpacingShorthandValidator extends SimpleShorthandValidator {\n  override validateList(list: Css.Val[]): number {\n    if (list.length === 1 && list[0] instanceof Css.Ident) {\n      switch (list[0].name.toLowerCase()) {\n        case \"normal\":\n          list = [\n            this.validatorSet.defaultValues[\"text-autospace\"],\n            this.validatorSet.defaultValues[\"text-spacing-trim\"],\n          ];\n          break;\n        case \"auto\":\n          list = [Css.ident.auto, Css.ident.auto];\n          break;\n        case \"none\":\n          list = [Css.getName(\"no-autospace\"), Css.getName(\"space-all\")];\n          break;\n      }\n    }\n    return super.validateList(list);\n  }\n}\n\nconst propsExcludedFromAll = [\n  \"unicode-bidi\",\n  \"direction\",\n\n  // excludes css-logical\n  \"margin-block-start\",\n  \"margin-block-end\",\n  \"margin-inline-start\",\n  \"margin-inline-end\",\n  \"padding-block-start\",\n  \"padding-block-end\",\n  \"padding-inline-start\",\n  \"padding-inline-end\",\n  \"border-block-start-color\",\n  \"border-block-end-color\",\n  \"border-inline-start-color\",\n  \"border-inline-end-color\",\n  \"border-block-start-style\",\n  \"border-block-end-style\",\n  \"border-inline-start-style\",\n  \"border-inline-end-style\",\n  \"border-block-start-width\",\n  \"border-block-end-width\",\n  \"border-inline-start-width\",\n  \"border-inline-end-width\",\n  \"block-start\",\n  \"block-end\",\n  \"inline-start\",\n  \"inline-end\",\n  \"block-size\",\n  \"inline-size\",\n  \"max-block-size\",\n  \"max-inline-size\",\n  \"min-block-size\",\n  \"min-inline-size\",\n\n  // excludes non-standards and special\n  \"behavior\",\n  \"bleed\",\n  \"conflicting-partitions\",\n  \"crop-offset\",\n  \"crop-marks-line-color\",\n  \"enabled\",\n  \"flow-consume\",\n  \"flow-from\",\n  \"flow-into\",\n  \"flow-linger\",\n  \"flow-options\",\n  \"flow-priority\",\n  \"font-display\",\n  \"font-size-adjust\",\n  \"font-stretch_css3\",\n  \"font-variant_css2\",\n  \"glyph-orientation-vertical\",\n  \"marks\",\n  \"min-page-height\",\n  \"min-page-width\",\n  \"repeat-on-break\",\n  \"required\",\n  \"required-partitions\",\n  \"ruby-align\",\n  \"shape-inside\",\n  \"snap-height\",\n  \"snap-width\",\n  \"template\",\n  \"text-decoration-skip\",\n  \"text-justify\",\n  \"text-zoom\",\n  \"unicode-range\",\n  \"utilization\",\n  \"wrap-flow\",\n];\n\nexport class AllShorthandValidator extends SimpleShorthandValidator {\n  constructor() {\n    super();\n  }\n\n  override init(syntax: ShorthandSyntaxNode[], propList: string[]): void {\n    super.init(syntax, propList);\n    for (const name in this.validatorSet.validators) {\n      if (!propsExcludedFromAll.includes(name)) {\n        this.propList.push(name);\n      }\n    }\n  }\n\n  override validateList(list: Css.Val[]): number {\n    this.error = true;\n    return 0;\n  }\n}\n\nexport const shorthandValidators: {\n  [key: string]: typeof ShorthandValidator;\n} = {\n  SIMPLE: SimpleShorthandValidator,\n  INSETS: InsetsShorthandValidator,\n  INSETS_SLASH: InsetsSlashShorthandValidator,\n  COMMA: CommaShorthandValidator,\n  FONT: FontShorthandValidator,\n  TEXT_SPACING: TextSpacingShorthandValidator,\n  ALL: AllShorthandValidator,\n};\n\n//---- validation grammar parser and public property validator\n//------------------------\n\nconst propsBrowserDependent = [\"initial-letter\"];\n\n/**\n * Object that validates simple and shorthand properties, breaking up shorthand\n * properties into corresponding simple ones, also stripping property prefixes.\n */\nexport class ValidatorSet {\n  validators: { [key: string]: PropertyValidator } = {};\n  prefixes: { [key: string]: { [key: string]: boolean } } = {};\n  defaultValues: ValueMap = {};\n  namedValidators: { [key: string]: ValidatingGroup } = {};\n  systemFonts: { [key: string]: ValueMap } = {};\n  shorthands: { [key: string]: ShorthandValidator } = {};\n  layoutProps: ValueMap = {};\n  backgroundProps: ValueMap = {};\n\n  private addReplacement(\n    val: ValidatingGroup,\n    token: CssTokenizer.Token,\n  ): ValidatingGroup {\n    let cssval: Css.Val;\n    if (token.type == TokenType.NUMERIC) {\n      cssval = new Css.Numeric(token.num, token.text);\n    } else if (token.type == TokenType.HASH) {\n      cssval = new Css.HexColor(token.text);\n    } else if (token.type == TokenType.IDENT) {\n      cssval = Css.getName(token.text);\n    } else {\n      throw new Error(\"unexpected replacement\");\n    }\n    if (val.isPrimitive()) {\n      const validator = val.nodes[0].validator as PrimitiveValidator;\n      const idents = validator.idents;\n      for (const ident in idents) {\n        idents[ident] = cssval;\n      }\n      return val;\n    }\n    throw new Error(\"unexpected replacement\");\n  }\n\n  private newGroup(op: string, vals: ValidatingGroup[]): ValidatingGroup {\n    const group = new ValidatingGroup();\n    if (op == \"||\") {\n      for (let i = 0; i < vals.length; i++) {\n        const subgroup = new ValidatingGroup();\n        subgroup.startClause(i);\n        subgroup.addGroup(vals[i], Add.FOLLOW);\n        subgroup.endClause(i);\n        group.addGroup(subgroup, i == 0 ? Add.FOLLOW : Add.ALTERNATE);\n      }\n      const outer = new ValidatingGroup();\n      outer.startSpecialGroup();\n      outer.addGroup(group, Add.REPEATED);\n      outer.endSpecialGroup();\n      return outer;\n    } else {\n      let how: Add;\n      switch (op) {\n        case \" \":\n          how = Add.FOLLOW;\n          break;\n        case \"|\":\n        case \"||\":\n          how = Add.ALTERNATE;\n          break;\n        default:\n          throw new Error(\"unexpected op\");\n      }\n      for (let i = 0; i < vals.length; i++) {\n        group.addGroup(vals[i], i == 0 ? Add.FOLLOW : how);\n      }\n      return group;\n    }\n  }\n\n  private addCounts(\n    val: ValidatingGroup,\n    min: number,\n    max: number,\n  ): ValidatingGroup {\n    const group = new ValidatingGroup();\n    for (let i = 0; i < min; i++) {\n      group.addGroup(val.clone(), Add.FOLLOW);\n    }\n    if (max == Number.POSITIVE_INFINITY) {\n      group.addGroup(val, Add.REPEATED);\n    } else {\n      for (let i = min; i < max; i++) {\n        group.addGroup(val.clone(), Add.OPTIONAL);\n      }\n    }\n    return group;\n  }\n\n  private primitive(validator: PropertyValidator): ValidatingGroup {\n    const group = new ValidatingGroup();\n    group.addPrimitive(validator);\n    return group;\n  }\n\n  private newFunc(fn: string, val: ValidatingGroup): ValidatingGroup {\n    let validator: PropertyValidator;\n    switch (fn) {\n      case \"COMMA\":\n        validator = new CommaListValidator(val);\n        break;\n      case \"SPACE\":\n        validator = new SpaceListValidator(val);\n        break;\n      default:\n        validator = new FuncValidator(fn.toLowerCase(), val);\n        break;\n    }\n    return this.primitive(validator);\n  }\n\n  initBuiltInValidators(): void {\n    this.namedValidators[\"COLOR\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_COLOR, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"IMAGE_FUNCTION\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_IMAGE, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"POS_INT\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_INT, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"POS_NUM\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUM, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"POS_PERCENTAGE\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, { \"%\": Css.empty }),\n    );\n    this.namedValidators[\"NEGATIVE\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_NEGATIVE, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"ZERO\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_ZERO, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"ZERO_PERCENTAGE\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_ZERO_PERCENT, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"POS_LENGTH\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n        em: Css.empty,\n        ex: Css.empty,\n        ch: Css.empty,\n        rem: Css.empty,\n        lh: Css.empty,\n        rlh: Css.empty,\n        vw: Css.empty,\n        vh: Css.empty,\n        vi: Css.empty,\n        vb: Css.empty,\n        vmin: Css.empty,\n        vmax: Css.empty,\n        pvw: Css.empty,\n        pvh: Css.empty,\n        pvi: Css.empty,\n        pvb: Css.empty,\n        pvmin: Css.empty,\n        pvmax: Css.empty,\n        cm: Css.empty,\n        mm: Css.empty,\n        in: Css.empty,\n        px: Css.empty,\n        pt: Css.empty,\n        pc: Css.empty,\n        q: Css.empty,\n      }),\n    );\n    this.namedValidators[\"POS_ANGLE\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n        deg: Css.empty,\n        grad: Css.empty,\n        rad: Css.empty,\n        turn: Css.empty,\n      }),\n    );\n    this.namedValidators[\"POS_TIME\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n        s: Css.empty,\n        ms: Css.empty,\n      }),\n    );\n    this.namedValidators[\"FREQUENCY\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n        Hz: Css.empty,\n        kHz: Css.empty,\n      }),\n    );\n    this.namedValidators[\"RESOLUTION\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_POS_NUMERIC, NO_IDENTS, {\n        dpi: Css.empty,\n        dpcm: Css.empty,\n        dppx: Css.empty,\n      }),\n    );\n    this.namedValidators[\"URI\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_URL, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"URANGE\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_URANGE, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"IDENT\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_IDENT, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"STRING\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_STR, NO_IDENTS, NO_IDENTS),\n    );\n    this.namedValidators[\"SLASH\"] = this.primitive(\n      new PrimitiveValidator(ALLOW_SLASH, NO_IDENTS, NO_IDENTS),\n    );\n    const stdfont = { \"font-family\": Css.getName(\"sans-serif\") };\n    this.systemFonts[\"caption\"] = stdfont;\n    this.systemFonts[\"icon\"] = stdfont;\n    this.systemFonts[\"menu\"] = stdfont;\n    this.systemFonts[\"message-box\"] = stdfont;\n    this.systemFonts[\"small-caption\"] = stdfont;\n    this.systemFonts[\"status-bar\"] = stdfont;\n  }\n\n  private isBuiltIn(name: string): boolean {\n    return !!name.match(/^[A-Z_0-9]+$/);\n  }\n\n  private readNameAndPrefixes(\n    tok: CssTokenizer.Tokenizer,\n    section: number,\n  ): string | null {\n    let token = tok.token();\n    if (token.type == TokenType.EOF) {\n      // Finished normally\n      return null;\n    }\n    const rulePrefixes: { [key: string]: boolean } = { \"\": true };\n    if (token.type == TokenType.O_BRK) {\n      do {\n        tok.consume();\n        token = tok.token();\n        if (token.type != TokenType.IDENT) {\n          throw new Error(\"Prefix name expected\");\n        }\n        rulePrefixes[token.text] = true;\n        tok.consume();\n        token = tok.token();\n      } while (token.type == TokenType.COMMA);\n      if (token.type != TokenType.C_BRK) {\n        throw new Error(\"']' expected\");\n      }\n      tok.consume();\n      token = tok.token();\n    }\n    if (token.type != TokenType.IDENT) {\n      throw new Error(\"Property name expected\");\n    }\n    if (section == 2 ? token.text == \"SHORTHANDS\" : token.text == \"DEFAULTS\") {\n      tok.consume();\n      return null;\n    }\n    const name = token.text;\n    tok.consume();\n    if (section != 2) {\n      if (tok.token().type != TokenType.EQ) {\n        throw new Error(\"'=' expected\");\n      }\n      if (!this.isBuiltIn(name)) {\n        this.prefixes[name] = rulePrefixes;\n      }\n    } else {\n      if (tok.token().type != TokenType.COLON) {\n        throw new Error(\"':' expected\");\n      }\n    }\n    return name;\n  }\n\n  private parseValidators(tok: CssTokenizer.Tokenizer): void {\n    while (true) {\n      const ruleName = this.readNameAndPrefixes(tok, 1);\n      if (!ruleName) {\n        return;\n      }\n      let vals: ValidatingGroup[] = [];\n      const stack = [];\n      let op = \"\";\n      let val: ValidatingGroup;\n      let expectval = true;\n      const reduce = (): ValidatingGroup => {\n        if (vals.length == 0) {\n          throw new Error(\"No values\");\n        }\n        if (vals.length == 1) {\n          return vals[0];\n        }\n        return this.newGroup(op, vals);\n      };\n      const setop = (currop: string): void => {\n        if (expectval) {\n          throw new Error(`'${currop}': unexpected`);\n        }\n        if (op && op != currop) {\n          throw new Error(`mixed operators: '${currop}' and '${op}'`);\n        }\n        op = currop;\n        expectval = true;\n      };\n      let result: ValidatingGroup = null;\n      while (!result) {\n        tok.consume();\n        let token = tok.token();\n        switch (token.type) {\n          case TokenType.IDENT:\n            if (!expectval) {\n              setop(\" \");\n            }\n            if (this.isBuiltIn(token.text)) {\n              const builtIn = this.namedValidators[token.text];\n              if (!builtIn) {\n                throw new Error(`'${token.text}' unexpected`);\n              }\n              vals.push(builtIn.clone());\n            } else {\n              const idents: ValueMap = {};\n              idents[token.text.toLowerCase()] = Css.getName(token.text);\n              vals.push(\n                this.primitive(new PrimitiveValidator(0, idents, NO_IDENTS)),\n              );\n            }\n            expectval = false;\n            break;\n          case TokenType.INT: {\n            const idents: ValueMap = {};\n            idents[`${token.num}`] = new Css.Int(token.num);\n            vals.push(\n              this.primitive(new PrimitiveValidator(0, idents, NO_IDENTS)),\n            );\n            expectval = false;\n            break;\n          }\n          case TokenType.BAR:\n            setop(\"|\");\n            break;\n          case TokenType.BAR_BAR:\n            setop(\"||\");\n            break;\n          case TokenType.O_BRK:\n            if (!expectval) {\n              setop(\" \");\n            }\n            stack.push({ vals, op, b: \"[\" });\n            op = \"\";\n            vals = [];\n            expectval = true;\n            break;\n          case TokenType.FUNC:\n            if (!expectval) {\n              setop(\" \");\n            }\n            stack.push({ vals, op, b: \"(\", fn: token.text });\n            op = \"\";\n            vals = [];\n            expectval = true;\n            break;\n          case TokenType.C_BRK: {\n            val = reduce();\n            const open = stack.pop();\n            if (open.b != \"[\") {\n              throw new Error(\"']' unexpected\");\n            }\n            vals = open.vals;\n            vals.push(val);\n            op = open.op;\n            expectval = false;\n            break;\n          }\n          case TokenType.C_PAR: {\n            val = reduce();\n            const open = stack.pop();\n            if (open.b != \"(\") {\n              throw new Error(\"')' unexpected\");\n            }\n            vals = open.vals;\n            vals.push(this.newFunc(open.fn, val));\n            op = open.op;\n            expectval = false;\n            break;\n          }\n          case TokenType.COLON:\n            if (expectval) {\n              throw new Error(\"':' unexpected\");\n            }\n            tok.consume();\n            vals.push(this.addReplacement(vals.pop(), tok.token()));\n            break;\n          case TokenType.QMARK:\n            if (expectval) {\n              throw new Error(\"'?' unexpected\");\n            }\n            vals.push(this.addCounts(vals.pop(), 0, 1));\n            break;\n          case TokenType.STAR:\n            if (expectval) {\n              throw new Error(\"'*' unexpected\");\n            }\n            vals.push(this.addCounts(vals.pop(), 0, Number.POSITIVE_INFINITY));\n            break;\n          case TokenType.PLUS:\n            if (expectval) {\n              throw new Error(\"'+' unexpected\");\n            }\n            vals.push(this.addCounts(vals.pop(), 1, Number.POSITIVE_INFINITY));\n            break;\n          case TokenType.O_BRC: {\n            tok.consume();\n            token = tok.token();\n            if (token.type != TokenType.INT) {\n              throw new Error(\"<int> expected\");\n            }\n            const min = token.num;\n            let max = min;\n            tok.consume();\n            token = tok.token();\n            if (token.type == TokenType.COMMA) {\n              tok.consume();\n              token = tok.token();\n              if (token.type != TokenType.INT) {\n                throw new Error(\"<int> expected\");\n              }\n              max = token.num;\n              tok.consume();\n              token = tok.token();\n            }\n            if (token.type != TokenType.C_BRC) {\n              throw new Error(\"'}' expected\");\n            }\n            vals.push(this.addCounts(vals.pop(), min, max));\n            break;\n          }\n          case TokenType.SEMICOL:\n            result = reduce();\n            if (stack.length > 0) {\n              throw new Error(`unclosed '${stack.pop().b}'`);\n            }\n            break;\n          default:\n            throw new Error(\"unexpected token\");\n        }\n      }\n      tok.consume();\n      if (this.isBuiltIn(ruleName)) {\n        this.namedValidators[ruleName] = result;\n      } else {\n        if (result.isSimple()) {\n          this.validators[ruleName] = result.nodes[0].validator;\n        } else {\n          this.validators[ruleName] = new SpaceListValidator(result);\n        }\n      }\n    }\n  }\n\n  private parseDefaults(tok: CssTokenizer.Tokenizer): void {\n    while (true) {\n      const propName = this.readNameAndPrefixes(tok, 2);\n      if (!propName) {\n        return;\n      }\n      const vals: Css.Val[] = [];\n      while (true) {\n        tok.consume();\n        const token = tok.token();\n        if (token.type == TokenType.SEMICOL) {\n          tok.consume();\n          break;\n        }\n        switch (token.type) {\n          case TokenType.IDENT:\n            vals.push(Css.getName(token.text));\n            break;\n          case TokenType.NUM:\n            vals.push(new Css.Num(token.num));\n            break;\n          case TokenType.INT:\n            vals.push(new Css.Int(token.num));\n            break;\n          case TokenType.NUMERIC:\n            vals.push(new Css.Numeric(token.num, token.text));\n            break;\n          default:\n            throw new Error(\"unexpected token\");\n        }\n      }\n      this.defaultValues[propName] =\n        vals.length > 1 ? new Css.SpaceList(vals) : vals[0];\n    }\n  }\n\n  private parseShorthands(tok: CssTokenizer.Tokenizer): void {\n    while (true) {\n      const ruleName = this.readNameAndPrefixes(tok, 3);\n      if (!ruleName) {\n        return;\n      }\n      let token = tok.nthToken(1);\n      let shorthandValidator: ShorthandValidator;\n      if (token.type == TokenType.IDENT && shorthandValidators[token.text]) {\n        shorthandValidator = new shorthandValidators[token.text]();\n        tok.consume();\n      } else {\n        shorthandValidator = new SimpleShorthandValidator();\n      }\n      shorthandValidator.setOwner(this);\n      let result = false;\n      let syntax: ShorthandSyntaxNode[] = [];\n      let slash = false;\n      const stack = [];\n      const propList = [];\n      while (!result) {\n        tok.consume();\n        token = tok.token();\n        switch (token.type) {\n          case TokenType.IDENT:\n            if (this.validators[token.text]) {\n              syntax.push(shorthandValidator.syntaxNodeForProperty(token.text));\n              // `font-variant_css2` and `font-stretch_css3` are not real properties\n              if (!token.text.includes(\"_\")) {\n                propList.push(token.text);\n              }\n            } else if (\n              this.shorthands[token.text] instanceof InsetsShorthandValidator\n            ) {\n              const insetShorthand = this.shorthands[\n                token.text\n              ] as InsetsShorthandValidator;\n              syntax.push(insetShorthand.createSyntaxNode());\n              propList.push(...insetShorthand.propList);\n            } else {\n              throw new Error(\n                `'${token.text}' is neither a simple property nor an inset shorthand`,\n              );\n            }\n            break;\n          case TokenType.SLASH:\n            if (syntax.length > 0 || slash) {\n              throw new Error(\"unexpected slash\");\n            }\n            slash = true;\n            break;\n          case TokenType.O_BRK:\n            stack.push({ slash, syntax });\n            syntax = [];\n            slash = false;\n            break;\n          case TokenType.C_BRK: {\n            const compound = new ShorthandSyntaxCompound(syntax, slash);\n            const item = stack.pop();\n            syntax = item.syntax;\n            slash = item.slash;\n            syntax.push(compound);\n            break;\n          }\n          case TokenType.SEMICOL:\n            result = true;\n            tok.consume();\n            break;\n          default:\n            throw new Error(\"unexpected token\");\n        }\n      }\n      shorthandValidator.init(syntax, propList);\n      this.shorthands[ruleName] = shorthandValidator;\n    }\n  }\n\n  parse(text: string): void {\n    // Not as robust as CSS parser.\n    const tok = new CssTokenizer.Tokenizer(text, null);\n    this.parseValidators(tok);\n    this.parseDefaults(tok);\n    this.parseShorthands(tok);\n    this.backgroundProps = this.makePropSet([\"background\"]);\n    this.layoutProps = this.makePropSet([\n      \"margin\",\n      \"border\",\n      \"padding\",\n      \"columns\",\n      \"column-gap\",\n      \"column-rule\",\n      \"column-fill\",\n    ]);\n  }\n\n  makePropSet(propList: string[]): ValueMap {\n    const map: ValueMap = {};\n    for (const prop of propList) {\n      const shorthand = this.shorthands[prop];\n      const list = shorthand ? shorthand.propList : [prop];\n      for (const pname of list) {\n        map[pname] = this.defaultValues[pname] ?? Css.ident.initial;\n      }\n    }\n    return map;\n  }\n\n  validatePropertyAndHandleShorthand(\n    name: string,\n    value: Css.Val,\n    important: boolean,\n    receiver: PropertyReceiver,\n  ): void {\n    const ruleType = (receiver as PropertyReceiver & { ruleType?: string })\n      .ruleType;\n    if (\n      Css.isCustomPropName(name) ||\n      // Check if it is a `@font-face` descriptor (Issue #1307)\n      ruleType === \"font-face\" ||\n      // Check if the property value containing `var(…)`\n      containsVar(value)\n    ) {\n      receiver.simpleProperty(name, value, important);\n      return;\n    }\n    if (ruleType === \"counter-style\") {\n      if (CounterStyle.validateDescriptorValue(name, value)) {\n        receiver.simpleProperty(name, value, important);\n      } else {\n        receiver.invalidPropertyValue(name, value);\n      }\n      return;\n    }\n    let prefix = \"\";\n    const origName = name;\n    name = name.toLowerCase();\n    const r = name.match(/^-([a-z]+)-([-a-z0-9]+)$/);\n    if (r) {\n      prefix = r[1];\n      name = r[2];\n    }\n    const px = this.prefixes[name];\n    if (!px || !px[prefix]) {\n      if (CSS.supports(origName, value.toString())) {\n        // Browser supports this property\n        receiver.simpleProperty(origName, value, important);\n      } else if (prefix && !Base.knownPrefixes.includes(`-${prefix}-`)) {\n        // Ignore properties with unknown prefix to avoid unnecessary warnings\n      } else {\n        receiver.unknownProperty(origName, value);\n      }\n      return;\n    } else if (propsBrowserDependent.includes(name)) {\n      // For properties whose support depends on browser, check via CSS.supports\n      if (\n        !Object.keys(px).some((p) =>\n          Base.checkIfPropertySupported(p ? `-${p}-` : \"\", name),\n        )\n      ) {\n        receiver.unknownProperty(origName, value);\n        return;\n      }\n    }\n    const validator = this.validators[name];\n    if (validator) {\n      const rvalue =\n        Css.isDefaultingValue(value) || value.isExpr()\n          ? value\n          : value.visit(validator);\n      if (rvalue) {\n        receiver.simpleProperty(name, rvalue, important);\n      } else if (!prefix && CSS.supports(name, value.toString())) {\n        // Browser supports this property value\n        receiver.simpleProperty(name, value, important);\n      } else {\n        receiver.invalidPropertyValue(origName, value);\n      }\n    } else {\n      const shorthand = this.shorthands[name].clone();\n      if (Css.isDefaultingValue(value)) {\n        shorthand.propagateDefaultingValue(value, important, receiver);\n      } else {\n        value.visit(shorthand);\n        if (!shorthand.finish(important, receiver)) {\n          receiver.invalidPropertyValue(origName, value);\n        }\n      }\n    }\n  }\n}\n\nexport function baseValidatorSet(): ValidatorSet {\n  const validatorSet = new ValidatorSet();\n  validatorSet.initBuiltInValidators();\n  validatorSet.parse(ValidationTxt);\n  return validatorSet;\n}\n\nclass VarCheckVisitor extends Css.Visitor {\n  varFound = false;\n\n  visitFunc(func: Css.Func): Css.Val {\n    if (func.name === \"var\") {\n      this.varFound = true;\n    } else if (!this.varFound) {\n      this.visitValues(func.values);\n    }\n    return null;\n  }\n}\n\nexport function containsVar(val: Css.Val): boolean {\n  const varCheckVisitor = new VarCheckVisitor();\n  val.visit(varCheckVisitor);\n  return varCheckVisitor.varFound;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Font - Deal with embedded fonts.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as Exprs from \"./exprs\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\n\nexport const bogusFontData = `OTTO${new Date().valueOf()}`;\n\nexport let bogusFontCounter: number = 1;\n\nfunction getFontTraitNames(properties: { [key: string]: Css.Val }): string[] {\n  return Object.keys(properties)\n    .filter((prop) => ![\"src\", \"font-family\", \"font-display\"].includes(prop))\n    .sort();\n}\n\nexport function makeFontTraitKey(properties: {\n  [key: string]: Css.Val;\n}): string {\n  const sb = new Base.StringBuffer();\n  for (const prop of getFontTraitNames(properties)) {\n    sb.append(`${prop}:${properties[prop].toString()};`);\n  }\n  return sb.toString();\n}\n\nexport function prepareProperties(\n  properties: CssCascade.ElementStyle,\n  context: Exprs.Context,\n): { [key: string]: Css.Val } {\n  const result = {} as { [key: string]: Css.Val };\n  for (const prop in properties) {\n    result[prop] = CssCascade.getProp(properties, prop).evaluate(context, prop);\n  }\n  return result;\n}\n\n/**\n * A font declared in a font-face rule.\n */\nexport class Face {\n  fontTraitKey: string;\n  src: string | null;\n  blobURLs: string[] = [];\n  blobs: Blob[] = [];\n  family: string | null;\n\n  constructor(public readonly properties: { [key: string]: Css.Val }) {\n    this.fontTraitKey = makeFontTraitKey(this.properties);\n    this.src = this.properties[\"src\"]\n      ? this.properties[\"src\"].toString()\n      : null;\n    const family = this.properties[\"font-family\"];\n    this.family = family ? family.stringValue() : null;\n  }\n\n  /**\n   * Check if font traits are the same for two font faces\n   */\n  traitsEqual(other: Face): boolean {\n    return this.fontTraitKey == other.fontTraitKey;\n  }\n\n  /**\n   * Create \"at\" font-face rule.\n   */\n  makeAtRule(src: string, fontBytes: Blob): string {\n    const sb = new Base.StringBuffer();\n    sb.append(\"@font-face {\\n  font-family: \");\n    sb.append(this.family as string);\n    sb.append(\";\\n  \");\n    for (const prop of getFontTraitNames(this.properties)) {\n      sb.append(prop);\n      sb.append(\": \");\n      this.properties[prop].appendTo(sb, true);\n      sb.append(\";\\n  \");\n    }\n    if (fontBytes) {\n      sb.append('src: url(\"');\n      const blobURL = Net.createObjectURL(fontBytes);\n      sb.append(blobURL);\n      this.blobURLs.push(blobURL);\n      this.blobs.push(fontBytes);\n      sb.append('\")');\n    } else {\n      sb.append(\"src: \");\n      sb.append(src);\n    }\n    sb.append(\";\\n}\\n\");\n    return sb.toString();\n  }\n}\n\n/**\n * Set of the fonts declared in all stylesheets of a document.\n * @param deobfuscator function\n *     that takes url and returns data deobfuscator\n */\nexport class DocumentFaces {\n  /**\n   * Maps source font family names to the family names used in the HTML view.\n   */\n  familyMap = {} as { [key: string]: string };\n\n  constructor(\n    public readonly deobfuscator:\n      | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n      | null,\n  ) {}\n\n  registerFamily(srcFace: Face, viewFace: Face): void {\n    const srcFamily = srcFace.family as string;\n    const viewFamilyFromSrc = this.familyMap[srcFamily];\n    const viewFamilyFromView = viewFace.family;\n    if (viewFamilyFromSrc) {\n      if (viewFamilyFromSrc != viewFamilyFromView) {\n        throw new Error(`E_FONT_FAMILY_INCONSISTENT ${srcFace.family}`);\n      }\n    } else {\n      this.familyMap[srcFamily] = viewFamilyFromView as string;\n    }\n  }\n\n  filterFontFamily(val: Css.Val): Css.Val {\n    if (val instanceof Css.CommaList) {\n      const list = (val as Css.CommaList).values;\n      const newValues = [] as Css.Val[];\n      for (const v of list) {\n        const r = this.familyMap[v.stringValue()];\n        if (r) {\n          newValues.push(Css.getName(r));\n        }\n        newValues.push(v);\n      }\n      return new Css.CommaList(newValues);\n    } else {\n      const rf = this.familyMap[val.stringValue()];\n      if (rf) {\n        return new Css.CommaList([Css.getName(rf), val]);\n      }\n      return val;\n    }\n  }\n}\n\n/**\n * Object that loads fonts in a document and allocates font families for them\n * in the view document\n * @param head where to add styles in the view document (normally head element)\n * @param body where to probe text in the view document (normally body element)\n */\nexport class Mapper {\n  /**\n   * Maps Face.src to an entry for an already-loaded font.\n   */\n  srcURLMap: { [key: string]: TaskUtil.Fetcher<Face> } = {};\n  familyPrefix: string;\n  familyCounter: number = 0;\n\n  constructor(\n    public readonly head: Element,\n    public readonly body: Element,\n    opt_familyPrefix?: string,\n  ) {\n    this.familyPrefix = opt_familyPrefix || \"Fnt_\";\n  }\n\n  getViewFontFamily(srcFace: Face, documentFaces: DocumentFaces): string {\n    const srcFamily = srcFace.family as string;\n    let viewFamily = documentFaces.familyMap[srcFamily];\n    if (viewFamily) {\n      return viewFamily;\n    }\n    viewFamily = this.familyPrefix + ++this.familyCounter;\n    documentFaces.familyMap[srcFamily] = viewFamily;\n    return viewFamily;\n  }\n\n  /**\n   * @param fontBytes deobfuscated font bytes (if deobfuscation is needed)\n   */\n  private initFont(\n    srcFace: Face,\n    fontBytes: Blob,\n    documentFaces: DocumentFaces,\n  ): Task.Result<Face> {\n    const frame: Task.Frame<Face> = Task.newFrame(\"initFont\");\n    const src = srcFace.src as string;\n    const props = {} as { [key: string]: Css.Val };\n    for (const prop of getFontTraitNames(srcFace.properties)) {\n      props[prop] = srcFace.properties[prop];\n    }\n    const fontFamily = this.getViewFontFamily(srcFace, documentFaces);\n    props[\"font-family\"] = Css.getName(fontFamily);\n    const viewFontFace = new Face(props);\n    const style = this.head.ownerDocument.createElement(\"style\");\n    style.textContent = viewFontFace.makeAtRule(src, fontBytes);\n    this.head.appendChild(style);\n    Logging.logger.debug(\"Load font:\", src);\n    frame.finish(viewFontFace);\n    return frame.result();\n  }\n\n  loadFont(\n    srcFace: Face,\n    documentFaces: DocumentFaces,\n  ): TaskUtil.Fetcher<Face> {\n    const src = srcFace.src as string;\n    const srcFamilySrc = srcFace.family + \";\" + src;\n    let fetcher = this.srcURLMap[srcFamilySrc];\n    if (fetcher) {\n      fetcher.piggyback((viewFaceParam) => {\n        const viewFace = viewFaceParam as Face;\n        if (!viewFace.traitsEqual(srcFace)) {\n          Logging.logger.warn(\"E_FONT_FACE_INCOMPATIBLE\", srcFace.src);\n        } else {\n          documentFaces.registerFamily(srcFace, viewFace);\n          Logging.logger.debug(\"Found already-loaded font:\", src);\n        }\n      });\n    } else {\n      fetcher = new TaskUtil.Fetcher(() => {\n        const frame: Task.Frame<Face> = Task.newFrame(\"loadFont\");\n        // Get URL from `@font-face` src value.\n        const url = src.replace(/^url\\(\"([^\"]+)\"\\).*$/, \"$1\");\n        const deobfuscator = documentFaces.deobfuscator\n          ? documentFaces.deobfuscator(url)\n          : null;\n        if (deobfuscator) {\n          Net.fetchFromURL(url, Net.FetchResponseType.BLOB).then((response) => {\n            if (!response.responseBlob) {\n              frame.finish(null);\n              return;\n            }\n            deobfuscator(response.responseBlob).then((fontBytes) => {\n              this.initFont(srcFace, fontBytes, documentFaces).thenFinish(\n                frame,\n              );\n            });\n          });\n        } else {\n          this.initFont(srcFace, null, documentFaces).thenFinish(frame);\n        }\n        return frame.result();\n      }, `loadFont ${src}`);\n      this.srcURLMap[srcFamilySrc] = fetcher;\n      fetcher.start();\n    }\n    return fetcher;\n  }\n\n  findOrLoadFonts(\n    srcFaces: Face[],\n    documentFaces: DocumentFaces,\n  ): Task.Result<boolean> {\n    const fetchers = [] as TaskUtil.Fetcher<Face>[];\n    for (const srcFace of srcFaces) {\n      if (!srcFace.src || !srcFace.family) {\n        Logging.logger.warn(\"E_FONT_FACE_INVALID\");\n        continue;\n      }\n      fetchers.push(this.loadFont(srcFace, documentFaces));\n    }\n    return TaskUtil.waitForFetchers(fetchers).thenAsync(() =>\n      this.waitFontLoading(),\n    );\n  }\n\n  waitFontLoading(): Task.Result<boolean> {\n    const fonts = this.head.ownerDocument.fonts; // FontFaceSet\n    let unloadedCount = 0;\n    fonts.forEach((fontFace) => {\n      if (fontFace.status === \"unloaded\") {\n        unloadedCount++;\n        fontFace.load().catch((e) => {\n          // Prevent \"A network error occurred.\" errors in console\n        });\n      }\n    });\n    if (unloadedCount === 0) {\n      return Task.newResult(true);\n    }\n    const frame: Task.Frame<boolean> = Task.newFrame(\"waitFontLoading\");\n    frame\n      .loop(() => {\n        return frame.sleep(20).thenAsync(() => {\n          if (fonts.status === \"loading\") {\n            return Task.newResult(true); // continue\n          }\n          return Task.newResult(false); // break\n        });\n      })\n      .thenFinish(frame);\n    return frame.result();\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview PageMaster - Deal with page masters, partition groups, and partitions.\n */\nimport * as Base from \"./base\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport { PageRuleMaster, PageRuleMasterInstance } from \"./css-page\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport { StyleInstance } from \"./ops\";\nimport * as Vtree from \"./vtree\";\n\nexport let keyCount: number = 1;\n\n/**\n * Represent an at-rule which creates a page-level CSS box (page-master,\n * partition, and partition-group).\n */\nexport abstract class PageBox<\n  I extends PageBoxInstance = PageBoxInstance<any>,\n> {\n  // styles specified in the at-rule\n  specified: CssCascade.ElementStyle = {};\n  children: PageBox[] = [];\n  pageMaster: PageMaster = null;\n  index: number = 0;\n  key: string;\n\n  protected _scope: Exprs.LexicalScope;\n\n  get scope(): Exprs.LexicalScope {\n    return this._scope;\n  }\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    public readonly name: string | null,\n    public readonly pseudoName: string | null,\n    public readonly classes: string[],\n    public readonly parent: PageBox,\n  ) {\n    this._scope = scope;\n    this.key = `p${keyCount++}`;\n    if (parent) {\n      this.index = parent.children.length;\n      parent.children.push(this);\n    }\n  }\n\n  createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n    throw new Error(\"E_UNEXPECTED_CALL\");\n  }\n\n  /**\n   * Clone the PageBox.\n   * @param param parent: The parent of the cloned PageBox.\n   *     pseudoName: Assign this value as the pseudoName of the cloned PageBox.\n   */\n  clone(param: { parent?: PageBox; pseudoName?: string }): PageBox<I> {\n    throw new Error(\"E_UNEXPECTED_CALL\");\n  }\n\n  /**\n   * Copy 'specified' properties to another instance.\n   * @param dest The PageBox into which 'specified' properties are copied\n   */\n  protected copySpecified(dest: PageBox) {\n    const specified = this.specified;\n    const destSpecified = dest.specified;\n    for (const prop in specified) {\n      if (Object.prototype.hasOwnProperty.call(specified, prop)) {\n        destSpecified[prop] = specified[prop];\n      }\n    }\n  }\n\n  /**\n   * Clone children with the specified PageBox as their parent.\n   */\n  protected cloneChildren(parent: PageBox) {\n    for (let i = 0; i < this.children.length; i++) {\n      // the cloned child is added to parent.children in the child constructor.\n      this.children[i].clone({ parent });\n    }\n  }\n}\n\n/**\n * Parent of all page masters\n */\nexport class RootPageBox extends PageBox<RootPageBoxInstance> {\n  constructor(scope: Exprs.LexicalScope) {\n    super(scope, null, null, [], null);\n    this.specified[\"width\"] = new CssCascade.CascadeValue(Css.fullWidth, 0);\n    this.specified[\"height\"] = new CssCascade.CascadeValue(Css.fullHeight, 0);\n  }\n}\n\nexport class PageMasterScope extends Exprs.LexicalScope {\n  constructor(\n    scope: Exprs.LexicalScope,\n    public pageMaster: PageMaster,\n  ) {\n    super(scope, resolver);\n    const self = this;\n    function resolver(qualifiedName, isFunc) {\n      const r = qualifiedName.match(/^([^.]+)\\.([^.]+)$/);\n      if (r) {\n        const key = self.pageMaster.keyMap[r[1]];\n        if (key) {\n          const holder = this as InstanceHolder;\n          const boxInstance = holder.lookupInstance(key);\n          if (boxInstance) {\n            if (isFunc) {\n              return boxInstance.resolveFunc(r[2]);\n            } else {\n              return boxInstance.resolveName(r[2]);\n            }\n          }\n        }\n      }\n      return null;\n    }\n  }\n}\n\n/**\n * Represent a page-master rule\n */\nexport class PageMaster<\n  I extends PageMasterInstance = PageMasterInstance<any>,\n> extends PageBox<I> {\n  keyMap: { [key: string]: string } = {};\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n    parent: RootPageBox,\n    public readonly condition: Exprs.Val,\n    public readonly specificity: number,\n  ) {\n    super(scope, name, pseudoName, classes, parent);\n    // if PageMasterScope object is passed, use (share) it.\n    if (!(scope instanceof PageMasterScope)) {\n      this._scope = new PageMasterScope(scope, this);\n    }\n    this.pageMaster = this;\n    this.specified[\"width\"] = new CssCascade.CascadeValue(Css.fullWidth, 0);\n    this.specified[\"height\"] = new CssCascade.CascadeValue(Css.fullHeight, 0);\n    this.specified[\"wrap-flow\"] = new CssCascade.CascadeValue(\n      Css.ident.auto,\n      0,\n    );\n    this.specified[\"position\"] = new CssCascade.CascadeValue(\n      Css.ident.relative,\n      0,\n    );\n    this.specified[\"overflow\"] = new CssCascade.CascadeValue(\n      Css.ident.visible,\n      0,\n    );\n  }\n\n  override createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n    return new PageMasterInstance(parentInstance, this);\n  }\n\n  override clone(param): PageMaster {\n    // The cloned page master shares the same scope object with the original\n    // one.\n    const cloned = new PageMaster(\n      this.scope,\n      this.name,\n      param.pseudoName || this.pseudoName,\n      this.classes,\n      this.parent as RootPageBox,\n      this.condition,\n      this.specificity,\n    );\n    this.copySpecified(cloned);\n    this.cloneChildren(cloned);\n    return cloned;\n  }\n\n  /**\n   * Point the pageMaster reference in the PageMasterScope to the current page\n   * master. This is needed when a page master is cloned and shares a common\n   * scope with the original page master. Since every Exprs.Val which the\n   * page master holds has a reference to the scope and uses it for variable\n   * resolution, this reference must be updated properly before the page master\n   * instance is used.\n   */\n  resetScope() {\n    (this.scope as any).pageMaster = this;\n  }\n}\n\n/**\n * Represent a partition-group rule\n */\nexport class PartitionGroup extends PageBox<PartitionGroupInstance> {\n  constructor(\n    scope: Exprs.LexicalScope,\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n    parent: PageBox,\n  ) {\n    super(scope, name, pseudoName, classes, parent);\n    this.pageMaster = parent.pageMaster;\n    if (name) {\n      this.pageMaster.keyMap[name] = this.key;\n    }\n    this.specified[\"wrap-flow\"] = new CssCascade.CascadeValue(\n      Css.ident.auto,\n      0,\n    );\n  }\n\n  override createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n    return new PartitionGroupInstance(parentInstance, this);\n  }\n\n  override clone(param): PartitionGroup {\n    const cloned = new PartitionGroup(\n      param.parent.scope,\n      this.name,\n      this.pseudoName,\n      this.classes,\n      param.parent,\n    );\n    this.copySpecified(cloned);\n    this.cloneChildren(cloned);\n    return cloned;\n  }\n}\n\n/**\n * Represent a partition rule\n */\nexport class Partition<\n  I extends PartitionInstance = PartitionInstance,\n> extends PageBox<I> {\n  constructor(\n    scope: Exprs.LexicalScope,\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n    parent: PageBox,\n  ) {\n    super(scope, name, pseudoName, classes, parent);\n    this.pageMaster = parent.pageMaster;\n    if (name) {\n      this.pageMaster.keyMap[name] = this.key;\n    }\n  }\n\n  override createInstance(parentInstance: PageBoxInstance): PageBoxInstance {\n    return new PartitionInstance(parentInstance, this);\n  }\n\n  override clone(param): Partition {\n    const cloned = new Partition(\n      param.parent.scope,\n      this.name,\n      this.pseudoName,\n      this.classes,\n      param.parent,\n    );\n    this.copySpecified(cloned);\n    this.cloneChildren(cloned);\n    return cloned;\n  }\n}\n\n//---------------------------- Instance --------------------------------\n\n/**\n * @param def default value\n */\nexport function toExprIdent(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  def: string,\n): Exprs.Val {\n  if (!val || Css.isDefaultingValue(val)) {\n    return new Exprs.Const(scope, def);\n  }\n  return val.toExpr(scope, scope.zero);\n}\n\nexport function toExprAuto(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  ref: Exprs.Val,\n): Exprs.Val {\n  if (!val || val === Css.ident.auto || Css.isDefaultingValue(val)) {\n    return null;\n  }\n  return val.toExpr(scope, ref);\n}\n\nexport function toExprNormal(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  ref: Exprs.Val,\n): Exprs.Val {\n  if (!val || val === Css.ident.normal || Css.isDefaultingValue(val)) {\n    return null;\n  }\n  return val.toExpr(scope, ref);\n}\n\nexport function toExprZero(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  ref: Exprs.Val,\n): Exprs.Val {\n  if (!val || val === Css.ident.auto || Css.isDefaultingValue(val)) {\n    return scope.zero;\n  }\n  return val.toExpr(scope, ref);\n}\n\n/**\n * If the value is not specified (null), returns zero.\n * If the value is 'auto', returns null.\n * Otherwise, return the value itself.\n */\nexport function toExprZeroAuto(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  ref: Exprs.Val,\n): Exprs.Val {\n  if (!val || Css.isDefaultingValue(val)) {\n    return scope.zero;\n  } else if (val === Css.ident.auto) {\n    return null;\n  } else {\n    return val.toExpr(scope, ref);\n  }\n}\n\nexport function toExprZeroBorder(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  styleVal: Css.Val,\n  ref: Exprs.Val,\n): Exprs.Val {\n  if (!val || styleVal === Css.ident.none || Css.isDefaultingValue(val)) {\n    return scope.zero;\n  }\n  return val.toExpr(scope, ref);\n}\n\nexport function toExprBool(\n  scope: Exprs.LexicalScope,\n  val: Css.Val,\n  def: Exprs.Val,\n): Exprs.Val {\n  if (!val || Css.isDefaultingValue(val)) {\n    return def;\n  }\n  if (val === Css.ident._true) {\n    return scope._true;\n  }\n  if (val === Css.ident._false) {\n    return scope._false;\n  }\n  return val.toExpr(scope, scope.zero);\n}\n\nexport interface InstanceHolder extends Exprs.Context {\n  registerInstance(key: string, instance: PageBoxInstance): void;\n\n  /**\n   * @return instance\n   */\n  lookupInstance(key: string): PageBoxInstance;\n}\n\nexport class PageBoxInstance<P extends PageBox = PageBox<any>> {\n  /**\n   * cascaded styles, geometric ones converted to Css.Expr\n   */\n  protected cascaded: CssCascade.ElementStyle = {};\n  style: { [key: string]: Css.Val } = {};\n  private autoWidth: Exprs.Native = null;\n  private autoHeight: Exprs.Native = null;\n  children: PageBoxInstance[] = [];\n  isAutoWidth: boolean = false;\n  isAutoHeight: boolean = false;\n  isTopDependentOnAutoHeight: boolean = false;\n  isRightDependentOnAutoWidth: boolean = false;\n  private calculatedWidth: number = 0;\n  private calculatedHeight: number = 0;\n  pageMasterInstance: PageMasterInstance = null;\n  namedValues: { [key: string]: Exprs.Val } = {};\n  namedFuncs: { [key: string]: Exprs.Val } = {};\n  vertical: boolean = false;\n  rtl: boolean = false;\n  suppressEmptyBoxGeneration: boolean = false;\n  borderBoxSizing: boolean = false;\n\n  constructor(\n    public readonly parentInstance: PageBoxInstance,\n    public readonly pageBox: P,\n  ) {\n    if (parentInstance) {\n      parentInstance.children.push(this);\n    }\n  }\n\n  /**\n   * Reset information related to layout.\n   */\n  reset() {\n    this.calculatedWidth = 0;\n    this.calculatedHeight = 0;\n  }\n\n  private addNamedValues(name1: string, name2: string): Exprs.Val {\n    const v1 = this.resolveName(name1);\n    const v2 = this.resolveName(name2);\n    if (!v1 || !v2) {\n      throw new Error(\"E_INTERNAL\");\n    }\n    return Exprs.add(this.pageBox.scope, v1, v2);\n  }\n\n  resolveName(name: string): Exprs.Val {\n    let expr = this.namedValues[name];\n    if (expr) {\n      return expr;\n    }\n    const val = this.style[name];\n    if (val) {\n      expr = val.toExpr(this.pageBox.scope, this.pageBox.scope.zero);\n    }\n    switch (name) {\n      case \"margin-left-edge\":\n        expr = this.resolveName(\"left\");\n        break;\n      case \"margin-top-edge\":\n        expr = this.resolveName(\"top\");\n        break;\n      case \"margin-right-edge\":\n        expr = this.addNamedValues(\"border-right-edge\", \"margin-right\");\n        break;\n      case \"margin-bottom-edge\":\n        expr = this.addNamedValues(\"border-bottom-edge\", \"margin-bottom\");\n        break;\n      case \"border-left-edge\":\n        expr = this.addNamedValues(\"margin-left-edge\", \"margin-left\");\n        break;\n      case \"border-top-edge\":\n        expr = this.addNamedValues(\"margin-top-edge\", \"margin-top\");\n        break;\n      case \"border-right-edge\":\n        expr = this.addNamedValues(\"padding-right-edge\", \"border-right-width\");\n        break;\n      case \"border-bottom-edge\":\n        expr = this.addNamedValues(\n          \"padding-bottom-edge\",\n          \"border-bottom-width\",\n        );\n        break;\n      case \"padding-left-edge\":\n        expr = this.addNamedValues(\"border-left-edge\", \"border-left-width\");\n        break;\n      case \"padding-top-edge\":\n        expr = this.addNamedValues(\"border-top-edge\", \"border-top-width\");\n        break;\n      case \"padding-right-edge\":\n        expr = this.addNamedValues(\"right-edge\", \"padding-right\");\n        break;\n      case \"padding-bottom-edge\":\n        expr = this.addNamedValues(\"bottom-edge\", \"padding-bottom\");\n        break;\n      case \"left-edge\":\n        expr = this.addNamedValues(\"padding-left-edge\", \"padding-left\");\n        break;\n      case \"top-edge\":\n        expr = this.addNamedValues(\"padding-top-edge\", \"padding-top\");\n        break;\n      case \"right-edge\":\n        expr = this.addNamedValues(\"left-edge\", \"width\");\n        break;\n      case \"bottom-edge\":\n        expr = this.addNamedValues(\"top-edge\", \"height\");\n        break;\n    }\n    if (!expr) {\n      let altName: string;\n      if (name == \"extent\") {\n        altName = this.vertical ? \"width\" : \"height\";\n      } else if (name == \"measure\") {\n        altName = this.vertical ? \"height\" : \"width\";\n      } else {\n        const map = this.vertical\n          ? CssCascade.couplingMapVert\n          : CssCascade.couplingMapHor;\n        altName = name;\n        for (const key in map) {\n          altName = altName.replace(key, map[key]);\n        }\n      }\n      if (altName != name) {\n        expr = this.resolveName(altName);\n      }\n    }\n    if (expr) {\n      this.namedValues[name] = expr;\n    }\n    return expr;\n  }\n\n  resolveFunc(name) {\n    let expr = this.namedFuncs[name];\n    if (expr) {\n      return expr;\n    }\n    switch (name) {\n      case \"columns\": {\n        // min(count,column-count) * (column-width + column-gap) - column-gap\n        const scope = this.pageBox.scope;\n        const count = new Exprs.Param(scope, 0);\n        const columnCount = this.resolveName(\"column-count\");\n        const columnWidth = this.resolveName(\"column-width\");\n        const columnGap = this.resolveName(\"column-gap\");\n        expr = Exprs.sub(\n          scope,\n          Exprs.mul(\n            scope,\n            new Exprs.Call(scope, \"min\", [count, columnCount]),\n            Exprs.add(scope, columnWidth, columnGap),\n          ),\n          columnGap,\n        );\n        break;\n      }\n    }\n    if (expr) {\n      this.namedFuncs[name] = expr;\n    }\n    return expr;\n  }\n\n  private initEnabled(): void {\n    const scope = this.pageBox.scope;\n    const style = this.style;\n    let enabled = toExprBool(scope, style[\"enabled\"], scope._true);\n    const page = toExprAuto(scope, style[\"page\"], scope.zero);\n    if (page) {\n      const currentPage = new Exprs.Named(scope, \"page-number\");\n      enabled = Exprs.and(\n        scope,\n        enabled,\n        new Exprs.Eq(scope, page, currentPage),\n      );\n    }\n    const minPageWidth = toExprAuto(scope, style[\"min-page-width\"], scope.zero);\n    if (minPageWidth) {\n      enabled = Exprs.and(\n        scope,\n        enabled,\n        new Exprs.Ge(scope, new Exprs.Named(scope, \"page-width\"), minPageWidth),\n      );\n    }\n    const minPageHeight = toExprAuto(\n      scope,\n      style[\"min-page-height\"],\n      scope.zero,\n    );\n    if (minPageHeight) {\n      enabled = Exprs.and(\n        scope,\n        enabled,\n        new Exprs.Ge(\n          scope,\n          new Exprs.Named(scope, \"page-height\"),\n          minPageHeight,\n        ),\n      );\n    }\n    enabled = this.boxSpecificEnabled(enabled);\n    style[\"enabled\"] = new Css.Expr(enabled);\n  }\n\n  protected boxSpecificEnabled(enabled: Exprs.Val): Exprs.Val {\n    return enabled;\n  }\n\n  protected initHorizontal(): void {\n    const scope = this.pageBox.scope;\n    const style = this.style;\n    const parentWidth = this.parentInstance\n      ? this.parentInstance.style[\"width\"].toExpr(scope, null)\n      : null;\n    let left = toExprAuto(scope, style[\"left\"], parentWidth);\n    let marginLeft = toExprAuto(scope, style[\"margin-left\"], parentWidth);\n    const borderLeftWidth = toExprZeroBorder(\n      scope,\n      style[\"border-left-width\"],\n      style[\"border-left-style\"],\n      parentWidth,\n    );\n    const paddingLeft = toExprZero(scope, style[\"padding-left\"], parentWidth);\n    let width = toExprAuto(scope, style[\"width\"], parentWidth);\n    let maxWidth = toExprAuto(scope, style[\"max-width\"], parentWidth);\n    const paddingRight = toExprZero(scope, style[\"padding-right\"], parentWidth);\n    const borderRightWidth = toExprZeroBorder(\n      scope,\n      style[\"border-right-width\"],\n      style[\"border-right-style\"],\n      parentWidth,\n    );\n    let marginRight = toExprAuto(scope, style[\"margin-right\"], parentWidth);\n    let right = toExprAuto(scope, style[\"right\"], parentWidth);\n    const leftBP = Exprs.add(scope, borderLeftWidth, paddingLeft);\n    const rightBP = Exprs.add(scope, borderLeftWidth, paddingRight);\n    if (left && right && width) {\n      let extra = Exprs.sub(\n        scope,\n        parentWidth,\n        Exprs.add(\n          scope,\n          width,\n          Exprs.add(scope, Exprs.add(scope, left, leftBP), rightBP),\n        ),\n      );\n      if (!marginLeft) {\n        extra = Exprs.sub(scope, extra, right);\n        if (!marginRight) {\n          marginLeft = Exprs.mul(scope, extra, new Exprs.Const(scope, 0.5));\n          marginRight = marginLeft;\n        } else {\n          marginLeft = Exprs.sub(scope, extra, marginRight);\n        }\n      } else {\n        if (!marginRight) {\n          marginRight = Exprs.sub(\n            scope,\n            extra,\n            Exprs.add(scope, right, marginLeft),\n          );\n        } else {\n          // overconstraint\n          right = Exprs.sub(scope, extra, marginRight);\n        }\n      }\n    } else {\n      if (!marginLeft) {\n        marginLeft = scope.zero;\n      }\n      if (!marginRight) {\n        marginRight = scope.zero;\n      }\n      if (!left && !right && !width) {\n        left = scope.zero;\n      }\n      if (!left && !width) {\n        width = this.autoWidth;\n        this.isAutoWidth = true;\n      } else if (!left && !right) {\n        left = scope.zero;\n      } else if (!width && !right) {\n        width = this.autoWidth;\n        this.isAutoWidth = true;\n      }\n      const remains = Exprs.sub(\n        scope,\n        parentWidth,\n        Exprs.add(\n          scope,\n          Exprs.add(scope, marginLeft, leftBP),\n          Exprs.add(scope, marginRight, rightBP),\n        ),\n      );\n      if (this.isAutoWidth) {\n        if (!maxWidth) {\n          // TODO: handle the case when right/left depends on width\n          maxWidth = Exprs.sub(scope, remains, left ? left : right);\n        }\n\n        // For multi-column layout, width is max-width.\n        if (\n          !this.vertical &&\n          (toExprAuto(scope, style[\"column-width\"], null) ||\n            toExprAuto(scope, style[\"column-count\"], null))\n        ) {\n          width = maxWidth;\n          this.isAutoWidth = false;\n        }\n      }\n      if (!left) {\n        left = Exprs.sub(scope, remains, Exprs.add(scope, right, width));\n      } else if (!width) {\n        width = Exprs.sub(scope, remains, Exprs.add(scope, left, right));\n      } else if (!right) {\n        right = Exprs.sub(scope, remains, Exprs.add(scope, left, width));\n      }\n    }\n\n    // snap-width is inherited\n    const snapWidthVal =\n      style[\"snap-width\"] ||\n      (this.parentInstance ? this.parentInstance.style[\"snap-width\"] : null);\n    const snapWidth = toExprZero(scope, snapWidthVal, parentWidth);\n    style[\"left\"] = new Css.Expr(left);\n    style[\"margin-left\"] = new Css.Expr(marginLeft);\n    style[\"border-left-width\"] = new Css.Expr(borderLeftWidth);\n    style[\"padding-left\"] = new Css.Expr(paddingLeft);\n    style[\"width\"] = new Css.Expr(width);\n    style[\"max-width\"] = new Css.Expr(maxWidth ? maxWidth : width);\n    style[\"padding-right\"] = new Css.Expr(paddingRight);\n    style[\"border-right-width\"] = new Css.Expr(borderRightWidth);\n    style[\"margin-right\"] = new Css.Expr(marginRight);\n    style[\"right\"] = new Css.Expr(right);\n    style[\"snap-width\"] = new Css.Expr(snapWidth);\n  }\n\n  protected initVertical(): void {\n    const scope = this.pageBox.scope;\n    const style = this.style;\n    const parentWidth = this.parentInstance\n      ? this.parentInstance.style[\"width\"].toExpr(scope, null)\n      : null;\n    const parentHeight = this.parentInstance\n      ? this.parentInstance.style[\"height\"].toExpr(scope, null)\n      : null;\n    let top = toExprAuto(scope, style[\"top\"], parentHeight);\n    let marginTop = toExprAuto(scope, style[\"margin-top\"], parentWidth);\n    const borderTopWidth = toExprZeroBorder(\n      scope,\n      style[\"border-top-width\"],\n      style[\"border-top-style\"],\n      parentWidth,\n    );\n    const paddingTop = toExprZero(scope, style[\"padding-top\"], parentWidth);\n    let height = toExprAuto(scope, style[\"height\"], parentHeight);\n    let maxHeight = toExprAuto(scope, style[\"max-height\"], parentHeight);\n    const paddingBottom = toExprZero(\n      scope,\n      style[\"padding-bottom\"],\n      parentWidth,\n    );\n    const borderBottomWidth = toExprZeroBorder(\n      scope,\n      style[\"border-bottom-width\"],\n      style[\"border-bottom-style\"],\n      parentWidth,\n    );\n    let marginBottom = toExprAuto(scope, style[\"margin-bottom\"], parentWidth);\n    let bottom = toExprAuto(scope, style[\"bottom\"], parentHeight);\n    const topBP = Exprs.add(scope, borderTopWidth, paddingTop);\n    const bottomBP = Exprs.add(scope, borderBottomWidth, paddingBottom);\n    if (top && bottom && height) {\n      let extra = Exprs.sub(\n        scope,\n        parentHeight,\n        Exprs.add(\n          scope,\n          height,\n          Exprs.add(scope, Exprs.add(scope, top, topBP), bottomBP),\n        ),\n      );\n      if (!marginTop) {\n        extra = Exprs.sub(scope, extra, bottom);\n        if (!marginBottom) {\n          marginTop = Exprs.mul(scope, extra, new Exprs.Const(scope, 0.5));\n          marginBottom = marginTop;\n        } else {\n          marginTop = Exprs.sub(scope, extra, marginBottom);\n        }\n      } else {\n        if (!marginBottom) {\n          marginBottom = Exprs.sub(\n            scope,\n            extra,\n            Exprs.add(scope, bottom, marginTop),\n          );\n        } else {\n          // overconstraint\n          bottom = Exprs.sub(scope, extra, marginTop);\n        }\n      }\n    } else {\n      if (!marginTop) {\n        marginTop = scope.zero;\n      }\n      if (!marginBottom) {\n        marginBottom = scope.zero;\n      }\n      if (!top && !bottom && !height) {\n        top = scope.zero;\n      }\n      if (!top && !height) {\n        height = this.autoHeight;\n        this.isAutoHeight = true;\n      } else if (!top && !bottom) {\n        top = scope.zero;\n      } else if (!height && !bottom) {\n        height = this.autoHeight;\n        this.isAutoHeight = true;\n      }\n      const remains = Exprs.sub(\n        scope,\n        parentHeight,\n        Exprs.add(\n          scope,\n          Exprs.add(scope, marginTop, topBP),\n          Exprs.add(scope, marginBottom, bottomBP),\n        ),\n      );\n      if (this.isAutoHeight) {\n        if (!maxHeight) {\n          // TODO: handle the case when top/bottom depends on height\n          maxHeight = Exprs.sub(scope, remains, top ? top : bottom);\n        }\n\n        // For multi-column layout in vertical writing, height is max-height.\n        if (\n          this.vertical &&\n          (toExprAuto(scope, style[\"column-width\"], null) ||\n            toExprAuto(scope, style[\"column-count\"], null))\n        ) {\n          height = maxHeight;\n          this.isAutoHeight = false;\n        }\n      }\n      if (!top) {\n        top = Exprs.sub(scope, remains, Exprs.add(scope, bottom, height));\n      } else if (!height) {\n        height = Exprs.sub(scope, remains, Exprs.add(scope, bottom, top));\n      } else if (!bottom) {\n        bottom = Exprs.sub(scope, remains, Exprs.add(scope, top, height));\n      }\n    }\n\n    // snap-height is inherited\n    const snapHeightVal =\n      style[\"snap-height\"] ||\n      (this.parentInstance ? this.parentInstance.style[\"snap-height\"] : null);\n    const snapHeight = toExprZero(scope, snapHeightVal, parentWidth);\n    style[\"top\"] = new Css.Expr(top);\n    style[\"margin-top\"] = new Css.Expr(marginTop);\n    style[\"border-top-width\"] = new Css.Expr(borderTopWidth);\n    style[\"padding-top\"] = new Css.Expr(paddingTop);\n    style[\"height\"] = new Css.Expr(height);\n    style[\"max-height\"] = new Css.Expr(maxHeight ? maxHeight : height);\n    style[\"padding-bottom\"] = new Css.Expr(paddingBottom);\n    style[\"border-bottom-width\"] = new Css.Expr(borderBottomWidth);\n    style[\"margin-bottom\"] = new Css.Expr(marginBottom);\n    style[\"bottom\"] = new Css.Expr(bottom);\n    style[\"snap-height\"] = new Css.Expr(snapHeight);\n  }\n\n  private initColumns(): void {\n    const scope = this.pageBox.scope;\n    const style = this.style;\n    const width = toExprAuto(\n      scope,\n      style[this.vertical ? \"height\" : \"width\"],\n      null,\n    );\n    let columnWidth = toExprAuto(scope, style[\"column-width\"], width);\n    let columnCount = toExprAuto(scope, style[\"column-count\"], null);\n    let columnGap = toExprNormal(scope, style[\"column-gap\"], null);\n    if (!columnGap) {\n      columnGap = new Exprs.Numeric(scope, 1, \"em\");\n    }\n    if (columnWidth && !columnCount) {\n      columnCount = new Exprs.Call(scope, \"floor\", [\n        Exprs.div(\n          scope,\n          Exprs.add(scope, width, columnGap),\n          Exprs.add(scope, columnWidth, columnGap),\n        ),\n      ]);\n      columnCount = new Exprs.Call(scope, \"max\", [scope.one, columnCount]);\n    }\n    if (!columnCount) {\n      columnCount = scope.one;\n    }\n    columnWidth = Exprs.sub(\n      scope,\n      Exprs.div(scope, Exprs.add(scope, width, columnGap), columnCount),\n      columnGap,\n    );\n    style[\"column-width\"] = new Css.Expr(columnWidth);\n    style[\"column-count\"] = new Css.Expr(columnCount);\n    style[\"column-gap\"] = new Css.Expr(columnGap);\n  }\n\n  private depends(\n    propName: string,\n    val: Exprs.Val,\n    context: Exprs.Context,\n  ): boolean {\n    return this.style[propName]\n      .toExpr(this.pageBox.scope, null)\n      .depend(val, context);\n  }\n\n  private init(context: Exprs.Context): void {\n    // If context does not implement InstanceHolder we would not be able to\n    // resolve \"partition.property\" names later.\n    const holder = context as InstanceHolder;\n    holder.registerInstance(this.pageBox.key, this);\n    const scope = this.pageBox.scope;\n    const style = this.style;\n    const regionIds = this.parentInstance\n      ? this.parentInstance.getActiveRegions(context)\n      : null;\n    const cascMap = CssCascade.flattenCascadedStyle(\n      this.cascaded,\n      context,\n      regionIds,\n      false,\n      null,\n    );\n    this.vertical = CssCascade.isVertical(\n      cascMap,\n      context,\n      this.parentInstance ? this.parentInstance.vertical : false,\n    );\n    this.rtl = CssCascade.isRtl(\n      cascMap,\n      context,\n      this.parentInstance ? this.parentInstance.rtl : false,\n    );\n    this.borderBoxSizing =\n      cascMap[\"box-sizing\"]?.value === Css.ident.border_box;\n    const isLeftPage = !!(\n      context instanceof StyleInstance &&\n      context.currentLayoutPosition &&\n      new Exprs.Named(scope, \"left-page\").evaluate(context)\n    );\n    CssCascade.convertToPhysical(\n      cascMap,\n      style,\n      this.vertical,\n      this.rtl,\n      isLeftPage,\n      (name, cascVal) => cascVal.value,\n    );\n    this.autoWidth = new Exprs.Native(\n      scope,\n      () => this.calculatedWidth,\n      \"autoWidth\",\n    );\n    this.autoHeight = new Exprs.Native(\n      scope,\n      () => this.calculatedHeight,\n      \"autoHeight\",\n    );\n    this.initHorizontal();\n    this.initVertical();\n    this.initColumns();\n    this.initEnabled();\n  }\n\n  getProp(context: Exprs.Context, name: string): Css.Val {\n    let val = this.style[name];\n    if (\n      !val &&\n      CssCascade.isInherited(name) &&\n      // root style is inherited to `@page` but not to `@-epubx-page-master`\n      // (Issue #1565)\n      this.pageMasterInstance instanceof PageRuleMasterInstance\n    ) {\n      // inherit from root style\n      if (\n        name === \"font-size\" &&\n        context.isRelativeRootFontSize &&\n        context.rootFontSize\n      ) {\n        val = new Css.Numeric(context.rootFontSize, \"px\");\n      } else {\n        const rootStyle = (\n          context as Exprs.Context & {\n            styler: { rootStyle: { [key: string]: CssCascade.CascadeValue } };\n          }\n        ).styler?.rootStyle;\n        val = rootStyle[name]?.value;\n      }\n    }\n    if (val) {\n      val = CssCascade.evaluateCSSToCSS(context, val, name);\n    }\n    return val;\n  }\n\n  getPropAsNumber(context: Exprs.Context, name: string): number {\n    let val = this.style[name];\n    if (val) {\n      let percentRef = /\\b(height|top|bottom)\\b/.test(name)\n        ? (context.pageAreaHeight ?? context.pageHeight())\n        : (context.pageAreaWidth ?? context.pageWidth());\n      val = CssCascade.evaluateCSSToCSS(context, val, name, percentRef);\n    }\n    return Css.toNumber(val, context);\n  }\n\n  getSpecial(context: Exprs.Context, name: string): Css.Val[] {\n    const arr = CssCascade.getSpecial(this.cascaded, name);\n    if (arr) {\n      const result = [] as Css.Val[];\n      for (let i = 0; i < arr.length; i++) {\n        const v = arr[i].evaluate(context, \"\");\n        if (v && v !== Css.empty) {\n          result.push(v);\n        }\n      }\n      if (result.length) {\n        return result;\n      }\n    }\n    return null;\n  }\n\n  getActiveRegions(context: Exprs.Context): string[] {\n    const arr = this.getSpecial(context, \"region-id\");\n    if (arr) {\n      const result = [] as string[];\n      for (let i = 0; i < arr.length; i++) {\n        result[i] = arr[i].toString();\n      }\n      return result;\n    }\n    return null;\n  }\n\n  propagateProperty(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    name: string,\n    docFaces: Font.DocumentFaces,\n  ): void {\n    this.propagatePropertyToElement(context, container.element, name, docFaces);\n  }\n\n  propagatePropertyToElement(\n    context: Exprs.Context,\n    element: Element,\n    name: string,\n    docFaces: Font.DocumentFaces,\n  ): void {\n    let val = this.getProp(context, name);\n    if (val) {\n      if (\n        val.isNumeric() &&\n        Exprs.needUnitConversion((val as Css.Numeric).unit)\n      ) {\n        val = Css.convertNumericToPx(val, context);\n      }\n      if (name === \"font-family\") {\n        val = docFaces.filterFontFamily(val);\n      }\n      if (\n        (name.startsWith(\"background\") || name === \"z-index\") &&\n        element.parentElement.hasAttribute(\"data-vivliostyle-bleed-box\")\n      ) {\n        // Move background properties and z-index to the parent bleed-box element.\n        // (Fix for issue #644, #1166)\n        element = element.parentElement;\n      }\n      Base.setCSSProperty(element, name, val.toString());\n    }\n  }\n\n  propagateDelayedProperty(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    name: string,\n    delayedItems: Vtree.DelayedItem[],\n  ): void {\n    const val = this.getProp(context, name);\n    if (val) {\n      delayedItems.push(new Vtree.DelayedItem(container.element, name, val));\n    }\n  }\n\n  assignLeftPosition(context: Exprs.Context, container: Vtree.Container): void {\n    const left = this.getPropAsNumber(context, \"left\");\n    const marginLeft = this.getPropAsNumber(context, \"margin-left\");\n    const paddingLeft = this.getPropAsNumber(context, \"padding-left\");\n    const borderLeftWidth = this.getPropAsNumber(context, \"border-left-width\");\n    const width = this.getPropAsNumber(context, \"width\");\n    container.setHorizontalPosition(left, width);\n    Base.setCSSProperty(container.element, \"margin-left\", `${marginLeft}px`);\n    Base.setCSSProperty(container.element, \"padding-left\", `${paddingLeft}px`);\n    Base.setCSSProperty(\n      container.element,\n      \"border-left-width\",\n      `${borderLeftWidth}px`,\n    );\n    container.marginLeft = marginLeft;\n    container.borderLeft = borderLeftWidth;\n    container.paddingLeft = paddingLeft;\n  }\n\n  assignRightPosition(\n    context: Exprs.Context,\n    container: Vtree.Container,\n  ): void {\n    const right = this.getPropAsNumber(context, \"right\");\n    const snapWidth = this.getPropAsNumber(context, \"snap-height\");\n    const marginRight = this.getPropAsNumber(context, \"margin-right\");\n    let paddingRight = this.getPropAsNumber(context, \"padding-right\");\n    const borderRightWidth = this.getPropAsNumber(\n      context,\n      \"border-right-width\",\n    );\n    Base.setCSSProperty(container.element, \"margin-right\", `${marginRight}px`);\n    Base.setCSSProperty(\n      container.element,\n      \"padding-right\",\n      `${paddingRight}px`,\n    );\n    Base.setCSSProperty(\n      container.element,\n      \"border-right-width\",\n      `${borderRightWidth}px`,\n    );\n    container.marginRight = marginRight;\n    container.borderRight = borderRightWidth;\n    if (this.vertical && snapWidth > 0) {\n      const xpos = right + container.getInsetRight();\n      const r = xpos - Math.floor(xpos / snapWidth) * snapWidth;\n      if (r > 0) {\n        container.snapOffsetX = snapWidth - r;\n        paddingRight += container.snapOffsetX;\n      }\n    }\n    container.paddingRight = paddingRight;\n    container.snapWidth = snapWidth;\n  }\n\n  assignTopPosition(context: Exprs.Context, container: Vtree.Container): void {\n    const snapHeight = this.getPropAsNumber(context, \"snap-height\");\n    const top = this.getPropAsNumber(context, \"top\");\n    const marginTop = this.getPropAsNumber(context, \"margin-top\");\n    let paddingTop = this.getPropAsNumber(context, \"padding-top\");\n    const borderTopWidth = this.getPropAsNumber(context, \"border-top-width\");\n    container.top = top;\n    container.marginTop = marginTop;\n    container.borderTop = borderTopWidth;\n    container.snapHeight = snapHeight;\n    if (!this.vertical && snapHeight > 0) {\n      const ypos = top + container.getInsetTop();\n      const r = ypos - Math.floor(ypos / snapHeight) * snapHeight;\n      if (r > 0) {\n        container.snapOffsetY = snapHeight - r;\n        paddingTop += container.snapOffsetY;\n      }\n    }\n    container.paddingTop = paddingTop;\n    Base.setCSSProperty(container.element, \"top\", `${top}px`);\n    Base.setCSSProperty(container.element, \"margin-top\", `${marginTop}px`);\n    Base.setCSSProperty(container.element, \"padding-top\", `${paddingTop}px`);\n    Base.setCSSProperty(\n      container.element,\n      \"border-top-width\",\n      `${borderTopWidth}px`,\n    );\n  }\n\n  assignBottomPosition(\n    context: Exprs.Context,\n    container: Vtree.Container,\n  ): void {\n    const marginBottom = this.getPropAsNumber(context, \"margin-bottom\");\n    const paddingBottom = this.getPropAsNumber(context, \"padding-bottom\");\n    const borderBottomWidth = this.getPropAsNumber(\n      context,\n      \"border-bottom-width\",\n    );\n    const height =\n      this.getPropAsNumber(context, \"height\") - container.snapOffsetY;\n    Base.setCSSProperty(container.element, \"height\", `${height}px`);\n    Base.setCSSProperty(\n      container.element,\n      \"margin-bottom\",\n      `${marginBottom}px`,\n    );\n    Base.setCSSProperty(\n      container.element,\n      \"padding-bottom\",\n      `${paddingBottom}px`,\n    );\n    Base.setCSSProperty(\n      container.element,\n      \"border-bottom-width\",\n      `${borderBottomWidth}px`,\n    );\n    container.height = height - container.snapOffsetY;\n    container.marginBottom = marginBottom;\n    container.borderBottom = borderBottomWidth;\n    container.paddingBottom = paddingBottom;\n  }\n\n  assignBeforePosition(\n    context: Exprs.Context,\n    container: Vtree.Container,\n  ): void {\n    if (this.vertical) {\n      this.assignRightPosition(context, container);\n    } else {\n      this.assignTopPosition(context, container);\n    }\n  }\n\n  assignAfterPosition(\n    context: Exprs.Context,\n    container: Vtree.Container,\n  ): void {\n    if (this.vertical) {\n      this.assignLeftPosition(context, container);\n    } else {\n      this.assignBottomPosition(context, container);\n    }\n  }\n\n  assignStartEndPosition(\n    context: Exprs.Context,\n    container: Vtree.Container,\n  ): void {\n    if (this.vertical) {\n      this.assignTopPosition(context, container);\n      this.assignBottomPosition(context, container);\n    } else {\n      this.assignRightPosition(context, container);\n      this.assignLeftPosition(context, container);\n    }\n  }\n\n  sizeWithMaxHeight(context: Exprs.Context, container: Vtree.Container): void {\n    Base.setCSSProperty(container.element, \"border-top-width\", \"0px\");\n    let height = this.getPropAsNumber(context, \"max-height\");\n    if (this.isTopDependentOnAutoHeight) {\n      container.setVerticalPosition(0, height);\n    } else {\n      this.assignTopPosition(context, container);\n      height -= container.snapOffsetY;\n      container.height = height;\n      Base.setCSSProperty(container.element, \"height\", `${height}px`);\n    }\n  }\n\n  sizeWithMaxWidth(context: Exprs.Context, container: Vtree.Container): void {\n    Base.setCSSProperty(container.element, \"border-left-width\", \"0px\");\n    let width = this.getPropAsNumber(context, \"max-width\");\n    if (this.isRightDependentOnAutoWidth) {\n      container.setHorizontalPosition(0, width);\n    } else {\n      this.assignRightPosition(context, container);\n      width -= container.snapOffsetX;\n      container.width = width;\n      const right = this.getPropAsNumber(context, \"right\");\n      Base.setCSSProperty(container.element, \"right\", `${right}px`);\n      Base.setCSSProperty(container.element, \"width\", `${width}px`);\n    }\n  }\n\n  prepareContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n    clientLayout: Vtree.ClientLayout,\n  ): void {\n    if (!this.parentInstance || this.vertical != this.parentInstance.vertical) {\n      Base.setCSSProperty(\n        container.element,\n        \"writing-mode\",\n        this.vertical ? \"vertical-rl\" : \"horizontal-tb\",\n      );\n    }\n    if (!this.parentInstance || this.rtl != this.parentInstance.rtl) {\n      Base.setCSSProperty(\n        container.element,\n        \"direction\",\n        this.rtl ? \"rtl\" : \"ltr\",\n      );\n    }\n    if (this.vertical ? this.isAutoWidth : this.isAutoHeight) {\n      if (this.vertical) {\n        this.sizeWithMaxWidth(context, container);\n      } else {\n        this.sizeWithMaxHeight(context, container);\n      }\n    } else {\n      this.assignBeforePosition(context, container);\n      this.assignAfterPosition(context, container);\n    }\n    if (this.vertical ? this.isAutoHeight : this.isAutoWidth) {\n      if (this.vertical) {\n        this.sizeWithMaxHeight(context, container);\n      } else {\n        this.sizeWithMaxWidth(context, container);\n      }\n    } else {\n      this.assignStartEndPosition(context, container);\n    }\n    for (let i = 0; i < passPreProperties.length; i++) {\n      this.propagateProperty(\n        context,\n        container,\n        passPreProperties[i],\n        docFaces,\n      );\n    }\n  }\n\n  transferContentProps(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n  ): void {\n    for (let i = 0; i < passContentProperties.length; i++) {\n      this.propagateProperty(\n        context,\n        container,\n        passContentProperties[i],\n        docFaces,\n      );\n    }\n\n    if (this.style[\"text-overflow\"]) {\n      // To ensure that text-overflow works, we need to set text-overflow and\n      // overflow on the child element, because the container element is a\n      // flex container and the text-overflow does not work on it.\n      // (Issue #1473)\n      const child = container.element.firstElementChild;\n      Base.setCSSProperty(child, \"text-overflow\", \"inherit\");\n      Base.setCSSProperty(child, \"overflow\", \"inherit\");\n    }\n  }\n\n  transferSingleUriContentProps(\n    context: Exprs.Context,\n    element: Element,\n    docFaces: Font.DocumentFaces,\n  ): void {\n    const hasWidth = (): boolean => {\n      const width = (\n        (this.cascaded[\"width\"] ??\n          this.cascaded[\n            this.vertical ? \"block-size\" : \"inline-size\"\n          ]) as CssCascade.CascadeValue\n      )?.value;\n      return (\n        !!width && width !== Css.ident.auto && !Css.isDefaultingValue(width)\n      );\n    };\n    const hasHeight = (): boolean => {\n      const height = (\n        (this.cascaded[\"height\"] ??\n          this.cascaded[\n            this.vertical ? \"inline-size\" : \"block-size\"\n          ]) as CssCascade.CascadeValue\n      )?.value;\n      return (\n        !!height && height !== Css.ident.auto && !Css.isDefaultingValue(height)\n      );\n    };\n\n    for (let i = 0; i < passSingleUriContentProperties.length; i++) {\n      const name = passSingleUriContentProperties[i];\n      if (name === \"width\" || name === \"height\") {\n        if (\n          (name === \"width\" && !hasWidth()) ||\n          (name === \"height\" && !hasHeight())\n        ) {\n          // Don't propagate width/height to the img element if it's not specified.\n          // (Issue #1177)\n          continue;\n        }\n        // Since the width/height is already set on the container element,\n        // we set it to 100% on the img element so that it fills the container.\n        // This is needed for the `box-sizing: border-box` to work correctly.\n        Base.setCSSProperty(element, name, \"100%\");\n        continue;\n      }\n      this.propagatePropertyToElement(context, element, name, docFaces);\n    }\n  }\n\n  /**\n   * @param column (null when content comes from the content property)\n   */\n  finishContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    column: Vtree.Container | null,\n    columnCount: number,\n    clientLayout: Vtree.ClientLayout,\n    docFaces: Font.DocumentFaces,\n  ): void {\n    if (this.vertical) {\n      this.calculatedWidth =\n        container.computedBlockSize + container.snapOffsetX;\n    } else {\n      this.calculatedHeight =\n        container.computedBlockSize + container.snapOffsetY;\n    }\n    const readHeight = (this.vertical || !column) && this.isAutoHeight;\n    const readWidth = (!this.vertical || !column) && this.isAutoWidth;\n    let bbox: Vtree.ClientRect = null;\n    if (readWidth || readHeight) {\n      if (readWidth) {\n        Base.setCSSProperty(container.element, \"width\", \"auto\");\n      }\n      if (readHeight) {\n        Base.setCSSProperty(container.element, \"height\", \"auto\");\n      }\n      const usingBrowserColumnBreaking =\n        column && LayoutHelper.isUsingBrowserColumnBreaking(column);\n      if (usingBrowserColumnBreaking) {\n        // To get correct bounding box, temporarily disable multi-column style.\n        LayoutHelper.unsetBrowserColumnBreaking(column);\n      }\n      bbox = clientLayout.getElementClientRect(\n        column ? column.element : container.element,\n      );\n      if (usingBrowserColumnBreaking) {\n        // Restore multi-column style.\n        LayoutHelper.setBrowserColumnBreaking(column);\n      }\n      if (readWidth) {\n        this.calculatedWidth = Math.ceil(\n          bbox.right -\n            bbox.left -\n            container.paddingLeft -\n            container.borderLeft -\n            container.paddingRight -\n            container.borderRight,\n        );\n        if (this.vertical) {\n          this.calculatedWidth += container.snapOffsetX;\n        }\n      }\n      if (readHeight) {\n        this.calculatedHeight =\n          bbox.bottom -\n          bbox.top -\n          container.paddingTop -\n          container.borderTop -\n          container.paddingBottom -\n          container.borderBottom;\n        if (!this.vertical) {\n          this.calculatedHeight += container.snapOffsetY;\n        }\n      }\n    }\n    if (this.vertical ? this.isAutoHeight : this.isAutoWidth) {\n      this.assignStartEndPosition(context, container);\n    }\n    if (this.vertical ? this.isAutoWidth : this.isAutoHeight) {\n      if (\n        this.vertical\n          ? this.isRightDependentOnAutoWidth\n          : this.isTopDependentOnAutoHeight\n      ) {\n        this.assignBeforePosition(context, container);\n      }\n      this.assignAfterPosition(context, container);\n    }\n    if (columnCount > 1) {\n      const ruleWidth = this.getPropAsNumber(context, \"column-rule-width\");\n      const ruleStyle = this.getProp(context, \"column-rule-style\");\n      const ruleColor = this.getProp(context, \"column-rule-color\");\n      if (\n        ruleWidth > 0 &&\n        ruleStyle &&\n        ruleStyle != Css.ident.none &&\n        ruleColor != Css.ident.transparent\n      ) {\n        const columnGap = this.getPropAsNumber(context, \"column-gap\");\n        const containerSize = this.vertical\n          ? container.height\n          : container.width;\n        const border = this.vertical ? \"border-top\" : \"border-left\";\n        for (let i = 1; i < columnCount; i++) {\n          const pos = this.vertical\n            ? ((containerSize + columnGap) * i) / columnCount -\n              columnGap / 2 +\n              container.paddingTop -\n              ruleWidth / 2\n            : ((containerSize + columnGap) * i) / columnCount -\n              columnGap / 2 +\n              container.paddingLeft -\n              ruleWidth / 2;\n          const size = this.vertical\n            ? container.width + container.paddingLeft + container.paddingRight\n            : container.height + container.paddingTop + container.paddingBottom;\n          const rule = container.element.ownerDocument.createElement(\"div\");\n          Base.setCSSProperty(rule, \"position\", \"absolute\");\n          Base.setCSSProperty(rule, this.vertical ? \"left\" : \"top\", \"0px\");\n          Base.setCSSProperty(rule, this.vertical ? \"top\" : \"left\", `${pos}px`);\n          Base.setCSSProperty(rule, this.vertical ? \"height\" : \"width\", \"0px\");\n          Base.setCSSProperty(\n            rule,\n            this.vertical ? \"width\" : \"height\",\n            `${size}px`,\n          );\n          Base.setCSSProperty(\n            rule,\n            border,\n            `${ruleWidth}px ${ruleStyle.toString()}${\n              ruleColor ? ` ${ruleColor.toString()}` : \"\"\n            }`,\n          );\n          container.element.insertBefore(rule, container.element.firstChild);\n        }\n      }\n    }\n    for (let i = 0; i < passPostProperties.length; i++) {\n      this.propagateProperty(\n        context,\n        container,\n        passPostProperties[i],\n        docFaces,\n      );\n    }\n    for (let i = 0; i < delayedProperties.length; i++) {\n      this.propagateDelayedProperty(\n        context,\n        container,\n        delayedProperties[i],\n        page.delayedItems,\n      );\n    }\n  }\n\n  applyCascadeAndInit(\n    cascade: CssCascade.CascadeInstance,\n    docElementStyle: CssCascade.ElementStyle,\n  ): void {\n    const style = this.cascaded;\n    const specified = this.pageBox.specified;\n    for (const name in specified) {\n      if (\n        this instanceof PageRuleMasterInstance &&\n        this.pageBox.pseudoName == \"vivliostyle-page-rule-master\" &&\n        (name === \"writing-mode\" || name === \"direction\")\n      ) {\n        // Prevent writing-mode and direction specified on `@page` not working.\n        // (Fix for issue #1392)\n        continue;\n      }\n      if (CssCascade.isPropName(name)) {\n        CssCascade.setProp(style, name, CssCascade.getProp(specified, name));\n      }\n    }\n    if (this.pageBox.pseudoName == userAgentPageMasterPseudo) {\n      for (const name in docElementStyle) {\n        if (name.match(/^background-/) || name == \"writing-mode\") {\n          style[name] = docElementStyle[name];\n        }\n      }\n    }\n    if (this.pageBox.pseudoName == \"layout-host\") {\n      for (const name in docElementStyle) {\n        if (!name.match(/^background-/) && name != \"writing-mode\") {\n          style[name] = docElementStyle[name];\n        }\n      }\n    }\n    cascade.pushRule(this.pageBox.classes, null, style);\n    const content = style[\"content\"] as CssCascade.CascadeValue;\n    if (content) {\n      style[\"content\"] = content.filterValue(\n        new CssCascade.ContentPropVisitor(\n          cascade,\n          null,\n          cascade.counterResolver,\n        ),\n      );\n    }\n    this.init(cascade.context);\n    for (const child of this.pageBox.children) {\n      const childInstance = child.createInstance(this);\n      childInstance.applyCascadeAndInit(cascade, docElementStyle);\n    }\n    cascade.popRule();\n  }\n\n  resolveAutoSizing(context: Exprs.Context): void {\n    // all implicit dependencies are set up at this point\n    if (this.isAutoWidth) {\n      this.isRightDependentOnAutoWidth =\n        this.depends(\"right\", this.autoWidth, context) ||\n        this.depends(\"margin-right\", this.autoWidth, context) ||\n        this.depends(\"border-right-width\", this.autoWidth, context) ||\n        this.depends(\"padding-right\", this.autoWidth, context);\n    }\n    if (this.isAutoHeight) {\n      this.isTopDependentOnAutoHeight =\n        this.depends(\"top\", this.autoHeight, context) ||\n        this.depends(\"margin-top\", this.autoHeight, context) ||\n        this.depends(\"border-top-width\", this.autoHeight, context) ||\n        this.depends(\"padding-top\", this.autoHeight, context);\n    }\n    for (const childInstance of this.children) {\n      childInstance.resolveAutoSizing(context);\n    }\n  }\n}\n\n/**\n * Properties that are passed through before the layout.\n */\nexport const passPreProperties = [\n  \"border-left-style\",\n  \"border-right-style\",\n  \"border-top-style\",\n  \"border-bottom-style\",\n  \"border-left-color\",\n  \"border-right-color\",\n  \"border-top-color\",\n  \"border-bottom-color\",\n  \"box-sizing\",\n  \"outline-style\",\n  \"outline-color\",\n  \"outline-width\",\n  \"overflow\",\n  \"visibility\",\n];\n\n/**\n * Properties that are passed through after the layout.\n */\nexport const passPostProperties = [\n  \"border-top-left-radius\",\n  \"border-top-right-radius\",\n  \"border-bottom-right-radius\",\n  \"border-bottom-left-radius\",\n  \"border-start-start-radius\",\n  \"border-start-end-radius\",\n  \"border-end-start-radius\",\n  \"border-end-end-radius\",\n  \"border-image-source\",\n  \"border-image-slice\",\n  \"border-image-width\",\n  \"border-image-outset\",\n  \"border-image-repeat\",\n  \"background-attachment\",\n  \"background-color\",\n  \"background-image\",\n  \"background-repeat\",\n  \"background-position\",\n  \"background-clip\",\n  \"background-origin\",\n  \"background-size\",\n  \"box-shadow\",\n  \"opacity\",\n  \"z-index\",\n  \"background-blend-mode\",\n  \"isolation\",\n  \"mix-blend-mode\",\n  \"filter\",\n];\n\n/**\n * Only passed when there is content assigned by the content property.\n */\nexport const passContentProperties = [\n  \"color\",\n  \"font-family\",\n  \"font-size\",\n  \"font-style\",\n  \"font-weight\",\n  \"line-height\",\n  \"letter-spacing\",\n  \"text-align\",\n  \"text-align-last\",\n  \"text-decoration\",\n  \"text-indent\",\n  \"text-transform\",\n  \"white-space\",\n  \"text-wrap\",\n  \"text-wrap-mode\",\n  \"text-wrap-style\",\n  \"word-spacing\",\n  \"font-feature-settings\",\n  \"font-kerning\",\n  \"font-size-adjust\",\n  \"font-variant-ligatures\",\n  \"font-variant-caps\",\n  \"font-variant-numeric\",\n  \"font-variant-east-asian\",\n  \"font-stretch\",\n  \"text-combine-upright\",\n  \"text-decoration-color\",\n  \"text-decoration-line\",\n  \"text-decoration-skip\",\n  \"text-decoration-skip-ink\",\n  \"text-decoration-style\",\n  \"text-decoration-thickness\",\n  \"text-emphasis\",\n  \"text-emphasis-color\",\n  \"text-emphasis-position\",\n  \"text-emphasis-style\",\n  \"text-fill-color\",\n  \"text-orientation\",\n  \"text-shadow\",\n  \"text-stroke-color\",\n  \"text-stroke-width\",\n  \"text-underline-offset\",\n  \"text-underline-position\",\n  \"text-overflow\",\n];\n\nexport const passSingleUriContentProperties = [\n  \"width\",\n  \"height\",\n  \"image-resolution\",\n  \"object-fit\",\n  \"object-position\",\n];\n\nexport const delayedProperties = [\"transform\", \"transform-origin\"];\n\nexport const userAgentPageMasterPseudo = \"background-host\";\n\nexport class RootPageBoxInstance extends PageBoxInstance<RootPageBox> {\n  constructor(pageBox: RootPageBox) {\n    super(null, pageBox);\n  }\n\n  override applyCascadeAndInit(\n    cascade: CssCascade.CascadeInstance,\n    docElementStyle: CssCascade.ElementStyle,\n  ): void {\n    super.applyCascadeAndInit(cascade, docElementStyle);\n\n    // Sort page masters using order and specificity.\n    const pageMasters = this.children;\n    (pageMasters as PageMasterInstance[]).sort(\n      (a, b) =>\n        (b.pageBox as any).specificity - (a.pageBox as any).specificity || // probably cause NaN\n        a.pageBox.index - b.pageBox.index,\n    );\n  }\n}\n\nexport class PageMasterInstance<\n  P extends PageMaster = PageMaster<PageMasterInstance<any>>,\n> extends PageBoxInstance<P> {\n  constructor(parentInstance: PageBoxInstance, pageBox: P) {\n    super(parentInstance, pageBox);\n    this.pageMasterInstance = this;\n  }\n\n  override boxSpecificEnabled(enabled: Exprs.Val): Exprs.Val {\n    const pageMaster = this.pageBox.pageMaster;\n    if (pageMaster.condition) {\n      enabled = Exprs.and(pageMaster.scope, enabled, pageMaster.condition);\n    }\n    return enabled;\n  }\n\n  /**\n   * Called after layout of contents of the page has done to adjust the overall\n   * page layout. Override in subclasses.\n   */\n  adjustPageLayout(\n    context: Exprs.Context,\n    page: Vtree.Page,\n    clientLayout: Vtree.ClientLayout,\n  ) {}\n}\n\nexport class PartitionGroupInstance extends PageBoxInstance<PartitionGroup> {\n  constructor(parentInstance: PageBoxInstance, pageBox: PageBox) {\n    super(parentInstance, pageBox);\n    this.pageMasterInstance = parentInstance.pageMasterInstance;\n  }\n}\n\nexport class PartitionInstance<\n  P extends Partition = Partition<PartitionInstance<any>>,\n> extends PageBoxInstance<P> {\n  constructor(parentInstance: PageBoxInstance, pageBox: P) {\n    super(parentInstance, pageBox);\n    this.pageMasterInstance = parentInstance.pageMasterInstance;\n  }\n\n  processPartitionList(\n    enabled: Exprs.Val,\n    listVal: Css.Val,\n    conflicting: boolean,\n  ): Exprs.Val {\n    let list: Css.Val[] = null;\n    if (listVal instanceof Css.Ident) {\n      list = [listVal];\n    }\n    if (listVal instanceof Css.CommaList) {\n      list = (listVal as Css.CommaList).values;\n    }\n    if (list) {\n      const scope = this.pageBox.scope;\n      for (let i = 0; i < list.length; i++) {\n        if (list[i] instanceof Css.Ident) {\n          const qname = Exprs.makeQualifiedName(\n            (list[i] as Css.Ident).name,\n            \"enabled\",\n          );\n          let term: Exprs.Val = new Exprs.Named(scope, qname);\n          if (conflicting) {\n            term = new Exprs.Not(scope, term);\n          }\n          enabled = Exprs.and(scope, enabled, term);\n        }\n      }\n    }\n    return enabled;\n  }\n\n  override boxSpecificEnabled(enabled: Exprs.Val): Exprs.Val {\n    const scope = this.pageBox.scope;\n    const style = this.style;\n    const required =\n      toExprBool(scope, style[\"required\"], scope._false) !== scope._false;\n    if (required || this.isAutoHeight) {\n      const flowName = toExprIdent(scope, style[\"flow-from\"], \"body\");\n      const hasContent = new Exprs.Call(scope, \"has-content\", [flowName]);\n      enabled = Exprs.and(scope, enabled, hasContent);\n    }\n    enabled = this.processPartitionList(\n      enabled,\n      style[\"required-partitions\"],\n      false,\n    );\n    enabled = this.processPartitionList(\n      enabled,\n      style[\"conflicting-partitions\"],\n      true,\n    );\n    if (required) {\n      const pmEnabledVal = this.pageMasterInstance.style[\"enabled\"];\n      let pmEnabled = pmEnabledVal\n        ? pmEnabledVal.toExpr(scope, null)\n        : scope._true;\n      pmEnabled = Exprs.and(scope, pmEnabled, enabled);\n      this.pageMasterInstance.style[\"enabled\"] = new Css.Expr(pmEnabled);\n    }\n    return enabled;\n  }\n\n  override prepareContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n    clientLayout: Vtree.ClientLayout,\n  ): void {\n    if (!(this.pageBox.pageMaster instanceof PageRuleMaster)) {\n      // The overflow property of a `@-epubx-partition` is set by default to hidden.\n      Base.setCSSProperty(container.element, \"overflow\", \"hidden\");\n      container.element.setAttribute(\n        \"data-vivliostyle-page-partition\",\n        this.pageBox.name ?? \"\",\n      );\n    }\n    super.prepareContainer(context, container, page, docFaces, clientLayout);\n  }\n}\n\n//--------------------- parsing -----------------------\nexport class PageBoxParserHandler\n  extends CssParser.SlaveParserHandler\n  implements CssValidator.PropertyReceiver\n{\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    public readonly target: PageBox,\n    public readonly validatorSet: CssValidator.ValidatorSet,\n  ) {\n    super(scope, owner, false);\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    this.validatorSet.validatePropertyAndHandleShorthand(\n      name,\n      value,\n      important,\n      this,\n    );\n  }\n\n  /** @override */\n  unknownProperty(name: string, value: Css.Val): void {\n    this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n  }\n\n  /** @override */\n  invalidPropertyValue(name: string, value: Css.Val): void {\n    this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n  }\n\n  /** @override */\n  simpleProperty(name: string, value: Css.Val, important): void {\n    this.target.specified[name] = new CssCascade.CascadeValue(\n      value,\n      important\n        ? CssParser.SPECIFICITY_STYLE\n        : CssParser.SPECIFICITY_STYLE_IMPORTANT,\n    );\n  }\n}\n\nexport class PartitionParserHandler extends PageBoxParserHandler {\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    target: Partition,\n    validatorSet: CssValidator.ValidatorSet,\n  ) {\n    super(scope, owner, target, validatorSet);\n  }\n}\n\nexport class PartitionGroupParserHandler extends PageBoxParserHandler {\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    target: PartitionGroup,\n    validatorSet: CssValidator.ValidatorSet,\n  ) {\n    super(scope, owner, target, validatorSet);\n    target.specified[\"width\"] = new CssCascade.CascadeValue(\n      Css.hundredPercent,\n      0,\n    );\n    target.specified[\"height\"] = new CssCascade.CascadeValue(\n      Css.hundredPercent,\n      0,\n    );\n  }\n\n  override startPartitionRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    const partition = new Partition(\n      this.scope,\n      name,\n      pseudoName,\n      classes,\n      this.target,\n    );\n    const handler = new PartitionParserHandler(\n      this.scope,\n      this.owner,\n      partition,\n      this.validatorSet,\n    );\n    this.owner.pushHandler(handler);\n  }\n\n  override startPartitionGroupRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    const partitionGroup = new PartitionGroup(\n      this.scope,\n      name,\n      pseudoName,\n      classes,\n      this.target,\n    );\n    const handler = new PartitionGroupParserHandler(\n      this.scope,\n      this.owner,\n      partitionGroup,\n      this.validatorSet,\n    );\n    this.owner.pushHandler(handler);\n  }\n}\n\nexport class PageMasterParserHandler extends PageBoxParserHandler {\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    target: PageMaster,\n    validatorSet: CssValidator.ValidatorSet,\n  ) {\n    super(scope, owner, target, validatorSet);\n  }\n\n  override startPartitionRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    const partition = new Partition(\n      this.scope,\n      name,\n      pseudoName,\n      classes,\n      this.target,\n    );\n    const handler = new PartitionParserHandler(\n      this.scope,\n      this.owner,\n      partition,\n      this.validatorSet,\n    );\n    this.owner.pushHandler(handler);\n  }\n\n  override startPartitionGroupRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    const partitionGroup = new PartitionGroup(\n      this.scope,\n      name,\n      pseudoName,\n      classes,\n      this.target,\n    );\n    const handler = new PartitionGroupParserHandler(\n      this.scope,\n      this.owner,\n      partitionGroup,\n      this.validatorSet,\n    );\n    this.owner.pushHandler(handler);\n  }\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CssPage - `@page` rule (CSS Paged Media) support https://drafts.csswg.org/css-page/\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Constants from \"./constants\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as PageMaster from \"./page-master\";\nimport * as Sizing from \"./sizing\";\nimport * as Vtree from \"./vtree\";\n\n/**\n * Resolve page progression direction from writing-mode and direction.\n */\nexport function resolvePageProgression(\n  style: CssCascade.ElementStyle,\n): Constants.PageProgression {\n  const writingMode = (style[\"writing-mode\"] as CssCascade.CascadeValue)?.value;\n  const direction = (style[\"direction\"] as CssCascade.CascadeValue)?.value;\n  if (\n    writingMode === Css.ident.vertical_lr ||\n    (writingMode !== Css.ident.vertical_rl && direction !== Css.ident.rtl)\n  ) {\n    return Constants.PageProgression.LTR;\n  } else {\n    return Constants.PageProgression.RTL;\n  }\n}\nexport type PageSize = {\n  width: Css.Numeric;\n  height: Css.Numeric;\n};\n\n/**\n * Named page sizes.\n */\nexport const pageSizes: { [key: string]: PageSize } = {\n  a10: { width: new Css.Numeric(26, \"mm\"), height: new Css.Numeric(37, \"mm\") },\n  a9: { width: new Css.Numeric(37, \"mm\"), height: new Css.Numeric(52, \"mm\") },\n  a8: { width: new Css.Numeric(52, \"mm\"), height: new Css.Numeric(74, \"mm\") },\n  a7: { width: new Css.Numeric(74, \"mm\"), height: new Css.Numeric(105, \"mm\") },\n  a6: { width: new Css.Numeric(105, \"mm\"), height: new Css.Numeric(148, \"mm\") },\n  a5: { width: new Css.Numeric(148, \"mm\"), height: new Css.Numeric(210, \"mm\") },\n  a4: { width: new Css.Numeric(210, \"mm\"), height: new Css.Numeric(297, \"mm\") },\n  a3: { width: new Css.Numeric(297, \"mm\"), height: new Css.Numeric(420, \"mm\") },\n  a2: { width: new Css.Numeric(420, \"mm\"), height: new Css.Numeric(594, \"mm\") },\n  a1: { width: new Css.Numeric(594, \"mm\"), height: new Css.Numeric(841, \"mm\") },\n  a0: {\n    width: new Css.Numeric(841, \"mm\"),\n    height: new Css.Numeric(1189, \"mm\"),\n  },\n  b10: { width: new Css.Numeric(31, \"mm\"), height: new Css.Numeric(44, \"mm\") },\n  b9: { width: new Css.Numeric(44, \"mm\"), height: new Css.Numeric(62, \"mm\") },\n  b8: { width: new Css.Numeric(62, \"mm\"), height: new Css.Numeric(88, \"mm\") },\n  b7: { width: new Css.Numeric(88, \"mm\"), height: new Css.Numeric(125, \"mm\") },\n  b6: { width: new Css.Numeric(125, \"mm\"), height: new Css.Numeric(176, \"mm\") },\n  b5: { width: new Css.Numeric(176, \"mm\"), height: new Css.Numeric(250, \"mm\") },\n  b4: { width: new Css.Numeric(250, \"mm\"), height: new Css.Numeric(353, \"mm\") },\n  b3: { width: new Css.Numeric(353, \"mm\"), height: new Css.Numeric(500, \"mm\") },\n  b2: { width: new Css.Numeric(500, \"mm\"), height: new Css.Numeric(707, \"mm\") },\n  b1: {\n    width: new Css.Numeric(707, \"mm\"),\n    height: new Css.Numeric(1000, \"mm\"),\n  },\n  b0: {\n    width: new Css.Numeric(1000, \"mm\"),\n    height: new Css.Numeric(1414, \"mm\"),\n  },\n  c10: { width: new Css.Numeric(28, \"mm\"), height: new Css.Numeric(40, \"mm\") },\n  c9: { width: new Css.Numeric(40, \"mm\"), height: new Css.Numeric(57, \"mm\") },\n  c8: { width: new Css.Numeric(57, \"mm\"), height: new Css.Numeric(81, \"mm\") },\n  c7: { width: new Css.Numeric(81, \"mm\"), height: new Css.Numeric(114, \"mm\") },\n  c6: { width: new Css.Numeric(114, \"mm\"), height: new Css.Numeric(162, \"mm\") },\n  c5: { width: new Css.Numeric(162, \"mm\"), height: new Css.Numeric(229, \"mm\") },\n  c4: { width: new Css.Numeric(229, \"mm\"), height: new Css.Numeric(324, \"mm\") },\n  c3: { width: new Css.Numeric(324, \"mm\"), height: new Css.Numeric(458, \"mm\") },\n  c2: { width: new Css.Numeric(458, \"mm\"), height: new Css.Numeric(648, \"mm\") },\n  c1: { width: new Css.Numeric(648, \"mm\"), height: new Css.Numeric(917, \"mm\") },\n  c0: {\n    width: new Css.Numeric(917, \"mm\"),\n    height: new Css.Numeric(1297, \"mm\"),\n  },\n  \"jis-b10\": {\n    width: new Css.Numeric(32, \"mm\"),\n    height: new Css.Numeric(45, \"mm\"),\n  },\n  \"jis-b9\": {\n    width: new Css.Numeric(45, \"mm\"),\n    height: new Css.Numeric(64, \"mm\"),\n  },\n  \"jis-b8\": {\n    width: new Css.Numeric(64, \"mm\"),\n    height: new Css.Numeric(91, \"mm\"),\n  },\n  \"jis-b7\": {\n    width: new Css.Numeric(91, \"mm\"),\n    height: new Css.Numeric(128, \"mm\"),\n  },\n  \"jis-b6\": {\n    width: new Css.Numeric(128, \"mm\"),\n    height: new Css.Numeric(182, \"mm\"),\n  },\n  \"jis-b5\": {\n    width: new Css.Numeric(182, \"mm\"),\n    height: new Css.Numeric(257, \"mm\"),\n  },\n  \"jis-b4\": {\n    width: new Css.Numeric(257, \"mm\"),\n    height: new Css.Numeric(364, \"mm\"),\n  },\n  \"jis-b3\": {\n    width: new Css.Numeric(364, \"mm\"),\n    height: new Css.Numeric(515, \"mm\"),\n  },\n  \"jis-b2\": {\n    width: new Css.Numeric(515, \"mm\"),\n    height: new Css.Numeric(728, \"mm\"),\n  },\n  \"jis-b1\": {\n    width: new Css.Numeric(728, \"mm\"),\n    height: new Css.Numeric(1030, \"mm\"),\n  },\n  \"jis-b0\": {\n    width: new Css.Numeric(1030, \"mm\"),\n    height: new Css.Numeric(1456, \"mm\"),\n  },\n  letter: {\n    width: new Css.Numeric(8.5, \"in\"),\n    height: new Css.Numeric(11, \"in\"),\n  },\n  legal: {\n    width: new Css.Numeric(8.5, \"in\"),\n    height: new Css.Numeric(14, \"in\"),\n  },\n  ledger: {\n    width: new Css.Numeric(11, \"in\"),\n    height: new Css.Numeric(17, \"in\"),\n  },\n};\n\n/**\n * Default value for line width of printer marks\n */\nexport const defaultPrinterMarkLineWidth: Css.Numeric = new Css.Numeric(\n  0.24,\n  \"pt\",\n);\n\n/**\n * Default value for distance between an edge of the page and printer marks\n */\nexport const defaultPrinterMarkOffset: Css.Numeric = new Css.Numeric(3, \"mm\");\n\n/**\n * Default value for line length of the (shorter) line of a crop mark and the\n * shorter line of a cross mark\n */\nexport const defaultPrinterMarkLineLength: Css.Numeric = new Css.Numeric(\n  10,\n  \"mm\",\n);\n\n/**\n * Default value for bleed offset (= defaultPrinterMarkOffset +\n * defaultPrinterMarkLineLength)\n */\nexport const defaultBleedOffset: Css.Numeric = new Css.Numeric(3 + 10, \"mm\");\n\nexport type PageSizeAndBleed = {\n  width: Css.Numeric;\n  height: Css.Numeric;\n  bleed: Css.Numeric;\n  bleedOffset: Css.Numeric;\n  cropOffset: Css.Numeric;\n};\n\nexport function resolvePageSizeAndBleed(style: {\n  [key: string]: CssCascade.CascadeValue;\n}): PageSizeAndBleed {\n  // default value (fit to viewport, no bleed)\n  const pageSizeAndBleed: PageSizeAndBleed = {\n    width: Css.fullWidth,\n    height: Css.fullHeight,\n    bleed: Css.numericZero,\n    bleedOffset: Css.numericZero,\n    cropOffset: Css.numericZero,\n  };\n  const size: CssCascade.CascadeValue = style[\"size\"];\n\n  if (!size || size.value === Css.ident.auto) {\n    // if size is auto, fit to the viewport (use default value)\n  } else {\n    /** !type {!Css.Val} */\n    const value = size.value;\n    let val1: Css.Val;\n    let val2: Css.Val;\n    if (value.isSpaceList()) {\n      val1 = (value as Css.SpaceList).values[0];\n      val2 = (value as Css.SpaceList).values[1];\n    } else {\n      val1 = value;\n      val2 = null;\n    }\n    if (val1.isNumeric()) {\n      // <length>{1,2}\n      pageSizeAndBleed.width = val1 as Css.Numeric;\n      pageSizeAndBleed.height = (val2 || val1) as Css.Numeric;\n    } else {\n      // <page-size> || [ portrait | landscape ]\n      const s =\n        (val1 as any).name && pageSizes[(val1 as Css.Ident).name.toLowerCase()];\n      if (!s) {\n        // portrait or landscape is specified alone. fallback to fit to the\n        // viewport (use default value)\n      } else if (val2 && val2 === Css.ident.landscape) {\n        // swap\n        pageSizeAndBleed.width = s.height;\n        pageSizeAndBleed.height = s.width;\n      } else {\n        // return {\n        pageSizeAndBleed.width = s.width;\n        pageSizeAndBleed.height = s.height;\n      }\n    }\n  }\n  const marksCV = style[\"marks\"];\n  const bleedCV = style[\"bleed\"];\n  const marks =\n    marksCV && !Css.isDefaultingValue(marksCV.value)\n      ? marksCV.value\n      : Css.ident.none;\n  const bleed =\n    bleedCV && !Css.isDefaultingValue(bleedCV.value)\n      ? bleedCV.value\n      : Css.ident.auto;\n  if (bleed === Css.ident.auto) {\n    // \"('auto' value) Computes to 6pt if marks has crop and to zero\n    // otherwise.\" https://drafts.csswg.org/css-page/#valdef-page-bleed-auto\n    if (marks !== Css.ident.none) {\n      let hasCrop = false;\n      if (marks.isSpaceList()) {\n        hasCrop = (marks as Css.SpaceList).values.some(\n          (v) => v === Css.ident.crop,\n        );\n      } else {\n        hasCrop = marks === Css.ident.crop;\n      }\n      if (hasCrop) {\n        pageSizeAndBleed.bleed = new Css.Numeric(6, \"pt\");\n      }\n    }\n  } else if (bleed.isNumeric()) {\n    pageSizeAndBleed.bleed = bleed as Css.Numeric;\n  }\n\n  // crop-offset (Issue #913)\n  const cropOffsetCV = style[\"crop-offset\"];\n  const cropOffset =\n    cropOffsetCV && !Css.isDefaultingValue(cropOffsetCV.value)\n      ? cropOffsetCV.value\n      : Css.ident.auto;\n  if (cropOffset === Css.ident.auto) {\n    if (marks !== Css.ident.none) {\n      pageSizeAndBleed.bleedOffset = defaultBleedOffset;\n    }\n  } else if (cropOffset.isNumeric()) {\n    pageSizeAndBleed.cropOffset = cropOffset as Css.Numeric;\n  }\n  return pageSizeAndBleed;\n}\n\nexport type EvaluatedPageSizeAndBleed = {\n  pageWidth: number;\n  pageHeight: number;\n  bleed: number;\n  bleedOffset: number;\n  cropOffset: number;\n};\n\n/**\n * Evaluate actual page width, height and bleed from style specified in page\n * context.\n */\nexport function evaluatePageSizeAndBleed(\n  pageSizeAndBleed: PageSizeAndBleed,\n  context: Exprs.Context,\n): EvaluatedPageSizeAndBleed {\n  const evaluated = {} as EvaluatedPageSizeAndBleed;\n  const bleed =\n    Math.max(0, pageSizeAndBleed.bleed.num) *\n    context.queryUnitSize(pageSizeAndBleed.bleed.unit, false);\n  const bleedOffset =\n    !pageSizeAndBleed.cropOffset.num && pageSizeAndBleed.bleedOffset.num\n      ? pageSizeAndBleed.bleedOffset.num *\n        context.queryUnitSize(pageSizeAndBleed.bleedOffset.unit, false)\n      : Math.max(\n          0,\n          pageSizeAndBleed.cropOffset.num *\n            context.queryUnitSize(pageSizeAndBleed.cropOffset.unit, false) -\n            bleed,\n        );\n  const cropOffset = bleed + bleedOffset;\n  const width = pageSizeAndBleed.width;\n  if (width === Css.fullWidth) {\n    if (context.pref.defaultPaperSize) {\n      evaluated.pageWidth =\n        context.pref.defaultPaperSize.width *\n        context.queryUnitSize(\"px\", false);\n    } else {\n      evaluated.pageWidth =\n        (context.pref.spreadView\n          ? Math.floor(context.viewportWidth / 2) - context.pref.pageBorder\n          : context.viewportWidth) -\n        cropOffset * 2;\n    }\n  } else {\n    evaluated.pageWidth = width.num * context.queryUnitSize(width.unit, false);\n  }\n  const height = pageSizeAndBleed.height;\n  if (height === Css.fullHeight) {\n    if (context.pref.defaultPaperSize) {\n      evaluated.pageHeight =\n        context.pref.defaultPaperSize.height *\n        context.queryUnitSize(\"px\", false);\n    } else {\n      evaluated.pageHeight = context.viewportHeight - cropOffset * 2;\n    }\n  } else {\n    evaluated.pageHeight =\n      height.num * context.queryUnitSize(height.unit, false);\n  }\n  evaluated.bleed = bleed;\n  evaluated.bleedOffset = bleedOffset;\n  evaluated.cropOffset = cropOffset;\n  return evaluated;\n}\n\n/**\n * Create an 'svg' element for a printer mark.\n */\nexport function createPrinterMarkSvg(\n  doc: Document,\n  width: number,\n  height: number,\n): Element {\n  const mark = doc.createElementNS(Base.NS.SVG, \"svg\");\n  mark.setAttribute(\"width\", width);\n  mark.setAttribute(\"height\", height);\n  mark.style.position = \"absolute\";\n  return mark;\n}\n\n/**\n * Create an SVG element for a printer mark line.\n * @param elementType Specifies which type of element to create. Default value\n *     is \"polyline\".\n */\nexport function createPrinterMarkElement(\n  doc: Document,\n  lineWidth: number,\n  lineColor: Css.Val,\n  elementType?: string,\n): Element {\n  elementType = elementType || \"polyline\";\n  const line = doc.createElementNS(Base.NS.SVG, elementType);\n  line.setAttribute(\n    \"stroke\",\n    lineColor === Css.ident.auto ? \"#010101\" : lineColor.toString(),\n  );\n  line.setAttribute(\"stroke-width\", lineWidth);\n  line.setAttribute(\"fill\", \"none\");\n  return line;\n}\n\n/**\n * Position of a corner mark\n * @enum {string}\n */\nexport enum CornerMarkPosition {\n  TOP_LEFT = \"top left\",\n  TOP_RIGHT = \"top right\",\n  BOTTOM_LEFT = \"bottom left\",\n  BOTTOM_RIGHT = \"bottom right\",\n}\n\n/**\n * Create a corner mark.\n */\nexport function createCornerMark(\n  doc: Document,\n  position: CornerMarkPosition,\n  lineWidth: number,\n  lineColor: Css.Val,\n  cropMarkLineLength: number,\n  bleed: number,\n  offset: number,\n): Element {\n  let bleedMarkLineLength = cropMarkLineLength;\n\n  // bleed mark line should be longer than bleed + 2mm\n  if (bleedMarkLineLength <= bleed + 2 * Exprs.defaultUnitSizes[\"mm\"]) {\n    bleedMarkLineLength = bleed + cropMarkLineLength / 2;\n  }\n  const maxLineLength = Math.max(cropMarkLineLength, bleedMarkLineLength);\n  const svgWidth = bleed + maxLineLength + lineWidth / 2;\n  const mark = createPrinterMarkSvg(doc, svgWidth, svgWidth);\n  let points1 = [\n    [0, bleed + cropMarkLineLength],\n    [cropMarkLineLength, bleed + cropMarkLineLength],\n    [cropMarkLineLength, bleed + cropMarkLineLength - bleedMarkLineLength],\n  ];\n\n  // reflect with respect to y=x\n  let points2 = points1.map((p) => [p[1], p[0]]);\n  if (\n    position === CornerMarkPosition.TOP_RIGHT ||\n    position === CornerMarkPosition.BOTTOM_RIGHT\n  ) {\n    // reflect with respect to a vertical axis\n    points1 = points1.map((p) => [bleed + maxLineLength - p[0], p[1]]);\n    points2 = points2.map((p) => [bleed + maxLineLength - p[0], p[1]]);\n  }\n  if (\n    position === CornerMarkPosition.BOTTOM_LEFT ||\n    position === CornerMarkPosition.BOTTOM_RIGHT\n  ) {\n    // reflect with respect to a vertical axis\n    points1 = points1.map((p) => [p[0], bleed + maxLineLength - p[1]]);\n    points2 = points2.map((p) => [p[0], bleed + maxLineLength - p[1]]);\n  }\n  const line1 = createPrinterMarkElement(doc, lineWidth, lineColor);\n  line1.setAttribute(\"points\", points1.map((p) => p.join(\",\")).join(\" \"));\n  mark.appendChild(line1);\n  const line2 = createPrinterMarkElement(doc, lineWidth, lineColor);\n  line2.setAttribute(\"points\", points2.map((p) => p.join(\",\")).join(\" \"));\n  mark.appendChild(line2);\n  position.split(\" \").forEach((side) => {\n    (mark as any).style[side] = `${offset}px`;\n  });\n  return mark;\n}\n\n/**\n * Position of a cross mark\n * @enum {string}\n */\nexport enum CrossMarkPosition {\n  TOP = \"top\",\n  BOTTOM = \"bottom\",\n  LEFT = \"left\",\n  RIGHT = \"right\",\n}\n\n/**\n * Create a cross mark.\n */\nexport function createCrossMark(\n  doc: Document,\n  position: CrossMarkPosition,\n  lineWidth: number,\n  lineColor: Css.Val,\n  lineLength: number,\n  offset: number,\n): Element {\n  const longLineLength = lineLength * 2;\n  let width: number;\n  let height: number;\n  if (\n    position === CrossMarkPosition.TOP ||\n    position === CrossMarkPosition.BOTTOM\n  ) {\n    width = longLineLength;\n    height = lineLength;\n  } else {\n    width = lineLength;\n    height = longLineLength;\n  }\n  const mark = createPrinterMarkSvg(doc, width, height);\n  const horizontalLine = createPrinterMarkElement(doc, lineWidth, lineColor);\n  horizontalLine.setAttribute(\n    \"points\",\n    `0,${height / 2} ${width},${height / 2}`,\n  );\n  mark.appendChild(horizontalLine);\n  const verticalLine = createPrinterMarkElement(doc, lineWidth, lineColor);\n  verticalLine.setAttribute(\"points\", `${width / 2},0 ${width / 2},${height}`);\n  mark.appendChild(verticalLine);\n  const circle = createPrinterMarkElement(doc, lineWidth, lineColor, \"circle\");\n  circle.setAttribute(\"cx\", width / 2);\n  circle.setAttribute(\"cy\", height / 2);\n  circle.setAttribute(\"r\", lineLength / 4);\n  mark.appendChild(circle);\n  let opposite: CrossMarkPosition;\n  switch (position) {\n    case CrossMarkPosition.TOP:\n      opposite = CrossMarkPosition.BOTTOM;\n      break;\n    case CrossMarkPosition.BOTTOM:\n      opposite = CrossMarkPosition.TOP;\n      break;\n    case CrossMarkPosition.LEFT:\n      opposite = CrossMarkPosition.RIGHT;\n      break;\n    case CrossMarkPosition.RIGHT:\n      opposite = CrossMarkPosition.LEFT;\n      break;\n  }\n  Object.keys(CrossMarkPosition).forEach((key) => {\n    const side = CrossMarkPosition[key];\n    if (side === position) {\n      (mark as any).style[side] = `${offset}px`;\n    } else if (side !== opposite) {\n      (mark as any).style[side] = \"0\";\n      (mark as any).style[`margin-${side}`] = \"auto\";\n    }\n  });\n  return mark;\n}\n\n/**\n * Add printer marks to the page.\n */\nexport function addPrinterMarks(\n  cascadedPageStyle: CssCascade.ElementStyle,\n  evaluatedPageSizeAndBleed: EvaluatedPageSizeAndBleed,\n  page: Vtree.Page,\n  context: Exprs.Context,\n): void {\n  let crop = false;\n  let cross = false;\n  const marks = cascadedPageStyle[\"marks\"] as CssCascade.CascadeValue;\n  if (marks) {\n    const value = marks.value;\n    if (value instanceof Css.SpaceList) {\n      value.values.forEach((v) => {\n        if (v === Css.ident.crop) {\n          crop = true;\n        } else if (v === Css.ident.cross) {\n          cross = true;\n        }\n      });\n    } else if (value === Css.ident.crop) {\n      crop = true;\n    } else if (value === Css.ident.cross) {\n      cross = true;\n    }\n  }\n\n  const bleed = evaluatedPageSizeAndBleed.bleed;\n  if (!crop && !cross) {\n    return;\n  }\n  const container = page.container;\n  const doc = container.ownerDocument as Document;\n  Asserts.assert(doc);\n  const lineWidth = Css.toNumber(defaultPrinterMarkLineWidth, context);\n  const printerMarkOffset = Math.max(\n    0,\n    evaluatedPageSizeAndBleed.bleedOffset -\n      Css.toNumber(defaultPrinterMarkLineLength, context),\n  );\n  const lineLength = evaluatedPageSizeAndBleed.bleedOffset - printerMarkOffset;\n\n  const lineColorCV = cascadedPageStyle[\n    \"crop-marks-line-color\"\n  ] as CssCascade.CascadeValue;\n  const lineColor =\n    lineColorCV && !Css.isDefaultingValue(lineColorCV.value)\n      ? lineColorCV.value\n      : Css.ident.auto;\n\n  // corner marks\n  if (crop) {\n    Object.keys(CornerMarkPosition).forEach((key) => {\n      const position = CornerMarkPosition[key];\n      const mark = createCornerMark(\n        doc,\n        position,\n        lineWidth,\n        lineColor,\n        lineLength,\n        bleed,\n        printerMarkOffset,\n      );\n      container.appendChild(mark);\n    });\n  }\n\n  // cross marks\n  if (cross) {\n    Object.keys(CrossMarkPosition).forEach((key) => {\n      const position = CrossMarkPosition[key];\n      const mark = createCrossMark(\n        doc,\n        position,\n        lineWidth,\n        lineColor,\n        lineLength,\n        printerMarkOffset,\n      );\n      container.appendChild(mark);\n    });\n  }\n}\n\n/**\n * Properties transferred from the PageRuleMaster to the PageRulePartition\n */\nexport const propertiesAppliedToPartition = (() => {\n  const sides = [\n    \"left\",\n    \"right\",\n    \"top\",\n    \"bottom\",\n    \"before\",\n    \"after\",\n    \"start\",\n    \"end\",\n    \"block-start\",\n    \"block-end\",\n    \"inline-start\",\n    \"inline-end\",\n    \"inside\",\n    \"outside\",\n  ];\n  const props = {\n    width: true,\n    height: true,\n    \"block-size\": true,\n    \"inline-size\": true,\n    margin: true,\n    padding: true,\n    border: true,\n    outline: true,\n    \"outline-width\": true,\n    \"outline-style\": true,\n    \"outline-color\": true,\n    \"border-radius\": true,\n    \"border-top-left-radius\": true,\n    \"border-top-right-radius\": true,\n    \"border-bottom-right-radius\": true,\n    \"border-bottom-left-radius\": true,\n    \"border-start-start-radius\": true,\n    \"border-start-end-radius\": true,\n    \"border-end-start-radius\": true,\n    \"border-end-end-radius\": true,\n    \"box-shadow\": true,\n    \"box-sizing\": true,\n  };\n  sides.forEach((side) => {\n    props[`margin-${side}`] = true;\n    props[`padding-${side}`] = true;\n    props[`border-${side}-width`] = true;\n    props[`border-${side}-style`] = true;\n    props[`border-${side}-color`] = true;\n  });\n  return props;\n})();\n\n/**\n * Represents position of a margin box along the variable dimension of the page.\n * START and END can be interpreted as 'inline-start' and 'inline-end' in\n * horizontal and vertical writing modes. For example, for top margin boxes\n * (@top-left-corner, @top-left, @top-center, @top-right, @top-right-corner),\n * @top-left corresponds to START, @top-center to CENTER, and @top-right to END.\n * The corner boxes (@top-left-corner and @top-right-corner) have a 'null'\n * position.\n * @enum {string}\n */\nexport enum MarginBoxPositionAlongVariableDimension {\n  START = \"start\",\n  CENTER = \"center\",\n  END = \"end\",\n}\n\nexport type PageMarginBoxInformation = {\n  order: number;\n  isInTopRow: boolean;\n  isInBottomRow: boolean;\n  isInLeftColumn: boolean;\n  isInRightColumn: boolean;\n  positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension;\n};\n\n/**\n * Page-margin boxes.\n * @dict\n */\nexport const pageMarginBoxes: { [key: string]: PageMarginBoxInformation } = {\n  \"top-left-corner\": {\n    order: 1,\n    isInTopRow: true,\n    isInBottomRow: false,\n    isInLeftColumn: true,\n    isInRightColumn: false,\n    positionAlongVariableDimension: null,\n  },\n  \"top-left\": {\n    order: 2,\n    isInTopRow: true,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: false,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.START,\n  },\n  \"top-center\": {\n    order: 3,\n    isInTopRow: true,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: false,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.CENTER,\n  },\n  \"top-right\": {\n    order: 4,\n    isInTopRow: true,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: false,\n    positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n  },\n  \"top-right-corner\": {\n    order: 5,\n    isInTopRow: true,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: true,\n    positionAlongVariableDimension: null,\n  },\n  \"right-top\": {\n    order: 6,\n    isInTopRow: false,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: true,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.START,\n  },\n  \"right-middle\": {\n    order: 7,\n    isInTopRow: false,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: true,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.CENTER,\n  },\n  \"right-bottom\": {\n    order: 8,\n    isInTopRow: false,\n    isInBottomRow: false,\n    isInLeftColumn: false,\n    isInRightColumn: true,\n    positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n  },\n  \"bottom-right-corner\": {\n    order: 9,\n    isInTopRow: false,\n    isInBottomRow: true,\n    isInLeftColumn: false,\n    isInRightColumn: true,\n    positionAlongVariableDimension: null,\n  },\n  \"bottom-right\": {\n    order: 10,\n    isInTopRow: false,\n    isInBottomRow: true,\n    isInLeftColumn: false,\n    isInRightColumn: false,\n    positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n  },\n  \"bottom-center\": {\n    order: 11,\n    isInTopRow: false,\n    isInBottomRow: true,\n    isInLeftColumn: false,\n    isInRightColumn: false,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.CENTER,\n  },\n  \"bottom-left\": {\n    order: 12,\n    isInTopRow: false,\n    isInBottomRow: true,\n    isInLeftColumn: false,\n    isInRightColumn: false,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.START,\n  },\n  \"bottom-left-corner\": {\n    order: 13,\n    isInTopRow: false,\n    isInBottomRow: true,\n    isInLeftColumn: true,\n    isInRightColumn: false,\n    positionAlongVariableDimension: null,\n  },\n  \"left-bottom\": {\n    order: 14,\n    isInTopRow: false,\n    isInBottomRow: false,\n    isInLeftColumn: true,\n    isInRightColumn: false,\n    positionAlongVariableDimension: MarginBoxPositionAlongVariableDimension.END,\n  },\n  \"left-middle\": {\n    order: 15,\n    isInTopRow: false,\n    isInBottomRow: false,\n    isInLeftColumn: true,\n    isInRightColumn: false,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.CENTER,\n  },\n  \"left-top\": {\n    order: 16,\n    isInTopRow: false,\n    isInBottomRow: false,\n    isInLeftColumn: true,\n    isInRightColumn: false,\n    positionAlongVariableDimension:\n      MarginBoxPositionAlongVariableDimension.START,\n  },\n};\n\n/**\n * Names for page-margin boxes order in the default painting order.\n */\nexport const pageMarginBoxNames: string[] = (() => {\n  const boxes = pageMarginBoxes;\n  return Object.keys(boxes).sort((a, b) => boxes[a].order - boxes[b].order);\n})();\n\n/**\n * Indicates that the page master is generated for `@page` rules.\n */\nexport const pageRuleMasterPseudoName = \"vivliostyle-page-rule-master\";\n\n/**\n * Key for properties in margin contexts.\n * Styles in margin contexts are stored in pageStyle[\"_marginBoxes\"][(margin\n * box's name)].\n */\nexport const marginBoxesKey: string = \"_marginBoxes\";\n\n/**\n * Represent a page master generated for `@page` rules\n * @param style Cascaded style for `@page` rules\n */\nexport class PageRuleMaster extends PageMaster.PageMaster<PageRuleMasterInstance> {\n  private pageMarginBoxes = {} as {\n    [key: string]: PageMarginBoxPartition;\n  };\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    parent: PageMaster.RootPageBox,\n    style: CssCascade.ElementStyle,\n  ) {\n    super(scope, null, pageRuleMasterPseudoName, [], parent, null, 0);\n    const pageSize = resolvePageSizeAndBleed(style as any);\n    const partition = new PageRulePartition(this.scope, this, style, pageSize);\n    this.createPageMarginBoxes(style);\n    this.applySpecified(style, pageSize);\n  }\n\n  /**\n   * Create page-margin boxes\n   */\n  createPageMarginBoxes(style: CssCascade.ElementStyle) {\n    const marginBoxesMap = style[marginBoxesKey];\n    if (marginBoxesMap) {\n      pageMarginBoxNames.forEach((name) => {\n        if (marginBoxesMap[name]) {\n          this.pageMarginBoxes[name] = new PageMarginBoxPartition(\n            this.scope,\n            this,\n            name,\n            style,\n          );\n        }\n      });\n    }\n  }\n\n  /**\n   * Transfer cascaded style for `@page` rules to 'specified' style of this\n   * PageBox\n   */\n  private applySpecified(style: CssCascade.ElementStyle, pageSize: PageSize) {\n    this.specified[\"position\"] = new CssCascade.CascadeValue(\n      Css.ident.relative,\n      0,\n    );\n    this.specified[\"width\"] = new CssCascade.CascadeValue(pageSize.width, 0);\n    this.specified[\"height\"] = new CssCascade.CascadeValue(pageSize.height, 0);\n    for (const name in style) {\n      if (!propertiesAppliedToPartition[name] && name !== \"background-clip\") {\n        this.specified[name] = style[name];\n      }\n    }\n  }\n\n  override createInstance(\n    parentInstance: PageMaster.PageBoxInstance,\n  ): PageRuleMasterInstance {\n    return new PageRuleMasterInstance(parentInstance, this);\n  }\n}\n\n/**\n * Represent a partition placed in a PageRuleMaster\n * @param style Cascaded style for `@page` rules\n */\nexport class PageRulePartition extends PageMaster.Partition<PageRulePartitionInstance> {\n  constructor(\n    scope: Exprs.LexicalScope,\n    parent: PageRuleMaster,\n    style: CssCascade.ElementStyle,\n    public readonly pageSize: PageSize,\n  ) {\n    super(scope, null, null, [], parent);\n    const partition = new PageAreaPartition(this.scope, this);\n    this.applySpecified(style);\n  }\n\n  /**\n   * Transfer cascaded style for `@page` rules to 'specified' style of this\n   * PageBox\n   */\n  private applySpecified(style: CssCascade.ElementStyle) {\n    this.specified[\"wrap-flow\"] = new CssCascade.CascadeValue(\n      Css.ident.auto,\n      0,\n    );\n    this.specified[\"z-index\"] = new CssCascade.CascadeValue(new Css.Int(0), 0);\n    this.specified[\"position\"] = new CssCascade.CascadeValue(\n      Css.ident.absolute,\n      0,\n    );\n    this.specified[\"overflow\"] = new CssCascade.CascadeValue(\n      Css.ident.visible,\n      0,\n    );\n    for (const prop in propertiesAppliedToPartition) {\n      if (propertiesAppliedToPartition.hasOwnProperty(prop)) {\n        this.specified[prop] = style[prop];\n      }\n    }\n  }\n\n  override createInstance(\n    parentInstance: PageMaster.PageBoxInstance,\n  ): PageRulePartitionInstance {\n    return new PageRulePartitionInstance(parentInstance, this);\n  }\n}\n\nexport class PageAreaPartition extends PageMaster.Partition<PageAreaPartitionInstance> {\n  constructor(scope: Exprs.LexicalScope, parent: PageRulePartition) {\n    super(scope, null, null, [], parent);\n    this.specified[\"flow-from\"] = new CssCascade.CascadeValue(\n      Css.getName(\"body\"),\n      0,\n    );\n  }\n\n  override createInstance(\n    parentInstance: PageMaster.PageBoxInstance,\n  ): PageMaster.PageBoxInstance {\n    return new PageAreaPartitionInstance(parentInstance, this);\n  }\n}\n\n/**\n * Represent a partition for a page-margin box\n */\nexport class PageMarginBoxPartition extends PageMaster.Partition<PageMarginBoxPartitionInstance> {\n  constructor(\n    scope: Exprs.LexicalScope,\n    parent: PageRuleMaster,\n    public readonly marginBoxName: string,\n    style: CssCascade.ElementStyle,\n  ) {\n    super(scope, null, null, [], parent);\n    this.applySpecified(style);\n  }\n\n  /**\n   * Transfer cascaded style for `@page` rules to 'specified' style of this\n   * PageMarginBox\n   */\n  applySpecified(style: CssCascade.ElementStyle) {\n    const ownStyle = style[marginBoxesKey][\n      this.marginBoxName\n    ] as CssCascade.ElementStyle;\n\n    // Inherit properties in the page context to the page-margin context\n    for (const prop in style) {\n      const val = style[prop] as CssCascade.CascadeValue;\n      const ownVal = ownStyle[prop] as CssCascade.CascadeValue;\n      if (\n        CssCascade.inheritedProps[prop] ||\n        (ownVal && ownVal.value === Css.ident.inherit)\n      ) {\n        this.specified[prop] = val;\n      }\n    }\n    for (const prop in ownStyle) {\n      if (Object.prototype.hasOwnProperty.call(ownStyle, prop)) {\n        const val = ownStyle[prop] as CssCascade.CascadeValue;\n        if (\n          val &&\n          val.value !== Css.empty &&\n          val.value !== Css.ident.inherit &&\n          val.value !== Css.ident.unset &&\n          val.value !== Css.ident.revert\n        ) {\n          this.specified[prop] = val;\n        }\n      }\n    }\n  }\n\n  override createInstance(\n    parentInstance: PageMaster.PageBoxInstance,\n  ): PageMaster.PageBoxInstance {\n    return new PageMarginBoxPartitionInstance(parentInstance, this);\n  }\n}\n\n//---------------------------- Instance --------------------------------\nexport type PageAreaDimension = {\n  borderBoxWidth: Exprs.Val;\n  borderBoxHeight: Exprs.Val;\n  marginTop: Exprs.Val;\n  marginBottom: Exprs.Val;\n  marginLeft: Exprs.Val;\n  marginRight: Exprs.Val;\n};\n\nexport class PageRuleMasterInstance extends PageMaster.PageMasterInstance<PageRuleMaster> {\n  pageAreaDimension: PageAreaDimension | null = null;\n  pageMarginBoxInstances: {\n    [key: string]: PageMarginBoxPartitionInstance;\n  } = {};\n\n  constructor(\n    parentInstance: PageMaster.PageBoxInstance,\n    pageRuleMaster: PageRuleMaster,\n  ) {\n    super(parentInstance, pageRuleMaster);\n  }\n\n  override applyCascadeAndInit(\n    cascade: CssCascade.CascadeInstance,\n    docElementStyle: CssCascade.ElementStyle,\n  ): void {\n    const style = this.cascaded;\n    for (const name in docElementStyle) {\n      if (Object.prototype.hasOwnProperty.call(docElementStyle, name)) {\n        switch (name) {\n          case \"writing-mode\":\n          case \"direction\":\n            style[name] = docElementStyle[name];\n        }\n      }\n    }\n    super.applyCascadeAndInit(cascade, docElementStyle);\n  }\n\n  override initHorizontal(): void {\n    const style = this.style;\n    style[\"left\"] = Css.numericZero;\n    style[\"margin-left\"] = Css.numericZero;\n    style[\"border-left-width\"] = Css.numericZero;\n    style[\"padding-left\"] = Css.numericZero;\n    style[\"padding-right\"] = Css.numericZero;\n    style[\"border-right-width\"] = Css.numericZero;\n    style[\"margin-right\"] = Css.numericZero;\n    style[\"right\"] = Css.numericZero;\n  }\n\n  override initVertical(): void {\n    const style = this.style;\n\n    style[\"top\"] = Css.numericZero;\n    style[\"margin-top\"] = Css.numericZero;\n    style[\"border-top-width\"] = Css.numericZero;\n    style[\"padding-top\"] = Css.numericZero;\n    style[\"padding-bottom\"] = Css.numericZero;\n    style[\"border-bottom-width\"] = Css.numericZero;\n    style[\"margin-bottom\"] = Css.numericZero;\n    style[\"bottom\"] = Css.numericZero;\n  }\n\n  setPageAreaDimension(dim: PageAreaDimension) {\n    this.pageAreaDimension = dim;\n    const style = this.style;\n    style[\"width\"] = new Css.Expr(dim.borderBoxWidth);\n    style[\"height\"] = new Css.Expr(dim.borderBoxHeight);\n    style[\"padding-left\"] = new Css.Expr(dim.marginLeft);\n    style[\"padding-right\"] = new Css.Expr(dim.marginRight);\n    style[\"padding-top\"] = new Css.Expr(dim.marginTop);\n    style[\"padding-bottom\"] = new Css.Expr(dim.marginBottom);\n  }\n\n  override adjustPageLayout(\n    context: Exprs.Context,\n    page: Vtree.Page,\n    clientLayout: Vtree.ClientLayout,\n  ) {\n    const marginBoxContainers = page.marginBoxes;\n    const horizontalDimensions = {\n      start: this.pageAreaDimension.marginLeft,\n      end: this.pageAreaDimension.marginRight,\n      extent: this.pageAreaDimension.borderBoxWidth,\n    };\n    const verticalDimensions = {\n      start: this.pageAreaDimension.marginTop,\n      end: this.pageAreaDimension.marginBottom,\n      extent: this.pageAreaDimension.borderBoxHeight,\n    };\n    this.sizeMarginBoxesAlongVariableDimension(\n      marginBoxContainers.top,\n      true,\n      horizontalDimensions,\n      context,\n      clientLayout,\n    );\n    this.sizeMarginBoxesAlongVariableDimension(\n      marginBoxContainers.bottom,\n      true,\n      horizontalDimensions,\n      context,\n      clientLayout,\n    );\n    this.sizeMarginBoxesAlongVariableDimension(\n      marginBoxContainers.left,\n      false,\n      verticalDimensions,\n      context,\n      clientLayout,\n    );\n    this.sizeMarginBoxesAlongVariableDimension(\n      marginBoxContainers.right,\n      false,\n      verticalDimensions,\n      context,\n      clientLayout,\n    );\n  }\n\n  /**\n   * Determine and set margin boxes' sizes along variable dimension using an\n   * algorithm specified in CSS Paged Media spec.\n   * @param marginBoxContainers Containers corresponding to the target margin\n   *     boxes in one page edge (top, bottom, left, right)\n   * @param isHorizontal Indicates if the target margin boxes are on the\n   *     horizontal edge (top or bottom) or not (left or right).\n   * @param dimensions Page dimensions. start: margin-left or margin-top. end:\n   *     margin-right or margin-bottom. extent: border-box width or height of\n   *     the page area (= available width or height for the target margin boxes)\n   */\n  private sizeMarginBoxesAlongVariableDimension(\n    marginBoxContainers: { [key: string]: Vtree.Container },\n    isHorizontal: boolean,\n    dimensions: { start: Exprs.Val; end: Exprs.Val; extent: Exprs.Val },\n    context: Exprs.Context,\n    clientLayout: Vtree.ClientLayout,\n  ) {\n    const START = MarginBoxPositionAlongVariableDimension.START;\n    const CENTER = MarginBoxPositionAlongVariableDimension.CENTER;\n    const END = MarginBoxPositionAlongVariableDimension.END;\n\n    // prepare parameters\n    const scope = this.pageBox.scope;\n    const containers: {\n      [key in MarginBoxPositionAlongVariableDimension]?: Vtree.Container;\n    } = {};\n    const boxInstances: {\n      [key in MarginBoxPositionAlongVariableDimension]?: PageMarginBoxPartitionInstance;\n    } = {};\n    const boxParams: {\n      [key in MarginBoxPositionAlongVariableDimension]?: MarginBoxSizingParam;\n    } = {};\n    for (const name in marginBoxContainers) {\n      const boxInfo = pageMarginBoxes[name];\n      if (boxInfo) {\n        const container = marginBoxContainers[name];\n        const boxInstance = this.pageMarginBoxInstances[name];\n        const boxParam = new SingleBoxMarginBoxSizingParam(\n          container,\n          boxInstance.style,\n          isHorizontal,\n          scope,\n          clientLayout,\n        );\n        containers[boxInfo.positionAlongVariableDimension] = container;\n        boxInstances[boxInfo.positionAlongVariableDimension] = boxInstance;\n        boxParams[boxInfo.positionAlongVariableDimension] = boxParam;\n      }\n    }\n\n    // determine sizes\n    const evaluatedDim = {\n      start: dimensions.start.evaluate(context) as number,\n      end: dimensions.end.evaluate(context) as number,\n      extent: dimensions.extent.evaluate(context) as number,\n    };\n    let sizes = this.getSizesOfMarginBoxesAlongVariableDimension(\n      boxParams,\n      evaluatedDim.extent,\n    );\n    let needRecalculate: boolean = false;\n\n    // Check max-width/max-height\n    const maxOuterSizes: {\n      [key in MarginBoxPositionAlongVariableDimension]?: number;\n    } = {};\n    Object.keys(containers).forEach((n) => {\n      const name = n as MarginBoxPositionAlongVariableDimension;\n      const maxSize = PageMaster.toExprAuto(\n        scope,\n        boxInstances[name].style[isHorizontal ? \"max-width\" : \"max-height\"],\n        dimensions.extent,\n      );\n      if (maxSize) {\n        const evaluatedMaxSize = maxSize.evaluate(context) as number;\n        if (sizes[name] > evaluatedMaxSize) {\n          const p = (boxParams[name] = new FixedSizeMarginBoxSizingParam(\n            containers[name],\n            boxInstances[name].style,\n            isHorizontal,\n            scope,\n            clientLayout,\n            evaluatedMaxSize,\n          ));\n          maxOuterSizes[name] = p.getOuterSize();\n          needRecalculate = true;\n        }\n      }\n    });\n    if (needRecalculate) {\n      sizes = this.getSizesOfMarginBoxesAlongVariableDimension(\n        boxParams,\n        evaluatedDim.extent,\n      );\n      needRecalculate = false;\n      [START, CENTER, END].forEach((name) => {\n        sizes[name] = maxOuterSizes[name] ?? sizes[name];\n      });\n    }\n\n    // Check min-width/min-height\n    const minOuterSizes: {\n      [key in MarginBoxPositionAlongVariableDimension]?: number;\n    } = {};\n    Object.keys(containers).forEach((n) => {\n      const name = n as MarginBoxPositionAlongVariableDimension;\n      const minSize = PageMaster.toExprAuto(\n        scope,\n        boxInstances[name].style[isHorizontal ? \"min-width\" : \"min-height\"],\n        dimensions.extent,\n      );\n      if (minSize) {\n        const evaluatedMinSize = minSize.evaluate(context) as number;\n        if (sizes[name] < evaluatedMinSize) {\n          const p = (boxParams[name] = new FixedSizeMarginBoxSizingParam(\n            containers[name],\n            boxInstances[name].style,\n            isHorizontal,\n            scope,\n            clientLayout,\n            evaluatedMinSize,\n          ));\n          minOuterSizes[name] = p.getOuterSize();\n          needRecalculate = true;\n        }\n      }\n    });\n    if (needRecalculate) {\n      sizes = this.getSizesOfMarginBoxesAlongVariableDimension(\n        boxParams,\n        evaluatedDim.extent,\n      );\n      [START, CENTER, END].forEach((name) => {\n        sizes[name] = minOuterSizes[name] || sizes[name];\n      });\n    }\n\n    // set sizes\n    const endEdge = evaluatedDim.start + evaluatedDim.extent;\n    const startEndSum =\n      evaluatedDim.start + (evaluatedDim.start + evaluatedDim.extent);\n    [START, CENTER, END].forEach((name) => {\n      const outerSize = sizes[name];\n      if (outerSize != null) {\n        const container = containers[name];\n        let offset = 0;\n        switch (name) {\n          case START:\n            offset = isHorizontal ? container.left : container.top;\n            break;\n          case CENTER:\n            offset = (startEndSum - outerSize) / 2;\n            break;\n          case END:\n            offset = endEdge - outerSize;\n            break;\n        }\n        if (isHorizontal) {\n          container.setHorizontalPosition(\n            offset,\n            outerSize - container.getInsetLeft() - container.getInsetRight(),\n          );\n        } else {\n          container.setVerticalPosition(\n            offset,\n            outerSize - container.getInsetTop() - container.getInsetBottom(),\n          );\n        }\n      }\n    });\n  }\n\n  private getSizesOfMarginBoxesAlongVariableDimension(\n    boxParams: {\n      [key in MarginBoxPositionAlongVariableDimension]?: MarginBoxSizingParam;\n    },\n    availableSize: number,\n  ): { [key in MarginBoxPositionAlongVariableDimension]?: number } {\n    const startBoxParam =\n      boxParams[MarginBoxPositionAlongVariableDimension.START];\n    const centerBoxParam =\n      boxParams[MarginBoxPositionAlongVariableDimension.CENTER];\n    const endBoxParam = boxParams[MarginBoxPositionAlongVariableDimension.END];\n    const sizes: {\n      [key in MarginBoxPositionAlongVariableDimension]?: number;\n    } = {};\n    if (!centerBoxParam) {\n      const startEndSizes = this.distributeAutoMarginBoxSizes(\n        startBoxParam,\n        endBoxParam,\n        availableSize,\n      );\n      if (startEndSizes.xSize != null) {\n        sizes[MarginBoxPositionAlongVariableDimension.START] =\n          startEndSizes.xSize;\n      }\n      if (startEndSizes.ySize != null) {\n        sizes[MarginBoxPositionAlongVariableDimension.END] =\n          startEndSizes.ySize;\n      }\n    } else {\n      const params = [startBoxParam, endBoxParam];\n      const startEndBoxParam = new MultipleBoxesMarginBoxSizingParam(params);\n      const centerSizes = this.distributeAutoMarginBoxSizes(\n        centerBoxParam,\n        startEndBoxParam,\n        availableSize,\n      );\n      if (centerSizes.xSize != null) {\n        sizes[MarginBoxPositionAlongVariableDimension.CENTER] =\n          centerSizes.xSize;\n      }\n      const centerSize = centerSizes.xSize ?? centerBoxParam.getOuterSize();\n      // Ensure the calculated size is not negative, which can happen if the center content exceeds the available space.\n      const startEndAutoSize = Math.max((availableSize - centerSize) / 2, 0);\n      if (startBoxParam) {\n        sizes[MarginBoxPositionAlongVariableDimension.START] =\n          startBoxParam.hasAutoSize()\n            ? startEndAutoSize\n            : startBoxParam.getOuterSize();\n      }\n      if (endBoxParam) {\n        sizes[MarginBoxPositionAlongVariableDimension.END] =\n          endBoxParam.hasAutoSize()\n            ? startEndAutoSize\n            : endBoxParam.getOuterSize();\n      }\n    }\n    return sizes;\n  }\n\n  /**\n   * Distribute auto margin sizes among two margin boxes using an algorithm\n   * specified in CSS Paged Media spec.\n   * @param x Parameter for the first margin box. null if the box is not\n   *     generated.\n   * @param y Parameter for the second margin box. null if the box is not\n   *     generated.\n   * @param availableSize Available size for the margin boxes.\n   * @returns Determined sizes for the two boxes. Each value is present only\n   *     when the size of the corresponding box is 'auto'.\n   */\n  private distributeAutoMarginBoxSizes(\n    x: MarginBoxSizingParam,\n    y: MarginBoxSizingParam,\n    availableSize: number,\n  ): { xSize: number | null; ySize: number | null } {\n    const result: { xSize: number | null; ySize: number | null } = {\n      xSize: null,\n      ySize: null,\n    };\n\n    // Sizing with min-content/max-content/fit-content support\n    if (x instanceof SingleBoxMarginBoxSizingParam && x.minMaxFitContent) {\n      result.xSize = x.getOuterSize();\n    }\n    if (y instanceof SingleBoxMarginBoxSizingParam && y.minMaxFitContent) {\n      result.ySize = y.getOuterSize();\n    }\n\n    if (x && y) {\n      if (x.hasAutoSize() && y.hasAutoSize()) {\n        const xOuterMaxContentSize = x.getOuterMaxContentSize();\n        const yOuterMaxContentSize = y.getOuterMaxContentSize();\n        if (xOuterMaxContentSize > 0 && yOuterMaxContentSize > 0) {\n          const maxContentSizeSum = xOuterMaxContentSize + yOuterMaxContentSize;\n          if (maxContentSizeSum < availableSize) {\n            result.xSize =\n              (availableSize * xOuterMaxContentSize) / maxContentSizeSum;\n          } else {\n            const xOuterMinContentSize = x.getOuterMinContentSize();\n            const yOuterMinContentSize = y.getOuterMinContentSize();\n            const minContentSizeSum =\n              xOuterMinContentSize + yOuterMinContentSize;\n            if (minContentSizeSum < availableSize) {\n              result.xSize =\n                xOuterMinContentSize +\n                ((availableSize - minContentSizeSum) *\n                  (xOuterMaxContentSize - xOuterMinContentSize)) /\n                  (maxContentSizeSum - minContentSizeSum);\n            } else if (minContentSizeSum > 0) {\n              result.xSize =\n                (availableSize * xOuterMinContentSize) / minContentSizeSum;\n            }\n          }\n          if (result.xSize > 0) {\n            result.ySize = availableSize - result.xSize;\n          }\n        } else if (xOuterMaxContentSize > 0) {\n          result.xSize = availableSize;\n        } else if (yOuterMaxContentSize > 0) {\n          result.ySize = availableSize;\n        }\n      } else if (x.hasAutoSize()) {\n        result.xSize = Math.max(availableSize - y.getOuterSize(), 0);\n      } else if (y.hasAutoSize()) {\n        result.ySize = Math.max(availableSize - x.getOuterSize(), 0);\n      }\n    } else if (x) {\n      if (x.hasAutoSize()) {\n        result.xSize = availableSize;\n      }\n    } else if (y) {\n      if (y.hasAutoSize()) {\n        result.ySize = availableSize;\n      }\n    }\n    return result;\n  }\n\n  override prepareContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n    clientLayout: Vtree.ClientLayout,\n  ): void {\n    // Add an attribute to the element so that it can be referred from external\n    // style sheets.\n    container.element.setAttribute(\"data-vivliostyle-page-box\", true);\n    super.prepareContainer(context, container, page, docFaces, clientLayout);\n  }\n}\n\n/**\n * Interface used for parameters passed to distributeAutoMarginBoxSizes method.\n */\ninterface MarginBoxSizingParam {\n  hasAutoSize(): boolean;\n\n  getOuterMaxContentSize(): number;\n\n  getOuterMinContentSize(): number;\n\n  getOuterSize(): number;\n}\n\n/**\n * MarginBoxSizingParam for a single page-margin box.\n * @param container A container corresponding to the target margin box.\n * @param style Styles specified to the target margin box.\n */\nclass SingleBoxMarginBoxSizingParam implements MarginBoxSizingParam {\n  private hasAutoSize_: boolean;\n  private size: { [key in Sizing.Size]: number } | null = null;\n  public readonly minMaxFitContent:\n    | \"min-content\"\n    | \"max-content\"\n    | \"fit-content\"\n    | null = null;\n\n  constructor(\n    protected readonly container: Vtree.Container,\n    style: { [key: string]: Css.Val },\n    protected readonly isHorizontal: boolean,\n    scope: Exprs.LexicalScope,\n    private readonly clientLayout: Vtree.ClientLayout,\n  ) {\n    const val = style[isHorizontal ? \"width\" : \"height\"];\n    this.hasAutoSize_ =\n      !val || val === Css.ident.auto || Css.isDefaultingValue(val);\n\n    this.minMaxFitContent =\n      val instanceof Css.Ident &&\n      (val.name === \"min-content\" ||\n        val.name === \"max-content\" ||\n        val.name === \"fit-content\")\n        ? val.name\n        : null;\n\n    if (this.minMaxFitContent) {\n      const size = this.getSize();\n      if (this.isHorizontal) {\n        const width =\n          size[\n            this.minMaxFitContent === \"min-content\"\n              ? Sizing.Size.MIN_CONTENT_WIDTH\n              : this.minMaxFitContent === \"max-content\"\n                ? Sizing.Size.MAX_CONTENT_WIDTH\n                : Sizing.Size.FIT_CONTENT_WIDTH\n          ];\n        this.container.setHorizontalPosition(this.container.left, width);\n      } else {\n        const height =\n          size[\n            this.minMaxFitContent === \"min-content\"\n              ? Sizing.Size.MIN_CONTENT_HEIGHT\n              : this.minMaxFitContent === \"max-content\"\n                ? Sizing.Size.MAX_CONTENT_HEIGHT\n                : Sizing.Size.FIT_CONTENT_HEIGHT\n          ];\n        this.container.setVerticalPosition(this.container.top, height);\n      }\n    }\n  }\n\n  /** @override */\n  hasAutoSize(): boolean {\n    return this.hasAutoSize_;\n  }\n\n  private getSize(): { [key in Sizing.Size]: number } {\n    if (!this.size) {\n      const sizes = this.isHorizontal\n        ? [\n            Sizing.Size.MAX_CONTENT_WIDTH,\n            Sizing.Size.MIN_CONTENT_WIDTH,\n            Sizing.Size.FIT_CONTENT_WIDTH,\n          ]\n        : [\n            Sizing.Size.MAX_CONTENT_HEIGHT,\n            Sizing.Size.MIN_CONTENT_HEIGHT,\n            Sizing.Size.FIT_CONTENT_HEIGHT,\n          ];\n      this.size = Sizing.getSize(\n        this.clientLayout,\n        this.container.element,\n        sizes,\n      );\n    }\n    return this.size;\n  }\n\n  /** @override */\n  getOuterMaxContentSize(): number {\n    const size = this.getSize();\n    if (this.isHorizontal) {\n      return (\n        this.container.getInsetLeft() +\n        size[Sizing.Size.MAX_CONTENT_WIDTH] +\n        this.container.getInsetRight()\n      );\n    } else {\n      return (\n        this.container.getInsetTop() +\n        size[Sizing.Size.MAX_CONTENT_HEIGHT] +\n        this.container.getInsetBottom()\n      );\n    }\n  }\n\n  /** @override */\n  getOuterMinContentSize(): number {\n    const size = this.getSize();\n    if (this.isHorizontal) {\n      return (\n        this.container.getInsetLeft() +\n        size[Sizing.Size.MIN_CONTENT_WIDTH] +\n        this.container.getInsetRight()\n      );\n    } else {\n      return (\n        this.container.getInsetTop() +\n        size[Sizing.Size.MIN_CONTENT_HEIGHT] +\n        this.container.getInsetBottom()\n      );\n    }\n  }\n\n  /** @override */\n  getOuterSize(): number {\n    if (this.isHorizontal) {\n      return (\n        this.container.getInsetLeft() +\n        this.container.width +\n        this.container.getInsetRight()\n      );\n    } else {\n      return (\n        this.container.getInsetTop() +\n        this.container.height +\n        this.container.getInsetBottom()\n      );\n    }\n  }\n}\n\n/**\n * MarginBoxSizingParam with which multiple margin boxes are treated as one\n * margin box. Each method querying a dimension returns the maximum of the boxes\n * multiplied by the number of the boxes.\n * @param params MarginBoxSizingParam's of the target margin boxes. It allows empty\n *     parameters, which are treated as zero-sized boxes.\n */\nclass MultipleBoxesMarginBoxSizingParam implements MarginBoxSizingParam {\n  constructor(\n    private readonly params: (MarginBoxSizingParam | null | undefined)[],\n  ) {}\n\n  /** @override */\n  hasAutoSize(): boolean {\n    return this.params.some((p) => p?.hasAutoSize() ?? false);\n  }\n\n  /** @override */\n  getOuterMaxContentSize(): number {\n    const sizes = this.params.map((p) => p?.getOuterMaxContentSize() ?? 0);\n    return Math.max.apply(null, sizes) * sizes.length;\n  }\n\n  /** @override */\n  getOuterMinContentSize(): number {\n    const sizes = this.params.map((p) => p?.getOuterMinContentSize() ?? 0);\n    return Math.max.apply(null, sizes) * sizes.length;\n  }\n\n  /** @override */\n  getOuterSize(): number {\n    const sizes = this.params.map((p) => p?.getOuterSize() ?? 0);\n    return Math.max.apply(null, sizes) * sizes.length;\n  }\n}\n\n/**\n * MarginBoxSizingParam for a single page-margin box with a fixed size along the\n * variable dimension.\n * @param container A container corresponding to the target margin box.\n * @param style Styles specified to the target margin box.\n * @param size The fixed size (width or height) along the variable dimension.\n */\nclass FixedSizeMarginBoxSizingParam extends SingleBoxMarginBoxSizingParam {\n  private fixedSize: number;\n\n  constructor(\n    container: Vtree.Container,\n    style: { [key: string]: Css.Val },\n    isHorizontal: boolean,\n    scope: Exprs.LexicalScope,\n    clientLayout: Vtree.ClientLayout,\n    size: number,\n  ) {\n    super(container, style, isHorizontal, scope, clientLayout);\n    this.fixedSize = size;\n  }\n\n  override hasAutoSize(): boolean {\n    return false;\n  }\n\n  override getOuterMaxContentSize(): number {\n    return this.getOuterSize();\n  }\n\n  override getOuterMinContentSize(): number {\n    return this.getOuterSize();\n  }\n\n  override getOuterSize(): number {\n    if (this.isHorizontal) {\n      return (\n        this.container.getInsetLeft() +\n        this.fixedSize +\n        this.container.getInsetRight()\n      );\n    } else {\n      return (\n        this.container.getInsetTop() +\n        this.fixedSize +\n        this.container.getInsetBottom()\n      );\n    }\n  }\n}\n\nexport class PageRulePartitionInstance extends PageMaster.PartitionInstance<PageRulePartition> {\n  borderBoxWidth: Exprs.Val = null;\n  borderBoxHeight: Exprs.Val = null;\n  contentBoxWidth: Exprs.Val = null;\n  contentBoxHeight: Exprs.Val = null;\n  marginTop: Exprs.Val = null;\n  marginRight: Exprs.Val = null;\n  marginBottom: Exprs.Val = null;\n  marginLeft: Exprs.Val = null;\n\n  constructor(\n    parentInstance: PageMaster.PageBoxInstance,\n    pageRulePartition: PageRulePartition,\n  ) {\n    super(parentInstance, pageRulePartition);\n  }\n\n  override applyCascadeAndInit(\n    cascade: CssCascade.CascadeInstance,\n    docElementStyle: CssCascade.ElementStyle,\n  ): void {\n    for (const name in docElementStyle) {\n      if (name.match(/^background-/)) {\n        this.cascaded[name] = docElementStyle[name];\n      }\n    }\n    super.applyCascadeAndInit(cascade, docElementStyle);\n    const pageRuleMasterInstance = this\n      .parentInstance as PageRuleMasterInstance;\n    pageRuleMasterInstance.setPageAreaDimension({\n      borderBoxWidth: this.borderBoxWidth,\n      borderBoxHeight: this.borderBoxHeight,\n      marginTop: this.marginTop,\n      marginRight: this.marginRight,\n      marginBottom: this.marginBottom,\n      marginLeft: this.marginLeft,\n    });\n  }\n\n  override initHorizontal(): void {\n    const dim = this.resolvePageBoxDimensions({\n      start: \"left\",\n      end: \"right\",\n      extent: \"width\",\n    });\n    this.borderBoxWidth = dim.borderBoxExtent;\n    this.contentBoxWidth = dim.contentBoxExtent;\n    this.marginLeft = dim.marginStart;\n    this.marginRight = dim.marginEnd;\n  }\n\n  override initVertical(): void {\n    const dim = this.resolvePageBoxDimensions({\n      start: \"top\",\n      end: \"bottom\",\n      extent: \"height\",\n    });\n    this.borderBoxHeight = dim.borderBoxExtent;\n    this.contentBoxHeight = dim.contentBoxExtent;\n    this.marginTop = dim.marginStart;\n    this.marginBottom = dim.marginEnd;\n  }\n\n  /**\n   * Calculate page dimensions as specified in CSS Paged Media\n   * (http://dev.w3.org/csswg/css-page/#page-model) Page border box extent and\n   * margins. Since the containing block can be resized in the over-constrained\n   * case, the sum of these values is not necessarily same to the original page\n   * dimension specified in the page at-rules.\n   */\n  private resolvePageBoxDimensions(names: {\n    start: \"top\" | \"left\";\n    end: \"bottom\" | \"right\";\n    extent: \"width\" | \"height\";\n  }): {\n    borderBoxExtent: Exprs.Val;\n    contentBoxExtent: Exprs.Val;\n    marginStart: Exprs.Val;\n    marginEnd: Exprs.Val;\n  } {\n    const style = this.style;\n    const pageSize = this.pageBox.pageSize;\n    const scope = this.pageBox.scope;\n    const startSide = names.start;\n    const endSide = names.end;\n    const extentName = names.extent;\n    const pageExtent = pageSize[extentName].toExpr(scope, null);\n    let extent = PageMaster.toExprAuto(scope, style[extentName], pageExtent);\n    let marginStart = PageMaster.toExprAuto(\n      scope,\n      style[`margin-${startSide}`],\n      pageExtent,\n    );\n    let marginEnd = PageMaster.toExprAuto(\n      scope,\n      style[`margin-${endSide}`],\n      pageExtent,\n    );\n    const paddingStart = PageMaster.toExprZero(\n      scope,\n      style[`padding-${startSide}`],\n      pageExtent,\n    );\n    const paddingEnd = PageMaster.toExprZero(\n      scope,\n      style[`padding-${endSide}`],\n      pageExtent,\n    );\n    const borderStartWidth = PageMaster.toExprZeroBorder(\n      scope,\n      style[`border-${startSide}-width`],\n      style[`border-${startSide}-style`],\n      pageExtent,\n    );\n    const borderEndWidth = PageMaster.toExprZeroBorder(\n      scope,\n      style[`border-${endSide}-width`],\n      style[`border-${endSide}-style`],\n      pageExtent,\n    );\n    const borderPaddingSum = Exprs.add(\n      scope,\n      Exprs.add(scope, borderStartWidth, paddingStart),\n      Exprs.add(scope, borderEndWidth, paddingEnd),\n    );\n\n    // The dimensions are calculated as for a non-replaced block element in\n    // normal flow (http://www.w3.org/TR/CSS21/visudet.html#blockwidth)\n    let marginSum: Exprs.Val;\n    let borderBoxExtent: Exprs.Val;\n    let contentBoxExtent: Exprs.Val;\n    if (!extent) {\n      if (!marginStart) {\n        marginStart = scope.zero;\n      }\n      if (!marginEnd) {\n        marginEnd = scope.zero;\n      }\n      marginSum = Exprs.add(scope, marginStart, marginEnd);\n      borderBoxExtent = Exprs.sub(scope, pageExtent, marginSum);\n      contentBoxExtent = Exprs.sub(scope, borderBoxExtent, borderPaddingSum);\n      extent = this.borderBoxSizing ? borderBoxExtent : contentBoxExtent;\n    } else {\n      if (this.borderBoxSizing) {\n        borderBoxExtent = extent;\n        contentBoxExtent = Exprs.sub(scope, borderBoxExtent, borderPaddingSum);\n      } else {\n        contentBoxExtent = extent;\n        borderBoxExtent = Exprs.add(scope, contentBoxExtent, borderPaddingSum);\n      }\n      marginSum = Exprs.sub(scope, pageExtent, borderBoxExtent);\n      if (!marginStart && !marginEnd) {\n        marginStart = Exprs.mul(scope, marginSum, new Exprs.Const(scope, 0.5));\n        marginEnd = marginStart;\n      } else if (marginStart) {\n        marginEnd = Exprs.sub(scope, marginSum, marginStart);\n      } else {\n        marginStart = Exprs.sub(scope, marginSum, marginEnd);\n      }\n    }\n\n    // TODO over-constrained case\n    // \"if the values are over-constrained, instead of ignoring any margins, the\n    // containing block is resized to coincide with the margin edges of the page\n    // box.\" (CSS Paged Media http://dev.w3.org/csswg/css-page/#page-model)\n\n    style[startSide] = new Css.Expr(marginStart);\n    style[endSide] = new Css.Expr(marginEnd);\n    style[`margin-${startSide}`] = Css.numericZero;\n    style[`margin-${endSide}`] = Css.numericZero;\n    style[`border-${startSide}-width`] = new Css.Expr(borderStartWidth);\n    style[`border-${endSide}-width`] = new Css.Expr(borderEndWidth);\n    style[`padding-${startSide}`] = new Css.Expr(paddingStart);\n    style[`padding-${endSide}`] = new Css.Expr(paddingEnd);\n    style[extentName] = new Css.Expr(extent);\n    style[`max-${extentName}`] = new Css.Expr(extent);\n    return {\n      borderBoxExtent,\n      contentBoxExtent,\n      marginStart,\n      marginEnd,\n    };\n  }\n\n  override prepareContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n    clientLayout: Vtree.ClientLayout,\n  ): void {\n    container.element.setAttribute(\n      \"data-vivliostyle-page-area-container\",\n      true,\n    );\n    super.prepareContainer(context, container, page, docFaces, clientLayout);\n  }\n}\n\nexport class PageAreaPartitionInstance extends PageMaster.PartitionInstance<PageAreaPartition> {\n  constructor(\n    parentInstance: PageMaster.PageBoxInstance,\n    pageAreaPartition: PageAreaPartition,\n  ) {\n    super(parentInstance, pageAreaPartition);\n  }\n\n  override applyCascadeAndInit(\n    cascade: CssCascade.CascadeInstance,\n    docElementStyle: CssCascade.ElementStyle,\n  ): void {\n    for (const name in docElementStyle) {\n      if (name.match(/^column.*$/)) {\n        this.cascaded[name] = docElementStyle[name];\n      }\n    }\n    super.applyCascadeAndInit(cascade, {});\n  }\n\n  override initHorizontal(): void {\n    const style = this.style;\n    const parentStyle = this.parentInstance.style;\n    const scope = this.pageBox.scope;\n    style[\"left\"] = parentStyle[\"padding-left\"];\n    style[\"width\"] = new Css.Expr(\n      (this.parentInstance as PageRulePartitionInstance).contentBoxWidth,\n    );\n\n    // Use negative margins and transparent borders to improve text selection behavior.\n    style[\"margin-left\"] = new Css.Expr(\n      new Exprs.Negate(scope, parentStyle[\"left\"].toExpr(scope, null)),\n    );\n    style[\"margin-right\"] = new Css.Expr(\n      new Exprs.Negate(scope, parentStyle[\"right\"].toExpr(scope, null)),\n    );\n    style[\"border-left-width\"] = parentStyle[\"left\"];\n    style[\"border-right-width\"] = parentStyle[\"right\"];\n    style[\"border-left-style\"] = Css.ident.solid;\n    style[\"border-right-style\"] = Css.ident.solid;\n    style[\"border-left-color\"] = Css.ident.transparent;\n    style[\"border-right-color\"] = Css.ident.transparent;\n  }\n\n  override initVertical(): void {\n    const style = this.style;\n    const parentStyle = this.parentInstance.style;\n    const scope = this.pageBox.scope;\n    style[\"top\"] = parentStyle[\"padding-top\"];\n    style[\"height\"] = new Css.Expr(\n      (this.parentInstance as PageRulePartitionInstance).contentBoxHeight,\n    );\n\n    // Use negative margins and transparent borders to improve text selection behavior.\n    style[\"margin-top\"] = new Css.Expr(\n      new Exprs.Negate(scope, parentStyle[\"top\"].toExpr(scope, null)),\n    );\n    style[\"margin-bottom\"] = new Css.Expr(\n      new Exprs.Negate(scope, parentStyle[\"bottom\"].toExpr(scope, null)),\n    );\n    style[\"border-top-width\"] = parentStyle[\"top\"];\n    style[\"border-bottom-width\"] = parentStyle[\"bottom\"];\n    style[\"border-top-style\"] = Css.ident.solid;\n    style[\"border-bottom-style\"] = Css.ident.solid;\n    style[\"border-top-color\"] = Css.ident.transparent;\n    style[\"border-bottom-color\"] = Css.ident.transparent;\n  }\n\n  override prepareContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n    clientLayout: Vtree.ClientLayout,\n  ): void {\n    container.element.setAttribute(\"data-vivliostyle-page-area\", true);\n    page.pageAreaElement = container.element;\n    super.prepareContainer(context, container, page, docFaces, clientLayout);\n\n    // Set page area size for vw/vh unit calculation\n    context.pageAreaWidth = container.width;\n    context.pageAreaHeight = container.height;\n  }\n}\n\nexport class PageMarginBoxPartitionInstance extends PageMaster.PartitionInstance<PageMarginBoxPartition> {\n  boxInfo: PageMarginBoxInformation;\n  suppressEmptyBoxGeneration: boolean = true;\n\n  constructor(\n    parentInstance: PageMaster.PageBoxInstance,\n    pageMarginBoxPartition: PageMarginBoxPartition,\n  ) {\n    super(parentInstance, pageMarginBoxPartition);\n    const name = pageMarginBoxPartition.marginBoxName;\n    this.boxInfo = pageMarginBoxes[name];\n    const pageRuleMasterInstance = parentInstance as PageRuleMasterInstance;\n    pageRuleMasterInstance.pageMarginBoxInstances[name] = this;\n  }\n\n  override prepareContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    docFaces: Font.DocumentFaces,\n    clientLayout: Vtree.ClientLayout,\n  ): void {\n    container.element.setAttribute(\n      \"data-vivliostyle-page-margin-box\",\n      this.pageBox.marginBoxName,\n    );\n    this.applyVerticalAlign(context, container.element);\n    super.prepareContainer(context, container, page, docFaces, clientLayout);\n  }\n\n  private applyVerticalAlign(context: Exprs.Context, element: Element) {\n    Base.setCSSProperty(element, \"display\", \"flex\");\n    Base.setCSSProperty(\n      element,\n      \"flex-flow\",\n      this.vertical ? (this.rtl ? \"row-reverse\" : \"row\") : \"column\",\n    );\n    const verticalAlign: Css.Val = this.getProp(context, \"vertical-align\");\n    let flexAlign: string | null = null;\n    if (verticalAlign === Css.getName(\"middle\")) {\n      flexAlign = \"center\";\n    } else if (verticalAlign === Css.getName(\"top\")) {\n      flexAlign = \"flex-start\";\n    } else if (verticalAlign === Css.getName(\"bottom\")) {\n      flexAlign = \"flex-end\";\n    }\n    if (flexAlign) {\n      Base.setCSSProperty(element, \"justify-content\", flexAlign);\n    }\n    const content: Css.Val = this.getProp(context, \"content\");\n    if (\n      this.vertical ||\n      content instanceof Css.URL ||\n      (content instanceof Css.Expr &&\n        content.expr instanceof Exprs.Native &&\n        content.expr.str.startsWith(\"running-element-\"))\n    ) {\n      let align = \"center\";\n      if (this.boxInfo.isInTopRow || this.boxInfo.isInBottomRow) {\n        if (\n          this.boxInfo.isInLeftColumn ||\n          this.boxInfo.positionAlongVariableDimension ===\n            MarginBoxPositionAlongVariableDimension.END\n        ) {\n          align = this.vertical || this.rtl ? \"start\" : \"end\";\n        } else if (\n          this.boxInfo.isInRightColumn ||\n          this.boxInfo.positionAlongVariableDimension ===\n            MarginBoxPositionAlongVariableDimension.START\n        ) {\n          align = this.vertical || this.rtl ? \"end\" : \"start\";\n        }\n      }\n      Base.setCSSProperty(element, \"align-items\", align);\n    }\n  }\n\n  /**\n   * Calculate page-margin boxes positions along the variable dimension of the\n   * page. For CENTER and END margin boxes, the position is calculated only if\n   * the dimension (width or height) is non-auto, so that it can be resolved at\n   * this point. If the dimension is auto, the calculation is deferred.\n   */\n  private positionAlongVariableDimension(\n    names: {\n      start: \"top\" | \"left\";\n      end: \"bottom\" | \"right\";\n      extent: \"width\" | \"height\";\n    },\n    dim: PageAreaDimension | null,\n  ): void {\n    const style = this.style;\n    const scope = this.pageBox.scope;\n    const startSide = names.start;\n    const endSide = names.end;\n    const extentName = names.extent;\n    const isHorizontal = startSide === \"left\";\n    const availableExtent = isHorizontal\n      ? dim.borderBoxWidth\n      : dim.borderBoxHeight;\n    const extent = PageMaster.toExprAuto(\n      scope,\n      style[extentName],\n      availableExtent,\n    );\n    const startOffset = isHorizontal ? dim.marginLeft : dim.marginTop;\n    if (\n      this.boxInfo.positionAlongVariableDimension ===\n      MarginBoxPositionAlongVariableDimension.START\n    ) {\n      style[startSide] = new Css.Expr(startOffset);\n    } else if (extent) {\n      const marginStart = PageMaster.toExprZero(\n        scope,\n        style[`margin-${startSide}`],\n        availableExtent,\n      );\n      const marginEnd = PageMaster.toExprZero(\n        scope,\n        style[`margin-${endSide}`],\n        availableExtent,\n      );\n      const paddingStart = PageMaster.toExprZero(\n        scope,\n        style[`padding-${startSide}`],\n        availableExtent,\n      );\n      const paddingEnd = PageMaster.toExprZero(\n        scope,\n        style[`padding-${endSide}`],\n        availableExtent,\n      );\n      const borderStartWidth = PageMaster.toExprZeroBorder(\n        scope,\n        style[`border-${startSide}-width`],\n        style[`border-${startSide}-style`],\n        availableExtent,\n      );\n      const borderEndWidth = PageMaster.toExprZeroBorder(\n        scope,\n        style[`border-${endSide}-width`],\n        style[`border-${endSide}-style`],\n        availableExtent,\n      );\n      const outerExtent = Exprs.add(\n        scope,\n        extent,\n        Exprs.add(\n          scope,\n          this.borderBoxSizing\n            ? scope.zero\n            : Exprs.add(\n                scope,\n                Exprs.add(scope, paddingStart, paddingEnd),\n                Exprs.add(scope, borderStartWidth, borderEndWidth),\n              ),\n          Exprs.add(scope, marginStart, marginEnd),\n        ),\n      );\n      switch (this.boxInfo.positionAlongVariableDimension) {\n        case MarginBoxPositionAlongVariableDimension.CENTER:\n          style[startSide] = new Css.Expr(\n            Exprs.add(\n              scope,\n              startOffset,\n              Exprs.div(\n                scope,\n                Exprs.sub(scope, availableExtent, outerExtent),\n                new Exprs.Const(scope, 2),\n              ),\n            ),\n          );\n          break;\n        case MarginBoxPositionAlongVariableDimension.END:\n          style[startSide] = new Css.Expr(\n            Exprs.sub(\n              scope,\n              Exprs.add(scope, startOffset, availableExtent),\n              outerExtent,\n            ),\n          );\n          break;\n      }\n    }\n  }\n\n  /**\n   * Calculate page-margin boxes positions along the fixed dimension of the\n   * page.\n   */\n  private positionAndSizeAlongFixedDimension(\n    names: {\n      inside: \"left\" | \"right\" | \"top\" | \"bottom\";\n      outside: \"left\" | \"right\" | \"top\" | \"bottom\";\n      extent: \"width\" | \"height\";\n    },\n    dim: PageAreaDimension | null,\n  ): void {\n    const style = this.style;\n    const scope = this.pageBox.scope;\n    const borderBoxSizing = this.borderBoxSizing;\n    const insideName = names.inside;\n    const outsideName = names.outside;\n    const extentName = names.extent;\n    const pageMargin =\n      dim[\n        `margin${outsideName.charAt(0).toUpperCase()}${outsideName.substring(\n          1,\n        )}`\n      ];\n    const marginInside = PageMaster.toExprZeroAuto(\n      scope,\n      style[`margin-${insideName}`],\n      pageMargin,\n    );\n    const marginOutside = PageMaster.toExprZeroAuto(\n      scope,\n      style[`margin-${outsideName}`],\n      pageMargin,\n    );\n    const paddingInside = PageMaster.toExprZero(\n      scope,\n      style[`padding-${insideName}`],\n      pageMargin,\n    );\n    const paddingOutside = PageMaster.toExprZero(\n      scope,\n      style[`padding-${outsideName}`],\n      pageMargin,\n    );\n    const borderInsideWidth = PageMaster.toExprZeroBorder(\n      scope,\n      style[`border-${insideName}-width`],\n      style[`border-${insideName}-style`],\n      pageMargin,\n    );\n    const borderOutsideWidth = PageMaster.toExprZeroBorder(\n      scope,\n      style[`border-${outsideName}-width`],\n      style[`border-${outsideName}-style`],\n      pageMargin,\n    );\n    const extent = PageMaster.toExprAuto(scope, style[extentName], pageMargin);\n    let result: {\n      extent: Exprs.Result;\n      marginInside: Exprs.Result;\n      marginOutside: Exprs.Result;\n    } = null;\n\n    function getComputedValues(context: Exprs.Context): {\n      extent: Exprs.Result | null;\n      marginInside: Exprs.Result | null;\n      marginOutside: Exprs.Result | null;\n    } {\n      if (result) {\n        return result;\n      }\n      result = {\n        extent: extent ? extent.evaluate(context) : null,\n        marginInside: marginInside ? marginInside.evaluate(context) : null,\n        marginOutside: marginOutside ? marginOutside.evaluate(context) : null,\n      };\n      const pageMarginValue = pageMargin.evaluate(context);\n      let borderAndPadding = 0;\n      if (!borderBoxSizing) {\n        [\n          borderInsideWidth,\n          paddingInside,\n          paddingOutside,\n          borderOutsideWidth,\n        ].forEach((x) => {\n          if (x) {\n            borderAndPadding += x.evaluate(context) as number;\n          }\n        });\n      }\n      if (result.marginInside === null || result.marginOutside === null) {\n        const total =\n          borderAndPadding +\n          (result.extent as number) +\n          (result.marginInside as number) +\n          (result.marginOutside as number);\n        if (total > pageMarginValue) {\n          if (result.marginInside === null) {\n            result.marginInside = 0;\n          }\n          if (result.marginOutside === null) {\n            result.marginOutside = 0;\n          }\n        }\n      }\n      if (\n        result.extent !== null &&\n        result.marginInside !== null &&\n        result.marginOutside !== null\n      ) {\n        // over-constrained\n        result.marginOutside = null;\n      }\n      if (result.extent === null) {\n        result.extent =\n          pageMarginValue -\n          borderAndPadding -\n          (result.marginInside as number) -\n          (result.marginOutside as number);\n        if (result.marginInside === null) {\n          result.marginInside = 0;\n        }\n        if (result.marginOutside === null) {\n          result.marginOutside = 0;\n        }\n      } else if (typeof result.extent === \"number\") {\n        if (\n          result.marginInside === null &&\n          typeof result.marginOutside === \"number\"\n        ) {\n          result.marginInside =\n            pageMarginValue -\n            borderAndPadding -\n            result.extent -\n            result.marginOutside;\n        } else if (\n          typeof result.marginInside === \"number\" &&\n          result.marginOutside === null\n        ) {\n          result.marginOutside =\n            pageMarginValue -\n            borderAndPadding -\n            result.extent -\n            result.marginInside;\n        } else {\n          result.marginInside = result.marginOutside =\n            (pageMarginValue - borderAndPadding - result.extent) / 2;\n        }\n      }\n      return result;\n    }\n    style[extentName] = new Css.Expr(\n      new Exprs.Native(\n        scope,\n        function () {\n          const value = getComputedValues(this).extent;\n          return value === null ? \"auto\" : value;\n        },\n        extentName,\n      ),\n    );\n    style[`margin-${insideName}`] = new Css.Expr(\n      new Exprs.Native(\n        scope,\n        function () {\n          const value = getComputedValues(this).marginInside;\n          return value === null ? \"auto\" : value;\n        },\n        `margin-${insideName}`,\n      ),\n    );\n    style[`margin-${outsideName}`] = new Css.Expr(\n      new Exprs.Native(\n        scope,\n        function () {\n          const value = getComputedValues(this).marginOutside;\n          return value === null ? \"auto\" : value;\n        },\n        `margin-${outsideName}`,\n      ),\n    );\n    if (insideName === \"left\") {\n      style[\"left\"] = new Css.Expr(\n        Exprs.add(scope, dim.marginLeft, dim.borderBoxWidth),\n      );\n    } else if (insideName === \"top\") {\n      style[\"top\"] = new Css.Expr(\n        Exprs.add(scope, dim.marginTop, dim.borderBoxHeight),\n      );\n    }\n  }\n\n  override initHorizontal(): void {\n    const pageRuleMasterInstance = this\n      .parentInstance as PageRuleMasterInstance;\n    const dim = pageRuleMasterInstance.pageAreaDimension;\n    if (this.boxInfo.isInLeftColumn) {\n      this.positionAndSizeAlongFixedDimension(\n        { inside: \"right\", outside: \"left\", extent: \"width\" },\n        dim,\n      );\n    } else if (this.boxInfo.isInRightColumn) {\n      this.positionAndSizeAlongFixedDimension(\n        { inside: \"left\", outside: \"right\", extent: \"width\" },\n        dim,\n      );\n    } else {\n      this.positionAlongVariableDimension(\n        { start: \"left\", end: \"right\", extent: \"width\" },\n        dim,\n      );\n    }\n  }\n\n  override initVertical(): void {\n    const pageRuleMasterInstance = this\n      .parentInstance as PageRuleMasterInstance;\n    const dim = pageRuleMasterInstance.pageAreaDimension;\n    if (this.boxInfo.isInTopRow) {\n      this.positionAndSizeAlongFixedDimension(\n        { inside: \"bottom\", outside: \"top\", extent: \"height\" },\n        dim,\n      );\n    } else if (this.boxInfo.isInBottomRow) {\n      this.positionAndSizeAlongFixedDimension(\n        { inside: \"top\", outside: \"bottom\", extent: \"height\" },\n        dim,\n      );\n    } else {\n      this.positionAlongVariableDimension(\n        { start: \"top\", end: \"bottom\", extent: \"height\" },\n        dim,\n      );\n    }\n  }\n\n  override finishContainer(\n    context: Exprs.Context,\n    container: Vtree.Container,\n    page: Vtree.Page,\n    column: Vtree.Container | null,\n    columnCount: number,\n    clientLayout: Vtree.ClientLayout,\n    docFaces: Font.DocumentFaces,\n  ): void {\n    super.finishContainer(\n      context,\n      container,\n      page,\n      column,\n      columnCount,\n      clientLayout,\n      docFaces,\n    );\n\n    // finishContainer is called only when the margin box is generated.\n    // In this case, store the generated container for the margin box in the\n    // page object. (except when it is a corner margin box, because size of a\n    // corner margin box does not need to be adjusted after the layout)\n    const marginBoxes = page.marginBoxes;\n    const name = this.pageBox.marginBoxName;\n    const boxInfo = this.boxInfo;\n    if (!boxInfo.isInLeftColumn && !boxInfo.isInRightColumn) {\n      if (boxInfo.isInTopRow) {\n        marginBoxes.top[name] = container;\n      } else if (boxInfo.isInBottomRow) {\n        marginBoxes.bottom[name] = container;\n      }\n    } else if (!boxInfo.isInTopRow && !boxInfo.isInBottomRow) {\n      if (boxInfo.isInLeftColumn) {\n        marginBoxes.left[name] = container;\n      } else if (boxInfo.isInRightColumn) {\n        marginBoxes.right[name] = container;\n      }\n    }\n\n    // Margin box sizing with min-content/max-content/fit-content support\n    const pageAreaDimension = (this.parentInstance as PageRuleMasterInstance)\n      .pageAreaDimension;\n    const widthVal = this.getProp(context, \"width\");\n    const widthMinMaxFitContent =\n      widthVal instanceof Css.Ident &&\n      (widthVal.name === \"min-content\" ||\n        widthVal.name === \"max-content\" ||\n        widthVal.name === \"fit-content\")\n        ? widthVal.name\n        : null;\n    const minWidthVal = this.getPropAsNumber(context, \"min-width\");\n    const maxWidthVal = this.getPropAsNumber(context, \"max-width\");\n    if (widthMinMaxFitContent || minWidthVal || maxWidthVal) {\n      if (widthMinMaxFitContent) {\n        Base.setCSSProperty(container.element, \"width\", widthMinMaxFitContent);\n      }\n      if (minWidthVal) {\n        Base.setCSSProperty(container.element, \"min-width\", `${minWidthVal}px`);\n      }\n      if (maxWidthVal) {\n        Base.setCSSProperty(container.element, \"max-width\", `${maxWidthVal}px`);\n      }\n      const marginLeft = this.getProp(context, \"margin-left\");\n      const marginRight = this.getProp(context, \"margin-right\");\n      if (boxInfo.isInLeftColumn) {\n        const right =\n          (pageAreaDimension.borderBoxWidth.evaluate(context) as number) +\n          (pageAreaDimension.marginRight.evaluate(context) as number);\n        Base.setCSSProperty(container.element, \"right\", `${right}px`);\n        if (marginLeft === Css.ident.auto || marginRight !== Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-left\", \"auto\");\n        }\n        if (marginRight === Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-right\", \"auto\");\n        }\n      } else if (boxInfo.isInRightColumn) {\n        Base.setCSSProperty(container.element, \"right\", \"0\");\n        if (marginRight === Css.ident.auto || marginLeft !== Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-right\", \"auto\");\n        }\n        if (marginLeft === Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-left\", \"auto\");\n        }\n      }\n    }\n    const heightVal = this.getProp(context, \"height\");\n    const heightMinMaxFitContent =\n      heightVal instanceof Css.Ident &&\n      (heightVal.name === \"min-content\" ||\n        heightVal.name === \"max-content\" ||\n        heightVal.name === \"fit-content\")\n        ? heightVal.name\n        : null;\n    const minHeightVal = this.getPropAsNumber(context, \"min-height\");\n    const maxHeightVal = this.getPropAsNumber(context, \"max-height\");\n    if (heightMinMaxFitContent || minHeightVal || maxHeightVal) {\n      if (heightMinMaxFitContent) {\n        Base.setCSSProperty(\n          container.element,\n          \"height\",\n          heightMinMaxFitContent,\n        );\n      }\n      if (minHeightVal) {\n        Base.setCSSProperty(\n          container.element,\n          \"min-height\",\n          `${minHeightVal}px`,\n        );\n      }\n      if (maxHeightVal) {\n        Base.setCSSProperty(\n          container.element,\n          \"max-height\",\n          `${maxHeightVal}px`,\n        );\n      }\n      const marginTop = this.getProp(context, \"margin-top\");\n      const marginBottom = this.getProp(context, \"margin-bottom\");\n      if (boxInfo.isInTopRow) {\n        const bottom =\n          (pageAreaDimension.borderBoxHeight.evaluate(context) as number) +\n          (pageAreaDimension.marginBottom.evaluate(context) as number);\n        Base.setCSSProperty(container.element, \"bottom\", `${bottom}px`);\n        if (marginTop === Css.ident.auto || marginBottom !== Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-top\", \"auto\");\n        }\n        if (marginBottom === Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-bottom\", \"auto\");\n        }\n      } else if (boxInfo.isInBottomRow) {\n        Base.setCSSProperty(container.element, \"bottom\", \"0\");\n        if (marginBottom === Css.ident.auto || marginTop !== Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-bottom\", \"auto\");\n        }\n        if (marginTop === Css.ident.auto) {\n          Base.setCSSProperty(container.element, \"margin-top\", \"auto\");\n        }\n      }\n    }\n  }\n}\n\n/**\n * Dynamically generate and manage page masters corresponding to page at-rules.\n */\nexport class PageManager {\n  private pageMasterCache: any = {} as {\n    [key: string]: PageMaster.PageMasterInstance;\n  };\n  /** The cascade instance used for page rule evaluation */\n  readonly pageCascadeInstance: CssCascade.CascadeInstance;\n\n  constructor(\n    cascadeInstance: CssCascade.CascadeInstance,\n    private readonly pageScope: Exprs.LexicalScope,\n    private readonly rootPageBoxInstance: PageMaster.RootPageBoxInstance,\n    private readonly context: Exprs.Context,\n    private readonly docElementStyle: CssCascade.ElementStyle,\n  ) {\n    this.pageCascadeInstance = cascadeInstance;\n    this.definePageProgression();\n  }\n\n  /**\n   * Determine the page progression and define left/right/recto/verso pages.\n   */\n  private definePageProgression() {\n    // If a page break is forced before the root element, recto/verso pages\n    // are no longer odd/even pages. left/right are reversed too.\n    const scope = this.pageScope;\n    const styleInstance: any /* Ops.StyleInstance */ = this.context;\n    const isVersoFirstPage = styleInstance.isVersoFirstPage;\n    const pageNumber = new Exprs.Named(scope, \"page-number\");\n    const isVersoPage = new Exprs.Eq(\n      scope,\n      new Exprs.Modulo(scope, pageNumber, new Exprs.Const(scope, 2)),\n      isVersoFirstPage ? scope.one : scope.zero,\n    );\n    scope.defineName(\"recto-page\", new Exprs.Not(scope, isVersoPage));\n    scope.defineName(\"verso-page\", isVersoPage);\n    const pageProgression =\n      styleInstance.pageProgression ||\n      resolvePageProgression(this.docElementStyle);\n    if (pageProgression === Constants.PageProgression.LTR) {\n      scope.defineName(\"left-page\", isVersoPage);\n      scope.defineName(\"right-page\", new Exprs.Not(scope, isVersoPage));\n    } else {\n      scope.defineName(\"left-page\", new Exprs.Not(scope, isVersoPage));\n      scope.defineName(\"right-page\", isVersoPage);\n    }\n  }\n\n  /**\n   * Get cascaded page style specified in page context for the current page.\n   */\n  getCascadedPageStyle(pageType: string): CssCascade.ElementStyle {\n    const style = {} as CssCascade.ElementStyle;\n    this.pageCascadeInstance.pushRule([], pageType, style);\n    this.pageCascadeInstance.popRule();\n    return style;\n  }\n\n  /**\n   * Return a PageMasterInstance with page rules applied. Return a cached\n   * instance if there already exists one with the same styles.\n   * @param pageMasterInstance The original page master instance.\n   * @param cascadedPageStyle Cascaded page style specified in page context.\n   */\n  getPageRulePageMaster(\n    pageMasterInstance: PageMaster.PageMasterInstance,\n    cascadedPageStyle: CssCascade.ElementStyle,\n  ): PageMaster.PageMasterInstance {\n    const pageMaster = pageMasterInstance.pageBox as PageMaster.PageMaster;\n\n    // If no properties are specified in @page rules, use the original page\n    // master.\n    if (Object.keys(cascadedPageStyle).length === 0) {\n      pageMaster.resetScope();\n      return pageMasterInstance;\n    }\n    const key = this.makeCacheKey(cascadedPageStyle, pageMaster);\n    let applied = this.pageMasterCache[key];\n    if (!applied) {\n      if (pageMaster.pseudoName === PageMaster.userAgentPageMasterPseudo) {\n        // If the passed page master is a UA page master,\n        // ignore it and generate a new page master from @page rules.\n        applied = this.generatePageRuleMaster(cascadedPageStyle);\n      } else {\n        // Otherwise cascade some properties from @page rules to the page\n        // master.\n        applied = this.generateCascadedPageMaster(\n          cascadedPageStyle,\n          pageMaster,\n        );\n      }\n      this.pageMasterCache[key] = applied;\n    }\n    applied.pageBox.resetScope();\n    return applied;\n  }\n\n  /**\n   * Generate a cache key from the specified styles and the original page master\n   * key.\n   */\n  private makeCacheKey(\n    style: CssCascade.ElementStyle,\n    pageMaster: PageMaster.PageMaster,\n  ): string {\n    const propsStr = this.makeCascadeValueObjectKey(style);\n    const pageMod2 = (this.context as any).currentLayoutPosition?.page % 2;\n    return `${pageMaster.key}^${propsStr}^${pageMod2}`;\n  }\n\n  private makeCascadeValueObjectKey(object: CssCascade.ElementStyle): string {\n    const props = [] as string[];\n    for (const prop in object) {\n      if (Object.prototype.hasOwnProperty.call(object, prop)) {\n        const val = object[prop] as CssCascade.CascadeValue;\n        let str: string;\n        if (val instanceof CssCascade.CascadeValue) {\n          str = `${val.value}`;\n        } else {\n          str = this.makeCascadeValueObjectKey(val);\n        }\n        props.push(prop + str + (val.priority || \"\"));\n      }\n    }\n    return props.sort().join(\"^\");\n  }\n\n  private generatePageRuleMaster(\n    style: CssCascade.ElementStyle,\n  ): PageRuleMasterInstance {\n    const pageMaster = new PageRuleMaster(\n      this.pageScope,\n      this.rootPageBoxInstance.pageBox as PageMaster.RootPageBox,\n      style,\n    );\n    const pageMasterInstance = pageMaster.createInstance(\n      this.rootPageBoxInstance,\n    );\n\n    // Do the same initialization as in Ops.StyleInstance.prototype.init\n    pageMasterInstance.applyCascadeAndInit(\n      this.pageCascadeInstance,\n      this.docElementStyle,\n    );\n    pageMasterInstance.resolveAutoSizing(this.context);\n    return pageMasterInstance;\n  }\n\n  /**\n   * Cascade some properties from `@page` rules to a page master.\n   * For now, only 'width' and 'height' resolved from 'size' value are cascaded.\n   * @param style Cascaded style in the page context\n   * @param pageMaster The original page master\n   */\n  private generateCascadedPageMaster(\n    style: CssCascade.ElementStyle,\n    pageMaster: PageMaster.PageMaster,\n  ): PageMaster.PageMasterInstance {\n    const newPageMaster = pageMaster.clone({\n      pseudoName: pageRuleMasterPseudoName,\n    });\n    const pageMasterStyle = newPageMaster.specified;\n    const size = style[\"size\"] as CssCascade.CascadeValue;\n    if (size && !Css.isDefaultingValue(size.value)) {\n      const pageSize = resolvePageSizeAndBleed(style as any);\n      const priority = size.priority;\n      CssCascade.setPropCascadeValue(\n        pageMasterStyle,\n        \"width\",\n        new CssCascade.CascadeValue(pageSize.width, priority),\n        this.context,\n      );\n      CssCascade.setPropCascadeValue(\n        pageMasterStyle,\n        \"height\",\n        new CssCascade.CascadeValue(pageSize.height, priority),\n        this.context,\n      );\n    }\n\n    // Transfer counter properties to the page style so that these specified in\n    // the page master are also effective. Note that these values (if specified)\n    // always override values in page contexts.\n    [\"counter-reset\", \"counter-increment\"].forEach((name) => {\n      if (pageMasterStyle[name]) {\n        style[name] = pageMasterStyle[name];\n      }\n    });\n    const pageMasterInstance = newPageMaster.createInstance(\n      this.rootPageBoxInstance,\n    ) as PageMaster.PageMasterInstance;\n\n    // Do the same initialization as in Ops.StyleInstance.prototype.init\n    pageMasterInstance.applyCascadeAndInit(\n      this.pageCascadeInstance,\n      this.docElementStyle,\n    );\n    pageMasterInstance.resolveAutoSizing(this.context);\n    return pageMasterInstance;\n  }\n}\n\nexport class CheckPageTypeAction extends CssCascade.ChainedAction {\n  constructor(public readonly pageType: string) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    if (cascadeInstance.currentPageType === this.pageType) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 3;\n  }\n\n  override makePrimary(cascade: CssCascade.Cascade): boolean {\n    if (this.chained) {\n      cascade.insertInTable(cascade.pagetypes, this.pageType, this.chained);\n    }\n    return true;\n  }\n}\n\nexport class IsFirstPageAction extends CssCascade.ChainedAction {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const pageNumber = new Exprs.Named(this.scope, \"page-number\");\n    if (pageNumber.evaluate(cascadeInstance.context) === 1) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 2;\n  }\n}\n\nexport class IsBlankPageAction extends CssCascade.ChainedAction {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const blankPage = new Exprs.Named(this.scope, \"blank-page\");\n    if (blankPage.evaluate(cascadeInstance.context)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 2;\n  }\n}\n\nexport class IsLeftPageAction extends CssCascade.ChainedAction {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const leftPage = new Exprs.Named(this.scope, \"left-page\");\n    if (leftPage.evaluate(cascadeInstance.context)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 1;\n  }\n}\n\nexport class IsRightPageAction extends CssCascade.ChainedAction {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const rightPage = new Exprs.Named(this.scope, \"right-page\");\n    if (rightPage.evaluate(cascadeInstance.context)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 1;\n  }\n}\n\nexport class IsRectoPageAction extends CssCascade.ChainedAction {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const rectoPage = new Exprs.Named(this.scope, \"recto-page\");\n    if (rectoPage.evaluate(cascadeInstance.context)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 1;\n  }\n}\n\nexport class IsVersoPageAction extends CssCascade.ChainedAction {\n  constructor(public readonly scope: Exprs.LexicalScope) {\n    super();\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const versoPage = new Exprs.Named(this.scope, \"verso-page\");\n    if (versoPage.evaluate(cascadeInstance.context)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 1;\n  }\n}\n\nexport class IsNthPageAction extends CssCascade.IsNthAction {\n  constructor(\n    public readonly scope: Exprs.LexicalScope,\n    public readonly a: number,\n    public readonly b: number,\n  ) {\n    super(a, b);\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    const styleInstance: any /* Ops.StyleInstance */ = cascadeInstance.context;\n    let pageNumber = styleInstance.layoutPositionAtPageStart.page;\n    if (styleInstance.blankPageAtStart) {\n      pageNumber--;\n    }\n    if (pageNumber && this.matchANPlusB(pageNumber)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    return 2;\n  }\n}\n\nexport class IsNthOfPageTypeAction extends CssCascade.IsNthAction {\n  constructor(\n    public readonly scope: Exprs.LexicalScope,\n    public readonly a: number,\n    public readonly b: number,\n    public readonly pageType: string,\n  ) {\n    super(a, b);\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    if (cascadeInstance.currentPageType !== this.pageType) {\n      return;\n    }\n    // Get page count for this page type within the current page group\n    const pageTypeCount =\n      cascadeInstance.pageTypePageCounts[this.pageType] || 0;\n    if (this.matchANPlusB(pageTypeCount)) {\n      this.chained.apply(cascadeInstance);\n    }\n  }\n\n  override getPriority(): number {\n    // Same priority as CheckPageTypeAction since it includes page type check,\n    // and higher than nth-only or page-position-only actions.\n    return 3;\n  }\n}\n\n/**\n * Action applying an at-page rule\n */\nexport class ApplyPageRuleAction extends CssCascade.ApplyRuleAction {\n  constructor(style: CssCascade.ElementStyle, specificity: number) {\n    super(style, specificity, null, null, null);\n  }\n\n  override apply(cascadeInstance: CssCascade.CascadeInstance): void {\n    mergeInPageRule(\n      cascadeInstance.context,\n      cascadeInstance.currentStyle,\n      this.style,\n      this.specificity,\n      cascadeInstance,\n    );\n  }\n}\n\n/**\n * Merge page styles, including styles specified on page-margin boxes,\n * considering specificity. Intended to be used in place of\n * CssCascade.mergeIn, which is for element styles.\n */\nexport function mergeInPageRule(\n  context: Exprs.Context,\n  target: CssCascade.ElementStyle,\n  style: CssCascade.ElementStyle,\n  specificity: number,\n  cascadeInstance: CssCascade.CascadeInstance,\n): void {\n  CssCascade.mergeIn(context, target, style, specificity, null, null, null);\n  const marginBoxes = style[marginBoxesKey];\n  if (marginBoxes) {\n    const targetMap = CssCascade.getMutableStyleMap(target, marginBoxesKey);\n    for (const boxName in marginBoxes) {\n      if (marginBoxes.hasOwnProperty(boxName)) {\n        let targetBox = targetMap[boxName];\n        if (!targetBox) {\n          targetBox = {} as CssCascade.ElementStyle;\n          targetMap[boxName] = targetBox;\n        }\n        CssCascade.mergeIn(\n          context,\n          targetBox,\n          marginBoxes[boxName],\n          specificity,\n          null,\n          null,\n          null,\n        );\n      }\n    }\n  }\n}\n\n/**\n * ParserHandler for `@page` rules. It handles properties specified with page\n * contexts. It also does basic cascading (which can be done without information\n * other than the page rules themselves) and stores the result in `pageProps`\n * object as a map from page selectors to sets of properties. This result is\n * later used for adding `@page` rules to the real DOM, which are then used by\n * the PDF renderer (Chromium) to determine page sizes.\n */\nexport class PageParserHandler\n  extends CssCascade.CascadeParserHandler\n  implements CssValidator.PropertyReceiver\n{\n  private currentPageSelectors: {\n    selectors: string[] | null;\n    specificity: number;\n  }[] = [];\n  private currentNamedPageSelector: string = \"\";\n  private currentPseudoPageClassSelectors: string[] = [];\n\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    parent: CssCascade.CascadeParserHandler,\n    validatorSet: CssValidator.ValidatorSet,\n    private readonly pageProps: { [key: string]: CssCascade.ElementStyle },\n  ) {\n    super(scope, owner, parent?.condition, parent, null, validatorSet, false);\n  }\n\n  override startPageRule(): void {\n    this.startSelectorRule();\n  }\n\n  override tagSelector(ns: string | null, name: string | null): void {\n    Asserts.assert(name);\n    this.currentNamedPageSelector = name;\n    if (name) {\n      this.chain.push(new CheckPageTypeAction(name));\n      this.specificity += 65536;\n    }\n  }\n\n  override pseudoclassSelector(\n    name: string,\n    params: (number | string)[],\n  ): void {\n    name = name.toLowerCase();\n    if (params) {\n      switch (name) {\n        case \"nth\":\n          {\n            const a = params[0] as number;\n            const b = params[1] as number;\n            if (params.length === 3 && typeof params[2] === \"string\") {\n              // :nth(An+B of <page-type>) syntax\n              const pageType = params[2];\n              this.currentPseudoPageClassSelectors.push(\n                `:${name}(${a}n${b < 0 ? b : \"+\" + b} of ${pageType})`,\n              );\n              this.chain.push(\n                new IsNthOfPageTypeAction(this.scope, a, b, pageType),\n              );\n              this.specificity += 256;\n            } else {\n              // :nth(An+B) syntax - applies to document page number\n              this.currentPseudoPageClassSelectors.push(\n                `:${name}(${a}n${b < 0 ? b : \"+\" + b})`,\n              );\n              this.chain.push(new IsNthPageAction(this.scope, a, b));\n              this.specificity += 256;\n            }\n          }\n          break;\n        default:\n          this.reportAndSkip(\n            `E_INVALID_PAGE_SELECTOR :${name}(${params.join(\"\")})`,\n          );\n          break;\n      }\n    } else {\n      this.currentPseudoPageClassSelectors.push(`:${name}`);\n      switch (name) {\n        case \"first\":\n          this.chain.push(new IsFirstPageAction(this.scope));\n          this.specificity += 256;\n          break;\n        case \"blank\":\n          this.chain.push(new IsBlankPageAction(this.scope));\n          this.specificity += 256;\n          break;\n        case \"left\":\n          this.chain.push(new IsLeftPageAction(this.scope));\n          this.specificity += 1;\n          break;\n        case \"right\":\n          this.chain.push(new IsRightPageAction(this.scope));\n          this.specificity += 1;\n          break;\n        case \"recto\":\n          this.chain.push(new IsRectoPageAction(this.scope));\n          this.specificity += 1;\n          break;\n        case \"verso\":\n          this.chain.push(new IsVersoPageAction(this.scope));\n          this.specificity += 1;\n          break;\n        default:\n          this.reportAndSkip(`E_INVALID_PAGE_SELECTOR :${name}`);\n          break;\n      }\n    }\n  }\n\n  /**\n   * Save currently processed selector and reset variables.\n   */\n  private finishSelector() {\n    let selectors: string[];\n    if (\n      !this.currentNamedPageSelector &&\n      !this.currentPseudoPageClassSelectors.length\n    ) {\n      selectors = null;\n    } else {\n      selectors = [this.currentNamedPageSelector].concat(\n        this.currentPseudoPageClassSelectors.sort(),\n      );\n    }\n    this.currentPageSelectors.push({\n      selectors,\n      specificity: this.specificity,\n    });\n    this.currentNamedPageSelector = \"\";\n    this.currentPseudoPageClassSelectors = [];\n  }\n\n  override nextSelector(): void {\n    this.finishSelector();\n    super.nextSelector();\n  }\n\n  override startRuleBody(): void {\n    this.finishSelector();\n    super.startRuleBody();\n  }\n\n  override simpleProperty(name: string, value: Css.Val, important): void {\n    // we limit 'bleed' and 'marks' to be effective only when specified without\n    // page selectors\n    if (\n      (name === \"bleed\" || name === \"marks\") &&\n      !this.currentPageSelectors.some((s) => s.selectors === null)\n    ) {\n      return;\n    }\n    super.simpleProperty(name, value, important);\n    const cascVal = CssCascade.getProp(this.elementStyle, name);\n    const pageProps = this.pageProps;\n    if (name === \"bleed\" || name === \"marks\") {\n      if (!pageProps[\"\"]) {\n        pageProps[\"\"] = {} as CssCascade.ElementStyle;\n      }\n\n      // we can simply overwrite without considering specificity\n      // since 'bleed' and 'marks' always come from a page rule without page\n      // selectors.\n      Object.keys(pageProps).forEach((selector) => {\n        CssCascade.setProp(pageProps[selector], name, cascVal);\n      });\n    } else if (name === \"size\") {\n      const noPageSelectorProps = pageProps[\"\"];\n      this.currentPageSelectors.forEach((s) => {\n        // update specificity to reflect the specificity of the selector\n        const result = new CssCascade.CascadeValue(\n          cascVal.value,\n          cascVal.priority + s.specificity,\n        );\n        const selector = s.selectors ? s.selectors.join(\"\") : \"\";\n        let props = pageProps[selector];\n        if (!props) {\n          // since no properties for this selector have been stored before,\n          // we can simply set the 'size', 'bleed' and 'marks' properties.\n          props = pageProps[selector] = {} as CssCascade.ElementStyle;\n          CssCascade.setProp(props, name, result);\n          if (noPageSelectorProps) {\n            [\"bleed\", \"marks\"].forEach((n) => {\n              if (noPageSelectorProps[n]) {\n                CssCascade.setProp(\n                  props,\n                  n,\n                  noPageSelectorProps[n] as CssCascade.CascadeValue,\n                );\n              }\n            });\n          }\n        } else {\n          // consider specificity when setting 'size' property.\n          // we don't have to set 'bleed' and 'marks' since they should have\n          // been already updated.\n          CssCascade.setPropCascadeValue(props, name, result);\n        }\n      });\n    }\n  }\n\n  override insertNonPrimary(action: CssCascade.CascadeAction): void {\n    // We represent page rules without selectors by *, though it is illegal in\n    // CSS\n    this.cascade.insertInTable(this.cascade.pagetypes, \"*\", action);\n  }\n\n  override makeApplyRuleAction(\n    specificity: number,\n  ): CssCascade.ApplyRuleAction {\n    return new ApplyPageRuleAction(this.elementStyle, specificity);\n  }\n\n  override startPageMarginBoxRule(name: string): void {\n    const marginBoxMap = CssCascade.getMutableStyleMap(\n      this.elementStyle,\n      marginBoxesKey,\n    );\n    let boxStyle = marginBoxMap[name];\n    if (!boxStyle) {\n      boxStyle = {} as CssCascade.ElementStyle;\n      marginBoxMap[name] = boxStyle;\n    }\n    const handler = new PageMarginBoxParserHandler(\n      this.scope,\n      this.owner,\n      this.validatorSet,\n      boxStyle,\n    );\n    this.owner.pushHandler(handler);\n  }\n}\n\n/**\n * Parser handler for a page-margin box rule.\n */\nexport class PageMarginBoxParserHandler\n  extends CssParser.SlaveParserHandler\n  implements CssValidator.PropertyReceiver\n{\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    public readonly validatorSet: CssValidator.ValidatorSet,\n    public readonly boxStyle: CssCascade.ElementStyle,\n  ) {\n    super(scope, owner, false);\n  }\n\n  override property(name: string, value: Css.Val, important: boolean): void {\n    this.validatorSet.validatePropertyAndHandleShorthand(\n      name,\n      value,\n      important,\n      this,\n    );\n  }\n\n  /** @override */\n  invalidPropertyValue(name: string, value: Css.Val): void {\n    this.report(`E_INVALID_PROPERTY_VALUE ${name}: ${value.toString()}`);\n  }\n\n  /** @override */\n  unknownProperty(name: string, value: Css.Val): void {\n    this.report(`E_INVALID_PROPERTY ${name}: ${value.toString()}`);\n  }\n\n  /** @override */\n  simpleProperty(name: string, value: Css.Val, important): void {\n    const specificity = important\n      ? this.getImportantSpecificity()\n      : this.getBaseSpecificity();\n    const cascval = new CssCascade.CascadeValue(value, specificity);\n    CssCascade.setProp(this.boxStyle, name, cascval);\n  }\n}\n","/**\n * Copyright 2022 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Scripts - Supports JavaScript in source document.\n */\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport * as Logging from \"./logging\";\nimport * as TaskUtil from \"./task-util\";\n\n/**\n * Enable or disable JavaScript in html support\n */\nexport let allowScripts = true;\nexport function setAllowScripts(value: boolean): void {\n  allowScripts = value;\n}\n\nconst deferredScripts: HTMLScriptElement[] = [];\n\nfunction sameScripts(s1: HTMLScriptElement, s2: HTMLScriptElement): boolean {\n  return (\n    s1 === s2 ||\n    (s1.src || s2.src ? s1.src === s2.src : s1.textContent === s2.textContent)\n  );\n}\n\nfunction getScriptsInOrNearHead(document: Document): HTMLScriptElement[] {\n  // To support Chrome < 88 and Firefox < 84, we cannot use\n  // the selector \"body > script:not(:not(script, link, style) ~ *)\".\n  // (Issue #919)\n  const scriptsInBodyNotNearHead = Array.from(\n    document.querySelectorAll(\n      \"body > :not(script):not(link):not(style) ~ script\",\n    ),\n  ) as HTMLScriptElement[];\n  return (\n    Array.from(\n      document.querySelectorAll(\"head > script, body > script\"),\n    ) as HTMLScriptElement[]\n  ).filter((script) => !scriptsInBodyNotNearHead.includes(script));\n}\n\nexport function loadScript(\n  srcScriptElem: HTMLScriptElement,\n  window: Window,\n  flags?: { inHead?: boolean; atEnd?: boolean; forceDefer?: boolean },\n): Task.Result<boolean> {\n  if (!allowScripts) {\n    return Task.newResult(false);\n  }\n  if (\n    !flags?.inHead &&\n    !flags?.atEnd &&\n    getScriptsInOrNearHead(srcScriptElem.ownerDocument).includes(srcScriptElem)\n  ) {\n    // The script elements at beginning of body have already been processed.\n    return Task.newResult(false);\n  }\n\n  const scriptContent = srcScriptElem.textContent;\n  const src = srcScriptElem.src;\n  const isModule = srcScriptElem.type === \"module\";\n\n  // Special handling for MathJax\n  // NOTE: We support MathJax 2 only for now.\n  const isMathJax = src && src.includes(\"/MathJax.js\");\n  if (isMathJax) {\n    if (window.document.head.querySelector(\"script[src*='/MathJax.js']\")) {\n      // Ignore if MathJax is already loaded\n      return Task.newResult(true);\n    }\n    if (!window[\"MathJax\"]) {\n      // mathjax-config.js\n      window[\"MathJax\"] = {\n        MathML: {\n          extensions: [\"content-mathml.js\"],\n        },\n        showProcessingMessages: false,\n        messageStyle: \"none\",\n        skipStartupTypeset: true,\n        CommonHTML: {\n          linebreaks: {\n            automatic: true,\n          },\n        },\n        \"fast-preview\": {\n          disabled: true,\n        },\n        AuthorInit: function () {\n          window[\"MathJax\"].Hub.processSectionDelay = 0;\n        },\n      };\n    }\n  }\n\n  const async = (isModule || src) && srcScriptElem.async && !isMathJax;\n  const defer =\n    ((isModule && !async) || (src && srcScriptElem.defer)) && !isMathJax;\n  const needDefer = !flags?.atEnd && (flags?.forceDefer || defer || async);\n\n  if (!hasScripts(window)) {\n    // `window.onload = startViewer`, which was set by vivliostyle-viewer,\n    // has to be unset to prevent `startViewer` restarting because of\n    // `window.dispatchEvent(new Event(\"load\"))` in `loadScriptsAtEnd()`.\n    window.onload = null;\n  }\n\n  if (needDefer) {\n    if (!deferredScripts.some((s) => sameScripts(s, srcScriptElem))) {\n      deferredScripts.push(srcScriptElem);\n    }\n    return Task.newResult(true);\n  }\n\n  for (const s of window.document.head.getElementsByTagName(\"script\")) {\n    if (\n      s.hasAttribute(\"data-vivliostyle-scripting\") &&\n      sameScripts(s, srcScriptElem)\n    ) {\n      // If same script is already loaded, remove the already loaded one before load the new one.\n      window.document.head.removeChild(s);\n    }\n  }\n\n  const scriptElem = window.document.createElement(\"script\");\n  scriptElem.textContent = scriptContent;\n  if (src) {\n    scriptElem.src = src;\n  }\n  scriptElem.async = async;\n  scriptElem.defer = defer;\n  scriptElem.setAttribute(\"data-vivliostyle-scripting\", \"true\");\n\n  for (const attr of srcScriptElem.attributes) {\n    if (![\"src\", \"async\", \"defer\"].includes(attr.name)) {\n      scriptElem.setAttribute(attr.name, attr.value);\n    }\n  }\n  Logging.logger.debug(\"script:\", src);\n  if (!src) {\n    window.document.head.appendChild(scriptElem);\n    return Task.newResult(true);\n  } else {\n    const fetcher = Net.loadElement(scriptElem);\n    window.document.head.appendChild(scriptElem);\n    return TaskUtil.waitForFetchers([fetcher]);\n  }\n}\n\nfunction getAllFontFamilyList(\n  srcDocument: Document,\n  styler: CssStyler.Styler,\n): string {\n  const fontFamilySet = {};\n  const findFontFamilyInStyle = (style: any): void => {\n    const fontFamily = style[\"font-family\"]?.value;\n    if (fontFamily) {\n      if (fontFamily.values) {\n        for (const family1 of fontFamily.values) {\n          fontFamilySet[family1.stringValue()] = true;\n        }\n      } else {\n        fontFamilySet[fontFamily.stringValue()] = true;\n      }\n    }\n    const marginBoxes = style[\"_marginBoxes\"];\n    if (marginBoxes) {\n      for (const marginBoxStyle of Object.values(marginBoxes)) {\n        findFontFamilyInStyle(marginBoxStyle);\n      }\n    }\n  };\n  const findAllFontFamily = (arg: any): void => {\n    if (arg instanceof CssCascade.ApplyRuleAction) {\n      findFontFamilyInStyle(arg.style);\n    } else if (arg instanceof CssCascade.CascadeAction || Array.isArray(arg)) {\n      for (const v of Object.values(arg)) {\n        findAllFontFamily(v);\n      }\n    }\n  };\n  // Find all font-family values in stylesheets.\n  for (const obj of Object.values(styler.cascade.code)) {\n    for (const arg of Object.values(obj ?? {})) {\n      findAllFontFamily(arg);\n    }\n  }\n  // Find all font-family values in inline style.\n  for (const elem of srcDocument.querySelectorAll(\"[style]\")) {\n    if ((elem as HTMLElement).style?.fontFamily) {\n      fontFamilySet[(elem as HTMLElement).style.fontFamily] = true;\n    }\n  }\n  return Object.keys(fontFamilySet).join(\",\");\n}\n\nfunction prepareTextContentForWebFonts(\n  srcDocument: Document,\n  window: Window,\n  styler: CssStyler.Styler,\n): HTMLElement {\n  const textContentDiv: HTMLElement =\n    window.document.querySelector(\"[data-vivliostyle-textcontent]\") ??\n    window.document.createElement(\"div\");\n  textContentDiv.style.position = \"fixed\";\n  textContentDiv.style.fontSize = \"0\";\n  textContentDiv.setAttribute(\"data-vivliostyle-textcontent\", \"true\");\n  textContentDiv.setAttribute(\"aria-hidden\", \"true\");\n  textContentDiv.style.fontFamily = getAllFontFamilyList(srcDocument, styler);\n  textContentDiv.textContent = srcDocument.documentElement.textContent;\n  window.document.body.appendChild(textContentDiv);\n  return textContentDiv;\n}\n\nexport function loadScriptsInHead(\n  srcDocument: Document,\n  window: Window,\n  styler: CssStyler.Styler,\n): Task.Result<boolean> {\n  if (!allowScripts) {\n    return Task.newResult(false);\n  }\n  // Process script elements in head and also beginning of body\n  const srcScripts: HTMLScriptElement[] = getScriptsInOrNearHead(srcDocument);\n  if (srcScripts.length === 0) {\n    return Task.newResult(false);\n  }\n  const needPrepareForWebFonts = srcScripts.some(\n    (s) => !(s.async || s.defer || s.type === \"module\"),\n  );\n\n  // Web fonts needs text content of the document\n  const textContentDiv = needPrepareForWebFonts\n    ? prepareTextContentForWebFonts(srcDocument, window, styler)\n    : null;\n  const fonts = window.document.fonts; // FontFaceSet\n  const savedDollar = window[\"$\"];\n  let forceDefer = false;\n  const frame: Task.Frame<boolean> = Task.newFrame(\"loadScripts\");\n  frame\n    .loop(() => {\n      if (srcScripts.length === 0) {\n        if (!needPrepareForWebFonts) {\n          return Task.newResult(false); // break\n        }\n        return frame.sleep(20).thenAsync(() => {\n          if (\n            fonts.status === \"loading\" ||\n            // for Typekit Web Font Loader (Adobe Fonts)\n            window.document.documentElement.classList.contains(\"wf-loading\") ||\n            // For DynaFont\n            // FIXME: checking the global variable `ret` set in https://dfo.dynacw.co.jp/JSDynaFont/DynaFont.js\n            // would be not very good, because it seems to have been made global by mistake.\n            (window[\"FontJSON\"]?.Font &&\n              window[\"ret\"]?.readyState &&\n              window[\"ret\"].readyState < 4)\n          ) {\n            return Task.newResult(true); // continue\n          }\n          return Task.newResult(false); // break\n        });\n      }\n      const srcScriptElem = srcScripts.shift();\n      return loadScript(srcScriptElem, window, {\n        inHead: true,\n        forceDefer,\n      }).thenAsync(() => {\n        if (!forceDefer && window[\"$\"] !== savedDollar) {\n          // jQuery `$(…)` does not work before document is loaded, so need to defer\n          deferredScripts.push(srcScriptElem);\n          forceDefer = true;\n        }\n        if (srcScripts.length === 0) {\n          if (needPrepareForWebFonts) {\n            // Some web font loaders (DynaFont, FONTPLUS) need DOMContentLoaded event\n            Logging.logger.debug(\"dispatchEvent: DOMContentLoaded (document)\");\n            window.document.dispatchEvent(new Event(\"DOMContentLoaded\"));\n          }\n        }\n        return Task.newResult(true); // continue\n      });\n    })\n    .then(() => {\n      if (textContentDiv) {\n        textContentDiv.remove();\n      }\n      frame.finish(true);\n    });\n  return frame.result();\n}\n\nexport function loadScriptsAtEnd(window: Window): Task.Result<boolean> {\n  if (!allowScripts) {\n    return Task.newResult(false);\n  }\n  const frame: Task.Frame<boolean> = Task.newFrame(\"loadScripts\");\n  frame\n    .loop(() => {\n      if (deferredScripts.length === 0) {\n        return Task.newResult(false);\n      }\n      return loadScript(deferredScripts.shift(), window, {\n        atEnd: true,\n      }).thenReturn(deferredScripts.length > 0);\n    })\n    .then(() => {\n      Logging.logger.debug(\"dispatchEvent: DOMContentLoaded (window)\");\n      window.dispatchEvent(new Event(\"DOMContentLoaded\"));\n      Logging.logger.debug(\"dispatchEvent: load (window)\");\n      window.dispatchEvent(new Event(\"load\"));\n      frame.finish(true);\n    });\n  return frame.result();\n}\n\nexport function hasScripts(window: Window) {\n  if (!allowScripts) {\n    return false;\n  }\n  return (\n    deferredScripts.length > 0 ||\n    !!window.document.head.querySelector(\"script[data-vivliostyle-scripting]\")\n  );\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Urls - URL Utilities\n */\n\n/**\n * transform all urls in attributeValue using documentURLTransformer.\n *\n * @returns transformed attributeValue\n */\n\nexport const transformURIs = (\n  attributeValue,\n  baseUrl,\n  documentURLTransformer,\n) =>\n  attributeValue\n    .replace(\n      /[uU][rR][lL]\\(\\s*\"((\\\\([^0-9a-fA-F]+|[0-9a-fA-F]+\\s*)|[^\"\\r\\n])+)\"/gm,\n      (match, m1) =>\n        `url(\"${documentURLTransformer.transformURL(m1, baseUrl)}\"`,\n    )\n    .replace(\n      /[uU][rR][lL]\\(\\s*'((\\\\([^0-9a-fA-F]+|[0-9a-fA-F]+\\s*)|[^'\\r\\n])+)'/gm,\n      (match, m1) =>\n        `url('${documentURLTransformer.transformURL(m1, baseUrl)}'`,\n    )\n    .replace(\n      /[uU][rR][lL]\\(\\s*((\\\\([^0-9a-fA-F]+|[0-9a-fA-F]+\\s*)|[^\"'\\r\\n\\)\\s])+)/gm,\n      (match, m1) => `url(${documentURLTransformer.transformURL(m1, baseUrl)}`,\n    );\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Vgen - View tree generator.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssStyler from \"./css-styler\";\nimport * as Diff from \"./diff\";\nimport * as Display from \"./display\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as LayoutHelper from \"./layout-helper\";\nimport * as Logging from \"./logging\";\nimport * as Matchers from \"./matchers\";\nimport * as Net from \"./net\";\nimport * as PageFloats from \"./page-floats\";\nimport * as Plugin from \"./plugin\";\nimport * as PseudoElement from \"./pseudo-element\";\nimport * as RepetitiveElement from \"./repetitive-element\";\nimport * as Scripts from \"./scripts\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as Urls from \"./urls\";\nimport * as Vtree from \"./vtree\";\nimport * as Layout from \"./layout\";\nimport { XmlDoc } from \"./types\";\n\nconst namespacePrefixMap: { [key: string]: string } = {};\n\nexport type CustomRenderer = (\n  p1: Element,\n  p2: Element,\n  p3: { [key: string]: Css.Val },\n) => Task.Result<Element>;\n\nexport interface CustomRendererFactory {\n  makeCustomRenderer(xmldoc: XmlDoc.XMLDocHolder): CustomRenderer;\n}\n\n/**\n * Creates an epubReadingSystem object in the iframe.contentWindow.navigator\n * when load event fires.\n */\nexport function initIFrame(iframe: HTMLIFrameElement): void {\n  iframe.addEventListener(\n    \"load\",\n    () => {\n      iframe.contentWindow.navigator[\"epubReadingSystem\"] = {\n        name: \"adapt\",\n        version: \"0.1\",\n        layoutStyle: \"paginated\",\n        hasFeature: function (name, version) {\n          switch (name) {\n            case \"mouse-events\":\n              return true;\n          }\n          return false;\n        },\n      };\n    },\n    false,\n  );\n}\n\nexport interface StylerProducer {\n  getStylerForDoc(xmldoc: XmlDoc.XMLDocHolder): CssStyler.AbstractStyler;\n}\n\nexport class ViewFactory\n  extends Base.SimpleEventTarget\n  implements Vtree.LayoutContext\n{\n  private static SVG_URL_ATTRIBUTES: string[] = [\n    \"color-profile\",\n    \"clip-path\",\n    \"cursor\",\n    \"filter\",\n    \"marker\",\n    \"marker-start\",\n    \"marker-end\",\n    \"marker-mid\",\n    \"fill\",\n    \"stroke\",\n    \"mask\",\n  ];\n  document: Document;\n  exprContentListener: Vtree.ExprContentListener;\n\n  // provided by layout\n  nodeContext: Vtree.NodeContext | null = null;\n  viewRoot: Element | null = null;\n  isFootnote: boolean = false;\n  sourceNode: Node | null = null;\n  offsetInNode: number = 0;\n\n  // computed\n  // TODO: only set it on NodeContext\n  viewNode: Node | null = null;\n\n  constructor(\n    public readonly flowName: string,\n    public readonly context: Exprs.Context,\n    public readonly viewport: Viewport,\n    public readonly styler: CssStyler.Styler,\n    public readonly regionIds: string[],\n    public readonly xmldoc: XmlDoc.XMLDocHolder,\n    public readonly docFaces: Font.DocumentFaces,\n    public readonly footnoteStyle: CssCascade.ElementStyle,\n    public readonly stylerProducer: StylerProducer,\n    public readonly page: Vtree.Page,\n    public readonly customRenderer: CustomRenderer,\n    public readonly fallbackMap: { [key: string]: string },\n    public readonly documentURLTransformer: Base.DocumentURLTransformer,\n  ) {\n    super();\n    this.document = viewport.document;\n    this.exprContentListener = styler.counterListener.getExprContentListener();\n  }\n\n  /** @override */\n  clone(): Vtree.LayoutContext {\n    return new ViewFactory(\n      this.flowName,\n      this.context,\n      this.viewport,\n      this.styler,\n      this.regionIds,\n      this.xmldoc,\n      this.docFaces,\n      this.footnoteStyle,\n      this.stylerProducer,\n      this.page,\n      this.customRenderer,\n      this.fallbackMap,\n      this.documentURLTransformer,\n    );\n  }\n\n  createPseudoelementShadow(\n    element: Element,\n    isRoot: boolean,\n    cascStyle: CssCascade.ElementStyle,\n    computedStyle: { [key: string]: Css.Val },\n    styler: CssStyler.AbstractStyler,\n    context: Exprs.Context,\n    parentShadow: Vtree.ShadowContext,\n    subShadow: Vtree.ShadowContext,\n  ): Vtree.ShadowContext {\n    const pseudoMap = this.getPseudoMap(\n      cascStyle,\n      this.regionIds,\n      this.isFootnote,\n      this.nodeContext,\n      context,\n    );\n    if (!pseudoMap) {\n      return subShadow;\n    }\n    const addedNames: string[] = [];\n    const root = PseudoElement.document.createElementNS(Base.NS.SHADOW, \"root\");\n    let att = root;\n    for (const name of PseudoElement.pseudoNames) {\n      let elem: Element;\n      if (name) {\n        if (!pseudoMap[name]) {\n          continue;\n        }\n        if (name == \"footnote-marker\" && !(isRoot && this.isFootnote)) {\n          continue;\n        }\n        if (name.match(/^first-/)) {\n          const display = computedStyle[\"display\"];\n          if (!display || display === Css.ident.inline) {\n            continue;\n          }\n          const child = element.firstElementChild;\n          if (child && Vtree.canIgnore(child.previousSibling)) {\n            const childStyle = styler.getStyle(child, false);\n            if (childStyle) {\n              const childDisplay = CssCascade.getProp(childStyle, \"display\");\n              if (\n                childDisplay?.value &&\n                childDisplay.value !== Css.ident.inline\n              ) {\n                continue;\n              }\n            }\n          }\n        }\n        if (name === \"before\" || name === \"after\" || name === \"marker\") {\n          const content = pseudoMap[name][\"content\"] as CssCascade.CascadeValue;\n          if (!content || !Vtree.nonTrivialContent(content.value)) {\n            continue;\n          }\n          if (\n            name === \"marker\" &&\n            (!Display.isListItem(computedStyle[\"display\"]) ||\n              // Disable ::marker for \"toc-node\" in the TOC box\n              CssCascade.getProp(cascStyle, \"behavior\")?.value ===\n                Css.getName(\"toc-node\"))\n          ) {\n            continue;\n          }\n        }\n        addedNames.push(name);\n        elem = PseudoElement.document.createElementNS(Base.NS.XHTML, \"span\");\n        PseudoElement.setPseudoName(elem, name);\n      } else {\n        elem = PseudoElement.document.createElementNS(\n          Base.NS.SHADOW,\n          \"content\",\n        );\n      }\n      att.appendChild(elem);\n      if (name.match(/^first-/)) {\n        att = elem;\n      }\n    }\n    if (!addedNames.length) {\n      return subShadow;\n    }\n    const shadowStyler = new PseudoElement.PseudoelementStyler(\n      element,\n      cascStyle,\n      styler,\n      context,\n      this.exprContentListener,\n    );\n    return new Vtree.ShadowContext(\n      element,\n      root,\n      null,\n      parentShadow,\n      subShadow,\n      Vtree.ShadowType.ROOTLESS,\n      shadowStyler,\n    );\n  }\n\n  getPseudoMap(\n    cascStyle: CssCascade.ElementStyle,\n    regionIds: string[],\n    isFootnote: boolean,\n    nodeContext: Vtree.NodeContext,\n    context: Exprs.Context,\n  ): CssCascade.ElementStyleMap {\n    const pseudoMap = CssCascade.getStyleMap(cascStyle, \"_pseudos\");\n    if (!pseudoMap) {\n      return null;\n    }\n    const computedPseudoStyleMap: CssCascade.ElementStyleMap = {};\n    for (const key in pseudoMap) {\n      const computedPseudoStyle: { [key: string]: CssCascade.CascadeValue } =\n        (computedPseudoStyleMap[key] = {});\n      CssCascade.mergeStyle(computedPseudoStyle, pseudoMap[key], context);\n      CssCascade.mergeViewConditionalStyles(\n        computedPseudoStyle,\n        context,\n        pseudoMap[key],\n      );\n      CssCascade.forEachStylesInRegion(\n        pseudoMap[key],\n        regionIds,\n        isFootnote,\n        (regionId, regionStyle) => {\n          CssCascade.mergeStyle(computedPseudoStyle, regionStyle, context);\n          CssCascade.forEachViewConditionalStyles(\n            regionStyle,\n            (viewConditionalStyles) => {\n              CssCascade.mergeStyle(\n                computedPseudoStyle,\n                viewConditionalStyles,\n                context,\n              );\n            },\n          );\n        },\n      );\n    }\n    return computedPseudoStyleMap;\n  }\n\n  createRefShadow(\n    href: string,\n    type: Vtree.ShadowType,\n    element: Element,\n    parentShadow: Vtree.ShadowContext,\n    subShadow: Vtree.ShadowContext,\n  ): Task.Result<Vtree.ShadowContext> {\n    const frame: Task.Frame<Vtree.ShadowContext> =\n      Task.newFrame(\"createRefShadow\");\n    this.xmldoc.store.load(href).then((refDocParam) => {\n      const refDoc = refDocParam;\n      if (refDoc) {\n        const refElement = refDoc.getElement(href);\n        if (refElement) {\n          const refStyler = this.stylerProducer.getStylerForDoc(refDoc);\n          subShadow = new Vtree.ShadowContext(\n            element,\n            refElement,\n            refDoc,\n            parentShadow,\n            subShadow,\n            type,\n            refStyler,\n          );\n        }\n      }\n      frame.finish(subShadow);\n    });\n    return frame.result();\n  }\n\n  createShadows(\n    element: Element,\n    isRoot,\n    cascStyle: CssCascade.ElementStyle,\n    computedStyle: { [key: string]: Css.Val },\n    styler: CssStyler.AbstractStyler,\n    context: Exprs.Context,\n    shadowContext: Vtree.ShadowContext,\n  ): Task.Result<Vtree.ShadowContext> {\n    const frame: Task.Frame<Vtree.ShadowContext> =\n      Task.newFrame(\"createShadows\");\n    const shadow: Vtree.ShadowContext = null;\n    const templateURLVal = computedStyle[\"template\"];\n    let cont: Task.Result<Vtree.ShadowContext>;\n    if (\n      templateURLVal instanceof Css.URL ||\n      templateURLVal === Css.ident.footnote\n    ) {\n      const url =\n        templateURLVal instanceof Css.URL\n          ? templateURLVal.url\n          : Base.resolveURL(\"user-agent.xml#footnote\", Base.resourceBaseURL);\n      cont = this.createRefShadow(\n        url,\n        Vtree.ShadowType.ROOTLESS,\n        element,\n        shadowContext,\n        shadow,\n      );\n    } else {\n      cont = Task.newResult(shadow);\n    }\n    cont.then((shadow) => {\n      let cont1: Task.Result<Vtree.ShadowContext> = null;\n      if (element.namespaceURI == Base.NS.SHADOW) {\n        if (element.localName == \"include\") {\n          let href = element.getAttribute(\"href\");\n          let xmldoc: XmlDoc.XMLDocHolder = null;\n          if (href) {\n            xmldoc = shadowContext ? shadowContext.xmldoc : this.xmldoc;\n          } else if (shadowContext) {\n            if (shadowContext.owner.namespaceURI == Base.NS.XHTML) {\n              href = shadowContext.owner.getAttribute(\"href\");\n            } else {\n              href = shadowContext.owner.getAttributeNS(Base.NS.XLINK, \"href\");\n            }\n            xmldoc = shadowContext.parentShadow\n              ? shadowContext.parentShadow.xmldoc\n              : this.xmldoc;\n          }\n          if (href) {\n            href = Base.resolveURL(href, xmldoc.url);\n            cont1 = this.createRefShadow(\n              href,\n              Vtree.ShadowType.ROOTED,\n              element,\n              shadowContext,\n              shadow,\n            );\n          }\n        }\n      }\n      if (cont1 == null) {\n        cont1 = Task.newResult(shadow);\n      }\n      let cont2: Task.Result<Vtree.ShadowContext> = null;\n      cont1.then((shadow) => {\n        if (computedStyle[\"display\"] === Css.ident.table_cell) {\n          const url = Base.resolveURL(\n            \"user-agent.xml#table-cell\",\n            Base.resourceBaseURL,\n          );\n          cont2 = this.createRefShadow(\n            url,\n            Vtree.ShadowType.ROOTLESS,\n            element,\n            shadowContext,\n            shadow,\n          );\n        } else {\n          cont2 = Task.newResult(shadow);\n        }\n        cont2.then((shadow) => {\n          shadow = this.createPseudoelementShadow(\n            element,\n            isRoot,\n            cascStyle,\n            computedStyle,\n            styler,\n            context,\n            shadowContext,\n            shadow,\n          );\n          frame.finish(shadow);\n        });\n      });\n    });\n    return frame.result();\n  }\n\n  /** @override */\n  setViewRoot(viewRoot: Element, isFootnote: boolean) {\n    this.viewRoot = viewRoot;\n    this.isFootnote = isFootnote;\n  }\n\n  /**\n   * @return vertical\n   */\n  computeStyle(\n    vertical: boolean,\n    rtl: boolean,\n    style: CssCascade.ElementStyle,\n    computedStyle: { [key: string]: Css.Val },\n  ): boolean {\n    const context = this.context;\n    const cascMap = CssCascade.flattenCascadedStyle(\n      style,\n      context,\n      this.regionIds,\n      this.isFootnote,\n      this.nodeContext,\n    );\n    const isRoot = !this.nodeContext?.parent;\n    if (isRoot) {\n      // Ensure that writing-mode and direction are set on the root element.\n      if (!cascMap[\"writing-mode\"] && this.styler.rootStyle[\"writing-mode\"]) {\n        cascMap[\"writing-mode\"] = this.styler.rootStyle[\n          \"writing-mode\"\n        ] as CssCascade.CascadeValue;\n      }\n      if (!cascMap[\"direction\"] && this.styler.rootStyle[\"direction\"]) {\n        cascMap[\"direction\"] = this.styler.rootStyle[\n          \"direction\"\n        ] as CssCascade.CascadeValue;\n      }\n    }\n    const verticalParent = vertical;\n    vertical = CssCascade.isVertical(cascMap, context, vertical);\n    const verticalChanged = !isRoot && vertical !== verticalParent;\n    rtl = CssCascade.isRtl(cascMap, context, rtl);\n\n    const transform = (\n      name: string,\n      cascVal: CssCascade.CascadeValue,\n    ): Css.Val => {\n      // The percent value of inline-size on vertical-in-horizontal or\n      // horizontal-in-vertical block needs to be resolved against the\n      // page area height or width. (Fix for issue #1264)\n      let percentRef: number;\n      if (verticalChanged) {\n        if (vertical) {\n          if (/^(min-|max-)?(height|inline-size)$/.test(name)) {\n            percentRef = context.pageAreaHeight;\n          }\n        } else {\n          if (/^(min-|max-)?(width|inline-size)$/.test(name)) {\n            percentRef = context.pageAreaWidth;\n          }\n        }\n      }\n      let value = cascVal.evaluate(context, name, percentRef, vertical);\n      if (name == \"font-family\") {\n        value = this.docFaces.filterFontFamily(value);\n      }\n      return value;\n    };\n\n    const isLeftPage = !!new Exprs.Named(\n      (context as any).style.pageScope,\n      \"left-page\",\n    ).evaluate(context);\n\n    CssCascade.convertToPhysical(\n      cascMap,\n      computedStyle,\n      vertical,\n      rtl,\n      isLeftPage,\n      transform,\n    );\n\n    if (verticalChanged) {\n      // The auto value of inline-size on vertical-in-horizontal or\n      // horizontal-in-vertical block is changed to max-content.\n      // (Fix for issue #1264)\n      const inlineSize = computedStyle[vertical ? \"height\" : \"width\"];\n      if (!inlineSize || inlineSize === Css.ident.auto) {\n        computedStyle[vertical ? \"height\" : \"width\"] = Css.ident.max_content;\n      }\n    }\n\n    if (Display.isRunning(computedStyle[\"position\"])) {\n      // Running elements\n      computedStyle[\"position\"] = Css.ident.fixed;\n      computedStyle[\"visibility\"] = Css.ident.hidden;\n      return vertical;\n    }\n\n    // Compute values of display, position and float\n    const position = computedStyle[\"position\"] as Css.Ident;\n    const float = computedStyle[\"float\"];\n    const display =\n      (computedStyle[\"display\"] as Css.Ident) ||\n      ((this.sourceNode as Element).namespaceURI === Base.NS.XHTML\n        ? Css.ident.inline\n        : undefined); // leave it to the browser for MathML and SVG\n    const displayValues = Display.getComputedDisplayValue(\n      display,\n      position,\n      float,\n      this.sourceNode === this.xmldoc.root,\n    );\n    [\"display\", \"position\", \"float\"].forEach((name) => {\n      if (displayValues[name]) {\n        computedStyle[name] = displayValues[name];\n      }\n    });\n    return vertical;\n  }\n\n  private inheritFromSourceParent(elementStyle: CssCascade.ElementStyle): {\n    lang: string | null;\n    elementStyle: CssCascade.ElementStyle;\n  } {\n    let node = this.nodeContext.sourceNode;\n    const styles = [];\n    let lang: string | null = null;\n\n    // TODO: this is hacky. We need to recover the path through the shadow\n    // trees, but we do not have the full shadow tree structure at this point.\n    // This code handles coming out of the shadow trees, but does not go back in\n    // (through shadow:content element).\n    let shadowContext = this.nodeContext.shadowContext;\n    let steps = -1;\n    while (node && node.nodeType == 1) {\n      const shadowRoot = shadowContext && shadowContext.root == node;\n      if (!shadowRoot || shadowContext.type == Vtree.ShadowType.ROOTLESS) {\n        const styler = shadowContext\n          ? (shadowContext.styler as CssStyler.AbstractStyler)\n          : this.styler;\n        const nodeStyle = styler.getStyle(node as Element, false);\n        styles.push(nodeStyle);\n        lang = lang || Base.getLangAttribute(node as Element);\n      }\n      if (shadowRoot) {\n        node = shadowContext.owner;\n        shadowContext = shadowContext.parentShadow;\n      } else {\n        node = node.parentNode;\n        steps++;\n      }\n    }\n    const isRoot = steps === 0;\n    const fontSize = this.context.queryUnitSize(\"em\", isRoot);\n    const props = {\n      \"font-size\": new CssCascade.CascadeValue(\n        new Css.Numeric(fontSize, \"px\"),\n        0,\n      ),\n    } as CssCascade.ElementStyle;\n    if (isRoot) {\n      props[\"line-height\"] = new CssCascade.CascadeValue(\n        new Css.Num(this.context.pref.lineHeight),\n        0,\n      );\n    }\n    const inheritanceVisitor = new CssCascade.InheritanceVisitor(\n      props,\n      this.context,\n    );\n    for (let i = styles.length - 1; i >= 0; --i) {\n      const style = styles[i];\n      const propList = [];\n      for (const propName in style) {\n        if (CssCascade.isInherited(propName)) {\n          propList.push(propName);\n        }\n      }\n      propList.sort(Css.processingOrderFn);\n      let fontSize: Css.Val;\n      let lineHeight: Css.Val;\n\n      for (const name of propList) {\n        inheritanceVisitor.setPropName(name);\n        const prop = CssCascade.getProp(style, name);\n        let prop1 = prop;\n        if (!Css.isDefaultingValue(prop.value)) {\n          if (\n            name === \"font-size\" &&\n            i === styles.length - 1 &&\n            this.context.isRelativeRootFontSize &&\n            this.context.rootFontSize\n          ) {\n            // Fix for issue #608, #549\n            prop1 = new CssCascade.CascadeValue(\n              new Css.Numeric(this.context.rootFontSize, \"px\"),\n              prop.priority,\n            );\n          } else if (\n            name === \"line-height\" &&\n            i === styles.length - 1 &&\n            this.context.rootLineHeight &&\n            prop.value instanceof Css.Numeric &&\n            (prop.value.unit === \"lh\" || prop.value.unit === \"rlh\")\n          ) {\n            // line-height with lh or rlh unit on root element\n            prop1 = new CssCascade.CascadeValue(\n              new Css.Numeric(this.context.rootLineHeight, \"px\"),\n              prop.priority,\n            );\n          } else if (\n            i === 0 &&\n            prop.value instanceof Css.Numeric &&\n            prop.value.unit === \"lh\"\n          ) {\n            // line-height with lh unit on current element\n            const lhUnitSize = this.getLineHeightUnitSize(\n              name,\n              fontSize,\n              lineHeight,\n            );\n            if (lhUnitSize != null) {\n              prop1 = new CssCascade.CascadeValue(\n                new Css.Numeric(prop.value.num * lhUnitSize, \"px\"),\n                prop.priority,\n              );\n            }\n          } else if (!Css.isCustomPropName(name)) {\n            prop1 = prop.filterValue(inheritanceVisitor);\n          }\n\n          if (name === \"font-size\") {\n            fontSize = prop1.value;\n          } else if (name === \"line-height\") {\n            lineHeight = prop1.value;\n          }\n\n          props[name] = prop1;\n        }\n      }\n    }\n    for (const sname in elementStyle) {\n      if (!CssCascade.isInherited(sname)) {\n        props[sname] = elementStyle[sname];\n      }\n    }\n    return { lang, elementStyle: props };\n  }\n\n  resolveURL(url: string): string {\n    url = Base.resolveURL(url, this.xmldoc.url);\n    return this.fallbackMap[url] || url;\n  }\n\n  inheritLangAttribute() {\n    this.nodeContext.lang =\n      Base.getLangAttribute(this.nodeContext.sourceNode as Element) ||\n      (this.nodeContext.parent && this.nodeContext.parent.lang) ||\n      this.nodeContext.lang;\n  }\n\n  transferPolyfilledInheritedProps(computedStyle: { [key: string]: Css.Val }) {\n    const polyfilledInheritedProps =\n      CssCascade.getPolyfilledInheritedProps().filter(\n        (name) => computedStyle[name],\n      );\n    if (polyfilledInheritedProps.length) {\n      let props = this.nodeContext.inheritedProps;\n      if (this.nodeContext.parent) {\n        props = this.nodeContext.inheritedProps = {};\n        for (const n in this.nodeContext.parent.inheritedProps) {\n          props[n] = this.nodeContext.parent.inheritedProps[n];\n        }\n      }\n      polyfilledInheritedProps.forEach((name) => {\n        const value = computedStyle[name];\n        if (value) {\n          if (Css.isDefaultingValue(value)) {\n            if (value === Css.ident.initial) {\n              props[name] = undefined;\n            }\n          } else if (value instanceof Css.Int) {\n            props[name] = (value as Css.Int).num;\n          } else if (value instanceof Css.Ident) {\n            props[name] = (value as Css.Ident).name;\n          } else if (value instanceof Css.Numeric) {\n            const numericVal = value as Css.Numeric;\n            switch (numericVal.unit) {\n              case \"dpi\":\n              case \"dpcm\":\n              case \"dppx\":\n                props[name] =\n                  numericVal.num * Exprs.defaultUnitSizes[numericVal.unit];\n                break;\n              default:\n                props[name] = value;\n            }\n          } else {\n            props[name] = value;\n          }\n          if (![\"widows\", \"orphans\"].includes(name)) {\n            // Note: widows and orphans are polyfilled for page and\n            // root multi-column, but they should be left to the browser\n            // for multi-column boxes inside body. (Issue #1182)\n            delete computedStyle[name];\n          }\n        }\n      });\n    }\n  }\n\n  resolveFormattingContext(\n    nodeContext: Vtree.NodeContext,\n    firstTime: boolean,\n    display: Css.Val,\n    position: Css.Ident,\n    float: Css.Val,\n    isRoot: boolean,\n  ) {\n    const hooks: Plugin.ResolveFormattingContextHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.RESOLVE_FORMATTING_CONTEXT,\n    );\n    for (let i = 0; i < hooks.length; i++) {\n      const formattingContext = hooks[i](\n        nodeContext,\n        firstTime,\n        display,\n        position,\n        float,\n        isRoot,\n      );\n      if (formattingContext) {\n        nodeContext.formattingContext = formattingContext;\n        return;\n      }\n    }\n  }\n\n  /**\n   * @return holding true if children should be processed\n   */\n  private createElementView(\n    firstTime: boolean,\n    atUnforcedBreak: boolean,\n  ): Task.Result<boolean> {\n    let needToProcessChildren = true;\n    const frame: Task.Frame<boolean> = Task.newFrame(\"createElementView\");\n\n    // Figure out element's styles\n    let element = this.sourceNode as Element;\n    const styler = this.nodeContext.shadowContext\n      ? this.nodeContext.shadowContext.styler\n      : this.styler;\n    let elementStyle = styler.getStyle(element, false);\n    if (!this.nodeContext.shadowContext) {\n      const offset = this.xmldoc.getElementOffset(element);\n      Matchers.NthFragmentMatcher.registerFragmentIndex(\n        offset,\n        this.nodeContext.fragmentIndex,\n        0,\n      );\n    }\n    const computedStyle: { [key: string]: Css.Val } = {};\n    if (!this.nodeContext.parent) {\n      const inheritedValues = this.inheritFromSourceParent(elementStyle);\n      elementStyle = inheritedValues.elementStyle;\n      this.nodeContext.lang = inheritedValues.lang;\n    }\n    const positionCV: CssCascade.CascadeValue = elementStyle[\"position\"];\n    const floatCV: CssCascade.CascadeValue = elementStyle[\"float\"];\n    const floatReferenceCV: CssCascade.CascadeValue =\n      elementStyle[\"float-reference\"];\n    const floatReference =\n      floatCV &&\n      !Css.isDefaultingValue(floatCV.value) &&\n      floatCV.value !== Css.ident.none &&\n      floatReferenceCV &&\n      !Css.isDefaultingValue(floatReferenceCV.value)\n        ? PageFloats.floatReferenceOf(floatReferenceCV.value.toString())\n        : null;\n    if (\n      this.nodeContext.parent &&\n      (Display.isRunning(positionCV?.value) ||\n        (floatReference && PageFloats.isPageFloat(floatReference)))\n    ) {\n      // Since a page float will be detached from a view node of its parent,\n      // inherited properties need to be inherited from its source parent.\n      const inheritedValues = this.inheritFromSourceParent(elementStyle);\n      elementStyle = inheritedValues.elementStyle;\n      this.nodeContext.lang = inheritedValues.lang;\n    }\n    this.nodeContext.vertical = this.computeStyle(\n      this.nodeContext.vertical,\n      this.nodeContext.direction === \"rtl\",\n      elementStyle,\n      computedStyle,\n    );\n    if (\n      floatReference &&\n      PageFloats.isPageFloat(floatReference) &&\n      computedStyle[\"display\"] === Css.ident.block\n    ) {\n      // Fix page float margin collapsing issue (Issue #1282)\n      computedStyle[\"display\"] = Css.ident.flow_root;\n    }\n    styler.processContent(element, computedStyle, this.nodeContext);\n    this.transferPolyfilledInheritedProps(computedStyle);\n    this.inheritLangAttribute();\n    if (computedStyle[\"direction\"]) {\n      this.nodeContext.direction = computedStyle[\"direction\"].toString();\n    }\n\n    // Sort out the properties\n    const flow = computedStyle[\"flow-into\"];\n    if (flow && flow.toString() != this.flowName) {\n      // foreign flow, don't create a view\n      frame.finish(false);\n      return frame.result();\n    }\n    if (\n      Scripts.allowScripts &&\n      element.localName === \"script\" &&\n      element.namespaceURI === Base.NS.XHTML\n    ) {\n      Scripts.loadScript(\n        element as HTMLScriptElement,\n        this.viewport.window,\n      ).thenFinish(frame);\n      return frame.result();\n    }\n\n    let display = computedStyle[\"display\"];\n\n    if (Css.isDefaultingValue(display)) {\n      if (display === Css.ident.initial || display === Css.ident.unset) {\n        display = Css.ident.inline;\n      } else if (display === Css.ident.inherit) {\n        display =\n          this.nodeContext.parent?.display &&\n          Css.getName(this.nodeContext.parent?.display);\n      } else {\n        display = null;\n      }\n    }\n    if (display === Css.ident.none) {\n      // no content\n      frame.finish(false);\n      return frame.result();\n    }\n    const isRoot = this.nodeContext.parent == null;\n    this.nodeContext.flexContainer = display === Css.ident.flex;\n    this.createShadows(\n      element,\n      isRoot,\n      elementStyle,\n      computedStyle,\n      styler,\n      this.context,\n      this.nodeContext.shadowContext as Vtree.ShadowContext,\n    ).then((shadowParam) => {\n      this.nodeContext.nodeShadow = shadowParam;\n      const position = computedStyle[\"position\"] as Css.Ident;\n      let floatSide = computedStyle[\"float\"];\n      let clearSide = computedStyle[\"clear\"] as Css.Ident;\n      const writingMode = this.nodeContext.vertical\n        ? Css.ident.vertical_rl\n        : Css.ident.horizontal_tb;\n      const parentWritingMode = this.nodeContext.parent\n        ? this.nodeContext.parent.vertical\n          ? Css.ident.vertical_rl\n          : Css.ident.horizontal_tb\n        : writingMode;\n      const isFlowRoot = Display.isFlowRoot(element);\n      const columnCount = computedStyle[\"column-count\"];\n      const columnWidth = computedStyle[\"column-width\"];\n      const isMultiColumn =\n        (columnCount &&\n          columnCount !== Css.ident.auto &&\n          !Css.isDefaultingValue(columnCount)) ||\n        (columnWidth &&\n          columnWidth !== Css.ident.auto &&\n          !Css.isDefaultingValue(columnWidth));\n      this.nodeContext.establishesBFC = Display.establishesBFC(\n        display,\n        position,\n        floatSide,\n        computedStyle[\"overflow\"] as Css.Ident,\n        writingMode,\n        parentWritingMode,\n        isMultiColumn || isFlowRoot,\n      );\n      this.nodeContext.containingBlockForAbsolute =\n        Display.establishesCBForAbsolute(position);\n      if (\n        this.nodeContext.isInsideBFC() &&\n        floatSide !== Css.ident.footnote &&\n        !(floatReference && PageFloats.isPageFloat(floatReference))\n      ) {\n        // When the element is already inside a block formatting context\n        // (except one from the root), float and clear can be controlled by\n        // the browser and we don't need to care.\n        floatSide = null;\n        clearSide = null;\n      }\n      let floating =\n        floatSide instanceof Css.SpaceList ||\n        floatSide === Css.ident.left ||\n        floatSide === Css.ident.right ||\n        floatSide === Css.ident.top ||\n        floatSide === Css.ident.bottom ||\n        floatSide === Css.ident.inline_start ||\n        floatSide === Css.ident.inline_end ||\n        floatSide === Css.ident.block_start ||\n        floatSide === Css.ident.block_end ||\n        floatSide === Css.ident.snap_block ||\n        floatSide === Css.ident.snap_inline ||\n        floatSide === Css.ident.inside ||\n        floatSide === Css.ident.outside ||\n        floatSide === Css.ident.footnote;\n      if (floatSide) {\n        // Don't want to set it in view DOM CSS.\n        delete computedStyle[\"float\"];\n        if (floatSide === Css.ident.footnote) {\n          if (this.isFootnote) {\n            // No footnotes inside footnotes. this is most likely the root\n            // of the footnote body being rendered in footnote area. Treat\n            // as block.\n            floating = false;\n            computedStyle[\"display\"] = Css.ident.block;\n          } else {\n            computedStyle[\"display\"] = Css.ident.inline;\n          }\n        }\n      }\n      if (clearSide) {\n        if (clearSide === Css.ident.inherit) {\n          if (this.nodeContext.parent && this.nodeContext.parent.clearSide) {\n            clearSide = Css.getName(this.nodeContext.parent.clearSide);\n          }\n        }\n        if (\n          clearSide === Css.ident.left ||\n          clearSide === Css.ident.right ||\n          clearSide === Css.ident.top ||\n          clearSide === Css.ident.bottom ||\n          clearSide === Css.ident.inline_start ||\n          clearSide === Css.ident.inline_end ||\n          clearSide === Css.ident.block_start ||\n          clearSide === Css.ident.block_end ||\n          clearSide === Css.ident.inside ||\n          clearSide === Css.ident.outside ||\n          clearSide === Css.ident.both ||\n          clearSide === Css.ident.all ||\n          clearSide === Css.ident.same ||\n          clearSide === Css.ident.column ||\n          clearSide === Css.ident.region ||\n          clearSide === Css.ident.page\n        ) {\n          delete computedStyle[\"clear\"];\n          if (\n            computedStyle[\"display\"] &&\n            computedStyle[\"display\"] != Css.ident.inline\n          ) {\n            this.nodeContext.clearSide = clearSide.toString();\n          }\n        }\n      }\n      const isListItem =\n        Display.isListItem(display) && !!computedStyle[\"ua-list-item-count\"];\n      const breakInside = computedStyle[\"break-inside\"];\n      if (\n        floating ||\n        (breakInside &&\n          !Css.isDefaultingValue(breakInside) &&\n          breakInside !== Css.ident.auto)\n      ) {\n        this.nodeContext.breakPenalty++;\n      }\n      if (\n        display &&\n        display !== Css.ident.inline &&\n        Display.isInlineLevel(display)\n      ) {\n        // Don't break inside ruby, inline-block, etc.\n        this.nodeContext.breakPenalty++;\n      }\n      this.nodeContext.inline =\n        (!floating && !display) ||\n        Display.isInlineLevel(display) ||\n        Display.isRubyInternalDisplay(display);\n      this.nodeContext.display = display ? display.toString() : \"inline\";\n      this.nodeContext.floatSide = floating ? floatSide.toString() : null;\n      this.nodeContext.floatReference =\n        floatReference || PageFloats.FloatReference.INLINE;\n      const floatMinWrapBlock = computedStyle[\"float-min-wrap-block\"];\n      this.nodeContext.floatMinWrapBlock =\n        floatMinWrapBlock && !Css.isDefaultingValue(floatMinWrapBlock)\n          ? (floatMinWrapBlock as Css.Numeric)\n          : null;\n\n      // Leaves handling of multicol specified on non-root/body elements to the browser\n      const insideNonRootMultiColumn = this.isInsideNonRootMultiColumn();\n\n      const columnSpan = computedStyle[\"column-span\"];\n      this.nodeContext.columnSpan =\n        !insideNonRootMultiColumn &&\n        columnSpan &&\n        !Css.isDefaultingValue(columnSpan)\n          ? columnSpan\n          : null;\n      if (!this.nodeContext.inline) {\n        const breakAfter = computedStyle[\"break-after\"];\n        if (\n          breakAfter &&\n          !Css.isDefaultingValue(breakAfter) &&\n          !(insideNonRootMultiColumn && breakAfter === Css.ident.column)\n        ) {\n          this.nodeContext.breakAfter = breakAfter.toString();\n          if (Break.forcedBreakValues[this.nodeContext.breakAfter]) {\n            // delete computedStyle[\"break-after\"];\n\n            // Instead of deleting, set to \"column\" so that the browser can handle it.\n            computedStyle[\"break-after\"] = Css.ident.column;\n          }\n        }\n        const breakBefore = computedStyle[\"break-before\"];\n        if (\n          breakBefore &&\n          !Css.isDefaultingValue(breakBefore) &&\n          !(insideNonRootMultiColumn && breakBefore === Css.ident.column)\n        ) {\n          this.nodeContext.breakBefore = breakBefore.toString();\n          if (Break.forcedBreakValues[this.nodeContext.breakBefore]) {\n            if (this.isAtStartOfPage()) {\n              delete computedStyle[\"break-before\"];\n            } else {\n              // Set to \"column\" so that the browser can handle it.\n              computedStyle[\"break-before\"] = Css.ident.column;\n            }\n          }\n          if (this.nodeContext.fragmentIndex !== 1) {\n            this.nodeContext.breakBefore = null;\n          }\n        }\n        // Named page type\n        const pageVal: Css.Val = computedStyle[\"page\"];\n        let pageType =\n          pageVal && !Css.isDefaultingValue(pageVal) && pageVal.toString();\n        if (\n          !pageType &&\n          !this.nodeContext.parent &&\n          (this.nodeContext.shadowContext ||\n            display === Css.ident.table_header_group ||\n            display === Css.ident.table_footer_group)\n        ) {\n          // Keep currentPageType for shadowContext (Fix for issue #1233)\n          pageType = this.styler.cascade.currentPageType;\n        }\n        if (!pageType || pageType.toLowerCase() === \"auto\") {\n          pageType = this.nodeContext.pageType;\n        } else {\n          this.nodeContext.pageType = pageType;\n        }\n        if (\n          this.styler.cascade.currentPageType !== pageType &&\n          // Fixed positioned or running elements should not affect page type\n          // unless page type is explicitly set\n          !(!pageType && computedStyle[\"position\"] === Css.ident.fixed)\n        ) {\n          if (\n            this.nodeContext.fragmentIndex === 1 &&\n            !Break.isSpreadBreakValue(this.nodeContext.breakBefore)\n          ) {\n            this.nodeContext.breakBefore = \"page\";\n          }\n          // Fix for issue #1309\n          if (pageType !== this.styler.cascade.previousPageType) {\n            this.styler.cascade.previousPageType =\n              this.styler.cascade.currentPageType;\n          }\n          this.styler.cascade.currentPageType = pageType;\n        }\n      }\n      this.nodeContext.verticalAlign =\n        (computedStyle[\"vertical-align\"] &&\n          computedStyle[\"vertical-align\"].toString()) ||\n        \"baseline\";\n      this.nodeContext.captionSide =\n        (computedStyle[\"caption-side\"] &&\n          computedStyle[\"caption-side\"].toString()) ||\n        \"top\";\n      const borderCollapse = computedStyle[\"border-collapse\"];\n      if (!borderCollapse || borderCollapse === Css.getName(\"separate\")) {\n        const borderSpacing = computedStyle[\"border-spacing\"];\n        let inlineBorderSpacing: Css.Val;\n        let blockBorderSpacing: Css.Val;\n        if (borderSpacing) {\n          if (borderSpacing instanceof Css.SpaceList) {\n            inlineBorderSpacing = borderSpacing.values[0];\n            blockBorderSpacing = borderSpacing.values[1];\n          } else {\n            inlineBorderSpacing = blockBorderSpacing = borderSpacing;\n          }\n          if (inlineBorderSpacing.isNumeric()) {\n            this.nodeContext.inlineBorderSpacing = Css.toNumber(\n              inlineBorderSpacing,\n              this.context,\n            );\n          }\n          if (blockBorderSpacing.isNumeric()) {\n            this.nodeContext.blockBorderSpacing = Css.toNumber(\n              blockBorderSpacing,\n              this.context,\n            );\n          }\n        }\n      }\n      const footnotePolicy = computedStyle[\"footnote-policy\"] as Css.Ident;\n      this.nodeContext.footnotePolicy =\n        footnotePolicy && !Css.isDefaultingValue(footnotePolicy)\n          ? footnotePolicy\n          : null;\n      const firstPseudo = computedStyle[\"x-first-pseudo\"] as Css.Int;\n      if (firstPseudo) {\n        const outerPseudo = this.nodeContext.parent\n          ? this.nodeContext.parent.firstPseudo\n          : null;\n        this.nodeContext.firstPseudo = new Vtree.FirstPseudo(\n          outerPseudo,\n          /** Css.Int */\n          firstPseudo.num,\n        );\n      }\n      if (!this.nodeContext.inline) {\n        this.processAfterIfcontinues(\n          element,\n          elementStyle,\n          styler,\n          this.context,\n        );\n      }\n      const whitespace = computedStyle[\"white-space\"];\n      if (whitespace) {\n        const whitespaceValue = Vtree.whitespaceFromPropertyValue(\n          whitespace.toString(),\n        );\n        if (whitespaceValue !== null) {\n          this.nodeContext.whitespace = whitespaceValue;\n        }\n      }\n      const hyphenateCharacter = computedStyle[\"hyphenate-character\"];\n      if (hyphenateCharacter && hyphenateCharacter instanceof Css.Str) {\n        this.nodeContext.hyphenateCharacter = hyphenateCharacter.str;\n      }\n      const wordBreak = computedStyle[\"word-break\"];\n      const lineBreak = computedStyle[\"line-break\"];\n      const overflowWrap = computedStyle[\"overflow-wrap\"];\n      if (\n        wordBreak === Css.ident.break_all ||\n        lineBreak === Css.ident.anywhere ||\n        overflowWrap === Css.ident.break_word ||\n        overflowWrap === Css.ident.anywhere\n      ) {\n        this.nodeContext.breakWord = true;\n      }\n\n      // Resolve formatting context\n      this.resolveFormattingContext(\n        this.nodeContext,\n        firstTime,\n        display,\n        position,\n        floatSide,\n        isRoot,\n      );\n      if (\n        this.nodeContext.parent &&\n        this.nodeContext.parent.formattingContext\n      ) {\n        firstTime = this.nodeContext.parent.formattingContext.isFirstTime(\n          this.nodeContext,\n          firstTime,\n        );\n      }\n      if (!this.nodeContext.inline) {\n        this.nodeContext.repeatOnBreak =\n          this.processRepeatOnBreak(computedStyle);\n        this.findAndProcessRepeatingElements(element, styler);\n      }\n\n      // Create the view element\n      let custom = false;\n      let inner: Element = null;\n      const fetchers = [];\n      let ns = element.namespaceURI;\n      let tag = element.localName;\n      let originalTag = tag;\n      if (ns == Base.NS.XHTML) {\n        if (\n          tag == \"html\" ||\n          tag == \"body\" ||\n          tag == \"script\" ||\n          tag == \"link\" ||\n          tag == \"meta\"\n        ) {\n          tag = \"div\";\n        } else if (tag == \"vide_\") {\n          tag = \"video\";\n        } else if (tag == \"audi_\") {\n          tag = \"audio\";\n        } else if (tag == \"object\") {\n          custom = !!this.customRenderer;\n        }\n        if (\n          element.hasAttribute(PseudoElement.PSEUDO_ATTR) &&\n          element.hasAttribute(\"src\") &&\n          computedStyle[\"content\"] instanceof Css.URL\n        ) {\n          tag = \"img\";\n        }\n      } else if (ns == Base.NS.epub) {\n        tag = \"span\";\n        ns = Base.NS.XHTML;\n      } else if (ns == Base.NS.SHADOW) {\n        ns = Base.NS.XHTML;\n        tag = this.nodeContext.inline ? \"span\" : \"div\";\n      } else {\n        custom = !!this.customRenderer;\n      }\n      if (isListItem) {\n        // We don't use browser's list item rendering, so we change\n        // `display: list-item` to `display: block` and\n        // `display: inline list-item` to `display: inline`.\n        display = Display.isInlineLevel(display)\n          ? Css.ident.inline\n          : Css.ident.block;\n        computedStyle[\"display\"] = display;\n        if (firstTime) {\n          tag = \"li\";\n        } else {\n          tag = \"div\";\n        }\n      } else if (tag == \"body\" || tag == \"li\") {\n        tag = \"div\";\n      } else if (tag == \"q\") {\n        tag = \"span\";\n      } else if (tag == \"a\") {\n        const hp = computedStyle[\"hyperlink-processing\"];\n        if (hp && hp.toString() != \"normal\") {\n          tag = \"span\";\n        }\n      }\n      if (computedStyle[\"behavior\"]) {\n        const behavior = computedStyle[\"behavior\"].toString();\n        if (behavior != \"none\" && this.customRenderer) {\n          custom = true;\n        }\n      }\n      if (\n        (element as HTMLElement).dataset &&\n        element.getAttribute(\"data-math-typeset\") === \"true\"\n      ) {\n        custom = true;\n      }\n      let elemResult: Task.Result<Element>;\n      if (custom) {\n        const parentNode = this.nodeContext.parent\n          ? this.nodeContext.parent.viewNode\n          : null;\n        elemResult = this.customRenderer(\n          element,\n          parentNode as Element,\n          computedStyle,\n        );\n      } else {\n        elemResult = Task.newResult(null);\n      }\n      elemResult.then((result) => {\n        if (result) {\n          if (custom) {\n            needToProcessChildren =\n              result.getAttribute(\"data-adapt-process-children\") == \"true\";\n          }\n        } else if (computedStyle[\"display\"] === Css.ident.none) {\n          // No element should be created if display:none is set.\n          // (Fix issue #924)\n          frame.finish(false);\n          return;\n        } else {\n          result = this.createElement(ns, tag);\n        }\n\n        if (tag != originalTag) {\n          result.setAttribute(\"data-vivliostyle-original-tag\", originalTag);\n          if (originalTag === \"html\" || originalTag === \"body\") {\n            result.role = \"presentation\";\n          }\n        }\n        if (tag == \"a\") {\n          result.addEventListener(\"click\", this.page.hrefHandler, false);\n        }\n        if (inner) {\n          this.applyPseudoelementStyle(this.nodeContext, \"inner\", inner);\n          result.appendChild(inner);\n        }\n        if (\n          result.localName == \"iframe\" &&\n          result.namespaceURI == Base.NS.XHTML\n        ) {\n          initIFrame(result as HTMLIFrameElement);\n        }\n        const imageResolution = this.nodeContext.inheritedProps[\n          \"image-resolution\"\n        ] as number | undefined;\n        const images: {\n          image: HTMLElement;\n          element: HTMLElement;\n          fetcher: TaskUtil.Fetcher<string>;\n        }[] = [];\n        const cssWidth = computedStyle[\"width\"];\n        const cssHeight = computedStyle[\"height\"];\n        const attrWidth = element.getAttribute(\"width\");\n        const attrHeight = element.getAttribute(\"height\");\n        const hasAutoWidth =\n          cssWidth === Css.ident.auto || (!cssWidth && !attrWidth);\n        const hasAutoHeight =\n          cssHeight === Css.ident.auto || (!cssHeight && !attrHeight);\n        const attributes = element.attributes;\n        const attributeCount = attributes.length;\n        let delayedSrc: string | null = null;\n        let delayedAlt: string | null = null;\n\n        // Workaround for issue #1439\n        // `<tr><a id=\"…\"></a><td>…` causes table layout issue, so change to\n        // `<tr><td><a id=\"…\"></a>…`\n        if (\n          display === Css.ident.table_cell &&\n          (this.nodeContext.parent?.viewNode as Element)?.lastElementChild\n            ?.localName === \"a\"\n        ) {\n          result.appendChild(\n            (this.nodeContext.parent.viewNode as Element).lastElementChild,\n          );\n        }\n\n        for (let i = 0; i < attributeCount; i++) {\n          const attribute = attributes[i];\n          const attributeNS = attribute.namespaceURI;\n          let attributeName = attribute.localName;\n          let attributeValue = attribute.nodeValue;\n          if (!attributeNS) {\n            if (!Scripts.allowScripts && attributeName.match(/^on/)) {\n              continue; // don't propagate JavaScript code\n            }\n            if (attributeName == \"style\") {\n              continue; // we do styling ourselves\n            }\n            if (attributeName == \"id\" || attributeName == \"name\") {\n              // Propagate transformed ids and collect them on the page\n              // (only first time).\n              if (firstTime) {\n                const transformedValue =\n                  this.documentURLTransformer.transformFragment(\n                    attributeValue,\n                    this.xmldoc.url,\n                  );\n\n                // Keep original id value so that JavaScript can manipulate it\n                result.setAttribute(attributeName, attributeValue);\n                result.setAttribute(\"data-vivliostyle-id\", transformedValue);\n\n                // Create an anchor element with transformed id, necessary for internal links in output PDF\n                // (issue #877)\n                const anchorElem = result.ownerDocument.createElement(\"a\");\n                anchorElem.setAttribute(attributeName, transformedValue);\n                anchorElem.setAttribute(LayoutHelper.SPECIAL_ATTR, \"1\");\n                anchorElem.style.position = \"absolute\";\n                result.appendChild(anchorElem);\n\n                this.page.registerElementWithId(result, transformedValue);\n                continue;\n              }\n            }\n\n            // TODO: understand the element we are working with.\n            if (\n              attributeName == \"src\" ||\n              attributeName == \"href\" ||\n              attributeName == \"poster\"\n            ) {\n              attributeValue = this.resolveURL(attributeValue);\n              if (attributeName === \"href\") {\n                attributeValue = this.documentURLTransformer.transformURL(\n                  attributeValue,\n                  this.xmldoc.url,\n                );\n              }\n            } else if (attributeName == \"srcset\") {\n              attributeValue = attributeValue\n                .split(\",\")\n                .map((value) => this.resolveURL(value.trim()))\n                .join(\",\");\n            } else if (\n              attributeName === \"data\" &&\n              custom &&\n              tag === \"object\" &&\n              result.hasAttribute(\"data\")\n            ) {\n              // the data attribute is already set in OPFView.makeObjectView()\n              continue;\n            }\n            if (\n              attributeName === \"poster\" &&\n              tag === \"video\" &&\n              ns === Base.NS.XHTML &&\n              hasAutoWidth &&\n              hasAutoHeight\n            ) {\n              const image = new Image();\n              const fetcher = Net.loadElement(image, attributeValue);\n              fetchers.push(fetcher);\n              images.push({\n                image,\n                element: result as HTMLElement,\n                fetcher,\n              });\n            }\n          } else if (attributeNS == \"http://www.w3.org/2000/xmlns/\") {\n            continue; // namespace declaration (in Firefox)\n          } else if (attributeNS == Base.NS.XLINK) {\n            if (attributeName == \"href\") {\n              attributeValue = this.documentURLTransformer.transformURL(\n                this.resolveURL(attributeValue),\n                this.xmldoc.url,\n              );\n            }\n          }\n          if (ns == Base.NS.SVG && /^[A-Z\\-]+$/.test(attributeName)) {\n            // Workaround for Edge bug\n            // See\n            // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/5579311/\n            attributeName = attributeName.toLowerCase();\n          }\n          if (this.isSVGUrlAttribute(attributeName)) {\n            attributeValue = Urls.transformURIs(\n              attributeValue,\n              this.xmldoc.url,\n              this.documentURLTransformer,\n            );\n          }\n          if (attributeNS) {\n            const attributePrefix = namespacePrefixMap[attributeNS];\n            if (attributePrefix) {\n              attributeName = `${attributePrefix}:${attributeName}`;\n            }\n          }\n          if (\n            attributeName == \"src\" &&\n            !attributeNS &&\n            (tag == \"img\" || tag == \"input\") &&\n            ns == Base.NS.XHTML\n          ) {\n            // HTML img element should start loading only once all\n            // attributes are assigned.\n            delayedSrc = attributeValue;\n          } else if (\n            attributeName == \"alt\" &&\n            !attributeNS &&\n            tag == \"img\" &&\n            ns == Base.NS.XHTML\n          ) {\n            // The alt attribute should be assigned after the src attribute\n            // to avoid the image box size being determined by the alt text.\n            // (Issue #1343)\n            delayedAlt = attributeValue;\n          } else if (\n            attributeName == \"href\" &&\n            tag == \"image\" &&\n            ns == Base.NS.SVG &&\n            attributeNS == Base.NS.XLINK\n          ) {\n            this.page.fetchers.push(Net.loadElement(result, attributeValue));\n          } else {\n            // When the document is not XML document (e.g. non-XML HTML)\n            // attributeNS can be null\n            if (attributeNS) {\n              result.setAttributeNS(attributeNS, attributeName, attributeValue);\n            } else {\n              try {\n                result.setAttribute(attributeName, attributeValue);\n              } catch (err) {\n                Logging.logger.warn(err);\n              }\n            }\n          }\n        }\n        if (delayedSrc) {\n          const image = tag === \"input\" ? new Image() : result;\n          const imageFetcher = Net.loadElement(image, delayedSrc, delayedAlt);\n          if (image !== result) {\n            (result as HTMLImageElement).src = delayedSrc;\n          }\n          const isInsideRunningElement = (): boolean => {\n            // Check if the image is inside a position:fixed or running element\n            // which is converted to position:fixed.\n            if (computedStyle[\"position\"] === Css.ident.fixed) {\n              return true;\n            }\n            for (\n              let p = this.nodeContext.parent?.viewNode as HTMLElement;\n              p && p !== this.viewRoot;\n              p = p.parentElement\n            ) {\n              if (p.style?.[\"position\"] === \"fixed\") {\n                return true;\n              }\n            }\n            return false;\n          };\n          const hasPercentBlockSize = (): boolean => {\n            // Check if the image has percentage block size, which is usually same as auto,\n            // which means the size is not determined until the image is loaded.\n            const blockSize = this.nodeContext.vertical ? cssWidth : cssHeight;\n            return blockSize instanceof Css.Numeric && blockSize.unit === \"%\";\n          };\n          if (\n            !hasAutoWidth &&\n            !hasAutoHeight &&\n            !hasPercentBlockSize() &&\n            !isInsideRunningElement()\n          ) {\n            // No need to wait for the image, does not affect layout\n            this.page.fetchers.push(imageFetcher);\n          } else {\n            if (\n              hasAutoWidth &&\n              hasAutoHeight &&\n              imageResolution &&\n              imageResolution !== 1\n            ) {\n              images.push({\n                image: image as HTMLElement,\n                element: result as HTMLElement,\n                fetcher: imageFetcher,\n              });\n            }\n            fetchers.push(imageFetcher);\n          }\n        }\n        delete computedStyle[\"content\"];\n        const listStyleImage = computedStyle[\"list-style-image\"];\n        if (listStyleImage && listStyleImage instanceof Css.URL) {\n          const listStyleURL = (listStyleImage as Css.URL).url;\n          fetchers.push(Net.loadElement(new Image(), listStyleURL));\n        }\n        this.preprocessElementStyle(computedStyle);\n        this.applyComputedStyles(result, computedStyle);\n\n        if (this.nodeContext.inline) {\n          if (!firstTime) {\n            Break.setBoxBreakFlag(result, \"inline-start\");\n            if (Break.isCloneBoxDecorationBreak(result)) {\n              Break.setBoxBreakFlag(result, \"clone\");\n            }\n          }\n        } else {\n          if (!firstTime) {\n            const blockSizeP = this.nodeContext.vertical ? \"width\" : \"height\";\n            if (Base.getCSSProperty(result, blockSizeP)) {\n              // When a box with a specified block size is fragmented,\n              // the fragmented box should not have the block size.\n              // If the box is table-row, set a very small block size\n              // (0 does not work in Firefox, so use 0.01px instead)\n              // to prevent the row block size from expanding due to\n              // large rowspanning cells.\n              Base.setCSSProperty(\n                result,\n                blockSizeP,\n                this.nodeContext.display === \"table-row\" ? \"0.01px\" : \"\",\n              );\n            }\n            Break.setBoxBreakFlag(result, \"block-start\");\n            if (Break.isCloneBoxDecorationBreak(result)) {\n              Break.setBoxBreakFlag(result, \"clone\");\n            }\n            Break.setMarginDiscardFlag(result, \"block-start\");\n          } else if (\n            !Display.isAbsolutelyPositioned(computedStyle[\"position\"])\n          ) {\n            const marginBreak = computedStyle[\"margin-break\"];\n\n            // Detect forced or unforced break at this point\n            // to handle margin-break properly.\n            // Note: Do not use `atUnforcedBreak` which may be inaccurate.\n            const breakType = this.getBreakTypeAt(this.nodeContext);\n            const anyBreak = breakType !== null;\n            const unforcedBreak = breakType === \"auto\";\n            if (\n              (marginBreak === Css.ident.discard && anyBreak) ||\n              (marginBreak !== Css.ident.keep &&\n                unforcedBreak &&\n                !this.nodeContext.floatSide)\n            ) {\n              Break.setMarginDiscardFlag(result, \"block-start\");\n            }\n          }\n        }\n        if (isListItem) {\n          result.setAttribute(\n            \"value\",\n            computedStyle[\"ua-list-item-count\"].stringValue(),\n          );\n        }\n        if (result.classList.contains(\"_viv-marker-outside-content\")) {\n          // Adjust marker position for outside markers\n          if (Display.isListItem(this.nodeContext.parent?.parent?.display)) {\n            const style = this.viewport.window.getComputedStyle(\n              this.nodeContext.parent.parent.viewNode as Element,\n            );\n            const markerOffset =\n              parseFloat(style.borderInlineStartWidth) +\n              parseFloat(style.paddingInlineStart) +\n              parseFloat(style.textIndent);\n            if (markerOffset) {\n              (result as HTMLElement).style.insetInlineEnd =\n                `${markerOffset}px`;\n            }\n          }\n        }\n\n        this.viewNode = result;\n        if (fetchers.length) {\n          TaskUtil.waitForFetchers(fetchers).then(() => {\n            if (imageResolution > 0) {\n              this.modifyElemDimensionWithImageResolution(\n                images,\n                imageResolution,\n                computedStyle,\n                this.nodeContext.vertical,\n              );\n            }\n            frame.finish(needToProcessChildren);\n          });\n        } else {\n          frame.timeSlice().then(() => {\n            frame.finish(needToProcessChildren);\n          });\n        }\n      });\n    });\n    return frame.result();\n  }\n\n  /**\n   * Check if the current position is at the start of a page.\n   * This is used to determine whether a forced break should be ignored.\n   * (Issue #1608)\n   */\n  private isAtStartOfPage(): boolean {\n    for (let nc = this.nodeContext; nc?.parent && !nc.after; nc = nc.parent) {\n      let node =\n        nc === this.nodeContext && !nc.viewNode\n          ? nc.parent.viewNode?.lastChild\n          : nc.viewNode?.previousSibling;\n      while (\n        node &&\n        (Vtree.canIgnore(node, nc.parent.whitespace) ||\n          LayoutHelper.isOutOfFlow(node))\n      ) {\n        node = node.previousSibling;\n      }\n      if (node) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Check if the current element is inside multi-column element\n   * that is not root or body element in the source tree.\n   *\n   * Note: vivliostyle handles multi-column on the root and body element on its own,\n   * but leaves it to the browser to handle other multi-column.\n   * This check is for such non-root/body multi-column.\n   */\n  private isInsideNonRootMultiColumn(): boolean {\n    const element = this.nodeContext.parent?.viewNode as Element;\n    return !!(element && LayoutHelper.findAncestorNonRootMultiColumn(element));\n  }\n\n  /**\n   * Check if the current position is at a forced or unforced break\n   * (Fix for Issue #690)\n   *\n   * @param nodeContext\n   * @returns forced break type, or \"auto\" for unforced break, or null for not break\n   */\n  private getBreakTypeAt(nodeContext: Vtree.NodeContext): string | null {\n    // Skip break detection for tables; fragmentation is handled by table.ts\n    if (this.isInsideTable(nodeContext)) {\n      return null;\n    }\n    for (let nc = nodeContext; nc && !nc.after; nc = nc.parent) {\n      if (Break.isForcedBreakValue(nc.breakBefore)) {\n        return nc.breakBefore; // forced break\n      }\n      if (nc.fragmentIndex === 1 && !nc.parent) {\n        if (nc.sourceNode === nc.sourceNode.ownerDocument.documentElement) {\n          // beginning of document\n          return \"page\";\n        } else {\n          // page floats, etc.\n          return null;\n        }\n      }\n      if (nc.parent?.floatSide) {\n        // inside float, not break (Issue #1282)\n        return null;\n      }\n      const parentViewNode = nc.parent?.viewNode as Element;\n      if (parentViewNode) {\n        const style = this.viewport.window.getComputedStyle(parentViewNode);\n        const paddingBlockStart = parseFloat(style.paddingBlockStart);\n        const borderBlockStartWidth = parseFloat(style.borderBlockStartWidth);\n        if (paddingBlockStart || borderBlockStartWidth) {\n          // parent's viewNode has block-start padding or border\n          return null;\n        }\n        let node = parentViewNode?.firstChild;\n        while (\n          node &&\n          (Vtree.canIgnore(node, nc.parent.whitespace) ||\n            (!nc.floatSide && LayoutHelper.isOutOfFlow(node)))\n        ) {\n          node = node.nextSibling;\n        }\n        if (node && node !== nc.viewNode) {\n          // parent's viewNode already has other content\n          return null;\n        }\n      }\n    }\n\n    const startBreakType = (\n      this.context as Exprs.Context & {\n        currentLayoutPosition: Vtree.LayoutPosition;\n      }\n    )?.currentLayoutPosition?.flowPositions[this.flowName]?.startBreakType;\n\n    if (Break.isForcedBreakValue(startBreakType)) {\n      return startBreakType; // forced break\n    } else {\n      return \"auto\"; // unforced break\n    }\n  }\n\n  private isInsideTable(nodeContext: Vtree.NodeContext): boolean {\n    for (let nc = nodeContext; nc && !nc.after; nc = nc.parent) {\n      if (nc.display && nc.display.startsWith(\"table\")) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private processAfterIfcontinues(\n    element: Element,\n    cascStyle: CssCascade.ElementStyle,\n    styler: CssStyler.AbstractStyler,\n    context: Exprs.Context,\n  ) {\n    const pseudoMap = this.getPseudoMap(\n      cascStyle,\n      this.regionIds,\n      this.isFootnote,\n      this.nodeContext,\n      context,\n    );\n    if (!pseudoMap) {\n      return;\n    }\n    if (\n      pseudoMap[\"after-if-continues\"] &&\n      pseudoMap[\"after-if-continues\"][\"content\"]\n    ) {\n      const shadowStyler = new PseudoElement.PseudoelementStyler(\n        element,\n        cascStyle,\n        styler,\n        context,\n        this.exprContentListener,\n      );\n      this.nodeContext.afterIfContinues = new Layout.AfterIfContinues(\n        element,\n        shadowStyler,\n      );\n    }\n  }\n\n  isSVGUrlAttribute(attributeName: string): boolean {\n    return ViewFactory.SVG_URL_ATTRIBUTES.includes(attributeName.toLowerCase());\n  }\n\n  modifyElemDimensionWithImageResolution(\n    images: {\n      image: HTMLElement;\n      element: HTMLElement;\n      fetcher: TaskUtil.Fetcher<string>;\n    }[],\n    imageResolution: number,\n    computedStyle: { [key: string]: Css.Val },\n    isVertical: boolean,\n  ) {\n    images.forEach((param) => {\n      if (param.fetcher.get().get() === \"load\") {\n        const img = param.image;\n        let scaledWidth = (img as HTMLImageElement).width / imageResolution;\n        let scaledHeight = (img as HTMLImageElement).height / imageResolution;\n        const elem = param.element;\n        if (scaledWidth > 0 && scaledHeight > 0) {\n          if (computedStyle[\"box-sizing\"] === Css.ident.border_box) {\n            if (computedStyle[\"border-left-style\"] !== Css.ident.none) {\n              scaledWidth += Css.toNumber(\n                computedStyle[\"border-left-width\"],\n                this.context,\n              );\n            }\n            if (computedStyle[\"border-right-style\"] !== Css.ident.none) {\n              scaledWidth += Css.toNumber(\n                computedStyle[\"border-right-width\"],\n                this.context,\n              );\n            }\n            if (computedStyle[\"border-top-style\"] !== Css.ident.none) {\n              scaledHeight += Css.toNumber(\n                computedStyle[\"border-top-width\"],\n                this.context,\n              );\n            }\n            if (computedStyle[\"border-bottom-style\"] !== Css.ident.none) {\n              scaledHeight += Css.toNumber(\n                computedStyle[\"border-bottom-width\"],\n                this.context,\n              );\n            }\n          }\n          if (imageResolution > 1) {\n            const maxWidth = computedStyle[\"max-width\"] || Css.ident.none;\n            const maxHeight = computedStyle[\"max-height\"] || Css.ident.none;\n            if (maxWidth === Css.ident.none && maxHeight === Css.ident.none) {\n              Base.setCSSProperty(elem, \"max-width\", `${scaledWidth}px`);\n            } else if (\n              maxWidth !== Css.ident.none &&\n              maxHeight === Css.ident.none\n            ) {\n              Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n            } else if (\n              maxWidth === Css.ident.none &&\n              maxHeight !== Css.ident.none\n            ) {\n              Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n            } else {\n              // maxWidth != none && maxHeight != none\n              Asserts.assert(maxWidth.isNumeric());\n              Asserts.assert(maxHeight.isNumeric());\n              const numericMaxWidth = maxWidth as Css.Numeric;\n              const numericMaxHeight = maxHeight as Css.Numeric;\n              if (numericMaxWidth.unit !== \"%\") {\n                Base.setCSSProperty(\n                  elem,\n                  \"max-width\",\n                  `${Math.min(\n                    scaledWidth,\n                    Css.toNumber(numericMaxWidth, this.context),\n                  )}px`,\n                );\n              } else if (numericMaxHeight.unit !== \"%\") {\n                Base.setCSSProperty(\n                  elem,\n                  \"max-height\",\n                  `${Math.min(\n                    scaledHeight,\n                    Css.toNumber(numericMaxHeight, this.context),\n                  )}px`,\n                );\n              } else {\n                if (isVertical) {\n                  Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n                } else {\n                  Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n                }\n              }\n            }\n          } else if (imageResolution < 1) {\n            const minWidth = computedStyle[\"min-width\"] || Css.numericZero;\n            const minHeight = computedStyle[\"min-height\"] || Css.numericZero;\n            Asserts.assert(minWidth.isNumeric());\n            Asserts.assert(minWidth.isNumeric());\n            const numericMinWidth = minWidth as Css.Numeric;\n            const numericMinHeight = minHeight as Css.Numeric;\n            if (numericMinWidth.num === 0 && numericMinHeight.num === 0) {\n              Base.setCSSProperty(elem, \"min-width\", `${scaledWidth}px`);\n            } else if (\n              numericMinWidth.num !== 0 &&\n              numericMinHeight.num === 0\n            ) {\n              Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n            } else if (\n              numericMinWidth.num === 0 &&\n              numericMinHeight.num !== 0\n            ) {\n              Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n            } else {\n              // minWidth != 0 && minHeight != 0\n              if (numericMinWidth.unit !== \"%\") {\n                Base.setCSSProperty(\n                  elem,\n                  \"min-width\",\n                  `${Math.max(\n                    scaledWidth,\n                    Css.toNumber(numericMinWidth, this.context),\n                  )}px`,\n                );\n              } else if (numericMinHeight.unit !== \"%\") {\n                Base.setCSSProperty(\n                  elem,\n                  \"min-height\",\n                  `${Math.max(\n                    scaledHeight,\n                    Css.toNumber(numericMinHeight, this.context),\n                  )}px`,\n                );\n              } else {\n                if (isVertical) {\n                  Base.setCSSProperty(elem, \"height\", `${scaledHeight}px`);\n                } else {\n                  Base.setCSSProperty(elem, \"width\", `${scaledWidth}px`);\n                }\n              }\n            }\n          }\n        }\n      }\n    });\n  }\n\n  private preprocessElementStyle(computedStyle: { [key: string]: Css.Val }) {\n    const hooks: Plugin.PreProcessElementStyleHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.PREPROCESS_ELEMENT_STYLE,\n    );\n    hooks.forEach((hook) => {\n      hook(this.nodeContext, computedStyle);\n    });\n  }\n\n  private findAndProcessRepeatingElements(\n    element: Element,\n    styler: CssStyler.AbstractStyler,\n  ) {\n    for (\n      let child: Node = element.firstChild;\n      child;\n      child = child.nextSibling\n    ) {\n      if (child.nodeType !== 1) {\n        continue;\n      }\n      const computedStyle: { [key: string]: Css.Val } = {};\n      const elementStyle = styler.getStyle(child as Element, false);\n      this.computeStyle(\n        this.nodeContext.vertical,\n        this.nodeContext.direction === \"rtl\",\n        elementStyle,\n        computedStyle,\n      );\n      const processRepeatOnBreak = this.processRepeatOnBreak(computedStyle);\n      if (!processRepeatOnBreak) {\n        continue;\n      }\n      if (\n        this.nodeContext.formattingContext instanceof\n          RepetitiveElement.RepetitiveElementsOwnerFormattingContext &&\n        !this.nodeContext.belongsTo(this.nodeContext.formattingContext)\n      ) {\n        return;\n      }\n      const parent = this.nodeContext.parent;\n      const parentFormattingContext = parent && parent.formattingContext;\n      this.nodeContext.formattingContext =\n        new RepetitiveElement.RepetitiveElementsOwnerFormattingContext(\n          parentFormattingContext,\n          this.nodeContext.sourceNode as Element,\n        );\n      (\n        this.nodeContext\n          .formattingContext as RepetitiveElement.RepetitiveElementsOwnerFormattingContext\n      ).initializeRepetitiveElements(this.nodeContext.vertical);\n      return;\n    }\n  }\n\n  private processRepeatOnBreak(computedStyle: { [key: string]: Css.Val }) {\n    let repeatOnBreak = computedStyle[\"repeat-on-break\"];\n    if (repeatOnBreak !== Css.ident.none) {\n      if (\n        repeatOnBreak === Css.ident.auto ||\n        Css.isDefaultingValue(repeatOnBreak)\n      ) {\n        if (computedStyle[\"display\"] === Css.ident.table_header_group) {\n          repeatOnBreak = Css.ident.header;\n        } else if (computedStyle[\"display\"] === Css.ident.table_footer_group) {\n          repeatOnBreak = Css.ident.footer;\n        } else {\n          repeatOnBreak = Css.ident.none;\n        }\n      }\n      if (repeatOnBreak && repeatOnBreak !== Css.ident.none) {\n        return repeatOnBreak.toString();\n      }\n    }\n    return null;\n  }\n\n  private createTextNodeView(): Task.Result<boolean> {\n    const frame: Task.Frame<boolean> = Task.newFrame(\"createTextNodeView\");\n    this.preprocessTextContent().then(() => {\n      const offsetInNode = this.offsetInNode || 0;\n      const textContent = Diff.restoreNewText(\n        this.nodeContext.preprocessedTextContent,\n      ).substr(offsetInNode);\n      this.viewNode = document.createTextNode(textContent);\n      frame.finish(true);\n    });\n    return frame.result();\n  }\n\n  private preprocessTextContent(): Task.Result<boolean> {\n    if (this.nodeContext.preprocessedTextContent != null) {\n      return Task.newResult(true);\n    }\n    let originl: string;\n    let textContent = (originl = this.sourceNode.textContent);\n    const frame: Task.Frame<boolean> = Task.newFrame(\"preprocessTextContent\");\n    const hooks: Plugin.PreProcessTextContentHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.PREPROCESS_TEXT_CONTENT,\n    );\n    let index = 0;\n    frame\n      .loop(() => {\n        if (index >= hooks.length) {\n          return Task.newResult(false);\n        }\n        return hooks[index++](this.nodeContext, textContent).thenAsync(\n          (processedText) => {\n            textContent = processedText;\n            return Task.newResult(true);\n          },\n        );\n      })\n      .then(() => {\n        this.nodeContext.preprocessedTextContent = Diff.diffChars(\n          originl,\n          textContent,\n        );\n        frame.finish(true);\n      });\n    return frame.result();\n  }\n\n  /**\n   * @return holding true if children should be processed\n   */\n  createNodeView(\n    firstTime: boolean,\n    atUnforcedBreak: boolean,\n  ): Task.Result<boolean> {\n    const frame: Task.Frame<boolean> = Task.newFrame(\"createNodeView\");\n    let result: Task.Result<boolean>;\n    let needToProcessChildren = true;\n    if (this.sourceNode.nodeType == 1) {\n      result = this.createElementView(firstTime, atUnforcedBreak);\n    } else {\n      if (this.sourceNode.nodeType == 8) {\n        this.viewNode = null; // comment node\n        result = Task.newResult(true);\n      } else {\n        result = this.createTextNodeView();\n      }\n    }\n    result.then((processChildren) => {\n      needToProcessChildren = processChildren;\n      this.nodeContext.viewNode = this.viewNode;\n      if (this.viewNode) {\n        const isPseudo = (node: Node, name: string): boolean =>\n          node?.nodeType === 1 &&\n          PseudoElement.getPseudoName(node as Element) === name;\n        const p = this.nodeContext.parent;\n        const parent = p\n          ? isPseudo(this.viewNode, \"after\") &&\n            isPseudo(p.viewNode, \"first-letter\") &&\n            p.viewNode?.hasChildNodes()\n            ? (p.parent.viewNode as Element) // Fix for issue #1175\n            : (p.viewNode as Element)\n          : this.viewRoot;\n        if (parent) {\n          if (\n            this.nodeContext.inline &&\n            // ignore whitespace text node\n            !(this.viewNode.nodeType === 3 && Vtree.canIgnore(this.viewNode)) &&\n            !parent.hasChildNodes() &&\n            Break.getBoxBreakFlags(parent).includes(\"block-start\")\n          ) {\n            Break.setBoxBreakFlag(parent, \"text-start\");\n          }\n          parent.appendChild(this.viewNode);\n\n          // Fix overflow caused by forced column breaks\n          LayoutHelper.fixOverflowAtForcedColumnBreak(this.viewNode);\n        }\n      }\n      frame.finish(needToProcessChildren);\n    });\n    return frame.result();\n  }\n\n  /** @override */\n  setCurrent(\n    nodeContext: Vtree.NodeContext,\n    firstTime: boolean,\n    atUnforcedBreak?: boolean,\n  ): Task.Result<boolean> {\n    this.nodeContext = nodeContext;\n    if (nodeContext) {\n      this.sourceNode = nodeContext.sourceNode;\n      this.offsetInNode = nodeContext.offsetInNode;\n    } else {\n      this.sourceNode = null;\n      this.offsetInNode = -1;\n    }\n    this.viewNode = null;\n    if (this.nodeContext) {\n      return this.createNodeView(firstTime, !!atUnforcedBreak);\n    }\n    return Task.newResult(true);\n  }\n\n  processShadowContent(pos: Vtree.NodeContext): Vtree.NodeContext {\n    if (\n      pos.shadowContext == null ||\n      (pos.sourceNode as Element).localName != \"content\" ||\n      (pos.sourceNode as Element).namespaceURI != Base.NS.SHADOW\n    ) {\n      return pos;\n    }\n    const boxOffset = pos.boxOffset;\n    const shadow = pos.shadowContext;\n    const parent = pos.parent;\n\n    // content that will be inserted\n    let contentNode: Node;\n    let contentShadowType: Vtree.ShadowType;\n    const contentShadow = shadow.subShadow || shadow.parentShadow;\n    if (shadow.subShadow) {\n      contentNode = shadow.root;\n      contentShadowType = shadow.type;\n      if (contentShadowType == Vtree.ShadowType.ROOTLESS) {\n        contentNode = contentNode.firstChild;\n      }\n    } else {\n      contentNode = shadow.owner.firstChild;\n      contentShadowType = Vtree.ShadowType.ROOTLESS;\n    }\n    const nextSibling = pos.sourceNode.nextSibling;\n    if (nextSibling) {\n      pos.sourceNode = nextSibling;\n      pos.resetView();\n    } else if (pos.shadowSibling) {\n      pos = pos.shadowSibling;\n    } else if (contentNode) {\n      pos = null;\n    } else {\n      pos = pos.parent.modify();\n      pos.after = true;\n    }\n    if (contentNode) {\n      const r = new Vtree.NodeContext(contentNode, parent, boxOffset);\n      r.shadowContext = contentShadow;\n      r.shadowType = contentShadowType;\n      r.shadowSibling = pos;\n      return r;\n    }\n    pos.boxOffset = boxOffset;\n    return pos;\n  }\n\n  private nextPositionInTree(pos: Vtree.NodeContext): Vtree.NodeContext {\n    let boxOffset = pos.boxOffset + 1; // offset for the next position\n    if (pos.after) {\n      // root, that was the last possible position\n      if (!pos.parent) {\n        return null;\n      }\n\n      // we are done with this sourceNode, see if there is a next sibling,\n      // unless this is the root of the shadow tree\n      if (pos.shadowType != Vtree.ShadowType.ROOTED) {\n        const next = pos.sourceNode.nextSibling;\n        if (next) {\n          pos = pos.modify();\n\n          // keep shadowType\n          pos.boxOffset = boxOffset;\n          pos.sourceNode = next;\n          pos.resetView();\n          return this.processShadowContent(pos);\n        }\n      }\n\n      // if no viable siblings, check if there are shadow siblings\n      if (pos.shadowSibling) {\n        // our next position is the element after shadow:content in the parent\n        // shadow tree\n        pos = pos.shadowSibling.modify();\n        pos.boxOffset = boxOffset;\n        return pos;\n      }\n\n      // if not rootless shadow, move to the \"after\" position for the parent\n      pos = pos.parent.modify();\n      pos.boxOffset = boxOffset;\n      pos.after = true;\n      return pos;\n    } else {\n      // any shadow trees?\n      if (pos.nodeShadow) {\n        let shadowNode: Node | null = pos.nodeShadow.root;\n        if (pos.nodeShadow.type == Vtree.ShadowType.ROOTLESS) {\n          shadowNode = shadowNode.firstChild;\n        }\n        if (shadowNode) {\n          const sr = new Vtree.NodeContext(shadowNode, pos, boxOffset);\n          sr.shadowContext = pos.nodeShadow;\n          sr.shadowType = pos.nodeShadow.type;\n          return this.processShadowContent(sr);\n        }\n      }\n\n      // any children?\n      const child = pos.sourceNode.firstChild;\n      if (child) {\n        return this.processShadowContent(\n          new Vtree.NodeContext(child, pos, boxOffset),\n        );\n      }\n\n      // no children - was there text content?\n      if (pos.sourceNode.nodeType != 1) {\n        const content = Diff.restoreNewText(pos.preprocessedTextContent);\n        boxOffset += content.length - 1 - pos.offsetInNode;\n      }\n      pos = pos.modify();\n      pos.boxOffset = boxOffset;\n      pos.after = true;\n      return pos;\n    }\n  }\n\n  isTransclusion(\n    element: Element,\n    elementStyle: CssCascade.ElementStyle,\n    transclusionType: string | null,\n  ) {\n    const proc = CssCascade.getProp(elementStyle, \"hyperlink-processing\");\n    if (!proc) {\n      return false;\n    }\n    const prop = proc.evaluate(this.context, \"hyperlink-processing\");\n    if (!prop) {\n      return false;\n    }\n    return prop.toString() == transclusionType;\n  }\n\n  /** @override */\n  nextInTree(\n    position: Vtree.NodeContext,\n    atUnforcedBreak?: boolean,\n  ): Task.Result<Vtree.NodeContext> {\n    let nodeContext = this.nextPositionInTree(position);\n    if (!nodeContext || nodeContext.after) {\n      return Task.newResult(nodeContext);\n    }\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"nextInTree\");\n    this.setCurrent(nodeContext, true, atUnforcedBreak).then(\n      (processChildren) => {\n        if (!nodeContext.viewNode || !processChildren) {\n          nodeContext = nodeContext.modify();\n          nodeContext.after = true; // skip\n          if (!nodeContext.viewNode) {\n            nodeContext.inline = true;\n          }\n        }\n        this.dispatchEvent({ type: \"nextInTree\", nodeContext } as any);\n        frame.finish(nodeContext);\n      },\n    );\n    return frame.result();\n  }\n\n  addImageFetchers(bg: Css.Val) {\n    if (bg instanceof Css.CommaList) {\n      const values = (bg as Css.CommaList).values;\n      for (let i = 0; i < values.length; i++) {\n        this.addImageFetchers(values[i]);\n      }\n    } else if (bg instanceof Css.URL) {\n      const url = (bg as Css.URL).url;\n      this.page.fetchers.push(Net.loadElement(new Image(), url));\n    }\n  }\n\n  applyComputedStyles(\n    target: Element,\n    computedStyle: { [key: string]: Css.Val },\n  ) {\n    const bg = computedStyle[\"background-image\"];\n    if (bg) {\n      this.addImageFetchers(bg);\n    }\n    const isRelativePositioned =\n      computedStyle[\"position\"] === Css.ident.relative;\n    const isRoot =\n      this.nodeContext?.parent === null &&\n      this.sourceNode?.parentElement === null &&\n      !!this.viewRoot?.parentElement;\n\n    const propList = Object.keys(computedStyle);\n    propList.sort(Css.processingOrderFn);\n    let fontSize: Css.Val;\n    let lineHeight: Css.Val;\n\n    for (const propName of propList) {\n      if (propertiesNotPassedToDOM[propName]) {\n        continue;\n      }\n      let value = computedStyle[propName];\n      if (!value || (value === Css.empty && !Css.isCustomPropName(propName))) {\n        continue;\n      }\n      value = value.visit(\n        new CssProp.UrlTransformVisitor(\n          this.xmldoc.url,\n          this.documentURLTransformer,\n        ),\n      );\n      if (value instanceof Css.Numeric) {\n        if (value.unit === \"em\") {\n          const emUnitSize = this.getEmUnitSize(propName, fontSize);\n          if (emUnitSize != null) {\n            value = new Css.Numeric(value.num * emUnitSize, \"px\");\n          }\n        } else if (value.unit === \"lh\") {\n          const lhUnitSize = this.getLineHeightUnitSize(\n            propName,\n            fontSize,\n            lineHeight,\n          );\n          if (lhUnitSize != null) {\n            value = new Css.Numeric(value.num * lhUnitSize, \"px\");\n          }\n        } else if (Exprs.needUnitConversion(value.unit)) {\n          // font-size for the root element is already converted to px\n          value = Css.convertNumericToPx(value, this.context);\n        }\n      }\n\n      if (propName === \"font-size\" || propName === \"line-height\") {\n        if (propName === \"font-size\") {\n          fontSize = value;\n        } else {\n          lineHeight = value;\n        }\n\n        // Adjust font-size and line-height to prevent rounding issues\n        // when calculating the size of text and line boxes. (Issue #1590)\n        //\n        // Chromium and Firefox round to the nearest multiple of LayoutUnit\n        // (the smallest unit of length in the browser) when positioning boxes,\n        // which may cause the box size to be slightly larger than specified,\n        // resulting in text not fitting in the specified number of characters/lines.\n        // To prevent this, we adjust the font size and line height to be\n        // 1 LayoutUnit less.\n        if (\n          this.viewport.layoutUnitAdj &&\n          value instanceof Css.Numeric &&\n          value.unit !== \"%\" &&\n          value.unit !== \"em\" &&\n          value.unit !== \"lh\"\n        ) {\n          value = new Css.AnyToken(\n            `calc(${value.toString()} - var(--viv-layoutUnitAdj))`,\n          );\n        }\n      }\n\n      if (\n        Vtree.delayedProps[propName] ||\n        (isRelativePositioned &&\n          Vtree.delayedPropsIfRelativePositioned[propName])\n      ) {\n        // Set it after page layout is done.\n        this.page.delayedItems.push(\n          new Vtree.DelayedItem(target, propName, value),\n        );\n        continue;\n      }\n      if (\n        isRoot &&\n        this.page.pageAreaElement &&\n        CssCascade.isInherited(propName)\n      ) {\n        // Fix for Issue #568\n        Base.setCSSProperty(\n          this.page.pageAreaElement.parentElement.parentElement,\n          propName,\n          value.toString(),\n        );\n      } else {\n        Base.setCSSProperty(target, propName, value.toString());\n      }\n    }\n  }\n\n  /**\n   * Parse a CSS value with \"px\" unit plus layoutUnitAdj.\n   * This is to get accurate font-size and line-height values from computed style\n   * that have been set with minus layoutUnitAdj.\n   * @param val CSS value string\n   * @returns parsed and adjusted value in px, or null if cannot parse as \"px\" unit, e.g. \"normal\"\n   */\n  private parsePlusLayoutUnitAdj(val: string): number | null {\n    if (val.endsWith(\"px\")) {\n      const parsedVal = parseFloat(val);\n      if (!isNaN(parsedVal)) {\n        return (\n          Math.round(\n            (parsedVal + this.viewport.layoutUnitAdj) *\n              this.viewport.layoutUnitPerPixel,\n          ) / this.viewport.layoutUnitPerPixel\n        );\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Get \"lh\" unit size in px\n   * @return line-height in px, or null if cannot be determined\n   */\n  private getLineHeightUnitSize(\n    propName: string,\n    fontSize: Css.Val,\n    lineHeight: Css.Val,\n  ): number | null {\n    const parentStyle =\n      this.nodeContext?.parent?.viewNode?.nodeType === 1\n        ? this.viewport.window.getComputedStyle(\n            this.nodeContext.parent.viewNode as Element,\n          )\n        : null;\n\n    const parentLineHeight = parentStyle\n      ? this.parsePlusLayoutUnitAdj(parentStyle.lineHeight)\n      : this.context.rootLineHeight;\n\n    if (propName === \"line-height\" || propName === \"font-size\") {\n      // For line-height property or for font-size property, return parent line-height.\n      // Note: parentLineHeight may be null (cannot determine).\n      return parentLineHeight;\n    }\n\n    // Font-size relative line-height value\n    let lineHeightNum: number | null = null;\n\n    if (lineHeight) {\n      if (\n        lineHeight instanceof Css.Num ||\n        (lineHeight instanceof Css.Numeric &&\n          (lineHeight.unit === \"em\" || lineHeight.unit === \"%\"))\n      ) {\n        // The line-height is relative to the font-size\n        lineHeightNum =\n          lineHeight instanceof Css.Numeric && lineHeight.unit === \"%\"\n            ? lineHeight.num / 100\n            : lineHeight.num;\n      } else {\n        if (lineHeight instanceof Css.Numeric && lineHeight.unit !== \"lh\") {\n          const unitSize = this.context.queryUnitSize(lineHeight.unit, false);\n          if (unitSize != null) {\n            // Return line-height in px\n            return lineHeight.num * unitSize;\n          }\n        }\n        return null; // cannot determine\n      }\n    }\n\n    if (lineHeightNum == null) {\n      // Try to get font-size relative line-height value from ancestor elements\n      for (\n        let viewNode = this.nodeContext?.parent?.viewNode;\n        viewNode && viewNode.nodeType === 1;\n        viewNode = viewNode.parentNode\n      ) {\n        const ancestorLH = (viewNode as HTMLElement)?.style?.lineHeight;\n        if (ancestorLH) {\n          // Found line-height style in ancestor\n          if (/^[0-9.]+$/.test(ancestorLH)) {\n            // If it's a number without unit, it's relative to font-size\n            lineHeightNum = parseFloat(ancestorLH);\n          }\n          break;\n        }\n      }\n    }\n\n    if (lineHeightNum != null) {\n      // The line-height is relative to the font-size\n      if (fontSize && !(fontSize instanceof Css.Numeric)) {\n        return null; // cannot determine\n      }\n      const parentFontSize = parentStyle\n        ? this.parsePlusLayoutUnitAdj(parentStyle.fontSize)\n        : this.context.rootFontSize;\n      if (fontSize instanceof Css.Numeric) {\n        const fontSizePx = CssCascade.convertFontSizeToPx(\n          fontSize,\n          parentFontSize,\n          this.context,\n        ).num;\n        // parentFontSize may be null and the fontSizePx may be NaN\n        if (typeof fontSizePx !== \"number\" || isNaN(fontSizePx)) {\n          return null; // cannot determine\n        }\n        return lineHeightNum * fontSizePx;\n      } else {\n        if (parentFontSize == null) {\n          return null;\n        }\n        return lineHeightNum * parentFontSize;\n      }\n    }\n    // parentLineHeight may be null (cannot determine)\n    return parentLineHeight;\n  }\n\n  /**\n   * Get \"em\" unit size in px\n   * @return font-size in px, or null if cannot be determined\n   */\n  private getEmUnitSize(propName: string, fontSize: Css.Val): number | null {\n    const parentStyle =\n      this.nodeContext?.parent?.viewNode?.nodeType === 1\n        ? this.viewport.window.getComputedStyle(\n            this.nodeContext.parent.viewNode as Element,\n          )\n        : null;\n\n    const parentFontSize = parentStyle\n      ? this.parsePlusLayoutUnitAdj(parentStyle.fontSize)\n      : this.context.rootFontSize;\n\n    if (propName === \"font-size\" || fontSize == null) {\n      // For font-size property or when font-size is not specified, return parent font-size.\n      // Note: parentFontSize may be null (cannot determine).\n      return parentFontSize;\n    }\n    if (fontSize instanceof Css.Numeric) {\n      // When font-size is specified, convert it to px\n      const fontSizePx = CssCascade.convertFontSizeToPx(\n        fontSize,\n        parentFontSize,\n        this.context,\n      ).num;\n      if (typeof fontSizePx === \"number\" && !isNaN(fontSizePx)) {\n        return fontSizePx;\n      }\n    }\n    return null; // cannot determine\n  }\n\n  /** @override */\n  applyPseudoelementStyle(\n    nodeContext: Vtree.NodeContext,\n    pseudoName: string,\n    target: Element,\n  ): void {\n    if (nodeContext.after) {\n      return;\n    }\n    const element = this.sourceNode as Element;\n    const styler = nodeContext.shadowContext\n      ? (nodeContext.shadowContext.styler as CssStyler.AbstractStyler)\n      : this.styler;\n    let elementStyle = styler.getStyle(element, false);\n    const pseudoMap = CssCascade.getStyleMap(elementStyle, \"_pseudos\");\n    if (!pseudoMap) {\n      return;\n    }\n    elementStyle = pseudoMap[pseudoName];\n    if (!elementStyle) {\n      return;\n    }\n    const computedStyle: { [key: string]: Css.Val } = {};\n    nodeContext.vertical = this.computeStyle(\n      nodeContext.vertical,\n      nodeContext.direction === \"rtl\",\n      elementStyle,\n      computedStyle,\n    );\n    const content = computedStyle[\"content\"];\n    if (Vtree.nonTrivialContent(content)) {\n      content.visit(\n        new Vtree.ContentPropertyHandler(\n          target,\n          this.context,\n          content,\n          this.exprContentListener,\n        ),\n      );\n      delete computedStyle[\"content\"];\n    }\n    this.applyComputedStyles(target, computedStyle);\n  }\n\n  /** @override */\n  peelOff(\n    nodeContext: Vtree.NodeContext,\n    nodeOffset: number,\n  ): Task.Result<Vtree.NodeContext> {\n    const frame: Task.Frame<Vtree.NodeContext> = Task.newFrame(\"peelOff\");\n    const firstPseudo = nodeContext.firstPseudo;\n    let offsetInNode = nodeContext.offsetInNode;\n    const after = nodeContext.after;\n    if (nodeOffset > 0) {\n      const text = nodeContext.viewNode.textContent;\n      nodeContext.viewNode.textContent = text.substr(0, nodeOffset);\n      offsetInNode += nodeOffset;\n    } else if (!after && nodeContext.viewNode && offsetInNode == 0) {\n      const parent = nodeContext.viewNode.parentNode;\n      if (parent) {\n        parent.removeChild(nodeContext.viewNode);\n      }\n    }\n    const boxOffset = nodeContext.boxOffset + nodeOffset;\n    const arr = [];\n    while (nodeContext.firstPseudo === firstPseudo) {\n      arr.push(nodeContext);\n      nodeContext = nodeContext.parent;\n    }\n    let pn = arr.pop(); // container for that pseudoelement\n    let shadowSibling = pn.shadowSibling;\n    frame\n      .loop(() => {\n        while (arr.length > 0) {\n          pn = arr.pop();\n          nodeContext = new Vtree.NodeContext(\n            pn.sourceNode,\n            nodeContext,\n            boxOffset,\n          );\n          if (arr.length == 0) {\n            nodeContext.offsetInNode = offsetInNode;\n            nodeContext.after = after;\n          }\n          nodeContext.shadowType = pn.shadowType;\n          nodeContext.shadowContext = pn.shadowContext;\n          nodeContext.nodeShadow = pn.nodeShadow;\n          nodeContext.shadowSibling = pn.shadowSibling\n            ? pn.shadowSibling\n            : shadowSibling;\n          shadowSibling = null;\n          const result = this.setCurrent(nodeContext, false);\n          if (result.isPending()) {\n            return result;\n          }\n        }\n        return Task.newResult(false);\n      })\n      .then(() => {\n        frame.finish(nodeContext);\n      });\n    return frame.result();\n  }\n\n  createElement(ns: string, tag: string): Element {\n    if (ns == Base.NS.XHTML) {\n      return this.document.createElement(tag);\n    }\n    return this.document.createElementNS(ns, tag);\n  }\n\n  /** @override */\n  applyFootnoteStyle(\n    vertical: boolean,\n    rtl: boolean,\n    target: Element,\n  ): boolean {\n    const computedStyle: { [key: string]: Css.Val } = {};\n    const pseudoMap = CssCascade.getStyleMap(this.footnoteStyle, \"_pseudos\");\n    vertical = this.computeStyle(\n      vertical,\n      rtl,\n      this.footnoteStyle,\n      computedStyle,\n    );\n    if (pseudoMap && pseudoMap[\"before\"]) {\n      const childComputedStyle: { [key: string]: Css.Val } = {};\n      const span = this.createElement(Base.NS.XHTML, \"span\");\n      PseudoElement.setPseudoName(span, \"before\");\n      target.appendChild(span);\n      this.computeStyle(vertical, rtl, pseudoMap[\"before\"], childComputedStyle);\n      delete childComputedStyle[\"content\"];\n      this.applyComputedStyles(span, childComputedStyle);\n    }\n    delete computedStyle[\"content\"];\n    this.applyComputedStyles(target, computedStyle);\n    return vertical;\n  }\n\n  /** @override */\n  processFragmentedBlockEdge(nodeContext: Vtree.NodeContext) {\n    const nodeContext1 =\n      !nodeContext.inline && nodeContext.after\n        ? nodeContext.parent\n        : nodeContext;\n    // Fix for problem with math (Issue #1038)\n    let isBeforeBlock = false;\n    if (\n      nodeContext.inline &&\n      nodeContext.after &&\n      !nodeContext.shadowContext &&\n      nodeContext.sourceNode.nextSibling?.nodeType === 1\n    ) {\n      const nextElem = nodeContext.sourceNode.nextSibling as Element;\n      const display = CssCascade.getProp(\n        this.styler.getStyle(nextElem, false),\n        \"display\",\n      )?.value.toString();\n      isBeforeBlock =\n        (display && !Display.isInlineLevel(display)) ||\n        (nextElem.getAttribute(\"data-math-typeset\") === \"true\" &&\n          /^\\s*(\\$\\$|\\\\\\[)/.test(nextElem.textContent));\n    }\n\n    let blockNestCount = 0;\n    for (let nc = nodeContext1; nc; nc = nc.parent) {\n      if (nc.viewNode?.nodeType !== 1) continue;\n\n      const elem = nc.viewNode as HTMLElement;\n      if (!elem.style) continue;\n\n      if (nc.inline) {\n        Break.setBoxBreakFlag(elem, \"inline-end\");\n        if (Break.isCloneBoxDecorationBreak(elem)) {\n          const extentBefore = nc.vertical\n            ? elem.offsetWidth\n            : elem.offsetHeight;\n          Break.setBoxBreakFlag(elem, \"clone\");\n          const extentAfter = nc.vertical\n            ? elem.offsetWidth\n            : elem.offsetHeight;\n          if (extentAfter > extentBefore) {\n            // Workaround for Chrome box-decoration-break:clone problem\n            this.fixClonedBoxDecorationOverflow(elem);\n          }\n        }\n      } else {\n        const blockSizeP = this.nodeContext.vertical ? \"width\" : \"height\";\n        if (Base.getCSSProperty(elem, blockSizeP)) {\n          // When a box with a specified block size is fragmented,\n          // the fragmented box should not have the block size.\n          Base.setCSSProperty(elem, blockSizeP, \"\");\n        }\n        Break.setBoxBreakFlag(elem, \"block-end\");\n        if (!blockNestCount++) {\n          if (nc !== nodeContext1) {\n            const { textAlign } = this.viewport.window.getComputedStyle(elem);\n            if (textAlign === \"justify\" && !isBeforeBlock) {\n              // Workaround for the problem that text-align-last:justify is\n              // not only effective at the last line of the block but also\n              // effective at lines just before child block-level or `<br>`\n              // elements.\n              const elem2 = this.createChildAnonymousBlockIfNeeded(elem);\n              if (elem2) {\n                if (elem2 !== elem) {\n                  // child anonymous block created\n                  Break.setBoxBreakFlags(elem2, [\n                    \"block-start\",\n                    \"text-start\",\n                    \"block-end\",\n                    \"text-end\",\n                    \"justify\",\n                  ]);\n                } else {\n                  Break.setBoxBreakFlag(elem, \"text-end\");\n                  Break.setBoxBreakFlag(elem, \"justify\");\n                }\n              } else {\n                // text-align-last:justify is not necessary (`<br>` at very last)\n                // or not appropriate (e.g. the last `<br>` is in middle of nested inline)\n                Break.setBoxBreakFlag(elem, \"text-end\");\n              }\n            } else {\n              Break.setBoxBreakFlag(elem, \"text-end\");\n            }\n          }\n        }\n        if (Break.isCloneBoxDecorationBreak(elem)) {\n          Break.setBoxBreakFlag(elem, \"clone\");\n        }\n        Break.setMarginDiscardFlag(elem, \"block-end\");\n      }\n    }\n  }\n\n  private fixClonedBoxDecorationOverflow(elem: HTMLElement): void {\n    const computedStyle = this.viewport.window.getComputedStyle(elem);\n    const paddingInlineEnd = parseFloat(computedStyle.paddingInlineEnd);\n    const borderInlineEndWidth = parseFloat(computedStyle.borderInlineEndWidth);\n    const adjust = -(paddingInlineEnd + borderInlineEndWidth);\n    if (!isNaN(adjust)) {\n      elem.style.marginInlineEnd = `${adjust}px`;\n    }\n  }\n\n  private createChildAnonymousBlockIfNeeded(\n    elem: HTMLElement,\n  ): HTMLElement | null {\n    const checkForcedLineBreakElem = (elem1: Element): boolean | null => {\n      const { display, position, float } =\n        this.viewport.window.getComputedStyle(elem1);\n      if (elem1.localName === \"ruby\" || Base.mediaTags[elem1.localName]) {\n        return false;\n      }\n      if (elem1.localName === \"br\") {\n        return true;\n      }\n      if (\n        (display === \"inline\" || display === \"contents\") &&\n        elem1.hasChildNodes()\n      ) {\n        const lastChild = elem1.lastElementChild;\n        if (\n          lastChild &&\n          (!lastChild.nextSibling ||\n            (lastChild.nextSibling === elem1.lastChild &&\n              Vtree.canIgnore(lastChild.nextSibling)))\n        ) {\n          const found = checkForcedLineBreakElem(lastChild);\n          if (found || found === null) {\n            return found;\n          }\n        }\n        for (\n          let child = lastChild?.previousElementSibling;\n          child;\n          child = child.previousElementSibling\n        ) {\n          const found = checkForcedLineBreakElem(child);\n          if (found || found === null) {\n            // forced line break is found at middle of nested inline\n            return null;\n          }\n        }\n        return false;\n      }\n      if (\n        display === \"none\" ||\n        position === \"absolute\" ||\n        position === \"fixed\" ||\n        (float && float !== \"none\") ||\n        elem1.hasAttribute(LayoutHelper.SPECIAL_ATTR)\n      ) {\n        const prevElem = elem1.previousElementSibling;\n        if (\n          prevElem &&\n          (prevElem.nextSibling === elem1 ||\n            (prevElem.nextSibling === elem1.previousSibling &&\n              Vtree.canIgnore(prevElem.nextSibling)))\n        ) {\n          return checkForcedLineBreakElem(prevElem);\n        }\n        return false;\n      }\n      if (!display || Display.isInlineLevel(display)) {\n        return false;\n      }\n      return true;\n    };\n\n    let forcedBreakElem: Element | null = null;\n    for (\n      let child = elem.lastElementChild;\n      child;\n      child = child.previousElementSibling\n    ) {\n      const found = checkForcedLineBreakElem(child);\n      if (found) {\n        forcedBreakElem = child;\n        break;\n      }\n      if (found === null) {\n        // forced line break is found at middle of nested inline\n        return null;\n      }\n    }\n\n    if (!forcedBreakElem) {\n      // forced line break is not found\n      return elem;\n    }\n\n    if (\n      forcedBreakElem === elem.lastElementChild &&\n      (!forcedBreakElem.nextSibling ||\n        (forcedBreakElem.nextSibling === elem.lastChild &&\n          Vtree.canIgnore(forcedBreakElem.nextSibling)))\n    ) {\n      // forced line break is found at very last\n      return null;\n    }\n\n    const anonymousBlock = elem.ownerDocument.createElement(\"span\");\n    anonymousBlock.className = \"viv-anonymous-block\";\n\n    for (\n      let node = forcedBreakElem.nextSibling, nextNode = null;\n      node;\n      node = nextNode\n    ) {\n      nextNode = node.nextSibling;\n      anonymousBlock.appendChild(node);\n    }\n    elem.appendChild(anonymousBlock);\n    return anonymousBlock;\n  }\n\n  /** @override */\n  convertLengthToPx(\n    numeric: Css.Numeric,\n    viewNode: Node,\n    clientLayout: Vtree.ClientLayout,\n  ): number | Css.Numeric {\n    const num = numeric.num;\n    const unit = numeric.unit;\n    if (Exprs.isFontRelativeLengthUnit(unit)) {\n      let elem = viewNode;\n      while (elem && elem.nodeType !== 1) {\n        elem = elem.parentNode;\n      }\n      Asserts.assert(elem);\n      const fontSize = parseFloat(\n        clientLayout.getElementComputedStyle(elem as Element)[\"font-size\"],\n      );\n      Asserts.assert(this.context);\n      return CssCascade.convertFontRelativeLengthToPx(\n        numeric,\n        fontSize,\n        this.context,\n      ).num;\n    } else {\n      const unitSize = this.context.queryUnitSize(unit, false);\n      if (unitSize) {\n        return num * unitSize;\n      } else {\n        return numeric;\n      }\n    }\n  }\n\n  /**\n   * Returns if two NodePositionStep are equivalent.\n   */\n  isSameNodePositionStep(\n    step1: Vtree.NodePositionStep,\n    step2: Vtree.NodePositionStep,\n  ): boolean {\n    if (step1.shadowContext) {\n      if (!step2.shadowContext) {\n        return false;\n      }\n      const elem1 =\n        step1.node.nodeType === 1\n          ? (step1.node as Element)\n          : (step1.node.parentElement as Element);\n      const elem2 =\n        step2.node.nodeType === 1\n          ? (step2.node as Element)\n          : (step2.node.parentElement as Element);\n      return (\n        step1.shadowContext.owner === step2.shadowContext.owner &&\n        PseudoElement.getPseudoName(elem1) ===\n          PseudoElement.getPseudoName(elem2)\n      );\n    } else {\n      return step1.node === step2.node;\n    }\n  }\n\n  /** @override */\n  isSameNodePosition(\n    nodePosition1: Vtree.NodePosition,\n    nodePosition2: Vtree.NodePosition,\n  ): boolean {\n    return (\n      nodePosition1.offsetInNode === nodePosition2.offsetInNode &&\n      nodePosition1.after == nodePosition2.after &&\n      nodePosition1.steps.length === nodePosition2.steps.length &&\n      nodePosition1.steps.every((step1, i) => {\n        const step2 = nodePosition2.steps[i];\n        return this.isSameNodePositionStep(step1, step2);\n      })\n    );\n  }\n\n  isPseudoelement(elem) {\n    return !!PseudoElement.getPseudoName(elem);\n  }\n}\n\nexport const propertiesNotPassedToDOM = {\n  \"float-min-wrap-block\": true,\n  \"float-reference\": true,\n  \"flow-into\": true,\n  \"flow-linger\": true,\n  \"flow-options\": true,\n  \"flow-priority\": true,\n  \"footnote-policy\": true,\n  \"margin-break\": true,\n  page: true,\n};\n\nexport class DefaultClientLayout implements Vtree.ClientLayout {\n  layoutBox: Element;\n  window: Window;\n  pixelRatio: number;\n  scaleRatio: number;\n  layoutUnitPerPixel: number;\n\n  constructor(viewport: Viewport) {\n    this.layoutBox = viewport.layoutBox;\n    this.window = viewport.window;\n    this.pixelRatio = viewport.pixelRatio;\n    this.scaleRatio = viewport.scaleRatio;\n    this.layoutUnitPerPixel = viewport.layoutUnitPerPixel;\n  }\n\n  private subtractOffsets(\n    rect: Vtree.ClientRect,\n    originRect: Vtree.ClientRect,\n  ): Vtree.ClientRect {\n    const viewportLeft = originRect.left;\n    const viewportTop = originRect.top;\n    return {\n      left: rect.left - viewportLeft,\n      top: rect.top - viewportTop,\n      right: rect.right - viewportLeft,\n      bottom: rect.bottom - viewportTop,\n      width: rect.width,\n      height: rect.height,\n    } as Vtree.ClientRect;\n  }\n\n  /** @override */\n  getRangeClientRects(range: Range): Vtree.ClientRect[] {\n    const rects = range.getClientRects();\n    const layoutBoxRect = this.layoutBox.getBoundingClientRect();\n    return Array.from(rects).map((rect) =>\n      this.subtractOffsets(rect, layoutBoxRect),\n    );\n  }\n\n  /** @override */\n  getElementClientRect(element: Element): Vtree.ClientRect {\n    const htmlElement = element as HTMLElement;\n    const rect = htmlElement.getBoundingClientRect() as Vtree.ClientRect;\n    if (\n      rect.left === 0 &&\n      rect.top === 0 &&\n      rect.right === 0 &&\n      rect.bottom === 0\n    ) {\n      // getBoundingClientRect() returns 0,0,0,0 for WBR element (Chrome)\n      // (Fix for issue #802)\n      return rect;\n    }\n    const layoutBoxRect = this.layoutBox.getBoundingClientRect();\n    return this.subtractOffsets(rect, layoutBoxRect);\n  }\n\n  /** @override */\n  getElementComputedStyle(element: Element): CSSStyleDeclaration {\n    return this.window.getComputedStyle(element, null);\n  }\n\n  /**\n   * Adjust length value with rendering precision.\n   * @param value Length value to adjust\n   * @return Adjusted length value\n   * @override\n   */\n  adjustLengthValue(value: number): number {\n    return this.layoutUnitPerPixel\n      ? Math.floor(value * this.layoutUnitPerPixel) / this.layoutUnitPerPixel\n      : value;\n  }\n}\n\nexport class Viewport {\n  document: Document;\n  root: HTMLElement;\n  private outerZoomBox: HTMLElement;\n  contentContainer: HTMLElement;\n  layoutBox: HTMLElement;\n  width: number;\n  height: number;\n  scaleRatio: number = 1;\n  layoutUnitPerPixel: number = 64;\n  layoutUnitAdj: number = 0;\n\n  constructor(\n    public readonly window: Window,\n    public readonly fontSize: number,\n    public readonly pixelRatio: number,\n    opt_root?: HTMLElement,\n    opt_width?: number,\n    opt_height?: number,\n  ) {\n    this.document = window.document;\n    this.root = opt_root || this.document.body;\n\n    if (this.root.hasAttribute(\"data-vivliostyle-toc-box\")) {\n      // TOC viewport does not need zoom box and layout box.\n      this.outerZoomBox = this.contentContainer = this.layoutBox = this.root;\n      this.width = opt_width || this.root.clientWidth;\n      this.height = opt_height || this.root.clientHeight;\n      return;\n    }\n\n    let outerZoomBox = this.root.firstElementChild as HTMLElement;\n    if (!outerZoomBox) {\n      outerZoomBox = this.document.createElement(\"div\");\n      outerZoomBox.setAttribute(\"data-vivliostyle-outer-zoom-box\", \"true\");\n      outerZoomBox.role = \"presentation\";\n      this.root.appendChild(outerZoomBox);\n    }\n    let contentContainer = outerZoomBox.firstElementChild as HTMLElement;\n    if (!contentContainer) {\n      contentContainer = this.document.createElement(\"div\");\n      contentContainer.setAttribute(\n        \"data-vivliostyle-spread-container\",\n        \"true\",\n      );\n      contentContainer.role = \"presentation\";\n      outerZoomBox.appendChild(contentContainer);\n    }\n\n    if (pixelRatio > 0 && CSS.supports(\"zoom\", \"8\")) {\n      // Emulate high pixel ratio using zoom and transform:scale().\n      // Workaround for issue #419 (minimum border width too thick)\n      // and #1076 (layout depends on device pixel ratio).\n      //\n      // CSS variables --viv-outputPixelRatio, --viv-devicePixelRatio,\n      // and --viv-outputScale are used in zoom and transform property values\n      // to emulate high pixel ratio output.\n      // (see VivliostyleViewportCss in assets.ts)\n      Base.setCSSProperty(this.root, \"--viv-outputPixelRatio\", `${pixelRatio}`);\n      Base.setCSSProperty(\n        this.root,\n        \"--viv-devicePixelRatio\",\n        `${window.devicePixelRatio}`,\n      );\n\n      this.scaleRatio = pixelRatio / window.devicePixelRatio;\n    }\n\n    // Determine layout unit per CSS pixel and adjustment value needed for\n    // accurate layout of text and line boxes to avoid rounding issues\n    // based on browser type. (Issue #1590)\n    switch (Base.browserType) {\n      case \"chromium\":\n        this.layoutUnitPerPixel =\n          64 * (this.pixelRatio || window.devicePixelRatio);\n        this.layoutUnitAdj = 1 / this.layoutUnitPerPixel;\n        break;\n      case \"firefox\":\n        this.layoutUnitPerPixel = 60;\n        this.layoutUnitAdj = 1 / this.layoutUnitPerPixel;\n        break;\n      case \"webkit\":\n      default:\n        // WebKit uses 1/64 px layout unit, but it seems to floor\n        // the position values instead of rounding them,\n        // so text overflow does not occur without adjustment.\n        this.layoutUnitPerPixel = 64;\n        this.layoutUnitAdj = 0;\n    }\n    if (this.layoutUnitAdj) {\n      Base.setCSSProperty(\n        this.root,\n        \"--viv-layoutUnitAdj\",\n        `${this.layoutUnitAdj}px`,\n      );\n    }\n\n    let layoutBox = outerZoomBox.nextElementSibling as HTMLElement;\n    if (!layoutBox) {\n      layoutBox = this.document.createElement(\"div\");\n      layoutBox.setAttribute(\"data-vivliostyle-layout-box\", \"true\");\n      layoutBox.role = \"presentation\";\n      this.root.appendChild(layoutBox);\n    }\n    this.outerZoomBox = outerZoomBox;\n    this.contentContainer = contentContainer;\n    this.layoutBox = layoutBox;\n    this.width =\n      opt_width ||\n      parseFloat(window.getComputedStyle(this.root).width) ||\n      this.root.offsetWidth ||\n      window.innerWidth;\n    this.height =\n      opt_height ||\n      parseFloat(window.getComputedStyle(this.root).height) ||\n      this.root.offsetHeight ||\n      window.innerHeight;\n\n    // Use the fallbackPageSize if window size is 0 or browser is in headless mode.\n    const fallbackPageSize = {\n      // compromise between A4 (210mm 297mm) and letter (8.5in 11in)\n      width: 794, // 210mm (8.27in)\n      height: 1056, // 279.4mm (11in)\n    };\n    const isHeadlessBrowser =\n      (!window.outerWidth && !window.outerHeight) ||\n      /Headless/.test(navigator.userAgent) ||\n      (navigator.webdriver &&\n        window.innerWidth === 800 &&\n        window.innerHeight === 600);\n\n    if (!this.width || (!opt_width && isHeadlessBrowser)) {\n      this.width = fallbackPageSize.width;\n    }\n    if (!this.height || (!opt_height && isHeadlessBrowser)) {\n      this.height = fallbackPageSize.height;\n    }\n  }\n\n  /**\n   * Reset zoom.\n   */\n  resetZoom() {\n    Base.setCSSProperty(this.outerZoomBox, \"width\", \"\");\n    Base.setCSSProperty(this.outerZoomBox, \"height\", \"\");\n    Base.setCSSProperty(this.contentContainer, \"width\", \"\");\n    Base.setCSSProperty(this.contentContainer, \"height\", \"\");\n    Base.setCSSProperty(this.contentContainer, \"transform\", \"\");\n  }\n\n  /**\n   * Zoom viewport.\n   * @param width Overall width of contents before scaling (px)\n   * @param height Overall height of contents before scaling (px)\n   * @param scale Factor to which the viewport will be scaled.\n   */\n  zoom(width: number, height: number, scale: number) {\n    Base.setCSSProperty(this.root, \"--viv-outputScale\", `${scale}`);\n    Base.setCSSProperty(this.outerZoomBox, \"width\", `${width * scale}px`);\n    Base.setCSSProperty(this.outerZoomBox, \"height\", `${height * scale}px`);\n    Base.setCSSProperty(this.contentContainer, \"width\", `${width}px`);\n    Base.setCSSProperty(this.contentContainer, \"height\", `${height}px`);\n  }\n\n  /**\n   * Remove all pages inside the viewport.\n   */\n  clear() {\n    const root = this.root;\n    while (root.lastChild) {\n      root.removeChild(root.lastChild);\n    }\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview XmlDoc - Utility functions to work with XML (mostly XHTML)\n * documents.\n */\nimport * as Base from \"./base\";\nimport * as Net from \"./net\";\nimport * as Task from \"./task\";\nimport { XmlDoc } from \"./types\";\n\nexport type XMLDocStore = XmlDoc.XMLDocStore;\n\nexport class XMLDocHolder implements XmlDoc.XMLDocHolder {\n  lang: string | null = null;\n  totalOffset: number = -1;\n  root: Element;\n  body: Element;\n  head: Element;\n  last: Element;\n  lastOffset: number = 1;\n  idMap: { [key: string]: Element };\n\n  constructor(\n    public readonly store: XMLDocStore,\n    public readonly url: string,\n    public readonly document: Document,\n  ) {\n    this.root = document.documentElement; // html element\n    let body: Element = null;\n    let head: Element = null;\n    if (this.root.namespaceURI == Base.NS.XHTML) {\n      for (\n        let child: Node = this.root.firstChild;\n        child;\n        child = child.nextSibling\n      ) {\n        if (child.nodeType != 1) {\n          continue;\n        }\n        const elem = child as Element;\n        if (elem.namespaceURI == Base.NS.XHTML) {\n          switch (elem.localName) {\n            case \"head\":\n              head = elem;\n              break;\n            case \"body\":\n              body = elem;\n              break;\n          }\n        }\n      }\n      this.lang = this.root.getAttribute(\"lang\");\n    }\n    this.body = body as Element;\n    this.head = head as Element;\n    this.last = this.root;\n    this.last.setAttribute(Base.ELEMENT_OFFSET_ATTR, \"0\");\n  }\n\n  doc(): XmlDoc.NodeList {\n    return new NodeList([this.document]);\n  }\n\n  getElementOffset(element: Element): number {\n    const offsetStr = element.getAttribute(Base.ELEMENT_OFFSET_ATTR);\n    if (offsetStr) {\n      return parseInt(offsetStr, 10);\n    }\n    let offset = this.lastOffset;\n    let last: Node | null = this.last;\n    while (last != element) {\n      let next: Node | null = last.firstChild;\n      if (!next) {\n        while (true) {\n          next = last.nextSibling;\n          if (next) {\n            break;\n          }\n          last = last.parentNode;\n          if (last == null) {\n            throw new Error(\"Internal error\");\n          }\n        }\n      }\n      last = next;\n      if (next.nodeType == 1) {\n        const nextElement = next as Element;\n        nextElement.setAttribute(Base.ELEMENT_OFFSET_ATTR, offset.toString());\n        ++offset;\n      } else {\n        offset += (next.textContent as string).length;\n      }\n    }\n    this.lastOffset = offset;\n    this.last = element;\n    return offset - 1;\n  }\n\n  getNodeOffset(srcNode: Node, offsetInNode: number, after: boolean) {\n    let extraOffset = 0;\n    let node: Node | null = srcNode;\n    let prev: Node | null = null;\n    if (node.nodeType == 1) {\n      // after = true is only valid for elements\n      if (!after) {\n        return this.getElementOffset(node as Element);\n      }\n    } else {\n      // offsetInNode is only valid for text nodes\n      extraOffset = offsetInNode;\n      prev = node.previousSibling;\n      if (!prev) {\n        node = node.parentNode;\n        extraOffset += 1;\n        return this.getElementOffset(node as Element) + extraOffset;\n      }\n      node = prev;\n    }\n    while (true) {\n      while (node.lastChild) {\n        node = node.lastChild;\n      }\n      if (node.nodeType == 1) {\n        // empty element\n        break;\n      }\n      extraOffset += (node.textContent as string).length;\n      prev = node.previousSibling;\n      if (!prev) {\n        node = node.parentNode;\n        break;\n      }\n      node = prev;\n    }\n    extraOffset += 1;\n    return this.getElementOffset(node as Element) + extraOffset;\n  }\n\n  getTotalOffset(): number {\n    if (this.totalOffset < 0) {\n      this.totalOffset = this.getNodeOffset(this.root, 0, true);\n    }\n    return this.totalOffset;\n  }\n\n  /**\n   * @return last node such that its offset is less or equal to the given\n   */\n  getNodeByOffset(offset: number): Node {\n    let elementOffset: number;\n\n    // First, find the last element in the document, such that\n    // this.getElementOffset(element) <= offset; if offest matches\n    // exactly, just return it.\n    let element = this.root;\n    while (true) {\n      elementOffset = this.getElementOffset(element);\n      if (elementOffset >= offset) {\n        return element;\n      }\n      const children = element.children; // Element children\n      if (!children) {\n        break;\n      }\n      const index = Base.binarySearch(children.length, (index) => {\n        const child = children[index];\n        const childOffset = this.getElementOffset(child);\n        return childOffset > offset;\n      });\n      if (index == 0) {\n        break;\n      }\n      if (VIVLIOSTYLE_DEBUG) {\n        if (index < children.length) {\n          const elemOffset = this.getElementOffset(children[index]);\n          if (elemOffset <= offset) {\n            throw new Error(\"Consistency check failed!\");\n          }\n        }\n      }\n      element = children[index - 1];\n    }\n\n    // Now we have element with offset less than desired. Find following\n    // (non-element) node with the right offset.\n    let nodeOffset = elementOffset + 1;\n    let node: Node | null = element;\n    let next: Node | null = node.firstChild || node.nextSibling;\n    let lastGood: Node | null = null;\n    while (true) {\n      if (next) {\n        if (next.nodeType == 1) {\n          break;\n        }\n        node = next;\n        lastGood = node;\n        nodeOffset += (next.textContent as string).length;\n        if (nodeOffset > offset && !/^\\s*$/.test(next.textContent)) {\n          break;\n        }\n      } else {\n        node = node.parentNode;\n        if (!node) {\n          break;\n        }\n      }\n      next = node.nextSibling;\n    }\n    if (next && lastGood && /^\\s*$/.test(lastGood.textContent)) {\n      // skip white-space text node\n      lastGood = next;\n    }\n    return lastGood || element;\n  }\n\n  private buildIdMap(e: Element): void {\n    const id = e.getAttribute(\"id\");\n    if (id && !this.idMap[id]) {\n      this.idMap[id] = e;\n    }\n    const xmlid = e.getAttributeNS(Base.NS.XML, \"id\");\n    if (xmlid && !this.idMap[xmlid]) {\n      this.idMap[xmlid] = e;\n    }\n    for (let c = e.firstElementChild; c; c = c.nextElementSibling) {\n      this.buildIdMap(c);\n    }\n  }\n\n  /**\n   * Get element by URL in the source document(s). URL must be in either '#id'\n   * or 'url#id' form.\n   */\n  getElement(url: string): Element | null {\n    const m = url.match(/([^#]*)#(.+)$/);\n    if (!m || (m[1] && m[1] != this.url)) {\n      return null;\n    }\n    const id = m[2];\n    let r: Element = this.document.getElementById(id);\n    if (!r && this.document.getElementsByName) {\n      r = this.document.getElementsByName(id)[0];\n    }\n    if (!r) {\n      if (!this.idMap) {\n        this.idMap = {};\n        this.buildIdMap(this.document.documentElement);\n      }\n      r = this.idMap[id];\n    }\n    return r;\n  }\n}\n\n/**\n * cf. https://w3c.github.io/DOM-Parsing/#the-domparser-interface\n * @enum {string}\n */\nexport enum DOMParserSupportedType {\n  TEXT_HTML = \"text/html\",\n  TEXT_XML = \"text/xml\",\n  APPLICATION_XML = \"application/xml\",\n  APPLICATION_XHTML_XML = \"application/xhtml+xml\",\n  IMAGE_SVG_XML = \"image/svg+xml\",\n}\n\n/**\n * Parses a string with a DOMParser and returns the document.\n * If a parse error occurs, return null.\n */\nexport function parseAndReturnNullIfError(\n  str: string,\n  type: string,\n  opt_parser?: DOMParser,\n): Document | null {\n  const parser = opt_parser || new DOMParser();\n  let doc: Document;\n  try {\n    doc = parser.parseFromString(str, type as DOMParserSupportedType);\n  } catch (e) {}\n  if (!doc) {\n    return null;\n  } else {\n    const docElement = doc.documentElement;\n    const errorTagName = \"parsererror\";\n    if (docElement.localName === errorTagName) {\n      return null;\n    } else {\n      for (let c = docElement.firstElementChild; c; c = c.nextElementSibling) {\n        if (c.localName === errorTagName) {\n          return null;\n        }\n      }\n    }\n  }\n  return doc;\n}\n\n/**\n * @returns null if contentType cannot be inferred from HTTP header and file\n *     extension\n */\nexport function resolveContentType(response: Net.FetchResponse): string | null {\n  const contentType = response.contentType;\n  if (contentType) {\n    const supportedKeys = Object.keys(DOMParserSupportedType);\n    for (let i = 0; i < supportedKeys.length; i++) {\n      if (DOMParserSupportedType[supportedKeys[i]] === contentType) {\n        return contentType;\n      }\n    }\n    if (contentType.match(/\\+xml$/)) {\n      return DOMParserSupportedType.APPLICATION_XML;\n    }\n  }\n  const match = response.url.match(/\\.([^./#?]+)([#?]|$)/);\n  if (match) {\n    const extension = match[1];\n    switch (extension) {\n      case \"html\":\n      case \"htm\":\n        return DOMParserSupportedType.TEXT_HTML;\n      case \"xhtml\":\n      case \"xht\":\n        return DOMParserSupportedType.APPLICATION_XHTML_XML;\n      case \"svg\":\n      case \"svgz\":\n        return DOMParserSupportedType.IMAGE_SVG_XML;\n      case \"opf\":\n      case \"xml\":\n        return DOMParserSupportedType.APPLICATION_XML;\n    }\n  }\n  return null;\n}\n\nexport function parseXMLResource(\n  response: Net.FetchResponse,\n  store: XMLDocStore,\n): Task.Result<XmlDoc.XMLDocHolder> {\n  let doc = response.responseXML;\n  if (!doc) {\n    const parser = new DOMParser();\n    const text = response.responseText;\n    if (text) {\n      const contentType = resolveContentType(response);\n      doc = parseAndReturnNullIfError(\n        text,\n        contentType || DOMParserSupportedType.APPLICATION_XML,\n        parser,\n      );\n\n      // When contentType cannot be inferred from HTTP header and file\n      // extension, we use root element's tag name to infer the contentType. If\n      // it is html or svg, we re-parse the source with an appropriate\n      // contentType.\n      if (doc && !contentType) {\n        const root = doc.documentElement;\n        if (root.localName.toLowerCase() === \"html\" && !root.namespaceURI) {\n          doc = parseAndReturnNullIfError(\n            text,\n            DOMParserSupportedType.TEXT_HTML,\n            parser,\n          );\n        } else if (\n          root.localName.toLowerCase() === \"svg\" &&\n          (doc as any).contentType !== DOMParserSupportedType.IMAGE_SVG_XML\n        ) {\n          doc = parseAndReturnNullIfError(\n            text,\n            DOMParserSupportedType.IMAGE_SVG_XML,\n            parser,\n          );\n        }\n      }\n      if (!doc) {\n        // Fallback to HTML parsing\n        doc = parseAndReturnNullIfError(\n          text,\n          DOMParserSupportedType.TEXT_HTML,\n          parser,\n        );\n      }\n    }\n  }\n  const xmldoc = doc ? new XMLDocHolder(store, response.url, doc) : null;\n  return Task.newResult(xmldoc);\n}\n\nexport function newXMLDocStore(): XMLDocStore {\n  return new Net.ResourceStore(\n    parseXMLResource,\n    Net.FetchResponseType.DOCUMENT,\n  );\n}\n\nexport class Predicate implements XmlDoc.Predicate {\n  constructor(public readonly fn: (p1: Node) => boolean) {}\n\n  check(node: Node): boolean {\n    return this.fn(node);\n  }\n\n  withAttribute(name: string, value: string): Predicate {\n    return new Predicate(\n      (node) =>\n        this.check(node) &&\n        node.nodeType == 1 &&\n        (node as Element).getAttribute(name) == value,\n    );\n  }\n\n  withChild(name: string, opt_childPredicate?: Predicate): Predicate {\n    return new Predicate((node) => {\n      if (!this.check(node)) {\n        return false;\n      }\n      let list = new NodeList([node]);\n      list = list.child(name);\n      if (opt_childPredicate) {\n        list = list.predicate(opt_childPredicate);\n      }\n      return list.size() > 0;\n    });\n  }\n}\n\nexport const predicate = new Predicate((node) => true);\n\nexport class NodeList implements XmlDoc.NodeList {\n  constructor(public readonly nodes: Node[]) {}\n\n  asArray(): Node[] {\n    return this.nodes;\n  }\n\n  size(): number {\n    return this.nodes.length;\n  }\n\n  /**\n   * Filter with predicate\n   */\n  predicate(pr: Predicate): NodeList {\n    const arr = [];\n    for (const n of this.nodes) {\n      if (pr.check(n)) {\n        arr.push(n);\n      }\n    }\n    return new NodeList(arr);\n  }\n\n  forEachNode(fn: (p1: Node, p2: (p1: Node) => void) => void): NodeList {\n    const arr = [];\n    const add = (n) => {\n      arr.push(n);\n    };\n    for (let i = 0; i < this.nodes.length; i++) {\n      fn(this.nodes[i], add);\n    }\n    return new NodeList(arr);\n  }\n\n  /**\n   * @template T\n   */\n  forEach<T>(fn: (p1: Node) => T): T[] {\n    const arr = [];\n    for (let i = 0; i < this.nodes.length; i++) {\n      arr.push(fn(this.nodes[i]));\n    }\n    return arr;\n  }\n\n  /**\n   * @template T\n   */\n  forEachNonNull<T>(fn: (p1: Node) => T): T[] {\n    const arr = [];\n    for (let i = 0; i < this.nodes.length; i++) {\n      const t = fn(this.nodes[i]);\n      if (t != null) {\n        arr.push(t);\n      }\n    }\n    return arr;\n  }\n\n  child(tag: string): NodeList {\n    return this.forEachNode((node, add) => {\n      for (let c: Node = node.firstChild; c; c = c.nextSibling) {\n        if (c.nodeType == 1 && (c as Element).localName == tag) {\n          add(c);\n        }\n      }\n    });\n  }\n\n  childElements(): NodeList {\n    return this.forEachNode((node, add) => {\n      for (let c: Node = node.firstChild; c; c = c.nextSibling) {\n        if (c.nodeType == 1) {\n          add(c);\n        }\n      }\n    });\n  }\n\n  attribute(name: string): (string | null)[] {\n    return this.forEachNonNull((node) => {\n      if (node.nodeType == 1) {\n        return (node as Element).getAttribute(name);\n      }\n      return null;\n    });\n  }\n\n  textContent(): (string | null)[] {\n    return this.forEach((node) => node.textContent);\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Ops - Render EPUB content files by applying page masters,\n * styling and layout.\n */\nimport \"./footnotes\";\nimport \"./table\";\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Break from \"./break\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as Columns from \"./columns\";\nimport * as Constants from \"./constants\";\nimport * as Counters from \"./counters\";\nimport * as CounterStyle from \"./counter-style\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssProp from \"./css-prop\";\nimport * as CssStyler from \"./css-styler\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as CssValidator from \"./css-validator\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as GeometryUtil from \"./geometry-util\";\nimport * as Layout from \"./layout\";\nimport * as LayoutProcessor from \"./layout-processor\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as PageFloats from \"./page-floats\";\nimport * as CssPage from \"./css-page\";\nimport * as Plugin from \"./plugin\";\nimport * as PageMaster from \"./page-master\";\nimport * as Scripts from \"./scripts\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as TextPolyfill from \"./text-polyfill\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport * as XmlDoc from \"./xml-doc\";\nimport { Layout as LayoutType } from \"./types\";\nimport {\n  UserAgentBaseCss,\n  UserAgentCounterStylesCss,\n  UserAgentPageCss,\n  UserAgentTocCss,\n} from \"./assets\";\n\nexport const uaStylesheetBaseFetcher: TaskUtil.Fetcher<boolean> =\n  new TaskUtil.Fetcher(() => {\n    const frame: Task.Frame<boolean> = Task.newFrame(\"uaStylesheetBase\");\n    const validatorSet = CssValidator.baseValidatorSet();\n    const url = Base.resolveURL(\"user-agent-base.css\", Base.resourceBaseURL);\n    const handler = new CssCascade.CascadeParserHandler(\n      null,\n      null,\n      null,\n      null,\n      null,\n      validatorSet,\n      true,\n    );\n    handler.startStylesheet(CssParser.StylesheetFlavor.USER_AGENT);\n    CssCascade.setUABaseCascade(handler.cascade);\n    CssParser.parseStylesheetFromText(\n      UserAgentBaseCss,\n      handler,\n      url,\n      null,\n      null,\n    ).thenFinish(frame);\n    return frame.result();\n  }, \"uaStylesheetBaseFetcher\");\n\nexport function loadUABase(): Task.Result<boolean> {\n  return uaStylesheetBaseFetcher.get();\n}\n\nexport type FontFace = {\n  properties: CssCascade.ElementStyle;\n  condition: Exprs.Val;\n};\n\nclass CounterStyleParserHandler extends CssCascade.PropSetParserHandler {\n  constructor(\n    scope: Exprs.LexicalScope,\n    owner: CssParser.DispatchParserHandler,\n    elementStyle: CssCascade.ElementStyle,\n    validatorSet: CssValidator.ValidatorSet,\n    private readonly counterStyleName: string,\n    private readonly counterStyles: CounterStyle.CounterStyleStore,\n  ) {\n    super(scope, owner, null, elementStyle, validatorSet, \"counter-style\");\n  }\n\n  override endRule(): void {\n    super.endRule();\n    if (!this.counterStyles.define(this.counterStyleName, this.elementStyle)) {\n      Logging.logger.warn(\n        `E_CSS_COUNTER_STYLE_INVALID: @counter-style ${this.counterStyleName}`,\n      );\n    }\n  }\n}\n\nexport class Style {\n  fontDeobfuscator:\n    | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n    | null;\n  validatorSet: CssValidator.ValidatorSet;\n\n  constructor(\n    public readonly store: OPSDocStore,\n    public readonly rootScope: Exprs.LexicalScope,\n    public readonly pageScope: Exprs.LexicalScope,\n    public readonly cascade: CssCascade.Cascade,\n    public readonly rootBox: PageMaster.RootPageBox,\n    public readonly fontFaces: FontFace[],\n    public readonly footnoteProps: CssCascade.ElementStyle,\n    public readonly flowProps: { [key: string]: CssCascade.ElementStyle },\n    public readonly viewportProps: CssCascade.ElementStyle[],\n    public readonly pageProps: { [key: string]: CssCascade.ElementStyle },\n    public readonly counterStyleStore: CounterStyle.CounterStyleStore,\n  ) {\n    this.fontDeobfuscator = store.fontDeobfuscator;\n    this.validatorSet = store.validatorSet;\n    this.pageScope.defineBuiltIn(\"has-content\", function (name) {\n      name = name as string;\n      const styleInstance = this as StyleInstance;\n      const cp = styleInstance.currentLayoutPosition;\n      const flowChunk = cp.firstFlowChunkOfFlow(name);\n      return (\n        styleInstance.matchPageSide(cp.startSideOfFlow(name as string)) &&\n        cp.hasContent(name as string, styleInstance.lookupOffset) &&\n        !!flowChunk &&\n        !styleInstance.flowChunkIsAfterParentFlowForcedBreak(flowChunk)\n      );\n    });\n    this.pageScope.defineName(\n      \"page-number\",\n      new Exprs.Native(\n        this.pageScope,\n        function () {\n          const styleInstance = this as StyleInstance;\n          return (\n            styleInstance.pageNumberOffset +\n            styleInstance.currentLayoutPosition.page\n          );\n        },\n        \"page-number\",\n      ),\n    );\n    this.pageScope.defineName(\n      \"blank-page\",\n      new Exprs.Native(\n        this.pageScope,\n        function () {\n          const styleInstance = this as StyleInstance;\n          const cp = styleInstance.currentLayoutPosition;\n          return cp?.isBlankPage;\n        },\n        \"blank-page\",\n      ),\n    );\n  }\n\n  sizeViewport(\n    viewportWidth: number,\n    viewportHeight: number,\n    fontSize: number,\n    pref?: Exprs.Preferences,\n  ): { width: number; height: number; fontSize: number } {\n    if (this.viewportProps.length) {\n      const context = new Exprs.Context(\n        this.rootScope,\n        viewportWidth,\n        viewportHeight,\n        fontSize,\n      );\n      const viewportProps = CssCascade.mergeAll(context, this.viewportProps);\n      const width = viewportProps[\"width\"] as CssCascade.CascadeValue;\n      const height = viewportProps[\"height\"] as CssCascade.CascadeValue;\n      const textZoom = viewportProps[\"text-zoom\"] as CssCascade.CascadeValue;\n      let scaleFactor = 1;\n      if ((width && height) || textZoom) {\n        const defaultFontSize = Exprs.defaultUnitSizes[\"em\"];\n        const zoomVal = textZoom\n          ? textZoom.evaluate(context, \"text-zoom\")\n          : null;\n        if (zoomVal === Css.ident.scale) {\n          scaleFactor = defaultFontSize / fontSize;\n          fontSize = defaultFontSize;\n          viewportWidth *= scaleFactor;\n          viewportHeight *= scaleFactor;\n        }\n        if (width && height) {\n          const widthVal = Css.toNumber(\n            width.evaluate(context, \"width\"),\n            context,\n          );\n          const heightVal = Css.toNumber(\n            height.evaluate(context, \"height\"),\n            context,\n          );\n          if (widthVal > 0 && heightVal > 0) {\n            const spreadWidth =\n              pref && pref.spreadView\n                ? (widthVal + pref.pageBorder) * 2\n                : widthVal;\n            return { width: spreadWidth, height: heightVal, fontSize };\n          }\n        }\n      }\n    }\n    return { width: viewportWidth, height: viewportHeight, fontSize };\n  }\n}\n\n//-------------------------------------------------------------------------------\nexport class StyleInstance\n  extends Exprs.Context\n  implements\n    CssStyler.FlowListener,\n    PageMaster.InstanceHolder,\n    Vgen.StylerProducer\n{\n  lang: string | null;\n  primaryFlows = { body: true } as { [key: string]: boolean };\n  rootPageBoxInstance: PageMaster.RootPageBoxInstance = null;\n  styler: CssStyler.Styler = null;\n  stylerMap: { [key: string]: CssStyler.Styler } = null;\n  currentLayoutPosition: Vtree.LayoutPosition = null;\n  layoutPositionAtPageStart: Vtree.LayoutPosition = null;\n  lookupOffset: number = 0;\n  faces: Font.DocumentFaces;\n  pageBoxInstances: { [key: string]: PageMaster.PageBoxInstance } = {};\n  pageManager: CssPage.PageManager = null;\n  private rootPageFloatLayoutContext: PageFloats.PageFloatLayoutContext;\n  pageBreaks: { [key: string]: boolean } = {};\n  pageProgression: Constants.PageProgression | null = null;\n  isVersoFirstPage: boolean = false;\n  blankPageAtStart: boolean = false;\n  pageSheetSize: { [key: string]: { width: number; height: number } } = {};\n  pageSheetHeight: number = 0;\n  pageSheetWidth: number = 0;\n\n  constructor(\n    public readonly style: Style,\n    public readonly xmldoc: XmlDoc.XMLDocHolder,\n    defaultLang: string | null,\n    public readonly viewport: Vgen.Viewport,\n    public readonly clientLayout: Vtree.ClientLayout,\n    public readonly fontMapper: Font.Mapper,\n    public readonly customRenderer: Vgen.CustomRenderer,\n    public readonly fallbackMap: { [key: string]: string },\n    public readonly pageNumberOffset: number,\n    public readonly documentURLTransformer: Base.DocumentURLTransformer,\n    public readonly counterStore: Counters.CounterStore,\n    public readonly cmykStore: CmykStore.CmykStore,\n    pageProgression?: Constants.PageProgression,\n    isVersoFirstPage?: boolean,\n  ) {\n    super(style.rootScope, viewport.width, viewport.height, viewport.fontSize);\n    this.lang = xmldoc.lang || defaultLang;\n    this.faces = new Font.DocumentFaces(this.style.fontDeobfuscator);\n    this.rootPageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n      null,\n      null,\n      null,\n      null,\n      null,\n      null,\n      null,\n    );\n    this.pageProgression = pageProgression || null;\n    this.isVersoFirstPage = !!isVersoFirstPage;\n    for (const flowName in style.flowProps) {\n      const flowStyle = style.flowProps[flowName];\n      const consume = CssCascade.getProp(flowStyle, \"flow-consume\");\n      if (consume) {\n        const consumeVal = consume.evaluate(this, \"flow-consume\");\n        if (consumeVal == Css.ident.all) {\n          this.primaryFlows[flowName] = true;\n        } else {\n          delete this.primaryFlows[flowName];\n        }\n      }\n    }\n  }\n\n  init(): Task.Result<boolean> {\n    const frame: Task.Frame<boolean> = Task.newFrame(\"StyleInstance.init\");\n    const counterListener = this.counterStore.createCounterListener(\n      this.xmldoc.url,\n    );\n    const counterResolver = this.counterStore.createCounterResolver(\n      this.xmldoc.url,\n      this.style.rootScope,\n      this.style.pageScope,\n    );\n    this.styler = new CssStyler.Styler(\n      this.xmldoc,\n      this.style.cascade,\n      this.style.rootScope,\n      this,\n      this.primaryFlows,\n      this.style.validatorSet,\n      counterListener,\n      counterResolver,\n      this.style.counterStyleStore,\n      this.cmykStore,\n    );\n    counterResolver.setStyler(this.styler);\n    this.styler.resetFlowChunkStream(this);\n    this.stylerMap = {};\n    this.stylerMap[this.xmldoc.url] = this.styler;\n    const docElementStyle = this.styler.getTopContainerStyle();\n    if (!this.pageProgression) {\n      this.pageProgression = CssPage.resolvePageProgression(docElementStyle);\n    }\n\n    // Check the spread break at beginning of a document that may cause\n    // the first page verso side or cause a blank page (issue #666)\n    if (!this.matchStartPageSide(this.styler.breakBeforeValues[0])) {\n      if (this.pageNumberOffset === 0) {\n        this.isVersoFirstPage = true;\n      } else {\n        this.blankPageAtStart = true;\n      }\n    }\n\n    const rootBox = this.style.rootBox;\n    this.rootPageBoxInstance = new PageMaster.RootPageBoxInstance(rootBox);\n    const cascadeInstance = this.style.cascade.createInstance(\n      this,\n      counterListener,\n      counterResolver,\n      this.lang,\n      this.style.counterStyleStore,\n      this.cmykStore,\n    );\n\n    // Named page type at first page\n    this.styler.cascade.currentPageType = this.styler.cascade.firstPageType;\n\n    this.rootPageBoxInstance.applyCascadeAndInit(\n      cascadeInstance,\n      docElementStyle,\n    );\n    this.rootPageBoxInstance.resolveAutoSizing(this);\n    this.pageManager = new CssPage.PageManager(\n      cascadeInstance,\n      this.style.pageScope,\n      this.rootPageBoxInstance,\n      this,\n      docElementStyle,\n    );\n    const srcFaces = [] as Font.Face[];\n    for (const fontFace of this.style.fontFaces) {\n      if (fontFace.condition && !fontFace.condition.evaluate(this)) {\n        continue;\n      }\n      const properties = Font.prepareProperties(fontFace.properties, this);\n      const srcFace = new Font.Face(properties);\n      srcFaces.push(srcFace);\n    }\n    this.fontMapper.findOrLoadFonts(srcFaces, this.faces).then(() => {\n      // JavaScript in HTML documents support\n      Scripts.loadScriptsInHead(\n        this.xmldoc.document,\n        this.viewport.window,\n        this.styler,\n      ).thenFinish(frame);\n    });\n\n    // Determine page sheet sizes corresponding to page selectors\n    const pageProps = this.style.pageProps;\n    if (!pageProps[\"\"]) {\n      pageProps[\"\"] = {};\n    }\n    Object.keys(pageProps).forEach((selector) => {\n      let pageStyle = pageProps[selector] as {\n        [key: string]: CssCascade.CascadeValue;\n      };\n\n      // Substitute var() in @page\n      this.styler.cascade.applyVarFilter([pageStyle], this.styler, null);\n\n      // Calculate calc()\n      this.styler.cascade.applyCalcFilter(pageStyle, this.styler.context);\n\n      // Convert device-cmyk() to color(srgb ...)\n      this.styler.cascade.applyCmykFilter(pageStyle);\n\n      const pageSizeAndBleed = CssPage.evaluatePageSizeAndBleed(\n        CssPage.resolvePageSizeAndBleed(pageStyle),\n        this,\n      );\n      this.pageSheetSize[selector] = {\n        width: pageSizeAndBleed.pageWidth + pageSizeAndBleed.cropOffset * 2,\n        height: pageSizeAndBleed.pageHeight + pageSizeAndBleed.cropOffset * 2,\n      };\n    });\n    return frame.result();\n  }\n\n  private matchStartPageSide(side: string): boolean {\n    const isRectoStart =\n      this.pageNumberOffset % 2 == (this.isVersoFirstPage ? 1 : 0);\n    const isLTR = this.pageProgression == Constants.PageProgression.LTR;\n    switch (side) {\n      case \"left\":\n        return isRectoStart !== isLTR;\n      case \"right\":\n        return isRectoStart === isLTR;\n      case \"recto\":\n        return isRectoStart;\n      case \"verso\":\n        return !isRectoStart;\n      default:\n        return true;\n    }\n  }\n\n  /** @override */\n  getStylerForDoc(xmldoc: XmlDoc.XMLDocHolder): CssStyler.AbstractStyler {\n    let styler = this.stylerMap[xmldoc.url];\n    if (!styler) {\n      const style = this.style.store.getStyleForDoc(xmldoc);\n\n      // We need a separate content, so that variables can get potentially\n      // different values.\n      const context = new Exprs.Context(\n        style.rootScope,\n        this.pageWidth(),\n        this.pageHeight(),\n        this.initialFontSize,\n      );\n      const counterListener = this.counterStore.createCounterListener(\n        xmldoc.url,\n      );\n      const counterResolver = this.counterStore.createCounterResolver(\n        xmldoc.url,\n        style.rootScope,\n        style.pageScope,\n      );\n      styler = new CssStyler.Styler(\n        xmldoc,\n        style.cascade,\n        style.rootScope,\n        context,\n        this.primaryFlows,\n        style.validatorSet,\n        counterListener,\n        counterResolver,\n        style.counterStyleStore,\n        this.cmykStore,\n      );\n      this.stylerMap[xmldoc.url] = styler;\n    }\n    return styler;\n  }\n\n  /** @override */\n  registerInstance(key: string, instance: PageMaster.PageBoxInstance): void {\n    this.pageBoxInstances[key] = instance;\n  }\n\n  /** @override */\n  lookupInstance(key: string): PageMaster.PageBoxInstance {\n    return this.pageBoxInstances[key];\n  }\n\n  /** @override */\n  encounteredFlowChunk(flowChunk: Vtree.FlowChunk, flow: Vtree.Flow): void {\n    const cp = this.currentLayoutPosition;\n    if (cp) {\n      if (!cp.flows[flowChunk.flowName]) {\n        cp.flows[flowChunk.flowName] = flow;\n      } else {\n        flow = cp.flows[flowChunk.flowName];\n      }\n      let flowPosition = cp.flowPositions[flowChunk.flowName];\n      if (!flowPosition) {\n        flowPosition = new Vtree.FlowPosition();\n        cp.flowPositions[flowChunk.flowName] = flowPosition;\n      }\n      const nodePosition = Vtree.newNodePositionFromNode(flowChunk.element);\n      const chunkPosition = new Vtree.ChunkPosition(nodePosition);\n      const flowChunkPosition = new Vtree.FlowChunkPosition(\n        chunkPosition,\n        flowChunk,\n      );\n      flowPosition.positions.push(flowChunkPosition);\n    }\n  }\n\n  override evalSupportsTest(\n    name: string,\n    value: string,\n    isFunc: boolean,\n  ): boolean {\n    if (isFunc) {\n      if (name === \"selector\") {\n        return this.evalSupportsSelector(value);\n      }\n      return false;\n    }\n    if (!name) {\n      // `(...)` without `name:`\n      return false;\n    }\n\n    let supported = true;\n\n    class SupportsReceiver implements CssValidator.PropertyReceiver {\n      unknownProperty(name: string, value: Css.Val): void {\n        supported = false;\n      }\n      invalidPropertyValue(name: string, value: Css.Val): void {\n        supported = false;\n      }\n      simpleProperty(name: string, value: Css.Val, important): void {}\n    }\n\n    const supportsReceiver = new SupportsReceiver();\n    const val = CssParser.parseValue(\n      this.style.rootScope,\n      new CssTokenizer.Tokenizer(value, null),\n      \"\",\n    );\n    if (!val) {\n      return false;\n    }\n    const validatorSet = (this.xmldoc.store as OPSDocStore).validatorSet;\n    validatorSet.validatePropertyAndHandleShorthand(\n      name,\n      val,\n      false,\n      supportsReceiver,\n    );\n    return supported;\n  }\n\n  /**\n   * @param selectorText\n   * @returns true if selectorText is supported selector\n   */\n  private evalSupportsSelector(selectorText: string): boolean {\n    const sph = new StyleParserHandler(null);\n    const tokenizer = new CssTokenizer.Tokenizer(selectorText + \"{}\", sph);\n    const parser = new CssParser.Parser(\n      CssParser.actionsBase,\n      tokenizer,\n      sph,\n      \"\",\n    );\n    if (\n      parser.runParser(Number.POSITIVE_INFINITY, false, false, false, false)\n    ) {\n      return !sph.cascadeParserHandler.invalid;\n    }\n    return false;\n  }\n\n  getConsumedOffset(flowPosition: Vtree.FlowPosition): number {\n    let offset = Number.POSITIVE_INFINITY;\n    for (let i = 0; i < flowPosition.positions.length; i++) {\n      const pos = flowPosition.positions[i].chunkPosition.primary;\n      let node = pos.steps[0].node;\n      let offsetInNode = pos.offsetInNode;\n      let after = pos.after;\n      let k = 0;\n      while (node.ownerDocument != this.xmldoc.document) {\n        k++;\n        node = pos.steps[k].node;\n        after = false;\n        offsetInNode = 0;\n      }\n      const chunkOffset = this.xmldoc.getNodeOffset(node, offsetInNode, after);\n      if (chunkOffset < offset) {\n        offset = chunkOffset;\n      }\n    }\n    return offset;\n  }\n\n  /**\n   * @param noLookAhead Do not look ahead elements that are not styled yet\n   * @return document offset of the given layoutPosition\n   */\n  getPosition(\n    layoutPosition?: Vtree.LayoutPosition,\n    noLookAhead?: boolean,\n  ): number {\n    if (!layoutPosition) {\n      return 0;\n    }\n    let currentPosition = Number.POSITIVE_INFINITY;\n    for (const flowName in this.primaryFlows) {\n      let flowPosition = layoutPosition.flowPositions[flowName];\n      if (\n        !noLookAhead &&\n        (!flowPosition || flowPosition.positions.length == 0) &&\n        this.currentLayoutPosition\n      ) {\n        this.styler.styleUntilFlowIsReached(flowName);\n        flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n        if (layoutPosition != this.currentLayoutPosition) {\n          if (flowPosition) {\n            flowPosition = flowPosition.clone();\n            layoutPosition.flowPositions[flowName] = flowPosition;\n          }\n        }\n      }\n      if (flowPosition) {\n        const consumedOffset = this.getConsumedOffset(flowPosition);\n        if (consumedOffset < currentPosition) {\n          currentPosition = consumedOffset;\n        }\n      }\n    }\n    return currentPosition;\n  }\n\n  dumpLocation(position) {\n    Logging.logger.debug(\"Location - page\", this.currentLayoutPosition.page);\n    Logging.logger.debug(\"  current:\", position);\n    Logging.logger.debug(\"  lookup:\", this.lookupOffset);\n    for (const flowName in this.currentLayoutPosition.flowPositions) {\n      const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n      for (const p of flowPosition.positions) {\n        Logging.logger.debug(\n          \"  Chunk\",\n          `${flowName}:`,\n          p.flowChunk.startOffset,\n        );\n      }\n    }\n  }\n\n  matchPageSide(side: string | null): boolean {\n    switch (side) {\n      case \"left\":\n      case \"right\":\n      case \"recto\":\n      case \"verso\":\n        return new Exprs.Named(this.style.pageScope, `${side}-page`).evaluate(\n          this,\n        ) as boolean;\n      default:\n        return true;\n    }\n  }\n\n  updateStartSide(layoutPosition: Vtree.LayoutPosition) {\n    for (const name in layoutPosition.flowPositions) {\n      const flowPos = layoutPosition.flowPositions[name];\n      if (flowPos && flowPos.positions.length > 0) {\n        const flowChunk = flowPos.positions[0].flowChunk;\n        if (this.getConsumedOffset(flowPos) === flowChunk.startOffset) {\n          const flowChunkBreakBefore =\n            flowPos.positions[0].flowChunk.breakBefore;\n          const flowBreakAfter = flowPos.startBreakType;\n          flowPos.startBreakType = Break.breakValueToStartBreakType(\n            Break.resolveEffectiveBreakValue(\n              flowBreakAfter,\n              flowChunkBreakBefore,\n            ),\n          );\n        }\n      }\n    }\n  }\n\n  /**\n   * @param cascadedPageStyle Cascaded page style specified in page context\n   */\n  selectPageMaster(\n    cascadedPageStyle: CssCascade.ElementStyle,\n  ): PageMaster.PageMasterInstance {\n    const cp = this.currentLayoutPosition;\n\n    // 3.5. Page Layout Processing Model\n    // 1. Determine current position in the document: Find the minimal\n    // consumed-offset for all elements not fully-consumed in each primary flow.\n    // Current position is maximum of the results among all primary flows.\n    const currentPosition = this.getPosition(cp);\n    if (currentPosition == Number.POSITIVE_INFINITY) {\n      // end of primary content is reached\n      return null;\n    }\n\n    // 2. Page master selection: for each page master:\n    const pageMasters = this.rootPageBoxInstance\n      .children as PageMaster.PageMasterInstance[];\n    let pageMaster: PageMaster.PageMasterInstance;\n    for (let i = 0; i < pageMasters.length; i++) {\n      pageMaster = pageMasters[i];\n\n      // Skip a page master generated for @page rules\n      if (pageMaster.pageBox.pseudoName === CssPage.pageRuleMasterPseudoName) {\n        continue;\n      }\n      let coeff = 1;\n      if (\n        pageMaster.pageBox.pseudoName ===\n          PageMaster.userAgentPageMasterPseudo &&\n        !(this.actualPageWidth && this.actualPageHeight)\n      ) {\n        // If page master is UA page master and page size is not determined,\n        // set lookup position to infinity.\n        // This is to prevent pagination problem depending on viewport size.\n        // (Fix for Issue #1228)\n        coeff = Infinity;\n      }\n\n      // A. Calculate lookup position using current position and utilization\n      // (see -epubx-utilization property)\n      const utilization = pageMaster.getProp(this, \"utilization\");\n      if (utilization && utilization.isNum()) {\n        coeff = (utilization as Css.Num).num;\n      }\n      const em = this.queryUnitSize(\"em\", false);\n      const pageArea = this.pageWidth() * this.pageHeight();\n      const lookup = Math.ceil((coeff * pageArea) / (em * em));\n\n      // B. Determine element eligibility. Each element in a flow is considered\n      // eligible if it is is not marked as fully consumed and it comes in the\n      // document before the lookup position. Feed lookupOffset and flow\n      // availability into the context\n      const savedPageType = this.styler.cascade.currentPageType;\n      this.lookupOffset = this.styler.styleUntil(currentPosition, lookup);\n      this.styler.cascade.currentPageType = savedPageType; // Fix for Issue #1450\n      Asserts.assert(cp);\n      this.updateStartSide(cp);\n\n      // update layoutPositionAtPageStart since startSide of FlowChunks may be\n      // updated\n      this.layoutPositionAtPageStart = cp.clone();\n      this.initLingering();\n      this.clearScope(this.style.pageScope);\n\n      // C. Determine content availability. Flow has content available if it\n      // contains eligible elements. D. Determine if page master is enabled\n      // using rules in Section 3.4.7\n      const enabled = pageMaster.getProp(this, \"enabled\");\n\n      // E. First enabled page master is used for the next page\n      if (!enabled || enabled === Css.ident._true) {\n        if (VIVLIOSTYLE_DEBUG) {\n          this.dumpLocation(currentPosition);\n        }\n\n        // The blank page caused by a spread break between two documents\n        // should have no margin box content (issue #666)\n        if (cp.page === 1 && this.blankPageAtStart) {\n          pageMaster.style = {}; // clear root background-color/image\n          const size = cascadedPageStyle[\"size\"];\n          cascadedPageStyle = {}; // clear margin boxes\n          if (size) {\n            // Restore page size (fix for issue #743)\n            cascadedPageStyle[\"size\"] = size;\n          }\n        }\n\n        // Apply @page rules\n        return this.pageManager.getPageRulePageMaster(\n          pageMaster,\n          cascadedPageStyle,\n        );\n      }\n    }\n    throw new Error(\"No enabled page masters\");\n  }\n\n  flowChunkIsAfterParentFlowForcedBreak(flowChunk: Vtree.FlowChunk): boolean {\n    const flows = this.layoutPositionAtPageStart.flows;\n    const parentFlowName = flows[flowChunk.flowName].parentFlowName;\n    if (parentFlowName) {\n      const startOffset = flowChunk.startOffset;\n      const forcedBreakOffsets = flows[parentFlowName].forcedBreakOffsets;\n      if (!forcedBreakOffsets.length || startOffset < forcedBreakOffsets[0]) {\n        return false;\n      }\n      const breakOffsetBeforeStartIndex =\n        Base.binarySearch(\n          forcedBreakOffsets.length,\n          (i) => forcedBreakOffsets[i] > startOffset,\n        ) - 1;\n      const breakOffsetBeforeStart =\n        forcedBreakOffsets[breakOffsetBeforeStartIndex];\n      const parentFlowPosition =\n        this.layoutPositionAtPageStart.flowPositions[parentFlowName];\n      const parentStartOffset = this.getConsumedOffset(parentFlowPosition);\n      if (breakOffsetBeforeStart < parentStartOffset) {\n        return false;\n      }\n      if (parentStartOffset < breakOffsetBeforeStart) {\n        return true;\n      }\n\n      // Special case: parentStartOffset === breakOffsetBeforeStart\n      // In this case, the flowChunk can be used if the start side of the parent\n      // flow matches the current page side.\n      return !this.matchPageSide(parentFlowPosition.startBreakType);\n    }\n    return false;\n  }\n\n  setFormattingContextToColumn(column: LayoutType.Column, flowName: string) {\n    const flow = this.currentLayoutPosition.flows[flowName];\n    if (!flow.formattingContext) {\n      flow.formattingContext = new LayoutProcessor.BlockFormattingContext(null);\n    }\n    column.flowRootFormattingContext = flow.formattingContext;\n  }\n\n  layoutDeferredPageFloats(column: LayoutType.Column): Task.Result<boolean> {\n    const pageFloatLayoutContext = column.pageFloatLayoutContext;\n    const deferredFloats =\n      pageFloatLayoutContext.getDeferredPageFloatContinuations();\n\n    // Prevent deferred page floats from appearing in the preceding pages,\n    // e.g., during re-layout the TOC page with target-counter() referencing\n    // later sections containing page floats. (Issue #681)\n    const checkPageFloatForLaterPage = (\n      float: PageFloats.PageFloat,\n    ): boolean => {\n      // FIXME: This check is incomplete when float-reference is other than \"page\".\n      // so give up for now to prevent another problem (Issue #962, #1273).\n      if (float.floatReference !== PageFloats.FloatReference.PAGE) {\n        return false;\n      }\n      const pageStartPos = this.layoutPositionAtPageStart.flowPositions.body;\n      const pageStartOffset =\n        pageStartPos && this.getConsumedOffset(pageStartPos);\n      const deferredFloatOffset = this.xmldoc.getNodeOffset(\n        float.nodePosition.steps[0].node,\n        0,\n        false,\n      );\n      return (\n        deferredFloatOffset != null &&\n        pageStartOffset != null &&\n        deferredFloatOffset > pageStartOffset\n      );\n    };\n\n    const frame = Task.newFrame<boolean>(\"layoutDeferredPageFloats\");\n    let invalidated = false;\n    let i = 0;\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (i === deferredFloats.length) {\n          loopFrame.breakLoop();\n          return;\n        }\n        const continuation = deferredFloats[i++];\n        const float = continuation.float;\n\n        // Prevent deferred page floats from appearing in the preceding pages\n        // (Issue #681)\n        if (checkPageFloatForLaterPage(float)) {\n          loopFrame.breakLoop();\n          return;\n        }\n\n        const strategy =\n          new PageFloats.PageFloatLayoutStrategyResolver().findByFloat(float);\n        const pageFloatFragment = strategy.findPageFloatFragment(\n          float,\n          pageFloatLayoutContext,\n        );\n        if (pageFloatFragment && pageFloatFragment.hasFloat(float)) {\n          loopFrame.continueLoop();\n          return;\n        } else if (\n          pageFloatLayoutContext.isForbidden(float) ||\n          pageFloatLayoutContext.hasPrecedingFloatsDeferredToNext(float)\n        ) {\n          pageFloatLayoutContext.deferPageFloat(continuation);\n          loopFrame.breakLoop();\n          return;\n        }\n        column\n          .layoutPageFloatInner(continuation, strategy, null, pageFloatFragment)\n          .then((success) => {\n            if (!success) {\n              loopFrame.breakLoop();\n              return;\n            }\n            const parentInvalidated =\n              pageFloatLayoutContext.parent.isInvalidated();\n            if (parentInvalidated) {\n              loopFrame.breakLoop();\n              return;\n            } else if (\n              pageFloatLayoutContext.isInvalidated() &&\n              !parentInvalidated\n            ) {\n              invalidated = true;\n              pageFloatLayoutContext.validate();\n            }\n            loopFrame.continueLoop();\n          });\n      })\n      .then(() => {\n        if (invalidated) {\n          pageFloatLayoutContext.invalidate();\n        }\n        frame.finish(true);\n      });\n    return frame.result();\n  }\n\n  getLastAfterPositionIfDeferredFloatsExists(\n    column: LayoutType.Column,\n    newPosition: Vtree.ChunkPosition | null,\n  ): Vtree.ChunkPosition | null {\n    const pageFloatLayoutContext = column.pageFloatLayoutContext;\n    const deferredFloats =\n      pageFloatLayoutContext.getPageFloatContinuationsDeferredToNext();\n    if (deferredFloats.length > 0) {\n      if (column.lastAfterPosition) {\n        let result: Vtree.ChunkPosition;\n        if (newPosition) {\n          // Need overflown footnotes owned by newPosition\n          result = newPosition.clone();\n          result.primary = column.lastAfterPosition;\n        } else {\n          result = new Vtree.ChunkPosition(column.lastAfterPosition);\n        }\n        return result;\n      } else {\n        Asserts.assert(\"column.lastAfterPosition === null\");\n        return null;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * @return holding true\n   */\n  layoutColumn(\n    column: LayoutType.Column,\n    flowName: string,\n  ): Task.Result<boolean> {\n    const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n    if (!flowPosition || !this.matchPageSide(flowPosition.startBreakType)) {\n      return Task.newResult(true);\n    }\n\n    this.setFormattingContextToColumn(column, flowName);\n    column.init();\n    if (this.primaryFlows[flowName] && column.bands.length > 0) {\n      // In general, we force non-fitting content. Exception is only for primary\n      // flow columns that have exclusions.\n      column.forceNonfitting = false;\n    }\n    const frame: Task.Frame<boolean> = Task.newFrame(\"layoutColumn\");\n    this.layoutDeferredPageFloats(column).then(() => {\n      if (column.pageFloatLayoutContext.isInvalidated()) {\n        frame.finish(true);\n        return;\n      }\n\n      // Record indices of repeated positions and removed positions\n      const repeatedIndices = [] as number[];\n      const removedIndices = [] as number[];\n      let leadingEdge = true;\n      frame\n        .loopWithFrame((loopFrame) => {\n          if (\n            column.pageFloatLayoutContext.hasContinuingFloatFragmentsInFlow(\n              flowName,\n            )\n          ) {\n            loopFrame.breakLoop();\n            return;\n          }\n          while (flowPosition.positions.length - removedIndices.length > 0) {\n            let index = 0;\n\n            // Skip all removed positions\n            while (removedIndices.includes(index)) {\n              index++;\n            }\n            let selected = flowPosition.positions[index];\n            if (\n              selected.flowChunk.startOffset > this.lookupOffset ||\n              this.flowChunkIsAfterParentFlowForcedBreak(selected.flowChunk)\n            ) {\n              break;\n            }\n            for (let k = index + 1; k < flowPosition.positions.length; k++) {\n              if (removedIndices.includes(k)) {\n                continue; // Skip removed positions\n              }\n              const alt = flowPosition.positions[k];\n              if (\n                alt.flowChunk.startOffset > this.lookupOffset ||\n                this.flowChunkIsAfterParentFlowForcedBreak(alt.flowChunk)\n              ) {\n                break;\n              }\n              if (alt.flowChunk.isBetter(selected.flowChunk)) {\n                selected = alt;\n                index = k;\n              }\n            }\n            const flowChunk = selected.flowChunk;\n            let pending = true;\n            column\n              .layout(\n                selected.chunkPosition,\n                leadingEdge,\n                flowPosition.breakAfter,\n              )\n              .then((newPosition) => {\n                if (column.pageFloatLayoutContext.isInvalidated()) {\n                  loopFrame.breakLoop();\n                  return;\n                }\n                leadingEdge = false;\n\n                // static: keep in the flow\n                if (\n                  selected.flowChunk.repeated &&\n                  (newPosition === null || flowChunk.exclusive)\n                ) {\n                  repeatedIndices.push(index);\n                }\n                if (flowChunk.exclusive) {\n                  // exclusive, only can have one, remove from the flow even\n                  // if it did not fit\n                  removedIndices.push(index);\n                  loopFrame.breakLoop();\n                  return;\n                } else {\n                  // not exclusive\n                  const endOfColumn = !!newPosition || !!column.pageBreakType;\n                  const lastAfterPosition =\n                    this.getLastAfterPositionIfDeferredFloatsExists(\n                      column,\n                      newPosition,\n                    );\n                  if (column.pageBreakType && lastAfterPosition) {\n                    selected.chunkPosition = lastAfterPosition;\n\n                    // TODO propagate pageBreakType\n                    flowPosition.breakAfter = column.pageBreakType;\n                    column.pageBreakType = null;\n                  } else {\n                    // go to the next element in the flow\n                    removedIndices.push(index);\n                    if (newPosition || lastAfterPosition) {\n                      // did not fit completely\n                      selected.chunkPosition = newPosition || lastAfterPosition;\n                      repeatedIndices.push(index);\n                    }\n                    // forced break or \"auto\"\n                    flowPosition.startBreakType =\n                      Break.breakValueToStartBreakType(column.pageBreakType);\n                  }\n                  if (endOfColumn) {\n                    loopFrame.breakLoop();\n                    return;\n                  }\n                }\n\n                // Since at least one flowChunk has been placed in the\n                // column, the next flowChunk of the flow can be deferred to\n                // the next partition if there is not enough space in the\n                // current partition.\n                column.forceNonfitting = false;\n                if (pending) {\n                  // Sync result\n                  pending = false;\n                } else {\n                  // Async result\n                  loopFrame.continueLoop();\n                }\n              });\n            if (pending) {\n              // Async result\n              pending = false;\n              return;\n            }\n          }\n\n          // Sync result\n          loopFrame.breakLoop();\n        })\n        .then(() => {\n          if (!column.pageFloatLayoutContext.isInvalidated()) {\n            // Keep positions repeated or not removed\n            flowPosition.positions = flowPosition.positions.filter(\n              (pos, i) =>\n                repeatedIndices.includes(i) || !removedIndices.includes(i),\n            );\n            if (flowPosition.breakAfter === \"column\") {\n              flowPosition.breakAfter = null;\n            }\n            column.saveDistanceToBlockEndFloats();\n            const edge = column.pageFloatLayoutContext.getMaxReachedAfterEdge();\n            column.updateMaxReachedAfterEdge(edge);\n          }\n          frame.finish(true);\n        });\n    });\n    return frame.result();\n  }\n\n  createLayoutConstraint(\n    pageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  ): LayoutType.LayoutConstraint {\n    const pageIndex = this.currentLayoutPosition.page - 1;\n    const counterConstraint =\n      this.counterStore.createLayoutConstraint(pageIndex);\n    return new Layout.AllLayoutConstraint(\n      [counterConstraint].concat(pageFloatLayoutContext.getLayoutConstraints()),\n    );\n  }\n\n  private createAndLayoutColumn(\n    boxInstance: PageMaster.PageBoxInstance,\n    offsetX: number,\n    offsetY: number,\n    exclusions: GeometryUtil.Shape[],\n    layoutContainer: Vtree.Container,\n    currentColumnIndex: number,\n    flowNameStr: string,\n    regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    columnCount: number,\n    columnGap: number,\n    columnWidth: number,\n    innerShape: GeometryUtil.Shape,\n    layoutContext: Vtree.LayoutContext,\n    forceNonFitting: boolean,\n  ): Task.Result<LayoutType.Column> {\n    const dontApplyExclusions = boxInstance.vertical\n      ? boxInstance.isAutoWidth && boxInstance.isRightDependentOnAutoWidth\n      : boxInstance.isAutoHeight && boxInstance.isTopDependentOnAutoHeight;\n    const boxContainer = layoutContainer.element;\n    const columnPageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n      regionPageFloatLayoutContext,\n      PageFloats.FloatReference.COLUMN,\n      null,\n      flowNameStr,\n      null,\n      null,\n      null,\n    );\n    const positionAtColumnStart = this.currentLayoutPosition.clone();\n    const frame: Task.Frame<LayoutType.Column> = Task.newFrame(\n      \"createAndLayoutColumn\",\n    );\n    let column: LayoutType.Column;\n    frame\n      .loopWithFrame((loopFrame) => {\n        const layoutConstraint = this.createLayoutConstraint(\n          columnPageFloatLayoutContext,\n        );\n        if (columnCount > 1) {\n          const columnContainer = this.viewport.document.createElement(\"div\");\n          Base.setCSSProperty(columnContainer, \"position\", \"absolute\");\n          boxContainer.appendChild(columnContainer);\n          column = new Layout.Column(\n            columnContainer,\n            layoutContext,\n            this.clientLayout,\n            layoutConstraint,\n            columnPageFloatLayoutContext,\n          );\n          column.forceNonfitting = forceNonFitting;\n          column.vertical = layoutContainer.vertical;\n          column.rtl = layoutContainer.rtl;\n          column.snapHeight = layoutContainer.snapHeight;\n          column.snapWidth = layoutContainer.snapWidth;\n          if (layoutContainer.vertical) {\n            const columnY =\n              (layoutContainer.rtl\n                ? columnCount - currentColumnIndex - 1\n                : currentColumnIndex) *\n                (columnWidth + columnGap) +\n              layoutContainer.paddingTop;\n            const outerWidth = parseFloat(boxContainer.style.width);\n            column.setHorizontalPosition(\n              layoutContainer.paddingLeft + outerWidth - layoutContainer.width,\n              layoutContainer.width,\n            );\n            column.setVerticalPosition(columnY, columnWidth);\n          } else {\n            const columnX =\n              (layoutContainer.rtl\n                ? columnCount - currentColumnIndex - 1\n                : currentColumnIndex) *\n                (columnWidth + columnGap) +\n              layoutContainer.paddingLeft;\n            column.setVerticalPosition(\n              layoutContainer.paddingTop,\n              layoutContainer.height,\n            );\n            column.setHorizontalPosition(columnX, columnWidth);\n          }\n          column.originX = offsetX;\n          column.originY = offsetY;\n        } else {\n          column = new Layout.Column(\n            boxContainer,\n            layoutContext,\n            this.clientLayout,\n            layoutConstraint,\n            columnPageFloatLayoutContext,\n          );\n          column.copyFrom(layoutContainer);\n        }\n        column.exclusions = dontApplyExclusions ? [] : exclusions.concat();\n        column.innerShape = innerShape;\n        columnPageFloatLayoutContext.setContainer(column);\n        if ((column.vertical ? column.height : column.width) >= 0) {\n          // column.element.style.outline = \"1px dotted green\";\n          this.layoutColumn(column, flowNameStr).then(() => {\n            if (!columnPageFloatLayoutContext.isInvalidated()) {\n              columnPageFloatLayoutContext.finish();\n            }\n            if (\n              column.pageFloatLayoutContext.isInvalidated() &&\n              !regionPageFloatLayoutContext.isInvalidated()\n            ) {\n              column.pageFloatLayoutContext.validate();\n              this.currentLayoutPosition = positionAtColumnStart.clone();\n              if (column.element !== boxContainer) {\n                boxContainer.removeChild(column.element);\n              }\n              loopFrame.continueLoop();\n            } else {\n              loopFrame.breakLoop();\n            }\n          });\n        } else {\n          columnPageFloatLayoutContext.finish();\n          loopFrame.breakLoop();\n        }\n      })\n      .then(() => {\n        frame.finish(column);\n      });\n    return frame.result();\n  }\n\n  setPagePageFloatLayoutContextContainer(\n    pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    boxInstance: PageMaster.PageBoxInstance,\n    layoutContainer: Vtree.Container,\n  ) {\n    if (\n      boxInstance instanceof CssPage.PageAreaPartitionInstance ||\n      (boxInstance instanceof PageMaster.PageMasterInstance &&\n        !(boxInstance instanceof CssPage.PageRuleMasterInstance))\n    ) {\n      pagePageFloatLayoutContext.setContainer(layoutContainer);\n    }\n  }\n\n  getRegionPageFloatLayoutContext(\n    pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    boxInstance: PageMaster.PageBoxInstance,\n    layoutContainer: Vtree.Container,\n    flowName: string,\n  ): PageFloats.PageFloatLayoutContext {\n    Asserts.assert(boxInstance instanceof PageMaster.PartitionInstance);\n    const writingMode = boxInstance.getProp(this, \"writing-mode\") || null;\n    const direction = boxInstance.getProp(this, \"direction\") || null;\n    return new PageFloats.PageFloatLayoutContext(\n      pagePageFloatLayoutContext,\n      PageFloats.FloatReference.REGION,\n      layoutContainer,\n      flowName,\n      null,\n      writingMode,\n      direction,\n    );\n  }\n\n  layoutFlowColumnsWithBalancing(\n    page: Vtree.Page,\n    boxInstance: PageMaster.PageBoxInstance,\n    offsetX: number,\n    offsetY: number,\n    exclusions: GeometryUtil.Shape[],\n    pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    layoutContainer: Vtree.Container,\n    flowNameStr: string,\n    columnCount: number,\n  ): Task.Result<LayoutType.Column[]> {\n    const positionAtContainerStart = this.currentLayoutPosition.clone();\n    const regionPageFloatLayoutContext = this.getRegionPageFloatLayoutContext(\n      pagePageFloatLayoutContext,\n      boxInstance,\n      layoutContainer,\n      flowNameStr,\n    );\n    let isFirstTime = true;\n\n    const layoutColumns = () => {\n      this.currentLayoutPosition = positionAtContainerStart.clone();\n      return this.layoutFlowColumns(\n        page,\n        boxInstance,\n        offsetX,\n        offsetY,\n        exclusions,\n        pagePageFloatLayoutContext,\n        regionPageFloatLayoutContext,\n        layoutContainer,\n        flowNameStr,\n        columnCount,\n        isFirstTime,\n      ).thenAsync((columns) => {\n        if (columns) {\n          return Task.newResult({\n            columns,\n            position: this.currentLayoutPosition,\n          });\n        } else {\n          return Task.newResult(null);\n        }\n      });\n    };\n\n    return layoutColumns().thenAsync((generatorResult) => {\n      if (!generatorResult) {\n        return Task.newResult(null);\n      }\n      if (columnCount <= 1) {\n        return Task.newResult(generatorResult.columns);\n      }\n      const columnFill =\n        (boxInstance.getProp(this, \"column-fill\") as Css.Ident) ||\n        Css.ident.balance;\n      const flowPosition =\n        this.currentLayoutPosition.flowPositions[flowNameStr];\n      Asserts.assert(flowPosition);\n      const columnBalancer = Columns.createColumnBalancer(\n        columnCount,\n        columnFill,\n        layoutColumns,\n        regionPageFloatLayoutContext,\n        layoutContainer,\n        generatorResult.columns,\n        flowPosition,\n      );\n      if (!columnBalancer) {\n        return Task.newResult(generatorResult.columns);\n      }\n      isFirstTime = false;\n      pagePageFloatLayoutContext.lock();\n      regionPageFloatLayoutContext.lock();\n      return columnBalancer\n        .balanceColumns(generatorResult)\n        .thenAsync((result) => {\n          pagePageFloatLayoutContext.unlock();\n          pagePageFloatLayoutContext.validate();\n          regionPageFloatLayoutContext.unlock();\n          this.currentLayoutPosition = result.position;\n          return Task.newResult(result.columns);\n        });\n    });\n  }\n\n  layoutFlowColumns(\n    page: Vtree.Page,\n    boxInstance: PageMaster.PageBoxInstance,\n    offsetX: number,\n    offsetY: number,\n    exclusions: GeometryUtil.Shape[],\n    pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    regionPageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n    layoutContainer: Vtree.Container,\n    flowNameStr: string,\n    columnCount: number,\n    forceNonFitting: boolean,\n  ): Task.Result<LayoutType.Column[] | null> {\n    const frame: Task.Frame<LayoutType.Column[] | null> =\n      Task.newFrame(\"layoutFlowColumns\");\n    const positionAtContainerStart = this.currentLayoutPosition.clone();\n    const columnGap = boxInstance.getPropAsNumber(this, \"column-gap\");\n\n    // Don't query columnWidth when it's not needed, so that width calculation\n    // can be delayed for width: auto columns.\n    const columnWidth =\n      columnCount > 1\n        ? boxInstance.getPropAsNumber(this, \"column-width\")\n        : layoutContainer.vertical\n          ? layoutContainer.height\n          : layoutContainer.width;\n    const regionIds = boxInstance.getActiveRegions(this);\n    const innerShapeVal = boxInstance.getProp(this, \"shape-inside\");\n    const innerShape = CssProp.toShape(\n      innerShapeVal,\n      0,\n      0,\n      layoutContainer.width,\n      layoutContainer.height,\n      this,\n    );\n    const layoutContext = new Vgen.ViewFactory(\n      flowNameStr,\n      this,\n      this.viewport,\n      this.styler,\n      regionIds,\n      this.xmldoc,\n      this.faces,\n      this.style.footnoteProps,\n      this,\n      page,\n      this.customRenderer,\n      this.fallbackMap,\n      this.documentURLTransformer,\n    );\n    let columnIndex = 0;\n    let column: LayoutType.Column = null;\n    let columns: LayoutType.Column[] = [];\n    frame\n      .loopWithFrame((loopFrame) => {\n        this.createAndLayoutColumn(\n          boxInstance,\n          offsetX,\n          offsetY,\n          exclusions,\n          layoutContainer,\n          columnIndex++,\n          flowNameStr,\n          regionPageFloatLayoutContext,\n          columnCount,\n          columnGap,\n          columnWidth,\n          innerShape,\n          layoutContext,\n          forceNonFitting,\n        ).then((c) => {\n          if (pagePageFloatLayoutContext.isInvalidated()) {\n            columns = null;\n            loopFrame.breakLoop();\n            return;\n          }\n          const forcedRegionBreak =\n            !!c.pageBreakType && c.pageBreakType !== \"column\";\n          if (\n            (forcedRegionBreak || columnIndex === columnCount) &&\n            !regionPageFloatLayoutContext.isInvalidated()\n          ) {\n            regionPageFloatLayoutContext.finish();\n          }\n          if (regionPageFloatLayoutContext.isInvalidated()) {\n            columnIndex = 0;\n            this.currentLayoutPosition = positionAtContainerStart.clone();\n            regionPageFloatLayoutContext.validate();\n            if (regionPageFloatLayoutContext.isLocked()) {\n              columns = null;\n              loopFrame.breakLoop();\n            } else {\n              loopFrame.continueLoop();\n            }\n            return;\n          }\n          column = c;\n          columns[columnIndex - 1] = column;\n          if (column.pageBreakType) {\n            if (column.pageBreakType != \"column\") {\n              // skip remaining columns\n              columnIndex = columnCount;\n              if (column.pageBreakType != \"region\") {\n                // skip remaining regions\n                this.pageBreaks[flowNameStr] = true;\n              }\n            }\n          }\n          if (columnIndex < columnCount) {\n            loopFrame.continueLoop();\n          } else {\n            loopFrame.breakLoop();\n          }\n        });\n      })\n      .then(() => {\n        frame.finish(columns);\n      });\n    return frame.result();\n  }\n\n  /**\n   * @return holding true\n   */\n  layoutContainer(\n    page: Vtree.Page,\n    boxInstance: PageMaster.PageBoxInstance,\n    parentContainer: HTMLElement,\n    offsetX: number,\n    offsetY: number,\n    exclusions: GeometryUtil.Shape[],\n    pagePageFloatLayoutContext: PageFloats.PageFloatLayoutContext,\n  ): Task.Result<boolean> {\n    boxInstance.reset();\n    const enabled = boxInstance.getProp(this, \"enabled\");\n    if (enabled && enabled !== Css.ident._true) {\n      return Task.newResult(true);\n    }\n    const frame: Task.Frame<boolean> = Task.newFrame(\"layoutContainer\");\n    const wrapFlow = boxInstance.getProp(this, \"wrap-flow\");\n    const dontExclude = wrapFlow === Css.ident.auto;\n    const flowName = boxInstance.getProp(this, \"flow-from\");\n    const boxContainer = this.viewport.document.createElement(\"div\");\n    boxContainer.role =\n      boxInstance instanceof CssPage.PageMarginBoxPartitionInstance\n        ? \"complementary\"\n        : \"presentation\";\n    const position = boxInstance.getProp(this, \"position\");\n    Base.setCSSProperty(\n      boxContainer,\n      \"position\",\n      position ? (position as any).name : \"absolute\",\n    );\n\n    // The -epubx-page-master partitions are laid out in the reverse order\n    // (see the spec http://idpf.org/epub/pgt/ ),\n    // but for css-page rules, now use forward order, i.e., the page-area first.\n    // This is necessary for running headers named strings support.\n    const forwardOrderInLayout =\n      boxInstance instanceof CssPage.PageRuleMasterInstance;\n    const forwardOrderInTree =\n      boxInstance instanceof PageMaster.PartitionInstance;\n\n    if (forwardOrderInTree) {\n      parentContainer.appendChild(boxContainer);\n    } else {\n      parentContainer.insertBefore(boxContainer, parentContainer.firstChild);\n    }\n\n    let layoutContainer = new Vtree.Container(boxContainer);\n    layoutContainer.vertical = boxInstance.vertical;\n    layoutContainer.rtl = boxInstance.rtl;\n    layoutContainer.borderBoxSizing = boxInstance.borderBoxSizing;\n    layoutContainer.exclusions = exclusions;\n    boxInstance.prepareContainer(\n      this,\n      layoutContainer,\n      page,\n      this.faces,\n      this.clientLayout,\n    );\n\n    if (\n      boxInstance instanceof CssPage.PageRuleMasterInstance &&\n      (layoutContainer.width <= 0 || layoutContainer.height <= 0)\n    ) {\n      Logging.logger.warn(\"Negative or zero page area size\");\n    }\n\n    layoutContainer.originX = offsetX;\n    layoutContainer.originY = offsetY;\n    offsetX +=\n      layoutContainer.left +\n      layoutContainer.marginLeft +\n      layoutContainer.borderLeft;\n    offsetY +=\n      layoutContainer.top +\n      layoutContainer.marginTop +\n      layoutContainer.borderTop;\n    this.setPagePageFloatLayoutContextContainer(\n      pagePageFloatLayoutContext,\n      boxInstance,\n      layoutContainer,\n    );\n    let cont: Task.Result<boolean>;\n    let removed = false;\n    if (!flowName || !flowName.isIdent()) {\n      const contentVal = boxInstance.getProp(this, \"content\");\n      if (\n        contentVal instanceof Css.Expr &&\n        contentVal.expr instanceof Exprs.Native &&\n        contentVal.expr.str.startsWith(\"running-element-\")\n      ) {\n        // Single running element\n        contentVal.visit(\n          new Vtree.ContentPropertyHandler(\n            boxContainer,\n            this,\n            contentVal,\n            this.counterStore.getExprContentListener(),\n          ),\n        );\n      } else if (Vtree.nonTrivialContent(contentVal)) {\n        let innerContainerTag = \"span\";\n        if (contentVal instanceof Css.URL) {\n          innerContainerTag = \"img\";\n        }\n        const innerContainer =\n          this.viewport.document.createElement(innerContainerTag);\n        contentVal.visit(\n          new Vtree.ContentPropertyHandler(\n            innerContainer,\n            this,\n            contentVal,\n            this.counterStore.getExprContentListener(),\n          ),\n        );\n        boxContainer.appendChild(innerContainer);\n        if (innerContainerTag == \"img\") {\n          boxInstance.transferSingleUriContentProps(\n            this,\n            innerContainer,\n            this.faces,\n          );\n        }\n        boxInstance.transferContentProps(\n          this,\n          layoutContainer,\n          page,\n          this.faces,\n        );\n        if (innerContainerTag == \"span\") {\n          // text-spacing & hanging-punctuation on margin boxes\n          TextPolyfill.processGeneratedContent(\n            innerContainer,\n            boxInstance.getProp(this, \"text-autospace\"),\n            boxInstance.getProp(this, \"text-spacing-trim\"),\n            boxInstance.getProp(this, \"hanging-punctuation\"),\n            this.lang,\n            boxInstance.vertical,\n          );\n        }\n      } else if (boxInstance.suppressEmptyBoxGeneration) {\n        parentContainer.removeChild(boxContainer);\n        removed = true;\n      }\n      if (!removed) {\n        boxInstance.finishContainer(\n          this,\n          layoutContainer,\n          page,\n          null,\n          1,\n          this.clientLayout,\n          this.faces,\n        );\n      }\n      cont = Task.newResult(true);\n    } else if (!this.pageBreaks[flowName.toString()]) {\n      const innerFrame: Task.Frame<boolean> = Task.newFrame(\n        \"layoutContainer.inner\",\n      );\n      const flowNameStr = flowName.toString();\n\n      // for now only a single column in vertical case\n      const columnCount = boxInstance.getPropAsNumber(this, \"column-count\");\n      this.layoutFlowColumnsWithBalancing(\n        page,\n        boxInstance,\n        offsetX,\n        offsetY,\n        exclusions,\n        pagePageFloatLayoutContext,\n        layoutContainer,\n        flowNameStr,\n        columnCount,\n      ).then((columns) => {\n        if (!pagePageFloatLayoutContext.isInvalidated()) {\n          const column = columns[0];\n          Asserts.assert(column);\n          if (column.element === boxContainer) {\n            layoutContainer = column;\n          }\n          layoutContainer.computedBlockSize = Math.max.apply(\n            null,\n            columns.map((c) => c.computedBlockSize),\n          );\n          boxInstance.finishContainer(\n            this,\n            layoutContainer,\n            page,\n            column,\n            columnCount,\n            this.clientLayout,\n            this.faces,\n          );\n          const flowPosition =\n            this.currentLayoutPosition.flowPositions[flowNameStr];\n          if (flowPosition && flowPosition.breakAfter === \"region\") {\n            flowPosition.breakAfter = null;\n          }\n        }\n        innerFrame.finish(true);\n      });\n      cont = innerFrame.result();\n    } else {\n      if (!pagePageFloatLayoutContext.isInvalidated()) {\n        boxInstance.finishContainer(\n          this,\n          layoutContainer,\n          page,\n          null,\n          1,\n          this.clientLayout,\n          this.faces,\n        );\n      }\n      cont = Task.newResult(true);\n    }\n    cont.then(() => {\n      if (pagePageFloatLayoutContext.isInvalidated()) {\n        frame.finish(true);\n        return;\n      }\n      if (\n        !boxInstance.isAutoHeight ||\n        Math.floor(layoutContainer.computedBlockSize) > 0\n      ) {\n        if (!removed && !dontExclude) {\n          const outerShapeProp = boxInstance.getProp(this, \"shape-outside\");\n          const outerShape = layoutContainer.getOuterShape(\n            outerShapeProp,\n            this,\n          );\n          exclusions.push(outerShape);\n        }\n      } else if (boxInstance.children.length == 0) {\n        parentContainer.removeChild(boxContainer);\n        frame.finish(true);\n        return;\n      }\n      let i = forwardOrderInLayout ? 0 : boxInstance.children.length - 1;\n      frame\n        .loop(() => {\n          while (i >= 0 && i < boxInstance.children.length) {\n            const child =\n              boxInstance.children[forwardOrderInLayout ? i++ : i--];\n            const r = this.layoutContainer(\n              page,\n              child,\n              boxContainer,\n              offsetX,\n              offsetY,\n              exclusions,\n              pagePageFloatLayoutContext,\n            );\n            if (r.isPending()) {\n              return r.thenAsync(() =>\n                Task.newResult(!pagePageFloatLayoutContext.isInvalidated()),\n              );\n            } else if (pagePageFloatLayoutContext.isInvalidated()) {\n              break;\n            }\n          }\n          return Task.newResult(false);\n        })\n        .then(() => {\n          frame.finish(true);\n        });\n    });\n    return frame.result();\n  }\n\n  processLinger(): void {\n    const pageNumber = this.currentLayoutPosition.page;\n    for (const flowName in this.currentLayoutPosition.flowPositions) {\n      const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n      for (let i = flowPosition.positions.length - 1; i >= 0; i--) {\n        const pos = flowPosition.positions[i];\n        if (\n          pos.flowChunk.startPage >= 0 &&\n          pos.flowChunk.startPage + pos.flowChunk.linger - 1 <= pageNumber\n        ) {\n          flowPosition.positions.splice(i, 1);\n        }\n      }\n    }\n  }\n\n  initLingering(): void {\n    const pageNumber = this.currentLayoutPosition.page;\n    for (const flowName in this.currentLayoutPosition.flowPositions) {\n      const flowPosition = this.currentLayoutPosition.flowPositions[flowName];\n      for (let i = flowPosition.positions.length - 1; i >= 0; i--) {\n        const pos = flowPosition.positions[i];\n        if (\n          pos.flowChunk.startPage < 0 &&\n          pos.flowChunk.startOffset < this.lookupOffset\n        ) {\n          pos.flowChunk.startPage = pageNumber;\n        }\n      }\n    }\n  }\n\n  noMorePrimaryFlows(cp: Vtree.LayoutPosition): boolean {\n    for (const flowName in this.primaryFlows) {\n      const flowPosition = cp.flowPositions[flowName];\n      if (flowPosition && flowPosition.positions.length > 0) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  layoutNextPage(\n    page: Vtree.Page,\n    cp?: Vtree.LayoutPosition,\n  ): Task.Result<Vtree.LayoutPosition> {\n    // TOC box is special page container, no pagination\n    const isTocBox = page.container === page.bleedBox;\n\n    this.pageBreaks = {};\n    if (cp) {\n      this.currentLayoutPosition = cp.clone();\n      this.styler.replayFlowElementsFromOffset(cp.highestSeenOffset);\n    } else {\n      this.currentLayoutPosition = new Vtree.LayoutPosition();\n      this.styler.replayFlowElementsFromOffset(-1);\n    }\n    if (this.lang) {\n      page.bleedBox.setAttribute(\"lang\", this.lang);\n    }\n    cp = this.currentLayoutPosition;\n\n    // Limit number of pages to prevent endless page generation\n    const LIMIT_PAGES = 10000;\n    if (cp.page > LIMIT_PAGES) {\n      throw new Error(`Too many pages generated (over ${LIMIT_PAGES} pages)`);\n    }\n\n    const startSide = cp.startSideOfFlow(\"body\");\n    cp.isBlankPage =\n      Break.isSpreadBreakValue(startSide) && this.matchPageSide(startSide);\n    page.isBlankPage = cp.isBlankPage;\n    cp.page++;\n\n    // Save previous page type before it gets updated\n    const prevPageType = this.styler.cascade.previousPageType;\n\n    if (page.pageType == null) {\n      page.pageType =\n        (page.isBlankPage\n          ? this.styler.cascade.previousPageType\n          : this.styler.cascade.currentPageType) ?? \"\";\n      // Fix for issue #1309\n      this.styler.cascade.previousPageType =\n        this.styler.cascade.currentPageType;\n    }\n\n    // Update page type page counts for :nth(An+B of <page-type>) selector\n    // Use pageCascadeInstance which is used for page rule evaluation\n    const pageCascade = this.pageManager.pageCascadeInstance;\n    if (page.pageType) {\n      // If page type changed from the previous page, reset count for the new page type (new page group)\n      if (prevPageType !== page.pageType) {\n        pageCascade.pageTypePageCounts[page.pageType] = 0;\n      }\n      pageCascade.pageTypePageCounts[page.pageType] =\n        (pageCascade.pageTypePageCounts[page.pageType] || 0) + 1;\n    }\n\n    this.clearScope(this.style.pageScope);\n    this.layoutPositionAtPageStart = cp.clone();\n\n    // Resolve page size before page master selection.\n    const cascadedPageStyle = isTocBox\n      ? ({} as CssCascade.ElementStyle)\n      : this.pageManager.getCascadedPageStyle(page.pageType);\n\n    // Substitute var()\n    this.styler.cascade.applyVarFilter([cascadedPageStyle], this.styler, null);\n\n    // Calculate calc()\n    this.styler.cascade.applyCalcFilter(cascadedPageStyle, this.styler.context);\n\n    // Convert device-cmyk() to color(srgb ...)\n    this.styler.cascade.applyCmykFilter(cascadedPageStyle);\n\n    if (!isTocBox) {\n      const isLeftPage = new Exprs.Named(this.style.pageScope, \"left-page\");\n      page.side = isLeftPage.evaluate(this)\n        ? Constants.PageSide.LEFT\n        : Constants.PageSide.RIGHT;\n\n      page.container.setAttribute(\n        \"data-vivliostyle-page-side\",\n        page.side as string,\n      );\n    }\n\n    const pageMaster = this.selectPageMaster(cascadedPageStyle);\n    if (!pageMaster) {\n      // end of primary content\n      return Task.newResult(null as Vtree.LayoutPosition);\n    }\n    let bleedBoxPaddingEdge = 0;\n    if (!isTocBox) {\n      page.setAutoPageWidth(\n        (pageMaster.pageBox.specified[\"width\"] as CssCascade.CascadeValue)\n          .value === Css.fullWidth,\n      );\n      page.setAutoPageHeight(\n        (pageMaster.pageBox.specified[\"height\"] as CssCascade.CascadeValue)\n          .value === Css.fullHeight,\n      );\n      this.counterStore.setCurrentPage(page);\n      this.counterStore.updatePageCounters(cascadedPageStyle, this);\n\n      // setup bleed area and crop marks\n      const evaluatedPageSizeAndBleed = CssPage.evaluatePageSizeAndBleed(\n        CssPage.resolvePageSizeAndBleed(cascadedPageStyle as any),\n        this,\n      );\n      this.setPageSizeAndBleed(evaluatedPageSizeAndBleed, page);\n\n      CssPage.addPrinterMarks(\n        cascadedPageStyle,\n        evaluatedPageSizeAndBleed,\n        page,\n        this,\n      );\n      bleedBoxPaddingEdge =\n        evaluatedPageSizeAndBleed.bleedOffset + evaluatedPageSizeAndBleed.bleed;\n    }\n\n    const writingMode =\n      (!isTocBox && pageMaster.getProp(this, \"writing-mode\")) ||\n      Css.ident.horizontal_tb;\n\n    this.pageVertical = writingMode != Css.ident.horizontal_tb;\n\n    const direction = pageMaster.getProp(this, \"direction\") || Css.ident.ltr;\n    const pageFloatLayoutContext = new PageFloats.PageFloatLayoutContext(\n      this.rootPageFloatLayoutContext,\n      PageFloats.FloatReference.PAGE,\n      null,\n      null,\n      null,\n      writingMode,\n      direction,\n    );\n    const frame: Task.Frame<Vtree.LayoutPosition> =\n      Task.newFrame(\"layoutNextPage\");\n    frame\n      .loopWithFrame((loopFrame) => {\n        // this.layoutContainer(page, pageMaster, page.bleedBox, bleedBoxPaddingEdge, bleedBoxPaddingEdge+1, // Compensate 'top: -1px' on page master\n        this.layoutContainer(\n          page,\n          pageMaster,\n          page.bleedBox,\n          bleedBoxPaddingEdge,\n          bleedBoxPaddingEdge,\n          [],\n          pageFloatLayoutContext,\n        ).then(() => {\n          if (!pageFloatLayoutContext.isInvalidated()) {\n            pageFloatLayoutContext.finish();\n          }\n          if (pageFloatLayoutContext.isInvalidated()) {\n            this.currentLayoutPosition = this.layoutPositionAtPageStart.clone();\n            pageFloatLayoutContext.validate();\n            loopFrame.continueLoop();\n          } else {\n            loopFrame.breakLoop();\n          }\n        });\n      })\n      .then(() => {\n        pageMaster.adjustPageLayout(this, page, this.clientLayout);\n        if (!isTocBox) {\n          this.processLinger();\n          cp = this.currentLayoutPosition;\n          Object.keys(cp.flowPositions).forEach((flowName) => {\n            const flowPosition = cp.flowPositions[flowName];\n            const breakAfter = flowPosition.breakAfter;\n            if (\n              breakAfter &&\n              (breakAfter === \"page\" || !this.matchPageSide(breakAfter))\n            ) {\n              flowPosition.breakAfter = null;\n            }\n          });\n        }\n        this.currentLayoutPosition = this.layoutPositionAtPageStart = null;\n        cp.highestSeenOffset = this.styler.getReachedOffset();\n        const triggers = this.style.store.getTriggersForDoc(this.xmldoc);\n        page.finish(triggers, this.clientLayout);\n        if (this.noMorePrimaryFlows(cp)) {\n          cp = null;\n        }\n        frame.finish(cp);\n      });\n    return frame.result();\n  }\n\n  /**\n   * Set actual page width, height and bleed from style specified in page\n   * context.\n   */\n  private setPageSizeAndBleed(\n    evaluatedPageSizeAndBleed: CssPage.EvaluatedPageSizeAndBleed,\n    page: Vtree.Page,\n  ) {\n    this.actualPageWidth = evaluatedPageSizeAndBleed.pageWidth;\n    this.actualPageHeight = evaluatedPageSizeAndBleed.pageHeight;\n    this.pageSheetWidth =\n      evaluatedPageSizeAndBleed.pageWidth +\n      evaluatedPageSizeAndBleed.cropOffset * 2;\n    this.pageSheetHeight =\n      evaluatedPageSizeAndBleed.pageHeight +\n      evaluatedPageSizeAndBleed.cropOffset * 2;\n    page.container.style.width = `${this.pageSheetWidth}px`;\n    page.container.style.height = `${this.pageSheetHeight}px`;\n    page.bleedBox.style.left = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n    page.bleedBox.style.right = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n    page.bleedBox.style.top = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n    page.bleedBox.style.bottom = `${evaluatedPageSizeAndBleed.bleedOffset}px`;\n    page.bleedBox.style.padding = `${evaluatedPageSizeAndBleed.bleed}px`;\n  }\n}\n\nexport class BaseParserHandler extends CssCascade.CascadeParserHandler {\n  insideRegion: boolean = false;\n\n  constructor(\n    public masterHandler: StyleParserHandler,\n    condition: Exprs.Val,\n    parent: BaseParserHandler,\n    regionId: string | null,\n  ) {\n    super(\n      masterHandler.rootScope,\n      masterHandler,\n      condition,\n      parent,\n      regionId,\n      masterHandler.validatorSet,\n      !parent,\n    );\n  }\n\n  override startPageTemplateRule(): void {}\n\n  override startPageMasterRule(\n    name: string | null,\n    pseudoName: string | null,\n    classes: string[],\n  ): void {\n    const pageMaster = new PageMaster.PageMaster(\n      this.masterHandler.pageScope,\n      name,\n      pseudoName,\n      classes,\n      this.masterHandler.rootBox,\n      this.condition,\n      this.owner.getBaseSpecificity(),\n    );\n    this.masterHandler.pushHandler(\n      new PageMaster.PageMasterParserHandler(\n        pageMaster.scope,\n        this.masterHandler,\n        pageMaster,\n        this.validatorSet,\n      ),\n    );\n  }\n\n  override startWhenRule(expr: Css.Expr): void {\n    let condition = expr.expr;\n    if (this.condition != null) {\n      condition = Exprs.and(this.scope, this.condition, condition);\n    }\n    this.masterHandler.pushHandler(\n      new BaseParserHandler(this.masterHandler, condition, this, this.regionId),\n    );\n  }\n\n  override startDefineRule(): void {\n    this.masterHandler.pushHandler(\n      new CssCascade.DefineParserHandler(this.scope, this.owner),\n    );\n  }\n\n  override startFontFaceRule(): void {\n    const properties = {} as CssCascade.ElementStyle;\n    this.masterHandler.fontFaces.push({\n      properties,\n      condition: this.condition,\n    });\n    this.masterHandler.pushHandler(\n      new CssCascade.PropSetParserHandler(\n        this.scope,\n        this.owner,\n        null,\n        properties,\n        this.masterHandler.validatorSet,\n        \"font-face\",\n      ),\n    );\n  }\n\n  override startCounterStyleRule(name: string): void {\n    this.masterHandler.pushHandler(\n      new CounterStyleParserHandler(\n        this.scope,\n        this.owner,\n        {} as CssCascade.ElementStyle,\n        this.masterHandler.validatorSet,\n        name,\n        this.masterHandler.counterStyles,\n      ),\n    );\n  }\n\n  override startFlowRule(flowName: string): void {\n    let style = this.masterHandler.flowProps[flowName];\n    if (!style) {\n      style = {} as CssCascade.ElementStyle;\n      this.masterHandler.flowProps[flowName] = style;\n    }\n    this.masterHandler.pushHandler(\n      new CssCascade.PropSetParserHandler(\n        this.scope,\n        this.owner,\n        null,\n        style,\n        this.masterHandler.validatorSet,\n      ),\n    );\n  }\n\n  override startViewportRule(): void {\n    const viewportProps = {} as CssCascade.ElementStyle;\n    this.masterHandler.viewportProps.push(viewportProps);\n    this.masterHandler.pushHandler(\n      new CssCascade.PropSetParserHandler(\n        this.scope,\n        this.owner,\n        this.condition,\n        viewportProps,\n        this.masterHandler.validatorSet,\n      ),\n    );\n  }\n\n  override startFootnoteRule(pseudoelem: string | null): void {\n    let style = this.masterHandler.footnoteProps;\n    if (pseudoelem) {\n      const pseudos = CssCascade.getMutableStyleMap(style, \"_pseudos\");\n      style = pseudos[pseudoelem];\n      if (!style) {\n        style = {} as CssCascade.ElementStyle;\n        pseudos[pseudoelem] = style;\n      }\n    }\n    this.masterHandler.pushHandler(\n      new CssCascade.PropSetParserHandler(\n        this.scope,\n        this.owner,\n        null,\n        style,\n        this.masterHandler.validatorSet,\n      ),\n    );\n  }\n\n  override startRegionRule(): void {\n    this.insideRegion = true;\n    this.startSelectorRule();\n  }\n\n  override startPageRule(): void {\n    const pageHandler = new CssPage.PageParserHandler(\n      this.masterHandler.pageScope,\n      this.masterHandler,\n      this,\n      this.validatorSet,\n      this.masterHandler.pageProps,\n    );\n    this.masterHandler.pushHandler(pageHandler);\n    pageHandler.startPageRule();\n  }\n\n  override startRuleBody(): void {\n    CssCascade.CascadeParserHandler.prototype.startRuleBody.call(this);\n    if (this.insideRegion) {\n      this.insideRegion = false;\n      const regionId = `R${this.masterHandler.regionCount++}`;\n      this.special(\"region-id\", Css.getName(regionId));\n      this.endRule();\n      const regionHandler = new BaseParserHandler(\n        this.masterHandler,\n        this.condition,\n        this,\n        regionId,\n      );\n      this.masterHandler.pushHandler(regionHandler);\n      regionHandler.startRuleBody();\n    }\n  }\n}\n\nexport class StyleParserHandler extends CssParser.DispatchParserHandler {\n  rootScope: Exprs.LexicalScope;\n  pageScope: Exprs.LexicalScope;\n  rootBox: PageMaster.RootPageBox;\n  cascadeParserHandler: BaseParserHandler;\n  regionCount: number = 0;\n  fontFaces = [] as FontFace[];\n  counterStyles = new CounterStyle.CounterStyleStore();\n  footnoteProps = {} as CssCascade.ElementStyle;\n  flowProps = {} as { [key: string]: CssCascade.ElementStyle };\n  viewportProps = [] as CssCascade.ElementStyle[];\n  pageProps = {} as { [key: string]: CssCascade.ElementStyle };\n\n  constructor(public readonly validatorSet: CssValidator.ValidatorSet) {\n    super();\n    this.rootScope = new Exprs.LexicalScope(null);\n    this.pageScope = new Exprs.LexicalScope(this.rootScope);\n    this.rootBox = new PageMaster.RootPageBox(this.rootScope);\n    this.cascadeParserHandler = new BaseParserHandler(this, null, null, null);\n    this.slave = this.cascadeParserHandler;\n  }\n}\n\nexport type StyleSource = {\n  url: string;\n  text: string | null;\n  flavor: CssParser.StylesheetFlavor;\n  classes: string | null;\n  media: string | null;\n};\n\nexport function parseOPSResource(\n  response: Net.FetchResponse,\n  store: XmlDoc.XMLDocStore,\n): Task.Result<XmlDoc.XMLDocHolder> {\n  return (store as OPSDocStore).parseOPSResource(response);\n}\n\nexport class OPSDocStore extends Net.ResourceStore<XmlDoc.XMLDocHolder> {\n  styleByKey: { [key: string]: Style } = {};\n  styleFetcherByKey: { [key: string]: TaskUtil.Fetcher<Style> } = {};\n  styleByDocURL: { [key: string]: Style } = {};\n  triggersByDocURL: { [key: string]: Vtree.Trigger[] } = {};\n  validatorSet: CssValidator.ValidatorSet = null;\n  private styleSheets: StyleSource[] = [];\n  private triggerSingleDocumentPreprocessing: boolean = false;\n\n  constructor(\n    public fontDeobfuscator:\n      | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n      | null,\n  ) {\n    super(parseOPSResource, Net.FetchResponseType.DOCUMENT);\n  }\n\n  init(\n    authorStyleSheets: { url: string | null; text: string | null }[] | null,\n    userStyleSheets: { url: string | null; text: string | null }[] | null,\n  ): Task.Result<boolean> {\n    this.setStyleSheets(authorStyleSheets as any, userStyleSheets as any);\n    const frame = Task.newFrame<boolean>(\"OPSDocStore.init\");\n    this.validatorSet = CssValidator.baseValidatorSet();\n    loadUABase().then(() => {\n      this.triggerSingleDocumentPreprocessing = true;\n      frame.finish(true);\n    });\n    return frame.result();\n  }\n\n  getStyleForDoc(xmldoc: XmlDoc.XMLDocHolder): Style {\n    return this.styleByDocURL[xmldoc.url];\n  }\n\n  getTriggersForDoc(xmldoc: XmlDoc.XMLDocHolder): Vtree.Trigger[] {\n    return this.triggersByDocURL[xmldoc.url];\n  }\n\n  /**\n   * Set author stylesheets and user stylesheets. Existing style sheets are\n   * removed.\n   */\n  private setStyleSheets(\n    authorStyleSheets: StyleSource[] | null,\n    userStyleSheets: StyleSource[] | null,\n  ) {\n    this.clearStyleSheets();\n    if (authorStyleSheets) {\n      authorStyleSheets.forEach(this.addAuthorStyleSheet, this);\n    }\n    if (userStyleSheets) {\n      userStyleSheets.forEach(this.addUserStyleSheet, this);\n    }\n  }\n\n  private clearStyleSheets() {\n    this.styleSheets.splice(0);\n  }\n\n  private addAuthorStyleSheet(stylesheet: StyleSource) {\n    let url = stylesheet.url;\n    if (url) {\n      url = Base.resolveURL(Base.convertSpecialURL(url), Base.baseURL);\n    }\n    this.styleSheets.push({\n      url,\n      text: stylesheet.text,\n      flavor: CssParser.StylesheetFlavor.AUTHOR,\n      classes: null,\n      media: null,\n    });\n  }\n\n  private addUserStyleSheet(stylesheet: StyleSource) {\n    let url = stylesheet.url;\n    if (url) {\n      url = Base.resolveURL(Base.convertSpecialURL(url), Base.baseURL);\n    }\n    this.styleSheets.push({\n      url,\n      text: stylesheet.text,\n      flavor: CssParser.StylesheetFlavor.USER,\n      classes: null,\n      media: null,\n    });\n  }\n\n  parseOPSResource(\n    response: Net.FetchResponse,\n  ): Task.Result<XmlDoc.XMLDocHolder> {\n    const frame: Task.Frame<XmlDoc.XMLDocHolder> =\n      Task.newFrame(\"OPSDocStore.load\");\n    const url = response.url;\n\n    // Hack for TOCView.showTOC()\n    const isTocBox = url.endsWith(\"?viv-toc-box\");\n\n    XmlDoc.parseXMLResource(response, this).then(\n      (xmldoc: XmlDoc.XMLDocHolder) => {\n        if (!xmldoc) {\n          frame.finish(null);\n          return;\n        }\n        if (this.triggerSingleDocumentPreprocessing) {\n          const hooks: Plugin.PreProcessSingleDocumentHook[] =\n            Plugin.getHooksForName(Plugin.HOOKS.PREPROCESS_SINGLE_DOCUMENT);\n          for (let i = 0; i < hooks.length; i++) {\n            try {\n              hooks[i](xmldoc.document);\n            } catch (e) {\n              Logging.logger.warn(\n                \"Error during single document preprocessing:\",\n                e,\n              );\n            }\n          }\n        }\n        const triggers = [];\n        const triggerList = xmldoc.document.getElementsByTagNameNS(\n          Base.NS.epub,\n          \"trigger\",\n        );\n        for (let i = 0; i < triggerList.length; i++) {\n          const triggerElem = triggerList[i];\n          const observer = triggerElem.getAttributeNS(Base.NS.EV, \"observer\");\n          const event = triggerElem.getAttributeNS(Base.NS.EV, \"event\");\n          const action = triggerElem.getAttribute(\"action\");\n          const ref = triggerElem.getAttribute(\"ref\");\n          if (observer && event && action && ref) {\n            triggers.push({ observer, event, action, ref });\n          }\n        }\n        this.triggersByDocURL[url] = triggers;\n        const sources = [] as StyleSource[];\n        sources.push({\n          url: Base.resolveURL(\"user-agent-page.css\", Base.resourceBaseURL),\n          text: UserAgentPageCss,\n          flavor: CssParser.StylesheetFlavor.USER_AGENT,\n          classes: null,\n          media: null,\n        });\n        sources.push({\n          url: Base.resolveURL(\n            \"user-agent-counter-styles.css\",\n            Base.resourceBaseURL,\n          ),\n          text: UserAgentCounterStylesCss,\n          flavor: CssParser.StylesheetFlavor.USER_AGENT,\n          classes: null,\n          media: null,\n        });\n        if (isTocBox) {\n          sources.push({\n            url: Base.resolveURL(\"user-agent-toc.css\", Base.resourceBaseURL),\n            text: UserAgentTocCss,\n            flavor: CssParser.StylesheetFlavor.USER_AGENT,\n            classes: null,\n            media: null,\n          });\n        } else {\n          const elemList =\n            xmldoc.document.querySelectorAll(\"style, link, meta\");\n          for (const elem of elemList) {\n            const ns = elem.namespaceURI;\n            const localName = elem.localName;\n            if (ns == Base.NS.XHTML) {\n              if (localName == \"style\") {\n                const classes = elem.getAttribute(\"class\");\n                const media = elem.getAttribute(\"media\");\n                const title = elem.getAttribute(\"title\");\n                sources.push({\n                  url,\n                  text: elem.textContent,\n                  flavor: CssParser.StylesheetFlavor.AUTHOR,\n                  classes: title ? classes : null,\n                  media,\n                });\n              } else if (localName == \"link\") {\n                const href = elem.getAttribute(\"href\");\n                const rel = elem.getAttribute(\"rel\")?.split(/\\s+/);\n                const classes = elem.getAttribute(\"class\");\n                const media = elem.getAttribute(\"media\");\n                if (\n                  href &&\n                  rel?.includes(\"stylesheet\") &&\n                  (!rel.includes(\"alternate\") || classes)\n                ) {\n                  const src = Base.resolveURL(href, url);\n                  const title = elem.getAttribute(\"title\");\n                  sources.push({\n                    url: src,\n                    text: null,\n                    classes: title ? classes : null,\n                    media,\n                    flavor: CssParser.StylesheetFlavor.AUTHOR,\n                  });\n                }\n              } else if (\n                localName == \"meta\" &&\n                elem.getAttribute(\"name\") == \"viewport\"\n              ) {\n                sources.push({\n                  url,\n                  text: this.processViewportMeta(elem),\n                  flavor: CssParser.StylesheetFlavor.AUTHOR,\n                  classes: null,\n                  media: null,\n                });\n              }\n            }\n          }\n          for (let i = 0; i < this.styleSheets.length; i++) {\n            sources.push(this.styleSheets[i]);\n          }\n        }\n        let key = \"\";\n        for (let i = 0; i < sources.length; i++) {\n          key += sources[i].url;\n          key += \"^\";\n          if (sources[i].text) {\n            key += sources[i].text;\n          }\n          key += \"^\";\n        }\n        let style = this.styleByKey[key];\n        if (style) {\n          this.styleByDocURL[url] = style;\n          frame.finish(xmldoc);\n          return;\n        }\n        let fetcher = this.styleFetcherByKey[key];\n        if (!fetcher) {\n          fetcher = new TaskUtil.Fetcher(() => {\n            const innerFrame: Task.Frame<Style> =\n              Task.newFrame(\"fetchStylesheet\");\n            let index = 0;\n            const sph = new StyleParserHandler(this.validatorSet);\n            innerFrame\n              .loop(() => {\n                if (index < sources.length) {\n                  const source = sources[index++];\n                  sph.startStylesheet(source.flavor);\n                  if (source.text !== null) {\n                    return CssParser.parseStylesheetFromText(\n                      source.text,\n                      sph,\n                      source.url,\n                      source.classes,\n                      source.media,\n                    ).thenReturn(true);\n                  } else {\n                    return CssParser.parseStylesheetFromURL(\n                      source.url,\n                      sph,\n                      source.classes,\n                      source.media,\n                    );\n                  }\n                }\n                return Task.newResult(false);\n              })\n              .then(() => {\n                const cascade = sph.cascadeParserHandler.finish();\n                style = new Style(\n                  this,\n                  sph.rootScope,\n                  sph.pageScope,\n                  cascade,\n                  sph.rootBox,\n                  sph.fontFaces,\n                  sph.footnoteProps,\n                  sph.flowProps,\n                  sph.viewportProps,\n                  sph.pageProps,\n                  sph.counterStyles,\n                );\n                this.styleByKey[key] = style;\n                delete this.styleFetcherByKey[key];\n                innerFrame.finish(style);\n              });\n            return innerFrame.result();\n          }, `FetchStylesheet ${url}`);\n          this.styleFetcherByKey[key] = fetcher;\n          fetcher.start();\n        }\n        fetcher.get().then((style) => {\n          this.styleByDocURL[url] = style;\n          frame.finish(xmldoc);\n        });\n      },\n    );\n    return frame.result();\n  }\n\n  processViewportMeta(meta: Element): string {\n    return \"\";\n  }\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Toc - Table of Contents view.\n */\nimport * as Base from \"./base\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as Counters from \"./counters\";\nimport * as Css from \"./css\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as OPS from \"./ops\";\nimport * as Task from \"./task\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport * as XmlDoc from \"./xml-doc\";\n\n// closed: 25B8\n// open: 25BE\n// empty: 25B9\nexport const bulletClosed = \"\\u25b8\";\n\nexport const bulletOpen = \"\\u25be\";\n\nexport const bulletEmpty = \"\\u25b9\";\n\nexport type TOCItem = {\n  id: string;\n  title: string;\n  children: TOCItem[];\n};\n\nexport function findTocElements(doc: Document): Array<Element> {\n  // Find `<nav epub:type=\"toc\">` etc. for EPUB.\n  let tocElems = Array.from(\n    doc.querySelectorAll(\"nav[*|type],nav[epub\\\\:type]\"),\n  );\n  if (tocElems.length > 0) {\n    return tocElems;\n  }\n  // Find `role=\"doc-toc\"` for webpub.\n  tocElems = Array.from(doc.querySelectorAll(\"[role=doc-toc]\"));\n  if (tocElems.length > 0) {\n    return tocElems;\n  }\n  // If neither found, find TOC elements with the following selector.\n  const navs = \"nav,.toc,#toc,#table-of-contents,#contents,[role=directory]\";\n  for (const elem of doc.querySelectorAll(navs)) {\n    if (tocElems.find((e) => e.contains(elem))) {\n      continue; // Skip nested TOC elements.\n    }\n    let tocElem = elem;\n    if (/^h[1-6]$/.test(tocElem.localName)) {\n      // If the element is a heading, use its parent or next sibling as TOC element.\n      if (!tocElem.previousElementSibling) {\n        // If the heading is the first element, use its parent.\n        tocElem = tocElem.parentElement;\n      } else {\n        // Otherwise, use its next sibling.\n        tocElem = tocElem.nextElementSibling;\n      }\n    }\n    // TOC element must have at least one list item with an anchor element.\n    if (tocElem && tocElem.querySelector(\"li a[href]\")) {\n      tocElems.push(tocElem);\n    }\n  }\n  return tocElems;\n}\n\nexport function findTocAnchorElements(doc: Document): Array<Element> {\n  const tocElems = findTocElements(doc);\n  const anchors = [] as Array<Element>;\n  for (const tocElem of tocElems) {\n    for (const anchor of tocElem.querySelectorAll(\"li a[href]\")) {\n      anchors.push(anchor);\n    }\n  }\n  return anchors;\n}\n\nexport class TOCView implements Vgen.CustomRendererFactory {\n  pref: Exprs.Preferences;\n  page: Vtree.Page = null;\n  instance: OPS.StyleInstance = null;\n\n  constructor(\n    public readonly store: OPS.OPSDocStore,\n    public readonly url: string,\n    public readonly lang: string | null,\n    public readonly clientLayout: Vtree.ClientLayout,\n    public readonly fontMapper: Font.Mapper,\n    pref: Exprs.Preferences,\n    public readonly rendererFactory: Vgen.CustomRendererFactory,\n    public readonly fallbackMap: { [key: string]: string },\n    public readonly documentURLTransformer: Base.DocumentURLTransformer,\n    public readonly counterStore: Counters.CounterStore,\n    public readonly cmykStore: CmykStore.CmykStore,\n  ) {\n    this.pref = Exprs.clonePreferences(pref);\n    this.pref.spreadView = false; // No spred view for TOC box\n  }\n\n  setAutoHeight(elem: Element, depth: number): void {\n    if (depth-- == 0) {\n      return;\n    }\n    for (let c: Node = elem.firstChild; c; c = c.nextSibling) {\n      if (c.nodeType == 1) {\n        const e = c as Element;\n        if (Base.getCSSProperty(e, \"height\", \"auto\") != \"auto\") {\n          Base.setCSSProperty(e, \"height\", \"auto\");\n          this.setAutoHeight(e, depth);\n        }\n        if (Base.getCSSProperty(e, \"position\", \"static\") == \"absolute\") {\n          Base.setCSSProperty(e, \"position\", \"relative\");\n          this.setAutoHeight(e, depth);\n        }\n      }\n    }\n  }\n\n  /** @override */\n  makeCustomRenderer(xmldoc: XmlDoc.XMLDocHolder): Vgen.CustomRenderer {\n    const renderer = this.rendererFactory.makeCustomRenderer(xmldoc);\n    return (\n      srcElem: Element,\n      viewParent: Element,\n      computedStyle: { [key: string]: Css.Val },\n    ): Task.Result<Element> => {\n      const behavior = computedStyle[\"behavior\"];\n      if (behavior) {\n        switch (behavior.toString()) {\n          case \"toc-node-anchor\":\n            computedStyle[\"color\"] = Css.ident.inherit;\n            computedStyle[\"text-decoration\"] = Css.ident.none;\n            break;\n          case \"toc-node\":\n            computedStyle[\"display\"] = Css.ident.block;\n            computedStyle[\"margin\"] = Css.numericZero;\n            computedStyle[\"padding\"] = Css.numericZero;\n            computedStyle[\"padding-inline-start\"] = new Css.Numeric(1.25, \"em\");\n            break;\n          case \"toc-node-first-child\":\n            computedStyle[\"display\"] = Css.ident.inline_block;\n            computedStyle[\"margin\"] = new Css.Numeric(0.2, \"em\");\n            computedStyle[\"vertical-align\"] = Css.ident.top;\n            computedStyle[\"color\"] = Css.ident.inherit;\n            computedStyle[\"text-decoration\"] = Css.ident.none;\n            break;\n          case \"toc-container\":\n            computedStyle[\"padding\"] = Css.numericZero;\n            break;\n        }\n      }\n      if (\n        !behavior ||\n        (behavior.toString() != \"toc-node\" &&\n          behavior.toString() != \"toc-container\")\n      ) {\n        return renderer(srcElem, viewParent, computedStyle);\n      }\n      // Remove white-space textnode that becomes unwanted space between button and anchor element.\n      const firstChild = srcElem.firstChild;\n      if (\n        firstChild &&\n        firstChild.nodeType !== 1 &&\n        Vtree.canIgnore(firstChild)\n      ) {\n        // To avoid \"Inconsistent offset\" error, create a comment node with same white-space text.\n        srcElem.replaceChild(\n          srcElem.ownerDocument.createComment(firstChild.textContent),\n          firstChild,\n        );\n      }\n      const adaptParentClass = viewParent.getAttribute(\"data-adapt-class\");\n      if (adaptParentClass == \"toc-node\") {\n        const button = viewParent.firstChild as Element;\n        if (button.textContent != bulletClosed) {\n          button.textContent = bulletClosed;\n          Base.setCSSProperty(button, \"cursor\", \"pointer\");\n          button.addEventListener(\"click\", toggleNodeExpansion, false);\n\n          button.setAttribute(\"role\", \"button\");\n          button.setAttribute(\"aria-expanded\", \"false\");\n          viewParent.setAttribute(\"aria-expanded\", \"false\");\n\n          // Enable tab move to the button unless hidden.\n          if ((viewParent as HTMLElement).style.height !== \"0px\") {\n            (button as HTMLElement).tabIndex = 0;\n          }\n        }\n      }\n      const element = viewParent.ownerDocument.createElement(\"div\");\n      element.setAttribute(\"data-adapt-process-children\", \"true\");\n      if (behavior.toString() == \"toc-node\") {\n        const button = viewParent.ownerDocument.createElement(\"div\");\n        button.textContent = bulletEmpty;\n\n        // TODO: define pseudo-element for the button?\n        Base.setCSSProperty(button, \"margin\", \"0.2em 0 0 -1em\");\n        Base.setCSSProperty(button, \"margin-inline-start\", \"-1em\");\n        Base.setCSSProperty(button, \"margin-inline-end\", \"0\");\n        Base.setCSSProperty(button, \"display\", \"inline-block\");\n        Base.setCSSProperty(button, \"width\", \"1em\");\n        Base.setCSSProperty(button, \"text-align\", \"center\");\n        Base.setCSSProperty(button, \"vertical-align\", \"top\");\n        Base.setCSSProperty(button, \"cursor\", \"default\");\n        Base.setCSSProperty(button, \"font-family\", \"Menlo,sans-serif\");\n        element.appendChild(button);\n        Base.setCSSProperty(element, \"overflow\", \"hidden\");\n        element.setAttribute(\"data-adapt-class\", \"toc-node\");\n        element.setAttribute(\"role\", \"treeitem\");\n\n        if (\n          adaptParentClass == \"toc-node\" ||\n          adaptParentClass == \"toc-container\"\n        ) {\n          Base.setCSSProperty(element, \"height\", \"0px\");\n\n          // Prevent tab move to hidden anchor.\n          const anchorElem = srcElem.firstElementChild;\n          if (anchorElem && anchorElem.localName === \"a\") {\n            (anchorElem as HTMLElement).tabIndex = -1;\n          }\n        } else {\n          viewParent.setAttribute(\"role\", \"tree\");\n        }\n      } else {\n        if (adaptParentClass == \"toc-node\") {\n          element.setAttribute(\"data-adapt-class\", \"toc-container\");\n          element.setAttribute(\"role\", \"group\");\n          element.setAttribute(\"aria-hidden\", \"true\");\n        }\n      }\n      return Task.newResult(element as Element);\n    };\n  }\n\n  showTOC(\n    elem: HTMLElement,\n    viewport: Vgen.Viewport,\n    width: number,\n    height: number,\n    fontSize: number,\n  ): Task.Result<Vtree.Page> {\n    if (this.page) {\n      return Task.newResult(this.page as Vtree.Page);\n    }\n    const frame: Task.Frame<Vtree.Page> = Task.newFrame(\"showTOC\");\n    const page = new Vtree.Page(elem, elem);\n    this.page = page;\n\n    // The (X)HTML doc for the TOC box may be reused for the TOC page in the book,\n    // but they need different styles. So, add \"?viv-toc-box\" to distinguish with TOC page URL.\n    const tocBoxUrl = Base.stripFragment(this.url) + \"?viv-toc-box\";\n\n    this.store.load(tocBoxUrl).then((xmldoc) => {\n      for (const tocElem of findTocElements(xmldoc.document)) {\n        // Set `data-vivliostyle-role=\"doc-toc\"`\n        tocElem.setAttribute(\"data-vivliostyle-role\", \"doc-toc\");\n      }\n\n      const style = this.store.getStyleForDoc(xmldoc);\n      const viewportSize = style.sizeViewport(width, 100000, fontSize);\n      viewport = new Vgen.Viewport(\n        viewport.window,\n        viewportSize.fontSize,\n        0,\n        elem,\n        viewportSize.width,\n        viewportSize.height,\n      );\n      const customRenderer = this.makeCustomRenderer(xmldoc);\n      const instance = new OPS.StyleInstance(\n        style,\n        xmldoc,\n        this.lang,\n        viewport,\n        this.clientLayout,\n        this.fontMapper,\n        customRenderer,\n        this.fallbackMap,\n        0,\n        this.documentURLTransformer,\n        this.counterStore,\n        this.cmykStore,\n      );\n      this.instance = instance;\n      instance.pref = this.pref;\n      instance.init().then(() => {\n        instance.layoutNextPage(page, null).then(() => {\n          this.setAutoHeight(elem, 2);\n          frame.finish(page);\n        });\n      });\n    });\n    return frame.result();\n  }\n\n  hideTOC(): void {\n    if (this.page) {\n      this.page.container.style.visibility = \"hidden\";\n      this.page.container.setAttribute(\"aria-hidden\", \"true\");\n    }\n  }\n\n  isTOCVisible(): boolean {\n    return !!this.page && this.page.container.style.visibility === \"visible\";\n  }\n\n  getTOC(): TOCItem[] {\n    if (!this.page) {\n      return [];\n    }\n\n    function exportTree(tag): TOCItem[] {\n      if (!tag) {\n        return [];\n      }\n      const links = tag.querySelectorAll(\":scope > [role=treeitem] > a[href]\");\n      return Array.from(links).map(exportLink);\n    }\n\n    function exportLink(tag): TOCItem {\n      const url = new URL(tag.href);\n      const [, id] = url.hash.match(/^#?(.*)$/);\n\n      const title = tag.innerText;\n\n      const container = tag.parentElement.querySelector(\"[role=group]\");\n      const children = exportTree(container);\n\n      return { id, title, children };\n    }\n\n    const topLevelTree = this.page.container.querySelector(\"[role=tree]\");\n    return exportTree(topLevelTree);\n  }\n}\n\nexport function toggleNodeExpansion(evt: Event): void {\n  const elem = evt.target as Element;\n  const open = elem.textContent == bulletClosed;\n  elem.textContent = open ? bulletOpen : bulletClosed;\n  const tocNodeElem = elem.parentNode as Element;\n  elem.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n  tocNodeElem.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n  let c: Node = tocNodeElem.firstChild;\n  while (c) {\n    if (c.nodeType === 1) {\n      const ce = c as HTMLElement;\n      const adaptClass = ce.getAttribute(\"data-adapt-class\");\n      if (adaptClass === \"toc-container\") {\n        ce.setAttribute(\"aria-hidden\", !open ? \"true\" : \"false\");\n        if (ce.firstChild) {\n          c = ce.firstChild;\n          continue;\n        }\n      } else if (adaptClass === \"toc-node\") {\n        ce.style.height = open ? \"auto\" : \"0px\";\n\n        // Update enable/disable tab move to the button and anchor.\n        if (ce.children.length >= 2) {\n          (ce.children[1] as HTMLElement).tabIndex = open ? 0 : -1;\n        }\n        if (ce.children.length >= 3) {\n          (ce.children[0] as HTMLElement).tabIndex = open ? 0 : -1;\n          if (!open) {\n            const elem1 = ce.children[0];\n            if (elem1.textContent == bulletOpen) {\n              elem1.textContent = bulletClosed;\n              elem1.setAttribute(\"aria-expanded\", \"false\");\n              ce.setAttribute(\"aria-expanded\", \"false\");\n              c = ce.children[2];\n              continue;\n            }\n          }\n        }\n      }\n    }\n    while (!c.nextSibling && c.parentNode !== tocNodeElem) {\n      c = c.parentNode;\n    }\n    c = c.nextSibling;\n  }\n  evt.stopPropagation();\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview Epub - Deal with META-INF/ and .opf files in EPUB container.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as CFI from \"./cfi\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as Constants from \"./constants\";\nimport * as Counters from \"./counters\";\nimport * as Css from \"./css\";\nimport * as CssCascade from \"./css-cascade\";\nimport * as CssParser from \"./css-parser\";\nimport * as CssTokenizer from \"./css-tokenizer\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as Logging from \"./logging\";\nimport * as Net from \"./net\";\nimport * as OPS from \"./ops\";\nimport * as Task from \"./task\";\nimport * as Toc from \"./toc\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport * as XmlDoc from \"./xml-doc\";\n\nexport type Position = {\n  spineIndex: number;\n  pageIndex: number;\n  offsetInItem: number;\n};\n\nexport class EPUBDocStore extends OPS.OPSDocStore {\n  plainXMLStore: XmlDoc.XMLDocStore;\n  jsonStore: Net.JSONStore;\n  opfByURL: { [key: string]: OPFDoc } = {};\n  primaryOPFByEPubURL: { [key: string]: OPFDoc } = {};\n  deobfuscators: { [key: string]: (p1: Blob) => Task.Result<Blob> } = {};\n  documents: { [key: string]: Task.Result<XmlDoc.XMLDocHolder> } = {};\n\n  constructor() {\n    super(null);\n    this.fontDeobfuscator = this.makeDeobfuscatorFactory();\n    this.plainXMLStore = XmlDoc.newXMLDocStore();\n    this.jsonStore = Net.newJSONStore();\n  }\n\n  makeDeobfuscatorFactory():\n    | ((p1: string) => ((p1: Blob) => Task.Result<Blob>) | null)\n    | null {\n    return (url: string): ((p1: Blob) => Task.Result<Blob>) | null => {\n      return this.deobfuscators[url];\n    };\n  }\n\n  loadAsPlainXML(\n    url: string,\n    opt_required?: boolean,\n    opt_message?: string,\n  ): Task.Result<XmlDoc.XMLDocHolder> {\n    return this.plainXMLStore.load(\n      url,\n      opt_required,\n      opt_message,\n    ) as Task.Result<XmlDoc.XMLDocHolder>;\n  }\n\n  startLoadingAsPlainXML(url: string): void {\n    this.plainXMLStore.fetch(url);\n  }\n\n  loadAsJSON(\n    url: string,\n    opt_required?: boolean,\n    opt_message?: string,\n  ): Task.Result<Base.JSON> {\n    return this.jsonStore.load(url, opt_required, opt_message);\n  }\n\n  loadPubDoc(url: string): Task.Result<OPFDoc> {\n    const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadPubDoc\");\n\n    Net.fetchFromURL(url, null, \"HEAD\").then((response) => {\n      if (response.status >= 400) {\n        // This url can be the root of an unzipped EPUB.\n        this.loadEPUBDoc(url).then((opf) => {\n          if (opf) {\n            frame.finish(opf);\n            return;\n          }\n          Logging.logger.error(\n            `Failed to fetch a source document from ${url} (${response.status}${\n              response.statusText ? \" \" + response.statusText : \"\"\n            })`,\n          );\n          frame.finish(null);\n        });\n      } else {\n        if (\n          !response.status &&\n          !response.responseXML &&\n          !response.responseText &&\n          !response.responseBlob &&\n          !response.contentType\n        ) {\n          // Empty response\n          if (/\\/[^/.]+(?:[#?]|$)/.test(url)) {\n            // Adding trailing \"/\" may solve the problem.\n            url = url.replace(/([#?]|$)/, \"/$1\");\n          } else {\n            // Ignore empty response of HEAD request, it may become OK with GET request.\n          }\n        }\n        if (\n          response.contentType == \"application/oebps-package+xml\" ||\n          /\\.opf(?:[#?]|$)/.test(url)\n        ) {\n          // EPUB OPF\n          const [, pubURL, root] = url.match(/^((?:.*\\/)?)([^/]*)$/);\n          this.loadOPF(pubURL, root).thenFinish(frame);\n        } else if (\n          response.contentType == \"application/ld+json\" ||\n          response.contentType == \"application/webpub+json\" ||\n          response.contentType == \"application/audiobook+json\" ||\n          response.contentType == \"application/json\" ||\n          /\\.json(?:ld)?(?:[#?]|$)/.test(url)\n        ) {\n          // Web Publication Manifest\n          this.loadAsJSON(url, true).then((manifestObj) => {\n            if (!manifestObj) {\n              this.reportLoadError(url);\n              frame.finish(null);\n              return;\n            }\n            const opf = new OPFDoc(this, url);\n            opf.initWithWebPubManifest(manifestObj, undefined, url).then(() => {\n              frame.finish(opf);\n            });\n          });\n        } else {\n          // Web Publication primary entry (X)HTML\n          this.loadWebPub(url).then((opf) => {\n            if (opf) {\n              frame.finish(opf);\n              return;\n            }\n            // This url can be the root of an unzipped EPUB.\n            this.loadEPUBDoc(url).then((opf) => {\n              if (opf) {\n                frame.finish(opf);\n                return;\n              }\n              Logging.logger.error(`Failed to load ${url}.`);\n              frame.finish(null);\n            });\n          });\n        }\n      }\n    });\n    return frame.result();\n  }\n\n  loadEPUBDoc(url: string): Task.Result<OPFDoc> {\n    const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadEPUBDoc\");\n    if (!url.endsWith(\"/\")) {\n      url = url + \"/\";\n    }\n    this.startLoadingAsPlainXML(url + \"META-INF/encryption.xml\");\n    const containerURL = url + \"META-INF/container.xml\";\n    this.loadAsPlainXML(containerURL).then((containerXML) => {\n      if (containerXML) {\n        const roots = containerXML\n          .doc()\n          .child(\"container\")\n          .child(\"rootfiles\")\n          .child(\"rootfile\")\n          .attribute(\"full-path\");\n        for (const root of roots) {\n          if (root) {\n            this.loadOPF(url, root).thenFinish(frame);\n            return;\n          }\n        }\n      }\n      frame.finish(null);\n    });\n    return frame.result();\n  }\n\n  loadOPF(pubURL: string, root: string): Task.Result<OPFDoc> {\n    const url = pubURL + root;\n    let opf = this.opfByURL[url];\n    if (opf) {\n      return Task.newResult(opf);\n    }\n    const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadOPF\");\n    this.loadAsPlainXML(url, true, `Failed to fetch EPUB OPF ${url}`).then(\n      (opfXML) => {\n        if (!opfXML) {\n          this.reportLoadError(url);\n        } else {\n          opf = new OPFDoc(this, pubURL);\n          this.opfByURL[url] = opf;\n          this.primaryOPFByEPubURL[pubURL] = opf;\n          if (this.plainXMLStore.resources[pubURL + \"META-INF/container.xml\"]) {\n            this.loadAsPlainXML(pubURL + \"META-INF/encryption.xml\").then(\n              (encXML) => {\n                opf.initWithXMLDoc(opfXML, encXML).then(() => {\n                  frame.finish(opf);\n                });\n              },\n            );\n          } else {\n            // OPF file is directly specified, not via container.xml.\n            // In this case, encryption.xml is not available.\n            opf.initWithXMLDoc(opfXML, null).then(() => {\n              frame.finish(opf);\n            });\n          }\n        }\n      },\n    );\n    return frame.result();\n  }\n\n  loadWebPub(url: string): Task.Result<OPFDoc> {\n    const frame: Task.Frame<OPFDoc> = Task.newFrame(\"loadWebPub\");\n\n    // Load the primary entry page (X)HTML\n    this.load(url).then((xmldoc) => {\n      if (!xmldoc) {\n        this.reportLoadError(url);\n      } else if (\n        xmldoc.document.querySelector(\n          \"a[href='META-INF/'],a[href$='/META-INF/']\",\n        )\n      ) {\n        // This is likely the directory listing of unzipped EPUB top directory\n        frame.finish(null);\n      } else {\n        const doc = xmldoc.document;\n        const opf = new OPFDoc(this, url);\n\n        // Find manifest, W3C WebPublication or Readium Web Publication Manifest\n        const manifestLink = doc.querySelector(\n          \"link[rel='publication'],link[rel='manifest'][type='application/webpub+json']\",\n        );\n        if (manifestLink) {\n          const href = manifestLink.getAttribute(\"href\");\n          if (/^#/.test(href)) {\n            const manifestObj = Base.stringToJSON(\n              doc.getElementById(href.substr(1)).textContent,\n            );\n            opf.initWithWebPubManifest(manifestObj, doc).then(() => {\n              frame.finish(opf);\n            });\n          } else {\n            const manifestUrl = Base.resolveURL(\n              manifestLink.getAttribute(\"href\"),\n              url,\n            );\n            this.loadAsJSON(\n              manifestUrl,\n              true,\n              `Failed to fetch Publication Manifest ${manifestUrl}`,\n            ).then((manifestObj) => {\n              opf\n                .initWithWebPubManifest(manifestObj, doc, manifestUrl)\n                .then(() => {\n                  frame.finish(opf);\n                });\n            });\n          }\n        } else {\n          // No manifest\n          opf.initWithWebPubManifest({}, doc).then(() => {\n            if (opf.toc && opf.toc.src === xmldoc.url) {\n              // toc is the primary entry (X)HTML\n              if (Toc.findTocElements(doc).length === 0) {\n                // TOC is not found in the primary entry (X)HTML\n                opf.toc = null;\n              }\n            }\n            frame.finish(opf);\n          });\n        }\n      }\n    });\n    return frame.result();\n  }\n\n  addDocument(url: string, doc: Document) {\n    const frame = Task.newFrame<XmlDoc.XMLDocHolder>(\"EPUBDocStore.load\");\n    const docURL = Base.stripFragment(url);\n    const r = (this.documents[docURL] = this.parseOPSResource({\n      status: 200,\n      statusText: \"\",\n      url: docURL,\n      contentType: (doc as any).contentType,\n      responseText: null,\n      responseXML: doc,\n      responseBlob: null,\n    }));\n    r.thenFinish(frame);\n    return frame.result();\n  }\n\n  reportLoadError(docURL: string): void {\n    const removePath = (url: string) => {\n      return url.replace(/([^:/?#]|^)[/?#].*/, \"$1\");\n    };\n    const likelyCorsProblem = () => {\n      const domain = removePath(docURL);\n      if (domain === removePath(Base.baseURL)) {\n        // same domain, no CORS problem\n        return false;\n      }\n      const urls = Object.keys(this.resources);\n      if (\n        urls.find((url) => this.resources[url] && removePath(url) === domain)\n      ) {\n        // if there is an already loaded resource with the same domain, no CORS problem\n        return false;\n      }\n      if (!/^https?:?\\/\\/[^/]/.test(docURL)) {\n        // not a valid URL\n        return false;\n      }\n      if (/\\.(xhtml|xht|xml|opf)$/i.test(docURL)) {\n        // maybe, XML error\n        return false;\n      }\n      // likely, CORS problem\n      return true;\n    };\n\n    if (docURL.startsWith(\"data:\")) {\n      Logging.logger.error(`Failed to load ${docURL}. Invalid data.`);\n    } else if (\n      docURL.startsWith(\"http:\") &&\n      Base.baseURL.startsWith(\"https:\")\n    ) {\n      Logging.logger.error(\n        `Failed to load ${docURL}. Mixed Content (\"http:\" content on \"https:\" context) is not allowed.`,\n      );\n    } else if (likelyCorsProblem()) {\n      Logging.logger.error(\n        `Failed to load ${docURL}. This may be caused by the server not allowing cross-origin resource sharing (CORS).`,\n      );\n    } else {\n      Logging.logger.error(\n        `Failed to load ${docURL}. The target resource is invalid.`,\n      );\n    }\n  }\n\n  override load(url: string): Task.Result<XmlDoc.XMLDocHolder> {\n    const docURL = Base.stripFragment(url);\n    let r = this.documents[docURL];\n    if (r) {\n      return r.isPending() ? r : Task.newResult(r.get());\n    } else {\n      const frame = Task.newFrame<XmlDoc.XMLDocHolder>(\"EPUBDocStore.load\");\n      r = super.load(\n        docURL,\n        true,\n        `Failed to fetch a source document from ${docURL}`,\n      );\n      r.then((xmldoc: XmlDoc.XMLDocHolder) => {\n        if (!xmldoc) {\n          this.reportLoadError(docURL);\n        } else {\n          frame.finish(xmldoc);\n        }\n      });\n      return frame.result();\n    }\n  }\n\n  override processViewportMeta(meta: Element): string {\n    let content = meta.getAttribute(\"content\");\n    if (!content) {\n      return \"\";\n    }\n    const vals = {};\n    let r: RegExpMatchArray;\n    while (\n      (r = content.match(\n        /^,?\\s*([-A-Za-z_.][-A-Za-z_0-9.]*)\\s*=\\s*([-+A-Za-z_0-9.]*)\\s*/,\n      )) != null\n    ) {\n      content = content.substr(r[0].length);\n      vals[r[1]] = r[2];\n    }\n    const width = vals[\"width\"] - 0;\n    const height = vals[\"height\"] - 0;\n    if (width && height) {\n      const prePaginated = !!Object.values(this.primaryOPFByEPubURL).find(\n        (opf) => opf.prePaginated,\n      );\n      return (\n        `@-epubx-viewport{width:${width}px;height:${height}px;}` +\n        (prePaginated\n          ? `@page{size:${width}px ${height}px;margin:0;}`\n          : `@page{margin:0;}`)\n      );\n    }\n    return \"\";\n  }\n}\n\nexport type OPFItemParam = {\n  url: string;\n  index: number;\n  startPage: number | null;\n  skipPagesBefore: number | null;\n};\n\nexport class OPFItem {\n  id: string | null = null;\n  src: string = \"\";\n  mediaType: string | null = null;\n  title: string | null = null;\n  itemRefElement: Element | null = null;\n  spineIndex: number = -1;\n  compressedSize: number = 0;\n  compressed: boolean | null = null;\n  epage: number = 0;\n  epageCount: number = 0;\n  startPage: number | null = null;\n  skipPagesBefore: number | null = null;\n  itemProperties: { [key: string]: boolean };\n\n  constructor() {\n    this.itemProperties = Base.emptyObj;\n  }\n\n  initWithElement(itemElem: Element, opfURL: string): void {\n    this.id = itemElem.getAttribute(\"id\");\n    this.src = Base.resolveURL(itemElem.getAttribute(\"href\"), opfURL);\n    this.mediaType = itemElem.getAttribute(\"media-type\");\n    const propStr = itemElem.getAttribute(\"properties\");\n    if (propStr) {\n      this.itemProperties = Base.arrayToSet(propStr.split(/\\s+/));\n    }\n  }\n\n  initWithParam(param: OPFItemParam) {\n    this.spineIndex = param.index;\n    this.id = `item${param.index + 1}`;\n    this.src = param.url;\n    this.startPage = param.startPage;\n    this.skipPagesBefore = param.skipPagesBefore;\n  }\n}\n\nexport function getOPFItemId(item: OPFItem): string | null {\n  return item.id;\n}\n\nexport function makeDeobfuscator(uid: string): (p1: Blob) => Task.Result<Blob> {\n  return (blob) => {\n    const frame = Task.newFrame(\"deobfuscator\") as Task.Frame<Blob>;\n    makeDigest(\"SHA-1\", uid).then((hash) => {\n      const head = blob.slice(0, 1040);\n      const tail = blob.slice(1040, blob.size);\n      Net.readBlob(head).then((buf) => {\n        const dataView = new DataView(buf);\n        for (let k = 0; k < dataView.byteLength; k++) {\n          let b = dataView.getUint8(k);\n          b ^= hash[k % 20];\n          dataView.setUint8(k, b);\n        }\n        frame.finish(Net.makeBlob([dataView, tail]));\n      });\n    });\n    return frame.result();\n  };\n}\n\nfunction makeDigest(algorithm: string, str: string): Task.Result<Uint8Array> {\n  const frame = Task.newFrame(\"makeDigest\") as Task.Frame<Uint8Array>;\n  const continuation = frame.suspend();\n  window.crypto.subtle\n    .digest(algorithm, new TextEncoder().encode(str))\n    .then((buf) => {\n      continuation.schedule(new Uint8Array(buf));\n    });\n  return frame.result();\n}\n\ntype RawMeta = {\n  [key: string]: RawMetaItem[];\n};\n\ntype RawMetaItem = {\n  name: string;\n  value: string;\n  id: string | null;\n  refines: string | null;\n  scheme: string | null;\n  lang: string | null;\n  order: number;\n  role: string | null;\n};\n\nexport interface Meta {\n  [key: string]: MetaItem[];\n}\n\nexport interface MetaItem {\n  v: string;\n  o?: number;\n  s?: string;\n  r?: Meta;\n}\n\nexport const predefinedPrefixes = {\n  dcterms: \"http://purl.org/dc/terms/\",\n  marc: \"http://id.loc.gov/vocabulary/\",\n  media: \"http://www.idpf.org/epub/vocab/overlays/#\",\n  rendition: \"http://www.idpf.org/vocab/rendition/#\",\n  onix: \"http://www.editeur.org/ONIX/book/codelists/current.html#\",\n  xsd: \"http://www.w3.org/2001/XMLSchema#\",\n  opf: \"http://www.idpf.org/2007/opf\",\n};\n\nexport const defaultIRI = \"http://idpf.org/epub/vocab/package/meta/#\";\n\nexport const metaTerms = {\n  language: `${predefinedPrefixes[\"dcterms\"]}language`,\n  title: `${predefinedPrefixes[\"dcterms\"]}title`,\n  creator: `${predefinedPrefixes[\"dcterms\"]}creator`,\n  layout: `${predefinedPrefixes[\"rendition\"]}layout`,\n  titleType: `${defaultIRI}title-type`,\n  displaySeq: `${defaultIRI}display-seq`,\n  alternateScript: `${defaultIRI}alternate-script`,\n  role: `${defaultIRI}role`,\n};\n\nexport function getMetadataComparator(\n  term: string,\n  lang: string,\n): (p1: MetaItem, p2: MetaItem) => number {\n  const empty = {};\n  return (item1, item2) => {\n    let m1: boolean;\n    let m2: boolean;\n    const r1 = item1[\"r\"] || empty;\n    const r2 = item2[\"r\"] || empty;\n    if (term == metaTerms.title) {\n      m1 = r1[metaTerms.titleType]?.[0].v == \"main\";\n      m2 = r2[metaTerms.titleType]?.[0].v == \"main\";\n      if (m1 != m2) {\n        return m1 ? -1 : 1;\n      }\n    }\n    let i1 = parseInt(r1[metaTerms.displaySeq]?.[0].v, 10);\n    if (isNaN(i1)) {\n      i1 = Number.MAX_VALUE;\n    }\n    let i2 = parseInt(r2[metaTerms.displaySeq]?.[0].v, 10);\n    if (isNaN(i2)) {\n      i2 = Number.MAX_VALUE;\n    }\n    if (i1 != i2) {\n      return i1 - i2;\n    }\n    if (term != metaTerms.language && lang) {\n      m1 =\n        (r1[metaTerms.language] || r1[metaTerms.alternateScript])?.[0].v ==\n        lang;\n      m2 =\n        (r2[metaTerms.language] || r2[metaTerms.alternateScript])?.[0].v ==\n        lang;\n      if (m1 != m2) {\n        return m1 ? -1 : 1;\n      }\n    }\n    return item1[\"o\"] - item2[\"o\"];\n  };\n}\n\nexport function readMetadata(\n  mroot: XmlDoc.NodeList,\n  prefixes: string | null,\n): Meta {\n  // Parse prefix map (if any)\n  let prefixMap;\n  if (!prefixes) {\n    prefixMap = predefinedPrefixes;\n  } else {\n    prefixMap = {};\n    for (const pn in predefinedPrefixes) {\n      prefixMap[pn] = predefinedPrefixes[pn];\n    }\n    let r: RegExpMatchArray;\n\n    // This code permits any non-ASCII characters in the name to avoid bloating\n    // the pattern.\n    while (\n      (r = prefixes.match(\n        /^\\s*([A-Z_a-z\\u007F-\\uFFFF][-.A-Z_a-z0-9\\u007F-\\uFFFF]*):\\s*(\\S+)/,\n      )) != null\n    ) {\n      prefixes = prefixes.substr(r[0].length);\n      prefixMap[r[1]] = r[2];\n    }\n  }\n  const resolveProperty = (val: string | null): string | null => {\n    if (val) {\n      const r = val.match(/^\\s*(([^:]*):)?(\\S+)\\s*$/);\n      if (r) {\n        const iri = r[2] ? prefixMap[r[2]] : defaultIRI;\n        if (iri) {\n          return iri + r[3];\n        }\n      }\n    }\n    return null;\n  };\n  let order = 1;\n\n  // List of metadata items.\n  const rawItems = mroot.childElements().forEachNonNull((node: Element) => {\n    if (node.localName == \"meta\") {\n      const p = resolveProperty(node.getAttribute(\"property\"));\n      if (p) {\n        return {\n          name: p,\n          value: node.textContent,\n          id: node.getAttribute(\"id\"),\n          order: order++,\n          refines: node.getAttribute(\"refines\"),\n          lang: null,\n          scheme: resolveProperty(node.getAttribute(\"scheme\")),\n          role: null,\n        };\n      }\n    } else if (node.namespaceURI == Base.NS.DC) {\n      return {\n        name: predefinedPrefixes[\"dcterms\"] + node.localName,\n        order: order++,\n        lang: node.getAttribute(\"xml:lang\"),\n        value: node.textContent,\n        id: node.getAttribute(\"id\"),\n        refines: null,\n        scheme: null,\n        role: node.getAttribute(\"role\") || node.getAttribute(\"opf:role\"),\n      };\n    }\n    return null;\n  });\n\n  // Items grouped by their target id.\n  const rawItemsByTarget = Base.multiIndexArray(\n    rawItems,\n    (rawItem) => rawItem.refines,\n  );\n  const makeMetadata = (map: RawMeta): Meta =>\n    Base.mapObj(map, (rawItemArr, _itemName) =>\n      rawItemArr.map((rawItem) => {\n        const entry = { v: rawItem.value, o: rawItem.order };\n        if (rawItem.scheme) {\n          entry[\"s\"] = rawItem.scheme;\n        }\n        let refs = rawItemsByTarget[`#${rawItem.id}`] || [];\n        if (refs.length || rawItem.lang || rawItem.role) {\n          if (rawItem.lang) {\n            // Special handling for xml:lang\n            refs.push({\n              name: metaTerms.language,\n              value: rawItem.lang,\n              lang: null,\n              id: null,\n              refines: rawItem.id,\n              scheme: null,\n              order: rawItem.order,\n              role: null,\n            });\n          }\n          if (rawItem.role) {\n            // Special handling for opf:role\n            refs.push({\n              name: metaTerms.role,\n              value: rawItem.role,\n              lang: null,\n              id: null,\n              refines: rawItem.id,\n              scheme: null,\n              order: rawItem.order,\n              role: null,\n            });\n          }\n          const entryMap = Base.multiIndexArray(\n            refs,\n            (rawItem) => rawItem.name,\n          );\n          entry[\"r\"] = makeMetadata(entryMap);\n        }\n        return entry;\n      }),\n    );\n  const metadata = makeMetadata(\n    Base.multiIndexArray(rawItems, (rawItem) =>\n      rawItem.refines ? null : rawItem.name,\n    ),\n  );\n  let lang: string | null = null;\n  if (metadata[metaTerms.language]) {\n    lang = metadata[metaTerms.language][0][\"v\"];\n  }\n  const sortMetadata = (metadata: Meta) => {\n    for (const term in metadata) {\n      const arr = metadata[term];\n      arr.sort(getMetadataComparator(term, lang));\n      for (let i = 0; i < arr.length; i++) {\n        const r = arr[i][\"r\"];\n        if (r) {\n          sortMetadata(r);\n        }\n      }\n    }\n  };\n  sortMetadata(metadata);\n  return metadata;\n}\n\nexport function getMathJaxHub(): object {\n  const math = window[\"MathJax\"];\n  if (math) {\n    return math[\"Hub\"];\n  }\n  return null;\n}\n\nexport const supportedMediaTypes = {\n  \"application/xhtml+xml\": true,\n  \"image/jpeg\": true,\n  \"image/png\": true,\n  \"image/svg+xml\": true,\n  \"image/gif\": true,\n  \"audio/mp3\": true,\n};\n\nexport const transformedIdPrefix = \"viv-id-\";\n\nexport class OPFDoc {\n  opfXML: XmlDoc.XMLDocHolder = null;\n  encXML: XmlDoc.XMLDocHolder = null;\n  items: OPFItem[] = null;\n  spine: OPFItem[] = null;\n  itemMap: { [key: string]: OPFItem } = null;\n  itemMapByPath: { [key: string]: OPFItem } = null;\n  uid: string | null = null;\n  bindings: { [key: string]: string } = {};\n  lang: string | null = null;\n  epageCount: number = 0;\n  prePaginated: boolean = false;\n  epageIsRenderedPage: boolean = true;\n  epageCountCallback: (p1: number) => void | null = null;\n  metadata: Meta = {};\n  toc: OPFItem = null;\n  cover: OPFItem = null;\n  fallbackMap: { [key: string]: string } = {};\n  pageProgression: Constants.PageProgression | null = null;\n  documentURLTransformer: Base.DocumentURLTransformer;\n\n  constructor(\n    public readonly store: EPUBDocStore,\n    public readonly pubURL: string,\n  ) {\n    this.documentURLTransformer = this.createDocumentURLTransformer();\n  }\n\n  // FIXME: TS4055\n  createDocumentURLTransformer(): Base.DocumentURLTransformer {\n    const self = this;\n    class OPFDocumentURLTransformer implements Base.DocumentURLTransformer {\n      /** @override */\n      transformFragment(fragment: string, baseURL: string): string {\n        const url = baseURL + (fragment ? `#${fragment}` : \"\");\n        return transformedIdPrefix + Base.escapeNameStrToHex(url, \":\");\n      }\n\n      /** @override */\n      transformURL(url: string, baseURL: string): string {\n        const r = url.match(/^([^#]*)#?(.*)$/);\n        if (r) {\n          const path = r[1] || baseURL.replace(/\\?viv-toc-box$/, \"\");\n          const fragment = decodeURIComponent(r[2]);\n          if (path) {\n            if (self.spine.some((item) => item.src === path)) {\n              return `#${this.transformFragment(fragment, path)}`;\n            }\n          }\n        }\n        return url;\n      }\n\n      /** @override */\n      restoreURL(encoded: string): string[] {\n        if (encoded.charAt(0) === \"#\") {\n          encoded = encoded.substring(1);\n        }\n        if (encoded.indexOf(transformedIdPrefix) === 0) {\n          encoded = encoded.substring(transformedIdPrefix.length);\n        }\n        const decoded = Base.unescapeStrFromHex(encoded, \":\");\n        const r = decoded.match(/^([^#]*)#?(.*)$/);\n        return r ? [r[1], r[2]] : [];\n      }\n    }\n    return new OPFDocumentURLTransformer();\n  }\n\n  /**\n   * Metadata is organized in the following way: fully-expanded property names\n   * (with IRI prefixes prepended) point to an array of values. Array contains\n   * at least one element. First element is primary and should be used by\n   * default. Element values are objects have the following keys:\n   * - \"v\" - item value as string,\n   * - \"s\" - scheme,\n   * - \"o\" - index in the order of appearing in the source,\n   * - \"r\" - refinement submetadata (organized just like the top-level\n   * metadata).\n   */\n  getMetadata(): Meta {\n    return this.metadata;\n  }\n\n  getPathFromURL(url: string): string | null {\n    if (url.startsWith(\"data:\")) {\n      return url === this.pubURL ? \"\" : url;\n    }\n    if (this.pubURL) {\n      let epubBaseURL = Base.resolveURL(\"\", this.pubURL);\n      if (url === epubBaseURL || url + \"/\" === epubBaseURL) {\n        return \"\";\n      }\n      if (epubBaseURL.charAt(epubBaseURL.length - 1) != \"/\") {\n        epubBaseURL += \"/\";\n      }\n      return url.substr(0, epubBaseURL.length) == epubBaseURL\n        ? decodeURIComponent(url.substr(epubBaseURL.length))\n        : null;\n    } else {\n      return url;\n    }\n  }\n\n  initWithXMLDoc(\n    opfXML: XmlDoc.XMLDocHolder,\n    encXML: XmlDoc.XMLDocHolder,\n  ): Task.Result<any> {\n    this.opfXML = opfXML;\n    this.encXML = encXML;\n    const pkg = opfXML.doc().child(\"package\");\n    const uidref = pkg.attribute(\"unique-identifier\")[0];\n    if (uidref) {\n      const uidElem = opfXML.getElement(`${opfXML.url}#${uidref}`);\n      if (uidElem) {\n        this.uid = uidElem.textContent.replace(/[ \\n\\r\\t]/g, \"\");\n      }\n    }\n    const srcToFallbackId = {};\n    this.items = pkg\n      .child(\"manifest\")\n      .child(\"item\")\n      .asArray()\n      .map((node) => {\n        const item = new OPFItem();\n        const elem = node as Element;\n        item.initWithElement(elem, opfXML.url);\n        const fallback = elem.getAttribute(\"fallback\");\n        if (fallback && !supportedMediaTypes[item.mediaType]) {\n          srcToFallbackId[item.src] = fallback;\n        }\n        if (!this.toc && item.itemProperties[\"nav\"]) {\n          this.toc = item;\n        }\n        if (!this.cover && item.itemProperties[\"cover-image\"]) {\n          this.cover = item;\n        }\n        return item;\n      });\n    this.itemMap = Base.indexArray(\n      this.items,\n      getOPFItemId as (p1: OPFItem) => string | null,\n    );\n    this.itemMapByPath = Base.indexArray(this.items, (item) =>\n      this.getPathFromURL(item.src),\n    );\n    for (const src in srcToFallbackId) {\n      let fallbackSrc = src;\n      while (true) {\n        const item = this.itemMap[srcToFallbackId[fallbackSrc]];\n        if (!item) {\n          break;\n        }\n        if (supportedMediaTypes[item.mediaType]) {\n          this.fallbackMap[src] = item.src;\n          break;\n        }\n        fallbackSrc = item.src;\n      }\n    }\n    this.spine = pkg\n      .child(\"spine\")\n      .child(\"itemref\")\n      .asArray()\n      .map((node, index) => {\n        const elem = node as Element;\n        const id = elem.getAttribute(\"idref\");\n        const item = this.itemMap[id as string];\n        if (item) {\n          item.itemRefElement = elem;\n          item.spineIndex = index;\n        }\n        return item;\n      });\n    const pageProgressionAttr = pkg\n      .child(\"spine\")\n      .attribute(\"page-progression-direction\")[0];\n    if (pageProgressionAttr) {\n      this.pageProgression = Constants.pageProgressionOf(pageProgressionAttr);\n    }\n    const idpfObfURLs = !encXML\n      ? []\n      : encXML\n          .doc()\n          .child(\"encryption\")\n          .child(\"EncryptedData\")\n          .predicate(\n            XmlDoc.predicate.withChild(\n              \"EncryptionMethod\",\n              XmlDoc.predicate.withAttribute(\n                \"Algorithm\",\n                \"http://www.idpf.org/2008/embedding\",\n              ),\n            ),\n          )\n          .child(\"CipherData\")\n          .child(\"CipherReference\")\n          .attribute(\"URI\");\n    const mediaTypeElems = pkg\n      .child(\"bindings\")\n      .child(\"mediaType\")\n      .asArray() as Element[];\n    for (let i = 0; i < mediaTypeElems.length; i++) {\n      const handlerId = mediaTypeElems[i].getAttribute(\"handler\");\n      const mediaType = mediaTypeElems[i].getAttribute(\"media-type\");\n      if (mediaType && handlerId && this.itemMap[handlerId]) {\n        this.bindings[mediaType] = this.itemMap[handlerId].src;\n      }\n    }\n    this.metadata = readMetadata(\n      pkg.child(\"metadata\"),\n      pkg.attribute(\"prefix\")[0],\n    );\n    if (this.metadata[metaTerms.language]) {\n      this.lang = this.metadata[metaTerms.language][0][\"v\"];\n    }\n    if (this.metadata[metaTerms.layout]) {\n      this.prePaginated =\n        this.metadata[metaTerms.layout][0][\"v\"] === \"pre-paginated\";\n    }\n\n    if (idpfObfURLs.length > 0 && this.uid) {\n      // Have to deobfuscate in JavaScript\n      const deobfuscator = makeDeobfuscator(this.uid);\n      for (let i = 0; i < idpfObfURLs.length; i++) {\n        this.store.deobfuscators[this.pubURL + idpfObfURLs[i]] = deobfuscator;\n      }\n    }\n    if (this.prePaginated) {\n      this.assignAutoPages();\n    }\n    return Task.newResult(true);\n  }\n\n  assignAutoPages(): void {\n    let epage = 0;\n    for (const item of this.spine) {\n      const epageCount = this.prePaginated\n        ? 1\n        : Math.ceil(item.compressedSize / 1024);\n      item.epage = epage;\n      item.epageCount = epageCount;\n      epage += epageCount;\n    }\n    this.epageCount = epage;\n\n    if (this.epageCountCallback) {\n      this.epageCountCallback(this.epageCount);\n    }\n  }\n\n  setEPageCountMode(epageIsRenderedPage: boolean) {\n    this.epageIsRenderedPage = epageIsRenderedPage || this.prePaginated;\n  }\n\n  countEPages(\n    epageCountCallback: ((p1: number) => void) | null,\n  ): Task.Result<boolean> {\n    this.epageCountCallback = epageCountCallback;\n\n    if (this.epageIsRenderedPage) {\n      if (this.prePaginated && this.epageCount == 0) {\n        this.assignAutoPages();\n      }\n      return Task.newResult(true);\n    }\n\n    let epage = 0;\n    let i = 0;\n    const frame: Task.Frame<boolean> = Task.newFrame(\"countEPages\");\n    frame\n      .loopWithFrame((loopFrame) => {\n        if (i === this.spine.length) {\n          loopFrame.breakLoop();\n          return;\n        }\n        const item = this.spine[i++];\n        item.epage = epage;\n        this.store.load(item.src).then((xmldoc) => {\n          // According to the old comment,\n          // \"Estimate that offset=2700 roughly corresponds to 1024 bytes of compressed size.\"\n          // However, it should depend on the language.\n          // Further adjustment needed.\n\n          //let offsetPerEPage = 2700;\n          let offsetPerEPage = 1800;\n          const lang = xmldoc.lang || this.lang;\n          if (lang && lang.match(/^(ja|ko|zh)/)) {\n            offsetPerEPage /= 3;\n          }\n          item.epageCount = Math.ceil(xmldoc.getTotalOffset() / offsetPerEPage);\n          epage += item.epageCount;\n          this.epageCount = epage;\n          if (this.epageCountCallback) {\n            this.epageCountCallback(this.epageCount);\n          }\n          loopFrame.continueLoop();\n        });\n      })\n      .thenFinish(frame);\n    return frame.result();\n  }\n\n  /**\n   * Creates a fake OPF \"document\" that contains OPS chapters.\n   */\n  initWithChapters(params: OPFItemParam[], doc?: Document | null) {\n    this.itemMap = {};\n    this.itemMapByPath = {};\n    this.items = [];\n    this.spine = this.items;\n\n    // create a minimum fake OPF XML for navigation with EPUB CFI\n    const opfXML = (this.opfXML = new XmlDoc.XMLDocHolder(\n      null,\n      \"\",\n      new DOMParser().parseFromString(\"<spine></spine>\", \"text/xml\"),\n    ));\n    params.forEach((param) => {\n      const item = new OPFItem();\n      item.initWithParam(param);\n      Asserts.assert(item.id);\n      const itemref = opfXML.document.createElement(\"itemref\");\n      itemref.setAttribute(\"idref\", item.id);\n      opfXML.root.appendChild(itemref);\n      item.itemRefElement = itemref;\n      this.itemMap[item.id] = item;\n      let path = this.getPathFromURL(param.url);\n      if (path == null) {\n        path = param.url;\n      }\n      this.itemMapByPath[path] = item;\n      this.items.push(item);\n    });\n    if (doc) {\n      return this.store.addDocument(params[0].url, doc);\n    } else {\n      return Task.newResult(null);\n    }\n  }\n\n  initWithWebPubManifest(\n    manifestObj: Base.JSON,\n    doc?: Document,\n    manifestUrl?: string,\n  ): Task.Result<boolean> {\n    if (manifestObj[\"readingProgression\"]) {\n      this.pageProgression = manifestObj[\"readingProgression\"];\n    }\n    if (this.metadata === undefined) {\n      this.metadata = {};\n    }\n    const title =\n      manifestObj[\"name\"] || manifestObj[\"metadata\"]?.[\"title\"] || doc?.title;\n    if (title) {\n      this.metadata[metaTerms.title] = (\n        Array.isArray(title) ? title : [title]\n      ).map((item) => ({ v: item.value ?? item }));\n    }\n    const author =\n      manifestObj[\"author\"] ||\n      manifestObj[\"creator\"] ||\n      manifestObj[\"metadata\"]?.[\"author\"] ||\n      Array.from(\n        doc?.querySelectorAll(\"meta[name='author'], meta[name='DC.Creator']\") ??\n          [],\n      ).map((meta: HTMLMetaElement) => meta.content);\n    if (author && author.length !== 0) {\n      this.metadata[metaTerms.creator] = (\n        Array.isArray(author) ? author : [author]\n      ).map((item) => ({ v: item.name ?? item }));\n    }\n    const language =\n      manifestObj[\"inLanguage\"] ||\n      manifestObj[\"metadata\"]?.[\"language\"] ||\n      doc?.documentElement.lang ||\n      doc?.documentElement.getAttribute(\"xml:lang\");\n    if (language) {\n      this.metadata[metaTerms.language] = (\n        Array.isArray(language) ? language : [language]\n      ).map((item) => ({ v: item }));\n    }\n    // TODO: other metadata...\n\n    const primaryEntryPath = this.getPathFromURL(this.pubURL);\n    if (!manifestObj[\"readingOrder\"] && doc && primaryEntryPath !== null) {\n      manifestObj[\"readingOrder\"] = [encodeURI(primaryEntryPath)];\n\n      // Find TOC in the primary entry (X)HTML\n      for (const anchorElem of Toc.findTocAnchorElements(doc)) {\n        const href = anchorElem.getAttribute(\"href\");\n        if (/^(https?:)?\\/\\//.test(href)) {\n          // Avoid link to external resources\n          continue;\n        }\n        if (/\\.(jpe?g|png|gif|pdf|svg|mml)([#?]|$)/.test(href)) {\n          // Avoid link to non-HTML resources\n          continue;\n        }\n        const hrefNoFragment = Base.stripFragment(\n          Base.resolveURL(href, this.pubURL),\n        );\n        const path = this.getPathFromURL(hrefNoFragment);\n        const url = path !== null ? encodeURI(path) : hrefNoFragment;\n        if (manifestObj[\"readingOrder\"].indexOf(url) == -1) {\n          manifestObj[\"readingOrder\"].push(url);\n        }\n      }\n    }\n\n    const params = [];\n    let itemCount = 0;\n    let tocFound = -1;\n    [manifestObj[\"readingOrder\"], manifestObj[\"resources\"]].forEach(\n      (readingOrderOrResources) => {\n        if (readingOrderOrResources instanceof Array) {\n          readingOrderOrResources.forEach((itemObj) => {\n            const isInReadingOrder =\n              readingOrderOrResources === manifestObj[\"readingOrder\"];\n            const url =\n              typeof itemObj === \"string\"\n                ? itemObj\n                : itemObj.url || itemObj.href;\n            const encodingFormat =\n              typeof itemObj === \"string\"\n                ? \"\"\n                : itemObj.encodingFormat ||\n                  (itemObj.href && itemObj.type) ||\n                  \"\";\n            if (\n              isInReadingOrder ||\n              encodingFormat === \"text/html\" ||\n              encodingFormat === \"application/xhtml+xml\" ||\n              (!encodingFormat &&\n                itemObj.rel !== \"stylesheet\" &&\n                /(^|\\/)([^/]+\\.(x?html|htm|xht)|[^/.]*)([#?]|$)/.test(url))\n            ) {\n              const baseUrl = manifestUrl\n                ? manifestUrl.replace(/\\/[^/]+$/, \"/\")\n                : this.pubURL;\n              const param = {\n                url: Base.resolveURL(Base.convertSpecialURL(url), baseUrl),\n                index: itemCount++,\n                startPage: null,\n                skipPagesBefore: null,\n              };\n              if (itemObj.rel === \"contents\" && tocFound === -1) {\n                tocFound = param.index;\n              }\n              params.push(param);\n            }\n          });\n        }\n      },\n    );\n    const frame: Task.Frame<boolean> = Task.newFrame(\"initWithWebPubManifest\");\n    this.initWithChapters(params).then(() => {\n      if (tocFound !== -1) {\n        this.toc = this.items[tocFound];\n      }\n\n      if (!this.toc) {\n        this.toc = manifestUrl\n          ? this.items?.[0]\n          : this.itemMapByPath[primaryEntryPath];\n      }\n\n      // remove items not in readingOrder (Issue #1257)\n      const readingOrderCount = manifestObj[\"readingOrder\"]?.length;\n      if (readingOrderCount && readingOrderCount < this.items.length) {\n        this.items.splice(readingOrderCount);\n      }\n\n      frame.finish(true);\n    });\n    return frame.result();\n  }\n\n  /**\n   * @return cfi\n   */\n  getCFI(spineIndex: number, offsetInItem: number): Task.Result<string | null> {\n    const item = this.spine[spineIndex];\n    const frame: Task.Frame<string | null> = Task.newFrame(\"getCFI\");\n    this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n      const node = xmldoc.getNodeByOffset(offsetInItem);\n      let cfi: string | null = null;\n      if (node) {\n        const startOffset = xmldoc.getNodeOffset(node, 0, false);\n        const offsetInNode = offsetInItem - startOffset;\n        const fragment = new CFI.Fragment();\n        fragment.prependPathFromNode(node, offsetInNode, false, null);\n        if (item.itemRefElement) {\n          fragment.prependPathFromNode(item.itemRefElement, 0, false, null);\n        }\n        cfi = fragment.toString();\n      }\n      frame.finish(cfi);\n    });\n    return frame.result();\n  }\n\n  resolveFragment(fragstr: string | null): Task.Result<Position | null> {\n    return Task.handle(\n      \"resolveFragment\",\n      (frame: Task.Frame<Position | null>): void => {\n        if (!fragstr) {\n          frame.finish(null);\n          return;\n        }\n        let fragment = new CFI.Fragment();\n        fragment.fromString(fragstr);\n        let item: OPFItem;\n        if (this.opfXML) {\n          const opfNav = fragment.navigate(this.opfXML.document);\n          if (opfNav.node.nodeType != 1 || opfNav.after || !opfNav.ref) {\n            frame.finish(null);\n            return;\n          }\n          const elem = opfNav.node as Element;\n          const idref = elem.getAttribute(\"idref\");\n          if (elem.localName != \"itemref\" || !idref || !this.itemMap[idref]) {\n            frame.finish(null);\n            return;\n          }\n          item = this.itemMap[idref];\n          fragment = opfNav.ref;\n        } else {\n          item = this.spine[0];\n        }\n        this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n          const nodeNav = fragment.navigate(xmldoc.document);\n          const offset = xmldoc.getNodeOffset(\n            nodeNav.node,\n            nodeNav.offset,\n            nodeNav.after,\n          );\n          frame.finish({\n            spineIndex: item.spineIndex,\n            offsetInItem: offset,\n            pageIndex: -1,\n          });\n        });\n      },\n      (frame: Task.Frame<Position | null>, err: Error): void => {\n        Logging.logger.warn(err, \"Cannot resolve fragment:\", fragstr);\n        frame.finish(null);\n      },\n    );\n  }\n\n  resolveEPage(epage: number): Task.Result<Position | null> {\n    return Task.handle(\n      \"resolveEPage\",\n      (frame: Task.Frame<Position | null>): void => {\n        if (epage <= 0) {\n          frame.finish({ spineIndex: 0, offsetInItem: 0, pageIndex: -1 });\n          return;\n        }\n        if (this.epageIsRenderedPage) {\n          let spineIndex = this.spine.findIndex((item) => {\n            return (\n              (item.epage == 0 && item.epageCount == 0) ||\n              (item.epage <= epage && item.epage + item.epageCount > epage)\n            );\n          });\n          if (spineIndex == -1) {\n            spineIndex = this.spine.length - 1;\n          }\n          let item = this.spine[spineIndex];\n          if (!item || item.epageCount == 0) {\n            item = this.spine[--spineIndex];\n          }\n          const pageIndex = Math.floor(epage - item.epage);\n          frame.finish({ spineIndex, offsetInItem: -1, pageIndex: pageIndex });\n          return;\n        }\n        let spineIndex = Base.binarySearch(this.spine.length, (index) => {\n          const item = this.spine[index];\n          return item.epage + item.epageCount > epage;\n        });\n        if (spineIndex == this.spine.length) {\n          spineIndex--;\n        }\n        const item = this.spine[spineIndex];\n        this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n          epage -= item.epage;\n          if (epage > item.epageCount) {\n            epage = item.epageCount;\n          }\n          let offset = 0;\n          if (epage > 0) {\n            const totalOffset = xmldoc.getTotalOffset();\n            offset = Math.round((totalOffset * epage) / item.epageCount);\n            if (offset == totalOffset) {\n              offset--;\n            }\n          }\n          frame.finish({ spineIndex, offsetInItem: offset, pageIndex: -1 });\n        });\n      },\n      (frame: Task.Frame<Position | null>, err: Error): void => {\n        Logging.logger.warn(err, \"Cannot resolve epage:\", epage);\n        frame.finish(null);\n      },\n    );\n  }\n\n  getEPageFromPosition(position: Position): Task.Result<number> {\n    const item = this.spine[position.spineIndex];\n    if (this.epageIsRenderedPage) {\n      const epage = item.epage + position.pageIndex;\n      return Task.newResult(epage);\n    }\n    if (position.offsetInItem <= 0) {\n      return Task.newResult(item.epage);\n    }\n    const frame: Task.Frame<number> = Task.newFrame(\"getEPage\");\n    this.store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n      const totalOffset = xmldoc.getTotalOffset();\n      const offset = Math.min(totalOffset, position.offsetInItem);\n      frame.finish(item.epage + (offset * item.epageCount) / totalOffset);\n    });\n    return frame.result();\n  }\n}\n\nexport type PageAndPosition = {\n  page: Vtree.Page;\n  position: Position;\n};\n\nexport const makePageAndPosition = (\n  page: Vtree.Page,\n  pageIndex: number,\n): PageAndPosition => ({\n  page,\n  position: {\n    spineIndex: page.spineIndex,\n    pageIndex,\n    offsetInItem: page.offset,\n  },\n});\n\nexport type OPFViewItem = {\n  item: OPFItem;\n  xmldoc: XmlDoc.XMLDocHolder;\n  instance: OPS.StyleInstance;\n  layoutPositions: Vtree.LayoutPosition[];\n  pages: Vtree.Page[];\n  complete: boolean;\n};\n\nexport class OPFView implements Vgen.CustomRendererFactory {\n  spineItems: OPFViewItem[] = [];\n  spineItemLoadingContinuations: Task.Continuation<any>[][] = [];\n  pref: Exprs.Preferences;\n  clientLayout: Vgen.DefaultClientLayout;\n  counterStore: Counters.CounterStore;\n  cmykStore: CmykStore.CmykStore;\n  tocAutohide: boolean = false;\n  tocVisible: boolean = false;\n  tocView?: Toc.TOCView;\n\n  constructor(\n    public readonly opf: OPFDoc,\n    public readonly viewport: Vgen.Viewport,\n    public readonly fontMapper: Font.Mapper,\n    pref: Exprs.Preferences,\n    public readonly pageSheetSizeReporter: (\n      p1: { width: number; height: number },\n      p2: { [key: string]: { width: number; height: number } },\n      p3: number,\n      p4: number,\n    ) => any,\n  ) {\n    this.pref = Exprs.clonePreferences(pref);\n    this.clientLayout = new Vgen.DefaultClientLayout(viewport);\n    this.counterStore = new Counters.CounterStore(opf.documentURLTransformer);\n    this.cmykStore = new CmykStore.CmykStore();\n  }\n\n  private getPage(position: Position): Vtree.Page {\n    const viewItem = this.spineItems[position.spineIndex];\n    return viewItem ? viewItem.pages[position.pageIndex] : null;\n  }\n\n  /**\n   * Wait until all previous spine items are loaded before accessing the target\n   * spine item. This prevents corrupting the page counter state when navigating\n   * to a later spine item while rendering is in progress.\n   * (Fix for issue #1616)\n   * @param spineIndex The target spine index to navigate to\n   * @param sync If true, skip waiting (synchronous mode)\n   */\n  private waitForPreviousSpines(\n    spineIndex: number,\n    sync: boolean,\n  ): Task.Result<boolean> {\n    if (sync || spineIndex === 0) {\n      return Task.newResult(true);\n    }\n    const frame: Task.Frame<boolean> = Task.newFrame(\"waitForPreviousSpines\");\n    frame\n      .loopWithFrame((loopFrame) => {\n        // Check if any previous spine item is not yet complete\n        let allPreviousComplete = true;\n        for (let i = 0; i < spineIndex; i++) {\n          const prevItem = this.spineItems[i];\n          if (!prevItem || !prevItem.complete) {\n            allPreviousComplete = false;\n            break;\n          }\n        }\n        if (allPreviousComplete) {\n          loopFrame.breakLoop();\n        } else {\n          // Wait and retry\n          frame.sleep(100).then(() => {\n            loopFrame.continueLoop();\n          });\n        }\n      })\n      .then(() => {\n        frame.finish(true);\n      });\n    return frame.result();\n  }\n\n  getCurrentPageProgression(\n    position: Position,\n  ): Constants.PageProgression | null {\n    if (this.opf.pageProgression) {\n      return this.opf.pageProgression;\n    } else {\n      const viewItem = this.spineItems[position ? position.spineIndex : 0];\n      return viewItem ? viewItem.instance.pageProgression : null;\n    }\n  }\n\n  private finishPageContainer(\n    viewItem: OPFViewItem,\n    page: Vtree.Page,\n    pageIndex: number,\n  ) {\n    page.container.style.display = \"none\";\n    page.container.style.visibility = \"visible\";\n    page.container.style.position = \"\";\n    page.container.style.top = \"\";\n    page.container.style.left = \"\";\n    page.container.setAttribute(\n      \"data-vivliostyle-page-side\",\n      page.side as string,\n    );\n    const oldPage = viewItem.pages[pageIndex];\n    page.isFirstPage = viewItem.item.spineIndex == 0 && pageIndex == 0;\n    viewItem.pages[pageIndex] = page;\n\n    if (this.opf.epageIsRenderedPage) {\n      if (pageIndex == 0 && viewItem.item.spineIndex > 0) {\n        const prevItem = this.opf.spine[viewItem.item.spineIndex - 1];\n        viewItem.item.epage = prevItem.epage + prevItem.epageCount;\n      }\n      viewItem.item.epageCount = viewItem.pages.length;\n      this.opf.epageCount = this.opf.spine.reduce(\n        (count, item) => count + item.epageCount,\n        0,\n      );\n\n      if (this.opf.epageCountCallback) {\n        this.opf.epageCountCallback(this.opf.epageCount);\n      }\n    }\n\n    if (oldPage) {\n      viewItem.instance.viewport.contentContainer.replaceChild(\n        page.container,\n        oldPage.container,\n      );\n      oldPage.dispatchEvent({\n        type: \"replaced\",\n        target: null,\n        currentTarget: null,\n        preventDefault: null,\n        newPage: page,\n      });\n    } else {\n      // Find insert position in contentContainer.\n      let insertPos: Element | null = null;\n      if (pageIndex > 0) {\n        insertPos = viewItem.pages[pageIndex - 1].container.nextElementSibling;\n      } else {\n        for (\n          let i = viewItem.item.spineIndex + 1;\n          i < this.spineItems.length;\n          i++\n        ) {\n          const item = this.spineItems[i];\n          if (item && item.pages[0]) {\n            insertPos = item.pages[0].container;\n            break;\n          }\n        }\n      }\n      viewItem.instance.viewport.contentContainer.insertBefore(\n        page.container,\n        insertPos,\n      );\n    }\n    this.pageSheetSizeReporter(\n      {\n        width: viewItem.instance.pageSheetWidth,\n        height: viewItem.instance.pageSheetHeight,\n      },\n      viewItem.instance.pageSheetSize,\n      viewItem.item.spineIndex,\n      viewItem.instance.pageNumberOffset + pageIndex,\n    );\n  }\n\n  /**\n   * Render a single page. If the new page contains elements with ids that are\n   * referenced from other pages by 'target-counter()', those pages are rendered\n   * too (calling `renderSinglePage` recursively).\n   */\n  private renderSinglePage(\n    viewItem: OPFViewItem,\n    pos: Vtree.LayoutPosition,\n  ): Task.Result<RenderSinglePageResult> {\n    const frame: Task.Frame<RenderSinglePageResult> =\n      Task.newFrame(\"renderSinglePage\");\n\n    const oldPage = viewItem.pages[pos ? pos.page : 0];\n    let page = this.makePage(viewItem, pos);\n    if (oldPage) {\n      // If the old page exists, keep the pageType (named page).\n      // This is necessary for named page with target-counter() to work.\n      // (fix for issue #1136)\n      page.pageType = oldPage.pageType;\n    }\n\n    viewItem.instance.layoutNextPage(page, pos).then((posParam) => {\n      pos = posParam as Vtree.LayoutPosition;\n      const pageIndex = pos\n        ? pos.page - 1\n        : viewItem.layoutPositions.length - 1;\n      this.finishPageContainer(viewItem, page, pageIndex);\n      this.counterStore.finishPage(page.spineIndex, pageIndex);\n\n      // If the position of the page break change, we should re-layout the next\n      // page too.\n      let cont: Task.Result<any> = null;\n      if (pos) {\n        const prevPos = viewItem.layoutPositions[pos.page];\n        viewItem.layoutPositions[pos.page] = pos;\n        if (prevPos && viewItem.pages[pos.page]) {\n          if (!pos.isSamePosition(prevPos)) {\n            cont = this.renderSinglePage(viewItem, pos);\n          }\n        }\n      }\n      if (!cont) {\n        cont = Task.newResult(true);\n      }\n      cont.then(() => {\n        const unresolvedRefs = this.counterStore.getUnresolvedRefsToPage(page);\n        let index = 0;\n        frame\n          .loopWithFrame((loopFrame) => {\n            index++;\n            if (index > unresolvedRefs.length) {\n              loopFrame.breakLoop();\n              return;\n            }\n            const refs = unresolvedRefs[index - 1];\n            refs.refs = refs.refs.filter((ref) => !ref.isResolved());\n            if (refs.refs.length === 0) {\n              loopFrame.continueLoop();\n              return;\n            }\n            this.getPageViewItem(refs.spineIndex).then((viewItem) => {\n              if (!viewItem) {\n                loopFrame.continueLoop();\n                return;\n              }\n              // Save the page type and restore it after re-rendering page.\n              // This is necessary for named page with target-counter() to work.\n              // (fix for issue #1272)\n              const { currentPageType, previousPageType } =\n                viewItem.instance.styler.cascade;\n\n              // Save the scopes and restore them after re-rendering page.\n              // This is necessary for :blank page selector to work.\n              // (fix for issues #1131 and #1513)\n              const scopes = viewItem.instance.scopes;\n              viewItem.instance.scopes = {};\n\n              this.counterStore.pushPageCounters(refs.pageCounters);\n              this.counterStore.pushReferencesToSolve(refs.refs);\n              const pos = viewItem.layoutPositions[refs.pageIndex];\n\n              this.renderSinglePage(viewItem, pos).then((result) => {\n                viewItem.instance.styler.cascade.currentPageType =\n                  currentPageType;\n                viewItem.instance.styler.cascade.previousPageType =\n                  previousPageType;\n                viewItem.instance.scopes = scopes;\n                this.counterStore.popPageCounters();\n                this.counterStore.popReferencesToSolve();\n                const resultPosition = result.pageAndPosition.position;\n                if (\n                  resultPosition.spineIndex === page.spineIndex &&\n                  resultPosition.pageIndex === pageIndex\n                ) {\n                  page = result.pageAndPosition.page;\n                }\n                loopFrame.continueLoop();\n              });\n            });\n          })\n          .then(() => {\n            if (!page.container.parentElement) {\n              // page is replaced\n              page = viewItem.pages[pageIndex];\n            }\n            page.isLastPage =\n              !pos && viewItem.item.spineIndex === this.opf.spine.length - 1;\n            if (page.isLastPage) {\n              Asserts.assert(this.viewport);\n              this.counterStore.finishLastPage(this.viewport);\n            }\n            page.container.setAttribute(\n              \"data-vivliostyle-page-index\",\n              pageIndex,\n            );\n            page.container.setAttribute(\n              \"data-vivliostyle-spine-index\",\n              page.spineIndex,\n            );\n            frame.finish({\n              pageAndPosition: makePageAndPosition(page, pageIndex),\n              nextLayoutPosition: pos,\n            });\n          });\n      });\n    });\n    return frame.result();\n  }\n\n  private normalizeSeekPosition(\n    position: Position,\n    viewItem: OPFViewItem,\n  ): Position | null {\n    let pageIndex = position.pageIndex;\n    let seekOffset = -1;\n    if (pageIndex < 0) {\n      seekOffset = position.offsetInItem;\n\n      // page with offset higher than seekOffset\n      const seekOffsetPageIndex = Base.binarySearch(\n        viewItem.layoutPositions.length,\n        (pageIndex) => {\n          // 'noLookAhead' argument of getPosition must be true, since\n          // otherwise StyleInstance.currentLayoutPosition is modified\n          // unintentionally.\n          const offset = viewItem.instance.getPosition(\n            viewItem.layoutPositions[pageIndex],\n            true,\n          );\n          return offset > seekOffset;\n        },\n      );\n      if (seekOffsetPageIndex === viewItem.layoutPositions.length) {\n        if (viewItem.complete) {\n          pageIndex = viewItem.layoutPositions.length - 1;\n        } else {\n          // need to search through pages that are not yet produced\n          pageIndex = Number.POSITIVE_INFINITY;\n        }\n      } else {\n        // page that contains seekOffset\n        pageIndex = seekOffsetPageIndex - 1;\n      }\n    } else if (\n      pageIndex === Number.POSITIVE_INFINITY &&\n      position.offsetInItem !== -1\n    ) {\n      seekOffset = position.offsetInItem;\n    }\n    return {\n      spineIndex: position.spineIndex,\n      pageIndex,\n      offsetInItem: seekOffset,\n    } as Position;\n  }\n\n  /**\n   * Find a page corresponding to a specified position among already laid out\n   * pages.\n   * @param sync If true, find the page synchronously (not waiting another\n   *     rendering task)\n   */\n  findPage(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\"findPage\");\n\n    this.waitForPreviousSpines(position.spineIndex, sync).then(() => {\n      this.getPageViewItem(position.spineIndex).then((viewItem) => {\n        if (!viewItem) {\n          frame.finish(null);\n          return;\n        }\n        let resultPage: Vtree.Page = null;\n        let pageIndex: number;\n        frame\n          .loopWithFrame((loopFrame) => {\n            const normalizedPosition = this.normalizeSeekPosition(\n              position,\n              viewItem,\n            );\n            pageIndex = normalizedPosition.pageIndex;\n            resultPage = viewItem.pages[pageIndex];\n            if (resultPage) {\n              loopFrame.breakLoop();\n            } else if (viewItem.complete) {\n              pageIndex = viewItem.layoutPositions.length - 1;\n              resultPage = viewItem.pages[pageIndex];\n              loopFrame.breakLoop();\n            } else if (sync) {\n              this.renderPage(normalizedPosition).then((result) => {\n                if (result) {\n                  resultPage = result.page;\n                  pageIndex = result.position.pageIndex;\n                }\n                loopFrame.breakLoop();\n              });\n            } else {\n              // Wait for the layout task and retry\n              frame.sleep(100).then(() => {\n                loopFrame.continueLoop();\n              });\n            }\n          })\n          .then(() => {\n            Asserts.assert(resultPage);\n            frame.finish(makePageAndPosition(resultPage, pageIndex));\n          });\n      });\n    });\n    return frame.result();\n  }\n\n  /**\n   * Renders a page at the specified position.\n   */\n  renderPage(position: Position): Task.Result<PageAndPosition | null> {\n    const frame: Task.Frame<PageAndPosition | null> =\n      Task.newFrame(\"renderPage\");\n    this.getPageViewItem(position.spineIndex).then((viewItem) => {\n      if (!viewItem) {\n        frame.finish(null);\n        return;\n      }\n      const normalizedPosition = this.normalizeSeekPosition(position, viewItem);\n      let pageIndex = normalizedPosition.pageIndex;\n      const seekOffset = normalizedPosition.offsetInItem;\n      let resultPage = viewItem.pages[pageIndex];\n      if (resultPage) {\n        frame.finish(makePageAndPosition(resultPage, pageIndex));\n        return;\n      }\n      frame\n        .loopWithFrame((loopFrame) => {\n          if (pageIndex < viewItem.layoutPositions.length) {\n            loopFrame.breakLoop();\n            return;\n          }\n          if (viewItem.complete) {\n            pageIndex = viewItem.layoutPositions.length - 1;\n            loopFrame.breakLoop();\n            return;\n          }\n          let pos =\n            viewItem.layoutPositions[viewItem.layoutPositions.length - 1];\n          this.renderSinglePage(viewItem, pos).then((result) => {\n            const page = result.pageAndPosition.page;\n            pos = result.nextLayoutPosition;\n            if (pos) {\n              if (seekOffset >= 0) {\n                // Searching for offset, don't know the page number.\n                const offset = viewItem.instance.getPosition(pos);\n                if (offset > seekOffset) {\n                  resultPage = page;\n                  pageIndex = viewItem.layoutPositions.length - 2;\n                  loopFrame.breakLoop();\n                  return;\n                }\n              }\n              loopFrame.continueLoop();\n            } else {\n              resultPage = page;\n              pageIndex = result.pageAndPosition.position.pageIndex;\n              viewItem.complete = true;\n              loopFrame.breakLoop();\n            }\n          });\n        })\n        .then(() => {\n          resultPage = resultPage || viewItem.pages[pageIndex];\n          const pos = viewItem.layoutPositions[pageIndex];\n          if (resultPage) {\n            frame.finish(makePageAndPosition(resultPage, pageIndex));\n            return;\n          }\n          this.renderSinglePage(viewItem, pos).then((result) => {\n            if (!result.nextLayoutPosition) {\n              viewItem.complete = true;\n            }\n            frame.finish(result.pageAndPosition);\n          });\n        });\n    });\n    return frame.result();\n  }\n\n  renderAllPages(): Task.Result<PageAndPosition | null> {\n    const frame: Task.Frame<PageAndPosition | null> =\n      Task.newFrame(\"renderAllPages\");\n    this.renderPagesUpto(\n      {\n        spineIndex: this.opf.spine.length - 1,\n        pageIndex: Number.POSITIVE_INFINITY,\n        offsetInItem: -1,\n      },\n      false,\n    ).then((result) => {\n      // Wait until all images are loaded (Issue #1321)\n      frame\n        .loopWithFrame((loopFrame) => {\n          if (\n            this.spineItems.some((viewItem) =>\n              viewItem?.pages.some((page) =>\n                page?.fetchers.some((fetcher) => !fetcher.arrived),\n              ),\n            )\n          ) {\n            frame.sleep(100).then(() => {\n              loopFrame.continueLoop();\n            });\n          } else {\n            loopFrame.breakLoop();\n          }\n        })\n        .then(() => {\n          frame.finish(result);\n        });\n    });\n    return frame.result();\n  }\n\n  /**\n   * Render pages from (spineIndex=0, pageIndex=0) to the specified (spineIndex,\n   * pageIndex).\n   * @param notAllPages If true, render from biginning of specified spine item.\n   */\n  renderPagesUpto(\n    position: Position,\n    notAllPages: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    const frame: Task.Frame<PageAndPosition | null> =\n      Task.newFrame(\"renderPagesUpto\");\n    if (!position) {\n      position = { spineIndex: 0, pageIndex: 0, offsetInItem: 0 };\n    }\n    const spineIndex = position.spineIndex;\n    const pageIndex = position.pageIndex;\n    let s = 0;\n\n    if (notAllPages) {\n      // Render pages from biginning of specified spine item.\n      s = spineIndex;\n    }\n\n    let lastResult: PageAndPosition;\n    frame\n      .loopWithFrame((loopFrame) => {\n        const pos = {\n          spineIndex: s,\n          pageIndex: s === spineIndex ? pageIndex : Number.POSITIVE_INFINITY,\n          offsetInItem: s === spineIndex ? position.offsetInItem : -1,\n        };\n        this.renderPage(pos).then((result) => {\n          lastResult = result;\n          if (++s > spineIndex) {\n            loopFrame.breakLoop();\n          } else {\n            loopFrame.continueLoop();\n          }\n        });\n      })\n      .then(() => {\n        frame.finish(lastResult);\n      });\n    return frame.result();\n  }\n\n  /**\n   * Move to the first page and render it.\n   */\n  firstPage(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    return this.findPage(\n      { spineIndex: 0, pageIndex: 0, offsetInItem: -1 },\n      sync,\n    );\n  }\n\n  /**\n   * Move to the last page and render it.\n   */\n  lastPage(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    return this.findPage(\n      {\n        spineIndex: this.opf.spine.length - 1,\n        pageIndex: Number.POSITIVE_INFINITY,\n        offsetInItem: -1,\n      },\n      sync,\n    );\n  }\n\n  /**\n   * Move to the next page position and render page.\n   * @param sync If true, get the page synchronously (not waiting another\n   *     rendering task)\n   */\n  nextPage(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    let spineIndex = position.spineIndex;\n    let pageIndex = position.pageIndex;\n    const frame: Task.Frame<PageAndPosition | null> = Task.newFrame(\"nextPage\");\n    this.getPageViewItem(spineIndex).then((viewItem) => {\n      if (!viewItem) {\n        frame.finish(null);\n        return;\n      }\n      if (\n        viewItem.complete &&\n        pageIndex == viewItem.layoutPositions.length - 1\n      ) {\n        if (spineIndex >= this.opf.spine.length - 1) {\n          frame.finish(null);\n          return;\n        }\n        spineIndex++;\n        pageIndex = 0;\n\n        // Remove next viewItem if its first page has same side as the current page\n        // to avoid unpaired page.\n        const nextViewItem = this.spineItems[spineIndex];\n        const nextPage = nextViewItem && nextViewItem.pages[0];\n        const currentPage = viewItem.pages[viewItem.pages.length - 1];\n        if (nextPage && currentPage && nextPage.side == currentPage.side) {\n          nextViewItem.pages.forEach((page) => {\n            if (page.container) page.container.remove();\n          });\n          this.spineItems[spineIndex] = null;\n          this.spineItemLoadingContinuations[spineIndex] = null;\n        }\n      } else {\n        pageIndex++;\n      }\n      this.findPage(\n        { spineIndex, pageIndex, offsetInItem: -1 },\n        sync,\n      ).thenFinish(frame);\n    });\n    return frame.result();\n  }\n\n  /**\n   * Move to the previous page and render it.\n   */\n  previousPage(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    let spineIndex = position.spineIndex;\n    let pageIndex = position.pageIndex;\n    if (pageIndex == 0) {\n      if (spineIndex == 0) {\n        return Task.newResult(null as PageAndPosition | null);\n      }\n      spineIndex--;\n      pageIndex = Number.POSITIVE_INFINITY;\n    } else {\n      pageIndex--;\n    }\n    return this.findPage({ spineIndex, pageIndex, offsetInItem: -1 }, sync);\n  }\n\n  /**\n   * @param page This page should be a currently displayed page.\n   */\n  private isRectoPage(page: Vtree.Page, position: Position): boolean {\n    const isLeft = page.side === Constants.PageSide.LEFT;\n    const isLTR =\n      this.getCurrentPageProgression(position) ===\n      Constants.PageProgression.LTR;\n    return (!isLeft && isLTR) || (isLeft && !isLTR);\n  }\n\n  /**\n   * Get a spread containing the currently displayed page.\n   * @param sync If true, get the spread synchronously (not waiting another\n   *     rendering task)\n   */\n  getSpread(position: Position, sync: boolean): Task.Result<Vtree.Spread> {\n    const page = this.getPage(position);\n    if (!page) {\n      return Task.newResult({ left: null, right: null });\n    }\n    const frame: Task.Frame<Vtree.Spread> = Task.newFrame(\"getSpread\");\n    const isLeft = page.side === Constants.PageSide.LEFT;\n    let other: Task.Result<PageAndPosition>;\n    if (this.isRectoPage(page, position)) {\n      other = this.previousPage(position, sync);\n    } else {\n      other = this.nextPage(position, sync);\n    }\n    other.then((otherPageAndPosition) => {\n      // this page may be replaced during nextPage(), so get thisPage again.\n      const thisPage = this.getPage(position);\n\n      let otherPage = otherPageAndPosition && otherPageAndPosition.page;\n      if (otherPage && otherPage.side === thisPage.side) {\n        // otherPage must not be same side\n        otherPage = null;\n      }\n\n      if (isLeft) {\n        frame.finish({ left: thisPage, right: otherPage });\n      } else {\n        frame.finish({ left: otherPage, right: thisPage });\n      }\n    });\n    return frame.result();\n  }\n\n  /**\n   * Move to the next spread and render pages.\n   * @param sync If true, get the spread synchronously (not waiting another\n   *     rendering task)\n   * @returns The 'verso' page of the next spread.\n   */\n  nextSpread(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    const page = this.getPage(position);\n    if (!page) {\n      return Task.newResult(null as PageAndPosition | null);\n    }\n    const isRecto = this.isRectoPage(page, position);\n    const next = this.nextPage(position, sync);\n    if (isRecto) {\n      return next;\n    } else {\n      return next.thenAsync((result) => {\n        if (result) {\n          if (result.page.side === page.side) {\n            // If same side, this is the next spread.\n            return next;\n          }\n          const next2 = this.nextPage(result.position, sync);\n          return next2.thenAsync((result2) => {\n            if (result2) {\n              return next2;\n            } else {\n              // If this is tha last spread, move to next page in the same spread.\n              return next;\n            }\n          });\n        } else {\n          return Task.newResult(null as PageAndPosition | null);\n        }\n      });\n    }\n  }\n\n  /**\n   * Move to the previous spread and render pages.\n   * @returns The 'recto' page of the previous spread.\n   */\n  previousSpread(\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    const page = this.getPage(position);\n    if (!page) {\n      return Task.newResult(null as PageAndPosition | null);\n    }\n    const isRecto = this.isRectoPage(page, position);\n    const prev = this.previousPage(position, sync);\n    const oldPrevPageCont = page.container.previousElementSibling;\n    if (isRecto) {\n      return prev.thenAsync((result) => {\n        if (result) {\n          if (result.page.side === page.side) {\n            // If same side, this is the previous spread.\n            return prev;\n          }\n          if (result.page.container !== oldPrevPageCont) {\n            // If previous page is changed, return it.\n            return prev;\n          }\n          return this.previousPage(result.position, sync);\n        } else {\n          return Task.newResult(null as PageAndPosition | null);\n        }\n      });\n    } else {\n      return prev;\n    }\n  }\n\n  /**\n   * Move to the epage specified by the given number (zero-based) and render it.\n   */\n  navigateToEPage(\n    epage: number,\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    const frame: Task.Frame<PageAndPosition | null> =\n      Task.newFrame(\"navigateToEPage\");\n    this.opf.resolveEPage(epage).then((position) => {\n      if (position) {\n        this.findPage(position, sync).thenFinish(frame);\n      } else {\n        frame.finish(null);\n      }\n    });\n    return frame.result();\n  }\n\n  /**\n   * Move to the page specified by the given CFI and render it.\n   */\n  navigateToFragment(\n    fragment: string,\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    const frame: Task.Frame<PageAndPosition | null> =\n      Task.newFrame(\"navigateToCFI\");\n    this.opf.resolveFragment(fragment).then((position) => {\n      if (position) {\n        this.findPage(position, sync).thenFinish(frame);\n      } else {\n        frame.finish(null);\n      }\n    });\n    return frame.result();\n  }\n\n  /**\n   * Move to the page specified by the given URL and render it.\n   */\n  navigateTo(\n    href: string,\n    position: Position,\n    sync: boolean,\n  ): Task.Result<PageAndPosition | null> {\n    Logging.logger.debug(\"Navigate to\", href);\n    let path = this.opf.getPathFromURL(Base.stripFragment(href));\n    if (!path) {\n      if (this.opf.opfXML && href.match(/^#epubcfi\\(/)) {\n        // CFI fragment is \"relative\" to OPF.\n        path = this.opf.getPathFromURL(this.opf.opfXML.url);\n      } else if (href.charAt(0) === \"#\") {\n        const restored = this.opf.documentURLTransformer.restoreURL(href);\n        if (this.opf.opfXML) {\n          path = this.opf.getPathFromURL(restored[0]);\n          if (path == null) {\n            path = restored[0];\n          }\n        } else {\n          path = restored[0];\n        }\n        href = restored[0] + (restored[1] ? `#${restored[1]}` : \"\");\n      }\n      if (path == null) {\n        return Task.newResult(null as PageAndPosition | null);\n      }\n    }\n    const item = this.opf.itemMapByPath[path];\n    if (!item) {\n      if (\n        this.opf.opfXML &&\n        path == this.opf.getPathFromURL(this.opf.opfXML.url)\n      ) {\n        // CFI link?\n        const fragmentIndex = href.indexOf(\"#\");\n        if (fragmentIndex >= 0) {\n          return this.navigateToFragment(\n            href.substr(fragmentIndex + 1),\n            position,\n            sync,\n          );\n        }\n      }\n      return Task.newResult(null as PageAndPosition | null);\n    }\n    const frame: Task.Frame<PageAndPosition | null> =\n      Task.newFrame(\"navigateTo\");\n\n    this.waitForPreviousSpines(item.spineIndex, sync).then(() => {\n      this.getPageViewItem(item.spineIndex).then((viewItem) => {\n        if (!viewItem) {\n          frame.finish(null);\n          return;\n        }\n        const target = viewItem.xmldoc.getElement(href);\n        this.findPage(\n          {\n            spineIndex: item.spineIndex,\n            pageIndex: -1,\n            offsetInItem: target ? viewItem.xmldoc.getElementOffset(target) : 0,\n          },\n          sync,\n        ).thenFinish(frame);\n      });\n    });\n    return frame.result();\n  }\n\n  makePage(viewItem: OPFViewItem, pos: Vtree.LayoutPosition): Vtree.Page {\n    const viewport = viewItem.instance.viewport;\n    const pageCont = viewport.document.createElement(\"div\");\n    pageCont.setAttribute(\"data-vivliostyle-page-container\", \"true\");\n    pageCont.role = \"presentation\";\n\n    if (!Constants.isDebug) {\n      pageCont.style.visibility = \"hidden\";\n    }\n    viewport.layoutBox.appendChild(pageCont);\n    const bleedBox = viewport.document.createElement(\"div\");\n    bleedBox.setAttribute(\"data-vivliostyle-bleed-box\", \"true\");\n    bleedBox.role = \"presentation\";\n    pageCont.appendChild(bleedBox);\n    const page = new Vtree.Page(pageCont, bleedBox);\n    page.spineIndex = viewItem.item.spineIndex;\n    page.position = pos;\n    page.offset = viewItem.instance.getPosition(pos);\n    if (\n      page.offset === 0 &&\n      !(viewItem.instance.blankPageAtStart && viewItem.pages.length === 0)\n    ) {\n      const id = this.opf.documentURLTransformer.transformFragment(\n        \"\",\n        viewItem.item.src,\n      );\n      bleedBox.setAttribute(\"id\", id);\n      page.registerElementWithId(bleedBox, id);\n    }\n    if (viewport !== this.viewport) {\n      const matrix = Exprs.letterbox(\n        this.viewport.width,\n        this.viewport.height,\n        viewport.width,\n        viewport.height,\n      );\n      const cssMatrix = CssParser.parseValue(\n        null,\n        new CssTokenizer.Tokenizer(matrix, null),\n        \"\",\n      );\n      page.delayedItems.push(\n        new Vtree.DelayedItem(pageCont, \"transform\", cssMatrix),\n      );\n    }\n    return page;\n  }\n\n  makeObjectView(\n    xmldoc: XmlDoc.XMLDocHolder,\n    srcElem: Element,\n    viewParent: Element,\n    computedStyle: { [key: string]: Css.Val },\n  ): Task.Result<Element> {\n    let data = srcElem.getAttribute(\"data\");\n    let result: Element | null = null;\n    if (data) {\n      data = Base.resolveURL(data, xmldoc.url);\n      let mediaType = srcElem.getAttribute(\"media-type\");\n      if (!mediaType) {\n        const path = this.opf.getPathFromURL(data);\n        if (path) {\n          const item = this.opf.itemMapByPath[path];\n          if (item) {\n            mediaType = item.mediaType;\n          }\n        }\n      }\n      if (mediaType) {\n        const handlerSrc = this.opf.bindings[mediaType];\n        if (handlerSrc) {\n          result = this.viewport.document.createElement(\"iframe\");\n          (result as HTMLElement).style.border = \"none\";\n          const srcParam = Base.lightURLEncode(data);\n          const typeParam = Base.lightURLEncode(mediaType);\n          const sb = new Base.StringBuffer();\n          sb.append(handlerSrc);\n          sb.append(\"?src=\");\n          sb.append(srcParam);\n          sb.append(\"&type=\");\n          sb.append(typeParam);\n          for (let c: Node = srcElem.firstChild; c; c = c.nextSibling) {\n            if (c.nodeType == 1) {\n              const ce = c as Element;\n              if (ce.localName == \"param\" && ce.namespaceURI == Base.NS.XHTML) {\n                const pname = ce.getAttribute(\"name\");\n                const pvalue = ce.getAttribute(\"value\");\n                if (pname && pvalue) {\n                  sb.append(\"&\");\n                  sb.append(encodeURIComponent(pname));\n                  sb.append(\"=\");\n                  sb.append(encodeURIComponent(pvalue));\n                }\n              }\n            }\n          }\n          result.setAttribute(\"src\", sb.toString());\n          const width = srcElem.getAttribute(\"width\");\n          if (width) {\n            result.setAttribute(\"width\", width);\n          }\n          const height = srcElem.getAttribute(\"height\");\n          if (height) {\n            result.setAttribute(\"height\", height);\n          }\n        }\n      }\n    }\n    if (!result) {\n      result = this.viewport.document.createElement(\"object\");\n      if (data) {\n        result.setAttribute(\"data\", data);\n      }\n      result.setAttribute(\"data-adapt-process-children\", \"true\");\n    }\n\n    // Need to cast because we need {Element}, not {!Element}\n    return Task.newResult(result as Element);\n  }\n\n  makeMathJaxView(\n    xmldoc: XmlDoc.XMLDocHolder,\n    srcElem: Element,\n    viewParent: Element,\n    computedStyle: { [key: string]: Css.Val },\n  ): Task.Result<Element> {\n    // See if MathJax installed, use it if it is.\n    const hub = getMathJaxHub();\n    if (hub) {\n      const doc = viewParent.ownerDocument;\n      const span = doc.createElement(\"span\");\n      viewParent.appendChild(span);\n      const clonedMath = doc.importNode(srcElem, true);\n      this.resolveURLsInMathML(clonedMath, xmldoc);\n      span.appendChild(clonedMath);\n      const queue = hub[\"queue\"];\n      queue[\"Push\"]([\"Typeset\", hub, span]);\n      const frame: Task.Frame<Element> = Task.newFrame(\"makeMathJaxView\");\n      const continuation = frame.suspend();\n      queue[\"Push\"](() => {\n        continuation.schedule(span);\n      });\n      return frame.result();\n    }\n    return Task.newResult(null as Element);\n  }\n\n  private resolveURLsInMathML(node: Node, xmldoc: XmlDoc.XMLDocHolder) {\n    if (node == null) {\n      return;\n    }\n    if (node.nodeType === 1 && (node as Element).tagName === \"mglyph\") {\n      const attrs = Array.from((node as Element).attributes);\n      for (const attr of attrs) {\n        if (attr.name !== \"src\") {\n          continue;\n        }\n        const newUrl = Base.resolveURL(attr.nodeValue, xmldoc.url);\n        if (attr.namespaceURI) {\n          (node as Element).setAttributeNS(\n            attr.namespaceURI,\n            attr.name,\n            newUrl,\n          );\n        } else {\n          (node as Element).setAttribute(attr.name, newUrl);\n        }\n      }\n    }\n    if (node.firstChild) {\n      this.resolveURLsInMathML(node.firstChild, xmldoc);\n    }\n    if (node.nextSibling) {\n      this.resolveURLsInMathML(node.nextSibling, xmldoc);\n    }\n  }\n\n  /** @override */\n  makeCustomRenderer(xmldoc: XmlDoc.XMLDocHolder): Vgen.CustomRenderer {\n    return (\n      srcElem: Element,\n      viewParent: Element,\n      computedStyle: { [key: string]: Css.Val },\n    ): Task.Result<Element> => {\n      if (\n        srcElem.localName == \"object\" &&\n        srcElem.namespaceURI == Base.NS.XHTML\n      ) {\n        return this.makeObjectView(xmldoc, srcElem, viewParent, computedStyle);\n      } else if (srcElem.namespaceURI == Base.NS.MATHML) {\n        return this.makeMathJaxView(xmldoc, srcElem, viewParent, computedStyle);\n      } else if (\n        (srcElem as HTMLElement).dataset &&\n        (srcElem as HTMLElement).dataset[\"mathTypeset\"] == \"true\"\n      ) {\n        return this.makeMathJaxView(xmldoc, srcElem, viewParent, computedStyle);\n      }\n      return Task.newResult(null as Element);\n    };\n  }\n\n  getPageViewItem(spineIndex: number): Task.Result<OPFViewItem> {\n    if (spineIndex === -1 || spineIndex >= this.opf.spine.length) {\n      return Task.newResult(null as OPFViewItem);\n    }\n    let viewItem = this.spineItems[spineIndex];\n    if (viewItem) {\n      return Task.newResult(viewItem);\n    }\n    const frame: Task.Frame<OPFViewItem> = Task.newFrame(\"getPageViewItem\");\n\n    // If loading for the item has already been started, suspend and wait for\n    // the result.\n    let loadingContinuations = this.spineItemLoadingContinuations[spineIndex];\n    if (loadingContinuations) {\n      const cont = frame.suspend();\n      loadingContinuations.push(cont);\n      return frame.result();\n    } else {\n      loadingContinuations = this.spineItemLoadingContinuations[spineIndex] =\n        [];\n    }\n    const item = this.opf.spine[spineIndex];\n    const store = this.opf.store;\n    store.load(item.src).then((xmldoc: XmlDoc.XMLDocHolder) => {\n      // EPUB Spine properties support\n      const epubSpineProperties =\n        item.itemRefElement.getAttribute(\"properties\");\n      if (epubSpineProperties) {\n        xmldoc.root.setAttribute(\n          \"data-vivliostyle-epub-spine-properties\",\n          epubSpineProperties,\n        );\n      }\n      item.title = xmldoc.document.title;\n      const style = store.getStyleForDoc(xmldoc);\n      const customRenderer = this.makeCustomRenderer(xmldoc);\n      let viewport = this.viewport;\n      const viewportSize = style.sizeViewport(\n        viewport.width,\n        viewport.height,\n        viewport.fontSize,\n        this.pref,\n      );\n      if (\n        viewportSize.width != viewport.width ||\n        viewportSize.height != viewport.height ||\n        viewportSize.fontSize != viewport.fontSize\n      ) {\n        viewport = new Vgen.Viewport(\n          viewport.window,\n          viewportSize.fontSize,\n          viewport.pixelRatio,\n          viewport.root,\n          viewportSize.width,\n          viewportSize.height,\n        );\n      }\n      const isVersoFirstPage = this.spineItems[0]?.instance.isVersoFirstPage;\n      const previousViewItem = this.spineItems[spineIndex - 1];\n      let pageNumberOffset: number;\n      let pageCounterOffset: number;\n      if (item.startPage !== null) {\n        pageNumberOffset = item.startPage - 1;\n        pageCounterOffset = pageNumberOffset;\n      } else {\n        if (\n          spineIndex > 0 &&\n          (!previousViewItem || !previousViewItem.complete)\n        ) {\n          // When navigate to a new spine item skipping the previous items,\n          // give up calculate pageNumberOffset and use epage (or spineIndex if epage is unset).\n          pageNumberOffset = item.epage || spineIndex;\n          if (\n            !this.opf.prePaginated &&\n            pageNumberOffset % 2 == (isVersoFirstPage ? 1 : 0)\n          ) {\n            // Force to odd number to avoid unpaired page. (This is 0 based and even number is recto)\n            // (odd and even are reversed if isVersoFirstPage is true)\n            pageNumberOffset++;\n          }\n          pageCounterOffset = pageNumberOffset;\n        } else {\n          pageNumberOffset = previousViewItem\n            ? previousViewItem.instance.pageNumberOffset +\n              previousViewItem.pages.length\n            : 0;\n          const counters = this.counterStore.currentPageCounters[\"page\"];\n          pageCounterOffset =\n            !counters || !counters.length\n              ? pageNumberOffset\n              : counters[counters.length - 1];\n\n          // Note: The \"page\" counter value differs to the \"page-number\" value\n          // if the \"page\" counter has been reset by counter-reset/increment.\n          // (Fix for issue #701)\n        }\n        if (item.skipPagesBefore !== null) {\n          pageNumberOffset += item.skipPagesBefore;\n          pageCounterOffset += item.skipPagesBefore;\n        }\n      }\n      this.counterStore.forceSetPageCounter(pageCounterOffset);\n      const instance = new OPS.StyleInstance(\n        style,\n        xmldoc,\n        this.opf.lang,\n        viewport,\n        this.clientLayout,\n        this.fontMapper,\n        customRenderer,\n        this.opf.fallbackMap,\n        pageNumberOffset,\n        this.opf.documentURLTransformer,\n        this.counterStore,\n        this.cmykStore,\n        this.opf.pageProgression,\n        isVersoFirstPage,\n      );\n      instance.pref = this.pref;\n\n      // For env(pub-title) and env(doc-title)\n      const pubTitles = this.opf.metadata && this.opf.metadata[metaTerms.title];\n      instance.pubTitle =\n        (pubTitles && pubTitles[0] && pubTitles[0][\"v\"]) || \"\";\n      instance.docTitle = item.title || \"\";\n\n      instance.init().then(() => {\n        if (!this.opf.pageProgression && instance.pageProgression) {\n          // Use the first instance's page progression as the global page progression.\n          // (Fix for issue #1260)\n          this.opf.pageProgression = instance.pageProgression;\n        }\n        viewItem = {\n          item,\n          xmldoc,\n          instance,\n          layoutPositions: [null],\n          pages: [],\n          complete: false,\n        };\n        this.spineItems[spineIndex] = viewItem;\n        frame.finish(viewItem);\n        loadingContinuations.forEach((c) => {\n          c.schedule(viewItem);\n        });\n      });\n    });\n    return frame.result();\n  }\n\n  removeRenderedPages() {\n    const items = this.spineItems;\n    for (const item of items) {\n      if (item) {\n        item.pages.splice(0);\n      }\n    }\n    this.viewport.clear();\n  }\n\n  /**\n   * Returns if at least one page has 'auto' size\n   */\n  hasAutoSizedPages(): boolean {\n    const items = this.spineItems;\n    for (const item of items) {\n      if (item) {\n        const pages = item.pages;\n        for (const page of pages) {\n          if (page.isAutoPageWidth && page.isAutoPageHeight) {\n            return true;\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  hasPages(): boolean {\n    return this.spineItems.some((item) => item && item.pages.length > 0);\n  }\n\n  showTOC(autohide: boolean): Task.Result<Vtree.Page> {\n    const opf = this.opf;\n    const toc = opf.toc;\n    this.tocAutohide = autohide;\n    if (!toc) {\n      return Task.newResult(null as Vtree.Page);\n    }\n    this.tocVisible = true;\n    if (this.tocView && this.tocView.page) {\n      this.tocView.page.container.style.visibility = \"visible\";\n      this.tocView.page.container.setAttribute(\"aria-hidden\", \"false\");\n      return Task.newResult(this.tocView.page);\n    }\n    const frame: Task.Frame<Vtree.Page> = Task.newFrame(\"showTOC\");\n    if (!this.tocView) {\n      this.tocView = new Toc.TOCView(\n        opf.store,\n        toc.src,\n        opf.lang,\n        this.clientLayout,\n        this.fontMapper,\n        this.pref,\n        this,\n        opf.fallbackMap,\n        opf.documentURLTransformer,\n        this.counterStore,\n        this.cmykStore,\n      );\n    }\n    const viewport = this.viewport;\n    const tocWidth = Math.min(344, Math.round(0.67 * viewport.width) - 16);\n    const tocHeight = viewport.height - 6;\n    const pageCont = viewport.document.createElement(\"div\") as HTMLElement;\n    viewport.root.appendChild(pageCont);\n    // pageCont.style.position = \"absolute\";\n    if (!Constants.isDebug) {\n      pageCont.style.visibility = \"hidden\";\n    }\n    // pageCont.style.left = \"3px\";\n    // pageCont.style.top = \"3px\";\n    pageCont.style.width = `${tocWidth + 16}px`;\n    pageCont.style.maxHeight = `${tocHeight}px`;\n    // pageCont.style.overflow = \"scroll\";\n    // pageCont.style.overflowX = \"hidden\";\n    // pageCont.style.background = \"rgba(248,248,248,0.9)\";\n    // pageCont.style[\"borderRadius\"] = \"2px\";\n    // pageCont.style[\"boxShadow\"] = \"1px 1px 2px rgba(0,0,0,0.4)\";\n\n    pageCont.setAttribute(\"data-vivliostyle-toc-box\", \"true\");\n    pageCont.setAttribute(\"role\", \"navigation\");\n\n    this.tocView\n      .showTOC(pageCont, viewport, tocWidth, tocHeight, this.viewport.fontSize)\n      .then((page) => {\n        pageCont.style.visibility = \"visible\";\n        pageCont.setAttribute(\"aria-hidden\", \"false\");\n        frame.finish(page);\n      });\n    return frame.result();\n  }\n\n  hideTOC(): void {\n    this.tocVisible = false;\n    if (this.tocView) {\n      this.tocView.hideTOC();\n    }\n  }\n\n  isTOCVisible(): boolean {\n    return this.tocVisible && !!this.tocView && this.tocView.isTOCVisible();\n  }\n}\n\nexport interface RenderSinglePageResult {\n  pageAndPosition: PageAndPosition;\n  nextLayoutPosition: Vtree.LayoutPosition;\n}\n","/**\n * Copyright 2013 Google, Inc.\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview AdaptiveViewer - Viewer implementation.\n */\nimport * as Asserts from \"./asserts\";\nimport * as Base from \"./base\";\nimport * as Constants from \"./constants\";\nimport * as Epub from \"./epub\";\nimport * as Exprs from \"./exprs\";\nimport * as Font from \"./font\";\nimport * as Logging from \"./logging\";\nimport * as Plugin from \"./plugin\";\nimport * as Profile from \"./profile\";\nimport * as Scripts from \"./scripts\";\nimport * as Task from \"./task\";\nimport * as TaskUtil from \"./task-util\";\nimport * as Vgen from \"./vgen\";\nimport * as Vtree from \"./vtree\";\nimport {\n  VivliostylePolyfillCss,\n  VivliostyleViewportCss,\n  VivliostyleViewportScreenCss,\n} from \"./assets\";\n\nexport type Action = (p1: Base.JSON) => Task.Result<boolean>;\n\nexport type ViewportSize = {\n  marginLeft: number;\n  marginRight: number;\n  marginTop: number;\n  marginBottom: number;\n  width: number;\n  height: number;\n};\n\nexport const VIEWPORT_STATUS_ATTRIBUTE = \"data-vivliostyle-viewer-status\";\n\nexport const VIEWPORT_SPREAD_VIEW_ATTRIBUTE = \"data-vivliostyle-spread-view\";\n\n/**\n * @enum {string}\n */\nexport enum PageViewMode {\n  SINGLE_PAGE = \"singlePage\",\n  SPREAD = \"spread\",\n  AUTO_SPREAD = \"autoSpread\",\n}\n\nexport type SingleDocumentParam = {\n  url: string;\n  startPage: number | null;\n  skipPagesBefore: number | null;\n};\n\nexport class AdaptiveViewer {\n  fontMapper: Font.Mapper;\n  kick: () => void;\n  sendCommand: (p1: Base.JSON | string) => void;\n  resizeListener: () => void;\n  hyperlinkListener: Base.EventListener;\n  pageRuleStyleElement: HTMLElement;\n  pageSheetSizeAlreadySet: boolean = false;\n  renderTask: Task.Task | null = null;\n  actions: { [key: string]: Action };\n  readyState: Constants.ReadyState;\n  packageURL: string[];\n  opf: Epub.OPFDoc;\n  touchActive: boolean;\n  touchX: number;\n  touchY: number;\n  needResize: boolean;\n  resized: boolean;\n  needRefresh: boolean;\n  viewportSize: ViewportSize | null;\n  currentPage: Vtree.Page;\n  currentSpread: Vtree.Spread | null;\n  pagePosition: Epub.Position | null;\n  fontSize: number;\n  zoom: number;\n  fitToScreen: boolean;\n  pageViewMode: PageViewMode;\n  waitForLoading: boolean;\n  renderAllPages: boolean;\n  pref: Exprs.Preferences;\n  pageSizes: { width: number; height: number }[];\n  pixelRatio: number;\n  pixelRatioLimit: number;\n\n  // force relayout\n  viewport: Vgen.Viewport | null;\n  opfView: Epub.OPFView;\n\n  constructor(\n    public readonly window: Window,\n    public readonly viewportElement: HTMLElement,\n    public readonly instanceId: string,\n    public readonly callbackFn: (p1: Base.JSON) => void,\n  ) {\n    const document = viewportElement.ownerDocument;\n    const findOrCreateStyleElement = (\n      id: string,\n      cssText?: string,\n    ): HTMLElement => {\n      let styleElement = document.getElementById(id);\n      if (!styleElement) {\n        styleElement = document.createElement(\"style\");\n        styleElement.id = id;\n        if (cssText) {\n          styleElement.textContent = cssText;\n        }\n        document.head.appendChild(styleElement);\n      }\n      return styleElement;\n    };\n    findOrCreateStyleElement(\n      \"vivliostyle-viewport-screen-css\",\n      VivliostyleViewportScreenCss,\n    );\n    findOrCreateStyleElement(\n      \"vivliostyle-viewport-css\",\n      VivliostyleViewportCss,\n    );\n    findOrCreateStyleElement(\n      \"vivliostyle-polyfill-css\",\n      VivliostylePolyfillCss,\n    );\n\n    viewportElement.setAttribute(\"data-vivliostyle-viewer-viewport\", true);\n    if (Constants.isDebug) {\n      viewportElement.setAttribute(\"data-vivliostyle-debug\", true);\n    }\n    viewportElement.setAttribute(VIEWPORT_STATUS_ATTRIBUTE, \"loading\");\n    this.fontMapper = new Font.Mapper(document.head, viewportElement);\n    this.init();\n    this.kick = () => {};\n    this.sendCommand = () => {};\n    this.resizeListener = () => {\n      this.needResize = true;\n      this.resized = true;\n      this.kick();\n    };\n    this.pageReplacedListener = this.pageReplacedListener.bind(this);\n    this.hyperlinkListener = (evt) => {};\n    this.pageRuleStyleElement = findOrCreateStyleElement(\n      \"vivliostyle-page-rules\",\n    );\n    this.actions = {\n      loadPublication: this.loadPublication,\n      loadXML: this.loadXML,\n      configure: this.configure,\n      moveTo: this.moveTo,\n      toc: this.showTOC,\n    };\n    this.addLogListeners();\n  }\n\n  private init(): void {\n    this.readyState = Constants.ReadyState.LOADING;\n    this.packageURL = [];\n    this.opf = null;\n    this.touchActive = false;\n    this.touchX = 0;\n    this.touchY = 0;\n    this.needResize = false;\n    this.resized = false;\n    this.needRefresh = false;\n    this.viewportSize = null;\n    this.currentPage = null;\n    this.currentSpread = null;\n    this.pagePosition = null;\n    this.fontSize = 16;\n    this.zoom = 1;\n    this.fitToScreen = false;\n    this.pageViewMode = PageViewMode.SINGLE_PAGE;\n    this.waitForLoading = false;\n    this.renderAllPages = true;\n    this.pref = Exprs.defaultPreferences();\n    this.pageSizes = [];\n\n    // Pixel ratio emulation on PDF output (PR #1079) does not work with\n    // non-Chromium browsers.\n    this.pixelRatioLimit =\n      Base.browserType === \"chromium\" &&\n      // Check non-legacy CSS zoom support (Chromium>=128)\n      \"currentCSSZoom\" in Element.prototype\n        ? 16 // max pixelRatio value on Chromium browsers\n        : 0; // disable pixelRatio emulation on non-Chromium browsers\n    this.pixelRatio = Math.min(8, this.pixelRatioLimit);\n  }\n\n  addLogListeners() {\n    const logLevel = Logging.LogLevel;\n    Logging.logger.addListener(logLevel.DEBUG, (info) => {\n      this.callback({ t: \"debug\", content: info });\n    });\n    Logging.logger.addListener(logLevel.INFO, (info) => {\n      this.callback({ t: \"info\", content: info });\n    });\n    Logging.logger.addListener(logLevel.WARN, (info) => {\n      this.callback({ t: \"warn\", content: info });\n    });\n    Logging.logger.addListener(logLevel.ERROR, (info) => {\n      this.callback({ t: \"error\", content: info });\n    });\n  }\n\n  private callback(message: Base.JSON): void {\n    message[\"i\"] = this.instanceId;\n    this.callbackFn(message);\n  }\n\n  /**\n   * Set readyState and notify to listeners\n   */\n  setReadyState(readyState: Constants.ReadyState) {\n    if (this.readyState !== readyState) {\n      this.readyState = readyState;\n      this.viewportElement.setAttribute(VIEWPORT_STATUS_ATTRIBUTE, readyState);\n      this.callback({ t: \"readystatechange\" });\n    }\n  }\n\n  loadPublication(command: Base.JSON): Task.Result<boolean> {\n    Profile.profiler.registerStartTiming(\"beforeRender\");\n    this.setReadyState(Constants.ReadyState.LOADING);\n    const url = command[\"url\"] as string;\n    const fragment = command[\"fragment\"] as string | null;\n    const authorStyleSheet = command[\"authorStyleSheet\"] as {\n      url: string | null;\n      text: string | null;\n    }[];\n    const userStyleSheet = command[\"userStyleSheet\"] as {\n      url: string | null;\n      text: string | null;\n    }[];\n    this.viewport = null;\n    const frame: Task.Frame<boolean> = Task.newFrame(\"loadPublication\");\n    this.configure(command).then(() => {\n      const store = new Epub.EPUBDocStore();\n      store.init(authorStyleSheet, userStyleSheet).then(() => {\n        const pubURL = Base.resolveURL(\n          Base.convertSpecialURL(url),\n          this.window.location.href,\n        );\n        this.packageURL = [pubURL];\n        store.loadPubDoc(pubURL).then((opf) => {\n          if (opf) {\n            this.opf = opf;\n            this.render(fragment).then(() => {\n              frame.finish(true);\n            });\n          } else {\n            frame.finish(false);\n          }\n        });\n      });\n    });\n    return frame.result();\n  }\n\n  loadXML(command: Base.JSON): Task.Result<boolean> {\n    Profile.profiler.registerStartTiming(\"beforeRender\");\n    this.setReadyState(Constants.ReadyState.LOADING);\n    const params: SingleDocumentParam[] = command[\"url\"];\n    const doc = command[\"document\"] as Document;\n    const fragment = command[\"fragment\"] as string | null;\n    const authorStyleSheet = command[\"authorStyleSheet\"] as {\n      url: string | null;\n      text: string | null;\n    }[];\n    const userStyleSheet = command[\"userStyleSheet\"] as {\n      url: string | null;\n      text: string | null;\n    }[];\n\n    // force relayout\n    this.viewport = null;\n    const frame: Task.Frame<boolean> = Task.newFrame(\"loadXML\");\n    this.configure(command).then(() => {\n      const store = new Epub.EPUBDocStore();\n      store.init(authorStyleSheet, userStyleSheet).then(() => {\n        const resolvedParams: Epub.OPFItemParam[] = params.map((p, index) => ({\n          url: Base.resolveURL(\n            Base.convertSpecialURL(p.url),\n            this.window.location.href,\n          ),\n          index,\n          startPage: p.startPage,\n          skipPagesBefore: p.skipPagesBefore,\n        }));\n        this.packageURL = resolvedParams.map((p) => p.url);\n        this.opf = new Epub.OPFDoc(store, \"\");\n        this.opf.initWithChapters(resolvedParams, doc).then(() => {\n          this.render(fragment).then(() => {\n            frame.finish(true);\n          });\n        });\n      });\n    });\n    return frame.result();\n  }\n\n  private render(fragment?: string | null): Task.Result<boolean> {\n    this.cancelRenderingTask();\n    let cont: Task.Result<boolean>;\n    if (fragment) {\n      cont = this.opf.resolveFragment(fragment).thenAsync((position) => {\n        this.pagePosition = position;\n        return Task.newResult(true);\n      });\n    } else {\n      cont = Task.newResult(true);\n    }\n    return cont.thenAsync(() => {\n      Profile.profiler.registerEndTiming(\"beforeRender\");\n      return this.resize();\n    });\n  }\n\n  private resolveLength(specified: string): number {\n    const value = parseFloat(specified);\n    const unitPattern = /[a-z]+$/;\n    let matched: RegExpMatchArray;\n    if (\n      typeof specified === \"string\" &&\n      (matched = specified.match(unitPattern))\n    ) {\n      const unit = matched[0];\n      if (unit === \"em\" || unit === \"rem\") {\n        return value * this.fontSize;\n      }\n      const unitSize = Exprs.defaultUnitSizes[unit];\n      if (unitSize) {\n        return value * unitSize;\n      }\n    }\n    return value;\n  }\n\n  configure(command: Base.JSON): Task.Result<boolean> {\n    if (typeof command[\"autoresize\"] == \"boolean\") {\n      if (command[\"autoresize\"]) {\n        this.viewportSize = null;\n        this.window.addEventListener(\"resize\", this.resizeListener, false);\n        this.needResize = true;\n      } else {\n        this.window.removeEventListener(\"resize\", this.resizeListener, false);\n      }\n    }\n    if (typeof command[\"fontSize\"] == \"number\") {\n      const fontSize = command[\"fontSize\"] as number;\n      if (fontSize >= 5 && fontSize <= 72 && this.fontSize != fontSize) {\n        this.fontSize = fontSize;\n        this.needResize = true;\n      }\n    }\n    if (typeof command[\"viewport\"] == \"object\" && command[\"viewport\"]) {\n      const vp = command[\"viewport\"];\n      const viewportSize = {\n        marginLeft: this.resolveLength(vp[\"margin-left\"]) || 0,\n        marginRight: this.resolveLength(vp[\"margin-right\"]) || 0,\n        marginTop: this.resolveLength(vp[\"margin-top\"]) || 0,\n        marginBottom: this.resolveLength(vp[\"margin-bottom\"]) || 0,\n        width: this.resolveLength(vp[\"width\"]) || 0,\n        height: this.resolveLength(vp[\"height\"]) || 0,\n      };\n      if (viewportSize.width >= 200 || viewportSize.height >= 200) {\n        this.window.removeEventListener(\"resize\", this.resizeListener, false);\n        this.viewportSize = viewportSize;\n        this.needResize = true;\n      }\n    }\n    if (typeof command[\"hyphenate\"] == \"boolean\") {\n      this.pref.hyphenate = command[\"hyphenate\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"horizontal\"] == \"boolean\") {\n      this.pref.horizontal = command[\"horizontal\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"nightMode\"] == \"boolean\") {\n      this.pref.nightMode = command[\"nightMode\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"lineHeight\"] == \"number\") {\n      this.pref.lineHeight = command[\"lineHeight\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"columnWidth\"] == \"number\") {\n      this.pref.columnWidth = command[\"columnWidth\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"fontFamily\"] == \"string\") {\n      this.pref.fontFamily = command[\"fontFamily\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"load\"] == \"boolean\") {\n      this.waitForLoading = command[\"load\"]; // Load images (and other resources) on the page.\n    }\n    if (typeof command[\"renderAllPages\"] == \"boolean\") {\n      this.renderAllPages = command[\"renderAllPages\"];\n    }\n    // for backward compatibility\n    if (typeof command[\"userAgentRootURL\"] == \"string\") {\n      Base.setBaseURL(command[\"userAgentRootURL\"].replace(/resources\\/?$/, \"\"));\n      Base.setResourceBaseURL(command[\"userAgentRootURL\"]);\n    }\n    if (typeof command[\"rootURL\"] == \"string\") {\n      Base.setBaseURL(command[\"rootURL\"]);\n      Base.setResourceBaseURL(`${Base.baseURL}resources/`);\n    }\n    if (\n      typeof command[\"pageViewMode\"] == \"string\" &&\n      command[\"pageViewMode\"] !== this.pageViewMode\n    ) {\n      this.pageViewMode = command[\"pageViewMode\"] as PageViewMode;\n      this.needResize = true;\n    }\n    if (\n      typeof command[\"pageBorder\"] == \"number\" &&\n      command[\"pageBorder\"] !== this.pref.pageBorder\n    ) {\n      // Force relayout\n      this.viewport = null;\n      this.pref.pageBorder = command[\"pageBorder\"];\n      this.needResize = true;\n    }\n    if (typeof command[\"zoom\"] == \"number\" && command[\"zoom\"] !== this.zoom) {\n      this.zoom = command[\"zoom\"];\n      this.needRefresh = true;\n    }\n    if (\n      typeof command[\"fitToScreen\"] == \"boolean\" &&\n      command[\"fitToScreen\"] !== this.fitToScreen\n    ) {\n      this.fitToScreen = command[\"fitToScreen\"];\n      this.needRefresh = true;\n    }\n    if (\n      typeof command[\"defaultPaperSize\"] == \"object\" &&\n      typeof command[\"defaultPaperSize\"].width == \"number\" &&\n      typeof command[\"defaultPaperSize\"].height == \"number\"\n    ) {\n      this.viewport = null;\n      this.pref.defaultPaperSize = command[\"defaultPaperSize\"];\n      this.needResize = true;\n    }\n    // JavaScript in HTML documents support\n    if (\n      typeof command[\"allowScripts\"] == \"boolean\" &&\n      command[\"allowScripts\"] !== Scripts.allowScripts\n    ) {\n      Scripts.setAllowScripts(command[\"allowScripts\"]);\n      this.needResize = true;\n    }\n    // output pixel ratio emulation\n    if (typeof command[\"pixelRatio\"] == \"number\") {\n      const pixelRatio = Math.min(command[\"pixelRatio\"], this.pixelRatioLimit);\n      if (pixelRatio !== this.pixelRatio) {\n        this.pixelRatio = pixelRatio;\n        this.needResize = true;\n      }\n    }\n    this.configurePlugins(command);\n    return Task.newResult(true);\n  }\n\n  configurePlugins(command: Base.JSON) {\n    const hooks: Plugin.ConfigurationHook[] = Plugin.getHooksForName(\n      Plugin.HOOKS.CONFIGURATION,\n    );\n    hooks.forEach((hook) => {\n      const result = hook(command);\n      this.needResize = result.needResize || this.needResize;\n      this.needRefresh = result.needRefresh || this.needRefresh;\n    });\n  }\n\n  /**\n   * Refresh view when a currently displayed page is replaced (by re-layout\n   * caused by cross reference resolutions)\n   */\n  pageReplacedListener(evt: Base.Event) {\n    const currentPage = this.currentPage;\n    const spread = this.currentSpread;\n    const target = evt.target;\n    if (spread) {\n      if (spread.left === target || spread.right === target) {\n        this.showCurrent(evt.newPage);\n      }\n    } else if (currentPage === evt.target) {\n      this.showCurrent(evt.newPage);\n    }\n  }\n\n  /**\n   * Iterate through currently displayed pages and do something\n   */\n  private forCurrentPages(fn: (p1: Vtree.Page) => any) {\n    const pages = [];\n    if (this.currentPage) {\n      pages.push(this.currentPage);\n    }\n    if (this.currentSpread) {\n      pages.push(this.currentSpread.left);\n      pages.push(this.currentSpread.right);\n    }\n    pages.forEach((page) => {\n      if (page) {\n        fn(page);\n      }\n    });\n  }\n\n  private removePageListeners() {\n    this.forCurrentPages((page) => {\n      page.removeEventListener(\"hyperlink\", this.hyperlinkListener, false);\n      page.removeEventListener(\"replaced\", this.pageReplacedListener, false);\n    });\n  }\n\n  /**\n   * Hide current pages (this.currentPage, this.currentSpread)\n   */\n  private hidePages() {\n    this.removePageListeners();\n    this.forCurrentPages((page) => {\n      Base.setCSSProperty(page.container, \"display\", \"none\");\n    });\n    this.currentPage = null;\n    this.currentSpread = null;\n  }\n\n  private showSinglePage(page: Vtree.Page) {\n    page.addEventListener(\"hyperlink\", this.hyperlinkListener, false);\n    page.addEventListener(\"replaced\", this.pageReplacedListener, false);\n    Base.setCSSProperty(page.container, \"visibility\", \"visible\");\n    Base.setCSSProperty(page.container, \"display\", \"block\");\n  }\n\n  private showPage(page: Vtree.Page): void {\n    this.hidePages();\n    this.currentPage = page;\n    page.container.style.marginLeft = \"\";\n    page.container.style.marginRight = \"\";\n    this.showSinglePage(page);\n  }\n\n  private showSpread(spread: Vtree.Spread) {\n    this.hidePages();\n    this.currentSpread = spread;\n    if (spread.left && spread.right) {\n      // Adjust spread horizontal alignment when left/right page widths differ\n      let leftWidth = parseFloat(spread.left.container.style.width);\n      let rightWidth = parseFloat(spread.right.container.style.width);\n      if (leftWidth && rightWidth && leftWidth !== rightWidth) {\n        if (leftWidth < rightWidth) {\n          spread.left.container.style.marginLeft = `${\n            rightWidth - leftWidth\n          }px`;\n        } else {\n          spread.right.container.style.marginRight = `${\n            leftWidth - rightWidth\n          }px`;\n        }\n      }\n    }\n    if (spread.left) {\n      this.showSinglePage(spread.left);\n      if (!spread.right) {\n        spread.left.container.setAttribute(\n          \"data-vivliostyle-unpaired-page\",\n          true,\n        );\n      } else {\n        spread.left.container.removeAttribute(\"data-vivliostyle-unpaired-page\");\n      }\n    }\n    if (spread.right) {\n      this.showSinglePage(spread.right);\n      if (!spread.left) {\n        spread.right.container.setAttribute(\n          \"data-vivliostyle-unpaired-page\",\n          true,\n        );\n      } else {\n        spread.right.container.removeAttribute(\n          \"data-vivliostyle-unpaired-page\",\n        );\n      }\n    }\n  }\n\n  private reportPosition(): Task.Result<boolean> {\n    const frame: Task.Frame<boolean> = Task.newFrame(\"reportPosition\");\n    Asserts.assert(this.pagePosition);\n    this.opf\n      .getCFI(this.pagePosition.spineIndex, this.pagePosition.offsetInItem)\n      .then((cfi) => {\n        const page = this.currentPage;\n        const r =\n          this.waitForLoading && page.fetchers.length > 0\n            ? TaskUtil.waitForFetchers(page.fetchers)\n            : Task.newResult(true);\n        r.then(() => {\n          this.sendLocationNotification(page, cfi).thenFinish(frame);\n        });\n      });\n    return frame.result();\n  }\n\n  private createViewport(): Vgen.Viewport {\n    const viewportElement = this.viewportElement;\n    if (this.viewportSize) {\n      const vs = this.viewportSize;\n      viewportElement.style.marginLeft = `${vs.marginLeft}px`;\n      viewportElement.style.marginRight = `${vs.marginRight}px`;\n      viewportElement.style.marginTop = `${vs.marginTop}px`;\n      viewportElement.style.marginBottom = `${vs.marginBottom}px`;\n      return new Vgen.Viewport(\n        this.window,\n        this.fontSize,\n        this.pixelRatio,\n        viewportElement,\n        vs.width,\n        vs.height,\n      );\n    } else {\n      return new Vgen.Viewport(\n        this.window,\n        this.fontSize,\n        this.pixelRatio,\n        viewportElement,\n      );\n    }\n  }\n\n  private resolveSpreadView(\n    viewport: Vgen.Viewport,\n    pageSize: { width: number; height: number } | null,\n  ): boolean {\n    switch (this.pageViewMode) {\n      case PageViewMode.SINGLE_PAGE:\n        return false;\n      case PageViewMode.SPREAD:\n        return true;\n      case PageViewMode.AUTO_SPREAD:\n      default:\n        return (\n          viewport != null &&\n          (viewport.width - this.pref.pageBorder) / viewport.height >=\n            (pageSize ? (pageSize.width * 2) / pageSize.height : 1.45) &&\n          (!!pageSize || viewport.width > 800)\n        );\n    }\n  }\n\n  private updateSpreadView(spreadView: boolean) {\n    this.pref.spreadView = spreadView;\n    this.viewportElement.setAttribute(\n      VIEWPORT_SPREAD_VIEW_ATTRIBUTE,\n      spreadView.toString(),\n    );\n  }\n\n  private sizeIsGood(): boolean {\n    const viewport = this.createViewport();\n    const hasNoAutoSizedPages =\n      this.opfView?.hasPages() && !this.opfView.hasAutoSizedPages();\n    const spreadView = this.resolveSpreadView(\n      viewport,\n      this.resized && hasNoAutoSizedPages ? this.pageSizes[0] : null,\n    );\n    this.resized = false;\n    const spreadViewChanged = this.pref.spreadView !== spreadView;\n    this.updateSpreadView(spreadView);\n\n    // check if window.devicePixelRatio is changed\n    const scaleRatioChanged =\n      this.pixelRatio &&\n      this.opfView &&\n      this.pixelRatio / this.window.devicePixelRatio !==\n        this.opfView.clientLayout.scaleRatio;\n\n    if (\n      scaleRatioChanged ||\n      this.viewportSize ||\n      !this.viewport ||\n      this.viewport.fontSize != this.fontSize\n    ) {\n      return false;\n    }\n    if (\n      !spreadViewChanged &&\n      viewport.width == this.viewport.width &&\n      viewport.height == this.viewport.height\n    ) {\n      return true;\n    }\n\n    if (\n      !spreadViewChanged &&\n      viewport.width == this.viewport.width &&\n      viewport.height != this.viewport.height &&\n      /Android|iPhone|iPad|iPod/.test(navigator.userAgent)\n    ) {\n      // On mobile browsers, the viewport height may change unexpectedly\n      // when soft keyboard appears or tab/address bar auto-hide occurs,\n      // so ignore resizing in this condition.\n      return true;\n    }\n\n    if (hasNoAutoSizedPages) {\n      this.viewport.width = viewport.width;\n      this.viewport.height = viewport.height;\n      this.needRefresh = true;\n      return true;\n    }\n    return false;\n  }\n\n  private setPageSize(\n    pageSize: { width: number; height: number },\n    pageSheetSize: { [key: string]: { width: number; height: number } },\n    spineIndex: number,\n    pageIndex: number,\n  ) {\n    this.pageSizes[pageIndex] = pageSize;\n    this.setPageSizePageRules(pageSheetSize, spineIndex, pageIndex);\n    if (\n      pageIndex === 0 &&\n      this.pageViewMode === PageViewMode.AUTO_SPREAD &&\n      !this.opfView.hasAutoSizedPages()\n    ) {\n      this.updateSpreadView(this.resolveSpreadView(this.viewport, pageSize));\n    }\n  }\n\n  private setPageSizePageRules(\n    pageSheetSize: { [key: string]: { width: number; height: number } },\n    spineIndex: number,\n    pageIndex: number,\n  ) {\n    // In this implementation, it generates one page rule with the largest\n    // page size both in width and height in the multiple page sizes.\n    // (Resolve issue #751)\n    if (\n      this.pageRuleStyleElement &&\n      (!this.pageSheetSizeAlreadySet ||\n        this.pageSizes[pageIndex].width !==\n          this.pageSizes[pageIndex - 1]?.width ||\n        this.pageSizes[pageIndex].height !==\n          this.pageSizes[pageIndex - 1]?.height)\n    ) {\n      const widthMax = Math.max(...this.pageSizes.map((p) => p.width));\n      const heightMax = Math.max(...this.pageSizes.map((p) => p.height));\n\n      function convertSize(px: number): number {\n        const pt = px * 0.75;\n        // Workaround for Chromium's rounded page size problem.\n        // (Fix for issue #934 and #936)\n        return Math.ceil(pt);\n      }\n      const widthPt = convertSize(widthMax);\n      const heightPt = convertSize(heightMax);\n\n      // Negative margin setting is necessary to prevent unexpected page breaking.\n      // Note that the high pixel ratio emulation, the pixelRatio setting, uses the CSS zoom property\n      // that enlarge the page content size, and Chromium splits such large pages unless this\n      // negative margin is specified.\n      const rightPt = widthPt * ((this.pixelRatio || 1) - 1) + 2;\n      const bottomPt = heightPt * ((this.pixelRatio || 1) - 1) + 2; // \"+ 2\" is for issue #947\n      const styleText = `@page {size: ${widthPt}pt ${heightPt}pt; margin: 0 ${-rightPt}pt ${-bottomPt}pt 0;}`;\n      this.pageRuleStyleElement.textContent = styleText;\n      this.pageSheetSizeAlreadySet = true;\n    }\n  }\n\n  removePageSizePageRules() {\n    if (this.pageRuleStyleElement) {\n      this.pageRuleStyleElement.textContent = \"\";\n      this.pageSheetSizeAlreadySet = false;\n    }\n  }\n\n  private reset(): void {\n    let tocVisible = false;\n    let tocAutohide = false;\n    if (this.opfView) {\n      tocVisible = this.opfView.tocVisible;\n      tocAutohide = this.opfView.tocAutohide;\n      this.opfView.removeRenderedPages();\n    }\n    this.pageSizes = [];\n    this.removePageSizePageRules();\n    this.viewport = this.createViewport();\n    this.viewport.resetZoom();\n    this.opfView = new Epub.OPFView(\n      this.opf,\n      this.viewport,\n      this.fontMapper,\n      this.pref,\n      this.setPageSize.bind(this),\n    );\n    if (tocVisible) {\n      this.sendCommand({ a: \"toc\", v: \"show\", autohide: tocAutohide });\n    }\n  }\n\n  /**\n   * Show current page or spread depending on the setting\n   * (this.pref.spreadView).\n   * @param sync If true, get the necessary page synchronously (not waiting\n   *     another rendering task)\n   */\n  private showCurrent(page: Vtree.Page, sync?: boolean): Task.Result<null> {\n    this.needRefresh = false;\n    this.removePageListeners();\n\n    const spreadView = this.resolveSpreadView(this.viewport, page.dimensions);\n    if (spreadView !== this.pref.spreadView) {\n      this.updateSpreadView(spreadView);\n    }\n\n    if (spreadView) {\n      return this.opfView\n        .getSpread(this.pagePosition, sync)\n        .thenAsync((spread) => {\n          if (!spread.left && !spread.right) {\n            return Task.newResult(null);\n          }\n          if (\n            spread.left &&\n            spread.right &&\n            (!this.resolveSpreadView(this.viewport, spread.left.dimensions) ||\n              !this.resolveSpreadView(this.viewport, spread.right.dimensions))\n          ) {\n            // Turn off spread view mode if either left or right page is not\n            // suitable for spread view.\n            this.updateSpreadView(false);\n            this.showPage(page);\n            this.setPageZoom(page);\n            this.currentPage = page;\n            return Task.newResult(null);\n          }\n          this.showSpread(spread);\n          this.setSpreadZoom(spread);\n          this.currentPage =\n            page.side === Constants.PageSide.LEFT ? spread.left : spread.right;\n          return Task.newResult(null);\n        });\n    } else {\n      this.showPage(page);\n      this.setPageZoom(page);\n      this.currentPage = page;\n      return Task.newResult(null);\n    }\n  }\n\n  setPageZoom(page: Vtree.Page) {\n    const zoom = this.getAdjustedZoomFactor(page.dimensions);\n    this.viewport?.zoom(page.dimensions.width, page.dimensions.height, zoom);\n  }\n\n  setSpreadZoom(spread: Vtree.Spread) {\n    const dim = this.getSpreadDimensions(spread);\n    this.viewport?.zoom(dim.width, dim.height, this.getAdjustedZoomFactor(dim));\n  }\n\n  /**\n   * @returns adjusted zoom factor\n   */\n  getAdjustedZoomFactor(pageDimension: {\n    width: number;\n    height: number;\n  }): number {\n    return this.fitToScreen\n      ? this.calculateZoomFactorToFitInsideViewPort(pageDimension)\n      : this.zoom;\n  }\n\n  /**\n   * Returns width and height of the spread, including the margin between pages.\n   */\n  getSpreadDimensions(spread: Vtree.Spread): { width: number; height: number } {\n    let width = 0;\n    let height = 0;\n    if (spread.left) {\n      width += spread.left.dimensions.width;\n      height = spread.left.dimensions.height;\n    }\n    if (spread.right) {\n      width += spread.right.dimensions.width;\n      height = Math.max(height, spread.right.dimensions.height);\n    }\n    if (spread.left && spread.right) {\n      width += this.pref.pageBorder * 2;\n      // Adjust spread horizontal alignment when left/right page widths differ\n      width += Math.abs(\n        spread.left.dimensions.width - spread.right.dimensions.width,\n      );\n    }\n    return { width, height };\n  }\n\n  /**\n   * Returns zoom factor corresponding to the specified zoom type.\n   */\n  queryZoomFactor(type: ZoomType): number {\n    if (!this.currentPage) {\n      throw new Error(\"no page exists.\");\n    }\n    switch (type) {\n      case ZoomType.FIT_INSIDE_VIEWPORT: {\n        let pageDim: { width: number; height: number };\n        if (this.pref.spreadView) {\n          Asserts.assert(this.currentSpread);\n          pageDim = this.getSpreadDimensions(this.currentSpread);\n        } else {\n          pageDim = this.currentPage.dimensions;\n        }\n        return this.calculateZoomFactorToFitInsideViewPort(pageDim);\n      }\n      default:\n        throw new Error(`unknown zoom type: ${type}`);\n    }\n  }\n\n  /**\n   * @returns zoom factor to fit inside viewport\n   */\n  calculateZoomFactorToFitInsideViewPort(pageDimension: {\n    width: number;\n    height: number;\n  }): number {\n    if (!this.viewport) {\n      return this.zoom;\n    }\n    const widthZoom = this.viewport.width / pageDimension.width;\n    const heightZoom = this.viewport.height / pageDimension.height;\n    return Math.min(widthZoom, heightZoom);\n  }\n\n  private cancelRenderingTask() {\n    if (this.renderTask) {\n      this.renderTask.interrupt(new RenderingCanceledError());\n    }\n    this.renderTask = null;\n  }\n\n  resize(): Task.Result<boolean> {\n    this.needResize = false;\n    this.needRefresh = false;\n    if (this.sizeIsGood()) {\n      return Task.newResult(true);\n    }\n    this.setReadyState(Constants.ReadyState.LOADING);\n    this.cancelRenderingTask();\n    const resizeTask = Task.currentTask()\n      .getScheduler()\n      .run(() =>\n        Task.handle(\n          \"resize\",\n          (frame) => {\n            if (!this.opf) {\n              frame.finish(false);\n              return;\n            }\n            this.renderTask = resizeTask;\n            Profile.profiler.registerStartTiming(\"render (resize)\");\n            this.reset();\n            if (this.pagePosition) {\n              // When resizing, do not use the current page index, for a page\n              // index corresponding to the current position in the document\n              // (offsetInItem) can change due to different layout caused by\n              // different viewport size.\n\n              // Update(2019-03): to avoid unexpected page move (first page to next),\n              // keep pageIndex == 0 when offsetInItem == 0\n              if (\n                !(\n                  this.pagePosition.pageIndex == 0 &&\n                  this.pagePosition.offsetInItem == 0\n                )\n              ) {\n                this.pagePosition.pageIndex = -1;\n              }\n            }\n\n            // epageCount counting depends renderAllPages mode\n            this.opf.setEPageCountMode(this.renderAllPages);\n\n            // With renderAllPages option specified, the rendering is\n            // performed after the initial page display, otherwise users are\n            // forced to wait the rendering finish in front of a blank page.\n            this.opfView\n              .renderPagesUpto(this.pagePosition, !this.renderAllPages)\n              .then((result) => {\n                if (!result) {\n                  frame.finish(false);\n                  return;\n                }\n                this.pagePosition = result.position;\n                this.showCurrent(result.page, true).then(() => {\n                  this.setReadyState(Constants.ReadyState.INTERACTIVE);\n\n                  this.opf\n                    .countEPages((epageCount) => {\n                      const notification = {\n                        t: \"nav\",\n                        epageCount: epageCount,\n                        first: this.currentPage.isFirstPage,\n                        last: this.currentPage.isLastPage,\n                        metadata: this.opf.metadata,\n                        docTitle:\n                          this.opf.spine[this.pagePosition.spineIndex].title,\n                      };\n                      if (\n                        this.currentPage.isFirstPage ||\n                        (this.pagePosition.pageIndex == 0 &&\n                          this.opf.spine[this.pagePosition.spineIndex].epage)\n                      ) {\n                        notification[\"epage\"] =\n                          this.opf.spine[this.pagePosition.spineIndex].epage;\n                      }\n                      this.callback(notification);\n                    })\n                    .then(() => {\n                      this.reportPosition().then((p) => {\n                        const r = this.renderAllPages\n                          ? this.opfView.renderAllPages()\n                          : Task.newResult(null);\n                        r.then(() => {\n                          if (this.renderTask === resizeTask) {\n                            this.renderTask = null;\n                          }\n                          Profile.profiler.registerEndTiming(\"render (resize)\");\n                          // JavaScript in HTML documents support\n                          if (\n                            Scripts.allowScripts &&\n                            Scripts.hasScripts(this.window)\n                          ) {\n                            Scripts.loadScriptsAtEnd(this.window).then(() => {\n                              if (this.renderAllPages) {\n                                this.setReadyState(\n                                  Constants.ReadyState.COMPLETE,\n                                );\n                              }\n                              this.callback({ t: \"loaded\" });\n                              frame.finish(p);\n                            });\n                          } else {\n                            if (this.renderAllPages) {\n                              this.setReadyState(Constants.ReadyState.COMPLETE);\n                            }\n                            this.callback({ t: \"loaded\" });\n                            frame.finish(p);\n                          }\n                        });\n                      });\n                    });\n                });\n              });\n          },\n          (frame, err) => {\n            if (err instanceof RenderingCanceledError) {\n              Profile.profiler.registerEndTiming(\"render (resize)\");\n              Logging.logger.debug(err.message);\n            } else {\n              throw err;\n            }\n          },\n        ),\n      );\n    return Task.newResult(true);\n  }\n\n  private sendLocationNotification(\n    page: Vtree.Page,\n    cfi: string | null,\n  ): Task.Result<boolean> {\n    const frame: Task.Frame<boolean> = Task.newFrame(\n      \"sendLocationNotification\",\n    );\n    const notification = {\n      t: \"nav\",\n      first: page.isFirstPage,\n      last: page.isLastPage,\n      metadata: this.opf.metadata,\n      docTitle: this.opf.spine[page.spineIndex].title,\n    };\n    this.opf\n      .getEPageFromPosition(this.pagePosition as Epub.Position)\n      .then((epage) => {\n        notification[\"epage\"] = epage;\n        notification[\"epageCount\"] = this.opf.epageCount;\n        if (cfi) {\n          notification[\"cfi\"] = cfi;\n        }\n        this.callback(notification);\n        frame.finish(true);\n      });\n    return frame.result();\n  }\n\n  getCurrentPageProgression(): Constants.PageProgression | null {\n    return this.opfView\n      ? this.opfView.getCurrentPageProgression(this.pagePosition)\n      : null;\n  }\n\n  moveTo(command: Base.JSON): Task.Result<boolean> {\n    let method: () => Task.Result<Epub.PageAndPosition>;\n    if (\n      this.readyState !== Constants.ReadyState.COMPLETE &&\n      command[\"where\"] !== \"next\"\n    ) {\n      this.setReadyState(Constants.ReadyState.LOADING);\n    }\n    if (typeof command[\"where\"] == \"string\") {\n      let m: (\n        position: Epub.Position,\n        sync: boolean,\n      ) => Task.Result<Epub.PageAndPosition>;\n      switch (command[\"where\"]) {\n        case \"next\":\n          m = this.pref.spreadView\n            ? this.opfView.nextSpread\n            : this.opfView.nextPage;\n          break;\n        case \"previous\":\n          m = this.pref.spreadView\n            ? this.opfView.previousSpread\n            : this.opfView.previousPage;\n          break;\n        case \"last\":\n          m = this.opfView.lastPage;\n          break;\n        case \"first\":\n          m = this.opfView.firstPage;\n          break;\n        default:\n          return Task.newResult(true);\n      }\n      if (m) {\n        method = () =>\n          m.call(this.opfView, this.pagePosition, !this.renderAllPages);\n      }\n    } else if (typeof command[\"epage\"] == \"number\") {\n      const epage = command[\"epage\"] as number;\n      method = () =>\n        this.opfView.navigateToEPage(\n          epage,\n          this.pagePosition,\n          !this.renderAllPages,\n        );\n    } else if (typeof command[\"url\"] == \"string\") {\n      const url = command[\"url\"] as string;\n      method = () =>\n        this.opfView.navigateTo(url, this.pagePosition, !this.renderAllPages);\n    } else if (typeof command[\"position\"]?.spineIndex == \"number\") {\n      const position = command[\"position\"] as Epub.Position;\n      method = () => this.opfView.findPage(position, !this.renderAllPages);\n    } else {\n      return Task.newResult(true);\n    }\n    if (!this.opfView) {\n      return Task.newResult(true);\n    }\n    const frame: Task.Frame<boolean> = Task.newFrame(\"moveTo\");\n    method.call(this.opfView).then((result) => {\n      let cont: Task.Result<boolean>;\n      if (result) {\n        this.pagePosition = result.position;\n        const innerFrame: Task.Frame<boolean> =\n          Task.newFrame(\"moveTo.showCurrent\");\n        cont = innerFrame.result();\n        this.showCurrent(result.page, !this.renderAllPages).then(() => {\n          this.reportPosition().thenFinish(innerFrame);\n        });\n      } else {\n        cont = Task.newResult(true);\n      }\n      cont.then((res) => {\n        if (this.readyState === Constants.ReadyState.LOADING) {\n          this.setReadyState(Constants.ReadyState.INTERACTIVE);\n        }\n        frame.finish(res);\n      });\n    });\n    return frame.result();\n  }\n\n  showTOC(command: Base.JSON): Task.Result<boolean> {\n    const autohide = !!command[\"autohide\"];\n    const visibility = command[\"v\"];\n    const currentVisibility = this.opfView.isTOCVisible();\n    const changeAutohide =\n      autohide != this.opfView.tocAutohide && visibility != \"hide\";\n    if (currentVisibility) {\n      if (visibility == \"show\" && !changeAutohide) {\n        return Task.newResult(true);\n      }\n    } else {\n      if (visibility == \"hide\") {\n        return Task.newResult(true);\n      }\n    }\n    if (currentVisibility && visibility != \"show\") {\n      this.opfView.hideTOC();\n      return Task.newResult(true);\n    } else {\n      const frame: Task.Frame<boolean> = Task.newFrame(\"showTOC\");\n      this.opfView.showTOC(autohide).then((page) => {\n        if (page) {\n          if (changeAutohide) {\n            page.listeners = {};\n          }\n          if (autohide) {\n            const hideTOC = () => {\n              this.opfView.hideTOC();\n            };\n            page.addEventListener(\"hyperlink\", hideTOC, false);\n            // page.container.addEventListener(\"click\", hideTOC, false);\n          }\n          page.addEventListener(\"hyperlink\", this.hyperlinkListener, false);\n        }\n        frame.finish(true);\n      });\n      return frame.result();\n    }\n  }\n\n  runCommand(command: Base.JSON): Task.Result<boolean> {\n    const actionName = command[\"a\"] || \"\";\n    return Task.handle(\n      \"runCommand\",\n      (frame) => {\n        const action = this.actions[actionName];\n        if (action) {\n          action.call(this, command).then(() => {\n            this.callback({ t: \"done\", a: actionName });\n            frame.finish(true);\n          });\n        } else {\n          Logging.logger.error(\"No such action:\", actionName);\n          frame.finish(true);\n        }\n      },\n      (frame, err) => {\n        Logging.logger.error(err, \"Error during action:\", actionName);\n        frame.finish(true);\n      },\n    );\n  }\n\n  initEmbed(cmd: Base.JSON | string): void {\n    let command = maybeParse(cmd);\n    let continuation: Task.Continuation<boolean> | null = null;\n    const viewer = this;\n    Task.start(() => {\n      const frame: Task.Frame<boolean> = Task.newFrame(\"commandLoop\");\n      const scheduler = Task.currentTask().getScheduler();\n      viewer.hyperlinkListener = (evt) => {\n        const hrefEvent = evt as Vtree.PageHyperlinkEvent;\n        const internal =\n          hrefEvent.href.charAt(0) === \"#\" ||\n          viewer.packageURL.some(\n            (url) => hrefEvent.href.substr(0, url.length) == url,\n          );\n        if (internal) {\n          evt.preventDefault();\n          const msg = {\n            t: \"hyperlink\",\n            href: hrefEvent.href,\n            internal: internal,\n          };\n          scheduler.run(() => {\n            viewer.callback(msg);\n            return Task.newResult(true);\n          });\n        }\n      };\n      frame\n        .loopWithFrame((loopFrame) => {\n          if (viewer.needResize) {\n            viewer.resize().then(() => {\n              loopFrame.continueLoop();\n            });\n          } else if (viewer.needRefresh) {\n            if (viewer.currentPage) {\n              viewer\n                .showCurrent(viewer.currentPage, !this.renderAllPages)\n                .then(() => {\n                  loopFrame.continueLoop();\n                });\n            }\n          } else if (command) {\n            const cmd = command;\n            command = null;\n            viewer.runCommand(cmd).then(() => {\n              loopFrame.continueLoop();\n            });\n          } else {\n            const frameInternal: Task.Frame<boolean> =\n              Task.newFrame(\"waitForCommand\");\n            continuation = frameInternal.suspend(this);\n            frameInternal.result().then(() => {\n              loopFrame.continueLoop();\n            });\n          }\n        })\n        .thenFinish(frame);\n      return frame.result();\n    });\n    viewer.kick = () => {\n      const cont = continuation;\n      if (cont) {\n        continuation = null;\n        cont.schedule(true);\n      }\n    };\n    viewer.sendCommand = (cmd) => {\n      if (command) {\n        return false;\n      }\n      command = maybeParse(cmd);\n      viewer.kick();\n      return true;\n    };\n    this.window[\"adapt_command\"] = viewer.sendCommand;\n  }\n}\n\n/**\n * @enum {string}\n */\nexport enum ZoomType {\n  FIT_INSIDE_VIEWPORT = \"fit inside viewport\",\n}\n\n/**\n * Error representing that the rendering has been canceled.\n */\nclass RenderingCanceledError extends Error {\n  name: string = \"RenderingCanceledError\";\n  message: string = \"Page rendering has been canceled\";\n  stack: string;\n\n  constructor() {\n    super();\n    // Set the prototype explicitly.\n    // https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n    Object.setPrototypeOf(this, RenderingCanceledError.prototype);\n    this.stack = new Error().stack;\n  }\n}\n\nexport function maybeParse(cmd: any): Base.JSON {\n  if (typeof cmd == \"string\") {\n    return Base.stringToJSON(cmd);\n  }\n  return cmd;\n}\n","/**\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n *\n * @fileoverview CoreViewer - Vivliostyle CoreViewer class\n */\nimport * as AdaptiveViewer from \"./adaptive-viewer\";\nimport * as Base from \"./base\";\nimport * as CmykStore from \"./cmyk-store\";\nimport * as Constants from \"./constants\";\nimport * as Epub from \"./epub\";\nimport * as Profile from \"./profile\";\nimport * as Toc from \"./toc\";\nimport { ErrorInfo } from \"./logging\";\n\nexport interface Payload {\n  type: string;\n  internal: boolean;\n  href: string;\n  content: ErrorInfo;\n  cfi: string;\n  first: boolean;\n  last: boolean;\n  epage: number;\n  epageCount: number;\n  metadata: unknown;\n  docTitle: string;\n}\n\nconst PageProgression = Constants.PageProgression;\n\n/**\n * Viewer settings that must be passed to Viewer's constructor.\n * - userAgentRootURL: URL of a directory from which viewer resource files\n *   (under resources/ directory in the source repository) are served.\n * - viewportElement: An element used as the viewport of the displayed contents.\n * - window: Window object. If omitted, current `window` is used.\n * - debug: Debug flag.\n */\nexport type CoreViewerSettings = {\n  userAgentRootURL?: string;\n  viewportElement: HTMLElement;\n  window?: Window;\n  debug?: boolean;\n};\n\n/**\n * Viewer options that can be set after the Viewer object is constructed.\n * - autoResize: Run layout again when the window is resized. default: true\n * - fontSize: Default font size (px). default: 16\n * - pageBorderWidth: Width of a border between two pages in a single\n *   spread (px). Effective only in spread view mode. default: 1\n * - renderAllPages: Render all pages at the document load time. default: true\n * - pageViewMode: Page view mode (singlePage / spread / autoSpread).\n *   default: singlePage\n * - zoom: Zoom factor with which pages are displayed. default: 1\n * - fitToScreen: Auto adjust zoom factor to fit the screen. default: false\n * - defaultPaperSize: Default paper size in px. Effective when `@page` size\n *   is set to auto. default: undefined (means the windows size is used as\n *   paper size).\n * - allowScripts: Allow JavaScript in documents. default: true\n * - pixelRatio: Set output pixel ratio. Enables very thin border width and\n *   improves layout precision, emulating high pixel ratio.\n *   default: 8. Set 0 to disable pixel ratio emulation.\n */\nexport type CoreViewerOptions = {\n  autoResize?: boolean;\n  fontSize?: number;\n  pageBorderWidth?: number;\n  renderAllPages?: boolean;\n  pageViewMode?: AdaptiveViewer.PageViewMode;\n  zoom?: number;\n  fitToScreen?: boolean;\n  defaultPaperSize?: { width: number; height: number };\n  allowScripts?: boolean;\n  pixelRatio?: number;\n};\n\nfunction getDefaultViewerOptions(): CoreViewerOptions {\n  return {\n    autoResize: true,\n    fontSize: 16,\n    pageBorderWidth: 1,\n    renderAllPages: true,\n    pageViewMode: AdaptiveViewer.PageViewMode.AUTO_SPREAD,\n    zoom: 1,\n    fitToScreen: false,\n    defaultPaperSize: undefined,\n    allowScripts: true,\n    pixelRatio: 8,\n  };\n}\n\nfunction convertViewerOptions(options: CoreViewerOptions): object {\n  const converted = {};\n  Object.keys(options).forEach((key) => {\n    const v = options[key];\n    switch (key) {\n      case \"autoResize\":\n        converted[\"autoresize\"] = v;\n        break;\n      case \"pageBorderWidth\":\n        converted[\"pageBorder\"] = v;\n        break;\n      default:\n        converted[key] = v;\n    }\n  });\n  return converted;\n}\n\n/**\n * Options for the displayed document.\n * - documentObject: Document object for the document. If provided, it is used\n *   directly without parsing the source again.\n * - fragment: Fragmentation identifier (EPUB CFI) of the location in the\n *   document which is to be displayed.\n * - authorStyleSheet: An array of author style sheets to be injected after all\n *   author style sheets referenced from the document. A single stylesheet may\n *   be a URL of the style sheet or a text content of the style sheet.\n * - userStyleSheet: An array of user style sheets to be injected.\n *   A single stylesheet may be a URL of the style sheet or a text content of\n *   the style sheet.\n */\nexport type DocumentOptions = {\n  documentObject?: Document;\n  fragment?: string;\n  authorStyleSheet?: { url?: string; text?: string }[];\n  userStyleSheet?: { url?: string; text?: string }[];\n};\n\n/**\n * Options for a single source document.\n * - url: URL of the document.\n * - startPage: If specified, the `page` page-based counter is set to the\n *   specified value on the first page of the document. It is equivalent to\n *   specifying `counter-reset: page [specified value - 1]` on that page.\n * - skipPagesBefore: If specified, the `page` page-based counter is\n *   incremented by the specified value *before* updating page-based counters\n *   on the first page of the document.\n *   This option is ignored if `startPageNumber` option is also specified.\n */\nexport type SingleDocumentOptions =\n  | string\n  | {\n      url: string;\n      startPage?: number;\n      skipPagesBefore?: number;\n    };\n\n/**\n * Vivliostyle Viewer class.\n */\nexport class CoreViewer {\n  private initialized: boolean = false;\n  private adaptViewer_: AdaptiveViewer.AdaptiveViewer;\n  private options: CoreViewerOptions;\n  private eventTarget: Base.SimpleEventTarget;\n  readyState: Constants.ReadyState;\n\n  constructor(\n    private readonly settings: CoreViewerSettings,\n    opt_options?: CoreViewerOptions,\n  ) {\n    Constants.setDebug(settings.debug);\n    this.adaptViewer_ = new AdaptiveViewer.AdaptiveViewer(\n      settings[\"window\"] || window,\n      settings[\"viewportElement\"],\n      \"main\",\n      this.dispatcher.bind(this),\n    );\n    this.options = getDefaultViewerOptions();\n    if (opt_options) {\n      this.setOptions(opt_options);\n    }\n    this.eventTarget = new Base.SimpleEventTarget();\n    Object.defineProperty(this, \"readyState\", {\n      get() {\n        return this.adaptViewer_.readyState;\n      },\n    });\n  }\n\n  /**\n   * Set ViewerOptions to the viewer.\n   */\n  setOptions(options: CoreViewerOptions) {\n    const command = Object.assign(\n      { a: \"configure\" },\n      convertViewerOptions(options),\n    );\n    this.adaptViewer_.sendCommand(command);\n    Object.assign(this.options, options);\n  }\n\n  private dispatcher(msg: Base.JSON) {\n    /** @dict */\n    const event = { type: msg[\"t\"] };\n    const o = msg as object;\n    Object.keys(o).forEach((key) => {\n      if (key !== \"t\") {\n        event[key] = o[key];\n      }\n    });\n    this.eventTarget.dispatchEvent(event);\n  }\n\n  /**\n   * Add a listener function, which is invoked when the specified type of event\n   * is dispatched.\n   * @param type Event type.\n   * @param listener Listener function.\n   */\n  addListener(type: string, listener: (payload: Payload) => void) {\n    this.eventTarget.addEventListener(\n      type,\n      listener as Base.EventListener,\n      false,\n    );\n  }\n\n  /**\n   * Remove an event listener.\n   * @param type Event type.\n   * @param listener Listener function.\n   */\n  removeListener(type: string, listener: (payload: Payload) => void) {\n    this.eventTarget.removeEventListener(\n      type,\n      listener as Base.EventListener,\n      false,\n    );\n  }\n\n  /**\n   * Load an HTML or XML document(s).\n   */\n  loadDocument(\n    singleDocumentOptions: SingleDocumentOptions | SingleDocumentOptions[],\n    opt_documentOptions?: DocumentOptions,\n    opt_viewerOptions?: CoreViewerOptions,\n  ) {\n    if (\n      !singleDocumentOptions ||\n      (Array.isArray(singleDocumentOptions)\n        ? !singleDocumentOptions[0] ||\n          (typeof singleDocumentOptions[0] !== \"string\" &&\n            !singleDocumentOptions[0].url)\n        : typeof singleDocumentOptions !== \"string\" &&\n          !singleDocumentOptions.url)\n    ) {\n      this.eventTarget.dispatchEvent({\n        type: \"error\",\n        content: { error: new Error(\"No URL specified\") },\n      });\n      return;\n    }\n    this.loadDocumentOrPublication(\n      singleDocumentOptions,\n      null,\n      opt_documentOptions,\n      opt_viewerOptions,\n    );\n  }\n\n  /**\n   * Load an EPUB/WebPub publication.\n   */\n  loadPublication(\n    pubUrl: string,\n    opt_documentOptions?: DocumentOptions,\n    opt_viewerOptions?: CoreViewerOptions,\n  ) {\n    if (!pubUrl) {\n      this.eventTarget.dispatchEvent({\n        type: \"error\",\n        content: { error: new Error(\"No URL specified\") },\n      });\n      return;\n    }\n    this.loadDocumentOrPublication(\n      null,\n      pubUrl,\n      opt_documentOptions,\n      opt_viewerOptions,\n    );\n  }\n\n  /**\n   * Load an HTML or XML document, or an EPUB/WebPub publication.\n   */\n  private loadDocumentOrPublication(\n    singleDocumentOptions:\n      | SingleDocumentOptions\n      | SingleDocumentOptions[]\n      | null,\n    pubUrl: string | null,\n    opt_documentOptions?: DocumentOptions,\n    opt_viewerOptions?: CoreViewerOptions,\n  ) {\n    const documentOptions = opt_documentOptions || {};\n\n    function convertStyleSheetArray(arr) {\n      if (arr) {\n        return arr.map((s) => ({ url: s.url || null, text: s.text || null }));\n      } else {\n        return undefined;\n      }\n    }\n    const authorStyleSheet = convertStyleSheetArray(\n      documentOptions[\"authorStyleSheet\"],\n    );\n    const userStyleSheet = convertStyleSheetArray(\n      documentOptions[\"userStyleSheet\"],\n    );\n    if (opt_viewerOptions) {\n      Object.assign(this.options, opt_viewerOptions);\n    }\n    const command = Object.assign(\n      {\n        a: singleDocumentOptions ? \"loadXML\" : \"loadPublication\",\n        userAgentRootURL: this.settings[\"userAgentRootURL\"],\n        url: convertSingleDocumentOptions(singleDocumentOptions) || pubUrl,\n        document: documentOptions[\"documentObject\"],\n        fragment: documentOptions[\"fragment\"],\n        authorStyleSheet: authorStyleSheet,\n        userStyleSheet: userStyleSheet,\n      },\n      convertViewerOptions(this.options),\n    );\n    if (this.initialized) {\n      this.adaptViewer_.sendCommand(command);\n    } else {\n      this.initialized = true;\n      this.adaptViewer_.initEmbed(command);\n    }\n  }\n\n  /**\n   * Returns the current page progression of the viewer. If no document is\n   * loaded, returns null.\n   */\n  getCurrentPageProgression(): Constants.PageProgression | null {\n    return this.adaptViewer_.getCurrentPageProgression();\n  }\n\n  private resolveNavigation(nav: Navigation): Navigation {\n    switch (nav) {\n      case Navigation.LEFT:\n        return this.getCurrentPageProgression() === PageProgression.LTR\n          ? Navigation.PREVIOUS\n          : Navigation.NEXT;\n      case Navigation.RIGHT:\n        return this.getCurrentPageProgression() === PageProgression.LTR\n          ? Navigation.NEXT\n          : Navigation.PREVIOUS;\n      default:\n        return nav;\n    }\n  }\n\n  /**\n   * Navigate to the specified page.\n   */\n  navigateToPage(nav: Navigation, opt_epage?: number) {\n    if (nav === Navigation.EPAGE) {\n      this.adaptViewer_.sendCommand({\n        a: \"moveTo\",\n        epage: opt_epage,\n      });\n    } else {\n      this.adaptViewer_.sendCommand({\n        a: \"moveTo\",\n        where: this.resolveNavigation(nav),\n      });\n    }\n  }\n\n  /**\n   * Navigate to the specified internal URL.\n   */\n  navigateToInternalUrl(url: string) {\n    this.adaptViewer_.sendCommand({ a: \"moveTo\", url: url });\n  }\n\n  /**\n   * Navigate to the specified position.\n   */\n  navigateToPosition(position: {\n    spineIndex: number;\n    pageIndex?: number;\n    offsetInItem?: number;\n  }) {\n    this.adaptViewer_.sendCommand({\n      a: \"moveTo\",\n      position: {\n        spineIndex: position.spineIndex,\n        pageIndex: position.pageIndex ?? -1,\n        offsetInItem: position.offsetInItem ?? -1,\n      },\n    });\n  }\n\n  /**\n   * @returns True if TOC is visible, false if hidden, null if TOC is unavailable\n   */\n  isTOCVisible(): boolean | null {\n    if (\n      this.adaptViewer_.opfView &&\n      this.adaptViewer_.opfView.opf &&\n      this.adaptViewer_.opfView.opf.toc\n    ) {\n      return !!this.adaptViewer_.opfView.isTOCVisible();\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Show or hide TOC box\n   * @param opt_autohide If true, automatically hide when click TOC item\n   * @param opt_show If true show TOC, false hide TOC. If null or undefined toggle TOC.\n   */\n  showTOC(opt_show?: boolean | null, opt_autohide?: boolean) {\n    const visibility = opt_show == null ? \"toggle\" : opt_show ? \"show\" : \"hide\";\n    this.adaptViewer_.sendCommand({\n      a: \"toc\",\n      v: visibility,\n      autohide: opt_autohide,\n    });\n  }\n\n  /**\n   * Returns zoom factor corresponding to the specified zoom type.\n   */\n  queryZoomFactor(type: AdaptiveViewer.ZoomType): number {\n    return this.adaptViewer_.queryZoomFactor(type);\n  }\n\n  getPageSizes(): { width: number; height: number }[] {\n    return this.adaptViewer_.pageSizes;\n  }\n\n  /**\n   * Returns the current structure of the TOC once it has\n   * been shown, or the empty array if there is no TOC.\n   */\n  getTOC(): Toc.TOCItem[] {\n    return this.adaptViewer_.opfView?.tocView?.getTOC();\n  }\n\n  /**\n   * Returns metadata for the publication. Metadata is\n   * organized as an object of fully-qualified IRI properties\n   * containing arrays of metadata entries. The first element\n   * in the array is primary and should be used by default. Other\n   * entries may overload or refine that metadata.\n   */\n  getMetadata(): Epub.Meta {\n    return this.adaptViewer_.opf.getMetadata();\n  }\n\n  /**\n   * Returns the cover for an EPUB publication, if specified.\n   */\n  getCover(): Epub.OPFItem | null {\n    return this.adaptViewer_.opf.cover;\n  }\n\n  /**\n   * Get the CMYK mapping for device-cmyk() colors used in the document.\n   */\n  getCmykMap(): Record<string, CmykStore.CMYKValueJSON> {\n    const opfView = this.adaptViewer_?.opfView;\n    if (!opfView?.cmykStore) {\n      return {};\n    }\n    return opfView.cmykStore.toJSON();\n  }\n}\n\nfunction convertSingleDocumentOptions(\n  singleDocumentOptions: SingleDocumentOptions | SingleDocumentOptions[],\n): AdaptiveViewer.SingleDocumentParam[] | null {\n  function toNumberOrNull(num: any): number | null {\n    return typeof num === \"number\" ? num : null;\n  }\n\n  function convert(opt) {\n    if (typeof opt === \"string\") {\n      return {\n        url: opt,\n        startPage: null,\n        skipPagesBefore: null,\n      } as AdaptiveViewer.SingleDocumentParam;\n    } else {\n      return {\n        url: opt[\"url\"],\n        startPage: toNumberOrNull(opt[\"startPage\"]),\n        skipPagesBefore: toNumberOrNull(opt[\"skipPagesBefore\"]),\n      } as AdaptiveViewer.SingleDocumentParam;\n    }\n  }\n  if (Array.isArray(singleDocumentOptions)) {\n    return singleDocumentOptions.map(convert);\n  } else if (singleDocumentOptions) {\n    return [convert(singleDocumentOptions)];\n  } else {\n    return null;\n  }\n}\n\n/**\n * @enum {string}\n */\nexport enum Navigation {\n  PREVIOUS = \"previous\",\n  NEXT = \"next\",\n  LEFT = \"left\",\n  RIGHT = \"right\",\n  FIRST = \"first\",\n  LAST = \"last\",\n  EPAGE = \"epage\",\n}\n\nexport type ZoomType = AdaptiveViewer.ZoomType;\nexport const ZoomType = AdaptiveViewer.ZoomType; // eslint-disable-line no-redeclare\n\nexport type PageViewMode = AdaptiveViewer.PageViewMode;\nexport const PageViewMode = AdaptiveViewer.PageViewMode; // eslint-disable-line no-redeclare\n\nProfile.profiler.forceRegisterEndTiming(\"load_vivliostyle\");\n","// Johannes Wilm\n// Vivliostyle Foundation\n\nimport { CoreViewer } from \"./core-viewer\";\n\ninterface IFrameWindowForPrint {\n  printInstance?: VivliostylePrint;\n}\n\nexport interface PrintConfig {\n  title: string;\n  printCallback: (iframeWin: Window) => void;\n  errorCallback: (message: string) => void | null;\n  hideIframe: boolean;\n  removeIframe: boolean;\n}\n\nclass VivliostylePrint {\n  htmlDoc: string;\n  title: string;\n  printCallback: (iframeWin: Window) => void;\n  errorCallback: (message: string) => void;\n  hideIframe: boolean;\n  removeIframe: boolean;\n  iframe: HTMLIFrameElement;\n  iframeWin: Window;\n  window: Window & typeof globalThis & IFrameWindowForPrint;\n\n  constructor(\n    htmlDoc: string,\n    {\n      title = \"\",\n      printCallback = (iframeWin: Window) => iframeWin.print(),\n      errorCallback = null,\n      hideIframe = true,\n      removeIframe = true,\n    }: PrintConfig,\n  ) {\n    this.htmlDoc = htmlDoc;\n    this.title = title;\n    this.printCallback = printCallback;\n    this.errorCallback = errorCallback;\n    this.hideIframe = hideIframe;\n    this.removeIframe = removeIframe;\n  }\n\n  init() {\n    this.iframe = document.createElement(\"iframe\");\n\n    if (this.hideIframe) {\n      this.iframe.style.width = \"0\"; // We don't want the iframe to be seen, so we make it zero size with zero border.\n      this.iframe.style.height = \"0\";\n      this.iframe.style.borderWidth = \"0\";\n    }\n\n    this.window = window;\n    this.window.printInstance = this;\n    this.iframe.srcdoc = `\n      <!DOCTYPE html>\n      <html data-vivliostyle-paginated=\"true\">\n        <head>\n          <meta charset='utf-8'/>\n          <meta name='viewport' content='width=device-width, initial-scale=1.0'/>\n          <title>${this.title}</title>\n          <style>\n            html[data-vivliostyle-paginated] {\n              width: 100%;\n              height: 100%;\n            }\n            html[data-vivliostyle-paginated] body,\n            html[data-vivliostyle-paginated] [data-vivliostyle-viewer-viewport] {\n              width: 100% !important;\n              height: 100% !important;\n            }\n            html[data-vivliostyle-paginated],\n            html[data-vivliostyle-paginated] body {\n              margin: 0;\n              padding: 0;\n            }\n          </style>\n          <style id='vivliostyle-page-rules'></style>\n        </head>\n        <body onload='parent.printInstance.runInIframe(window)'>\n          <div id=\"vivliostyle-viewer-viewport\"></div>\n        </body>\n      </html>`;\n\n    document.body.appendChild(this.iframe);\n  }\n\n  runInIframe(iframeWin: Window) {\n    this.iframeWin = iframeWin;\n    return this.preparePrint()\n      .then(() => this.browserPrint())\n      .then(() => this.cleanUp());\n  }\n\n  preparePrint() {\n    this.iframeWin.document.title = this.title;\n    const docBlob = new Blob([this.htmlDoc], {\n        type: \"text/html\",\n      }),\n      docURL = URL.createObjectURL(docBlob),\n      Viewer = new CoreViewer({\n        viewportElement: this.iframeWin.document.body\n          .firstElementChild as HTMLElement,\n        window: this.iframeWin,\n        debug: true,\n      });\n    return new Promise<void>((resolve) => {\n      Viewer.addListener(\"readystatechange\", () => {\n        if (Viewer.readyState === \"complete\") {\n          resolve();\n        }\n      });\n\n      if (this.errorCallback) {\n        Viewer.addListener(\"error\", (payload) => {\n          const message =\n            payload.content.error?.toString() ??\n            payload.content.messages.join(\"\\n\");\n          this.errorCallback(message);\n        });\n      }\n\n      Viewer.loadDocument({\n        url: docURL,\n      });\n    });\n  }\n\n  browserPrint() {\n    this.printCallback(this.iframeWin);\n  }\n\n  cleanUp() {\n    delete this.window.printInstance;\n    if (this.removeIframe) {\n      this.iframe.parentElement.removeChild(this.iframe);\n    }\n  }\n}\n\nexport function printHTML(htmlDoc: string, config: PrintConfig) {\n  const instance = new VivliostylePrint(htmlDoc, config);\n  instance.init();\n}\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nexport default {\n  escapeUnicodeChar(ch: string): string {\n    return `\\\\u${(0x10000 | ch.charCodeAt(0)).toString(16).substring(1)}`;\n  },\n  escapeUnicodeString(str: string): string {\n    return str.replace(/[^-a-zA-Z0-9_]/g, this.escapeUnicodeChar);\n  },\n  percentEncodeAmpersandAndUnencodedPercent(str: string): string {\n    return str.replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\").replace(/&/g, \"%26\");\n  },\n  percentEncodeAmpersandAndPercent(str: string): string {\n    return str.replace(/%/g, \"%25\").replace(/&/g, \"%26\");\n  },\n  percentDecodeAmpersandAndPercent(str: string): string {\n    return str.replace(/%26/g, \"&\").replace(/%25/g, \"%\");\n  },\n  percentEncodeForDataURI(str: string): string {\n    return encodeURI(str)\n      .replace(/\\?/g, \"%3F\")\n      .replace(/#/g, \"%23\")\n      .replace(/&/g, \"%26\");\n  },\n};\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport stringUtil from \"../utils/string-util\";\n\nfunction getRegExpForParameter(name: string): RegExp {\n  return new RegExp(`[#&]${stringUtil.escapeUnicodeString(name)}=([^&]*)`, \"g\");\n}\n\nclass URLParameterStore {\n  history: History | null;\n  location: Location;\n  storedUrl: string;\n  localStorageKey: string | null = null;\n\n  constructor() {\n    this.history = window.history;\n    this.location = window.location;\n    this.storedUrl = this.location.href;\n  }\n\n  getBaseURL(): string {\n    let url = this.location.href;\n    url = url.replace(/#.*$/, \"\");\n    return url.replace(/\\/[^/]*$/, \"/\");\n  }\n\n  hasParameter(name: string): boolean {\n    const url = this.location.href;\n    const regexp = getRegExpForParameter(name);\n    return regexp.test(url);\n  }\n\n  getParameter(name: string): Array<string> {\n    const url = this.location.href;\n    const regexp = getRegExpForParameter(name);\n    const results = [];\n    let r;\n    while ((r = regexp.exec(url))) {\n      results.push(r[1]);\n    }\n    return results;\n  }\n\n  /**\n   * @param {string} name\n   * @param {string} value\n   * @param {number=} index specifies index in multiple parameters with same name.\n   */\n  setParameter(name: string, value: string, index?: number): void {\n    const url = this.location.href;\n    let updated = url;\n    const regexp = getRegExpForParameter(name);\n    let r = regexp.exec(url);\n    if (r && index) {\n      while (index-- >= 1) {\n        r = regexp.exec(url);\n      }\n    }\n    if (r) {\n      const l = r[1].length;\n      const start = r.index + r[0].length - l;\n      updated = url.substring(0, start) + value + url.substring(start + l);\n    } else {\n      updated = `${\n        url + (url.match(/[#&]$/) ? \"\" : url.match(/#/) ? \"&\" : \"#\") + name\n      }=${value}`;\n      if (name === \"src\") {\n        // \"src\" should be the first parameter\n        updated = updated.replace(/#(?!src)(.*?)&(src=[^&]*)/, \"#$2&$1\");\n      }\n    }\n    if (updated !== url) {\n      if (this.history?.replaceState) {\n        this.history.replaceState(null, \"\", updated);\n      } else {\n        this.location.href = updated;\n      }\n      this.storedUrl = updated;\n      this.saveViewSettings();\n    }\n  }\n\n  /**\n   * @param {string} name\n   * @param {boolean=} keepFirst If true, not remove the first one in multiple parameters with same name.\n   */\n  removeParameter(name: string, keepFirst?: boolean): void {\n    const url = this.location.href;\n    let updated = url;\n    const regexp = getRegExpForParameter(name);\n    let r = regexp.exec(url);\n    if (r && keepFirst) {\n      r = regexp.exec(url);\n    }\n    if (r) {\n      for (; r; r = regexp.exec(updated)) {\n        const end = r.index + r[0].length;\n        if (r[0].charAt(0) == \"#\") {\n          updated =\n            updated.substring(0, r.index + 1) + updated.substring(end + 1);\n        } else {\n          updated = updated.substring(0, r.index) + updated.substring(end);\n        }\n        regexp.lastIndex -= r[0].length;\n      }\n      updated = updated.replace(/^(.*?)[#&]$/, \"$1\");\n    }\n    if (updated !== url) {\n      if (this.history?.replaceState) {\n        this.history.replaceState(null, \"\", updated);\n      } else {\n        this.location.href = updated;\n      }\n      this.storedUrl = updated;\n      this.saveViewSettings();\n    }\n  }\n\n  /**\n   * Enable or disable restoring view settings to the LocalStorage.\n   * @param enable true to enable, false to disable\n   */\n  enableRestoreView(enable: boolean): void {\n    const localStorageKey = this.generateLocalStorageKey();\n    if (enable) {\n      this.localStorageKey = localStorageKey;\n    } else {\n      this.localStorageKey = null;\n      try {\n        window.localStorage.removeItem(localStorageKey);\n      } catch (_e) {\n        // ignore\n      }\n    }\n  }\n\n  /**\n   * @returns true if restoring view settings to the LocalStorage is enabled.\n   */\n  isEnabledRestoreView(): boolean {\n    return !!this.localStorageKey;\n  }\n\n  /**\n   * Save view settings to the LocalStorage.\n   */\n  saveViewSettings(): void {\n    if (this.localStorageKey) {\n      if (!this.hasParameter(\"f\")) {\n        // This is necessary to restore viewing location\n        this.setParameter(\"f\", \"epubcfi()\");\n      }\n      try {\n        window.localStorage.setItem(this.localStorageKey, this.location.hash);\n      } catch (_e) {\n        // ignore\n      }\n    }\n  }\n\n  /**\n   * Generate LocalStorage key for restoring view settings.\n   * @returns the key, or null if not available\n   */\n  generateLocalStorageKey(): string | null {\n    const src = this.getParameter(\"src\").join();\n    if (src) {\n      return \"view@\" + src;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Restore view settings from the LocalStorage.\n   * @returns true if restored\n   */\n  restoreViewSettings(): boolean {\n    const key = this.generateLocalStorageKey();\n    if (key) {\n      try {\n        const saved = window.localStorage.getItem(key);\n        if (saved) {\n          this.location.hash = saved;\n          return true;\n        }\n      } catch (_e) {\n        // ignore\n      }\n    }\n    return false;\n  }\n}\n\nconst instance = new URLParameterStore();\nexport default instance;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { DocumentOptions as CoreDocumentOptions } from \"@vivliostyle/core\";\nimport ko, { Observable } from \"knockout\";\n\nimport PageStyle from \"./page-style\";\nimport urlParameters from \"../stores/url-parameters\";\nimport stringUtil from \"../utils/string-util\";\n\nfunction getDocumentOptionsFromURL(): DocumentOptionsType {\n  const srcUrls = urlParameters.getParameter(\"src\");\n  const bUrls = urlParameters.getParameter(\"b\"); // (deprecated) => src & bookMode=true\n  const xUrls = urlParameters.getParameter(\"x\"); // (deprecated) => src & bookMode=false\n  const bookMode = urlParameters.getParameter(\"bookMode\")[0];\n  const fragment = urlParameters.getParameter(\"f\")[0];\n  const style = urlParameters.getParameter(\"style\");\n  const userStyle = urlParameters.getParameter(\"userStyle\");\n  return {\n    srcUrls: srcUrls.length\n      ? srcUrls\n      : bUrls.length\n        ? bUrls\n        : xUrls.length\n          ? xUrls\n          : null,\n    bookMode:\n      bookMode === \"true\"\n        ? true\n        : bookMode === \"false\"\n          ? false\n          : bUrls.length\n            ? true\n            : xUrls.length\n              ? false\n              : srcUrls.length > 1\n                ? false // multiple srcUrls cannot be bookMode\n                : null,\n    fragment: fragment || null,\n    authorStyleSheet: style.length ? style : [],\n    userStyleSheet: userStyle.length ? userStyle : [],\n  };\n}\n\ninterface DocumentOptionsType {\n  pageStyle?: PageStyle;\n  dataCustomStyleIndex?: number;\n  srcUrls?: Array<string>;\n  bookMode?: boolean;\n  fragment?: string;\n  authorStyleSheet?: Array<string>;\n  userStyleSheet?: Array<string>;\n}\n\nclass DocumentOptions {\n  pageStyle: PageStyle;\n  dataCustomStyleIndex: number;\n  srcUrls?: Observable<Array<string> | null>;\n  bookMode: Observable<boolean>;\n  fragment?: Observable<string>;\n  authorStyleSheet?: Observable<Array<string>>;\n  userStyleSheet?: Observable<Array<string>>;\n\n  constructor(defaultBookMode: boolean) {\n    const urlOptions = getDocumentOptionsFromURL();\n    this.srcUrls = ko.observable(urlOptions.srcUrls || null);\n    this.bookMode = ko.observable(urlOptions.bookMode ?? defaultBookMode);\n    this.fragment = ko.observable(urlOptions.fragment || \"\");\n    this.authorStyleSheet = ko.observable(\n      urlOptions.authorStyleSheet as string[],\n    );\n    this.userStyleSheet = ko.observable(urlOptions.userStyleSheet as string[]);\n    this.pageStyle = new PageStyle();\n    this.dataCustomStyleIndex = -1;\n\n    this.bookMode.subscribe((bookMode) => {\n      if (bookMode === defaultBookMode) {\n        urlParameters.removeParameter(\"bookMode\");\n      } else {\n        urlParameters.setParameter(\"bookMode\", bookMode.toString());\n      }\n    });\n\n    // write fragment back to URL when updated\n    this.fragment.subscribe((fragment) => {\n      if (\n        /^epubcfi\\(\\/([246]\\/)?2!\\)/.test(fragment) &&\n        !urlParameters.isEnabledRestoreView()\n      ) {\n        urlParameters.removeParameter(\"f\");\n      } else {\n        const encoded = fragment.replace(\n          /[\\s+&?=#\\u007F-\\uFFFF]+/g,\n          encodeURIComponent,\n        );\n        urlParameters.setParameter(\"f\", encoded);\n      }\n    });\n\n    // read style=data:.<cssText> URL parameter\n    const findDataCustomStyle = (style: string, index): boolean => {\n      // Find style parameter that starts with \"data:\" and contains \"/*<viewer>*/\".\n      if (/^data:,.*?\\/\\*(?:<|%3C)viewer(?:>|%3E)\\*\\//.test(style)) {\n        this.dataCustomStyleIndex = index;\n        const data = style\n          .replace(/^data:,/, \"\")\n          // Escape unescaped \"%\" that causes error in decodeURIComponent()\n          .replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\");\n        const cssText = decodeURIComponent(data);\n        this.pageStyle.cssText(cssText);\n        return true;\n      } else {\n        return false;\n      }\n    };\n\n    if (!urlOptions.authorStyleSheet.find(findDataCustomStyle)) {\n      if (urlOptions.userStyleSheet.find(findDataCustomStyle)) {\n        this.pageStyle.customStyleAsUserStyle(true);\n      }\n    }\n\n    // write cssText back to URL parameter style= when updated\n    this.pageStyle.cssText.subscribe((cssText) => {\n      this.updateCustomStyleSheetFromCSSText(cssText);\n    });\n  }\n\n  toObject(): CoreDocumentOptions {\n    function convertStyleSheetArray(\n      arr: string[],\n    ): { url?: string; text?: string }[] {\n      return arr.map((url) => ({\n        url,\n      }));\n    }\n    // Do not include url\n    // (url is a required argument to Viewer.loadDocument, separated from other options)\n    return {\n      fragment: this.fragment(),\n      authorStyleSheet: convertStyleSheetArray(this.authorStyleSheet()),\n      userStyleSheet: convertStyleSheetArray(this.userStyleSheet()),\n    };\n  }\n\n  updateCustomStyleSheetFromCSSText(cssText?: string): void {\n    if (cssText == undefined) {\n      cssText = this.pageStyle.toCSSText();\n    }\n    const customStyleAsUserStyle = this.pageStyle.customStyleAsUserStyle();\n    const param = customStyleAsUserStyle ? \"userStyle\" : \"style\";\n    const userOrAuthorStyleSheets = customStyleAsUserStyle\n      ? this.userStyleSheet\n      : this.authorStyleSheet;\n    const styleSheets = userOrAuthorStyleSheets();\n    if (!cssText || /^\\s*(\\/\\*([^*]|\\*(?!\\/))*\\*\\/\\s*)*$/.test(cssText)) {\n      if (styleSheets.length <= (this.dataCustomStyleIndex == -1 ? 0 : 1)) {\n        styleSheets.pop();\n        this.dataCustomStyleIndex = -1;\n        userOrAuthorStyleSheets(styleSheets);\n        urlParameters.removeParameter(param);\n        return;\n      }\n    }\n    const dataCustomStyle =\n      \"data:,\" + stringUtil.percentEncodeForDataURI(cssText.trim());\n    if (this.dataCustomStyleIndex == -1) {\n      styleSheets.push(dataCustomStyle);\n      this.dataCustomStyleIndex = styleSheets.length - 1;\n    } else {\n      styleSheets[this.dataCustomStyleIndex] = dataCustomStyle;\n    }\n    userOrAuthorStyleSheets(styleSheets);\n    urlParameters.setParameter(\n      param,\n      dataCustomStyle,\n      this.dataCustomStyleIndex,\n    );\n  }\n\n  switchCustomStyleUserOrAuthorStyleSheets(): void {\n    const customStyleAsUserStyle = this.pageStyle.customStyleAsUserStyle();\n    if (this.dataCustomStyleIndex !== -1) {\n      const [paramBefore, paramAfter] = customStyleAsUserStyle\n        ? [\"style\", \"userStyle\"]\n        : [\"userStyle\", \"style\"];\n      const [userOrAuthorStyleSheetsBefore, userOrAuthorStyleSheetsAfter] =\n        customStyleAsUserStyle\n          ? [this.authorStyleSheet, this.userStyleSheet]\n          : [this.userStyleSheet, this.authorStyleSheet];\n      const styleSheetsBefore = userOrAuthorStyleSheetsBefore();\n      const styleSheetsAfter = userOrAuthorStyleSheetsAfter();\n\n      const dataCustomStyle = styleSheetsBefore[this.dataCustomStyleIndex];\n      if (dataCustomStyle) {\n        styleSheetsBefore.splice(this.dataCustomStyleIndex, 1);\n        styleSheetsAfter.push(dataCustomStyle);\n        this.dataCustomStyleIndex = styleSheetsAfter.length - 1;\n\n        userOrAuthorStyleSheetsBefore(styleSheetsBefore);\n        userOrAuthorStyleSheetsAfter(styleSheetsAfter);\n\n        urlParameters.removeParameter(paramBefore);\n        urlParameters.removeParameter(paramAfter);\n        styleSheetsBefore.forEach((value, index) => {\n          urlParameters.setParameter(paramBefore, value, index);\n        });\n        styleSheetsAfter.forEach((value, index) => {\n          urlParameters.setParameter(paramAfter, value, index);\n        });\n      }\n    }\n  }\n}\n\nexport default DocumentOptions;\n","/*\n * Copyright 2016 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { PageViewMode as CorePageViewMode } from \"@vivliostyle/core\";\n\nexport class PageViewModeInstance {\n  toSpreadViewString(): string {\n    switch (this) {\n      case PageViewMode.SPREAD:\n        return \"true\";\n      case PageViewMode.SINGLE_PAGE:\n        return \"false\";\n      case PageViewMode.AUTO_SPREAD:\n        return \"auto\";\n      default:\n        throw new Error(\"Invalid PageViewMode\");\n    }\n  }\n  toString(): string {\n    switch (this) {\n      case PageViewMode.SPREAD:\n        return \"spread\"; // vivliostyle.viewer.PageViewMode.SPREAD;\n      case PageViewMode.SINGLE_PAGE:\n        return \"singlePage\"; // vivliostyle.viewer.PageViewMode.SINGLE_PAGE;\n      case PageViewMode.AUTO_SPREAD:\n        return \"autoSpread\"; // vivliostyle.viewer.PageViewMode.AUTO_SPREAD;\n      default:\n        throw new Error(\"Invalid PageViewMode\");\n    }\n  }\n}\n\nconst PageViewMode = {\n  AUTO_SPREAD: new PageViewModeInstance(),\n  SINGLE_PAGE: new PageViewModeInstance(),\n  SPREAD: new PageViewModeInstance(),\n  defaultMode(): CorePageViewMode {\n    return this.AUTO_SPREAD;\n  },\n  fromSpreadViewString(str: string): CorePageViewMode {\n    switch (str) {\n      case \"true\":\n        return this.SPREAD;\n      case \"false\":\n        return this.SINGLE_PAGE;\n      case \"auto\":\n      default:\n        return this.AUTO_SPREAD;\n    }\n  },\n  of(name: string): CorePageViewMode {\n    switch (name) {\n      case CorePageViewMode.SPREAD:\n        return this.SPREAD;\n      case CorePageViewMode.SINGLE_PAGE:\n        return this.SINGLE_PAGE;\n      case CorePageViewMode.AUTO_SPREAD:\n        return this.AUTO_SPREAD;\n      default:\n        throw new Error(`Invalid PageViewMode name: ${name}`);\n    }\n  },\n};\n\nexport default PageViewMode;\n","/*\n * Copyright 2016 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { ZoomType } from \"@vivliostyle/core\";\nimport Viewer from \"../viewmodels/viewer\";\n\nclass ZoomOptions {\n  zoom: number;\n\n  constructor(zoom: number) {\n    this.zoom = zoom;\n  }\n  get fitToScreen(): null | boolean {\n    return null;\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  getCurrentZoomFactor(viewer?: Viewer): number {\n    return 1;\n  }\n  toggleFitToScreen(): ZoomOptions {\n    return new ZoomOptions(1);\n  }\n  zoomIn(viewer: Viewer): FixedZoomFactor {\n    return new FixedZoomFactor(this.getCurrentZoomFactor(viewer) * 1.25);\n  }\n  zoomOut(viewer: Viewer): FixedZoomFactor {\n    return new FixedZoomFactor(this.getCurrentZoomFactor(viewer) * 0.8);\n  }\n  zoomToActualSize(): FixedZoomFactor {\n    return new FixedZoomFactor(1);\n  }\n  static createDefaultOptions(): FitToScreen {\n    return new FitToScreen();\n  }\n  static createFromZoomFactor(zoom: number): FixedZoomFactor {\n    return new FixedZoomFactor(zoom);\n  }\n}\n\nexport class FitToScreen extends ZoomOptions {\n  constructor() {\n    super(1);\n  }\n  get fitToScreen(): boolean {\n    return true;\n  }\n  toggleFitToScreen(): FixedZoomFactor {\n    return new FixedZoomFactor(1);\n  }\n  getCurrentZoomFactor(viewer: Viewer): number {\n    return viewer.queryZoomFactor(ZoomType.FIT_INSIDE_VIEWPORT);\n  }\n}\nclass FixedZoomFactor extends ZoomOptions {\n  get fitToScreen(): boolean {\n    return false;\n  }\n  toggleFitToScreen(): FitToScreen {\n    return new FitToScreen();\n  }\n  getCurrentZoomFactor(): number {\n    return this.zoom;\n  }\n}\n\nexport default ZoomOptions;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport {\n  CoreViewerOptions,\n  PageViewMode as CorePageViewMode,\n} from \"@vivliostyle/core\";\nimport ko, { Observable } from \"knockout\";\n\nimport urlParameters from \"../stores/url-parameters\";\nimport PageViewMode, { PageViewModeInstance } from \"./page-view-mode\";\nimport ZoomOptions from \"./zoom-options\";\n\n/**\n * Viewer Options\n * See CoreViewerOptions in core/src/vivliostyle/core-viewer.ts\n */\ninterface ViewerOptionsType {\n  allowScripts: boolean;\n  renderAllPages: boolean;\n  fontSize: number;\n  profile: boolean;\n  pageViewMode: CorePageViewMode;\n  zoom: ZoomOptions;\n  pixelRatio: number;\n  enableMarker: boolean;\n}\n\nfunction getViewerOptionsFromURL(): ViewerOptionsType {\n  const allowScripts = urlParameters.getParameter(\"allowScripts\")[0];\n  const renderAllPages = urlParameters.getParameter(\"renderAllPages\")[0];\n  const fontSizeStr = urlParameters.getParameter(\"fontSize\")[0];\n  const enableMarker = urlParameters.getParameter(\"enableMarker\")[0];\n  const r = /^([\\d.]+)(?:(%25|%)|\\/([\\d.]+))?$/.exec(fontSizeStr);\n  let fontSize: null | number = null;\n  if (r) {\n    const [, num, percent, denom] = r;\n    fontSize = parseFloat(num);\n    if (percent || denom) {\n      fontSize = (16 * fontSize) / (percent ? 100 : parseFloat(denom));\n    }\n    if (fontSize < 5) fontSize = 5;\n    if (fontSize > 72) fontSize = 72;\n  }\n  const zoomStr = urlParameters.getParameter(\"zoom\")[0];\n  const zoomFactor = parseFloat(zoomStr);\n\n  const pixelRatioStr = urlParameters.getParameter(\"pixelRatio\")[0];\n  const pixelRatio = pixelRatioStr && parseFloat(pixelRatioStr);\n\n  return {\n    allowScripts:\n      allowScripts === \"true\" ? true : allowScripts === \"false\" ? false : null,\n    renderAllPages:\n      renderAllPages === \"true\"\n        ? true\n        : renderAllPages === \"false\"\n          ? false\n          : urlParameters.hasParameter(\"b\")\n            ? false\n            : null,\n    fontSize,\n    profile: urlParameters.getParameter(\"profile\")[0] === \"true\",\n    pageViewMode: PageViewMode.fromSpreadViewString(\n      urlParameters.getParameter(\"spread\")[0],\n    ),\n    zoom:\n      zoomFactor > 0\n        ? ZoomOptions.createFromZoomFactor(zoomFactor)\n        : ZoomOptions.createDefaultOptions(),\n    pixelRatio,\n    enableMarker:\n      enableMarker === \"true\" ? true : enableMarker === \"false\" ? false : null,\n  };\n}\n\nfunction getDefaultValues(): ViewerOptionsType {\n  return {\n    allowScripts: true,\n    renderAllPages: true,\n    fontSize: 16,\n    profile: false,\n    pageViewMode: PageViewMode.defaultMode(),\n    zoom: ZoomOptions.createDefaultOptions(),\n    pixelRatio: 8,\n    enableMarker: false,\n  };\n}\n\nfunction numberToString(number: number): string {\n  return number.toPrecision(10).replace(/(?:\\.0*|(\\.\\d*?)0+)$/, \"$1\");\n}\n\nclass ViewerOptions {\n  allowScripts: Observable<boolean>;\n  renderAllPages: Observable<boolean>;\n  fontSize: Observable<number | string>;\n  profile: Observable<boolean>;\n  pageViewMode: Observable<CorePageViewMode>;\n  zoom: Observable<ZoomOptions>;\n  pixelRatio: Observable<number>;\n  enableMarker: Observable<boolean>;\n\n  static getDefaultValues: () => {\n    allowScripts: boolean;\n    renderAllPages: boolean;\n    fontSize: number;\n    profile: boolean;\n    pageViewMode: CorePageViewMode;\n    zoom: ZoomOptions;\n    pixelRatio: number;\n    enableMarker: boolean;\n  };\n\n  constructor(defaultRenderAllPages: boolean);\n  constructor(options: ViewerOptions);\n\n  constructor(arg: boolean | ViewerOptions) {\n    const defaultRenderAllPages: boolean =\n      typeof arg === \"boolean\" ? arg : undefined;\n    const options: ViewerOptions = typeof arg === \"object\" ? arg : undefined;\n\n    this.allowScripts = ko.observable();\n    this.renderAllPages = ko.observable();\n    this.fontSize = ko.observable();\n    this.profile = ko.observable();\n    this.pageViewMode = ko.observable();\n    this.zoom = ko.observable();\n    this.pixelRatio = ko.observable();\n    this.enableMarker = ko.observable();\n\n    if (options) {\n      this.copyFrom(options);\n    } else {\n      const defaultValues = getDefaultValues();\n      const urlOptions = getViewerOptionsFromURL();\n      this.allowScripts(urlOptions.allowScripts ?? defaultValues.allowScripts);\n      this.renderAllPages(urlOptions.renderAllPages ?? defaultRenderAllPages);\n      this.fontSize(urlOptions.fontSize || defaultValues.fontSize);\n      this.profile(urlOptions.profile || defaultValues.profile);\n      this.pageViewMode(urlOptions.pageViewMode || defaultValues.pageViewMode);\n      this.zoom(urlOptions.zoom || defaultValues.zoom);\n      this.pixelRatio(urlOptions.pixelRatio ?? defaultValues.pixelRatio);\n      this.enableMarker(urlOptions.enableMarker || defaultValues.enableMarker);\n\n      // write spread parameter back to URL when updated\n      this.pageViewMode.subscribe((pageViewMode) => {\n        if (pageViewMode === defaultValues.pageViewMode) {\n          urlParameters.removeParameter(\"spread\");\n        } else {\n          urlParameters.setParameter(\n            \"spread\",\n            (\n              pageViewMode as unknown as PageViewModeInstance\n            ).toSpreadViewString(),\n          );\n        }\n      });\n      this.renderAllPages.subscribe((renderAllPages) => {\n        if (renderAllPages === defaultRenderAllPages) {\n          urlParameters.removeParameter(\"renderAllPages\");\n        } else {\n          urlParameters.setParameter(\n            \"renderAllPages\",\n            renderAllPages.toString(),\n          );\n        }\n      });\n      this.fontSize.subscribe((fontSize) => {\n        if (typeof fontSize == \"number\") {\n          fontSize = numberToString(fontSize);\n        }\n        if (Number(fontSize) == defaultValues.fontSize) {\n          urlParameters.removeParameter(\"fontSize\");\n        } else {\n          urlParameters.setParameter(\n            \"fontSize\",\n            `${fontSize}/${defaultValues.fontSize}`,\n          );\n        }\n      });\n      this.zoom.subscribe((zoom) => {\n        if (zoom.fitToScreen) {\n          urlParameters.removeParameter(\"zoom\");\n        } else {\n          urlParameters.setParameter(\n            \"zoom\",\n            numberToString(zoom.getCurrentZoomFactor()),\n          );\n        }\n      });\n      this.enableMarker.subscribe((enableMarker) => {\n        if (!enableMarker) {\n          urlParameters.removeParameter(\"enableMarker\");\n        } else {\n          urlParameters.setParameter(\"enableMarker\", \"true\");\n        }\n      });\n    }\n  }\n\n  copyFrom(other: ViewerOptions): void {\n    this.allowScripts(other.allowScripts());\n    this.renderAllPages(other.renderAllPages());\n    this.fontSize(other.fontSize());\n    this.profile(other.profile());\n    this.pageViewMode(other.pageViewMode());\n    this.zoom(other.zoom());\n    this.pixelRatio(other.pixelRatio());\n    this.enableMarker(other.enableMarker());\n  }\n\n  toObject(): CoreViewerOptions {\n    return {\n      allowScripts: this.allowScripts() as boolean,\n      renderAllPages: this.renderAllPages() as boolean,\n      fontSize: Number(this.fontSize()),\n      pageViewMode: this.pageViewMode().toString() as CorePageViewMode,\n      fitToScreen: this.zoom().fitToScreen,\n      zoom: this.zoom().zoom,\n      pixelRatio: this.pixelRatio(),\n    };\n  }\n}\n\nViewerOptions.getDefaultValues = getDefaultValues;\n\nexport default ViewerOptions;\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko, { ObservableArray } from \"knockout\";\n\nexport type MessageQueue = ObservableArray<unknown>;\n\nfunction messageQueue(): MessageQueue {\n  return ko.observableArray();\n}\n\nexport default messageQueue();\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport messageQueue from \"../models/message-queue\";\n\nenum LogLevel {\n  Debug = \"debug\",\n  Info = \"info\",\n  Warn = \"warn\",\n  Error = \"error\",\n}\n\nexport default class Logger {\n  logLevel: LogLevel;\n\n  static getLogger(): Logger {\n    return new Logger();\n  }\n\n  constructor() {\n    this.logLevel = LogLevel.Error;\n  }\n\n  setLogLevel(logLevel: LogLevel): void {\n    this.logLevel = logLevel;\n  }\n\n  debug(content: unknown): void {\n    if (this.logLevel === LogLevel.Debug) {\n      messageQueue.push({\n        type: \"debug\",\n        content,\n      });\n    }\n  }\n\n  info(content: unknown): void {\n    if (this.logLevel === LogLevel.Debug || this.logLevel === LogLevel.Info) {\n      messageQueue.push({\n        type: \"info\",\n        content,\n      });\n    }\n  }\n\n  warn(content: unknown): void {\n    if (\n      this.logLevel === LogLevel.Debug ||\n      this.logLevel === LogLevel.Info ||\n      this.logLevel === LogLevel.Warn\n    ) {\n      messageQueue.push({\n        type: \"warn\",\n        content,\n      });\n    }\n  }\n\n  error(content: unknown): void {\n    if (\n      this.logLevel === LogLevel.Debug ||\n      this.logLevel === LogLevel.Info ||\n      this.logLevel === LogLevel.Warn ||\n      this.logLevel === LogLevel.Error\n    ) {\n      if (\n        (content as { error: Error })?.error\n          ?.toString()\n          .includes(\"history.replaceState()\")\n      ) {\n        // Ignore Safari's error,\n        // \"SecurityError: Attempt to use history.replaceState() more than 100 times per 30 seconds\",\n        // that may occur during consecutive page move using page slider or mouse wheel\n        return;\n      }\n      messageQueue.push({\n        type: \"error\",\n        content,\n      });\n    }\n  }\n}\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko, { PureComputed, Observable } from \"knockout\";\n\nexport type ReadonlyObservable<T> = {\n  getter: PureComputed<T>;\n  value: Observable<T>;\n};\n\nconst util = {\n  readonlyObservable<T>(value: T): ReadonlyObservable<T> {\n    const obs = ko.observable(value);\n    return {\n      getter: ko.pureComputed(() => obs()),\n      value: obs,\n    };\n  },\n};\n\nexport default util;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport {\n  CoreViewer,\n  Navigation,\n  ReadyState,\n  PageProgression,\n  profiler,\n  ZoomType,\n} from \"@vivliostyle/core\";\nimport ko, { Observable, PureComputed } from \"knockout\";\n\nimport DocumentOptions from \"../models/document-options\";\nimport ViewerOptions from \"../models/viewer-options\";\nimport Logger from \"../logging/logger\";\nimport obs, { ReadonlyObservable } from \"../utils/observable-util\";\n\ntype State = {\n  status: PureComputed<ReadyState>;\n  pageProgression: PureComputed<PageProgression>;\n  navigatable?: PureComputed<boolean>;\n  fixedLayout?: Observable<boolean>;\n};\n\ntype PrivateState = {\n  status: ReadonlyObservable<ReadyState>;\n  pageProgression: ReadonlyObservable<PageProgression>;\n};\n\nexport type ViewerSettings = {\n  userAgentRootURL: string;\n  viewportElement: HTMLElement;\n  debug: boolean;\n};\n\nclass Viewer {\n  private viewerOptions: ViewerOptions;\n  private coreViewer: CoreViewer;\n  private privState: PrivateState;\n\n  documentOptions: null | DocumentOptions;\n  epage: Observable<number>;\n  epageCount: Observable<number>;\n  firstPage: Observable<boolean>;\n  inputUrl: Observable<string>;\n  rerenderTrigger: Observable<boolean>; // just flips valye.\n  state: State;\n  lastPage: Observable<boolean>;\n  tocVisible: Observable<boolean>;\n  tocPinned: Observable<boolean>;\n\n  constructor(viewerSettings?: ViewerSettings, viewerOptions?: ViewerOptions) {\n    this.viewerOptions = viewerOptions;\n    this.documentOptions = null;\n    this.coreViewer = new CoreViewer(viewerSettings, viewerOptions.toObject());\n    const privState1 = (this.privState = {\n      status: obs.readonlyObservable(ReadyState.LOADING),\n      pageProgression: obs.readonlyObservable(PageProgression.LTR),\n    });\n    this.state = {\n      status: privState1.status.getter.extend({\n        rateLimit: { timeout: 100, method: \"notifyWhenChangesStop\" },\n        notify: \"always\",\n      }),\n      navigatable: ko.pureComputed(\n        () =>\n          privState1.status.value() &&\n          privState1.status.value() !== ReadyState.LOADING,\n      ),\n      fixedLayout: ko.observable(),\n      pageProgression: privState1.pageProgression.getter,\n    };\n\n    this.epage = ko.observable();\n    this.epageCount = ko.observable();\n    this.firstPage = ko.observable();\n    this.lastPage = ko.observable();\n    this.tocVisible = ko.observable();\n    this.tocPinned = ko.observable();\n\n    this.inputUrl = ko.observable(\"\");\n    this.rerenderTrigger = ko.observable(false);\n    this.setupViewerEventHandler();\n    this.setupViewerOptionSubscriptions();\n\n    // for Vivliostyle CLI\n    window[\"coreViewer\"] = this.coreViewer;\n  }\n\n  setupViewerEventHandler(): void {\n    const logger = Logger.getLogger();\n    this.coreViewer.addListener(\"debug\", (payload) => {\n      logger.debug(payload.content);\n    });\n    this.coreViewer.addListener(\"info\", (payload) => {\n      logger.info(payload.content);\n    });\n    this.coreViewer.addListener(\"warn\", (payload) => {\n      logger.warn(payload.content);\n    });\n    this.coreViewer.addListener(\"error\", (payload) => {\n      logger.error(payload.content);\n    });\n    this.coreViewer.addListener(\"readystatechange\", () => {\n      const readyState = this.coreViewer.readyState;\n      if (\n        readyState === ReadyState.INTERACTIVE ||\n        readyState === ReadyState.COMPLETE\n      ) {\n        this.privState.pageProgression.value(\n          this.coreViewer.getCurrentPageProgression(),\n        );\n      }\n      this.privState.status.value(readyState);\n    });\n    this.coreViewer.addListener(\"loaded\", () => {\n      if (this.viewerOptions.profile()) {\n        profiler.printTimings();\n      }\n      this.rerenderTrigger(!this.rerenderTrigger());\n    });\n    let timeoutID = 0;\n    this.coreViewer.addListener(\"nav\", (payload) => {\n      const { cfi, first, last, epage, epageCount, metadata, docTitle } =\n        payload;\n      this.rerenderTrigger(!this.rerenderTrigger());\n      if (cfi) {\n        if (timeoutID) {\n          // Prevent SecurityError,\n          // \"Too many calls to Location or History APIs within a short timeframe\" (Firefox)\n          // \"Attempt to use history.replaceState() more than 100 times per 30 seconds\" (Safari)\n          window.clearTimeout(timeoutID);\n        }\n        timeoutID = window.setTimeout(() => {\n          this.documentOptions.fragment(cfi);\n          timeoutID = 0;\n        }, 300);\n      }\n\n      // Note that `this.epage(epage)` has to be set before `this.lastPage(last)`\n      // because `this.lastPage(last)` invokes `navigation.totalPages()` that\n      // calls `navigation.pageNumber()` that uses `this.epage()`.\n\n      if (epage !== undefined) {\n        this.epage(epage);\n      }\n      if (epageCount !== undefined) {\n        this.epageCount(epageCount);\n      }\n      if (first !== undefined) {\n        this.firstPage(first);\n      }\n      if (last !== undefined) {\n        this.lastPage(last);\n      }\n      if (metadata || docTitle) {\n        let title = document.title;\n        const pubTitle =\n          metadata?.[\"http://purl.org/dc/terms/title\"]?.[0]?.[\"v\"];\n        if (!pubTitle) {\n          title = docTitle ? docTitle : \"Vivliostyle Viewer\";\n        } else if (\n          !docTitle ||\n          docTitle === pubTitle ||\n          this.firstPage() ||\n          /\\.xhtml$/.test(docTitle)\n        ) {\n          // ignore ugly titles copied from *.xhtml file name\n          title = pubTitle;\n        } else {\n          title = `${docTitle} | ${pubTitle}`;\n        }\n        if (title !== document.title) {\n          document.title = title;\n        }\n        const layout =\n          metadata?.[\"http://www.idpf.org/vocab/rendition/#layout\"]?.[0]?.[\"v\"];\n        if (layout) {\n          this.state.fixedLayout(layout === \"pre-paginated\");\n        }\n      }\n\n      const tocVisibleOld = this.tocVisible();\n      const tocVisibleNew = this.coreViewer.isTOCVisible();\n      if (tocVisibleOld && !tocVisibleNew) {\n        // When resize, TOC box will be regenerated and hidden temporarily.\n        // So keep TOC toggle button status on.\n      } else {\n        this.tocVisible(tocVisibleNew);\n      }\n    });\n    this.coreViewer.addListener(\"hyperlink\", (payload) => {\n      if (payload.internal) {\n        window.history.pushState(null, null);\n        this.navigateToInternalUrl(payload.href);\n\n        // When navigate from TOC, TOC box may or may not become hidden by autohide.\n        // Here set tocVisible false and it may become true again in \"nav\" event.\n        if (this.tocVisible()) {\n          this.tocVisible(false);\n        }\n\n        document.getElementById(\"vivliostyle-viewer-viewport\").focus();\n      } else {\n        window.location.href = payload.href;\n      }\n    });\n  }\n\n  setupViewerOptionSubscriptions(): void {\n    ko.computed(() => {\n      const viewerOptions = this.viewerOptions.toObject();\n      this.coreViewer.setOptions(viewerOptions);\n    }).extend({ rateLimit: 0 });\n  }\n\n  loadDocument(\n    documentOptions: DocumentOptions,\n    viewerOptions?: ViewerOptions,\n  ): void {\n    this.privState.status.value(ReadyState.LOADING);\n    if (viewerOptions) {\n      this.viewerOptions.copyFrom(viewerOptions);\n    }\n    this.documentOptions = documentOptions;\n\n    if (documentOptions.srcUrls()) {\n      if (!documentOptions.bookMode()) {\n        this.coreViewer.loadDocument(\n          documentOptions.srcUrls(),\n          documentOptions.toObject(),\n          this.viewerOptions.toObject(),\n        );\n      } else {\n        this.coreViewer.loadPublication(\n          documentOptions.srcUrls()[0],\n          documentOptions.toObject(),\n          this.viewerOptions.toObject(),\n        );\n      }\n    } else {\n      // No document specified, show welcome page\n      this.privState.status.value(undefined);\n    }\n  }\n\n  navigateToPrevious(): void {\n    this.coreViewer.navigateToPage(Navigation.PREVIOUS);\n  }\n\n  navigateToNext(): void {\n    this.coreViewer.navigateToPage(Navigation.NEXT);\n  }\n\n  navigateToLeft(): void {\n    this.coreViewer.navigateToPage(Navigation.LEFT);\n  }\n\n  navigateToRight(): void {\n    this.coreViewer.navigateToPage(Navigation.RIGHT);\n  }\n\n  navigateToFirst(): void {\n    this.coreViewer.navigateToPage(Navigation.FIRST);\n  }\n\n  navigateToLast(): void {\n    this.coreViewer.navigateToPage(Navigation.LAST);\n  }\n\n  navigateToEPage(epage: number): void {\n    this.coreViewer.navigateToPage(Navigation.EPAGE, epage);\n  }\n\n  navigateToInternalUrl(href: string): void {\n    this.coreViewer.navigateToInternalUrl(href);\n  }\n\n  navigateToPosition(position: {\n    spineIndex: number;\n    pageIndex?: number;\n    offsetInItem?: number;\n  }): void {\n    this.coreViewer.navigateToPosition(position);\n  }\n\n  queryZoomFactor(type: ZoomType): number {\n    return this.coreViewer.queryZoomFactor(type);\n  }\n\n  epageToPageNumber(epage: number | undefined): number {\n    if (!epage && epage != 0) {\n      return undefined;\n    }\n    const pageNumber = Math.round(epage + 1);\n    return pageNumber;\n  }\n  epageFromPageNumber(pageNumber: number | undefined): number {\n    if (!pageNumber && pageNumber != 0) {\n      return undefined;\n    }\n    const epage = pageNumber - 1;\n    return epage;\n  }\n\n  showTOC(shown?: boolean, autoHide?: boolean): void {\n    if (this.coreViewer.isTOCVisible() == null) {\n      // TOC is unavailable\n      return;\n    }\n    const show = shown == null ? !this.tocVisible() : shown;\n    this.tocVisible(show);\n    this.tocPinned(show ? !autoHide : false);\n    this.coreViewer.showTOC(show, autoHide);\n  }\n}\n\nexport default Viewer;\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n// cf. http://www.w3.org/TR/DOM-Level-3-Events-key/\nconst Keys = {\n  Unidentified: \"Unidentified\",\n  ArrowDown: \"ArrowDown\",\n  ArrowLeft: \"ArrowLeft\",\n  ArrowRight: \"ArrowRight\",\n  ArrowUp: \"ArrowUp\",\n  Home: \"Home\",\n  End: \"End\",\n  PageDown: \"PageDown\",\n  PageUp: \"PageUp\",\n  Escape: \"Escape\",\n  Enter: \"Enter\",\n  Space: \" \",\n};\n\n// CAUTION: This function covers only part of common keys on a keyboard. Keys not covered by the implementation are identified as KeyboardEvent.key, KeyboardEvent.keyIdentifier, or \"Unidentified\".\nfunction identifyKeyFromEvent(\n  event: KeyboardEvent,\n): (typeof Keys)[keyof typeof Keys] {\n  const key = event.key;\n  const keyIdentifier = (event as KeyboardEvent & { keyIdentifier: string })\n    .keyIdentifier;\n  const location = event.location;\n  if (key === Keys.ArrowDown || key === \"Down\" || keyIdentifier === \"Down\") {\n    if (event.metaKey) {\n      // Mac Cmd+Down -> End\n      return Keys.End;\n    }\n    return Keys.ArrowDown;\n  } else if (\n    key === Keys.ArrowLeft ||\n    key === \"Left\" ||\n    keyIdentifier === \"Left\"\n  ) {\n    return Keys.ArrowLeft;\n  } else if (\n    key === Keys.ArrowRight ||\n    key === \"Right\" ||\n    keyIdentifier === \"Right\"\n  ) {\n    return Keys.ArrowRight;\n  } else if (key === Keys.ArrowUp || key === \"Up\" || keyIdentifier === \"Up\") {\n    if (event.metaKey) {\n      // Mac Cmd+Up -> Home\n      return Keys.Home;\n    }\n    return Keys.ArrowUp;\n  } else if (\n    key === Keys.Escape ||\n    key === \"Esc\" ||\n    keyIdentifier === \"U+001B\"\n  ) {\n    return Keys.Escape;\n  } else if (key === Keys.Enter || keyIdentifier === \"Enter\") {\n    return Keys.Enter;\n  } else if (key === Keys.Space || keyIdentifier === \"U+0020\") {\n    return Keys.Space;\n  } else if (key === \"0\" || keyIdentifier === \"U+0030\") {\n    return \"0\";\n  } else if (\n    key === \"+\" ||\n    key === \"Add\" ||\n    keyIdentifier === \"U+002B\" ||\n    keyIdentifier === \"U+00BB\" ||\n    (keyIdentifier === \"U+004B\" &&\n      location ===\n        KeyboardEvent.DOM_KEY_LOCATION_NUMPAD) /* workaround for Chrome for Windows */\n  ) {\n    return \"+\";\n  } else if (\n    key === \"-\" ||\n    key === \"Subtract\" ||\n    keyIdentifier === \"U+002D\" ||\n    keyIdentifier === \"U+00BD\" ||\n    (keyIdentifier === \"U+004D\" &&\n      location ===\n        KeyboardEvent.DOM_KEY_LOCATION_NUMPAD) /* workaround for Chrome for Windows */\n  ) {\n    return \"-\";\n  } else {\n    return key || keyIdentifier || Keys.Unidentified;\n  }\n}\n\nexport default {\n  Keys,\n  identifyKeyFromEvent,\n};\n","/*\n * Copyright 2023 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nexport const applyTransformToRect = (\n  rect: DOMRect,\n  parentRect: DOMRect,\n): DOMRect => {\n  let x = rect.x - parentRect.x;\n  let y = rect.y - parentRect.y;\n  let width = rect.width;\n  let height = rect.height;\n  const style = document.getElementById(\"vivliostyle-viewer-viewport\").style;\n  const scaleValue = parseFloat(\n    style.getPropertyValue(\"--viv-outputScale\") || \"1\",\n  );\n  if (scaleValue && !isNaN(scaleValue)) {\n    x /= scaleValue;\n    y /= scaleValue;\n    width /= scaleValue;\n    height /= scaleValue;\n  }\n  return new DOMRect(x, y, width, height);\n};\n","/*\n * Copyright 2023 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { i18n } from \"i18next-ko\";\nimport ko, { Computed, Observable, ObservableArray } from \"knockout\";\nimport ViewerOptions from \"../models/viewer-options\";\nimport Viewer from \"./viewer\";\nimport urlParameters from \"../stores/url-parameters\";\nimport { applyTransformToRect } from \"../utils/scale-util\";\n\nconst t = i18n.t.bind(i18n);\n\nconst colorNameToColor = (name: string): string => {\n  switch (name) {\n    case \"red\":\n      return \"rgba(255,0, 0,0.2)\";\n    case \"green\":\n      return \"rgba(0,255,0,0.2)\";\n    case \"yellow\":\n      return \"rgba(255,217,0,0.3)\";\n    default:\n      return \"\";\n  }\n};\n\nconst getNextNode = (node: Node): Node | undefined => {\n  if (node.firstChild) {\n    return node.firstChild;\n  }\n  while (node) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n    node = node.parentNode;\n  }\n};\n\nconst isNodeInEloff = (node: Node): boolean => {\n  let e: Element;\n  if (node.nodeType == 1) {\n    e = node as Element;\n  } else {\n    e = node.parentElement;\n  }\n  return !!e.closest(\"[data-adapt-eloff]\");\n};\n\ninterface TextInRange {\n  t: Text;\n  startOffset: number;\n  endOffset: number;\n}\n\nconst isTextIgnorable = (text: Text): boolean => {\n  return !!text.parentElement.closest(\"rt,[data-adapt-spec]\");\n};\n\nconst collectTextWithEloffInRange = (\n  start: NodePosition,\n  end: NodePosition,\n): TextInRange[] => {\n  const nodes: TextInRange[] = [];\n  for (let node = start.node; node; node = getNextNode(node)) {\n    if (\n      node.nodeType == 3 &&\n      !isTextIgnorable(node as Text) &&\n      isNodeInEloff(node)\n    ) {\n      const t = node as Text;\n      if (t.data.trim().length > 0) {\n        const startOffset = node == start.node ? start.offset : 0;\n        const endOffset = node == end.node ? end.offset : t.data.length;\n        if (endOffset > startOffset) {\n          nodes.push({ t, startOffset, endOffset });\n        }\n      }\n    }\n    if (node == end.node) {\n      break;\n    }\n  }\n  return nodes;\n};\n\nconst textNodeRects = (tn: TextInRange): DOMRect[] => {\n  const r = document.createRange();\n  r.setStart(tn.t, tn.startOffset);\n  r.setEnd(tn.t, tn.endOffset);\n  return [...r.getClientRects()];\n};\n\nconst markExistIn = (markId: string, e: Element): boolean => {\n  return !!e.querySelector(`[${Mark.idAttr}=\"${markId}\"]`);\n};\n\nconst estimateLastEndFromStart = (\n  start: NodePosition,\n  actualEndPos: SelectPosition,\n): NodePosition => {\n  let end: Text = start.node as Text;\n\n  for (let node = start.node; node; node = getNextNode(node)) {\n    if (node.nodeType == 1) {\n      const e = node as Element;\n      if (e.hasAttribute(\"data-vivliostyle-outer-zoom-box\")) {\n        break;\n      }\n      if (e.hasAttribute(\"data-vivliostyle-page-container\")) {\n        if (getSpineIndex(e) > actualEndPos.spineIndex) {\n          break;\n        }\n      }\n    }\n    if (node.nodeType == 3 && isNodeInEloff(node)) {\n      end = node as Text;\n    }\n  }\n  return { node: end, offset: end.data.length };\n};\n\ninterface HighlightStyle {\n  background?: string;\n}\n\nconst applyStyle = (e: HTMLElement, style: HighlightStyle): void => {\n  if (style.background) {\n    e.style.background = style.background;\n  }\n};\n\nconst highlight = (\n  start: NodePosition,\n  end: NodePosition,\n  style: HighlightStyle,\n  mark?: Mark,\n): string => {\n  const startParent = start.node.parentElement.closest(\n    \"[data-vivliostyle-page-container='true']\",\n  );\n  const endParent = end.node.parentElement.closest(\n    \"[data-vivliostyle-page-container='true']\",\n  );\n  if (\n    mark &&\n    markExistIn(mark.uniqueIdentifier, startParent) &&\n    markExistIn(mark.uniqueIdentifier, endParent)\n  ) {\n    // already exists;\n    return \"\";\n  }\n  const textNodes = collectTextWithEloffInRange(start, end);\n  const selectId = mark?.uniqueIdentifier || Mark.notCreatedId;\n  const invokeMenu = (event: MouseEvent): void => {\n    const x = event.clientX;\n    const y = event.clientY;\n    marksMenuStatus.openEditMenu(x, y, selectId);\n  };\n\n  let index = 0;\n  const texts: string[] = [];\n  textNodes.forEach((tn) => {\n    texts.push(tn.t.data.slice(tn.startOffset, tn.endOffset));\n    const parent = tn.t.parentElement.closest(\n      \"[data-vivliostyle-page-container='true']\",\n    );\n    const parentRect = parent.getBoundingClientRect();\n    const pageIndex = getPageIndex(parent);\n    const spineIndex = getSpineIndex(parent);\n    for (const r of textNodeRects(tn)) {\n      const rect = applyTransformToRect(r, parentRect);\n      const rectNum = index++;\n      const mn = `${spineIndex}-${pageIndex}-${rectNum}`;\n      if (\n        document.querySelector(\n          `[${Mark.idAttr}='${selectId}'][data-mn='${mn}']`,\n        )\n      ) {\n        return;\n      }\n      const div = document.createElement(\"div\");\n      div.style.position = \"absolute\";\n      div.style.margin = \"0\";\n      div.style.padding = \"0\";\n      div.style.top = `${rect.top}px`;\n      div.style.left = `${rect.left}px`;\n      div.style.width = `${rect.width}px`;\n      div.style.height = `${rect.height}px`;\n      applyStyle(div, style);\n      div.setAttribute(Mark.idAttr, selectId);\n      div.setAttribute(\"data-mn\", `${mn}`);\n      div.addEventListener(\"click\", invokeMenu);\n      parent.appendChild(div);\n    }\n  });\n  return texts.join(\"\");\n};\n\nconst getPageIndex = (pageElement: Element): number => {\n  const p = parseInt(pageElement.getAttribute(\"data-vivliostyle-page-index\"));\n  if (isNaN(p)) {\n    return -1;\n  }\n  return p;\n};\n\nconst getSpineIndex = (pageElement: Element): number => {\n  const p = parseInt(pageElement.getAttribute(\"data-vivliostyle-spine-index\"));\n  if (isNaN(p)) {\n    return -1;\n  }\n  return p;\n};\n\nconst selectedNodeToPosition = (node: Node, offset: number): SelectPosition => {\n  const pageElement = node.parentElement.closest(\n    \"[data-vivliostyle-page-container]\",\n  );\n  const spineIndex: number = getSpineIndex(pageElement);\n  const e = node.parentElement.closest(\"[data-adapt-eloff]\");\n  const nodePath: Node[] = [];\n  let n = node;\n  while (n && n !== e) {\n    nodePath.unshift(n);\n    n = n.parentElement;\n  }\n  const eloff = parseInt(e.getAttribute(\"data-adapt-eloff\"));\n  let offsetInItem = eloff + offset;\n  const es = collectElementsWithEloff(spineIndex, eloff);\n  let count = 0;\n  let lastNodeType = -1;\n  let lastNodeTextLength = 0;\n  for (const siblingE of es.values()) {\n    if (siblingE == e) {\n      break;\n    }\n    const children = [...siblingE.childNodes].filter(\n      (x) =>\n        !(x.nodeType == 1 && (x as Element).hasAttribute(\"data-adapt-spec\")),\n    );\n    let childrenCount = children.length;\n    if (childrenCount > 0) {\n      offsetInItem += children\n        .map((child) => child.textContent.length)\n        .reduce((a, b) => a + b);\n\n      if (children[0].nodeType == 3 && lastNodeType == 3) {\n        childrenCount -= 1;\n      }\n      const lastNode = children[children.length - 1];\n      lastNodeType = lastNode.nodeType;\n      if (lastNodeType == 3) {\n        lastNodeTextLength += (lastNode as Text).data.length;\n      } else {\n        lastNodeTextLength = 0;\n      }\n    }\n    count += childrenCount;\n  }\n  const children = [...e.childNodes].filter(\n    (x) => !(x.nodeType == 1 && (x as Element).hasAttribute(\"data-adapt-spec\")),\n  );\n  const nodeIndex = children.indexOf(nodePath[0] as ChildNode);\n  if (nodeIndex > 0) {\n    offsetInItem += children\n      .map((child, i) => (i < nodeIndex ? child.textContent.length : 0))\n      .reduce((a, b) => a + b);\n  }\n  const nodeIndexPath = [];\n  if (nodeIndex == 0 && nodePath[0].nodeType == 3 && lastNodeType == 3) {\n    offset += lastNodeTextLength;\n    if (nodePath.length > 1) {\n      // should not occur\n      console.warn(\n        \"should not reach here; nodePath[0] is text and nodePath is deeper\",\n      );\n    }\n    nodeIndexPath.push(count - 1);\n  } else {\n    count += nodeIndex + 1;\n    if (lastNodeType == 3 && children[0].nodeType == 3) {\n      count--;\n    }\n    nodeIndexPath.push(count - 1);\n    // go deeper\n    let i = 0;\n    while (i < nodePath.length - 1) {\n      const ct = [...nodePath[i].childNodes].indexOf(\n        nodePath[i + 1] as ChildNode,\n      );\n      nodeIndexPath.push(ct);\n      i++;\n    }\n  }\n\n  return new SelectPosition(\n    spineIndex,\n    eloff,\n    nodeIndexPath,\n    offset,\n    offsetInItem,\n  );\n};\n\ninterface NodePosition {\n  node: Node;\n  offset: number;\n}\n\nconst selectedPositionToNode = (pos: SelectPosition): NodePosition | null => {\n  const es = collectElementsWithEloff(pos.spineIndex, pos.eloff);\n  let count = 0;\n  let lastNodeType = -1;\n  let lastNodeTextLength = 0;\n  let targetNode: Text | undefined;\n  for (const siblingE of es.values()) {\n    const children = [...siblingE.childNodes].filter(\n      (x) =>\n        !(x.nodeType == 1 && (x as Element).hasAttribute(\"data-adapt-spec\")),\n    );\n    const childrenCount = children.length;\n    if (childrenCount > 0) {\n      if (children[0].nodeType == 3 && lastNodeType == 3) {\n        count--;\n      }\n      const nextCount = count + childrenCount;\n      if (nextCount > pos.nodePath[0]) {\n        if (count == pos.nodePath[0] && children[0].nodeType == 3) {\n          // maybe the result is in the first node\n          const targetCandidate = children[0] as Text;\n          if (\n            lastNodeTextLength <= pos.offset &&\n            pos.offset <= lastNodeTextLength + targetCandidate.data.length\n          ) {\n            targetNode = targetCandidate;\n            break;\n          }\n        } else if (\n          nextCount == pos.nodePath[0] + 1 &&\n          children[children.length - 1].nodeType == 3\n        ) {\n          // maybe the result is the last node\n          const targetCandidate = children[children.length - 1] as Text;\n          if (pos.offset <= targetCandidate.data.length) {\n            targetNode = targetCandidate;\n            lastNodeTextLength = 0;\n            break;\n          }\n        } else {\n          // the result is the specified node\n          let target = children[pos.nodePath[0] - count];\n          for (let i = 1; i < pos.nodePath.length; i++) {\n            if (\n              target.childNodes &&\n              target.childNodes.length > pos.nodePath[i]\n            ) {\n              target = target.childNodes[pos.nodePath[i]];\n            } else {\n              // should not reach here, this is a workaround.\n            }\n          }\n          targetNode = target as Text;\n          lastNodeTextLength = 0;\n          break;\n        }\n      }\n      const lastNode = children[children.length - 1];\n      lastNodeType = lastNode.nodeType;\n      if (lastNodeType == 3) {\n        lastNodeTextLength += (lastNode as Text).data.length;\n      } else {\n        lastNodeTextLength = 0;\n      }\n    }\n    count += childrenCount;\n  }\n  if (targetNode) {\n    return { node: targetNode, offset: pos.offset - lastNodeTextLength };\n  }\n  return null;\n};\n\nconst collectElementsWithEloff = (\n  spineIndex: number,\n  eloff: number,\n): Element[] => {\n  const eloffAttrSelector = `[data-vivliostyle-spine-index='${spineIndex}'] [data-adapt-eloff='${eloff}']`;\n  return Array.from(document.querySelectorAll(eloffAttrSelector)).filter(\n    (e) => !e.querySelector(eloffAttrSelector),\n  );\n};\n\nclass SelectPosition {\n  constructor(\n    readonly spineIndex: number,\n    readonly eloff: number,\n    readonly nodePath: number[],\n    readonly offset: number,\n    readonly offsetInItem: number,\n  ) {}\n\n  toString(): string {\n    return `${this.spineIndex}-${this.eloff}-${this.nodePath.join(\"/\")}-${\n      this.offset\n    }-${this.offsetInItem}`;\n  }\n\n  static fromString(str: string): SelectPosition {\n    const [spineIndex, eloff, nodePathString, offset, offsetInItem] = str\n      .split(\"-\")\n      .map((x) => x.trim());\n    const nodePath = nodePathString.split(\"/\").map((x) => parseInt(x));\n    return new SelectPosition(\n      parseInt(spineIndex),\n      parseInt(eloff),\n      nodePath,\n      parseInt(offset),\n      parseInt(offsetInItem),\n    );\n  }\n}\n\nclass Mark {\n  uniqueIdentifier?: string;\n  static readonly idAttr = \"data-viv-marker-id\";\n  static readonly notCreatedId = \"not-created\";\n  constructor(\n    public start: SelectPosition,\n    public end: SelectPosition,\n    public color: string,\n    public memo: string,\n    public markedText: string,\n  ) {\n    this.uniqueIdentifier = Mark.notCreatedId;\n  }\n\n  markInfoString(): string {\n    return `${this.start},${this.end},${this.color}`;\n  }\n\n  toMarkJson(): MarkJson {\n    return {\n      mark: this.markInfoString(),\n      id: this.uniqueIdentifier,\n      memo: this.memo,\n      markedText: this.markedText,\n    };\n  }\n\n  isPersisted(): boolean {\n    return this.uniqueIdentifier && this.uniqueIdentifier != Mark.notCreatedId;\n  }\n\n  static fromMarkInfoString(str: string): Mark {\n    const [s, e, c] = str.split(\",\");\n    const start = SelectPosition.fromString(s);\n    const end = SelectPosition.fromString(e);\n    const m = new Mark(start, end, c, \"\", \"\");\n    return m;\n  }\n\n  static fromMarkJson(m: MarkJson): Mark {\n    const mark = Mark.fromMarkInfoString(m.mark);\n    mark.uniqueIdentifier = m.id;\n    mark.memo = m.memo;\n    mark.markedText = m.markedText;\n    return mark;\n  }\n}\n\nexport const processSelection = (selection: Selection): void => {\n  marksMenuStatus.openStartButton(selection);\n};\n\ninterface MarkAction {\n  currentId(): string;\n  deletable(): boolean;\n  cancellable(): boolean;\n  applyEditing(): Promise<void>;\n  colorChanged(): Promise<void>;\n  deleteCurrentEditing(): Promise<void>;\n  close(): Promise<void>;\n}\n\nclass EmptyMarkAction implements MarkAction {\n  currentId(): string {\n    return \"\";\n  }\n  deletable(): boolean {\n    return false;\n  }\n  cancellable(): boolean {\n    return false;\n  }\n  applyEditing(): Promise<void> {\n    return;\n  }\n  colorChanged(): Promise<void> {\n    return;\n  }\n  deleteCurrentEditing(): Promise<void> {\n    return;\n  }\n  close(): Promise<void> {\n    return;\n  }\n}\nclass NewMarkAction implements MarkAction {\n  currentStart?: SelectPosition;\n  currentEnd?: SelectPosition;\n  currentText?: string;\n  start = (\n    currentStart: SelectPosition,\n    currentEnd: SelectPosition,\n  ): boolean => {\n    this.currentStart = currentStart;\n    this.currentEnd = currentEnd;\n    const start = selectedPositionToNode(this.currentStart);\n    const end = selectedPositionToNode(this.currentEnd);\n    if (start && end) {\n      const color = colorNameToColor(marksMenuStatus.currentEditingColor());\n      this.currentText = highlight(start, end, { background: color });\n      return true;\n    }\n    return false;\n  };\n\n  deletable = (): boolean => false;\n  cancellable = (): boolean => true;\n  deleteCurrentEditing = async (): Promise<void> => {\n    // do nothing\n  };\n  currentId = (): string => Mark.notCreatedId;\n  applyEditing = async (): Promise<void> => {\n    if (this.currentStart && this.currentEnd) {\n      const mark = new Mark(\n        this.currentStart,\n        this.currentEnd,\n        marksMenuStatus.currentEditingColor(),\n        marksMenuStatus.currentEditingMemo(),\n        this.currentText,\n      );\n      await marksStore.persistMark(mark);\n    }\n    marksMenuStatus.closeMenu();\n  };\n\n  colorChanged = async (): Promise<void> => {\n    if (this.cancellable() == false) {\n      this.applyEditing();\n    }\n  };\n\n  close = async (): Promise<void> => {\n    document\n      .querySelectorAll(`[${Mark.idAttr}=\"${Mark.notCreatedId}\"]`)\n      .forEach((e) => {\n        e.remove();\n      });\n  };\n}\n\nclass EditAction implements MarkAction {\n  currentEditing?: Mark;\n  deletable = (): boolean => true;\n  cancellable = (): boolean => true;\n  deleteCurrentEditing = async (): Promise<void> => {\n    if (this.currentEditing) {\n      await marksStore.removeMark(this.currentEditing);\n    }\n  };\n\n  currentId = (): string => {\n    return this.currentEditing?.uniqueIdentifier;\n  };\n\n  applyEditing = async (): Promise<void> => {\n    if (this.currentEditing) {\n      if (\n        marksMenuStatus.currentEditingColor() != this.currentEditing.color ||\n        marksMenuStatus.currentEditingMemo() != this.currentEditing.memo\n      ) {\n        this.currentEditing.color = marksMenuStatus.currentEditingColor();\n        this.currentEditing.memo = marksMenuStatus.currentEditingMemo();\n        marksStore.updateMark(this.currentEditing);\n      }\n    }\n    marksMenuStatus.closeMenu();\n  };\n  colorChanged = async (): Promise<void> => {\n    // do nothing.\n  };\n\n  close = async (): Promise<void> => {\n    if (this.currentEditing) {\n      const color = colorNameToColor(this.currentEditing.color);\n      if (color.length > 0) {\n        document\n          .querySelectorAll(\n            `[${Mark.idAttr}=\"${this.currentEditing.uniqueIdentifier}\"]`,\n          )\n          .forEach((e) => {\n            (e as HTMLElement).style.background = color;\n          });\n      }\n      this.currentEditing = undefined;\n    }\n  };\n}\n\nexport class MarksMenuStatus {\n  menuOpened: Observable<boolean>;\n  startButtonOpened: Observable<boolean>;\n  currentEditingColor: Observable<string>;\n  currentEditingMemo: Observable<string>;\n  deletable: Computed<boolean>;\n  cancellable: Computed<boolean>;\n  markAction: Observable<MarkAction>;\n  emptyAction: EmptyMarkAction;\n  editAction: EditAction;\n  newMarkAction: NewMarkAction;\n\n  constructor(private parent: MarksStoreFacade) {\n    this.menuOpened = ko.observable(false);\n    this.startButtonOpened = ko.observable(false);\n    this.currentEditingColor = ko.observable(\"\");\n    this.currentEditingMemo = ko.observable(\"\");\n    this.currentEditingColor.subscribe(this.editingColorChanged);\n    this.editAction = new EditAction();\n    this.newMarkAction = new NewMarkAction();\n    this.emptyAction = new EmptyMarkAction();\n    this.markAction = ko.observable(this.emptyAction);\n    this.deletable = ko\n      .pureComputed(() => this.markAction().deletable())\n      .extend({ notify: \"always\" });\n    this.cancellable = ko\n      .pureComputed(() => this.markAction().cancellable())\n      .extend({ notify: \"always\" });\n  }\n\n  init(): void {\n    // Make the menu draggable\n    const menu = document.getElementById(\n      \"vivliostyle-text-selection-edit-menu\",\n    ) as HTMLElement;\n\n    let x = 0;\n    let y = 0;\n\n    const mouseMove = (e: MouseEvent): void => {\n      const dx = e.clientX - x;\n      const dy = e.clientY - y;\n      x = e.clientX;\n      y = e.clientY;\n      menu.style.top = `${menu.offsetTop + dy}px`;\n      menu.style.left = `${menu.offsetLeft + dx}px`;\n    };\n\n    menu.addEventListener(\"mousedown\", (e: MouseEvent): void => {\n      if ((e.target as Element).id === \"vivliostyle-memo-edit-area\") {\n        // prevent dragging when editing\n        return;\n      }\n      x = e.clientX;\n      y = e.clientY;\n      document.addEventListener(\"mousemove\", mouseMove);\n      document.addEventListener(\"mouseup\", () => {\n        document.removeEventListener(\"mousemove\", mouseMove);\n      });\n    });\n  }\n\n  editingColorChanged = async (colorName: string): Promise<void> => {\n    if (!marksStore.enabled()) return;\n    const idString = this.markAction().currentId();\n    const color = colorNameToColor(colorName);\n    if (color.length > 0) {\n      document\n        .querySelectorAll(`[${Mark.idAttr}=\"${idString}\"]`)\n        .forEach((e) => {\n          (e as HTMLElement).style.background = color;\n        });\n    }\n    await this.markAction().colorChanged();\n  };\n\n  private openMenu = (x: number, y: number): void => {\n    if (this.menuOpened()) {\n      return;\n    }\n    const menu = document.getElementById(\n      \"vivliostyle-text-selection-edit-menu\",\n    ) as HTMLElement;\n    if (menu) {\n      menu.style.top = `${y}px`;\n      menu.style.left = `${x}px`;\n    }\n    const subscription = this.menuOpened.subscribe((v) => {\n      if (v) {\n        const menu = document.getElementById(\n          \"vivliostyle-text-selection-edit-menu\",\n        ) as HTMLElement;\n        const outer = document.querySelector(\n          \"[data-vivliostyle-outer-zoom-box]\",\n        ) as HTMLElement;\n        if (menu && outer) {\n          const mb = menu.getBoundingClientRect();\n          const ob = outer.getBoundingClientRect();\n          let left = x - mb.width;\n          if (left + mb.width > ob.right) {\n            left = ob.right - mb.width - 10;\n          }\n          if (left < ob.left) {\n            left = ob.left;\n          }\n          menu.style.left = `${left}px`;\n          if (mb.bottom > ob.bottom) {\n            menu.style.top = `${ob.bottom - mb.height - 10}px`;\n          }\n        }\n      }\n      subscription.dispose();\n    });\n    this.startButtonOpened(false);\n    this.menuOpened(true);\n  };\n\n  closeStartButton = (): void => {\n    if (!marksStore.enabled()) return;\n    this.startButtonOpened(false);\n  };\n\n  openEditMenu = async (x: number, y: number, id: string): Promise<void> => {\n    if (!marksStore.enabled()) return;\n    const currentEditing = await this.parent.getMark(id);\n    this.currentEditingColor(currentEditing.color);\n    this.currentEditingMemo(currentEditing.memo);\n    this.editAction.currentEditing = currentEditing;\n    this.markAction(this.editAction);\n    this.openMenu(x, y);\n  };\n\n  closeMenu = async (): Promise<void> => {\n    if (!marksStore.enabled()) return;\n    await this.markAction().close();\n    this.markAction(this.emptyAction);\n    this.menuOpened(false);\n  };\n\n  applyEditing = async (): Promise<void> => {\n    if (!marksStore.enabled()) return;\n    await this.markAction().applyEditing();\n  };\n\n  deleteCurrentEditing = async (): Promise<void> => {\n    if (!marksStore.enabled()) return;\n    if (confirm(t(\"CONFIRM_DELETE\"))) {\n      await this.markAction().deleteCurrentEditing();\n    }\n    await this.closeMenu();\n  };\n\n  openSelectionMenu = (\n    x: number,\n    y: number,\n    start: SelectPosition,\n    end: SelectPosition,\n    selection: Selection,\n  ): void => {\n    if (!marksStore.enabled()) return;\n    this.currentEditingColor(\"yellow\");\n    this.currentEditingMemo(\"\");\n    if (this.newMarkAction.start(start, end)) {\n      selection.empty();\n      this.markAction(this.newMarkAction);\n      this.openMenu(x, y);\n    }\n  };\n\n  openStartButton = async (selection: Selection): Promise<void> => {\n    if (!marksStore.enabled()) return;\n    if (selection.type == \"Range\") {\n      const range = selection.getRangeAt(0);\n      if (\n        !range.commonAncestorContainer.parentElement.closest(\n          \"[data-vivliostyle-outer-zoom-box]\",\n        )\n      ) {\n        // Selection is not good for creating a mark\n        return;\n      }\n      const button = document.getElementById(\n        \"vivliostyle-text-selection-start-button\",\n      ) as HTMLElement;\n      const rs = { node: range.startContainer, offset: range.startOffset };\n      const re = { node: range.endContainer, offset: range.endOffset };\n      const text = collectTextWithEloffInRange(rs, re);\n      if (text.length == 0) {\n        return;\n      }\n      // want to use map and flat, but the compiler option allows only es2018\n      const rects = text.reduce((acc, t) => {\n        return acc.concat(textNodeRects(t));\n      }, []);\n      if (rects.length == 0) {\n        return;\n      }\n      const start = selectedNodeToPosition(text[0].t, text[0].startOffset);\n      const end = selectedNodeToPosition(\n        text[text.length - 1].t,\n        text[text.length - 1].endOffset,\n      );\n      const x = rects[rects.length - 1].left;\n      const y = rects[rects.length - 1].bottom;\n      const clickListner = (e: MouseEvent): void => {\n        e.stopPropagation();\n        if (button) {\n          button.removeEventListener(\"click\", clickListner);\n        }\n        this.openSelectionMenu(x, y, start, end, selection);\n      };\n\n      if (button) {\n        button.style.top = `${y}px`;\n        button.style.left = `${x}px`;\n        button.addEventListener(\"click\", clickListner);\n      }\n\n      const subscription = this.startButtonOpened.subscribe((v) => {\n        if (v) {\n          const outer = document.querySelector(\n            \"[data-vivliostyle-outer-zoom-box]\",\n          ) as HTMLElement;\n          if (button && outer) {\n            const mb = button.getBoundingClientRect();\n            const ob = outer.getBoundingClientRect();\n            let left = x - mb.width; // shift to left\n            if (left + mb.width > ob.right) {\n              left = ob.right - mb.width - 10;\n            }\n            if (left < ob.left) {\n              left = ob.left;\n            }\n            button.style.left = `${left}px`;\n            if (mb.bottom > ob.bottom) {\n              button.style.top = `${ob.bottom - mb.height - 10}px`;\n            }\n          }\n        } else {\n          button.removeEventListener(\"click\", clickListner);\n          subscription.dispose();\n        }\n      });\n      this.startButtonOpened(true);\n    }\n  };\n}\n\nexport interface MarkJson {\n  mark: string;\n  id: string;\n  memo: string;\n  markedText: string;\n}\n\nexport interface MarksStoreInterface {\n  init(documentId: string): Promise<void>;\n  persistMark(mark: MarkJson): Promise<string>; // persists and return id\n  getMark(id: string): Promise<MarkJson>;\n  updateMark(mark: MarkJson): Promise<void>;\n  removeMark(mark: MarkJson): Promise<void>;\n  allMarks(): Promise<MarkJson[]>;\n  allMarksIterator?(): Promise<AsyncIterable<MarkJson>>; //\n}\n\nlet seqId = 0;\n\nexport class URLMarksStore implements MarksStoreInterface {\n  private markArray: MarkJson[] = [];\n  private markKeyToArrayIndex: Map<string, number>;\n  public documentId = \"\";\n\n  constructor() {\n    this.markKeyToArrayIndex = new Map();\n  }\n\n  async init(documentId: string): Promise<void> {\n    const marksParam = urlParameters.getParameter(\"mark\");\n    marksParam.forEach((m) => {\n      const mark = this.urlStringToMark(m);\n      this.pushMarkInternal(mark, \"doNotAddToUrl\", \"persist\");\n    });\n    this.documentId = documentId;\n  }\n\n  async persistMark(mark: MarkJson): Promise<string> {\n    return this.pushMarkInternal(mark, \"addToUrl\", \"persist\");\n  }\n\n  async updateMark(mark: MarkJson): Promise<void> {\n    await this.removeMark(mark);\n    this.pushMarkInternal(mark, \"addToUrl\", \"doNotPersist\");\n  }\n\n  async getMark(id: string): Promise<MarkJson> {\n    const index = this.markKeyToArrayIndex.get(id);\n    return this.markArray[index];\n  }\n\n  async removeMark(mark: MarkJson): Promise<void> {\n    const index = this.markKeyToArrayIndex.get(mark.id);\n    this.markArray.splice(index, 1);\n    this.markRemoved();\n  }\n\n  async allMarks(): Promise<MarkJson[]> {\n    return this.markArray;\n  }\n\n  async allMarksIterator(): Promise<AsyncIterable<MarkJson>> {\n    const arr = this.markArray;\n    return (async function* (): AsyncIterable<MarkJson> {\n      let i = 0;\n      while (i < arr.length) {\n        const v = arr[i++];\n        yield v;\n      }\n    })();\n  }\n\n  private markToURLString(mark: MarkJson): string {\n    const memo = mark.memo ? encodeURIComponent(mark.memo) : \"\";\n    const markedText = mark.markedText\n      ? encodeURIComponent(mark.markedText)\n      : \"\";\n    return `${mark.mark}%1F${memo}%1F${markedText}`;\n  }\n\n  private urlStringToMark(s: string): MarkJson {\n    const [mark, memo, markedText] = s.split(\"%1F\", 3);\n    return {\n      mark: mark,\n      id: \"\",\n      memo: memo ? decodeURIComponent(memo) : \"\",\n      markedText: markedText ? decodeURIComponent(markedText) : \"\",\n    };\n  }\n\n  private pushMarkInternal(\n    mark: MarkJson,\n    addToUrl: \"addToUrl\" | \"doNotAddToUrl\",\n    persist: \"persist\" | \"doNotPersist\",\n  ): string {\n    if (persist == \"persist\") {\n      mark.id = `${seqId++}`;\n    }\n    this.markArray.push(mark);\n    this.markKeyToArrayIndex.set(mark.id, this.markArray.length - 1);\n    if (addToUrl == \"addToUrl\") {\n      const count = urlParameters.getParameter(\"mark\").length;\n      urlParameters.setParameter(\"mark\", this.markToURLString(mark), count);\n    }\n    return mark.id;\n  }\n\n  private async markRemoved(): Promise<void> {\n    this.markKeyToArrayIndex.clear();\n    urlParameters.removeParameter(\"mark\");\n    this.markArray.forEach((m, i) => {\n      urlParameters.setParameter(\"mark\", this.markToURLString(m), i);\n      this.markKeyToArrayIndex.set(m.id, i);\n    });\n  }\n}\n\nexport class MarksBox {\n  detailsElement: HTMLDetailsElement;\n  pinned: Observable<boolean>;\n  list: ObservableArray<Mark>;\n\n  constructor(private parent: MarksStoreFacade) {\n    this.pinned = ko.observable(false);\n    this.list = ko.observableArray();\n  }\n\n  init(): void {\n    this.detailsElement = document.getElementById(\n      \"vivliostyle-marks-box\",\n    ) as HTMLDetailsElement;\n  }\n\n  addMarkToList(mark: Mark): void {\n    let index = -1;\n    const markList = this.list();\n    for (let i = 0; i < markList.length; i++) {\n      const m = markList[i];\n      if (m.uniqueIdentifier === mark.uniqueIdentifier) {\n        this.list.replace(m, mark);\n        return;\n      }\n      if (m.start.spineIndex === mark.start.spineIndex) {\n        if (m.start.offsetInItem > mark.start.offsetInItem) {\n          index = i;\n          break;\n        }\n      } else if (m.start.spineIndex > mark.start.spineIndex) {\n        index = i;\n        break;\n      }\n    }\n    if (index === -1) {\n      index = markList.length;\n    }\n    this.list.splice(index, 0, mark);\n  }\n\n  removeMarkFromList(mark: Mark): void {\n    this.list.remove((m) => m.uniqueIdentifier === mark.uniqueIdentifier);\n  }\n\n  removeAllMarks = async (): Promise<void> => {\n    if (confirm(t(\"CONFIRM_REMOVE_ALL\"))) {\n      const markList = this.list.removeAll();\n      for (const mark of markList) {\n        await this.parent.removeMark(mark);\n      }\n    }\n  };\n\n  removeOneMark = async (mark: Mark): Promise<void> => {\n    if (confirm(t(\"CONFIRM_REMOVE\"))) {\n      await this.parent.removeMark(mark);\n    }\n  };\n\n  updateActualMark = async (mark: Mark): Promise<void> => {\n    this.parent.actualStore.updateMark(mark.toMarkJson());\n  };\n\n  navigateToMark = (mark: Mark): void => {\n    const { spineIndex, offsetInItem } = mark.start;\n    window.history.pushState(null, null);\n    this.parent.viewer.navigateToPosition({ spineIndex, offsetInItem });\n    if (!this.pinned()) {\n      this.detailsElement.open = false;\n    }\n  };\n\n  hasMarks = (): boolean => {\n    return this.list().length > 0 && this.parent.enabled();\n  };\n}\n\nexport class MarksStoreFacade {\n  actualStore?: MarksStoreInterface;\n  viewerOptions?: ViewerOptions;\n  viewer?: Viewer;\n  menuStatus: MarksMenuStatus;\n  marksBox: MarksBox;\n  initialized: boolean;\n  justClicked: boolean;\n\n  constructor() {\n    this.menuStatus = new MarksMenuStatus(this);\n    this.marksBox = new MarksBox(this);\n    this.initialized = false;\n    this.justClicked = false;\n  }\n\n  enabled(): boolean {\n    return this.initialized && this.viewerOptions.enableMarker();\n  }\n\n  async init(viewerOptions?: ViewerOptions, viewer?: Viewer): Promise<void> {\n    if (viewerOptions) {\n      this.viewerOptions = viewerOptions;\n    }\n    if (viewer) {\n      this.viewer = viewer;\n    }\n    if (!this.viewerOptions || !this.viewerOptions.enableMarker()) {\n      return;\n    }\n\n    this.menuStatus.init();\n    this.marksBox.init();\n\n    if (window[\"marksStorePlugin\"]) {\n      this.actualStore = window[\"marksStorePlugin\"] as MarksStoreInterface;\n    } else {\n      this.actualStore = new URLMarksStore();\n    }\n    const documentId = urlParameters.getParameter(\"src\").join();\n    await this.actualStore.init(documentId);\n    this.initialized = true;\n  }\n\n  async toggleEnableMarker(): Promise<void> {\n    if (!this.enabled()) {\n      this.viewerOptions.enableMarker(true);\n\n      if (this.justClicked) {\n        this.justClicked = false;\n        this.marksBox.pinned(true);\n        this.marksBox.detailsElement.open = true;\n      } else {\n        this.marksBox.pinned(false);\n        this.justClicked = true;\n        window.setTimeout(() => {\n          (\n            this.marksBox.detailsElement.firstElementChild as HTMLElement\n          ).focus();\n          this.justClicked = false;\n        }, 300);\n      }\n      if (!this.initialized) {\n        await this.init();\n      }\n      await this.retryHighlightMarks();\n    } else if (this.justClicked) {\n      // Double click to keep Marks box visible during Marks navigation\n      this.justClicked = false;\n      this.marksBox.pinned(true);\n      this.marksBox.detailsElement.open = true;\n    } else {\n      document.querySelectorAll(`[${Mark.idAttr}]`).forEach((e) => {\n        e.remove();\n      });\n      if (this.menuStatus.startButtonOpened()) {\n        this.menuStatus.closeStartButton();\n      }\n      if (this.menuStatus.menuOpened()) {\n        this.menuStatus.closeMenu();\n      }\n      this.viewerOptions.enableMarker(false);\n\n      this.justClicked = true;\n      window.setTimeout(() => {\n        this.justClicked = false;\n      }, 300);\n    }\n  }\n\n  async persistMark(mark: Mark): Promise<void> {\n    if (!this.initialized) return;\n    const id = await this.actualStore.persistMark(mark.toMarkJson());\n    mark.uniqueIdentifier = id;\n    this.highlightMark(mark);\n  }\n\n  async updateMark(mark: Mark): Promise<void> {\n    if (!this.initialized) return;\n    this.unhighlightMark(mark);\n    this.highlightMark(mark);\n    this.actualStore.updateMark(mark.toMarkJson());\n  }\n\n  async getMark(id: string): Promise<Mark> {\n    if (!this.initialized) return;\n    return Mark.fromMarkJson(await this.actualStore.getMark(id));\n  }\n\n  async removeMark(mark: Mark): Promise<void> {\n    if (!this.initialized) return;\n    this.unhighlightMark(mark);\n    await this.actualStore.removeMark(mark.toMarkJson());\n  }\n\n  async retryHighlightMarks(): Promise<void> {\n    if (!this.enabled()) return;\n    if (this.actualStore.allMarksIterator) {\n      const it = await this.actualStore.allMarksIterator();\n      for await (const m of it) {\n        if (m) {\n          this.highlightMark(Mark.fromMarkJson(m));\n        }\n      }\n    } else {\n      for await (const m of await this.actualStore.allMarks()) {\n        if (m) {\n          this.highlightMark(Mark.fromMarkJson(m));\n        }\n      }\n    }\n  }\n\n  private unhighlightMark(mark: Mark): void {\n    document\n      .querySelectorAll(`[${Mark.idAttr}=\"${mark.uniqueIdentifier}\"]`)\n      .forEach((e) => {\n        e.remove();\n      });\n    this.marksBox.removeMarkFromList(mark);\n  }\n\n  private highlightMark(mark: Mark, allowNotPersisted = false): void {\n    if (!mark.isPersisted && !allowNotPersisted) {\n      throw \"mark is not persisted.\";\n    }\n    const start = selectedPositionToNode(mark.start);\n    let end = selectedPositionToNode(mark.end);\n    if (start && !end && !this.viewerOptions.renderAllPages()) {\n      console.log();\n      end = estimateLastEndFromStart(start, mark.end);\n    }\n    if (start && end) {\n      const color = colorNameToColor(mark.color);\n      highlight(start, end, { background: color }, mark);\n    }\n    this.marksBox.addMarkToList(mark);\n  }\n}\n\nexport const marksStore = new MarksStoreFacade();\nexport const marksMenuStatus = marksStore.menuStatus;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2018 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) unknown later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { ReadyState, PageProgression } from \"@vivliostyle/core\";\nimport ko, { PureComputed } from \"knockout\";\n\nimport ViewerOptions from \"../models/viewer-options\";\nimport keyUtil from \"../utils/key-util\";\nimport SettingsPanel from \"./settings-panel\";\nimport Viewer from \"./viewer\";\nimport { marksStore } from \"./marks-store\";\n\nconst { Keys } = keyUtil;\n\nexport type NavigationOptions = {\n  disableTOCNavigation: boolean;\n  disableFind: boolean;\n  disableMarker: boolean;\n  disablePageNavigation: boolean;\n  disableZoom: boolean;\n  disableFontSizeChange: boolean;\n  disablePageSlider: boolean;\n  disablePrint: boolean;\n};\n\nclass Navigation {\n  fitToScreen: PureComputed<boolean>;\n  isDecreaseFontSizeDisabled: PureComputed<boolean>;\n  isDefaultFontSizeDisabled: PureComputed<boolean>;\n  isDisabled: PureComputed<boolean>;\n  isIncreaseFontSizeDisabled: PureComputed<boolean>;\n  isNavigateToNextDisabled: PureComputed<boolean>;\n  isNavigateToPreviousDisabled: PureComputed<boolean>;\n  isNavigateToLeftDisabled: PureComputed<boolean>;\n  isNavigateToRightDisabled: PureComputed<boolean>;\n  isNavigateToFirstDisabled: PureComputed<boolean>;\n  isNavigateToLastDisabled: PureComputed<boolean>;\n  isPageNumberDisabled: PureComputed<boolean>;\n  isPageSliderDisabled: PureComputed<boolean>;\n  isTOCToggleDisabled: PureComputed<boolean>;\n  isToggleFitToScreenDisabled: PureComputed<boolean>;\n  isZoomOutDisabled: PureComputed<boolean>;\n  isZoomInDisabled: PureComputed<boolean>;\n  isZoomToActualSizeDisabled: PureComputed<boolean>;\n  isPrintDisabled: PureComputed<boolean>;\n  isFindBoxDisabled: PureComputed<boolean>;\n  isMarkerToggleDisabled: PureComputed<boolean>;\n  pageNumber: PureComputed<number | string>;\n  totalPages: PureComputed<number | string>;\n  pageSlider: PureComputed<number | string>;\n  pageSliderMax: PureComputed<number | string>;\n  hidePageSlider: boolean;\n  hideFontSizeChange: boolean;\n  hidePageNavigation: boolean;\n  hideTOCNavigation: boolean;\n  hideZoom: boolean;\n  hidePrint: boolean;\n  hideFind: boolean;\n  hideMarker: boolean;\n  justClicked: boolean;\n  justPageMovedByWheel: boolean;\n\n  constructor(\n    private viewerOptions: ViewerOptions,\n    private viewer: Viewer,\n    private settingsPanel: SettingsPanel,\n    navigationOptions: NavigationOptions,\n  ) {\n    this.justClicked = false; // double click check\n    this.justPageMovedByWheel = false;\n\n    this.isDisabled = ko.pureComputed(() => {\n      return (\n        (this.settingsPanel.opened() && !this.settingsPanel.pinned()) ||\n        !this.viewer.state.navigatable()\n      );\n    });\n\n    const navigationDisabled = ko.pureComputed(() => {\n      return navigationOptions.disablePageNavigation || this.isDisabled();\n    });\n\n    navigationDisabled.subscribe((disabled) => {\n      const pageNumberElem = document.getElementById(\n        \"vivliostyle-page-number\",\n      ) as HTMLInputElement;\n      if (pageNumberElem) {\n        pageNumberElem.disabled = disabled;\n      }\n    });\n\n    this.isPageNumberDisabled = ko.pureComputed(() => {\n      return navigationDisabled();\n    });\n\n    this.isPageSliderDisabled = ko.pureComputed(() => {\n      if (navigationOptions.disablePageSlider || navigationDisabled()) {\n        return true;\n      }\n      return Number(this.totalPages()) <= 1;\n    });\n\n    this.isNavigateToPreviousDisabled = ko.pureComputed(() => {\n      if (navigationDisabled()) {\n        return true;\n      }\n      if (this.viewer.state.status === undefined) {\n        return false; // needed for test/spec/viewmodels/navigation-spec.js\n      }\n      return this.viewer.firstPage();\n    });\n\n    this.isNavigateToNextDisabled = ko.pureComputed(() => {\n      if (navigationDisabled()) {\n        return true;\n      }\n      if (this.viewer.state.status === undefined) {\n        return false; // needed for test/spec/viewmodels/navigation-spec.js\n      }\n      if (\n        this.viewerOptions.renderAllPages() &&\n        this.viewer.state.status() != ReadyState.COMPLETE\n      ) {\n        return false;\n      }\n      return this.viewer.lastPage();\n    });\n\n    this.isNavigateToLeftDisabled = ko.pureComputed(() => {\n      if (navigationDisabled()) {\n        return true;\n      }\n      if (this.viewer.state.pageProgression === undefined) {\n        return false; // needed for test/spec/viewmodels/navigation-spec.js\n      }\n      if (this.viewer.state.pageProgression() === PageProgression.LTR) {\n        return this.isNavigateToPreviousDisabled();\n      } else {\n        return this.isNavigateToNextDisabled();\n      }\n    });\n\n    this.isNavigateToRightDisabled = ko.pureComputed(() => {\n      if (navigationDisabled()) {\n        return true;\n      }\n      if (this.viewer.state.pageProgression === undefined) {\n        return false; // needed for test/spec/viewmodels/navigation-spec.js\n      }\n      if (this.viewer.state.pageProgression() === PageProgression.LTR) {\n        return this.isNavigateToNextDisabled();\n      } else {\n        return this.isNavigateToPreviousDisabled();\n      }\n    });\n\n    this.isNavigateToFirstDisabled = this.isNavigateToPreviousDisabled;\n\n    this.isNavigateToLastDisabled = ko.pureComputed(() => {\n      if (navigationDisabled()) {\n        return true;\n      }\n      if (this.viewer.state.status === undefined) {\n        return false; // needed for test/spec/viewmodels/navigation-spec.js\n      }\n      if (\n        this.viewerOptions.renderAllPages() &&\n        this.viewer.state.status() != ReadyState.COMPLETE\n      ) {\n        return true;\n      }\n      return this.viewer.lastPage();\n    });\n\n    this.hidePageNavigation = !!navigationOptions.disablePageNavigation;\n\n    const zoomDisabled = ko.pureComputed(() => {\n      return navigationOptions.disableZoom || this.isDisabled();\n    });\n\n    this.isZoomOutDisabled = zoomDisabled;\n    this.isZoomInDisabled = zoomDisabled;\n    this.isZoomToActualSizeDisabled = zoomDisabled;\n    this.isToggleFitToScreenDisabled = zoomDisabled;\n    this.hideZoom = !!navigationOptions.disableZoom;\n\n    this.fitToScreen = ko.pureComputed(() => viewerOptions.zoom().fitToScreen);\n\n    const fontSizeChangeDisabled = ko.pureComputed(() => {\n      return (\n        navigationOptions.disableFontSizeChange ||\n        this.isDisabled() ||\n        this.viewer.state.fixedLayout()\n      );\n    });\n\n    // Font size limit (max:72, min:5) is hard coded in vivliostyle.js/src/adapt/viewer.js.\n    this.isIncreaseFontSizeDisabled = ko.pureComputed(() => {\n      if (fontSizeChangeDisabled()) {\n        return true;\n      }\n      if (Number(this.viewerOptions.fontSize()) >= 72) {\n        return true;\n      }\n      return false;\n    });\n    this.isDecreaseFontSizeDisabled = ko.pureComputed(() => {\n      if (fontSizeChangeDisabled()) {\n        return true;\n      }\n      if (Number(this.viewerOptions.fontSize()) <= 5) {\n        return true;\n      }\n      return false;\n    });\n    this.isDefaultFontSizeDisabled = fontSizeChangeDisabled;\n    this.hideFontSizeChange = !!navigationOptions.disableFontSizeChange;\n\n    this.isTOCToggleDisabled = ko.pureComputed(() => {\n      return (\n        navigationOptions.disableTOCNavigation ||\n        this.isDisabled() ||\n        this.viewer.tocVisible() == null\n      );\n    });\n    this.hideTOCNavigation = !!navigationOptions.disableTOCNavigation;\n    this.hidePageSlider = !!navigationOptions.disablePageSlider;\n\n    this.isFindBoxDisabled = ko.pureComputed(() => {\n      return (\n        navigationOptions.disableFind ||\n        this.isDisabled() ||\n        this.viewer.state.fixedLayout()\n      );\n    });\n    this.hideFind = !!navigationOptions.disableFind;\n\n    this.isMarkerToggleDisabled = ko.pureComputed(() => {\n      return navigationOptions.disableMarker || this.isDisabled();\n    });\n    this.hideMarker = !!navigationOptions.disableMarker;\n\n    this.isPrintDisabled = ko.pureComputed(() => {\n      if (\n        navigationOptions.disablePrint ||\n        this.isDisabled() ||\n        this.viewer.state.status() != ReadyState.COMPLETE\n      ) {\n        return true;\n      }\n      return false;\n    });\n\n    this.hidePrint = !!navigationOptions.disablePrint;\n\n    if (navigationOptions.disablePrint) {\n      const printStyle = document.createElement(\"style\");\n      printStyle.setAttribute(\"media\", \"print\");\n      printStyle.textContent = \"*{display:none}\";\n      document.head.appendChild(printStyle);\n    }\n\n    this.pageNumber = ko.pureComputed({\n      read() {\n        return this.viewer.epageToPageNumber(this.viewer.epage());\n      },\n      write(pageNumberText: number | string) {\n        const epageOld = this.viewer.epage();\n        const pageNumberOld = this.viewer.epageToPageNumber(epageOld);\n\n        // Accept non-integer, convert fullwidth to ascii\n        let pageNumber =\n          parseFloat(\n            pageNumberText\n              .toString()\n              .replace(/[０-９]/g, (s) =>\n                String.fromCharCode(s.charCodeAt(0) - 0xfee0),\n              ),\n          ) || 0;\n        if (/^[-+]/.test(pageNumberText.toString())) {\n          // \"+number\" and \"-number\" to relative move.\n          pageNumber = pageNumberOld + pageNumber;\n        }\n        if (pageNumber < 1) {\n          pageNumber = 1;\n        } else {\n          const epageCount = this.viewer.epageCount();\n          if (this.viewerOptions.renderAllPages()) {\n            if (pageNumber > epageCount) {\n              pageNumber = epageCount;\n            }\n          } else if (pageNumber > epageCount + 1) {\n            // Accept \"epageCount + 1\" because the last epage may equal epageCount.\n            pageNumber = epageCount + 1;\n          }\n        }\n        const epageNav = this.viewer.epageFromPageNumber(pageNumber);\n        const pageNumberElem = document.getElementById(\n          \"vivliostyle-page-number\",\n        ) as HTMLInputElement;\n        pageNumberElem.value = pageNumber.toString();\n        window.history.pushState(null, null);\n        this.viewer.navigateToEPage(epageNav);\n\n        window.setTimeout(() => {\n          if (\n            this.viewer.state.status() != ReadyState.LOADING &&\n            this.viewer.epage() === epageOld\n          ) {\n            pageNumberElem.value = pageNumberOld.toString();\n          }\n          document.getElementById(\"vivliostyle-viewer-viewport\").focus();\n        }, 10);\n      },\n      owner: this,\n    });\n\n    this.totalPages = ko.pureComputed(() => {\n      let totalPages = this.viewer.epageCount();\n      if (!totalPages) {\n        return totalPages;\n      }\n      const pageNumber = Number(this.pageNumber());\n      if (this.viewer.lastPage()) {\n        totalPages = pageNumber;\n      } else if (pageNumber > totalPages) {\n        totalPages = pageNumber;\n      } else if (pageNumber == totalPages) {\n        totalPages++;\n      }\n      return totalPages;\n    });\n\n    this.pageSlider = ko.pureComputed({\n      read() {\n        const pageNumber = Number(this.pageNumber());\n        const pageSliderElem = document.getElementById(\n          \"vivliostyle-page-slider\",\n        ) as HTMLInputElement;\n        if (Number(pageSliderElem.max) < pageNumber) {\n          pageSliderElem.max = String(pageNumber);\n        }\n        return pageNumber;\n      },\n      write(pageNumberText: number | string) {\n        if (this.viewerOptions.renderAllPages()) {\n          const pageNumber = Number(pageNumberText);\n          const epageNav = this.viewer.epageFromPageNumber(pageNumber);\n          this.viewer.navigateToEPage(epageNav);\n        } else {\n          const pageNumberElem = document.getElementById(\n            \"vivliostyle-page-number\",\n          ) as HTMLInputElement;\n          pageNumberElem.value = String(pageNumberText);\n          // Here, changes `pageNumberElem.value` but not do `navigateToEPage()`.\n          // `navigateToEPage()` is called in `onmouseupPageSlider()` later.\n        }\n      },\n      owner: this,\n    });\n\n    this.pageSliderMax = this.totalPages;\n  }\n\n  navigateToPrevious = (): boolean => {\n    if (!this.isNavigateToPreviousDisabled()) {\n      this.viewer.navigateToPrevious();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  navigateToNext = (): boolean => {\n    if (!this.isNavigateToNextDisabled()) {\n      this.viewer.navigateToNext();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  navigateToLeft = (): boolean => {\n    if (!this.isNavigateToLeftDisabled()) {\n      this.viewer.navigateToLeft();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  navigateToRight = (): boolean => {\n    if (!this.isNavigateToRightDisabled()) {\n      this.viewer.navigateToRight();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  navigateToFirst = (): boolean => {\n    if (!this.isNavigateToFirstDisabled()) {\n      window.history.pushState(null, null);\n      this.viewer.navigateToFirst();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  navigateToLast = (): boolean => {\n    if (!this.isNavigateToLastDisabled()) {\n      window.history.pushState(null, null);\n      this.viewer.navigateToLast();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  zoomIn = (): boolean => {\n    if (!this.isZoomInDisabled()) {\n      const zoom = this.viewerOptions.zoom();\n      this.viewerOptions.zoom(zoom.zoomIn(this.viewer));\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  zoomOut = (): boolean => {\n    if (!this.isZoomOutDisabled()) {\n      const zoom = this.viewerOptions.zoom();\n      this.viewerOptions.zoom(zoom.zoomOut(this.viewer));\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  zoomToActualSize = (): boolean => {\n    if (!this.isZoomToActualSizeDisabled()) {\n      const zoom = this.viewerOptions.zoom();\n      this.viewerOptions.zoom(zoom.zoomToActualSize());\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  toggleFitToScreen = (): boolean => {\n    if (!this.isToggleFitToScreenDisabled()) {\n      const zoom = this.viewerOptions.zoom();\n      this.viewerOptions.zoom(zoom.toggleFitToScreen());\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  increaseFontSize = (): boolean => {\n    if (!this.isIncreaseFontSizeDisabled()) {\n      let fontSize = Number(this.viewerOptions.fontSize());\n      // fontSize *= 1.25;\n      if (fontSize < 10) {\n        fontSize = Math.floor(fontSize) + 1;\n      } else if (fontSize < 20) {\n        fontSize = (Math.floor(fontSize / 2) + 1) * 2;\n      } else if (fontSize < 40) {\n        fontSize = (Math.floor(fontSize / 4) + 1) * 4;\n      } else if (fontSize < 72) {\n        fontSize = (Math.floor(fontSize / 8) + 1) * 8;\n      } else {\n        fontSize = 72;\n      }\n      this.viewerOptions.fontSize(fontSize);\n      this.updateFontSizeSettings();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  decreaseFontSize = (): boolean => {\n    if (!this.isDecreaseFontSizeDisabled()) {\n      let fontSize = Number(this.viewerOptions.fontSize());\n      // fontSize *= 0.8;\n      if (fontSize > 40) {\n        fontSize = (Math.ceil(fontSize / 8) - 1) * 8;\n      } else if (fontSize > 20) {\n        fontSize = (Math.ceil(fontSize / 4) - 1) * 4;\n      } else if (fontSize > 10) {\n        fontSize = (Math.ceil(fontSize / 2) - 1) * 2;\n      } else if (fontSize > 5) {\n        fontSize = Math.ceil(fontSize) - 1;\n      } else {\n        fontSize = 5;\n      }\n      this.viewerOptions.fontSize(fontSize);\n      this.updateFontSizeSettings();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  defaultFontSize = (): boolean => {\n    if (!this.isDefaultFontSizeDisabled()) {\n      const fontSize = ViewerOptions.getDefaultValues().fontSize;\n      this.viewerOptions.fontSize(fontSize);\n      this.updateFontSizeSettings();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  updateFontSizeSettings(): void {\n    // Update setting panel \"Font Size\".\n    this.settingsPanel.state.viewerOptions.fontSize(\n      this.viewerOptions.fontSize(),\n    );\n\n    if (this.viewer.documentOptions.pageStyle.baseFontSizeSpecified()) {\n      // Update custom style when base font-size is specified\n      this.viewer.documentOptions.updateCustomStyleSheetFromCSSText();\n      this.viewer.loadDocument(this.viewer.documentOptions, this.viewerOptions);\n    }\n  }\n\n  onfocusPageNumber = (_obj: unknown, event: Event): boolean => {\n    const inputElem = event.currentTarget as HTMLInputElement;\n    window.setTimeout(() => {\n      inputElem.setSelectionRange(0, inputElem.value.length);\n    }, 0);\n    return true;\n  };\n\n  onmouseupPageSlider = (_obj: unknown, _event: MouseEvent): boolean => {\n    if (this.viewerOptions.renderAllPages()) {\n      // already moved in `this.pageSlider.write()`\n      return true;\n    }\n    const pageNumberElem = document.getElementById(\n      \"vivliostyle-page-number\",\n    ) as HTMLInputElement;\n    const pageNumber = Number(pageNumberElem.value);\n    const epageNav = this.viewer.epageFromPageNumber(pageNumber);\n    this.viewer.navigateToEPage(epageNav);\n\n    return true;\n  };\n\n  onwheelPageSlider = (_obj: unknown, event: WheelEvent): boolean => {\n    event.preventDefault();\n    if (\n      this.justPageMovedByWheel ||\n      (event.deltaMode === 0 &&\n        Math.abs(event.deltaX) < 4 &&\n        Math.abs(event.deltaY) < 4)\n    ) {\n      // ignore small move less than 2px\n      return true;\n    }\n    if (Math.abs(event.deltaX) >= Math.abs(event.deltaY)) {\n      if (event.deltaX < 0) {\n        this.navigateToLeft();\n      } else {\n        this.navigateToRight();\n      }\n    } else {\n      if (event.deltaY < 0) {\n        this.navigateToPrevious();\n      } else {\n        this.navigateToNext();\n      }\n    }\n    if ((event.currentTarget as Element).id !== \"vivliostyle-page-slider\") {\n      // Prevent repetitive page moving due to momentum scrolling\n      this.justPageMovedByWheel = true;\n      window.setTimeout(() => {\n        this.justPageMovedByWheel = false;\n      }, 166);\n    }\n    return true;\n  };\n\n  onwheelViewport = (obj: unknown, event: WheelEvent): boolean => {\n    const viewportElement = document.getElementById(\n      \"vivliostyle-viewer-viewport\",\n    );\n    const isTOCActive =\n      this.viewer.tocVisible() && viewportElement != document.activeElement;\n    if (\n      isTOCActive ||\n      viewportElement.scrollWidth > viewportElement.clientWidth ||\n      viewportElement.scrollHeight > viewportElement.clientHeight\n    ) {\n      // When TOC is active or page is scrollable, wheel is used for those\n      return true;\n    }\n    return this.onwheelPageSlider(obj, event);\n  };\n\n  onclickViewport = (_obj: unknown, _event: MouseEvent): boolean => {\n    this.pageNumber();\n    if (this.settingsPanel.justClicked) {\n      return true;\n    }\n    if (this.viewer.tocVisible() && !this.viewer.tocPinned()) {\n      const tocBox = document.querySelector(\"[data-vivliostyle-toc-box]\");\n      if (tocBox && !tocBox.contains(document.activeElement)) {\n        this.toggleTOC();\n      }\n    }\n    if (this.settingsPanel.opened() && !this.settingsPanel.pinned()) {\n      this.settingsPanel.close();\n    }\n    if (\n      marksStore.enabled() &&\n      marksStore.marksBox.detailsElement.open &&\n      !marksStore.marksBox.pinned()\n    ) {\n      marksStore.marksBox.detailsElement.open = false;\n    }\n    return true;\n  };\n\n  toggleTOC = (): boolean => {\n    if (!this.isTOCToggleDisabled()) {\n      let intervalID = 0;\n\n      if (!this.viewer.tocVisible()) {\n        if (this.justClicked) {\n          this.viewer.showTOC(true, false); // autohide=false\n          this.justClicked = false;\n        } else {\n          this.viewer.showTOC(true, true); // autohide=true\n          this.justClicked = true;\n        }\n        // Here use timer for two purposes:\n        // - Check double click to make TOC box pinned.\n        // - Move focus to TOC box when TOC box becomes visible.\n        intervalID = window.setInterval(() => {\n          const tocBox = document.querySelector(\n            \"[data-vivliostyle-toc-box]\",\n          ) as HTMLElement;\n          if (tocBox && tocBox.style.visibility === \"visible\") {\n            tocBox.tabIndex = 0;\n            tocBox.focus();\n\n            window.clearInterval(intervalID);\n            intervalID = 0;\n          }\n          this.justClicked = false;\n        }, 300);\n      } else if (this.justClicked) {\n        // Double click to keep TOC box visible during TOC navigation\n        this.viewer.showTOC(true, false); // autohide=false\n        this.justClicked = false;\n      } else {\n        if (intervalID) {\n          window.clearInterval(intervalID);\n          intervalID = 0;\n        }\n        this.viewer.showTOC(false);\n\n        this.justClicked = true;\n        window.setTimeout(() => {\n          if (this.justClicked) {\n            document.getElementById(\"vivliostyle-viewer-viewport\").focus();\n            this.justClicked = false;\n          }\n        }, 300);\n      }\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  navigateTOC = (key: string): boolean => {\n    const selector =\n      \"[data-vivliostyle-toc-box]>*>*>*>*>*:not([hidden]) [tabindex='0'],\" +\n      \"[data-vivliostyle-toc-box]>*>*>*>*>*:not([hidden]) a[href]:not([tabindex='-1'])\";\n    const nodes = Array.from(document.querySelectorAll(selector));\n    let index = nodes.indexOf(document.activeElement);\n\n    const isButton = (index): boolean => {\n      return nodes[index] && nodes[index].getAttribute(\"role\") === \"button\";\n    };\n    const isExpanded = (index): boolean => {\n      return (\n        nodes[index] && nodes[index].getAttribute(\"aria-expanded\") === \"true\"\n      );\n    };\n\n    switch (key) {\n      case Keys.ArrowLeft:\n        if (index == -1) {\n          index = nodes.length - 1;\n          break;\n        }\n        if (!isButton(index) && isButton(index - 1)) {\n          index--;\n        }\n        if (isButton(index) && isExpanded(index)) {\n          (nodes[index] as HTMLElement).click();\n        } else {\n          for (let i = index - 1; i >= 0; i--) {\n            if (isButton(i) && nodes[i].parentElement.contains(nodes[index])) {\n              index = i;\n              break;\n            }\n          }\n        }\n        break;\n      case Keys.ArrowRight:\n        if (index == -1) {\n          index = 0;\n          break;\n        }\n        if (!isButton(index) && isButton(index - 1)) {\n          index--;\n        }\n        if (isButton(index)) {\n          if (isExpanded(index)) {\n            index += 2;\n          } else {\n            (nodes[index] as HTMLElement).click();\n          }\n        }\n        break;\n      case Keys.ArrowDown:\n        index++;\n        break;\n      case Keys.ArrowUp:\n        if (index == -1) {\n          index = nodes.length - 1;\n          break;\n        }\n        if (index > 0) {\n          if (isButton(--index)) {\n            index--;\n          }\n        }\n        break;\n      case Keys.Home:\n        index = 0;\n        break;\n      case Keys.End:\n        index = nodes.length - 1;\n        break;\n      case Keys.Space:\n        if (!isButton(index) && isButton(index - 1)) {\n          index--;\n        }\n        if (isButton(index)) {\n          (nodes[index] as HTMLElement).click();\n        }\n        break;\n    }\n\n    if (isButton(index)) {\n      index++;\n    }\n\n    if (nodes[index]) {\n      (nodes[index] as HTMLElement).focus();\n    }\n\n    return true;\n  };\n\n  toggleMarker = (): boolean => {\n    if (!this.isMarkerToggleDisabled()) {\n      marksStore.toggleEnableMarker();\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  handleKey = (key: string): boolean => {\n    const isSettingsActive =\n      this.settingsPanel.opened() &&\n      this.settingsPanel.settingsToggle.contains(document.activeElement);\n\n    if (isSettingsActive) {\n      return true;\n    }\n\n    const pageNumberElem = document.getElementById(\"vivliostyle-page-number\");\n    const viewportElement = document.getElementById(\n      \"vivliostyle-viewer-viewport\",\n    );\n    const horizontalScrollable =\n      viewportElement.scrollWidth > viewportElement.clientWidth;\n    const verticalScrollable =\n      viewportElement.scrollHeight > viewportElement.clientHeight;\n    const isPageNumberInput = pageNumberElem === document.activeElement;\n    const isTOCActive =\n      this.viewer.tocVisible() &&\n      !isPageNumberInput &&\n      viewportElement != document.activeElement;\n\n    if (\n      !isTOCActive &&\n      viewportElement != document.activeElement &&\n      viewportElement.contains(document.activeElement)\n    ) {\n      // Disable shortcut keys when an input box exists in document\n      // and that is activated.\n      return true;\n    }\n\n    switch (key) {\n      case \"+\":\n        return isPageNumberInput || !this.increaseFontSize();\n      case \"-\":\n        return isPageNumberInput || !this.decreaseFontSize();\n      case \"0\":\n        return isPageNumberInput || !this.defaultFontSize();\n      case \"1\":\n        return isPageNumberInput || !this.zoomToActualSize();\n      case Keys.ArrowLeft:\n        if (isTOCActive) return !this.navigateTOC(key);\n        return (\n          isPageNumberInput || horizontalScrollable || !this.navigateToLeft()\n        );\n      case Keys.ArrowRight:\n        if (isTOCActive) return !this.navigateTOC(key);\n        return (\n          isPageNumberInput || horizontalScrollable || !this.navigateToRight()\n        );\n      case Keys.ArrowDown:\n        if (isTOCActive) return !this.navigateTOC(key);\n        viewportElement.focus();\n        return verticalScrollable || !this.navigateToNext();\n      case Keys.ArrowUp:\n        if (isTOCActive) return !this.navigateTOC(key);\n        viewportElement.focus();\n        return verticalScrollable || !this.navigateToPrevious();\n      case Keys.PageDown:\n        if (isTOCActive) return true;\n        viewportElement.focus();\n        return !this.navigateToNext();\n      case Keys.PageUp:\n        if (isTOCActive) return true;\n        viewportElement.focus();\n        return !this.navigateToPrevious();\n      case Keys.Home:\n        if (isTOCActive) return !this.navigateTOC(key);\n        viewportElement.focus();\n        return !this.navigateToFirst();\n      case Keys.End:\n        if (isTOCActive) return !this.navigateTOC(key);\n        viewportElement.focus();\n        return !this.navigateToLast();\n      case \"o\":\n      case \"O\":\n        viewportElement.focus();\n        return !this.zoomOut();\n      case \"i\":\n      case \"I\":\n        viewportElement.focus();\n        return !this.zoomIn();\n      case \"p\":\n      case \"P\":\n        viewportElement.focus();\n        return !this.print();\n      case \"f\":\n      case \"F\":\n        viewportElement.focus();\n        return !this.toggleFitToScreen();\n      case \"g\":\n      case \"G\":\n        pageNumberElem.focus();\n        return false;\n      case \"t\":\n      case \"T\":\n        viewportElement.focus();\n        return !this.toggleTOC();\n      case \"m\":\n      case \"M\":\n        viewportElement.focus();\n        return !this.toggleMarker();\n      case Keys.Escape:\n        if (marksStore.enabled()) {\n          if (marksStore.menuStatus.startButtonOpened()) {\n            marksStore.menuStatus.closeStartButton();\n            return false;\n          }\n          if (marksStore.menuStatus.menuOpened()) {\n            if (document.activeElement.id !== \"vivliostyle-memo-edit-area\") {\n              marksStore.menuStatus.closeMenu();\n              return false;\n            }\n            return true;\n          }\n          if (marksStore.marksBox.detailsElement.open) {\n            marksStore.marksBox.detailsElement.open = false;\n            return false;\n          }\n        }\n        if (this.viewer.tocVisible()) {\n          return !this.toggleTOC();\n        }\n        viewportElement.focus();\n        return true;\n      case Keys.Space:\n        if (isTOCActive) return !this.navigateTOC(key);\n        if (document.activeElement.getAttribute(\"role\") === \"button\") {\n          (document.activeElement as HTMLElement).click();\n          return false;\n        }\n        return true;\n      default:\n        return true;\n    }\n  };\n\n  print = (): boolean => {\n    if (!this.isPrintDisabled()) {\n      window.print();\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\nexport default Navigation;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko, { Observable, PureComputed } from \"knockout\";\nimport i18nextko from \"i18next-ko\";\nimport Viewer from \"./viewer\";\nimport PageStyle from \"../models/page-style\";\nimport PageViewMode from \"../models/page-view-mode\";\nimport ViewerOptions from \"../models/viewer-options\";\nimport DocumentOptions from \"../models/document-options\";\nimport urlParameters from \"../stores/url-parameters\";\nimport keyUtil from \"../utils/key-util\";\nimport MessageDialog from \"./message-dialog\";\n\ntype State = {\n  viewerOptions: ViewerOptions;\n  pageStyle: PageStyle;\n  pageViewMode: PureComputed<string>;\n  bookMode: Observable<boolean>;\n  renderAllPages: PureComputed<boolean>;\n  restoreView: Observable<boolean>;\n};\n\nconst { Keys } = keyUtil;\n\nclass SettingsPanel {\n  isPageStyleChangeDisabled: boolean;\n  isPageViewModeChangeDisabled: boolean;\n  isBookModeChangeDisabled: boolean;\n  isRenderAllPagesChangeDisabled: boolean;\n  isRestoreViewChangeDisabled: boolean;\n  isUILanguageChangeDisabled: boolean;\n  justClicked: boolean; // double click check\n  settingsToggle: HTMLElement;\n  state: State;\n  opened: Observable<boolean>;\n  pinned: Observable<boolean>;\n  resetCustomStyle: PureComputed<boolean>;\n  defaultPageStyle: PageStyle;\n  uiLanguage: PureComputed<string>;\n\n  constructor(\n    private viewerOptions: ViewerOptions,\n    private documentOptions: DocumentOptions,\n    private viewer: Viewer,\n    messageDialog: MessageDialog,\n    settingsPanelOptions: {\n      disablePageStyleChange: boolean;\n      disablePageViewModeChange: boolean;\n      disableBookModeChange: boolean;\n      disableRenderAllPagesChange: boolean;\n      disableRestoreViewChange: boolean;\n      disableUILanguageChange: boolean;\n    },\n  ) {\n    this.uiLanguage = ko.pureComputed({\n      read: () => {\n        return i18nextko.i18n.language;\n      },\n      write: (value) => {\n        i18nextko.setLanguage(value);\n        if (urlParameters.hasParameter(\"lng\")) {\n          urlParameters.setParameter(\"lng\", value);\n        }\n        try {\n          window.localStorage.setItem(\"i18nextLng\", value);\n        } catch (_e) {\n          // ignore\n        }\n      },\n    });\n\n    this.isPageStyleChangeDisabled =\n      !!settingsPanelOptions.disablePageStyleChange;\n    this.isPageViewModeChangeDisabled =\n      !!settingsPanelOptions.disablePageViewModeChange;\n    this.isBookModeChangeDisabled =\n      !!settingsPanelOptions.disableBookModeChange;\n    this.isRenderAllPagesChangeDisabled =\n      !!settingsPanelOptions.disableRenderAllPagesChange;\n    this.isRestoreViewChangeDisabled =\n      !!settingsPanelOptions.disableRestoreViewChange;\n    this.isUILanguageChangeDisabled =\n      !!settingsPanelOptions.disableUILanguageChange;\n\n    this.justClicked = false;\n    this.settingsToggle = document.getElementById(\n      \"vivliostyle-menu-item_settings-toggle\",\n    );\n\n    this.opened = ko.observable(false);\n    this.pinned = ko.observable(false);\n    this.state = {\n      viewerOptions: new ViewerOptions(viewerOptions),\n      pageStyle: new PageStyle(documentOptions.pageStyle),\n      pageViewMode: ko.pureComputed({\n        read: () => {\n          return this.state.viewerOptions.pageViewMode().toString();\n        },\n        write: (value) => {\n          this.state.viewerOptions.pageViewMode(PageViewMode.of(value));\n        },\n      }),\n      bookMode: ko.observable(documentOptions.bookMode()),\n      renderAllPages: ko.pureComputed({\n        read: () => {\n          return this.state.viewerOptions.renderAllPages();\n        },\n        write: (value) => {\n          this.state.viewerOptions.renderAllPages(value);\n        },\n      }),\n      restoreView: ko.observable(urlParameters.isEnabledRestoreView()),\n    };\n\n    this.state.pageStyle.setViewerFontSizeObservable(\n      this.state.viewerOptions.fontSize,\n    );\n\n    this.defaultPageStyle = new PageStyle();\n    this.defaultPageStyle.setViewerFontSizeObservable(ko.observable(16));\n\n    messageDialog.visible.subscribe((visible) => {\n      if (visible) this.close();\n    });\n\n    this.state.bookMode.subscribe((bookMode) => {\n      documentOptions.bookMode(bookMode);\n    });\n    this.state.renderAllPages.subscribe((renderAllPages) => {\n      viewerOptions.renderAllPages(renderAllPages);\n    });\n    this.state.restoreView.subscribe((restoreView) => {\n      urlParameters.enableRestoreView(restoreView);\n      if (restoreView) {\n        urlParameters.setParameter(\"restoreView\", \"true\");\n      } else {\n        urlParameters.removeParameter(\"restoreView\");\n      }\n    });\n\n    this.resetCustomStyle = ko.pureComputed({\n      read() {\n        const changed = !this.state.pageStyle.equivalentTo(\n          this.defaultPageStyle,\n        );\n        if (changed) {\n          return false;\n        }\n        const elem = document.getElementsByName(\n          \"vivliostyle-settings_reset-custom-style\",\n        )[0] as HTMLInputElement;\n        return elem.checked;\n      },\n      write(resetCustomStyle) {\n        if (resetCustomStyle) {\n          this.state.pageStyle.copyFrom(this.defaultPageStyle);\n          this.state.viewerOptions.fontSize(\n            ViewerOptions.getDefaultValues().fontSize,\n          );\n        }\n      },\n      owner: this,\n    });\n  }\n\n  close = (): void => {\n    this.opened(false);\n    this.pinned(false);\n    const viewportElement = document.getElementById(\n      \"vivliostyle-viewer-viewport\",\n    );\n    if (viewportElement) viewportElement.focus();\n  };\n\n  toggle = (): void => {\n    if (!this.opened()) {\n      if (!this.viewer.tocPinned()) {\n        this.viewer.showTOC(false); // Hide TOC box\n      }\n      this.opened(true);\n\n      if (this.justClicked) {\n        this.justClicked = false;\n        this.pinned(true);\n      } else {\n        this.pinned(false);\n        this.justClicked = true;\n        this.focusToFirstItem();\n        window.setTimeout(() => {\n          this.justClicked = false;\n        }, 300);\n      }\n    } else if (this.justClicked) {\n      // Double click to keep Settings panel open when Apply is clicked.\n      this.justClicked = false;\n      this.pinned(true);\n    } else {\n      this.close();\n\n      this.justClicked = true;\n      window.setTimeout(() => {\n        this.justClicked = false;\n      }, 300);\n    }\n  };\n\n  apply = (): void => {\n    const customStyleAsUserStyleChanged =\n      this.documentOptions.pageStyle.customStyleAsUserStyle() !==\n      this.state.pageStyle.customStyleAsUserStyle();\n    this.documentOptions.pageStyle.copyFrom(this.state.pageStyle);\n    if (customStyleAsUserStyleChanged) {\n      this.documentOptions.switchCustomStyleUserOrAuthorStyleSheets();\n    }\n    if (this.documentOptions.pageStyle.baseFontSizeSpecified()) {\n      // Update custom style when base font-size is specified\n      this.documentOptions.updateCustomStyleSheetFromCSSText();\n    }\n    this.viewer.loadDocument(this.documentOptions, this.state.viewerOptions);\n    if (this.pinned()) {\n      this.focusToFirstItem();\n    } else {\n      this.close();\n    }\n  };\n\n  cancel = (): void => {\n    this.state.viewerOptions.copyFrom(this.viewerOptions);\n    this.state.pageStyle.copyFrom(this.documentOptions.pageStyle);\n    this.close();\n  };\n\n  focusToFirstItem(outerElemParam?: Element): void {\n    const outerElem = outerElemParam || this.settingsToggle;\n    const inputElem = [\"input\", \"textarea\", \"summary\", \"select\"].includes(\n      outerElem.localName,\n    )\n      ? outerElem\n      : Array.from(outerElem.getElementsByTagName(\"input\")).find(\n          (e: HTMLInputElement) => {\n            return !e.disabled && (e.type != \"radio\" || e.checked);\n          },\n        );\n    if (inputElem) {\n      for (\n        let e = inputElem.parentElement as HTMLDetailsElement;\n        e && e != this.settingsToggle;\n        e = e.parentElement as HTMLDetailsElement\n      ) {\n        if (e.localName == \"details\") {\n          e.open = true;\n        }\n      }\n      (inputElem as HTMLInputElement | HTMLTextAreaElement).focus();\n    }\n  }\n\n  handleKey(key: string): boolean {\n    const isSettingsActive =\n      this.opened() && this.settingsToggle.contains(document.activeElement);\n    const isInInput =\n      isSettingsActive &&\n      ((document.activeElement as HTMLInputElement).type == \"text\" ||\n        document.activeElement.localName == \"select\");\n    const isInTextArea =\n      isSettingsActive && document.activeElement.localName == \"textarea\";\n    const isHotKeyEnabled = isSettingsActive && !isInInput && !isInTextArea;\n\n    switch (key) {\n      case Keys.Escape:\n        if (this.opened()) {\n          this.cancel();\n          this.close();\n        }\n        return true;\n      case \"s\":\n      case \"S\":\n        if (!this.opened() || isHotKeyEnabled || !isSettingsActive) {\n          this.toggle();\n          return false;\n        }\n        return true;\n      case \"l\":\n      case \"L\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementsByName(\"vivliostyle-settings_ui-language\")[0],\n          );\n          return false;\n        }\n        return true;\n      case \"p\":\n      case \"P\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\n              \"vivliostyle-settings_page-view-and-rendering\",\n            ).firstElementChild,\n          );\n          return false;\n        }\n        return true;\n      case \"v\":\n      case \"V\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_page-view-mode\"),\n          );\n          return false;\n        }\n        return true;\n      case \"b\":\n      case \"B\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementsByName(\"vivliostyle-settings_book-mode\")[0],\n          );\n          return false;\n        }\n        return true;\n      case \"a\":\n      case \"A\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementsByName(\n              \"vivliostyle-settings_render-all-pages\",\n            )[0],\n          );\n          return false;\n        }\n        return true;\n      case \"c\":\n      case \"C\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_custom-style\")\n              .firstElementChild,\n          );\n          return false;\n        }\n        return true;\n      case \"m\":\n      case \"M\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_custom-style_more\")\n              .firstElementChild,\n          );\n          return false;\n        }\n        return true;\n      case \"z\":\n      case \"Z\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_page-size\"),\n          );\n          return false;\n        }\n        return true;\n      case \"o\":\n      case \"O\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_crop-marks\"),\n          );\n          return false;\n        }\n        return true;\n      case \"g\":\n      case \"G\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_page-margin\"),\n          );\n          return false;\n        }\n        return true;\n      case \"k\":\n      case \"K\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_page-breaks\"),\n          );\n          return false;\n        }\n        return true;\n      case \"i\":\n      case \"I\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_images\"),\n          );\n          return false;\n        }\n        return true;\n      case \"t\":\n      case \"T\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_text\"),\n          );\n          return false;\n        }\n        return true;\n      case \"y\":\n      case \"Y\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementById(\"vivliostyle-settings_priority\"),\n          );\n          return false;\n        }\n        return true;\n      case \"e\":\n      case \"E\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementsByName(\"vivliostyle-settings_edit-css\")[0],\n          );\n          return false;\n        }\n        return true;\n      case \"r\":\n      case \"R\":\n        if (isHotKeyEnabled) {\n          this.focusToFirstItem(\n            document.getElementsByName(\n              \"vivliostyle-settings_reset-custom-style\",\n            )[0],\n          );\n          return false;\n        }\n        return true;\n      case Keys.Enter:\n        if (\n          isInInput ||\n          (isHotKeyEnabled &&\n            document.activeElement.id !== \"vivliostyle-menu-button_apply\" &&\n            document.activeElement.id !== \"vivliostyle-menu-button_cancel\")\n        ) {\n          document.getElementById(\"vivliostyle-menu-button_apply\").focus();\n          return false;\n        }\n        return true;\n      default:\n        return true;\n    }\n  }\n}\n\nexport default SettingsPanel;\n","/*\n * Copyright 2021 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko, { Observable } from \"knockout\";\n\nimport Viewer from \"./viewer\";\nimport Navigation from \"./navigation\";\nimport urlParameters from \"../stores/url-parameters\";\nimport keyUtil from \"../utils/key-util\";\nimport stringUtil from \"../utils/string-util\";\nimport { applyTransformToRect } from \"../utils/scale-util\";\n\nconst { Keys } = keyUtil;\n\ntype WindowWithFind = typeof window & {\n  // Window.find()\n  // https://developer.mozilla.org/en-US/docs/Web/API/Window/find\n  find: (\n    aString: string,\n    aCaseSensitive?: boolean,\n    aBackwards?: boolean,\n    aWrapAround?: boolean,\n    aWholeWord?: boolean,\n    aSearchInFrames?: boolean,\n    aShowDialog?: boolean,\n  ) => boolean;\n};\n\nenum FindStatus {\n  Default = \"\",\n  Searching = \"Searching\",\n  Found = \"Found\",\n  NotFound = \"Not Found\",\n}\n\nclass FindBox {\n  opened: Observable<boolean>;\n  text: Observable<string>;\n  status: Observable<string>;\n  cancel = false;\n  intervalID = 0;\n  foundRange: Range | null = null;\n\n  constructor(\n    public viewer: Viewer,\n    public navigation: Navigation,\n  ) {\n    this.opened = ko.observable();\n    this.text = ko.observable(\"\");\n    this.status = ko.observable(FindStatus.Default);\n\n    this.text.subscribe((text: string) => {\n      if (text != \"\") {\n        urlParameters.setParameter(\n          \"find\",\n          stringUtil.percentEncodeAmpersandAndUnencodedPercent(text),\n        );\n      } else {\n        urlParameters.removeParameter(\"find\");\n      }\n    });\n  }\n\n  toggle = (): boolean => {\n    if (this.opened()) {\n      return this.close();\n    } else {\n      return this.open();\n    }\n  };\n\n  open = (): boolean => {\n    if (this.navigation.isFindBoxDisabled()) {\n      return false;\n    }\n    this.opened(true);\n    window.setTimeout(() => {\n      document.getElementById(\"vivliostyle-find-box\").focus();\n    }, 0);\n    return true;\n  };\n\n  close = (): boolean => {\n    if (this.navigation.isFindBoxDisabled()) {\n      return false;\n    }\n    this.opened(false);\n    if (this.status() === FindStatus.Searching) {\n      this.cancel = true;\n    }\n    this.status(FindStatus.Default);\n    this.foundRange = null;\n    this.fixHighlight();\n    return true;\n  };\n\n  findPrevious = (): boolean => {\n    return this.findSub(true);\n  };\n\n  findNext = (): boolean => {\n    return this.findSub(false);\n  };\n\n  private findSub(backwards: boolean): boolean {\n    if (\n      this.navigation.isFindBoxDisabled() ||\n      this.status() === FindStatus.Searching\n    ) {\n      return false;\n    }\n    if (this.intervalID) {\n      window.clearInterval(this.intervalID);\n      this.intervalID = 0;\n      return true;\n    }\n    const text = this.text();\n    if (!text) {\n      return false;\n    }\n    const currentEPage = this.viewer.epage();\n    let epage = -1;\n    let afterWrappedAround = false;\n    this.status(FindStatus.Searching);\n\n    this.intervalID = window.setInterval(() => {\n      if (this.cancel) {\n        this.cancel = false;\n        this.status(FindStatus.Default);\n        window.clearInterval(this.intervalID);\n        this.intervalID = 0;\n        return;\n      }\n      if (epage === this.viewer.epage()) {\n        // page not changed yet, then continue\n        return;\n      }\n      epage = this.viewer.epage();\n      if (afterWrappedAround || epage !== currentEPage) {\n        window.getSelection().empty();\n      }\n      const found = this.findText(text, backwards);\n      if (found) {\n        this.status(FindStatus.Found);\n        window.clearInterval(this.intervalID);\n        this.intervalID = 0;\n        return;\n      }\n      if (\n        !afterWrappedAround &&\n        (backwards ? this.viewer.firstPage() : this.viewer.lastPage())\n      ) {\n        afterWrappedAround = true;\n        if (this.viewer.firstPage() && this.viewer.lastPage()) {\n          epage = -1;\n        } else if (backwards) {\n          this.viewer.navigateToLast();\n        } else {\n          this.viewer.navigateToFirst();\n        }\n      } else if (\n        !afterWrappedAround ||\n        (backwards ? epage > currentEPage : epage < currentEPage)\n      ) {\n        if (backwards) {\n          this.viewer.navigateToPrevious();\n        } else {\n          this.viewer.navigateToNext();\n        }\n      } else {\n        this.status(FindStatus.NotFound);\n        window.clearInterval(this.intervalID);\n        this.intervalID = 0;\n        if (epage !== currentEPage) {\n          this.viewer.navigateToEPage(currentEPage);\n        }\n      }\n    }, 4);\n\n    return true;\n  }\n\n  private findText(text: string, backwards: boolean): boolean {\n    const selection = window.getSelection();\n    if (selection.type !== \"Range\") {\n      selection.empty();\n    }\n    const windowF = window as WindowWithFind;\n    const findBoxElem = document.getElementById(\"vivliostyle-menu-find-box\");\n    findBoxElem.style.visibility = \"hidden\";\n    if (this.foundRange && selection.rangeCount === 0) {\n      // Restore selection. This is needed because on iOS the selection is\n      // cleared by touching the Find Next/Previous button in the Find box.\n      selection.addRange(this.foundRange);\n      this.foundRange = null;\n      this.fixHighlight();\n    }\n    const found = windowF.find(text, false, backwards);\n    findBoxElem.style.visibility = \"\";\n\n    if (found) {\n      // Check if the found range is in the page content excluding generated page margin box content.\n      if (selection.anchorNode?.parentElement?.closest(\"[data-adapt-eloff]\")) {\n        this.foundRange = selection.getRangeAt(0);\n        this.fixHighlight();\n        return true;\n      } else {\n        return this.findText(text, backwards);\n      }\n    }\n    return false;\n  }\n\n  private fixHighlight(): void {\n    // Workaround for the WebKit bug on iOS:\n    // Selection highlight not shown on programmatic focus after initial load\n    // https://bugs.webkit.org/show_bug.cgi?id=199211\n\n    if (!/iPad|iPhone|iPod/.test(navigator.userAgent)) {\n      // No problem on non-iOS.\n      return;\n    }\n\n    const oldHighlightElements = document.querySelectorAll(\n      \"[data-viv-found-highlight='true']\",\n    );\n    for (const oldHighlightElement of oldHighlightElements) {\n      oldHighlightElement.remove();\n    }\n    if (!this.foundRange) {\n      return;\n    }\n    const parent = this.foundRange.startContainer.parentElement.closest(\n      \"[data-vivliostyle-page-container='true']\",\n    );\n    const parentRect = parent.getBoundingClientRect();\n    for (const clientRect of this.foundRange.getClientRects()) {\n      const rect = applyTransformToRect(clientRect, parentRect);\n      const highlightElement = document.createElement(\"div\");\n      highlightElement.setAttribute(\"data-viv-found-highlight\", \"true\");\n      highlightElement.style.position = \"absolute\";\n      highlightElement.style.left = `${rect.left}px`;\n      highlightElement.style.top = `${rect.top}px`;\n      highlightElement.style.width = `${rect.width}px`;\n      highlightElement.style.height = `${rect.height}px`;\n      highlightElement.style.backgroundColor = \"#0080ff33\";\n      parent.appendChild(highlightElement);\n    }\n  }\n\n  /**\n   * @returns true if the key remains unconsumed\n   */\n  handleKey(\n    key: string,\n    event: KeyboardEvent,\n    findBoxActive: boolean,\n  ): boolean {\n    const ctrlOrMeta = event.ctrlKey || event.metaKey;\n    switch (key) {\n      case Keys.Escape:\n        if (ctrlOrMeta || !this.opened()) {\n          return true;\n        }\n        if (this.status() === FindStatus.Searching) {\n          this.cancel = true;\n          return false;\n        }\n        if (findBoxActive && this.text() !== \"\") {\n          this.text(\"\");\n          this.status(FindStatus.Default);\n          return false;\n        }\n        if (this.close()) {\n          return false;\n        }\n        break;\n      case \"Enter\":\n        if (ctrlOrMeta || !this.opened()) {\n          return true;\n        }\n        if (findBoxActive) {\n          document.getElementById(\"vivliostyle-find-box\").blur();\n        }\n        if (event.shiftKey ? this.findPrevious() : this.findNext()) {\n          return false;\n        }\n        break;\n      case \"f\":\n      case \"F\":\n        if (!ctrlOrMeta) {\n          return true;\n        }\n        if (this.open()) {\n          return false;\n        }\n        break;\n      default:\n        this.status(FindStatus.Default);\n    }\n    return true;\n  }\n}\n\nexport default FindBox;\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko, { PureComputed } from \"knockout\";\n\nimport { MessageQueue } from \"../models/message-queue\";\n\ntype ErrorInfo = {\n  error: {\n    frameTrace: string;\n    stack: string;\n  };\n  messages: Array<string>;\n};\n\nclass MessageDialog {\n  list: MessageQueue;\n  visible: PureComputed<boolean>;\n\n  constructor(queue: MessageQueue) {\n    this.list = queue;\n    this.visible = ko.pureComputed(() => queue().length > 0);\n  }\n\n  getDisplayMessage(errorInfo: ErrorInfo): string {\n    return errorInfo.error?.toString() ?? errorInfo.messages.join(\"\\n\");\n  }\n}\n\nexport default MessageDialog;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport i18nextko from \"i18next-ko\";\nimport Vivliostyle from \"../vivliostyle\";\nimport DocumentOptions from \"../models/document-options\";\nimport ViewerOptions from \"../models/viewer-options\";\nimport messageQueue from \"../models/message-queue\";\nimport Viewer, { ViewerSettings } from \"./viewer\";\nimport Navigation from \"./navigation\";\nimport SettingsPanel from \"./settings-panel\";\nimport FindBox from \"./find-box\";\nimport MessageDialog from \"./message-dialog\";\nimport urlParameters from \"../stores/url-parameters\";\nimport keyUtil from \"../utils/key-util\";\nimport stringUtil from \"../utils/string-util\";\nimport {\n  marksStore,\n  MarksStoreFacade,\n  MarksMenuStatus,\n  MarksBox,\n} from \"./marks-store\";\n\nconst { Keys } = keyUtil;\n\nclass ViewerApp {\n  documentOptions: DocumentOptions;\n  viewerOptions: ViewerOptions;\n  isDebug: boolean;\n  viewerSettings: ViewerSettings;\n  viewer: Viewer;\n  messageDialog: MessageDialog;\n  settingsPanel: SettingsPanel;\n  navigation: Navigation;\n  findBox: FindBox;\n  marksStore: MarksStoreFacade;\n  marksMenuStatus: MarksMenuStatus;\n  marksBox: MarksBox;\n  t = i18nextko.t;\n  i18n = i18nextko.i18n;\n\n  constructor() {\n    // Configuration flags\n    const flags = []\n      .concat(\n        document.documentElement.getAttribute(\n          \"data-vivliostyle-viewer-flags\",\n        ) ?? [],\n        urlParameters.getParameter(\"flags\"),\n      )\n      .join();\n    const disableSettings = flags.includes(\"S\");\n    const settingsPanelOptions = {\n      disablePageStyleChange: disableSettings || flags.includes(\"P\"),\n      disablePageViewModeChange: disableSettings || flags.includes(\"V\"),\n      disableBookModeChange: disableSettings || flags.includes(\"B\"),\n      disableRenderAllPagesChange: disableSettings || flags.includes(\"A\"),\n      disableRestoreViewChange: disableSettings || flags.includes(\"R\"),\n      disableUILanguageChange: disableSettings || flags.includes(\"L\"),\n    };\n    const navigationOptions = {\n      disableTOCNavigation: flags.includes(\"T\"),\n      disableFind: flags.includes(\"f\"),\n      disableMarker: flags.includes(\"m\"),\n      disablePageNavigation: flags.includes(\"N\"),\n      disableZoom: flags.includes(\"Z\"),\n      disableFontSizeChange: flags.includes(\"F\"),\n      disablePageSlider: flags.includes(\"s\"),\n      disablePrint: flags.includes(\"p\"),\n    };\n    const disableContextMenu = flags.includes(\"c\");\n    // const defaultBookMode = flags.includes(\"b\");\n    // Changed to default true (Issue #992)\n    const defaultBookMode = !flags.includes(\"k\");\n    const defaultRenderAllPages = !flags.includes(\"a\");\n    const disableScripts = flags.includes(\"d\");\n\n    if (disableSettings) {\n      const welcome: HTMLElement = document.getElementById(\n        \"vivliostyle-welcome\",\n      );\n      if (welcome) {\n        welcome.remove();\n      }\n      const menuDetail: HTMLElement = document.querySelector(\n        \".vivliostyle-menu-detail\",\n      );\n      const menuDetailMain: HTMLElement = document.querySelector(\n        \".vivliostyle-menu-detail-main\",\n      );\n      if (menuDetail && menuDetailMain) {\n        menuDetailMain.style.visibility = \"hidden\";\n        menuDetail.style.height = \"auto\";\n      }\n    }\n    if (disableContextMenu) {\n      document.oncontextmenu = (): boolean => false;\n    }\n\n    this.documentOptions = new DocumentOptions(defaultBookMode);\n    this.viewerOptions = new ViewerOptions(defaultRenderAllPages);\n\n    if (disableScripts) {\n      this.viewerOptions.allowScripts(false);\n    }\n\n    this.documentOptions.pageStyle.setViewerFontSizeObservable(\n      this.viewerOptions.fontSize,\n    );\n\n    if (this.viewerOptions.profile()) {\n      Vivliostyle.profiler.enable();\n    }\n    this.isDebug = urlParameters.getParameter(\"debug\")[0] === \"true\";\n    this.viewerSettings = {\n      userAgentRootURL: `${urlParameters.getBaseURL()}resources/`,\n      viewportElement: document.getElementById(\"vivliostyle-viewer-viewport\"),\n      debug: this.isDebug,\n    };\n\n    // Replace deprecated \"b\" and \"x\" to \"src\" & \"bookMode\"\n    const srcUrls = urlParameters.getParameter(\"src\");\n    const bUrls = urlParameters.getParameter(\"b\"); // (deprecated) => src & bookMode=true & renderAllPages=false\n    const xUrls = urlParameters.getParameter(\"x\"); // (deprecated) => src & bookMode=false\n    if (!srcUrls.length) {\n      if (bUrls.length) {\n        urlParameters.setParameter(\"src\", bUrls[0]);\n        if (!urlParameters.hasParameter(\"bookMode\")) {\n          urlParameters.setParameter(\"bookMode\", \"true\");\n        }\n        if (!urlParameters.hasParameter(\"renderAllPages\")) {\n          urlParameters.setParameter(\"renderAllPages\", \"false\");\n        }\n      } else if (xUrls.length) {\n        xUrls.forEach((x, i) => {\n          urlParameters.setParameter(\"src\", x, i);\n        });\n        if (!urlParameters.hasParameter(\"bookMode\")) {\n          urlParameters.setParameter(\"bookMode\", \"false\");\n        }\n      }\n    }\n\n    // \"restoreView\" parameter:\n    //  \"true\" - enable restore view settings\n    //  \"false\" - disable restore view settings\n    //  not specified - enable restore view settings if saved view settings exist\n    let restoreView = urlParameters.getParameter(\"restoreView\")[0];\n    if (restoreView !== \"false\") {\n      // The viewing location specified by \"f=epubcfi(…)\" takes precedence over the saved one\n      if (!urlParameters.hasParameter(\"f\")) {\n        if (urlParameters.restoreViewSettings()) {\n          // If saved view settings exist and restored to the URL parameters,\n          // the \"restoreView\" value is also restored and it must be \"true\".\n          restoreView = urlParameters.getParameter(\"restoreView\")[0];\n        }\n      }\n      if (restoreView === \"true\") {\n        urlParameters.enableRestoreView(true);\n      }\n    }\n\n    // Remove redundant or ineffective URL parameters\n    urlParameters.removeParameter(\"b\");\n    urlParameters.removeParameter(\"x\");\n    urlParameters.removeParameter(\"f\", true); // only first one is effective\n    urlParameters.removeParameter(\"spread\", true);\n    urlParameters.removeParameter(\"bookMode\", true);\n    urlParameters.removeParameter(\"allowScripts\", true);\n    urlParameters.removeParameter(\"renderAllPages\", true);\n    urlParameters.removeParameter(\"fontSize\", true);\n    urlParameters.removeParameter(\"zoom\", true);\n    urlParameters.removeParameter(\"find\", true);\n    urlParameters.removeParameter(\"profile\", true);\n    urlParameters.removeParameter(\"debug\", true);\n    urlParameters.removeParameter(\"pixelRatio\", true);\n    urlParameters.removeParameter(\"restoreView\", true);\n    urlParameters.removeParameter(\"lng\", true);\n\n    this.viewer = new Viewer(this.viewerSettings, this.viewerOptions);\n\n    this.viewer.inputUrl.subscribe((inputUrl: string) => {\n      if (inputUrl != \"\") {\n        if (!urlParameters.hasParameter(\"src\")) {\n          // Push current URL to browser history to enable to go back here when browser Back button is clicked.\n          if (urlParameters.history.pushState)\n            urlParameters.history.pushState(null, \"\");\n        }\n        if (inputUrl.startsWith(\"<\")) {\n          // seems start tag, so convert to data url\n          inputUrl = \"data:,\" + stringUtil.percentEncodeForDataURI(inputUrl);\n        } else {\n          inputUrl =\n            stringUtil.percentEncodeAmpersandAndUnencodedPercent(inputUrl);\n        }\n        urlParameters.setParameter(\"src\", inputUrl);\n        this.documentOptions.srcUrls(urlParameters.getParameter(\"src\"));\n      } else {\n        urlParameters.removeParameter(\"src\");\n      }\n    });\n\n    this.messageDialog = new MessageDialog(messageQueue);\n\n    this.settingsPanel = new SettingsPanel(\n      this.viewerOptions,\n      this.documentOptions,\n      this.viewer,\n      this.messageDialog,\n      settingsPanelOptions,\n    );\n\n    this.navigation = new Navigation(\n      this.viewerOptions,\n      this.viewer,\n      this.settingsPanel,\n      navigationOptions,\n    );\n\n    this.findBox = new FindBox(this.viewer, this.navigation);\n\n    const findingText = decodeURIComponent(\n      urlParameters.getParameter(\"find\")[0] ?? \"\",\n    );\n    if (findingText) {\n      this.findBox.text(findingText);\n\n      // TODO(?): Do find after the document is loaded\n      // this.findBox.open();\n      // this.findBox.findNext();\n    }\n\n    this.marksStore = marksStore;\n    this.marksStore.init(this.viewerOptions, this.viewer);\n    this.marksMenuStatus = marksStore.menuStatus;\n    this.marksBox = marksStore.marksBox;\n    this.viewer.rerenderTrigger.subscribe(() => {\n      this.marksStore.retryHighlightMarks();\n    });\n\n    this.viewer.loadDocument(this.documentOptions);\n\n    window.onhashchange = (): void => {\n      if (window.location.href != urlParameters.storedUrl) {\n        // Reload when address bar change is detected\n        window.location.reload();\n      }\n    };\n  }\n\n  /**\n   * @returns true if the key remains unconsumed\n   */\n  handleKey(data: ViewerApp, event: KeyboardEvent): boolean {\n    if (\n      event.isComposing ||\n      (event.keyCode &&\n        ((event.key === \"Enter\" &&\n          event.keyCode !== 13 &&\n          event.keyCode !== 16) ||\n          (event.key === \"Escape\" && event.keyCode !== 27)))\n    ) {\n      // Enter/Escape key may be pressed to confirm/cancel kana-kanji conversion.\n      return true;\n    }\n    const key = keyUtil.identifyKeyFromEvent(event);\n    if (document.activeElement.id === \"vivliostyle-input-url\") {\n      if (key === \"Enter\") {\n        this.viewer.loadDocument(this.documentOptions);\n        return false;\n      }\n      return true;\n    }\n    if (document.activeElement.id === \"vivliostyle-find-box\") {\n      return this.findBox.handleKey(key, event, true);\n    }\n    let ret = this.findBox.handleKey(key, event, false);\n    if (!ret) {\n      return false;\n    }\n    if (\n      key !== Keys.Escape &&\n      document.activeElement.closest(\n        \"#vivliostyle-marks-box, #vivliostyle-text-selection-start-button, #vivliostyle-text-selection-edit-menu, [data-vivliostyle-page-container]\",\n      )\n    ) {\n      return true;\n    }\n    if (\n      (!(key === \"Home\" || key === \"End\" || key === \"p\" || key === \"P\") &&\n        (event.ctrlKey || event.metaKey)) ||\n      event.altKey ||\n      event.shiftKey\n    ) {\n      return true;\n    }\n    ret = this.settingsPanel.handleKey(key);\n    if (ret) {\n      ret = this.navigation.handleKey(key);\n    }\n    return ret;\n  }\n}\n\nexport default ViewerApp;\n","/*\n * Copyright 2015 Daishinsha Inc.\n * Copyright 2019 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko from \"knockout\";\n\nconst supportTouchEvents = \"ontouchstart\" in window;\n\nko.bindingHandlers.menuButton = {\n  init(element, valueAccessor): void {\n    if (ko.unwrap(valueAccessor())) {\n      if (supportTouchEvents) {\n        element.addEventListener(\"touchstart\", () => {\n          ko.utils.toggleDomNodeCssClass(element, \"hover active\", true);\n        });\n        element.addEventListener(\"touchend\", () => {\n          ko.utils.toggleDomNodeCssClass(element, \"hover active\", false);\n        });\n      } else {\n        element.addEventListener(\"mouseover\", () => {\n          ko.utils.toggleDomNodeCssClass(element, \"hover\", true);\n        });\n        element.addEventListener(\"mousedown\", () => {\n          ko.utils.toggleDomNodeCssClass(element, \"active\", true);\n        });\n        element.addEventListener(\"mouseup\", () => {\n          ko.utils.toggleDomNodeCssClass(element, \"active\", false);\n        });\n        element.addEventListener(\"mouseout\", () => {\n          ko.utils.toggleDomNodeCssClass(element, \"hover\", false);\n          ko.utils.toggleDomNodeCssClass(element, \"active\", false);\n        });\n      }\n    }\n  },\n};\n","/*\n * Copyright 2018 Vivliostyle Foundation\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko from \"knockout\";\n\nconst supportTouchEvents = \"ontouchstart\" in window;\n\nlet xStart = null;\nlet yStart = null;\nlet arrowButton = null;\n\nko.bindingHandlers.swipePages = {\n  init(element, valueAccessor): void {\n    if (supportTouchEvents && ko.unwrap(valueAccessor())) {\n      element.addEventListener(\"touchstart\", (event) => {\n        if (event.touches.length > 1) {\n          return; // multi-touch is not for page swipe\n        }\n        if (window.visualViewport && window.visualViewport.scale > 1) {\n          return; // disable page swipe when pinch-zoomed\n        }\n        const viewportElement = document.getElementById(\n          \"vivliostyle-viewer-viewport\",\n        );\n        if (\n          viewportElement &&\n          viewportElement.scrollWidth > viewportElement.clientWidth\n        ) {\n          return; // disable page swipe when horizontal scrollable\n        }\n        if (document.getSelection().type === \"Range\") {\n          return; // disable page swipe during text selection\n        }\n        xStart = event.touches[0].clientX;\n        yStart = event.touches[0].clientY;\n      });\n      element.addEventListener(\"touchmove\", (event) => {\n        if (event.touches.length > 1) {\n          return;\n        }\n        if (document.getSelection().type === \"Range\") {\n          return; // disable page swipe during text selection\n        }\n        if (xStart !== null && yStart !== null) {\n          const xDiff = event.touches[0].clientX - xStart;\n          const yDiff = event.touches[0].clientY - yStart;\n          if (Math.abs(xDiff) > Math.abs(yDiff)) {\n            if (xDiff < 0) {\n              // swipe to left = go to right\n              arrowButton = document.getElementById(\n                \"vivliostyle-page-navigation-right\",\n              );\n            } else {\n              // swipe to right = go to left\n              arrowButton = document.getElementById(\n                \"vivliostyle-page-navigation-left\",\n              );\n            }\n          }\n          if (Math.abs(xDiff) + Math.abs(yDiff) >= 16) {\n            if (arrowButton) {\n              arrowButton.click();\n              ko.utils.toggleDomNodeCssClass(arrowButton, \"active\", true);\n            }\n            xStart = null;\n            yStart = null;\n          }\n        }\n      });\n      element.addEventListener(\"touchend\", () => {\n        if (arrowButton) {\n          ko.utils.toggleDomNodeCssClass(arrowButton, \"active\", false);\n        }\n        arrowButton = null;\n        xStart = null;\n        yStart = null;\n      });\n    }\n  },\n};\n","/*\n * Copyright 2023 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko from \"knockout\";\nimport {\n  marksMenuStatus,\n  marksStore,\n  processSelection,\n} from \"../viewmodels/marks-store\";\n\nko.bindingHandlers.textSelection = {\n  init(element, valueAccessor): void {\n    const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\n    let mousedown = false;\n    if (ko.unwrap(valueAccessor())) {\n      element.addEventListener(\"mousedown\", () => {\n        if (!mousedown && document.getSelection().type !== \"Range\") {\n          mousedown = true;\n        }\n      });\n      document.addEventListener(\"mouseup\", () => {\n        if (mousedown) {\n          if (marksStore.enabled()) {\n            processSelection(document.getSelection());\n          }\n          mousedown = false;\n        }\n      });\n\n      const pageNavLeft = document.getElementById(\n        \"vivliostyle-page-navigation-left\",\n      );\n      const pageNavRight = document.getElementById(\n        \"vivliostyle-page-navigation-right\",\n      );\n      if (pageNavLeft && pageNavRight) {\n        // Prevent wrong text selection touching page-left/right navigation buttons\n        pageNavLeft.onpointermove = pageNavRight.onpointermove = (): boolean =>\n          false;\n        pageNavLeft.ontouchmove = pageNavRight.ontouchmove = (): boolean =>\n          false;\n      }\n      let timeoutID = 0;\n\n      document.addEventListener(\"selectionchange\", () => {\n        const selection = document.getSelection();\n        if (selection.type !== \"Range\") {\n          return;\n        }\n        const range = selection.getRangeAt(0);\n        if (\n          !range.commonAncestorContainer.parentElement.closest(\n            \"[data-vivliostyle-spread-container]\",\n          )\n        ) {\n          return;\n        }\n        const pageArea = range.commonAncestorContainer.parentElement.closest(\n          \"[data-vivliostyle-page-box] > div\",\n        ) as HTMLElement;\n        const zIndex = pageArea?.style.zIndex;\n\n        // To prevent wrong text selection\n        // - minimize page-left/right navigation buttons\n        // - increase z-index of pageArea\n        if (!timeoutID) {\n          if (pageNavLeft && pageNavRight) {\n            if (iOS) {\n              // On iOS, `.ontouchmove = () => false` does not work to prevent\n              // wrong text selection, so we need to hide navigation buttons.\n              pageNavLeft.style.display = \"none\";\n              pageNavRight.style.display = \"none\";\n            } else {\n              pageNavLeft.style.height = \"min-content\";\n              pageNavRight.style.height = \"min-content\";\n            }\n          }\n          if (pageArea && zIndex === \"0\") {\n            pageArea.style.zIndex = \"1\";\n          }\n          timeoutID = window.setTimeout(() => {\n            // Restore changed styles after 1 second\n            if (pageNavLeft && pageNavRight) {\n              pageNavLeft.style.display = \"\";\n              pageNavRight.style.display = \"\";\n              pageNavLeft.style.height = \"\";\n              pageNavRight.style.height = \"\";\n            }\n            if (pageArea) {\n              pageArea.style.zIndex = zIndex;\n            }\n            timeoutID = 0;\n          }, 1000);\n        }\n\n        if (!mousedown && marksStore.enabled()) {\n          // For touch devices\n          if (marksMenuStatus.menuOpened()) {\n            marksMenuStatus.applyEditing();\n          }\n          if (marksMenuStatus.startButtonOpened()) {\n            marksMenuStatus.startButtonOpened(false);\n          }\n          processSelection(selection);\n        }\n      });\n    }\n  },\n};\n","/*\n * Copyright 2023 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko from \"knockout\";\n\nko.bindingHandlers.clickOutside = {\n  init(element, valueAccessor): void {\n    const callback = ko.utils.unwrapObservable(valueAccessor());\n    document.addEventListener(\"mousedown\", (e: Event) => {\n      if (window.getComputedStyle(element).display == \"none\") {\n        return;\n      }\n      if (!(element.contains(e.target) || element === e.target)) {\n        callback();\n      }\n    });\n  },\n};\n","/*\n * Copyright 2023 Vivliostyle Foundation\n *\n * Vivliostyle.js is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle.js is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle.js.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport i18nextko from \"i18next-ko\";\nimport ko from \"knockout\";\n\nconst translations = {\n  en: {\n    translation: {\n      UI_LNG: \"en\",\n      TIP_UI_Language: \"Language of UI\",\n      CONFIRM_DELETE: \"Do you really want to delete it?\",\n      CONFIRM_REMOVE: \"Do you really want to remove it?\",\n      CONFIRM_REMOVE_ALL: \"Do you really want to remove all?\",\n      Input_: \"Input a document URL or HTML code\",\n      Book_Mode: \"Book Mode\",\n      Render_All_Pages: \"Render All Pages\",\n      Apply: \"Apply\",\n      Supported_document_types_: \"Supported document types:\",\n      HTML_documents_: \"HTML documents, with CSS for paged media\",\n      Book_like_publications_: \"Book-like publications, with Table of Contents\",\n      Web_publications_:\n        \"Web publications (a collection of HTML documents): specify URL of the first HTML or the manifest file.\",\n      Unzipped_EPUB_:\n        \"Unzipped EPUB: specify URL of OPF file or top directory of the unzipped EPUB files.\",\n      Notes_: \"Notes:\",\n      GitHub_:\n        \"GitHub and Gist URLs can be directly specified. Vivliostyle loads raw github/gist content when such URL is specified.\",\n      WARN_Mixed_Content_:\n        \"⚠️Mixed Content (“http:” URL is specified to “https:” Vivliostyle Viewer) is usually blocked by browser.\",\n      WARN_Cross_Origin_:\n        \"⚠️Cross-Origin (request to different domain) is usually blocked by browser unless the server is configured to allow Cross-Origin Resource Sharing (CORS).\",\n      URL_parameter_options_: \"URL parameter options:\",\n      document_URL: \"document URL\",\n      default_: \"(default)\",\n      for_Book_like_: \"for Book-like publications\",\n      DESC_Book_Mode_:\n        \"When an HTML document URL is specified, a series of HTML documents linked from the publication manifest or Table of Contents (e.g., marked up with '<nav role=\\\"doc-toc\\\">') are automatically loaded.\",\n      for_single_HTML_: \"for single HTML documents\",\n      for_Print_:\n        \"for Print (all pages printable, page count works as expected)\",\n      for_Read_: \"for Read (quick loading with rough page count)\",\n      Page_Spread_View: \"Page Spread View\",\n      Spread_view: \"Spread view\",\n      Single_page_view: \"Single page view\",\n      Auto_spread_view: \"Auto spread view\",\n      additional_stylesheet_URL: \"additional (custom) stylesheet URL\",\n      user_stylesheet_URL: \"user stylesheet URL\",\n      Settings: \"Settings\",\n      DESC_Options_also_1: \"Options can also be set in the \",\n      DESC_Options_also_2: \" panel.\",\n      See_documentation_: \"For more details, see documentation:\",\n      HREF_User_Guide: \"../docs/#/user-guide\",\n      Vivliostyle_User_Guide: \"Vivliostyle User Guide\",\n      HREF_Vivlistyle_Home: \"https://vivliostyle.org/\",\n      navigate_to_left: \"navigate to left\",\n      navigate_to_right: \"navigate to right\",\n      Highlight_: \"Highlight…\",\n      Marker_Yellow: \"Marker: Yellow\",\n      Marker_Red: \"Marker: Red\",\n      Marker_Green: \"Marker: Green\",\n      OK: \"OK\",\n      Cancel: \"Cancel\",\n      Delete: \"Delete\",\n      TIP_Settings: \"Settings (S), Double click/type to pin\",\n      Page_View_Mode: \"Page View Mode\",\n      Auto: \"Auto\",\n      Single_page: \"Single page\",\n      Spread: \"Spread\",\n      TIP_Book_Mode:\n        \"On: for Book-like publications, with Table of Contents\\nOff: for single HTML documents\",\n      TIP_Render_All_Pages:\n        \"On: for Print (all pages printable, page count works)\\nOff: for Read (quick loading with rough page count)\",\n      Restore_View: \"Restore View\",\n      TIP_Restore_View: \"Restore view settings when reopening documents\",\n      Custom_Style_Settings: \"Custom Style Settings\",\n      Page_Size: \"Page Size\",\n      Default: \"Default\",\n      DESC_page_size_default: \"(=Auto unless specified elsewhere)\",\n      DESC_page_size_auto: \"(use entire window area)\",\n      Preset: \"Preset\",\n      Landscape: \"Landscape\",\n      Custom_size: \"Custom size\",\n      Width: \"Width\",\n      Height: \"Height\",\n      More_: \"More…\",\n      Crop_Marks: \"Crop Marks\",\n      Crop_marks: \"Crop marks\",\n      Bleed: \"Bleed\",\n      Crop_offset: \"Crop offset\",\n      Page_Margins: \"Page Margins\",\n      DESC_page_margin_default: \"(=10% unless specified elsewhere)\",\n      Set_page_margin_to_0: \"Set page margin to 0\",\n      Custom_margin: \"Custom margin\",\n      Top_Right_Bottom_Left: \"Top/Right/Bottom/Left\",\n      Set_first_page_margin_to_0: \"Set first page margin to 0\",\n      Force_html_body_margin_to_0: \"Force html/body margin to 0\",\n      Page_Breaks: \"Page Breaks\",\n      Default_widows_orphans_control: \"Default widows/orphans control\",\n      Allow_widows_and_orphans: \"Allow widows and orphans\",\n      Avoid_page_break_inside_paragraph: \"Avoid page break inside paragraph\",\n      Images: \"Images\",\n      Set_image_max_size_to_fit_page: \"Set image max-size to fit page\",\n      Keep_aspect_ratio: \"Keep aspect ratio\",\n      Text: \"Text\",\n      Font_size: \"Font size\",\n      Base_font_size: \"Base font-size\",\n      Base_line_height: \"Base line-height\",\n      Base_font_family: \"Base font-family\",\n      Custom_Style_Priority: \"Custom Style Priority\",\n      Set_as_user_stylesheet: \"Set as user stylesheet\",\n      DESC_user_stylesheet: \"(lower priority unless !important)\",\n      Force_override_document_style: \"Force override document style\",\n      important_: \"(!important)\",\n      Edit_CSS: \"Edit CSS\",\n      Dont_edit_: \"Don't edit between /*<viewer>*/ and /*</viewer>*/.\",\n      Reset_Custom_Style: \"Reset Custom Style\",\n      Reset_all_to_default: \"Reset all to default\",\n      TIP_ToC: \"Table of Contents (T), Double click/type to pin\",\n      TIP_Marker: \"Marker (M), Double click/type to pin\",\n      Marks_and_Memos: \"Marks and Memos\",\n      Remove_All: \"Remove All\",\n      Remove: \"Remove\",\n      Memo: \"Memo\",\n      TIP_Find: \"Find (Ctrl/Cmd+F)\",\n      TIP_Find_Previous: \"Find Previous (Shift+Enter)\",\n      TIP_Find_Next: \"Find Next (Enter)\",\n      Find: \"Find\",\n      TIP_First_Page: \"First Page (Home)\",\n      TIP_Previous_Page: \"Previous Page (↑)\",\n      TIP_Next_Page: \"Next Page (↓)\",\n      TIP_Last_Page: \"Last Page (End)\",\n      TIP_Go_to_Page: \"Go to Page… (G)\",\n      Total_pages: \"Total pages\",\n      TIP_Text_Smaller: \"Text: Smaller (-)\",\n      TIP_Text_Larger: \"Text: Larger (+)\",\n      TIP_Text_Default_Size: \"Text: Default Size (0)\",\n      TIP_Zoom_Out: \"Zoom: Out (O)\",\n      TIP_Zoom_In: \"Zoom: In (I)\",\n      TIP_Zoom_Actual_Size: \"Zoom: Actual Size (1)\",\n      TIP_Zoom_Fit_to_Screen: \"Zoom: Fit to Screen (F)\",\n      TIP_Print: \"Print (P)\",\n    },\n  },\n  ja: {\n    translation: {\n      UI_LNG: \"ja\",\n      TIP_UI_Language: \"UI表示言語 (L)\",\n      CONFIRM_DELETE: \"本当に削除しますか？\",\n      CONFIRM_REMOVE: \"本当に削除しますか？\",\n      CONFIRM_REMOVE_ALL: \"本当にすべて削除しますか？\",\n      Input_: \"ドキュメントURLまたはHTMLコードを入力\",\n      Book_Mode: \"Bookモード\",\n      Render_All_Pages: \"全ページ組版\",\n      Apply: \"適用\",\n      Supported_document_types_: \"サポートされている文書の種類：\",\n      HTML_documents_: \"HTML文書＋ページメディア用のCSS\",\n      Book_like_publications_: \"本のような出版物（目次付き）\",\n      Web_publications_:\n        \"Web出版物（複数のHTML文書からなるコレクション）: 最初のHTMLまたはマニフェストファイルのURLを指定します。\",\n      Unzipped_EPUB_:\n        \"ZIP解凍済みのEPUB: OPFファイルのURLまたは解凍されたEPUBファイルのトップディレクトリを指定します。\",\n      Notes_: \"メモ：\",\n      GitHub_:\n        \"GitHubとGistのURLを直接指定することができます。そのようなURLが指定された場合、Vivliostyle は github/gist の raw コンテンツをロードします。\",\n      WARN_Mixed_Content_:\n        \"⚠️Mixedコンテンツ（“http:” のURLが “https:” の Vivliostyle Viewer に指定された場合）は通常ブラウザによってブロックされます。\",\n      WARN_Cross_Origin_:\n        \"⚠️Cross-Origin（異なるドメインへのリクエスト）は、サーバーが Cross-Origin Resource Sharing (CORS) を許可するように設定されていない限り、通常はブラウザによってブロックされます。\",\n      URL_parameter_options_: \"URLパラメータのオプション：\",\n      document_URL: \"ドキュメントURL\",\n      default_: \"(デフォルト)\",\n      for_Book_like_: \"本のような出版物（目次付き）用\",\n      DESC_Book_Mode_:\n        \"HTML文書のURLが指定された場合、その出版物マニフェストまたは目次（'<nav role=\\\"doc-toc\\\">' などでマークアップ）からリンクされた一連のHTML文書が自動的に読み込まれます。\",\n      for_single_HTML_: \"単体のHTML文書用\",\n      for_Print_:\n        \"印刷用（すべてのページが印刷可能で、ページ番号は期待されるとおりに機能します）\",\n      for_Read_: \"閲覧用（おおまかなページ番号を使って、クイックロード）\",\n      Page_Spread_View: \"ページ見開き表示\",\n      Spread_view: \"見開き表示\",\n      Single_page_view: \"単ページ表示\",\n      Auto_spread_view: \"自動見開き表示\",\n      additional_stylesheet_URL: \"追加（カスタム）スタイルシートURL\",\n      user_stylesheet_URL: \"ユーザースタイルシートURL\",\n      Settings: \"設定\",\n      DESC_Options_also_1: \"オプションは設定パネル（\",\n      DESC_Options_also_2: \"）でも設定できます。\",\n      See_documentation_: \"詳しくは、Vivliostyleのドキュメントをご覧ください：\",\n      HREF_User_Guide: \"../docs/#/ja/user-guide\",\n      Vivliostyle_User_Guide: \"Vivliostyle ユーザーガイド\",\n      HREF_Vivlistyle_Home: \"https://vivliostyle.org/ja/\",\n      navigate_to_left: \"左にページ移動\",\n      navigate_to_right: \"右にページ移動\",\n      Highlight_: \"ハイライト…\",\n      Marker_Yellow: \"マーカー: 黄\",\n      Marker_Red: \"マーカー: 赤\",\n      Marker_Green: \"マーカー: 緑\",\n      OK: \"OK\",\n      Cancel: \"キャンセル\",\n      Delete: \"削除\",\n      TIP_Settings: \"設定 (S), ダブルクリックで固定\",\n      Page_View_Mode: \"ページ表示モード (P)\",\n      Auto: \"自動\",\n      Single_page: \"単ページ\",\n      Spread: \"見開き\",\n      TIP_Book_Mode:\n        \"ON: 本のような出版物（目次付き）用\\nOFF: 単体のHTML文書用\",\n      TIP_Render_All_Pages:\n        \"ON: 印刷用（すべてのページが印刷可能で、ページ番号は期待されるとおりに機能します）\\nOFF: 閲覧用（おおまかなページ番号を使って、クイックロード）\",\n      Restore_View: \"閲覧状態を復元\",\n      TIP_Restore_View: \"文書を開き直すとき閲覧状態を復元\",\n      Custom_Style_Settings: \"カスタムスタイル設定 (C)\",\n      Page_Size: \"ページサイズ\",\n      Default: \"デフォルト\",\n      DESC_page_size_default: \"(=自動、特に指定のない限り)\",\n      DESC_page_size_auto: \"(ウィンドウの全領域を使用)\",\n      Preset: \"プリセット\",\n      Landscape: \"ランドスケープ\",\n      Custom_size: \"カスタムサイズ\",\n      Width: \"幅\",\n      Height: \"高さ\",\n      More_: \"詳細… (M)\",\n      Crop_Marks: \"トンボ設定\",\n      Crop_marks: \"Crop marks\",\n      Bleed: \"Bleed\",\n      Crop_offset: \"Crop offset\",\n      Page_Margins: \"ページマージン\",\n      DESC_page_margin_default: \"(=10%、特に指定のない限り)\",\n      Set_page_margin_to_0: \"ページのマージンを0にする\",\n      Custom_margin: \"カスタムマージン\",\n      Top_Right_Bottom_Left: \"上/右/下/左\",\n      Set_first_page_margin_to_0: \"先頭ページのマージンを0にする\",\n      Force_html_body_margin_to_0: \"html/bodyのマージンを強制的に0にする\",\n      Page_Breaks: \"ページ分割処理\",\n      Default_widows_orphans_control: \"デフォルトのwidows/orphansの制御\",\n      Allow_widows_and_orphans: \"widow/orphanが生じるのを許容\",\n      Avoid_page_break_inside_paragraph: \"段落内で改ページしないようにする\",\n      Images: \"画像\",\n      Set_image_max_size_to_fit_page: \"画像の最大サイズをページに収める\",\n      Keep_aspect_ratio: \"アスペクト比を維持\",\n      Text: \"テキスト\",\n      Font_size: \"文字サイズ\",\n      Base_font_size: \"基本の font-size\",\n      Base_line_height: \"基本の line-height\",\n      Base_font_family: \"基本の font-family\",\n      Custom_Style_Priority: \"カスタムスタイルの優先度\",\n      Set_as_user_stylesheet: \"ユーザースタイルシート扱いにする\",\n      DESC_user_stylesheet: \"(!important の指定がない限り低い優先度)\",\n      Force_override_document_style: \"ドキュメントのスタイルを強制的に上書き\",\n      important_: \"(!important)\",\n      Edit_CSS: \"CSSを編集 (E)\",\n      Dont_edit_: \"/*<viewer>*/ と /*</viewer>*/ の間は編集しないこと\",\n      Reset_Custom_Style: \"カスタムスタイルをリセット (R)\",\n      Reset_all_to_default: \"すべてをデフォルトにリセット\",\n      TIP_ToC: \"目次 (T), ダブルクリックで固定\",\n      TIP_Marker: \"マーカー (M), ダブルクリックで固定\",\n      Marks_and_Memos: \"マーカーとメモ\",\n      Remove_All: \"すべて削除\",\n      Remove: \"削除\",\n      Memo: \"メモ\",\n      TIP_Find: \"検索 (Ctrl/Cmd+F)\",\n      TIP_Find_Previous: \"前を検索 (Shift+Enter)\",\n      TIP_Find_Next: \"次を検索 (Enter)\",\n      Find: \"検索\",\n      TIP_First_Page: \"最初のページ (Home)\",\n      TIP_Previous_Page: \"前のページ (↑)\",\n      TIP_Next_Page: \"次のページ (↓)\",\n      TIP_Last_Page: \"最後のページ (End)\",\n      TIP_Go_to_Page: \"ページ番号… (G)\",\n      Total_pages: \"総ページ数\",\n      TIP_Text_Smaller: \"文字を小さく (-)\",\n      TIP_Text_Larger: \"文字を大きく (+)\",\n      TIP_Text_Default_Size: \"デフォルトの文字サイズ (0)\",\n      TIP_Zoom_Out: \"縮小 (O)\",\n      TIP_Zoom_In: \"拡大 (I)\",\n      TIP_Zoom_Actual_Size: \"実際のサイズ (1)\",\n      TIP_Zoom_Fit_to_Screen: \"画面に合わせる (F)\",\n      TIP_Print: \"印刷 (P)\",\n    },\n  },\n  \"zh-Hans\": {\n    translation: {\n      UI_LNG: \"zh-Hans\",\n      TIP_UI_Language: \"语言\",\n      CONFIRM_DELETE: \"你确定要删除它吗?\",\n      CONFIRM_REMOVE: \"你确定要移除它吗?\",\n      CONFIRM_REMOVE_ALL: \"你确定要全部移除吗?\",\n      Input_: \"请输入文档URL或HTML代码\",\n      Book_Mode: \"图书模式\",\n      Render_All_Pages: \"渲染所有页面\",\n      Apply: \"应用\",\n      Supported_document_types_: \"支持的文档类型:\",\n      HTML_documents_: \"带有分页媒体的css HTML 文档\",\n      Book_like_publications_: \"类似书籍的出版物,带有目录\",\n      Web_publications_:\n        \"Web出版物(一组HTML文档集合): 指定第一个HTML或声明文件的URL。\",\n      Unzipped_EPUB_:\n        \"解压缩EPUB:指定OPF文件的URL或解压缩后EPUB文件的顶级目录。\",\n      Notes_: \"注意:\",\n      GitHub_:\n        \"可以直接指定GitHub和Gist网址。当指定了此类网址时,Vivliostyle会加载原始GitHub/Gist的内容。\",\n      WARN_Mixed_Content_:\n        \"⚠️混合内容(如果“http:”的URL被指定为“https:”的Vivliostyle Viewer)通常会被浏览器屏蔽。\",\n      WARN_Cross_Origin_:\n        \"⚠️除非服务器设置为允许跨域请求(CORS)，否则对不同域的请求通常会被浏览器阻止。\",\n      URL_parameter_options_: \"URL 参数选项:\",\n      document_URL: \"文档 URL\",\n      default_: \"(默认)\",\n      for_Book_like_: \"用于类似图书出版物\",\n      DESC_Book_Mode_:\n        \"当指定一个HTML文档URL, 来自出版物清单或者目录(例如, 带有 '<nav role=\\\"doc-toc\\\">'标记)一系列的html文档链接会自动被加载。\",\n      for_single_HTML_: \"用户单个 HTML 文档\",\n      for_Print_: \"为了打印（所有页面均可被打印，页数计算也是正常的）\",\n      for_Read_: \"为了阅读（快速加载粗略页数计算）\",\n      Page_Spread_View: \"页面视图对页\",\n      Spread_view: \"对页视图\",\n      Single_page_view: \"单页视图\",\n      Auto_spread_view: \"自动对页\",\n      additional_stylesheet_URL: \"附加 (自定义) 样式表 URL\",\n      user_stylesheet_URL: \"用户样式表 URL\",\n      Settings: \"设置\",\n      DESC_Options_also_1: \"选项也可在\",\n      DESC_Options_also_2: \"面板设置。\",\n      See_documentation_: \"有关更多详细信息，请参阅文档:\",\n      HREF_User_Guide: \"../docs/#/user-guide\",\n      Vivliostyle_User_Guide: \"Vivliostyle 用户指南\",\n      HREF_Vivlistyle_Home: \"https://vivliostyle.org/\",\n      navigate_to_left: \"向左导航\",\n      navigate_to_right: \"向右导航\",\n      Highlight_: \"高亮…\",\n      Marker_Yellow: \"标记: 黄\",\n      Marker_Red: \"标记: 红\",\n      Marker_Green: \"标记: 绿\",\n      OK: \"确认\",\n      Cancel: \"取消\",\n      Delete: \"删除\",\n      TIP_Settings: \"设置 (S),双击/双敲击键以固定\",\n      Page_View_Mode: \"界面视图模式\",\n      Auto: \"自动\",\n      Single_page: \"单页\",\n      Spread: \"对页\",\n      TIP_Book_Mode: \"On: 为了类似图书出版物带有目录\\nOff: 为了单 HTML 文档\",\n      TIP_Render_All_Pages:\n        \"On: 为了打印(所有页面可打印, 页面计数正常工作)\\nOff: 为了阅读 (快速加载粗略计数)\",\n      Restore_View: \"恢复阅览状态\",\n      TIP_Restore_View: \"重新打开文档时恢复视图设置\",\n      Custom_Style_Settings: \"自定义样式设置\",\n      Page_Size: \"页面大小\",\n      Default: \"默认\",\n      DESC_page_size_default: \"(=自动 除非另外设置)\",\n      DESC_page_size_auto: \"(使用整个窗口面积)\",\n      Preset: \"预设\",\n      Landscape: \"横向\",\n      Custom_size: \"自定义尺寸\",\n      Width: \"宽度\",\n      Height: \"高度\",\n      More_: \"详细...\",\n      Crop_Marks: \"裁剪标记\",\n      Crop_marks: \"裁剪标记\",\n      Bleed: \"出血\",\n      Crop_offset: \"裁剪偏移\",\n      Page_Margins: \"页面边距\",\n      DESC_page_margin_default: \"(=10% 除非另外设置)\",\n      Set_page_margin_to_0: \"设置页面边距为 0\",\n      Custom_margin: \"自定义边距\",\n      Top_Right_Bottom_Left: \"顶部/右侧/底部/左侧\",\n      Set_first_page_margin_to_0: \"设置第一页的边距为 0\",\n      Force_html_body_margin_to_0: \"强制 html/body 边距为 0\",\n      Page_Breaks: \"分页\",\n      Default_widows_orphans_control: \"默认 widows/orphans 控制\",\n      Allow_widows_and_orphans: \"允许产生widows 和 orphans\",\n      Avoid_page_break_inside_paragraph: \"避免段落内出现分页\",\n      Images: \"图片\",\n      Set_image_max_size_to_fit_page: \"图像最大尺寸设置为适合页面\",\n      Keep_aspect_ratio: \"保持长宽比\",\n      Text: \"文本\",\n      Font_size: \"字体大小\",\n      Base_font_size: \"基础 字号\",\n      Base_line_height: \"基础 行高\",\n      Base_font_family: \"基础 字体\",\n      Custom_Style_Priority: \"自定义 Style 属性\",\n      Set_as_user_stylesheet: \"设置为用户样式表\",\n      DESC_user_stylesheet: \"(低优先级除非 !important)\",\n      Force_override_document_style: \"强制覆盖document的样式\",\n      important_: \"(!important)\",\n      Edit_CSS: \"编辑 CSS\",\n      Dont_edit_: \"不要在 /*<viewer>*/ 和 /*</viewer>*/之间进行编辑\",\n      Reset_Custom_Style: \"重置自定义样式\",\n      Reset_all_to_default: \"重置所有\",\n      TIP_ToC: \"目录 (T), 双击/双敲击键以固定\",\n      TIP_Marker: \"标记 (M), 双击/双敲击键以固定\",\n      Marks_and_Memos: \"标记和备忘录\",\n      Remove_All: \"移除所有\",\n      Remove: \"移除\",\n      Memo: \"备忘录\",\n      TIP_Find: \"查找 (Ctrl/Cmd+F)\",\n      TIP_Find_Previous: \"查找上一个 (Shift+Enter)\",\n      TIP_Find_Next: \"查找下一个 (Enter)\",\n      Find: \"查找\",\n      TIP_First_Page: \"首页 (Home)\",\n      TIP_Previous_Page: \"上一页 (↑)\",\n      TIP_Next_Page: \"下一页 (↓)\",\n      TIP_Last_Page: \"最后一页(End)\",\n      TIP_Go_to_Page: \"跳转到… (G)\",\n      Total_pages: \"总页数\",\n      TIP_Text_Smaller: \"文本: 小 (-)\",\n      TIP_Text_Larger: \"文本: 大 (+)\",\n      TIP_Text_Default_Size: \"文本: 默认尺寸 (0)\",\n      TIP_Zoom_Out: \"缩小 (O)\",\n      TIP_Zoom_In: \"放大 (I)\",\n      TIP_Zoom_Actual_Size: \"缩放: 实际大小 (1)\",\n      TIP_Zoom_Fit_to_Screen: \"缩放: 适应屏幕 (F)\",\n      TIP_Print: \"打印 (P)\",\n    },\n  },\n  \"zh-Hant\": {\n    translation: {\n      UI_LNG: \"zh-Hant\",\n      TIP_UI_Language: \"語言\",\n      CONFIRM_DELETE: \"你確定要刪除它嗎?\",\n      CONFIRM_REMOVE: \"你確定要移除它嗎?\",\n      CONFIRM_REMOVE_ALL: \"你確定要全部移除嗎?\",\n      Input_: \"請輸入文檔URL或HTML代碼\",\n      Book_Mode: \"圖書模式\",\n      Render_All_Pages: \"渲染所有頁面\",\n      Apply: \"應用\",\n      Supported_document_types_: \"支持的文檔類型:\",\n      HTML_documents_: \"帶有分頁媒體的css HTML 文檔\",\n      Book_like_publications_: \"類似書籍的出版物,帶有目錄\",\n      Web_publications_:\n        \"Web出版物(一組HTML文檔集合): 指定第一個HTML或聲明文件的URL。\",\n      Unzipped_EPUB_:\n        \"解壓縮EPUB:指定OPF文件的URL或解壓縮後EPUB文件的頂級目錄。\",\n      Notes_: \"注意:\",\n      GitHub_:\n        \"可以直接指定GitHub和Gist網址。當指定了此類網址時,Vivliostyle會加載原始GitHub/Gist的內容。\",\n      WARN_Mixed_Content_:\n        \"⚠️混合內容(如果“http:”的URL被指定爲“https:”的Vivliostyle Viewer)通常會被瀏覽器屏蔽。\",\n      WARN_Cross_Origin_:\n        \"⚠️除非服務器設置爲允許跨域請求(CORS)，否則對不同域的請求通常會被瀏覽器阻止。\",\n      URL_parameter_options_: \"URL 參數選項:\",\n      document_URL: \"文檔 URL\",\n      default_: \"(默認)\",\n      for_Book_like_: \"用於類似圖書出版物\",\n      DESC_Book_Mode_:\n        \"當指定一個HTML文檔URL, 來自出版物清單或者目錄(例如, 帶有 '<nav role=\\\"doc-toc\\\">'標記)一系列的html文檔鏈接會自動被加載。\",\n      for_single_HTML_: \"用戶單個 HTML 文檔\",\n      for_Print_: \"爲了打印（所有頁面均可被打印，頁數計算也是正常的）\",\n      for_Read_: \"爲了閱讀（快速加載粗略頁數計算）\",\n      Page_Spread_View: \"頁面視圖對頁\",\n      Spread_view: \"對頁視圖\",\n      Single_page_view: \"單頁視圖\",\n      Auto_spread_view: \"自動對頁\",\n      additional_stylesheet_URL: \"附加 (自定義) 樣式表 URL\",\n      user_stylesheet_URL: \"用戶樣式表 URL\",\n      Settings: \"設置\",\n      DESC_Options_also_1: \"選項也可在\",\n      DESC_Options_also_2: \"面板設置。\",\n      See_documentation_: \"有關更多詳細信息，請參閱文檔:\",\n      HREF_User_Guide: \"../docs/#/user-guide\",\n      Vivliostyle_User_Guide: \"Vivliostyle 用戶指南\",\n      HREF_Vivlistyle_Home: \"https://vivliostyle.org/\",\n      navigate_to_left: \"向左導航\",\n      navigate_to_right: \"向右導航\",\n      Highlight_: \"高亮…\",\n      Marker_Yellow: \"標記: 黃\",\n      Marker_Red: \"標記: 紅\",\n      Marker_Green: \"標記: 綠\",\n      OK: \"確認\",\n      Cancel: \"取消\",\n      Delete: \"刪除\",\n      TIP_Settings: \"設置 (S),雙擊/雙敲擊鍵以固定\",\n      Page_View_Mode: \"界面視圖模式\",\n      Auto: \"自動\",\n      Single_page: \"單頁\",\n      Spread: \"對頁\",\n      TIP_Book_Mode: \"On: 爲了類似圖書出版物帶有目錄\\nOff: 爲了單 HTML 文檔\",\n      TIP_Render_All_Pages:\n        \"On: 爲了打印(所有頁面可打印, 頁面計數正常工作)\\nOff: 爲了閱讀 (快速加載粗略計數)\",\n      Restore_View: \"恢復閱覽狀態\",\n      TIP_Restore_View: \"重新打開文檔時恢復視圖設置\",\n      Custom_Style_Settings: \"自定義樣式設置\",\n      Page_Size: \"頁面大小\",\n      Default: \"默認\",\n      DESC_page_size_default: \"(=自動 除非另外設置)\",\n      DESC_page_size_auto: \"(使用整個窗口面積)\",\n      Preset: \"預設\",\n      Landscape: \"橫向\",\n      Custom_size: \"自定義尺寸\",\n      Width: \"寬度\",\n      Height: \"高度\",\n      More_: \"詳細...\",\n      Crop_Marks: \"裁剪標記\",\n      Crop_marks: \"裁剪標記\",\n      Bleed: \"出血\",\n      Crop_offset: \"裁剪偏移\",\n      Page_Margins: \"頁面邊距\",\n      DESC_page_margin_default: \"(=10% 除非另外設置)\",\n      Set_page_margin_to_0: \"設置頁面邊距爲 0\",\n      Custom_margin: \"自定義邊距\",\n      Top_Right_Bottom_Left: \"頂部/右側/底部/左側\",\n      Set_first_page_margin_to_0: \"設置第一頁的邊距爲 0\",\n      Force_html_body_margin_to_0: \"強制 html/body 邊距爲 0\",\n      Page_Breaks: \"分頁\",\n      Default_widows_orphans_control: \"默認 widows/orphans 控制\",\n      Allow_widows_and_orphans: \"允許產生widows 和 orphans\",\n      Avoid_page_break_inside_paragraph: \"避免段落內出現分頁\",\n      Images: \"圖片\",\n      Set_image_max_size_to_fit_page: \"圖像最大尺寸設置爲適合頁面\",\n      Keep_aspect_ratio: \"保持長寬比\",\n      Text: \"文本\",\n      Font_size: \"字體大小\",\n      Base_font_size: \"基礎 字號\",\n      Base_line_height: \"基礎 行高\",\n      Base_font_family: \"基礎 字體\",\n      Custom_Style_Priority: \"自定義 Style 屬性\",\n      Set_as_user_stylesheet: \"設置爲用戶樣式表\",\n      DESC_user_stylesheet: \"(低優先級除非 !important)\",\n      Force_override_document_style: \"強制覆蓋document的樣式\",\n      important_: \"(!important)\",\n      Edit_CSS: \"編輯 CSS\",\n      Dont_edit_: \"不要在 /*<viewer>*/ 和 /*</viewer>*/之間進行編輯\",\n      Reset_Custom_Style: \"重置自定義樣式\",\n      Reset_all_to_default: \"重置所有\",\n      TIP_ToC: \"目錄 (T), 雙擊/雙敲擊鍵以固定\",\n      TIP_Marker: \"標記 (M), 雙擊/雙敲擊鍵以固定\",\n      Marks_and_Memos: \"標記和備忘錄\",\n      Remove_All: \"移除所有\",\n      Remove: \"移除\",\n      Memo: \"備忘錄\",\n      TIP_Find: \"查找 (Ctrl/Cmd+F)\",\n      TIP_Find_Previous: \"查找上一個 (Shift+Enter)\",\n      TIP_Find_Next: \"查找下一個 (Enter)\",\n      Find: \"查找\",\n      TIP_First_Page: \"首頁 (Home)\",\n      TIP_Previous_Page: \"上一頁 (↑)\",\n      TIP_Next_Page: \"下一頁 (↓)\",\n      TIP_Last_Page: \"最後一頁(End)\",\n      TIP_Go_to_Page: \"跳轉到… (G)\",\n      Total_pages: \"總頁數\",\n      TIP_Text_Smaller: \"文本: 小 (-)\",\n      TIP_Text_Larger: \"文本: 大 (+)\",\n      TIP_Text_Default_Size: \"文本: 默認尺寸 (0)\",\n      TIP_Zoom_Out: \"縮小 (O)\",\n      TIP_Zoom_In: \"放大 (I)\",\n      TIP_Zoom_Actual_Size: \"縮放: 實際大小 (1)\",\n      TIP_Zoom_Fit_to_Screen: \"縮放: 適應屏幕 (F)\",\n      TIP_Print: \"打印 (P)\",\n    },\n  },\n};\n\n/**\n * simple language detector alternative to i18next-browser-languageDetector\n * @returns {string} language code\n */\nfunction detectLanguage(): string {\n  try {\n    // Detect from URL parameter: \"?lng=xx\", \"&lng=xx\" or \"#lng=xx\"\n    let lng = /[?&#]lng=([^?&#]+)/.exec(window.location.href)?.[1];\n    if (!lng) {\n      // Detect from localStorage\n      lng = window.localStorage.getItem(\"i18nextLng\");\n      if (!lng) {\n        // Detect from browser\n        lng = navigator.language;\n      }\n    }\n\n    if (lng) {\n      if (/^(zh(-cmn)?|cmn)-(TW|HK|Hant)\\b/i.test(lng)) {\n        // \"zh-TW\", \"zh-HK\", \"zh-Hant\", \"cmn-Hant\" etc. -> \"zh-Hant\"\n        lng = \"zh-Hant\";\n      } else if (/^(zh|cmn)\\b/i.test(lng)) {\n        // \"zh\", \"zh-CN\", \"zh-Hans\", \"cmn-Hans\" etc. -> \"zh-Hans\"\n        lng = \"zh-Hans\";\n      } else {\n        // \"en-US\" -> \"en\"\n        lng = lng.toLowerCase().replace(/-.*/, \"\");\n      }\n      if (lng in translations) {\n        return lng;\n      }\n    }\n  } catch (_e) {\n    // ignore\n  }\n  // fallback\n  return \"en\";\n}\n\ni18nextko.init(translations, detectLanguage(), ko);\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport ko from \"knockout\";\n\nimport ViewerApp from \"./viewmodels/viewer-app\";\n\nimport \"./bindings/menuButton\";\nimport \"./bindings/swipePages\";\nimport \"./bindings/textSelection\";\nimport \"./bindings/clickOutside\";\nimport \"./bindings/i18n\";\n\nexport default {\n  start(): void {\n    function startViewer(): void {\n      ko.applyBindings(new ViewerApp());\n    }\n\n    if (window[\"__loaded\"]) startViewer();\n    else window.onload = startViewer;\n  },\n};\n","/*\n * Copyright 2015 Daishinsha Inc.\n *\n * This file is part of Vivliostyle UI.\n *\n * Vivliostyle UI is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Vivliostyle UI is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Vivliostyle UI.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport vivliostyleViewer from \"./vivliostyle-viewer\";\n\nvivliostyleViewer.start();\n"]}