Flow Youtube Chat

Youtubeのチャットをニコニコ風に画面上へ流す(再アップ) Make youtube chats move in danmaku-style.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

// ==UserScript==
// @name Flow Youtube Chat
// @description Youtubeのチャットをニコニコ風に画面上へ流す(再アップ) Make youtube chats move in danmaku-style.
// @version 1.20.0
// @match https://www.youtube.com/*
// @grant GM.setValue
// @grant GM.getValue
// @grant GM.deleteValue
// @grant GM.listValues
// @grant GM.setClipboard
// @license AGPL-3.0-or-later
// @namespace FlowYoutubeChatScript
// @noframes
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/astring.min.js#sha384-gUzcAqLRIDJ1ScWzdnKkrjzXHpYpzOO/U8HDPAEKsDROSsZ8us+dl9/EZj1wS6ZS
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/iife/jsep.iife.min.js#sha384-u5pZyxJagBZ9DBtzv4AS5S2kA00SNUEfNhVZDLb3MDdLkZhRKfoFBA3aNHHMFRTl
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/index.js#sha384-U2/sw6xwqtADIYTsYPbCyG67dKIq7Ztmr7v0Gvoju4zGiLrlHO4Pe3L1SdVNYoW6
// @require https://cdn.jsdelivr.net/npm/[email protected]/libs/lz-string.min.js#sha384-0d+Gr7vM4Drod8E3hXKgciWJSWbjD/opKLLygI9ktiWbuvlDwQLzU46wJ9s5gsp7
// @run-at document-end
// ==/UserScript==

/*! For license information please see index.js.LICENSE.txt */
/* jshint esversion: 6 */

;(() => {
	var __webpack_modules__ = {
		371(module) {
			"use strict"
			module.exports = function equal(a, b) {
				if (a === b) return !0
				if (a && b && "object" == typeof a && "object" == typeof b) {
					if (a.constructor !== b.constructor) return !1
					var length, i, keys
					if (Array.isArray(a)) {
						if ((length = a.length) != b.length) return !1
						for (i = length; 0 != i--;) if (!equal(a[i], b[i])) return !1
						return !0
					}
					if (a.constructor === RegExp)
						return a.source === b.source && a.flags === b.flags
					if (a.valueOf !== Object.prototype.valueOf)
						return a.valueOf() === b.valueOf()
					if (a.toString !== Object.prototype.toString)
						return a.toString() === b.toString()
					if (
						(length = (keys = Object.keys(a)).length) !== Object.keys(b).length
					)
						return !1
					for (i = length; 0 != i--;)
						if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return !1
					for (i = length; 0 != i--;) {
						var key = keys[i]
						if (!equal(a[key], b[key])) return !1
					}
					return !0
				}
				return a != a && b != b
			}
		},
		742(module) {
			module.exports = (function (e) {
				var r = {}
				function t(n) {
					if (r[n]) return r[n].exports
					var a = (r[n] = { i: n, l: !1, exports: {} })
					return (e[n].call(a.exports, a, a.exports, t), (a.l = !0), a.exports)
				}
				return (
					(t.m = e),
					(t.c = r),
					(t.d = function (e, r, n) {
						t.o(e, r) || Object.defineProperty(e, r, { enumerable: !0, get: n })
					}),
					(t.r = function (e) {
						;("undefined" != typeof Symbol &&
							Symbol.toStringTag &&
							Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }),
							Object.defineProperty(e, "__esModule", { value: !0 }))
					}),
					(t.t = function (e, r) {
						if ((1 & r && (e = t(e)), 8 & r)) return e
						if (4 & r && "object" == typeof e && e && e.__esModule) return e
						var n = Object.create(null)
						if (
							(t.r(n),
							Object.defineProperty(n, "default", { enumerable: !0, value: e }),
							2 & r && "string" != typeof e)
						)
							for (var a in e)
								t.d(
									n,
									a,
									function (r) {
										return e[r]
									}.bind(null, a),
								)
						return n
					}),
					(t.n = function (e) {
						var r =
							e && e.__esModule
								? function () {
										return e.default
									}
								: function () {
										return e
									}
						return (t.d(r, "a", r), r)
					}),
					(t.o = function (e, r) {
						return Object.prototype.hasOwnProperty.call(e, r)
					}),
					(t.p = ""),
					t((t.s = 0))
				)
			})([
				function (e, r, t) {
					"use strict"
					;(t.r(r),
						t.d(r, "validateHTMLColorName", function () {
							return l
						}),
						t.d(r, "validateHTMLColorSpecialName", function () {
							return i
						}),
						t.d(r, "validateHTMLColorHex", function () {
							return u
						}),
						t.d(r, "validateHTMLColorRgb", function () {
							return g
						}),
						t.d(r, "validateHTMLColorHsl", function () {
							return y
						}),
						t.d(r, "validateHTMLColorHwb", function () {
							return L
						}),
						t.d(r, "validateHTMLColorLab", function () {
							return S
						}),
						t.d(r, "validateHTMLColorLch", function () {
							return m
						}),
						t.d(r, "validateHTMLColor", function () {
							return G
						}))
					const n = e => e && "string" == typeof e,
						a = [
							"AliceBlue",
							"AntiqueWhite",
							"Aqua",
							"Aquamarine",
							"Azure",
							"Beige",
							"Bisque",
							"Black",
							"BlanchedAlmond",
							"Blue",
							"BlueViolet",
							"Brown",
							"BurlyWood",
							"CadetBlue",
							"Chartreuse",
							"Chocolate",
							"Coral",
							"CornflowerBlue",
							"Cornsilk",
							"Crimson",
							"Cyan",
							"DarkBlue",
							"DarkCyan",
							"DarkGoldenrod",
							"DarkGray",
							"DarkGrey",
							"DarkGreen",
							"DarkKhaki",
							"DarkMagenta",
							"DarkOliveGreen",
							"DarkOrange",
							"DarkOrchid",
							"DarkRed",
							"DarkSalmon",
							"DarkSeaGreen",
							"DarkSlateBlue",
							"DarkSlateGray",
							"DarkSlateGrey",
							"DarkTurquoise",
							"DarkViolet",
							"DeepPink",
							"DeepSkyBlue",
							"DimGray",
							"DimGrey",
							"DodgerBlue",
							"FireBrick",
							"FloralWhite",
							"ForestGreen",
							"Fuchsia",
							"Gainsboro",
							"GhostWhite",
							"Gold",
							"Goldenrod",
							"Gray",
							"Grey",
							"Green",
							"GreenYellow",
							"HoneyDew",
							"HotPink",
							"IndianRed",
							"Indigo",
							"Ivory",
							"Khaki",
							"Lavender",
							"LavenderBlush",
							"LawnGreen",
							"LemonChiffon",
							"LightBlue",
							"LightCoral",
							"LightCyan",
							"LightGoldenrodYellow",
							"LightGray",
							"LightGrey",
							"LightGreen",
							"LightPink",
							"LightSalmon",
							"LightSalmon",
							"LightSeaGreen",
							"LightSkyBlue",
							"LightSlateGray",
							"LightSlateGrey",
							"LightSteelBlue",
							"LightYellow",
							"Lime",
							"LimeGreen",
							"Linen",
							"Magenta",
							"Maroon",
							"MediumAquamarine",
							"MediumBlue",
							"MediumOrchid",
							"MediumPurple",
							"MediumSeaGreen",
							"MediumSlateBlue",
							"MediumSlateBlue",
							"MediumSpringGreen",
							"MediumTurquoise",
							"MediumVioletRed",
							"MidnightBlue",
							"MintCream",
							"MistyRose",
							"Moccasin",
							"NavajoWhite",
							"Navy",
							"OldLace",
							"Olive",
							"OliveDrab",
							"Orange",
							"OrangeRed",
							"Orchid",
							"PaleGoldenrod",
							"PaleGreen",
							"PaleTurquoise",
							"PaleVioletRed",
							"PapayaWhip",
							"PeachPuff",
							"Peru",
							"Pink",
							"Plum",
							"PowderBlue",
							"Purple",
							"RebeccaPurple",
							"Red",
							"RosyBrown",
							"RoyalBlue",
							"SaddleBrown",
							"Salmon",
							"SandyBrown",
							"SeaGreen",
							"SeaShell",
							"Sienna",
							"Silver",
							"SkyBlue",
							"SlateBlue",
							"SlateGray",
							"SlateGrey",
							"Snow",
							"SpringGreen",
							"SteelBlue",
							"Tan",
							"Teal",
							"Thistle",
							"Tomato",
							"Turquoise",
							"Violet",
							"Wheat",
							"White",
							"WhiteSmoke",
							"Yellow",
							"YellowGreen",
						],
						o = ["currentColor", "inherit", "transparent"],
						l = e => {
							let r = !1
							return (
								n(e) &&
									a.map(
										t => (
											e.toLowerCase() === t.toLowerCase() && (r = !0),
											null
										),
									),
								r
							)
						},
						i = e => {
							let r = !1
							return (
								n(e) &&
									o.map(
										t => (
											e.toLowerCase() === t.toLowerCase() && (r = !0),
											null
										),
									),
								r
							)
						},
						u = e =>
							!!n(e) &&
							e &&
							/^#([\da-f]{3}){1,2}$|^#([\da-f]{4}){1,2}$/i.test(e),
						d = "(([\\d]{0,5})((\\.([\\d]{1,5}))?))",
						s = `(${d}%)`,
						c = "(([0-9]|[1-9][0-9]|100)%)",
						f = `(${c}|(0?((\\.([\\d]{1,5}))?))|1)`,
						h = `([\\s]{0,5})\\)?)(([\\s]{0,5})(\\/?)([\\s]{1,5})(((${c}))|(0?((\\.([\\d]{1,5}))?))|1))?([\\s]{0,5})\\)`,
						$ =
							"(-?(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-5][0-9])((\\.([\\d]{1,5}))?)|360)(deg)?)",
						g = e => {
							if (n(e)) {
								const r = "([\\s]{0,5})([\\d]{1,5})%?([\\s]{0,5}),?",
									t = "((([\\s]{0,5}),?([\\s]{0,5}))|(([\\s]{1,5})))",
									n = new RegExp(
										`^(rgb)a?\\(${r}${t}${r}${t}${r}${t}((\\/?([\\s]{0,5})(0?\\.?([\\d]{1,5})%?([\\s]{0,5}))?|1|0))?\\)$`,
									)
								return e && n.test(e)
							}
							return !1
						},
						y = e => {
							if (n(e)) {
								const r = new RegExp(
									`^(hsl)a?\\((([\\s]{0,5})(${$}|(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-9][0-9]|400)grad)|((([0-5])?\\.([\\d]{1,5})|6\\.([0-9]|1[0-9]|2[0-8])|[0-6])rad)|((0?((\\.([\\d]{1,5}))?)|1)turn))((([\\s]{0,5}),([\\s]{0,5}))|(([\\s]{1,5}))))(([\\s]{0,5})(0|${c})((([\\s]{0,5}),([\\s]{0,5}))|(([\\s]{1,5}))))(([\\s]{0,5})(0|${c})([\\s]{0,5})\\)?)(([\\s]{0,5})(\\/?|,?)([\\s]{0,5})(((${c}))|(0?((\\.([\\d]{1,5}))?))|1))?\\)$`,
								)
								return e && r.test(e)
							}
							return !1
						},
						L = e => {
							if (n(e)) {
								const r = new RegExp(
									`^(hwb\\(([\\s]{0,5})${$}([\\s]{1,5}))((0|${c})([\\s]{1,5}))((0|${c})${h}$`,
								)
								return e && r.test(e)
							}
							return !1
						},
						S = e => {
							if (n(e)) {
								const r =
										"(-?(([0-9]|[1-9][0-9]|1[0-5][0-9])((\\.([\\d]{1,5}))?)?|160))",
									t = new RegExp(
										`^(lab\\(([\\s]{0,5})${s}([\\s]{1,5})${r}([\\s]{1,5})${r}${h}$`,
									)
								return e && t.test(e)
							}
							return !1
						},
						m = e => {
							if (n(e)) {
								const o = new RegExp(
									`^lch\\((([\\s]{0,5})((([0-9]|[1-9][0-9])?((\\.([\\d]{1,5}))?)|100)(%)?)([\\s]{1,5})${"" + d}([\\s]{1,5})((${$})|(0|${f})|(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-5][0-9])((\\.([\\d]{1,5}))?)|360))([\\s]{0,5})((\\/([\\s]{0,5})${f}))?)\\)$`,
								)
								return e && o.test(e)
							}
							return !1
						},
						G = e => !!((e && u(e)) || g(e) || y(e) || L(e) || S(e) || m(e))
					r.default = e =>
						!!(
							(e && u(e)) ||
							l(e) ||
							i(e) ||
							g(e) ||
							y(e) ||
							L(e) ||
							S(e) ||
							m(e)
						)
				},
			])
		},
	}
	const __webpack_module_cache__ = {}
	function __webpack_require__(moduleId) {
		const cachedModule = __webpack_module_cache__[moduleId]
		if (void 0 !== cachedModule) return cachedModule.exports
		const module = (__webpack_module_cache__[moduleId] = { exports: {} })
		__webpack_modules__[moduleId](module, module.exports, __webpack_require__)
		return module.exports
	}
	__webpack_require__.n = module => {
		const getter =
			module && module.__esModule ? () => module.default : () => module
		__webpack_require__.d(getter, { a: getter })
		return getter
	}
	__webpack_require__.d = (exports, definition) => {
		if (Array.isArray(definition))
			for (var i = 0; i < definition.length;) {
				var key = definition[i++],
					binding = definition[i++]
				__webpack_require__.o(exports, key)
					? 0 === binding && i++
					: 0 === binding
						? Object.defineProperty(exports, key, {
								enumerable: !0,
								value: definition[i++],
							})
						: Object.defineProperty(exports, key, {
								enumerable: !0,
								get: binding,
							})
			}
		else
			for (var key in definition)
				__webpack_require__.o(definition, key) &&
					!__webpack_require__.o(exports, key) &&
					Object.defineProperty(exports, key, {
						enumerable: !0,
						get: definition[key],
					})
	}
	__webpack_require__.o = (obj, prop) =>
		Object.prototype.hasOwnProperty.call(obj, prop)
	__webpack_require__.dn = x => {
		;(Object.getOwnPropertyDescriptor(x, "name") || {}).writable ||
			Object.defineProperty(x, "name", { value: "default", configurable: !0 })
	}
	;(() => {
		"use strict"
		const dual = function (arity, body) {
				if ("function" == typeof arity)
					return function () {
						return arity(arguments)
							? body.apply(this, arguments)
							: self => body(self, ...arguments)
					}
				switch (arity) {
					case 0:
					case 1:
						throw new RangeError(`Invalid arity ${arity}`)
					case 2:
						return function (a, b) {
							return arguments.length >= 2
								? body(a, b)
								: function (self) {
										return body(self, a)
									}
						}
					case 3:
						return function (a, b, c) {
							return arguments.length >= 3
								? body(a, b, c)
								: function (self) {
										return body(self, a, b)
									}
						}
					case 4:
						return function (a, b, c, d) {
							return arguments.length >= 4
								? body(a, b, c, d)
								: function (self) {
										return body(self, a, b, c)
									}
						}
					case 5:
						return function (a, b, c, d, e) {
							return arguments.length >= 5
								? body(a, b, c, d, e)
								: function (self) {
										return body(self, a, b, c, d)
									}
						}
					default:
						return function () {
							if (arguments.length >= arity) return body.apply(this, arguments)
							const args = arguments
							return function (self) {
								return body(self, ...args)
							}
						}
				}
			},
			apply =
				(...a) =>
				self =>
					self(...a),
			identity = a => a,
			constant = value => () => value,
			constTrue = constant(!0),
			constFalse = constant(!1),
			constUndefined = constant(void 0),
			constVoid = constUndefined,
			flip =
				f =>
				(...b) =>
				(...a) =>
					f(...a)(...b)
		function pipe(a, ab, bc, cd, de, ef, fg, gh, hi) {
			switch (arguments.length) {
				case 1:
					return a
				case 2:
					return ab(a)
				case 3:
					return bc(ab(a))
				case 4:
					return cd(bc(ab(a)))
				case 5:
					return de(cd(bc(ab(a))))
				case 6:
					return ef(de(cd(bc(ab(a)))))
				case 7:
					return fg(ef(de(cd(bc(ab(a))))))
				case 8:
					return gh(fg(ef(de(cd(bc(ab(a)))))))
				case 9:
					return hi(gh(fg(ef(de(cd(bc(ab(a))))))))
				default: {
					let ret = arguments[0]
					for (let i = 1; i < arguments.length; i++) ret = arguments[i](ret)
					return ret
				}
			}
		}
		let globalStore
		const globalValue = (id, compute) => {
				if (!globalStore) {
					globalThis["effect/GlobalValue"] ??= new Map()
					globalStore = globalThis["effect/GlobalValue"]
				}
				globalStore.has(id) || globalStore.set(id, compute())
				return globalStore.get(id)
			},
			isTruthy = input => !!input,
			isString = input => "string" == typeof input,
			isNumber = input => "number" == typeof input,
			isBoolean = input => "boolean" == typeof input,
			isBigInt = input => "bigint" == typeof input,
			isSymbol = input => "symbol" == typeof input,
			Predicate_isFunction = input => "function" == typeof input,
			isUndefined = input => void 0 === input,
			isNever = _ => !1,
			isRecordOrArray = input => "object" == typeof input && null !== input,
			isObject = input => isRecordOrArray(input) || Predicate_isFunction(input),
			hasProperty = dual(
				2,
				(self, property) => isObject(self) && property in self,
			),
			isTagged = dual(
				2,
				(self, tag) => hasProperty(self, "_tag") && self._tag === tag,
			),
			isNullable = input => null == input,
			isNotNullable = input => null != input,
			isIterable = input =>
				"string" == typeof input || hasProperty(input, Symbol.iterator),
			not = self => a => !self(a),
			getBugErrorMessage = message =>
				`BUG: ${message} - please report an issue at https://github.com/Effect-TS/effect/issues`
		Symbol.iterator
		class SingleShotGen {
			self
			called = !1
			constructor(self) {
				this.self = self
			}
			next(a) {
				return this.called
					? { value: a, done: !0 }
					: ((this.called = !0), { value: this.self, done: !1 })
			}
			return(a) {
				return { value: a, done: !0 }
			}
			throw(e) {
				throw e
			}
			[Symbol.iterator]() {
				return new SingleShotGen(this.self)
			}
		}
		class PCGRandom {
			_state
			constructor(seedHi, seedLo, incHi, incLo) {
				if (isNullable(seedLo) && isNullable(seedHi)) {
					seedLo = (4294967295 * Math.random()) >>> 0
					seedHi = 0
				} else if (isNullable(seedLo)) {
					seedLo = seedHi
					seedHi = 0
				}
				if (isNullable(incLo) && isNullable(incHi)) {
					incLo = this._state ? this._state[3] : 4150755663
					incHi = this._state ? this._state[2] : 335903614
				} else if (isNullable(incLo)) {
					incLo = incHi
					incHi = 0
				}
				this._state = new Int32Array([
					0,
					0,
					incHi >>> 0,
					(1 | (incLo || 0)) >>> 0,
				])
				this._next()
				add64(
					this._state,
					this._state[0],
					this._state[1],
					seedHi >>> 0,
					seedLo >>> 0,
				)
				this._next()
				return this
			}
			getState() {
				return [this._state[0], this._state[1], this._state[2], this._state[3]]
			}
			setState(state) {
				this._state[0] = state[0]
				this._state[1] = state[1]
				this._state[2] = state[2]
				this._state[3] = 1 | state[3]
			}
			integer(max) {
				return Math.round(this.number() * Number.MAX_SAFE_INTEGER) % max
			}
			number() {
				return (
					(1 * (67108863 & this._next()) * 134217728 +
						1 * (134217727 & this._next())) /
					9007199254740992
				)
			}
			_next() {
				const oldHi = this._state[0] >>> 0,
					oldLo = this._state[1] >>> 0
				!(function (out, aHi, aLo) {
					let c1 = (32557 * (aLo >>> 16)) >>> 0,
						c0 = (19605 * (65535 & aLo)) >>> 0,
						lo = (32557 * (65535 & aLo)) >>> 0,
						hi = (19605 * (aLo >>> 16) + ((c0 >>> 16) + (c1 >>> 16))) >>> 0
					c0 = (c0 << 16) >>> 0
					lo = (lo + c0) >>> 0
					lo >>> 0 < c0 >>> 0 && (hi = (hi + 1) >>> 0)
					c1 = (c1 << 16) >>> 0
					lo = (lo + c1) >>> 0
					lo >>> 0 < c1 >>> 0 && (hi = (hi + 1) >>> 0)
					hi = (hi + Math.imul(aLo, 1481765933)) >>> 0
					hi = (hi + Math.imul(aHi, 1284865837)) >>> 0
					out[0] = hi
					out[1] = lo
				})(this._state, oldHi, oldLo)
				add64(
					this._state,
					this._state[0],
					this._state[1],
					this._state[2],
					this._state[3],
				)
				let xsHi = oldHi >>> 18,
					xsLo = ((oldLo >>> 18) | (oldHi << 14)) >>> 0
				xsHi = (xsHi ^ oldHi) >>> 0
				xsLo = (xsLo ^ oldLo) >>> 0
				const xorshifted = ((xsLo >>> 27) | (xsHi << 5)) >>> 0,
					rot = oldHi >>> 27
				return (
					((xorshifted >>> rot) |
						(xorshifted << (((-rot >>> 0) & 31) >>> 0))) >>>
					0
				)
			}
		}
		function add64(out, aHi, aLo, bHi, bLo) {
			let hi = (aHi + bHi) >>> 0
			const lo = (aLo + bLo) >>> 0
			lo >>> 0 < aLo >>> 0 && (hi = (hi + 1) | 0)
			out[0] = hi
			out[1] = lo
		}
		const YieldWrapTypeId = Symbol.for("effect/Utils/YieldWrap")
		class YieldWrap {
			#value
			constructor(value) {
				this.#value = value
			}
			[YieldWrapTypeId]() {
				return this.#value
			}
		}
		function yieldWrapGet(self) {
			if ("object" == typeof self && null !== self && YieldWrapTypeId in self)
				return self[YieldWrapTypeId]()
			throw new Error(getBugErrorMessage("yieldWrapGet"))
		}
		const structuralRegionState = globalValue(
				"effect/Utils/isStructuralRegion",
				() => ({ enabled: !1, tester: void 0 }),
			),
			standard = { effect_internal_function: body => body() },
			internalCall =
				!0 ===
				standard
					.effect_internal_function(() => new Error().stack)
					?.includes("effect_internal_function")
					? standard.effect_internal_function
					: body => {
							try {
								return body()
							} finally {
							}
						},
			randomHashCache = globalValue(
				Symbol.for("effect/Hash/randomHashCache"),
				() => new WeakMap(),
			),
			symbol = Symbol.for("effect/Hash"),
			Hash_hash = self => {
				if (!0 === structuralRegionState.enabled) return 0
				switch (typeof self) {
					case "number":
						return number(self)
					case "bigint":
						return string(self.toString(10))
					case "boolean":
					case "symbol":
						return string(String(self))
					case "string":
						return string(self)
					case "undefined":
						return string("undefined")
					case "function":
					case "object":
						return null === self
							? string("null")
							: self instanceof Date
								? Number.isNaN(self.getTime())
									? string("Invalid Date")
									: Hash_hash(self.toISOString())
								: self instanceof URL
									? Hash_hash(self.href)
									: isHash(self)
										? self[symbol]()
										: random(self)
					default:
						throw new Error(
							`BUG: unhandled typeof ${typeof self} - please report an issue at https://github.com/Effect-TS/effect/issues`,
						)
				}
			},
			random = self => {
				randomHashCache.has(self) ||
					randomHashCache.set(
						self,
						number(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)),
					)
				return randomHashCache.get(self)
			},
			combine = b => self => (53 * self) ^ b,
			optimize = n => (3221225471 & n) | ((n >>> 1) & 1073741824),
			isHash = u => hasProperty(u, symbol),
			number = n => {
				if (n != n || n === 1 / 0) return 0
				let h = 0 | n
				h !== n && (h ^= 4294967295 * n)
				for (; n > 4294967295;) h ^= n /= 4294967295
				return optimize(h)
			},
			string = str => {
				let h = 5381,
					i = str.length
				for (; i;) h = (33 * h) ^ str.charCodeAt(--i)
				return optimize(h)
			},
			structure = o =>
				((o, keys) => {
					let h = 12289
					for (let i = 0; i < keys.length; i++)
						h ^= pipe(string(keys[i]), combine(Hash_hash(o[keys[i]])))
					return optimize(h)
				})(o, Object.keys(o)),
			array = arr => {
				let h = 6151
				for (let i = 0; i < arr.length; i++)
					h = pipe(h, combine(Hash_hash(arr[i])))
				return optimize(h)
			},
			cached = function () {
				if (1 === arguments.length) {
					const self = arguments[0]
					return function (hash) {
						Object.defineProperty(self, symbol, {
							value: () => hash,
							enumerable: !1,
						})
						return hash
					}
				}
				const self = arguments[0],
					hash = arguments[1]
				Object.defineProperty(self, symbol, {
					value: () => hash,
					enumerable: !1,
				})
				return hash
			},
			Equal_symbol = Symbol.for("effect/Equal")
		function equals() {
			return 1 === arguments.length
				? self => compareBoth(self, arguments[0])
				: compareBoth(arguments[0], arguments[1])
		}
		function compareBoth(self, that) {
			if (self === that) return !0
			const selfType = typeof self
			if (selfType !== typeof that) return !1
			if ("object" === selfType || "function" === selfType) {
				if (null !== self && null !== that) {
					if (isEqual(self) && isEqual(that))
						return (
							!(
								Hash_hash(self) !== Hash_hash(that) || !self[Equal_symbol](that)
							) ||
							(!(
								!structuralRegionState.enabled || !structuralRegionState.tester
							) &&
								structuralRegionState.tester(self, that))
						)
					if (self instanceof Date && that instanceof Date) {
						const t1 = self.getTime(),
							t2 = that.getTime()
						return t1 === t2 || (Number.isNaN(t1) && Number.isNaN(t2))
					}
					if (self instanceof URL && that instanceof URL)
						return self.href === that.href
				}
				if (structuralRegionState.enabled) {
					if (null === self || null === that) return !1
					if (Array.isArray(self) && Array.isArray(that))
						return (
							self.length === that.length &&
							self.every((v, i) => compareBoth(v, that[i]))
						)
					if (
						Object.getPrototypeOf(self) === Object.prototype &&
						Object.getPrototypeOf(that) === Object.prototype
					) {
						const keysSelf = Object.keys(self),
							keysThat = Object.keys(that)
						if (keysSelf.length === keysThat.length) {
							for (const key of keysSelf)
								if (!(key in that) || !compareBoth(self[key], that[key]))
									return (
										!!structuralRegionState.tester &&
										structuralRegionState.tester(self, that)
									)
							return !0
						}
					}
					return (
						!!structuralRegionState.tester &&
						structuralRegionState.tester(self, that)
					)
				}
			}
			return (
				!(!structuralRegionState.enabled || !structuralRegionState.tester) &&
				structuralRegionState.tester(self, that)
			)
		}
		const isEqual = u => hasProperty(u, Equal_symbol),
			equivalence = () => equals,
			NodeInspectSymbol = Symbol.for("nodejs.util.inspect.custom"),
			toJSON = x => {
				try {
					if (
						hasProperty(x, "toJSON") &&
						Predicate_isFunction(x.toJSON) &&
						0 === x.toJSON.length
					)
						return x.toJSON()
					if (Array.isArray(x)) return x.map(toJSON)
				} catch {
					return {}
				}
				return redact(x)
			}
		function formatPropertyKey(name) {
			return isString(name) ? JSON.stringify(name) : String(name)
		}
		function formatUnknown(input, options) {
			const space = options?.space ?? 0,
				seen = new WeakSet(),
				gap = space ? (isNumber(space) ? " ".repeat(space) : space) : "",
				ind = d => gap.repeat(d),
				wrap = (v, body) => {
					const ctor = v?.constructor
					return ctor && ctor !== Object.prototype.constructor && ctor.name
						? `${ctor.name}(${body})`
						: body
				}
			return (function go(v, d = 0) {
				if (Array.isArray(v)) {
					if (seen.has(v)) return "[Circular]"
					seen.add(v)
					if (!gap || v.length <= 1)
						return `[${v.map(x => go(x, d)).join(",")}]`
					const inner = v.map(x => go(x, d + 1)).join(",\n" + ind(d + 1))
					return `[\n${ind(d + 1)}${inner}\n${ind(d)}]`
				}
				if ((input => input instanceof Date)(v))
					return (function (date) {
						try {
							return date.toISOString()
						} catch {
							return "Invalid Date"
						}
					})(v)
				if (
					!options?.ignoreToString &&
					hasProperty(v, "toString") &&
					Predicate_isFunction(v.toString) &&
					v.toString !== Object.prototype.toString &&
					v.toString !== Array.prototype.toString
				) {
					const s = (function (input) {
						try {
							const s = input.toString()
							return "string" == typeof s ? s : String(s)
						} catch {
							return "[toString threw]"
						}
					})(v)
					return v instanceof Error && v.cause
						? `${s} (cause: ${go(v.cause, d)})`
						: s
				}
				if (isString(v)) return JSON.stringify(v)
				if (isNumber(v) || null == v || isBoolean(v) || isSymbol(v))
					return String(v)
				if (isBigInt(v)) return String(v) + "n"
				if (v instanceof Set || v instanceof Map) {
					if (seen.has(v)) return "[Circular]"
					seen.add(v)
					return `${v.constructor.name}(${go(Array.from(v), d)})`
				}
				if (isObject(v)) {
					if (seen.has(v)) return "[Circular]"
					seen.add(v)
					const keys = (o => {
						try {
							return Reflect.ownKeys(o)
						} catch {
							return ["[ownKeys threw]"]
						}
					})(v)
					if (!gap || keys.length <= 1) {
						const body = `{${keys.map(k => `${formatPropertyKey(k)}:${go(v[k], d)}`).join(",")}}`
						return wrap(v, body)
					}
					const body = `{\n${keys.map(k => `${ind(d + 1)}${formatPropertyKey(k)}: ${go(v[k], d + 1)}`).join(",\n")}\n${ind(d)}}`
					return wrap(v, body)
				}
				return String(v)
			})(input, 0)
		}
		const format = x => JSON.stringify(x, null, 2),
			toStringUnknown = (u, whitespace = 2) => {
				if ("string" == typeof u) return u
				try {
					return "object" == typeof u
						? stringifyCircular(u, whitespace)
						: String(u)
				} catch {
					return String(u)
				}
			},
			stringifyCircular = (obj, whitespace) => {
				let cache = []
				const retVal = JSON.stringify(
					obj,
					(_key, value) =>
						"object" == typeof value && null !== value
							? cache.includes(value)
								? void 0
								: cache.push(value) &&
									(void 0 !== redactableState.fiberRefs && isRedactable(value)
										? value[symbolRedactable](redactableState.fiberRefs)
										: value)
							: value,
					whitespace,
				)
				cache = void 0
				return retVal
			},
			symbolRedactable = Symbol.for("effect/Inspectable/Redactable"),
			isRedactable = u =>
				"object" == typeof u && null !== u && symbolRedactable in u,
			redactableState = globalValue(
				"effect/Inspectable/redactableState",
				() => ({ fiberRefs: void 0 }),
			),
			redact = u =>
				isRedactable(u) && void 0 !== redactableState.fiberRefs
					? u[symbolRedactable](redactableState.fiberRefs)
					: u,
			pipeArguments = (self, args) => {
				switch (args.length) {
					case 0:
						return self
					case 1:
						return args[0](self)
					case 2:
						return args[1](args[0](self))
					case 3:
						return args[2](args[1](args[0](self)))
					case 4:
						return args[3](args[2](args[1](args[0](self))))
					case 5:
						return args[4](args[3](args[2](args[1](args[0](self)))))
					case 6:
						return args[5](args[4](args[3](args[2](args[1](args[0](self))))))
					case 7:
						return args[6](
							args[5](args[4](args[3](args[2](args[1](args[0](self)))))),
						)
					case 8:
						return args[7](
							args[6](
								args[5](args[4](args[3](args[2](args[1](args[0](self)))))),
							),
						)
					case 9:
						return args[8](
							args[7](
								args[6](
									args[5](args[4](args[3](args[2](args[1](args[0](self)))))),
								),
							),
						)
					default: {
						let ret = self
						for (let i = 0, len = args.length; i < len; i++) ret = args[i](ret)
						return ret
					}
				}
			},
			getCurrentVersion = () => "3.21.4",
			EffectTypeId = Symbol.for("effect/Effect"),
			StreamTypeId = Symbol.for("effect/Stream"),
			SinkTypeId = Symbol.for("effect/Sink"),
			ChannelTypeId = Symbol.for("effect/Channel"),
			effectVariance = {
				_R: _ => _,
				_E: _ => _,
				_A: _ => _,
				_V: getCurrentVersion(),
			},
			EffectPrototype = {
				[EffectTypeId]: effectVariance,
				[StreamTypeId]: effectVariance,
				[SinkTypeId]: {
					_A: _ => _,
					_In: _ => _,
					_L: _ => _,
					_E: _ => _,
					_R: _ => _,
				},
				[ChannelTypeId]: {
					_Env: _ => _,
					_InErr: _ => _,
					_InElem: _ => _,
					_InDone: _ => _,
					_OutErr: _ => _,
					_OutElem: _ => _,
					_OutDone: _ => _,
				},
				[Equal_symbol](that) {
					return this === that
				},
				[symbol]() {
					return cached(this, random(this))
				},
				[Symbol.iterator]() {
					return new SingleShotGen(new YieldWrap(this))
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			StructuralPrototype = {
				[symbol]() {
					return cached(this, structure(this))
				},
				[Equal_symbol](that) {
					const selfKeys = Object.keys(this),
						thatKeys = Object.keys(that)
					if (selfKeys.length !== thatKeys.length) return !1
					for (const key of selfKeys)
						if (!(key in that) || !equals(this[key], that[key])) return !1
					return !0
				},
			},
			CommitPrototype = { ...EffectPrototype, _op: "Commit" },
			StructuralCommitPrototype = {
				...CommitPrototype,
				...StructuralPrototype,
			},
			effectable_Base = (function () {
				function Base() {}
				Base.prototype = CommitPrototype
				return Base
			})(),
			TypeId = Symbol.for("effect/Option"),
			CommonProto = {
				...EffectPrototype,
				[TypeId]: { _A: _ => _ },
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				toString() {
					return format(this.toJSON())
				},
			},
			SomeProto = Object.assign(Object.create(CommonProto), {
				_tag: "Some",
				_op: "Some",
				[Equal_symbol](that) {
					return (
						isOption(that) && isSome(that) && equals(this.value, that.value)
					)
				},
				[symbol]() {
					return cached(
						this,
						combine(Hash_hash(this._tag))(Hash_hash(this.value)),
					)
				},
				toJSON() {
					return { _id: "Option", _tag: this._tag, value: toJSON(this.value) }
				},
			}),
			NoneHash = Hash_hash("None"),
			NoneProto = Object.assign(Object.create(CommonProto), {
				_tag: "None",
				_op: "None",
				[Equal_symbol]: that => isOption(that) && isNone(that),
				[symbol]: () => NoneHash,
				toJSON() {
					return { _id: "Option", _tag: this._tag }
				},
			}),
			isOption = input => hasProperty(input, TypeId),
			isNone = fa => "None" === fa._tag,
			isSome = fa => "Some" === fa._tag,
			none = Object.create(NoneProto),
			option_some = value => {
				const a = Object.create(SomeProto)
				a.value = value
				return a
			},
			TagTypeId = Symbol.for("effect/Context/Tag"),
			ReferenceTypeId = Symbol.for("effect/Context/Reference"),
			STMTypeId = Symbol.for("effect/STM"),
			TagProto = {
				...EffectPrototype,
				_op: "Tag",
				[STMTypeId]: effectVariance,
				[TagTypeId]: { _Service: _ => _, _Identifier: _ => _ },
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "Tag", key: this.key, stack: this.stack }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				of: self => self,
				context(self) {
					return make(this, self)
				},
			},
			ReferenceProto = { ...TagProto, [ReferenceTypeId]: ReferenceTypeId },
			context_TypeId = Symbol.for("effect/Context"),
			ContextProto = {
				[context_TypeId]: { _Services: _ => _ },
				[Equal_symbol](that) {
					if (isContext(that) && this.unsafeMap.size === that.unsafeMap.size) {
						for (const k of this.unsafeMap.keys())
							if (
								!that.unsafeMap.has(k) ||
								!equals(this.unsafeMap.get(k), that.unsafeMap.get(k))
							)
								return !1
						return !0
					}
					return !1
				},
				[symbol]() {
					return cached(this, number(this.unsafeMap.size))
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return {
						_id: "Context",
						services: Array.from(this.unsafeMap).map(toJSON),
					}
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
			},
			makeContext = unsafeMap => {
				const context = Object.create(ContextProto)
				context.unsafeMap = unsafeMap
				return context
			},
			isContext = u => hasProperty(u, context_TypeId),
			_empty = makeContext(new Map()),
			make = (tag, service) => makeContext(new Map([[tag.key, service]])),
			add = dual(3, (self, tag, service) => {
				const map = new Map(self.unsafeMap)
				map.set(tag.key, service)
				return makeContext(map)
			}),
			defaultValueCache = globalValue(
				"effect/Context/defaultValueCache",
				() => new Map(),
			),
			getDefaultValue = tag => {
				if (defaultValueCache.has(tag.key))
					return defaultValueCache.get(tag.key)
				const value = tag.defaultValue()
				defaultValueCache.set(tag.key, value)
				return value
			},
			unsafeGet = dual(2, (self, tag) => {
				if (!self.unsafeMap.has(tag.key)) {
					if (ReferenceTypeId in tag) return getDefaultValue(tag)
					throw (tag => {
						const error = new Error(
							"Service not found" + (tag.key ? `: ${String(tag.key)}` : ""),
						)
						if (tag.stack) {
							const lines = tag.stack.split("\n")
							if (lines.length > 2) {
								const afterAt = lines[2].match(/at (.*)/)
								afterAt &&
									(error.message =
										error.message + ` (defined at ${afterAt[1]})`)
							}
						}
						if (error.stack) {
							const lines = error.stack.split("\n")
							lines.splice(1, 3)
							error.stack = lines.join("\n")
						}
						return error
					})(tag)
				}
				return self.unsafeMap.get(tag.key)
			}),
			get = unsafeGet,
			getOption = dual(2, (self, tag) =>
				self.unsafeMap.has(tag.key)
					? option_some(self.unsafeMap.get(tag.key))
					: (u => hasProperty(u, ReferenceTypeId))(tag)
						? option_some(getDefaultValue(tag))
						: none,
			),
			merge = dual(2, (self, that) => {
				const map = new Map(self.unsafeMap)
				for (const [tag, s] of that.unsafeMap) map.set(tag, s)
				return makeContext(map)
			}),
			GenericTag = key => {
				const limit = Error.stackTraceLimit
				Error.stackTraceLimit = 2
				const creationError = new Error()
				Error.stackTraceLimit = limit
				const tag = Object.create(TagProto)
				Object.defineProperty(tag, "stack", { get: () => creationError.stack })
				tag.key = key
				return tag
			},
			Context_isContext = isContext,
			Context_empty = () => _empty,
			Context_make = make,
			Context_add = add,
			Context_get = get,
			Context_unsafeGet = unsafeGet,
			Context_getOption = getOption,
			Context_merge = merge,
			Context_Reference = () => (id, options) => {
				const limit = Error.stackTraceLimit
				Error.stackTraceLimit = 2
				const creationError = new Error()
				Error.stackTraceLimit = limit
				function ReferenceClass() {}
				Object.setPrototypeOf(ReferenceClass, ReferenceProto)
				ReferenceClass.key = id
				ReferenceClass.defaultValue = options.defaultValue
				Object.defineProperty(ReferenceClass, "stack", {
					get: () => creationError.stack,
				})
				return ReferenceClass
			},
			either_TypeId = Symbol.for("effect/Either"),
			either_CommonProto = {
				...EffectPrototype,
				[either_TypeId]: { _R: _ => _ },
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				toString() {
					return format(this.toJSON())
				},
			},
			RightProto = Object.assign(Object.create(either_CommonProto), {
				_tag: "Right",
				_op: "Right",
				[Equal_symbol](that) {
					return (
						isEither(that) && isRight(that) && equals(this.right, that.right)
					)
				},
				[symbol]() {
					return combine(Hash_hash(this._tag))(Hash_hash(this.right))
				},
				toJSON() {
					return { _id: "Either", _tag: this._tag, right: toJSON(this.right) }
				},
			}),
			LeftProto = Object.assign(Object.create(either_CommonProto), {
				_tag: "Left",
				_op: "Left",
				[Equal_symbol](that) {
					return isEither(that) && isLeft(that) && equals(this.left, that.left)
				},
				[symbol]() {
					return combine(Hash_hash(this._tag))(Hash_hash(this.left))
				},
				toJSON() {
					return { _id: "Either", _tag: this._tag, left: toJSON(this.left) }
				},
			}),
			isEither = input => hasProperty(input, either_TypeId),
			isLeft = ma => "Left" === ma._tag,
			isRight = ma => "Right" === ma._tag,
			Either_right = right => {
				const a = Object.create(RightProto)
				a.right = right
				return a
			},
			Either_left = left => {
				const a = Object.create(LeftProto)
				a.left = left
				return a
			},
			Either_isEither = isEither,
			Either_isLeft = isLeft,
			Either_isRight = isRight,
			mapLeft = dual(2, (self, f) =>
				Either_isLeft(self)
					? Either_left(f(self.left))
					: Either_right(self.right),
			),
			map = dual(2, (self, f) =>
				Either_isRight(self)
					? Either_right(f(self.right))
					: Either_left(self.left),
			),
			match = dual(2, (self, { onLeft, onRight }) =>
				Either_isLeft(self) ? onLeft(self.left) : onRight(self.right),
			),
			Either_merge = match({ onLeft: identity, onRight: identity }),
			getOrThrowWith = dual(2, (self, onLeft) => {
				if (Either_isRight(self)) return self.right
				throw onLeft(self.left)
			}),
			getOrThrow = getOrThrowWith(
				() => new Error("getOrThrow called on a Left"),
			),
			Equivalence_make = isEquivalent => (self, that) =>
				self === that || isEquivalent(self, that),
			isStrictEquivalent = (x, y) => x === y,
			strict = () => isStrictEquivalent,
			Equivalence_string = strict(),
			Equivalence_mapInput = dual(2, (self, f) =>
				Equivalence_make((x, y) => self(f(x), f(y))),
			),
			isNonEmptyArray = self => self.length > 0,
			Option_none = () => none,
			Option_some = option_some,
			Option_isNone = isNone,
			Option_isSome = isSome,
			Option_match = dual(2, (self, { onNone, onSome }) =>
				Option_isNone(self) ? onNone() : onSome(self.value),
			),
			Option_getOrElse = dual(2, (self, onNone) =>
				Option_isNone(self) ? onNone() : self.value,
			),
			Option_orElse = dual(2, (self, that) =>
				Option_isNone(self) ? that() : self,
			),
			orElseSome = dual(2, (self, onNone) =>
				Option_isNone(self) ? Option_some(onNone()) : self,
			),
			Option_fromNullable = nullableValue =>
				null == nullableValue ? Option_none() : Option_some(nullableValue),
			Option_getOrUndefined = Option_getOrElse(constUndefined),
			Option_getOrThrow = dual(2, (self, onNone) => {
				if (Option_isSome(self)) return self.value
				throw onNone()
			})(() => new Error("getOrThrow called on a None")),
			Option_map = dual(2, (self, f) =>
				Option_isNone(self) ? Option_none() : Option_some(f(self.value)),
			),
			Option_flatMap = dual(2, (self, f) =>
				Option_isNone(self) ? Option_none() : f(self.value),
			),
			flatMapNullable = dual(2, (self, f) =>
				Option_isNone(self)
					? Option_none()
					: Option_fromNullable(f(self.value)),
			),
			filterMap = Option_flatMap,
			filter = dual(2, (self, predicate) =>
				filterMap(self, b => (predicate(b) ? option_some(b) : none)),
			),
			Option_liftPredicate = dual(2, (b, predicate) =>
				predicate(b) ? Option_some(b) : Option_none(),
			),
			containsWith = isEquivalent =>
				dual(
					2,
					(self, a) => !Option_isNone(self) && isEquivalent(self.value, a),
				),
			contains = containsWith(equivalence()),
			exists = dual(
				2,
				(self, refinement) => !Option_isNone(self) && refinement(self.value),
			),
			mergeWith = f => (o1, o2) =>
				Option_isNone(o1)
					? o2
					: Option_isNone(o2)
						? o1
						: Option_some(f(o1.value, o2.value)),
			findFirst = dual(2, (self, f) => {
				let i = 0
				for (const a of self) {
					const o = f(a, i)
					if (isBoolean(o)) {
						if (o) return Option_some(a)
					} else if (Option_isSome(o)) return o
					i++
				}
				return Option_none()
			})
		Symbol.iterator
		const Order_make = compare => (self, that) =>
				self === that ? 0 : compare(self, that),
			Order_number = Order_make((self, that) => (self < that ? -1 : 1)),
			Order_boolean = Order_make((self, that) => (self < that ? -1 : 1)),
			Order_mapInput = dual(2, (self, f) =>
				Order_make((b1, b2) => self(f(b1), f(b2))),
			),
			greaterThan = O => dual(2, (self, that) => 1 === O(self, that)),
			greaterThanOrEqualTo = O => dual(2, (self, that) => -1 !== O(self, that)),
			clamp = O =>
				dual(2, (self, options) =>
					(O =>
						dual(2, (self, that) =>
							self === that || O(self, that) < 1 ? self : that,
						))(O)(
						options.maximum,
						(O =>
							dual(2, (self, that) =>
								self === that || O(self, that) > -1 ? self : that,
							))(O)(options.minimum, self),
					),
				)
		Object.fromEntries
		const Tuple_make = (...elements) => elements,
			getFirst = self => self[0],
			getSecond = self => self[1],
			Tuple_mapBoth = dual(2, (self, { onFirst, onSecond }) => [
				onFirst(self[0]),
				onSecond(self[1]),
			]),
			mapFirst = dual(2, (self, f) => [f(self[0]), self[1]]),
			mapSecond = dual(2, (self, f) => [self[0], f(self[1])]),
			allocate = n => new Array(n),
			Array_makeBy = dual(2, (n, f) => {
				const max = Math.max(1, Math.floor(n)),
					out = new Array(max)
				for (let i = 0; i < max; i++) out[i] = f(i)
				return out
			}),
			Array_fromIterable = collection =>
				Array.isArray(collection) ? collection : Array.from(collection),
			matchLeft = dual(2, (self, { onEmpty, onNonEmpty }) =>
				isNonEmptyReadonlyArray(self)
					? onNonEmpty(headNonEmpty(self), tailNonEmpty(self))
					: onEmpty(),
			),
			matchRight = dual(2, (self, { onEmpty, onNonEmpty }) =>
				isNonEmptyReadonlyArray(self)
					? onNonEmpty(initNonEmpty(self), lastNonEmpty(self))
					: onEmpty(),
			),
			Array_prepend = dual(2, (self, head) => [head, ...self]),
			Array_append = dual(2, (self, last) => [...self, last]),
			Array_appendAll = dual(2, (self, that) =>
				Array_fromIterable(self).concat(Array_fromIterable(that)),
			),
			isArray = Array.isArray,
			Array_isNonEmptyArray = isNonEmptyArray,
			isNonEmptyReadonlyArray = isNonEmptyArray,
			isOutOfBounds = (i, as) => i < 0 || i >= as.length,
			Array_clamp = (i, as) => Math.floor(Math.min(Math.max(0, i), as.length)),
			Array_get = dual(2, (self, index) => {
				const i = Math.floor(index)
				return isOutOfBounds(i, self) ? Option_none() : Option_some(self[i])
			}),
			Array_unsafeGet = dual(2, (self, index) => {
				const i = Math.floor(index)
				if (isOutOfBounds(i, self)) throw new Error(`Index ${i} out of bounds`)
				return self[i]
			}),
			Array_head = Array_get(0),
			headNonEmpty = Array_unsafeGet(0),
			lastNonEmpty = self => self[self.length - 1],
			tailNonEmpty = self => self.slice(1),
			initNonEmpty = self => self.slice(0, -1),
			Array_take = dual(2, (self, n) => {
				const input = Array_fromIterable(self)
				return input.slice(0, Array_clamp(n, input))
			}),
			span = dual(2, (self, predicate) =>
				splitAt(
					self,
					((self, predicate) => {
						let i = 0
						for (const a of self) {
							if (!predicate(a, i)) break
							i++
						}
						return i
					})(self, predicate),
				),
			),
			Array_drop = dual(2, (self, n) => {
				const input = Array_fromIterable(self)
				return input.slice(Array_clamp(n, input), input.length)
			}),
			findFirstIndex = dual(2, (self, predicate) => {
				let i = 0
				for (const a of self) {
					if (predicate(a, i)) return Option_some(i)
					i++
				}
				return Option_none()
			}),
			Array_findFirst = findFirst,
			Array_findLast = dual(2, (self, f) => {
				const input = Array_fromIterable(self)
				for (let i = input.length - 1; i >= 0; i--) {
					const a = input[i],
						o = f(a, i)
					if (isBoolean(o)) {
						if (o) return Option_some(a)
					} else if (Option_isSome(o)) return o
				}
				return Option_none()
			}),
			Array_replace = dual(3, (self, i, b) => Array_modify(self, i, () => b)),
			Array_modify = dual(3, (self, i, f) => {
				const out = Array.from(self)
				if (isOutOfBounds(i, out)) return out
				const b = f(out[i])
				out[i] = b
				return out
			}),
			Array_remove = dual(2, (self, i) => {
				const out = Array.from(self)
				if (isOutOfBounds(i, out)) return out
				out.splice(i, 1)
				return out
			}),
			Array_reverse = self => Array.from(self).reverse(),
			sort = dual(2, (self, O) => {
				const out = Array.from(self)
				out.sort(O)
				return out
			}),
			Array_zip = dual(2, (self, that) =>
				Array_zipWith(self, that, Tuple_make),
			),
			Array_zipWith = dual(3, (self, that, f) => {
				const as = Array_fromIterable(self),
					bs = Array_fromIterable(that)
				if (isNonEmptyReadonlyArray(as) && isNonEmptyReadonlyArray(bs)) {
					const out = [f(headNonEmpty(as), headNonEmpty(bs))],
						len = Math.min(as.length, bs.length)
					for (let i = 1; i < len; i++) out[i] = f(as[i], bs[i])
					return out
				}
				return []
			}),
			Array_containsWith = isEquivalent =>
				dual(2, (self, a) => {
					for (const i of self) if (isEquivalent(a, i)) return !0
					return !1
				}),
			Array_equivalence = equivalence(),
			splitAt = dual(2, (self, n) => {
				const input = Array.from(self),
					_n = Math.floor(n)
				return isNonEmptyReadonlyArray(input)
					? _n >= 1
						? splitNonEmptyAt(input, _n)
						: [[], input]
					: [input, []]
			}),
			splitNonEmptyAt = dual(2, (self, n) => {
				const _n = Math.max(1, Math.floor(n))
				return _n >= self.length
					? [copy(self), []]
					: [
							Array_prepend(self.slice(1, _n), headNonEmpty(self)),
							self.slice(_n),
						]
			}),
			copy = self => self.slice(),
			unionWith = dual(3, (self, that, isEquivalent) => {
				const a = Array_fromIterable(self),
					b = Array_fromIterable(that)
				return isNonEmptyReadonlyArray(a)
					? isNonEmptyReadonlyArray(b)
						? dedupeWith(isEquivalent)(Array_appendAll(a, b))
						: a
					: b
			}),
			Array_union = dual(2, (self, that) =>
				unionWith(self, that, Array_equivalence),
			),
			Array_empty = () => [],
			Array_of = a => [a],
			Array_map = dual(2, (self, f) => self.map(f)),
			Array_flatMap = dual(2, (self, f) => {
				if ((self => 0 === self.length)(self)) return []
				const out = []
				for (let i = 0; i < self.length; i++) {
					const inner = f(self[i], i)
					for (let j = 0; j < inner.length; j++) out.push(inner[j])
				}
				return out
			}),
			Array_flatten = Array_flatMap(identity),
			Array_filterMap = dual(2, (self, f) => {
				const as = Array_fromIterable(self),
					out = []
				for (let i = 0; i < as.length; i++) {
					const o = f(as[i], i)
					Option_isSome(o) && out.push(o.value)
				}
				return out
			}),
			Array_getSomes = Array_filterMap(identity),
			Array_filter = dual(2, (self, predicate) => {
				const as = Array_fromIterable(self),
					out = []
				for (let i = 0; i < as.length; i++)
					predicate(as[i], i) && out.push(as[i])
				return out
			}),
			Array_reduce = dual(3, (self, b, f) =>
				Array_fromIterable(self).reduce((b, a, i) => f(b, a, i), b),
			),
			Array_some = dual(2, (self, predicate) => self.some(predicate)),
			Array_unfold = (b, f) => {
				const out = []
				let o,
					next = b
				for (; Option_isSome((o = f(next)));) {
					const [a, b] = o.value
					out.push(a)
					next = b
				}
				return out
			},
			Array_getEquivalence = item =>
				Equivalence_make((self, that) => {
					if (self.length !== that.length) return !1
					for (let i = 0; i < self.length; i++)
						if (!item(self[i], that[i])) return !1
					return !0
				}),
			dedupeWith = dual(2, (self, isEquivalent) => {
				const input = Array_fromIterable(self)
				if (isNonEmptyReadonlyArray(input)) {
					const out = [headNonEmpty(input)],
						rest = tailNonEmpty(input)
					for (const r of rest)
						out.every(a => !isEquivalent(r, a)) && out.push(r)
					return out
				}
				return []
			}),
			dedupe = self => dedupeWith(self, equivalence()),
			join = dual(2, (self, sep) => Array_fromIterable(self).join(sep)),
			mapAccum = dual(3, (self, s, f) => {
				let i = 0,
					s1 = s
				const out = []
				for (const a of self) {
					const r = f(s1, a, i)
					s1 = r[0]
					out.push(r[1])
					i++
				}
				return [s1, out]
			}),
			Chunk_TypeId = Symbol.for("effect/Chunk"),
			emptyArray = [],
			Chunk_getEquivalence = isEquivalent =>
				Equivalence_make(
					(self, that) =>
						self.length === that.length &&
						toReadonlyArray(self).every((value, i) =>
							isEquivalent(value, Chunk_unsafeGet(that, i)),
						),
				),
			Chunk_equivalence = Chunk_getEquivalence(equals),
			ChunkProto = {
				[Chunk_TypeId]: { _A: _ => _ },
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "Chunk", values: toReadonlyArray(this).map(toJSON) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				[Equal_symbol](that) {
					return isChunk(that) && Chunk_equivalence(this, that)
				},
				[symbol]() {
					return cached(this, array(toReadonlyArray(this)))
				},
				[Symbol.iterator]() {
					switch (this.backing._tag) {
						case "IArray":
							return this.backing.array[Symbol.iterator]()
						case "IEmpty":
							return emptyArray[Symbol.iterator]()
						default:
							return toReadonlyArray(this)[Symbol.iterator]()
					}
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			makeChunk = backing => {
				const chunk = Object.create(ChunkProto)
				chunk.backing = backing
				switch (backing._tag) {
					case "IEmpty":
						chunk.length = 0
						chunk.depth = 0
						chunk.left = chunk
						chunk.right = chunk
						break
					case "IConcat":
						chunk.length = backing.left.length + backing.right.length
						chunk.depth = 1 + Math.max(backing.left.depth, backing.right.depth)
						chunk.left = backing.left
						chunk.right = backing.right
						break
					case "IArray":
						chunk.length = backing.array.length
						chunk.depth = 0
						chunk.left = Chunk_empty
						chunk.right = Chunk_empty
						break
					case "ISingleton":
						chunk.length = 1
						chunk.depth = 0
						chunk.left = Chunk_empty
						chunk.right = Chunk_empty
						break
					case "ISlice":
						chunk.length = backing.length
						chunk.depth = backing.chunk.depth + 1
						chunk.left = Chunk_empty
						chunk.right = Chunk_empty
				}
				return chunk
			},
			isChunk = u => hasProperty(u, Chunk_TypeId),
			Chunk_empty = makeChunk({ _tag: "IEmpty" }),
			esm_Chunk_empty = () => Chunk_empty,
			Chunk_make = (...as) => unsafeFromNonEmptyArray(as),
			Chunk_of = a => makeChunk({ _tag: "ISingleton", a }),
			Chunk_fromIterable = self =>
				isChunk(self) ? self : unsafeFromArray(Array_fromIterable(self)),
			copyToArray = (self, array, initial) => {
				switch (self.backing._tag) {
					case "IArray":
						!(function (src, srcPos, dest, destPos, len) {
							for (let i = 0; i < Math.min(src.length, 0 + len); i++)
								dest[destPos + i - 0] = src[i]
						})(self.backing.array, 0, array, initial, self.length)
						break
					case "IConcat":
						copyToArray(self.left, array, initial)
						copyToArray(self.right, array, initial + self.left.length)
						break
					case "ISingleton":
						array[initial] = self.backing.a
						break
					case "ISlice": {
						let i = 0,
							j = initial
						for (; i < self.length;) {
							array[j] = Chunk_unsafeGet(self, i)
							i += 1
							j += 1
						}
						break
					}
				}
			},
			toReadonlyArray = self => {
				switch (self.backing._tag) {
					case "IEmpty":
						return emptyArray
					case "IArray":
						return self.backing.array
					default: {
						const arr = new Array(self.length)
						copyToArray(self, arr, 0)
						self.backing = { _tag: "IArray", array: arr }
						self.left = Chunk_empty
						self.right = Chunk_empty
						self.depth = 0
						return arr
					}
				}
			},
			Chunk_reverse = self => {
				switch (self.backing._tag) {
					case "IEmpty":
					case "ISingleton":
						return self
					case "IArray":
						return makeChunk({
							_tag: "IArray",
							array: Array_reverse(self.backing.array),
						})
					case "IConcat":
						return makeChunk({
							_tag: "IConcat",
							left: Chunk_reverse(self.backing.right),
							right: Chunk_reverse(self.backing.left),
						})
					case "ISlice":
						return unsafeFromArray(Array_reverse(toReadonlyArray(self)))
				}
			},
			Chunk_get = dual(2, (self, index) =>
				index < 0 || index >= self.length
					? Option_none()
					: Option_some(Chunk_unsafeGet(self, index)),
			),
			unsafeFromArray = self =>
				0 === self.length
					? esm_Chunk_empty()
					: 1 === self.length
						? Chunk_of(self[0])
						: makeChunk({ _tag: "IArray", array: self }),
			unsafeFromNonEmptyArray = self => unsafeFromArray(self),
			Chunk_unsafeGet = dual(2, (self, index) => {
				switch (self.backing._tag) {
					case "IEmpty":
						throw new Error("Index out of bounds")
					case "ISingleton":
						if (0 !== index) throw new Error("Index out of bounds")
						return self.backing.a
					case "IArray":
						if (index >= self.length || index < 0)
							throw new Error("Index out of bounds")
						return self.backing.array[index]
					case "IConcat":
						return index < self.left.length
							? Chunk_unsafeGet(self.left, index)
							: Chunk_unsafeGet(self.right, index - self.left.length)
					case "ISlice":
						return Chunk_unsafeGet(
							self.backing.chunk,
							index + self.backing.offset,
						)
				}
			}),
			Chunk_append = dual(2, (self, a) => Chunk_appendAll(self, Chunk_of(a))),
			Chunk_prepend = dual(2, (self, elem) =>
				Chunk_appendAll(Chunk_of(elem), self),
			),
			Chunk_take = dual(2, (self, n) => {
				if (n <= 0) return Chunk_empty
				if (n >= self.length) return self
				switch (self.backing._tag) {
					case "ISlice":
						return makeChunk({
							_tag: "ISlice",
							chunk: self.backing.chunk,
							length: n,
							offset: self.backing.offset,
						})
					case "IConcat":
						return n > self.left.length
							? makeChunk({
									_tag: "IConcat",
									left: self.left,
									right: Chunk_take(self.right, n - self.left.length),
								})
							: Chunk_take(self.left, n)
					default:
						return makeChunk({
							_tag: "ISlice",
							chunk: self,
							offset: 0,
							length: n,
						})
				}
			}),
			Chunk_drop = dual(2, (self, n) => {
				if (n <= 0) return self
				if (n >= self.length) return Chunk_empty
				switch (self.backing._tag) {
					case "ISlice":
						return makeChunk({
							_tag: "ISlice",
							chunk: self.backing.chunk,
							offset: self.backing.offset + n,
							length: self.backing.length - n,
						})
					case "IConcat":
						return n > self.left.length
							? Chunk_drop(self.right, n - self.left.length)
							: makeChunk({
									_tag: "IConcat",
									left: Chunk_drop(self.left, n),
									right: self.right,
								})
					default:
						return makeChunk({
							_tag: "ISlice",
							chunk: self,
							offset: n,
							length: self.length - n,
						})
				}
			}),
			Chunk_appendAll = dual(2, (self, that) => {
				if ("IEmpty" === self.backing._tag) return that
				if ("IEmpty" === that.backing._tag) return self
				const diff = that.depth - self.depth
				if (Math.abs(diff) <= 1)
					return makeChunk({ _tag: "IConcat", left: self, right: that })
				if (diff < -1) {
					if (self.left.depth >= self.right.depth) {
						const nr = Chunk_appendAll(self.right, that)
						return makeChunk({ _tag: "IConcat", left: self.left, right: nr })
					}
					{
						const nrr = Chunk_appendAll(self.right.right, that)
						if (nrr.depth === self.depth - 3) {
							const nr = makeChunk({
								_tag: "IConcat",
								left: self.right.left,
								right: nrr,
							})
							return makeChunk({ _tag: "IConcat", left: self.left, right: nr })
						}
						{
							const nl = makeChunk({
								_tag: "IConcat",
								left: self.left,
								right: self.right.left,
							})
							return makeChunk({ _tag: "IConcat", left: nl, right: nrr })
						}
					}
				}
				if (that.right.depth >= that.left.depth) {
					const nl = Chunk_appendAll(self, that.left)
					return makeChunk({ _tag: "IConcat", left: nl, right: that.right })
				}
				{
					const nll = Chunk_appendAll(self, that.left.left)
					if (nll.depth === that.depth - 3) {
						const nl = makeChunk({
							_tag: "IConcat",
							left: nll,
							right: that.left.right,
						})
						return makeChunk({ _tag: "IConcat", left: nl, right: that.right })
					}
					{
						const nr = makeChunk({
							_tag: "IConcat",
							left: that.left.right,
							right: that.right,
						})
						return makeChunk({ _tag: "IConcat", left: nll, right: nr })
					}
				}
			}),
			Chunk_filterMap = dual(2, (self, f) =>
				unsafeFromArray(Array_filterMap(self, f)),
			),
			Chunk_filter = dual(2, (self, predicate) =>
				unsafeFromArray(Array_filter(self, predicate)),
			),
			Chunk_isEmpty = self => 0 === self.length,
			isNonEmpty = self => self.length > 0,
			Chunk_head = Chunk_get(0),
			Chunk_unsafeHead = self => Chunk_unsafeGet(self, 0),
			Chunk_headNonEmpty = Chunk_unsafeHead,
			Chunk_map = dual(2, (self, f) =>
				"ISingleton" === self.backing._tag
					? Chunk_of(f(self.backing.a, 0))
					: unsafeFromArray(
							pipe(
								toReadonlyArray(self),
								Array_map((a, i) => f(a, i)),
							),
						),
			),
			Chunk_mapAccum = dual(3, (self, s, f) => {
				const [s1, as] = mapAccum(self, s, f)
				return [s1, unsafeFromArray(as)]
			}),
			Chunk_splitAt = dual(2, (self, n) => [
				Chunk_take(self, n),
				Chunk_drop(self, n),
			]),
			Chunk_splitWhere = dual(2, (self, predicate) => {
				let i = 0
				for (const a of toReadonlyArray(self)) {
					if (predicate(a)) break
					i++
				}
				return Chunk_splitAt(self, i)
			}),
			Chunk_tailNonEmpty = self => Chunk_drop(self, 1),
			Chunk_reduce = Array_reduce,
			Duration_TypeId = Symbol.for("effect/Duration"),
			bigint0 = BigInt(0),
			bigint24 = BigInt(24),
			bigint60 = BigInt(60),
			bigint1e3 = BigInt(1e3),
			bigint1e6 = BigInt(1e6),
			bigint1e9 = BigInt(1e9),
			DURATION_REGEX =
				/^(-?\d+(?:\.\d+)?)\s+(nanos?|micros?|millis?|seconds?|minutes?|hours?|days?|weeks?)$/,
			decode = input => {
				if (isDuration(input)) return input
				if (isNumber(input)) return Duration_millis(input)
				if (isBigInt(input)) return Duration_nanos(input)
				if (Array.isArray(input) && 2 === input.length && input.every(isNumber))
					return input[0] === -1 / 0 ||
						input[1] === -1 / 0 ||
						Number.isNaN(input[0]) ||
						Number.isNaN(input[1])
						? zero
						: input[0] === 1 / 0 || input[1] === 1 / 0
							? infinity
							: Duration_nanos(
									BigInt(Math.round(1e9 * input[0])) +
										BigInt(Math.round(input[1])),
								)
				if (isString(input)) {
					const match = DURATION_REGEX.exec(input)
					if (match) {
						const [_, valueStr, unit] = match,
							value = Number(valueStr)
						switch (unit) {
							case "nano":
							case "nanos":
								return Duration_nanos(BigInt(valueStr))
							case "micro":
							case "micros":
								return micros(BigInt(valueStr))
							case "milli":
							case "millis":
								return Duration_millis(value)
							case "second":
							case "seconds":
								return seconds(value)
							case "minute":
							case "minutes":
								return minutes(value)
							case "hour":
							case "hours":
								return hours(value)
							case "day":
							case "days":
								return days(value)
							case "week":
							case "weeks":
								return weeks(value)
						}
					}
				}
				throw new Error("Invalid DurationInput")
			},
			zeroValue = { _tag: "Millis", millis: 0 },
			infinityValue = { _tag: "Infinity" },
			DurationProto = {
				[Duration_TypeId]: Duration_TypeId,
				[symbol]() {
					return cached(this, structure(this.value))
				},
				[Equal_symbol](that) {
					return isDuration(that) && Duration_equals(this, that)
				},
				toString() {
					return `Duration(${Duration_format(this)})`
				},
				toJSON() {
					switch (this.value._tag) {
						case "Millis":
							return {
								_id: "Duration",
								_tag: "Millis",
								millis: this.value.millis,
							}
						case "Nanos":
							return { _id: "Duration", _tag: "Nanos", hrtime: toHrTime(this) }
						case "Infinity":
							return { _id: "Duration", _tag: "Infinity" }
					}
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			Duration_make = input => {
				const duration = Object.create(DurationProto)
				isNumber(input)
					? isNaN(input) || input <= 0
						? (duration.value = zeroValue)
						: Number.isFinite(input)
							? Number.isInteger(input)
								? (duration.value = { _tag: "Millis", millis: input })
								: (duration.value = {
										_tag: "Nanos",
										nanos: BigInt(Math.round(1e6 * input)),
									})
							: (duration.value = infinityValue)
					: (duration.value =
							input <= bigint0 ? zeroValue : { _tag: "Nanos", nanos: input })
				return duration
			},
			isDuration = u => hasProperty(u, Duration_TypeId),
			zero = Duration_make(0),
			infinity = Duration_make(1 / 0),
			Duration_nanos = nanos => Duration_make(nanos),
			micros = micros => Duration_make(micros * bigint1e3),
			Duration_millis = millis => Duration_make(millis),
			seconds = seconds => Duration_make(1e3 * seconds),
			minutes = minutes => Duration_make(6e4 * minutes),
			hours = hours => Duration_make(36e5 * hours),
			days = days => Duration_make(864e5 * days),
			weeks = weeks => Duration_make(6048e5 * weeks),
			toMillis = self =>
				Duration_match(self, {
					onMillis: millis => millis,
					onNanos: nanos => Number(nanos) / 1e6,
				}),
			toHrTime = self => {
				const _self = decode(self)
				switch (_self.value._tag) {
					case "Infinity":
						return [1 / 0, 0]
					case "Nanos":
						return [
							Number(_self.value.nanos / bigint1e9),
							Number(_self.value.nanos % bigint1e9),
						]
					case "Millis":
						return [
							Math.floor(_self.value.millis / 1e3),
							Math.round((_self.value.millis % 1e3) * 1e6),
						]
				}
			},
			Duration_match = dual(2, (self, options) => {
				const _self = decode(self)
				switch (_self.value._tag) {
					case "Nanos":
						return options.onNanos(_self.value.nanos)
					case "Infinity":
						return options.onMillis(1 / 0)
					case "Millis":
						return options.onMillis(_self.value.millis)
				}
			}),
			matchWith = dual(3, (self, that, options) => {
				const _self = decode(self),
					_that = decode(that)
				if ("Infinity" === _self.value._tag || "Infinity" === _that.value._tag)
					return options.onMillis(toMillis(_self), toMillis(_that))
				if ("Nanos" === _self.value._tag || "Nanos" === _that.value._tag) {
					const selfNanos =
							"Nanos" === _self.value._tag
								? _self.value.nanos
								: BigInt(Math.round(1e6 * _self.value.millis)),
						thatNanos =
							"Nanos" === _that.value._tag
								? _that.value.nanos
								: BigInt(Math.round(1e6 * _that.value.millis))
					return options.onNanos(selfNanos, thatNanos)
				}
				return options.onMillis(_self.value.millis, _that.value.millis)
			}),
			Duration_lessThanOrEqualTo = dual(2, (self, that) =>
				matchWith(self, that, {
					onMillis: (self, that) => self <= that,
					onNanos: (self, that) => self <= that,
				}),
			),
			Duration_greaterThanOrEqualTo = dual(2, (self, that) =>
				matchWith(self, that, {
					onMillis: (self, that) => self >= that,
					onNanos: (self, that) => self >= that,
				}),
			),
			Duration_equals = dual(2, (self, that) =>
				((self, that) =>
					matchWith(self, that, {
						onMillis: (self, that) => self === that,
						onNanos: (self, that) => self === that,
					}))(decode(self), decode(that)),
			),
			Duration_format = self => {
				const duration = decode(self)
				if ("Infinity" === duration.value._tag) return "Infinity"
				if (
					(self => {
						switch (self.value._tag) {
							case "Millis":
								return 0 === self.value.millis
							case "Nanos":
								return self.value.nanos === bigint0
							case "Infinity":
								return !1
						}
					})(duration)
				)
					return "0"
				const fragments = (self => {
						const duration = decode(self)
						if ("Infinity" === duration.value._tag)
							return {
								days: 1 / 0,
								hours: 1 / 0,
								minutes: 1 / 0,
								seconds: 1 / 0,
								millis: 1 / 0,
								nanos: 1 / 0,
							}
						const nanos = (self => {
								const _self = decode(self)
								switch (_self.value._tag) {
									case "Infinity":
										throw new Error("Cannot convert infinite duration to nanos")
									case "Nanos":
										return _self.value.nanos
									case "Millis":
										return BigInt(Math.round(1e6 * _self.value.millis))
								}
							})(duration),
							ms = nanos / bigint1e6,
							sec = ms / bigint1e3,
							min = sec / bigint60,
							hr = min / bigint60
						return {
							days: Number(hr / bigint24),
							hours: Number(hr % bigint24),
							minutes: Number(min % bigint60),
							seconds: Number(sec % bigint60),
							millis: Number(ms % bigint1e3),
							nanos: Number(nanos % bigint1e6),
						}
					})(duration),
					pieces = []
				0 !== fragments.days && pieces.push(`${fragments.days}d`)
				0 !== fragments.hours && pieces.push(`${fragments.hours}h`)
				0 !== fragments.minutes && pieces.push(`${fragments.minutes}m`)
				0 !== fragments.seconds && pieces.push(`${fragments.seconds}s`)
				0 !== fragments.millis && pieces.push(`${fragments.millis}ms`)
				0 !== fragments.nanos && pieces.push(`${fragments.nanos}ns`)
				return pieces.join(" ")
			},
			BUCKET_SIZE = Math.pow(2, 5),
			MASK = BUCKET_SIZE - 1,
			MAX_INDEX_NODE = BUCKET_SIZE / 2,
			MIN_ARRAY_NODE = BUCKET_SIZE / 4
		function hashFragment(shift, h) {
			return (h >>> shift) & MASK
		}
		function toBitmap(x) {
			return 1 << x
		}
		function fromBitmap(bitmap, bit) {
			return (function (x) {
				x =
					((x =
						(858993459 & (x -= (x >> 1) & 1431655765)) +
						((x >> 2) & 858993459)) +
						(x >> 4)) &
					252645135
				return 127 & ((x += x >> 8) + (x >> 16))
			})(bitmap & (bit - 1))
		}
		function arrayUpdate(mutate, at, v, arr) {
			let out = arr
			if (!mutate) {
				const len = arr.length
				out = new Array(len)
				for (let i = 0; i < len; ++i) out[i] = arr[i]
			}
			out[at] = v
			return out
		}
		function arraySpliceOut(mutate, at, arr) {
			const newLen = arr.length - 1
			let i = 0,
				g = 0,
				out = arr
			if (mutate) i = g = at
			else {
				out = new Array(newLen)
				for (; i < at;) out[g++] = arr[i++]
			}
			++i
			for (; i <= newLen;) out[g++] = arr[i++]
			mutate && (out.length = newLen)
			return out
		}
		class EmptyNode {
			_tag = "EmptyNode"
			modify(edit, _shift, f, hash, key, size) {
				const v = f(Option_none())
				if (Option_isNone(v)) return new EmptyNode()
				++size.value
				return new LeafNode(edit, hash, key, v)
			}
		}
		function isEmptyNode(a) {
			return isTagged(a, "EmptyNode")
		}
		function canEditNode(node, edit) {
			return !isEmptyNode(node) && edit === node.edit
		}
		class LeafNode {
			edit
			hash
			key
			value
			_tag = "LeafNode"
			constructor(edit, hash, key, value) {
				this.edit = edit
				this.hash = hash
				this.key = key
				this.value = value
			}
			modify(edit, shift, f, hash, key, size) {
				if (equals(key, this.key)) {
					const v = f(this.value)
					if (v === this.value) return this
					if (Option_isNone(v)) {
						--size.value
						return new EmptyNode()
					}
					if (canEditNode(this, edit)) {
						this.value = v
						return this
					}
					return new LeafNode(edit, hash, key, v)
				}
				const v = f(Option_none())
				if (Option_isNone(v)) return this
				++size.value
				return mergeLeaves(
					edit,
					shift,
					this.hash,
					this,
					hash,
					new LeafNode(edit, hash, key, v),
				)
			}
		}
		class CollisionNode {
			edit
			hash
			children
			_tag = "CollisionNode"
			constructor(edit, hash, children) {
				this.edit = edit
				this.hash = hash
				this.children = children
			}
			modify(edit, shift, f, hash, key, size) {
				if (hash === this.hash) {
					const canEdit = canEditNode(this, edit),
						list = this.updateCollisionList(
							canEdit,
							edit,
							this.hash,
							this.children,
							f,
							key,
							size,
						)
					return list === this.children
						? this
						: list.length > 1
							? new CollisionNode(edit, this.hash, list)
							: list[0]
				}
				const v = f(Option_none())
				if (Option_isNone(v)) return this
				++size.value
				return mergeLeaves(
					edit,
					shift,
					this.hash,
					this,
					hash,
					new LeafNode(edit, hash, key, v),
				)
			}
			updateCollisionList(mutate, edit, hash, list, f, key, size) {
				const len = list.length
				for (let i = 0; i < len; ++i) {
					const child = list[i]
					if ("key" in child && equals(key, child.key)) {
						const value = child.value,
							newValue = f(value)
						if (newValue === value) return list
						if (Option_isNone(newValue)) {
							--size.value
							return arraySpliceOut(mutate, i, list)
						}
						return arrayUpdate(
							mutate,
							i,
							new LeafNode(edit, hash, key, newValue),
							list,
						)
					}
				}
				const newValue = f(Option_none())
				if (Option_isNone(newValue)) return list
				++size.value
				return arrayUpdate(
					mutate,
					len,
					new LeafNode(edit, hash, key, newValue),
					list,
				)
			}
		}
		class IndexedNode {
			edit
			mask
			children
			_tag = "IndexedNode"
			constructor(edit, mask, children) {
				this.edit = edit
				this.mask = mask
				this.children = children
			}
			modify(edit, shift, f, hash, key, size) {
				const mask = this.mask,
					children = this.children,
					frag = hashFragment(shift, hash),
					bit = toBitmap(frag),
					indx = fromBitmap(mask, bit),
					exists = mask & bit,
					canEdit = canEditNode(this, edit)
				if (!exists) {
					const _newChild = new EmptyNode().modify(
						edit,
						shift + 5,
						f,
						hash,
						key,
						size,
					)
					return _newChild
						? children.length >= MAX_INDEX_NODE
							? (function (edit, frag, child, bitmap, subNodes) {
									const arr = []
									let bit = bitmap,
										count = 0
									for (let i = 0; bit; ++i) {
										1 & bit && (arr[i] = subNodes[count++])
										bit >>>= 1
									}
									arr[frag] = child
									return new ArrayNode(edit, count + 1, arr)
								})(edit, frag, _newChild, mask, children)
							: new IndexedNode(
									edit,
									mask | bit,
									(function (mutate, at, v, arr) {
										const len = arr.length
										if (mutate) {
											let i = len
											for (; i >= at;) arr[i--] = arr[i]
											arr[at] = v
											return arr
										}
										let i = 0,
											g = 0
										const out = new Array(len + 1)
										for (; i < at;) out[g++] = arr[i++]
										out[at] = v
										for (; i < len;) out[++g] = arr[i++]
										return out
									})(canEdit, indx, _newChild, children),
								)
						: this
				}
				const current = children[indx],
					child = current.modify(edit, shift + 5, f, hash, key, size)
				if (current === child) return this
				let newChildren,
					bitmap = mask
				if (isEmptyNode(child)) {
					bitmap &= ~bit
					if (!bitmap) return new EmptyNode()
					if (
						children.length <= 2 &&
						(isEmptyNode((node = children[1 ^ indx])) ||
							"LeafNode" === node._tag ||
							"CollisionNode" === node._tag)
					)
						return children[1 ^ indx]
					newChildren = arraySpliceOut(canEdit, indx, children)
				} else newChildren = arrayUpdate(canEdit, indx, child, children)
				var node
				if (canEdit) {
					this.mask = bitmap
					this.children = newChildren
					return this
				}
				return new IndexedNode(edit, bitmap, newChildren)
			}
		}
		class ArrayNode {
			edit
			size
			children
			_tag = "ArrayNode"
			constructor(edit, size, children) {
				this.edit = edit
				this.size = size
				this.children = children
			}
			modify(edit, shift, f, hash, key, size) {
				let count = this.size
				const children = this.children,
					frag = hashFragment(shift, hash),
					child = children[frag],
					newChild = (child || new EmptyNode()).modify(
						edit,
						shift + 5,
						f,
						hash,
						key,
						size,
					)
				if (child === newChild) return this
				const canEdit = canEditNode(this, edit)
				let newChildren
				if (isEmptyNode(child) && !isEmptyNode(newChild)) {
					++count
					newChildren = arrayUpdate(canEdit, frag, newChild, children)
				} else if (!isEmptyNode(child) && isEmptyNode(newChild)) {
					--count
					if (count <= MIN_ARRAY_NODE)
						return (function (edit, count, removed, elements) {
							const children = new Array(count - 1)
							let g = 0,
								bitmap = 0
							for (let i = 0, len = elements.length; i < len; ++i)
								if (i !== removed) {
									const elem = elements[i]
									if (elem && !isEmptyNode(elem)) {
										children[g++] = elem
										bitmap |= 1 << i
									}
								}
							return new IndexedNode(edit, bitmap, children)
						})(edit, count, frag, children)
					newChildren = arrayUpdate(canEdit, frag, new EmptyNode(), children)
				} else newChildren = arrayUpdate(canEdit, frag, newChild, children)
				if (canEdit) {
					this.size = count
					this.children = newChildren
					return this
				}
				return new ArrayNode(edit, count, newChildren)
			}
		}
		function mergeLeavesInner(edit, shift, h1, n1, h2, n2) {
			if (h1 === h2) return new CollisionNode(edit, h1, [n2, n1])
			const subH1 = hashFragment(shift, h1),
				subH2 = hashFragment(shift, h2)
			if (subH1 === subH2)
				return child =>
					new IndexedNode(edit, toBitmap(subH1) | toBitmap(subH2), [child])
			{
				const children = subH1 < subH2 ? [n1, n2] : [n2, n1]
				return new IndexedNode(
					edit,
					toBitmap(subH1) | toBitmap(subH2),
					children,
				)
			}
		}
		function mergeLeaves(edit, shift, h1, n1, h2, n2) {
			let stack,
				currentShift = shift
			for (;;) {
				const res = mergeLeavesInner(edit, currentShift, h1, n1, h2, n2)
				if ("function" != typeof res) {
					let final = res
					for (; null != stack;) {
						final = stack.value(final)
						stack = stack.previous
					}
					return final
				}
				stack = { value: res, previous: stack }
				currentShift += 5
			}
		}
		const HashMapTypeId = Symbol.for("effect/HashMap"),
			HashMapProto = {
				[HashMapTypeId]: HashMapTypeId,
				[Symbol.iterator]() {
					return new HashMapIterator(this, (k, v) => [k, v])
				},
				[symbol]() {
					let hash = Hash_hash("effect/HashMap")
					for (const item of this)
						hash ^= pipe(Hash_hash(item[0]), combine(Hash_hash(item[1])))
					return cached(this, hash)
				},
				[Equal_symbol](that) {
					if (isHashMap(that)) {
						if (that._size !== this._size) return !1
						for (const item of this) {
							const elem = pipe(that, getHash(item[0], Hash_hash(item[0])))
							if (Option_isNone(elem)) return !1
							if (!equals(item[1], elem.value)) return !1
						}
						return !0
					}
					return !1
				},
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "HashMap", values: Array.from(this).map(toJSON) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			makeImpl = (editable, edit, root, size) => {
				const map = Object.create(HashMapProto)
				map._editable = editable
				map._edit = edit
				map._root = root
				map._size = size
				return map
			}
		class HashMapIterator {
			map
			f
			v
			constructor(map, f) {
				this.map = map
				this.f = f
				this.v = visitLazy(this.map._root, this.f, void 0)
			}
			next() {
				if (Option_isNone(this.v)) return { done: !0, value: void 0 }
				const v0 = this.v.value
				this.v = applyCont(v0.cont)
				return { done: !1, value: v0.value }
			}
			[Symbol.iterator]() {
				return new HashMapIterator(this.map, this.f)
			}
		}
		const applyCont = cont =>
				cont
					? visitLazyChildren(cont[0], cont[1], cont[2], cont[3], cont[4])
					: Option_none(),
			visitLazy = (node, f, cont = void 0) => {
				switch (node._tag) {
					case "LeafNode":
						return Option_isSome(node.value)
							? Option_some({ value: f(node.key, node.value.value), cont })
							: applyCont(cont)
					case "CollisionNode":
					case "ArrayNode":
					case "IndexedNode": {
						const children = node.children
						return visitLazyChildren(children.length, children, 0, f, cont)
					}
					default:
						return applyCont(cont)
				}
			},
			visitLazyChildren = (len, children, i, f, cont) => {
				for (; i < len;) {
					const child = children[i++]
					if (child && !isEmptyNode(child))
						return visitLazy(child, f, [len, children, i, f, cont])
				}
				return applyCont(cont)
			},
			hashMap_empty = makeImpl(!1, 0, new EmptyNode(), 0),
			internal_hashMap_empty = () => hashMap_empty,
			isHashMap = u => hasProperty(u, HashMapTypeId),
			hashMap_get = dual(2, (self, key) => getHash(self, key, Hash_hash(key))),
			getHash = dual(3, (self, key, hash) => {
				let node = self._root,
					shift = 0
				for (;;)
					switch (node._tag) {
						case "LeafNode":
							return equals(key, node.key) ? node.value : Option_none()
						case "CollisionNode":
							if (hash === node.hash) {
								const children = node.children
								for (let i = 0, len = children.length; i < len; ++i) {
									const child = children[i]
									if ("key" in child && equals(key, child.key))
										return child.value
								}
							}
							return Option_none()
						case "IndexedNode": {
							const bit = toBitmap(hashFragment(shift, hash))
							if (node.mask & bit) {
								node = node.children[fromBitmap(node.mask, bit)]
								shift += 5
								break
							}
							return Option_none()
						}
						case "ArrayNode":
							node = node.children[hashFragment(shift, hash)]
							if (node) {
								shift += 5
								break
							}
							return Option_none()
						default:
							return Option_none()
					}
			}),
			hashMap_has = dual(2, (self, key) =>
				Option_isSome(getHash(self, key, Hash_hash(key))),
			),
			hashMap_set = dual(3, (self, key, value) =>
				modifyAt(self, key, () => Option_some(value)),
			),
			setTree = dual(3, (self, newRoot, newSize) => {
				if (self._editable) {
					self._root = newRoot
					self._size = newSize
					return self
				}
				return newRoot === self._root
					? self
					: makeImpl(self._editable, self._edit, newRoot, newSize)
			}),
			hashMap_keys = self => new HashMapIterator(self, key => key),
			hashMap_size = self => self._size,
			beginMutation = self =>
				makeImpl(!0, self._edit + 1, self._root, self._size),
			modifyAt = dual(3, (self, key, f) =>
				modifyHash(self, key, Hash_hash(key), f),
			),
			modifyHash = dual(4, (self, key, hash, f) => {
				const size = { value: self._size },
					newRoot = self._root.modify(
						self._editable ? self._edit : NaN,
						0,
						f,
						hash,
						key,
						size,
					)
				return pipe(self, setTree(newRoot, size.value))
			}),
			hashMap_remove = dual(2, (self, key) => modifyAt(self, key, Option_none)),
			hashMap_map = dual(2, (self, f) =>
				hashMap_reduce(self, internal_hashMap_empty(), (map, value, key) =>
					hashMap_set(map, key, f(value, key)),
				),
			),
			hashMap_forEach = dual(2, (self, f) =>
				hashMap_reduce(self, void 0, (_, value, key) => f(value, key)),
			),
			hashMap_reduce = dual(3, (self, zero, f) => {
				const root = self._root
				if ("LeafNode" === root._tag)
					return Option_isSome(root.value)
						? f(zero, root.value.value, root.key)
						: zero
				if ("EmptyNode" === root._tag) return zero
				const toVisit = [root.children]
				let children
				for (; (children = toVisit.pop());)
					for (let i = 0, len = children.length; i < len;) {
						const child = children[i++]
						child &&
							!isEmptyNode(child) &&
							("LeafNode" === child._tag
								? Option_isSome(child.value) &&
									(zero = f(zero, child.value.value, child.key))
								: toVisit.push(child.children))
					}
				return zero
			}),
			HashSetTypeId = Symbol.for("effect/HashSet"),
			HashSetProto = {
				[HashSetTypeId]: HashSetTypeId,
				[Symbol.iterator]() {
					return hashMap_keys(this._keyMap)
				},
				[symbol]() {
					return cached(
						this,
						combine(Hash_hash(this._keyMap))(Hash_hash("effect/HashSet")),
					)
				},
				[Equal_symbol](that) {
					return (
						!!isHashSet(that) &&
						hashMap_size(this._keyMap) === hashMap_size(that._keyMap) &&
						equals(this._keyMap, that._keyMap)
					)
				},
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "HashSet", values: Array.from(this).map(toJSON) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			hashSet_makeImpl = keyMap => {
				const set = Object.create(HashSetProto)
				set._keyMap = keyMap
				return set
			},
			isHashSet = u => hasProperty(u, HashSetTypeId),
			hashSet_empty = hashSet_makeImpl(internal_hashMap_empty()),
			internal_hashSet_empty = () => hashSet_empty,
			hashSet_has = dual(2, (self, value) => hashMap_has(self._keyMap, value)),
			hashSet_beginMutation = self =>
				hashSet_makeImpl(beginMutation(self._keyMap)),
			hashSet_endMutation = self => {
				self._keyMap._editable = !1
				return self
			},
			hashSet_mutate = dual(2, (self, f) => {
				const transient = hashSet_beginMutation(self)
				f(transient)
				return hashSet_endMutation(transient)
			}),
			hashSet_add = dual(2, (self, value) =>
				self._keyMap._editable
					? (hashMap_set(value, !0)(self._keyMap), self)
					: hashSet_makeImpl(hashMap_set(value, !0)(self._keyMap)),
			),
			hashSet_remove = dual(2, (self, value) =>
				self._keyMap._editable
					? (hashMap_remove(value)(self._keyMap), self)
					: hashSet_makeImpl(hashMap_remove(value)(self._keyMap)),
			),
			hashSet_difference = dual(2, (self, that) =>
				hashSet_mutate(self, set => {
					for (const value of that) hashSet_remove(set, value)
				}),
			),
			hashSet_union = dual(2, (self, that) =>
				hashSet_mutate(internal_hashSet_empty(), set => {
					hashSet_forEach(self, value => hashSet_add(set, value))
					for (const value of that) hashSet_add(set, value)
				}),
			),
			hashSet_forEach = dual(2, (self, f) =>
				hashMap_forEach(self._keyMap, (_, k) => f(k)),
			),
			hashSet_reduce = dual(3, (self, zero, f) =>
				hashMap_reduce(self._keyMap, zero, (z, _, a) => f(z, a)),
			),
			HashSet_empty = internal_hashSet_empty,
			HashSet_make = (...elements) => {
				const set = hashSet_beginMutation(internal_hashSet_empty())
				for (const value of elements) hashSet_add(set, value)
				return hashSet_endMutation(set)
			},
			HashSet_has = hashSet_has,
			HashSet_size = self => hashMap_size(self._keyMap),
			HashSet_add = hashSet_add,
			HashSet_remove = hashSet_remove,
			HashSet_difference = hashSet_difference,
			HashSet_union = hashSet_union,
			HashSet_reduce = hashSet_reduce,
			MutableRef_TypeId = Symbol.for("effect/MutableRef"),
			MutableRefProto = {
				[MutableRef_TypeId]: MutableRef_TypeId,
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "MutableRef", current: toJSON(this.current) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			MutableRef_make = value => {
				const ref = Object.create(MutableRefProto)
				ref.current = value
				return ref
			},
			compareAndSet = dual(3, (self, oldValue, newValue) => {
				if (equals(oldValue, self.current)) {
					self.current = newValue
					return !0
				}
				return !1
			}),
			MutableRef_get = self => self.current,
			MutableRef_set = dual(2, (self, value) => {
				self.current = value
				return self
			}),
			FiberIdTypeId = Symbol.for("effect/FiberId"),
			emptyHash = string("effect/FiberId-None")
		class None {
			[FiberIdTypeId] = FiberIdTypeId
			_tag = "None"
			id = -1
			startTimeMillis = -1;
			[symbol]() {
				return emptyHash
			}
			[Equal_symbol](that) {
				return isFiberId(that) && "None" === that._tag
			}
			toString() {
				return format(this.toJSON())
			}
			toJSON() {
				return { _id: "FiberId", _tag: this._tag }
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
		}
		class Runtime {
			id
			startTimeMillis;
			[FiberIdTypeId] = FiberIdTypeId
			_tag = "Runtime"
			constructor(id, startTimeMillis) {
				this.id = id
				this.startTimeMillis = startTimeMillis
			}
			[symbol]() {
				return cached(
					this,
					string(
						`effect/FiberId-${this._tag}-${this.id}-${this.startTimeMillis}`,
					),
				)
			}
			[Equal_symbol](that) {
				return (
					isFiberId(that) &&
					"Runtime" === that._tag &&
					this.id === that.id &&
					this.startTimeMillis === that.startTimeMillis
				)
			}
			toString() {
				return format(this.toJSON())
			}
			toJSON() {
				return {
					_id: "FiberId",
					_tag: this._tag,
					id: this.id,
					startTimeMillis: this.startTimeMillis,
				}
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
		}
		class Composite {
			left
			right;
			[FiberIdTypeId] = FiberIdTypeId
			_tag = "Composite"
			constructor(left, right) {
				this.left = left
				this.right = right
			}
			_hash;
			[symbol]() {
				return pipe(
					string(`effect/FiberId-${this._tag}`),
					combine(Hash_hash(this.left)),
					combine(Hash_hash(this.right)),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return (
					isFiberId(that) &&
					"Composite" === that._tag &&
					equals(this.left, that.left) &&
					equals(this.right, that.right)
				)
			}
			toString() {
				return format(this.toJSON())
			}
			toJSON() {
				return {
					_id: "FiberId",
					_tag: this._tag,
					left: toJSON(this.left),
					right: toJSON(this.right),
				}
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
		}
		const fiberId_none = new None(),
			isFiberId = self => hasProperty(self, FiberIdTypeId),
			fiberId_combine = dual(2, (self, that) =>
				"None" === self._tag
					? that
					: "None" === that._tag
						? self
						: new Composite(self, that),
			),
			ids = self => {
				switch (self._tag) {
					case "None":
						return HashSet_empty()
					case "Runtime":
						return HashSet_make(self.id)
					case "Composite":
						return pipe(ids(self.left), HashSet_union(ids(self.right)))
				}
			},
			_fiberCounter = globalValue(
				Symbol.for("effect/Fiber/Id/_fiberCounter"),
				() => MutableRef_make(0),
			),
			threadName = self => {
				const identifiers = Array.from(ids(self))
					.map(n => `#${n}`)
					.join(",")
				return identifiers
			},
			FiberId_none = fiberId_none,
			FiberId_combine = fiberId_combine,
			FiberId_ids = ids,
			FiberId_threadName = threadName,
			FiberId_unsafeMake = () => {
				const id = MutableRef_get(_fiberCounter)
				pipe(_fiberCounter, MutableRef_set(id + 1))
				return new Runtime(id, Date.now())
			},
			HashMap_empty = internal_hashMap_empty,
			HashMap_get = hashMap_get,
			HashMap_set = hashMap_set,
			HashMap_keys = hashMap_keys,
			HashMap_modifyAt = modifyAt,
			HashMap_map = hashMap_map,
			HashMap_reduce = hashMap_reduce,
			List_TypeId = Symbol.for("effect/List"),
			List_toArray = self => Array_fromIterable(self),
			List_getEquivalence = isEquivalent =>
				Equivalence_mapInput(Array_getEquivalence(isEquivalent), List_toArray),
			List_equivalence = List_getEquivalence(equals),
			ConsProto = {
				[List_TypeId]: List_TypeId,
				_tag: "Cons",
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return {
						_id: "List",
						_tag: "Cons",
						values: List_toArray(this).map(toJSON),
					}
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				[Equal_symbol](that) {
					return (
						isList(that) &&
						this._tag === that._tag &&
						List_equivalence(this, that)
					)
				},
				[symbol]() {
					return cached(this, array(List_toArray(this)))
				},
				[Symbol.iterator]() {
					let done = !1,
						self = this
					return {
						next() {
							if (done) return this.return()
							if ("Nil" === self._tag) {
								done = !0
								return this.return()
							}
							const value = self.head
							self = self.tail
							return { done, value }
						},
						return(value) {
							done || (done = !0)
							return { done: !0, value }
						},
					}
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			makeCons = (head, tail) => {
				const cons = Object.create(ConsProto)
				cons.head = head
				cons.tail = tail
				return cons
			},
			NilHash = string("Nil"),
			NilProto = {
				[List_TypeId]: List_TypeId,
				_tag: "Nil",
				toString() {
					return format(this.toJSON())
				},
				toJSON: () => ({ _id: "List", _tag: "Nil" }),
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				[symbol]: () => NilHash,
				[Equal_symbol](that) {
					return isList(that) && this._tag === that._tag
				},
				[Symbol.iterator]: () => ({
					next: () => ({ done: !0, value: void 0 }),
				}),
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			_Nil = Object.create(NilProto),
			isList = u => hasProperty(u, List_TypeId),
			isNil = self => "Nil" === self._tag,
			isCons = self => "Cons" === self._tag,
			cons = (head, tail) => makeCons(head, tail),
			List_empty = () => _Nil,
			List_of = value => makeCons(value, _Nil),
			List_appendAll = dual(2, (self, that) => List_prependAll(that, self)),
			List_prepend = dual(2, (self, element) => cons(element, self)),
			List_prependAll = dual(2, (self, prefix) => {
				if (isNil(self)) return prefix
				if (isNil(prefix)) return self
				{
					const result = makeCons(prefix.head, self)
					let curr = result,
						that = prefix.tail
					for (; !isNil(that);) {
						const temp = makeCons(that.head, self)
						curr.tail = temp
						curr = temp
						that = that.tail
					}
					return result
				}
			}),
			List_reduce = dual(3, (self, zero, f) => {
				let acc = zero,
					these = self
				for (; !isNil(these);) {
					acc = f(acc, these.head)
					these = these.tail
				}
				return acc
			}),
			List_reverse = self => {
				let result = List_empty(),
					these = self
				for (; !isNil(these);) {
					result = List_prepend(result, these.head)
					these = these.tail
				}
				return result
			},
			Structural =
				(Array.prototype,
				(function () {
					function Structural(args) {
						args && Object.assign(this, args)
					}
					Structural.prototype = StructuralPrototype
					return Structural
				})())
		Structural.prototype
		const ContextPatchTypeId = Symbol.for("effect/DifferContextPatch")
		function contextPatch_variance(a) {
			return a
		}
		const contextPatch_PatchProto = {
				...Structural.prototype,
				[ContextPatchTypeId]: {
					_Value: contextPatch_variance,
					_Patch: contextPatch_variance,
				},
			},
			contextPatch_EmptyProto = Object.assign(
				Object.create(contextPatch_PatchProto),
				{ _tag: "Empty" },
			),
			contextPatch_empty = Object.create(contextPatch_EmptyProto),
			differ_contextPatch_empty = () => contextPatch_empty,
			contextPatch_AndThenProto = Object.assign(
				Object.create(contextPatch_PatchProto),
				{ _tag: "AndThen" },
			),
			AddServiceProto = Object.assign(Object.create(contextPatch_PatchProto), {
				_tag: "AddService",
			}),
			makeAddService = (key, service) => {
				const o = Object.create(AddServiceProto)
				o.key = key
				o.service = service
				return o
			},
			RemoveServiceProto = Object.assign(
				Object.create(contextPatch_PatchProto),
				{ _tag: "RemoveService" },
			),
			makeRemoveService = key => {
				const o = Object.create(RemoveServiceProto)
				o.key = key
				return o
			},
			UpdateServiceProto = Object.assign(
				Object.create(contextPatch_PatchProto),
				{ _tag: "UpdateService" },
			),
			makeUpdateService = (key, update) => {
				const o = Object.create(UpdateServiceProto)
				o.key = key
				o.update = update
				return o
			},
			contextPatch_combine = dual(2, (self, that) =>
				((first, second) => {
					const o = Object.create(contextPatch_AndThenProto)
					o.first = first
					o.second = second
					return o
				})(self, that),
			),
			contextPatch_patch = dual(2, (self, context) => {
				if ("Empty" === self._tag) return context
				let wasServiceUpdated = !1,
					patches = Chunk_of(self)
				const updatedContext = new Map(context.unsafeMap)
				for (; isNonEmpty(patches);) {
					const head = Chunk_headNonEmpty(patches),
						tail = Chunk_tailNonEmpty(patches)
					switch (head._tag) {
						case "Empty":
							patches = tail
							break
						case "AddService":
							updatedContext.set(head.key, head.service)
							patches = tail
							break
						case "AndThen":
							patches = Chunk_prepend(
								Chunk_prepend(tail, head.second),
								head.first,
							)
							break
						case "RemoveService":
							updatedContext.delete(head.key)
							patches = tail
							break
						case "UpdateService":
							updatedContext.set(
								head.key,
								head.update(updatedContext.get(head.key)),
							)
							wasServiceUpdated = !0
							patches = tail
					}
				}
				if (!wasServiceUpdated) return makeContext(updatedContext)
				const map = new Map()
				for (const [tag] of context.unsafeMap)
					if (updatedContext.has(tag)) {
						map.set(tag, updatedContext.get(tag))
						updatedContext.delete(tag)
					}
				for (const [tag, s] of updatedContext) map.set(tag, s)
				return makeContext(map)
			})
		Structural.prototype
		const HashSetPatchTypeId = Symbol.for("effect/DifferHashSetPatch")
		function hashSetPatch_variance(a) {
			return a
		}
		const hashSetPatch_PatchProto = {
				...Structural.prototype,
				[HashSetPatchTypeId]: {
					_Value: hashSetPatch_variance,
					_Key: hashSetPatch_variance,
					_Patch: hashSetPatch_variance,
				},
			},
			hashSetPatch_EmptyProto = Object.assign(
				Object.create(hashSetPatch_PatchProto),
				{ _tag: "Empty" },
			),
			hashSetPatch_empty = Object.create(hashSetPatch_EmptyProto),
			differ_hashSetPatch_empty = () => hashSetPatch_empty,
			hashSetPatch_AndThenProto = Object.assign(
				Object.create(hashSetPatch_PatchProto),
				{ _tag: "AndThen" },
			),
			hashSetPatch_AddProto = Object.assign(
				Object.create(hashSetPatch_PatchProto),
				{ _tag: "Add" },
			),
			hashSetPatch_makeAdd = value => {
				const o = Object.create(hashSetPatch_AddProto)
				o.value = value
				return o
			},
			hashSetPatch_RemoveProto = Object.assign(
				Object.create(hashSetPatch_PatchProto),
				{ _tag: "Remove" },
			),
			hashSetPatch_combine = dual(2, (self, that) =>
				((first, second) => {
					const o = Object.create(hashSetPatch_AndThenProto)
					o.first = first
					o.second = second
					return o
				})(self, that),
			),
			hashSetPatch_patch = dual(2, (self, oldValue) => {
				if ("Empty" === self._tag) return oldValue
				let set = oldValue,
					patches = Chunk_of(self)
				for (; isNonEmpty(patches);) {
					const head = Chunk_headNonEmpty(patches),
						tail = Chunk_tailNonEmpty(patches)
					switch (head._tag) {
						case "Empty":
							patches = tail
							break
						case "AndThen":
							patches = Chunk_prepend(head.first)(
								Chunk_prepend(head.second)(tail),
							)
							break
						case "Add":
							set = HashSet_add(head.value)(set)
							patches = tail
							break
						case "Remove":
							set = HashSet_remove(head.value)(set)
							patches = tail
					}
				}
				return set
			})
		Structural.prototype
		const ReadonlyArrayPatchTypeId = Symbol.for(
			"effect/DifferReadonlyArrayPatch",
		)
		function readonlyArrayPatch_variance(a) {
			return a
		}
		const readonlyArrayPatch_PatchProto = {
				...Structural.prototype,
				[ReadonlyArrayPatchTypeId]: {
					_Value: readonlyArrayPatch_variance,
					_Patch: readonlyArrayPatch_variance,
				},
			},
			readonlyArrayPatch_EmptyProto = Object.assign(
				Object.create(readonlyArrayPatch_PatchProto),
				{ _tag: "Empty" },
			),
			readonlyArrayPatch_empty = Object.create(readonlyArrayPatch_EmptyProto),
			differ_readonlyArrayPatch_empty = () => readonlyArrayPatch_empty,
			readonlyArrayPatch_AndThenProto = Object.assign(
				Object.create(readonlyArrayPatch_PatchProto),
				{ _tag: "AndThen" },
			),
			readonlyArrayPatch_AppendProto = Object.assign(
				Object.create(readonlyArrayPatch_PatchProto),
				{ _tag: "Append" },
			),
			readonlyArrayPatch_SliceProto = Object.assign(
				Object.create(readonlyArrayPatch_PatchProto),
				{ _tag: "Slice" },
			),
			readonlyArrayPatch_UpdateProto = Object.assign(
				Object.create(readonlyArrayPatch_PatchProto),
				{ _tag: "Update" },
			),
			readonlyArrayPatch_makeUpdate = (index, patch) => {
				const o = Object.create(readonlyArrayPatch_UpdateProto)
				o.index = index
				o.patch = patch
				return o
			},
			readonlyArrayPatch_combine = dual(2, (self, that) =>
				((first, second) => {
					const o = Object.create(readonlyArrayPatch_AndThenProto)
					o.first = first
					o.second = second
					return o
				})(self, that),
			),
			readonlyArrayPatch_patch = dual(3, (self, oldValue, differ) => {
				if ("Empty" === self._tag) return oldValue
				let readonlyArray = oldValue.slice(),
					patches = Array_of(self)
				for (; Array_isNonEmptyArray(patches);) {
					const head = headNonEmpty(patches),
						tail = tailNonEmpty(patches)
					switch (head._tag) {
						case "Empty":
							patches = tail
							break
						case "AndThen":
							tail.unshift(head.first, head.second)
							patches = tail
							break
						case "Append":
							for (const value of head.values) readonlyArray.push(value)
							patches = tail
							break
						case "Slice":
							readonlyArray = readonlyArray.slice(head.from, head.until)
							patches = tail
							break
						case "Update":
							readonlyArray[head.index] = differ.patch(
								head.patch,
								readonlyArray[head.index],
							)
							patches = tail
					}
				}
				return readonlyArray
			}),
			DifferTypeId = Symbol.for("effect/Differ"),
			DifferProto = {
				[DifferTypeId]: { _P: identity, _V: identity },
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			differ_make = params => {
				const differ = Object.create(DifferProto)
				differ.empty = params.empty
				differ.diff = params.diff
				differ.combine = params.combine
				differ.patch = params.patch
				return differ
			},
			differ_update = () => updateWith((_, a) => a),
			updateWith = f =>
				differ_make({
					empty: identity,
					combine: (first, second) =>
						first === identity
							? second
							: second === identity
								? first
								: a => second(first(a)),
					diff: (oldValue, newValue) =>
						equals(oldValue, newValue) ? identity : constant(newValue),
					patch: (patch, oldValue) => f(oldValue, patch(oldValue)),
				}),
			active = patch => 255 & patch,
			enabled = patch => (patch >> 8) & 255,
			runtimeFlagsPatch_make = (active, enabled) =>
				(255 & active) + ((enabled & active & 255) << 8),
			runtimeFlagsPatch_empty = runtimeFlagsPatch_make(0, 0),
			exclude = dual(2, (self, flag) =>
				runtimeFlagsPatch_make(active(self) & ~flag, enabled(self)),
			),
			runtimeFlagsPatch_andThen = dual(2, (self, that) => self | that),
			cooperativeYielding = self => runtimeFlags_isEnabled(self, 32),
			runtimeFlags_disable = dual(2, (self, flag) => self & ~flag),
			runtimeFlags_enable = dual(2, (self, flag) => self | flag),
			interruptible = self => interruption(self) && !windDown(self),
			interruption = self => runtimeFlags_isEnabled(self, 1),
			runtimeFlags_isEnabled = dual(2, (self, flag) => !!(self & flag)),
			runtimeFlags_make = (...flags) => flags.reduce((a, b) => a | b, 0),
			runtimeFlags_none = runtimeFlags_make(0),
			runtimeMetrics = self => runtimeFlags_isEnabled(self, 4),
			windDown = self => runtimeFlags_isEnabled(self, 16),
			runtimeFlags_diff = dual(2, (self, that) =>
				runtimeFlagsPatch_make(self ^ that, that),
			),
			runtimeFlags_patch = dual(
				2,
				(self, patch) =>
					(self & ((n => (~n >>> 0) & 255)(active(patch)) | enabled(patch))) |
					(active(patch) & enabled(patch)),
			),
			differ = differ_make({
				empty: runtimeFlagsPatch_empty,
				diff: (oldValue, newValue) => runtimeFlags_diff(oldValue, newValue),
				combine: (first, second) => runtimeFlagsPatch_andThen(second)(first),
				patch: (_patch, oldValue) => runtimeFlags_patch(oldValue, _patch),
			}),
			RuntimeFlagsPatch_disable = flag => runtimeFlagsPatch_make(flag, 0),
			RuntimeFlagsPatch_exclude = exclude,
			CauseTypeId = Symbol.for("effect/Cause"),
			proto = {
				[CauseTypeId]: { _E: _ => _ },
				[symbol]() {
					return pipe(
						Hash_hash("effect/Cause"),
						combine(Hash_hash(flattenCause(this))),
						cached(this),
					)
				},
				[Equal_symbol](that) {
					return isCause(that) && causeEquals(this, that)
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
				toJSON() {
					switch (this._tag) {
						case "Empty":
							return { _id: "Cause", _tag: this._tag }
						case "Die":
							return {
								_id: "Cause",
								_tag: this._tag,
								defect: toJSON(this.defect),
							}
						case "Interrupt":
							return {
								_id: "Cause",
								_tag: this._tag,
								fiberId: this.fiberId.toJSON(),
							}
						case "Fail":
							return {
								_id: "Cause",
								_tag: this._tag,
								failure: toJSON(this.error),
							}
						case "Sequential":
						case "Parallel":
							return {
								_id: "Cause",
								_tag: this._tag,
								left: toJSON(this.left),
								right: toJSON(this.right),
							}
					}
				},
				toString() {
					return pretty(this)
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
			},
			cause_empty = (() => {
				const o = Object.create(proto)
				o._tag = "Empty"
				return o
			})(),
			fail = error => {
				const o = Object.create(proto)
				o._tag = "Fail"
				o.error = error
				return o
			},
			die = defect => {
				const o = Object.create(proto)
				o._tag = "Die"
				o.defect = defect
				return o
			},
			interrupt = fiberId => {
				const o = Object.create(proto)
				o._tag = "Interrupt"
				o.fiberId = fiberId
				return o
			},
			parallel = (left, right) => {
				const o = Object.create(proto)
				o._tag = "Parallel"
				o.left = left
				o.right = right
				return o
			},
			sequential = (left, right) => {
				const o = Object.create(proto)
				o._tag = "Sequential"
				o.left = left
				o.right = right
				return o
			},
			isCause = u => hasProperty(u, CauseTypeId),
			isDieType = self => "Die" === self._tag,
			isInterrupted = self => Option_isSome(interruptOption(self)),
			isInterruptedOnly = self =>
				reduceWithContext(void 0, IsInterruptedOnlyCauseReducer)(self),
			cause_defects = self =>
				Chunk_reverse(
					cause_reduce(self, esm_Chunk_empty(), (list, cause) =>
						"Die" === cause._tag
							? Option_some(pipe(list, Chunk_prepend(cause.defect)))
							: Option_none(),
					),
				),
			interruptors = self =>
				cause_reduce(self, HashSet_empty(), (set, cause) =>
					"Interrupt" === cause._tag
						? Option_some(pipe(set, HashSet_add(cause.fiberId)))
						: Option_none(),
				),
			failureOption = self =>
				find(self, cause =>
					"Fail" === cause._tag ? Option_some(cause.error) : Option_none(),
				),
			failureOrCause = self => {
				const option = failureOption(self)
				switch (option._tag) {
					case "None":
						return Either_right(self)
					case "Some":
						return Either_left(option.value)
				}
			},
			interruptOption = self =>
				find(self, cause =>
					"Interrupt" === cause._tag
						? Option_some(cause.fiberId)
						: Option_none(),
				),
			stripFailures = self =>
				cause_match(self, {
					onEmpty: cause_empty,
					onFail: () => cause_empty,
					onDie: die,
					onInterrupt: interrupt,
					onSequential: sequential,
					onParallel: parallel,
				}),
			cause_map = dual(2, (self, f) => cause_flatMap(self, e => fail(f(e)))),
			cause_flatMap = dual(2, (self, f) =>
				cause_match(self, {
					onEmpty: cause_empty,
					onFail: error => f(error),
					onDie: defect => die(defect),
					onInterrupt: fiberId => interrupt(fiberId),
					onSequential: (left, right) => sequential(left, right),
					onParallel: (left, right) => parallel(left, right),
				}),
			),
			causeEquals = (left, right) => {
				let leftStack = Chunk_of(left),
					rightStack = Chunk_of(right)
				for (; isNonEmpty(leftStack) && isNonEmpty(rightStack);) {
					const [leftParallel, leftSequential] = pipe(
							Chunk_headNonEmpty(leftStack),
							cause_reduce(
								[HashSet_empty(), esm_Chunk_empty()],
								([parallel, sequential], cause) => {
									const [par, seq] = evaluateCause(cause)
									return Option_some([
										pipe(parallel, HashSet_union(par)),
										pipe(sequential, Chunk_appendAll(seq)),
									])
								},
							),
						),
						[rightParallel, rightSequential] = pipe(
							Chunk_headNonEmpty(rightStack),
							cause_reduce(
								[HashSet_empty(), esm_Chunk_empty()],
								([parallel, sequential], cause) => {
									const [par, seq] = evaluateCause(cause)
									return Option_some([
										pipe(parallel, HashSet_union(par)),
										pipe(sequential, Chunk_appendAll(seq)),
									])
								},
							),
						)
					if (!equals(leftParallel, rightParallel)) return !1
					leftStack = leftSequential
					rightStack = rightSequential
				}
				return !0
			},
			flattenCause = cause =>
				flattenCauseLoop(Chunk_of(cause), esm_Chunk_empty()),
			flattenCauseLoop = (causes, flattened) => {
				for (;;) {
					const [parallel, sequential] = pipe(
							causes,
							Array_reduce(
								[HashSet_empty(), esm_Chunk_empty()],
								([parallel, sequential], cause) => {
									const [par, seq] = evaluateCause(cause)
									return [
										pipe(parallel, HashSet_union(par)),
										pipe(sequential, Chunk_appendAll(seq)),
									]
								},
							),
						),
						updated =
							HashSet_size(parallel) > 0
								? pipe(flattened, Chunk_prepend(parallel))
								: flattened
					if (Chunk_isEmpty(sequential)) return Chunk_reverse(updated)
					causes = sequential
					flattened = updated
				}
				throw new Error(getBugErrorMessage("Cause.flattenCauseLoop"))
			},
			find = dual(2, (self, pf) => {
				const stack = [self]
				for (; stack.length > 0;) {
					const item = stack.pop(),
						option = pf(item)
					switch (option._tag) {
						case "None":
							switch (item._tag) {
								case "Sequential":
								case "Parallel":
									stack.push(item.right)
									stack.push(item.left)
							}
							break
						case "Some":
							return option
					}
				}
				return Option_none()
			}),
			evaluateCause = self => {
				let cause = self
				const stack = []
				let _parallel = HashSet_empty(),
					_sequential = esm_Chunk_empty()
				for (; void 0 !== cause;)
					switch (cause._tag) {
						case "Empty":
							if (0 === stack.length) return [_parallel, _sequential]
							cause = stack.pop()
							break
						case "Fail":
							_parallel = HashSet_add(
								_parallel,
								Chunk_make(cause._tag, cause.error),
							)
							if (0 === stack.length) return [_parallel, _sequential]
							cause = stack.pop()
							break
						case "Die":
							_parallel = HashSet_add(
								_parallel,
								Chunk_make(cause._tag, cause.defect),
							)
							if (0 === stack.length) return [_parallel, _sequential]
							cause = stack.pop()
							break
						case "Interrupt":
							_parallel = HashSet_add(
								_parallel,
								Chunk_make(cause._tag, cause.fiberId),
							)
							if (0 === stack.length) return [_parallel, _sequential]
							cause = stack.pop()
							break
						case "Sequential":
							switch (cause.left._tag) {
								case "Empty":
									cause = cause.right
									break
								case "Sequential":
									cause = sequential(
										cause.left.left,
										sequential(cause.left.right, cause.right),
									)
									break
								case "Parallel":
									cause = parallel(
										sequential(cause.left.left, cause.right),
										sequential(cause.left.right, cause.right),
									)
									break
								default:
									_sequential = Chunk_prepend(_sequential, cause.right)
									cause = cause.left
							}
							break
						case "Parallel":
							stack.push(cause.right)
							cause = cause.left
					}
				throw new Error(getBugErrorMessage("Cause.evaluateCauseLoop"))
			},
			IsInterruptedOnlyCauseReducer = {
				emptyCase: constTrue,
				failCase: constFalse,
				dieCase: constFalse,
				interruptCase: constTrue,
				sequentialCase: (_, left, right) => left && right,
				parallelCase: (_, left, right) => left && right,
			},
			cause_match = dual(
				2,
				(
					self,
					{ onDie, onEmpty, onFail, onInterrupt, onParallel, onSequential },
				) =>
					reduceWithContext(self, void 0, {
						emptyCase: () => onEmpty,
						failCase: (_, error) => onFail(error),
						dieCase: (_, defect) => onDie(defect),
						interruptCase: (_, fiberId) => onInterrupt(fiberId),
						sequentialCase: (_, left, right) => onSequential(left, right),
						parallelCase: (_, left, right) => onParallel(left, right),
					}),
			),
			cause_reduce = dual(3, (self, zero, pf) => {
				let accumulator = zero,
					cause = self
				const causes = []
				for (; void 0 !== cause;) {
					const option = pf(accumulator, cause)
					accumulator = Option_isSome(option) ? option.value : accumulator
					switch (cause._tag) {
						case "Sequential":
						case "Parallel":
							causes.push(cause.right)
							cause = cause.left
							break
						default:
							cause = void 0
					}
					void 0 === cause && causes.length > 0 && (cause = causes.pop())
				}
				return accumulator
			}),
			reduceWithContext = dual(3, (self, context, reducer) => {
				const input = [self],
					output = []
				for (; input.length > 0;) {
					const cause = input.pop()
					switch (cause._tag) {
						case "Empty":
							output.push(Either_right(reducer.emptyCase(context)))
							break
						case "Fail":
							output.push(Either_right(reducer.failCase(context, cause.error)))
							break
						case "Die":
							output.push(Either_right(reducer.dieCase(context, cause.defect)))
							break
						case "Interrupt":
							output.push(
								Either_right(reducer.interruptCase(context, cause.fiberId)),
							)
							break
						case "Sequential":
							input.push(cause.right)
							input.push(cause.left)
							output.push(Either_left({ _tag: "SequentialCase" }))
							break
						case "Parallel":
							input.push(cause.right)
							input.push(cause.left)
							output.push(Either_left({ _tag: "ParallelCase" }))
					}
				}
				const accumulator = []
				for (; output.length > 0;) {
					const either = output.pop()
					switch (either._tag) {
						case "Left":
							switch (either.left._tag) {
								case "SequentialCase": {
									const left = accumulator.pop(),
										right = accumulator.pop(),
										value = reducer.sequentialCase(context, left, right)
									accumulator.push(value)
									break
								}
								case "ParallelCase": {
									const left = accumulator.pop(),
										right = accumulator.pop(),
										value = reducer.parallelCase(context, left, right)
									accumulator.push(value)
									break
								}
							}
							break
						case "Right":
							accumulator.push(either.right)
					}
				}
				if (0 === accumulator.length)
					throw new Error(
						"BUG: Cause.reduceWithContext - please report an issue at https://github.com/Effect-TS/effect/issues",
					)
				return accumulator.pop()
			}),
			pretty = (cause, options) =>
				isInterruptedOnly(cause)
					? "All fibers interrupted without errors."
					: prettyErrors(cause)
							.map(function (e) {
								return !0 !== options?.renderErrorCause || void 0 === e.cause
									? e.stack
									: `${e.stack} {\n${renderErrorCause(e.cause, "  ")}\n}`
							})
							.join("\n"),
			renderErrorCause = (cause, prefix) => {
				const lines = cause.stack.split("\n")
				let stack = `${prefix}[cause]: ${lines[0]}`
				for (let i = 1, len = lines.length; i < len; i++)
					stack += `\n${prefix}${lines[i]}`
				cause.cause &&
					(stack += ` {\n${renderErrorCause(cause.cause, `${prefix}  `)}\n${prefix}}`)
				return stack
			},
			makePrettyError = originalError => {
				const originalErrorIsObject =
						"object" == typeof originalError && null !== originalError,
					prevLimit = Error.stackTraceLimit
				Error.stackTraceLimit = 1
				const error = new Error(
					prettyErrorMessage(originalError),
					originalErrorIsObject &&
						"cause" in originalError &&
						void 0 !== originalError.cause
						? { cause: makePrettyError(originalError.cause) }
						: void 0,
				)
				Error.stackTraceLimit = prevLimit
				"" === error.message && (error.message = "An error has occurred")
				Error.stackTraceLimit = prevLimit
				error.name =
					originalError instanceof Error ? originalError.name : "Error"
				if (originalErrorIsObject) {
					spanSymbol in originalError &&
						(error.span = originalError[spanSymbol])
					Object.keys(originalError).forEach(key => {
						key in error || (error[key] = originalError[key])
					})
				}
				error.stack = prettyErrorStack(
					`${error.name}: ${error.message}`,
					originalError instanceof Error && originalError.stack
						? originalError.stack
						: "",
					error.span,
				)
				return error
			},
			prettyErrorMessage = u => {
				if ("string" == typeof u) return u
				if ("object" == typeof u && null !== u && u instanceof Error)
					return u.message
				try {
					if (
						hasProperty(u, "toString") &&
						Predicate_isFunction(u.toString) &&
						u.toString !== Object.prototype.toString &&
						u.toString !== globalThis.Array.prototype.toString
					)
						return u.toString()
				} catch {}
				return stringifyCircular(u)
			},
			locationRegex = /\((.*)\)/g,
			spanToTrace = globalValue(
				"effect/Tracer/spanToTrace",
				() => new WeakMap(),
			),
			prettyErrorStack = (message, stack, span) => {
				const out = [message],
					lines = stack.startsWith(message)
						? stack.slice(message.length).split("\n")
						: stack.split("\n")
				for (let i = 1; i < lines.length; i++)
					if (
						lines[i].includes(" at new BaseEffectError") ||
						lines[i].includes(" at new YieldableError")
					)
						i++
					else {
						if (lines[i].includes("Generator.next")) break
						if (lines[i].includes("effect_internal_function")) break
						out.push(
							lines[i]
								.replace(/at .*effect_instruction_i.*\((.*)\)/, "at $1")
								.replace(/EffectPrimitive\.\w+/, "<anonymous>"),
						)
					}
				if (span) {
					let current = span,
						i = 0
					for (; current && "Span" === current._tag && i < 10;) {
						const stackFn = spanToTrace.get(current)
						if ("function" == typeof stackFn) {
							const stack = stackFn()
							if ("string" == typeof stack) {
								const locationMatchAll = stack.matchAll(locationRegex)
								let match = !1
								for (const [, location] of locationMatchAll) {
									match = !0
									out.push(`    at ${current.name} (${location})`)
								}
								match ||
									out.push(
										`    at ${current.name} (${stack.replace(/^at /, "")})`,
									)
							} else out.push(`    at ${current.name}`)
						} else out.push(`    at ${current.name}`)
						current = Option_getOrUndefined(current.parent)
						i++
					}
				}
				return out.join("\n")
			},
			spanSymbol = Symbol.for("effect/SpanAnnotation"),
			prettyErrors = cause =>
				reduceWithContext(cause, void 0, {
					emptyCase: () => [],
					dieCase: (_, unknownError) => [makePrettyError(unknownError)],
					failCase: (_, error) => [makePrettyError(error)],
					interruptCase: () => [],
					parallelCase: (_, l, r) => [...l, ...r],
					sequentialCase: (_, l, r) => [...l, ...r],
				}),
			DeferredTypeId = Symbol.for("effect/Deferred"),
			deferredVariance = { _E: _ => _, _A: _ => _ },
			done = effect => ({ _tag: "Done", effect }),
			OP_FAILURE = "Failure",
			OP_ON_FAILURE = "OnFailure",
			OP_ON_SUCCESS = "OnSuccess",
			OP_ON_SUCCESS_AND_FAILURE = "OnSuccessAndFailure",
			OP_SUCCESS = "Success",
			OP_UPDATE_RUNTIME_FLAGS = "UpdateRuntimeFlags",
			OP_ITERATOR = "Iterator",
			OP_WITH_RUNTIME = "WithRuntime",
			OP_REVERT_FLAGS = "RevertFlags"
		class singleShotGen_SingleShotGen {
			self
			called = !1
			constructor(self) {
				this.self = self
			}
			next(a) {
				return this.called
					? { value: a, done: !0 }
					: ((this.called = !0), { value: this.self, done: !1 })
			}
			return(a) {
				return { value: a, done: !0 }
			}
			throw(e) {
				throw e
			}
			[Symbol.iterator]() {
				return new singleShotGen_SingleShotGen(this.self)
			}
		}
		const blocked = (blockedRequests, _continue) => {
				const effect = new EffectPrimitive("Blocked")
				effect.effect_instruction_i0 = blockedRequests
				effect.effect_instruction_i1 = _continue
				return effect
			},
			core_EffectTypeId = Symbol.for("effect/Effect")
		class RevertFlags {
			patch
			op
			_op = "RevertFlags"
			constructor(patch, op) {
				this.patch = patch
				this.op = op
			}
		}
		class EffectPrimitive {
			_op
			effect_instruction_i0 = void 0
			effect_instruction_i1 = void 0
			effect_instruction_i2 = void 0
			trace = void 0;
			[core_EffectTypeId] = effectVariance
			constructor(_op) {
				this._op = _op
			}
			[Equal_symbol](that) {
				return this === that
			}
			[symbol]() {
				return cached(this, random(this))
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
			toJSON() {
				return {
					_id: "Effect",
					_op: this._op,
					effect_instruction_i0: toJSON(this.effect_instruction_i0),
					effect_instruction_i1: toJSON(this.effect_instruction_i1),
					effect_instruction_i2: toJSON(this.effect_instruction_i2),
				}
			}
			toString() {
				return format(this.toJSON())
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
			[Symbol.iterator]() {
				return new singleShotGen_SingleShotGen(new YieldWrap(this))
			}
		}
		class EffectPrimitiveFailure {
			_op
			effect_instruction_i0 = void 0
			effect_instruction_i1 = void 0
			effect_instruction_i2 = void 0
			trace = void 0;
			[core_EffectTypeId] = effectVariance
			constructor(_op) {
				this._op = _op
				this._tag = _op
			}
			[Equal_symbol](that) {
				return (
					exitIsExit(that) &&
					"Failure" === that._op &&
					equals(this.effect_instruction_i0, that.effect_instruction_i0)
				)
			}
			[symbol]() {
				return pipe(
					string(this._tag),
					combine(Hash_hash(this.effect_instruction_i0)),
					cached(this),
				)
			}
			get cause() {
				return this.effect_instruction_i0
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
			toJSON() {
				return { _id: "Exit", _tag: this._op, cause: this.cause.toJSON() }
			}
			toString() {
				return format(this.toJSON())
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
			[Symbol.iterator]() {
				return new singleShotGen_SingleShotGen(new YieldWrap(this))
			}
		}
		class EffectPrimitiveSuccess {
			_op
			effect_instruction_i0 = void 0
			effect_instruction_i1 = void 0
			effect_instruction_i2 = void 0
			trace = void 0;
			[core_EffectTypeId] = effectVariance
			constructor(_op) {
				this._op = _op
				this._tag = _op
			}
			[Equal_symbol](that) {
				return (
					exitIsExit(that) &&
					"Success" === that._op &&
					equals(this.effect_instruction_i0, that.effect_instruction_i0)
				)
			}
			[symbol]() {
				return pipe(
					string(this._tag),
					combine(Hash_hash(this.effect_instruction_i0)),
					cached(this),
				)
			}
			get value() {
				return this.effect_instruction_i0
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
			toJSON() {
				return { _id: "Exit", _tag: this._op, value: toJSON(this.value) }
			}
			toString() {
				return format(this.toJSON())
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
			[Symbol.iterator]() {
				return new singleShotGen_SingleShotGen(new YieldWrap(this))
			}
		}
		const isEffect = u => hasProperty(u, core_EffectTypeId),
			withFiberRuntime = withRuntime => {
				const effect = new EffectPrimitive("WithRuntime")
				effect.effect_instruction_i0 = withRuntime
				return effect
			},
			acquireUseRelease = dual(3, (acquire, use, release) =>
				uninterruptibleMask(restore =>
					core_flatMap(acquire, a =>
						core_flatMap(core_exit(suspend(() => restore(use(a)))), exit =>
							suspend(() => release(a, exit)).pipe(
								matchCauseEffect({
									onFailure: cause => {
										switch (exit._tag) {
											case "Failure":
												return failCause(
													sequential(exit.effect_instruction_i0, cause),
												)
											case "Success":
												return failCause(cause)
										}
									},
									onSuccess: () => exit,
								}),
							),
						),
					),
				),
			),
			core_as = dual(2, (self, value) =>
				core_flatMap(self, () => succeed(value)),
			),
			core_asVoid = self => core_as(self, void 0),
			custom = function () {
				const wrapper = new EffectPrimitive("Commit")
				switch (arguments.length) {
					case 2:
						wrapper.effect_instruction_i0 = arguments[0]
						wrapper.commit = arguments[1]
						break
					case 3:
						wrapper.effect_instruction_i0 = arguments[0]
						wrapper.effect_instruction_i1 = arguments[1]
						wrapper.commit = arguments[2]
						break
					case 4:
						wrapper.effect_instruction_i0 = arguments[0]
						wrapper.effect_instruction_i1 = arguments[1]
						wrapper.effect_instruction_i2 = arguments[2]
						wrapper.commit = arguments[3]
						break
					default:
						throw new Error(
							getBugErrorMessage("you're not supposed to end up here"),
						)
				}
				return wrapper
			},
			unsafeAsync = (register, blockingOn = FiberId_none) => {
				const effect = new EffectPrimitive("Async")
				let cancelerRef
				effect.effect_instruction_i0 = resume => {
					cancelerRef = register(resume)
				}
				effect.effect_instruction_i1 = blockingOn
				return onInterrupt(effect, _ =>
					isEffect(cancelerRef) ? cancelerRef : core_void_,
				)
			},
			asyncInterrupt = (register, blockingOn = FiberId_none) =>
				suspend(() => unsafeAsync(register, blockingOn)),
			async_ = (resume, blockingOn = FiberId_none) =>
				custom(resume, function () {
					let backingResume, pendingEffect
					function proxyResume(effect) {
						backingResume
							? backingResume(effect)
							: void 0 === pendingEffect && (pendingEffect = effect)
					}
					const effect = new EffectPrimitive("Async")
					effect.effect_instruction_i0 = resume => {
						backingResume = resume
						pendingEffect && resume(pendingEffect)
					}
					effect.effect_instruction_i1 = blockingOn
					let cancelerRef, controllerRef
					if (1 !== this.effect_instruction_i0.length) {
						controllerRef = new AbortController()
						cancelerRef = internalCall(() =>
							this.effect_instruction_i0(proxyResume, controllerRef.signal),
						)
					} else
						cancelerRef = internalCall(() =>
							this.effect_instruction_i0(proxyResume),
						)
					return cancelerRef || controllerRef
						? onInterrupt(effect, _ => {
								controllerRef && controllerRef.abort()
								return cancelerRef ?? core_void_
							})
						: effect
				}),
			catchAllCause = dual(2, (self, f) => {
				const effect = new EffectPrimitive("OnFailure")
				effect.effect_instruction_i0 = self
				effect.effect_instruction_i1 = f
				return effect
			}),
			catchAll = dual(2, (self, f) =>
				matchEffect(self, { onFailure: f, onSuccess: succeed }),
			),
			originalSymbol = Symbol.for("effect/OriginalAnnotation"),
			capture = (obj, span) =>
				Option_isSome(span)
					? new Proxy(obj, {
							has: (target, p) =>
								p === spanSymbol || p === originalSymbol || p in target,
							get: (target, p) =>
								p === spanSymbol
									? span.value
									: p === originalSymbol
										? obj
										: target[p],
						})
					: obj,
			core_die = defect =>
				isObject(defect) && !(spanSymbol in defect)
					? withFiberRuntime(fiber =>
							failCause(die(capture(defect, currentSpanFromFiber(fiber)))),
						)
					: failCause(die(defect)),
			dieMessage = message =>
				failCauseSync(() => die(new RuntimeException(message))),
			core_either = self =>
				matchEffect(self, {
					onFailure: e => succeed(Either_left(e)),
					onSuccess: a => succeed(Either_right(a)),
				}),
			core_exit = self =>
				matchCause(self, { onFailure: exitFailCause, onSuccess: exitSucceed }),
			core_fail = error =>
				isObject(error) && !(spanSymbol in error)
					? withFiberRuntime(fiber =>
							failCause(fail(capture(error, currentSpanFromFiber(fiber)))),
						)
					: failCause(fail(error)),
			failSync = evaluate => core_flatMap(sync(evaluate), core_fail),
			failCause = cause => {
				const effect = new EffectPrimitiveFailure("Failure")
				effect.effect_instruction_i0 = cause
				return effect
			},
			failCauseSync = evaluate => core_flatMap(sync(evaluate), failCause),
			fiberId = withFiberRuntime(state => succeed(state.id())),
			fiberIdWith = f => withFiberRuntime(state => f(state.id())),
			core_flatMap = dual(2, (self, f) => {
				const effect = new EffectPrimitive("OnSuccess")
				effect.effect_instruction_i0 = self
				effect.effect_instruction_i1 = f
				return effect
			}),
			step = self => {
				const effect = new EffectPrimitive("OnStep")
				effect.effect_instruction_i0 = self
				return effect
			},
			core_flatten = self => core_flatMap(self, identity),
			matchCause = dual(2, (self, options) =>
				matchCauseEffect(self, {
					onFailure: cause => succeed(options.onFailure(cause)),
					onSuccess: a => succeed(options.onSuccess(a)),
				}),
			),
			matchCauseEffect = dual(2, (self, options) => {
				const effect = new EffectPrimitive("OnSuccessAndFailure")
				effect.effect_instruction_i0 = self
				effect.effect_instruction_i1 = options.onFailure
				effect.effect_instruction_i2 = options.onSuccess
				return effect
			}),
			matchEffect = dual(2, (self, options) =>
				matchCauseEffect(self, {
					onFailure: cause => {
						if (cause_defects(cause).length > 0)
							return failCause(
								(self =>
									cause_match(self, {
										onEmpty: cause_empty,
										onFail: die,
										onDie: die,
										onInterrupt: interrupt,
										onSequential: sequential,
										onParallel: parallel,
									}))(cause),
							)
						const failures = (self =>
							Chunk_reverse(
								cause_reduce(self, esm_Chunk_empty(), (list, cause) =>
									"Fail" === cause._tag
										? Option_some(pipe(list, Chunk_prepend(cause.error)))
										: Option_none(),
								),
							))(cause)
						return failures.length > 0
							? options.onFailure(Chunk_unsafeHead(failures))
							: failCause(cause)
					},
					onSuccess: options.onSuccess,
				}),
			),
			forEachSequential = dual(2, (self, f) =>
				suspend(() => {
					const arr = Array_fromIterable(self),
						ret = allocate(arr.length)
					let i = 0
					return core_as(
						whileLoop({
							while: () => i < arr.length,
							body: () => f(arr[i], i),
							step: b => {
								ret[i++] = b
							},
						}),
						ret,
					)
				}),
			),
			forEachSequentialDiscard = dual(2, (self, f) =>
				suspend(() => {
					const arr = Array_fromIterable(self)
					let i = 0
					return whileLoop({
						while: () => i < arr.length,
						body: () => f(arr[i], i),
						step: () => {
							i++
						},
					})
				}),
			),
			core_interrupt = core_flatMap(fiberId, fiberId => interruptWith(fiberId)),
			interruptWith = fiberId => failCause(interrupt(fiberId)),
			core_interruptible = self => {
				const effect = new EffectPrimitive("UpdateRuntimeFlags")
				effect.effect_instruction_i0 = runtimeFlagsPatch_make((flag = 1), flag)
				var flag
				effect.effect_instruction_i1 = () => self
				return effect
			},
			intoDeferred = dual(2, (self, deferred) =>
				uninterruptibleMask(restore =>
					core_flatMap(core_exit(restore(self)), exit =>
						deferredDone(deferred, exit),
					),
				),
			),
			core_map = dual(2, (self, f) =>
				core_flatMap(self, a => sync(() => f(a))),
			),
			core_mapBoth = dual(2, (self, options) =>
				matchEffect(self, {
					onFailure: e => failSync(() => options.onFailure(e)),
					onSuccess: a => sync(() => options.onSuccess(a)),
				}),
			),
			mapError = dual(2, (self, f) =>
				matchCauseEffect(self, {
					onFailure: cause => {
						const either = failureOrCause(cause)
						switch (either._tag) {
							case "Left":
								return failSync(() => f(either.left))
							case "Right":
								return failCause(either.right)
						}
					},
					onSuccess: succeed,
				}),
			),
			onExit = dual(2, (self, cleanup) =>
				uninterruptibleMask(restore =>
					matchCauseEffect(restore(self), {
						onFailure: cause1 => {
							const result = exitFailCause(cause1)
							return matchCauseEffect(cleanup(result), {
								onFailure: cause2 => exitFailCause(sequential(cause1, cause2)),
								onSuccess: () => result,
							})
						},
						onSuccess: success => {
							const result = exitSucceed(success)
							return core_zipRight(cleanup(result), result)
						},
					}),
				),
			),
			onInterrupt = dual(2, (self, cleanup) =>
				onExit(
					self,
					exitMatch({
						onFailure: cause =>
							isInterruptedOnly(cause)
								? core_asVoid(cleanup(interruptors(cause)))
								: core_void_,
						onSuccess: () => core_void_,
					}),
				),
			),
			core_orElse = dual(2, (self, that) => attemptOrElse(self, that, succeed)),
			orDie = self => orDieWith(self, identity),
			orDieWith = dual(2, (self, f) =>
				matchEffect(self, {
					onFailure: e => core_die(f(e)),
					onSuccess: succeed,
				}),
			),
			succeed = value => {
				const effect = new EffectPrimitiveSuccess("Success")
				effect.effect_instruction_i0 = value
				return effect
			},
			suspend = evaluate => {
				const effect = new EffectPrimitive("Commit")
				effect.commit = evaluate
				return effect
			},
			sync = thunk => {
				const effect = new EffectPrimitive("Sync")
				effect.effect_instruction_i0 = thunk
				return effect
			},
			core_tap = dual(
				args =>
					3 === args.length ||
					(2 === args.length &&
						!(isObject(args[1]) && "onlyEffect" in args[1])),
				(self, f) =>
					core_flatMap(self, a => {
						const b = "function" == typeof f ? f(a) : f
						return isEffect(b)
							? core_as(b, a)
							: hasProperty((input = b), "then") &&
								  Predicate_isFunction(input.then)
								? unsafeAsync(resume => {
										b.then(
											_ => resume(succeed(a)),
											e =>
												resume(
													core_fail(
														new UnknownException(
															e,
															"An unknown error occurred in Effect.tap",
														),
													),
												),
										)
									})
								: succeed(a)
						var input
					}),
			),
			attemptOrElse = dual(3, (self, that, onSuccess) =>
				matchCauseEffect(self, {
					onFailure: cause =>
						cause_defects(cause).length > 0
							? failCause(
									Option_getOrThrow(
										(self =>
											cause_match(self, {
												onEmpty: Option_none(),
												onFail: failure => Option_some(die(failure)),
												onDie: defect => Option_some(die(defect)),
												onInterrupt: () => Option_none(),
												onSequential: mergeWith(sequential),
												onParallel: mergeWith(parallel),
											}))(cause),
									),
								)
							: that(),
					onSuccess,
				}),
			),
			uninterruptible = self => {
				const effect = new EffectPrimitive("UpdateRuntimeFlags")
				effect.effect_instruction_i0 = RuntimeFlagsPatch_disable(1)
				effect.effect_instruction_i1 = () => self
				return effect
			},
			uninterruptibleMask = f =>
				custom(f, function () {
					const effect = new EffectPrimitive("UpdateRuntimeFlags")
					effect.effect_instruction_i0 = RuntimeFlagsPatch_disable(1)
					effect.effect_instruction_i1 = oldFlags =>
						interruption(oldFlags)
							? internalCall(() =>
									this.effect_instruction_i0(core_interruptible),
								)
							: internalCall(() => this.effect_instruction_i0(uninterruptible))
					return effect
				}),
			core_void_ = succeed(void 0),
			whenEffect = dual(2, (self, condition) =>
				core_flatMap(condition, b =>
					b ? pipe(self, core_map(Option_some)) : succeed(Option_none()),
				),
			),
			whileLoop = options => {
				const effect = new EffectPrimitive("While")
				effect.effect_instruction_i0 = options.while
				effect.effect_instruction_i1 = options.body
				effect.effect_instruction_i2 = options.step
				return effect
			},
			fromIterator = iterator =>
				suspend(() => {
					const effect = new EffectPrimitive("Iterator")
					effect.effect_instruction_i0 = iterator()
					return effect
				}),
			core_gen = function () {
				const f =
					1 === arguments.length
						? arguments[0]
						: arguments[1].bind(arguments[0])
				return fromIterator(() => f(pipe))
			},
			fnUntraced = (body, ...pipeables) =>
				Object.defineProperty(
					0 === pipeables.length
						? function (...args) {
								return fromIterator(() => body.apply(this, args))
							}
						: function (...args) {
								let effect = fromIterator(() => body.apply(this, args))
								for (const x of pipeables) effect = x(effect, ...args)
								return effect
							},
					"length",
					{ value: body.length, configurable: !0 },
				),
			withConcurrency = dual(2, (self, concurrency) =>
				fiberRefLocally(self, currentConcurrency, concurrency),
			),
			withRuntimeFlags = dual(2, (self, update) => {
				const effect = new EffectPrimitive("UpdateRuntimeFlags")
				effect.effect_instruction_i0 = update
				effect.effect_instruction_i1 = () => self
				return effect
			}),
			yieldNow = options => {
				const effect = new EffectPrimitive("Yield")
				return void 0 !== options?.priority
					? withSchedulingPriority(effect, options.priority)
					: effect
			},
			core_zip = dual(2, (self, that) =>
				core_flatMap(self, a => core_map(that, b => [a, b])),
			),
			core_zipLeft = dual(2, (self, that) =>
				core_flatMap(self, a => core_as(that, a)),
			),
			core_zipRight = dual(2, (self, that) => core_flatMap(self, () => that)),
			core_zipWith = dual(3, (self, that, f) =>
				core_flatMap(self, a => core_map(that, b => f(a, b))),
			),
			interruptFiber = self =>
				core_flatMap(fiberId, fiberId => pipe(self, interruptAsFiber(fiberId))),
			interruptAsFiber = dual(2, (self, fiberId) =>
				core_flatMap(self.interruptAsFork(fiberId), () => self.await),
			),
			logLevelFatal =
				(Number.MIN_SAFE_INTEGER,
				{
					_tag: "Fatal",
					syslog: 2,
					label: "FATAL",
					ordinal: 5e4,
					pipe() {
						return pipeArguments(this, arguments)
					},
				}),
			logLevelError = {
				_tag: "Error",
				syslog: 3,
				label: "ERROR",
				ordinal: 4e4,
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			logLevelWarning = {
				_tag: "Warning",
				syslog: 4,
				label: "WARN",
				ordinal: 3e4,
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			logLevelInfo = {
				_tag: "Info",
				syslog: 6,
				label: "INFO",
				ordinal: 2e4,
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			logLevelDebug = {
				_tag: "Debug",
				syslog: 7,
				label: "DEBUG",
				ordinal: 1e4,
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			logLevelTrace = {
				_tag: "Trace",
				syslog: 7,
				label: "TRACE",
				ordinal: 0,
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			FiberRefTypeId = (Number.MAX_SAFE_INTEGER, Symbol.for("effect/FiberRef")),
			fiberRefVariance = { _A: _ => _ },
			fiberRefGet = self =>
				withFiberRuntime(fiber => exitSucceed(fiber.getFiberRef(self))),
			fiberRefGetWith = dual(2, (self, f) =>
				core_flatMap(fiberRefGet(self), f),
			),
			fiberRefSet = dual(2, (self, value) =>
				fiberRefModify(self, () => [void 0, value]),
			),
			fiberRefModify = dual(2, (self, f) =>
				withFiberRuntime(state => {
					const [b, a] = f(state.getFiberRef(self))
					state.setFiberRef(self, a)
					return succeed(b)
				}),
			),
			fiberRefLocally = dual(3, (use, self, value) =>
				acquireUseRelease(
					core_zipLeft(fiberRefGet(self), fiberRefSet(self, value)),
					() => use,
					oldValue => fiberRefSet(self, oldValue),
				),
			),
			fiberRefLocallyWith = dual(3, (use, self, f) =>
				fiberRefGetWith(self, a => fiberRefLocally(use, self, f(a))),
			),
			fiberRefUnsafeMake = (initial, options) =>
				fiberRefUnsafeMakePatch(initial, {
					differ: differ_update(),
					fork: options?.fork ?? identity,
					join: options?.join,
				}),
			fiberRefUnsafeMakeContext = initial => {
				const differ = differ_make({
					empty: differ_contextPatch_empty(),
					combine: (first, second) => contextPatch_combine(second)(first),
					diff: (oldValue, newValue) =>
						((oldValue, newValue) => {
							const missingServices = new Map(oldValue.unsafeMap)
							let patch = differ_contextPatch_empty()
							for (const [tag, newService] of newValue.unsafeMap.entries())
								if (missingServices.has(tag)) {
									const old = missingServices.get(tag)
									missingServices.delete(tag)
									equals(old, newService) ||
										(patch = contextPatch_combine(
											makeUpdateService(tag, () => newService),
										)(patch))
								} else {
									missingServices.delete(tag)
									patch = contextPatch_combine(makeAddService(tag, newService))(
										patch,
									)
								}
							for (const [tag] of missingServices.entries())
								patch = contextPatch_combine(makeRemoveService(tag))(patch)
							return patch
						})(oldValue, newValue),
					patch: (patch, oldValue) => contextPatch_patch(oldValue)(patch),
				})
				return fiberRefUnsafeMakePatch(initial, { differ, fork: differ.empty })
			},
			fiberRefUnsafeMakePatch = (initial, options) => {
				const _fiberRef = {
					...CommitPrototype,
					[FiberRefTypeId]: fiberRefVariance,
					initial,
					commit() {
						return fiberRefGet(this)
					},
					diff: (oldValue, newValue) => options.differ.diff(oldValue, newValue),
					combine: (first, second) => options.differ.combine(first, second),
					patch: patch => oldValue => options.differ.patch(patch, oldValue),
					fork: options.fork,
					join: options.join ?? ((_, n) => n),
				}
				return _fiberRef
			},
			fiberRefUnsafeMakeRuntimeFlags = initial =>
				fiberRefUnsafeMakePatch(initial, { differ, fork: differ.empty }),
			currentContext = globalValue(
				Symbol.for("effect/FiberRef/currentContext"),
				() => fiberRefUnsafeMakeContext(Context_empty()),
			),
			currentSchedulingPriority = globalValue(
				Symbol.for("effect/FiberRef/currentSchedulingPriority"),
				() => fiberRefUnsafeMake(0),
			),
			currentMaxOpsBeforeYield = globalValue(
				Symbol.for("effect/FiberRef/currentMaxOpsBeforeYield"),
				() => fiberRefUnsafeMake(2048),
			),
			currentLogAnnotations = globalValue(
				Symbol.for("effect/FiberRef/currentLogAnnotation"),
				() => fiberRefUnsafeMake(HashMap_empty()),
			),
			currentLogLevel = globalValue(
				Symbol.for("effect/FiberRef/currentLogLevel"),
				() => fiberRefUnsafeMake(logLevelInfo),
			),
			currentLogSpan = globalValue(
				Symbol.for("effect/FiberRef/currentLogSpan"),
				() => fiberRefUnsafeMake(List_empty()),
			),
			withSchedulingPriority = dual(2, (self, scheduler) =>
				fiberRefLocally(self, currentSchedulingPriority, scheduler),
			),
			currentConcurrency = globalValue(
				Symbol.for("effect/FiberRef/currentConcurrency"),
				() => fiberRefUnsafeMake("unbounded"),
			),
			currentRequestBatching = globalValue(
				Symbol.for("effect/FiberRef/currentRequestBatching"),
				() => fiberRefUnsafeMake(!0),
			),
			currentUnhandledErrorLogLevel = globalValue(
				Symbol.for("effect/FiberRef/currentUnhandledErrorLogLevel"),
				() => fiberRefUnsafeMake(Option_some(logLevelDebug)),
			),
			currentVersionMismatchErrorLogLevel = globalValue(
				Symbol.for("effect/FiberRef/versionMismatchErrorLogLevel"),
				() => fiberRefUnsafeMake(Option_some(logLevelWarning)),
			),
			currentMetricLabels = globalValue(
				Symbol.for("effect/FiberRef/currentMetricLabels"),
				() =>
					(() => {
						const differ = (differ =>
							differ_make({
								empty: differ_readonlyArrayPatch_empty(),
								combine: (first, second) =>
									readonlyArrayPatch_combine(first, second),
								diff: (oldValue, newValue) =>
									(options => {
										let i = 0,
											patch = differ_readonlyArrayPatch_empty()
										for (
											;
											i < options.oldValue.length &&
											i < options.newValue.length;
										) {
											const oldElement = options.oldValue[i],
												newElement = options.newValue[i],
												valuePatch = options.differ.diff(oldElement, newElement)
											equals(valuePatch, options.differ.empty) ||
												(patch = readonlyArrayPatch_combine(
													patch,
													readonlyArrayPatch_makeUpdate(i, valuePatch),
												))
											i += 1
										}
										i < options.oldValue.length &&
											(patch = readonlyArrayPatch_combine(
												patch,
												((from, until) => {
													const o = Object.create(readonlyArrayPatch_SliceProto)
													o.from = 0
													o.until = until
													return o
												})(0, i),
											))
										i < options.newValue.length &&
											(patch = readonlyArrayPatch_combine(
												patch,
												(values => {
													const o = Object.create(
														readonlyArrayPatch_AppendProto,
													)
													o.values = values
													return o
												})(Array_drop(i)(options.newValue)),
											))
										return patch
									})({ oldValue, newValue, differ }),
								patch: (patch, oldValue) =>
									readonlyArrayPatch_patch(patch, oldValue, differ),
							}))(differ_update())
						return fiberRefUnsafeMakePatch([], { differ, fork: differ.empty })
					})(),
			),
			currentForkScopeOverride = globalValue(
				Symbol.for("effect/FiberRef/currentForkScopeOverride"),
				() =>
					fiberRefUnsafeMake(Option_none(), {
						fork: () => Option_none(),
						join: (parent, _) => parent,
					}),
			),
			currentInterruptedCause = globalValue(
				Symbol.for("effect/FiberRef/currentInterruptedCause"),
				() =>
					fiberRefUnsafeMake(cause_empty, {
						fork: () => cause_empty,
						join: (parent, _) => parent,
					}),
			),
			ScopeTypeId = Symbol.for("effect/Scope"),
			CloseableScopeTypeId = Symbol.for("effect/CloseableScope"),
			scopeAddFinalizer = (self, finalizer) =>
				self.addFinalizer(() => core_asVoid(finalizer)),
			scopeAddFinalizerExit = (self, finalizer) => self.addFinalizer(finalizer),
			scopeClose = (self, exit) => self.close(exit),
			scopeFork = (self, strategy) => self.fork(strategy),
			causeSquashWith = dual(2, (self, f) => {
				const option = pipe(self, failureOption, Option_map(f))
				switch (option._tag) {
					case "None":
						return pipe(
							cause_defects(self),
							Chunk_head,
							Option_match({
								onNone: () => {
									const interrupts = Array_fromIterable(
										interruptors(self),
									).flatMap(fiberId =>
										Array_fromIterable(FiberId_ids(fiberId)).map(
											id => `#${id}`,
										),
									)
									return new InterruptedException(
										interrupts
											? `Interrupted by fibers: ${interrupts.join(", ")}`
											: void 0,
									)
								},
								onSome: identity,
							}),
						)
					case "Some":
						return option.value
				}
			}),
			YieldableError = (function () {
				class YieldableError extends globalThis.Error {
					commit() {
						return core_fail(this)
					}
					toJSON() {
						const obj = { ...this }
						this.message && (obj.message = this.message)
						this.cause && (obj.cause = this.cause)
						return obj
					}
					[NodeInspectSymbol]() {
						return this.toString !== globalThis.Error.prototype.toString
							? this.stack
								? `${this.toString()}\n${this.stack.split("\n").slice(1).join("\n")}`
								: this.toString()
							: "Bun" in globalThis
								? pretty(fail(this), { renderErrorCause: !0 })
								: this
					}
				}
				Object.assign(YieldableError.prototype, StructuralCommitPrototype)
				return YieldableError
			})(),
			makeException = (proto, tag) => {
				class Base extends YieldableError {
					_tag = tag
				}
				Object.assign(Base.prototype, proto)
				Base.prototype.name = tag
				return Base
			},
			RuntimeExceptionTypeId = Symbol.for(
				"effect/Cause/errors/RuntimeException",
			),
			RuntimeException = makeException(
				{ [RuntimeExceptionTypeId]: RuntimeExceptionTypeId },
				"RuntimeException",
			),
			InterruptedExceptionTypeId = Symbol.for(
				"effect/Cause/errors/InterruptedException",
			),
			InterruptedException = makeException(
				{ [InterruptedExceptionTypeId]: InterruptedExceptionTypeId },
				"InterruptedException",
			),
			isInterruptedException = u => hasProperty(u, InterruptedExceptionTypeId),
			NoSuchElementExceptionTypeId = Symbol.for(
				"effect/Cause/errors/NoSuchElement",
			),
			NoSuchElementException = makeException(
				{ [NoSuchElementExceptionTypeId]: NoSuchElementExceptionTypeId },
				"NoSuchElementException",
			),
			UnknownExceptionTypeId = Symbol.for(
				"effect/Cause/errors/UnknownException",
			),
			UnknownException = (function () {
				class UnknownException extends YieldableError {
					_tag = "UnknownException"
					error
					constructor(cause, message) {
						super(message ?? "An unknown error occurred", { cause })
						this.error = cause
					}
				}
				Object.assign(UnknownException.prototype, {
					[UnknownExceptionTypeId]: UnknownExceptionTypeId,
					name: "UnknownException",
				})
				return UnknownException
			})(),
			exitIsExit = u =>
				isEffect(u) &&
				"_tag" in u &&
				("Success" === u._tag || "Failure" === u._tag),
			exitIsSuccess = self => "Success" === self._tag,
			exitAs = dual(2, (self, value) => {
				switch (self._tag) {
					case "Failure":
						return exitFailCause(self.effect_instruction_i0)
					case "Success":
						return exitSucceed(value)
				}
			}),
			exitAsVoid = self => exitAs(self, void 0),
			exitCollectAll = (exits, options) =>
				exitCollectAllInternal(
					exits,
					options?.parallel ? parallel : sequential,
				),
			exitDie = defect => exitFailCause(die(defect)),
			exitFail = error => exitFailCause(fail(error)),
			exitFailCause = cause => {
				const effect = new EffectPrimitiveFailure("Failure")
				effect.effect_instruction_i0 = cause
				return effect
			},
			exitInterrupt = fiberId => exitFailCause(interrupt(fiberId)),
			exitMap = dual(2, (self, f) => {
				switch (self._tag) {
					case "Failure":
						return exitFailCause(self.effect_instruction_i0)
					case "Success":
						return exitSucceed(f(self.effect_instruction_i0))
				}
			}),
			exitMatch = dual(2, (self, { onFailure, onSuccess }) => {
				switch (self._tag) {
					case "Failure":
						return onFailure(self.effect_instruction_i0)
					case "Success":
						return onSuccess(self.effect_instruction_i0)
				}
			}),
			exitMatchEffect = dual(2, (self, { onFailure, onSuccess }) => {
				switch (self._tag) {
					case "Failure":
						return onFailure(self.effect_instruction_i0)
					case "Success":
						return onSuccess(self.effect_instruction_i0)
				}
			}),
			exitSucceed = value => {
				const effect = new EffectPrimitiveSuccess("Success")
				effect.effect_instruction_i0 = value
				return effect
			},
			exitVoid = exitSucceed(void 0),
			exitZip = dual(2, (self, that) =>
				exitZipWith(self, that, {
					onSuccess: (a, a2) => [a, a2],
					onFailure: sequential,
				}),
			),
			exitZipRight = dual(2, (self, that) =>
				exitZipWith(self, that, {
					onSuccess: (_, a2) => a2,
					onFailure: sequential,
				}),
			),
			exitZipWith = dual(3, (self, that, { onFailure, onSuccess }) => {
				switch (self._tag) {
					case "Failure":
						switch (that._tag) {
							case "Success":
								return exitFailCause(self.effect_instruction_i0)
							case "Failure":
								return exitFailCause(
									onFailure(
										self.effect_instruction_i0,
										that.effect_instruction_i0,
									),
								)
						}
					case "Success":
						switch (that._tag) {
							case "Success":
								return exitSucceed(
									onSuccess(
										self.effect_instruction_i0,
										that.effect_instruction_i0,
									),
								)
							case "Failure":
								return exitFailCause(that.effect_instruction_i0)
						}
				}
			}),
			exitCollectAllInternal = (exits, combineCauses) => {
				const list = Chunk_fromIterable(exits)
				return isNonEmpty(list)
					? pipe(
							Chunk_tailNonEmpty(list),
							Array_reduce(
								pipe(Chunk_headNonEmpty(list), exitMap(Chunk_of)),
								(accumulator, current) =>
									pipe(
										accumulator,
										exitZipWith(current, {
											onSuccess: (list, value) =>
												pipe(list, Chunk_prepend(value)),
											onFailure: combineCauses,
										}),
									),
							),
							exitMap(Chunk_reverse),
							exitMap(chunk => toReadonlyArray(chunk)),
							Option_some,
						)
					: Option_none()
			},
			deferredUnsafeMake = fiberId => {
				var joiners
				return {
					...CommitPrototype,
					[DeferredTypeId]: deferredVariance,
					state: MutableRef_make(
						((joiners = []), { _tag: "Pending", joiners }),
					),
					commit() {
						return deferredAwait(this)
					},
					blockingOn: fiberId,
				}
			},
			deferredMake = () => core_flatMap(fiberId, id => deferredMakeAs(id)),
			deferredMakeAs = fiberId => sync(() => deferredUnsafeMake(fiberId)),
			deferredAwait = self =>
				asyncInterrupt(resume => {
					const state = MutableRef_get(self.state)
					switch (state._tag) {
						case "Done":
							return resume(state.effect)
						case "Pending":
							state.joiners.push(resume)
							return deferredInterruptJoiner(self, resume)
					}
				}, self.blockingOn),
			deferredCompleteWith = dual(2, (self, effect) =>
				sync(() => {
					const state = MutableRef_get(self.state)
					switch (state._tag) {
						case "Done":
							return !1
						case "Pending":
							MutableRef_set(self.state, done(effect))
							for (let i = 0, len = state.joiners.length; i < len; i++)
								state.joiners[i](effect)
							return !0
					}
				}),
			),
			deferredDone = dual(2, (self, exit) => deferredCompleteWith(self, exit)),
			deferredFailCause = dual(2, (self, cause) =>
				deferredCompleteWith(self, failCause(cause)),
			),
			deferredInterruptWith = dual(2, (self, fiberId) =>
				deferredCompleteWith(self, interruptWith(fiberId)),
			),
			deferredSucceed = dual(2, (self, value) =>
				deferredCompleteWith(self, succeed(value)),
			),
			deferredUnsafeDone = (self, effect) => {
				const state = MutableRef_get(self.state)
				if ("Pending" === state._tag) {
					MutableRef_set(self.state, done(effect))
					for (let i = 0, len = state.joiners.length; i < len; i++)
						state.joiners[i](effect)
				}
			},
			deferredInterruptJoiner = (self, joiner) =>
				sync(() => {
					const state = MutableRef_get(self.state)
					if ("Pending" === state._tag) {
						const index = state.joiners.indexOf(joiner)
						index >= 0 && state.joiners.splice(index, 1)
					}
				}),
			constContext = withFiberRuntime(fiber =>
				exitSucceed(fiber.currentContext),
			),
			contextWithEffect = f => core_flatMap(constContext, f),
			provideContext = dual(2, (self, context) =>
				fiberRefLocally(currentContext, context)(self),
			),
			provideSomeContext = dual(2, (self, context) =>
				fiberRefLocallyWith(currentContext, parent =>
					Context_merge(parent, context),
				)(self),
			),
			mapInputContext = dual(2, (self, f) =>
				contextWithEffect(context => provideContext(self, f(context))),
			),
			currentSpanFromFiber = fiber => {
				const span = fiber.currentSpan
				return void 0 !== span && "Span" === span._tag
					? Option_some(span)
					: Option_none()
			},
			ClockTypeId = Symbol.for("effect/Clock"),
			clockTag = GenericTag("effect/Clock"),
			globalClockScheduler = {
				unsafeSchedule(task, duration) {
					const millis = toMillis(duration)
					if (millis > 2147483647) return constFalse
					let completed = !1
					const handle = setTimeout(() => {
						completed = !0
						task()
					}, millis)
					return () => {
						clearTimeout(handle)
						return !completed
					}
				},
			},
			performanceNowNanos = (function () {
				const bigint1e6 = BigInt(1e6)
				if (
					"undefined" == typeof performance ||
					"function" != typeof performance.now
				)
					return () => BigInt(Date.now()) * bigint1e6
				let origin
				return () => {
					void 0 === origin &&
						(origin =
							BigInt(Date.now()) * bigint1e6 -
							BigInt(Math.round(1e6 * performance.now())))
					return origin + BigInt(Math.round(1e6 * performance.now()))
				}
			})(),
			processOrPerformanceNow = (function () {
				const processHrtime =
					"object" == typeof process &&
					"hrtime" in process &&
					"function" == typeof process.hrtime.bigint
						? process.hrtime
						: void 0
				if (!processHrtime) return performanceNowNanos
				const origin = performanceNowNanos() - processHrtime.bigint()
				return () => origin + processHrtime.bigint()
			})()
		class ClockImpl {
			[ClockTypeId] = ClockTypeId
			unsafeCurrentTimeMillis() {
				return Date.now()
			}
			unsafeCurrentTimeNanos() {
				return processOrPerformanceNow()
			}
			currentTimeMillis = sync(() => this.unsafeCurrentTimeMillis())
			currentTimeNanos = sync(() => this.unsafeCurrentTimeNanos())
			scheduler() {
				return succeed(globalClockScheduler)
			}
			sleep(duration) {
				return async_(resume => {
					const canceler = globalClockScheduler.unsafeSchedule(
						() => resume(core_void_),
						duration,
					)
					return core_asVoid(sync(canceler))
				})
			}
		}
		const clock_make = () => new ClockImpl(),
			Number_Order = Order_number,
			Number_clamp = clamp(Number_Order),
			RegExp_escape = string => string.replace(/[/\\^$*+?.()|[\]{}]/g, "\\$&"),
			ConfigErrorTypeId = Symbol.for("effect/ConfigError"),
			configError_proto = {
				_tag: "ConfigError",
				[ConfigErrorTypeId]: ConfigErrorTypeId,
			},
			And = (self, that) => {
				const error = Object.create(configError_proto)
				error._op = "And"
				error.left = self
				error.right = that
				Object.defineProperty(error, "toString", {
					enumerable: !1,
					value() {
						return `${this.left} and ${this.right}`
					},
				})
				Object.defineProperty(error, "message", {
					enumerable: !1,
					get() {
						return this.toString()
					},
				})
				return error
			},
			Or = (self, that) => {
				const error = Object.create(configError_proto)
				error._op = "Or"
				error.left = self
				error.right = that
				Object.defineProperty(error, "toString", {
					enumerable: !1,
					value() {
						return `${this.left} or ${this.right}`
					},
				})
				Object.defineProperty(error, "message", {
					enumerable: !1,
					get() {
						return this.toString()
					},
				})
				return error
			},
			InvalidData = (path, message, options = { pathDelim: "." }) => {
				const error = Object.create(configError_proto)
				error._op = "InvalidData"
				error.path = path
				error.message = message
				Object.defineProperty(error, "toString", {
					enumerable: !1,
					value() {
						return `(Invalid data at ${pipe(this.path, join(options.pathDelim))}: "${this.message}")`
					},
				})
				return error
			},
			MissingData = (path, message, options = { pathDelim: "." }) => {
				const error = Object.create(configError_proto)
				error._op = "MissingData"
				error.path = path
				error.message = message
				Object.defineProperty(error, "toString", {
					enumerable: !1,
					value() {
						return `(Missing data at ${pipe(this.path, join(options.pathDelim))}: "${this.message}")`
					},
				})
				return error
			},
			SourceUnavailable = (
				path,
				message,
				cause,
				options = { pathDelim: "." },
			) => {
				const error = Object.create(configError_proto)
				error._op = "SourceUnavailable"
				error.path = path
				error.message = message
				error.cause = cause
				Object.defineProperty(error, "toString", {
					enumerable: !1,
					value() {
						return `(Source unavailable at ${pipe(this.path, join(options.pathDelim))}: "${this.message}")`
					},
				})
				return error
			},
			Unsupported = (path, message, options = { pathDelim: "." }) => {
				const error = Object.create(configError_proto)
				error._op = "Unsupported"
				error.path = path
				error.message = message
				Object.defineProperty(error, "toString", {
					enumerable: !1,
					value() {
						return `(Unsupported operation at ${pipe(this.path, join(options.pathDelim))}: "${this.message}")`
					},
				})
				return error
			},
			prefixed = dual(2, (self, prefix) => {
				switch (self._op) {
					case "And":
						return And(
							prefixed(self.left, prefix),
							prefixed(self.right, prefix),
						)
					case "Or":
						return Or(prefixed(self.left, prefix), prefixed(self.right, prefix))
					case "InvalidData":
						return InvalidData([...prefix, ...self.path], self.message)
					case "MissingData":
						return MissingData([...prefix, ...self.path], self.message)
					case "SourceUnavailable":
						return SourceUnavailable(
							[...prefix, ...self.path],
							self.message,
							self.cause,
						)
					case "Unsupported":
						return Unsupported([...prefix, ...self.path], self.message)
				}
			}),
			pathPatch_empty = { _tag: "Empty" },
			patch = dual(2, (path, patch) => {
				let input = List_of(patch),
					output = path
				for (; isCons(input);) {
					const patch = input.head
					switch (patch._tag) {
						case "Empty":
							input = input.tail
							break
						case "AndThen":
							input = cons(patch.first, cons(patch.second, input.tail))
							break
						case "MapName":
							output = Array_map(output, patch.f)
							input = input.tail
							break
						case "Nested":
							output = Array_prepend(output, patch.name)
							input = input.tail
							break
						case "Unnested":
							if (!pipe(Array_head(output), contains(patch.name)))
								return Either_left(
									MissingData(
										output,
										`Expected ${patch.name} to be in path in ConfigProvider#unnested`,
									),
								)
							output = tailNonEmpty(output)
							input = input.tail
					}
				}
				return Either_right(output)
			}),
			concat = (l, r) => [...l, ...r],
			ConfigProviderTypeId = Symbol.for("effect/ConfigProvider"),
			configProviderTag = GenericTag("effect/ConfigProvider"),
			FlatConfigProviderTypeId = Symbol.for("effect/ConfigProviderFlat"),
			configProvider_make = options => ({
				[ConfigProviderTypeId]: ConfigProviderTypeId,
				pipe() {
					return pipeArguments(this, arguments)
				},
				...options,
			}),
			fromEnv = options => {
				const { pathDelim, seqDelim } = Object.assign(
						{},
						{ pathDelim: "_", seqDelim: "," },
						options,
					),
					getEnv = () =>
						"undefined" != typeof process &&
						"env" in process &&
						"object" == typeof process.env
							? process.env
							: {}
				return (
					(flat = (options => ({
						[FlatConfigProviderTypeId]: FlatConfigProviderTypeId,
						patch: options.patch,
						load: (path, config, split = !0) =>
							options.load(path, config, split),
						enumerateChildren: options.enumerateChildren,
					}))({
						load: (path, primitive, split = !0) => {
							const pathString = (path => pipe(path, join(pathDelim)))(path),
								current = getEnv()
							return pipe(
								pathString in current
									? Option_some(current[pathString])
									: Option_none(),
								mapError(() =>
									MissingData(
										path,
										`Expected ${pathString} to exist in the process context`,
									),
								),
								core_flatMap(value =>
									parsePrimitive(value, path, primitive, seqDelim, split),
								),
							)
						},
						enumerateChildren: path =>
							sync(() => {
								const current = getEnv()
								return (elements => {
									const set = hashSet_beginMutation(internal_hashSet_empty())
									for (const value of elements) hashSet_add(set, value)
									return hashSet_endMutation(set)
								})(
									Object.keys(current)
										.map(value => value.toUpperCase().split(pathDelim))
										.filter(keyPath => {
											for (let i = 0; i < path.length; i++) {
												const pathComponent = pipe(path, Array_unsafeGet(i)),
													currentElement = keyPath[i]
												if (
													void 0 === currentElement ||
													pathComponent !== currentElement
												)
													return !1
											}
											return !0
										})
										.flatMap(keyPath =>
											keyPath.slice(path.length, path.length + 1),
										),
								)
							}),
						patch: pathPatch_empty,
					})),
					configProvider_make({
						load: config =>
							core_flatMap(fromFlatLoop(flat, [], config, !1), chunk =>
								Option_match(Array_head(chunk), {
									onNone: () =>
										core_fail(
											MissingData(
												[],
												`Expected a single value having structure: ${config}`,
											),
										),
									onSome: succeed,
								}),
							),
						flattened: flat,
					})
				)
				var flat
			},
			fromFlatLoop = (flat, prefix, config, split) => {
				const op = config
				switch (op._tag) {
					case "Constant":
						return succeed(Array_of(op.value))
					case "Described":
						return suspend(() => fromFlatLoop(flat, prefix, op.config, split))
					case "Fail":
						return core_fail(MissingData(prefix, op.message))
					case "Fallback":
						return pipe(
							suspend(() => fromFlatLoop(flat, prefix, op.first, split)),
							catchAll(error1 =>
								op.condition(error1)
									? pipe(
											fromFlatLoop(flat, prefix, op.second, split),
											catchAll(error2 => core_fail(Or(error1, error2))),
										)
									: core_fail(error1),
							),
						)
					case "Lazy":
						return suspend(() => fromFlatLoop(flat, prefix, op.config(), split))
					case "MapOrFail":
						return suspend(() =>
							pipe(
								fromFlatLoop(flat, prefix, op.original, split),
								core_flatMap(
									forEachSequential(a =>
										pipe(
											op.mapOrFail(a),
											mapError(
												prefixed(
													((path, config) => {
														let op = config
														if ("Nested" === op._tag) {
															const out = path.slice()
															for (; "Nested" === op._tag;) {
																out.push(op.name)
																op = op.config
															}
															return out
														}
														return path
													})(prefix, op.original),
												),
											),
										),
									),
								),
							),
						)
					case "Nested":
						return suspend(() =>
							fromFlatLoop(
								flat,
								concat(prefix, Array_of(op.name)),
								op.config,
								split,
							),
						)
					case "Primitive":
						return pipe(
							patch(prefix, flat.patch),
							core_flatMap(prefix =>
								pipe(
									flat.load(prefix, op, split),
									core_flatMap(values => {
										if (0 === values.length) {
											const name = pipe(
												(self =>
													isNonEmptyReadonlyArray(self)
														? Option_some(lastNonEmpty(self))
														: Option_none())(prefix),
												Option_getOrElse(() => "<n/a>"),
											)
											return core_fail(
												MissingData(
													[],
													`Expected ${op.description} with name ${name}`,
												),
											)
										}
										return succeed(values)
									}),
								),
							),
						)
					case "Sequence":
						return pipe(
							patch(prefix, flat.patch),
							core_flatMap(patchedPrefix =>
								pipe(
									flat.enumerateChildren(patchedPrefix),
									core_flatMap(indicesFrom),
									core_flatMap(indices =>
										0 === indices.length
											? suspend(() =>
													core_map(
														fromFlatLoop(flat, prefix, op.config, !0),
														Array_of,
													),
												)
											: pipe(
													forEachSequential(indices, index =>
														fromFlatLoop(
															flat,
															Array_append(prefix, `[${index}]`),
															op.config,
															!0,
														),
													),
													core_map(chunkChunk => {
														const flattened = Array_flatten(chunkChunk)
														return 0 === flattened.length
															? Array_of([])
															: Array_of(flattened)
													}),
												),
									),
								),
							),
						)
					case "HashMap":
						return suspend(() =>
							pipe(
								patch(prefix, flat.patch),
								core_flatMap(prefix =>
									pipe(
										flat.enumerateChildren(prefix),
										core_flatMap(keys =>
											pipe(
												keys,
												forEachSequential(key =>
													fromFlatLoop(
														flat,
														concat(prefix, Array_of(key)),
														op.valueConfig,
														split,
													),
												),
												core_map(matrix =>
													0 === matrix.length
														? Array_of(HashMap_empty())
														: pipe(
																transpose(matrix),
																Array_map(values =>
																	(entries => {
																		const map = beginMutation(
																			internal_hashMap_empty(),
																		)
																		for (const entry of entries)
																			hashMap_set(map, entry[0], entry[1])
																		return (self => {
																			self._editable = !1
																			return self
																		})(map)
																	})(
																		Array_zip(Array_fromIterable(keys), values),
																	),
																),
															),
												),
											),
										),
									),
								),
							),
						)
					case "ZipWith":
						return suspend(() =>
							pipe(
								fromFlatLoop(flat, prefix, op.left, split),
								core_either,
								core_flatMap(left =>
									pipe(
										fromFlatLoop(flat, prefix, op.right, split),
										core_either,
										core_flatMap(right => {
											if (Either_isLeft(left) && Either_isLeft(right))
												return core_fail(And(left.left, right.left))
											if (Either_isLeft(left) && Either_isRight(right))
												return core_fail(left.left)
											if (Either_isRight(left) && Either_isLeft(right))
												return core_fail(right.left)
											if (Either_isRight(left) && Either_isRight(right)) {
												const path = pipe(prefix, join(".")),
													fail = fromFlatLoopFail(prefix, path),
													[lefts, rights] = ((
														leftDef,
														rightDef,
														left,
														right,
													) => {
														const leftPad = Array_unfold(left.length, index =>
																index >= right.length
																	? Option_none()
																	: Option_some([leftDef(index), index + 1]),
															),
															rightPad = Array_unfold(right.length, index =>
																index >= left.length
																	? Option_none()
																	: Option_some([rightDef(index), index + 1]),
															)
														return [
															concat(left, leftPad),
															concat(right, rightPad),
														]
													})(
														fail,
														fail,
														pipe(left.right, Array_map(Either_right)),
														pipe(right.right, Array_map(Either_right)),
													)
												return pipe(
													lefts,
													Array_zip(rights),
													forEachSequential(([left, right]) =>
														pipe(
															core_zip(left, right),
															core_map(([left, right]) => op.zip(left, right)),
														),
													),
												)
											}
											throw new Error(
												"BUG: ConfigProvider.fromFlatLoop - please report an issue at https://github.com/Effect-TS/effect/issues",
											)
										}),
									),
								),
							),
						)
				}
			},
			fromFlatLoopFail = (prefix, path) => index =>
				Either_left(
					MissingData(
						prefix,
						`The element at index ${index} in a sequence at path "${path}" was missing`,
					),
				),
			parsePrimitive = (text, path, primitive, delimiter, split) =>
				split
					? pipe(
							((text, delim) =>
								text.split(new RegExp(`\\s*${RegExp_escape(delim)}\\s*`)))(
								text,
								delimiter,
							),
							forEachSequential(char => primitive.parse(char.trim())),
							mapError(prefixed(path)),
						)
					: pipe(
							primitive.parse(text),
							core_mapBoth({ onFailure: prefixed(path), onSuccess: Array_of }),
						),
			transpose = array =>
				Object.keys(array[0]).map(column => array.map(row => row[column])),
			indicesFrom = quotedIndices =>
				pipe(
					forEachSequential(quotedIndices, parseQuotedIndex),
					core_mapBoth({ onFailure: () => [], onSuccess: sort(Number_Order) }),
					core_either,
					core_map(Either_merge),
				),
			QUOTED_INDEX_REGEX = /^(\[(\d+)\])$/,
			parseQuotedIndex = str => {
				const match = str.match(QUOTED_INDEX_REGEX)
				if (null !== match) {
					const matchedIndex = match[2]
					return pipe(
						void 0 !== matchedIndex && matchedIndex.length > 0
							? Option_some(matchedIndex)
							: Option_none(),
						Option_flatMap(parseInteger),
					)
				}
				return Option_none()
			},
			parseInteger = str => {
				const parsedIndex = Number.parseInt(str)
				return Number.isNaN(parsedIndex)
					? Option_none()
					: Option_some(parsedIndex)
			},
			console_TypeId = Symbol.for("effect/Console"),
			consoleTag = GenericTag("effect/Console"),
			defaultConsole = {
				[console_TypeId]: console_TypeId,
				assert: (condition, ...args) =>
					sync(() => {
						console.assert(condition, ...args)
					}),
				clear: sync(() => {
					console.clear()
				}),
				count: label =>
					sync(() => {
						console.count(label)
					}),
				countReset: label =>
					sync(() => {
						console.countReset(label)
					}),
				debug: (...args) =>
					sync(() => {
						console.debug(...args)
					}),
				dir: (item, options) =>
					sync(() => {
						console.dir(item, options)
					}),
				dirxml: (...args) =>
					sync(() => {
						console.dirxml(...args)
					}),
				error: (...args) =>
					sync(() => {
						console.error(...args)
					}),
				group: options =>
					sync(
						options?.collapsed
							? () => console.groupCollapsed(options?.label)
							: () => console.group(options?.label),
					),
				groupEnd: sync(() => {
					console.groupEnd()
				}),
				info: (...args) =>
					sync(() => {
						console.info(...args)
					}),
				log: (...args) =>
					sync(() => {
						console.log(...args)
					}),
				table: (tabularData, properties) =>
					sync(() => {
						console.table(tabularData, properties)
					}),
				time: label => sync(() => console.time(label)),
				timeEnd: label => sync(() => console.timeEnd(label)),
				timeLog: (label, ...args) =>
					sync(() => {
						console.timeLog(label, ...args)
					}),
				trace: (...args) =>
					sync(() => {
						console.trace(...args)
					}),
				warn: (...args) =>
					sync(() => {
						console.warn(...args)
					}),
				unsafe: console,
			},
			RandomTypeId = Symbol.for("effect/Random"),
			randomTag = GenericTag("effect/Random")
		class RandomImpl {
			seed;
			[RandomTypeId] = RandomTypeId
			PRNG
			constructor(seed) {
				this.seed = seed
				this.PRNG = new PCGRandom(seed)
			}
			get next() {
				return sync(() => this.PRNG.number())
			}
			get nextBoolean() {
				return core_map(this.next, n => n > 0.5)
			}
			get nextInt() {
				return sync(() => this.PRNG.integer(Number.MAX_SAFE_INTEGER))
			}
			nextRange(min, max) {
				return core_map(this.next, n => (max - min) * n + min)
			}
			nextIntBetween(min, max) {
				return sync(() => this.PRNG.integer(max - min) + min)
			}
			shuffle(elements) {
				return shuffleWith(elements, n => this.nextIntBetween(0, n))
			}
		}
		const shuffleWith = (elements, nextIntBounded) =>
				suspend(() =>
					pipe(
						sync(() => Array.from(elements)),
						core_flatMap(buffer => {
							const numbers = []
							for (let i = buffer.length; i >= 2; i -= 1) numbers.push(i)
							return pipe(
								numbers,
								forEachSequentialDiscard(n =>
									pipe(
										nextIntBounded(n),
										core_map(k => random_swap(buffer, n - 1, k)),
									),
								),
								core_as(Chunk_fromIterable(buffer)),
							)
						}),
					),
				),
			random_swap = (buffer, index1, index2) => {
				const tmp = buffer[index1]
				buffer[index1] = buffer[index2]
				buffer[index2] = tmp
				return buffer
			},
			random_make = seed => new RandomImpl(Hash_hash(seed)),
			TracerTypeId = Symbol.for("effect/Tracer"),
			tracer_make = options => ({ [TracerTypeId]: TracerTypeId, ...options }),
			tracerTag = GenericTag("effect/Tracer"),
			spanTag = GenericTag("effect/ParentSpan"),
			randomHexString = (function () {
				return function (length) {
					let result = ""
					for (let i = 0; i < length; i++)
						result += "abcdef0123456789".charAt(Math.floor(16 * Math.random()))
					return result
				}
			})()
		class NativeSpan {
			name
			parent
			context
			startTime
			kind
			_tag = "Span"
			spanId
			traceId = "native"
			sampled = !0
			status
			attributes
			events = []
			links
			constructor(name, parent, context, links, startTime, kind) {
				this.name = name
				this.parent = parent
				this.context = context
				this.startTime = startTime
				this.kind = kind
				this.status = { _tag: "Started", startTime }
				this.attributes = new Map()
				this.traceId =
					"Some" === parent._tag ? parent.value.traceId : randomHexString(32)
				this.spanId = randomHexString(16)
				this.links = Array.from(links)
			}
			end(endTime, exit) {
				this.status = {
					_tag: "Ended",
					endTime,
					exit,
					startTime: this.status.startTime,
				}
			}
			attribute(key, value) {
				this.attributes.set(key, value)
			}
			event(name, startTime, attributes) {
				this.events.push([name, startTime, attributes ?? {}])
			}
			addLinks(links) {
				this.links.push(...links)
			}
		}
		const nativeTracer = tracer_make({
				span: (name, parent, context, links, startTime, kind) =>
					new NativeSpan(name, parent, context, links, startTime, kind),
				context: f => f(),
			}),
			DisablePropagation = Context_Reference()(
				"effect/Tracer/DisablePropagation",
				{ defaultValue: constFalse },
			),
			liveServices = pipe(
				Context_empty(),
				Context_add(clockTag, clock_make()),
				Context_add(consoleTag, defaultConsole),
				Context_add(randomTag, random_make(Math.random())),
				Context_add(configProviderTag, fromEnv()),
				Context_add(tracerTag, nativeTracer),
			),
			currentServices = globalValue(
				Symbol.for("effect/DefaultServices/currentServices"),
				() => fiberRefUnsafeMakeContext(liveServices),
			),
			clockWith = f =>
				(f => withFiberRuntime(fiber => f(fiber.currentDefaultServices)))(
					services => f(services.unsafeMap.get(clockTag.key)),
				),
			currentTimeMillis = clockWith(clock => clock.currentTimeMillis),
			Boolean_Order = Order_boolean,
			Effectable_EffectPrototype = EffectPrototype,
			Effectable_Base = effectable_Base
		class Effectable_Class extends Effectable_Base {}
		const executionStrategy_sequential = { _tag: "Sequential" },
			executionStrategy_parallel = { _tag: "Parallel" },
			ExecutionStrategy_sequential = executionStrategy_sequential,
			ExecutionStrategy_parallel = executionStrategy_parallel,
			ExecutionStrategy_parallelN = parallelism => ({
				_tag: "ParallelN",
				parallelism,
			}),
			FiberRefsSym = Symbol.for("effect/FiberRefs")
		class FiberRefsImpl {
			locals;
			[FiberRefsSym] = FiberRefsSym
			constructor(locals) {
				this.locals = locals
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const joinAs = dual(3, (self, fiberId, that) => {
				const parentFiberRefs = new Map(self.locals)
				that.locals.forEach((childStack, fiberRef) => {
					const childValue = childStack[0][1]
					if (!childStack[0][0][Equal_symbol](fiberId)) {
						if (!parentFiberRefs.has(fiberRef)) {
							if (equals(childValue, fiberRef.initial)) return
							parentFiberRefs.set(fiberRef, [
								[fiberId, fiberRef.join(fiberRef.initial, childValue)],
							])
							return
						}
						const parentStack = parentFiberRefs.get(fiberRef),
							[ancestor, wasModified] = ((
								_ref,
								_parentStack,
								_childStack,
								_childModified = !1,
							) => {
								const ref = _ref
								let ret,
									parentStack = _parentStack,
									childStack = _childStack,
									childModified = _childModified
								for (; void 0 === ret;)
									if (
										isNonEmptyReadonlyArray(parentStack) &&
										isNonEmptyReadonlyArray(childStack)
									) {
										const parentFiberId = headNonEmpty(parentStack)[0],
											parentAncestors = tailNonEmpty(parentStack),
											childFiberId = headNonEmpty(childStack)[0],
											childRefValue = headNonEmpty(childStack)[1],
											childAncestors = tailNonEmpty(childStack)
										if (
											parentFiberId.startTimeMillis <
											childFiberId.startTimeMillis
										) {
											childStack = childAncestors
											childModified = !0
										} else if (
											parentFiberId.startTimeMillis >
											childFiberId.startTimeMillis
										)
											parentStack = parentAncestors
										else if (parentFiberId.id < childFiberId.id) {
											childStack = childAncestors
											childModified = !0
										} else
											parentFiberId.id > childFiberId.id
												? (parentStack = parentAncestors)
												: (ret = [childRefValue, childModified])
									} else ret = [ref.initial, !0]
								return ret
							})(fiberRef, parentStack, childStack)
						if (wasModified) {
							const patch = fiberRef.diff(ancestor, childValue),
								oldValue = parentStack[0][1],
								newValue = fiberRef.join(
									oldValue,
									fiberRef.patch(patch)(oldValue),
								)
							if (!equals(oldValue, newValue)) {
								let newStack
								const parentFiberId = parentStack[0][0]
								newStack = parentFiberId[Equal_symbol](fiberId)
									? [[parentFiberId, newValue], ...parentStack.slice(1)]
									: [[fiberId, newValue], ...parentStack]
								parentFiberRefs.set(fiberRef, newStack)
							}
						}
					}
				})
				return new FiberRefsImpl(parentFiberRefs)
			}),
			forkAs = dual(2, (self, childId) => {
				const map = new Map()
				unsafeForkAs(self, map, childId)
				return new FiberRefsImpl(map)
			}),
			unsafeForkAs = (self, map, fiberId) => {
				self.locals.forEach((stack, fiberRef) => {
					const oldValue = stack[0][1],
						newValue = fiberRef.patch(fiberRef.fork)(oldValue)
					equals(oldValue, newValue)
						? map.set(fiberRef, stack)
						: map.set(fiberRef, [[fiberId, newValue], ...stack])
				})
			},
			delete_ = dual(2, (self, fiberRef) => {
				const locals = new Map(self.locals)
				locals.delete(fiberRef)
				return new FiberRefsImpl(locals)
			}),
			fiberRefs_get = dual(2, (self, fiberRef) =>
				self.locals.has(fiberRef)
					? Option_some(headNonEmpty(self.locals.get(fiberRef))[1])
					: Option_none(),
			),
			getOrDefault = dual(2, (self, fiberRef) =>
				pipe(
					fiberRefs_get(self, fiberRef),
					Option_getOrElse(() => fiberRef.initial),
				),
			),
			updateAs = dual(2, (self, { fiberId, fiberRef, value }) => {
				if (0 === self.locals.size)
					return new FiberRefsImpl(new Map([[fiberRef, [[fiberId, value]]]]))
				const locals = new Map(self.locals)
				unsafeUpdateAs(locals, fiberId, fiberRef, value)
				return new FiberRefsImpl(locals)
			}),
			unsafeUpdateAs = (locals, fiberId, fiberRef, value) => {
				const oldStack = locals.get(fiberRef) ?? []
				let newStack
				if (isNonEmptyReadonlyArray(oldStack)) {
					const [currentId, currentValue] = headNonEmpty(oldStack)
					if (currentId[Equal_symbol](fiberId)) {
						if (equals(currentValue, value)) return
						newStack = [[fiberId, value], ...oldStack.slice(1)]
					} else newStack = [[fiberId, value], ...oldStack]
				} else newStack = [[fiberId, value]]
				locals.set(fiberRef, newStack)
			},
			updateManyAs = dual(2, (self, { entries, forkAs }) => {
				if (0 === self.locals.size) return new FiberRefsImpl(new Map(entries))
				const locals = new Map(self.locals)
				void 0 !== forkAs && unsafeForkAs(self, locals, forkAs)
				entries.forEach(([fiberRef, values]) => {
					1 === values.length
						? unsafeUpdateAs(locals, values[0][0], fiberRef, values[0][1])
						: values.forEach(([fiberId, value]) => {
								unsafeUpdateAs(locals, fiberId, fiberRef, value)
							})
				})
				return new FiberRefsImpl(locals)
			}),
			FiberRefs_getOrDefault = getOrDefault,
			FiberRefs_updateManyAs = updateManyAs,
			FiberRefs_empty = function () {
				return ((fiberRefLocals = new Map()), new FiberRefsImpl(fiberRefLocals))
				var fiberRefLocals
			},
			patch_empty = { _tag: "Empty" },
			patch_diff = (oldValue, newValue) => {
				const missingLocals = new Map(oldValue.locals)
				let patch = patch_empty
				for (const [fiberRef, pairs] of newValue.locals.entries()) {
					const newValue = headNonEmpty(pairs)[1],
						old = missingLocals.get(fiberRef)
					if (void 0 !== old) {
						const oldValue = headNonEmpty(old)[1]
						equals(oldValue, newValue) ||
							(patch = patch_combine({
								_tag: "Update",
								fiberRef,
								patch: fiberRef.diff(oldValue, newValue),
							})(patch))
					} else
						patch = patch_combine({ _tag: "Add", fiberRef, value: newValue })(
							patch,
						)
					missingLocals.delete(fiberRef)
				}
				for (const [fiberRef] of missingLocals.entries())
					patch = patch_combine({ _tag: "Remove", fiberRef })(patch)
				return patch
			},
			patch_combine = dual(2, (self, that) => ({
				_tag: "AndThen",
				first: self,
				second: that,
			})),
			patch_patch = dual(3, (self, fiberId, oldValue) => {
				let fiberRefs = oldValue,
					patches = Array_of(self)
				for (; isNonEmptyReadonlyArray(patches);) {
					const head = headNonEmpty(patches),
						tail = tailNonEmpty(patches)
					switch (head._tag) {
						case "Empty":
							patches = tail
							break
						case "Add":
							fiberRefs = updateAs(fiberRefs, {
								fiberId,
								fiberRef: head.fiberRef,
								value: head.value,
							})
							patches = tail
							break
						case "Remove":
							fiberRefs = delete_(fiberRefs, head.fiberRef)
							patches = tail
							break
						case "Update": {
							const value = getOrDefault(fiberRefs, head.fiberRef)
							fiberRefs = updateAs(fiberRefs, {
								fiberId,
								fiberRef: head.fiberRef,
								value: head.fiberRef.patch(head.patch)(value),
							})
							patches = tail
							break
						}
						case "AndThen":
							patches = Array_prepend(head.first)(
								Array_prepend(head.second)(tail),
							)
					}
				}
				return fiberRefs
			}),
			FiberRefsPatch_diff = patch_diff,
			FiberRefsPatch_patch = patch_patch,
			FiberStatusTypeId = Symbol.for("effect/FiberStatus"),
			DoneHash = string("effect/FiberStatus-Done")
		class Done {
			[FiberStatusTypeId] = FiberStatusTypeId
			_tag = "Done";
			[symbol]() {
				return DoneHash
			}
			[Equal_symbol](that) {
				return isFiberStatus(that) && "Done" === that._tag
			}
		}
		class Running {
			runtimeFlags;
			[FiberStatusTypeId] = FiberStatusTypeId
			_tag = "Running"
			constructor(runtimeFlags) {
				this.runtimeFlags = runtimeFlags
			}
			[symbol]() {
				return pipe(
					Hash_hash("effect/FiberStatus"),
					combine(Hash_hash(this._tag)),
					combine(Hash_hash(this.runtimeFlags)),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return (
					isFiberStatus(that) &&
					"Running" === that._tag &&
					this.runtimeFlags === that.runtimeFlags
				)
			}
		}
		class Suspended {
			runtimeFlags
			blockingOn;
			[FiberStatusTypeId] = FiberStatusTypeId
			_tag = "Suspended"
			constructor(runtimeFlags, blockingOn) {
				this.runtimeFlags = runtimeFlags
				this.blockingOn = blockingOn
			}
			[symbol]() {
				return pipe(
					Hash_hash("effect/FiberStatus"),
					combine(Hash_hash(this._tag)),
					combine(Hash_hash(this.runtimeFlags)),
					combine(Hash_hash(this.blockingOn)),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return (
					isFiberStatus(that) &&
					"Suspended" === that._tag &&
					this.runtimeFlags === that.runtimeFlags &&
					equals(this.blockingOn, that.blockingOn)
				)
			}
		}
		const isFiberStatus = u => hasProperty(u, FiberStatusTypeId),
			FiberStatus_done = new Done(),
			FiberStatus_running = runtimeFlags => new Running(runtimeFlags),
			Fatal = logLevelFatal,
			LogLevel_Error = logLevelError,
			Warning = logLevelWarning,
			Info = logLevelInfo,
			Debug = logLevelDebug,
			Trace = logLevelTrace,
			locally = dual(2, (use, self) =>
				fiberRefLocally(use, currentLogLevel, self),
			),
			LogLevel_Order = pipe(
				Number_Order,
				Order_mapInput(level => level.ordinal),
			),
			LogLevel_greaterThan = greaterThan(LogLevel_Order),
			greaterThanEqual = greaterThanOrEqualTo(LogLevel_Order),
			Micro_TypeId = Symbol.for("effect/Micro"),
			MicroExitTypeId = Symbol.for("effect/Micro/MicroExit"),
			MicroCauseTypeId = Symbol.for("effect/Micro/MicroCause"),
			microCauseVariance = { _E: identity }
		class MicroCauseImpl extends globalThis.Error {
			_tag
			traces;
			[MicroCauseTypeId]
			constructor(_tag, originalError, traces) {
				const causeName = `MicroCause.${_tag}`
				let name, message, stack
				if (originalError instanceof globalThis.Error) {
					name = `(${causeName}) ${originalError.name}`
					message = originalError.message
					const messageLines = message.split("\n").length
					stack = originalError.stack
						? `(${causeName}) ${originalError.stack
								.split("\n")
								.slice(0, messageLines + 3)
								.join("\n")}`
						: `${name}: ${message}`
				} else {
					name = causeName
					message = toStringUnknown(originalError, 0)
					stack = `${name}: ${message}`
				}
				traces.length > 0 && (stack += `\n    ${traces.join("\n    ")}`)
				super(message)
				this._tag = _tag
				this.traces = traces
				this[MicroCauseTypeId] = microCauseVariance
				this.name = name
				this.stack = stack
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
			toString() {
				return this.stack
			}
			[NodeInspectSymbol]() {
				return this.stack
			}
		}
		class Die extends MicroCauseImpl {
			defect
			constructor(defect, traces = []) {
				super("Die", defect, traces)
				this.defect = defect
			}
		}
		class Interrupt extends MicroCauseImpl {
			constructor(traces = []) {
				super("Interrupt", "interrupted", traces)
			}
		}
		const causeInterrupt = (traces = []) => new Interrupt(traces),
			causeIsInterrupt = self => "Interrupt" === self._tag,
			MicroFiberTypeId = Symbol.for("effect/Micro/MicroFiber"),
			fiberVariance = { _A: identity, _E: identity }
		class MicroFiberImpl {
			context
			interruptible;
			[MicroFiberTypeId]
			_stack = []
			_observers = []
			_exit
			_children
			currentOpCount = 0
			constructor(context, interruptible = !0) {
				this.context = context
				this.interruptible = interruptible
				this[MicroFiberTypeId] = fiberVariance
			}
			getRef(ref) {
				return ((self, tag) =>
					self.unsafeMap.has(tag.key)
						? self.unsafeMap.get(tag.key)
						: getDefaultValue(tag))(this.context, ref)
			}
			addObserver(cb) {
				if (this._exit) {
					cb(this._exit)
					return constVoid
				}
				this._observers.push(cb)
				return () => {
					const index = this._observers.indexOf(cb)
					index >= 0 && this._observers.splice(index, 1)
				}
			}
			_interrupted = !1
			unsafeInterrupt() {
				if (!this._exit) {
					this._interrupted = !0
					this.interruptible && this.evaluate(Micro_exitInterrupt)
				}
			}
			unsafePoll() {
				return this._exit
			}
			evaluate(effect) {
				if (this._exit) return
				if (void 0 !== this._yielded) {
					const yielded = this._yielded
					this._yielded = void 0
					yielded()
				}
				const exit = this.runLoop(effect)
				if (exit === Yield) return
				const interruptChildren =
					fiberMiddleware.interruptChildren &&
					fiberMiddleware.interruptChildren(this)
				if (void 0 !== interruptChildren)
					return this.evaluate(Micro_flatMap(interruptChildren, () => exit))
				this._exit = exit
				for (let i = 0; i < this._observers.length; i++)
					this._observers[i](exit)
				this._observers.length = 0
			}
			runLoop(effect) {
				let yielding = !1,
					current = effect
				this.currentOpCount = 0
				try {
					for (;;) {
						this.currentOpCount++
						if (!yielding && this.getRef(CurrentScheduler).shouldYield(this)) {
							yielding = !0
							const prev = current
							current = Micro_flatMap(Micro_yieldNow, () => prev)
						}
						current = current[evaluate](this)
						if (current === Yield) {
							const yielded = this._yielded
							if (MicroExitTypeId in yielded) {
								this._yielded = void 0
								return yielded
							}
							return Yield
						}
					}
				} catch (error) {
					return hasProperty(current, evaluate)
						? Micro_exitDie(error)
						: Micro_exitDie(
								`MicroFiber.runLoop: Not a valid effect: ${String(current)}`,
							)
				}
			}
			getCont(symbol) {
				for (;;) {
					const op = this._stack.pop()
					if (!op) return
					const cont = op[ensureCont] && op[ensureCont](this)
					if (cont) return { [symbol]: cont }
					if (op[symbol]) return op
				}
			}
			_yielded = void 0
			yieldWith(value) {
				this._yielded = value
				return Yield
			}
			children() {
				return (this._children ??= new Set())
			}
		}
		const fiberMiddleware = globalValue("effect/Micro/fiberMiddleware", () => ({
				interruptChildren: void 0,
			})),
			identifier = Symbol.for("effect/Micro/identifier"),
			args = Symbol.for("effect/Micro/args"),
			evaluate = Symbol.for("effect/Micro/evaluate"),
			successCont = Symbol.for("effect/Micro/successCont"),
			failureCont = Symbol.for("effect/Micro/failureCont"),
			ensureCont = Symbol.for("effect/Micro/ensureCont"),
			Yield = Symbol.for("effect/Micro/Yield"),
			microVariance = { _A: identity, _E: identity, _R: identity },
			MicroProto = {
				...Effectable_EffectPrototype,
				_op: "Micro",
				[Micro_TypeId]: microVariance,
				pipe() {
					return pipeArguments(this, arguments)
				},
				[Symbol.iterator]() {
					return new SingleShotGen(new YieldWrap(this))
				},
				toJSON() {
					return {
						_id: "Micro",
						op: this[identifier],
						...(args in this ? { args: this[args] } : void 0),
					}
				},
				toString() {
					return format(this)
				},
				[NodeInspectSymbol]() {
					return format(this)
				},
			}
		function defaultEvaluate(_fiber) {
			return Micro_exitDie("Micro.evaluate: Not implemented")
		}
		const makePrimitiveProto = options => ({
				...MicroProto,
				[identifier]: options.op,
				[evaluate]: options.eval ?? defaultEvaluate,
				[successCont]: options.contA,
				[failureCont]: options.contE,
				[ensureCont]: options.ensure,
			}),
			makePrimitive = options => {
				const Proto = makePrimitiveProto(options)
				return function () {
					const self = Object.create(Proto)
					self[args] = !1 === options.single ? arguments : arguments[0]
					return self
				}
			},
			makeExit = options => {
				const Proto = {
					...makePrimitiveProto(options),
					[MicroExitTypeId]: MicroExitTypeId,
					_tag: options.op,
					get [options.prop]() {
						return this[args]
					},
					toJSON() {
						return {
							_id: "MicroExit",
							_tag: options.op,
							[options.prop]: this[args],
						}
					},
					[Equal_symbol](that) {
						return (
							isMicroExit(that) &&
							that._tag === options.op &&
							equals(this[args], that[args])
						)
					},
					[symbol]() {
						return cached(
							this,
							combine(string(options.op))(Hash_hash(this[args])),
						)
					},
				}
				return function (value) {
					const self = Object.create(Proto)
					self[args] = value
					self[successCont] = void 0
					self[failureCont] = void 0
					self[ensureCont] = void 0
					return self
				}
			},
			Micro_succeed = makeExit({
				op: "Success",
				prop: "value",
				eval(fiber) {
					const cont = fiber.getCont(successCont)
					return cont
						? cont[successCont](this[args], fiber)
						: fiber.yieldWith(this)
				},
			}),
			Micro_failCause = makeExit({
				op: "Failure",
				prop: "cause",
				eval(fiber) {
					let cont = fiber.getCont(failureCont)
					for (; causeIsInterrupt(this[args]) && cont && fiber.interruptible;)
						cont = fiber.getCont(failureCont)
					return cont
						? cont[failureCont](this[args], fiber)
						: fiber.yieldWith(this)
				},
			}),
			Micro_yieldNow = makePrimitive({
				op: "Yield",
				eval(fiber) {
					let resumed = !1
					fiber.getRef(CurrentScheduler).scheduleTask(() => {
						resumed || fiber.evaluate(Micro_exitVoid)
					}, this[args] ?? 0)
					return fiber.yieldWith(() => {
						resumed = !0
					})
				},
			})(0),
			Micro_void_ = Micro_succeed(void 0),
			withMicroFiber = makePrimitive({
				op: "WithMicroFiber",
				eval(fiber) {
					return this[args](fiber)
				},
			}),
			Micro_flatMap = dual(2, (self, f) => {
				const onSuccess = Object.create(OnSuccessProto)
				onSuccess[args] = self
				onSuccess[successCont] = f
				return onSuccess
			}),
			OnSuccessProto = makePrimitiveProto({
				op: "OnSuccess",
				eval(fiber) {
					fiber._stack.push(this)
					return this[args]
				},
			}),
			isMicroExit = u => hasProperty(u, MicroExitTypeId),
			Micro_exitSucceed = Micro_succeed,
			Micro_exitFailCause = Micro_failCause,
			Micro_exitInterrupt = Micro_exitFailCause(causeInterrupt()),
			Micro_exitDie = defect =>
				Micro_exitFailCause(
					((defect, traces = []) => new Die(defect, traces))(defect),
				),
			Micro_exitVoid = Micro_exitSucceed(void 0),
			setImmediate =
				"setImmediate" in globalThis
					? globalThis.setImmediate
					: f => setTimeout(f, 0)
		class MicroSchedulerDefault {
			tasks = []
			running = !1
			scheduleTask(task, _priority) {
				this.tasks.push(task)
				if (!this.running) {
					this.running = !0
					setImmediate(this.afterScheduled)
				}
			}
			afterScheduled = () => {
				this.running = !1
				this.runTasks()
			}
			runTasks() {
				const tasks = this.tasks
				this.tasks = []
				for (let i = 0, len = tasks.length; i < len; i++) tasks[i]()
			}
			shouldYield(fiber) {
				return fiber.currentOpCount >= fiber.getRef(MaxOpsBeforeYield)
			}
			flush() {
				for (; this.tasks.length > 0;) this.runTasks()
			}
		}
		const updateContext = dual(2, (self, f) =>
				withMicroFiber(fiber => {
					const prev = fiber.context
					fiber.context = f(prev)
					return Micro_onExit(self, () => {
						fiber.context = prev
						return Micro_void_
					})
				}),
			),
			Micro_provideContext = dual(2, (self, provided) =>
				updateContext(self, Context_merge(provided)),
			)
		class MaxOpsBeforeYield extends Context_Reference()(
			"effect/Micro/currentMaxOpsBeforeYield",
			{ defaultValue: () => 2048 },
		) {}
		class CurrentScheduler extends Context_Reference()(
			"effect/Micro/currentScheduler",
			{ defaultValue: () => new MicroSchedulerDefault() },
		) {}
		const Micro_matchCauseEffect = dual(2, (self, options) => {
				const primitive = Object.create(OnSuccessAndFailureProto)
				primitive[args] = self
				primitive[successCont] = options.onSuccess
				primitive[failureCont] = options.onFailure
				return primitive
			}),
			OnSuccessAndFailureProto = makePrimitiveProto({
				op: "OnSuccessAndFailure",
				eval(fiber) {
					fiber._stack.push(this)
					return this[args]
				},
			}),
			Micro_onExit = dual(2, (self, f) =>
				Micro_uninterruptibleMask(restore =>
					Micro_matchCauseEffect(restore(self), {
						onFailure: cause =>
							Micro_flatMap(f(Micro_exitFailCause(cause)), () =>
								Micro_failCause(cause),
							),
						onSuccess: a =>
							Micro_flatMap(f(Micro_exitSucceed(a)), () => Micro_succeed(a)),
					}),
				),
			),
			setInterruptible = makePrimitive({
				op: "SetInterruptible",
				ensure(fiber) {
					fiber.interruptible = this[args]
					if (fiber._interrupted && fiber.interruptible)
						return () => Micro_exitInterrupt
				},
			}),
			Micro_interruptible = self =>
				withMicroFiber(fiber => {
					if (fiber.interruptible) return self
					fiber.interruptible = !0
					fiber._stack.push(setInterruptible(!1))
					return fiber._interrupted ? Micro_exitInterrupt : self
				}),
			Micro_uninterruptibleMask = f =>
				withMicroFiber(fiber => {
					if (!fiber.interruptible) return f(identity)
					fiber.interruptible = !1
					fiber._stack.push(setInterruptible(!0))
					return f(Micro_interruptible)
				}),
			Readable_TypeId = Symbol.for("effect/Readable"),
			RefTypeId = Symbol.for("effect/Ref"),
			refVariance = { _A: _ => _ }
		class RefImpl extends Effectable_Class {
			ref
			commit() {
				return this.get
			}
			[RefTypeId] = refVariance;
			[Readable_TypeId] = Readable_TypeId
			constructor(ref) {
				super()
				this.ref = ref
				this.get = sync(() => MutableRef_get(this.ref))
			}
			get;
			modify(f) {
				return sync(() => {
					const current = MutableRef_get(this.ref),
						[b, a] = f(current)
					current !== a && MutableRef_set(a)(this.ref)
					return b
				})
			}
		}
		const ref_unsafeMake = value => new RefImpl(MutableRef_make(value)),
			ref_make = value => sync(() => ref_unsafeMake(value)),
			ref_get = self => self.get,
			ref_set = dual(2, (self, value) => self.modify(() => [void 0, value])),
			ref_modify = dual(2, (self, f) => self.modify(f)),
			ref_update = dual(2, (self, f) => self.modify(a => [void 0, f(a)])),
			Ref_RefTypeId = RefTypeId,
			Ref_make = ref_make,
			Ref_get = ref_get,
			Ref_modify = ref_modify,
			Ref_set = ref_set,
			Ref_update = ref_update
		class SchedulerRunner {
			scheduleDrain
			running = !1
			tasks = new PriorityBuckets()
			constructor(scheduleDrain) {
				this.scheduleDrain = scheduleDrain
			}
			starveInternal = depth => {
				const tasks = this.tasks.buckets
				this.tasks.buckets = []
				for (const [_, toRun] of tasks)
					for (let i = 0; i < toRun.length; i++) toRun[i]()
				0 === this.tasks.buckets.length
					? (this.running = !1)
					: this.starve(depth)
			}
			starve(depth = 0) {
				this.scheduleDrain(depth, this.starveInternal)
			}
			scheduleTask(task, priority) {
				this.tasks.scheduleTask(task, priority)
				if (!this.running) {
					this.running = !0
					this.starve()
				}
			}
			static cached(scheduleDrain) {
				const fallback = new SchedulerRunner(scheduleDrain),
					runners = new WeakMap()
				return fiber => {
					if (void 0 === fiber) return fallback
					let runner = runners.get(fiber)
					if (void 0 === runner) {
						runner = new SchedulerRunner(scheduleDrain)
						runners.set(fiber, runner)
					}
					return runner
				}
			}
		}
		class PriorityBuckets {
			buckets = []
			scheduleTask(task, priority) {
				const length = this.buckets.length
				let bucket,
					index = 0
				for (; index < length && this.buckets[index][0] <= priority; index++)
					bucket = this.buckets[index]
				bucket && bucket[0] === priority
					? bucket[1].push(task)
					: index === length
						? this.buckets.push([priority, [task]])
						: this.buckets.splice(index, 0, [priority, [task]])
			}
		}
		class MixedScheduler {
			maxNextTickBeforeTimer
			getRunner = SchedulerRunner.cached((depth, drain) => {
				depth >= this.maxNextTickBeforeTimer
					? setTimeout(() => drain(0), 0)
					: Promise.resolve(void 0).then(() => drain(depth + 1))
			})
			constructor(maxNextTickBeforeTimer) {
				this.maxNextTickBeforeTimer = maxNextTickBeforeTimer
			}
			shouldYield(fiber) {
				return (
					fiber.currentOpCount > fiber.getFiberRef(currentMaxOpsBeforeYield) &&
					fiber.getFiberRef(currentSchedulingPriority)
				)
			}
			scheduleTask(task, priority, fiber) {
				this.getRunner(fiber).scheduleTask(task, priority)
			}
		}
		const defaultScheduler = globalValue(
			Symbol.for("effect/Scheduler/defaultScheduler"),
			() => new MixedScheduler(2048),
		)
		class SyncScheduler {
			tasks = new PriorityBuckets()
			deferred = !1
			scheduleTask(task, priority, fiber) {
				this.deferred
					? defaultScheduler.scheduleTask(task, priority, fiber)
					: this.tasks.scheduleTask(task, priority)
			}
			shouldYield(fiber) {
				return (
					fiber.currentOpCount > fiber.getFiberRef(currentMaxOpsBeforeYield) &&
					fiber.getFiberRef(currentSchedulingPriority)
				)
			}
			flush() {
				for (; this.tasks.buckets.length > 0;) {
					const tasks = this.tasks.buckets
					this.tasks.buckets = []
					for (const [_, toRun] of tasks)
						for (let i = 0; i < toRun.length; i++) toRun[i]()
				}
				this.deferred = !0
			}
		}
		const currentScheduler = globalValue(
				Symbol.for("effect/FiberRef/currentScheduler"),
				() => fiberRefUnsafeMake(defaultScheduler),
			),
			par = (self, that) => ({ _tag: "Par", left: self, right: that }),
			seq = (self, that) => ({ _tag: "Seq", left: self, right: that }),
			blockedRequests_step = requests => {
				let current = requests,
					parallel = parallelCollectionEmpty(),
					stack = List_empty(),
					sequential = List_empty()
				for (;;)
					switch (current._tag) {
						case "Empty":
							if (isNil(stack)) return [parallel, sequential]
							current = stack.head
							stack = stack.tail
							break
						case "Par":
							stack = cons(current.right, stack)
							current = current.left
							break
						case "Seq": {
							const left = current.left,
								right = current.right
							switch (left._tag) {
								case "Empty":
									current = right
									break
								case "Par": {
									const l = left.left,
										r = left.right
									current = par(seq(l, right), seq(r, right))
									break
								}
								case "Seq": {
									const l = left.left,
										r = left.right
									current = seq(l, seq(r, right))
									break
								}
								case "Single":
									current = left
									sequential = cons(right, sequential)
							}
							break
						}
						case "Single":
							parallel = parallelCollectionAdd(parallel, current)
							if (isNil(stack)) return [parallel, sequential]
							current = stack.head
							stack = stack.tail
					}
				throw new Error(
					"BUG: BlockedRequests.step - please report an issue at https://github.com/Effect-TS/effect/issues",
				)
			},
			blockedRequests_merge = (sequential, parallel) => {
				if (isNil(sequential))
					return List_of(parallelCollectionToSequentialCollection(parallel))
				if (parallelCollectionIsEmpty(parallel)) return sequential
				const seqHeadKeys = sequentialCollectionKeys(sequential.head),
					parKeys = parallelCollectionKeys(parallel)
				return 1 === seqHeadKeys.length &&
					1 === parKeys.length &&
					equals(seqHeadKeys[0], parKeys[0])
					? cons(
							sequentialCollectionCombine(
								sequential.head,
								parallelCollectionToSequentialCollection(parallel),
							),
							sequential.tail,
						)
					: cons(parallelCollectionToSequentialCollection(parallel), sequential)
			},
			RequestBlockParallelTypeId = Symbol.for(
				"effect/RequestBlock/RequestBlockParallel",
			),
			parallelVariance = { _R: _ => _ }
		class ParallelImpl {
			map;
			[RequestBlockParallelTypeId] = parallelVariance
			constructor(map) {
				this.map = map
			}
		}
		const parallelCollectionEmpty = () => new ParallelImpl(HashMap_empty()),
			parallelCollectionAdd = (self, blockedRequest) =>
				new ParallelImpl(
					HashMap_modifyAt(self.map, blockedRequest.dataSource, _ =>
						orElseSome(
							Option_map(_, Chunk_append(blockedRequest.blockedRequest)),
							() => Chunk_of(blockedRequest.blockedRequest),
						),
					),
				),
			parallelCollectionCombine = (self, that) =>
				new ParallelImpl(
					HashMap_reduce(self.map, that.map, (map, value, key) =>
						HashMap_set(
							map,
							key,
							Option_match(HashMap_get(map, key), {
								onNone: () => value,
								onSome: other => Chunk_appendAll(value, other),
							}),
						),
					),
				),
			parallelCollectionIsEmpty = self =>
				(self => self && isEmptyNode(self._root))(self.map),
			parallelCollectionKeys = self => Array.from(HashMap_keys(self.map)),
			parallelCollectionToSequentialCollection = self =>
				sequentialCollectionMake(HashMap_map(self.map, x => Chunk_of(x))),
			SequentialCollectionTypeId = Symbol.for(
				"effect/RequestBlock/RequestBlockSequential",
			),
			sequentialVariance = { _R: _ => _ }
		class SequentialImpl {
			map;
			[SequentialCollectionTypeId] = sequentialVariance
			constructor(map) {
				this.map = map
			}
		}
		const sequentialCollectionMake = map => new SequentialImpl(map),
			sequentialCollectionCombine = (self, that) =>
				new SequentialImpl(
					HashMap_reduce(that.map, self.map, (map, value, key) =>
						HashMap_set(
							map,
							key,
							Option_match(HashMap_get(map, key), {
								onNone: () => esm_Chunk_empty(),
								onSome: a => Chunk_appendAll(a, value),
							}),
						),
					),
				),
			sequentialCollectionKeys = self => Array.from(HashMap_keys(self.map)),
			currentRequestMap = globalValue(
				Symbol.for("effect/FiberRef/currentRequestMap"),
				() => fiberRefUnsafeMake(new Map()),
			),
			concurrency_match = (concurrency, sequential, unbounded, bounded) => {
				switch (concurrency) {
					case void 0:
						return sequential()
					case "unbounded":
						return unbounded()
					case "inherit":
						return fiberRefGetWith(currentConcurrency, concurrency =>
							"unbounded" === concurrency
								? unbounded()
								: concurrency > 1
									? bounded(concurrency)
									: sequential(),
						)
					default:
						return concurrency > 1 ? bounded(concurrency) : sequential()
				}
			},
			Clock_currentTimeMillis = currentTimeMillis,
			formatLabel = key => key.replace(/[\s="]/g, "_"),
			logSpan_render = now => self =>
				`${formatLabel(self.label)}=${now - self.startTime}ms`,
			MetricLabelTypeId = Symbol.for("effect/MetricLabel")
		class MetricLabelImpl {
			key
			value;
			[MetricLabelTypeId] = MetricLabelTypeId
			_hash
			constructor(key, value) {
				this.key = key
				this.value = value
				this._hash = string("effect/MetricLabel" + this.key + this.value)
			}
			[symbol]() {
				return this._hash
			}
			[Equal_symbol](that) {
				return (
					isMetricLabel(that) &&
					this.key === that.key &&
					this.value === that.value
				)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const label_make = (key, value) => new MetricLabelImpl(key, value),
			isMetricLabel = u => hasProperty(u, MetricLabelTypeId),
			annotateLogs = dual(
				args => isEffect(args[0]),
				function () {
					const args = arguments
					return fiberRefLocallyWith(
						args[0],
						currentLogAnnotations,
						"string" == typeof args[1]
							? HashMap_set(args[1], args[2])
							: annotations =>
									Object.entries(args[1]).reduce(
										(acc, [key, value]) => HashMap_set(acc, key, value),
										annotations,
									),
					)
				},
			),
			catchSomeCause = dual(2, (self, f) =>
				matchCauseEffect(self, {
					onFailure: cause => {
						const option = f(cause)
						switch (option._tag) {
							case "None":
								return failCause(cause)
							case "Some":
								return option.value
						}
					},
					onSuccess: succeed,
				}),
			),
			filterOrElse = dual(3, (self, predicate, orElse) =>
				core_flatMap(self, a => (predicate(a) ? succeed(a) : orElse(a))),
			),
			core_effect_filterOrFail = dual(
				args => isEffect(args[0]),
				(self, predicate, orFailWith) =>
					filterOrElse(self, predicate, a =>
						void 0 === orFailWith
							? core_fail(new NoSuchElementException())
							: failSync(() => orFailWith(a)),
					),
			),
			core_effect_match = dual(2, (self, options) =>
				matchEffect(self, {
					onFailure: e => succeed(options.onFailure(e)),
					onSuccess: a => succeed(options.onSuccess(a)),
				}),
			),
			core_effect_fiberRefs = withFiberRuntime(state =>
				succeed(state.getFiberRefs()),
			),
			logWithLevel =
				level =>
				(...message) => {
					const levelOption = Option_fromNullable(level)
					let cause
					for (let i = 0, len = message.length; i < len; i++) {
						const msg = message[i]
						if (isCause(msg)) {
							cause = void 0 !== cause ? sequential(cause, msg) : msg
							message = [...message.slice(0, i), ...message.slice(i + 1)]
							i--
						}
					}
					void 0 === cause && (cause = cause_empty)
					return withFiberRuntime(fiberState => {
						fiberState.log(message, cause, levelOption)
						return core_void_
					})
				},
			log = logWithLevel(),
			logDebug = logWithLevel(Debug),
			logInfo = logWithLevel(Info),
			logWarning = logWithLevel(Warning),
			logError = logWithLevel(LogLevel_Error),
			core_effect_mapErrorCause = dual(2, (self, f) =>
				matchCauseEffect(self, {
					onFailure: c => failCauseSync(() => f(c)),
					onSuccess: succeed,
				}),
			),
			core_effect_orElseSucceed = dual(2, (self, evaluate) =>
				core_orElse(self, () => sync(evaluate)),
			),
			core_effect_provideService = dual(3, (self, tag, service) =>
				contextWithEffect(env =>
					provideContext(self, Context_add(env, tag, service)),
				),
			),
			core_effect_provideServiceEffect = dual(3, (self, tag, effect) =>
				contextWithEffect(env =>
					core_flatMap(effect, service =>
						provideContext(self, pipe(env, Context_add(tag, service))),
					),
				),
			),
			core_effect_sleep = duration => {
				const decodedDuration = decode(duration)
				return clockWith(clock => clock.sleep(decodedDuration))
			},
			core_effect_succeedNone = succeed(Option_none()),
			summarized = dual(3, (self, summary, f) =>
				core_flatMap(summary, start =>
					core_flatMap(self, value =>
						core_map(summary, end => [f(start, end), value]),
					),
				),
			),
			core_effect_tapErrorCause = dual(2, (self, f) =>
				matchCauseEffect(self, {
					onFailure: cause => core_zipRight(f(cause), failCause(cause)),
					onSuccess: succeed,
				}),
			),
			core_effect_when = dual(2, (self, condition) =>
				suspend(() =>
					condition() ? core_map(self, Option_some) : succeed(Option_none()),
				),
			),
			filterDisablePropagation = Option_flatMap(span =>
				Context_get(span.context, DisablePropagation)
					? "Span" === span._tag
						? filterDisablePropagation(span.parent)
						: Option_none()
					: Option_some(span),
			),
			isExit = exitIsExit,
			Exit_isFailure = self => "Failure" === self._tag,
			Exit_isSuccess = exitIsSuccess,
			Exit_all = exitCollectAll,
			Exit_die = exitDie,
			Exit_fail = exitFail,
			Exit_failCause = exitFailCause,
			Exit_map = exitMap,
			Exit_match = exitMatch,
			Exit_succeed = exitSucceed,
			Exit_void_ = exitVoid,
			Exit_zip = exitZip,
			Exit_zipRight = exitZipRight,
			OP_INTERRUPT_SIGNAL = "InterruptSignal",
			OP_STATEFUL = "Stateful",
			OP_YIELD_NOW = "YieldNow",
			interruptSignal = cause => ({ _tag: "InterruptSignal", cause }),
			stateful = onFiber => ({ _tag: "Stateful", onFiber }),
			resume = effect => ({ _tag: "Resume", effect }),
			FiberScopeTypeId = Symbol.for("effect/FiberScope")
		class Global {
			[FiberScopeTypeId] = FiberScopeTypeId
			fiberId = FiberId_none
			roots = new Set()
			add(_runtimeFlags, child) {
				this.roots.add(child)
				child.addObserver(() => {
					this.roots.delete(child)
				})
			}
		}
		class Local {
			fiberId
			parent;
			[FiberScopeTypeId] = FiberScopeTypeId
			constructor(fiberId, parent) {
				this.fiberId = fiberId
				this.parent = parent
			}
			add(_runtimeFlags, child) {
				this.parent.tell(
					stateful(parentFiber => {
						parentFiber.addChild(child)
						child.addObserver(() => {
							parentFiber.removeChild(child)
						})
					}),
				)
			}
		}
		const globalScope = globalValue(
				Symbol.for("effect/FiberScope/Global"),
				() => new Global(),
			),
			FiberTypeId = Symbol.for("effect/Fiber"),
			fiber_fiberVariance = { _E: _ => _, _A: _ => _ },
			RuntimeFiberTypeId = Symbol.for("effect/Fiber"),
			fiber_join = self =>
				core_zipLeft(core_flatten(self.await), self.inheritAll),
			currentFiberURI = "effect/FiberCurrent",
			LoggerTypeId = Symbol.for("effect/Logger"),
			loggerVariance = { _Message: _ => _, _Output: _ => _ },
			makeLogger = log => ({
				[LoggerTypeId]: loggerVariance,
				log,
				pipe() {
					return pipeArguments(this, arguments)
				},
			}),
			logger_zip = dual(2, (self, that) =>
				makeLogger(options => [self.log(options), that.log(options)]),
			),
			textOnly = /^[^\s"=]*$/,
			logger_format =
				(quoteValue, whitespace) =>
				({ annotations, cause, date, fiberId, logLevel, message, spans }) => {
					const format = (label, value) =>
							`${formatLabel(label)}=${(value => (value.match(textOnly) ? value : quoteValue(value)))(value)}`,
						append = (label, value) => " " + format(label, value)
					let out = format("timestamp", date.toISOString())
					out += append("level", logLevel.label)
					out += append("fiber", threadName(fiberId))
					const messages = (self => (Array.isArray(self) ? self : [self]))(
						message,
					)
					for (let i = 0; i < messages.length; i++)
						out += append("message", toStringUnknown(messages[i], whitespace))
					;(self => "Empty" === self._tag)(cause) ||
						(out += append("cause", pretty(cause, { renderErrorCause: !0 })))
					for (const span of spans)
						out += " " + logSpan_render(date.getTime())(span)
					for (const [label, value] of annotations)
						out += append(label, toStringUnknown(value, whitespace))
					return out
				},
			escapeDoubleQuotes = s => `"${s.replace(/\\([\s\S])|(")/g, "\\$1$2")}"`,
			stringLogger = makeLogger(logger_format(escapeDoubleQuotes)),
			hasProcessStdout =
				(JSON.stringify,
				"object" == typeof process &&
					null !== process &&
					"object" == typeof process.stdout &&
					null !== process.stdout)
		;(hasProcessStdout && process.stdout.isTTY, hasProcessStdout || globalThis)
		const MetricKeyTypeTypeId = Symbol.for("effect/MetricKeyType"),
			CounterKeyTypeTypeId = Symbol.for("effect/MetricKeyType/Counter"),
			FrequencyKeyTypeTypeId = Symbol.for("effect/MetricKeyType/Frequency"),
			GaugeKeyTypeTypeId = Symbol.for("effect/MetricKeyType/Gauge"),
			HistogramKeyTypeTypeId = Symbol.for("effect/MetricKeyType/Histogram"),
			SummaryKeyTypeTypeId = Symbol.for("effect/MetricKeyType/Summary"),
			metricKeyTypeVariance = { _In: _ => _, _Out: _ => _ }
		class CounterKeyType {
			incremental
			bigint;
			[MetricKeyTypeTypeId] = metricKeyTypeVariance;
			[CounterKeyTypeTypeId] = CounterKeyTypeTypeId
			constructor(incremental, bigint) {
				this.incremental = incremental
				this.bigint = bigint
				this._hash = string("effect/MetricKeyType/Counter")
			}
			_hash;
			[symbol]() {
				return this._hash
			}
			[Equal_symbol](that) {
				return isCounterKey(that)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		class HistogramKeyType {
			boundaries;
			[MetricKeyTypeTypeId] = metricKeyTypeVariance;
			[HistogramKeyTypeTypeId] = HistogramKeyTypeTypeId
			constructor(boundaries) {
				this.boundaries = boundaries
				this._hash = pipe(
					string("effect/MetricKeyType/Histogram"),
					combine(Hash_hash(this.boundaries)),
				)
			}
			_hash;
			[symbol]() {
				return this._hash
			}
			[Equal_symbol](that) {
				return isHistogramKey(that) && equals(this.boundaries, that.boundaries)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const isCounterKey = u => hasProperty(u, CounterKeyTypeTypeId),
			isHistogramKey = u => hasProperty(u, HistogramKeyTypeTypeId),
			MetricKeyTypeId = Symbol.for("effect/MetricKey"),
			metricKeyVariance = { _Type: _ => _ },
			arrayEquivilence = Array_getEquivalence(equals)
		class MetricKeyImpl {
			name
			keyType
			description
			tags;
			[MetricKeyTypeId] = metricKeyVariance
			constructor(name, keyType, description, tags = []) {
				this.name = name
				this.keyType = keyType
				this.description = description
				this.tags = tags
				this._hash = pipe(
					string(this.name + this.description),
					combine(Hash_hash(this.keyType)),
					combine(array(this.tags)),
				)
			}
			_hash;
			[symbol]() {
				return this._hash
			}
			[Equal_symbol](u) {
				return (
					isMetricKey(u) &&
					this.name === u.name &&
					equals(this.keyType, u.keyType) &&
					equals(this.description, u.description) &&
					arrayEquivilence(this.tags, u.tags)
				)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const isMetricKey = u => hasProperty(u, MetricKeyTypeId),
			taggedWithLabels = dual(2, (self, extraTags) =>
				0 === extraTags.length
					? self
					: new MetricKeyImpl(
							self.name,
							self.keyType,
							self.description,
							Array_union(self.tags, extraTags),
						),
			),
			MutableHashMap_TypeId = Symbol.for("effect/MutableHashMap"),
			MutableHashMapProto = {
				[MutableHashMap_TypeId]: MutableHashMap_TypeId,
				[Symbol.iterator]() {
					return new MutableHashMapIterator(this)
				},
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "MutableHashMap", values: Array.from(this).map(toJSON) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			}
		class MutableHashMapIterator {
			self
			referentialIterator
			bucketIterator
			constructor(self) {
				this.self = self
				this.referentialIterator = self.referential[Symbol.iterator]()
			}
			next() {
				if (void 0 !== this.bucketIterator) return this.bucketIterator.next()
				const result = this.referentialIterator.next()
				if (result.done) {
					this.bucketIterator = new BucketIterator(this.self.buckets.values())
					return this.next()
				}
				return result
			}
			[Symbol.iterator]() {
				return new MutableHashMapIterator(this.self)
			}
		}
		class BucketIterator {
			backing
			constructor(backing) {
				this.backing = backing
			}
			currentBucket
			next() {
				if (void 0 === this.currentBucket) {
					const result = this.backing.next()
					if (result.done) return result
					this.currentBucket = result.value[Symbol.iterator]()
				}
				const result = this.currentBucket.next()
				if (result.done) {
					this.currentBucket = void 0
					return this.next()
				}
				return result
			}
		}
		const MutableHashMap_empty = () => {
				const self = Object.create(MutableHashMapProto)
				self.referential = new Map()
				self.buckets = new Map()
				self.bucketsSize = 0
				return self
			},
			MutableHashMap_get = dual(2, (self, key) => {
				if (!1 === isEqual(key))
					return self.referential.has(key)
						? Option_some(self.referential.get(key))
						: Option_none()
				const hash = key[symbol](),
					bucket = self.buckets.get(hash)
				return void 0 === bucket
					? Option_none()
					: getFromBucket(self, bucket, key)
			}),
			getFromBucket = (self, bucket, key, remove = !1) => {
				for (let i = 0, len = bucket.length; i < len; i++)
					if (key[Equal_symbol](bucket[i][0])) {
						const value = bucket[i][1]
						if (remove) {
							bucket.splice(i, 1)
							self.bucketsSize--
						}
						return Option_some(value)
					}
				return Option_none()
			},
			MutableHashMap_has = dual(2, (self, key) =>
				Option_isSome(MutableHashMap_get(self, key)),
			),
			MutableHashMap_set = dual(3, (self, key, value) => {
				if (!1 === isEqual(key)) {
					self.referential.set(key, value)
					return self
				}
				const hash = key[symbol](),
					bucket = self.buckets.get(hash)
				if (void 0 === bucket) {
					self.buckets.set(hash, [[key, value]])
					self.bucketsSize++
					return self
				}
				removeFromBucket(self, bucket, key)
				bucket.push([key, value])
				self.bucketsSize++
				return self
			}),
			removeFromBucket = (self, bucket, key) => {
				for (let i = 0, len = bucket.length; i < len; i++)
					if (key[Equal_symbol](bucket[i][0])) {
						bucket.splice(i, 1)
						self.bucketsSize--
						return
					}
			},
			MetricStateTypeId = Symbol.for("effect/MetricState"),
			CounterStateTypeId = Symbol.for("effect/MetricState/Counter"),
			FrequencyStateTypeId = Symbol.for("effect/MetricState/Frequency"),
			GaugeStateTypeId = Symbol.for("effect/MetricState/Gauge"),
			HistogramStateTypeId = Symbol.for("effect/MetricState/Histogram"),
			SummaryStateTypeId = Symbol.for("effect/MetricState/Summary"),
			metricStateVariance = { _A: _ => _ }
		class CounterState {
			count;
			[MetricStateTypeId] = metricStateVariance;
			[CounterStateTypeId] = CounterStateTypeId
			constructor(count) {
				this.count = count
			}
			[symbol]() {
				return pipe(
					Hash_hash("effect/MetricState/Counter"),
					combine(Hash_hash(this.count)),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return isCounterState(that) && this.count === that.count
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const arrayEquals = Array_getEquivalence(equals)
		class FrequencyState {
			occurrences;
			[MetricStateTypeId] = metricStateVariance;
			[FrequencyStateTypeId] = FrequencyStateTypeId
			constructor(occurrences) {
				this.occurrences = occurrences
			}
			_hash;
			[symbol]() {
				return pipe(
					string("effect/MetricState/Frequency"),
					combine(array(Array_fromIterable(this.occurrences.entries()))),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return (
					isFrequencyState(that) &&
					arrayEquals(
						Array_fromIterable(this.occurrences.entries()),
						Array_fromIterable(that.occurrences.entries()),
					)
				)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		class GaugeState {
			value;
			[MetricStateTypeId] = metricStateVariance;
			[GaugeStateTypeId] = GaugeStateTypeId
			constructor(value) {
				this.value = value
			}
			[symbol]() {
				return pipe(
					Hash_hash("effect/MetricState/Gauge"),
					combine(Hash_hash(this.value)),
					cached(this),
				)
			}
			[Equal_symbol](u) {
				return isGaugeState(u) && this.value === u.value
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		class HistogramState {
			buckets
			count
			min
			max
			sum;
			[MetricStateTypeId] = metricStateVariance;
			[HistogramStateTypeId] = HistogramStateTypeId
			constructor(buckets, count, min, max, sum) {
				this.buckets = buckets
				this.count = count
				this.min = min
				this.max = max
				this.sum = sum
			}
			[symbol]() {
				return pipe(
					Hash_hash("effect/MetricState/Histogram"),
					combine(Hash_hash(this.buckets)),
					combine(Hash_hash(this.count)),
					combine(Hash_hash(this.min)),
					combine(Hash_hash(this.max)),
					combine(Hash_hash(this.sum)),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return (
					isHistogramState(that) &&
					equals(this.buckets, that.buckets) &&
					this.count === that.count &&
					this.min === that.min &&
					this.max === that.max &&
					this.sum === that.sum
				)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		class SummaryState {
			error
			quantiles
			count
			min
			max
			sum;
			[MetricStateTypeId] = metricStateVariance;
			[SummaryStateTypeId] = SummaryStateTypeId
			constructor(error, quantiles, count, min, max, sum) {
				this.error = error
				this.quantiles = quantiles
				this.count = count
				this.min = min
				this.max = max
				this.sum = sum
			}
			[symbol]() {
				return pipe(
					Hash_hash("effect/MetricState/Summary"),
					combine(Hash_hash(this.error)),
					combine(Hash_hash(this.quantiles)),
					combine(Hash_hash(this.count)),
					combine(Hash_hash(this.min)),
					combine(Hash_hash(this.max)),
					combine(Hash_hash(this.sum)),
					cached(this),
				)
			}
			[Equal_symbol](that) {
				return (
					isSummaryState(that) &&
					this.error === that.error &&
					equals(this.quantiles, that.quantiles) &&
					this.count === that.count &&
					this.min === that.min &&
					this.max === that.max &&
					this.sum === that.sum
				)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const isCounterState = u => hasProperty(u, CounterStateTypeId),
			isFrequencyState = u => hasProperty(u, FrequencyStateTypeId),
			isGaugeState = u => hasProperty(u, GaugeStateTypeId),
			isHistogramState = u => hasProperty(u, HistogramStateTypeId),
			isSummaryState = u => hasProperty(u, SummaryStateTypeId),
			MetricHookTypeId = Symbol.for("effect/MetricHook"),
			metricHookVariance = { _In: _ => _, _Out: _ => _ },
			hook_make = options => ({
				[MetricHookTypeId]: metricHookVariance,
				pipe() {
					return pipeArguments(this, arguments)
				},
				...options,
			}),
			hook_bigint0 = BigInt(0),
			resolveQuantile = (
				error,
				sampleCount,
				current,
				consumed,
				quantile,
				rest,
			) => {
				let error_1 = error,
					sampleCount_1 = sampleCount,
					current_1 = current,
					consumed_1 = consumed,
					quantile_1 = quantile,
					rest_1 = rest,
					error_2 = error,
					sampleCount_2 = sampleCount,
					current_2 = current,
					consumed_2 = consumed,
					quantile_2 = quantile,
					rest_2 = rest
				for (;;) {
					if (!isNonEmptyReadonlyArray(rest_1))
						return {
							quantile: quantile_1,
							value: Option_none(),
							consumed: consumed_1,
							rest: [],
						}
					if (1 === quantile_1)
						return {
							quantile: quantile_1,
							value: Option_some(lastNonEmpty(rest_1)),
							consumed: consumed_1 + rest_1.length,
							rest: [],
						}
					const headValue = headNonEmpty(rest_1),
						sameHead = span(rest_1, n => n === headValue),
						desired = quantile_1 * sampleCount_1,
						allowedError = (error_1 / 2) * desired,
						candConsumed = consumed_1 + sameHead[0].length,
						candError = Math.abs(candConsumed - desired)
					if (candConsumed < desired - allowedError) {
						error_2 = error_1
						sampleCount_2 = sampleCount_1
						current_2 = Array_head(rest_1)
						consumed_2 = candConsumed
						quantile_2 = quantile_1
						rest_2 = sameHead[1]
						error_1 = error_2
						sampleCount_1 = sampleCount_2
						current_1 = current_2
						consumed_1 = consumed_2
						quantile_1 = quantile_2
						rest_1 = rest_2
					} else {
						if (candConsumed > desired + allowedError)
							return {
								quantile: quantile_1,
								value: Option_isNone(current_1)
									? Option_some(headValue)
									: current_1,
								consumed: consumed_1,
								rest: rest_1,
							}
						switch (current_1._tag) {
							case "None":
								error_2 = error_1
								sampleCount_2 = sampleCount_1
								current_2 = Array_head(rest_1)
								consumed_2 = candConsumed
								quantile_2 = quantile_1
								rest_2 = sameHead[1]
								error_1 = error_2
								sampleCount_1 = sampleCount_2
								current_1 = current_2
								consumed_1 = consumed_2
								quantile_1 = quantile_2
								rest_1 = rest_2
								continue
							case "Some":
								if (candError < Math.abs(desired - current_1.value)) {
									error_2 = error_1
									sampleCount_2 = sampleCount_1
									current_2 = Array_head(rest_1)
									consumed_2 = candConsumed
									quantile_2 = quantile_1
									rest_2 = sameHead[1]
									error_1 = error_2
									sampleCount_1 = sampleCount_2
									current_1 = current_2
									consumed_1 = consumed_2
									quantile_1 = quantile_2
									rest_1 = rest_2
									continue
								}
								return {
									quantile: quantile_1,
									value: Option_some(current_1.value),
									consumed: consumed_1,
									rest: rest_1,
								}
						}
					}
				}
				throw new Error(
					"BUG: MetricHook.resolveQuantiles - please report an issue at https://github.com/Effect-TS/effect/issues",
				)
			},
			MetricPairTypeId = Symbol.for("effect/MetricPair"),
			metricPairVariance = { _Type: _ => _ },
			pair_unsafeMake = (metricKey, metricState) => ({
				[MetricPairTypeId]: metricPairVariance,
				metricKey,
				metricState,
				pipe() {
					return pipeArguments(this, arguments)
				},
			}),
			MetricRegistryTypeId = Symbol.for("effect/MetricRegistry")
		class MetricRegistryImpl {
			[MetricRegistryTypeId] = MetricRegistryTypeId
			map = MutableHashMap_empty()
			snapshot() {
				const result = []
				for (const [key, hook] of this.map)
					result.push(pair_unsafeMake(key, hook.get()))
				return result
			}
			get(key) {
				const hook = pipe(
					this.map,
					MutableHashMap_get(key),
					Option_getOrUndefined,
				)
				if (null == hook) {
					if (isCounterKey(key.keyType)) return this.getCounter(key)
					if ((u => hasProperty(u, GaugeKeyTypeTypeId))(key.keyType))
						return this.getGauge(key)
					if ((u => hasProperty(u, FrequencyKeyTypeTypeId))(key.keyType))
						return this.getFrequency(key)
					if (isHistogramKey(key.keyType)) return this.getHistogram(key)
					if ((u => hasProperty(u, SummaryKeyTypeTypeId))(key.keyType))
						return this.getSummary(key)
					throw new Error(
						"BUG: MetricRegistry.get - unknown MetricKeyType - please report an issue at https://github.com/Effect-TS/effect/issues",
					)
				}
				return hook
			}
			getCounter(key) {
				let value = pipe(
					this.map,
					MutableHashMap_get(key),
					Option_getOrUndefined,
				)
				if (null == value) {
					const counter = (key => {
						let sum = key.keyType.bigint ? hook_bigint0 : 0
						const canUpdate = key.keyType.incremental
								? key.keyType.bigint
									? value => value >= hook_bigint0
									: value => value >= 0
								: _value => !0,
							update = value => {
								canUpdate(value) && (sum += value)
							}
						return hook_make({
							get: () => new CounterState(sum),
							update,
							modify: update,
						})
					})(key)
					pipe(this.map, MutableHashMap_has(key)) ||
						pipe(this.map, MutableHashMap_set(key, counter))
					value = counter
				}
				return value
			}
			getFrequency(key) {
				let value = pipe(
					this.map,
					MutableHashMap_get(key),
					Option_getOrUndefined,
				)
				if (null == value) {
					const frequency = (key => {
						const values = new Map()
						for (const word of key.keyType.preregisteredWords)
							values.set(word, 0)
						const update = word => {
							const slotCount = values.get(word) ?? 0
							values.set(word, slotCount + 1)
						}
						return hook_make({
							get: () => new FrequencyState(values),
							update,
							modify: update,
						})
					})(key)
					pipe(this.map, MutableHashMap_has(key)) ||
						pipe(this.map, MutableHashMap_set(key, frequency))
					value = frequency
				}
				return value
			}
			getGauge(key) {
				let value = pipe(
					this.map,
					MutableHashMap_get(key),
					Option_getOrUndefined,
				)
				if (null == value) {
					const gauge = ((_key, startAt) => {
						let value = startAt
						return hook_make({
							get: () => new GaugeState(value),
							update: v => {
								value = v
							},
							modify: v => {
								value += v
							},
						})
					})(0, key.keyType.bigint ? BigInt(0) : 0)
					pipe(this.map, MutableHashMap_has(key)) ||
						pipe(this.map, MutableHashMap_set(key, gauge))
					value = gauge
				}
				return value
			}
			getHistogram(key) {
				let value = pipe(
					this.map,
					MutableHashMap_get(key),
					Option_getOrUndefined,
				)
				if (null == value) {
					const histogram = (key => {
						const bounds = key.keyType.boundaries.values,
							size = bounds.length,
							values = new Uint32Array(size + 1),
							boundaries = new Float64Array(size)
						let count = 0,
							sum = 0,
							min = Number.MAX_VALUE,
							max = Number.MIN_VALUE
						pipe(
							bounds,
							sort(Number_Order),
							Array_map((n, i) => {
								boundaries[i] = n
							}),
						)
						const update = value => {
								let from = 0,
									to = size
								for (; from !== to;) {
									const mid = Math.floor(from + (to - from) / 2)
									value <= boundaries[mid] ? (to = mid) : (from = mid)
									to === from + 1 &&
										(value <= boundaries[from] ? (to = from) : (from = to))
								}
								values[from] = values[from] + 1
								count += 1
								sum += value
								value < min && (min = value)
								value > max && (max = value)
							},
							getBuckets = () => {
								const builder = allocate(size)
								let cumulated = 0
								for (let i = 0; i < size; i++) {
									const boundary = boundaries[i]
									cumulated += values[i]
									builder[i] = [boundary, cumulated]
								}
								return builder
							}
						return hook_make({
							get: () => {
								return (
									(options = { buckets: getBuckets(), count, min, max, sum }),
									new HistogramState(
										options.buckets,
										options.count,
										options.min,
										options.max,
										options.sum,
									)
								)
								var options
							},
							update,
							modify: update,
						})
					})(key)
					pipe(this.map, MutableHashMap_has(key)) ||
						pipe(this.map, MutableHashMap_set(key, histogram))
					value = histogram
				}
				return value
			}
			getSummary(key) {
				let value = pipe(
					this.map,
					MutableHashMap_get(key),
					Option_getOrUndefined,
				)
				if (null == value) {
					const summary = (key => {
						const { error, maxAge, maxSize, quantiles } = key.keyType,
							sortedQuantiles = pipe(quantiles, sort(Number_Order)),
							values = allocate(maxSize)
						let head = 0,
							count = 0,
							sum = 0,
							min = 0,
							max = 0
						const snapshot = now => {
								const builder = []
								let i = 0
								for (; i !== maxSize - 1;) {
									const item = values[i]
									if (null != item) {
										const [t, v] = item,
											age = Duration_millis(now - t)
										Duration_greaterThanOrEqualTo(age, zero) &&
											Duration_lessThanOrEqualTo(age, maxAge) &&
											builder.push(v)
									}
									i += 1
								}
								return ((error, sortedQuantiles, sortedSamples) => {
									const sampleCount = sortedSamples.length
									if (!isNonEmptyReadonlyArray(sortedQuantiles)) return []
									const head = sortedQuantiles[0],
										tail = sortedQuantiles.slice(1),
										resolvedHead = resolveQuantile(
											error,
											sampleCount,
											Option_none(),
											0,
											head,
											sortedSamples,
										),
										resolved = Array_of(resolvedHead)
									tail.forEach(quantile => {
										resolved.push(
											resolveQuantile(
												error,
												sampleCount,
												resolvedHead.value,
												resolvedHead.consumed,
												quantile,
												resolvedHead.rest,
											),
										)
									})
									return Array_map(resolved, rq => [rq.quantile, rq.value])
								})(error, sortedQuantiles, sort(builder, Number_Order))
							},
							observe = (value, timestamp) => {
								if (maxSize > 0) {
									head += 1
									values[head % maxSize] = [timestamp, value]
								}
								min = 0 === count ? value : Math.min(min, value)
								max = 0 === count ? value : Math.max(max, value)
								count += 1
								sum += value
							}
						return hook_make({
							get: () => {
								return (
									(options = {
										error,
										quantiles: snapshot(Date.now()),
										count,
										min,
										max,
										sum,
									}),
									new SummaryState(
										options.error,
										options.quantiles,
										options.count,
										options.min,
										options.max,
										options.sum,
									)
								)
								var options
							},
							update: ([value, timestamp]) => observe(value, timestamp),
							modify: ([value, timestamp]) => observe(value, timestamp),
						})
					})(key)
					pipe(this.map, MutableHashMap_has(key)) ||
						pipe(this.map, MutableHashMap_set(key, summary))
					value = summary
				}
				return value
			}
		}
		const MetricTypeId = Symbol.for("effect/Metric"),
			metricVariance = { _Type: _ => _, _In: _ => _, _Out: _ => _ },
			globalMetricRegistry = globalValue(
				Symbol.for("effect/Metric/globalMetricRegistry"),
				() => new MetricRegistryImpl(),
			),
			metric_make = function (
				keyType,
				unsafeUpdate,
				unsafeValue,
				unsafeModify,
			) {
				const metric = Object.assign(
					effect => core_tap(effect, a => metric_update(metric, a)),
					{
						[MetricTypeId]: metricVariance,
						keyType,
						unsafeUpdate,
						unsafeValue,
						unsafeModify,
						register() {
							this.unsafeValue([])
							return this
						},
						pipe() {
							return pipeArguments(this, arguments)
						},
					},
				)
				return metric
			},
			metric_counter = (name, options) =>
				fromMetricKey(
					((name, options) =>
						new MetricKeyImpl(
							name,
							(options =>
								new CounterKeyType(
									options?.incremental ?? !1,
									options?.bigint ?? !1,
								))(options),
							Option_fromNullable(options?.description),
						))(name, options),
				),
			fromMetricKey = key => {
				let untaggedHook
				const hookCache = new WeakMap(),
					hook = extraTags => {
						if (0 === extraTags.length) {
							if (void 0 !== untaggedHook) return untaggedHook
							untaggedHook = globalMetricRegistry.get(key)
							return untaggedHook
						}
						let hook = hookCache.get(extraTags)
						if (void 0 !== hook) return hook
						hook = globalMetricRegistry.get(taggedWithLabels(key, extraTags))
						hookCache.set(extraTags, hook)
						return hook
					}
				return metric_make(
					key.keyType,
					(input, extraTags) => hook(extraTags).update(input),
					extraTags => hook(extraTags).get(),
					(input, extraTags) => hook(extraTags).modify(input),
				)
			},
			metric_histogram = (name, boundaries, description) =>
				fromMetricKey(
					((name, boundaries, description) =>
						new MetricKeyImpl(
							name,
							(boundaries => new HistogramKeyType(boundaries))(boundaries),
							Option_fromNullable(description),
						))(name, boundaries, description),
				),
			metric_tagged = dual(3, (self, key, value) =>
				metric_taggedWithLabels(self, [label_make(key, value)]),
			),
			metric_taggedWithLabels = dual(2, (self, extraTags) =>
				metric_make(
					self.keyType,
					(input, extraTags1) =>
						self.unsafeUpdate(input, Array_union(extraTags, extraTags1)),
					extraTags1 => self.unsafeValue(Array_union(extraTags, extraTags1)),
					(input, extraTags1) =>
						self.unsafeModify(input, Array_union(extraTags, extraTags1)),
				),
			),
			metric_update = dual(2, (self, input) =>
				fiberRefGetWith(currentMetricLabels, tags =>
					sync(() => self.unsafeUpdate(input, tags)),
				),
			),
			MetricBoundariesTypeId = Symbol.for("effect/MetricBoundaries")
		class MetricBoundariesImpl {
			values;
			[MetricBoundariesTypeId] = MetricBoundariesTypeId
			constructor(values) {
				this.values = values
				this._hash = pipe(
					string("effect/MetricBoundaries"),
					combine(array(this.values)),
				)
			}
			_hash;
			[symbol]() {
				return this._hash
			}
			[Equal_symbol](u) {
				return isMetricBoundaries(u) && equals(this.values, u.values)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const isMetricBoundaries = u => hasProperty(u, MetricBoundariesTypeId),
			boundaries_fromIterable = iterable => {
				const values = pipe(
					iterable,
					Array_appendAll(Chunk_of(Number.POSITIVE_INFINITY)),
					dedupe,
				)
				return new MetricBoundariesImpl(values)
			},
			exponential = options =>
				pipe(
					Array_makeBy(
						options.count - 1,
						i => options.start * Math.pow(options.factor, i),
					),
					unsafeFromArray,
					boundaries_fromIterable,
				),
			complete = dual(2, (self, result) =>
				fiberRefGetWith(currentRequestMap, map =>
					sync(() => {
						if (map.has(self)) {
							const entry = map.get(self)
							if (!entry.state.completed) {
								entry.state.completed = !0
								deferredUnsafeDone(entry.result, result)
							}
						}
					}),
				),
			),
			SupervisorTypeId = Symbol.for("effect/Supervisor"),
			supervisorVariance = { _T: _ => _ }
		class ProxySupervisor {
			underlying
			value0;
			[SupervisorTypeId] = supervisorVariance
			constructor(underlying, value0) {
				this.underlying = underlying
				this.value0 = value0
			}
			get value() {
				return this.value0
			}
			onStart(context, effect, parent, fiber) {
				this.underlying.onStart(context, effect, parent, fiber)
			}
			onEnd(value, fiber) {
				this.underlying.onEnd(value, fiber)
			}
			onEffect(fiber, effect) {
				this.underlying.onEffect(fiber, effect)
			}
			onSuspend(fiber) {
				this.underlying.onSuspend(fiber)
			}
			onResume(fiber) {
				this.underlying.onResume(fiber)
			}
			map(f) {
				return new ProxySupervisor(this, pipe(this.value, core_map(f)))
			}
			zip(right) {
				return new Zip(this, right)
			}
		}
		class Zip {
			left
			right
			_tag = "Zip";
			[SupervisorTypeId] = supervisorVariance
			constructor(left, right) {
				this.left = left
				this.right = right
			}
			get value() {
				return core_zip(this.left.value, this.right.value)
			}
			onStart(context, effect, parent, fiber) {
				this.left.onStart(context, effect, parent, fiber)
				this.right.onStart(context, effect, parent, fiber)
			}
			onEnd(value, fiber) {
				this.left.onEnd(value, fiber)
				this.right.onEnd(value, fiber)
			}
			onEffect(fiber, effect) {
				this.left.onEffect(fiber, effect)
				this.right.onEffect(fiber, effect)
			}
			onSuspend(fiber) {
				this.left.onSuspend(fiber)
				this.right.onSuspend(fiber)
			}
			onResume(fiber) {
				this.left.onResume(fiber)
				this.right.onResume(fiber)
			}
			map(f) {
				return new ProxySupervisor(this, pipe(this.value, core_map(f)))
			}
			zip(right) {
				return new Zip(this, right)
			}
		}
		const isZip = self =>
			hasProperty(self, SupervisorTypeId) && isTagged(self, "Zip")
		class Const {
			effect;
			[SupervisorTypeId] = supervisorVariance
			constructor(effect) {
				this.effect = effect
			}
			get value() {
				return this.effect
			}
			onStart(_context, _effect, _parent, _fiber) {}
			onEnd(_value, _fiber) {}
			onEffect(_fiber, _effect) {}
			onSuspend(_fiber) {}
			onResume(_fiber) {}
			map(f) {
				return new ProxySupervisor(this, pipe(this.value, core_map(f)))
			}
			zip(right) {
				return new Zip(this, right)
			}
			onRun(execution, _fiber) {
				return execution()
			}
		}
		const supervisor_none = globalValue(
				"effect/Supervisor/none",
				() => new Const(core_void_),
			),
			supervisor_patch_empty = { _tag: "Empty" },
			supervisor_patch_combine = (self, that) => ({
				_tag: "AndThen",
				first: self,
				second: that,
			}),
			removeSupervisor = (self, that) =>
				equals(self, that)
					? supervisor_none
					: isZip(self)
						? removeSupervisor(self.left, that).zip(
								removeSupervisor(self.right, that),
							)
						: self,
			patch_toSet = self =>
				equals(self, supervisor_none)
					? HashSet_empty()
					: isZip(self)
						? pipe(
								patch_toSet(self.left),
								HashSet_union(patch_toSet(self.right)),
							)
						: HashSet_make(self),
			patch_differ = differ_make({
				empty: supervisor_patch_empty,
				patch: (self, supervisor) =>
					((_supervisor, _patches) => {
						let supervisor = _supervisor,
							patches = _patches
						for (; isNonEmpty(patches);) {
							const head = Chunk_headNonEmpty(patches)
							switch (head._tag) {
								case "Empty":
									patches = Chunk_tailNonEmpty(patches)
									break
								case "AddSupervisor":
									supervisor = supervisor.zip(head.supervisor)
									patches = Chunk_tailNonEmpty(patches)
									break
								case "RemoveSupervisor":
									supervisor = removeSupervisor(supervisor, head.supervisor)
									patches = Chunk_tailNonEmpty(patches)
									break
								case "AndThen":
									patches = Chunk_prepend(head.first)(
										Chunk_prepend(head.second)(Chunk_tailNonEmpty(patches)),
									)
							}
						}
						return supervisor
					})(supervisor, Chunk_of(self)),
				combine: supervisor_patch_combine,
				diff: (oldValue, newValue) => {
					if (equals(oldValue, newValue)) return supervisor_patch_empty
					const oldSupervisors = patch_toSet(oldValue),
						newSupervisors = patch_toSet(newValue),
						added = pipe(
							newSupervisors,
							HashSet_difference(oldSupervisors),
							HashSet_reduce(supervisor_patch_empty, (patch, supervisor) =>
								supervisor_patch_combine(patch, {
									_tag: "AddSupervisor",
									supervisor,
								}),
							),
						),
						removed = pipe(
							oldSupervisors,
							HashSet_difference(newSupervisors),
							HashSet_reduce(supervisor_patch_empty, (patch, supervisor) =>
								supervisor_patch_combine(patch, {
									_tag: "RemoveSupervisor",
									supervisor,
								}),
							),
						)
					return supervisor_patch_combine(added, removed)
				},
			}),
			fiberStarted = metric_counter("effect_fiber_started", {
				incremental: !0,
			}),
			fiberActive = metric_counter("effect_fiber_active"),
			fiberSuccesses = metric_counter("effect_fiber_successes", {
				incremental: !0,
			}),
			fiberFailures = metric_counter("effect_fiber_failures", {
				incremental: !0,
			}),
			fiberLifetimes = metric_tagged(
				metric_histogram(
					"effect_fiber_lifetimes",
					exponential({ start: 0.5, factor: 2, count: 35 }),
				),
				"time_unit",
				"milliseconds",
			),
			runtimeFiberVariance = { _E: _ => _, _A: _ => _ },
			fiberRuntime_absurd = _ => {
				throw new Error(
					`BUG: FiberRuntime - ${toStringUnknown(_)} - please report an issue at https://github.com/Effect-TS/effect/issues`,
				)
			},
			YieldedOp = Symbol.for("effect/internal/fiberRuntime/YieldedOp"),
			yieldedOpChannel = globalValue(
				"effect/internal/fiberRuntime/yieldedOpChannel",
				() => ({ currentOp: null }),
			),
			contOpSuccess = {
				[OP_ON_SUCCESS]: (_, cont, value) =>
					internalCall(() => cont.effect_instruction_i1(value)),
				OnStep: (_, _cont, value) => exitSucceed(exitSucceed(value)),
				[OP_ON_SUCCESS_AND_FAILURE]: (_, cont, value) =>
					internalCall(() => cont.effect_instruction_i2(value)),
				[OP_REVERT_FLAGS]: (self, cont, value) => {
					self.patchRuntimeFlags(self.currentRuntimeFlags, cont.patch)
					return interruptible(self.currentRuntimeFlags) && self.isInterrupted()
						? exitFailCause(self.getInterruptedCause())
						: exitSucceed(value)
				},
				While: (self, cont, value) => {
					internalCall(() => cont.effect_instruction_i2(value))
					if (internalCall(() => cont.effect_instruction_i0())) {
						self.pushStack(cont)
						return internalCall(() => cont.effect_instruction_i1())
					}
					return core_void_
				},
				[OP_ITERATOR]: (self, cont, value) => {
					for (;;) {
						const state = internalCall(() =>
							cont.effect_instruction_i0.next(value),
						)
						if (state.done) return exitSucceed(state.value)
						const primitive = yieldWrapGet(state.value)
						if (!exitIsExit(primitive)) {
							self.pushStack(cont)
							return primitive
						}
						if ("Failure" === primitive._tag) return primitive
						value = primitive.value
					}
				},
			},
			drainQueueWhileRunningTable = {
				[OP_INTERRUPT_SIGNAL]: (self, runtimeFlags, cur, message) => {
					self.processNewInterruptSignal(message.cause)
					return interruptible(runtimeFlags)
						? exitFailCause(message.cause)
						: cur
				},
				Resume: (_self, _runtimeFlags, _cur, _message) => {
					throw new Error(
						"It is illegal to have multiple concurrent run loops in a single fiber",
					)
				},
				[OP_STATEFUL]: (self, runtimeFlags, cur, message) => {
					message.onFiber(self, FiberStatus_running(runtimeFlags))
					return cur
				},
				[OP_YIELD_NOW]: (_self, _runtimeFlags, cur, _message) =>
					core_flatMap(yieldNow(), () => cur),
			},
			_version = getCurrentVersion()
		class FiberRuntime extends Effectable_Class {
			[FiberTypeId] = fiber_fiberVariance;
			[RuntimeFiberTypeId] = runtimeFiberVariance
			_fiberRefs
			_fiberId
			_queue = new Array()
			_children = null
			_observers = new Array()
			_running = !1
			_stack = []
			_asyncInterruptor = null
			_asyncBlockingOn = null
			_exitValue = null
			_steps = []
			_isYielding = !1
			currentRuntimeFlags
			currentOpCount = 0
			currentSupervisor
			currentScheduler
			currentTracer
			currentSpan
			currentContext
			currentDefaultServices
			constructor(fiberId, fiberRefs0, runtimeFlags0) {
				super()
				this.currentRuntimeFlags = runtimeFlags0
				this._fiberId = fiberId
				this._fiberRefs = fiberRefs0
				if (runtimeMetrics(runtimeFlags0)) {
					const tags = this.getFiberRef(currentMetricLabels)
					fiberStarted.unsafeUpdate(1, tags)
					fiberActive.unsafeUpdate(1, tags)
				}
				this.refreshRefCache()
			}
			commit() {
				return fiber_join(this)
			}
			id() {
				return this._fiberId
			}
			resume(effect) {
				this.tell(resume(effect))
			}
			get status() {
				return this.ask((_, status) => status)
			}
			get runtimeFlags() {
				return this.ask((state, status) =>
					(self => "Done" === self._tag)(status)
						? state.currentRuntimeFlags
						: status.runtimeFlags,
				)
			}
			scope() {
				return new Local((fiber = this).id(), fiber)
				var fiber
			}
			get children() {
				return this.ask(fiber => Array.from(fiber.getChildren()))
			}
			getChildren() {
				null === this._children && (this._children = new Set())
				return this._children
			}
			getInterruptedCause() {
				return this.getFiberRef(currentInterruptedCause)
			}
			fiberRefs() {
				return this.ask(fiber => fiber.getFiberRefs())
			}
			ask(f) {
				return suspend(() => {
					const deferred = deferredUnsafeMake(this._fiberId)
					this.tell(
						stateful((fiber, status) => {
							deferredUnsafeDone(
								deferred,
								sync(() => f(fiber, status)),
							)
						}),
					)
					return deferredAwait(deferred)
				})
			}
			tell(message) {
				this._queue.push(message)
				if (!this._running) {
					this._running = !0
					this.drainQueueLaterOnExecutor()
				}
			}
			get await() {
				return async_(resume => {
					const cb = exit => resume(succeed(exit))
					if (null === this._exitValue) {
						this.tell(
							stateful((fiber, _) => {
								null !== fiber._exitValue
									? cb(this._exitValue)
									: fiber.addObserver(cb)
							}),
						)
						return sync(() =>
							this.tell(
								stateful((fiber, _) => {
									fiber.removeObserver(cb)
								}),
							),
						)
					}
					cb(this._exitValue)
				}, this.id())
			}
			get inheritAll() {
				return withFiberRuntime((parentFiber, parentStatus) => {
					const parentFiberId = parentFiber.id(),
						parentFiberRefs = parentFiber.getFiberRefs(),
						parentRuntimeFlags = parentStatus.runtimeFlags,
						childFiberRefs = this.getFiberRefs(),
						updatedFiberRefs = joinAs(
							parentFiberRefs,
							parentFiberId,
							childFiberRefs,
						)
					parentFiber.setFiberRefs(updatedFiberRefs)
					const updatedRuntimeFlags =
						parentFiber.getFiberRef(currentRuntimeFlags)
					return (patch => {
						const effect = new EffectPrimitive("UpdateRuntimeFlags")
						effect.effect_instruction_i0 = patch
						effect.effect_instruction_i1 = void 0
						return effect
					})(
						pipe(
							runtimeFlags_diff(parentRuntimeFlags, updatedRuntimeFlags),
							RuntimeFlagsPatch_exclude(1),
							RuntimeFlagsPatch_exclude(16),
						),
					)
				})
			}
			get poll() {
				return sync(() => Option_fromNullable(this._exitValue))
			}
			unsafePoll() {
				return this._exitValue
			}
			interruptAsFork(fiberId) {
				return sync(() => this.tell(interruptSignal(interrupt(fiberId))))
			}
			unsafeInterruptAsFork(fiberId) {
				this.tell(interruptSignal(interrupt(fiberId)))
			}
			addObserver(observer) {
				null !== this._exitValue
					? observer(this._exitValue)
					: this._observers.push(observer)
			}
			removeObserver(observer) {
				this._observers = this._observers.filter(o => o !== observer)
			}
			getFiberRefs() {
				this.setFiberRef(currentRuntimeFlags, this.currentRuntimeFlags)
				return this._fiberRefs
			}
			unsafeDeleteFiberRef(fiberRef) {
				this._fiberRefs = delete_(this._fiberRefs, fiberRef)
			}
			getFiberRef(fiberRef) {
				return this._fiberRefs.locals.has(fiberRef)
					? this._fiberRefs.locals.get(fiberRef)[0][1]
					: fiberRef.initial
			}
			setFiberRef(fiberRef, value) {
				this._fiberRefs = updateAs(this._fiberRefs, {
					fiberId: this._fiberId,
					fiberRef,
					value,
				})
				this.refreshRefCache()
			}
			refreshRefCache() {
				this.currentDefaultServices = this.getFiberRef(currentServices)
				this.currentTracer = this.currentDefaultServices.unsafeMap.get(
					tracerTag.key,
				)
				this.currentSupervisor = this.getFiberRef(currentSupervisor)
				this.currentScheduler = this.getFiberRef(currentScheduler)
				this.currentContext = this.getFiberRef(currentContext)
				this.currentSpan = this.currentContext.unsafeMap.get(spanTag.key)
			}
			setFiberRefs(fiberRefs) {
				this._fiberRefs = fiberRefs
				this.refreshRefCache()
			}
			addChild(child) {
				this.getChildren().add(child)
			}
			removeChild(child) {
				this.getChildren().delete(child)
			}
			transferChildren(scope) {
				const children = this._children
				this._children = null
				if (null !== children && children.size > 0)
					for (const child of children)
						null === child._exitValue &&
							scope.add(this.currentRuntimeFlags, child)
			}
			drainQueueOnCurrentThread() {
				let recurse = !0
				for (; recurse;) {
					let evaluationSignal = "Continue"
					const prev = globalThis[currentFiberURI]
					globalThis[currentFiberURI] = this
					try {
						for (; "Continue" === evaluationSignal;)
							evaluationSignal =
								0 === this._queue.length
									? "Done"
									: this.evaluateMessageWhileSuspended(
											this._queue.splice(0, 1)[0],
										)
					} finally {
						this._running = !1
						globalThis[currentFiberURI] = prev
					}
					if (this._queue.length > 0 && !this._running) {
						this._running = !0
						if ("Yield" === evaluationSignal) {
							this.drainQueueLaterOnExecutor()
							recurse = !1
						} else recurse = !0
					} else recurse = !1
				}
			}
			drainQueueLaterOnExecutor() {
				this.currentScheduler.scheduleTask(
					this.run,
					this.getFiberRef(currentSchedulingPriority),
					this,
				)
			}
			drainQueueWhileRunning(runtimeFlags, cur0) {
				let cur = cur0
				for (; this._queue.length > 0;) {
					const message = this._queue.splice(0, 1)[0]
					cur = drainQueueWhileRunningTable[message._tag](
						this,
						runtimeFlags,
						cur,
						message,
					)
				}
				return cur
			}
			isInterrupted() {
				return !(self =>
					"Empty" === self._tag ||
					cause_reduce(self, !0, (acc, cause) => {
						switch (cause._tag) {
							case "Empty":
								return Option_some(acc)
							case "Die":
							case "Fail":
							case "Interrupt":
								return Option_some(!1)
							default:
								return Option_none()
						}
					}))(this.getFiberRef(currentInterruptedCause))
			}
			addInterruptedCause(cause) {
				const oldSC = this.getFiberRef(currentInterruptedCause)
				this.setFiberRef(currentInterruptedCause, sequential(oldSC, cause))
			}
			processNewInterruptSignal(cause) {
				this.addInterruptedCause(cause)
				this.sendInterruptSignalToAllChildren()
			}
			sendInterruptSignalToAllChildren() {
				if (null === this._children || 0 === this._children.size) return !1
				let told = !1
				for (const child of this._children) {
					child.tell(interruptSignal(interrupt(this.id())))
					told = !0
				}
				return told
			}
			interruptAllChildren() {
				if (this.sendInterruptSignalToAllChildren()) {
					const it = this._children.values()
					this._children = null
					let isDone = !1
					return whileLoop({
						while: () => !isDone,
						body: () => {
							const next = it.next()
							return next.done
								? sync(() => {
										isDone = !0
									})
								: core_asVoid(next.value.await)
						},
						step: () => {},
					})
				}
				return null
			}
			reportExitValue(exit) {
				if (runtimeMetrics(this.currentRuntimeFlags)) {
					const tags = this.getFiberRef(currentMetricLabels),
						startTimeMillis = this.id().startTimeMillis,
						endTimeMillis = Date.now()
					fiberLifetimes.unsafeUpdate(endTimeMillis - startTimeMillis, tags)
					fiberActive.unsafeUpdate(-1, tags)
					switch (exit._tag) {
						case "Success":
							fiberSuccesses.unsafeUpdate(1, tags)
							break
						case "Failure":
							fiberFailures.unsafeUpdate(1, tags)
					}
				}
				if ("Failure" === exit._tag) {
					const level = this.getFiberRef(currentUnhandledErrorLogLevel)
					isInterruptedOnly(exit.cause) ||
						"Some" !== level._tag ||
						this.log(
							"Fiber terminated with an unhandled error",
							exit.cause,
							level,
						)
				}
			}
			setExitValue(exit) {
				this._exitValue = exit
				this.reportExitValue(exit)
				for (let i = this._observers.length - 1; i >= 0; i--)
					this._observers[i](exit)
				this._observers = []
			}
			getLoggers() {
				return this.getFiberRef(currentLoggers)
			}
			log(message, cause, overrideLogLevel) {
				const logLevel = Option_isSome(overrideLogLevel)
						? overrideLogLevel.value
						: this.getFiberRef(currentLogLevel),
					minimumLogLevel = this.getFiberRef(currentMinimumLogLevel)
				if (LogLevel_greaterThan(minimumLogLevel, logLevel)) return
				const spans = this.getFiberRef(currentLogSpan),
					annotations = this.getFiberRef(currentLogAnnotations),
					loggers = this.getLoggers(),
					contextMap = this.getFiberRefs()
				if (HashSet_size(loggers) > 0) {
					const clockService = Context_get(
							this.getFiberRef(currentServices),
							clockTag,
						),
						date = new Date(clockService.unsafeCurrentTimeMillis())
					;((context, f) => {
						const prev = redactableState.fiberRefs
						redactableState.fiberRefs = context
						try {
							return f()
						} finally {
							redactableState.fiberRefs = prev
						}
					})(contextMap, () => {
						for (const logger of loggers)
							logger.log({
								fiberId: this.id(),
								logLevel,
								message,
								cause,
								context: contextMap,
								spans,
								annotations,
								date,
							})
					})
				}
			}
			evaluateMessageWhileSuspended(message) {
				switch (message._tag) {
					case "YieldNow":
						return "Yield"
					case "InterruptSignal":
						this.processNewInterruptSignal(message.cause)
						if (null !== this._asyncInterruptor) {
							this._asyncInterruptor(exitFailCause(message.cause))
							this._asyncInterruptor = null
						}
						return "Continue"
					case "Resume":
						this._asyncInterruptor = null
						this._asyncBlockingOn = null
						this.evaluateEffect(message.effect)
						return "Continue"
					case "Stateful":
						message.onFiber(
							this,
							null !== this._exitValue
								? FiberStatus_done
								: ((runtimeFlags = this.currentRuntimeFlags),
									(blockingOn = this._asyncBlockingOn),
									new Suspended(runtimeFlags, blockingOn)),
						)
						return "Continue"
					default:
						return fiberRuntime_absurd(message)
				}
				var runtimeFlags, blockingOn
			}
			evaluateEffect(effect0) {
				this.currentSupervisor.onResume(this)
				try {
					let effect =
						interruptible(this.currentRuntimeFlags) && this.isInterrupted()
							? exitFailCause(this.getInterruptedCause())
							: effect0
					for (; null !== effect;) {
						const eff = effect,
							exit = this.runLoop(eff)
						if (exit === YieldedOp) {
							const op = yieldedOpChannel.currentOp
							yieldedOpChannel.currentOp = null
							if ("Yield" === op._op)
								if (cooperativeYielding(this.currentRuntimeFlags)) {
									this.tell({ _tag: "YieldNow" })
									this.tell(resume(exitVoid))
									effect = null
								} else effect = exitVoid
							else "Async" === op._op && (effect = null)
						} else {
							this.currentRuntimeFlags = pipe(
								this.currentRuntimeFlags,
								runtimeFlags_enable(16),
							)
							const interruption = this.interruptAllChildren()
							if (null !== interruption)
								effect = core_flatMap(interruption, () => exit)
							else {
								0 === this._queue.length
									? this.setExitValue(exit)
									: this.tell(resume(exit))
								effect = null
							}
						}
					}
				} finally {
					this.currentSupervisor.onSuspend(this)
				}
			}
			start(effect) {
				if (this._running) this.tell(resume(effect))
				else {
					this._running = !0
					const prev = globalThis[currentFiberURI]
					globalThis[currentFiberURI] = this
					try {
						this.evaluateEffect(effect)
					} finally {
						this._running = !1
						globalThis[currentFiberURI] = prev
						this._queue.length > 0 && this.drainQueueLaterOnExecutor()
					}
				}
			}
			startFork(effect) {
				this.tell(resume(effect))
			}
			patchRuntimeFlags(oldRuntimeFlags, patch) {
				const newRuntimeFlags = runtimeFlags_patch(oldRuntimeFlags, patch)
				globalThis[currentFiberURI] = this
				this.currentRuntimeFlags = newRuntimeFlags
				return newRuntimeFlags
			}
			initiateAsync(runtimeFlags, asyncRegister) {
				let alreadyCalled = !1
				const callback = effect => {
					if (!alreadyCalled) {
						alreadyCalled = !0
						this.tell(resume(effect))
					}
				}
				interruptible(runtimeFlags) && (this._asyncInterruptor = callback)
				try {
					asyncRegister(callback)
				} catch (e) {
					callback(failCause(die(e)))
				}
			}
			pushStack(cont) {
				this._stack.push(cont)
				"OnStep" === cont._op &&
					this._steps.push({
						refs: this.getFiberRefs(),
						flags: this.currentRuntimeFlags,
					})
			}
			popStack() {
				const item = this._stack.pop()
				if (item) {
					"OnStep" === item._op && this._steps.pop()
					return item
				}
			}
			getNextSuccessCont() {
				let frame = this.popStack()
				for (; frame;) {
					if ("OnFailure" !== frame._op) return frame
					frame = this.popStack()
				}
			}
			getNextFailCont() {
				let frame = this.popStack()
				for (; frame;) {
					if (
						"OnSuccess" !== frame._op &&
						"While" !== frame._op &&
						"Iterator" !== frame._op
					)
						return frame
					frame = this.popStack()
				}
			}
			Tag(op) {
				return sync(() => Context_unsafeGet(this.currentContext, op))
			}
			Left(op) {
				return core_fail(op.left)
			}
			None(_) {
				return core_fail(new NoSuchElementException())
			}
			Right(op) {
				return exitSucceed(op.right)
			}
			Some(op) {
				return exitSucceed(op.value)
			}
			Micro(op) {
				return unsafeAsync(microResume => {
					let resume = microResume
					const fiber = (effect => {
						const fiber = new MicroFiberImpl(
							CurrentScheduler.context(new MicroSchedulerDefault()),
						)
						fiber.evaluate(effect)
						undefined
						return fiber
					})(Micro_provideContext(op, this.currentContext))
					fiber.addObserver(exit => {
						if ("Success" === exit._tag) return resume(exitSucceed(exit.value))
						switch (exit.cause._tag) {
							case "Interrupt":
								return resume(exitFailCause(interrupt(FiberId_none)))
							case "Fail":
								return resume(core_fail(exit.cause.error))
							case "Die":
								return resume(core_die(exit.cause.defect))
						}
					})
					return unsafeAsync(abortResume => {
						resume = _ => {
							abortResume(core_void_)
						}
						fiber.unsafeInterrupt()
					})
				})
			}
			Sync(op) {
				const value = internalCall(() => op.effect_instruction_i0()),
					cont = this.getNextSuccessCont()
				if (void 0 !== cont) {
					cont._op in contOpSuccess || fiberRuntime_absurd(cont)
					return contOpSuccess[cont._op](this, cont, value)
				}
				yieldedOpChannel.currentOp = exitSucceed(value)
				return YieldedOp
			}
			[OP_SUCCESS](op) {
				const oldCur = op,
					cont = this.getNextSuccessCont()
				if (void 0 !== cont) {
					cont._op in contOpSuccess || fiberRuntime_absurd(cont)
					return contOpSuccess[cont._op](
						this,
						cont,
						oldCur.effect_instruction_i0,
					)
				}
				yieldedOpChannel.currentOp = oldCur
				return YieldedOp
			}
			[OP_FAILURE](op) {
				const cause = op.effect_instruction_i0,
					cont = this.getNextFailCont()
				if (void 0 === cont) {
					yieldedOpChannel.currentOp = exitFailCause(cause)
					return YieldedOp
				}
				switch (cont._op) {
					case "OnFailure":
					case "OnSuccessAndFailure":
						return interruptible(this.currentRuntimeFlags) &&
							this.isInterrupted()
							? exitFailCause(stripFailures(cause))
							: internalCall(() => cont.effect_instruction_i1(cause))
					case "OnStep":
						return interruptible(this.currentRuntimeFlags) &&
							this.isInterrupted()
							? exitFailCause(stripFailures(cause))
							: exitSucceed(exitFailCause(cause))
					case "RevertFlags":
						this.patchRuntimeFlags(this.currentRuntimeFlags, cont.patch)
						return interruptible(this.currentRuntimeFlags) &&
							this.isInterrupted()
							? exitFailCause(sequential(cause, this.getInterruptedCause()))
							: exitFailCause(cause)
					default:
						fiberRuntime_absurd(cont)
				}
			}
			[OP_WITH_RUNTIME](op) {
				return internalCall(() =>
					op.effect_instruction_i0(
						this,
						FiberStatus_running(this.currentRuntimeFlags),
					),
				)
			}
			Blocked(op) {
				const refs = this.getFiberRefs(),
					flags = this.currentRuntimeFlags
				if (this._steps.length > 0) {
					const frames = [],
						snap = this._steps[this._steps.length - 1]
					let frame = this.popStack()
					for (; frame && "OnStep" !== frame._op;) {
						frames.push(frame)
						frame = this.popStack()
					}
					this.setFiberRefs(snap.refs)
					this.currentRuntimeFlags = snap.flags
					const patchRefs = FiberRefsPatch_diff(snap.refs, refs),
						patchFlags = runtimeFlags_diff(snap.flags, flags)
					return exitSucceed(
						blocked(
							op.effect_instruction_i0,
							withFiberRuntime(newFiber => {
								for (; frames.length > 0;) newFiber.pushStack(frames.pop())
								newFiber.setFiberRefs(
									FiberRefsPatch_patch(
										newFiber.id(),
										newFiber.getFiberRefs(),
									)(patchRefs),
								)
								newFiber.currentRuntimeFlags = runtimeFlags_patch(patchFlags)(
									newFiber.currentRuntimeFlags,
								)
								return op.effect_instruction_i1
							}),
						),
					)
				}
				return uninterruptibleMask(restore =>
					core_flatMap(
						fiberRuntime_forkDaemon(
							(blockedRequests => {
								const effect = new EffectPrimitive("RunBlocked")
								effect.effect_instruction_i0 = blockedRequests
								return effect
							})(op.effect_instruction_i0),
						),
						() => restore(op.effect_instruction_i1),
					),
				)
			}
			RunBlocked(op) {
				return (self =>
					forEachSequentialDiscard(
						(self => {
							let current = List_of(self),
								updated = List_empty()
							for (;;) {
								const [parallel, sequential] = List_reduce(
									current,
									[parallelCollectionEmpty(), List_empty()],
									([parallel, sequential], blockedRequest) => {
										const [par, seq] = blockedRequests_step(blockedRequest)
										return [
											parallelCollectionCombine(parallel, par),
											List_appendAll(sequential, seq),
										]
									},
								)
								updated = blockedRequests_merge(updated, parallel)
								if (isNil(sequential)) return List_reverse(updated)
								current = sequential
							}
							throw new Error(
								"BUG: BlockedRequests.flatten - please report an issue at https://github.com/Effect-TS/effect/issues",
							)
						})(self),
						requestsByRequestResolver =>
							forEachConcurrentDiscard(
								(self => Array.from(self.map))(requestsByRequestResolver),
								([dataSource, sequential]) => {
									const map = new Map(),
										arr = []
									for (const block of sequential) {
										arr.push(toReadonlyArray(block))
										for (const entry of block) map.set(entry.request, entry)
									}
									const flat = arr.flat()
									return fiberRefLocally(
										invokeWithInterrupt(dataSource.runAll(arr), flat, () =>
											flat.forEach(entry => {
												entry.listeners.interrupted = !0
											}),
										),
										currentRequestMap,
										map,
									)
								},
								!1,
								!1,
							),
					))(op.effect_instruction_i0)
			}
			[OP_UPDATE_RUNTIME_FLAGS](op) {
				const updateFlags = op.effect_instruction_i0,
					oldRuntimeFlags = this.currentRuntimeFlags,
					newRuntimeFlags = runtimeFlags_patch(oldRuntimeFlags, updateFlags)
				if (interruptible(newRuntimeFlags) && this.isInterrupted())
					return exitFailCause(this.getInterruptedCause())
				this.patchRuntimeFlags(this.currentRuntimeFlags, updateFlags)
				if (op.effect_instruction_i1) {
					const revertFlags = runtimeFlags_diff(
						newRuntimeFlags,
						oldRuntimeFlags,
					)
					this.pushStack(new RevertFlags(revertFlags, op))
					return internalCall(() => op.effect_instruction_i1(oldRuntimeFlags))
				}
				return exitVoid
			}
			[OP_ON_SUCCESS](op) {
				this.pushStack(op)
				return op.effect_instruction_i0
			}
			OnStep(op) {
				this.pushStack(op)
				return op.effect_instruction_i0
			}
			[OP_ON_FAILURE](op) {
				this.pushStack(op)
				return op.effect_instruction_i0
			}
			[OP_ON_SUCCESS_AND_FAILURE](op) {
				this.pushStack(op)
				return op.effect_instruction_i0
			}
			Async(op) {
				this._asyncBlockingOn = op.effect_instruction_i1
				this.initiateAsync(this.currentRuntimeFlags, op.effect_instruction_i0)
				yieldedOpChannel.currentOp = op
				return YieldedOp
			}
			Yield(op) {
				this._isYielding = !1
				yieldedOpChannel.currentOp = op
				return YieldedOp
			}
			While(op) {
				const check = op.effect_instruction_i0,
					body = op.effect_instruction_i1
				if (check()) {
					this.pushStack(op)
					return body()
				}
				return exitVoid
			}
			[OP_ITERATOR](op) {
				return contOpSuccess.Iterator(this, op, void 0)
			}
			Commit(op) {
				return internalCall(() => op.commit())
			}
			runLoop(effect0) {
				let cur = effect0
				this.currentOpCount = 0
				for (;;) {
					2 & this.currentRuntimeFlags &&
						this.currentSupervisor.onEffect(this, cur)
					this._queue.length > 0 &&
						(cur = this.drainQueueWhileRunning(this.currentRuntimeFlags, cur))
					if (!this._isYielding) {
						this.currentOpCount += 1
						const shouldYield = this.currentScheduler.shouldYield(this)
						if (!1 !== shouldYield) {
							this._isYielding = !0
							this.currentOpCount = 0
							const oldCur = cur
							cur = core_flatMap(
								yieldNow({ priority: shouldYield }),
								() => oldCur,
							)
						}
					}
					try {
						cur = this.currentTracer.context(() => {
							if (_version !== cur[core_EffectTypeId]._V) {
								const level = this.getFiberRef(
									currentVersionMismatchErrorLogLevel,
								)
								if ("Some" === level._tag) {
									const effectVersion = cur[core_EffectTypeId]._V
									this.log(
										`Executing an Effect versioned ${effectVersion} with a Runtime of version 3.21.4, you may want to dedupe the effect dependencies, you can use the language service plugin to detect this at compile time: https://github.com/Effect-TS/language-service`,
										cause_empty,
										level,
									)
								}
							}
							return this[cur._op](cur)
						}, this)
						if (cur === YieldedOp) {
							const op = yieldedOpChannel.currentOp
							if ("Yield" === op._op || "Async" === op._op) return YieldedOp
							yieldedOpChannel.currentOp = null
							return "Success" === op._op || "Failure" === op._op
								? op
								: exitFailCause(die(op))
						}
					} catch (e) {
						cur =
							(cur !== YieldedOp && !hasProperty(cur, "_op")) ||
							!(cur._op in this)
								? dieMessage(`Not a valid effect: ${toStringUnknown(cur)}`)
								: isInterruptedException(e)
									? exitFailCause(sequential(die(e), interrupt(FiberId_none)))
									: core_die(e)
					}
				}
			}
			run = () => {
				this.drainQueueOnCurrentThread()
			}
		}
		const currentMinimumLogLevel = globalValue(
				"effect/FiberRef/currentMinimumLogLevel",
				() => fiberRefUnsafeMake(Info),
			),
			defaultLogger = globalValue(
				Symbol.for("effect/Logger/defaultLogger"),
				() =>
					(self =>
						makeLogger(opts => {
							const services = FiberRefs_getOrDefault(
								opts.context,
								currentServices,
							)
							Context_get(services, consoleTag).unsafe.log(self.log(opts))
						}))(stringLogger),
			),
			tracerLogger = globalValue(Symbol.for("effect/Logger/tracerLogger"), () =>
				makeLogger(
					({ annotations, cause, context, fiberId, logLevel, message }) => {
						const span = filterDisablePropagation(
							Context_getOption(getOrDefault(context, currentContext), spanTag),
						)
						if ("None" === span._tag || "ExternalSpan" === span.value._tag)
							return
						const clockService = Context_unsafeGet(
								getOrDefault(context, currentServices),
								clockTag,
							),
							attributes = {}
						for (const [key, value] of annotations) attributes[key] = value
						attributes["effect.fiberId"] = FiberId_threadName(fiberId)
						attributes["effect.logLevel"] = logLevel.label
						null !== cause &&
							"Empty" !== cause._tag &&
							(attributes["effect.cause"] = pretty(cause, {
								renderErrorCause: !0,
							}))
						span.value.event(
							toStringUnknown(
								Array.isArray(message) && 1 === message.length
									? message[0]
									: message,
							),
							clockService.unsafeCurrentTimeNanos(),
							attributes,
						)
					},
				),
			),
			currentLoggers = globalValue(
				Symbol.for("effect/FiberRef/currentLoggers"),
				() =>
					(initial => {
						const differ = differ_make({
							empty: differ_hashSetPatch_empty(),
							combine: (first, second) => hashSetPatch_combine(second)(first),
							diff: (oldValue, newValue) =>
								((oldValue, newValue) => {
									const [removed, patch] = HashSet_reduce(
										[oldValue, differ_hashSetPatch_empty()],
										([set, patch], value) =>
											HashSet_has(value)(set)
												? [HashSet_remove(value)(set), patch]
												: [
														set,
														hashSetPatch_combine(hashSetPatch_makeAdd(value))(
															patch,
														),
													],
									)(newValue)
									return HashSet_reduce(patch, (patch, value) =>
										hashSetPatch_combine(
											(value => {
												const o = Object.create(hashSetPatch_RemoveProto)
												o.value = value
												return o
											})(value),
										)(patch),
									)(removed)
								})(oldValue, newValue),
							patch: (patch, oldValue) => hashSetPatch_patch(oldValue)(patch),
						})
						return fiberRefUnsafeMakePatch(initial, {
							differ,
							fork: differ.empty,
						})
					})(HashSet_make(defaultLogger, tracerLogger)),
			),
			fiberRuntime_acquireRelease = dual(
				args => isEffect(args[0]),
				(acquire, release) =>
					uninterruptible(
						core_tap(acquire, a =>
							fiberRuntime_addFinalizer(exit => release(a, exit)),
						),
					),
			),
			fiberRuntime_addFinalizer = finalizer =>
				withFiberRuntime(runtime => {
					const acquireRefs = runtime.getFiberRefs(),
						acquireFlags = runtimeFlags_disable(runtime.currentRuntimeFlags, 1)
					return core_flatMap(fiberRuntime_scope, scope =>
						scopeAddFinalizerExit(scope, exit =>
							withFiberRuntime(runtimeFinalizer => {
								const preRefs = runtimeFinalizer.getFiberRefs(),
									preFlags = runtimeFinalizer.currentRuntimeFlags,
									patchRefs = FiberRefsPatch_diff(preRefs, acquireRefs),
									patchFlags = runtimeFlags_diff(preFlags, acquireFlags),
									inverseRefs = FiberRefsPatch_diff(acquireRefs, preRefs)
								runtimeFinalizer.setFiberRefs(
									FiberRefsPatch_patch(
										patchRefs,
										runtimeFinalizer.id(),
										acquireRefs,
									),
								)
								return fiberRuntime_ensuring(
									withRuntimeFlags(finalizer(exit), patchFlags),
									sync(() => {
										runtimeFinalizer.setFiberRefs(
											FiberRefsPatch_patch(
												inverseRefs,
												runtimeFinalizer.id(),
												runtimeFinalizer.getFiberRefs(),
											),
										)
									}),
								)
							}),
						),
					)
				}),
			fiberRuntime_all = (arg, options) => {
				const [effects, reconcile] = (input => {
					if (Array.isArray(input) || isIterable(input))
						return [input, Option_none()]
					const keys = Object.keys(input),
						size = keys.length
					return [
						keys.map(k => input[k]),
						Option_some(values => {
							const res = {}
							for (let i = 0; i < size; i++) res[keys[i]] = values[i]
							return res
						}),
					]
				})(arg)
				return "validate" === options?.mode
					? ((effects, reconcile, options) => {
							const eitherEffects = []
							for (const effect of effects)
								eitherEffects.push(core_either(effect))
							return core_flatMap(
								fiberRuntime_forEach(eitherEffects, identity, {
									concurrency: options?.concurrency,
									batching: options?.batching,
									concurrentFinalizers: options?.concurrentFinalizers,
								}),
								eithers => {
									const none = Option_none(),
										size = eithers.length,
										errors = new Array(size),
										successes = new Array(size)
									let errored = !1
									for (let i = 0; i < size; i++) {
										const either = eithers[i]
										if ("Left" === either._tag) {
											errors[i] = Option_some(either.left)
											errored = !0
										} else {
											successes[i] = either.right
											errors[i] = none
										}
									}
									return errored
										? "Some" === reconcile._tag
											? core_fail(reconcile.value(errors))
											: core_fail(errors)
										: options?.discard
											? core_void_
											: "Some" === reconcile._tag
												? succeed(reconcile.value(successes))
												: succeed(successes)
								},
							)
						})(effects, reconcile, options)
					: "either" === options?.mode
						? ((effects, reconcile, options) => {
								const eitherEffects = []
								for (const effect of effects)
									eitherEffects.push(core_either(effect))
								return options?.discard
									? fiberRuntime_forEach(eitherEffects, identity, {
											concurrency: options?.concurrency,
											batching: options?.batching,
											discard: !0,
											concurrentFinalizers: options?.concurrentFinalizers,
										})
									: core_map(
											fiberRuntime_forEach(eitherEffects, identity, {
												concurrency: options?.concurrency,
												batching: options?.batching,
												concurrentFinalizers: options?.concurrentFinalizers,
											}),
											eithers =>
												"Some" === reconcile._tag
													? reconcile.value(eithers)
													: eithers,
										)
							})(effects, reconcile, options)
						: !0 !== options?.discard && "Some" === reconcile._tag
							? core_map(
									fiberRuntime_forEach(effects, identity, options),
									reconcile.value,
								)
							: fiberRuntime_forEach(effects, identity, options)
			},
			fiberRuntime_forEach = dual(
				args => isIterable(args[0]),
				(self, f, options) =>
					withFiberRuntime(r => {
						const isRequestBatchingEnabled =
							!0 === options?.batching ||
							("inherit" === options?.batching &&
								r.getFiberRef(currentRequestBatching))
						return options?.discard
							? concurrency_match(
									options.concurrency,
									() =>
										finalizersMaskInternal(
											ExecutionStrategy_sequential,
											options?.concurrentFinalizers,
										)(restore =>
											isRequestBatchingEnabled
												? forEachConcurrentDiscard(
														self,
														(a, i) => restore(f(a, i)),
														!0,
														!1,
														1,
													)
												: forEachSequentialDiscard(self, (a, i) =>
														restore(f(a, i)),
													),
										),
									() =>
										finalizersMaskInternal(
											ExecutionStrategy_parallel,
											options?.concurrentFinalizers,
										)(restore =>
											forEachConcurrentDiscard(
												self,
												(a, i) => restore(f(a, i)),
												isRequestBatchingEnabled,
												!1,
											),
										),
									n =>
										finalizersMaskInternal(
											ExecutionStrategy_parallelN(n),
											options?.concurrentFinalizers,
										)(restore =>
											forEachConcurrentDiscard(
												self,
												(a, i) => restore(f(a, i)),
												isRequestBatchingEnabled,
												!1,
												n,
											),
										),
								)
							: concurrency_match(
									options?.concurrency,
									() =>
										finalizersMaskInternal(
											ExecutionStrategy_sequential,
											options?.concurrentFinalizers,
										)(restore =>
											isRequestBatchingEnabled
												? forEachParN(self, 1, (a, i) => restore(f(a, i)), !0)
												: forEachSequential(self, (a, i) => restore(f(a, i))),
										),
									() =>
										finalizersMaskInternal(
											ExecutionStrategy_parallel,
											options?.concurrentFinalizers,
										)(restore =>
											forEachParUnbounded(
												self,
												(a, i) => restore(f(a, i)),
												isRequestBatchingEnabled,
											),
										),
									n =>
										finalizersMaskInternal(
											ExecutionStrategy_parallelN(n),
											options?.concurrentFinalizers,
										)(restore =>
											forEachParN(
												self,
												n,
												(a, i) => restore(f(a, i)),
												isRequestBatchingEnabled,
											),
										),
								)
					}),
			),
			forEachParUnbounded = (self, f, batching) =>
				suspend(() => {
					const as = Array_fromIterable(self),
						array = new Array(as.length)
					return core_zipRight(
						forEachConcurrentDiscard(
							as,
							(a, i) => core_flatMap(f(a, i), b => sync(() => (array[i] = b))),
							batching,
							!1,
						),
						succeed(array),
					)
				}),
			forEachConcurrentDiscard = (self, f, batching, processAll, n) =>
				uninterruptibleMask(restore =>
					(f =>
						withFiberRuntime(state => {
							const scope = pipe(
								state.getFiberRef(currentForkScopeOverride),
								Option_getOrElse(() => state.scope()),
							)
							return f(
								fiberRefLocally(currentForkScopeOverride, Option_some(scope)),
							)
						}))(graft =>
						withFiberRuntime(parent => {
							let todos = Array.from(self).reverse(),
								target = todos.length
							if (0 === target) return core_void_
							let counter = 0,
								interrupted = !1
							const fibersCount = n ? Math.min(todos.length, n) : todos.length,
								fibers = new Set(),
								results = new Array(),
								startOrder = new Array(),
								joinOrder = new Array(),
								residual = new Array(),
								collectExits = () => {
									const exits = results
										.filter(({ exit }) => "Failure" === exit._tag)
										.sort((a, b) =>
											a.index < b.index ? -1 : a.index === b.index ? 0 : 1,
										)
										.map(({ exit }) => exit)
									0 === exits.length && exits.push(exitVoid)
									return exits
								},
								runFiber = (eff, interruptImmediately = !1) => {
									const runnable = uninterruptible(graft(eff)),
										fiber = unsafeForkUnstarted(
											runnable,
											parent,
											parent.currentRuntimeFlags,
											globalScope,
										)
									parent.currentScheduler.scheduleTask(
										() => {
											interruptImmediately &&
												fiber.unsafeInterruptAsFork(parent.id())
											fiber.resume(runnable)
										},
										0,
										fiber,
									)
									return fiber
								},
								onInterruptSignal = () => {
									if (!processAll) {
										target -= todos.length
										todos = []
									}
									interrupted = !0
									fibers.forEach(fiber => {
										fiber.currentScheduler.scheduleTask(
											() => {
												fiber.unsafeInterruptAsFork(parent.id())
											},
											0,
											fiber,
										)
									})
								},
								stepOrExit = batching ? step : core_exit,
								processingFiber = runFiber(
									async_(resume => {
										const pushResult = (res, index) => {
												if ("Blocked" === res._op) residual.push(res)
												else {
													results.push({ index, exit: res })
													"Failure" !== res._op ||
														interrupted ||
														onInterruptSignal()
												}
											},
											next = () => {
												if (todos.length > 0) {
													const a = todos.pop()
													let index = counter++
													const returnNextElement = () => {
															const a = todos.pop()
															index = counter++
															return core_flatMap(yieldNow(), () =>
																core_flatMap(
																	stepOrExit(restore(f(a, index))),
																	onRes,
																),
															)
														},
														onRes = res => {
															if (todos.length > 0) {
																pushResult(res, index)
																if (todos.length > 0) return returnNextElement()
															}
															return succeed(res)
														},
														todo = core_flatMap(
															stepOrExit(restore(f(a, index))),
															onRes,
														),
														fiber = runFiber(todo)
													startOrder.push(fiber)
													fibers.add(fiber)
													interrupted &&
														fiber.currentScheduler.scheduleTask(
															() => {
																fiber.unsafeInterruptAsFork(parent.id())
															},
															0,
															fiber,
														)
													fiber.addObserver(wrapped => {
														let exit
														exit =
															"Failure" === wrapped._op
																? wrapped
																: wrapped.effect_instruction_i0
														joinOrder.push(fiber)
														fibers.delete(fiber)
														pushResult(exit, index)
														if (results.length === target)
															resume(
																succeed(
																	Option_getOrElse(
																		exitCollectAll(collectExits(), {
																			parallel: !0,
																		}),
																		() => exitVoid,
																	),
																),
															)
														else if (
															residual.length + results.length ===
															target
														) {
															const exits = collectExits(),
																requests = residual
																	.map(blocked => blocked.effect_instruction_i0)
																	.reduce(par)
															resume(
																succeed(
																	blocked(
																		requests,
																		forEachConcurrentDiscard(
																			[
																				Option_getOrElse(
																					exitCollectAll(exits, {
																						parallel: !0,
																					}),
																					() => exitVoid,
																				),
																				...residual.map(
																					blocked =>
																						blocked.effect_instruction_i1,
																				),
																			],
																			i => i,
																			batching,
																			!0,
																			n,
																		),
																	),
																),
															)
														} else next()
													})
												}
											}
										for (let i = 0; i < fibersCount; i++) next()
									}),
								)
							return core_asVoid(
								onExit(
									core_flatten(restore(fiber_join(processingFiber))),
									exitMatch({
										onFailure: cause => {
											onInterruptSignal()
											const target = residual.length + 1,
												concurrency = Math.min(
													"number" == typeof n ? n : residual.length,
													residual.length,
												),
												toPop = Array.from(residual)
											return async_(cb => {
												const exits = []
												let count = 0,
													index = 0
												const check = (index, hitNext) => exit => {
														exits[index] = exit
														count++
														count === target &&
															cb(exitSucceed(exitFailCause(cause)))
														toPop.length > 0 && hitNext && next()
													},
													next = () => {
														runFiber(toPop.pop(), !0).addObserver(
															check(index, !0),
														)
														index++
													}
												processingFiber.addObserver(check(index, !1))
												index++
												for (let i = 0; i < concurrency; i++) next()
											})
										},
										onSuccess: () =>
											forEachSequential(joinOrder, f => f.inheritAll),
									}),
								),
							)
						}),
					),
				),
			forEachParN = (self, n, f, batching) =>
				suspend(() => {
					const as = Array_fromIterable(self),
						array = new Array(as.length)
					return core_zipRight(
						forEachConcurrentDiscard(
							as,
							(a, i) => core_map(f(a, i), b => (array[i] = b)),
							batching,
							!1,
							n,
						),
						succeed(array),
					)
				}),
			fiberRuntime_forkDaemon = self =>
				forkWithScopeOverride(self, globalScope),
			fiberRuntime_unsafeFork = (
				effect,
				parentFiber,
				parentRuntimeFlags,
				overrideScope = null,
			) => {
				const childFiber = unsafeMakeChildFiber(
					effect,
					parentFiber,
					parentRuntimeFlags,
					overrideScope,
				)
				childFiber.resume(effect)
				return childFiber
			},
			unsafeForkUnstarted = (
				effect,
				parentFiber,
				parentRuntimeFlags,
				overrideScope = null,
			) =>
				unsafeMakeChildFiber(
					effect,
					parentFiber,
					parentRuntimeFlags,
					overrideScope,
				),
			unsafeMakeChildFiber = (
				effect,
				parentFiber,
				parentRuntimeFlags,
				overrideScope = null,
			) => {
				const childId = FiberId_unsafeMake(),
					parentFiberRefs = parentFiber.getFiberRefs(),
					childFiberRefs = forkAs(parentFiberRefs, childId),
					childFiber = new FiberRuntime(
						childId,
						childFiberRefs,
						parentRuntimeFlags,
					),
					childContext = getOrDefault(childFiberRefs, currentContext),
					supervisor = childFiber.currentSupervisor
				supervisor.onStart(
					childContext,
					effect,
					Option_some(parentFiber),
					childFiber,
				)
				childFiber.addObserver(exit => supervisor.onEnd(exit, childFiber))
				;(null !== overrideScope
					? overrideScope
					: pipe(
							parentFiber.getFiberRef(currentForkScopeOverride),
							Option_getOrElse(() => parentFiber.scope()),
						)
				).add(parentRuntimeFlags, childFiber)
				return childFiber
			},
			forkWithScopeOverride = (self, scopeOverride) =>
				withFiberRuntime((parentFiber, parentStatus) =>
					succeed(
						fiberRuntime_unsafeFork(
							self,
							parentFiber,
							parentStatus.runtimeFlags,
							scopeOverride,
						),
					),
				),
			parallelFinalizers = self =>
				contextWithEffect(context =>
					Option_match(Context_getOption(context, scopeTag), {
						onNone: () => self,
						onSome: scope => {
							switch (scope.strategy._tag) {
								case "Parallel":
									return self
								case "Sequential":
								case "ParallelN":
									return core_flatMap(
										scopeFork(scope, ExecutionStrategy_parallel),
										inner => scopeExtend(self, inner),
									)
							}
						},
					}),
				),
			parallelNFinalizers = parallelism => self =>
				contextWithEffect(context =>
					Option_match(Context_getOption(context, scopeTag), {
						onNone: () => self,
						onSome: scope =>
							"ParallelN" === scope.strategy._tag &&
							scope.strategy.parallelism === parallelism
								? self
								: core_flatMap(
										scopeFork(scope, ExecutionStrategy_parallelN(parallelism)),
										inner => scopeExtend(self, inner),
									),
					}),
				),
			finalizersMaskInternal = (strategy, concurrentFinalizers) => self =>
				contextWithEffect(context =>
					Option_match(Context_getOption(context, scopeTag), {
						onNone: () => self(identity),
						onSome: scope => {
							if (!0 !== concurrentFinalizers) return self(identity)
							{
								const patch =
									"Parallel" === strategy._tag
										? parallelFinalizers
										: "Sequential" === strategy._tag
											? sequentialFinalizers
											: parallelNFinalizers(strategy.parallelism)
								switch (scope.strategy._tag) {
									case "Parallel":
										return patch(self(parallelFinalizers))
									case "Sequential":
										return patch(self(sequentialFinalizers))
									case "ParallelN":
										return patch(
											self(parallelNFinalizers(scope.strategy.parallelism)),
										)
								}
							}
						},
					}),
				),
			scopeWith = f => core_flatMap(scopeTag, f),
			scopedWith = f =>
				core_flatMap(fiberRuntime_scopeMake(), scope =>
					onExit(f(scope), exit => scope.close(exit)),
				),
			sequentialFinalizers = self =>
				contextWithEffect(context =>
					Option_match(Context_getOption(context, scopeTag), {
						onNone: () => self,
						onSome: scope => {
							switch (scope.strategy._tag) {
								case "Sequential":
									return self
								case "Parallel":
								case "ParallelN":
									return core_flatMap(
										scopeFork(scope, ExecutionStrategy_sequential),
										inner => scopeExtend(self, inner),
									)
							}
						},
					}),
				),
			zipOptions = dual(
				args => isEffect(args[1]),
				(self, that, options) =>
					zipWithOptions(self, that, (a, b) => [a, b], options),
			),
			zipLeftOptions = dual(
				args => isEffect(args[1]),
				(self, that, options) =>
					!0 === options?.concurrent ||
					(void 0 !== options?.batching && !1 !== options.batching)
						? zipWithOptions(self, that, (a, _) => a, options)
						: core_zipLeft(self, that),
			),
			zipRightOptions = dual(
				args => isEffect(args[1]),
				(self, that, options) =>
					!0 === options?.concurrent ||
					(void 0 !== options?.batching && !1 !== options.batching)
						? zipWithOptions(self, that, (_, b) => b, options)
						: core_zipRight(self, that),
			),
			zipWithOptions = dual(
				args => isEffect(args[1]),
				(self, that, f, options) =>
					core_map(
						fiberRuntime_all([self, that], {
							concurrency: options?.concurrent ? 2 : 1,
							batching: options?.batching,
							concurrentFinalizers: options?.concurrentFinalizers,
						}),
						([a, a2]) => f(a, a2),
					),
			),
			scopeTag = GenericTag("effect/Scope"),
			fiberRuntime_scope = scopeTag,
			ScopeImplProto = {
				[ScopeTypeId]: ScopeTypeId,
				[CloseableScopeTypeId]: CloseableScopeTypeId,
				pipe() {
					return pipeArguments(this, arguments)
				},
				fork(strategy) {
					return sync(() => {
						const newScope = fiberRuntime_scopeUnsafeMake(strategy)
						if ("Closed" === this.state._tag) {
							newScope.state = this.state
							return newScope
						}
						const key = {}
						this.state.finalizers.set(key, exit => newScope.close(exit))
						;((fin = _ =>
							sync(() => {
								"Open" === this.state._tag && this.state.finalizers.delete(key)
							})),
							"Open" === (scope = newScope).state._tag &&
								scope.state.finalizers.set({}, fin))
						var scope, fin
						return newScope
					})
				},
				close(exit) {
					return suspend(() => {
						if ("Closed" === this.state._tag) return core_void_
						const finalizers = Array.from(
							this.state.finalizers.values(),
						).reverse()
						this.state = { _tag: "Closed", exit }
						return 0 === finalizers.length
							? core_void_
							: (() => "Sequential" === this.strategy._tag)()
								? pipe(
										forEachSequential(finalizers, fin => core_exit(fin(exit))),
										core_flatMap(results =>
											pipe(
												exitCollectAll(results),
												Option_map(exitAsVoid),
												Option_getOrElse(() => exitVoid),
											),
										),
									)
								: (() => "Parallel" === this.strategy._tag)()
									? pipe(
											forEachParUnbounded(
												finalizers,
												fin => core_exit(fin(exit)),
												!1,
											),
											core_flatMap(results =>
												pipe(
													exitCollectAll(results, { parallel: !0 }),
													Option_map(exitAsVoid),
													Option_getOrElse(() => exitVoid),
												),
											),
										)
									: pipe(
											forEachParN(
												finalizers,
												this.strategy.parallelism,
												fin => core_exit(fin(exit)),
												!1,
											),
											core_flatMap(results =>
												pipe(
													exitCollectAll(results, { parallel: !0 }),
													Option_map(exitAsVoid),
													Option_getOrElse(() => exitVoid),
												),
											),
										)
					})
				},
				addFinalizer(fin) {
					return suspend(() => {
						if ("Closed" === this.state._tag) return fin(this.state.exit)
						this.state.finalizers.set({}, fin)
						return core_void_
					})
				},
			},
			fiberRuntime_scopeUnsafeMake = (
				strategy = executionStrategy_sequential,
			) => {
				const scope = Object.create(ScopeImplProto)
				scope.strategy = strategy
				scope.state = { _tag: "Open", finalizers: new Map() }
				return scope
			},
			fiberRuntime_scopeMake = (strategy = executionStrategy_sequential) =>
				sync(() => fiberRuntime_scopeUnsafeMake(strategy)),
			scopeExtend = dual(2, (effect, scope) =>
				mapInputContext(effect, Context_merge(Context_make(scopeTag, scope))),
			),
			fiberRefUnsafeMakeSupervisor = initial =>
				fiberRefUnsafeMakePatch(initial, {
					differ: patch_differ,
					fork: supervisor_patch_empty,
				}),
			fiberRefLocallyScoped = dual(2, (self, value) =>
				core_asVoid(
					fiberRuntime_acquireRelease(
						core_flatMap(fiberRefGet(self), oldValue =>
							core_as(fiberRefSet(self, value), oldValue),
						),
						oldValue => fiberRefSet(self, oldValue),
					),
				),
			),
			fiberRefLocallyScopedWith = dual(2, (self, f) =>
				fiberRefGetWith(self, a => fiberRefLocallyScoped(self, f(a))),
			),
			currentRuntimeFlags = fiberRefUnsafeMakeRuntimeFlags(runtimeFlags_none),
			currentSupervisor = fiberRefUnsafeMakeSupervisor(supervisor_none),
			raceWith = dual(3, (self, other, options) =>
				raceFibersWith(self, other, {
					onSelfWin: (winner, loser) =>
						core_flatMap(winner.await, exit => {
							switch (exit._tag) {
								case "Success":
									return core_flatMap(winner.inheritAll, () =>
										options.onSelfDone(exit, loser),
									)
								case "Failure":
									return options.onSelfDone(exit, loser)
							}
						}),
					onOtherWin: (winner, loser) =>
						core_flatMap(winner.await, exit => {
							switch (exit._tag) {
								case "Success":
									return core_flatMap(winner.inheritAll, () =>
										options.onOtherDone(exit, loser),
									)
								case "Failure":
									return options.onOtherDone(exit, loser)
							}
						}),
				}),
			),
			fiberRuntime_race = dual(2, (self, that) =>
				fiberIdWith(parentFiberId =>
					raceWith(self, that, {
						onSelfDone: (exit, right) =>
							exitMatchEffect(exit, {
								onFailure: cause =>
									pipe(
										fiber_join(right),
										core_effect_mapErrorCause(cause2 =>
											parallel(cause, cause2),
										),
									),
								onSuccess: value =>
									pipe(right, interruptAsFiber(parentFiberId), core_as(value)),
							}),
						onOtherDone: (exit, left) =>
							exitMatchEffect(exit, {
								onFailure: cause =>
									pipe(
										fiber_join(left),
										core_effect_mapErrorCause(cause2 =>
											parallel(cause2, cause),
										),
									),
								onSuccess: value =>
									pipe(left, interruptAsFiber(parentFiberId), core_as(value)),
							}),
					}),
				),
			),
			raceFibersWith = dual(3, (self, other, options) =>
				withFiberRuntime((parentFiber, parentStatus) => {
					const parentRuntimeFlags = parentStatus.runtimeFlags,
						raceIndicator = MutableRef_make(!0),
						leftFiber = unsafeMakeChildFiber(
							self,
							parentFiber,
							parentRuntimeFlags,
							options.selfScope,
						),
						rightFiber = unsafeMakeChildFiber(
							other,
							parentFiber,
							parentRuntimeFlags,
							options.otherScope,
						)
					return async_(
						cb => {
							leftFiber.addObserver(() =>
								completeRace(
									leftFiber,
									rightFiber,
									options.onSelfWin,
									raceIndicator,
									cb,
								),
							)
							rightFiber.addObserver(() =>
								completeRace(
									rightFiber,
									leftFiber,
									options.onOtherWin,
									raceIndicator,
									cb,
								),
							)
							leftFiber.startFork(self)
							rightFiber.startFork(other)
						},
						FiberId_combine(leftFiber.id(), rightFiber.id()),
					)
				}),
			),
			completeRace = (winner, loser, cont, ab, cb) => {
				compareAndSet(!0, !1)(ab) && cb(cont(winner, loser))
			},
			fiberRuntime_ensuring = dual(2, (self, finalizer) =>
				uninterruptibleMask(restore =>
					matchCauseEffect(restore(self), {
						onFailure: cause1 =>
							matchCauseEffect(finalizer, {
								onFailure: cause2 => failCause(sequential(cause1, cause2)),
								onSuccess: () => failCause(cause1),
							}),
						onSuccess: a => core_as(finalizer, a),
					}),
				),
			),
			invokeWithInterrupt = (self, entries, onInterrupt) =>
				fiberIdWith(id =>
					fiberRuntime_ensuring(
						core_flatMap(
							fiberRuntime_forkDaemon(core_interruptible(self)),
							processing =>
								async_(cb => {
									const counts = entries.map(_ => _.listeners.count),
										checkDone = () => {
											if (
												counts.every(count => 0 === count) &&
												entries.every(
													_ =>
														"Pending" === _.result.state.current._tag ||
														!(
															"Done" !== _.result.state.current._tag ||
															!exitIsExit(_.result.state.current.effect) ||
															"Failure" !==
																_.result.state.current.effect._tag ||
															!isInterrupted(
																_.result.state.current.effect.cause,
															)
														),
												)
											) {
												cleanup.forEach(f => f())
												onInterrupt?.()
												cb(interruptFiber(processing))
											}
										}
									processing.addObserver(exit => {
										cleanup.forEach(f => f())
										cb(exit)
									})
									const cleanup = entries.map((r, i) => {
										const observer = count => {
											counts[i] = count
											checkDone()
										}
										r.listeners.addObserver(observer)
										return () => r.listeners.removeObserver(observer)
									})
									checkDone()
									return sync(() => {
										cleanup.forEach(f => f())
									})
								}),
						),
						suspend(() => {
							const residual = entries.flatMap(entry =>
								entry.state.completed ? [] : [entry],
							)
							return forEachSequentialDiscard(residual, entry =>
								complete(entry.request, exitInterrupt(id)),
							)
						}),
					),
				),
			Cause_fail = fail,
			Cause_die = die,
			Cause_interrupt = interrupt,
			Cause_isDieType = isDieType,
			Cause_isInterrupted = isInterrupted,
			Cause_isInterruptedOnly = isInterruptedOnly,
			Cause_interruptors = interruptors,
			Cause_failureOrCause = failureOrCause,
			Cause_map = cause_map,
			squash = self => causeSquashWith(identity)(self),
			Cause_NoSuchElementException = NoSuchElementException,
			Cause_pretty = pretty,
			IntervalTypeId = Symbol.for("effect/ScheduleInterval"),
			interval_empty = {
				[IntervalTypeId]: IntervalTypeId,
				startMillis: 0,
				endMillis: 0,
			},
			interval_make = (startMillis, endMillis) =>
				startMillis > endMillis
					? interval_empty
					: { [IntervalTypeId]: IntervalTypeId, startMillis, endMillis },
			interval_lessThan = dual(
				2,
				(self, that) => interval_min(self, that) === self,
			),
			interval_min = dual(2, (self, that) =>
				self.endMillis <= that.startMillis
					? self
					: that.endMillis <= self.startMillis
						? that
						: self.startMillis < that.startMillis
							? self
							: that.startMillis < self.startMillis
								? that
								: self.endMillis <= that.endMillis
									? self
									: that,
			),
			intersect = dual(2, (self, that) => {
				const start = Math.max(self.startMillis, that.startMillis),
					end = Math.min(self.endMillis, that.endMillis)
				return interval_make(start, end)
			}),
			ScheduleInterval_empty = interval_empty,
			ScheduleInterval_lessThan = interval_lessThan,
			ScheduleInterval_isEmpty = self => self.startMillis >= self.endMillis,
			ScheduleInterval_intersect = intersect,
			ScheduleInterval_after = startMilliseconds =>
				interval_make(startMilliseconds, Number.POSITIVE_INFINITY),
			IntervalsTypeId = Symbol.for("effect/ScheduleIntervals"),
			intervals_make = intervals => ({
				[IntervalsTypeId]: IntervalsTypeId,
				intervals,
			}),
			intervals_intersect = dual(2, (self, that) =>
				intersectLoop(self.intervals, that.intervals, esm_Chunk_empty()),
			),
			intersectLoop = (_left, _right, _acc) => {
				let left = _left,
					right = _right,
					acc = _acc
				for (; isNonEmpty(left) && isNonEmpty(right);) {
					const interval = pipe(
							Chunk_headNonEmpty(left),
							ScheduleInterval_intersect(Chunk_headNonEmpty(right)),
						),
						intervals = ScheduleInterval_isEmpty(interval)
							? acc
							: pipe(acc, Chunk_prepend(interval))
					pipe(
						Chunk_headNonEmpty(left),
						ScheduleInterval_lessThan(Chunk_headNonEmpty(right)),
					)
						? (left = Chunk_tailNonEmpty(left))
						: (right = Chunk_tailNonEmpty(right))
					acc = intervals
				}
				return intervals_make(Chunk_reverse(acc))
			},
			start = self =>
				pipe(
					self.intervals,
					Chunk_head,
					Option_getOrElse(() => ScheduleInterval_empty),
				).startMillis,
			intervals_lessThan = dual(2, (self, that) => start(self) < start(that)),
			ScheduleIntervals_make = intervals_make,
			ScheduleIntervals_intersect = intervals_intersect,
			ScheduleIntervals_start = start,
			ScheduleIntervals_end = self =>
				pipe(
					self.intervals,
					Chunk_head,
					Option_getOrElse(() => ScheduleInterval_empty),
				).endMillis,
			ScheduleIntervals_lessThan = intervals_lessThan,
			ScheduleDecision_continueWith = interval => ({
				_tag: "Continue",
				intervals: ScheduleIntervals_make(Chunk_of(interval)),
			}),
			ScheduleDecision_done = { _tag: "Done" },
			ScheduleDecision_isContinue = self => "Continue" === self._tag,
			ScheduleDecision_isDone = self => "Done" === self._tag,
			Scope_addFinalizer = scopeAddFinalizer,
			addFinalizerExit = scopeAddFinalizerExit,
			Scope_close = scopeClose,
			Scope_extend = scopeExtend,
			Scope_fork = scopeFork,
			Scope_make = fiberRuntime_scopeMake
		class Semaphore {
			permits
			waiters = new Set()
			taken = 0
			constructor(permits) {
				this.permits = permits
			}
			get free() {
				return this.permits - this.taken
			}
			take = n =>
				asyncInterrupt(resume => {
					if (this.free < n) {
						const observer = () => {
							if (!(this.free < n)) {
								this.waiters.delete(observer)
								resume(
									suspend(() => {
										if (this.free < n) return this.take(n)
										this.taken += n
										return succeed(n)
									}),
								)
							}
						}
						this.waiters.add(observer)
						return sync(() => {
							this.waiters.delete(observer)
						})
					}
					resume(
						suspend(() => {
							if (this.free < n) return this.take(n)
							this.taken += n
							return succeed(n)
						}),
					)
				})
			updateTakenUnsafe(fiber, f) {
				this.taken = f(this.taken)
				this.waiters.size > 0 &&
					fiber.getFiberRef(currentScheduler).scheduleTask(
						() => {
							const iter = this.waiters.values()
							let item = iter.next()
							for (; !1 === item.done && this.free > 0;) {
								item.value()
								item = iter.next()
							}
						},
						fiber.getFiberRef(currentSchedulingPriority),
						fiber,
					)
				return succeed(this.free)
			}
			updateTaken(f) {
				return withFiberRuntime(fiber => this.updateTakenUnsafe(fiber, f))
			}
			resize = permits =>
				core_asVoid(
					withFiberRuntime(fiber => {
						this.permits = permits
						return this.free < 0
							? core_void_
							: this.updateTakenUnsafe(fiber, taken => taken)
					}),
				)
			release = n => this.updateTaken(taken => taken - n)
			releaseAll = this.updateTaken(_ => 0)
			withPermits = n => self =>
				uninterruptibleMask(restore =>
					core_flatMap(restore(this.take(n)), permits =>
						fiberRuntime_ensuring(restore(self), this.release(permits)),
					),
				)
			withPermitsIfAvailable = n => self =>
				uninterruptibleMask(restore =>
					suspend(() => {
						if (this.free < n) return core_effect_succeedNone
						this.taken += n
						return fiberRuntime_ensuring(
							restore((self => core_map(self, Option_some))(self)),
							this.release(n),
						)
					}),
				)
		}
		const unsafeMakeSemaphore = permits => new Semaphore(permits),
			circular_forkIn = dual(2, (self, scope) =>
				withFiberRuntime((parent, parentStatus) => {
					const scopeImpl = scope,
						fiber = fiberRuntime_unsafeFork(
							self,
							parent,
							parentStatus.runtimeFlags,
							globalScope,
						)
					if ("Open" === scopeImpl.state._tag) {
						const finalizer = () =>
								fiberIdWith(fiberId =>
									equals(fiberId, fiber.id())
										? core_void_
										: core_asVoid(interruptFiber(fiber)),
								),
							key = {}
						scopeImpl.state.finalizers.set(key, finalizer)
						fiber.addObserver(() => {
							"Closed" !== scopeImpl.state._tag &&
								scopeImpl.state.finalizers.delete(key)
						})
					} else fiber.unsafeInterruptAsFork(parent.id())
					return succeed(fiber)
				}),
			),
			circular_raceFirst = dual(2, (self, that) =>
				pipe(core_exit(self), fiberRuntime_race(core_exit(that)), effect =>
					core_flatten(effect),
				),
			),
			SynchronizedTypeId = Symbol.for("effect/Ref/SynchronizedRef"),
			synchronizedVariance = { _A: _ => _ }
		class SynchronizedImpl extends Effectable_Class {
			ref
			withLock;
			[SynchronizedTypeId] = synchronizedVariance;
			[RefTypeId] = refVariance;
			[Readable_TypeId] = Readable_TypeId
			constructor(ref, withLock) {
				super()
				this.ref = ref
				this.withLock = withLock
				this.get = ref_get(this.ref)
			}
			get;
			commit() {
				return this.get
			}
			modify(f) {
				return this.modifyEffect(a => succeed(f(a)))
			}
			modifyEffect(f) {
				return this.withLock(
					pipe(
						core_flatMap(ref_get(this.ref), f),
						core_flatMap(([b, a]) => core_as(ref_set(this.ref, a), b)),
					),
				)
			}
		}
		const makeSynchronized = value => sync(() => unsafeMakeSynchronized(value)),
			unsafeMakeSynchronized = value => {
				const ref = ref_unsafeMake(value),
					sem = unsafeMakeSemaphore(1)
				return new SynchronizedImpl(ref, sem.withPermits(1))
			},
			circular_TypeId = Symbol.for("effect/ManagedRuntime"),
			Fiber_await = self => self.await,
			Fiber_inheritAll = self => self.inheritAll,
			Fiber_interrupt = interruptFiber,
			interruptAs = interruptAsFiber,
			Fiber_join = fiber_join,
			makeDual = f =>
				function () {
					if (1 === arguments.length) {
						const runtime = arguments[0]
						return (effect, ...args) => f(runtime, effect, ...args)
					}
					return f.apply(this, arguments)
				},
			runtime_unsafeFork = makeDual((runtime, self, options) => {
				const fiberId = FiberId_unsafeMake(),
					fiberRefUpdates = [[currentContext, [[fiberId, runtime.context]]]]
				options?.scheduler &&
					fiberRefUpdates.push([
						currentScheduler,
						[[fiberId, options.scheduler]],
					])
				let fiberRefs = FiberRefs_updateManyAs(runtime.fiberRefs, {
					entries: fiberRefUpdates,
					forkAs: fiberId,
				})
				options?.updateRefs &&
					(fiberRefs = options.updateRefs(fiberRefs, fiberId))
				const fiberRuntime = new FiberRuntime(
					fiberId,
					fiberRefs,
					runtime.runtimeFlags,
				)
				let effect = self
				options?.scope &&
					(effect = core_flatMap(
						Scope_fork(options.scope, executionStrategy_sequential),
						closeableScope =>
							core_zipRight(
								scopeAddFinalizer(
									closeableScope,
									fiberIdWith(id =>
										equals(id, fiberRuntime.id())
											? core_void_
											: interruptAsFiber(fiberRuntime, id),
									),
								),
								onExit(self, exit => Scope_close(closeableScope, exit)),
							),
					))
				const supervisor = fiberRuntime.currentSupervisor
				if (supervisor !== supervisor_none) {
					supervisor.onStart(
						runtime.context,
						effect,
						Option_none(),
						fiberRuntime,
					)
					fiberRuntime.addObserver(exit => supervisor.onEnd(exit, fiberRuntime))
				}
				globalScope.add(runtime.runtimeFlags, fiberRuntime)
				!1 === options?.immediate
					? fiberRuntime.resume(effect)
					: fiberRuntime.start(effect)
				return fiberRuntime
			}),
			unsafeRunSync = makeDual((runtime, effect) => {
				const result = unsafeRunSyncExit(runtime)(effect)
				if ("Failure" === result._tag)
					throw fiberFailure(result.effect_instruction_i0)
				return result.effect_instruction_i0
			})
		class AsyncFiberExceptionImpl extends Error {
			fiber
			_tag = "AsyncFiberException"
			constructor(fiber) {
				super(
					`Fiber #${fiber.id().id} cannot be resolved synchronously. This is caused by using runSync on an effect that performs async work`,
				)
				this.fiber = fiber
				this.name = this._tag
				this.stack = this.message
			}
		}
		const FiberFailureId = Symbol.for("effect/Runtime/FiberFailure"),
			FiberFailureCauseId = Symbol.for("effect/Runtime/FiberFailure/Cause")
		class FiberFailureImpl extends Error {
			[FiberFailureId];
			[FiberFailureCauseId]
			constructor(cause) {
				const head = prettyErrors(cause)[0]
				super(head?.message || "An error has occurred")
				this[FiberFailureId] = FiberFailureId
				this[FiberFailureCauseId] = cause
				this.name = head ? `(FiberFailure) ${head.name}` : "FiberFailure"
				head?.stack && (this.stack = head.stack)
			}
			toJSON() {
				return {
					_id: "FiberFailure",
					cause: this[FiberFailureCauseId].toJSON(),
				}
			}
			toString() {
				return (
					"(FiberFailure) " +
					pretty(this[FiberFailureCauseId], { renderErrorCause: !0 })
				)
			}
			[NodeInspectSymbol]() {
				return this.toString()
			}
		}
		const fiberFailure = cause => {
				const limit = Error.stackTraceLimit
				Error.stackTraceLimit = 0
				const error = new FiberFailureImpl(cause)
				Error.stackTraceLimit = limit
				return error
			},
			fastPath = effect => {
				const op = effect
				switch (op._op) {
					case "Failure":
					case "Success":
						return op
					case "Left":
						return exitFail(op.left)
					case "Right":
						return exitSucceed(op.right)
					case "Some":
						return exitSucceed(op.value)
					case "None":
						return exitFail(new NoSuchElementException())
				}
			},
			unsafeRunSyncExit = makeDual((runtime, effect) => {
				const op = fastPath(effect)
				if (op) return op
				const scheduler = new SyncScheduler(),
					fiberRuntime = runtime_unsafeFork(runtime)(effect, { scheduler })
				scheduler.flush()
				return (
					fiberRuntime.unsafePoll() ||
					exitDie(
						capture(
							(fiber => {
								const limit = Error.stackTraceLimit
								Error.stackTraceLimit = 0
								const error = new AsyncFiberExceptionImpl(fiber)
								Error.stackTraceLimit = limit
								return error
							})(fiberRuntime),
							currentSpanFromFiber(fiberRuntime),
						),
					)
				)
			}),
			unsafeRunPromise = makeDual((runtime, effect, options) =>
				unsafeRunPromiseExit(runtime, effect, options).then(result => {
					switch (result._tag) {
						case "Success":
							return result.effect_instruction_i0
						case "Failure":
							throw fiberFailure(result.effect_instruction_i0)
					}
				}),
			),
			unsafeRunPromiseExit = makeDual(
				(runtime, effect, options) =>
					new Promise(resolve => {
						const op = fastPath(effect)
						op && resolve(op)
						const fiber = runtime_unsafeFork(runtime)(effect)
						fiber.addObserver(exit => {
							resolve(exit)
						})
						void 0 !== options?.signal &&
							(options.signal.aborted
								? fiber.unsafeInterruptAsFork(fiber.id())
								: options.signal.addEventListener(
										"abort",
										() => {
											fiber.unsafeInterruptAsFork(fiber.id())
										},
										{ once: !0 },
									))
					}),
			)
		class RuntimeImpl {
			context
			runtimeFlags
			fiberRefs
			constructor(context, runtimeFlags, fiberRefs) {
				this.context = context
				this.runtimeFlags = runtimeFlags
				this.fiberRefs = fiberRefs
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const runtime_make = options =>
				new RuntimeImpl(
					options.context,
					options.runtimeFlags,
					options.fiberRefs,
				),
			defaultRuntimeFlags = runtimeFlags_make(1, 32, 4),
			defaultRuntime = runtime_make({
				context: Context_empty(),
				runtimeFlags: defaultRuntimeFlags,
				fiberRefs: FiberRefs_empty(),
			}),
			unsafeForkEffect = runtime_unsafeFork(defaultRuntime),
			unsafeRunPromiseEffect = unsafeRunPromise(defaultRuntime),
			unsafeRunSyncEffect = unsafeRunSync(defaultRuntime),
			modifyEffect = dual(2, (self, f) => self.modifyEffect(f)),
			LayerTypeId = Symbol.for("effect/Layer"),
			layer_proto = {
				[LayerTypeId]: { _RIn: _ => _, _E: _ => _, _ROut: _ => _ },
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			MemoMapTypeId = Symbol.for("effect/Layer/MemoMap"),
			CurrentMemoMap = Context_Reference()("effect/Layer/CurrentMemoMap", {
				defaultValue: () => unsafeMakeMemoMap(),
			}),
			isFresh = self => "Fresh" === self._op_layer
		class MemoMapImpl {
			ref;
			[MemoMapTypeId]
			constructor(ref) {
				this.ref = ref
				this[MemoMapTypeId] = MemoMapTypeId
			}
			getOrElseMemoize(layer, scope) {
				return pipe(
					modifyEffect(this.ref, map => {
						const inMap = map.get(layer)
						if (void 0 !== inMap) {
							const [acquire, release] = inMap,
								cached = pipe(
									acquire,
									core_flatMap(([patch, b]) =>
										pipe(
											(patch =>
												(f =>
													withFiberRuntime(state => {
														state.setFiberRefs(
															f(state.id(), state.getFiberRefs()),
														)
														return core_void_
													}))((fiberId, fiberRefs) =>
													pipe(patch, patch_patch(fiberId, fiberRefs)),
												))(patch),
											core_as(b),
										),
									),
									onExit(
										exitMatch({
											onFailure: () => core_void_,
											onSuccess: () => scopeAddFinalizerExit(scope, release),
										}),
									),
								)
							return succeed([cached, map])
						}
						return pipe(
							ref_make(0),
							core_flatMap(observers =>
								pipe(
									deferredMake(),
									core_flatMap(deferred =>
										pipe(
											ref_make(() => core_void_),
											core_map(finalizerRef => {
												const resource = uninterruptibleMask(restore =>
														pipe(
															fiberRuntime_scopeMake(),
															core_flatMap(innerScope =>
																pipe(
																	restore(
																		core_flatMap(
																			makeBuilder(layer, innerScope, !0),
																			f =>
																				(self =>
																					summarized(
																						self,
																						core_effect_fiberRefs,
																						patch_diff,
																					))(f(this)),
																		),
																	),
																	core_exit,
																	core_flatMap(exit => {
																		switch (exit._tag) {
																			case "Failure":
																				return pipe(
																					deferredFailCause(
																						deferred,
																						exit.effect_instruction_i0,
																					),
																					core_zipRight(
																						scopeClose(innerScope, exit),
																					),
																					core_zipRight(
																						failCause(
																							exit.effect_instruction_i0,
																						),
																					),
																				)
																			case "Success":
																				return pipe(
																					ref_set(finalizerRef, exit =>
																						pipe(
																							scopeClose(innerScope, exit),
																							whenEffect(
																								ref_modify(observers, n => [
																									1 === n,
																									n - 1,
																								]),
																							),
																							core_asVoid,
																						),
																					),
																					core_zipRight(
																						ref_update(observers, n => n + 1),
																					),
																					core_zipRight(
																						scopeAddFinalizerExit(scope, exit =>
																							pipe(
																								sync(() => map.delete(layer)),
																								core_zipRight(
																									ref_get(finalizerRef),
																								),
																								core_flatMap(finalizer =>
																									finalizer(exit),
																								),
																							),
																						),
																					),
																					core_zipRight(
																						deferredSucceed(
																							deferred,
																							exit.effect_instruction_i0,
																						),
																					),
																					core_as(
																						exit.effect_instruction_i0[1],
																					),
																				)
																		}
																	}),
																),
															),
														),
													),
													memoized = [
														pipe(
															deferredAwait(deferred),
															onExit(
																exitMatchEffect({
																	onFailure: () => core_void_,
																	onSuccess: () =>
																		ref_update(observers, n => n + 1),
																}),
															),
														),
														exit =>
															pipe(
																ref_get(finalizerRef),
																core_flatMap(finalizer => finalizer(exit)),
															),
													]
												return [
													resource,
													isFresh(layer) ? map : map.set(layer, memoized),
												]
											}),
										),
									),
								),
							),
						)
					}),
					core_flatten,
				)
			}
		}
		const makeMemoMap = suspend(() =>
				core_map(makeSynchronized(new Map()), ref => new MemoMapImpl(ref)),
			),
			unsafeMakeMemoMap = () =>
				new MemoMapImpl(unsafeMakeSynchronized(new Map())),
			buildWithScope = dual(2, (self, scope) =>
				core_flatMap(makeMemoMap, memoMap =>
					buildWithMemoMap(self, memoMap, scope),
				),
			),
			buildWithMemoMap = dual(3, (self, memoMap, scope) =>
				core_flatMap(makeBuilder(self, scope), run =>
					core_effect_provideService(run(memoMap), CurrentMemoMap, memoMap),
				),
			),
			makeBuilder = (self, scope, inMemoMap = !1) => {
				const op = self
				switch (op._op_layer) {
					case "Locally":
						return sync(
							() => memoMap => op.f(memoMap.getOrElseMemoize(op.self, scope)),
						)
					case "ExtendScope":
						return sync(
							() => memoMap =>
								scopeWith(scope => memoMap.getOrElseMemoize(op.layer, scope)),
						)
					case "Fold":
						return sync(
							() => memoMap =>
								pipe(
									memoMap.getOrElseMemoize(op.layer, scope),
									matchCauseEffect({
										onFailure: cause =>
											memoMap.getOrElseMemoize(op.failureK(cause), scope),
										onSuccess: value =>
											memoMap.getOrElseMemoize(op.successK(value), scope),
									}),
								),
						)
					case "Fresh":
						return sync(() => _ => pipe(op.layer, buildWithScope(scope)))
					case "FromEffect":
						return sync(
							inMemoMap
								? () => _ => op.effect
								: () => memoMap => memoMap.getOrElseMemoize(self, scope),
						)
					case "Provide":
						return sync(
							() => memoMap =>
								pipe(
									memoMap.getOrElseMemoize(op.first, scope),
									core_flatMap(env =>
										pipe(
											memoMap.getOrElseMemoize(op.second, scope),
											provideContext(env),
										),
									),
								),
						)
					case "Scoped":
						return sync(
							inMemoMap
								? () => _ => scopeExtend(op.effect, scope)
								: () => memoMap => memoMap.getOrElseMemoize(self, scope),
						)
					case "Suspend":
						return sync(
							() => memoMap => memoMap.getOrElseMemoize(op.evaluate(), scope),
						)
					case "ProvideMerge":
						return sync(
							() => memoMap =>
								pipe(
									memoMap.getOrElseMemoize(op.first, scope),
									core_zipWith(
										memoMap.getOrElseMemoize(op.second, scope),
										op.zipK,
									),
								),
						)
					case "ZipWith":
						return core_gen(function* () {
							const parallelScope = yield* scopeFork(
									scope,
									executionStrategy_parallel,
								),
								firstScope = yield* scopeFork(
									parallelScope,
									executionStrategy_sequential,
								),
								secondScope = yield* scopeFork(
									parallelScope,
									executionStrategy_sequential,
								)
							return memoMap =>
								pipe(
									memoMap.getOrElseMemoize(op.first, firstScope),
									zipWithOptions(
										memoMap.getOrElseMemoize(op.second, secondScope),
										op.zipK,
										{ concurrent: !0 },
									),
								)
						})
					case "MergeAll": {
						const layers = op.layers
						return core_map(
							scopeFork(scope, executionStrategy_parallel),
							parallelScope => memoMap => {
								const contexts = new Array(layers.length)
								return core_map(
									forEachConcurrentDiscard(
										layers,
										fnUntraced(function* (layer, i) {
											const scope = yield* scopeFork(
													parallelScope,
													executionStrategy_sequential,
												),
												context = yield* memoMap.getOrElseMemoize(layer, scope)
											contexts[i] = context
										}),
										!1,
										!1,
									),
									() =>
										((...ctxs) => {
											const map = new Map()
											for (let i = 0; i < ctxs.length; i++)
												ctxs[i].unsafeMap.forEach((value, key) => {
													map.set(key, value)
												})
											return makeContext(map)
										})(...contexts),
								)
							},
						)
					}
				}
			},
			layer_fail = error => layer_failCause(Cause_fail(error)),
			layer_failCause = cause =>
				(function (effect) {
					const fromEffect = Object.create(layer_proto)
					fromEffect._op_layer = "FromEffect"
					fromEffect.effect = effect
					return fromEffect
				})(failCause(cause)),
			layer_flatMap = dual(2, (self, f) =>
				layer_match(self, { onFailure: layer_fail, onSuccess: f }),
			),
			layer_matchCause = dual(2, (self, { onFailure, onSuccess }) => {
				const fold = Object.create(layer_proto)
				fold._op_layer = "Fold"
				fold.layer = self
				fold.failureK = onFailure
				fold.successK = onSuccess
				return fold
			}),
			layer_match = dual(2, (self, { onFailure, onSuccess }) =>
				layer_matchCause(self, {
					onFailure: cause => {
						const failureOrCause = Cause_failureOrCause(cause)
						switch (failureOrCause._tag) {
							case "Left":
								return onFailure(failureOrCause.left)
							case "Right":
								return layer_failCause(failureOrCause.right)
						}
					},
					onSuccess,
				}),
			),
			scopedDiscard = effect =>
				scopedContext(pipe(effect, core_as(Context_empty()))),
			scopedContext = effect => {
				const scoped = Object.create(layer_proto)
				scoped._op_layer = "Scoped"
				scoped.effect = effect
				return scoped
			},
			provideSomeLayer = dual(2, (self, layer) =>
				scopedWith(scope =>
					core_flatMap(buildWithScope(layer, scope), context =>
						provideSomeContext(self, context),
					),
				),
			),
			provideSomeRuntime = dual(2, (self, rt) => {
				const patchRefs = FiberRefsPatch_diff(
						defaultRuntime.fiberRefs,
						rt.fiberRefs,
					),
					patchFlags = runtimeFlags_diff(
						defaultRuntime.runtimeFlags,
						rt.runtimeFlags,
					)
				return uninterruptibleMask(restore =>
					withFiberRuntime(fiber => {
						const oldContext = fiber.getFiberRef(currentContext),
							oldRefs = fiber.getFiberRefs(),
							newRefs = FiberRefsPatch_patch(fiber.id(), oldRefs)(patchRefs),
							oldFlags = fiber.currentRuntimeFlags,
							newFlags = runtimeFlags_patch(patchFlags)(oldFlags),
							rollbackRefs = FiberRefsPatch_diff(newRefs, oldRefs),
							rollbackFlags = runtimeFlags_diff(newFlags, oldFlags)
						fiber.setFiberRefs(newRefs)
						fiber.currentRuntimeFlags = newFlags
						return fiberRuntime_ensuring(
							provideSomeContext(
								restore(self),
								Context_merge(oldContext, rt.context),
							),
							withFiberRuntime(fiber => {
								fiber.setFiberRefs(
									FiberRefsPatch_patch(
										fiber.id(),
										fiber.getFiberRefs(),
									)(rollbackRefs),
								)
								fiber.currentRuntimeFlags = runtimeFlags_patch(rollbackFlags)(
									fiber.currentRuntimeFlags,
								)
								return core_void_
							}),
						)
					}),
				)
			}),
			effect_provide = dual(2, (self, source) =>
				Array.isArray(source)
					? provideSomeLayer(
							self,
							((...layers) => {
								const mergeAll = Object.create(layer_proto)
								mergeAll._op_layer = "MergeAll"
								mergeAll.layers = layers
								return mergeAll
							})(...source),
						)
					: (u => hasProperty(u, LayerTypeId))(source)
						? provideSomeLayer(self, source)
						: Context_isContext(source)
							? provideSomeContext(self, source)
							: circular_TypeId in source
								? core_flatMap(source.runtimeEffect, rt =>
										provideSomeRuntime(self, rt),
									)
								: provideSomeRuntime(self, source),
			),
			consoleWith = f =>
				fiberRefGetWith(currentServices, services =>
					f(Context_get(services, consoleTag)),
				),
			Data_Error = (function () {
				const plainArgsSymbol = Symbol.for("effect/Data/Error/plainArgs")
				return class extends YieldableError {
					constructor(args) {
						super(args?.message, args?.cause ? { cause: args.cause } : void 0)
						if (args) {
							Object.assign(this, args)
							Object.defineProperty(this, plainArgsSymbol, {
								value: args,
								enumerable: !1,
							})
						}
					}
					toJSON() {
						return { ...this[plainArgsSymbol], ...this }
					}
				}
			})(),
			Data_TaggedError = tag => {
				const O = {
					BaseEffectError: class extends Data_Error {
						_tag = tag
					},
				}
				O.BaseEffectError.prototype.name = tag
				return O.BaseEffectError
			},
			String_Equivalence = Equivalence_string,
			String_isEmpty = self => 0 === self.length,
			String_isNonEmpty = self => self.length > 0,
			String_split = dual(2, (self, separator) => {
				const out = self.split(separator)
				return isNonEmptyArray(out) ? out : [self]
			})
		Symbol.iterator
		const ScheduleTypeId = Symbol.for("effect/Schedule"),
			ScheduleDriverTypeId = Symbol.for("effect/ScheduleDriver"),
			defaultIterationMetadata = {
				start: 0,
				now: 0,
				input: void 0,
				output: void 0,
				elapsed: zero,
				elapsedSincePrevious: zero,
				recurrence: 0,
			},
			CurrentIterationMetadata = Context_Reference()(
				"effect/Schedule/CurrentIterationMetadata",
				{ defaultValue: () => defaultIterationMetadata },
			),
			scheduleVariance = { _Out: _ => _, _In: _ => _, _R: _ => _ },
			scheduleDriverVariance = { _Out: _ => _, _In: _ => _, _R: _ => _ }
		class ScheduleImpl {
			initial
			step;
			[ScheduleTypeId] = scheduleVariance
			constructor(initial, step) {
				this.initial = initial
				this.step = step
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const updateInfo = (iterationMetaRef, now, input, output) =>
			ref_update(iterationMetaRef, prev =>
				0 === prev.recurrence
					? {
							now,
							input,
							output,
							recurrence: prev.recurrence + 1,
							elapsed: zero,
							elapsedSincePrevious: zero,
							start: now,
						}
					: {
							now,
							input,
							output,
							recurrence: prev.recurrence + 1,
							elapsed: Duration_millis(now - prev.start),
							elapsedSincePrevious: Duration_millis(now - prev.now),
							start: prev.start,
						},
			)
		class ScheduleDriverImpl {
			schedule
			ref;
			[ScheduleDriverTypeId] = scheduleDriverVariance
			constructor(schedule, ref) {
				this.schedule = schedule
				this.ref = ref
			}
			get state() {
				return core_map(ref_get(this.ref), tuple => tuple[1])
			}
			get last() {
				return core_flatMap(ref_get(this.ref), ([element, _]) => {
					switch (element._tag) {
						case "None":
							return failSync(() => new NoSuchElementException())
						case "Some":
							return succeed(element.value)
					}
				})
			}
			iterationMeta = ref_unsafeMake(defaultIterationMetadata)
			get reset() {
				return ref_set(this.ref, [Option_none(), this.schedule.initial]).pipe(
					core_zipLeft(ref_set(this.iterationMeta, defaultIterationMetadata)),
				)
			}
			next(input) {
				return pipe(
					core_map(ref_get(this.ref), tuple => tuple[1]),
					core_flatMap(state =>
						pipe(
							Clock_currentTimeMillis,
							core_flatMap(now =>
								pipe(
									suspend(() => this.schedule.step(now, input, state)),
									core_flatMap(([state, out, decision]) => {
										const setState = ref_set(this.ref, [
											Option_some(out),
											state,
										])
										if (ScheduleDecision_isDone(decision))
											return setState.pipe(
												core_zipRight(core_fail(Option_none())),
											)
										const millis =
											ScheduleIntervals_start(decision.intervals) - now
										if (millis <= 0)
											return setState.pipe(
												core_zipRight(
													updateInfo(this.iterationMeta, now, input, out),
												),
												core_as(out),
											)
										const duration = Duration_millis(millis)
										return pipe(
											setState,
											core_zipRight(
												updateInfo(this.iterationMeta, now, input, out),
											),
											core_zipRight(core_effect_sleep(duration)),
											core_as(out),
										)
									}),
								),
							),
						),
					),
				)
			}
		}
		const makeWithState = (initial, step) => new ScheduleImpl(initial, step),
			check = dual(2, (self, test) =>
				checkEffect(self, (input, out) => sync(() => test(input, out))),
			),
			checkEffect = dual(2, (self, test) =>
				makeWithState(self.initial, (now, input, state) =>
					core_flatMap(
						self.step(now, input, state),
						([state, out, decision]) =>
							ScheduleDecision_isDone(decision)
								? succeed([state, out, ScheduleDecision_done])
								: core_map(test(input, out), cont =>
										cont
											? [state, out, decision]
											: [state, out, ScheduleDecision_done],
									),
					),
				),
			),
			driver = self =>
				pipe(
					ref_make([Option_none(), self.initial]),
					core_map(ref => new ScheduleDriverImpl(self, ref)),
				),
			schedule_intersect = dual(2, (self, that) =>
				intersectWith(self, that, ScheduleIntervals_intersect),
			),
			intersectWith = dual(3, (self, that, f) =>
				makeWithState([self.initial, that.initial], (now, input, state) =>
					pipe(
						core_zipWith(
							self.step(now, input, state[0]),
							that.step(now, input, state[1]),
							(a, b) => [a, b],
						),
						core_flatMap(
							([[lState, out, lDecision], [rState, out2, rDecision]]) =>
								ScheduleDecision_isContinue(lDecision) &&
								ScheduleDecision_isContinue(rDecision)
									? intersectWithLoop(
											self,
											that,
											input,
											lState,
											out,
											lDecision.intervals,
											rState,
											out2,
											rDecision.intervals,
											f,
										)
									: succeed([
											[lState, rState],
											[out, out2],
											ScheduleDecision_done,
										]),
						),
					),
				),
			),
			intersectWithLoop = (
				self,
				that,
				input,
				lState,
				out,
				lInterval,
				rState,
				out2,
				rInterval,
				f,
			) => {
				const combined = f(lInterval, rInterval)
				return (self => isNonEmpty(self.intervals))(combined)
					? succeed([
							[lState, rState],
							[out, out2],
							((intervals = combined), { _tag: "Continue", intervals }),
						])
					: pipe(lInterval, ScheduleIntervals_lessThan(rInterval))
						? core_flatMap(
								self.step(ScheduleIntervals_end(lInterval), input, lState),
								([lState, out, decision]) =>
									ScheduleDecision_isDone(decision)
										? succeed([
												[lState, rState],
												[out, out2],
												ScheduleDecision_done,
											])
										: intersectWithLoop(
												self,
												that,
												input,
												lState,
												out,
												decision.intervals,
												rState,
												out2,
												rInterval,
												f,
											),
							)
						: core_flatMap(
								that.step(ScheduleIntervals_end(rInterval), input, rState),
								([rState, out2, decision]) =>
									ScheduleDecision_isDone(decision)
										? succeed([
												[lState, rState],
												[out, out2],
												ScheduleDecision_done,
											])
										: intersectWithLoop(
												self,
												that,
												input,
												lState,
												out,
												lInterval,
												rState,
												out2,
												decision.intervals,
												f,
											),
							)
				var intervals
			},
			schedule_map = dual(2, (self, f) =>
				schedule_mapEffect(self, out => sync(() => f(out))),
			),
			schedule_mapEffect = dual(2, (self, f) =>
				makeWithState(self.initial, (now, input, state) =>
					core_flatMap(self.step(now, input, state), ([state, out, decision]) =>
						core_map(f(out), out2 => [state, out2, decision]),
					),
				),
			),
			schedule_unfold = (initial, f) =>
				makeWithState(initial, (now, _, state) =>
					sync(() => [
						f(state),
						state,
						ScheduleDecision_continueWith(ScheduleInterval_after(now)),
					]),
				),
			untilInputEffect = dual(2, (self, f) =>
				checkEffect(self, (input, _) =>
					(self => core_map(self, b => !b))(f(input)),
				),
			),
			whileInputEffect = dual(2, (self, f) =>
				checkEffect(self, (input, _) => f(input)),
			),
			whileOutput = dual(2, (self, f) => check(self, (_, out) => f(out))),
			ScheduleDefectTypeId = Symbol.for("effect/Schedule/ScheduleDefect")
		class ScheduleDefect {
			error;
			[ScheduleDefectTypeId]
			constructor(error) {
				this.error = error
				this[ScheduleDefectTypeId] = ScheduleDefectTypeId
			}
		}
		const scheduleDefectWrap = self =>
				catchAll(self, e => core_die(new ScheduleDefect(e))),
			repeat_Effect = dual(2, (self, schedule) =>
				repeatOrElse_Effect(self, schedule, (e, _) => core_fail(e)),
			),
			repeat_combined = dual(2, (self, options) => {
				if ((u => hasProperty(u, ScheduleTypeId))(options))
					return repeat_Effect(self, options)
				const base =
						options.schedule ??
						(self =>
							makeWithState(self.initial, (now, input, state) =>
								pipe(
									self.step(now, input, state),
									core_map(([state, _, decision]) => [state, input, decision]),
								),
							))(schedule_forever),
					withWhile = options.while
						? whileInputEffect(base, a => {
								const applied = options.while(a)
								return "boolean" == typeof applied
									? succeed(applied)
									: scheduleDefectWrap(applied)
							})
						: base,
					withUntil = options.until
						? untilInputEffect(withWhile, a => {
								const applied = options.until(a)
								return "boolean" == typeof applied
									? succeed(applied)
									: scheduleDefectWrap(applied)
							})
						: withWhile,
					withTimes = options.times
						? schedule_intersect(
								withUntil,
								(n => whileOutput(schedule_forever, out => out < n))(
									options.times,
								),
							).pipe(schedule_map(intersectionPair => intersectionPair[0]))
						: withUntil
				return (
					(effect = repeat_Effect(self, withTimes)),
					catchAllCause(effect, cause =>
						failCause(
							(cause =>
								Option_match(
									find(cause, _ =>
										isDieType(_) &&
										(u => hasProperty(u, ScheduleDefectTypeId))(_.defect)
											? Option_some(_.defect)
											: Option_none(),
									),
									{ onNone: () => cause, onSome: error => fail(error.error) },
								))(cause),
						),
					)
				)
				var effect
			}),
			repeatOrElse_Effect = dual(3, (self, schedule, orElse) =>
				core_flatMap(driver(schedule), driver =>
					matchEffect(self, {
						onFailure: error => orElse(error, Option_none()),
						onSuccess: value =>
							repeatOrElseEffectLoop(
								core_effect_provideServiceEffect(
									self,
									CurrentIterationMetadata,
									ref_get(driver.iterationMeta),
								),
								driver,
								(error, option) =>
									core_effect_provideServiceEffect(
										orElse(error, option),
										CurrentIterationMetadata,
										ref_get(driver.iterationMeta),
									),
								value,
							),
					}),
				),
			),
			repeatOrElseEffectLoop = (self, driver, orElse, value) =>
				matchEffect(driver.next(value), {
					onFailure: () => orDie(driver.last),
					onSuccess: b =>
						matchEffect(self, {
							onFailure: error => orElse(error, Option_some(b)),
							onSuccess: value =>
								repeatOrElseEffectLoop(self, driver, orElse, value),
						}),
				}),
			schedule_Effect = dual(2, (self, schedule) =>
				scheduleFrom_Effect(self, void 0, schedule),
			),
			scheduleFrom_Effect = dual(3, (self, initial, schedule) =>
				core_flatMap(driver(schedule), driver =>
					scheduleFrom_EffectLoop(
						core_effect_provideServiceEffect(
							self,
							CurrentIterationMetadata,
							ref_get(driver.iterationMeta),
						),
						initial,
						driver,
					),
				),
			),
			scheduleFrom_EffectLoop = (self, initial, driver) =>
				matchEffect(driver.next(initial), {
					onFailure: () => orDie(driver.last),
					onSuccess: () =>
						core_flatMap(self, a => scheduleFrom_EffectLoop(self, a, driver)),
				}),
			schedule_forever = schedule_unfold(0, n => n + 1),
			Deferred_make = deferredMake,
			Deferred_await = deferredAwait,
			Deferred_failCause = deferredFailCause,
			Deferred_isDone = self =>
				sync(() => "Done" === MutableRef_get(self.state)._tag),
			Deferred_succeed = deferredSucceed,
			MutableList_TypeId = Symbol.for("effect/MutableList"),
			MutableListProto = {
				[MutableList_TypeId]: MutableList_TypeId,
				[Symbol.iterator]() {
					let done = !1,
						head = this.head
					return {
						next() {
							if (done) return this.return()
							if (null == head) {
								done = !0
								return this.return()
							}
							const value = head.value
							head = head.next
							return { done, value }
						},
						return(value) {
							done || (done = !0)
							return { done: !0, value }
						},
					}
				},
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "MutableList", values: Array.from(this).map(toJSON) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			MutableList_isEmpty = self => 0 === MutableList_length(self),
			MutableList_length = self => self._length,
			MutableList_append = dual(2, (self, value) => {
				const node = (value => ({
					value,
					removed: !1,
					prev: void 0,
					next: void 0,
				}))(value)
				void 0 === self.head && (self.head = node)
				if (void 0 === self.tail) self.tail = node
				else {
					self.tail.next = node
					node.prev = self.tail
					self.tail = node
				}
				self._length += 1
				return self
			}),
			MutableQueue_TypeId = Symbol.for("effect/MutableQueue"),
			EmptyMutableQueue = Symbol.for("effect/mutable/MutableQueue/Empty"),
			MutableQueueProto = {
				[MutableQueue_TypeId]: MutableQueue_TypeId,
				[Symbol.iterator]() {
					return Array.from(this.queue)[Symbol.iterator]()
				},
				toString() {
					return format(this.toJSON())
				},
				toJSON() {
					return { _id: "MutableQueue", values: Array.from(this).map(toJSON) }
				},
				[NodeInspectSymbol]() {
					return this.toJSON()
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			MutableQueue_make = capacity => {
				const queue = Object.create(MutableQueueProto)
				queue.queue = (() => {
					const list = Object.create(MutableListProto)
					list.head = void 0
					list.tail = void 0
					list._length = 0
					return list
				})()
				queue.capacity = capacity
				return queue
			},
			bounded = capacity => MutableQueue_make(capacity),
			unbounded = () => MutableQueue_make(void 0),
			MutableQueue_length = self => MutableList_length(self.queue),
			MutableQueue_isEmpty = self => MutableList_isEmpty(self.queue),
			offer = dual(2, (self, value) => {
				const queueLength = MutableList_length(self.queue)
				if (void 0 !== self.capacity && queueLength === self.capacity) return !1
				MutableList_append(value)(self.queue)
				return !0
			}),
			offerAll = dual(2, (self, values) => {
				const iterator = values[Symbol.iterator]()
				let next,
					remainder = esm_Chunk_empty(),
					offering = !0
				for (; offering && (next = iterator.next()) && !next.done;)
					offering = offer(next.value)(self)
				for (; null != next && !next.done;) {
					remainder = Chunk_prepend(next.value)(remainder)
					next = iterator.next()
				}
				return Chunk_reverse(remainder)
			}),
			MutableQueue_poll = dual(2, (self, def) =>
				MutableList_isEmpty(self.queue)
					? def
					: (self => {
							const head = self.head
							if (void 0 !== head) {
								;((self, node) => {
									if (!node.removed) {
										node.removed = !0
										if (void 0 !== node.prev && void 0 !== node.next) {
											node.prev.next = node.next
											node.next.prev = node.prev
										} else if (void 0 !== node.prev) {
											self.tail = node.prev
											node.prev.next = void 0
										} else if (void 0 !== node.next) {
											self.head = node.next
											node.next.prev = void 0
										} else {
											self.tail = void 0
											self.head = void 0
										}
										self._length > 0 && (self._length -= 1)
									}
								})(self, head)
								return head.value
							}
						})(self.queue),
			),
			pollUpTo = dual(2, (self, n) => {
				let result = esm_Chunk_empty(),
					count = 0
				for (; count < n;) {
					const element = MutableQueue_poll(EmptyMutableQueue)(self)
					if (element === EmptyMutableQueue) break
					result = Chunk_prepend(element)(result)
					count += 1
				}
				return Chunk_reverse(result)
			}),
			Effect_isEffect = isEffect,
			Effect_all = fiberRuntime_all,
			Effect_allSuccesses = (elements, options) =>
				core_map(
					fiberRuntime_all(
						Array_fromIterable(elements).map(core_exit),
						options,
					),
					Array_filterMap(exit =>
						exitIsSuccess(exit)
							? Option_some(exit.effect_instruction_i0)
							: Option_none(),
					),
				),
			Effect_forEach = fiberRuntime_forEach,
			Effect_withFiberRuntime = withFiberRuntime,
			Effect_fail = core_fail,
			Effect_failCause = failCause,
			Effect_dieMessage = dieMessage,
			Effect_gen = core_gen,
			Effect_promise = evaluate =>
				evaluate.length >= 1
					? async_((resolve, signal) => {
							try {
								evaluate(signal).then(
									a => resolve(succeed(a)),
									e => resolve(core_die(e)),
								)
							} catch (e) {
								resolve(core_die(e))
							}
						})
					: async_(resolve => {
							try {
								evaluate().then(
									a => resolve(succeed(a)),
									e => resolve(core_die(e)),
								)
							} catch (e) {
								resolve(core_die(e))
							}
						}),
			Effect_succeed = succeed,
			Effect_suspend = suspend,
			Effect_sync = sync,
			_void = core_void_,
			Effect_catchAll = catchAll,
			Effect_catchAllCause = catchAllCause,
			Effect_catchSomeCause = catchSomeCause,
			Effect_ignore = self =>
				core_effect_match(self, { onFailure: constVoid, onSuccess: constVoid }),
			Effect_interrupt = core_interrupt,
			Effect_interruptible = core_interruptible,
			Effect_uninterruptible = uninterruptible,
			Effect_uninterruptibleMask = uninterruptibleMask,
			Effect_as = core_as,
			Effect_asVoid = core_asVoid,
			Effect_map = core_map,
			Effect_mapError = mapError,
			Effect_acquireRelease = fiberRuntime_acquireRelease,
			Effect_acquireUseRelease = acquireUseRelease,
			Effect_ensuring = fiberRuntime_ensuring,
			Effect_scope = fiberRuntime_scope,
			Effect_scopedWith = scopedWith,
			Effect_fiberIdWith = fiberIdWith,
			Effect_forkDaemon = fiberRuntime_forkDaemon,
			Effect_forkIn = circular_forkIn,
			Effect_withConcurrency = withConcurrency,
			Effect_sleep = core_effect_sleep,
			Effect_provide = effect_provide,
			Effect_option = self =>
				matchEffect(self, {
					onFailure: () => succeed(Option_none()),
					onSuccess: a => succeed(Option_some(a)),
				}),
			Effect_either = core_either,
			Effect_exit = core_exit,
			Effect_intoDeferred = intoDeferred,
			Effect_filterOrElse = filterOrElse,
			Effect_filterOrFail = core_effect_filterOrFail,
			Effect_when = core_effect_when,
			Effect_flatMap = core_flatMap,
			Effect_flatten = core_flatten,
			Effect_race = fiberRuntime_race,
			Effect_raceFirst = circular_raceFirst,
			Effect_raceWith = raceWith,
			Effect_tap = core_tap,
			Effect_tapErrorCause = core_effect_tapErrorCause,
			Effect_forever = self => {
				const loop = core_flatMap(
					core_flatMap(self, () => yieldNow()),
					() => loop,
				)
				return loop
			},
			Effect_repeat = repeat_combined,
			schedule = schedule_Effect,
			Effect_locally = fiberRefLocally,
			Effect_isSuccess = self =>
				core_effect_match(self, {
					onFailure: constFalse,
					onSuccess: constTrue,
				}),
			Effect_match = core_effect_match,
			Effect_matchCause = matchCause,
			Effect_matchCauseEffect = matchCauseEffect,
			Effect_matchEffect = matchEffect,
			Effect_log = log,
			Effect_logDebug = logDebug,
			Effect_logInfo = logInfo,
			Effect_logWarning = logWarning,
			Effect_logError = logError,
			Effect_annotateLogs = annotateLogs,
			Effect_orElse = core_orElse,
			Effect_orElseSucceed = core_effect_orElseSucceed,
			Effect_runtime = () =>
				withFiberRuntime((state, status) =>
					succeed(
						new RuntimeImpl(
							state.getFiberRef(currentContext),
							status.runtimeFlags,
							state.getFiberRefs(),
						),
					),
				),
			Effect_makeSemaphore = permits =>
				sync(() => unsafeMakeSemaphore(permits)),
			Effect_runFork = unsafeForkEffect,
			Effect_runPromise = unsafeRunPromiseEffect,
			Effect_runSync = unsafeRunSyncEffect,
			Effect_zip = zipOptions,
			Effect_zipLeft = zipLeftOptions,
			Effect_zipRight = zipRightOptions,
			Effect_zipWith = zipWithOptions,
			Effect_fromNullable = value =>
				null == value ? core_fail(new NoSuchElementException()) : succeed(value)
		var EMPTY_OBJ = {},
			EMPTY_ARR = [],
			hyperapp_id = a => a,
			hyperapp_map = EMPTY_ARR.map,
			hyperapp_isArray = Array.isArray,
			enqueue =
				"undefined" != typeof requestAnimationFrame
					? requestAnimationFrame
					: setTimeout,
			createClass = obj => {
				var out = ""
				if ("string" == typeof obj) return obj
				if (hyperapp_isArray(obj))
					for (var tmp, k = 0; k < obj.length; k++)
						(tmp = createClass(obj[k])) && (out += (out && " ") + tmp)
				else for (var k in obj) obj[k] && (out += (out && " ") + k)
				return out
			},
			shouldRestart = (a, b) => {
				for (var k in { ...a, ...b })
					if ("function" == typeof (hyperapp_isArray(a[k]) ? a[k][0] : a[k]))
						b[k] = a[k]
					else if (a[k] !== b[k]) return !0
			},
			getKey = vdom => (null == vdom ? vdom : vdom.key),
			patchProperty = (node, key, oldValue, newValue, listener, isSvg) => {
				if ("style" === key)
					for (var k in { ...oldValue, ...newValue }) {
						oldValue =
							null == newValue || null == newValue[k] ? "" : newValue[k]
						"-" === k[0]
							? node[key].setProperty(k, oldValue)
							: (node[key][k] = oldValue)
					}
				else
					"o" === key[0] && "n" === key[1]
						? ((node.events || (node.events = {}))[(key = key.slice(2))] =
								newValue)
							? oldValue || node.addEventListener(key, listener)
							: node.removeEventListener(key, listener)
						: !isSvg && "list" !== key && "form" !== key && key in node
							? (node[key] = newValue ?? "")
							: null == newValue || !1 === newValue
								? node.removeAttribute(key)
								: node.setAttribute(key, newValue)
			},
			createNode = (vdom, listener, isSvg) => {
				var props = vdom.props,
					node =
						3 === vdom.type
							? document.createTextNode(vdom.tag)
							: (isSvg = isSvg || "svg" === vdom.tag)
								? document.createElementNS(
										"http://www.w3.org/2000/svg",
										vdom.tag,
										props.is && props,
									)
								: document.createElement(vdom.tag, props.is && props)
				for (var k in props)
					patchProperty(node, k, null, props[k], listener, isSvg)
				for (var i = 0; i < vdom.children.length; i++)
					node.appendChild(
						createNode(
							(vdom.children[i] = maybeVNode(vdom.children[i])),
							listener,
							isSvg,
						),
					)
				return (vdom.node = node)
			},
			hyperapp_patch = (parent, node, oldVNode, newVNode, listener, isSvg) => {
				if (oldVNode === newVNode);
				else if (null != oldVNode && 3 === oldVNode.type && 3 === newVNode.type)
					oldVNode.tag !== newVNode.tag && (node.nodeValue = newVNode.tag)
				else if (null == oldVNode || oldVNode.tag !== newVNode.tag) {
					node = parent.insertBefore(
						createNode((newVNode = maybeVNode(newVNode)), listener, isSvg),
						node,
					)
					null != oldVNode && parent.removeChild(oldVNode.node)
				} else {
					var tmpVKid,
						oldVKid,
						oldKey,
						newKey,
						oldProps = oldVNode.props,
						newProps = newVNode.props,
						oldVKids = oldVNode.children,
						newVKids = newVNode.children,
						oldHead = 0,
						newHead = 0,
						oldTail = oldVKids.length - 1,
						newTail = newVKids.length - 1
					isSvg = isSvg || "svg" === newVNode.tag
					for (var i in { ...oldProps, ...newProps })
						("value" === i || "selected" === i || "checked" === i
							? node[i]
							: oldProps[i]) !== newProps[i] &&
							patchProperty(node, i, oldProps[i], newProps[i], listener, isSvg)
					for (
						;
						newHead <= newTail &&
						oldHead <= oldTail &&
						null != (oldKey = getKey(oldVKids[oldHead])) &&
						oldKey === getKey(newVKids[newHead]);
					)
						hyperapp_patch(
							node,
							oldVKids[oldHead].node,
							oldVKids[oldHead],
							(newVKids[newHead] = maybeVNode(
								newVKids[newHead++],
								oldVKids[oldHead++],
							)),
							listener,
							isSvg,
						)
					for (
						;
						newHead <= newTail &&
						oldHead <= oldTail &&
						null != (oldKey = getKey(oldVKids[oldTail])) &&
						oldKey === getKey(newVKids[newTail]);
					)
						hyperapp_patch(
							node,
							oldVKids[oldTail].node,
							oldVKids[oldTail],
							(newVKids[newTail] = maybeVNode(
								newVKids[newTail--],
								oldVKids[oldTail--],
							)),
							listener,
							isSvg,
						)
					if (oldHead > oldTail)
						for (; newHead <= newTail;)
							node.insertBefore(
								createNode(
									(newVKids[newHead] = maybeVNode(newVKids[newHead++])),
									listener,
									isSvg,
								),
								(oldVKid = oldVKids[oldHead]) && oldVKid.node,
							)
					else if (newHead > newTail)
						for (; oldHead <= oldTail;)
							node.removeChild(oldVKids[oldHead++].node)
					else {
						var keyed = {},
							newKeyed = {}
						for (i = oldHead; i <= oldTail; i++)
							null != (oldKey = oldVKids[i].key) &&
								(keyed[oldKey] = oldVKids[i])
						for (; newHead <= newTail;) {
							oldKey = getKey((oldVKid = oldVKids[oldHead]))
							newKey = getKey(
								(newVKids[newHead] = maybeVNode(newVKids[newHead], oldVKid)),
							)
							if (
								newKeyed[oldKey] ||
								(null != newKey && newKey === getKey(oldVKids[oldHead + 1]))
							) {
								null == oldKey && node.removeChild(oldVKid.node)
								oldHead++
							} else if (null == newKey || 1 === oldVNode.type) {
								if (null == oldKey) {
									hyperapp_patch(
										node,
										oldVKid && oldVKid.node,
										oldVKid,
										newVKids[newHead],
										listener,
										isSvg,
									)
									newHead++
								}
								oldHead++
							} else {
								if (oldKey === newKey) {
									hyperapp_patch(
										node,
										oldVKid.node,
										oldVKid,
										newVKids[newHead],
										listener,
										isSvg,
									)
									newKeyed[newKey] = !0
									oldHead++
								} else if (null != (tmpVKid = keyed[newKey])) {
									hyperapp_patch(
										node,
										node.insertBefore(tmpVKid.node, oldVKid && oldVKid.node),
										tmpVKid,
										newVKids[newHead],
										listener,
										isSvg,
									)
									newKeyed[newKey] = !0
								} else
									hyperapp_patch(
										node,
										oldVKid && oldVKid.node,
										null,
										newVKids[newHead],
										listener,
										isSvg,
									)
								newHead++
							}
						}
						for (; oldHead <= oldTail;)
							null == getKey((oldVKid = oldVKids[oldHead++])) &&
								node.removeChild(oldVKid.node)
						for (var i in keyed)
							null == newKeyed[i] && node.removeChild(keyed[i].node)
					}
				}
				return (newVNode.node = node)
			},
			maybeVNode = (newVNode, oldVNode) =>
				!0 !== newVNode && !1 !== newVNode && newVNode
					? "function" == typeof newVNode.tag
						? ((!oldVNode ||
								null == oldVNode.memo ||
								((a, b) => {
									for (var k in a) if (a[k] !== b[k]) return !0
									for (var k in b) if (a[k] !== b[k]) return !0
								})(oldVNode.memo, newVNode.memo)) &&
								((oldVNode = newVNode.tag(newVNode.memo)).memo = newVNode.memo),
							oldVNode)
						: newVNode
					: hyperapp_text(""),
			recycleNode = node =>
				3 === node.nodeType
					? hyperapp_text(node.nodeValue, node)
					: createVNode(
							node.nodeName.toLowerCase(),
							EMPTY_OBJ,
							hyperapp_map.call(node.childNodes, recycleNode),
							1,
							node,
						),
			createVNode = (tag, { key, ...props }, children, type, node) => ({
				tag,
				props,
				key,
				children,
				type,
				node,
			}),
			hyperapp_text = (value, node) =>
				createVNode(value, EMPTY_OBJ, EMPTY_ARR, 3, node),
			h = (tag, { class: c, ...props }, children = EMPTY_ARR) =>
				createVNode(
					tag,
					{ ...props, ...(c ? { class: createClass(c) } : EMPTY_OBJ) },
					hyperapp_isArray(children) ? children : [children],
				),
			app = ({
				node,
				view,
				subscriptions,
				dispatch = hyperapp_id,
				init = EMPTY_OBJ,
			}) => {
				var state,
					busy,
					vdom = node && recycleNode(node),
					subs = [],
					update = newState => {
						if (state !== newState) {
							null == (state = newState) &&
								(dispatch = subscriptions = render = hyperapp_id)
							subscriptions &&
								(subs = ((oldSubs, newSubs = EMPTY_ARR, dispatch) => {
									for (
										var oldSub, newSub, subs = [], i = 0;
										i < oldSubs.length || i < newSubs.length;
										i++
									) {
										oldSub = oldSubs[i]
										newSub = newSubs[i]
										subs.push(
											newSub && !0 !== newSub
												? !oldSub ||
													newSub[0] !== oldSub[0] ||
													shouldRestart(newSub[1], oldSub[1])
													? [
															newSub[0],
															newSub[1],
															(oldSub && oldSub[2](),
															newSub[0](dispatch, newSub[1])),
														]
													: oldSub
												: oldSub && oldSub[2](),
										)
									}
									return subs
								})(subs, subscriptions(state), dispatch))
							view && !busy && enqueue(render, (busy = !0))
						}
					},
					render = () =>
						(node = hyperapp_patch(
							node.parentNode,
							node,
							vdom,
							(vdom = view(state)),
							listener,
							(busy = !1),
						)),
					listener = function (event) {
						dispatch(this.events[event.type], event)
					}
				return (
					(dispatch = dispatch((action, props) =>
						"function" == typeof action
							? dispatch(action(state, props))
							: hyperapp_isArray(action)
								? "function" == typeof action[0]
									? dispatch(action[0], action[1])
									: action
											.slice(1)
											.map(
												fx => fx && !0 !== fx && (fx[0] || fx)(dispatch, fx[1]),
												update(action[0]),
											)
								: update(action),
					))(init),
					dispatch
				)
			}
		const wrapApp = (comp, init) =>
			pipe(
				Effect_sync(() => document.createElement(comp.tag)),
				Effect_flatMap(node =>
					Effect_sync(() => ({
						node,
						dispatch: app({ init, view: comp.view, node }),
					})),
				),
			)
		__webpack_require__.dn(wrapApp)
		;(Promise.resolve(!1), Promise.resolve(!0))
		var PROMISE_RESOLVED_VOID = Promise.resolve()
		function util_sleep(time, resolveWith) {
			time || (time = 0)
			return new Promise(function (res) {
				return setTimeout(function () {
					return res(resolveWith)
				}, time)
			})
		}
		function randomToken() {
			return Math.random().toString(36).substring(2)
		}
		var lastMs = 0
		function microSeconds() {
			var ret = 1e3 * Date.now()
			ret <= lastMs && (ret = lastMs + 1)
			lastMs = ret
			return ret
		}
		var NativeMethod = {
			create: function (channelName) {
				var state = {
					time: microSeconds(),
					messagesCallback: null,
					bc: new BroadcastChannel(channelName),
					subFns: [],
				}
				state.bc.onmessage = function (msgEvent) {
					state.messagesCallback && state.messagesCallback(msgEvent.data)
				}
				return state
			},
			close: function (channelState) {
				channelState.bc.close()
				channelState.subFns = []
			},
			onMessage: function (channelState, fn) {
				channelState.messagesCallback = fn
			},
			postMessage: function (channelState, messageJson) {
				try {
					channelState.bc.postMessage(messageJson, !1)
					return PROMISE_RESOLVED_VOID
				} catch (err) {
					return Promise.reject(err)
				}
			},
			canBeUsed: function () {
				if (
					"undefined" != typeof globalThis &&
					globalThis.Deno &&
					globalThis.Deno.args
				)
					return !0
				if (
					("undefined" == typeof window && "undefined" == typeof self) ||
					"function" != typeof BroadcastChannel
				)
					return !1
				if (BroadcastChannel._pubkey)
					throw new Error(
						"BroadcastChannel: Do not overwrite window.BroadcastChannel with this module, this is not a polyfill",
					)
				return !0
			},
			type: "native",
			averageResponseTime: function () {
				return 150
			},
			microSeconds,
		}
		class ObliviousSet {
			ttl
			map = new Map()
			_to = !1
			constructor(ttl) {
				this.ttl = ttl
			}
			has(value) {
				const valueTime = this.map.get(value)
				if (void 0 === valueTime) return !1
				if (valueTime < src_now() - this.ttl) {
					this.map.delete(value)
					return !1
				}
				return !0
			}
			add(value) {
				this.map.delete(value)
				this.map.set(value, src_now())
				if (!this._to) {
					this._to = !0
					setTimeout(() => {
						this._to = !1
						!(function (obliviousSet) {
							const olderThen = src_now() - obliviousSet.ttl,
								iterator = obliviousSet.map[Symbol.iterator]()
							for (;;) {
								const next = iterator.next().value
								if (!next) break
								const value = next[0]
								if (!(next[1] < olderThen)) break
								obliviousSet.map.delete(value)
							}
						})(this)
					}, 0)
				}
			}
			clear() {
				this.map.clear()
			}
		}
		function src_now() {
			return Date.now()
		}
		function fillOptionsWithDefaults() {
			var originalOptions =
					arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
				options = JSON.parse(JSON.stringify(originalOptions))
			void 0 === options.webWorkerSupport && (options.webWorkerSupport = !0)
			options.idb || (options.idb = {})
			options.idb.ttl || (options.idb.ttl = 45e3)
			options.idb.fallbackInterval || (options.idb.fallbackInterval = 150)
			originalOptions.idb &&
				"function" == typeof originalOptions.idb.onclose &&
				(options.idb.onclose = originalOptions.idb.onclose)
			options.localstorage || (options.localstorage = {})
			options.localstorage.removeTimeout ||
				(options.localstorage.removeTimeout = 6e4)
			originalOptions.methods && (options.methods = originalOptions.methods)
			options.node || (options.node = {})
			options.node.ttl || (options.node.ttl = 12e4)
			options.node.maxParallelWrites || (options.node.maxParallelWrites = 2048)
			void 0 === options.node.useFastPath && (options.node.useFastPath = !0)
			return options
		}
		var TRANSACTION_SETTINGS = { durability: "relaxed" }
		function getIdb() {
			if ("undefined" != typeof indexedDB) return indexedDB
			if ("undefined" != typeof window) {
				if (void 0 !== window.mozIndexedDB) return window.mozIndexedDB
				if (void 0 !== window.webkitIndexedDB) return window.webkitIndexedDB
				if (void 0 !== window.msIndexedDB) return window.msIndexedDB
			}
			return !1
		}
		function commitIndexedDBTransaction(tx) {
			tx.commit && tx.commit()
		}
		function _readLoop(state) {
			state.closed ||
				readNewMessages(state)
					.then(function () {
						return util_sleep(state.options.idb.fallbackInterval)
					})
					.then(function () {
						return _readLoop(state)
					})
		}
		function readNewMessages(state) {
			return state.closed
				? PROMISE_RESOLVED_VOID
				: state.messagesCallback
					? (function (db, lastCursorId) {
							var tx = db.transaction(
									"messages",
									"readonly",
									TRANSACTION_SETTINGS,
								),
								objectStore = tx.objectStore("messages"),
								ret = [],
								keyRangeValue = IDBKeyRange.bound(lastCursorId + 1, 1 / 0)
							if (objectStore.getAll) {
								var getAllRequest = objectStore.getAll(keyRangeValue)
								return new Promise(function (res, rej) {
									getAllRequest.onerror = function (err) {
										return rej(err)
									}
									getAllRequest.onsuccess = function (e) {
										res(e.target.result)
									}
								})
							}
							return new Promise(function (res, rej) {
								var openCursorRequest = (function () {
									try {
										keyRangeValue = IDBKeyRange.bound(lastCursorId + 1, 1 / 0)
										return objectStore.openCursor(keyRangeValue)
									} catch (e) {
										return objectStore.openCursor()
									}
								})()
								openCursorRequest.onerror = function (err) {
									return rej(err)
								}
								openCursorRequest.onsuccess = function (ev) {
									var cursor = ev.target.result
									if (cursor)
										if (cursor.value.id < lastCursorId + 1)
											cursor.continue(lastCursorId + 1)
										else {
											ret.push(cursor.value)
											cursor.continue()
										}
									else {
										commitIndexedDBTransaction(tx)
										res(ret)
									}
								}
							})
						})(state.db, state.lastCursorId).then(function (newerMessages) {
							var useMessages = newerMessages
								.filter(function (msgObj) {
									return !!msgObj
								})
								.map(function (msgObj) {
									msgObj.id > state.lastCursorId &&
										(state.lastCursorId = msgObj.id)
									return msgObj
								})
								.filter(function (msgObj) {
									return (function (msgObj, state) {
										return !(
											msgObj.uuid === state.uuid ||
											state.eMIs.has(msgObj.id) ||
											msgObj.data.time < state.messagesCallbackTime
										)
									})(msgObj, state)
								})
								.sort(function (msgObjA, msgObjB) {
									return msgObjA.time - msgObjB.time
								})
							useMessages.forEach(function (msgObj) {
								if (state.messagesCallback) {
									state.eMIs.add(msgObj.id)
									state.messagesCallback(msgObj.data)
								}
							})
							return PROMISE_RESOLVED_VOID
						})
					: PROMISE_RESOLVED_VOID
		}
		var IndexedDBMethod = {
			create: function (channelName, options) {
				options = fillOptionsWithDefaults(options)
				return (function (channelName) {
					var dbName = "pubkey.broadcast-channel-0-" + channelName,
						openRequest = getIdb().open(dbName)
					openRequest.onupgradeneeded = function (ev) {
						ev.target.result.createObjectStore("messages", {
							keyPath: "id",
							autoIncrement: !0,
						})
					}
					return new Promise(function (res, rej) {
						openRequest.onerror = function (ev) {
							return rej(ev)
						}
						openRequest.onsuccess = function () {
							res(openRequest.result)
						}
					})
				})(channelName).then(function (db) {
					var state = {
						closed: !1,
						lastCursorId: 0,
						channelName,
						options,
						uuid: randomToken(),
						eMIs: new ObliviousSet(2 * options.idb.ttl),
						writeBlockPromise: PROMISE_RESOLVED_VOID,
						messagesCallback: null,
						readQueuePromises: [],
						db,
					}
					db.onclose = function () {
						state.closed = !0
						options.idb.onclose && options.idb.onclose()
					}
					_readLoop(state)
					return state
				})
			},
			close: function (channelState) {
				channelState.closed = !0
				channelState.db.close()
			},
			onMessage: function (channelState, fn, time) {
				channelState.messagesCallbackTime = time
				channelState.messagesCallback = fn
				readNewMessages(channelState)
			},
			postMessage: function (channelState, messageJson) {
				channelState.writeBlockPromise = channelState.writeBlockPromise
					.then(function () {
						return (function (db, readerUuid, messageJson) {
							var writeObject = {
									uuid: readerUuid,
									time: Date.now(),
									data: messageJson,
								},
								tx = db.transaction(
									["messages"],
									"readwrite",
									TRANSACTION_SETTINGS,
								)
							return new Promise(function (res, rej) {
								tx.oncomplete = function () {
									return res()
								}
								tx.onerror = function (ev) {
									return rej(ev)
								}
								tx.objectStore("messages").add(writeObject)
								commitIndexedDBTransaction(tx)
							})
						})(channelState.db, channelState.uuid, messageJson)
					})
					.then(function () {
						0 === Math.floor(11 * Math.random() + 0) &&
							(function (channelState) {
								return ((db = channelState.db),
								(ttl = channelState.options.idb.ttl),
								(olderThen = Date.now() - ttl),
								(tx = db.transaction(
									"messages",
									"readonly",
									TRANSACTION_SETTINGS,
								)),
								(objectStore = tx.objectStore("messages")),
								(ret = []),
								new Promise(function (res) {
									objectStore.openCursor().onsuccess = function (ev) {
										var cursor = ev.target.result
										if (cursor) {
											var msgObk = cursor.value
											if (msgObk.time < olderThen) {
												ret.push(msgObk)
												cursor.continue()
											} else {
												commitIndexedDBTransaction(tx)
												res(ret)
											}
										} else res(ret)
									}
								})).then(function (tooOld) {
									return (function (channelState, ids) {
										if (channelState.closed) return Promise.resolve([])
										var objectStore = channelState.db
											.transaction(
												"messages",
												"readwrite",
												TRANSACTION_SETTINGS,
											)
											.objectStore("messages")
										return Promise.all(
											ids.map(function (id) {
												var deleteRequest = objectStore.delete(id)
												return new Promise(function (res) {
													deleteRequest.onsuccess = function () {
														return res()
													}
												})
											}),
										)
									})(
										channelState,
										tooOld.map(function (msg) {
											return msg.id
										}),
									)
								})
								var db, ttl, olderThen, tx, objectStore, ret
							})(channelState)
					})
				return channelState.writeBlockPromise
			},
			canBeUsed: function () {
				return !!getIdb()
			},
			type: "idb",
			averageResponseTime: function (options) {
				return 2 * options.idb.fallbackInterval
			},
			microSeconds,
		}
		function getLocalStorage() {
			var localStorage
			if ("undefined" == typeof window) return null
			try {
				localStorage = window.localStorage
				localStorage =
					window["ie8-eventlistener/storage"] || window.localStorage
			} catch (e) {}
			return localStorage
		}
		function storageKey(channelName) {
			return "pubkey.broadcastChannel-" + channelName
		}
		function localstorage_canBeUsed() {
			var ls = getLocalStorage()
			if (!ls) return !1
			try {
				var key = "__broadcastchannel_check"
				ls.setItem(key, "works")
				ls.removeItem(key)
			} catch (e) {
				return !1
			}
			return !0
		}
		var LocalstorageMethod = {
				create: function (channelName, options) {
					options = fillOptionsWithDefaults(options)
					if (!localstorage_canBeUsed())
						throw new Error("BroadcastChannel: localstorage cannot be used")
					var uuid = randomToken(),
						eMIs = new ObliviousSet(options.localstorage.removeTimeout),
						state = { channelName, uuid, eMIs }
					state.listener = (function (channelName) {
						var key = storageKey(channelName),
							listener = function (ev) {
								ev.key === key &&
									(function (msgObj) {
										if (
											state.messagesCallback &&
											msgObj.uuid !== uuid &&
											msgObj.token &&
											!eMIs.has(msgObj.token) &&
											!(
												msgObj.data.time &&
												msgObj.data.time < state.messagesCallbackTime
											)
										) {
											eMIs.add(msgObj.token)
											state.messagesCallback(msgObj.data)
										}
									})(JSON.parse(ev.newValue))
							}
						window.addEventListener("storage", listener)
						return listener
					})(channelName)
					return state
				},
				close: function (channelState) {
					;((listener = channelState.listener),
						window.removeEventListener("storage", listener))
					var listener
				},
				onMessage: function (channelState, fn, time) {
					channelState.messagesCallbackTime = time
					channelState.messagesCallback = fn
				},
				postMessage: function (channelState, messageJson) {
					return new Promise(function (res) {
						util_sleep().then(function () {
							var key = storageKey(channelState.channelName),
								writeObj = {
									token: randomToken(),
									time: Date.now(),
									data: messageJson,
									uuid: channelState.uuid,
								},
								value = JSON.stringify(writeObj)
							getLocalStorage().setItem(key, value)
							var ev = document.createEvent("Event")
							ev.initEvent("storage", !0, !0)
							ev.key = key
							ev.newValue = value
							window.dispatchEvent(ev)
							res()
						})
					})
				},
				canBeUsed: localstorage_canBeUsed,
				type: "localstorage",
				averageResponseTime: function () {
					var userAgent = navigator.userAgent.toLowerCase()
					return userAgent.includes("safari") && !userAgent.includes("chrome")
						? 240
						: 120
				},
				microSeconds,
			},
			simulate_microSeconds = microSeconds,
			SIMULATE_CHANNELS = new Set(),
			SimulateMethod = {
				create: function (channelName) {
					var state = {
						time: simulate_microSeconds(),
						name: channelName,
						messagesCallback: null,
					}
					SIMULATE_CHANNELS.add(state)
					return state
				},
				close: function (channelState) {
					SIMULATE_CHANNELS.delete(channelState)
				},
				onMessage: function (channelState, fn) {
					channelState.messagesCallback = fn
				},
				postMessage: function (channelState, messageJson) {
					return new Promise(function (res) {
						return setTimeout(function () {
							Array.from(SIMULATE_CHANNELS).forEach(function (channel) {
								channel.name === channelState.name &&
									channel !== channelState &&
									channel.messagesCallback &&
									channel.time < messageJson.time &&
									channel.messagesCallback(messageJson)
							})
							res()
						}, 5)
					})
				},
				canBeUsed: function () {
					return !0
				},
				type: "simulate",
				averageResponseTime: function () {
					return 5
				},
				microSeconds: simulate_microSeconds,
			},
			METHODS = [NativeMethod, IndexedDBMethod, LocalstorageMethod],
			OPEN_BROADCAST_CHANNELS = new Set(),
			lastId = 0,
			broadcast_channel_BroadcastChannel = function (name, options) {
				this.id = lastId++
				OPEN_BROADCAST_CHANNELS.add(this)
				this.name = name
				this.options = fillOptionsWithDefaults(options)
				this.method = (function (options) {
					var chooseMethods = []
						.concat(options.methods, METHODS)
						.filter(Boolean)
					if (options.type) {
						if ("simulate" === options.type) return SimulateMethod
						var ret = chooseMethods.find(function (m) {
							return m.type === options.type
						})
						if (ret) return ret
						throw new Error("method-type " + options.type + " not found")
					}
					options.webWorkerSupport ||
						(chooseMethods = chooseMethods.filter(function (m) {
							return "idb" !== m.type
						}))
					var useMethod = chooseMethods.find(function (method) {
						return method.canBeUsed()
					})
					if (useMethod) return useMethod
					throw new Error(
						"No usable method found in " +
							JSON.stringify(
								METHODS.map(function (m) {
									return m.type
								}),
							),
					)
				})(this.options)
				this._iL = !1
				this._onML = null
				this._addEL = { message: [], internal: [] }
				this._uMP = new Set()
				this._befC = []
				this._prepP = null
				!(function (channel) {
					var obj,
						maybePromise = channel.method.create(channel.name, channel.options)
					if ((obj = maybePromise) && "function" == typeof obj.then) {
						channel._prepP = maybePromise
						maybePromise.then(function (s) {
							channel._state = s
						})
					} else channel._state = maybePromise
				})(this)
			}
		broadcast_channel_BroadcastChannel._pubkey = !0
		broadcast_channel_BroadcastChannel.prototype = {
			postMessage: function (msg) {
				if (this.closed)
					throw new Error(
						"BroadcastChannel.postMessage(): Cannot post message after channel has closed " +
							JSON.stringify(msg),
					)
				return _post(this, "message", msg)
			},
			postInternal: function (msg) {
				return _post(this, "internal", msg)
			},
			set onmessage(fn) {
				var listenObj = { time: this.method.microSeconds(), fn }
				_removeListenerObject(this, "message", this._onML)
				if (fn && "function" == typeof fn) {
					this._onML = listenObj
					_addListenerObject(this, "message", listenObj)
				} else this._onML = null
			},
			addEventListener: function (type, fn) {
				_addListenerObject(this, type, { time: this.method.microSeconds(), fn })
			},
			removeEventListener: function (type, fn) {
				_removeListenerObject(
					this,
					type,
					this._addEL[type].find(function (obj) {
						return obj.fn === fn
					}),
				)
			},
			close: function () {
				var _this = this
				if (!this.closed) {
					OPEN_BROADCAST_CHANNELS.delete(this)
					this.closed = !0
					var awaitPrepare = this._prepP ? this._prepP : PROMISE_RESOLVED_VOID
					this._onML = null
					this._addEL.message = []
					return awaitPrepare
						.then(function () {
							return Promise.all(Array.from(_this._uMP))
						})
						.then(function () {
							return Promise.all(
								_this._befC.map(function (fn) {
									return fn()
								}),
							)
						})
						.then(function () {
							return _this.method.close(_this._state)
						})
				}
			},
			get type() {
				return this.method.type
			},
			get isClosed() {
				return this.closed
			},
		}
		function _post(broadcastChannel, type, msg) {
			var msgObj = {
				time: broadcastChannel.method.microSeconds(),
				type,
				data: msg,
			}
			return (
				broadcastChannel._prepP
					? broadcastChannel._prepP
					: PROMISE_RESOLVED_VOID
			).then(function () {
				var sendPromise = broadcastChannel.method.postMessage(
					broadcastChannel._state,
					msgObj,
				)
				broadcastChannel._uMP.add(sendPromise)
				sendPromise.catch().then(function () {
					return broadcastChannel._uMP.delete(sendPromise)
				})
				return sendPromise
			})
		}
		function _hasMessageListeners(channel) {
			return (
				channel._addEL.message.length > 0 || channel._addEL.internal.length > 0
			)
		}
		function _addListenerObject(channel, type, obj) {
			channel._addEL[type].push(obj)
			!(function (channel) {
				if (!channel._iL && _hasMessageListeners(channel)) {
					var listenerFn = function (msgObj) {
							channel._addEL[msgObj.type].forEach(function (listenerObject) {
								msgObj.time >= listenerObject.time &&
									listenerObject.fn(msgObj.data)
							})
						},
						time = channel.method.microSeconds()
					if (channel._prepP)
						channel._prepP.then(function () {
							channel._iL = !0
							channel.method.onMessage(channel._state, listenerFn, time)
						})
					else {
						channel._iL = !0
						channel.method.onMessage(channel._state, listenerFn, time)
					}
				}
			})(channel)
		}
		function _removeListenerObject(channel, type, obj) {
			channel._addEL[type] = channel._addEL[type].filter(function (o) {
				return o !== obj
			})
			!(function (channel) {
				if (channel._iL && !_hasMessageListeners(channel)) {
					channel._iL = !1
					var time = channel.method.microSeconds()
					channel.method.onMessage(channel._state, null, time)
				}
			})(channel)
		}
		const SynchronizedRefTypeId = SynchronizedTypeId,
			SynchronizedRef_make = makeSynchronized,
			SynchronizedRef_get = ref_get,
			SynchronizedRef_set = ref_set,
			SynchronizedRef_update = ref_update,
			Schedule_driver = driver,
			Schedule_fixed = intervalInput => {
				const interval = decode(intervalInput),
					intervalMillis = toMillis(interval)
				return makeWithState([Option_none(), 0], (now, _, [option, n]) =>
					sync(() => {
						switch (option._tag) {
							case "None":
								return [
									[Option_some([now, now + intervalMillis]), n + 1],
									n,
									ScheduleDecision_continueWith(
										ScheduleInterval_after(now + intervalMillis),
									),
								]
							case "Some": {
								const [startMillis, lastRun] = option.value,
									runningBehind = now > lastRun + intervalMillis,
									boundary = equals(interval, zero)
										? interval
										: Duration_millis(
												intervalMillis - ((now - startMillis) % intervalMillis),
											),
									sleepTime = equals(boundary, zero) ? interval : boundary,
									nextRun = runningBehind ? now : now + toMillis(sleepTime)
								return [
									[Option_some([startMillis, nextRun]), n + 1],
									n,
									ScheduleDecision_continueWith(
										ScheduleInterval_after(nextRun),
									),
								]
							}
						}
					}),
				)
			},
			EnqueueTypeId = Symbol.for("effect/QueueEnqueue"),
			DequeueTypeId = Symbol.for("effect/QueueDequeue"),
			QueueStrategyTypeId = Symbol.for("effect/QueueStrategy"),
			BackingQueueTypeId = Symbol.for("effect/BackingQueue"),
			queueStrategyVariance = { _A: _ => _ },
			backingQueueVariance = { _A: _ => _ },
			enqueueVariance = { _In: _ => _ },
			dequeueVariance = { _Out: _ => _ }
		class QueueImpl extends Effectable_Class {
			queue
			takers
			shutdownHook
			shutdownFlag
			strategy;
			[EnqueueTypeId] = enqueueVariance;
			[DequeueTypeId] = dequeueVariance
			constructor(queue, takers, shutdownHook, shutdownFlag, strategy) {
				super()
				this.queue = queue
				this.takers = takers
				this.shutdownHook = shutdownHook
				this.shutdownFlag = shutdownFlag
				this.strategy = strategy
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
			commit() {
				return this.take
			}
			capacity() {
				return this.queue.capacity()
			}
			get size() {
				return suspend(() => catchAll(this.unsafeSize(), () => core_interrupt))
			}
			unsafeSize() {
				return MutableRef_get(this.shutdownFlag)
					? Option_none()
					: Option_some(
							this.queue.length() -
								MutableQueue_length(this.takers) +
								this.strategy.surplusSize(),
						)
			}
			get isEmpty() {
				return core_map(this.size, size => size <= 0)
			}
			get isFull() {
				return core_map(this.size, size => size >= this.capacity())
			}
			get shutdown() {
				return uninterruptible(
					withFiberRuntime(state => {
						pipe(this.shutdownFlag, MutableRef_set(!0))
						return pipe(
							forEachConcurrentDiscard(
								unsafePollAll(this.takers),
								d => deferredInterruptWith(d, state.id()),
								!1,
								!1,
							),
							core_zipRight(this.strategy.shutdown),
							whenEffect(deferredSucceed(this.shutdownHook, void 0)),
							core_asVoid,
						)
					}),
				)
			}
			get isShutdown() {
				return sync(() => MutableRef_get(this.shutdownFlag))
			}
			get awaitShutdown() {
				return deferredAwait(this.shutdownHook)
			}
			isActive() {
				return !MutableRef_get(this.shutdownFlag)
			}
			unsafeOffer(value) {
				if (MutableRef_get(this.shutdownFlag)) return !1
				let noRemaining
				if (0 === this.queue.length()) {
					const taker = pipe(this.takers, MutableQueue_poll(EmptyMutableQueue))
					if (taker !== EmptyMutableQueue) {
						unsafeCompleteDeferred(taker, value)
						noRemaining = !0
					} else noRemaining = !1
				} else noRemaining = !1
				if (noRemaining) return !0
				const succeeded = this.queue.offer(value)
				unsafeCompleteTakers(this.strategy, this.queue, this.takers)
				return succeeded
			}
			offer(value) {
				return suspend(() => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					let noRemaining
					if (0 === this.queue.length()) {
						const taker = pipe(
							this.takers,
							MutableQueue_poll(EmptyMutableQueue),
						)
						if (taker !== EmptyMutableQueue) {
							unsafeCompleteDeferred(taker, value)
							noRemaining = !0
						} else noRemaining = !1
					} else noRemaining = !1
					if (noRemaining) return succeed(!0)
					const succeeded = this.queue.offer(value)
					unsafeCompleteTakers(this.strategy, this.queue, this.takers)
					return succeeded
						? succeed(!0)
						: this.strategy.handleSurplus(
								[value],
								this.queue,
								this.takers,
								this.shutdownFlag,
							)
				})
			}
			offerAll(iterable) {
				return suspend(() => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					const values = Array_fromIterable(iterable),
						pTakers =
							0 === this.queue.length()
								? Array_fromIterable(unsafePollN(this.takers, values.length))
								: Array_empty,
						[forTakers, remaining] = pipe(values, splitAt(pTakers.length))
					for (let i = 0; i < pTakers.length; i++) {
						const taker = pTakers[i],
							item = forTakers[i]
						unsafeCompleteDeferred(taker, item)
					}
					if (0 === remaining.length) return succeed(!0)
					const surplus = this.queue.offerAll(remaining)
					unsafeCompleteTakers(this.strategy, this.queue, this.takers)
					return Chunk_isEmpty(surplus)
						? succeed(!0)
						: this.strategy.handleSurplus(
								surplus,
								this.queue,
								this.takers,
								this.shutdownFlag,
							)
				})
			}
			get take() {
				return withFiberRuntime(state => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					const item = this.queue.poll(EmptyMutableQueue)
					if (item !== EmptyMutableQueue) {
						this.strategy.unsafeOnQueueEmptySpace(this.queue, this.takers)
						return succeed(item)
					}
					{
						const deferred = deferredUnsafeMake(state.id())
						return pipe(
							suspend(() => {
								pipe(this.takers, offer(deferred))
								unsafeCompleteTakers(this.strategy, this.queue, this.takers)
								return MutableRef_get(this.shutdownFlag)
									? core_interrupt
									: deferredAwait(deferred)
							}),
							onInterrupt(() =>
								sync(() => unsafeRemove(this.takers, deferred)),
							),
						)
					}
				})
			}
			get takeAll() {
				return suspend(() =>
					MutableRef_get(this.shutdownFlag)
						? core_interrupt
						: sync(() => {
								const values = this.queue.pollUpTo(Number.POSITIVE_INFINITY)
								this.strategy.unsafeOnQueueEmptySpace(this.queue, this.takers)
								return Chunk_fromIterable(values)
							}),
				)
			}
			takeUpTo(max) {
				return suspend(() =>
					MutableRef_get(this.shutdownFlag)
						? core_interrupt
						: sync(() => {
								const values = this.queue.pollUpTo(max)
								this.strategy.unsafeOnQueueEmptySpace(this.queue, this.takers)
								return Chunk_fromIterable(values)
							}),
				)
			}
			takeBetween(min, max) {
				return suspend(() =>
					takeRemainderLoop(this, min, max, esm_Chunk_empty()),
				)
			}
		}
		const takeRemainderLoop = (self, min, max, acc) =>
				max < min
					? succeed(acc)
					: pipe(
							takeUpTo(self, max),
							core_flatMap(bs => {
								const remaining = min - bs.length
								return 1 === remaining
									? pipe(
											queue_take(self),
											core_map(b =>
												pipe(acc, Chunk_appendAll(bs), Chunk_append(b)),
											),
										)
									: remaining > 1
										? pipe(
												queue_take(self),
												core_flatMap(b =>
													takeRemainderLoop(
														self,
														remaining - 1,
														max - bs.length - 1,
														pipe(acc, Chunk_appendAll(bs), Chunk_append(b)),
													),
												),
											)
										: succeed(pipe(acc, Chunk_appendAll(bs)))
							}),
						),
			queue_make = (queue, strategy) =>
				pipe(
					deferredMake(),
					core_map(deferred =>
						((queue, takers, shutdownHook, shutdownFlag, strategy) =>
							new QueueImpl(
								queue,
								takers,
								shutdownHook,
								shutdownFlag,
								strategy,
							))(queue, unbounded(), deferred, MutableRef_make(!1), strategy),
					),
				)
		class BackingQueueFromMutableQueue {
			mutable;
			[BackingQueueTypeId] = backingQueueVariance
			constructor(mutable) {
				this.mutable = mutable
			}
			poll(def) {
				return MutableQueue_poll(this.mutable, def)
			}
			pollUpTo(limit) {
				return pollUpTo(this.mutable, limit)
			}
			offerAll(elements) {
				return offerAll(this.mutable, elements)
			}
			offer(element) {
				return offer(this.mutable, element)
			}
			capacity() {
				return (self => (void 0 === self.capacity ? 1 / 0 : self.capacity))(
					this.mutable,
				)
			}
			length() {
				return MutableQueue_length(this.mutable)
			}
		}
		const backingQueueFromMutableQueue = mutable =>
				new BackingQueueFromMutableQueue(mutable),
			queue_offer = dual(2, (self, value) => self.offer(value)),
			unsafeOffer = dual(2, (self, value) => self.unsafeOffer(value)),
			queue_take = self => self.take,
			takeUpTo = dual(2, (self, max) => self.takeUpTo(max)),
			takeBetween = dual(3, (self, min, max) => self.takeBetween(min, max)),
			droppingStrategy = () => new DroppingStrategy()
		class BackPressureStrategy {
			[QueueStrategyTypeId] = queueStrategyVariance
			putters = unbounded()
			surplusSize() {
				return MutableQueue_length(this.putters)
			}
			onCompleteTakersWithEmptyQueue(takers) {
				for (
					;
					!MutableQueue_isEmpty(this.putters) && !MutableQueue_isEmpty(takers);
				) {
					const taker = MutableQueue_poll(takers, void 0),
						putter = MutableQueue_poll(this.putters, void 0)
					putter[2] && unsafeCompleteDeferred(putter[1], !0)
					unsafeCompleteDeferred(taker, putter[0])
				}
			}
			get shutdown() {
				return pipe(
					fiberId,
					core_flatMap(fiberId =>
						pipe(
							sync(() => unsafePollAll(this.putters)),
							core_flatMap(putters =>
								forEachConcurrentDiscard(
									putters,
									([_, deferred, isLastItem]) =>
										isLastItem
											? pipe(
													deferredInterruptWith(deferred, fiberId),
													core_asVoid,
												)
											: core_void_,
									!1,
									!1,
								),
							),
						),
					),
				)
			}
			handleSurplus(iterable, queue, takers, isShutdown) {
				return withFiberRuntime(state => {
					const deferred = deferredUnsafeMake(state.id())
					return pipe(
						suspend(() => {
							this.unsafeOffer(iterable, deferred)
							this.unsafeOnQueueEmptySpace(queue, takers)
							unsafeCompleteTakers(this, queue, takers)
							return MutableRef_get(isShutdown)
								? core_interrupt
								: deferredAwait(deferred)
						}),
						onInterrupt(() => sync(() => this.unsafeRemove(deferred))),
					)
				})
			}
			unsafeOnQueueEmptySpace(queue, takers) {
				let keepPolling = !0
				for (
					;
					keepPolling &&
					(queue.capacity() === Number.POSITIVE_INFINITY ||
						queue.length() < queue.capacity());
				) {
					const putter = pipe(
						this.putters,
						MutableQueue_poll(EmptyMutableQueue),
					)
					if (putter === EmptyMutableQueue) keepPolling = !1
					else {
						const offered = queue.offer(putter[0])
						offered && putter[2]
							? unsafeCompleteDeferred(putter[1], !0)
							: offered ||
								unsafeOfferAll(
									this.putters,
									pipe(unsafePollAll(this.putters), Chunk_prepend(putter)),
								)
						unsafeCompleteTakers(this, queue, takers)
					}
				}
			}
			unsafeOffer(iterable, deferred) {
				const stuff = Array_fromIterable(iterable)
				for (let i = 0; i < stuff.length; i++) {
					const value = stuff[i]
					i === stuff.length - 1
						? pipe(this.putters, offer([value, deferred, !0]))
						: pipe(this.putters, offer([value, deferred, !1]))
				}
			}
			unsafeRemove(deferred) {
				unsafeOfferAll(
					this.putters,
					pipe(
						unsafePollAll(this.putters),
						Chunk_filter(([, _]) => _ !== deferred),
					),
				)
			}
		}
		class DroppingStrategy {
			[QueueStrategyTypeId] = queueStrategyVariance
			surplusSize() {
				return 0
			}
			get shutdown() {
				return core_void_
			}
			onCompleteTakersWithEmptyQueue() {}
			handleSurplus(_iterable, _queue, _takers, _isShutdown) {
				return succeed(!1)
			}
			unsafeOnQueueEmptySpace(_queue, _takers) {}
		}
		class SlidingStrategy {
			[QueueStrategyTypeId] = queueStrategyVariance
			surplusSize() {
				return 0
			}
			get shutdown() {
				return core_void_
			}
			onCompleteTakersWithEmptyQueue() {}
			handleSurplus(iterable, queue, takers, _isShutdown) {
				return sync(() => {
					this.unsafeOffer(queue, iterable)
					unsafeCompleteTakers(this, queue, takers)
					return !0
				})
			}
			unsafeOnQueueEmptySpace(_queue, _takers) {}
			unsafeOffer(queue, iterable) {
				const iterator = iterable[Symbol.iterator]()
				let next,
					offering = !0
				for (; !(next = iterator.next()).done && offering;) {
					if (0 === queue.capacity()) return
					queue.poll(EmptyMutableQueue)
					offering = queue.offer(next.value)
				}
			}
		}
		const unsafeCompleteDeferred = (deferred, a) =>
				deferredUnsafeDone(deferred, succeed(a)),
			unsafeOfferAll = (queue, as) => pipe(queue, offerAll(as)),
			unsafePollAll = queue => pipe(queue, pollUpTo(Number.POSITIVE_INFINITY)),
			unsafePollN = (queue, max) => pipe(queue, pollUpTo(max)),
			unsafeRemove = (queue, a) => {
				unsafeOfferAll(
					queue,
					pipe(
						unsafePollAll(queue),
						Chunk_filter(b => a !== b),
					),
				)
			},
			unsafeCompleteTakers = (strategy, queue, takers) => {
				let keepPolling = !0
				for (; keepPolling && 0 !== queue.length();) {
					const taker = pipe(takers, MutableQueue_poll(EmptyMutableQueue))
					if (taker !== EmptyMutableQueue) {
						const element = queue.poll(EmptyMutableQueue)
						if (element !== EmptyMutableQueue) {
							unsafeCompleteDeferred(taker, element)
							strategy.unsafeOnQueueEmptySpace(queue, takers)
						} else
							unsafeOfferAll(
								takers,
								pipe(unsafePollAll(takers), Chunk_prepend(taker)),
							)
						keepPolling = !0
					} else keepPolling = !1
				}
				keepPolling &&
					0 === queue.length() &&
					!MutableQueue_isEmpty(takers) &&
					strategy.onCompleteTakersWithEmptyQueue(takers)
			},
			Queue_bounded = requestedCapacity =>
				pipe(
					sync(() => bounded(requestedCapacity)),
					core_flatMap(queue =>
						queue_make(
							backingQueueFromMutableQueue(queue),
							new BackPressureStrategy(),
						),
					),
				),
			Queue_unbounded = () =>
				pipe(
					sync(() => unbounded()),
					core_flatMap(queue =>
						queue_make(backingQueueFromMutableQueue(queue), droppingStrategy()),
					),
				),
			Queue_shutdown = self => self.shutdown,
			Queue_offer = queue_offer,
			Queue_unsafeOffer = unsafeOffer,
			Queue_take = queue_take,
			Queue_takeBetween = takeBetween,
			FiberRef_unsafeMake = fiberRefUnsafeMake,
			getWith = fiberRefGetWith,
			FiberRef_currentScheduler = currentScheduler,
			ChildExecutorDecisionTypeId = Symbol.for(
				"effect/ChannelChildExecutorDecision",
			),
			childExecutorDecision_proto = {
				[ChildExecutorDecisionTypeId]: ChildExecutorDecisionTypeId,
			},
			Continue = _ => {
				const op = Object.create(childExecutorDecision_proto)
				op._tag = "Continue"
				return op
			},
			ContinuationTypeId = Symbol.for("effect/ChannelContinuation"),
			continuationVariance = {
				_Env: _ => _,
				_InErr: _ => _,
				_InElem: _ => _,
				_InDone: _ => _,
				_OutErr: _ => _,
				_OutDone: _ => _,
				_OutErr2: _ => _,
				_OutElem: _ => _,
				_OutDone2: _ => _,
			}
		class ContinuationKImpl {
			onSuccess
			onHalt
			_tag = "ContinuationK";
			[ContinuationTypeId] = continuationVariance
			constructor(onSuccess, onHalt) {
				this.onSuccess = onSuccess
				this.onHalt = onHalt
			}
			onExit(exit) {
				return Exit_isFailure(exit)
					? this.onHalt(exit.cause)
					: this.onSuccess(exit.value)
			}
		}
		class ContinuationFinalizerImpl {
			finalizer
			_tag = "ContinuationFinalizer";
			[ContinuationTypeId] = continuationVariance
			constructor(finalizer) {
				this.finalizer = finalizer
			}
		}
		const UpstreamPullStrategyTypeId = Symbol.for(
				"effect/ChannelUpstreamPullStrategy",
			),
			upstreamPullStrategy_proto = {
				[UpstreamPullStrategyTypeId]: { _A: _ => _ },
			},
			PullAfterNext = emitSeparator => {
				const op = Object.create(upstreamPullStrategy_proto)
				op._tag = "PullAfterNext"
				op.emitSeparator = emitSeparator
				return op
			},
			core_stream_ChannelTypeId = Symbol.for("effect/Channel"),
			core_stream_proto = {
				[core_stream_ChannelTypeId]: {
					_Env: _ => _,
					_InErr: _ => _,
					_InElem: _ => _,
					_InDone: _ => _,
					_OutErr: _ => _,
					_OutElem: _ => _,
					_OutDone: _ => _,
				},
				pipe() {
					return pipeArguments(this, arguments)
				},
			},
			isChannel = u =>
				hasProperty(u, core_stream_ChannelTypeId) || Effect_isEffect(u),
			acquireReleaseOut = dual(2, (self, release) => {
				const op = Object.create(core_stream_proto)
				op._tag = "BracketOut"
				op.acquire = () => self
				op.finalizer = release
				return op
			}),
			core_stream_catchAllCause = dual(2, (self, f) => {
				const op = Object.create(core_stream_proto)
				op._tag = "Fold"
				op.channel = self
				op.k = new ContinuationKImpl(core_stream_succeed, f)
				return op
			}),
			concatAllWith = (channels, f, g) => {
				const op = Object.create(core_stream_proto)
				op._tag = "ConcatAll"
				op.combineInners = f
				op.combineAll = g
				op.onPull = () => PullAfterNext(Option_none())
				op.onEmit = () => Continue
				op.value = () => channels
				op.k = identity
				return op
			},
			concatMapWith = dual(4, (self, f, g, h) => {
				const op = Object.create(core_stream_proto)
				op._tag = "ConcatAll"
				op.combineInners = g
				op.combineAll = h
				op.onPull = () => PullAfterNext(Option_none())
				op.onEmit = () => Continue
				op.value = () => self
				op.k = f
				return op
			}),
			embedInput = dual(2, (self, input) => {
				const op = Object.create(core_stream_proto)
				op._tag = "Bridge"
				op.input = input
				op.channel = self
				return op
			}),
			ensuringWith = dual(2, (self, finalizer) => {
				const op = Object.create(core_stream_proto)
				op._tag = "Ensuring"
				op.channel = self
				op.finalizer = finalizer
				return op
			}),
			core_stream_fail = error => core_stream_failCause(Cause_fail(error)),
			core_stream_failCause = cause => core_stream_failCauseSync(() => cause),
			core_stream_failCauseSync = evaluate => {
				const op = Object.create(core_stream_proto)
				op._tag = "Fail"
				op.error = evaluate
				return op
			},
			core_stream_flatMap = dual(2, (self, f) => {
				const op = Object.create(core_stream_proto)
				op._tag = "Fold"
				op.channel = self
				op.k = new ContinuationKImpl(f, core_stream_failCause)
				return op
			}),
			core_stream_fromEffect = effect => {
				const op = Object.create(core_stream_proto)
				op._tag = "FromEffect"
				op.effect = () => effect
				return op
			},
			pipeTo = dual(2, (self, that) => {
				const op = Object.create(core_stream_proto)
				op._tag = "PipeTo"
				op.left = () => self
				op.right = () => that
				return op
			}),
			readWith = options =>
				readWithCause({
					onInput: options.onInput,
					onFailure: cause =>
						match(Cause_failureOrCause(cause), {
							onLeft: options.onFailure,
							onRight: core_stream_failCause,
						}),
					onDone: options.onDone,
				}),
			readWithCause = options => {
				const op = Object.create(core_stream_proto)
				op._tag = "Read"
				op.more = options.onInput
				op.done = new ContinuationKImpl(options.onDone, options.onFailure)
				return op
			},
			core_stream_succeed = value => core_stream_sync(() => value),
			succeedNow = result => {
				const op = Object.create(core_stream_proto)
				op._tag = "SucceedNow"
				op.terminal = result
				return op
			},
			core_stream_suspend = evaluate => {
				const op = Object.create(core_stream_proto)
				op._tag = "Suspend"
				op.channel = evaluate
				return op
			},
			core_stream_sync = evaluate => {
				const op = Object.create(core_stream_proto)
				op._tag = "Succeed"
				op.evaluate = evaluate
				return op
			},
			core_stream_void_ = succeedNow(void 0),
			write = out => {
				const op = Object.create(core_stream_proto)
				op._tag = "Emit"
				op.out = out
				return op
			},
			ChannelStateTypeId = Symbol.for("effect/ChannelState"),
			channelState_proto = { [ChannelStateTypeId]: { _E: _ => _, _R: _ => _ } },
			channelState_Done = () => {
				const op = Object.create(channelState_proto)
				op._tag = "Done"
				return op
			},
			Emit = () => {
				const op = Object.create(channelState_proto)
				op._tag = "Emit"
				return op
			},
			channelState_fromEffect = effect => {
				const op = Object.create(channelState_proto)
				op._tag = "FromEffect"
				op.effect = effect
				return op
			},
			Read = (upstream, onEffect, onEmit, onDone) => {
				const op = Object.create(channelState_proto)
				op._tag = "Read"
				op.upstream = upstream
				op.onEffect = onEffect
				op.onEmit = onEmit
				op.onDone = onDone
				return op
			},
			isFromEffect = self => "FromEffect" === self._tag,
			effectOrUndefinedIgnored = self =>
				isFromEffect(self) ? Effect_ignore(self.effect) : void 0
		class PullFromChild {
			childExecutor
			parentSubexecutor
			onEmit
			_tag = "PullFromChild"
			constructor(childExecutor, parentSubexecutor, onEmit) {
				this.childExecutor = childExecutor
				this.parentSubexecutor = parentSubexecutor
				this.onEmit = onEmit
			}
			close(exit) {
				const fin1 = this.childExecutor.close(exit),
					fin2 = this.parentSubexecutor.close(exit)
				return void 0 !== fin1 && void 0 !== fin2
					? Effect_zipWith(
							Effect_exit(fin1),
							Effect_exit(fin2),
							(exit1, exit2) => pipe(exit1, Exit_zipRight(exit2)),
						)
					: void 0 !== fin1
						? fin1
						: void 0 !== fin2
							? fin2
							: void 0
			}
			enqueuePullFromChild(_child) {
				return this
			}
		}
		class PullFromUpstream {
			upstreamExecutor
			createChild
			lastDone
			activeChildExecutors
			combineChildResults
			combineWithChildResult
			onPull
			onEmit
			_tag = "PullFromUpstream"
			constructor(
				upstreamExecutor,
				createChild,
				lastDone,
				activeChildExecutors,
				combineChildResults,
				combineWithChildResult,
				onPull,
				onEmit,
			) {
				this.upstreamExecutor = upstreamExecutor
				this.createChild = createChild
				this.lastDone = lastDone
				this.activeChildExecutors = activeChildExecutors
				this.combineChildResults = combineChildResults
				this.combineWithChildResult = combineWithChildResult
				this.onPull = onPull
				this.onEmit = onEmit
			}
			close(exit) {
				const fin1 = this.upstreamExecutor.close(exit)
				return [
					...this.activeChildExecutors.map(child =>
						void 0 !== child ? child.childExecutor.close(exit) : void 0,
					),
					fin1,
				].reduce(
					(acc, next) =>
						void 0 !== acc && void 0 !== next
							? Effect_zipWith(acc, Effect_exit(next), (exit1, exit2) =>
									Exit_zipRight(exit1, exit2),
								)
							: void 0 !== acc
								? acc
								: void 0 !== next
									? Effect_exit(next)
									: void 0,
					void 0,
				)
			}
			enqueuePullFromChild(child) {
				return new PullFromUpstream(
					this.upstreamExecutor,
					this.createChild,
					this.lastDone,
					[...this.activeChildExecutors, child],
					this.combineChildResults,
					this.combineWithChildResult,
					this.onPull,
					this.onEmit,
				)
			}
		}
		class DrainChildExecutors {
			upstreamExecutor
			lastDone
			activeChildExecutors
			upstreamDone
			combineChildResults
			combineWithChildResult
			onPull
			_tag = "DrainChildExecutors"
			constructor(
				upstreamExecutor,
				lastDone,
				activeChildExecutors,
				upstreamDone,
				combineChildResults,
				combineWithChildResult,
				onPull,
			) {
				this.upstreamExecutor = upstreamExecutor
				this.lastDone = lastDone
				this.activeChildExecutors = activeChildExecutors
				this.upstreamDone = upstreamDone
				this.combineChildResults = combineChildResults
				this.combineWithChildResult = combineWithChildResult
				this.onPull = onPull
			}
			close(exit) {
				const fin1 = this.upstreamExecutor.close(exit)
				return [
					...this.activeChildExecutors.map(child =>
						void 0 !== child ? child.childExecutor.close(exit) : void 0,
					),
					fin1,
				].reduce(
					(acc, next) =>
						void 0 !== acc && void 0 !== next
							? Effect_zipWith(acc, Effect_exit(next), (exit1, exit2) =>
									Exit_zipRight(exit1, exit2),
								)
							: void 0 !== acc
								? acc
								: void 0 !== next
									? Effect_exit(next)
									: void 0,
					void 0,
				)
			}
			enqueuePullFromChild(child) {
				return new DrainChildExecutors(
					this.upstreamExecutor,
					this.lastDone,
					[...this.activeChildExecutors, child],
					this.upstreamDone,
					this.combineChildResults,
					this.combineWithChildResult,
					this.onPull,
				)
			}
		}
		class subexecutor_Emit {
			value
			next
			_tag = "Emit"
			constructor(value, next) {
				this.value = value
				this.next = next
			}
			close(exit) {
				return this.next.close(exit)
			}
			enqueuePullFromChild(_child) {
				return this
			}
		}
		const UpstreamPullRequestTypeId = Symbol.for(
				"effect/ChannelUpstreamPullRequest",
			),
			upstreamPullRequest_proto = {
				[UpstreamPullRequestTypeId]: { _A: _ => _ },
			},
			Pulled = value => {
				const op = Object.create(upstreamPullRequest_proto)
				op._tag = "Pulled"
				op.value = value
				return op
			}
		class ChannelExecutor {
			_activeSubexecutor = void 0
			_cancelled = void 0
			_closeLastSubstream = void 0
			_currentChannel
			_done = void 0
			_doneStack = []
			_emitted = void 0
			_executeCloseLastSubstream
			_input = void 0
			_inProgressFinalizer = void 0
			_providedEnv
			constructor(initialChannel, providedEnv, executeCloseLastSubstream) {
				this._currentChannel = initialChannel
				this._executeCloseLastSubstream = executeCloseLastSubstream
				this._providedEnv = providedEnv
			}
			run() {
				let result
				for (; void 0 === result;)
					if (void 0 !== this._cancelled) result = this.processCancellation()
					else if (void 0 !== this._activeSubexecutor)
						result = this.runSubexecutor()
					else
						try {
							if (void 0 === this._currentChannel) result = channelState_Done()
							else {
								Effect_isEffect(this._currentChannel) &&
									(this._currentChannel = core_stream_fromEffect(
										this._currentChannel,
									))
								switch (this._currentChannel._tag) {
									case "BracketOut":
										result = this.runBracketOut(this._currentChannel)
										break
									case "Bridge": {
										const bridgeInput = this._currentChannel.input
										this._currentChannel = this._currentChannel.channel
										if (void 0 !== this._input) {
											const inputExecutor = this._input
											this._input = void 0
											const drainer = () =>
												Effect_flatMap(bridgeInput.awaitRead(), () =>
													Effect_suspend(() => {
														const state = inputExecutor.run()
														switch (state._tag) {
															case "Done":
																return Exit_match(inputExecutor.getDone(), {
																	onFailure: cause => bridgeInput.error(cause),
																	onSuccess: value => bridgeInput.done(value),
																})
															case "Emit":
																return Effect_flatMap(
																	bridgeInput.emit(inputExecutor.getEmit()),
																	() => drainer(),
																)
															case "FromEffect":
																return Effect_matchCauseEffect(state.effect, {
																	onFailure: cause => bridgeInput.error(cause),
																	onSuccess: () => drainer(),
																})
															case "Read":
																return readUpstream(
																	state,
																	() => drainer(),
																	cause => bridgeInput.error(cause),
																)
														}
													}),
												)
											result = channelState_fromEffect(
												Effect_flatMap(
													Effect_forkDaemon(Effect_interruptible(drainer())),
													fiber =>
														Effect_sync(() =>
															this.addFinalizer(exit =>
																Effect_flatMap(Fiber_interrupt(fiber), () =>
																	Effect_suspend(() => {
																		const effect = this.restorePipe(
																			exit,
																			inputExecutor,
																		)
																		return void 0 !== effect ? effect : _void
																	}),
																),
															),
														),
												),
											)
										}
										break
									}
									case "ConcatAll": {
										const executor = new ChannelExecutor(
											this._currentChannel.value(),
											this._providedEnv,
											effect =>
												Effect_sync(() => {
													const prevLastClose =
														void 0 === this._closeLastSubstream
															? _void
															: this._closeLastSubstream
													this._closeLastSubstream = pipe(
														prevLastClose,
														Effect_zipRight(effect),
													)
												}),
										)
										executor._input = this._input
										const channel = this._currentChannel
										this._activeSubexecutor = new PullFromUpstream(
											executor,
											value => channel.k(value),
											void 0,
											[],
											(x, y) => channel.combineInners(x, y),
											(x, y) => channel.combineAll(x, y),
											request => channel.onPull(request),
											value => channel.onEmit(value),
										)
										this._closeLastSubstream = void 0
										this._currentChannel = void 0
										break
									}
									case "Emit":
										this._emitted = this._currentChannel.out
										this._currentChannel =
											void 0 !== this._activeSubexecutor
												? void 0
												: core_stream_void_
										result = Emit()
										break
									case "Ensuring":
										this.runEnsuring(this._currentChannel)
										break
									case "Fail":
										result = this.doneHalt(this._currentChannel.error())
										break
									case "Fold":
										this._doneStack.push(this._currentChannel.k)
										this._currentChannel = this._currentChannel.channel
										break
									case "FromEffect": {
										const effect =
											void 0 === this._providedEnv
												? this._currentChannel.effect()
												: pipe(
														this._currentChannel.effect(),
														Effect_provide(this._providedEnv),
													)
										result = channelState_fromEffect(
											Effect_matchCauseEffect(effect, {
												onFailure: cause => {
													const state = this.doneHalt(cause)
													return void 0 !== state && isFromEffect(state)
														? state.effect
														: _void
												},
												onSuccess: value => {
													const state = this.doneSucceed(value)
													return void 0 !== state && isFromEffect(state)
														? state.effect
														: _void
												},
											}),
										)
										break
									}
									case "PipeTo": {
										const previousInput = this._input,
											leftExec = new ChannelExecutor(
												this._currentChannel.left(),
												this._providedEnv,
												effect => this._executeCloseLastSubstream(effect),
											)
										leftExec._input = previousInput
										this._input = leftExec
										this.addFinalizer(exit => {
											const effect = this.restorePipe(exit, previousInput)
											return void 0 !== effect ? effect : _void
										})
										this._currentChannel = this._currentChannel.right()
										break
									}
									case "Provide": {
										const previousEnv = this._providedEnv
										this._providedEnv = this._currentChannel.context()
										this._currentChannel = this._currentChannel.inner
										this.addFinalizer(() =>
											Effect_sync(() => {
												this._providedEnv = previousEnv
											}),
										)
										break
									}
									case "Read": {
										const read = this._currentChannel
										result = Read(
											this._input,
											identity,
											emitted => {
												try {
													this._currentChannel = read.more(emitted)
												} catch (error) {
													this._currentChannel = read.done.onExit(
														Exit_die(error),
													)
												}
											},
											exit => {
												this._currentChannel = (exit => read.done.onExit(exit))(
													exit,
												)
											},
										)
										break
									}
									case "Succeed":
										result = this.doneSucceed(this._currentChannel.evaluate())
										break
									case "SucceedNow":
										result = this.doneSucceed(this._currentChannel.terminal)
										break
									case "Suspend":
										this._currentChannel = this._currentChannel.channel()
								}
							}
						} catch (error) {
							this._currentChannel = core_stream_failCause(Cause_die(error))
						}
				return result
			}
			getDone() {
				return this._done
			}
			getEmit() {
				return this._emitted
			}
			cancelWith(exit) {
				this._cancelled = exit
			}
			clearInProgressFinalizer() {
				this._inProgressFinalizer = void 0
			}
			storeInProgressFinalizer(finalizer) {
				this._inProgressFinalizer = finalizer
			}
			popAllFinalizers(exit) {
				const finalizers = []
				let next = this._doneStack.pop()
				for (; next;) {
					"ContinuationFinalizer" === next._tag &&
						finalizers.push(next.finalizer)
					next = this._doneStack.pop()
				}
				const effect =
					0 === finalizers.length ? _void : runFinalizers(finalizers, exit)
				this.storeInProgressFinalizer(effect)
				return effect
			}
			popNextFinalizers() {
				const builder = []
				for (; 0 !== this._doneStack.length;) {
					const cont = this._doneStack[this._doneStack.length - 1]
					if ("ContinuationK" === cont._tag) return builder
					builder.push(cont)
					this._doneStack.pop()
				}
				return builder
			}
			restorePipe(exit, prev) {
				const currInput = this._input
				this._input = prev
				return void 0 !== currInput ? currInput.close(exit) : _void
			}
			close(exit) {
				let runInProgressFinalizers
				const finalizer = this._inProgressFinalizer
				void 0 !== finalizer &&
					(runInProgressFinalizers = pipe(
						finalizer,
						Effect_ensuring(Effect_sync(() => this.clearInProgressFinalizer())),
					))
				let closeSelf
				const selfFinalizers = this.popAllFinalizers(exit)
				void 0 !== selfFinalizers &&
					(closeSelf = pipe(
						selfFinalizers,
						Effect_ensuring(Effect_sync(() => this.clearInProgressFinalizer())),
					))
				const closeSubexecutors =
					void 0 === this._activeSubexecutor
						? void 0
						: this._activeSubexecutor.close(exit)
				if (
					void 0 !== closeSubexecutors ||
					void 0 !== runInProgressFinalizers ||
					void 0 !== closeSelf
				)
					return pipe(
						Effect_exit(ifNotNull(closeSubexecutors)),
						Effect_zip(Effect_exit(ifNotNull(runInProgressFinalizers))),
						Effect_zip(Effect_exit(ifNotNull(closeSelf))),
						Effect_map(([[exit1, exit2], exit3]) =>
							pipe(exit1, Exit_zipRight(exit2), Exit_zipRight(exit3)),
						),
						Effect_uninterruptible,
						Effect_flatMap(exit => Effect_suspend(() => exit)),
					)
			}
			doneSucceed(value) {
				if (0 === this._doneStack.length) {
					this._done = Exit_succeed(value)
					this._currentChannel = void 0
					return channelState_Done()
				}
				const head = this._doneStack[this._doneStack.length - 1]
				if ("ContinuationK" === head._tag) {
					this._doneStack.pop()
					this._currentChannel = head.onSuccess(value)
					return
				}
				const finalizers = this.popNextFinalizers()
				if (0 === this._doneStack.length) {
					this._doneStack = finalizers.reverse()
					this._done = Exit_succeed(value)
					this._currentChannel = void 0
					return channelState_Done()
				}
				const finalizerEffect = runFinalizers(
					finalizers.map(f => f.finalizer),
					Exit_succeed(value),
				)
				this.storeInProgressFinalizer(finalizerEffect)
				const effect = pipe(
					finalizerEffect,
					Effect_ensuring(Effect_sync(() => this.clearInProgressFinalizer())),
					Effect_uninterruptible,
					Effect_flatMap(() => Effect_sync(() => this.doneSucceed(value))),
				)
				return channelState_fromEffect(effect)
			}
			doneHalt(cause) {
				if (0 === this._doneStack.length) {
					this._done = Exit_failCause(cause)
					this._currentChannel = void 0
					return channelState_Done()
				}
				const head = this._doneStack[this._doneStack.length - 1]
				if ("ContinuationK" === head._tag) {
					this._doneStack.pop()
					try {
						this._currentChannel = head.onHalt(cause)
					} catch (error) {
						this._currentChannel = core_stream_failCause(Cause_die(error))
					}
					return
				}
				const finalizers = this.popNextFinalizers()
				if (0 === this._doneStack.length) {
					this._doneStack = finalizers.reverse()
					this._done = Exit_failCause(cause)
					this._currentChannel = void 0
					return channelState_Done()
				}
				const finalizerEffect = runFinalizers(
					finalizers.map(f => f.finalizer),
					Exit_failCause(cause),
				)
				this.storeInProgressFinalizer(finalizerEffect)
				const effect = pipe(
					finalizerEffect,
					Effect_ensuring(Effect_sync(() => this.clearInProgressFinalizer())),
					Effect_uninterruptible,
					Effect_flatMap(() => Effect_sync(() => this.doneHalt(cause))),
				)
				return channelState_fromEffect(effect)
			}
			processCancellation() {
				this._currentChannel = void 0
				this._done = this._cancelled
				this._cancelled = void 0
				return channelState_Done()
			}
			runBracketOut(bracketOut) {
				const effect = Effect_uninterruptible(
					Effect_matchCauseEffect(this.provide(bracketOut.acquire()), {
						onFailure: cause =>
							Effect_sync(() => {
								this._currentChannel = core_stream_failCause(cause)
							}),
						onSuccess: out =>
							Effect_sync(() => {
								this.addFinalizer(exit =>
									this.provide(bracketOut.finalizer(out, exit)),
								)
								this._currentChannel = write(out)
							}),
					}),
				)
				return channelState_fromEffect(effect)
			}
			provide(effect) {
				return void 0 === this._providedEnv
					? effect
					: pipe(effect, Effect_provide(this._providedEnv))
			}
			runEnsuring(ensuring) {
				this.addFinalizer(ensuring.finalizer)
				this._currentChannel = ensuring.channel
			}
			addFinalizer(f) {
				this._doneStack.push(new ContinuationFinalizerImpl(f))
			}
			runSubexecutor() {
				const subexecutor = this._activeSubexecutor
				switch (subexecutor._tag) {
					case "PullFromChild":
						return this.pullFromChild(
							subexecutor.childExecutor,
							subexecutor.parentSubexecutor,
							subexecutor.onEmit,
							subexecutor,
						)
					case "PullFromUpstream":
						return this.pullFromUpstream(subexecutor)
					case "DrainChildExecutors":
						return this.drainChildExecutors(subexecutor)
					case "Emit":
						this._emitted = subexecutor.value
						this._activeSubexecutor = subexecutor.next
						return Emit()
				}
			}
			replaceSubexecutor(nextSubExec) {
				this._currentChannel = void 0
				this._activeSubexecutor = nextSubExec
			}
			finishWithExit(exit) {
				const state = Exit_match(exit, {
					onFailure: cause => this.doneHalt(cause),
					onSuccess: value => this.doneSucceed(value),
				})
				this._activeSubexecutor = void 0
				return void 0 === state
					? _void
					: (self => (isFromEffect(self) ? self.effect : _void))(state)
			}
			finishSubexecutorWithCloseEffect(subexecutorDone, ...closeFuncs) {
				this.addFinalizer(() =>
					pipe(
						closeFuncs,
						Effect_forEach(
							closeFunc =>
								pipe(
									Effect_sync(() => closeFunc(subexecutorDone)),
									Effect_flatMap(closeEffect =>
										void 0 !== closeEffect ? closeEffect : _void,
									),
								),
							{ discard: !0 },
						),
					),
				)
				const state = pipe(
					subexecutorDone,
					Exit_match({
						onFailure: cause => this.doneHalt(cause),
						onSuccess: value => this.doneSucceed(value),
					}),
				)
				this._activeSubexecutor = void 0
				return state
			}
			applyUpstreamPullStrategy(upstreamFinished, queue, strategy) {
				switch (strategy._tag) {
					case "PullAfterNext": {
						const shouldPrepend =
							!upstreamFinished ||
							queue.some(subexecutor => void 0 !== subexecutor)
						return [
							strategy.emitSeparator,
							shouldPrepend ? [void 0, ...queue] : queue,
						]
					}
					case "PullAfterAllEnqueued": {
						const shouldEnqueue =
							!upstreamFinished ||
							queue.some(subexecutor => void 0 !== subexecutor)
						return [
							strategy.emitSeparator,
							shouldEnqueue ? [...queue, void 0] : queue,
						]
					}
				}
			}
			pullFromChild(childExecutor, parentSubexecutor, onEmitted, subexecutor) {
				return Read(
					childExecutor,
					identity,
					emitted => {
						const childExecutorDecision = onEmitted(emitted)
						switch (childExecutorDecision._tag) {
							case "Continue":
								break
							case "Close":
								this.finishWithDoneValue(
									childExecutor,
									parentSubexecutor,
									childExecutorDecision.value,
								)
								break
							case "Yield": {
								const modifiedParent =
									parentSubexecutor.enqueuePullFromChild(subexecutor)
								this.replaceSubexecutor(modifiedParent)
								break
							}
						}
						this._activeSubexecutor = new subexecutor_Emit(
							emitted,
							this._activeSubexecutor,
						)
					},
					Exit_match({
						onFailure: cause => {
							const state = this.handleSubexecutorFailure(
								childExecutor,
								parentSubexecutor,
								cause,
							)
							return void 0 === state ? void 0 : effectOrUndefinedIgnored(state)
						},
						onSuccess: doneValue => {
							this.finishWithDoneValue(
								childExecutor,
								parentSubexecutor,
								doneValue,
							)
						},
					}),
				)
			}
			finishWithDoneValue(childExecutor, parentSubexecutor, doneValue) {
				const subexecutor = parentSubexecutor
				switch (subexecutor._tag) {
					case "PullFromUpstream": {
						const modifiedParent = new PullFromUpstream(
							subexecutor.upstreamExecutor,
							subexecutor.createChild,
							void 0 !== subexecutor.lastDone
								? subexecutor.combineChildResults(
										subexecutor.lastDone,
										doneValue,
									)
								: doneValue,
							subexecutor.activeChildExecutors,
							subexecutor.combineChildResults,
							subexecutor.combineWithChildResult,
							subexecutor.onPull,
							subexecutor.onEmit,
						)
						this._closeLastSubstream = childExecutor.close(
							Exit_succeed(doneValue),
						)
						this.replaceSubexecutor(modifiedParent)
						break
					}
					case "DrainChildExecutors": {
						const modifiedParent = new DrainChildExecutors(
							subexecutor.upstreamExecutor,
							void 0 !== subexecutor.lastDone
								? subexecutor.combineChildResults(
										subexecutor.lastDone,
										doneValue,
									)
								: doneValue,
							subexecutor.activeChildExecutors,
							subexecutor.upstreamDone,
							subexecutor.combineChildResults,
							subexecutor.combineWithChildResult,
							subexecutor.onPull,
						)
						this._closeLastSubstream = childExecutor.close(
							Exit_succeed(doneValue),
						)
						this.replaceSubexecutor(modifiedParent)
						break
					}
				}
			}
			handleSubexecutorFailure(childExecutor, parentSubexecutor, cause) {
				return this.finishSubexecutorWithCloseEffect(
					Exit_failCause(cause),
					exit => parentSubexecutor.close(exit),
					exit => childExecutor.close(exit),
				)
			}
			pullFromUpstream(subexecutor) {
				if (0 === subexecutor.activeChildExecutors.length)
					return this.performPullFromUpstream(subexecutor)
				const activeChild = subexecutor.activeChildExecutors[0],
					parentSubexecutor = new PullFromUpstream(
						subexecutor.upstreamExecutor,
						subexecutor.createChild,
						subexecutor.lastDone,
						subexecutor.activeChildExecutors.slice(1),
						subexecutor.combineChildResults,
						subexecutor.combineWithChildResult,
						subexecutor.onPull,
						subexecutor.onEmit,
					)
				if (void 0 === activeChild)
					return this.performPullFromUpstream(parentSubexecutor)
				this.replaceSubexecutor(
					new PullFromChild(
						activeChild.childExecutor,
						parentSubexecutor,
						activeChild.onEmit,
					),
				)
			}
			performPullFromUpstream(subexecutor) {
				return Read(
					subexecutor.upstreamExecutor,
					effect => {
						const closeLastSubstream =
							void 0 === this._closeLastSubstream
								? _void
								: this._closeLastSubstream
						this._closeLastSubstream = void 0
						return pipe(
							this._executeCloseLastSubstream(closeLastSubstream),
							Effect_zipRight(effect),
						)
					},
					emitted => {
						if (void 0 !== this._closeLastSubstream) {
							const closeLastSubstream = this._closeLastSubstream
							this._closeLastSubstream = void 0
							return pipe(
								this._executeCloseLastSubstream(closeLastSubstream),
								Effect_map(() => {
									const childExecutor = new ChannelExecutor(
										subexecutor.createChild(emitted),
										this._providedEnv,
										this._executeCloseLastSubstream,
									)
									childExecutor._input = this._input
									const [emitSeparator, updatedChildExecutors] =
										this.applyUpstreamPullStrategy(
											!1,
											subexecutor.activeChildExecutors,
											subexecutor.onPull(Pulled(emitted)),
										)
									this._activeSubexecutor = new PullFromChild(
										childExecutor,
										new PullFromUpstream(
											subexecutor.upstreamExecutor,
											subexecutor.createChild,
											subexecutor.lastDone,
											updatedChildExecutors,
											subexecutor.combineChildResults,
											subexecutor.combineWithChildResult,
											subexecutor.onPull,
											subexecutor.onEmit,
										),
										subexecutor.onEmit,
									)
									Option_isSome(emitSeparator) &&
										(this._activeSubexecutor = new subexecutor_Emit(
											emitSeparator.value,
											this._activeSubexecutor,
										))
								}),
							)
						}
						const childExecutor = new ChannelExecutor(
							subexecutor.createChild(emitted),
							this._providedEnv,
							this._executeCloseLastSubstream,
						)
						childExecutor._input = this._input
						const [emitSeparator, updatedChildExecutors] =
							this.applyUpstreamPullStrategy(
								!1,
								subexecutor.activeChildExecutors,
								subexecutor.onPull(Pulled(emitted)),
							)
						this._activeSubexecutor = new PullFromChild(
							childExecutor,
							new PullFromUpstream(
								subexecutor.upstreamExecutor,
								subexecutor.createChild,
								subexecutor.lastDone,
								updatedChildExecutors,
								subexecutor.combineChildResults,
								subexecutor.combineWithChildResult,
								subexecutor.onPull,
								subexecutor.onEmit,
							),
							subexecutor.onEmit,
						)
						Option_isSome(emitSeparator) &&
							(this._activeSubexecutor = new subexecutor_Emit(
								emitSeparator.value,
								this._activeSubexecutor,
							))
					},
					exit => {
						if (
							subexecutor.activeChildExecutors.some(
								subexecutor => void 0 !== subexecutor,
							)
						) {
							const drain = new DrainChildExecutors(
								subexecutor.upstreamExecutor,
								subexecutor.lastDone,
								[void 0, ...subexecutor.activeChildExecutors],
								subexecutor.upstreamExecutor.getDone(),
								subexecutor.combineChildResults,
								subexecutor.combineWithChildResult,
								subexecutor.onPull,
							)
							if (void 0 !== this._closeLastSubstream) {
								const closeLastSubstream = this._closeLastSubstream
								this._closeLastSubstream = void 0
								return pipe(
									this._executeCloseLastSubstream(closeLastSubstream),
									Effect_map(() => this.replaceSubexecutor(drain)),
								)
							}
							this.replaceSubexecutor(drain)
							return
						}
						const closeLastSubstream = this._closeLastSubstream,
							state = this.finishSubexecutorWithCloseEffect(
								pipe(
									exit,
									Exit_map(a =>
										subexecutor.combineWithChildResult(subexecutor.lastDone, a),
									),
								),
								() => closeLastSubstream,
								exit => subexecutor.upstreamExecutor.close(exit),
							)
						return void 0 === state ? void 0 : effectOrUndefinedIgnored(state)
					},
				)
			}
			drainChildExecutors(subexecutor) {
				if (0 === subexecutor.activeChildExecutors.length) {
					const lastClose = this._closeLastSubstream
					void 0 !== lastClose &&
						this.addFinalizer(() => Effect_succeed(lastClose))
					return this.finishSubexecutorWithCloseEffect(
						subexecutor.upstreamDone,
						() => lastClose,
						exit => subexecutor.upstreamExecutor.close(exit),
					)
				}
				const activeChild = subexecutor.activeChildExecutors[0],
					rest = subexecutor.activeChildExecutors.slice(1)
				if (void 0 === activeChild) {
					const [emitSeparator, remainingExecutors] =
						this.applyUpstreamPullStrategy(
							!0,
							rest,
							subexecutor.onPull(
								(activeDownstreamCount => {
									const op = Object.create(upstreamPullRequest_proto)
									op._tag = "NoUpstream"
									op.activeDownstreamCount = activeDownstreamCount
									return op
								})(rest.reduce((n, curr) => (void 0 !== curr ? n + 1 : n), 0)),
							),
						)
					this.replaceSubexecutor(
						new DrainChildExecutors(
							subexecutor.upstreamExecutor,
							subexecutor.lastDone,
							remainingExecutors,
							subexecutor.upstreamDone,
							subexecutor.combineChildResults,
							subexecutor.combineWithChildResult,
							subexecutor.onPull,
						),
					)
					if (Option_isSome(emitSeparator)) {
						this._emitted = emitSeparator.value
						return Emit()
					}
					return
				}
				const parentSubexecutor = new DrainChildExecutors(
					subexecutor.upstreamExecutor,
					subexecutor.lastDone,
					rest,
					subexecutor.upstreamDone,
					subexecutor.combineChildResults,
					subexecutor.combineWithChildResult,
					subexecutor.onPull,
				)
				this.replaceSubexecutor(
					new PullFromChild(
						activeChild.childExecutor,
						parentSubexecutor,
						activeChild.onEmit,
					),
				)
			}
		}
		const ifNotNull = effect => (void 0 !== effect ? effect : _void),
			runFinalizers = (finalizers, exit) =>
				pipe(
					Effect_forEach(finalizers, fin => Effect_exit(fin(exit))),
					Effect_map(exits =>
						pipe(
							Exit_all(exits),
							Option_getOrElse(() => Exit_void_),
						),
					),
					Effect_flatMap(exit => Effect_suspend(() => exit)),
				),
			readUpstream = (r, onSuccess, onFailure) => {
				const readStack = [r],
					read = () => {
						const current = readStack.pop()
						if (void 0 === current || void 0 === current.upstream)
							return Effect_dieMessage(
								"Unexpected end of input for channel execution",
							)
						const state = current.upstream.run()
						switch (state._tag) {
							case "Emit": {
								const emitEffect = current.onEmit(current.upstream.getEmit())
								return 0 === readStack.length
									? void 0 === emitEffect
										? Effect_suspend(onSuccess)
										: pipe(
												emitEffect,
												Effect_matchCauseEffect({ onFailure, onSuccess }),
											)
									: void 0 === emitEffect
										? Effect_suspend(() => read())
										: pipe(
												emitEffect,
												Effect_matchCauseEffect({
													onFailure,
													onSuccess: () => read(),
												}),
											)
							}
							case "Done": {
								const doneEffect = current.onDone(current.upstream.getDone())
								return 0 === readStack.length
									? void 0 === doneEffect
										? Effect_suspend(onSuccess)
										: pipe(
												doneEffect,
												Effect_matchCauseEffect({ onFailure, onSuccess }),
											)
									: void 0 === doneEffect
										? Effect_suspend(() => read())
										: pipe(
												doneEffect,
												Effect_matchCauseEffect({
													onFailure,
													onSuccess: () => read(),
												}),
											)
							}
							case "FromEffect":
								readStack.push(current)
								return pipe(
									current.onEffect(state.effect),
									Effect_catchAllCause(cause =>
										Effect_suspend(() => {
											const doneEffect = current.onDone(Exit_failCause(cause))
											return void 0 === doneEffect ? _void : doneEffect
										}),
									),
									Effect_matchCauseEffect({
										onFailure,
										onSuccess: () => read(),
									}),
								)
							case "Read":
								readStack.push(current)
								readStack.push(state)
								return Effect_suspend(() => read())
						}
					}
				return read()
			},
			runIn = dual(2, (self, scope) =>
				Effect_uninterruptibleMask(restore =>
					Effect_all([
						Scope_fork(scope, ExecutionStrategy_sequential),
						Deferred_make(),
						Deferred_make(),
					]).pipe(
						Effect_flatMap(([child, channelDeferred, scopeDeferred]) =>
							restore(
								((channelDeferred, scopeDeferred, scope) =>
									Effect_acquireUseRelease(
										Effect_sync(
											() => new ChannelExecutor(self, void 0, identity),
										),
										exec =>
											Effect_suspend(() =>
												runScopedInterpret(exec.run(), exec).pipe(
													Effect_intoDeferred(channelDeferred),
													Effect_zipRight(Deferred_await(channelDeferred)),
													Effect_zipLeft(Deferred_await(scopeDeferred)),
												),
											),
										(exec, exit) => {
											const finalize = exec.close(exit)
											return void 0 === finalize
												? _void
												: Effect_tapErrorCause(finalize, cause =>
														Scope_addFinalizer(scope, Effect_failCause(cause)),
													)
										},
									))(channelDeferred, scopeDeferred, child),
							).pipe(
								Effect_forkIn(scope),
								Effect_flatMap(fiber =>
									scope
										.addFinalizer(exit => {
											const interruptors = Exit_isFailure(exit)
												? Cause_interruptors(exit.cause)
												: void 0
											return Deferred_isDone(channelDeferred).pipe(
												Effect_flatMap(isDone =>
													isDone
														? Deferred_succeed(scopeDeferred, void 0).pipe(
																Effect_zipRight(Fiber_await(fiber)),
																Effect_zipRight(Fiber_inheritAll(fiber)),
															)
														: Deferred_succeed(scopeDeferred, void 0).pipe(
																Effect_zipRight(
																	interruptors && HashSet_size(interruptors) > 0
																		? interruptAs(
																				fiber,
																				pipe(
																					interruptors,
																					HashSet_reduce(fiberId_none, (a, b) =>
																						fiberId_combine(b)(a),
																					),
																				),
																			)
																		: Fiber_interrupt(fiber),
																),
																Effect_zipRight(Fiber_inheritAll(fiber)),
															),
												),
											)
										})
										.pipe(
											Effect_zipRight(restore(Deferred_await(channelDeferred))),
										),
								),
							),
						),
					),
				),
			),
			runScopedInterpret = (channelState, exec) => {
				const op = channelState
				switch (op._tag) {
					case "FromEffect":
						return pipe(
							op.effect,
							Effect_flatMap(() => runScopedInterpret(exec.run(), exec)),
						)
					case "Emit":
						return runScopedInterpret(exec.run(), exec)
					case "Done":
						return Effect_suspend(() => exec.getDone())
					case "Read":
						return readUpstream(
							op,
							() => runScopedInterpret(exec.run(), exec),
							Effect_failCause,
						)
				}
			},
			MergeDecisionTypeId = Symbol.for("effect/ChannelMergeDecision"),
			mergeDecision_proto = {
				[MergeDecisionTypeId]: {
					_R: _ => _,
					_E0: _ => _,
					_Z0: _ => _,
					_E: _ => _,
					_Z: _ => _,
				},
			},
			Await = f => {
				const op = Object.create(mergeDecision_proto)
				op._tag = "Await"
				op.f = f
				return op
			},
			MergeStateTypeId = Symbol.for("effect/ChannelMergeState"),
			mergeState_proto = { [MergeStateTypeId]: MergeStateTypeId },
			BothRunning = (left, right) => {
				const op = Object.create(mergeState_proto)
				op._tag = "BothRunning"
				op.left = left
				op.right = right
				return op
			},
			LeftDone = f => {
				const op = Object.create(mergeState_proto)
				op._tag = "LeftDone"
				op.f = f
				return op
			},
			RightDone = f => {
				const op = Object.create(mergeState_proto)
				op._tag = "RightDone"
				op.f = f
				return op
			},
			MergeStrategyTypeId = Symbol.for("effect/ChannelMergeStrategy"),
			mergeStrategy_proto = { [MergeStrategyTypeId]: MergeStrategyTypeId },
			BackPressure = _ => {
				const op = Object.create(mergeStrategy_proto)
				op._tag = "BackPressure"
				return op
			},
			BufferSliding = _ => {
				const op = Object.create(mergeStrategy_proto)
				op._tag = "BufferSliding"
				return op
			},
			mergeStrategy_match = dual(
				2,
				(self, { onBackPressure, onBufferSliding }) => {
					switch (self._tag) {
						case "BackPressure":
							return onBackPressure()
						case "BufferSliding":
							return onBufferSliding()
					}
				},
			),
			stateEmpty = notifyProducer => ({ _tag: "Empty", notifyProducer }),
			stateEmit = notifyConsumers => ({ _tag: "Emit", notifyConsumers }),
			stateError = cause => ({ _tag: "Error", cause }),
			stateDone = done => ({ _tag: "Done", done })
		class SingleProducerAsyncInputImpl {
			ref
			constructor(ref) {
				this.ref = ref
			}
			awaitRead() {
				return Effect_flatten(
					Ref_modify(this.ref, state =>
						"Empty" === state._tag
							? [Deferred_await(state.notifyProducer), state]
							: [_void, state],
					),
				)
			}
			get close() {
				return Effect_fiberIdWith(fiberId =>
					this.error(Cause_interrupt(fiberId)),
				)
			}
			done(value) {
				return Effect_flatten(
					Ref_modify(this.ref, state => {
						switch (state._tag) {
							case "Empty":
								return [Deferred_await(state.notifyProducer), state]
							case "Emit":
								return [
									Effect_forEach(
										state.notifyConsumers,
										deferred => Deferred_succeed(deferred, Either_left(value)),
										{ discard: !0 },
									),
									stateDone(value),
								]
							case "Error":
							case "Done":
								return [Effect_interrupt, state]
						}
					}),
				)
			}
			emit(element) {
				return Effect_flatMap(Deferred_make(), deferred =>
					Effect_flatten(
						Ref_modify(this.ref, state => {
							switch (state._tag) {
								case "Empty":
									return [Deferred_await(state.notifyProducer), state]
								case "Emit": {
									const notifyConsumer = state.notifyConsumers[0],
										notifyConsumers = state.notifyConsumers.slice(1)
									if (void 0 !== notifyConsumer)
										return [
											Deferred_succeed(notifyConsumer, Either_right(element)),
											0 === notifyConsumers.length
												? stateEmpty(deferred)
												: stateEmit(notifyConsumers),
										]
									throw new Error(
										"Bug: Channel.SingleProducerAsyncInput.emit - Queue was empty! please report an issue at https://github.com/Effect-TS/effect/issues",
									)
								}
								case "Error":
								case "Done":
									return [Effect_interrupt, state]
							}
						}),
					),
				)
			}
			error(cause) {
				return Effect_flatten(
					Ref_modify(this.ref, state => {
						switch (state._tag) {
							case "Empty":
								return [Deferred_await(state.notifyProducer), state]
							case "Emit":
								return [
									Effect_forEach(
										state.notifyConsumers,
										deferred => Deferred_failCause(deferred, cause),
										{ discard: !0 },
									),
									stateError(cause),
								]
							case "Error":
							case "Done":
								return [Effect_interrupt, state]
						}
					}),
				)
			}
			get take() {
				return this.takeWith(
					cause => Exit_failCause(Cause_map(cause, Either_left)),
					elem => Exit_succeed(elem),
					done => Exit_fail(Either_right(done)),
				)
			}
			takeWith(onError, onElement, onDone) {
				return Effect_flatMap(Deferred_make(), deferred =>
					Effect_flatten(
						Ref_modify(this.ref, state => {
							switch (state._tag) {
								case "Empty":
									return [
										Effect_zipRight(
											Deferred_succeed(state.notifyProducer, void 0),
											Effect_matchCause(Deferred_await(deferred), {
												onFailure: onError,
												onSuccess: match({
													onLeft: onDone,
													onRight: onElement,
												}),
											}),
										),
										stateEmit([deferred]),
									]
								case "Emit":
									return [
										Effect_matchCause(Deferred_await(deferred), {
											onFailure: onError,
											onSuccess: match({ onLeft: onDone, onRight: onElement }),
										}),
										stateEmit([...state.notifyConsumers, deferred]),
									]
								case "Error":
									return [Effect_succeed(onError(state.cause)), state]
								case "Done":
									return [Effect_succeed(onDone(state.done)), state]
							}
						}),
					),
				)
			}
		}
		const singleProducerAsyncInput_make = () =>
				pipe(
					Deferred_make(),
					Effect_flatMap(deferred => Ref_make(stateEmpty(deferred))),
					Effect_map(ref => new SingleProducerAsyncInputImpl(ref)),
				),
			concatMap = dual(2, (self, f) =>
				concatMapWith(
					self,
					f,
					() => {},
					() => {},
				),
			),
			drain = self => {
				const drainer = readWithCause({
					onInput: () => drainer,
					onFailure: core_stream_failCause,
					onDone: core_stream_succeed,
				})
				return pipeTo(self, drainer)
			},
			channel_ensuring = dual(2, (self, finalizer) =>
				ensuringWith(self, () => finalizer),
			),
			fromInput = input =>
				channel_unwrap(
					input.takeWith(
						core_stream_failCause,
						elem => core_stream_flatMap(write(elem), () => fromInput(input)),
						core_stream_succeed,
					),
				),
			identityChannel = () =>
				readWith({
					onInput: input =>
						core_stream_flatMap(write(input), () => identityChannel()),
					onFailure: core_stream_fail,
					onDone: succeedNow,
				}),
			channel_map = dual(2, (self, f) =>
				core_stream_flatMap(self, a => core_stream_sync(() => f(a))),
			),
			mapOut = dual(2, (self, f) => {
				const reader = readWith({
					onInput: outElem =>
						core_stream_flatMap(write(f(outElem)), () => reader),
					onFailure: core_stream_fail,
					onDone: succeedNow,
				})
				return pipeTo(self, reader)
			}),
			mapOutEffectPar = dual(3, (self, f, n) =>
				unwrapScopedWith(scope =>
					Effect_gen(function* () {
						const input = yield* singleProducerAsyncInput_make(),
							queueReader = fromInput(input),
							queue = yield* Queue_bounded(n)
						yield* Scope_addFinalizer(scope, Queue_shutdown(queue))
						const errorSignal = yield* Deferred_make(),
							withPermits =
								n === Number.POSITIVE_INFINITY
									? _ => identity
									: (yield* Effect_makeSemaphore(n)).withPermits,
							pull = yield* queueReader.pipe(pipeTo(self), toPullIn(scope))
						yield* pull.pipe(
							Effect_matchCauseEffect({
								onFailure: cause => Queue_offer(queue, Effect_failCause(cause)),
								onSuccess: match({
									onLeft: outDone =>
										Effect_zipRight(
											Effect_interruptible(withPermits(n)(_void)),
											Effect_asVoid(
												Queue_offer(
													queue,
													Effect_succeed(Either_left(outDone)),
												),
											),
										),
									onRight: outElem =>
										Effect_gen(function* () {
											const deferred = yield* Deferred_make(),
												latch = yield* Deferred_make()
											yield* Queue_offer(
												queue,
												Effect_map(Deferred_await(deferred), Either_right),
											)
											yield* Deferred_succeed(latch, void 0).pipe(
												Effect_zipRight(
													Effect_uninterruptibleMask(restore =>
														Effect_exit(
															restore(Deferred_await(errorSignal)),
														).pipe(
															Effect_raceFirst(
																Effect_exit(restore(f(outElem))),
															),
															Effect_flatMap(identity),
														),
													).pipe(
														Effect_tapErrorCause(cause =>
															Deferred_failCause(errorSignal, cause),
														),
														Effect_intoDeferred(deferred),
													),
												),
												withPermits(1),
												Effect_forkIn(scope),
											)
											yield* Deferred_await(latch)
										}),
								}),
							}),
							Effect_forever,
							Effect_interruptible,
							Effect_forkIn(scope),
						)
						const consumer = channel_unwrap(
							Effect_matchCause(Effect_flatten(Queue_take(queue)), {
								onFailure: core_stream_failCause,
								onSuccess: match({
									onLeft: succeedNow,
									onRight: outElem =>
										core_stream_flatMap(write(outElem), () => consumer),
								}),
							}),
						)
						return embedInput(consumer, input)
					}),
				),
			),
			mergeMap = dual(3, (self, f, options) =>
				(
					options => channels =>
						(
							({
								bufferSize = 16,
								concurrency,
								mergeStrategy = BackPressure(),
							}) =>
							(channels, f) =>
								unwrapScopedWith(scope =>
									Effect_gen(function* () {
										const concurrencyN =
												"unbounded" === concurrency
													? Number.MAX_SAFE_INTEGER
													: concurrency,
											input = yield* singleProducerAsyncInput_make(),
											queueReader = fromInput(input),
											queue = yield* Queue_bounded(bufferSize)
										yield* Scope_addFinalizer(scope, Queue_shutdown(queue))
										const cancelers = yield* Queue_unbounded()
										yield* Scope_addFinalizer(scope, Queue_shutdown(cancelers))
										const lastDone = yield* Ref_make(Option_none()),
											errorSignal = yield* Deferred_make(),
											withPermits = (yield* Effect_makeSemaphore(concurrencyN))
												.withPermits,
											pull = yield* toPullIn(
												pipeTo(queueReader, channels),
												scope,
											)
										function evaluatePull(pull) {
											return pull.pipe(
												Effect_flatMap(
													match({
														onLeft: done => Effect_succeed(Option_some(done)),
														onRight: outElem =>
															Effect_as(
																Queue_offer(
																	queue,
																	Effect_succeed(Either_right(outElem)),
																),
																Option_none(),
															),
													}),
												),
												Effect_repeat({ until: _ => Option_isSome(_) }),
												Effect_flatMap(outDone =>
													Ref_update(
														lastDone,
														Option_match({
															onNone: () => Option_some(outDone.value),
															onSome: lastDone =>
																Option_some(f(lastDone, outDone.value)),
														}),
													),
												),
												Effect_catchAllCause(cause =>
													Cause_isInterrupted(cause)
														? Effect_failCause(cause)
														: Queue_offer(queue, Effect_failCause(cause)).pipe(
																Effect_zipRight(
																	Deferred_succeed(errorSignal, void 0),
																),
																Effect_asVoid,
															),
												),
											)
										}
										yield* pull.pipe(
											Effect_matchCauseEffect({
												onFailure: cause =>
													Queue_offer(queue, Effect_failCause(cause)).pipe(
														Effect_zipRight(Effect_succeed(!1)),
													),
												onSuccess: match({
													onLeft: outDone =>
														Effect_raceWith(
															Effect_interruptible(Deferred_await(errorSignal)),
															Effect_interruptible(
																withPermits(concurrencyN)(_void),
															),
															{
																onSelfDone: (_, permitAcquisition) =>
																	Effect_as(
																		Fiber_interrupt(permitAcquisition),
																		!1,
																	),
																onOtherDone: (_, failureAwait) =>
																	Effect_zipRight(
																		Fiber_interrupt(failureAwait),
																		Ref_get(lastDone).pipe(
																			Effect_flatMap(
																				Option_match({
																					onNone: () =>
																						Queue_offer(
																							queue,
																							Effect_succeed(
																								Either_left(outDone),
																							),
																						),
																					onSome: lastDone =>
																						Queue_offer(
																							queue,
																							Effect_succeed(
																								Either_left(
																									f(lastDone, outDone),
																								),
																							),
																						),
																				}),
																			),
																			Effect_as(!1),
																		),
																	),
															},
														),
													onRight: channel =>
														mergeStrategy_match(mergeStrategy, {
															onBackPressure: () =>
																Effect_gen(function* () {
																	const latch = yield* Deferred_make(),
																		raceEffects = Effect_scopedWith(scope =>
																			toPullIn(
																				pipeTo(queueReader, channel),
																				scope,
																			).pipe(
																				Effect_flatMap(pull =>
																					Effect_race(
																						Effect_exit(evaluatePull(pull)),
																						Effect_exit(
																							Effect_interruptible(
																								Deferred_await(errorSignal),
																							),
																						),
																					),
																				),
																				Effect_flatMap(identity),
																			),
																		)
																	yield* Deferred_succeed(latch, void 0).pipe(
																		Effect_zipRight(raceEffects),
																		withPermits(1),
																		Effect_forkIn(scope),
																	)
																	yield* Deferred_await(latch)
																	return !(yield* Deferred_isDone(errorSignal))
																}),
															onBufferSliding: () =>
																Effect_gen(function* () {
																	const canceler = yield* Deferred_make(),
																		latch = yield* Deferred_make(),
																		size = yield* (self => self.size)(cancelers)
																	yield* Queue_take(cancelers).pipe(
																		Effect_flatMap(canceler =>
																			Deferred_succeed(canceler, void 0),
																		),
																		Effect_when(() => size >= concurrencyN),
																	)
																	yield* Queue_offer(cancelers, canceler)
																	const raceEffects = Effect_scopedWith(scope =>
																		toPullIn(
																			pipeTo(queueReader, channel),
																			scope,
																		).pipe(
																			Effect_flatMap(pull =>
																				Effect_exit(evaluatePull(pull)).pipe(
																					Effect_race(
																						Effect_exit(
																							Effect_interruptible(
																								Deferred_await(errorSignal),
																							),
																						),
																					),
																					Effect_race(
																						Effect_exit(
																							Effect_interruptible(
																								Deferred_await(canceler),
																							),
																						),
																					),
																				),
																			),
																			Effect_flatMap(identity),
																		),
																	)
																	yield* Deferred_succeed(latch, void 0).pipe(
																		Effect_zipRight(raceEffects),
																		withPermits(1),
																		Effect_forkIn(scope),
																	)
																	yield* Deferred_await(latch)
																	return !(yield* Deferred_isDone(errorSignal))
																}),
														}),
												}),
											}),
											Effect_repeat({ while: _ => _ }),
											Effect_forkIn(scope),
										)
										const consumer = pipe(
											Queue_take(queue),
											Effect_flatten,
											Effect_matchCause({
												onFailure: core_stream_failCause,
												onSuccess: match({
													onLeft: succeedNow,
													onRight: outElem =>
														core_stream_flatMap(write(outElem), () => consumer),
												}),
											}),
											channel_unwrap,
										)
										return embedInput(consumer, input)
									}),
								)
						)(options)(channels, constVoid)
				)(options)(mapOut(self, f)),
			),
			channel_mergeWith = dual(2, (self, options) =>
				unwrapScopedWith(function (scope) {
					return Effect_gen(function* () {
						const input = yield* singleProducerAsyncInput_make(),
							queueReader = fromInput(input),
							pullL = yield* toPullIn(pipeTo(queueReader, self), scope),
							pullR = yield* toPullIn(pipeTo(queueReader, options.other), scope)
						function handleSide(exit, fiber, pull) {
							return (done, both, single) => {
								function onDecision(decision) {
									const op = decision
									return "Done" === op._tag
										? Effect_succeed(
												core_stream_fromEffect(
													Effect_zipRight(Fiber_interrupt(fiber), op.effect),
												),
											)
										: Effect_map(
												Fiber_await(fiber),
												Exit_match({
													onFailure: cause =>
														core_stream_fromEffect(op.f(Exit_failCause(cause))),
													onSuccess: match({
														onLeft: done =>
															core_stream_fromEffect(op.f(Exit_succeed(done))),
														onRight: elem =>
															channel_zipRight(write(elem), go(single(op.f))),
													}),
												}),
											)
								}
								return Exit_match(exit, {
									onFailure: cause => onDecision(done(Exit_failCause(cause))),
									onSuccess: match({
										onLeft: z => onDecision(done(Exit_succeed(z))),
										onRight: elem =>
											Effect_succeed(
												core_stream_flatMap(write(elem), () =>
													core_stream_flatMap(
														core_stream_fromEffect(
															Effect_forkIn(Effect_interruptible(pull), scope),
														),
														leftFiber => go(both(leftFiber, fiber)),
													),
												),
											),
									}),
								})
							}
						}
						function go(state) {
							switch (state._tag) {
								case "BothRunning": {
									const leftJoin = Effect_interruptible(Fiber_join(state.left)),
										rightJoin = Effect_interruptible(Fiber_join(state.right))
									return channel_unwrap(
										Effect_raceWith(leftJoin, rightJoin, {
											onSelfDone: (leftExit, rf) =>
												Effect_zipRight(
													Fiber_interrupt(rf),
													handleSide(leftExit, state.right, pullL)(
														options.onSelfDone,
														BothRunning,
														f => LeftDone(f),
													),
												),
											onOtherDone: (rightExit, lf) =>
												Effect_zipRight(
													Fiber_interrupt(lf),
													handleSide(rightExit, state.left, pullR)(
														options.onOtherDone,
														(left, right) => BothRunning(right, left),
														f => RightDone(f),
													),
												),
										}),
									)
								}
								case "LeftDone":
									return channel_unwrap(
										Effect_map(
											Effect_exit(pullR),
											Exit_match({
												onFailure: cause =>
													core_stream_fromEffect(
														state.f(Exit_failCause(cause)),
													),
												onSuccess: match({
													onLeft: done =>
														core_stream_fromEffect(state.f(Exit_succeed(done))),
													onRight: elem =>
														core_stream_flatMap(write(elem), () =>
															go(LeftDone(state.f)),
														),
												}),
											}),
										),
									)
								case "RightDone":
									return channel_unwrap(
										Effect_map(
											Effect_exit(pullL),
											Exit_match({
												onFailure: cause =>
													core_stream_fromEffect(
														state.f(Exit_failCause(cause)),
													),
												onSuccess: match({
													onLeft: done =>
														core_stream_fromEffect(state.f(Exit_succeed(done))),
													onRight: elem =>
														core_stream_flatMap(write(elem), () =>
															go(RightDone(state.f)),
														),
												}),
											}),
										),
									)
							}
						}
						return core_stream_fromEffect(
							Effect_withFiberRuntime(parent => {
								const inherit = Effect_withFiberRuntime(state => {
										state.transferChildren(parent.scope())
										return _void
									}),
									leftFiber = Effect_interruptible(pullL).pipe(
										Effect_ensuring(inherit),
										Effect_forkIn(scope),
									),
									rightFiber = Effect_interruptible(pullR).pipe(
										Effect_ensuring(inherit),
										Effect_forkIn(scope),
									)
								return Effect_zipWith(leftFiber, rightFiber, (left, right) =>
									BothRunning(left, right),
								)
							}),
						).pipe(core_stream_flatMap(go), embedInput(input))
					})
				}),
			),
			pipeToOrFail = dual(2, (self, that) =>
				core_stream_suspend(() => {
					let channelException
					const reader = readWith({
							onInput: outElem =>
								core_stream_flatMap(write(outElem), () => reader),
							onFailure: outErr => {
								channelException = ChannelException(outErr)
								return core_stream_failCause(Cause_die(channelException))
							},
							onDone: succeedNow,
						}),
						writer = readWithCause({
							onInput: outElem =>
								pipe(
									write(outElem),
									core_stream_flatMap(() => writer),
								),
							onFailure: cause =>
								Cause_isDieType(cause) &&
								isChannelException(cause.defect) &&
								equals(cause.defect, channelException)
									? core_stream_fail(cause.defect.error)
									: core_stream_failCause(cause),
							onDone: succeedNow,
						})
					return pipeTo(pipeTo(pipeTo(self, reader), that), writer)
				}),
			),
			runDrain = self =>
				(self => Effect_scopedWith(scope => runIn(self, scope)))(drain(self)),
			channel_scoped = effect =>
				channel_unwrap(
					Effect_uninterruptibleMask(restore =>
						Effect_map(Scope_make(), scope =>
							acquireReleaseOut(
								Effect_tapErrorCause(
									restore(Scope_extend(effect, scope)),
									cause => Scope_close(scope, Exit_failCause(cause)),
								),
								(_, exit) => Scope_close(scope, exit),
							),
						),
					),
				),
			channel_scopedWith = f =>
				channel_unwrapScoped(
					Effect_map(Effect_scope, scope =>
						core_stream_flatMap(core_stream_fromEffect(f(scope)), write),
					),
				),
			toPullIn = dual(2, (self, scope) =>
				Effect_zip(
					Effect_sync(() => new ChannelExecutor(self, void 0, identity)),
					Effect_runtime(),
				).pipe(
					Effect_tap(([executor, runtime]) =>
						addFinalizerExit(scope, exit => {
							const finalizer = executor.close(exit)
							return void 0 !== finalizer
								? Effect_provide(finalizer, runtime)
								: _void
						}),
					),
					Effect_uninterruptible,
					Effect_map(([executor]) =>
						Effect_suspend(() => interpretToPull(executor.run(), executor)),
					),
				),
			),
			interpretToPull = (channelState, exec) => {
				const state = channelState
				switch (state._tag) {
					case "Done":
						return Exit_match(exec.getDone(), {
							onFailure: Effect_failCause,
							onSuccess: done => Effect_succeed(Either_left(done)),
						})
					case "Emit":
						return Effect_succeed(Either_right(exec.getEmit()))
					case "FromEffect":
						return pipe(
							state.effect,
							Effect_flatMap(() => interpretToPull(exec.run(), exec)),
						)
					case "Read":
						return readUpstream(
							state,
							() => interpretToPull(exec.run(), exec),
							cause => Effect_failCause(cause),
						)
				}
			},
			channel_unwrap = channel =>
				(self => core_stream_flatMap(self, identity))(
					core_stream_fromEffect(channel),
				),
			channel_unwrapScoped = self =>
				concatAllWith(
					channel_scoped(self),
					(d, _) => d,
					(d, _) => d,
				),
			unwrapScopedWith = f =>
				concatAllWith(
					channel_scopedWith(f),
					(d, _) => d,
					(d, _) => d,
				),
			writeChunk = outs => writeChunkWriter(0, outs.length, outs),
			writeChunkWriter = (idx, len, chunk) =>
				idx === len
					? core_stream_void_
					: pipe(
							write(pipe(chunk, Chunk_unsafeGet(idx))),
							core_stream_flatMap(() => writeChunkWriter(idx + 1, len, chunk)),
						),
			channel_zip = dual(
				args => isChannel(args[1]),
				(self, that, options) =>
					options?.concurrent
						? channel_mergeWith(self, {
								other: that,
								onSelfDone: exit1 =>
									Await(exit2 => Effect_suspend(() => Exit_zip(exit1, exit2))),
								onOtherDone: exit2 =>
									Await(exit1 => Effect_suspend(() => Exit_zip(exit1, exit2))),
							})
						: core_stream_flatMap(self, a => channel_map(that, b => [a, b])),
			),
			channel_zipRight = dual(
				args => isChannel(args[1]),
				(self, that, options) =>
					options?.concurrent
						? channel_map(
								channel_zip(self, that, { concurrent: !0 }),
								tuple => tuple[1],
							)
						: core_stream_flatMap(self, () => that),
			),
			ChannelExceptionTypeId = Symbol.for("effect/Channel/ChannelException"),
			ChannelException = error => ({
				_tag: "ChannelException",
				[ChannelExceptionTypeId]: ChannelExceptionTypeId,
				error,
			}),
			isChannelException = u => hasProperty(u, ChannelExceptionTypeId),
			withMinimumLogLevel = dual(2, (self, level) =>
				fiberRefLocally(currentMinimumLogLevel, level)(self),
			),
			replaceLogger = dual(2, (self, that) =>
				layer_flatMap(
					scopedDiscard(
						fiberRefLocallyScopedWith(currentLoggers, HashSet_remove(self)),
					),
					() =>
						scopedDiscard(
							fiberRefLocallyScopedWith(currentLoggers, HashSet_add(that)),
						),
				),
			),
			MergeDecision_Await = Await,
			AbsentValue = Symbol.for("effect/PubSub/AbsentValue"),
			addSubscribers = (subscription, pollers) => subscribers => {
				subscribers.has(subscription) ||
					subscribers.set(subscription, new Set())
				subscribers.get(subscription).add(pollers)
			},
			removeSubscribers = (subscription, pollers) => subscribers => {
				if (!subscribers.has(subscription)) return
				const set = subscribers.get(subscription)
				set.delete(pollers)
				0 === set.size && subscribers.delete(subscription)
			},
			publish = dual(2, (self, value) => self.publish(value))
		class UnboundedPubSub {
			replayBuffer
			publisherHead = { value: AbsentValue, subscribers: 0, next: null }
			publisherTail = this.publisherHead
			publisherIndex = 0
			subscribersIndex = 0
			capacity = Number.MAX_SAFE_INTEGER
			constructor(replayBuffer) {
				this.replayBuffer = replayBuffer
			}
			replayWindow() {
				return this.replayBuffer
					? new ReplayWindowImpl(this.replayBuffer)
					: emptyReplayWindow
			}
			isEmpty() {
				return this.publisherHead === this.publisherTail
			}
			isFull() {
				return !1
			}
			size() {
				return this.publisherIndex - this.subscribersIndex
			}
			publish(value) {
				const subscribers = this.publisherTail.subscribers
				if (0 !== subscribers) {
					this.publisherTail.next = { value, subscribers, next: null }
					this.publisherTail = this.publisherTail.next
					this.publisherIndex += 1
				}
				this.replayBuffer && this.replayBuffer.offer(value)
				return !0
			}
			publishAll(elements) {
				if (0 !== this.publisherTail.subscribers)
					for (const a of elements) this.publish(a)
				else this.replayBuffer && this.replayBuffer.offerAll(elements)
				return esm_Chunk_empty()
			}
			slide() {
				if (this.publisherHead !== this.publisherTail) {
					this.publisherHead = this.publisherHead.next
					this.publisherHead.value = AbsentValue
					this.subscribersIndex += 1
				}
				this.replayBuffer && this.replayBuffer.slide()
			}
			subscribe() {
				this.publisherTail.subscribers += 1
				return new UnboundedPubSubSubscription(
					this,
					this.publisherTail,
					this.publisherIndex,
					!1,
				)
			}
		}
		class UnboundedPubSubSubscription {
			self
			subscriberHead
			subscriberIndex
			unsubscribed
			constructor(self, subscriberHead, subscriberIndex, unsubscribed) {
				this.self = self
				this.subscriberHead = subscriberHead
				this.subscriberIndex = subscriberIndex
				this.unsubscribed = unsubscribed
			}
			isEmpty() {
				if (this.unsubscribed) return !0
				let empty = !0,
					loop = !0
				for (; loop;)
					if (this.subscriberHead === this.self.publisherTail) loop = !1
					else if (this.subscriberHead.next.value !== AbsentValue) {
						empty = !1
						loop = !1
					} else {
						this.subscriberHead = this.subscriberHead.next
						this.subscriberIndex += 1
					}
				return empty
			}
			size() {
				return this.unsubscribed
					? 0
					: this.self.publisherIndex -
							Math.max(this.subscriberIndex, this.self.subscribersIndex)
			}
			poll(default_) {
				if (this.unsubscribed) return default_
				let loop = !0,
					polled = default_
				for (; loop;)
					if (this.subscriberHead === this.self.publisherTail) loop = !1
					else {
						const elem = this.subscriberHead.next.value
						if (elem !== AbsentValue) {
							polled = elem
							this.subscriberHead.subscribers -= 1
							if (0 === this.subscriberHead.subscribers) {
								this.self.publisherHead = this.self.publisherHead.next
								this.self.publisherHead.value = AbsentValue
								this.self.subscribersIndex += 1
							}
							loop = !1
						}
						this.subscriberHead = this.subscriberHead.next
						this.subscriberIndex += 1
					}
				return polled
			}
			pollUpTo(n) {
				const builder = [],
					default_ = AbsentValue
				let i = 0
				for (; i !== n;) {
					const a = this.poll(default_)
					if (a === default_) i = n
					else {
						builder.push(a)
						i += 1
					}
				}
				return Chunk_fromIterable(builder)
			}
			unsubscribe() {
				if (!this.unsubscribed) {
					this.unsubscribed = !0
					this.self.publisherTail.subscribers -= 1
					for (; this.subscriberHead !== this.self.publisherTail;) {
						if (this.subscriberHead.next.value !== AbsentValue) {
							this.subscriberHead.subscribers -= 1
							if (0 === this.subscriberHead.subscribers) {
								this.self.publisherHead = this.self.publisherHead.next
								this.self.publisherHead.value = AbsentValue
								this.self.subscribersIndex += 1
							}
						}
						this.subscriberHead = this.subscriberHead.next
					}
				}
			}
		}
		class SubscriptionImpl extends Effectable_Class {
			pubsub
			subscribers
			subscription
			pollers
			shutdownHook
			shutdownFlag
			strategy
			replayWindow;
			[DequeueTypeId] = dequeueVariance
			constructor(
				pubsub,
				subscribers,
				subscription,
				pollers,
				shutdownHook,
				shutdownFlag,
				strategy,
				replayWindow,
			) {
				super()
				this.pubsub = pubsub
				this.subscribers = subscribers
				this.subscription = subscription
				this.pollers = pollers
				this.shutdownHook = shutdownHook
				this.shutdownFlag = shutdownFlag
				this.strategy = strategy
				this.replayWindow = replayWindow
			}
			commit() {
				return this.take
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
			capacity() {
				return this.pubsub.capacity
			}
			isActive() {
				return !MutableRef_get(this.shutdownFlag)
			}
			get size() {
				return suspend(() =>
					MutableRef_get(this.shutdownFlag)
						? core_interrupt
						: succeed(this.subscription.size() + this.replayWindow.remaining),
				)
			}
			unsafeSize() {
				return MutableRef_get(this.shutdownFlag)
					? Option_none()
					: Option_some(this.subscription.size() + this.replayWindow.remaining)
			}
			get isFull() {
				return suspend(() =>
					MutableRef_get(this.shutdownFlag)
						? core_interrupt
						: succeed(this.subscription.size() === this.capacity()),
				)
			}
			get isEmpty() {
				return core_map(this.size, size => 0 === size)
			}
			get shutdown() {
				return uninterruptible(
					withFiberRuntime(state => {
						MutableRef_set(this.shutdownFlag, !0)
						return pipe(
							forEachParUnbounded(
								unsafePollAllQueue(this.pollers),
								d => deferredInterruptWith(d, state.id()),
								!1,
							),
							core_zipRight(
								sync(() => {
									this.subscribers.delete(this.subscription)
									this.subscription.unsubscribe()
									this.strategy.unsafeOnPubSubEmptySpace(
										this.pubsub,
										this.subscribers,
									)
								}),
							),
							whenEffect(deferredSucceed(this.shutdownHook, void 0)),
							core_asVoid,
						)
					}),
				)
			}
			get isShutdown() {
				return sync(() => MutableRef_get(this.shutdownFlag))
			}
			get awaitShutdown() {
				return deferredAwait(this.shutdownHook)
			}
			get take() {
				return withFiberRuntime(state => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					if (this.replayWindow.remaining > 0) {
						const message = this.replayWindow.take()
						return succeed(message)
					}
					const message = MutableQueue_isEmpty(this.pollers)
						? this.subscription.poll(EmptyMutableQueue)
						: EmptyMutableQueue
					if (message === EmptyMutableQueue) {
						const deferred = deferredUnsafeMake(state.id())
						return pipe(
							suspend(() => {
								pipe(this.pollers, offer(deferred))
								pipe(
									this.subscribers,
									addSubscribers(this.subscription, this.pollers),
								)
								this.strategy.unsafeCompletePollers(
									this.pubsub,
									this.subscribers,
									this.subscription,
									this.pollers,
								)
								return MutableRef_get(this.shutdownFlag)
									? core_interrupt
									: deferredAwait(deferred)
							}),
							onInterrupt(() =>
								sync(() => pubsub_unsafeRemove(this.pollers, deferred)),
							),
						)
					}
					this.strategy.unsafeOnPubSubEmptySpace(this.pubsub, this.subscribers)
					return succeed(message)
				})
			}
			get takeAll() {
				return suspend(() => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					const as = MutableQueue_isEmpty(this.pollers)
						? unsafePollAllSubscription(this.subscription)
						: esm_Chunk_empty()
					this.strategy.unsafeOnPubSubEmptySpace(this.pubsub, this.subscribers)
					return this.replayWindow.remaining > 0
						? succeed(Chunk_appendAll(this.replayWindow.takeAll(), as))
						: succeed(as)
				})
			}
			takeUpTo(max) {
				return suspend(() => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					let replay
					if (this.replayWindow.remaining >= max) {
						const as = this.replayWindow.takeN(max)
						return succeed(as)
					}
					if (this.replayWindow.remaining > 0) {
						replay = this.replayWindow.takeAll()
						max -= replay.length
					}
					const as = MutableQueue_isEmpty(this.pollers)
						? pubsub_unsafePollN(this.subscription, max)
						: esm_Chunk_empty()
					this.strategy.unsafeOnPubSubEmptySpace(this.pubsub, this.subscribers)
					return succeed(replay ? Chunk_appendAll(replay, as) : as)
				})
			}
			takeBetween(min, max) {
				return suspend(() =>
					pubsub_takeRemainderLoop(this, min, max, esm_Chunk_empty()),
				)
			}
		}
		const pubsub_takeRemainderLoop = (self, min, max, acc) =>
			max < min
				? succeed(acc)
				: pipe(
						self.takeUpTo(max),
						core_flatMap(bs => {
							const remaining = min - bs.length
							return 1 === remaining
								? pipe(
										self.take,
										core_map(b =>
											pipe(acc, Chunk_appendAll(bs), Chunk_append(b)),
										),
									)
								: remaining > 1
									? pipe(
											self.take,
											core_flatMap(b =>
												pubsub_takeRemainderLoop(
													self,
													remaining - 1,
													max - bs.length - 1,
													pipe(acc, Chunk_appendAll(bs), Chunk_append(b)),
												),
											),
										)
									: succeed(pipe(acc, Chunk_appendAll(bs)))
						}),
					)
		class PubSubImpl {
			pubsub
			subscribers
			scope
			shutdownHook
			shutdownFlag
			strategy;
			[EnqueueTypeId] = enqueueVariance;
			[DequeueTypeId] = dequeueVariance
			constructor(
				pubsub,
				subscribers,
				scope,
				shutdownHook,
				shutdownFlag,
				strategy,
			) {
				this.pubsub = pubsub
				this.subscribers = subscribers
				this.scope = scope
				this.shutdownHook = shutdownHook
				this.shutdownFlag = shutdownFlag
				this.strategy = strategy
			}
			capacity() {
				return this.pubsub.capacity
			}
			get size() {
				return suspend(() =>
					MutableRef_get(this.shutdownFlag)
						? core_interrupt
						: sync(() => this.pubsub.size()),
				)
			}
			unsafeSize() {
				return MutableRef_get(this.shutdownFlag)
					? Option_none()
					: Option_some(this.pubsub.size())
			}
			get isFull() {
				return core_map(this.size, size => size === this.capacity())
			}
			get isEmpty() {
				return core_map(this.size, size => 0 === size)
			}
			get awaitShutdown() {
				return deferredAwait(this.shutdownHook)
			}
			get isShutdown() {
				return sync(() => MutableRef_get(this.shutdownFlag))
			}
			get shutdown() {
				return uninterruptible(
					withFiberRuntime(state => {
						pipe(this.shutdownFlag, MutableRef_set(!0))
						return pipe(
							this.scope.close(exitInterrupt(state.id())),
							core_zipRight(this.strategy.shutdown),
							whenEffect(deferredSucceed(this.shutdownHook, void 0)),
							core_asVoid,
						)
					}),
				)
			}
			publish(value) {
				return suspend(() => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					if (this.pubsub.publish(value)) {
						this.strategy.unsafeCompleteSubscribers(
							this.pubsub,
							this.subscribers,
						)
						return succeed(!0)
					}
					return this.strategy.handleSurplus(
						this.pubsub,
						this.subscribers,
						Chunk_of(value),
						this.shutdownFlag,
					)
				})
			}
			isActive() {
				return !MutableRef_get(this.shutdownFlag)
			}
			unsafeOffer(value) {
				if (MutableRef_get(this.shutdownFlag)) return !1
				if (this.pubsub.publish(value)) {
					this.strategy.unsafeCompleteSubscribers(this.pubsub, this.subscribers)
					return !0
				}
				return !1
			}
			publishAll(elements) {
				return suspend(() => {
					if (MutableRef_get(this.shutdownFlag)) return core_interrupt
					const surplus = unsafePublishAll(this.pubsub, elements)
					this.strategy.unsafeCompleteSubscribers(this.pubsub, this.subscribers)
					return Chunk_isEmpty(surplus)
						? succeed(!0)
						: this.strategy.handleSurplus(
								this.pubsub,
								this.subscribers,
								surplus,
								this.shutdownFlag,
							)
				})
			}
			get subscribe() {
				const acquire = core_tap(
					fiberRuntime_all([
						this.scope.fork(executionStrategy_sequential),
						((pubsub = this.pubsub),
						(subscribers = this.subscribers),
						(strategy = this.strategy),
						core_map(deferredMake(), deferred =>
							((
								pubsub,
								subscribers,
								subscription,
								pollers,
								shutdownHook,
								shutdownFlag,
								strategy,
							) =>
								new SubscriptionImpl(
									pubsub,
									subscribers,
									subscription,
									pollers,
									shutdownHook,
									shutdownFlag,
									strategy,
									pubsub.replayWindow(),
								))(
								pubsub,
								subscribers,
								pubsub.subscribe(),
								unbounded(),
								deferred,
								MutableRef_make(!1),
								strategy,
							),
						)),
					]),
					tuple => tuple[0].addFinalizer(() => tuple[1].shutdown),
				)
				var pubsub, subscribers, strategy
				return core_map(
					fiberRuntime_acquireRelease(acquire, (tuple, exit) =>
						tuple[0].close(exit),
					),
					tuple => tuple[1],
				)
			}
			offer(value) {
				return this.publish(value)
			}
			offerAll(elements) {
				return this.publishAll(elements)
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const pubsub_unsafeCompleteDeferred = (deferred, a) => {
				deferredUnsafeDone(deferred, succeed(a))
			},
			pubsub_unsafeOfferAll = (queue, as) => pipe(queue, offerAll(as)),
			unsafePollAllQueue = queue =>
				pipe(queue, pollUpTo(Number.POSITIVE_INFINITY)),
			unsafePollAllSubscription = subscription =>
				subscription.pollUpTo(Number.POSITIVE_INFINITY),
			pubsub_unsafePollN = (subscription, max) => subscription.pollUpTo(max),
			unsafePublishAll = (pubsub, as) => pubsub.publishAll(as),
			pubsub_unsafeRemove = (queue, value) => {
				pubsub_unsafeOfferAll(
					queue,
					pipe(
						unsafePollAllQueue(queue),
						Chunk_filter(elem => elem !== value),
					),
				)
			}
		class pubsub_DroppingStrategy {
			get shutdown() {
				return core_void_
			}
			handleSurplus(_pubsub, _subscribers, _elements, _isShutdown) {
				return succeed(!1)
			}
			unsafeOnPubSubEmptySpace(_pubsub, _subscribers) {}
			unsafeCompletePollers(pubsub, subscribers, subscription, pollers) {
				return unsafeStrategyCompletePollers(
					this,
					pubsub,
					subscribers,
					subscription,
					pollers,
				)
			}
			unsafeCompleteSubscribers(pubsub, subscribers) {
				return unsafeStrategyCompleteSubscribers(this, pubsub, subscribers)
			}
		}
		const unsafeStrategyCompletePollers = (
				strategy,
				pubsub,
				subscribers,
				subscription,
				pollers,
			) => {
				let keepPolling = !0
				for (; keepPolling && !subscription.isEmpty();) {
					const poller = pipe(pollers, MutableQueue_poll(EmptyMutableQueue))
					if (poller === EmptyMutableQueue) {
						pipe(subscribers, removeSubscribers(subscription, pollers))
						MutableQueue_isEmpty(pollers)
							? (keepPolling = !1)
							: pipe(subscribers, addSubscribers(subscription, pollers))
					} else {
						const pollResult = subscription.poll(EmptyMutableQueue)
						if (pollResult === EmptyMutableQueue)
							pubsub_unsafeOfferAll(
								pollers,
								pipe(unsafePollAllQueue(pollers), Chunk_prepend(poller)),
							)
						else {
							pubsub_unsafeCompleteDeferred(poller, pollResult)
							strategy.unsafeOnPubSubEmptySpace(pubsub, subscribers)
						}
					}
				}
			},
			unsafeStrategyCompleteSubscribers = (strategy, pubsub, subscribers) => {
				for (const [subscription, pollersSet] of subscribers)
					for (const pollers of pollersSet)
						strategy.unsafeCompletePollers(
							pubsub,
							subscribers,
							subscription,
							pollers,
						)
			}
		class ReplayBuffer {
			capacity
			constructor(capacity) {
				this.capacity = capacity
			}
			head = { value: AbsentValue, next: null }
			tail = this.head
			size = 0
			index = 0
			slide() {
				this.index++
			}
			offer(a) {
				this.tail.value = a
				this.tail.next = { value: AbsentValue, next: null }
				this.tail = this.tail.next
				this.size === this.capacity
					? (this.head = this.head.next)
					: (this.size += 1)
			}
			offerAll(as) {
				for (const a of as) this.offer(a)
			}
		}
		class ReplayWindowImpl {
			buffer
			head
			index
			remaining
			constructor(buffer) {
				this.buffer = buffer
				this.index = buffer.index
				this.remaining = buffer.size
				this.head = buffer.head
			}
			fastForward() {
				for (; this.index < this.buffer.index;) {
					this.head = this.head.next
					this.index++
				}
			}
			take() {
				if (0 === this.remaining) return
				this.index < this.buffer.index && this.fastForward()
				this.remaining--
				const value = this.head.value
				this.head = this.head.next
				return value
			}
			takeN(n) {
				if (0 === this.remaining) return esm_Chunk_empty()
				this.index < this.buffer.index && this.fastForward()
				const len = Math.min(n, this.remaining),
					items = new Array(len)
				for (let i = 0; i < len; i++) {
					const value = this.head.value
					this.head = this.head.next
					items[i] = value
				}
				this.remaining -= len
				return unsafeFromArray(items)
			}
			takeAll() {
				return this.takeN(this.remaining)
			}
		}
		const emptyReplayWindow = {
				remaining: 0,
				take: () => {},
				takeN: () => esm_Chunk_empty(),
				takeAll: () => esm_Chunk_empty(),
			},
			PubSub_unbounded = options =>
				suspend(() => {
					const pubsub = (options =>
						new UnboundedPubSub(
							options?.replay ? new ReplayBuffer(options.replay) : void 0,
						))(options)
					return ((pubsub, strategy) =>
						core_flatMap(fiberRuntime_scopeMake(), scope =>
							core_map(deferredMake(), deferred =>
								((
									pubsub,
									subscribers,
									scope,
									shutdownHook,
									shutdownFlag,
									strategy,
								) =>
									new PubSubImpl(
										pubsub,
										subscribers,
										scope,
										shutdownHook,
										shutdownFlag,
										strategy,
									))(
									pubsub,
									new Map(),
									scope,
									deferred,
									MutableRef_make(!1),
									strategy,
								),
							),
						))(pubsub, new pubsub_DroppingStrategy())
				}),
			PubSub_shutdown = self => self.shutdown,
			PubSub_publish = publish,
			PubSub_subscribe = self => self.subscribe,
			Runtime_runSync = unsafeRunSync,
			Left = { _tag: "Left" },
			Right = { _tag: "Right" },
			Both = { _tag: "Both" },
			haltStrategy_Either = { _tag: "Either" },
			StreamHaltStrategy_Both = Both,
			sink_SinkTypeId = Symbol.for("effect/Sink"),
			sink_sinkVariance = {
				_A: _ => _,
				_In: _ => _,
				_L: _ => _,
				_E: _ => _,
				_R: _ => _,
			}
		class SinkImpl {
			channel;
			[sink_SinkTypeId] = sink_sinkVariance
			constructor(channel) {
				this.channel = channel
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const sink_drain = new SinkImpl(drain(identityChannel())),
			toChannel = self =>
				Effect_isEffect(self)
					? toChannel(new SinkImpl(core_stream_fromEffect(self)))
					: self.channel
		Symbol.iterator
		const TakeTypeId = Symbol.for("effect/Take"),
			takeVariance = { _A: _ => _, _E: _ => _ }
		class TakeImpl {
			exit;
			[TakeTypeId] = takeVariance
			constructor(exit) {
				this.exit = exit
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const take_chunk = chunk => new TakeImpl(Exit_succeed(chunk)),
			take_end = new TakeImpl(Exit_fail(Option_none())),
			take_failCause = cause =>
				new TakeImpl(Exit_failCause(pipe(cause, Cause_map(Option_some)))),
			take_of = value => new TakeImpl(Exit_succeed(Chunk_of(value))),
			stream_StreamTypeId = Symbol.for("effect/Stream"),
			streamVariance = { _R: _ => _, _E: _ => _, _A: _ => _ }
		class StreamImpl {
			channel;
			[stream_StreamTypeId] = streamVariance
			constructor(channel) {
				this.channel = channel
			}
			pipe() {
				return pipeArguments(this, arguments)
			}
		}
		const isStream = u =>
				hasProperty(u, stream_StreamTypeId) || Effect_isEffect(u),
			asyncPush = (register, options) =>
				Effect_acquireRelease(
					(options => {
						return "unbounded" === options?.bufferSize ||
							(void 0 === options?.bufferSize && void 0 === options?.strategy)
							? Queue_unbounded()
							: "sliding" === options?.strategy
								? (requestedCapacity =>
										pipe(
											sync(() => bounded(requestedCapacity)),
											core_flatMap(queue =>
												queue_make(
													backingQueueFromMutableQueue(queue),
													new SlidingStrategy(),
												),
											),
										))(options.bufferSize ?? 16)
								: ((requestedCapacity = options?.bufferSize ?? 16),
									pipe(
										sync(() => bounded(requestedCapacity)),
										core_flatMap(queue =>
											queue_make(
												backingQueueFromMutableQueue(queue),
												droppingStrategy(),
											),
										),
									))
						var requestedCapacity
					})(options),
					Queue_shutdown,
				).pipe(
					Effect_tap(queue =>
						getWith(FiberRef_currentScheduler, scheduler =>
							register(
								((queue, scheduler) => {
									let finished = !1,
										buffer = [],
										running = !1
									function array(items) {
										if (finished) return !1
										if (items.length <= 5e4) buffer.push.apply(buffer, items)
										else
											for (let i = 0; i < items.length; i++)
												buffer.push(items[0])
										if (!running) {
											running = !0
											scheduler.scheduleTask(flush, 0)
										}
										return !0
									}
									function flush() {
										running = !1
										if (buffer.length > 0) {
											queue.unsafeOffer(buffer)
											buffer = []
										}
									}
									function done(exit) {
										if (!finished) {
											finished = !0
											"Success" === exit._tag && buffer.push(exit.value)
											flush()
											queue.unsafeOffer(
												"Success" === exit._tag ? Exit_void_ : exit,
											)
										}
									}
									return {
										single(value) {
											if (finished) return !1
											buffer.push(value)
											if (!running) {
												running = !0
												scheduler.scheduleTask(flush, 0)
											}
											return !0
										},
										array,
										chunk: chunk => array(toReadonlyArray(chunk)),
										done,
										end() {
											if (!finished) {
												finished = !0
												flush()
												queue.unsafeOffer(Exit_void_)
											}
										},
										halt: cause => done(Exit_failCause(cause)),
										fail: error => done(Exit_fail(error)),
										die: defect => done(Exit_die(defect)),
										dieMessage: message => done(Exit_die(new Error(message))),
									}
								})(queue, scheduler),
							),
						),
					),
					Effect_map(queue => {
						const loop = core_stream_flatMap(Queue_take(queue), item =>
							isExit(item)
								? Exit_isSuccess(item)
									? core_stream_void_
									: core_stream_failCause(item.cause)
								: channel_zipRight(write(unsafeFromArray(item)), loop),
						)
						return loop
					}),
					channel_unwrapScoped,
					stream_fromChannel,
				),
			stream_catchAllCause = dual(
				2,
				(self, f) =>
					new StreamImpl(
						pipe(
							stream_toChannel(self),
							core_stream_catchAllCause(cause => stream_toChannel(f(cause))),
						),
					),
			),
			changesWith = dual(2, (self, f) => {
				const writer = last =>
					readWithCause({
						onInput: input => {
							const [newLast, newChunk] = Chunk_reduce(
								input,
								[last, esm_Chunk_empty()],
								([option, outputs], output) =>
									Option_isSome(option) && f(option.value, output)
										? [Option_some(output), outputs]
										: [
												Option_some(output),
												pipe(outputs, Chunk_append(output)),
											],
							)
							return Chunk_isEmpty(newChunk)
								? writer(newLast)
								: core_stream_flatMap(write(newChunk), () => writer(newLast))
						},
						onFailure: core_stream_failCause,
						onDone: () => core_stream_void_,
					})
				return new StreamImpl(
					pipe(stream_toChannel(self), pipeTo(writer(Option_none()))),
				)
			}),
			stream_concat = dual(
				2,
				(self, that) =>
					new StreamImpl(
						pipe(
							stream_toChannel(self),
							channel_zipRight(stream_toChannel(that)),
						),
					),
			),
			stream_drop = dual(2, (self, n) => {
				const loop = r =>
					readWith({
						onInput: input => {
							const dropped = pipe(input, Chunk_drop(r)),
								leftover = Math.max(0, r - input.length)
							return Chunk_isEmpty(input) || leftover > 0
								? loop(leftover)
								: pipe(write(dropped), channel_zipRight(identityChannel()))
						},
						onFailure: core_stream_fail,
						onDone: () => core_stream_void_,
					})
				return new StreamImpl(
					pipe(stream_toChannel(self), pipeToOrFail(loop(n))),
				)
			}),
			stream_empty = new StreamImpl(core_stream_void_),
			stream_ensuring = dual(
				2,
				(self, finalizer) =>
					new StreamImpl(
						pipe(stream_toChannel(self), channel_ensuring(finalizer)),
					),
			),
			stream_filter = dual(2, (self, predicate) =>
				mapChunks(self, Chunk_filter(predicate)),
			),
			stream_filterMap = dual(2, (self, pf) =>
				mapChunks(self, Chunk_filterMap(pf)),
			),
			stream_flatMap = dual(
				args => isStream(args[0]),
				(self, f, options) => {
					const bufferSize = options?.bufferSize ?? 16
					return options?.switch
						? matchConcurrency(
								options?.concurrency,
								() => flatMapParSwitchBuffer(self, 1, bufferSize, f),
								n => flatMapParSwitchBuffer(self, n, bufferSize, f),
							)
						: matchConcurrency(
								options?.concurrency,
								() =>
									new StreamImpl(
										concatMap(stream_toChannel(self), as =>
											pipe(
												as,
												Chunk_map(a => stream_toChannel(f(a))),
												Chunk_reduce(core_stream_void_, (left, right) =>
													pipe(left, channel_zipRight(right)),
												),
											),
										),
									),
								_ =>
									new StreamImpl(
										pipe(
											stream_toChannel(self),
											concatMap(writeChunk),
											mergeMap(out => stream_toChannel(f(out)), options),
										),
									),
							)
				},
			),
			matchConcurrency = (concurrency, sequential, bounded) => {
				switch (concurrency) {
					case void 0:
						return sequential()
					case "unbounded":
						return bounded(Number.MAX_SAFE_INTEGER)
					default:
						return concurrency > 1 ? bounded(concurrency) : sequential()
				}
			},
			flatMapParSwitchBuffer = dual(
				4,
				(self, n, bufferSize, f) =>
					new StreamImpl(
						pipe(
							stream_toChannel(self),
							concatMap(writeChunk),
							mergeMap(out => stream_toChannel(f(out)), {
								concurrency: n,
								mergeStrategy: BufferSliding(),
								bufferSize,
							}),
						),
					),
			),
			stream_flatten = dual(
				args => isStream(args[0]),
				(self, options) => stream_flatMap(self, identity, options),
			),
			flattenTake = self =>
				(self => {
					const flatten = readWithCause({
						onInput: chunks =>
							core_stream_flatMap(writeChunk(chunks), () => flatten),
						onFailure: core_stream_failCause,
						onDone: () => core_stream_void_,
					})
					return new StreamImpl(pipe(stream_toChannel(self), pipeTo(flatten)))
				})(
					(self => {
						const process = readWithCause({
							onInput: chunk =>
								((chunk, cont) => {
									const [toEmit, rest] = pipe(
											chunk,
											Chunk_splitWhere(exit => !Exit_isSuccess(exit)),
										),
										next = pipe(
											Chunk_head(rest),
											Option_match({
												onNone: () => cont,
												onSome: Exit_match({
													onFailure: cause =>
														Option_match(
															(self =>
																cause_match(self, {
																	onEmpty: Option_some(cause_empty),
																	onFail: Option_map(fail),
																	onDie: defect => Option_some(die(defect)),
																	onInterrupt: fiberId =>
																		Option_some(interrupt(fiberId)),
																	onSequential: mergeWith(sequential),
																	onParallel: mergeWith(parallel),
																}))(cause),
															{
																onNone: () => core_stream_void_,
																onSome: core_stream_failCause,
															},
														),
													onSuccess: () => core_stream_void_,
												}),
											}),
										)
									return pipe(
										write(
											pipe(
												toEmit,
												Chunk_filterMap(exit =>
													Exit_isSuccess(exit)
														? Option_some(exit.value)
														: Option_none(),
												),
											),
										),
										core_stream_flatMap(() => next),
									)
								})(chunk, process),
							onFailure: cause => core_stream_failCause(cause),
							onDone: () => core_stream_void_,
						})
						return new StreamImpl(pipe(stream_toChannel(self), pipeTo(process)))
					})(
						pipe(
							self,
							stream_map(take => take.exit),
						),
					),
				),
			stream_fromChannel = channel => new StreamImpl(channel),
			stream_toChannel = stream => {
				if ("channel" in stream) return stream.channel
				if (Effect_isEffect(stream))
					return stream_toChannel(stream_fromEffect(stream))
				throw new TypeError("Expected a Stream.")
			},
			fromChunk = chunk =>
				new StreamImpl(Chunk_isEmpty(chunk) ? core_stream_void_ : write(chunk)),
			stream_fromEffect = effect =>
				pipe(effect, Effect_mapError(Option_some), fromEffectOption),
			fromEffectOption = effect =>
				new StreamImpl(
					channel_unwrap(
						Effect_match(effect, {
							onFailure: Option_match({
								onNone: () => core_stream_void_,
								onSome: core_stream_fail,
							}),
							onSuccess: a => write(Chunk_of(a)),
						}),
					),
				),
			stream_fromPubSub = (pubsub, options) => {
				const maxChunkSize = options?.maxChunkSize ?? 4096
				if (options?.scoped) {
					const effect = Effect_map(PubSub_subscribe(pubsub), queue =>
						stream_fromQueue(queue, { maxChunkSize, shutdown: !0 }),
					)
					return options.shutdown
						? Effect_map(effect, stream_ensuring(PubSub_shutdown(pubsub)))
						: effect
				}
				const stream = stream_flatMap(
					stream_scoped(PubSub_subscribe(pubsub)),
					queue => stream_fromQueue(queue, { maxChunkSize }),
				)
				return options?.shutdown
					? stream_ensuring(stream, PubSub_shutdown(pubsub))
					: stream
			},
			stream_fromIterable = iterable =>
				stream_suspend(() =>
					isChunk(iterable)
						? fromChunk(iterable)
						: fromIteratorSucceed(iterable[Symbol.iterator]()),
				),
			fromIteratorSucceed = (iterator, maxChunkSize = 4096) =>
				pipe(
					Effect_sync(() => {
						let builder = []
						const loop = iterator =>
							pipe(
								Effect_sync(() => {
									let next = iterator.next()
									if (1 === maxChunkSize)
										return next.done
											? core_stream_void_
											: pipe(
													write(Chunk_of(next.value)),
													core_stream_flatMap(() => loop(iterator)),
												)
									builder = []
									let count = 0
									for (; !1 === next.done;) {
										builder.push(next.value)
										count += 1
										if (count >= maxChunkSize) break
										next = iterator.next()
									}
									return count > 0
										? pipe(
												write(unsafeFromArray(builder)),
												core_stream_flatMap(() => loop(iterator)),
											)
										: core_stream_void_
								}),
								channel_unwrap,
							)
						return new StreamImpl(loop(iterator))
					}),
					stream_unwrap,
				),
			stream_fromQueue = (queue, options) =>
				pipe(
					Queue_takeBetween(queue, 1, options?.maxChunkSize ?? 4096),
					Effect_catchAllCause(cause =>
						pipe(
							(self => self.isShutdown)(queue),
							Effect_flatMap(isShutdown =>
								isShutdown && Cause_isInterrupted(cause)
									? Effect_fail(Option_none())
									: (cause =>
											Effect_mapError(Effect_failCause(cause), Option_some))(
											cause,
										),
							),
						),
					),
					repeatEffectChunkOption,
					options?.shutdown ? stream_ensuring(Queue_shutdown(queue)) : identity,
				),
			stream_make = (...as) => stream_fromIterable(as),
			stream_map = dual(
				2,
				(self, f) =>
					new StreamImpl(pipe(stream_toChannel(self), mapOut(Chunk_map(f)))),
			),
			stream_mapAccum = dual(3, (self, s, f) => {
				const accumulator = s =>
					readWith({
						onInput: input => {
							const [nextS, chunk] = Chunk_mapAccum(input, s, f)
							return core_stream_flatMap(write(chunk), () => accumulator(nextS))
						},
						onFailure: core_stream_fail,
						onDone: () => core_stream_void_,
					})
				return new StreamImpl(
					pipe(stream_toChannel(self), pipeTo(accumulator(s))),
				)
			}),
			mapChunks = dual(
				2,
				(self, f) => new StreamImpl(pipe(stream_toChannel(self), mapOut(f))),
			),
			mapEffectSequential = dual(2, (self, f) => {
				const loop = iterator => {
					const next = iterator.next()
					if (next.done)
						return readWithCause({
							onInput: elem => loop(elem[Symbol.iterator]()),
							onFailure: core_stream_failCause,
							onDone: core_stream_succeed,
						})
					{
						const value = next.value
						return channel_unwrap(
							Effect_map(f(value), a2 =>
								core_stream_flatMap(write(Chunk_of(a2)), () => loop(iterator)),
							),
						)
					}
				}
				return new StreamImpl(
					pipe(
						stream_toChannel(self),
						pipeTo(
							core_stream_suspend(() =>
								loop(esm_Chunk_empty()[Symbol.iterator]()),
							),
						),
					),
				)
			}),
			mapEffectPar = dual(
				3,
				(self, n, f) =>
					new StreamImpl(
						pipe(
							stream_toChannel(self),
							concatMap(writeChunk),
							mapOutEffectPar(f, n),
							mapOut(Chunk_of),
						),
					),
			),
			stream_merge = dual(
				args => isStream(args[1]),
				(self, that, options) =>
					stream_mergeWith(self, that, {
						onSelf: identity,
						onOther: identity,
						haltStrategy: options?.haltStrategy,
					}),
			),
			stream_mergeAll = dual(
				args => Symbol.iterator in args[0],
				(streams, options) =>
					stream_flatten(stream_fromIterable(streams), options),
			),
			stream_mergeWith = dual(3, (self, other, options) => {
				const strategy = options.haltStrategy
						? (input => {
								switch (input) {
									case "left":
										return Left
									case "right":
										return Right
									case "both":
										return Both
									case "either":
										return haltStrategy_Either
									default:
										return input
								}
							})(options.haltStrategy)
						: StreamHaltStrategy_Both,
					handler = terminate => exit =>
						terminate || !Exit_isSuccess(exit)
							? (effect => {
									const op = Object.create(mergeDecision_proto)
									op._tag = "Done"
									op.effect = effect
									return op
								})(Effect_suspend(() => exit))
							: MergeDecision_Await(exit => Effect_suspend(() => exit))
				return new StreamImpl(
					channel_mergeWith(
						stream_toChannel(stream_map(self, options.onSelf)),
						{
							other: stream_toChannel(stream_map(other, options.onOther)),
							onSelfDone: handler(
								"Either" === strategy._tag || "Left" === strategy._tag,
							),
							onOtherDone: handler(
								"Either" === strategy._tag || "Right" === strategy._tag,
							),
						},
					),
				)
			}),
			repeatEffectChunkOption = effect =>
				unfoldChunkEffect(effect, effect =>
					pipe(
						Effect_map(effect, chunk => Option_some([chunk, effect])),
						Effect_catchAll(
							Option_match({
								onNone: () => Effect_succeed(Option_none()),
								onSome: Effect_fail,
							}),
						),
					),
				),
			stream_run = dual(2, (self, sink) =>
				stream_toChannel(self).pipe(pipeToOrFail(toChannel(sink)), runDrain),
			),
			runForEach = dual(2, (self, f) =>
				stream_run(
					self,
					(f => {
						const process = readWithCause({
							onInput: input =>
								pipe(
									core_stream_fromEffect(
										Effect_forEach(input, v => f(v), { discard: !0 }),
									),
									core_stream_flatMap(() => process),
								),
							onFailure: core_stream_failCause,
							onDone: () => core_stream_void_,
						})
						return new SinkImpl(process)
					})(f),
				),
			),
			stream_scoped = effect =>
				new StreamImpl(
					channel_ensuring(
						channel_scoped(pipe(effect, Effect_map(Chunk_of))),
						_void,
					),
				),
			stream_suspend = stream =>
				new StreamImpl(core_stream_suspend(() => stream_toChannel(stream()))),
			stream_tap = dual(2, (self, f) =>
				mapEffectSequential(self, a => Effect_as(f(a), a)),
			),
			unfoldChunkEffect = (s, f) =>
				stream_suspend(() => {
					const loop = s =>
						channel_unwrap(
							Effect_map(
								f(s),
								Option_match({
									onNone: () => core_stream_void_,
									onSome: ([chunk, s]) =>
										core_stream_flatMap(write(chunk), () => loop(s)),
								}),
							),
						)
					return new StreamImpl(loop(s))
				}),
			stream_unwrap = effect => stream_flatten(stream_fromEffect(effect)),
			stream_unwrapScoped = effect => stream_flatten(stream_scoped(effect)),
			GroupByTypeId = Symbol.for("effect/GroupBy"),
			groupByVariance = { _R: _ => _, _E: _ => _, _K: _ => _, _V: _ => _ },
			groupBy_evaluate = dual(
				args => (u => hasProperty(u, GroupByTypeId))(args[0]),
				(self, f, options) =>
					stream_flatMap(
						self.grouped,
						([key, queue]) =>
							f(key, flattenTake(stream_fromQueue(queue, { shutdown: !0 }))),
						{ concurrency: "unbounded", bufferSize: options?.bufferSize ?? 16 },
					),
			),
			groupBy_make = grouped => ({
				[GroupByTypeId]: groupByVariance,
				pipe() {
					return pipeArguments(this, arguments)
				},
				grouped,
			}),
			mapEffectOptions = dual(
				args => "function" != typeof args[0],
				(self, f, options) =>
					options?.key
						? groupBy_evaluate(
								groupByKey(self, options.key, {
									bufferSize: options.bufferSize,
								}),
								(_, s) => mapEffectSequential(s, f),
							)
						: matchConcurrency(
								options?.concurrency,
								() => mapEffectSequential(self, f),
								n =>
									options?.unordered
										? stream_flatMap(self, a => stream_fromEffect(f(a)), {
												concurrency: n,
											})
										: mapEffectPar(self, n, f),
							),
			),
			groupByKey = dual(
				args => "function" != typeof args[0],
				(self, f, options) => {
					const loop = (map, outerQueue) =>
						readWithCause({
							onInput: input =>
								core_stream_flatMap(
									core_stream_fromEffect(
										Effect_forEach(
											groupByIterable(input, f),
											([key, values]) => {
												const innerQueue = map.get(key)
												return void 0 === innerQueue
													? pipe(
															Queue_bounded(options?.bufferSize ?? 16),
															Effect_flatMap(innerQueue =>
																pipe(
																	Effect_sync(() => {
																		map.set(key, innerQueue)
																	}),
																	Effect_zipRight(
																		Queue_offer(
																			outerQueue,
																			take_of([key, innerQueue]),
																		),
																	),
																	Effect_zipRight(
																		pipe(
																			Queue_offer(
																				innerQueue,
																				take_chunk(values),
																			),
																			Effect_catchSomeCause(cause =>
																				Cause_isInterruptedOnly(cause)
																					? Option_some(_void)
																					: Option_none(),
																			),
																		),
																	),
																),
															),
														)
													: Effect_catchSomeCause(
															Queue_offer(innerQueue, take_chunk(values)),
															cause =>
																Cause_isInterruptedOnly(cause)
																	? Option_some(_void)
																	: Option_none(),
														)
											},
											{ discard: !0 },
										),
									),
									() => loop(map, outerQueue),
								),
							onFailure: cause =>
								core_stream_fromEffect(
									Queue_offer(outerQueue, take_failCause(cause)),
								),
							onDone: () =>
								core_stream_fromEffect(
									pipe(
										Effect_forEach(
											map.entries(),
											([_, innerQueue]) =>
												pipe(
													Queue_offer(innerQueue, take_end),
													Effect_catchSomeCause(cause =>
														Cause_isInterruptedOnly(cause)
															? Option_some(_void)
															: Option_none(),
													),
												),
											{ discard: !0 },
										),
										Effect_zipRight(Queue_offer(outerQueue, take_end)),
									),
								),
						})
					return groupBy_make(
						(f =>
							stream_flatten(
								(f =>
									new StreamImpl(
										channel_scopedWith(scope =>
											f(scope).pipe(Effect_map(Chunk_of)),
										),
									))(scope => f(scope)),
							))(scope =>
							Effect_gen(function* () {
								const map = new Map(),
									queue = yield* Queue_unbounded()
								yield* Scope_addFinalizer(scope, Queue_shutdown(queue))
								return yield* stream_toChannel(self).pipe(
									pipeTo(loop(map, queue)),
									drain,
									runIn(scope),
									Effect_forkIn(scope),
									Effect_as(
										flattenTake(stream_fromQueue(queue, { shutdown: !0 })),
									),
								)
							}),
						),
					)
				},
			),
			groupByIterable = dual(2, (iterable, f) => {
				const builder = [],
					iterator = iterable[Symbol.iterator](),
					map = new Map()
				let next
				for (; (next = iterator.next()) && !next.done;) {
					const value = next.value,
						key = f(value)
					if (map.has(key)) map.get(key).push(value)
					else {
						const innerBuilder = [value]
						builder.push([key, innerBuilder])
						map.set(key, innerBuilder)
					}
				}
				return unsafeFromArray(
					builder.map(tuple => [tuple[0], unsafeFromArray(tuple[1])]),
				)
			}),
			Stream_catchAllCause = stream_catchAllCause,
			Stream_changes = self =>
				pipe(
					self,
					changesWith((x, y) => equals(y)(x)),
				),
			Stream_concat = stream_concat,
			Stream_drop = stream_drop,
			Stream_empty = stream_empty,
			Stream_filter = stream_filter,
			Stream_filterMap = stream_filterMap,
			Stream_flatMap = stream_flatMap,
			Stream_flattenTake = flattenTake,
			Stream_fromPubSub = stream_fromPubSub,
			Stream_fromQueue = stream_fromQueue,
			Stream_make = stream_make,
			Stream_map = stream_map,
			Stream_mapEffect = mapEffectOptions,
			Stream_merge = stream_merge,
			Stream_mergeAll = stream_mergeAll,
			Stream_runForEach = runForEach,
			Stream_succeed = value => fromChunk(Chunk_of(value)),
			Stream_tap = stream_tap,
			Stream_unwrap = stream_unwrap,
			Stream_unwrapScoped = stream_unwrapScoped,
			Stream_zipWithPrevious = self =>
				pipe(
					self,
					stream_mapAccum(Option_none(), (prev, curr) => [
						Option_some(curr),
						[prev, curr],
					]),
				),
			Stream_fromEventListener = (target, type, options) =>
				asyncPush(
					emit =>
						Effect_acquireRelease(
							Effect_sync(() =>
								target.addEventListener(type, emit.single, options),
							),
							() =>
								Effect_sync(() =>
									target.removeEventListener(type, emit.single, options),
								),
						),
					{
						bufferSize:
							"object" == typeof options ? options.bufferSize : void 0,
					},
				),
			Struct_entries = obj => Object.entries(obj),
			mapObject = f => o =>
				pipe(Struct_entries(o), Array_map(f), Object.fromEntries)
		__webpack_require__.dn(mapObject)
		const makeGetter = c =>
				pipe(
					c,
					mapObject(([x]) => [x, Effect_sync(() => c[x])]),
				),
			Subscribable_TypeId = Symbol.for("effect/Subscribable"),
			SubscriptionRefTypeId = Symbol.for("effect/SubscriptionRef"),
			subscriptionRefVariance = { _A: _ => _ }
		class SubscriptionRefImpl extends Effectable_Class {
			ref
			pubsub
			semaphore;
			[Readable_TypeId] = Readable_TypeId;
			[Subscribable_TypeId] = Subscribable_TypeId;
			[Ref_RefTypeId] = refVariance;
			[SynchronizedRefTypeId] = synchronizedVariance;
			[SubscriptionRefTypeId] = subscriptionRefVariance
			constructor(ref, pubsub, semaphore) {
				super()
				this.ref = ref
				this.pubsub = pubsub
				this.semaphore = semaphore
				this.get = Ref_get(this.ref)
			}
			commit() {
				return this.get
			}
			get;
			get changes() {
				return pipe(
					Ref_get(this.ref),
					Effect_flatMap(a =>
						Effect_map(stream_fromPubSub(this.pubsub, { scoped: !0 }), s =>
							stream_concat(stream_make(a), s),
						),
					),
					this.semaphore.withPermits(1),
					stream_unwrapScoped,
				)
			}
			modify(f) {
				return this.modifyEffect(a => Effect_succeed(f(a)))
			}
			modifyEffect(f) {
				return pipe(
					Ref_get(this.ref),
					Effect_flatMap(f),
					Effect_flatMap(([b, a]) =>
						pipe(
							Ref_set(this.ref, a),
							Effect_as(b),
							Effect_zipLeft(PubSub_publish(this.pubsub, a)),
						),
					),
					this.semaphore.withPermits(1),
				)
			}
		}
		const SubscriptionRef_make = value =>
				pipe(
					Effect_all([
						PubSub_unbounded(),
						Ref_make(value),
						Effect_makeSemaphore(1),
					]),
					Effect_map(
						([pubsub, ref, semaphore]) =>
							new SubscriptionRefImpl(ref, pubsub, semaphore),
					),
				),
			SubscriptionRef_set = dual(2, (self, value) =>
				pipe(
					Ref_set(self.ref, value),
					Effect_zipLeft(PubSub_publish(self.pubsub, value)),
					self.semaphore.withPermits(1),
				),
			),
			makePageState = mapObject(([k, v]) => [
				k,
				{ ele: Option_none(), read: v },
			]),
			richTypes = { Date: !0, RegExp: !0, String: !0, Number: !0 }
		function dist_diff(obj, newObj, options = { cyclesFix: !0 }, _stack = []) {
			let diffs = []
			const isObjArray = Array.isArray(obj)
			for (const key in obj) {
				const objKey = obj[key],
					path = isObjArray ? +key : key
				if (!(key in newObj)) {
					diffs.push({ type: "REMOVE", path: [path], oldValue: obj[key] })
					continue
				}
				const newObjKey = newObj[key],
					areCompatibleObjects =
						"object" == typeof objKey &&
						"object" == typeof newObjKey &&
						Array.isArray(objKey) === Array.isArray(newObjKey)
				!(objKey && newObjKey && areCompatibleObjects) ||
				richTypes[Object.getPrototypeOf(objKey)?.constructor?.name] ||
				(options.cyclesFix && _stack.includes(objKey))
					? objKey === newObjKey ||
						(Number.isNaN(objKey) && Number.isNaN(newObjKey)) ||
						(areCompatibleObjects &&
							(isNaN(objKey)
								? objKey + "" == newObjKey + ""
								: +objKey == +newObjKey)) ||
						diffs.push({
							path: [path],
							type: "CHANGE",
							value: newObjKey,
							oldValue: objKey,
						})
					: diffs.push.apply(
							diffs,
							dist_diff(
								objKey,
								newObjKey,
								options,
								options.cyclesFix ? _stack.concat([objKey]) : [],
							).map(difference => {
								difference.path.unshift(path)
								return difference
							}),
						)
			}
			const isNewObjArray = Array.isArray(newObj)
			for (const key in newObj)
				key in obj ||
					diffs.push({
						type: "CREATE",
						path: [isNewObjArray ? +key : key],
						value: newObj[key],
					})
			return diffs
		}
		const configDiff = (oldValue, value) =>
			"object" == typeof oldValue &&
			null !== oldValue &&
			"object" == typeof value &&
			null !== value
				? dist_diff(oldValue, value)
				: [{ type: "CHANGE", path: [], oldValue, value }]
		__webpack_require__.dn(configDiff)
		const external_astring_namespaceObject = astring,
			external_jsep_namespaceObject = jsep
		var external_jsep_default = __webpack_require__.n(
			external_jsep_namespaceObject,
		)
		const fycKey = key => `FYC_${key}`
		__webpack_require__.dn(fycKey)
		const indirectConfig = (key, defaultValue, toConfig, toGm) =>
			pipe({ gmKey: key, defaultValue, toGm }, ctx => ({
				...ctx,
				getValue: pipe(
					Effect_promise(() => GM.getValue(key)),
					Effect_map(x => (void 0 !== x ? toConfig(x) : defaultValue)),
				),
			}))
		__webpack_require__.dn(indirectConfig)
		const languages = ["FYC_EN", "FYC_JA", "FYC_ZH_CN"],
			simpleConfig = (key, defaultValue) => ({
				gmKey: key,
				getValue: Effect_promise(async () => GM.getValue(key, defaultValue)),
				defaultValue,
				toGm: identity,
			})
		__webpack_require__.dn(simpleConfig)
		const stringsArgs = [
				[],
				x =>
					pipe(String_split(x, /\r\n|\n/), Array_filter(not(String_isEmpty))),
				join("\n"),
			],
			sc = (k, d) => simpleConfig(fycKey(k), d),
			ic = (k, d, c, g) => indirectConfig(fycKey(k), d, c, g),
			defaultGMConfig = pipe(
				{
					lang: ic(
						"LANG",
						"FYC_EN",
						x => (languages.includes(x) ? x : "FYC_EN"),
						x => x,
					),
					font: sc("FONT", "MS PGothic"),
					chatOpacity: sc("OPACITY", 0.8),
					color: sc("COLOR", "#ffffff"),
					ownerColor: sc("COLOR_OWNER", "#ffd600"),
					moderatorColor: sc("COLOR_MODERATOR", "#c564ff"),
					memberColor: sc("COLOR_MEMBER", "#9fffff"),
					fontSize: sc("SIZE", 1),
					fontWeight: sc("WEIGHT", 730),
					shadowFontWeight: sc("WEIGHT_SHADOW", 1),
					maxChatCount: sc("LIMIT", 40),
					flowSpeed: sc("SPEED", 18),
					maxChatLength: sc("MAX", 100),
					laneCount: sc("LANE_DIV", 12),
					bannedWords: ic("NG_WORDS", ...stringsArgs),
					bannedWordRegexes: ic("NG_REG_WORDS", ...stringsArgs),
					bannedUsers: ic("NG_USERS", ...stringsArgs),
					createChats: sc("TOGGLE_CREATE_COMMENTS", !0),
					noOverlap: sc("NO_OVERLAP", !0),
					createBanButton: sc("NG_BUTTON", !0),
					simplifyChatField: sc("SIMPLE_CHAT_FIELD", !1),
					displayModName: sc("DISPLAY_MODERATOR_NAME", !0),
					displaySuperChatAuthor: sc("DISPLAY_SUPER_CHAT_AUTHOR", !0),
					textOnly: sc("TEXT_ONLY", !1),
					timingFunction: sc("TIMING_FUNCTION", "linear"),
					displayChats: sc("DISPLAY_COMMENTS", !0),
					minSpacing: sc("MIN_SPACING", 0.5),
					fieldScale: sc("FIELD_SCALE", 1),
					flowY1: sc("flowY1", 0),
					flowY2: sc("flowY2", 1),
					flowX1: sc("flowX1", 0),
					flowX2: sc("flowX2", 1),
					shadowColor: sc("shadowColor", "#000000"),
					logEvents: sc("logEvents", !0),
				},
				x => ({
					...x,
					filterExp: ic(
						"filterExp",
						external_jsep_default()(
							`\n  or([\n  A.some(\n    flip(flow([inText, A.some]))(${JSON.stringify(x.bannedWords.defaultValue)})\n  )(A.getSomes([\n    messageText,\n    paymentInfo\n  ])),\n  A.some(\n    flip(flow([matchedByText, A.some]))(${JSON.stringify(x.bannedWordRegexes.defaultValue)})\n  )(A.getSomes([\n    messageText,\n    paymentInfo\n  ])),\n  O.exists(\n    flip(flow([eqText, A.some]))(${JSON.stringify(x.bannedUsers.defaultValue)})\n  )(authorID)\n  ])\n        `,
						),
						external_jsep_default(),
						external_astring_namespaceObject.generate,
					),
				}),
			),
			src_defaultGMConfig = defaultGMConfig,
			configKeys = Object.keys(src_defaultGMConfig),
			removeOldChats = flowChats => maxChatCount =>
				pipe(
					SynchronizedRef_get(flowChats),
					Effect_map(
						sort(
							Order_mapInput(x => Either_isRight(x.animationState))(
								Boolean_Order,
							),
						),
					),
					Effect_map(x => splitAt(x, x.length - maxChatCount)),
					Effect_flatMap(([oldChats, newChats]) =>
						pipe(
							oldChats,
							Effect_forEach(x =>
								pipe(
									Effect_logDebug("RemoveChat"),
									Effect_zipRight(
										Effect_sync(() => {
											x.element.remove()
										}),
									),
								),
							),
							Effect_map(() => newChats),
						),
					),
					Effect_tap(x => Effect_logDebug(`length after clear: ${x.length}`)),
					Effect_flatMap(x => SynchronizedRef_set(flowChats, x)),
				)
		__webpack_require__.dn(removeOldChats)
		const t = globalThis,
			s = t.trustedTypes,
			e = s ? s.createPolicy("lit-html", { createHTML: t => t }) : void 0,
			o = `lit$${Math.random().toFixed(9).slice(2)}$`,
			n = "?" + o,
			r = `<${n}>`,
			l = document,
			c = () => l.createComment(""),
			a = t => null === t || ("object" != typeof t && "function" != typeof t),
			u = Array.isArray,
			f = "[ \t\n\f\r]",
			v = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,
			_ = /-->/g,
			m = />/g,
			p = RegExp(
				`>|${f}(?:([^\\s"'>=/]+)(${f}*=${f}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,
				"g",
			),
			g = /'/g,
			$ = /"/g,
			y = /^(?:script|style|textarea|title)$/i,
			x =
				t =>
				(i, ...s) => ({ _$litType$: t, strings: i, values: s }),
			b = x(1),
			lit_html_E = (x(2), x(3), Symbol.for("lit-noChange")),
			A = Symbol.for("lit-nothing"),
			C = new WeakMap(),
			P = l.createTreeWalker(l, 129)
		function V(t, i) {
			if (!u(t) || !t.hasOwnProperty("raw"))
				throw Error("invalid template strings array")
			return void 0 !== e ? e.createHTML(i) : i
		}
		const N = (t, i) => {
			const s = t.length - 1,
				e = []
			let n,
				l = 2 === i ? "<svg>" : 3 === i ? "<math>" : "",
				c = v
			for (let i = 0; i < s; i++) {
				const s = t[i]
				let a,
					u,
					d = -1,
					f = 0
				for (
					;
					f < s.length && ((c.lastIndex = f), (u = c.exec(s)), null !== u);
				)
					((f = c.lastIndex),
						c === v
							? "!--" === u[1]
								? (c = _)
								: void 0 !== u[1]
									? (c = m)
									: void 0 !== u[2]
										? (y.test(u[2]) && (n = RegExp("</" + u[2], "g")), (c = p))
										: void 0 !== u[3] && (c = p)
							: c === p
								? ">" === u[0]
									? ((c = n ?? v), (d = -1))
									: void 0 === u[1]
										? (d = -2)
										: ((d = c.lastIndex - u[2].length),
											(a = u[1]),
											(c = void 0 === u[3] ? p : '"' === u[3] ? $ : g))
								: c === $ || c === g
									? (c = p)
									: c === _ || c === m
										? (c = v)
										: ((c = p), (n = void 0)))
				const x = c === p && t[i + 1].startsWith("/>") ? " " : ""
				l +=
					c === v
						? s + r
						: d >= 0
							? (e.push(a), s.slice(0, d) + "$lit$" + s.slice(d) + o + x)
							: s + o + (-2 === d ? i : x)
			}
			return [
				V(
					t,
					l + (t[s] || "<?>") + (2 === i ? "</svg>" : 3 === i ? "</math>" : ""),
				),
				e,
			]
		}
		class S {
			constructor({ strings: t, _$litType$: i }, e) {
				let r
				this.parts = []
				let l = 0,
					a = 0
				const u = t.length - 1,
					d = this.parts,
					[f, v] = N(t, i)
				if (
					((this.el = S.createElement(f, e)),
					(P.currentNode = this.el.content),
					2 === i || 3 === i)
				) {
					const t = this.el.content.firstChild
					t.replaceWith(...t.childNodes)
				}
				for (; null !== (r = P.nextNode()) && d.length < u;) {
					if (1 === r.nodeType) {
						if (r.hasAttributes())
							for (const t of r.getAttributeNames())
								if (t.endsWith("$lit$")) {
									const i = v[a++],
										s = r.getAttribute(t).split(o),
										e = /([.?@])?(.*)/.exec(i)
									;(d.push({
										type: 1,
										index: l,
										name: e[2],
										strings: s,
										ctor:
											"." === e[1]
												? I
												: "?" === e[1]
													? L
													: "@" === e[1]
														? z
														: H,
									}),
										r.removeAttribute(t))
								} else
									t.startsWith(o) &&
										(d.push({ type: 6, index: l }), r.removeAttribute(t))
						if (y.test(r.tagName)) {
							const t = r.textContent.split(o),
								i = t.length - 1
							if (i > 0) {
								r.textContent = s ? s.emptyScript : ""
								for (let s = 0; s < i; s++)
									(r.append(t[s], c()),
										P.nextNode(),
										d.push({ type: 2, index: ++l }))
								r.append(t[i], c())
							}
						}
					} else if (8 === r.nodeType)
						if (r.data === n) d.push({ type: 2, index: l })
						else {
							let t = -1
							for (; -1 !== (t = r.data.indexOf(o, t + 1));)
								(d.push({ type: 7, index: l }), (t += o.length - 1))
						}
					l++
				}
			}
			static createElement(t, i) {
				const s = l.createElement("template")
				return ((s.innerHTML = t), s)
			}
		}
		function M(t, i, s = t, e) {
			if (i === lit_html_E) return i
			let h = void 0 !== e ? s._$Co?.[e] : s._$Cl
			const o = a(i) ? void 0 : i._$litDirective$
			return (
				h?.constructor !== o &&
					(h?._$AO?.(!1),
					void 0 === o ? (h = void 0) : ((h = new o(t)), h._$AT(t, s, e)),
					void 0 !== e ? ((s._$Co ??= [])[e] = h) : (s._$Cl = h)),
				void 0 !== h && (i = M(t, h._$AS(t, i.values), h, e)),
				i
			)
		}
		class R {
			constructor(t, i) {
				;((this._$AV = []),
					(this._$AN = void 0),
					(this._$AD = t),
					(this._$AM = i))
			}
			get parentNode() {
				return this._$AM.parentNode
			}
			get _$AU() {
				return this._$AM._$AU
			}
			u(t) {
				const {
						el: { content: i },
						parts: s,
					} = this._$AD,
					e = (t?.creationScope ?? l).importNode(i, !0)
				P.currentNode = e
				let h = P.nextNode(),
					o = 0,
					n = 0,
					r = s[0]
				for (; void 0 !== r;) {
					if (o === r.index) {
						let i
						;(2 === r.type
							? (i = new k(h, h.nextSibling, this, t))
							: 1 === r.type
								? (i = new r.ctor(h, r.name, r.strings, this, t))
								: 6 === r.type && (i = new Z(h, this, t)),
							this._$AV.push(i),
							(r = s[++n]))
					}
					o !== r?.index && ((h = P.nextNode()), o++)
				}
				return ((P.currentNode = l), e)
			}
			p(t) {
				let i = 0
				for (const s of this._$AV)
					(void 0 !== s &&
						(void 0 !== s.strings
							? (s._$AI(t, s, i), (i += s.strings.length - 2))
							: s._$AI(t[i])),
						i++)
			}
		}
		class k {
			get _$AU() {
				return this._$AM?._$AU ?? this._$Cv
			}
			constructor(t, i, s, e) {
				;((this.type = 2),
					(this._$AH = A),
					(this._$AN = void 0),
					(this._$AA = t),
					(this._$AB = i),
					(this._$AM = s),
					(this.options = e),
					(this._$Cv = e?.isConnected ?? !0))
			}
			get parentNode() {
				let t = this._$AA.parentNode
				const i = this._$AM
				return (void 0 !== i && 11 === t?.nodeType && (t = i.parentNode), t)
			}
			get startNode() {
				return this._$AA
			}
			get endNode() {
				return this._$AB
			}
			_$AI(t, i = this) {
				;((t = M(this, t, i)),
					a(t)
						? t === A || null == t || "" === t
							? (this._$AH !== A && this._$AR(), (this._$AH = A))
							: t !== this._$AH && t !== lit_html_E && this._(t)
						: void 0 !== t._$litType$
							? this.$(t)
							: void 0 !== t.nodeType
								? this.T(t)
								: (t => u(t) || "function" == typeof t?.[Symbol.iterator])(t)
									? this.k(t)
									: this._(t))
			}
			O(t) {
				return this._$AA.parentNode.insertBefore(t, this._$AB)
			}
			T(t) {
				this._$AH !== t && (this._$AR(), (this._$AH = this.O(t)))
			}
			_(t) {
				;(this._$AH !== A && a(this._$AH)
					? (this._$AA.nextSibling.data = t)
					: this.T(l.createTextNode(t)),
					(this._$AH = t))
			}
			$(t) {
				const { values: i, _$litType$: s } = t,
					e =
						"number" == typeof s
							? this._$AC(t)
							: (void 0 === s.el &&
									(s.el = S.createElement(V(s.h, s.h[0]), this.options)),
								s)
				if (this._$AH?._$AD === e) this._$AH.p(i)
				else {
					const t = new R(e, this),
						s = t.u(this.options)
					;(t.p(i), this.T(s), (this._$AH = t))
				}
			}
			_$AC(t) {
				let i = C.get(t.strings)
				return (void 0 === i && C.set(t.strings, (i = new S(t))), i)
			}
			k(t) {
				u(this._$AH) || ((this._$AH = []), this._$AR())
				const i = this._$AH
				let s,
					e = 0
				for (const h of t)
					(e === i.length
						? i.push((s = new k(this.O(c()), this.O(c()), this, this.options)))
						: (s = i[e]),
						s._$AI(h),
						e++)
				e < i.length && (this._$AR(s && s._$AB.nextSibling, e), (i.length = e))
			}
			_$AR(t = this._$AA.nextSibling, s) {
				for (this._$AP?.(!1, !0, s); t !== this._$AB;) {
					const s = t.nextSibling
					;(t.remove(), (t = s))
				}
			}
			setConnected(t) {
				void 0 === this._$AM && ((this._$Cv = t), this._$AP?.(t))
			}
		}
		class H {
			get tagName() {
				return this.element.tagName
			}
			get _$AU() {
				return this._$AM._$AU
			}
			constructor(t, i, s, e, h) {
				;((this.type = 1),
					(this._$AH = A),
					(this._$AN = void 0),
					(this.element = t),
					(this.name = i),
					(this._$AM = e),
					(this.options = h),
					s.length > 2 || "" !== s[0] || "" !== s[1]
						? ((this._$AH = Array(s.length - 1).fill(new String())),
							(this.strings = s))
						: (this._$AH = A))
			}
			_$AI(t, i = this, s, e) {
				const h = this.strings
				let o = !1
				if (void 0 === h)
					((t = M(this, t, i, 0)),
						(o = !a(t) || (t !== this._$AH && t !== lit_html_E)),
						o && (this._$AH = t))
				else {
					const e = t
					let n, r
					for (t = h[0], n = 0; n < h.length - 1; n++)
						((r = M(this, e[s + n], i, n)),
							r === lit_html_E && (r = this._$AH[n]),
							(o ||= !a(r) || r !== this._$AH[n]),
							r === A ? (t = A) : t !== A && (t += (r ?? "") + h[n + 1]),
							(this._$AH[n] = r))
				}
				o && !e && this.j(t)
			}
			j(t) {
				t === A
					? this.element.removeAttribute(this.name)
					: this.element.setAttribute(this.name, t ?? "")
			}
		}
		class I extends H {
			constructor() {
				;(super(...arguments), (this.type = 3))
			}
			j(t) {
				this.element[this.name] = t === A ? void 0 : t
			}
		}
		class L extends H {
			constructor() {
				;(super(...arguments), (this.type = 4))
			}
			j(t) {
				this.element.toggleAttribute(this.name, !!t && t !== A)
			}
		}
		class z extends H {
			constructor(t, i, s, e, h) {
				;(super(t, i, s, e, h), (this.type = 5))
			}
			_$AI(t, i = this) {
				if ((t = M(this, t, i, 0) ?? A) === lit_html_E) return
				const s = this._$AH,
					e =
						(t === A && s !== A) ||
						t.capture !== s.capture ||
						t.once !== s.once ||
						t.passive !== s.passive,
					h = t !== A && (s === A || e)
				;(e && this.element.removeEventListener(this.name, this, s),
					h && this.element.addEventListener(this.name, this, t),
					(this._$AH = t))
			}
			handleEvent(t) {
				"function" == typeof this._$AH
					? this._$AH.call(this.options?.host ?? this.element, t)
					: this._$AH.handleEvent(t)
			}
		}
		class Z {
			constructor(t, i, s) {
				;((this.element = t),
					(this.type = 6),
					(this._$AN = void 0),
					(this._$AM = i),
					(this.options = s))
			}
			get _$AU() {
				return this._$AM._$AU
			}
			_$AI(t) {
				M(this, t)
			}
		}
		const B = t.litHtmlPolyfillSupport
		;(B?.(S, k), (t.litHtmlVersions ??= []).push("3.3.3"))
		class directive_i {
			constructor(t) {}
			get _$AU() {
				return this._$AM._$AU
			}
			_$AT(t, e, i) {
				;((this._$Ct = t), (this._$AM = e), (this._$Ci = i))
			}
			_$AS(t, e) {
				return this.update(t, e)
			}
			update(t, e) {
				return this.render(...e)
			}
		}
		const style_map_o = (
				t =>
				(...e) => ({ _$litDirective$: t, values: e })
			)(
				class extends directive_i {
					constructor(t) {
						if (
							(super(t),
							1 !== t.type || "style" !== t.name || t.strings?.length > 2)
						)
							throw Error(
								"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.",
							)
					}
					render(t) {
						return Object.keys(t).reduce((e, r) => {
							const s = t[r]
							return null == s
								? e
								: e +
										`${(r = r.includes("-") ? r : r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g, "-$&").toLowerCase())}:${s};`
						}, "")
					}
					update(e, [r]) {
						const { style: s } = e.element
						if (void 0 === this.ft)
							return ((this.ft = new Set(Object.keys(r))), this.render(r))
						for (const t of this.ft)
							null == r[t] &&
								(this.ft.delete(t),
								t.includes("-") ? s.removeProperty(t) : (s[t] = null))
						for (const t in r) {
							const e = r[t]
							if (null != e) {
								this.ft.add(t)
								const r = "string" == typeof e && e.endsWith(" !important")
								t.includes("-") || r
									? s.setProperty(
											t,
											r ? e.slice(0, -11) : e,
											r ? "important" : "",
										)
									: (s[t] = e)
							}
						}
						return lit_html_E
					}
				},
			),
			getChatFontSize = ({ config: { value: config }, playerRect }) =>
				SynchronizedRef_get(playerRect).pipe(
					Effect_map(
						rect =>
							Math.round(
								((Math.max(config.fontSize - 0.2, 0.01) * rect.height) /
									config.laneCount) *
									(config.flowY2 - config.flowY1) *
									100,
							) / 100,
					),
				)
		__webpack_require__.dn(getChatFontSize)
		const textShadow = shadowColor => offset =>
			pipe(
				offset,
				x => `${x}px`,
				x => (a, b) => `${a}${x} ${b}${x} ${shadowColor}99`,
				x => join(", ")([x("-", "-"), x("", "-"), x("-", ""), x("", "")]),
			)
		__webpack_require__.dn(textShadow)
		const textStyle = { fontFamily: "inherit" },
			chatNode = (chat, mainState) =>
				pipe(
					Effect_gen(function* () {
						return {
							data: chat.data,
							config: mainState.config.value,
							fontSize: yield* getChatFontSize(mainState),
						}
					}),
					Effect_map(
						({ data, config, fontSize }) =>
							b`<span style=${style_map_o({ fontSize: `${fontSize}px`, visibility: config.displayChats ? "visible" : "hidden", color: "owner" === data.authorType ? config.ownerColor : "moderator" === data.authorType ? config.moderatorColor : "member" === data.authorType ? config.memberColor : config.color, fontWeight: config.fontWeight.toString(), fontFamily: config.font, opacity: config.chatOpacity.toString(), textShadow: textShadow(config.shadowColor)(config.shadowFontWeight) })}>${pipe(
								[
									pipe(
										data.authorName,
										filter(
											() =>
												("moderator" === data.authorType &&
													config.displayModName) ||
												(Option_isSome(data.paymentInfo) &&
													config.displaySuperChatAuthor),
										),
										Option_map(
											text =>
												b`<span style=${style_map_o({ ...Option_match(data.textColor, { onNone: () => {}, onSome: x => ({ color: x }) }), fontSize: "0.84em", ...textStyle })}>${text}: </span>`,
										),
									),
									pipe(
										data.messageElement,
										Option_map(x =>
											((message, config) => {
												const eleWin =
														message.ownerDocument.defaultView ?? window,
													{ maxChatLength } = config
												return pipe(
													Array.from(message.childNodes),
													Array_reduce(
														{ vnodes: [], length: 0 },
														({ vnodes, length }, node) => {
															return length >= maxChatLength
																? { vnodes, length }
																: !config.textOnly &&
																	  node instanceof eleWin.HTMLImageElement
																	? {
																			vnodes: [
																				...vnodes,
																				b`<img style=${style_map_o({ height: "1em", width: "1em", verticalAlign: "text-top" })} src=${node.src.replace(/=w\d+-h\d+-c-k-nd$/, "")} alt=${node.alt}>`,
																			],
																			length: length + 1,
																		}
																	: pipe(
																			node.textContent ?? "",
																			((end = maxChatLength),
																			self => self.slice(0, end)),
																			x =>
																				node instanceof eleWin.HTMLAnchorElement
																					? {
																							vnodes: [
																								...vnodes,
																								b`<span style=${style_map_o({ fontSize: "0.84em", textDecoration: "underline", ...textStyle })}>${x}</span>`,
																							],
																							length: length + x.length,
																						}
																					: {
																							vnodes: [...vnodes, b`${x}`],
																							length: length + x.length,
																						},
																		)
															var end
														},
													),
												)
											})(x, config),
										),
										Option_map(
											text =>
												b`<span style=${style_map_o({ ...Option_match(data.textColor, { onNone: () => {}, onSome: x => ({ color: x }) }), ...textStyle })}>${text.vnodes}</span>`,
										),
									),
									pipe(
										data.paymentInfo,
										Option_map(
											text =>
												b`<span style=${style_map_o({ ...Option_match(data.paidColor, { onNone: () => {}, onSome: x => ({ color: x }) }), fontSize: "0.84em", ...textStyle })}><strong style=${style_map_o(textStyle)}></strong> ${text.trim()}</span>`,
										),
									),
								],
								Array_getSomes,
							)}</span>`,
					),
				)
		__webpack_require__.dn(chatNode)
		const renderChat = chat => mainState =>
			chatNode(chat, mainState).pipe(
				Effect_flatMap(node =>
					Effect_sync(() =>
						((t, i) => {
							const e = i
							let h = e._$litPart$
							if (void 0 === h) {
								const t = null
								e._$litPart$ = h = new k(i.insertBefore(c(), t), t, void 0, {})
							}
							return (h._$AI(t), h)
						})(node, chat.element),
					),
				),
			)
		__webpack_require__.dn(renderChat)
		const scaleChatField = live => scale =>
			pipe(
				live.chatField.ele,
				Effect_flatMap(field =>
					pipe(
						[
							pipe(
								Option_fromNullable(field.parentElement),
								Option_map(x =>
									Effect_sync(() =>
										Object.assign(x.style, {
											transformOrigin:
												(scale >= 1 ? "top" : "bottom") + " left",
											transform: `scale(${scale})`,
											width: 100 / scale + "%",
											height: 100 / scale + "%",
										}),
									),
								),
							),
							pipe(
								live.chatScroller.ele,
								Option_map(scroller =>
									Effect_sync(() => {
										scroller.scrollTop = scroller.scrollHeight
									}),
								),
							),
						],
						Array_getSomes,
						Effect_all,
					),
				),
				Effect_ignore,
			)
		__webpack_require__.dn(scaleChatField)
		const external_window_hash_it_namespaceObject = window["hash-it"],
			{ getOwnPropertyNames, getOwnPropertySymbols } = Object,
			{ hasOwnProperty: es_hasOwnProperty } = Object.prototype
		function combineComparators(comparatorA, comparatorB) {
			return function (a, b, state) {
				return comparatorA(a, b, state) && comparatorB(a, b, state)
			}
		}
		function createIsCircular(areItemsEqual) {
			return function (a, b, state) {
				if (!a || !b || "object" != typeof a || "object" != typeof b)
					return areItemsEqual(a, b, state)
				const { cache } = state,
					cachedA = cache.get(a),
					cachedB = cache.get(b)
				if (cachedA && cachedB) return cachedA === b && cachedB === a
				cache.set(a, b)
				cache.set(b, a)
				const result = areItemsEqual(a, b, state)
				cache.delete(a)
				cache.delete(b)
				return result
			}
		}
		function getStrictProperties(object) {
			return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object))
		}
		const hasOwn =
			Object.hasOwn ||
			((object, property) => es_hasOwnProperty.call(object, property))
		function sameValueZeroEqual(a, b) {
			return a === b || (!a && !b && a != a && b != b)
		}
		const { getOwnPropertyDescriptor, keys: es_keys } = Object
		function areArrayBuffersEqual(a, b) {
			return (
				a.byteLength === b.byteLength &&
				areTypedArraysEqual(new Uint8Array(a), new Uint8Array(b))
			)
		}
		function areArraysEqual(a, b, state) {
			let index = a.length
			if (b.length !== index) return !1
			for (; index-- > 0;)
				if (!state.equals(a[index], b[index], index, index, a, b, state))
					return !1
			return !0
		}
		function areDataViewsEqual(a, b) {
			return (
				a.byteLength === b.byteLength &&
				areTypedArraysEqual(
					new Uint8Array(a.buffer, a.byteOffset, a.byteLength),
					new Uint8Array(b.buffer, b.byteOffset, b.byteLength),
				)
			)
		}
		function areDatesEqual(a, b) {
			return sameValueZeroEqual(a.getTime(), b.getTime())
		}
		function areErrorsEqual(a, b) {
			return (
				a.name === b.name &&
				a.message === b.message &&
				a.cause === b.cause &&
				a.stack === b.stack
			)
		}
		function areFunctionsEqual(a, b) {
			return a === b
		}
		function areMapsEqual(a, b, state) {
			const size = a.size
			if (size !== b.size) return !1
			if (!size) return !0
			const matchedIndices = new Array(size),
				aIterable = a.entries()
			let aResult,
				bResult,
				index = 0
			for (; (aResult = aIterable.next()) && !aResult.done;) {
				const bIterable = b.entries()
				let hasMatch = !1,
					matchIndex = 0
				for (; (bResult = bIterable.next()) && !bResult.done;) {
					if (matchedIndices[matchIndex]) {
						matchIndex++
						continue
					}
					const aEntry = aResult.value,
						bEntry = bResult.value
					if (
						state.equals(
							aEntry[0],
							bEntry[0],
							index,
							matchIndex,
							a,
							b,
							state,
						) &&
						state.equals(
							aEntry[1],
							bEntry[1],
							aEntry[0],
							bEntry[0],
							a,
							b,
							state,
						)
					) {
						hasMatch = matchedIndices[matchIndex] = !0
						break
					}
					matchIndex++
				}
				if (!hasMatch) return !1
				index++
			}
			return !0
		}
		const areNumbersEqual = sameValueZeroEqual
		function areObjectsEqual(a, b, state) {
			const properties = es_keys(a)
			let index = properties.length
			if (es_keys(b).length !== index) return !1
			for (; index-- > 0;)
				if (!isPropertyEqual(a, b, state, properties[index])) return !1
			return !0
		}
		function areObjectsEqualStrict(a, b, state) {
			const properties = getStrictProperties(a)
			let property,
				descriptorA,
				descriptorB,
				index = properties.length
			if (getStrictProperties(b).length !== index) return !1
			for (; index-- > 0;) {
				property = properties[index]
				if (!isPropertyEqual(a, b, state, property)) return !1
				descriptorA = getOwnPropertyDescriptor(a, property)
				descriptorB = getOwnPropertyDescriptor(b, property)
				if (
					(descriptorA || descriptorB) &&
					(!descriptorA ||
						!descriptorB ||
						descriptorA.configurable !== descriptorB.configurable ||
						descriptorA.enumerable !== descriptorB.enumerable ||
						descriptorA.writable !== descriptorB.writable)
				)
					return !1
			}
			return !0
		}
		function arePrimitiveWrappersEqual(a, b) {
			return sameValueZeroEqual(a.valueOf(), b.valueOf())
		}
		function areRegExpsEqual(a, b) {
			return a.source === b.source && a.flags === b.flags
		}
		function areSetsEqual(a, b, state) {
			const size = a.size
			if (size !== b.size) return !1
			if (!size) return !0
			const matchedIndices = new Array(size),
				aIterable = a.values()
			let aResult, bResult
			for (; (aResult = aIterable.next()) && !aResult.done;) {
				const bIterable = b.values()
				let hasMatch = !1,
					matchIndex = 0
				for (; (bResult = bIterable.next()) && !bResult.done;) {
					if (
						!matchedIndices[matchIndex] &&
						state.equals(
							aResult.value,
							bResult.value,
							aResult.value,
							bResult.value,
							a,
							b,
							state,
						)
					) {
						hasMatch = matchedIndices[matchIndex] = !0
						break
					}
					matchIndex++
				}
				if (!hasMatch) return !1
			}
			return !0
		}
		function areTypedArraysEqual(a, b) {
			let index = a.byteLength
			if (b.byteLength !== index || a.byteOffset !== b.byteOffset) return !1
			for (; index-- > 0;) if (a[index] !== b[index]) return !1
			return !0
		}
		function areUrlsEqual(a, b) {
			return (
				a.hostname === b.hostname &&
				a.pathname === b.pathname &&
				a.protocol === b.protocol &&
				a.port === b.port &&
				a.hash === b.hash &&
				a.username === b.username &&
				a.password === b.password
			)
		}
		function isPropertyEqual(a, b, state, property) {
			return (
				!(
					("_owner" !== property && "__o" !== property && "__v" !== property) ||
					(!a.$$typeof && !b.$$typeof)
				) ||
				(hasOwn(b, property) &&
					state.equals(
						a[property],
						b[property],
						property,
						property,
						a,
						b,
						state,
					))
			)
		}
		const TYPED_ARRAY_TAGS = {
				"[object Int8Array]": !0,
				"[object Uint8Array]": !0,
				"[object Uint8ClampedArray]": !0,
				"[object Int16Array]": !0,
				"[object Uint16Array]": !0,
				"[object Int32Array]": !0,
				"[object Uint32Array]": !0,
				"[object Float16Array]": !0,
				"[object Float32Array]": !0,
				"[object Float64Array]": !0,
				"[object BigInt64Array]": !0,
				"[object BigUint64Array]": !0,
			},
			es_toString = Object.prototype.toString,
			deepEqual = createCustomEqual(),
			shallowEqual =
				(createCustomEqual({ strict: !0 }),
				createCustomEqual({ circular: !0 }),
				createCustomEqual({ circular: !0, strict: !0 }),
				createCustomEqual({
					createInternalComparator: () => sameValueZeroEqual,
				}))
		;(createCustomEqual({
			strict: !0,
			createInternalComparator: () => sameValueZeroEqual,
		}),
			createCustomEqual({
				circular: !0,
				createInternalComparator: () => sameValueZeroEqual,
			}),
			createCustomEqual({
				circular: !0,
				createInternalComparator: () => sameValueZeroEqual,
				strict: !0,
			}))
		function createCustomEqual(options = {}) {
			const {
					circular = !1,
					createInternalComparator: createCustomInternalComparator,
					createState,
					strict = !1,
				} = options,
				config = (function ({ circular, createCustomConfig, strict }) {
					let config = {
						areArrayBuffersEqual,
						areArraysEqual: strict ? areObjectsEqualStrict : areArraysEqual,
						areDataViewsEqual,
						areDatesEqual,
						areErrorsEqual,
						areFunctionsEqual,
						areMapsEqual: strict
							? combineComparators(areMapsEqual, areObjectsEqualStrict)
							: areMapsEqual,
						areNumbersEqual,
						areObjectsEqual: strict ? areObjectsEqualStrict : areObjectsEqual,
						arePrimitiveWrappersEqual,
						areRegExpsEqual,
						areSetsEqual: strict
							? combineComparators(areSetsEqual, areObjectsEqualStrict)
							: areSetsEqual,
						areTypedArraysEqual: strict
							? combineComparators(areTypedArraysEqual, areObjectsEqualStrict)
							: areTypedArraysEqual,
						areUrlsEqual,
						unknownTagComparators: void 0,
					}
					createCustomConfig &&
						(config = Object.assign({}, config, createCustomConfig(config)))
					if (circular) {
						const areArraysEqual = createIsCircular(config.areArraysEqual),
							areMapsEqual = createIsCircular(config.areMapsEqual),
							areObjectsEqual = createIsCircular(config.areObjectsEqual),
							areSetsEqual = createIsCircular(config.areSetsEqual)
						config = Object.assign({}, config, {
							areArraysEqual,
							areMapsEqual,
							areObjectsEqual,
							areSetsEqual,
						})
					}
					return config
				})(options),
				comparator = (function ({
					areArrayBuffersEqual,
					areArraysEqual,
					areDataViewsEqual,
					areDatesEqual,
					areErrorsEqual,
					areFunctionsEqual,
					areMapsEqual,
					areNumbersEqual,
					areObjectsEqual,
					arePrimitiveWrappersEqual,
					areRegExpsEqual,
					areSetsEqual,
					areTypedArraysEqual,
					areUrlsEqual,
					unknownTagComparators,
				}) {
					return function (a, b, state) {
						if (a === b) return !0
						if (null == a || null == b) return !1
						const type = typeof a
						if (type !== typeof b) return !1
						if ("object" !== type)
							return "number" === type
								? areNumbersEqual(a, b, state)
								: "function" === type && areFunctionsEqual(a, b, state)
						const constructor = a.constructor
						if (constructor !== b.constructor) return !1
						if (constructor === Object) return areObjectsEqual(a, b, state)
						if (Array.isArray(a)) return areArraysEqual(a, b, state)
						if (constructor === Date) return areDatesEqual(a, b, state)
						if (constructor === RegExp) return areRegExpsEqual(a, b, state)
						if (constructor === Map) return areMapsEqual(a, b, state)
						if (constructor === Set) return areSetsEqual(a, b, state)
						const tag = es_toString.call(a)
						if ("[object Date]" === tag) return areDatesEqual(a, b, state)
						if ("[object RegExp]" === tag) return areRegExpsEqual(a, b, state)
						if ("[object Map]" === tag) return areMapsEqual(a, b, state)
						if ("[object Set]" === tag) return areSetsEqual(a, b, state)
						if ("[object Object]" === tag)
							return (
								"function" != typeof a.then &&
								"function" != typeof b.then &&
								areObjectsEqual(a, b, state)
							)
						if ("[object URL]" === tag) return areUrlsEqual(a, b, state)
						if ("[object Error]" === tag) return areErrorsEqual(a, b, state)
						if ("[object Arguments]" === tag)
							return areObjectsEqual(a, b, state)
						if (TYPED_ARRAY_TAGS[tag]) return areTypedArraysEqual(a, b, state)
						if ("[object ArrayBuffer]" === tag)
							return areArrayBuffersEqual(a, b, state)
						if ("[object DataView]" === tag)
							return areDataViewsEqual(a, b, state)
						if (
							"[object Boolean]" === tag ||
							"[object Number]" === tag ||
							"[object String]" === tag
						)
							return arePrimitiveWrappersEqual(a, b, state)
						if (unknownTagComparators) {
							let unknownTagComparator = unknownTagComparators[tag]
							if (!unknownTagComparator) {
								const shortTag =
									null != (value = a) ? value[Symbol.toStringTag] : void 0
								shortTag &&
									(unknownTagComparator = unknownTagComparators[shortTag])
							}
							if (unknownTagComparator) return unknownTagComparator(a, b, state)
						}
						var value
						return !1
					}
				})(config),
				equals = createCustomInternalComparator
					? createCustomInternalComparator(comparator)
					: (function (compare) {
							return function (
								a,
								b,
								_indexOrKeyA,
								_indexOrKeyB,
								_parentA,
								_parentB,
								state,
							) {
								return compare(a, b, state)
							}
						})(comparator)
			return (function ({ circular, comparator, createState, equals, strict }) {
				if (createState)
					return function (a, b) {
						const { cache = circular ? new WeakMap() : void 0, meta } =
							createState()
						return comparator(a, b, { cache, equals, meta, strict })
					}
				if (circular)
					return function (a, b) {
						return comparator(a, b, {
							cache: new WeakMap(),
							equals,
							meta: void 0,
							strict,
						})
					}
				const state = { cache: void 0, equals, meta: void 0, strict }
				return function (a, b) {
					return comparator(a, b, state)
				}
			})({ circular, comparator, createState, equals, strict })
		}
		var DEFAULT_OPTIONS = {}
		function stringify(value, _a) {
			var _b = void 0 === _a ? DEFAULT_OPTIONS : _a,
				indent = _b.indent,
				replacer = _b.replacer,
				circularReplacer = _b.circularReplacer,
				stable = _b.stable,
				stabilizer = _b.stabilizer,
				cache = [],
				keys = [],
				getStableSorter =
					stable && stabilizer
						? function (object) {
								var options = {
									get: function (key) {
										return object[key]
									},
								}
								return function (a, b) {
									return stabilizer(
										{ key: a, value: object[a] },
										{ key: b, value: object[b] },
										options,
									)
								}
							}
						: void 0
			return JSON.stringify(
				value,
				function (key, rawValue) {
					var value = rawValue
					if ("object" == typeof value && null !== value) {
						if (cache.length) {
							var thisCutoff = cache.indexOf(this) + 1
							if (0 === thisCutoff) cache[cache.length] = this
							else {
								cache.splice(thisCutoff)
								keys.splice(thisCutoff)
							}
							keys[keys.length] = key
							var valueCutoff = cache.indexOf(value) + 1
							if (valueCutoff > 0) {
								var referenceKey = keys.slice(0, valueCutoff).join(".") || "."
								return circularReplacer
									? circularReplacer.call(this, key, value, referenceKey)
									: "[ref=" + referenceKey + "]"
							}
						} else {
							cache[0] = value
							keys[0] = key
						}
						stable &&
							!Array.isArray(value) &&
							(value = Object.keys(value)
								.sort(null == getStableSorter ? void 0 : getStableSorter(value))
								.reduce(function (sorted, key) {
									sorted[key] = value[key]
									return sorted
								}, {}))
					}
					return replacer ? replacer.call(this, key, value) : value
				},
				indent,
			)
		}
		class CacheEventEmitter {
			constructor(cache) {
				this.l = {}
				this.c = cache
			}
			a(type, listener) {
				const listeners = this.l[type]
				listeners
					? listeners.has(listener) || listeners.add(listener)
					: (this.l[type] = new Set([listener]))
			}
			n(type, node, reason) {
				const listeners = this.l[type]
				listeners &&
					listeners.forEach(listener => {
						listener({
							cache: this.c,
							key: node.k,
							reason,
							value: node.v,
							type,
						})
					})
			}
			r(type, listener) {
				const listeners = this.l[type]
				if (listeners) {
					listeners.delete(listener)
					listeners.size || (this.l[type] = void 0)
				}
			}
		}
		function getMaxArgsTransformKey(maxArgs) {
			return 1 === maxArgs
				? args => (maxArgs >= args.length ? args : [args[0]])
				: 2 === maxArgs
					? args => (maxArgs >= args.length ? args : [args[0], args[1]])
					: args => {
							if (maxArgs >= args.length) return args
							const clone = new Array(maxArgs)
							for (let index = 0; index < maxArgs; ++index)
								clone[index] = args[index]
							return clone
						}
		}
		function replacer(_key, value) {
			const type = typeof value
			return "function" === type || "symbol" === type ? value.toString() : value
		}
		function transformKeySerialized(args) {
			return [stringify(args, { replacer })]
		}
		function isSerializedKeyEqual(prevKey, nextKey) {
			return prevKey[0] === nextKey[0]
		}
		function isNumericValueValid(value) {
			return "number" == typeof value && value >= 0 && Number.isFinite(value)
		}
		class Cache {
			constructor(options) {
				this.c = 0
				const { async, maxSize } = options
				this.e = (function ({ isKeyEqual, isKeyItemEqual, serialize }) {
					if ("function" == typeof isKeyEqual) return isKeyEqual
					if (serialize) return isSerializedKeyEqual
					const isItemEqual =
						"function" == typeof isKeyItemEqual
							? isKeyItemEqual
							: "deep" === isKeyItemEqual
								? deepEqual
								: "shallow" === isKeyItemEqual
									? shallowEqual
									: Object.is
					return function (prevKey, nextKey) {
						const length = nextKey.length
						if (prevKey.length !== length) return !1
						if (1 === length) return isItemEqual(prevKey[0], nextKey[0], 0)
						for (let index = 0; index < length; ++index)
							if (!isItemEqual(prevKey[index], nextKey[index], index)) return !1
						return !0
					}
				})(options)
				this.k = (function (options) {
					const { maxArgs, serialize, transformKey } = options,
						transformers = [
							serialize
								? "function" == typeof serialize
									? serialize
									: transformKeySerialized
								: void 0,
							isNumericValueValid(maxArgs)
								? getMaxArgsTransformKey(maxArgs)
								: void 0,
							"function" == typeof transformKey ? transformKey : void 0,
						].filter(Boolean)
					return transformers.length
						? transformers.reduce(
								(f, g) =>
									(...args) =>
										f(g(...args)),
							)
						: void 0
				})(options)
				this.p = "boolean" == typeof async && async
				this.s = isNumericValueValid(maxSize) ? maxSize : 1
			}
			get size() {
				return this.c
			}
			get snapshot() {
				const entries = [],
					keys = [],
					values = []
				let node = this.h,
					size = 0
				for (; null != node;) {
					keys.push(node.k)
					values.push(node.v)
					entries.push([node.k, node.v])
					++size
					node = node.n
				}
				return { entries, keys, size, values }
			}
			clear(reason = "explicit clear") {
				if (!this.h) return
				const emitter = this.o
				let nodes
				if (emitter) {
					nodes = []
					let node = this.h
					for (; null != node;) {
						nodes.push(node)
						node = node.n
					}
				}
				this.h = this.t = void 0
				this.c = 0
				if (emitter && nodes)
					for (let index = 0; index < nodes.length; ++index)
						emitter.n("delete", nodes[index], reason)
			}
			delete(args, reason = "explicit delete") {
				const node = this.g(this.k ? this.k(args) : args)
				if (node) {
					this.d(node, reason)
					return !0
				}
				return !1
			}
			get(args, reason = "explicit get") {
				const node = this.g(this.k ? this.k(args) : args)
				if (node) {
					node !== this.h
						? this.u(node, reason, !0)
						: this.o && this.o.n("hit", node, reason)
					return node.v
				}
			}
			has(args) {
				return !!this.g(this.k ? this.k(args) : args)
			}
			off(type, listener) {
				this.o && this.o.r(type, listener)
			}
			on(type, listener) {
				this.o || (this.o = new CacheEventEmitter(this))
				this.o.a(type, listener)
			}
			set(key, value, reason = "explicit set") {
				const normalizedKey = this.k ? this.k(key) : key
				let node = this.g(normalizedKey)
				if (node) {
					const prevValue = node.v
					node.v = value
					this.p && value !== prevValue && (node.v = this.w(node))
					node !== this.h && this.u(node, reason, !1)
				} else node = this.n(normalizedKey, value)
			}
			d(node, reason) {
				const next = node.n,
					prev = node.p
				next ? (next.p = prev) : (this.t = prev)
				prev ? (prev.n = next) : (this.h = next)
				--this.c
				node.r = !0
				this.o && this.o.n("delete", node, reason)
			}
			g(key) {
				let node = this.h
				if (node && !node.r) {
					if (this.e(node.k, key)) return node
					if (this.h !== this.t) {
						node = node.n
						for (; node;) {
							if (node.r) return
							if (this.e(node.k, key)) return node
							node = node.n
						}
					}
				}
			}
			n(key, value, reason) {
				const prevHead = this.h,
					prevTail = this.t,
					node = { k: key, n: prevHead, p: void 0, v: value }
				this.p && (node.v = this.w(node))
				this.h = node
				prevHead ? (prevHead.p = node) : (this.t = node)
				++this.c > this.s && prevTail && this.d(prevTail, "evicted")
				this.o && this.o.n("add", node, reason)
				return node
			}
			u(node, reason, hit) {
				const next = node.n,
					prev = node.p
				next && (next.p = prev)
				prev && (prev.n = next)
				this.h && (this.h.p = node)
				node.n = this.h
				node.p = void 0
				this.h = node
				node === this.t && (this.t = prev)
				if (this.o) {
					hit && this.o.n("hit", node, reason)
					this.o.n("update", node, reason)
				}
			}
			w(node) {
				const { v: value } = node
				return null == value || "function" != typeof value.then
					? value
					: value.then(
							value => {
								!node.r && this.o && this.o.n("update", node, "resolved")
								return value
							},
							error => {
								!node.r && this.d(node, "rejected")
								throw error
							},
						)
			}
		}
		class ExpirationManager {
			constructor(cache, expires) {
				this.e = new Map()
				this.c = cache
				if ("object" == typeof expires) {
					this.t = expires.after
					this.p = expires.shouldPersist
					this.r = expires.shouldRemove
					this.u = !!expires.update
				} else {
					this.t = expires
					this.u = !1
				}
				this.c.on("add", ({ key, value }) => {
					this.a(key, value) && this.s(key, value)
				})
				if (this.u) {
					this.c.on("hit", ({ key, value }) => {
						this.a(key, value) && this.s(key, value)
					})
					if (this.c.p) {
						const onResolved = ({ key, reason, value }) => {
							if ("resolved" === reason && this.a(key, value)) {
								this.s(key, value)
								this.c.off("update", onResolved)
							}
						}
						this.c.on("update", onResolved)
					}
				}
				this.c.on("delete", ({ key }) => {
					this.e.has(key) && this.d(key)
				})
			}
			get size() {
				return this.e.size
			}
			a(key, value) {
				var _a
				return !(
					!this.c.g(key) ||
					(null === (_a = this.p) || void 0 === _a
						? void 0
						: _a.call(this, key, value, this.c))
				)
			}
			d(key) {
				const expiration = this.e.get(key)
				if (expiration) {
					clearTimeout(expiration)
					this.e.delete(key)
				}
			}
			s(key, value) {
				this.e.has(key) && this.d(key)
				const cache = this.c,
					time =
						"function" == typeof this.t ? this.t(key, value, cache) : this.t
				if (!isNumericValueValid(time))
					throw new TypeError(
						`The expiration time must be a finite, non-negative number; received ${time}`,
					)
				const timeout = setTimeout(() => {
					this.d(key)
					const node = cache.g(key)
					if (node)
						if ("function" != typeof this.r || this.r(key, node.v, time, cache))
							cache.d(node, "expired")
						else {
							node !== cache.h
								? cache.u(node, "expiration reset", !1)
								: cache.o && cache.o.n("update", node, "expiration reset")
							this.s(key, node.v)
						}
				}, time)
				"function" == typeof timeout.unref && timeout.unref()
				this.e.set(key, timeout)
			}
		}
		const nameToProfile = new Map()
		class StatsManager {
			constructor(cache, statsName) {
				this.p = { c: 0, h: 0 }
				this.c = cache
				this.n = statsName
				nameToProfile.set(statsName, this)
			}
			m() {
				const { c: calls, h: hits } = this.p,
					usage = calls ? `${((hits / calls) * 100).toFixed(4)}%` : "0.0000%"
				return { calls, hits, name: this.n, usage }
			}
			r() {
				this.p = { c: 0, h: 0 }
			}
			s() {
				const onAdd = () => {
						++this.p.c
					},
					onHit = () => {
						++this.p.c
						++this.p.h
					}
				this.d = () => {
					this.c.off("add", onAdd)
					this.c.off("hit", onHit)
					this.d = void 0
					this.p.c = this.p.h = 0
				}
				this.c.on("add", onAdd)
				this.c.on("hit", onHit)
			}
		}
		const es_memoize = function memoize(fn, options = {}) {
				if (
					(function (fn) {
						return "function" == typeof fn && fn.isMemoized
					})(fn)
				)
					return memoize(fn.fn, Object.assign({}, fn.options, options))
				if ("function" != typeof fn)
					throw new TypeError(
						"Expected first parameter to be function; received " + typeof fn,
					)
				const cache = new Cache(options),
					memoized = (function (fn, cache, forceUpdate) {
						const memoized = function (...args) {
							const key = cache.k ? cache.k(args) : args
							let node = cache.g(key)
							node
								? node !== cache.h
									? cache.u(node, void 0, !0)
									: cache.o && cache.o.n("hit", node)
								: (node = cache.n(key, fn.apply(this, args)))
							return node.v
						}
						return forceUpdate
							? function (...args) {
									if (!forceUpdate(args) || !cache.has(args))
										return memoized.apply(this, args)
									const value = fn.apply(this, args)
									cache.set(args, value, "forced")
									return value
								}
							: memoized
					})(fn, cache, options.forceUpdate),
					{ expires, statsName } = options
				memoized.cache = cache
				memoized.expirationManager =
					null != expires ? new ExpirationManager(cache, expires) : null
				memoized.fn = fn
				memoized.isMemoized = !0
				memoized.options = options
				memoized.statsManager =
					null != statsName ? new StatsManager(cache, statsName) : null
				return memoized
			},
			getFlowChatProgress = animationState =>
				animationState.pipe(
					match({ onLeft: Option_none, onRight: Option_some }),
					flatMapNullable(x => x.currentTime),
					Option_map(x => ("number" == typeof x ? x : x.to("ms").value)),
					Option_map(x => x / 6400),
					Option_getOrElse(() => 0),
				)
		__webpack_require__.dn(getFlowChatProgress)
		const getFlowChatRect = (chat, config, playerRect) =>
			pipe(
				config,
				x =>
					playerRect.width * x.flowX2 -
					(chat.width + playerRect.width * (x.flowX2 - x.flowX1)) *
						getFlowChatProgress(chat.animationState),
				x => new DOMRectReadOnly(x, chat.y, chat.width, chat.height),
			)
		__webpack_require__.dn(getFlowChatRect)
		const getChatLane =
			(flowChat, chatIndex, progress) =>
			({ config: { value: config }, flowChats, playerRect }) =>
				Effect_gen(function* () {
					const rect = yield* SynchronizedRef_get(playerRect),
						flowWidth = rect.width * (config.flowX2 - config.flowX1),
						{
							width: chatWidth,
							height: chatHeight,
							x: chatX,
						} = getFlowChatRect(flowChat, config, rect),
						movingChats = pipe(
							yield* SynchronizedRef_get(flowChats),
							chats =>
								Array_take(
									chats,
									Option_getOrElse(chatIndex, () => chats.length),
								),
							Array_filter(
								chat => Either_isRight(chat.animationState) && chat.width > 0,
							),
							sort(Order_mapInput(x => x.lane)(Number_Order)),
						),
						tooCloseTo = es_memoize(
							x => {
								const { width: otherWidth, x: otherX } = getFlowChatRect(
										x,
										config,
										rect,
									),
									gap =
										(chatHeight * otherWidth * chatWidth) ** 0.333 *
										config.minSpacing
								return (
									(flowWidth - otherX) / (flowWidth + otherWidth) - progress <
										(chatWidth + gap) / (flowWidth + chatWidth) ||
									otherX + otherWidth + gap > chatX
								)
							},
							{ maxSize: 1e3 },
						),
						occupyInfo = pipe(
							movingChats,
							Array_map(x => ({ tooClose: () => tooCloseTo(x), lane: x.lane })),
							Array_append({ tooClose: () => !0, lane: config.laneCount }),
						),
						index = pipe(
							occupyInfo,
							findFirstIndex(x => x.lane >= flowChat.lane),
							Option_getOrElse(() => -1),
						),
						nextOccupiedLaneAbove = pipe(
							occupyInfo,
							Array_take(index),
							Array_findLast(x => x.tooClose()),
							Option_map(x => x.lane),
							Option_getOrElse(() => -1),
						),
						nextOccupiedLaneBelow = pipe(
							occupyInfo,
							Array_drop(index),
							Array_findFirst(x => x.tooClose()),
							Option_map(x => x.lane),
							Option_getOrElse(() => config.laneCount),
						),
						formerLaneInterval = Math.min(
							flowChat.lane - nextOccupiedLaneAbove,
							nextOccupiedLaneBelow - flowChat.lane,
							1,
						)
					return pipe(
						occupyInfo,
						Array_reduce(
							{ maxInterval: 0, maxIntervalLane: 0, lastLane: -1 },
							({ maxInterval, maxIntervalLane, lastLane }, info) =>
								maxInterval > 0.999 || !info.tooClose()
									? { maxInterval, maxIntervalLane, lastLane }
									: (() => {
											const nextLane = info.lane,
												interLane = Number_clamp({
													minimum: 0,
													maximum: config.laneCount - 1,
												})((lastLane + nextLane) / 2),
												newInterval = Math.min(
													interLane - lastLane,
													nextLane - interLane,
													1,
												)
											return {
												lastLane: nextLane,
												...(newInterval - maxInterval > 0.001
													? {
															maxInterval: newInterval,
															maxIntervalLane: Math.max(
																lastLane + newInterval,
																0,
															),
														}
													: { maxInterval, maxIntervalLane }),
											}
										})(),
						),
						x => ({
							lane:
								Math.abs(formerLaneInterval - x.maxInterval) < 0.001
									? flowChat.lane
									: x.maxIntervalLane,
							interval: x.maxInterval,
						}),
					)
				})
		__webpack_require__.dn(getChatLane)
		const intervalTooSmall = interval => config =>
			config.noOverlap && interval < 0.999
		__webpack_require__.dn(intervalTooSmall)
		const setChatPlayState = chat => mainState =>
			pipe(
				chat.animationState,
				Effect_tap(x =>
					SynchronizedRef_get(mainState.chatPlaying).pipe(
						Effect_flatMap(playing =>
							Effect_sync(playing ? () => x.play() : () => x.pause()),
						),
					),
				),
				Effect_flatMap(x =>
					Effect_sync(() => {
						x.playbackRate = mainState.config.value.flowSpeed / 15
					}),
				),
				Effect_ignore,
			)
		__webpack_require__.dn(setChatPlayState)
		const getLaneY = (lane, { config: { value: config }, playerRect }) =>
			SynchronizedRef_get(playerRect).pipe(
				Effect_map(
					rect =>
						rect.height *
						((lane / config.laneCount + 0.005) *
							(config.flowY2 - config.flowY1) +
							config.flowY1),
				),
			)
		__webpack_require__.dn(getLaneY)
		const setNewChatAnimation = chat => lane => progress => mainState =>
			pipe(
				getLaneY(lane, mainState),
				Effect_map(y => ({ ...chat, lane, y })),
				Effect_tap(newChat =>
					pipe(
						newChat.animationState,
						match({
							onLeft: () => _void,
							onRight: x => Effect_sync(() => x.cancel()),
						}),
					),
				),
				Effect_flatMap(newChat =>
					SynchronizedRef_get(mainState.playerRect).pipe(
						Effect_map(rect => [
							[
								rect.width *
									(mainState.config.value.flowX2 -
										mainState.config.value.flowX1),
								newChat.y,
							],
							[-newChat.width, newChat.y],
						]),
						Effect_map(
							pipe(
								x => `${x}px`,
								x => Array_map(Tuple_mapBoth({ onFirst: x, onSecond: x })),
							),
						),
						Effect_map(
							Array_map(([x, y]) => ({ transform: `translate(${x}, ${y})` })),
						),
						Effect_flatMap(x =>
							Effect_sync(() =>
								newChat.element.animate(x, {
									duration: 6400,
									easing: mainState.config.value.timingFunction,
								}),
							),
						),
						Effect_flatMap(animation =>
							Effect_sync(() => {
								const newNewChat = {
									...newChat,
									animationState: Either_right(animation),
								}
								Object.assign(animation, {
									onfinish: () =>
										Object.assign(newNewChat, {
											animationState: Either_left("Ended"),
										}),
									currentTime: 6400 * progress,
								})
								return newNewChat
							}),
						),
					),
				),
			)
		__webpack_require__.dn(setNewChatAnimation)
		const getWidth = es_memoize(
				ele => ele?.getBoundingClientRect().width ?? 0,
				{
					maxSize: 2e3,
					transformKey: Array_map(external_window_hash_it_namespaceObject.hash),
				},
			),
			setChatAnimation = chat => mainState =>
				pipe(
					getChatFontSize(mainState),
					Effect_tap(height =>
						Effect_gen(function* () {
							chat.element.style.transform = `translate(${(yield* SynchronizedRef_get(mainState.playerRect)).width * (mainState.config.value.flowX2 - mainState.config.value.flowX1)}px, -${2 * height}px)`
						}),
					),
					Effect_filterOrFail(() =>
						match(chat.animationState, {
							onLeft: x => "NotStarted" === x,
							onRight: () => !0,
						}),
					),
					Effect_flatMap(height =>
						Effect_gen(function* () {
							return {
								newChat: {
									...chat,
									width: getWidth(chat.element.firstElementChild),
									height,
								},
								oldChatIndex: pipe(
									yield* SynchronizedRef_get(mainState.flowChats),
									findFirstIndex(x => x === chat),
								),
								progress: getFlowChatProgress(chat.animationState),
							}
						}),
					),
					Effect_flatMap(ctx =>
						getChatLane(
							ctx.newChat,
							ctx.oldChatIndex,
							ctx.progress,
						)(mainState).pipe(
							Effect_flatMap(({ lane, interval }) =>
								intervalTooSmall(interval)(mainState.config.value)
									? ctx.newChat.animationState.pipe(
											Effect_tap(x => Effect_sync(() => x.finish())),
											Effect_map(() => ({
												...ctx.newChat,
												animationState: Either_left("Ended"),
											})),
											Effect_orElse(() => Effect_succeed(ctx.newChat)),
										)
									: setNewChatAnimation(ctx.newChat)(lane)(ctx.progress)(
											mainState,
										),
							),
							Effect_map(x => ({ oldChatIndex: ctx.oldChatIndex, newChat: x })),
						),
					),
					Effect_tap(x => setChatPlayState(x.newChat)(mainState)),
					Effect_flatMap(x =>
						Option_match(x.oldChatIndex, {
							onNone: () => Effect_succeed({ newChat: x.newChat }),
							onSome: index =>
								pipe(
									SynchronizedRef_update(
										mainState.flowChats,
										Array_replace(index, x.newChat),
									),
									Effect_zipRight(
										Effect_fail(new Cause_NoSuchElementException()),
									),
								),
						}),
					),
				)
		__webpack_require__.dn(setChatAnimation)
		const Take_end = take_end,
			Take_failCause = take_failCause,
			Take_of = take_of,
			throttleLatest = durationInput => self => {
				const duration = decode(durationInput)
				return Stream_unwrapScoped(
					Effect_gen(function* () {
						const output = yield* Queue_unbounded(),
							gate = yield* Effect_makeSemaphore(1),
							window = yield* Ref_make({ open: !1 }),
							windowTrain = Effect_gen(function* () {
								for (;;) {
									yield* Effect_sleep(duration)
									if (
										!(yield* gate.withPermits(1)(
											Effect_gen(function* () {
												const state = yield* Ref_get(window)
												if (!state.open || Option_isNone(state.pending)) {
													yield* Ref_set(window, { open: !1 })
													return !1
												}
												yield* Queue_offer(output, Take_of(state.pending.value))
												yield* Ref_set(window, {
													open: !0,
													pending: Option_none(),
												})
												return !0
											}),
										))
									)
										return
								}
							}),
							consume = pipe(
								self,
								Stream_runForEach(element =>
									pipe(
										(element =>
											gate.withPermits(1)(
												Effect_gen(function* () {
													if ((yield* Ref_get(window)).open) {
														yield* Ref_set(window, {
															open: !0,
															pending: Option_some(element),
														})
														return !1
													}
													yield* Queue_offer(output, Take_of(element))
													yield* Ref_set(window, {
														open: !0,
														pending: Option_none(),
													})
													return !0
												}),
											))(element),
										Effect_flatMap(opened =>
											opened
												? (self =>
														withFiberRuntime((state, status) =>
															succeed(
																fiberRuntime_unsafeFork(
																	self,
																	state,
																	status.runtimeFlags,
																),
															),
														))(windowTrain)
												: _void,
										),
										Effect_asVoid,
									),
								),
								Effect_matchCauseEffect({
									onFailure: cause =>
										Queue_offer(output, Take_failCause(cause)),
									onSuccess: () =>
										Effect_gen(function* () {
											const state = yield* gate.withPermits(1)(Ref_get(window))
											state.open &&
												Option_isSome(state.pending) &&
												(yield* Queue_offer(
													output,
													Take_of(state.pending.value),
												))
											yield* Queue_offer(output, Take_end)
										}),
								}),
							)
						yield* (self => scopeWith(scope => circular_forkIn(self, scope)))(
							consume,
						)
						return Stream_flattenTake(Stream_fromQueue(output))
					}),
				)
			}
		__webpack_require__.dn(throttleLatest)
		const configStream = (provideLog, mainState, refs, chatScreen, live) => {
			const changed = key => Stream_drop(refs[key].changes, 1)
			return Stream_merge(
				pipe(
					refs.fieldScale.changes,
					Stream_mapEffect(x => provideLog(scaleChatField(live)(x))),
				),
				pipe(
					Stream_mergeAll(
						[
							pipe(
								Stream_mergeAll(
									[
										changed("displayModName"),
										changed("displaySuperChatAuthor"),
										changed("font"),
										changed("fontSize"),
										changed("fontWeight"),
										changed("laneCount"),
										changed("minSpacing"),
										changed("flowY1"),
										changed("flowY2"),
										pipe(
											refs.flowX1.changes,
											Stream_tap(x =>
												provideLog(
													Effect_sync(() =>
														Object.assign(chatScreen.style, {
															left: 100 * x + "%",
															width:
																100 * (mainState.config.value.flowX2 - x) + "%",
														}),
													),
												),
											),
										),
										pipe(
											changed("flowX2"),
											Stream_tap(x =>
												provideLog(
													Effect_sync(() =>
														Object.assign(chatScreen.style, {
															left: 100 * mainState.config.value.flowX1 + "%",
															width:
																100 * (x - mainState.config.value.flowX1) + "%",
														}),
													),
												),
											),
										),
										changed("textOnly"),
									],
									{ concurrency: "unbounded" },
								),
								Stream_map(() => ({ render: !0, setAnimation: !0 })),
							),
							pipe(
								Stream_mergeAll(
									[
										changed("color"),
										changed("ownerColor"),
										changed("moderatorColor"),
										changed("memberColor"),
										changed("shadowColor"),
										changed("chatOpacity"),
										changed("shadowFontWeight"),
										changed("displayChats"),
									],
									{ concurrency: "unbounded" },
								),
								Stream_map(() => ({ render: !0 })),
							),
							pipe(
								changed("flowSpeed"),
								Stream_map(() => ({ setPlayState: !0 })),
							),
							pipe(
								Stream_mergeAll(
									[
										pipe(
											changed("maxChatCount"),
											Stream_tap(x =>
												provideLog(removeOldChats(mainState.flowChats)(x)),
											),
										),
										changed("noOverlap"),
										changed("timingFunction"),
									],
									{ concurrency: "unbounded" },
								),
								Stream_map(() => ({ setAnimation: !0 })),
							),
						],
						{ concurrency: "unbounded" },
					),
					throttleLatest("180 millis"),
					Stream_map(x => ({
						render: !1,
						setAnimation: !1,
						setPlayState: !1,
						...x,
					})),
					Stream_mapEffect(c =>
						provideLog(
							pipe(
								SynchronizedRef_get(mainState.flowChats),
								Effect_map(Array_filter(x => Either_isRight(x.animationState))),
								Effect_flatMap(
									Effect_forEach(chat =>
										pipe(
											Effect_allSuccesses([
												c.render
													? Effect_succeed(renderChat(chat))
													: Effect_fail(new Cause_NoSuchElementException()),
												c.setAnimation
													? Effect_succeed(state =>
															Effect_ignore(setChatAnimation(chat)(state)),
														)
													: c.setPlayState
														? Effect_succeed(setChatPlayState(chat))
														: Effect_fail(new Cause_NoSuchElementException()),
											]),
											Effect_flatMap(Effect_forEach(apply(mainState))),
										),
									),
								),
							),
						),
					),
				),
			)
		}
		__webpack_require__.dn(configStream)
		const src_listeningBroadcastConfigKeys = [
				"lang",
				"bannedWords",
				"bannedWordRegexes",
				"bannedUsers",
				"filterExp",
				"simplifyChatField",
				"createBanButton",
				"fieldScale",
			],
			chatApp = pipe(
				Effect_sync(() => document.querySelector("#chatframe")),
				Effect_flatMap(nullableFrame =>
					pipe(
						Option_fromNullable(nullableFrame),
						filter(frame =>
							pipe(
								frame.contentDocument?.readyState,
								x => "loading" === x || "complete" === x,
							),
						),
						flatMapNullable(x => x.contentDocument),
						Option_orElse(() => Option_some(document)),
						flatMapNullable(x => x.querySelector("yt-live-chat-app")),
					),
				),
			),
			livePageYt = {
				toggleChatBtnParent: pipe(
					Effect_sync(() =>
						Array.from(document.querySelectorAll(".ytp-right-controls")),
					),
					Effect_flatMap(Array_findFirst(x => null !== x.offsetParent)),
				),
				settingsToggleNextElement: pipe(
					Effect_sync(() => document.querySelector("#menu-container")),
					Effect_flatMap(Effect_fromNullable),
					Effect_filterOrFail(x => null !== x.offsetParent),
					Effect_flatMap(x =>
						Effect_fromNullable(
							x.querySelector(".dropdown-trigger.ytd-menu-renderer"),
						),
					),
					Effect_orElse(() =>
						Effect_fromNullable(
							document.querySelector(
								"#top-row .dropdown-trigger.ytd-menu-renderer",
							),
						),
					),
					Effect_filterOrFail(x => null !== x.parentElement?.offsetParent),
				),
				settingsContainer: pipe(
					Effect_sync(() => document.body),
					Effect_flatMap(Option_fromNullable),
				),
				player: pipe(
					Effect_sync(() => document.querySelector("#movie_player")),
					Effect_flatMap(Option_fromNullable),
				),
				video: pipe(
					Effect_sync(() =>
						document.querySelector("video.video-stream.html5-main-video"),
					),
					Effect_flatMap(Option_fromNullable),
				),
				chatField: pipe(
					chatApp,
					Effect_flatMap(app =>
						pipe(
							app.querySelector("#items.yt-live-chat-item-list-renderer"),
							Option_fromNullable,
						),
					),
				),
				chatTicker: pipe(
					chatApp,
					Effect_flatMap(app =>
						pipe(
							app.querySelector("#items.yt-live-chat-ticker-renderer"),
							Option_fromNullable,
						),
					),
				),
				chatScroller: pipe(
					chatApp,
					Effect_flatMap(app =>
						pipe(
							app.querySelector(
								"#item-scroller.yt-live-chat-item-list-renderer",
							),
							Option_fromNullable,
						),
					),
				),
				offlineSlate: pipe(
					Effect_sync(() => document.querySelector(".ytp-offline-slate")),
					Effect_flatMap(Option_fromNullable),
				),
			},
			logMeta = FiberRef_unsafeMake(Option_none()),
			logWithMeta = level => message => data =>
				pipe(
					Effect_log(message),
					Effect_locally(logMeta, Option_some(data)),
					x => locally(level)(x),
				)
		__webpack_require__.dn(logWithMeta)
		const mainCss = pipe(
				Effect_sync(() => document.createElement("style")),
				Effect_tap(x =>
					Effect_sync(() => {
						x.textContent =
							".fyc_chat {\n  line-height: 1;\n  z-index: 30;\n  position: absolute;\n  user-select: none;\n  white-space: nowrap;\n  will-change: transform;\n}\n.fyc_button {\n  display: inline-block;\n  border-style: none;\n  z-index: 4;\n  font-weight: 500;\n  color: var(--yt-spec-text-secondary);\n}"
					}),
				),
			),
			emptyElement = document.createElement("span"),
			addFlowChat = (data, chatScrn, mainState) =>
				Effect_gen(function* () {
					const chatFontSize = yield* getChatFontSize(mainState)
					;(yield* pipe(
						Effect_succeed({
							data,
							element: emptyElement,
							lane: -1,
							animationState: Either_left("NotStarted"),
							width: 2,
							height: chatFontSize,
							y: 0,
						}),
						Effect_flatMap(x => getChatLane(x, Option_none(), 0)(mainState)),
						Effect_map(
							({ interval }) =>
								!intervalTooSmall(interval)(mainState.config.value),
						),
					)) &&
						(yield* pipe(
							SynchronizedRef_get(mainState.flowChats),
							Effect_flatMap(chats =>
								findFirstIndex(
									chats,
									chat =>
										match(chat.animationState, {
											onLeft: x => "Ended" === x,
											onRight: () => !1,
										}) || chats.length >= mainState.config.value.maxChatCount,
								),
							),
							Effect_matchEffect({
								onFailure: () =>
									pipe(
										Effect_sync(() => document.createElement("span")),
										Effect_tap(element =>
											Effect_sync(() => chatScrn.append(element)),
										),
										Effect_tap(element =>
											Effect_sync(() => element.classList.add("fyc_chat")),
										),
										Effect_zipLeft(Effect_logDebug("Flow chat element added")),
									),
								onSuccess: index =>
									pipe(
										Effect_gen(function* () {
											const chat = pipe(
												yield* SynchronizedRef_get(mainState.flowChats),
												Array_unsafeGet(index),
											)
											yield* SynchronizedRef_update(
												mainState.flowChats,
												Array_remove(index),
											)
											yield* chat.animationState.pipe(
												Effect_tap(animation =>
													Effect_sync(() => animation.cancel()),
												),
												Effect_ignore,
											)
											return chat.element
										}),
									),
							}),
							Effect_map(element => ({
								data,
								element,
								lane: -1,
								animationState: Either_left("NotStarted"),
								width: 2,
								height: chatFontSize,
								y: 0,
							})),
							Effect_flatMap(flowChat =>
								pipe(
									Effect_succeed(mainState),
									Effect_tap(renderChat(flowChat)),
									Effect_flatMap(setChatAnimation(flowChat)),
									Effect_matchEffect({
										onFailure: () =>
											pipe(
												Effect_sync(() => flowChat.element.remove()),
												Effect_zipLeft(
													Effect_logDebug("Flow chat element removed"),
												),
											),
										onSuccess: x =>
											SynchronizedRef_update(
												mainState.flowChats,
												Array_append(x.newChat),
											),
									}),
								),
							),
						))
				})
		__webpack_require__.dn(addFlowChat)
		const appendChatMessage = flip(chat =>
				Effect_flatMap(x =>
					Effect_sync(() => chat.querySelector("#content #message")?.append(x)),
				),
			),
			template = Effect_runPromise(
				pipe(
					Effect_succeed(document.createElement("button")),
					Effect_tap(x =>
						Effect_sync(() =>
							x.classList.add("style-scope", "yt-icon-button", "fyc_button"),
						),
					),
					Effect_tap(x =>
						Effect_sync(() =>
							Object.assign(x.style, {
								padding: "0px",
								width: "20px",
								height: "20px",
								fill: "#fff",
							}),
						),
					),
					Effect_tap(x =>
						Effect_sync(() =>
							x.setAttribute("aria-label", "NGに入れる(Ban this user)"),
						),
					),
					Effect_tap(x =>
						Effect_sync(() => {
							const svg = document.createElementNS(
								"http://www.w3.org/2000/svg",
								"svg",
							)
							svg.setAttribute("class", "style-scope yt-icon")
							Object.assign(svg.style, {
								width: "100%",
								height: "75%",
								fill: "var(--yt-spec-text-secondary)",
							})
							svg.setAttribute("viewBox", "0 0 512 512")
							const path = document.createElementNS(
								"http://www.w3.org/2000/svg",
								"path",
							)
							path.setAttribute(
								"d",
								"M440 78A256 256 0 1 0 73 435 256 256 0 0 0 440 78zm-99 35L113 341C37 179 212 44 341 113zM177 405l228-228c76 162-99 297-228 228z",
							)
							path.setAttribute("fill-rule", "evenodd")
							svg.appendChild(path)
							x.appendChild(svg)
						}),
					),
				),
			),
			banButton = id => getConfig => setConfig => chat =>
				pipe(
					getConfig.bannedUsers,
					Effect_filterOrFail(x => !x.includes(id)),
					Effect_map(x =>
						pipe(dedupeWith(x, String_Equivalence), Array_append(id)),
					),
					Effect_flatMap(x => pipe(setConfig.bannedUsers(x))),
					Effect_ignore,
					Effect_zipRight(
						Effect_sync(() => {
							chat.style.display = "none"
						}),
					),
					onclick =>
						pipe(
							Effect_promise(() => template),
							Effect_map(x => x.cloneNode(!0)),
							Effect_tap(x =>
								Effect_sync(() => {
									x.onclick = () => Effect_runPromise(onclick)
								}),
							),
						),
				)
		__webpack_require__.dn(banButton)
		const forbiddenProperties = new Set([
				"__proto__",
				"constructor",
				"prototype",
			]),
			unaryOperations = {
				"!": x => !isTruthy(x),
				"-": x => -Number(x),
				"+": x => Number(x),
			},
			binaryOperations = {
				"==": (l, r) => l == r,
				"!=": (l, r) => l != r,
				"===": (l, r) => l === r,
				"!==": (l, r) => l !== r,
				"<": (l, r) => l < r,
				">": (l, r) => l > r,
				"<=": (l, r) => l <= r,
				">=": (l, r) => l >= r,
				"+": (l, r) => l + r,
				"-": (l, r) => l - r,
				"*": (l, r) => l * r,
				"/": (l, r) => l / r,
				"%": (l, r) => l % r,
			},
			evaluateExpression = context => expression => {
				const evaluate = evaluateExpression(context),
					exp = expression
				switch (exp.type) {
					case "Literal":
						return exp.value
					case "Identifier":
						if (!Object.hasOwn(context, exp.name))
							throw new Error(
								`Unknown identifier in filter expression: ${exp.name}`,
							)
						return context[exp.name]
					case "ArrayExpression":
						return exp.elements.map(x => (null === x ? void 0 : evaluate(x)))
					case "MemberExpression": {
						const property = exp.computed
							? evaluate(exp.property)
							: exp.property.name
						return ((object, property) => {
							if (null == object)
								throw new Error(
									"Cannot read a property of null/undefined in a filter expression",
								)
							const key =
								"string" == typeof property
									? property
									: "number" == typeof property
										? String(property)
										: void 0
							if (void 0 === key)
								throw new Error(
									"Filter expression property names must be strings or numbers",
								)
							if (forbiddenProperties.has(key))
								throw new Error(
									`Property "${key}" is not allowed in filter expressions`,
								)
							const record = object
							return Object.hasOwn(record, key) ? record[key] : void 0
						})(evaluate(exp.object), property)
					}
					case "CallExpression": {
						const fn = evaluate(exp.callee)
						if ("function" != typeof fn)
							throw new Error("Filter expression tried to call a non-function")
						return fn(...exp.arguments.map(evaluate))
					}
					case "UnaryExpression": {
						const operation = unaryOperations[exp.operator]
						if (void 0 === operation)
							throw new Error(`Unsupported unary operator: ${exp.operator}`)
						return operation(evaluate(exp.argument))
					}
					case "BinaryExpression": {
						const left = evaluate(exp.left)
						if ("||" === exp.operator)
							return isTruthy(left) ? left : evaluate(exp.right)
						if ("&&" === exp.operator)
							return isTruthy(left) ? evaluate(exp.right) : left
						const operation = binaryOperations[exp.operator]
						if (void 0 === operation)
							throw new Error(`Unsupported binary operator: ${exp.operator}`)
						return operation(left, evaluate(exp.right))
					}
					case "ConditionalExpression":
						return isTruthy(evaluate(exp.test))
							? evaluate(exp.consequent)
							: evaluate(exp.alternate)
					case "Compound":
					case "SequenceExpression":
						return ("Compound" === exp.type ? exp.body : exp.expressions)
							.map(evaluate)
							.at(-1)
					default:
						throw new Error(`Unsupported expression type: ${expression.type}`)
				}
			},
			filter_evaluateExpression = evaluateExpression,
			fromSemigroup = (S, empty) => ({
				combine: S.combine,
				combineMany: S.combineMany,
				empty,
				combineAll: collection => S.combineMany(empty, collection),
			}),
			Semigroup_make = (
				combine,
				combineMany = (self, collection) =>
					(function (b, f) {
						return function (iterable) {
							if (Array.isArray(iterable)) return iterable.reduce(f, b)
							let result = b
							for (const n of iterable) result = f(result, n)
							return result
						}
					})(
						self,
						combine,
					)(collection),
			) => ({ combine, combineMany }),
			SemigroupEvery = Semigroup_make(
				(self, that) => self && that,
				(self, collection) => {
					if (!1 === self) return !1
					for (const b of collection) if (!1 === b) return !1
					return !0
				},
			),
			SemigroupSome = Semigroup_make(
				(self, that) => self || that,
				(self, collection) => {
					if (!0 === self) return !0
					for (const b of collection) if (!0 === b) return !0
					return !1
				},
			),
			MonoidEvery = fromSemigroup(SemigroupEvery, !0),
			MonoidSome = fromSemigroup(SemigroupSome, !1),
			filterOperators = {
				flip,
				flow: fns => x => pipe(x, ...fns),
				and: MonoidEvery.combineAll,
				or: MonoidSome.combineAll,
				A: { some: Array_some, getSomes: Array_getSomes },
				O: { exists },
				inText: text => x => {
					return ((searchString = x),
					self => self.includes(searchString, void 0))(text)
					var searchString
				},
				eqText: text => x => text === x,
				matchedByText: text => x => isTruthy(text.match(RegExp(x, "u"))),
			},
			filter_filterOperators = filterOperators,
			filterContext = data => ({
				...filter_filterOperators,
				authorName: data.authorName,
				message: data.message,
				messageText: data.messageText,
				paymentInfo: data.paymentInfo,
				authorID: data.authorID,
			})
		__webpack_require__.dn(filterContext)
		const checkBannedWords = (data, config) =>
			pipe(
				Effect_succeed(data),
				Effect_filterOrFail(x =>
					Boolean(
						filter_evaluateExpression(filterContext(x))(config.filterExp),
					),
				),
				Effect_map(x => [x.message, x.paymentInfo]),
				Effect_flatMap(Effect_forEach(Effect_orElse(() => Effect_succeed("")))),
				Effect_map(JSON.stringify),
				Effect_flatMap(x => Effect_logDebug(`Filtered: ${x}`)),
				Effect_isSuccess,
			)
		__webpack_require__.dn(checkBannedWords)
		const parseChat = chat => {
			const chatType = chat.querySelector(
					".yt-live-chat-ticker-paid-message-item-renderer",
				)
					? "ticker"
					: chat.querySelector(".yt-live-chat-membership-item-renderer")
						? "membership"
						: chat.querySelector(
									".yt-live-chat-viewer-engagement-message-renderer",
							  )
							? "engagement"
							: "normal",
				paymentInfo = pipe(
					"ticker" === chatType || null !== chat.querySelector("#card"),
					isPaid =>
						Option_fromNullable(
							isPaid
								? chat.querySelector(
										join(", ")([
											"#purchase-amount",
											"#purchase-amount-chip",
											"#content>#text",
										]),
									)?.textContent
								: void 0,
						),
				),
				messageElement = Option_fromNullable(chat.querySelector("#message")),
				isPaidNormal =
					Option_isSome(paymentInfo) &&
					isTruthy(chat.querySelector(".yt-live-chat-paid-message-renderer")),
				isPaidSticker =
					Option_isSome(paymentInfo) &&
					!isPaidNormal &&
					isTruthy(chat.querySelector(".yt-live-chat-paid-sticker-renderer")),
				visibleBackgroundColor = element =>
					pipe(
						window
							.getComputedStyle(element)
							.getPropertyValue("background-color"),
						Option_liftPredicate(
							x => "transparent" !== x && "rgba(0, 0, 0, 0)" !== x,
						),
					)
			return {
				chatType,
				authorType: chat.querySelector(".owner")
					? "owner"
					: chat.querySelector(".moderator")
						? "moderator"
						: chat.querySelector(".member")
							? "member"
							: "normal",
				authorID: pipe(
					chat
						.querySelector(join(" ")(["#author-photo", "img"]))
						?.src.match(/ggpht\.com\/(ytc\/)?(.*)=/),
					authorPhotoMatches => Option_fromNullable(authorPhotoMatches?.at(-1)),
				),
				authorName: Option_fromNullable(
					chat.querySelector("#author-name")?.textContent,
				),
				timestamp: Option_fromNullable(
					chat.querySelector("#timestamp")?.textContent,
				),
				messageElement,
				message: pipe(
					messageElement,
					Option_map(x => x.innerHTML),
				),
				messageText: pipe(
					messageElement,
					Option_map(x => x.textContent ?? ""),
				),
				paymentInfo,
				textColor: isPaidNormal
					? pipe(
							Option_fromNullable(chat.querySelector("#header")),
							Option_flatMap(visibleBackgroundColor),
							Option_orElse(() =>
								pipe(
									Option_fromNullable(chat.querySelector("#card")),
									Option_flatMap(visibleBackgroundColor),
								),
							),
							Option_orElse(() =>
								pipe(
									Option_fromNullable(chat.querySelector("#content")),
									Option_flatMap(visibleBackgroundColor),
								),
							),
						)
					: isPaidSticker
						? Option_some(
								window
									.getComputedStyle(chat)
									.getPropertyValue(
										"--yt-live-chat-paid-sticker-chip-background-color",
									),
							)
						: Option_none(),
				paidColor: isPaidNormal
					? pipe(
							Option_fromNullable(chat.querySelector("#content")),
							Option_flatMap(visibleBackgroundColor),
							Option_orElse(() =>
								pipe(
									Option_fromNullable(chat.querySelector("#card")),
									Option_flatMap(visibleBackgroundColor),
								),
							),
							Option_orElse(() =>
								pipe(
									Option_fromNullable(chat.querySelector("#header")),
									Option_flatMap(visibleBackgroundColor),
								),
							),
						)
					: isPaidSticker
						? Option_some(
								window
									.getComputedStyle(chat)
									.getPropertyValue(
										"--yt-live-chat-paid-sticker-background-color",
									),
							)
						: Option_none(),
			}
		}
		__webpack_require__.dn(parseChat)
		const setChatFieldSimplifyStyle = chat =>
			Effect_gen(function* () {
				chat.querySelector(".style-scope.yt-live-chat-paid-message-renderer") ||
					(yield* pipe(
						[
							"#author-photo",
							"yt-live-chat-author-chip.style-scope.yt-live-chat-text-message-renderer",
						],
						Array_map(x => Option_fromNullable(chat.querySelector(x))),
						Array_getSomes,
						Array_map(x =>
							Effect_sync(() => {
								x.style.display = "none"
							}),
						),
						Array_append(
							Effect_sync(() => {
								chat.style.borderBottom =
									"1px solid var(--yt-spec-text-secondary)"
							}),
						),
						Effect_all,
					))
			})
		__webpack_require__.dn(setChatFieldSimplifyStyle)
		const strictOptionEquivalence =
				((isEquivalent = strict()),
				Equivalence_make((x, y) =>
					Option_isNone(x)
						? Option_isNone(y)
						: !Option_isNone(y) && isEquivalent(x.value, y.value),
				)),
			onChatFieldMutate = (chatScrn, mainState) => records =>
				pipe(
					Effect_succeed(records),
					Effect_map(Array_flatMap(e => Array.from(e.addedNodes))),
					Effect_map(Array_filter(x => x.children.length > 0)),
					Effect_map(Array_reverse),
					Effect_flatMap(
						Effect_forEach(chat =>
							Effect_gen(function* () {
								yield* Effect_logDebug("Chat detected")
								const data = parseChat(chat)
								;(yield* checkBannedWords(data, mainState.config.value))
									? (chat.style.display = "none")
									: yield* Effect_all(
											[
												pipe(
													addFlowChat(data, chatScrn, mainState),
													Effect_when(
														pipe(
															yield* SynchronizedRef_get(mainState.flowChats),
															flowChats => () =>
																mainState.config.value.createChats &&
																"normal" === data.chatType &&
																!Array_some(
																	flowChats,
																	x =>
																		Either_isRight(x.animationState) &&
																		strictOptionEquivalence(
																			x.data.authorID,
																			data.authorID,
																		) &&
																		strictOptionEquivalence(
																			x.data.messageText,
																			data.messageText,
																		) &&
																		strictOptionEquivalence(
																			x.data.timestamp,
																			data.timestamp,
																		),
																),
														),
													),
												),
												data.authorID.pipe(
													filter(
														() =>
															mainState.config.value.createBanButton &&
															!chat.children.namedItem("card"),
													),
													Effect_flatMap(x =>
														appendChatMessage(
															banButton(x)(mainState.config.getConfig)(
																mainState.config.setConfig,
															)(chat),
														)(chat),
													),
													Effect_zipLeft(Effect_logDebug("Ban button added")),
												),
												pipe(
													setChatFieldSimplifyStyle(chat),
													Effect_when(
														() => mainState.config.value.simplifyChatField,
													),
													Effect_zipLeft(Effect_logDebug("Chat simplified")),
												),
											],
											{ mode: "either" },
										)
							}),
						),
					),
				)
		var isEquivalent
		__webpack_require__.dn(onChatFieldMutate)
		const onPlayerResize = (rect, mainState) =>
			pipe(
				Effect_succeed(rect),
				Effect_tap(x =>
					Effect_logDebug(
						`Resize [${x.width.toFixed(1)}, ${x.height.toFixed(1)}]`,
					),
				),
				Effect_flatMap(r => SynchronizedRef_set(mainState.playerRect, r)),
				Effect_zipRight(SynchronizedRef_get(mainState.flowChats)),
				Effect_flatMap(
					Effect_forEach(x =>
						Effect_all([
							renderChat(x)(mainState),
							Effect_ignore(setChatAnimation(x)(mainState)),
						]),
					),
				),
			)
		__webpack_require__.dn(onPlayerResize)
		const observePair = con =>
			Effect_gen(function* () {
				const pubsub = yield* PubSub_unbounded(),
					runtime = yield* Effect_runtime(),
					runPublish = Runtime_runSync(runtime)
				return {
					stream: Stream_fromPubSub(pubsub),
					observer: new con(a => {
						runPublish(PubSub_publish(pubsub, a))
					}),
				}
			})
		__webpack_require__.dn(observePair)
		const toggleEvents = [
				["playing", !0],
				["waiting", !1],
				["pause", !1],
			],
			videoToggleStream = video =>
				Stream_mergeAll(
					Array_map(toggleEvents, ([type, playing]) =>
						Stream_map(Stream_fromEventListener(video, type), () => playing),
					),
					{ concurrency: "unbounded" },
				)
		__webpack_require__.dn(videoToggleStream)
		const updateSettingsRect =
			toggleSettingsElement => nextSettingsRect => last =>
				pipe(
					Effect_succeed(toggleSettingsElement),
					Effect_filterOrFail(x => null !== x.offsetParent),
					Effect_map(x => x.getBoundingClientRect()),
					Effect_map(
						x =>
							new DOMRectReadOnly(
								Math.max(0, x.right + window.scrollX - 660),
								Math.max(0, x.y + window.scrollY - 395),
								660,
								Math.min(x.y + window.scrollY, 395),
							),
					),
					Effect_orElseSucceed(() => new DOMRectReadOnly(-660, -395, 660, 395)),
					Effect_filterOrFail(
						x =>
							x.x !== last.x ||
							x.y !== last.y ||
							x.width !== last.width ||
							x.height !== last.height,
					),
					Effect_tap(nextSettingsRect),
					Effect_ignore,
				)
		__webpack_require__.dn(updateSettingsRect)
		const allStream = provideLog => ctx =>
			Effect_gen(function* () {
				const live = makePageState(livePageYt),
					css = yield* mainCss,
					documentMutationPair = yield* observePair(MutationObserver),
					chatMutationPair = yield* observePair(MutationObserver),
					playerResizePair = yield* observePair(ResizeObserver),
					bodyResizePair = yield* observePair(ResizeObserver),
					liveElementKeys = Object.keys(live),
					settingsRect = yield* SubscriptionRef_make(
						new DOMRectReadOnly(0, 0, 660, 395),
					),
					tapUpdateSettingsRect = stream =>
						Stream_tap(stream, () =>
							provideLog(
								pipe(
									(self => Ref_get(self.ref))(settingsRect),
									Effect_flatMap(
										updateSettingsRect(ctx.apps.toggleSettingsPanelApp.node)(
											rect => SubscriptionRef_set(settingsRect, rect),
										),
									),
								),
							),
						),
					config$ = configStream(
						provideLog,
						ctx.mainState,
						ctx.configRefs,
						ctx.chatScreen,
						live,
					),
					pollChanged = provideLog(
						pipe(
							Effect_succeed(liveElementKeys),
							Effect_flatMap(
								Effect_forEach(key =>
									live[key].read.pipe(
										Effect_option,
										Effect_flatMap(
											Option_liftPredicate(
												newEle =>
													!strictOptionEquivalence(live[key].ele, newEle),
											),
										),
										Effect_tap(x =>
											Effect_sync(() => {
												live[key].ele = x
											}),
										),
										Effect_map(Option_isSome),
										Effect_map(x => `${key} ${x ? "found" : "lost"}`),
										Effect_flatMap(Effect_logDebug),
										Effect_isSuccess,
									),
								),
							),
							Effect_map(Array_some(identity)),
						),
					),
					setup = provideLog(
						Effect_suspend(() =>
							pipe(
								Effect_logDebug("Loading..."),
								Effect_zipRight(
									Effect_sync(() => {
										;[
											documentMutationPair,
											chatMutationPair,
											playerResizePair,
											bodyResizePair,
										].forEach(pair => {
											pair.observer.disconnect()
										})
										documentMutationPair.observer.observe(document, {
											childList: !0,
											subtree: !0,
										})
										document.head.append(css)
									}),
								),
								Effect_zipRight(
									Effect_allSuccesses([
										...Array_map(
											[live.chatField.ele, live.chatTicker.ele],
											Effect_flatMap(x =>
												Effect_sync(() =>
													chatMutationPair.observer.observe(x, {
														childList: !0,
													}),
												),
											),
										),
										live.player.ele.pipe(
											Effect_flatMap(element =>
												pipe(
													Effect_succeed(element),
													Effect_tap(x =>
														Effect_sync(() =>
															playerResizePair.observer.observe(x),
														),
													),
													Effect_flatMap(x =>
														Effect_sync(() => x.prepend(ctx.chatScreen)),
													),
												),
											),
										),
										live.toggleChatBtnParent.ele.pipe(
											Effect_flatMap(x =>
												Effect_sync(() =>
													x.prepend(ctx.apps.toggleChatButtonApp.node),
												),
											),
										),
										live.settingsToggleNextElement.ele.pipe(
											Effect_flatMap(x =>
												Effect_sync(() =>
													x.before(ctx.apps.toggleSettingsPanelApp.node),
												),
											),
											Effect_orElse(() =>
												live.toggleChatBtnParent.ele.pipe(
													Effect_flatMap(() =>
														Effect_sync(() =>
															ctx.apps.toggleChatButtonApp.node.before(
																ctx.apps.toggleSettingsPanelApp.node,
															),
														),
													),
												),
											),
										),
										live.settingsContainer.ele.pipe(
											Effect_flatMap(x =>
												Effect_sync(() => x.append(ctx.apps.settingsApp.node)),
											),
										),
										pipe(
											document.body,
											Effect_fromNullable,
											Effect_flatMap(x =>
												Effect_sync(() => bodyResizePair.observer.observe(x)),
											),
										),
										live.video.ele.pipe(
											Effect_filterOrElse(
												x => !x.paused,
												() => live.offlineSlate.ele,
											),
											Effect_isSuccess,
											Effect_flatMap(x =>
												SynchronizedRef_set(ctx.mainState.chatPlaying, x),
											),
										),
									]),
								),
							),
						),
					),
					main = pipe(
						Stream_fromQueue(ctx.reinitQueue),
						Stream_mapEffect(() =>
							pipe(
								Effect_sleep("100 millis"),
								Effect_zipRight(provideLog(Effect_logInfo("Init"))),
							),
						),
						Stream_flatMap(
							() =>
								pipe(
									(schedule =>
										pipe(
											Schedule_driver(schedule),
											Effect_map(driver => {
												return (
													(effect = driver.next(void 0)),
													repeatEffectChunkOption(
														pipe(effect, Effect_map(Chunk_of)),
													)
												)
												var effect
											}),
											stream_unwrap,
										))(Schedule_fixed("700 millis")),
									tapUpdateSettingsRect,
									Stream_mapEffect(() => pollChanged),
									Stream_filter(identity),
									s => Stream_concat(Stream_make(!0), s),
									Stream_tap(() => setup),
									Stream_flatMap(
										() =>
											Stream_mergeAll(
												[
													pipe(
														Stream_fromEventListener(ctx.channel, "message"),
														Stream_mapEffect(([key, val]) =>
															provideLog(
																pipe(
																	src_listeningBroadcastConfigKeys.includes(
																		key,
																	),
																	x =>
																		x
																			? ctx.setChangedConfig[key](val)
																			: Effect_sync(() => {}),
																),
															),
														),
													),
													...pipe(
														configKeys,
														Array_map(key =>
															pipe(
																ctx.configRefs[key].changes,
																Stream_zipWithPrevious,
																Stream_filterMap(([previous, next]) =>
																	Option_map(previous, x =>
																		configDiff(x, next),
																	),
																),
																Stream_mapEffect(x =>
																	provideLog(
																		Effect_logDebug(
																			`Config ${key}: ${JSON.stringify(x, void 0, 2)}`,
																		),
																	),
																),
															),
														),
													),
													config$,
													live.video.ele.pipe(
														Option_match({
															onNone: () => Stream_empty,
															onSome: element =>
																pipe(
																	videoToggleStream(element),
																	Stream_map(
																		playing =>
																			playing ||
																			Option_isSome(live.offlineSlate.ele),
																	),
																	Stream_mapEffect(chatPlaying =>
																		provideLog(
																			pipe(
																				SynchronizedRef_set(
																					ctx.mainState.chatPlaying,
																					chatPlaying,
																				),
																				Effect_zipRight(
																					pipe(
																						SynchronizedRef_get(
																							ctx.mainState.flowChats,
																						),
																						Effect_map(
																							Array_map(setChatPlayState),
																						),
																						Effect_flatMap(
																							Effect_forEach(
																								apply(ctx.mainState),
																							),
																						),
																					),
																				),
																			),
																		),
																	),
																),
														}),
													),
													pipe(
														chatMutationPair.stream,
														Stream_mapEffect(records =>
															provideLog(
																onChatFieldMutate(
																	ctx.chatScreen,
																	ctx.mainState,
																)(records),
															),
														),
													),
													pipe(
														documentMutationPair.stream,
														Stream_map(() => window.location.href),
														Stream_changes,
														Stream_drop(1),
														tapUpdateSettingsRect,
														Stream_mapEffect(x =>
															provideLog(
																Effect_all([
																	Effect_logDebug(`URL Changed: ${x}`),
																	removeOldChats(ctx.mainState.flowChats)(0),
																]),
															),
														),
														Stream_mapEffect(() =>
															pipe(
																Effect_sleep("1700 millis"),
																Effect_zipRight(ctx.reinitialize),
															),
														),
													),
													pipe(
														playerResizePair.stream,
														throttleLatest("500 millis"),
														s => Stream_concat(Stream_succeed([]), s),
														Stream_mapEffect(() =>
															provideLog(
																live.player.ele.pipe(
																	Option_map(x => x.getBoundingClientRect()),
																	Option_match({
																		onNone: () => _void,
																		onSome: x =>
																			onPlayerResize(x, ctx.mainState),
																	}),
																),
															),
														),
													),
													pipe(
														bodyResizePair.stream,
														throttleLatest("300 millis"),
														s => Stream_concat(Stream_succeed([]), s),
														tapUpdateSettingsRect,
													),
													pipe(
														settingsRect.changes,
														Stream_mapEffect(panelRect =>
															ctx.updateSettingState(s => ({
																...s,
																panelRect,
															})),
														),
													),
												],
												{ concurrency: "unbounded" },
											),
										{ switch: !0 },
									),
								),
							{ switch: !0 },
						),
					),
					resilient = self =>
						pipe(
							self,
							Stream_catchAllCause(cause =>
								Stream_unwrap(
									pipe(
										provideLog(
											logWithMeta(LogLevel_Error)(
												`Errored: ${Cause_pretty(cause)}`,
											)(squash(cause)),
										),
										Effect_zipRight(Effect_sleep("5 seconds")),
										Effect_zipRight(ctx.reinitialize),
										Effect_as(resilient(self)),
									),
								),
							),
						)
				return resilient(main)
			})
		__webpack_require__.dn(allStream)
		var fast_deep_equal = __webpack_require__(371),
			fast_deep_equal_default = __webpack_require__.n(fast_deep_equal)
		const setterFromKeysAndMap = keys => f =>
			pipe(
				keys,
				Array_map(x => [x, f(x)]),
				Object.fromEntries,
			)
		__webpack_require__.dn(setterFromKeysAndMap)
		const configWriteFunnel = ({
			configValue,
			configRefs,
			configKeys,
			dispatchToSettings,
			broadcastAndPersist,
			defaultFilterExp,
		}) => {
			const writeBase = key => val =>
					pipe(
						Effect_sync(() => {
							Object.assign(configValue, { [key]: val })
						}),
						Effect_zipRight(SubscriptionRef_set(configRefs[key], val)),
					),
				setterFromMap = setterFromKeysAndMap(configKeys),
				setConfigPlain = setterFromMap(
					key => val =>
						pipe(
							writeBase(key)(val),
							Effect_zipRight(
								(
									key => val =>
										pipe(
											dispatchToSettings(key)(val),
											Effect_zipRight(
												pipe(
													["bannedWords", "bannedUsers", "bannedWordRegexes"],
													Array_containsWith(String_Equivalence)(key),
													x =>
														x
															? Effect_suspend(() =>
																	(val =>
																		pipe(
																			Effect_sync(() => configValue.filterExp),
																			Effect_filterOrFail(
																				x => !fast_deep_equal_default()(x, val),
																			),
																			Effect_flatMap(() =>
																				pipe(
																					writeBase("filterExp")(val),
																					Effect_zipRight(
																						dispatchToSettings("filterExp")(
																							val,
																						),
																					),
																				),
																			),
																			Effect_zipRight(
																				broadcastAndPersist("filterExp")(val),
																			),
																			Effect_ignore,
																		))(defaultFilterExp()),
																)
															: _void,
												),
											),
										)
								)(key)(val),
							),
						),
				),
				changedConfigMap = key => val =>
					pipe(
						Effect_sync(() => configValue[key]),
						Effect_filterOrFail(x => !fast_deep_equal_default()(x, val)),
						Effect_flatMap(() => setConfigPlain[key](val)),
					)
			return {
				setConfigPlain,
				setChangedConfig: setterFromMap(
					key => val => changedConfigMap(key)(val).pipe(Effect_ignore),
				),
				setConfig: setterFromMap(
					key => val =>
						changedConfigMap(key)(val).pipe(
							Effect_zipRight(broadcastAndPersist(key)(val)),
							Effect_ignore,
						),
				),
			}
		}
		__webpack_require__.dn(configWriteFunnel)
		const defaultFilter = config =>
			external_jsep_default()(
				`\nor([\nA.some(\n  flip(flow([inText, A.some]))(${JSON.stringify(config.bannedWords)})\n)(A.getSomes([\n  messageText,\n  paymentInfo\n])),\nA.some(\n  flip(flow([matchedByText, A.some]))(${JSON.stringify(config.bannedWordRegexes)})\n)(A.getSomes([\n  messageText,\n  paymentInfo\n])),\nO.exists(\n  flip(flow([eqText, A.some]))(${JSON.stringify(config.bannedUsers)})\n)(authorID)\n])\n`,
			)
		__webpack_require__.dn(defaultFilter)
		const makeChatScreen = pipe(
				Effect_sync(() => document.createElement("div")),
				Effect_tap(x =>
					Effect_sync(() =>
						Object.assign(x.style, {
							pointerEvents: "none",
							zIndex: "30",
							position: "absolute",
							overflow: "hidden",
							height: "100%",
							width: "100%",
						}),
					),
				),
			),
			Editable_of = x => [x, Option_none()],
			fromValueText = v => t => [v, Option_some([t, Option_none()])],
			Editable_value = getFirst,
			Editable_text = x => pipe(getSecond(x), Option_map(getFirst)),
			Editable_error = x => pipe(getSecond(x), Option_flatMap(getSecond)),
			setValue = v => pipe(constant(v), x => mapFirst(x)),
			setText = x =>
				mapSecond(snd =>
					snd.pipe(
						Option_map(mapFirst(constant(x))),
						Option_orElse(constant(Option_some([x, Option_none()]))),
					),
				),
			hasError = x => Option_isSome(Editable_error(x)),
			exceptions = ["timingFunction", "lang"],
			isEditable = k => v =>
				("number" == typeof v ||
					"string" == typeof v ||
					(Array.isArray(v) && ("string" == typeof v[0] || 0 === v.length))) &&
				!Array_some(x => x === k)(exceptions)
		__webpack_require__.dn(isEditable)
		const setSettingFromConfig = key => value => state => ({
			...state,
			[key]: isEditable(key)(value)
				? setValue(value)(state[key])
				: "filterExp" === key
					? void 0
					: value,
		})
		__webpack_require__.dn(setSettingFromConfig)
		const RefinedConstructorsTypeId = Symbol.for("effect/Brand/Refined"),
			nominal = () =>
				Object.assign(args => args, {
					[RefinedConstructorsTypeId]: RefinedConstructorsTypeId,
					option: args => Option_some(args),
					either: args => Either_right(args),
					is: _args => !0,
				}),
			external_LZString_namespaceObject = LZString,
			makeCompressedLogBlock = nominal(),
			makeLog = nominal(),
			decompressBlock = x =>
				pipe(
					(0, external_LZString_namespaceObject.decompressFromUTF16)(x),
					JSON.parse,
				),
			importLog = s =>
				makeLog(
					pipe(
						"<" === s[0] ? s.slice(5, -6) : s,
						x => JSON.parse(x),
						log => ({
							nextId: log.nextId,
							...pipe(
								log.blocks,
								Array_map(
									external_LZString_namespaceObject.decompressFromEncodedURIComponent,
								),
								matchRight({
									onEmpty: () => ({ compressedBlocks: [], lastBlock: [] }),
									onNonEmpty: (init, last) => ({
										compressedBlocks: Array_map(init, x =>
											pipe(
												(0, external_LZString_namespaceObject.compressToUTF16)(
													x,
												),
												makeCompressedLogBlock,
											),
										),
										lastBlock: JSON.parse(last),
									}),
								}),
							),
						}),
					),
				),
			settingStateInit = config =>
				pipe(
					config,
					mapObject(([k, v]) => [
						k,
						isEditable(k)(v) ? Editable_of(v) : "filterExp" === k ? void 0 : v,
					]),
					x => ({
						...x,
						showPanel: !1,
						mainTab: 0,
						logTab: 0,
						timingStepCount: Editable_of(
							parseInt(
								config.timingFunction.match(/^steps\((\d+),.+/)?.[1] ?? "150",
								10,
							),
						),
						eventLog: makeLog({
							nextId: 0,
							compressedBlocks: [],
							lastBlock: [],
						}),
						panelRect: new DOMRectReadOnly(0, 0, 660, 395),
					}),
				)
		__webpack_require__.dn(settingStateInit)
		const makeComponent = x => tag => ({ tag, view: x(tag) }),
			node_option = (value, label, selected) =>
				h("option", { value, selected }, hyperapp_text(label))
		__webpack_require__.dn(node_option)
		const tabContainer = style => ontabSelect => labels => tabs => mainTab =>
			h("div", { style: style.container }, [
				h(
					"div",
					{},
					pipe(
						labels,
						Array_map((x, i) =>
							h(
								"span",
								{
									style: {
										...style.label,
										...(mainTab === i ? style.labelFocus : {}),
										display: "inline-block",
									},
									onpointerdown: [ontabSelect, i],
								},
								hyperapp_text(x),
							),
						),
					),
				),
				h(
					"div",
					{
						style: { ...style.tab, overflow: "auto", boxSizing: "border-box" },
					},
					pipe(
						tabs,
						Array_get(mainTab),
						Option_match({ onNone: () => {}, onSome: x => x() }),
					),
				),
			])
		__webpack_require__.dn(tabContainer)
		const defaultText = {
				setting: ["Settings", "設定", "设置"],
				font: ["Font", "フォント", "字体"],
				color: ["Color(Normal)", "色(通常)", "颜色(正常)"],
				ownerColor: ["Color(Owner)", "色(オーナー)", "颜色(主人)"],
				moderatorColor: [
					"Color(Moderator)",
					"色(モデレーター)",
					"颜色(管理员)",
				],
				memberColor: ["Color(Member)", "色(メンバー)", "颜色(成员)"],
				feedback: ["Feedback", "バグ報告と要望", "反馈"],
				eventLog: ["Event log", "イベントログ", "事件日志"],
				giveFeedback: [
					"Give your feedbacks here(Please attach the event log for bug reports)",
					"バグ報告、要望はこちら(バグの場合は、イベントログを添付してください)",
					"在此处提供您的反馈(如报告错误,请附上事件日志)",
				],
				chatOpacity: ["Opacity", "不透明度", "不透明度"],
				fontSize: ["Size", "サイズ", "字体大小"],
				fontWeight: ["Weight", "太さ", "字体粗细"],
				shadowFontWeight: ["Shadow Weight", "影の太さ", "阴影粗细"],
				flowSpeed: ["Speed", "速度", "弹幕速度"],
				maxChatCount: ["Max number of chats", "最大表示数", "最大聊天数量"],
				maxChatLength: ["Max number of characters", "最大文字数", "最大字符数"],
				laneCount: ["Number of rows", "行数", "行数"],
				bannedWords: ["Banned Words", "NGワード", "屏蔽词"],
				bannedWordRegexes: [
					"Banned Words(Regex)",
					"NGワード(正規表現)",
					"屏蔽词(正则表达式)",
				],
				bannedUsers: ["Banned Users", "NGユーザー", "屏蔽用户"],
				simplifyChatField: ["Simplify", "簡略化する", "简化聊天栏"],
				createBanButton: [
					"Show ban button",
					"NGボタンを表示する",
					"显示屏蔽按钮",
				],
				displayModName: [
					"Show moderator's name",
					"モデレーターの名前を表示する",
					"显示管理员姓名",
				],
				displaySuperChatAuthor: [
					"Show super chat author",
					"スパチャの作成者を表示する",
					"显示超级留言作者",
				],
				createChats: ["Create flowing chats", "チャットを流す", "创建弹幕"],
				textOnly: [
					"Text only(ignore emojis)",
					"文字のみ(絵文字を無視する)",
					"仅文本(忽略表情符号)",
				],
				error: ["Error", "エラー", "错误"],
				video: ["Video", "画面", "视频"],
				chatField: ["Chat Window", "チャット欄", "聊天窗口"],
				useStepTiming: [
					"Move chat in steps",
					"チャットを段階的に動かす",
					"按步骤移动弹幕",
				],
				timingStepCount: ["└Step Count", "└段階数", "└步骤数"],
				chatFilter: ["Chat Filter", "チャットフィルター", "聊天过滤器"],
				flowChat: ["Flow Chat", "チャット流れ", "聊天弹幕"],
				clearFlowChats: [
					"Clear Flowing Chats",
					"流れるチャットをクリアする",
					"清除弹幕",
				],
				flowNewChatIf: [
					"A new chat will appear if all of the followings are met:",
					"新しいチャットは以下のすべてを満たす場合に流れます:",
					"如果满足以下所有条件,新弹幕会出现:",
				],
				noOverlap: [
					"└Chats won't overlap",
					"└他のチャットと重ならない",
					"└弹幕不会重叠",
				],
				minSpacing: [
					"Min spacing between chats",
					"チャットの最小間隔",
					"弹幕间的最小间距",
				],
				fieldScale: ["Scale", "拡大率", "缩放比例"],
				copy: ["Copy", "コピーする", "复制"],
				showChats: ["Show chats", "チャットを表示する", "显示弹幕"],
				hideChats: ["Hide chats", "チャットを非表示にする", "隐藏弹幕"],
				flowY1: ["Flow area top edge", "流れ範囲の上端", "显示区域上边缘"],
				flowY2: ["Flow area bottom edge", "流れ範囲の下端", "显示区域下边缘"],
				flowX1: ["Flow area left edge", "流れ範囲の左端", "显示区域左边缘"],
				flowX2: ["Flow area right edge", "流れ範囲の右端", "显示区域右边缘"],
				shadowColor: ["Shadow Color", "影の色", "阴影颜色"],
				invalidColor: ["Invalid color", "無効な色", "无效颜色"],
				inputNonNumberic: [
					"Input isn't a number",
					"入力値が数字でない",
					"输入值非数字",
				],
				invalidSetting: ["Invalid setting", "無効な設定値", "无效的设置值"],
				logEvents: [
					"Enable event logging",
					"イベントログを有効にする",
					"启用事件日志",
				],
				importLog: [
					"Import event log",
					"イベントログを取り込む",
					"导入事件日志",
				],
			},
			getText = key => state =>
				pipe(
					languages,
					findFirstIndex(x => x === state.lang),
					Option_map(x => Array_unsafeGet(defaultText[key], x)),
					Option_getOrElse(() => "Error"),
				)
		__webpack_require__.dn(getText)
		const languageLabels = ["English(US)", "日本語", "简体中文"],
			panelBoxStyle = width => ({
				flex: `0 0 ${width}px`,
				width: `${width}px`,
				margin: "2px",
			})
		__webpack_require__.dn(panelBoxStyle)
		const checkboxRow = (label, checked, onchange) =>
			h(
				"div",
				{},
				h("label", {}, [
					hyperapp_text(label),
					h("input", { type: "checkbox", checked, onchange }),
				]),
			)
		__webpack_require__.dn(checkboxRow)
		const checkboxNode = (getText, getState, updateBool) => label => c => s =>
			checkboxRow(getText(label)(s), getState(label)(s), updateBool(label)(c))
		__webpack_require__.dn(checkboxNode)
		const computed = {
				useStepTiming: s => isTruthy(s.timingFunction.match(/^steps\(.+/)),
			},
			getState = k => (k in computed ? computed[k] : s => s[k])
		__webpack_require__.dn(getState)
		const getKeysForIndexSignature = (input, parameter) => {
				switch (parameter._tag) {
					case "StringKeyword":
					case "TemplateLiteral":
						return Object.keys(input)
					case "SymbolKeyword":
						return Object.getOwnPropertySymbols(input)
					case "Refinement":
						return getKeysForIndexSignature(input, parameter.from)
				}
			},
			memoizeThunk = f => {
				let a,
					done = !1
				return () => {
					if (done) return a
					a = f()
					done = !0
					return a
				}
			},
			util_isNonEmpty = x => Array.isArray(x),
			formatPathKey = key => `[${formatPropertyKey(key)}]`,
			formatPath = path =>
				util_isNonEmpty(path)
					? path.map(formatPathKey).join("")
					: formatPathKey(path),
			getErrorMessage = (reason, details, path, ast) => {
				let out = reason
				path &&
					isNonEmptyReadonlyArray(path) &&
					(out += `\nat path: ${formatPath(path)}`)
				void 0 !== details && (out += `\ndetails: ${details}`)
				ast && (out += `\nschema (${ast._tag}): ${ast}`)
				return out
			},
			getASTDuplicateIndexSignatureErrorMessage = type =>
				getErrorMessage("Duplicate index signature", `${type} index signature`),
			getASTIndexSignatureParameterErrorMessage = getErrorMessage(
				"Unsupported index signature parameter",
				"An index signature parameter type must be `string`, `symbol`, a template literal type or a refinement of the previous types",
			),
			getASTRequiredElementFollowinAnOptionalElementErrorMessage =
				getErrorMessage(
					"Invalid element",
					"A required element cannot follow an optional element. ts(1257)",
				),
			TypeConstructorAnnotationId = Symbol.for(
				"effect/annotation/TypeConstructor",
			),
			BrandAnnotationId = Symbol.for("effect/annotation/Brand"),
			SchemaIdAnnotationId = Symbol.for("effect/annotation/SchemaId"),
			MessageAnnotationId = Symbol.for("effect/annotation/Message"),
			MissingMessageAnnotationId = Symbol.for(
				"effect/annotation/MissingMessage",
			),
			IdentifierAnnotationId = Symbol.for("effect/annotation/Identifier"),
			TitleAnnotationId = Symbol.for("effect/annotation/Title"),
			AutoTitleAnnotationId = Symbol.for("effect/annotation/AutoTitle"),
			DescriptionAnnotationId = Symbol.for("effect/annotation/Description"),
			ExamplesAnnotationId = Symbol.for("effect/annotation/Examples"),
			DefaultAnnotationId = Symbol.for("effect/annotation/Default"),
			JSONSchemaAnnotationId = Symbol.for("effect/annotation/JSONSchema"),
			ArbitraryAnnotationId = Symbol.for("effect/annotation/Arbitrary"),
			PrettyAnnotationId = Symbol.for("effect/annotation/Pretty"),
			EquivalenceAnnotationId = Symbol.for("effect/annotation/Equivalence"),
			DocumentationAnnotationId = Symbol.for("effect/annotation/Documentation"),
			ConcurrencyAnnotationId = Symbol.for("effect/annotation/Concurrency"),
			BatchingAnnotationId = Symbol.for("effect/annotation/Batching"),
			ParseIssueTitleAnnotationId = Symbol.for(
				"effect/annotation/ParseIssueTitle",
			),
			ParseOptionsAnnotationId = Symbol.for("effect/annotation/ParseOptions"),
			DecodingFallbackAnnotationId = Symbol.for(
				"effect/annotation/DecodingFallback",
			),
			SurrogateAnnotationId = Symbol.for("effect/annotation/Surrogate"),
			StableFilterAnnotationId = Symbol.for("effect/annotation/StableFilter"),
			getAnnotation = dual(2, (annotated, key) =>
				Object.prototype.hasOwnProperty.call(annotated.annotations, key)
					? Option_some(annotated.annotations[key])
					: Option_none(),
			),
			getBrandAnnotation = getAnnotation(BrandAnnotationId),
			getMessageAnnotation = getAnnotation(MessageAnnotationId),
			getMissingMessageAnnotation = getAnnotation(MissingMessageAnnotationId),
			getTitleAnnotation = getAnnotation(TitleAnnotationId),
			getAutoTitleAnnotation = getAnnotation(AutoTitleAnnotationId),
			getIdentifierAnnotation = getAnnotation(IdentifierAnnotationId),
			getDescriptionAnnotation = getAnnotation(DescriptionAnnotationId),
			getConcurrencyAnnotation = getAnnotation(ConcurrencyAnnotationId),
			getBatchingAnnotation = getAnnotation(BatchingAnnotationId),
			getParseIssueTitleAnnotation = getAnnotation(ParseIssueTitleAnnotationId),
			getParseOptionsAnnotation = getAnnotation(ParseOptionsAnnotationId),
			getDecodingFallbackAnnotation = getAnnotation(
				DecodingFallbackAnnotationId,
			),
			getSurrogateAnnotation = getAnnotation(SurrogateAnnotationId),
			getStableFilterAnnotation = getAnnotation(StableFilterAnnotationId),
			hasStableFilter = annotated =>
				exists(getStableFilterAnnotation(annotated), b => !0 === b),
			JSONIdentifierAnnotationId = Symbol.for(
				"effect/annotation/JSONIdentifier",
			),
			getJSONIdentifierAnnotation = getAnnotation(JSONIdentifierAnnotationId)
		class Declaration {
			typeParameters
			decodeUnknown
			encodeUnknown
			annotations
			_tag = "Declaration"
			constructor(
				typeParameters,
				decodeUnknown,
				encodeUnknown,
				annotations = {},
			) {
				this.typeParameters = typeParameters
				this.decodeUnknown = decodeUnknown
				this.encodeUnknown = encodeUnknown
				this.annotations = annotations
			}
			toString() {
				return Option_getOrElse(getExpected(this), () => "<declaration schema>")
			}
			toJSON() {
				return {
					_tag: this._tag,
					typeParameters: this.typeParameters.map(ast => ast.toJSON()),
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const createASTGuard = tag => ast => ast._tag === tag
		class Literal {
			literal
			annotations
			_tag = "Literal"
			constructor(literal, annotations = {}) {
				this.literal = literal
				this.annotations = annotations
			}
			toString() {
				return Option_getOrElse(getExpected(this), () =>
					formatUnknown(this.literal),
				)
			}
			toJSON() {
				return {
					_tag: this._tag,
					literal: isBigInt(this.literal) ? String(this.literal) : this.literal,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const isLiteral = createASTGuard("Literal")
		class UniqueSymbol {
			symbol
			annotations
			_tag = "UniqueSymbol"
			constructor(symbol, annotations = {}) {
				this.symbol = symbol
				this.annotations = annotations
			}
			toString() {
				return Option_getOrElse(getExpected(this), () =>
					formatUnknown(this.symbol),
				)
			}
			toJSON() {
				return {
					_tag: this._tag,
					symbol: String(this.symbol),
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		class NeverKeyword {
			annotations
			_tag = "NeverKeyword"
			constructor(annotations = {}) {
				this.annotations = annotations
			}
			toString() {
				return formatKeyword(this)
			}
			toJSON() {
				return {
					_tag: this._tag,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const neverKeyword = new NeverKeyword({ [TitleAnnotationId]: "never" })
		class UnknownKeyword {
			annotations
			_tag = "UnknownKeyword"
			constructor(annotations = {}) {
				this.annotations = annotations
			}
			toString() {
				return formatKeyword(this)
			}
			toJSON() {
				return {
					_tag: this._tag,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const unknownKeyword = new UnknownKeyword({
			[TitleAnnotationId]: "unknown",
		})
		class AnyKeyword {
			annotations
			_tag = "AnyKeyword"
			constructor(annotations = {}) {
				this.annotations = annotations
			}
			toString() {
				return formatKeyword(this)
			}
			toJSON() {
				return {
					_tag: this._tag,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const anyKeyword = new AnyKeyword({ [TitleAnnotationId]: "any" }),
			isStringKeyword = createASTGuard("StringKeyword"),
			isSymbolKeyword = createASTGuard("SymbolKeyword")
		class Type {
			type
			annotations
			constructor(type, annotations = {}) {
				this.type = type
				this.annotations = annotations
			}
			toJSON() {
				return {
					type: this.type.toJSON(),
					annotations: toJSONAnnotations(this.annotations),
				}
			}
			toString() {
				return String(this.type)
			}
		}
		class OptionalType extends Type {
			isOptional
			constructor(type, isOptional, annotations = {}) {
				super(type, annotations)
				this.isOptional = isOptional
			}
			toJSON() {
				return {
					type: this.type.toJSON(),
					isOptional: this.isOptional,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
			toString() {
				return String(this.type) + (this.isOptional ? "?" : "")
			}
		}
		const getRestASTs = rest => rest.map(annotatedAST => annotatedAST.type)
		class TupleType {
			elements
			rest
			isReadonly
			annotations
			_tag = "TupleType"
			constructor(elements, rest, isReadonly, annotations = {}) {
				this.elements = elements
				this.rest = rest
				this.isReadonly = isReadonly
				this.annotations = annotations
				let hasOptionalElement = !1,
					hasIllegalRequiredElement = !1
				for (const e of elements)
					if (e.isOptional) hasOptionalElement = !0
					else if (hasOptionalElement) {
						hasIllegalRequiredElement = !0
						break
					}
				if (
					hasIllegalRequiredElement ||
					(hasOptionalElement && rest.length > 1)
				)
					throw new Error(
						getASTRequiredElementFollowinAnOptionalElementErrorMessage,
					)
			}
			toString() {
				return Option_getOrElse(getExpected(this), () => formatTuple(this))
			}
			toJSON() {
				return {
					_tag: this._tag,
					elements: this.elements.map(e => e.toJSON()),
					rest: this.rest.map(ast => ast.toJSON()),
					isReadonly: this.isReadonly,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const formatTuple = ast => {
			const formattedElements = ast.elements.map(String).join(", ")
			return matchLeft(ast.rest, {
				onEmpty: () => `readonly [${formattedElements}]`,
				onNonEmpty: (head, tail) => {
					const formattedHead = String(head),
						wrappedHead = formattedHead.includes(" | ")
							? `(${formattedHead})`
							: formattedHead
					if (tail.length > 0) {
						const formattedTail = tail.map(String).join(", ")
						return ast.elements.length > 0
							? `readonly [${formattedElements}, ...${wrappedHead}[], ${formattedTail}]`
							: `readonly [...${wrappedHead}[], ${formattedTail}]`
					}
					return ast.elements.length > 0
						? `readonly [${formattedElements}, ...${wrappedHead}[]]`
						: `ReadonlyArray<${formattedHead}>`
				},
			})
		}
		class PropertySignature extends OptionalType {
			name
			isReadonly
			constructor(name, type, isOptional, isReadonly, annotations) {
				super(type, isOptional, annotations)
				this.name = name
				this.isReadonly = isReadonly
			}
			toString() {
				return (
					(this.isReadonly ? "readonly " : "") +
					String(this.name) +
					(this.isOptional ? "?" : "") +
					": " +
					this.type
				)
			}
			toJSON() {
				return {
					name: String(this.name),
					type: this.type.toJSON(),
					isOptional: this.isOptional,
					isReadonly: this.isReadonly,
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const isParameter = ast => {
			switch (ast._tag) {
				case "StringKeyword":
				case "SymbolKeyword":
				case "TemplateLiteral":
					return !0
				case "Refinement":
					return isParameter(ast.from)
			}
			return !1
		}
		class IndexSignature {
			type
			isReadonly
			parameter
			constructor(parameter, type, isReadonly) {
				this.type = type
				this.isReadonly = isReadonly
				if (!isParameter(parameter))
					throw new Error(getASTIndexSignatureParameterErrorMessage)
				this.parameter = parameter
			}
			toString() {
				return (
					(this.isReadonly ? "readonly " : "") +
					`[x: ${this.parameter}]: ${this.type}`
				)
			}
			toJSON() {
				return {
					parameter: this.parameter.toJSON(),
					type: this.type.toJSON(),
					isReadonly: this.isReadonly,
				}
			}
		}
		class TypeLiteral {
			annotations
			_tag = "TypeLiteral"
			propertySignatures
			indexSignatures
			constructor(propertySignatures, indexSignatures, annotations = {}) {
				this.annotations = annotations
				const keys = {}
				for (let i = 0; i < propertySignatures.length; i++) {
					const name = propertySignatures[i].name
					if (Object.prototype.hasOwnProperty.call(keys, name))
						throw new Error(
							getErrorMessage(
								"Duplicate property signature",
								`Duplicate key ${formatUnknown(name)}`,
							),
						)
					keys[name] = null
				}
				const parameters = { string: !1, symbol: !1 }
				for (let i = 0; i < indexSignatures.length; i++) {
					const encodedParameter = getEncodedParameter(
						indexSignatures[i].parameter,
					)
					if (isStringKeyword(encodedParameter)) {
						if (parameters.string)
							throw new Error(
								getASTDuplicateIndexSignatureErrorMessage("string"),
							)
						parameters.string = !0
					} else if (isSymbolKeyword(encodedParameter)) {
						if (parameters.symbol)
							throw new Error(
								getASTDuplicateIndexSignatureErrorMessage("symbol"),
							)
						parameters.symbol = !0
					}
				}
				this.propertySignatures = propertySignatures
				this.indexSignatures = indexSignatures
			}
			toString() {
				return Option_getOrElse(getExpected(this), () =>
					formatTypeLiteral(this),
				)
			}
			toJSON() {
				return {
					_tag: this._tag,
					propertySignatures: this.propertySignatures.map(ps => ps.toJSON()),
					indexSignatures: this.indexSignatures.map(ps => ps.toJSON()),
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const formatIndexSignatures = iss => iss.map(String).join("; "),
			formatTypeLiteral = ast => {
				if (ast.propertySignatures.length > 0) {
					const pss = ast.propertySignatures.map(String).join("; ")
					return ast.indexSignatures.length > 0
						? `{ ${pss}; ${formatIndexSignatures(ast.indexSignatures)} }`
						: `{ ${pss} }`
				}
				return ast.indexSignatures.length > 0
					? `{ ${formatIndexSignatures(ast.indexSignatures)} }`
					: "{}"
			},
			sortCandidates = sort(
				Order_mapInput(Number_Order, ast => {
					switch (ast._tag) {
						case "AnyKeyword":
							return 0
						case "UnknownKeyword":
							return 1
						case "ObjectKeyword":
							return 2
						case "StringKeyword":
						case "NumberKeyword":
						case "BooleanKeyword":
						case "BigIntKeyword":
						case "SymbolKeyword":
							return 3
					}
					return 4
				}),
			),
			literalMap = {
				string: "StringKeyword",
				number: "NumberKeyword",
				boolean: "BooleanKeyword",
				bigint: "BigIntKeyword",
			},
			SchemaAST_flatten = candidates =>
				Array_flatMap(candidates, ast =>
					isUnion(ast) ? SchemaAST_flatten(ast.types) : [ast],
				)
		class Union {
			types
			annotations
			static make = (types, annotations) =>
				isMembers(types)
					? new Union(types, annotations)
					: 1 === types.length
						? types[0]
						: neverKeyword
			static unify = (candidates, annotations) =>
				Union.make(
					(candidates => {
						const cs = sortCandidates(candidates),
							out = [],
							uniques = {},
							literals = []
						for (const ast of cs)
							switch (ast._tag) {
								case "NeverKeyword":
									break
								case "AnyKeyword":
									return [anyKeyword]
								case "UnknownKeyword":
									return [unknownKeyword]
								case "ObjectKeyword":
								case "UndefinedKeyword":
								case "VoidKeyword":
								case "StringKeyword":
								case "NumberKeyword":
								case "BooleanKeyword":
								case "BigIntKeyword":
								case "SymbolKeyword":
									if (!uniques[ast._tag]) {
										uniques[ast._tag] = ast
										out.push(ast)
									}
									break
								case "Literal": {
									const type = typeof ast.literal
									switch (type) {
										case "string":
										case "number":
										case "bigint":
										case "boolean":
											if (
												!uniques[literalMap[type]] &&
												!literals.includes(ast.literal)
											) {
												literals.push(ast.literal)
												out.push(ast)
											}
											break
										case "object":
											if (!literals.includes(ast.literal)) {
												literals.push(ast.literal)
												out.push(ast)
											}
									}
									break
								}
								case "UniqueSymbol":
									if (
										!uniques.SymbolKeyword &&
										!literals.includes(ast.symbol)
									) {
										literals.push(ast.symbol)
										out.push(ast)
									}
									break
								case "TupleType":
									uniques.ObjectKeyword || out.push(ast)
									break
								case "TypeLiteral":
									if (
										0 === ast.propertySignatures.length &&
										0 === ast.indexSignatures.length
									) {
										if (!uniques["{}"]) {
											uniques["{}"] = ast
											out.push(ast)
										}
									} else uniques.ObjectKeyword || out.push(ast)
									break
								default:
									out.push(ast)
							}
						return out
					})(SchemaAST_flatten(candidates)),
					annotations,
				)
			_tag = "Union"
			constructor(types, annotations = {}) {
				this.types = types
				this.annotations = annotations
			}
			toString() {
				return Option_getOrElse(getExpected(this), () =>
					this.types.map(String).join(" | "),
				)
			}
			toJSON() {
				return {
					_tag: this._tag,
					types: this.types.map(ast => ast.toJSON()),
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const isMembers = as => as.length > 1,
			isUnion = createASTGuard("Union"),
			toJSONMemoMap = globalValue(
				Symbol.for("effect/Schema/AST/toJSONMemoMap"),
				() => new WeakMap(),
			)
		class Suspend {
			f
			annotations
			_tag = "Suspend"
			constructor(f, annotations = {}) {
				this.f = f
				this.annotations = annotations
				this.f = memoizeThunk(f)
			}
			toString() {
				return getExpected(this).pipe(
					Option_orElse(() =>
						Option_flatMap(
							(
								f =>
								(...a) => {
									try {
										return Option_some(f(...a))
									} catch {
										return Option_none()
									}
								}
							)(this.f)(),
							ast => getExpected(ast),
						),
					),
					Option_getOrElse(() => "<suspended schema>"),
				)
			}
			toJSON() {
				const ast = this.f()
				let out = toJSONMemoMap.get(ast)
				if (out) return out
				toJSONMemoMap.set(ast, { _tag: this._tag })
				out = {
					_tag: this._tag,
					ast: ast.toJSON(),
					annotations: toJSONAnnotations(this.annotations),
				}
				toJSONMemoMap.set(ast, out)
				return out
			}
		}
		class Refinement {
			from
			filter
			annotations
			_tag = "Refinement"
			constructor(from, filter, annotations = {}) {
				this.from = from
				this.filter = filter
				this.annotations = annotations
			}
			toString() {
				return getIdentifierAnnotation(this).pipe(
					Option_getOrElse(() =>
						Option_match(getOrElseExpected(this), {
							onNone: () => `{ ${this.from} | filter }`,
							onSome: expected =>
								isRefinement(this.from)
									? String(this.from) + " & " + expected
									: expected,
						}),
					),
				)
			}
			toJSON() {
				return {
					_tag: this._tag,
					from: this.from.toJSON(),
					annotations: toJSONAnnotations(this.annotations),
				}
			}
		}
		const isRefinement = createASTGuard("Refinement"),
			defaultParseOption = {},
			SchemaAST_annotations = (ast, overrides) => {
				const d = Object.getOwnPropertyDescriptors(ast),
					base = { ...ast.annotations }
				delete base[IdentifierAnnotationId]
				const value = { ...base, ...overrides },
					surrogate = getSurrogateAnnotation(ast)
				Option_isSome(surrogate) &&
					(value[SurrogateAnnotationId] = SchemaAST_annotations(
						surrogate.value,
						overrides,
					))
				d.annotations.value = value
				return Object.create(Object.getPrototypeOf(ast), d)
			},
			getTemplateLiteralSpanTypePattern = (type, capture) => {
				switch (type._tag) {
					case "Literal":
						return RegExp_escape(String(type.literal))
					case "StringKeyword":
						return "[\\s\\S]*?"
					case "NumberKeyword":
						return "[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?"
					case "TemplateLiteral":
						return getTemplateLiteralPattern(type, capture, !1)
					case "Union":
						return type.types
							.map(type => getTemplateLiteralSpanTypePattern(type, capture))
							.join("|")
				}
			},
			handleTemplateLiteralSpanTypeParens = (type, s, capture, top) => {
				if (isUnion(type)) {
					if (capture && !top) return `(?:${s})`
				} else if (!capture || !top) return s
				return `(${s})`
			},
			getTemplateLiteralPattern = (ast, capture, top) => {
				let pattern = ""
				if ("" !== ast.head) {
					const head = RegExp_escape(ast.head)
					pattern += capture && top ? `(${head})` : head
				}
				for (const span of ast.spans) {
					const spanPattern = getTemplateLiteralSpanTypePattern(
						span.type,
						capture,
					)
					pattern += handleTemplateLiteralSpanTypeParens(
						span.type,
						spanPattern,
						capture,
						top,
					)
					if ("" !== span.literal) {
						const literal = RegExp_escape(span.literal)
						pattern += capture && top ? `(${literal})` : literal
					}
				}
				return pattern
			},
			preserveTransformationAnnotations = (annotationIds => annotated => {
				let out
				for (const id of annotationIds)
					if (Object.prototype.hasOwnProperty.call(annotated.annotations, id)) {
						void 0 === out && (out = {})
						out[id] = annotated.annotations[id]
					}
				return out
			})([
				ExamplesAnnotationId,
				DefaultAnnotationId,
				JSONSchemaAnnotationId,
				ArbitraryAnnotationId,
				PrettyAnnotationId,
				EquivalenceAnnotationId,
			]),
			typeAST = ast => {
				switch (ast._tag) {
					case "Declaration": {
						const typeParameters = changeMap(ast.typeParameters, typeAST)
						return typeParameters === ast.typeParameters
							? ast
							: new Declaration(
									typeParameters,
									ast.decodeUnknown,
									ast.encodeUnknown,
									ast.annotations,
								)
					}
					case "TupleType": {
						const elements = changeMap(ast.elements, e => {
								const type = typeAST(e.type)
								return type === e.type
									? e
									: new OptionalType(type, e.isOptional)
							}),
							restASTs = getRestASTs(ast.rest),
							rest = changeMap(restASTs, typeAST)
						return elements === ast.elements && rest === restASTs
							? ast
							: new TupleType(
									elements,
									rest.map(type => new Type(type)),
									ast.isReadonly,
									ast.annotations,
								)
					}
					case "TypeLiteral": {
						const propertySignatures = changeMap(ast.propertySignatures, p => {
								const type = typeAST(p.type)
								return type === p.type
									? p
									: new PropertySignature(
											p.name,
											type,
											p.isOptional,
											p.isReadonly,
										)
							}),
							indexSignatures = changeMap(ast.indexSignatures, is => {
								const type = typeAST(is.type)
								return type === is.type
									? is
									: new IndexSignature(is.parameter, type, is.isReadonly)
							})
						return propertySignatures === ast.propertySignatures &&
							indexSignatures === ast.indexSignatures
							? ast
							: new TypeLiteral(
									propertySignatures,
									indexSignatures,
									ast.annotations,
								)
					}
					case "Union": {
						const types = changeMap(ast.types, typeAST)
						return types === ast.types
							? ast
							: Union.make(types, ast.annotations)
					}
					case "Suspend":
						return new Suspend(() => typeAST(ast.f()), ast.annotations)
					case "Refinement": {
						const from = typeAST(ast.from)
						return from === ast.from
							? ast
							: new Refinement(from, ast.filter, ast.annotations)
					}
					case "Transformation": {
						const preserve = preserveTransformationAnnotations(ast)
						return typeAST(
							void 0 !== preserve
								? SchemaAST_annotations(ast.to, preserve)
								: ast.to,
						)
					}
				}
				return ast
			}
		function changeMap(as, f) {
			let changed = !1
			const out = allocate(as.length)
			for (let i = 0; i < as.length; i++) {
				const a = as[i],
					fa = f(a)
				fa !== a && (changed = !0)
				out[i] = fa
			}
			return changed ? out : as
		}
		const getTransformationFrom = ast => {
				switch (ast._tag) {
					case "Transformation":
						return ast.from
					case "Refinement":
						return getTransformationFrom(ast.from)
					case "Suspend":
						return getTransformationFrom(ast.f())
				}
			},
			encodedAST_ = (ast, isBound) => {
				switch (ast._tag) {
					case "Declaration": {
						const typeParameters = changeMap(ast.typeParameters, ast =>
							encodedAST_(ast, isBound),
						)
						return typeParameters === ast.typeParameters
							? ast
							: new Declaration(
									typeParameters,
									ast.decodeUnknown,
									ast.encodeUnknown,
								)
					}
					case "TupleType": {
						const elements = changeMap(ast.elements, e => {
								const type = encodedAST_(e.type, isBound)
								return type === e.type
									? e
									: new OptionalType(type, e.isOptional)
							}),
							restASTs = getRestASTs(ast.rest),
							rest = changeMap(restASTs, ast => encodedAST_(ast, isBound))
						return elements === ast.elements && rest === restASTs
							? ast
							: new TupleType(
									elements,
									rest.map(ast => new Type(ast)),
									ast.isReadonly,
								)
					}
					case "TypeLiteral": {
						const propertySignatures = changeMap(ast.propertySignatures, ps => {
								const type = encodedAST_(ps.type, isBound)
								return type === ps.type
									? ps
									: new PropertySignature(
											ps.name,
											type,
											ps.isOptional,
											ps.isReadonly,
										)
							}),
							indexSignatures = changeMap(ast.indexSignatures, is => {
								const type = encodedAST_(is.type, isBound)
								return type === is.type
									? is
									: new IndexSignature(is.parameter, type, is.isReadonly)
							})
						return propertySignatures === ast.propertySignatures &&
							indexSignatures === ast.indexSignatures
							? ast
							: new TypeLiteral(propertySignatures, indexSignatures)
					}
					case "Union": {
						const types = changeMap(ast.types, ast => encodedAST_(ast, isBound))
						return types === ast.types ? ast : Union.make(types)
					}
					case "Suspend": {
						let borrowedAnnotations
						const identifier = Option_orElse(
							getJSONIdentifierAnnotation((annotated = ast)),
							() => getIdentifierAnnotation(annotated),
						)
						if (Option_isSome(identifier)) {
							const suffix = isBound ? "Bound" : ""
							borrowedAnnotations = {
								[JSONIdentifierAnnotationId]: `${identifier.value}Encoded${suffix}`,
							}
						}
						return new Suspend(
							() => encodedAST_(ast.f(), isBound),
							borrowedAnnotations,
						)
					}
					case "Refinement": {
						const from = encodedAST_(ast.from, isBound)
						return isBound
							? from === ast.from
								? ast
								: void 0 === getTransformationFrom(ast.from) &&
									  hasStableFilter(ast)
									? new Refinement(from, ast.filter, ast.annotations)
									: from
							: from
					}
					case "Transformation":
						return encodedAST_(ast.from, isBound)
				}
				var annotated
				return ast
			},
			encodedAST = ast => encodedAST_(ast, !1),
			toJSONAnnotations = annotations => {
				const out = {}
				for (const k of Object.getOwnPropertySymbols(annotations))
					out[String(k)] = annotations[k]
				return out
			},
			getEncodedParameter = ast => {
				switch (ast._tag) {
					case "StringKeyword":
					case "SymbolKeyword":
					case "TemplateLiteral":
						return ast
					case "Refinement":
						return getEncodedParameter(ast.from)
				}
			},
			formatKeyword = ast => Option_getOrElse(getExpected(ast), () => ast._tag),
			getOrElseExpected = ast =>
				getTitleAnnotation(ast).pipe(
					Option_orElse(() => getDescriptionAnnotation(ast)),
					Option_orElse(() => getAutoTitleAnnotation(ast)),
					Option_map(
						s =>
							s +
							(function (ast) {
								return Option_match(getBrandAnnotation(ast), {
									onNone: () => "",
									onSome: brands =>
										brands
											.map(brand => ` & Brand<${formatUnknown(brand)}>`)
											.join(""),
								})
							})(ast),
					),
				),
			getExpected = ast =>
				Option_orElse(getIdentifierAnnotation(ast), () =>
					getOrElseExpected(ast),
				)
		class Pointer {
			path
			actual
			issue
			_tag = "Pointer"
			constructor(path, actual, issue) {
				this.path = path
				this.actual = actual
				this.issue = issue
			}
		}
		class Unexpected {
			actual
			message
			_tag = "Unexpected"
			constructor(actual, message) {
				this.actual = actual
				this.message = message
			}
		}
		class Missing {
			ast
			message
			_tag = "Missing"
			actual = void 0
			constructor(ast, message) {
				this.ast = ast
				this.message = message
			}
		}
		class ParseResult_Composite {
			ast
			actual
			issues
			output
			_tag = "Composite"
			constructor(ast, actual, issues, output) {
				this.ast = ast
				this.actual = actual
				this.issues = issues
				this.output = output
			}
		}
		class ParseResult_Refinement {
			ast
			actual
			kind
			issue
			_tag = "Refinement"
			constructor(ast, actual, kind, issue) {
				this.ast = ast
				this.actual = actual
				this.kind = kind
				this.issue = issue
			}
		}
		class ParseResult_Transformation {
			ast
			actual
			kind
			issue
			_tag = "Transformation"
			constructor(ast, actual, kind, issue) {
				this.ast = ast
				this.actual = actual
				this.kind = kind
				this.issue = issue
			}
		}
		class ParseResult_Type {
			ast
			actual
			message
			_tag = "Type"
			constructor(ast, actual, message) {
				this.ast = ast
				this.actual = actual
				this.message = message
			}
		}
		class Forbidden {
			ast
			actual
			message
			_tag = "Forbidden"
			constructor(ast, actual, message) {
				this.ast = ast
				this.actual = actual
				this.message = message
			}
		}
		const ParseResult_ParseErrorTypeId = Symbol.for(
			"effect/Schema/ParseErrorTypeId",
		)
		class ParseResult_ParseError extends Data_TaggedError("ParseError") {
			[ParseResult_ParseErrorTypeId] = ParseResult_ParseErrorTypeId
			get message() {
				return this.toString()
			}
			toString() {
				return TreeFormatter.formatIssueSync(this.issue)
			}
			toJSON() {
				return { _id: "ParseError", message: this.toString() }
			}
			[NodeInspectSymbol]() {
				return this.toJSON()
			}
		}
		const parseError = issue => new ParseResult_ParseError({ issue }),
			ParseResult_succeed = Either_right,
			ParseResult_fail = Either_left,
			ParseResult_isEither = Either_isEither,
			ParseResult_flatMap = dual(2, (self, f) =>
				ParseResult_isEither(self)
					? match(self, { onLeft: Either_left, onRight: f })
					: Effect_flatMap(self, f),
			),
			ParseResult_map = dual(2, (self, f) =>
				ParseResult_isEither(self) ? map(self, f) : Effect_map(self, f),
			),
			ParseResult_mapError = dual(2, (self, f) =>
				ParseResult_isEither(self)
					? mapLeft(self, f)
					: Effect_mapError(self, f),
			),
			ParseResult_orElse = dual(2, (self, f) =>
				ParseResult_isEither(self)
					? match(self, { onLeft: f, onRight: Either_right })
					: Effect_catchAll(self, f),
			),
			mergeInternalOptions = (options, overrideOptions) =>
				void 0 === overrideOptions || isNumber(overrideOptions)
					? options
					: void 0 === options
						? overrideOptions
						: { ...options, ...overrideOptions },
			decodeUnknownSync = (schema, options) =>
				((ast, isDecoding, options) => {
					const parser = ((ast, isDecoding, options) => {
						const parser = goMemo(ast, isDecoding)
						return (u, overrideOptions) =>
							parser(u, mergeInternalOptions(options, overrideOptions))
					})(ast, isDecoding, options)
					return (input, overrideOptions) =>
						getOrThrowWith(parser(input, overrideOptions), parseError)
				})(schema.ast, !0, options),
			decodeMemoMap = globalValue(
				Symbol.for("effect/ParseResult/decodeMemoMap"),
				() => new WeakMap(),
			),
			encodeMemoMap = globalValue(
				Symbol.for("effect/ParseResult/encodeMemoMap"),
				() => new WeakMap(),
			),
			goMemo = (ast, isDecoding) => {
				const memoMap = isDecoding ? decodeMemoMap : encodeMemoMap,
					memo = memoMap.get(ast)
				if (memo) return memo
				const raw = go(ast, isDecoding),
					parseOptionsAnnotation = getParseOptionsAnnotation(ast),
					parserWithOptions = Option_isSome(parseOptionsAnnotation)
						? (i, options) =>
								raw(
									i,
									mergeInternalOptions(options, parseOptionsAnnotation.value),
								)
						: raw,
					decodingFallbackAnnotation = getDecodingFallbackAnnotation(ast),
					parser =
						isDecoding && Option_isSome(decodingFallbackAnnotation)
							? (i, options) =>
									handleForbidden(
										ParseResult_orElse(
											parserWithOptions(i, options),
											decodingFallbackAnnotation.value,
										),
										ast,
										i,
										options,
									)
							: parserWithOptions
				memoMap.set(ast, parser)
				return parser
			},
			getConcurrency = ast =>
				Option_getOrUndefined(getConcurrencyAnnotation(ast)),
			getBatching = ast => Option_getOrUndefined(getBatchingAnnotation(ast)),
			go = (ast, isDecoding) => {
				switch (ast._tag) {
					case "Refinement":
						if (isDecoding) {
							const from = goMemo(ast.from, !0)
							return (i, options) => {
								options = options ?? defaultParseOption
								const allErrors = "all" === options?.errors,
									result = ParseResult_flatMap(
										ParseResult_orElse(from(i, options), ef => {
											const issue = new ParseResult_Refinement(
												ast,
												i,
												"From",
												ef,
											)
											return allErrors &&
												hasStableFilter(ast) &&
												ParseResult_isComposite(ef)
												? Option_match(ast.filter(i, options, ast), {
														onNone: () => Either_left(issue),
														onSome: ep =>
															Either_left(
																new ParseResult_Composite(ast, i, [
																	issue,
																	new ParseResult_Refinement(
																		ast,
																		i,
																		"Predicate",
																		ep,
																	),
																]),
															),
													})
												: Either_left(issue)
										}),
										a =>
											Option_match(ast.filter(a, options, ast), {
												onNone: () => Either_right(a),
												onSome: ep =>
													Either_left(
														new ParseResult_Refinement(ast, i, "Predicate", ep),
													),
											}),
									)
								return handleForbidden(result, ast, i, options)
							}
						}
						{
							const from = goMemo(typeAST(ast), !0),
								to = goMemo(dropRightRefinement(ast.from), !1)
							return (i, options) =>
								handleForbidden(
									ParseResult_flatMap(from(i, options), a => to(a, options)),
									ast,
									i,
									options,
								)
						}
					case "Transformation": {
						const transform = getFinalTransformation(
								ast.transformation,
								isDecoding,
							),
							from = isDecoding ? goMemo(ast.from, !0) : goMemo(ast.to, !1),
							to = isDecoding ? goMemo(ast.to, !0) : goMemo(ast.from, !1)
						return (i, options) =>
							handleForbidden(
								ParseResult_flatMap(
									ParseResult_mapError(
										from(i, options),
										e =>
											new ParseResult_Transformation(
												ast,
												i,
												isDecoding ? "Encoded" : "Type",
												e,
											),
									),
									a =>
										ParseResult_flatMap(
											ParseResult_mapError(
												transform(a, options ?? defaultParseOption, ast, i),
												e =>
													new ParseResult_Transformation(
														ast,
														i,
														"Transformation",
														e,
													),
											),
											i2 =>
												ParseResult_mapError(
													to(i2, options),
													e =>
														new ParseResult_Transformation(
															ast,
															i,
															isDecoding ? "Type" : "Encoded",
															e,
														),
												),
										),
								),
								ast,
								i,
								options,
							)
					}
					case "Declaration": {
						const parse = isDecoding
							? ast.decodeUnknown(...ast.typeParameters)
							: ast.encodeUnknown(...ast.typeParameters)
						return (i, options) =>
							handleForbidden(
								parse(i, options ?? defaultParseOption, ast),
								ast,
								i,
								options,
							)
					}
					case "Literal":
						return fromRefinement(ast, u => u === ast.literal)
					case "UniqueSymbol":
						return fromRefinement(ast, u => u === ast.symbol)
					case "UndefinedKeyword":
						return fromRefinement(ast, isUndefined)
					case "NeverKeyword":
						return fromRefinement(ast, isNever)
					case "UnknownKeyword":
					case "AnyKeyword":
					case "VoidKeyword":
						return Either_right
					case "StringKeyword":
						return fromRefinement(ast, isString)
					case "NumberKeyword":
						return fromRefinement(ast, isNumber)
					case "BooleanKeyword":
						return fromRefinement(ast, isBoolean)
					case "BigIntKeyword":
						return fromRefinement(ast, isBigInt)
					case "SymbolKeyword":
						return fromRefinement(ast, isSymbol)
					case "ObjectKeyword":
						return fromRefinement(ast, isObject)
					case "Enums":
						return fromRefinement(ast, u =>
							ast.enums.some(([_, value]) => value === u),
						)
					case "TemplateLiteral": {
						const regex = (ast =>
							new RegExp(`^${getTemplateLiteralPattern(ast, !1, !0)}$`))(ast)
						return fromRefinement(ast, u => isString(u) && regex.test(u))
					}
					case "TupleType": {
						const elements = ast.elements.map(e => goMemo(e.type, isDecoding)),
							rest = ast.rest.map(annotatedAST =>
								goMemo(annotatedAST.type, isDecoding),
							)
						let requiredTypes = ast.elements.filter(e => !e.isOptional)
						ast.rest.length > 0 &&
							(requiredTypes = requiredTypes.concat(ast.rest.slice(1)))
						const requiredLen = requiredTypes.length,
							expectedIndexes =
								ast.elements.length > 0
									? ast.elements.map((_, i) => i).join(" | ")
									: "never",
							concurrency = getConcurrency(ast),
							batching = getBatching(ast)
						return (input, options) => {
							if (!isArray(input))
								return Either_left(new ParseResult_Type(ast, input))
							const allErrors = "all" === options?.errors,
								es = []
							let stepKey = 0
							const output = [],
								len = input.length
							for (let i = len; i <= requiredLen - 1; i++) {
								const e = new Pointer(
									i,
									input,
									new Missing(requiredTypes[i - len]),
								)
								if (!allErrors)
									return Either_left(
										new ParseResult_Composite(ast, input, e, output),
									)
								es.push([stepKey++, e])
							}
							if (0 === ast.rest.length)
								for (let i = ast.elements.length; i <= len - 1; i++) {
									const e = new Pointer(
										i,
										input,
										new Unexpected(
											input[i],
											`is unexpected, expected: ${expectedIndexes}`,
										),
									)
									if (!allErrors)
										return Either_left(
											new ParseResult_Composite(ast, input, e, output),
										)
									es.push([stepKey++, e])
								}
							let queue,
								i = 0
							for (; i < elements.length; i++)
								if (len < i + 1) {
									if (ast.elements[i].isOptional) continue
								} else {
									const te = (0, elements[i])(input[i], options)
									if (ParseResult_isEither(te)) {
										if (Either_isLeft(te)) {
											const e = new Pointer(i, input, te.left)
											if (allErrors) {
												es.push([stepKey++, e])
												continue
											}
											return Either_left(
												new ParseResult_Composite(
													ast,
													input,
													e,
													sortByIndex(output),
												),
											)
										}
										output.push([stepKey++, te.right])
									} else {
										const nk = stepKey++,
											index = i
										queue || (queue = [])
										queue.push(({ es, output }) =>
											Effect_flatMap(Effect_either(te), t => {
												if (Either_isLeft(t)) {
													const e = new Pointer(index, input, t.left)
													if (allErrors) {
														es.push([nk, e])
														return _void
													}
													return Either_left(
														new ParseResult_Composite(
															ast,
															input,
															e,
															sortByIndex(output),
														),
													)
												}
												output.push([nk, t.right])
												return _void
											}),
										)
									}
								}
							if (isNonEmptyReadonlyArray(rest)) {
								const [head, ...tail] = rest
								for (; i < len - tail.length; i++) {
									const te = head(input[i], options)
									if (ParseResult_isEither(te)) {
										if (Either_isLeft(te)) {
											const e = new Pointer(i, input, te.left)
											if (allErrors) {
												es.push([stepKey++, e])
												continue
											}
											return Either_left(
												new ParseResult_Composite(
													ast,
													input,
													e,
													sortByIndex(output),
												),
											)
										}
										output.push([stepKey++, te.right])
									} else {
										const nk = stepKey++,
											index = i
										queue || (queue = [])
										queue.push(({ es, output }) =>
											Effect_flatMap(Effect_either(te), t => {
												if (Either_isLeft(t)) {
													const e = new Pointer(index, input, t.left)
													if (allErrors) {
														es.push([nk, e])
														return _void
													}
													return Either_left(
														new ParseResult_Composite(
															ast,
															input,
															e,
															sortByIndex(output),
														),
													)
												}
												output.push([nk, t.right])
												return _void
											}),
										)
									}
								}
								for (let j = 0; j < tail.length; j++) {
									const index = i + j
									if (!(len < index + 1)) {
										const te = tail[j](input[index], options)
										if (ParseResult_isEither(te)) {
											if (Either_isLeft(te)) {
												const e = new Pointer(index, input, te.left)
												if (allErrors) {
													es.push([stepKey++, e])
													continue
												}
												return Either_left(
													new ParseResult_Composite(
														ast,
														input,
														e,
														sortByIndex(output),
													),
												)
											}
											output.push([stepKey++, te.right])
										} else {
											const nk = stepKey++
											queue || (queue = [])
											queue.push(({ es, output }) =>
												Effect_flatMap(Effect_either(te), t => {
													if (Either_isLeft(t)) {
														const e = new Pointer(index, input, t.left)
														if (allErrors) {
															es.push([nk, e])
															return _void
														}
														return Either_left(
															new ParseResult_Composite(
																ast,
																input,
																e,
																sortByIndex(output),
															),
														)
													}
													output.push([nk, t.right])
													return _void
												}),
											)
										}
									}
								}
							}
							const computeResult = ({ es, output }) =>
								Array_isNonEmptyArray(es)
									? Either_left(
											new ParseResult_Composite(
												ast,
												input,
												sortByIndex(es),
												sortByIndex(output),
											),
										)
									: Either_right(sortByIndex(output))
							if (queue && queue.length > 0) {
								const cqueue = queue
								return Effect_suspend(() => {
									const state = { es: copy(es), output: copy(output) }
									return Effect_flatMap(
										Effect_forEach(cqueue, f => f(state), {
											concurrency,
											batching,
											discard: !0,
										}),
										() => computeResult(state),
									)
								})
							}
							return computeResult({ output, es })
						}
					}
					case "TypeLiteral": {
						if (
							0 === ast.propertySignatures.length &&
							0 === ast.indexSignatures.length
						)
							return fromRefinement(ast, isNotNullable)
						const propertySignatures = [],
							expectedKeysMap = {},
							expectedKeys = []
						for (const ps of ast.propertySignatures) {
							propertySignatures.push([goMemo(ps.type, isDecoding), ps])
							expectedKeysMap[ps.name] = null
							expectedKeys.push(ps.name)
						}
						const indexSignatures = ast.indexSignatures.map(is => [
								goMemo(is.parameter, isDecoding),
								goMemo(is.type, isDecoding),
								is.parameter,
							]),
							expectedAST = Union.make(
								ast.indexSignatures
									.map(is => is.parameter)
									.concat(
										expectedKeys.map(key =>
											isSymbol(key) ? new UniqueSymbol(key) : new Literal(key),
										),
									),
							),
							expected = goMemo(expectedAST, isDecoding),
							concurrency = getConcurrency(ast),
							batching = getBatching(ast)
						return (input, options) => {
							if (
								!(input => isRecordOrArray(input) && !Array.isArray(input))(
									input,
								)
							)
								return Either_left(new ParseResult_Type(ast, input))
							const allErrors = "all" === options?.errors,
								es = []
							let stepKey = 0
							const onExcessPropertyError =
									"error" === options?.onExcessProperty,
								output = {}
							let inputKeys, queue
							if (
								onExcessPropertyError ||
								"preserve" === options?.onExcessProperty
							) {
								inputKeys = Reflect.ownKeys(input)
								for (const key of inputKeys) {
									const te = expected(key, options)
									if (ParseResult_isEither(te) && Either_isLeft(te)) {
										if (onExcessPropertyError) {
											const e = new Pointer(
												key,
												input,
												new Unexpected(
													input[key],
													`is unexpected, expected: ${String(expectedAST)}`,
												),
											)
											if (allErrors) {
												es.push([stepKey++, e])
												continue
											}
											return Either_left(
												new ParseResult_Composite(ast, input, e, output),
											)
										}
										output[key] = input[key]
									}
								}
							}
							const isExact = !0 === options?.exact
							for (let i = 0; i < propertySignatures.length; i++) {
								const ps = propertySignatures[i][1],
									name = ps.name,
									hasKey = Object.prototype.hasOwnProperty.call(input, name)
								if (!hasKey) {
									if (ps.isOptional) continue
									if (isExact) {
										const e = new Pointer(name, input, new Missing(ps))
										if (allErrors) {
											es.push([stepKey++, e])
											continue
										}
										return Either_left(
											new ParseResult_Composite(ast, input, e, output),
										)
									}
								}
								const te = (0, propertySignatures[i][0])(input[name], options)
								if (ParseResult_isEither(te)) {
									if (Either_isLeft(te)) {
										const e = new Pointer(
											name,
											input,
											hasKey ? te.left : new Missing(ps),
										)
										if (allErrors) {
											es.push([stepKey++, e])
											continue
										}
										return Either_left(
											new ParseResult_Composite(ast, input, e, output),
										)
									}
									output[name] = te.right
								} else {
									const nk = stepKey++,
										index = name
									queue || (queue = [])
									queue.push(({ es, output }) =>
										Effect_flatMap(Effect_either(te), t => {
											if (Either_isLeft(t)) {
												const e = new Pointer(
													index,
													input,
													hasKey ? t.left : new Missing(ps),
												)
												if (allErrors) {
													es.push([nk, e])
													return _void
												}
												return Either_left(
													new ParseResult_Composite(ast, input, e, output),
												)
											}
											output[index] = t.right
											return _void
										}),
									)
								}
							}
							for (let i = 0; i < indexSignatures.length; i++) {
								const indexSignature = indexSignatures[i],
									parameter = indexSignature[0],
									type = indexSignature[1],
									keys = getKeysForIndexSignature(input, indexSignature[2])
								for (const key of keys) {
									const keu = parameter(key, options)
									if (ParseResult_isEither(keu) && Either_isRight(keu)) {
										const vpr = type(input[key], options)
										if (ParseResult_isEither(vpr)) {
											if (Either_isLeft(vpr)) {
												const e = new Pointer(key, input, vpr.left)
												if (allErrors) {
													es.push([stepKey++, e])
													continue
												}
												return Either_left(
													new ParseResult_Composite(ast, input, e, output),
												)
											}
											Object.prototype.hasOwnProperty.call(
												expectedKeysMap,
												key,
											) || (output[key] = vpr.right)
										} else {
											const nk = stepKey++,
												index = key
											queue || (queue = [])
											queue.push(({ es, output }) =>
												Effect_flatMap(Effect_either(vpr), tv => {
													if (Either_isLeft(tv)) {
														const e = new Pointer(index, input, tv.left)
														if (allErrors) {
															es.push([nk, e])
															return _void
														}
														return Either_left(
															new ParseResult_Composite(ast, input, e, output),
														)
													}
													Object.prototype.hasOwnProperty.call(
														expectedKeysMap,
														key,
													) || (output[key] = tv.right)
													return _void
												}),
											)
										}
									}
								}
							}
							const computeResult = ({ es, output }) => {
								if (Array_isNonEmptyArray(es))
									return Either_left(
										new ParseResult_Composite(
											ast,
											input,
											sortByIndex(es),
											output,
										),
									)
								if ("original" === options?.propertyOrder) {
									const keys = inputKeys || Reflect.ownKeys(input)
									for (const name of expectedKeys)
										-1 === keys.indexOf(name) && keys.push(name)
									const out = {}
									for (const key of keys)
										Object.prototype.hasOwnProperty.call(output, key) &&
											(out[key] = output[key])
									return Either_right(out)
								}
								return Either_right(output)
							}
							if (queue && queue.length > 0) {
								const cqueue = queue
								return Effect_suspend(() => {
									const state = {
										es: copy(es),
										output: Object.assign({}, output),
									}
									return Effect_flatMap(
										Effect_forEach(cqueue, f => f(state), {
											concurrency,
											batching,
											discard: !0,
										}),
										() => computeResult(state),
									)
								})
							}
							return computeResult({ es, output })
						}
					}
					case "Union": {
						const searchTree = getSearchTree(ast.types, isDecoding),
							ownKeys = Reflect.ownKeys(searchTree.keys),
							ownKeysLen = ownKeys.length,
							astTypesLen = ast.types.length,
							map = new Map()
						for (let i = 0; i < astTypesLen; i++)
							map.set(ast.types[i], goMemo(ast.types[i], isDecoding))
						const concurrency = getConcurrency(ast) ?? 1,
							batching = getBatching(ast)
						return (input, options) => {
							const es = []
							let queue,
								stepKey = 0,
								candidates = []
							if (ownKeysLen > 0)
								if (isRecordOrArray(input))
									for (let i = 0; i < ownKeysLen; i++) {
										const name = ownKeys[i],
											buckets = searchTree.keys[name].buckets
										if (Object.prototype.hasOwnProperty.call(input, name)) {
											const literal = String(input[name])
											if (
												Object.prototype.hasOwnProperty.call(buckets, literal)
											)
												candidates = candidates.concat(buckets[literal])
											else {
												const { candidates, literals } = searchTree.keys[name],
													literalsUnion = Union.make(literals),
													errorAst =
														candidates.length === astTypesLen
															? new TypeLiteral(
																	[
																		new PropertySignature(
																			name,
																			literalsUnion,
																			!1,
																			!0,
																		),
																	],
																	[],
																)
															: Union.make(candidates)
												es.push([
													stepKey++,
													new ParseResult_Composite(
														errorAst,
														input,
														new Pointer(
															name,
															input,
															new ParseResult_Type(literalsUnion, input[name]),
														),
													),
												])
											}
										} else {
											const { candidates, literals } = searchTree.keys[name],
												fakePropertySignature = new PropertySignature(
													name,
													Union.make(literals),
													!1,
													!0,
												),
												errorAst =
													candidates.length === astTypesLen
														? new TypeLiteral([fakePropertySignature], [])
														: Union.make(candidates)
											es.push([
												stepKey++,
												new ParseResult_Composite(
													errorAst,
													input,
													new Pointer(
														name,
														input,
														new Missing(fakePropertySignature),
													),
												),
											])
										}
									}
								else {
									const errorAst =
										searchTree.candidates.length === astTypesLen
											? ast
											: Union.make(searchTree.candidates)
									es.push([stepKey++, new ParseResult_Type(errorAst, input)])
								}
							searchTree.otherwise.length > 0 &&
								(candidates = candidates.concat(searchTree.otherwise))
							for (let i = 0; i < candidates.length; i++) {
								const candidate = candidates[i],
									pr = map.get(candidate)(input, options)
								if (
									!ParseResult_isEither(pr) ||
									(queue && 0 !== queue.length)
								) {
									const nk = stepKey++
									queue || (queue = [])
									queue.push(state =>
										Effect_suspend(() =>
											"finalResult" in state
												? _void
												: Effect_flatMap(Effect_either(pr), t => {
														Either_isRight(t)
															? (state.finalResult = t)
															: state.es.push([nk, t.left])
														return _void
													}),
										),
									)
								} else {
									if (Either_isRight(pr)) return pr
									es.push([stepKey++, pr.left])
								}
							}
							const computeResult = es =>
								Array_isNonEmptyArray(es)
									? 1 === es.length && "Type" === es[0][1]._tag
										? Either_left(es[0][1])
										: Either_left(
												new ParseResult_Composite(ast, input, sortByIndex(es)),
											)
									: Either_left(new ParseResult_Type(ast, input))
							if (queue && queue.length > 0) {
								const cqueue = queue
								return Effect_suspend(() => {
									const state = { es: copy(es) }
									return Effect_flatMap(
										Effect_forEach(cqueue, f => f(state), {
											concurrency,
											batching,
											discard: !0,
										}),
										() =>
											"finalResult" in state
												? state.finalResult
												: computeResult(state.es),
									)
								})
							}
							return computeResult(es)
						}
					}
					case "Suspend": {
						const get = memoizeThunk(() => goMemo(ast.f(), isDecoding))
						return (a, options) => get()(a, options)
					}
				}
			},
			fromRefinement = (ast, refinement) => u =>
				refinement(u)
					? Either_right(u)
					: Either_left(new ParseResult_Type(ast, u)),
			getLiterals = (ast, isDecoding) => {
				switch (ast._tag) {
					case "Declaration": {
						const annotation = getSurrogateAnnotation(ast)
						if (Option_isSome(annotation))
							return getLiterals(annotation.value, isDecoding)
						break
					}
					case "TypeLiteral": {
						const out = []
						for (let i = 0; i < ast.propertySignatures.length; i++) {
							const propertySignature = ast.propertySignatures[i],
								type = isDecoding
									? encodedAST(propertySignature.type)
									: typeAST(propertySignature.type)
							isLiteral(type) &&
								!propertySignature.isOptional &&
								out.push([propertySignature.name, type])
						}
						return out
					}
					case "TupleType": {
						const out = []
						for (let i = 0; i < ast.elements.length; i++) {
							const element = ast.elements[i],
								type = isDecoding
									? encodedAST(element.type)
									: typeAST(element.type)
							isLiteral(type) && !element.isOptional && out.push([i, type])
						}
						return out
					}
					case "Refinement":
						return getLiterals(ast.from, isDecoding)
					case "Suspend":
						return getLiterals(ast.f(), isDecoding)
					case "Transformation":
						return getLiterals(isDecoding ? ast.from : ast.to, isDecoding)
				}
				return []
			},
			getSearchTree = (members, isDecoding) => {
				const keys = {},
					otherwise = [],
					candidates = []
				for (let i = 0; i < members.length; i++) {
					const member = members[i],
						tags = getLiterals(member, isDecoding)
					if (tags.length > 0) {
						candidates.push(member)
						for (let j = 0; j < tags.length; j++) {
							const [key, literal] = tags[j],
								hash = String(literal.literal)
							keys[key] = keys[key] || {
								buckets: {},
								literals: [],
								candidates: [],
							}
							const buckets = keys[key].buckets
							if (!Object.prototype.hasOwnProperty.call(buckets, hash)) {
								buckets[hash] = [member]
								keys[key].literals.push(literal)
								keys[key].candidates.push(member)
								break
							}
							if (!(j < tags.length - 1)) {
								buckets[hash].push(member)
								keys[key].literals.push(literal)
								keys[key].candidates.push(member)
							}
						}
					} else otherwise.push(member)
				}
				return { keys, otherwise, candidates }
			},
			dropRightRefinement = ast =>
				isRefinement(ast) ? dropRightRefinement(ast.from) : ast,
			handleForbidden = (effect, ast, actual, options) => {
				if (!0 === options?.isEffectAllowed) return effect
				if (ParseResult_isEither(effect)) return effect
				const scheduler = new SyncScheduler(),
					fiber = Effect_runFork(effect, { scheduler })
				scheduler.flush()
				const exit = fiber.unsafePoll()
				if (exit) {
					if (Exit_isSuccess(exit)) return Either_right(exit.value)
					const cause = exit.cause
					return (self => "Fail" === self._tag)(cause)
						? Either_left(cause.error)
						: Either_left(new Forbidden(ast, actual, Cause_pretty(cause)))
				}
				return Either_left(
					new Forbidden(
						ast,
						actual,
						"cannot be be resolved synchronously, this is caused by using runSync on an effect that performs async work",
					),
				)
			},
			compare = ([a], [b]) => (a > b ? 1 : a < b ? -1 : 0)
		function sortByIndex(es) {
			return es.sort(compare).map(t => t[1])
		}
		const getFinalTransformation = (transformation, isDecoding) => {
				switch (transformation._tag) {
					case "FinalTransformation":
						return isDecoding ? transformation.decode : transformation.encode
					case "ComposeTransformation":
						return Either_right
					case "TypeLiteralTransformation":
						return input => {
							let out = Either_right(input)
							for (const pst of transformation.propertySignatureTransformations) {
								const [from, to] = isDecoding
										? [pst.from, pst.to]
										: [pst.to, pst.from],
									transformation = isDecoding ? pst.decode : pst.encode,
									f = input => {
										const o = transformation(
											Object.prototype.hasOwnProperty.call(input, from)
												? Option_some(input[from])
												: Option_none(),
										)
										delete input[from]
										Option_isSome(o) && (input[to] = o.value)
										return input
									}
								out = ParseResult_map(out, f)
							}
							return out
						}
				}
			},
			makeTree = (value, forest = []) => ({ value, forest }),
			TreeFormatter = {
				formatIssue: issue => ParseResult_map(formatTree(issue), drawTree),
				formatIssueSync: issue => {
					const e = TreeFormatter.formatIssue(issue)
					return ParseResult_isEither(e) ? getOrThrow(e) : Effect_runSync(e)
				},
				formatError: error => TreeFormatter.formatIssue(error.issue),
				formatErrorSync: error => TreeFormatter.formatIssueSync(error.issue),
			},
			drawTree = tree => tree.value + draw("\n", tree.forest),
			draw = (indentation, forest) => {
				let r = ""
				const len = forest.length
				let tree
				for (let i = 0; i < len; i++) {
					tree = forest[i]
					const isLast = i === len - 1
					r += indentation + (isLast ? "└" : "├") + "─ " + tree.value
					r += draw(
						indentation + (len > 1 && !isLast ? "│  " : "   "),
						tree.forest,
					)
				}
				return r
			},
			formatTransformationKind = kind => {
				switch (kind) {
					case "Encoded":
						return "Encoded side transformation failure"
					case "Transformation":
						return "Transformation process failure"
					case "Type":
						return "Type side transformation failure"
				}
			},
			formatRefinementKind = kind => {
				switch (kind) {
					case "From":
						return "From side refinement failure"
					case "Predicate":
						return "Predicate refinement failure"
				}
			},
			getAnnotated = issue =>
				"ast" in issue ? Option_some(issue.ast) : Option_none(),
			Either_void = Either_right(void 0),
			createParseIssueGuard = tag => issue => issue._tag === tag,
			ParseResult_isComposite = createParseIssueGuard("Composite"),
			ParseResult_isRefinement = createParseIssueGuard("Refinement"),
			ParseResult_isTransformation = createParseIssueGuard("Transformation"),
			getMessage = issue =>
				ParseResult_flatMap(
					(issue =>
						getAnnotated(issue).pipe(
							Option_flatMap(getMessageAnnotation),
							Option_match({
								onNone: () => Either_void,
								onSome: messageAnnotation => {
									const union = messageAnnotation(issue)
									return isString(union)
										? Either_right({ message: union, override: !1 })
										: Effect_isEffect(union)
											? Effect_map(union, message => ({
													message,
													override: !1,
												}))
											: isString(union.message)
												? Either_right({
														message: union.message,
														override: union.override,
													})
												: Effect_map(union.message, message => ({
														message,
														override: union.override,
													}))
								},
							}),
						))(issue),
					currentMessage =>
						void 0 !== currentMessage
							? !currentMessage.override &&
								(ParseResult_isComposite(issue) ||
									(ParseResult_isRefinement(issue) && "From" === issue.kind) ||
									(ParseResult_isTransformation(issue) &&
										"Transformation" !== issue.kind))
								? ParseResult_isTransformation(issue) ||
									ParseResult_isRefinement(issue)
									? getMessage(issue.issue)
									: Either_void
								: Either_right(currentMessage.message)
							: Either_void,
				),
			ParseResult_getParseIssueTitleAnnotation = issue =>
				getAnnotated(issue).pipe(
					Option_flatMap(getParseIssueTitleAnnotation),
					flatMapNullable(annotation => annotation(issue)),
					Option_getOrUndefined,
				),
			getParseIssueTitle = issue =>
				ParseResult_getParseIssueTitleAnnotation(issue) ?? String(issue.ast),
			formatForbiddenMessage = issue => issue.message ?? "is forbidden",
			formatTree = issue => {
				switch (issue._tag) {
					case "Type":
						return ParseResult_map(
							(issue =>
								ParseResult_map(
									getMessage(issue),
									message =>
										message ??
										ParseResult_getParseIssueTitleAnnotation(issue) ??
										(function (issue) {
											return void 0 !== issue.message
												? issue.message
												: `Expected ${
														isRefinement(issue.ast)
															? ((ast = issue.ast),
																getDescriptionAnnotation(ast).pipe(
																	Option_orElse(() => getTitleAnnotation(ast)),
																	Option_orElse(() =>
																		getAutoTitleAnnotation(ast),
																	),
																	Option_orElse(() =>
																		getIdentifierAnnotation(ast),
																	),
																	Option_getOrElse(
																		() => `{ ${ast.from} | filter }`,
																	),
																))
															: String(issue.ast)
													}, actual ${formatUnknown(issue.actual)}`
											var ast
										})(issue),
								))(issue),
							makeTree,
						)
					case "Forbidden":
						return Either_right(
							makeTree(getParseIssueTitle(issue), [
								makeTree(formatForbiddenMessage(issue)),
							]),
						)
					case "Unexpected":
						return Either_right(
							makeTree((issue => issue.message ?? "is unexpected")(issue)),
						)
					case "Missing":
						return ParseResult_map(
							(issue => {
								const missingMessageAnnotation = getMissingMessageAnnotation(
									issue.ast,
								)
								if (Option_isSome(missingMessageAnnotation)) {
									const annotation = missingMessageAnnotation.value()
									return isString(annotation)
										? Either_right(annotation)
										: annotation
								}
								return Either_right(issue.message ?? "is missing")
							})(issue),
							makeTree,
						)
					case "Transformation":
						return ParseResult_flatMap(getMessage(issue), message =>
							void 0 !== message
								? Either_right(makeTree(message))
								: ParseResult_map(formatTree(issue.issue), tree =>
										makeTree(getParseIssueTitle(issue), [
											makeTree(formatTransformationKind(issue.kind), [tree]),
										]),
									),
						)
					case "Refinement":
						return ParseResult_flatMap(getMessage(issue), message =>
							void 0 !== message
								? Either_right(makeTree(message))
								: ParseResult_map(formatTree(issue.issue), tree =>
										makeTree(getParseIssueTitle(issue), [
											makeTree(formatRefinementKind(issue.kind), [tree]),
										]),
									),
						)
					case "Pointer":
						return ParseResult_map(formatTree(issue.issue), tree =>
							makeTree(formatPath(issue.path), [tree]),
						)
					case "Composite":
						return ParseResult_flatMap(getMessage(issue), message => {
							if (void 0 !== message) return Either_right(makeTree(message))
							const parseIssueTitle = getParseIssueTitle(issue)
							return util_isNonEmpty(issue.issues)
								? ParseResult_map(
										Effect_forEach(issue.issues, formatTree),
										forest => makeTree(parseIssueTitle, forest),
									)
								: ParseResult_map(formatTree(issue.issues), tree =>
										makeTree(parseIssueTitle, [tree]),
									)
						})
				}
			},
			Schema_TypeId = Symbol.for("effect/Schema")
		function Schema_make(ast) {
			return class {
				[Schema_TypeId] = Schema_variance
				static ast = ast
				static annotations(annotations) {
					return Schema_make(mergeSchemaAnnotations(this.ast, annotations))
				}
				static pipe() {
					return pipeArguments(this, arguments)
				}
				static toString() {
					return String(ast)
				}
				static Type
				static Encoded
				static Context
				static [Schema_TypeId] = Schema_variance
			}
		}
		const Schema_variance = { _A: _ => _, _I: _ => _, _R: _ => _ },
			builtInAnnotations = {
				typeConstructor: TypeConstructorAnnotationId,
				schemaId: SchemaIdAnnotationId,
				message: MessageAnnotationId,
				missingMessage: MissingMessageAnnotationId,
				identifier: IdentifierAnnotationId,
				title: TitleAnnotationId,
				description: DescriptionAnnotationId,
				examples: ExamplesAnnotationId,
				default: DefaultAnnotationId,
				documentation: DocumentationAnnotationId,
				jsonSchema: JSONSchemaAnnotationId,
				arbitrary: ArbitraryAnnotationId,
				pretty: PrettyAnnotationId,
				equivalence: EquivalenceAnnotationId,
				concurrency: ConcurrencyAnnotationId,
				batching: BatchingAnnotationId,
				parseIssueTitle: ParseIssueTitleAnnotationId,
				parseOptions: ParseOptionsAnnotationId,
				decodingFallback: DecodingFallbackAnnotationId,
			},
			toASTAnnotations = annotations => {
				if (!annotations) return {}
				const out = { ...annotations }
				for (const key in builtInAnnotations)
					if (key in annotations) {
						out[builtInAnnotations[key]] = annotations[key]
						delete out[key]
					}
				return out
			},
			mergeSchemaAnnotations = (ast, annotations) =>
				SchemaAST_annotations(ast, toASTAnnotations(annotations))
		function makeDeclareClass(typeParameters, ast) {
			return class extends Schema_make(ast) {
				static annotations(annotations) {
					return makeDeclareClass(
						this.typeParameters,
						mergeSchemaAnnotations(this.ast, annotations),
					)
				}
				static typeParameters = [...typeParameters]
			}
		}
		const InstanceOfSchemaId = Symbol.for("effect/SchemaId/InstanceOf"),
			instanceOf = (constructor, annotations) =>
				(function () {
					return Array.isArray(arguments[0])
						? ((options = arguments[1]),
							(annotations = arguments[2]),
							makeDeclareClass(
								(typeParameters = arguments[0]),
								new Declaration(
									typeParameters.map(tp => tp.ast),
									(...typeParameters) =>
										options.decode(...typeParameters.map(Schema_make)),
									(...typeParameters) =>
										options.encode(...typeParameters.map(Schema_make)),
									toASTAnnotations(annotations),
								),
							))
						: ((is, annotations) => {
								const decodeUnknown = () => (input, _, ast) =>
									is(input)
										? ParseResult_succeed(input)
										: ParseResult_fail(new ParseResult_Type(ast, input))
								return makeDeclareClass(
									[],
									new Declaration(
										[],
										decodeUnknown,
										decodeUnknown,
										toASTAnnotations(annotations),
									),
								)
							})(arguments[0], arguments[1])
					var typeParameters, options, annotations
				})(u => u instanceof constructor, {
					title: constructor.name,
					description: `an instance of ${constructor.name}`,
					pretty: () => String,
					schemaId: InstanceOfSchemaId,
					[InstanceOfSchemaId]: { constructor },
					...annotations,
				}),
			getChecked = e =>
				decodeUnknownSync(instanceOf(HTMLInputElement))(e.currentTarget).checked
		__webpack_require__.dn(getChecked)
		const configEffect = (k, v) => c => () =>
			Effect_runPromise(c.provideLog(c.setConfig[k](v)))
		__webpack_require__.dn(configEffect)
		const stepTiming = stepCount => `steps(${stepCount}, jump-end)`
		__webpack_require__.dn(stepTiming)
		const setComputed = {
				useStepTiming: v => c => s =>
					pipe(
						v ? stepTiming(Editable_value(s.timingStepCount)) : "linear",
						timingFunction => [
							{ ...s, timingFunction },
							configEffect("timingFunction", timingFunction)(c),
						],
					),
			},
			settingUI_setComputed = setComputed,
			setRange = keyA => keyB => bFn => vA => commander => s =>
				pipe(
					Editable_value(vA),
					a => ({ a, b: bFn(a)(Editable_value(s[keyB])) }),
					({ a, b }) =>
						pipe(
							[configEffect(keyA, a), configEffect(keyB, b)],
							xs => c =>
								pipe(
									xs,
									Array_map(x => x(c)),
									effects => [
										{ ...s, [keyA]: vA, [keyB]: setValue(b)(s[keyB]) },
										...effects,
									],
								),
						)(commander),
				)
		__webpack_require__.dn(setRange)
		const setState = {
				flowY1: setRange("flowY1")("flowY2")(a => b => Math.max(b, a + 0.05)),
				flowY2: setRange("flowY2")("flowY1")(a => b => Math.min(b, a - 0.05)),
				flowX1: setRange("flowX1")("flowX2")(a => b => Math.max(b, a + 0.05)),
				flowX2: setRange("flowX2")("flowX1")(a => b => Math.min(b, a - 0.05)),
				timingStepCount: v => c => s =>
					pipe(stepTiming(Editable_value(v)), timingFunction => [
						{ ...s, timingStepCount: v, timingFunction },
						configEffect("timingFunction", timingFunction)(c),
					]),
			},
			settingUI_setState = setState,
			updateAt = k => v =>
				pipe(
					k in settingUI_setComputed
						? settingUI_setComputed[k](v)
						: k in settingUI_setState
							? settingUI_setState[k](v)
							: c => s => [
									{ ...s, [k]: v },
									...(k in c.setConfig && "filterExp" !== k
										? [
												configEffect(
													k,
													Array.isArray(v) &&
														2 === v.length &&
														isEditable(k)(v[0])
														? Editable_value(v)
														: v,
												)(c),
											]
										: []),
								],
				)
		__webpack_require__.dn(updateAt)
		const updateBool = (
				updateAt => key =>
					flip((s, e) => pipe(getChecked(e), updateAt(key), flip, apply(s)))
			)(updateAt),
			settingUI_checkboxNode = checkboxNode(getText, getState, updateBool),
			mapSettingNodes = f => xs => c => s =>
				pipe(
					xs,
					Array_map(x => x(c)(s)),
					f,
				)
		__webpack_require__.dn(mapSettingNodes)
		const errorText = subject => edit =>
			pipe(
				edit,
				Editable_error,
				Option_map(x => `${subject}${"" === x ? "" : ": "}${x}`),
				Option_getOrElse(constant("")),
			)
		__webpack_require__.dn(errorText)
		const rangeRow = (config, action) => value =>
			h("div", {}, [
				h("input", {
					style: { width: "150px", verticalAlign: "middle" },
					type: "range",
					...config,
					value: Editable_value(value).toString(),
					oninput: action.onchange ?? identity,
				}),
				h("input", {
					style: {
						width: "30px",
						backgroundColor: "transparent",
						color: "inherit",
						borderWidth: "1px",
						verticalAlign: "middle",
						borderColor: hasError(value) ? "#f55" : null,
					},
					inputmode: "decimal",
					value: pipe(
						value,
						Editable_text,
						Option_getOrElse(
							constant(
								Editable_value(value)
									.toFixed(4)
									.replace(/\.?0+$/, ""),
							),
						),
					),
					...action,
				}),
			])
		__webpack_require__.dn(rangeRow)
		const settingRow = (label, error, content) =>
			h("div", {}, [
				h("span", {}, hyperapp_text(label)),
				h(
					"span",
					{
						style: { color: "#f55", marginLeft: "5px", whiteSpace: "pre-wrap" },
					},
					hyperapp_text(error),
				),
				h("div", {}, content),
			])
		__webpack_require__.dn(settingRow)
		const numericNode =
			setter =>
			(editAction, getText, getState) =>
			(label, min, max, step) =>
			c =>
			s =>
				settingRow(
					getText(label)(s),
					errorText(getText("inputNonNumberic")(s))(getState(label)(s)),
					[
						rangeRow(
							{ min, max, step },
							editAction(label, setter)(c),
						)(getState(label)(s)),
					],
				)
		__webpack_require__.dn(numericNode)
		const numberNode = numericNode(
				editing => value => state =>
					pipe(
						value,
						Number.parseFloat,
						editing
							? x =>
									Number.isNaN(x) || "." === value.at(-1)
										? pipe(state, setText(value))
										: fromValueText(x)(value)
							: x =>
									Number.isNaN(x)
										? pipe(
												state,
												mapSecond(
													constant(Option_some([value, Option_some("")])),
												),
											)
										: Editable_of(x),
					),
			),
			getValue = e => {
				const target = e.currentTarget ?? e.__target
				if (
					target instanceof HTMLSelectElement ||
					target instanceof HTMLTextAreaElement ||
					target instanceof HTMLInputElement
				)
					return target.value
				throw Error("Event target type isn't acceptable.")
			}
		__webpack_require__.dn(getValue)
		const updateInput = (
				(getState, updateAt) => key => setter => c => (s, e) =>
					pipe(getValue(e), setter, apply(getState(key)(s)), updateAt(key), x =>
						x(c)(s),
					)
			)(getState, updateAt),
			editAction = (updateInput => (key, setter) => c => ({
				oninput: updateInput(key)(setter(!0))(c),
				onchange: updateInput(key)(setter(!1))(c),
			}))(updateInput),
			settingUI_numberNode = numberNode(editAction, getText, getState),
			chatFieldPanel = pipe(
				[
					pipe(
						[
							settingUI_numberNode("fieldScale", 0.7, 1.5, 0.05),
							settingUI_checkboxNode("simplifyChatField"),
							settingUI_checkboxNode("createBanButton"),
						],
						mapSettingNodes(x => h("div", { style: panelBoxStyle(644) }, x)),
					),
				],
				mapSettingNodes(identity),
			),
			settingUI_chatFieldPanel = chatFieldPanel,
			action = {
				copy: () => s =>
					Effect_map(
						Effect_promise(async () =>
							GM.setClipboard(
								(x =>
									`<pre>${JSON.stringify({ nextId: x.nextId, blocks: pipe(x.compressedBlocks, Array_map(external_LZString_namespaceObject.decompressFromUTF16), Array_append(JSON.stringify(x.lastBlock)), Array_map(external_LZString_namespaceObject.compressToEncodedURIComponent)) })}</pre>`)(
									s.eventLog,
								),
							),
						),
						() => s,
					),
				clearFlowChats: c => s => Effect_map(c.act.clearFlowChats, () => s),
				importLog: () => s =>
					pipe(
						Effect_sync(() => prompt(getText("importLog")(s))),
						Effect_flatMap(Effect_fromNullable),
						Effect_map(x => ({ ...s, eventLog: importLog(x) })),
						Effect_orElseSucceed(() => s),
					),
			},
			buttonNode = label => c => state =>
				h(
					"button",
					{
						type: "button",
						onclick: s => [
							s,
							d =>
								Effect_runPromise(
									c.provideLog(
										pipe(
											action[label](c)(s),
											Effect_flatMap(newS => Effect_sync(() => d(newS))),
										),
									),
								),
						],
					},
					hyperapp_text(getText(label)(state)),
				)
		__webpack_require__.dn(buttonNode)
		const feedbackPanel = c => s =>
			pipe(
				getState("eventLog")(s).compressedBlocks.length + 1,
				logPageCount => [
					pipe(
						[settingUI_checkboxNode("logEvents"), buttonNode("importLog")],
						mapSettingNodes(x => h("div", { style: panelBoxStyle(212) }, x)),
					)(c)(s),
					h("div", { style: panelBoxStyle(428) }, [
						h(
							"a",
							{
								style: { color: "#f0f" },
								href: "https://greasyfork.org/en/scripts/411442-flow-youtube-chat/feedback",
								target: "_blank",
							},
							hyperapp_text(getText("giveFeedback")(s)),
						),
						h("div", {}, [
							h("span", {}, hyperapp_text(getText("eventLog")(s))),
							buttonNode("copy")(c)(s),
							tabContainer({
								container: {},
								label: { padding: "4px", width: "2em", textAlign: "center" },
								labelFocus: { background: "#666" },
								tab: {
									height: "251px",
									display: "flex",
									flexDirection: "column",
									padding: "6px",
								},
							})((_, n) => updateAt("logTab")(n)(c))(
								pipe(Array_makeBy(logPageCount, x => `${x}`)),
							)(
								pipe(getState("eventLog")(s), l =>
									Array_makeBy(
										logPageCount,
										i => () =>
											pipe(
												Array_get(l.compressedBlocks, i),
												Option_map(decompressBlock),
												Option_getOrElse(() => l.lastBlock),
												Array_map((x, j) =>
													h("div", { style: { display: "flex" } }, [
														h(
															"div",
															{
																style: { userSelect: "none", flex: "0 0 2em" },
															},
															hyperapp_text(x.id),
														),
														h(
															"div",
															{
																style: {
																	background: j % 2 == 0 ? "#fff" : "#ddd",
																	color: "#000",
																	flex: "auto",
																	wordBreak: "break-all",
																	whiteSpace: "break-spaces",
																	padding: "0 2px",
																},
															},
															hyperapp_text(`[${x.level}] ${x.text}`),
														),
													]),
												),
											),
									),
								),
							)(getState("logTab")(s)),
						]),
					]),
				],
			)
		__webpack_require__.dn(feedbackPanel)
		const textAreaRow = (rows, action) => value =>
			h("textarea", {
				rows,
				style: {
					resize: "none",
					boxSizing: "border-box",
					width: "100%",
					borderColor: hasError(value) ? "#f55" : null,
				},
				value: pipe(
					value,
					Editable_text,
					Option_getOrElse(pipe(Editable_value(value), join("\n"), constant)),
				),
				...action,
			})
		__webpack_require__.dn(textAreaRow)
		const textAreaNode =
			setter => (editAction, getText, getState) => (label, rows) => c => s =>
				settingRow(
					getText(label)(s),
					errorText(getText("invalidSetting")(s))(getState(label)(s)),
					[textAreaRow(rows, editAction(label, setter)(c))(getState(label)(s))],
				)
		__webpack_require__.dn(textAreaNode)
		const settingUI_plainTextAreaNode = textAreaNode(
				editing => value =>
					pipe(
						value,
						String_split(/\r\n|\n/),
						Array_filter(not(String_isEmpty)),
						regexes => ({
							regexes,
							errors: pipe(
								regexes,
								Array_map((x, i) => {
									try {
										RegExp(x, "u")
										return Option_none()
									} catch (e) {
										return Option_some(`${e} in regex number ${i}`)
									}
								}),
								Array_getSomes,
								Array_reduce("", (b, a) => `${b}\n${a}`),
								Option_liftPredicate(String_isNonEmpty),
							),
						}),
						ctx =>
							editing
								? setText(value)
								: pipe(
										ctx.errors,
										Option_map(x =>
											mapSecond(() => Option_some([value, Option_some(x)])),
										),
										Option_getOrElse(() => () => Editable_of(ctx.regexes)),
									),
					),
			)(editAction, getText, getState),
			settingUI_regexTextAreaNode = textAreaNode(
				editing => value =>
					pipe(
						value,
						String_split(/\r\n|\n/),
						Array_filter(not(String_isEmpty)),
						x =>
							constant(
								editing
									? [x, Option_some([value, Option_none()])]
									: Editable_of(x),
							),
					),
			)(editAction, getText, getState),
			filterPanelOld = c => s => [
				h(
					"div",
					{ style: panelBoxStyle(212) },
					settingUI_plainTextAreaNode("bannedWords", 18)(c)(s),
				),
				h(
					"div",
					{ style: panelBoxStyle(212) },
					settingUI_regexTextAreaNode("bannedWordRegexes", 18)(c)(s),
				),
				h(
					"div",
					{ style: panelBoxStyle(212) },
					settingUI_plainTextAreaNode("bannedUsers", 18)(c)(s),
				),
			]
		__webpack_require__.dn(filterPanelOld)
		const colorPicker = action => color =>
			h("input", {
				style: { width: "36px", verticalAlign: "middle" },
				type: "color",
				value: color,
				oninput: action.onchange ?? identity,
			})
		__webpack_require__.dn(colorPicker)
		const textInput = action => value =>
			h("input", {
				style: {
					verticalAlign: "middle",
					width: "5.5em",
					borderColor: hasError(value) ? "#f55" : null,
				},
				maxlength: 20,
				value: pipe(
					value,
					Editable_text,
					Option_getOrElse(constant(Editable_value(value))),
				),
				...action,
			})
		__webpack_require__.dn(textInput)
		var lib = __webpack_require__(742),
			lib_default = __webpack_require__.n(lib)
		const setter_setEditColor = editing => value =>
				editing
					? lib_default()(value)
						? constant(fromValueText(value)(value))
						: setText(value)
					: lib_default()(value)
						? constant(Editable_of(value))
						: mapSecond(constant(Option_some([value, Option_some("")]))),
			colorNode = (editAction, getText, getState) => label => c => s =>
				settingRow(
					getText(label)(s),
					errorText(getText("invalidColor")(s))(getState(label)(s)),
					pipe(editAction(label, setter_setEditColor)(c), x => [
						colorPicker(x)(Editable_value(getState(label)(s))),
						textInput(x)(getState(label)(s)),
					]),
				)
		__webpack_require__.dn(colorNode)
		const settingUI_colorNode = colorNode(editAction, getText, getState),
			settingUI_intNode = numericNode(
				editing => value => state =>
					pipe(
						value,
						Number.parseInt,
						editing
							? x =>
									Number.isNaN(x) || "." === value.at(-1)
										? pipe(state, setText(value))
										: fromValueText(x)(value)
							: x =>
									Number.isNaN(x)
										? pipe(
												state,
												mapSecond(
													constant(Option_some([value, Option_some("")])),
												),
											)
										: Editable_of(x),
					),
			)(editAction, getText, getState),
			setter_setEditString = editing => x =>
				constant(editing ? fromValueText(x)(x) : Editable_of(x)),
			fonts = currentFont => [
				["", "Default", "デフォルト", "Default"],
				["arial", "Arial", "Arial", "Arial"],
				["arial black", "Arial Black", "Arial Black", "Arial Black"],
				["arial narrow", "Arial Narrow", "Arial Narrow", "Arial Narrow"],
				["Century", "Century", "Century", "Century"],
				["Comic Sans MS", "Comic Sans MS", "Comic Sans MS", "Comic Sans MS"],
				["Courier", "Courier", "Courier", "Courier"],
				["cursive", "cursive", "cursive", "cursive"],
				["fantasy", "fantasy", "fantasy", "fantasy"],
				["Impact", "Impact", "Impact", "Impact"],
				["Meiryo", "Meiryo", "メイリオ", "Meiryo"],
				["Meiryo UI", "Meiryo UI", "メイリオ UI", "Meiryo UI"],
				["monospace", "monospace", "monospace", "monospace"],
				[
					"Monotype Corsiva",
					"Monotype Corsiva",
					"Monotype Corsiva",
					"Monotype Corsiva",
				],
				["MS PGothic", "MS PGothic", "MS Pゴシック", "MS PGothic"],
				["MS Gothic", "MS Gothic", "MS ゴシック", "MS Gothic"],
				["MS Sans Serif", "MS Sans Serif", "MS Sans Serif", "MS Sans Serif"],
				["MS Serif", "MS Serif", "MS Serif", "MS Serif"],
				["MS UI Gothic", "MS UI Gothic", "MS UI Gothic", "MS UI Gothic"],
				["sans-serif", "Sans-serif", "Sans-serif", "Sans-serif"],
				["serif", "Serif", "Serif", "Serif"],
				[
					"Times New Roman",
					"Times New Roman",
					"Times New Roman",
					"Times New Roman",
				],
				["Yu Gothic", "Yu Gothic", "遊ゴシック", "Yu Gothic"],
				["YuGothic", "YuGothic", "游ゴシック体", "YuGothic"],
				[currentFont, "Custom", "カスタム", "自定义"],
			]
		__webpack_require__.dn(fonts)
		const settingUI_textRowStyle = { width: "70%", boxSizing: "border-box" },
			selectFontNode = c => s =>
				pipe(Editable_value(s.font), font =>
					settingRow(getText("font")(s), "", [
						h(
							"select",
							{
								style: settingUI_textRowStyle,
								onchange: updateInput("font")(setter_setEditString(!1))(c),
							},
							pipe(
								fonts(font),
								findFirstIndex(x => x[0] === font),
								Option_getOrElse(() => 0),
								index =>
									pipe(
										fonts(font),
										Array_map((f, i) =>
											node_option(
												f[0],
												pipe(
													languages,
													findFirstIndex(x => x === s.lang),
													Option_map(x => Array_unsafeGet(x + 1)(f)),
													Option_getOrElse(() => "Error"),
												),
												i === index,
											),
										),
									),
							),
						),
						h("input", {
							style: settingUI_textRowStyle,
							maxlength: 20,
							value: font,
							...editAction("font", setter_setEditString),
						}),
					]),
				)
		__webpack_require__.dn(selectFontNode)
		const stepTimingNode = c => s =>
			h("div", {}, [
				settingUI_checkboxNode("useStepTiming")(c)(s),
				h(
					"div",
					{ style: { opacity: getState("useStepTiming")(s) ? null : "0.5" } },
					settingUI_intNode("timingStepCount", 1, 400, 1)(c)(s),
				),
			])
		__webpack_require__.dn(stepTimingNode)
		const colorTextOutput = textStyle => color =>
			h("span", { style: { ...textStyle, color } }, hyperapp_text("Aa1あア亜"))
		__webpack_require__.dn(colorTextOutput)
		const textColorNode =
			(editAction, getText, getState, getExampleTextStyle) => label => c => s =>
				settingRow(
					getText(label)(s),
					errorText(getText("invalidColor")(s))(getState(label)(s)),
					pipe(
						{
							a: editAction(label, setter_setEditColor)(c),
							v: Editable_value(getState(label)(s)),
						},
						({ a, v }) => [
							colorPicker(a)(v),
							textInput(a)(getState(label)(s)),
							colorTextOutput(getExampleTextStyle(s))(v),
						],
					),
				)
		__webpack_require__.dn(textColorNode)
		const getExampleTextStyle = s => ({
			fontFamily: Editable_value(s.font),
			fontWeight: Editable_value(s.fontWeight).toString(),
			textShadow: textShadow(Editable_value(s.shadowColor))(
				Editable_value(s.shadowFontWeight),
			),
		})
		__webpack_require__.dn(getExampleTextStyle)
		const settingUI_textColorNode = textColorNode(
				editAction,
				getText,
				getState,
				getExampleTextStyle,
			),
			flowChatPanel = pipe(
				[
					pipe(
						[
							selectFontNode,
							settingUI_textColorNode("color"),
							settingUI_textColorNode("ownerColor"),
							settingUI_textColorNode("moderatorColor"),
							settingUI_textColorNode("memberColor"),
							settingUI_colorNode("shadowColor"),
						],
						mapSettingNodes(x => h("div", { style: panelBoxStyle(212) }, x)),
					),
					pipe(
						[
							settingUI_numberNode("chatOpacity", 0, 1, 0.05),
							settingUI_numberNode("fontSize", 0.3, 2, 0.05),
							settingUI_numberNode("fontWeight", 10, 1e3, 10),
							settingUI_numberNode("shadowFontWeight", 0, 3, 0.1),
							settingUI_numberNode("flowSpeed", 1, 50, 1),
							settingUI_intNode("maxChatCount", 5, 200, 5),
							settingUI_intNode("maxChatLength", 5, 200, 5),
							settingUI_intNode("laneCount", 1, 25, 1),
						],
						mapSettingNodes(x => h("div", { style: panelBoxStyle(212) }, x)),
					),
					pipe(
						[
							settingUI_numberNode("flowY1", 0, 0.95, 0.01),
							settingUI_numberNode("flowY2", 0.05, 1, 0.01),
							settingUI_numberNode("flowX1", 0, 0.95, 0.01),
							settingUI_numberNode("flowX2", 0.05, 1, 0.01),
							settingUI_numberNode("minSpacing", 0, 2.5, 0.1),
							stepTimingNode,
							settingUI_checkboxNode("createChats"),
							settingUI_checkboxNode("displayModName"),
							settingUI_checkboxNode("displaySuperChatAuthor"),
							settingUI_checkboxNode("textOnly"),
							() => s => hyperapp_text(getText("flowNewChatIf")(s)),
							settingUI_checkboxNode("noOverlap"),
							buttonNode("clearFlowChats"),
						],
						mapSettingNodes(x => h("div", { style: panelBoxStyle(212) }, x)),
					),
				],
				mapSettingNodes(identity),
			),
			settingUI_flowChatPanel = flowChatPanel,
			settingsPanel = c => state => {
				return state.showPanel
					? h(
							"div",
							{
								class: "fyc_panel",
								style: {
									backgroundColor: "rgba(30,30,30,0.9)",
									position: "absolute",
									zIndex: "66666",
									color: "#fff",
									fontSize: "14px",
									overflow: "auto",
									left: `${state.panelRect.x}px`,
									top: `${state.panelRect.y}px`,
									width: `${state.panelRect.width}px`,
									height: `${state.panelRect.height}px`,
									border: "solid 1px #666",
									fontFamily: "MS PGothic",
									lineHeight: "1.2",
									colorScheme: "dark",
								},
							},
							[
								h(
									"div",
									{
										style: { position: "absolute", inset: "3px 3px auto auto" },
									},
									[
										hyperapp_text("🌐"),
										h(
											"select",
											{
												onchange: updateInput("lang")(
													((allowedStrings = languages),
													value => state =>
														pipe(
															value,
															Option_liftPredicate(x =>
																Array_containsWith(String_Equivalence)(
																	allowedStrings,
																	x,
																),
															),
															Option_getOrElse(() => state),
														)),
												)(c),
											},
											pipe(
												languages,
												Array_zip(languageLabels),
												Array_map(([lang, label]) =>
													node_option(lang, label, lang === state.lang),
												),
											),
										),
									],
								),
								tabContainer({
									container: {},
									label: { padding: "6px" },
									labelFocus: { background: "#666" },
									tab: { height: "364px", display: "flex", padding: "6px" },
								})((s, n) => updateAt("mainTab")(n)(c)(s))(
									pipe(
										["flowChat", "chatFilter", "chatField", "feedback"],
										Array_map(getText),
										Array_map(apply(state)),
									),
								)(
									pipe(
										[
											settingUI_flowChatPanel,
											filterPanelOld,
											settingUI_chatFieldPanel,
											feedbackPanel,
										],
										Array_map(apply(c)),
										Array_map(constant),
										Array_map(flip),
										Array_map(apply(state)),
									),
								)(getState("mainTab")(state)),
							],
						)
					: h("div", {})
				var allowedStrings
			}
		__webpack_require__.dn(settingsPanel)
		const settingsComponent = command =>
			pipe(settingsPanel(command), panel =>
				makeComponent(
					tag => s => h(tag, { style: { display: "contents" } }, panel(s)),
				)("span"),
			)
		__webpack_require__.dn(settingsComponent)
		const makeRefs = o =>
			pipe(
				Struct_entries(o),
				Effect_forEach(([k, v]) =>
					pipe(
						SubscriptionRef_make(v),
						Effect_map(ref => [k, ref]),
					),
				),
				Effect_map(Object.fromEntries),
			)
		__webpack_require__.dn(makeRefs)
		const toggleChatButton = setConfig =>
			pipe(
				"button",
				makeComponent(
					tag => state =>
						pipe(
							getText(state.displayChats ? "hideChats" : "showChats")(state),
							label =>
								h(
									tag,
									{
										class: "ytp-button",
										style: {
											background: "none",
											border: "none",
											cursor: "pointer",
											float: "left",
											fontSize: "1em",
											height: "100%",
											outline: "none",
											overflow: "visible",
											padding: "0 0 0em",
											position: "relative",
											width: "48px",
											display: "flex",
											alignItems: "center",
										},
										type: "button",
										"aria-label": label,
										title: label,
										onclick: s =>
											pipe(!s.displayChats, displayChats => [
												{ ...s, displayChats },
												() =>
													Effect_runPromise(
														setConfig.displayChats(displayChats),
													),
											]),
									},
									[
										h(
											"svg",
											{ style: { width: "36px" }, viewBox: "0 0 36 36" },
											[
												h("path", {
													class: "chat-button-path",
													d: "m11 12h17q1 0 1 1v9q0 1-1 1h-1v2l-4-2h-12q-1 0-1-1v-9q0-1 1-1z",
													fill: "#fff",
													"fill-opacity": state.displayChats ? "1" : "0",
													stroke: "#fff",
													"stroke-width": "2",
												}),
											],
										),
									],
								),
						),
				),
			)
		__webpack_require__.dn(toggleChatButton)
		const toggleSettingsPanelComponent = updateState =>
			pipe(
				(
					updateState => (x, e) =>
						pipe({ ...x, showPanel: !x.showPanel }, newState => [
							newState,
							x.showPanel
								? () =>
										decodeUnknownSync(instanceOf(HTMLElement))(
											e.currentTarget,
										).blur()
								: () => {},
							() =>
								Effect_runPromise(
									updateState(oldState => ({ ...oldState, ...newState })),
								),
						])
				)(updateState),
				toggle => state =>
					h(
						"button",
						{
							class: "fyc_button",
							style: {
								background: "rgba(0,0,0,0)",
								marginLeft: "10px",
								whiteSpace: "nowrap",
							},
							onclick: toggle,
						},
						[
							h(
								"svg",
								{
									preserveAspectRatio: "xMidYMid meet",
									viewBox: "0 0 640 640",
									width: "15",
									height: "15",
									style: { position: "relative", top: "1px" },
								},
								[
									h(
										"defs",
										{},
										h("path", {
											id: "d1TbzTC1zI",
											d: "M135 58c25 14 67 30 82 35-7 49 16 109-15 149-50 71-19 184 64 213 74 31 165-18 183-95-3-38 23-62 58-36l120 55c-39 10-106 35-72 85 40 38 1 71-29 98-29 53-70-17-109-5-46 22-25 109-96 85h-55c-24-31-21-103-80-84-32 32-70 31-93-9l-35-36c4-40 57-96-6-120-45 5-58-32-52-68 2-19-4-41 3-59 35-15 100-22 77-79-48-43 1-84 35-115 5-6 12-12 20-14zM577 2c52 3 72 62 62 106-5 51 19 117-27 155-18 24 8 49 11 74-39-8-98-46-146-60-55-1-111 2-167-2-52-15-57-76-52-121S242 52 282 18c38-30 88-11 132-16h163z",
										}),
									),
									h("use", {
										href: "#d1TbzTC1zI",
										opacity: "1",
										fill: "var(--iron-icon-fill-color, currentcolor)",
										"fill-opacity": "1",
									}),
								],
							),
							h(
								"span",
								{
									style: {
										position: "relative",
										top: "-2px",
										marginLeft: "8px,",
									},
								},
								hyperapp_text(getText("setting")(state)),
							),
						],
					),
				button =>
					makeComponent(
						tag => s =>
							h(
								tag,
								{
									style: { float: "left", display: "flex", minHeight: "100%" },
								},
								button(s),
							),
					)("span"),
			)
		__webpack_require__.dn(toggleSettingsPanelComponent)
		const initialize = ({ settingUpdateApps, provideLog }) =>
			provideLog(
				pipe(
					Effect_gen(function* () {
						const updateSettingState = dispatchable =>
								provideLog(
									pipe(
										Ref_get(settingUpdateApps),
										Effect_flatMap(
											Effect_forEach(x => Effect_sync(() => x(dispatchable))),
										),
									),
								),
							channel = new broadcast_channel_BroadcastChannel(
								"fyc-0615654655528523",
							),
							configValue = yield* ((config = src_defaultGMConfig),
							pipe(
								Struct_entries(config),
								Effect_forEach(([k, c]) =>
									c.getValue.pipe(Effect_map(x => [k, x])),
								),
								Effect_map(Object.fromEntries),
							)),
							configRefs = yield* makeRefs(configValue),
							{ setConfigPlain, setChangedConfig, setConfig } =
								configWriteFunnel({
									configValue,
									configRefs,
									configKeys,
									dispatchToSettings: key => val =>
										updateSettingState(setSettingFromConfig(key)(val)),
									broadcastAndPersist: key => val =>
										pipe(
											Effect_promise(() => channel.postMessage([key, val])),
											Effect_zipRight(
												Effect_promise(() =>
													pipe(src_defaultGMConfig[key], x =>
														GM.setValue(x.gmKey, x.toGm(val)),
													),
												),
											),
										),
									defaultFilterExp: () => defaultFilter(configValue),
								})
						var config
						yield* setConfigPlain.filterExp(defaultFilter(configValue))
						return {
							updateSettingState,
							channel,
							configValue,
							configRefs,
							setChangedConfig,
							mainState: {
								chatPlaying: yield* SynchronizedRef_make(!0),
								playerRect: yield* SynchronizedRef_make(
									new DOMRectReadOnly(0, 0, 600, 400),
								),
								flowChats: yield* SynchronizedRef_make([]),
								config: {
									value: configValue,
									getConfig: makeGetter(configValue),
									setConfig,
								},
							},
						}
					}),
					Effect_flatMap(ctx =>
						Effect_gen(function* () {
							const stateInit = settingStateInit(ctx.mainState.config.value)
							return {
								...ctx,
								apps: {
									toggleChatButtonApp: yield* wrapApp(
										toggleChatButton(ctx.mainState.config.setConfig),
										stateInit,
									),
									settingsApp: yield* wrapApp(
										settingsComponent({
											setConfig: ctx.mainState.config.setConfig,
											act: {
												clearFlowChats: removeOldChats(ctx.mainState.flowChats)(
													0,
												),
											},
											provideLog,
										}),
										stateInit,
									),
									toggleSettingsPanelApp: yield* wrapApp(
										toggleSettingsPanelComponent(ctx.updateSettingState),
										stateInit,
									),
								},
							}
						}),
					),
					Effect_tap(ctx =>
						Ref_set(
							settingUpdateApps,
							Array_map(
								[
									ctx.apps.settingsApp,
									ctx.apps.toggleSettingsPanelApp,
									ctx.apps.toggleChatButtonApp,
								],
								x => x.dispatch,
							),
						),
					),
					Effect_tap(ctx =>
						pipe(
							Effect_succeed([
								"Version: 1.20.0",
								`User Agent: ${window.navigator.userAgent}`,
								`GMConfig: ${JSON.stringify(ctx.mainState.config, void 0, "\t")}`,
							]),
							Effect_flatMap(Effect_forEach(x => Effect_logDebug(x))),
						),
					),
					Effect_zipLeft(
						pipe(
							Effect_logDebug("10s..."),
							schedule(Schedule_fixed(seconds(10))),
							Effect_forkDaemon,
						),
					),
					Effect_flatMap(ctx =>
						Effect_gen(function* () {
							const reinitQueue = yield* Queue_unbounded(),
								reinitialize = provideLog(
									Effect_sync(() => {
										requestAnimationFrame(() => {
											Queue_unsafeOffer(reinitQueue, void 0)
										})
									}),
								),
								stream = yield* allStream(provideLog)({
									...ctx,
									reinitQueue,
									reinitialize,
									chatScreen: yield* makeChatScreen,
								})
							yield* pipe(
								(self => stream_run(self, sink_drain))(stream),
								Effect_zipRight(Effect_logWarning("Stream complete")),
								Effect_catchAllCause(cause =>
									logWithMeta(LogLevel_Error)(
										`Stream Errored: ${Cause_pretty(cause)}`,
									)(squash(cause)),
								),
								Effect_forkDaemon,
							)
							yield* reinitialize
						}),
					),
				),
			)
		__webpack_require__.dn(initialize)
		const Logger_make = makeLogger,
			Logger_replace = replaceLogger,
			Logger_withMinimumLogLevel = withMinimumLogLevel,
			Logger_zip = logger_zip,
			Logger_defaultLogger = defaultLogger
		var LogAnnotationKeys
		!(function (LogAnnotationKeys) {
			LogAnnotationKeys.name = "name"
		})(LogAnnotationKeys || (LogAnnotationKeys = {}))
		const src_LogAnnotationKeys = LogAnnotationKeys,
			maxEventLogBlockCount = Math.floor(50),
			preserveEventLogBlockCount = Math.floor(0.2 * maxEventLogBlockCount),
			appendEventLog = (text, level) => x => {
				return pipe(
					x.compressedBlocks.length === maxEventLogBlockCount
						? ((i = Math.floor(preserveEventLogBlockCount)),
							log =>
								i > log.compressedBlocks.length
									? log
									: makeLog({
											nextId: log.nextId,
											...(i === log.compressedBlocks.length
												? {
														lastBlock: [],
														compressedBlocks: log.compressedBlocks,
													}
												: {
														lastBlock: log.lastBlock,
														compressedBlocks: Array_remove(
															log.compressedBlocks,
															i,
														),
													}),
										}))(x)
						: x,
					(
						(text, level) => log =>
							makeLog({
								nextId: log.nextId + 1,
								...pipe(
									log.lastBlock,
									Array_append({ id: log.nextId, text, level }),
									x =>
										200 === x.length
											? {
													compressedBlocks: Array_append(
														log.compressedBlocks,
														makeCompressedLogBlock(
															(0,
															external_LZString_namespaceObject.compressToUTF16)(
																JSON.stringify(x),
															),
														),
													),
													lastBlock: [],
												}
											: {
													compressedBlocks: log.compressedBlocks,
													lastBlock: x,
												},
								),
							})
					)(text, level),
				)
				var i
			}
		__webpack_require__.dn(appendEventLog)
		const updateSettingState = apps => dispatchable =>
			pipe(
				apps,
				Effect_forEach(x => Effect_sync(() => x(dispatchable))),
			)
		__webpack_require__.dn(updateSettingState)
		const eventLogger = apps =>
			Logger_make(({ logLevel, message }) =>
				Effect_runPromise(
					pipe(
						Ref_get(apps),
						Effect_flatMap(x =>
							updateSettingState(x)(s =>
								s.logEvents
									? {
											...s,
											eventLog: appendEventLog(
												String(message),
												logLevel.label,
											)(s.eventLog),
										}
									: s,
							),
						),
					),
				),
			)
		__webpack_require__.dn(eventLogger)
		const Console_debug = (...args) => consoleWith(_ => _.debug(...args)),
			Console_error = (...args) => consoleWith(_ => _.error(...args)),
			Console_info = (...args) => consoleWith(_ => _.info(...args)),
			Console_log = (...args) => consoleWith(_ => _.log(...args)),
			Console_trace = (...args) => consoleWith(_ => _.trace(...args)),
			Console_warn = (...args) => consoleWith(_ => _.warn(...args)),
			getConsoleLog = x =>
				x === Trace
					? Console_trace
					: x === Debug
						? Console_debug
						: x === Info
							? Console_info
							: x === Warning
								? Console_warn
								: x === LogLevel_Error || x === Fatal
									? Console_error
									: Console_log,
			metaLogger = Logger_make(({ logLevel, message, context, annotations }) =>
				Effect_runPromise(
					pipe(
						() =>
							`${pipe(annotations, HashMap_get(src_LogAnnotationKeys.name), Option_match({ onNone: () => "", onSome: x => `[${x}] ` }))}${message}`,
						getStr =>
							pipe(
								FiberRefs_getOrDefault(context, logMeta),
								Option_match({
									onNone: () =>
										greaterThanEqual(Warning)(logLevel)
											? getConsoleLog(logLevel)(getStr())
											: _void,
									onSome: meta =>
										Effect_sync(() =>
											getConsoleLog(logLevel)(`${getStr()}: `, meta),
										),
								}),
							),
					),
				),
			),
			provideLog = settingUpdateApps => effect =>
				pipe(
					Effect_succeed(
						Logger_replace(
							Logger_defaultLogger,
							Logger_zip(metaLogger)(eventLogger(settingUpdateApps)),
						),
					),
					Effect_flatMap(logLayer =>
						pipe(
							effect,
							Effect_tapErrorCause(x => Effect_logError(Cause_pretty(x))),
							Effect_provide(logLayer),
						),
					),
					Effect_annotateLogs(src_LogAnnotationKeys.name, "FYC"),
					Logger_withMinimumLogLevel(Debug),
				)
		__webpack_require__.dn(provideLog)
		Effect_runPromise(
			pipe(
				Effect_gen(function* () {
					const settingUpdateApps = yield* Ref_make([])
					yield* initialize({
						settingUpdateApps,
						provideLog: provideLog(settingUpdateApps),
					})
				}),
				Effect_withConcurrency(30),
			),
		)
	})()
})()