UNPKG

refa

Version:

A library for finite automata and regular expressions in the context of JS RegExp

1 lines 1.01 MB
"use strict";function m(m){function n(i){let a=n.cache.get(i);return void 0===a&&n.cache.set(i,a=m(i)),a}return n.cache=new Map,n}Object.defineProperty(exports,"__esModule",{value:!0});const n=Array.isArray;function i(m,n){let i=0;for(let a=0;a<m.length;a++){const x=m[a];n(x,m[a-i-1])?m[a-i]=x:i++}m.splice(m.length-i,i)}function a(m,n){n===m.length-1?m.pop():m[n]=m.pop()}function x(m,n){let i,a=1/0;for(const x of m){const m=n(x);m<a&&(i=x,a=m)}return i}function e(m){return Array.isArray(m)?m:[...m]}function t(m){return m instanceof Set?m:new Set(m)}function r(m){for(const n of m)return n}function s(m,n){const i=new Set,a=[{element:m,nextIndex:-1}];for(;a.length>0;){const m=a[a.length-1];-1===m.nextIndex&&(i.add(m.element),m.nextElements=e(n(m.element)));const x=m.nextElements;if(!x)throw new Error("This should not happen.");if(m.nextIndex++,m.nextIndex>=x.length){a.pop();continue}const t=x[m.nextIndex];i.has(t)||a.push({element:t,nextIndex:-1})}}function*o(m,n){const i=new Set;let a=[...m],x=[];for(;a.length>0;){for(const m of a)i.has(m)||(i.add(m),yield m,x.push(...n(m)));[a,x]=[x,a],x.length=0}}function l(m,n){const i=new Set,a=[m];let x;for(;a.length;)x=a.pop(),i.has(x)||(i.add(x),n(x,a))}function c(m,n){const i=new Set,a=[...m];let x;for(;a.length;)x=a.pop(),i.has(x)||(i.add(x),n(x,a))}function h(m,n){const i=new Error(n);throw i.data=m,i}function*u(m){for(const n of m)yield*n}function*f(m){for(const n of _(m)){const m=[];for(const i of n)m.push(...i);yield m}}function*p(m){for(const n of _(m))yield[...n]}class d{constructor(m){this._cache=[],this._fullyCached=!1,this._iterator=m[Symbol.iterator]()}[Symbol.iterator](){return this._fullyCached?this._cache[Symbol.iterator]():function*(m){const{_cache:n,_iterator:i}=m;let a=0;for(;!m._fullyCached;)if(a<n.length)yield n[a],a++;else{const x=i.next();if(x.done)m._fullyCached=!0;else{const{value:m}=x;n.push(m),yield m,a++}}for(;a<n.length;a++)yield n[a]}(this)}}function g(m){return Array.isArray(m)||m instanceof Set||m instanceof d?m:new d(m)}function*_(m){const n=e(m).map(g),i=n.map((m=>m[Symbol.iterator]())),a=[];for(const m of i){const n=m.next();if(n.done)return;a.push(n.value)}if(yield a,0!==i.length)for(;;){for(let m=i.length-1;m>=0;m--){const x=i[m].next();if(!x.done){a[m]=x.value;break}if(0===m)return;{i[m]=n[m][Symbol.iterator]();const x=i[m].next();if(x.done)throw new Error;a[m]=x.value}}yield a}}function C(m,n){v(m,n)}function v(m,n){switch(m.type){case"Concatenation":if(null===n)throw new Error("The parent of a concatenation cannot be null.");switch(n.type){case"Alternation":case"Assertion":case"Expression":case"Quantifier":m.parent=n;break;case"Concatenation":throw new Error("A concatenation cannot be parent of a concatenation.");default:throw h(n)}m.elements.forEach((n=>v(n,m)));break;case"Alternation":case"Assertion":case"CharacterClass":case"Quantifier":case"Unknown":if(null===n)throw new Error(`The parent of a(n) ${m.type} cannot be null.`);if("Concatenation"!==n.type)throw new Error(`A(n) ${n.type} cannot be parent of a(n) ${m.type}.`);m.parent=n,"CharacterClass"!==m.type&&"Unknown"!==m.type&&m.alternatives.forEach((n=>v(n,m)));break;case"Expression":if(null!==n)throw new Error(`The parent of an expression has to be null and cannot be a(n) ${n.type}.`);m.parent=null,m.alternatives.forEach((n=>v(n,m)));break;default:throw h(m)}}function y(m,n,i){if("function"!=typeof n){const{start:m,end:i}=n;n=()=>({start:m,end:i})}S(m,n,i)}function S(m,n,i){if(i||!m.source)m.source=n();else{const{start:i,end:a}=m.source;n=()=>({start:i,end:a})}switch(m.type){case"Concatenation":m.elements.forEach((m=>S(m,n,i)));break;case"Alternation":case"Assertion":case"Expression":case"Quantifier":m.alternatives.forEach((m=>S(m,n,i)));break;case"CharacterClass":case"Unknown":break;default:throw h(m)}}function w(m,n){const i=n[`on${m.type}Enter`];switch(i&&i(m),m.type){case"Alternation":case"Assertion":case"Expression":case"Quantifier":for(const i of m.alternatives)w(i,n);break;case"Concatenation":for(const i of m.elements)w(i,n)}const a=n[`on${m.type}Leave`];a&&a(m)}class k{constructor(m){this.name="CombinedTransformer";const n=[];for(const i of m)i instanceof k?n.push(...i.transformers):n.push(i);this.transformers=n}onAlternation(m,n){for(const i of this.transformers)i.onAlternation&&i.onAlternation(m,n)}onAssertion(m,n){for(const i of this.transformers)i.onAssertion&&i.onAssertion(m,n)}onCharacterClass(m,n){for(const i of this.transformers)i.onCharacterClass&&i.onCharacterClass(m,n)}onConcatenation(m,n){for(const i of this.transformers)i.onConcatenation&&i.onConcatenation(m,n)}onExpression(m,n){for(const i of this.transformers)i.onExpression&&i.onExpression(m,n)}onQuantifier(m,n){for(const i of this.transformers)i.onQuantifier&&i.onQuantifier(m,n)}onUnknown(m,n){for(const i of this.transformers)i.onUnknown&&i.onUnknown(m,n)}}function E(m,n,i){var a;const{maxPasses:x=10,events:e}=null!=i?i:{},t={transformer:m,ast:n,maxCharacter:O(n),events:e};for(let m=1;m<=x&&(null===(a=null==e?void 0:e.onPassStart)||void 0===a||a.call(e,n,m),N(t));m++);return n}function O(m){try{return w(m,{onCharacterClassEnter(m){throw m.characters.maximum}}),0}catch(m){if("number"==typeof m)return m;throw m}}function N({transformer:m,ast:n,maxCharacter:i,events:a}){let x,e=!1;const t=m instanceof k?m.transformers:[m],r={onAlternation:t.filter((m=>m.onAlternation)),onAssertion:t.filter((m=>m.onAssertion)),onCharacterClass:t.filter((m=>m.onCharacterClass)),onConcatenation:t.filter((m=>m.onConcatenation)),onExpression:t.filter((m=>m.onExpression)),onQuantifier:t.filter((m=>m.onQuantifier)),onUnknown:t.filter((m=>m.onUnknown))};if(null==a?void 0:a.onChange){let m=!1;const t={maxCharacter:i,signalMutation(){e=m=!0}};x=i=>{const x=`on${i.type}`;for(const e of r[x])m=!1,e[x](i,t),m&&a.onChange(n,i,e)}}else{const m={maxCharacter:i,signalMutation(){e=!0}};x=n=>{const i=`on${n.type}`;for(const a of r[i])a[i](n,m)}}return w(n,{onAlternationLeave:x,onAssertionLeave:x,onCharacterClassLeave:x,onConcatenationLeave:x,onExpressionLeave:x,onQuantifierLeave:x,onUnknownLeave:x}),e}const b=new Map,A=new Map;class I{get isEmpty(){return 0===this.ranges.length}get isAll(){return 1===this.ranges.length&&0===this.ranges[0].min&&this.ranges[0].max===this.maximum}get size(){let m=0;for(let n=0,i=this.ranges.length;n<i;n++){const{min:i,max:a}=this.ranges[n];m+=a-i+1}return m}constructor(m,n){this.maximum=m,this.ranges=n}characters(){return function(m){const n=function(m,n){if(m.length>n)return;const i=[];for(const{min:a,max:x}of m){if(i.length+x-a>=n)return;for(let m=a;m<=x;m++)i.push(m)}return i}(m,8);if(n)return n;return{[Symbol.iterator](){let n=0,i=m[0].min-1;function a(){n>=m.length||(i++,i>m[n].max&&(n++,n<m.length&&(i=m[n].min)))}return{next:()=>(a(),n>=m.length?{done:!0,value:void 0}:{done:!1,value:i})}}}}(this.ranges)}toString(){return`CharSet (${this.maximum}) [${this.toRangesString()}]`}toRangesString(){let m="";for(const{min:n,max:i}of this.ranges)""!==m&&(m+=", "),m+=n===i?n.toString(16):n.toString(16)+".."+i.toString(16);return m}toUnicodeString(){if(this.isEmpty)return"empty";if(this.isAll)return"all";const m=R(this.ranges);if(m.includes("U+")){const n=R(this.negate().ranges),i=z(n,"U+");if(0===i||i<=z(m,"U+")/2)return"not "+n}return m}static empty(m){let n=b.get(m);return void 0===n&&(n=new I(m,[]),b.set(m,n)),n}static all(m){let n=A.get(m);return void 0===n&&(n=new I(m,[{min:0,max:m}]),A.set(m,n)),n}static fromCharacters(m,n){const i=function(m){const n=[];let i,a=0;for(const x of m)if(void 0===i)i=x,a=1;else{const m=i+a;if(x===m)a++;else if(x>m)n.push({min:i,max:m-1}),i=x,a=1;else if(x!==m-1)throw new RangeError("The character iterable has to be sorted.")}void 0!==i&&n.push({min:i,max:i+a-1});return n}(n);if(0===i.length)return I.empty(m);const a=i[i.length-1];if(a.max>m)throw new RangeError(`The character iterable contained the char ${a.max} but all chars have to be <= maximum=${m}.`);return 1===i.length&&0===a.min&&a.max===m?I.all(m):new I(m,i)}static fromRange(m,n){if(n.max>m)throw new RangeError(`The range [min=${n.min}, max=${n.max}] contains characters greater than the maximum=${m}.`);return new I(m,[n])}static fromCharacter(m,n){if(n>m)throw new RangeError(`The character ${n} is greater than the maximum=${m}.`);return new I(m,[{min:n,max:n}])}equals(m){if(!(m instanceof I))return 1===this.ranges.length&&this.ranges[0].min===m.min&&this.ranges[0].max===m.max;if(m===this)return!0;if(this.maximum!==m.maximum)return!1;if(this.ranges.length!==m.ranges.length)return!1;for(let n=0,i=this.ranges.length;n<i;n++){const i=this.ranges[n],a=m.ranges[n];if(i.min!==a.min||i.max!==a.max)return!1}return!0}compare(m){if(m===this)return 0;if(this.maximum!==m.maximum)return this.maximum-m.maximum;if(this.isEmpty)return m.isEmpty?0:-1;if(m.isEmpty)return 1;if(this.ranges[0].min!==m.ranges[0].min)return this.ranges[0].min-m.ranges[0].min;if(this.ranges.length!==m.ranges.length)return this.ranges.length-m.ranges.length;for(let n=0,i=this.ranges.length;n<i;n++){const i=this.ranges[n],a=m.ranges[n];if(i.min!==a.min)return i.min-a.min;if(i.max!==a.max)return i.max-a.max}return 0}resize(m){if(0===this.ranges.length)return I.empty(m);if(m===this.maximum)return this;if(m>this.maximum)return new I(m,this.ranges);if(this.ranges[this.ranges.length-1].max<=m)return new I(m,this.ranges);{const n=L(this.ranges,[{min:0,max:m}]);return 0===n.length?I.empty(m):new I(m,n)}}negate(){return new I(this.maximum,function(m,n){if(0===m.length)return[{min:0,max:n}];{const i=[],a=m[0],x=m[m.length-1];a.min>0&&i.push({min:0,max:a.min-1});for(let n=1;n<m.length;n++)i.push({min:m[n-1].max+1,max:m[n].min-1});return x.max<n&&i.push({min:x.max+1,max:n}),i}}(this.ranges,this.maximum))}union(...m){const n=m[0];if(1===m.length&&n instanceof I)return J(this,n),0===n.ranges.length?this:new I(this.maximum,function(m,n){const i=[];let a=0,x=0,e=m[a],t=n[x];for(;e&&t;)e.min<=t.min?(i.push(e),e=m[++a]):(i.push(t),t=n[++x]);for(;e;e=m[++a])i.push(e);for(;t;t=n[++x])i.push(t);return F(i),i}(this.ranges,n.ranges));const i=this.ranges.slice();for(const n of m)if(n instanceof I)J(this,n),i.push(...n.ranges);else for(const m of n){if(m.max>this.maximum)throw new RangeError(`max=${m.max} has to be <= maximum=${this.maximum}.`);i.push(m)}var a;return(a=i).sort(((m,n)=>m.min-n.min)),F(a),new I(this.maximum,i)}intersect(m){let n;return m instanceof I?(J(this,m),n=L(this.ranges,m.ranges)):n=L(this.ranges,[m]),0===n.length?I.empty(this.maximum):new I(this.maximum,n)}without(m){let n;return m instanceof I?(J(this,m),n=P(this.ranges,m.ranges)):n=P(this.ranges,[m]),0===n.length?I.empty(this.maximum):new I(this.maximum,n)}has(m){return M(this.ranges,m,m)}isSupersetOf(m){if(!(m instanceof I))return M(this.ranges,m.min,m.max);const n=this.ranges,i=m.ranges;let a=0,x=0,e=n[a],t=i[x];for(;e&&t;)if(e.min<=t.min&&e.max>=t.max)t=i[++x];else{if(!(e.max<t.min))return!1;e=n[++a]}return!t}isSubsetOf(m){return m instanceof I?m.isSupersetOf(this):!!this.isEmpty||m.min<=this.ranges[0].min&&this.ranges[this.ranges.length-1].max<=m.max}isProperSupersetOf(m){return this.isSupersetOf(m)&&!this.equals(m)}isProperSubsetOf(m){return this.isSubsetOf(m)&&!this.equals(m)}isDisjointWith(m){return void 0===this.commonCharacter(m)}commonCharacter(m){if(!(m instanceof I))return function(m,n,i){const a=m.length;if(0==a)return;if(i<m[0].min||n>m[a-1].max)return;let x=0,e=a;for(;x<e;){const a=x+(e-x>>1),t=m[a],r=t.min;if(r==n)return n;if(r<n){if(n<=t.max)return n;x=a+1}else{if(r<=i)return r;e=a}}return}(this.ranges,m.min,m.max);const n=this.ranges,i=m.ranges;let a=0,x=0,e=n[a],t=i[x];for(;e&&t;)if(t.max<e.min)t=i[++x];else{if(!(e.max<t.min))return Math.max(e.min,t.min);e=n[++a]}}}function J(m,n){if(n.maximum!==m.maximum)throw new RangeError(`The maximum of the other set (${n.maximum}) has to be equal the maximum of this set (${m.maximum}).`)}function M(m,n,i){const a=m.length;if(0==a)return!1;if(n<m[0].min||i>m[a-1].max)return!1;if(1==a)return!0;let x=0,e=a;for(;x<e;){const a=x+(e-x>>1),t=m[a],r=t.min;if(r==n)return i<=t.max;if(r<n){if(i<=t.max)return!0;x=a+1}else e=a}return!1}function L(m,n){const i=[];let a=0,x=0,e=m[a],t=n[x];for(;e&&t;)e.max<t.min?e=m[++a]:t.max<e.min?t=n[++x]:(i.push({min:Math.max(e.min,t.min),max:Math.min(e.max,t.max)}),e.max<t.max?e=m[++a]:(t.max<e.max||(e=m[++a]),t=n[++x]));return i}function P(m,n){const i=[];let a=0,x=0,e=m[a],t=n[x];for(;e&&t;)e.max<t.min?(i.push(e),e=m[++a]):t.max<e.min?t=n[++x]:e.min<t.min?(i.push({min:e.min,max:t.min-1}),t.max<e.max?(e={min:t.max+1,max:e.max},t=n[++x]):e=m[++a]):e.max>t.max?(e={min:t.max+1,max:e.max},t=n[++x]):e=m[++a];for(;e;e=m[++a])i.push(e);return i}function F(m){let n=0;for(let i=0,a=m.length-1;i<a;i++){const a=m[i-n],x=m[i+1];a.max>=x.max?n++:x.min<=a.max+1?(m[i-n]={min:a.min,max:x.max},n++):m[i-n+1]=x}n&&(m.length=m.length-n)}function T(m){return"U+"+m.toString(16).toUpperCase()}const D=[{min:48,max:57},{min:65,max:90},{min:97,max:122}];function U(m,n){for(const i of D)if(i.min<=m&&n<=i.max)return!0;return!1}const B=/^[\p{L}\p{Number}]$/u,j=/^[\p{P}\p{Math}]$/u;function G(m){const n=String.fromCodePoint(m);return B.test(n)?n:j.test(n)?"'"+n+"'":T(m)}function R(m){let n="";for(const{min:i,max:a}of m)""!==n&&(n+=" "),i===a?n+=G(i):i+1===a?n+=G(i)+" "+G(a):U(i,a)?n+=String.fromCodePoint(i)+"-"+String.fromCodePoint(a):n+=T(i)+"-"+T(a);return n}function z(m,n){let i=0;for(let a=0;;){const x=m.indexOf(n,a);if(-1===x)break;i++,a=x+n.length}return i}class V{constructor(m){this.sets=function(m){const n=[...t(m)].filter((m=>!m.isEmpty)).sort(((m,n)=>m.compare(n))).filter(((m,n,i)=>0===n||!m.equals(i[n-1])));if(0===n.length)return n;if(1===n.length)return n;const i=n[0].maximum,a=[];for(const m of n){if(m.maximum!==i)throw new RangeError("The maximum of all given sets has to be the same.");a.push(...m.ranges)}const x=I.empty(i).union(a),e=new Set;for(let m=0,n=a.length;m<n;m++){const{min:n,max:i}=a[m];e.add(n),e.add(i+1)}const r=[...e].sort(((m,n)=>m-n)),s=new Map;for(let m=1,i=r.length;m<i;m++){const i=r[m-1];if(x.has(i)){let a="";for(let m=0;m<n.length;m++){n[m].has(i)&&(a+=m+" ")}const x=s.get(a),e={min:i,max:r[m]-1};x?x.push(e):s.set(a,[e])}}const o=[];for(const m of s.values())o.push(I.empty(i).union(m));return o}(m)}split(m){const n=[];for(let i=0,a=this.sets.length;i<a;i++)m.has(this.sets[i].ranges[0].min)&&n.push(i);return n}}class W{constructor(){this._array=[]}get isEmpty(){return 0===this._array.length}get size(){let m=0;for(const{range:n}of this._array)m+=n.max-n.min+1;return m}get entryCount(){return this._array.length}_indexOf(m){let n=0,i=this._array.length;for(;n<i;){const a=n+(i-n>>2),x=this._array[a].range;if(m<x.min)i=a;else{if(!(m>x.max))return a;n=a+1}}}_indexOfOrLeft(m){let n=0,i=this._array.length;for(;n<i;){const a=n+(i-n>>2),x=this._array[a].range;if(m<x.min)i=a;else{if(!(m>x.max))return a;if(a+1===this._array.length||m<this._array[a+1].range.min)return a;n=a+1}}}_indexOfOrRight(m){if(0===this._array.length)return;const n=this._indexOfOrLeft(m);return void 0===n?0===this._array.length?void 0:0:m>this._array[n].range.max?n+1<this._array.length?n+1:void 0:n}_indexInRange(m){const n=this._indexOfOrRight(m.min);if(void 0===n)return;const i=this._indexOfOrLeft(m.max);return void 0===i||i<n?void 0:{start:n,stop:i}}_insert(m,n){if(0===this._array.length||this._array[this._array.length-1].range.max+1<m.min)return void this._array.push({range:m,value:n});const i=this._indexOfOrLeft(m.min);if(void 0===i){const i=this._array[0];return void(i.range.min===m.max+1&&i.value===n?i.range={min:m.min,max:i.range.max}:this._array.unshift({range:m,value:n}))}const a=i+1;if(a===this._array.length){const a=this._array[i];return void(a.range.max===m.min-1&&a.value===n?a.range={min:a.range.min,max:m.max}:this._array.push({range:m,value:n}))}const x=this._array[i],e=this._array[a];e.range.min===m.max+1&&e.value===n?x.range.max===m.min-1&&x.value===n?(x.range={min:x.range.min,max:e.range.max},this._array.splice(a,1)):e.range={min:m.min,max:e.range.max}:x.range.max===m.min-1&&x.value===n?x.range={min:x.range.min,max:m.max}:this._array.splice(a,0,{range:m,value:n})}has(m){return void 0!==this._indexOf(m)}hasEvery(m){const n=this._indexInRange(m);if(!n)return!1;for(let m=n.start;m<n.stop;m++)if(this._array[m].range.max+1!==this._array[m+1].range.min)return!1;return!0}hasSome(m){return void 0!==this._indexInRange(m)}get(m){const n=this._indexOf(m);return void 0!==n?this._array[n].value:void 0}set(m,n){this.delete(m),this._insert({min:m,max:m},n)}setRange(m,n){this.deleteRange(m),this._insert(m,n)}setCharSet(m,n){if(this._array.length>0)for(const n of m.ranges)this.deleteRange(n);if(0===this._array.length)for(const i of m.ranges)this._array.push({range:i,value:n});else for(const i of m.ranges)this._insert(i,n)}delete(m){const n=this._indexOf(m);if(void 0===n)return!1;{const i=this._array[n];return i.range.min===i.range.max?this._array.splice(n,1):i.range.min===m?i.range={min:i.range.min+1,max:i.range.max}:i.range.max===m?i.range={min:i.range.min,max:i.range.max-1}:this._array.splice(n,1,{range:{min:i.range.min,max:m-1},value:i.value},{range:{min:m+1,max:i.range.max},value:i.value}),!0}}deleteRange(m){const n=this._indexInRange(m);if(n)if(n.start===n.stop){const i=this._array[n.start];m.min<=i.range.min&&i.range.max<=m.max?this._array.splice(n.start,1):i.range.min<m.min&&m.max<i.range.max?(this._array.splice(n.start+1,0,{range:{min:m.max+1,max:i.range.max},value:i.value}),i.range={min:i.range.min,max:m.min+1}):m.max<i.range.max?i.range={min:m.max+1,max:i.range.max}:i.range={min:i.range.min,max:m.min-1}}else{const i=this._array[n.start];i.range.min<m.min&&(i.range={min:i.range.min,max:m.min-1},n.start++);const a=this._array[n.stop];a.range.max>m.max&&(a.range={min:m.max+1,max:a.range.max},n.stop--),this._array.splice(n.start,n.stop-n.start+1)}}clear(){this._array=[]}copy(m){if(!m){const m=new W;return m._array=this._array.map((m=>({range:m.range,value:m.value}))),m}const n=new W;return n._array=this._array.map((n=>({range:n.range,value:m(n.value)}))),i(n._array,((m,n)=>!n||n.range.max+1!==m.range.min||n.value!==m.value||(n.range={min:n.range.min,max:m.range.max},!1))),n}map(m){for(const n of this._array)n.value=m(n.value,n.range,this);i(this._array,((m,n)=>!n||n.range.max+1!==m.range.min||n.value!==m.value||(n.range={min:n.range.min,max:m.range.max},!1)))}mapRange(m,n){const i=[];function a(m,n){if(void 0===n)return;const a=i[i.length-1];a&&a.range.max+1===m.min&&a.value===n?a.range={min:a.range.min,max:m.max}:i.push({range:m,value:n})}const x=this._array.length;if(0===x)a(m,n(void 0,m,this));else{const i=this._array[0],e=i.range.min,t=this._array[x-1].range.max;if(!(m.min<=e&&t<=m.max))throw new Error("Partial range maps aren't supported yet");if(m.min<e){const i={min:m.min,max:e-1};a(i,n(void 0,i,this))}a(i.range,n(i.value,i.range,this));for(let m=1;m<x;m++){const i=this._array[m-1],x=this._array[m],e={min:i.range.max+1,max:x.range.min-1};e.min<=e.max&&a(e,n(void 0,e,this)),a(x.range,n(x.value,x.range,this))}if(t<m.max){const i={min:t+1,max:m.max};a(i,n(void 0,i,this))}}this._array=i}filter(m){i(this._array,(n=>m(n.value,n.range,this)))}invert(m){const n=new Map;for(const{range:m,value:i}of this._array){let a=n.get(i);void 0===a&&n.set(i,a=[]),a.push(m)}const i=new Map;for(const[a,x]of n)i.set(a,I.empty(m).union(x));return i}forEach(m){for(const n of this._array)m(n.value,n.range,this)}*keys(){for(const{range:m}of this._array)yield m}*values(){for(const{value:m}of this._array)yield m}*entries(){for(const{range:m,value:n}of this._array)yield[m,n]}[Symbol.iterator](){return this.entries()}}function Q(n,i,a,x){const e=m((m=>I.fromCharacters(x,[m])));for(const m of a){let a=n.initial;for(const t of m){if(t>x)throw new Error(`The character (${t}) has to be <= maxCharacter (${x}).`);let m=i(a,t);void 0===m&&(m=n.createNode(),n.linkNodes(a,m,e(t))),a=m}n.makeFinal(a)}return{initial:n.initial,stableOut:!0,getOut:m=>m,isFinal:m=>n.isFinal(m)}}function H(m,n,i){const a=new $(m.initial);for(const x of n){let n=new Set([a]);for(const a of x){if(a.maximum!==i)throw new Error(`The maximum (${a.maximum}) of the char set has to be == maxCharacter (${i}).`);const x=new Set;for(const i of n)for(const n of i.getNext(a,m))x.add(n);n=x}for(const m of n)m.isFinal=!0}return l(a,((n,i)=>{n.isFinal&&m.makeFinal(n.builderNode);for(const{to:a,via:x}of n.out)i.push(a),m.linkNodes(n.builderNode,a.builderNode,x)})),{initial:m.initial,stableOut:!0,getOut:m=>m,isFinal:n=>m.isFinal(n)}}class q{constructor(m,n){this.to=m,this.via=n}}class ${constructor(m){this.out=[],this.isFinal=!1,this.builderNode=m}copy(m){const n=new $(m.createNode());n.isFinal=this.isFinal;for(const{to:i,via:a}of this.out)n.out.push(new q(i.copy(m),a));return n}getNext(m,n){const i=[],a=[];for(let x=0,e=this.out.length;x<e;x++){const e=this.out[x];if(e.via.isDisjointWith(m));else if(e.via.isSubsetOf(m))a.push(e.via),i.push(e.to);else{const x=new q(e.to.copy(n),e.via.intersect(m));this.out.push(x),e.via=e.via.without(m),a.push(x.via),i.push(x.to)}}const x=0===a.length?m:m.without(I.empty(m.maximum).union(...a));if(!x.isEmpty){const m=new q(new $(n.createNode()),x);this.out.push(m),i.push(m.to)}return i}}function K(m,n,i=!1){return{initial:m.initial,getOut:n,stableOut:i,isFinal:m.isFinal}}function Z(m,n){return{initial:m.initial,getOut:m.getOut,stableOut:m.stableOut,isFinal:n}}function X(m,n){const i=m.getOut;return K(m,(m=>n(i(m))))}function Y(m,n){const i=m.getOut;return K(m,(function*(m){for(const a of i(m))yield n(a)}))}function mm(m,n){const i=m.getOut;return K(m,(function*(m){for(const a of i(m))n(a)&&(yield a)}))}function nm(m,n){l(m.initial,n?(i,a)=>{n(i),a.push(...m.getOut(i))}:(n,i)=>{i.push(...m.getOut(n))})}function im(m){return m.stableOut?m:function(m){const n=new Map,i=m.getOut;return K(m,(m=>{let a=n.get(m);return void 0===a&&(a=i(m),n.set(m,a)),a}),!0)}(m)}function am(m){const{initial:n,getOut:i}=m;return o([n],i)}function xm(m){const{isFinal:n}=m;for(const i of am(m))if(n(i))return!0;return!1}function em(m){const{initial:n,getOut:i}=m,a=new Set,x=new Set([n]),t=[{element:n,nextIndex:-1}];for(;t.length>0;){const m=t[t.length-1];-1===m.nextIndex&&(x.add(m.element),a.add(m.element),m.nextElements=e(i(m.element)));const n=m.nextElements;if(m.nextIndex++,m.nextIndex>=n.length){x.delete(m.element),t.pop();continue}const r=n[m.nextIndex];if(x.has(r))return!0;a.has(r)||t.push({element:r,nextIndex:-1})}return!1}function tm(m){const n=[...am(m=im(X(m,e)))],i=n.filter(m.isFinal),a=function(m,n){const i=new Map;for(const n of m)i.set(n,new Set);for(const a of m)for(const m of n(a))i.get(m).add(a);return i}(n,m.getOut),x=new Set(o(i,(m=>a.get(m))));return!em(mm(m,(m=>x.has(m))))}function rm(m,n){const{initial:i,getOut:a,isFinal:x}=m;if(x(i))return[];const e=new Map;function t(m){const n=[];for(;;){const i=e.get(m);if(null===i)return n.reverse();n.push(i.item),m=i.from}}e.set(m.initial,null);let r=[m.initial];for(;r.length>0;){const m=[];for(const i of r)for(const r of a(i)){const a=n(r);if(!e.has(a)){if(e.set(a,{item:r,from:i}),x(a))return t(a);m.push(a)}}r=m}}function sm(m,n,i){n=im(n),i=im(i);const a=om(),x=om();n.isFinal(n.initial)&&i.isFinal(i.initial)&&m.makeFinal(m.initial);const e=new Map;e.set(m.initial,[n.initial,i.initial]);const t={[`${a(n.initial)};${x(i.initial)}`]:m.initial};function r(r,s){const o=a(r)+";"+x(s);let l=t[o];return void 0===l&&(l=m.createNode(),t[o]=l,e.set(l,[r,s]),n.isFinal(r)&&i.isFinal(s)&&m.makeFinal(l)),l}const s=function(){const m={},n=new Map;function i(i){let a=n.get(i);if(void 0===a){let x=function(m){let n=65535&m.maximum;return m.ranges.forEach((({min:m,max:i})=>{n=65535&(31*n+m^31*i)})),n}(i);for(;;){const e=m[x];if(void 0===e){m[x]=i,a=n.size;break}if(e.equals(i)){a=n.get(e);break}x=x+1&65535}n.set(i,a)}return a}const a={};return(m,n)=>{const x=i(m),e=i(n);if(x==e)return m;let t;t=x<e?x+";"+e:e+";"+x;let r=a[t];return void 0===r&&(r=m.intersect(n),r.isEmpty&&(r=null),a[t]=r),r}}();function o(a){const x=function(m){const n=e.get(m);if(void 0===n)throw new Error("All created nodes have to be indexed.");return n}(a),t=n.getOut(x[0]),o=i.getOut(x[1]);for(const[n,i]of t)for(const[x,e]of o){const t=s(i,e);t&&m.linkNodes(a,r(n,x),t)}}return{initial:m.initial,getOut:m=>(o(m),m),isFinal:n=>m.isFinal(n)}}function om(){const m=new Map;return n=>{let i=m.get(n);return void 0===i&&(i=m.size,m.set(n,i)),i}}function lm(m,n){n=im(n);const{charSets:a,ids:x}=function(m){const n=new Set,i=new Map;let a=0;return l(m.initial,((x,e)=>{i.set(x,a),a++;for(const[i,a]of m.getOut(x))n.add(a),e.push(i)})),{charSets:n,ids:i}}(n),e=new V(a),t=new Map,r=new Map;function s(m){let n="";for(let i=0,a=m.length;i<a;i++)n+=","+x.get(m[i]);return n}function o(a,e){const o=[];for(const m of a)for(const[i,a]of n.getOut(m))a.has(e)&&o.push(i);return 0===o.length?void 0:function(a){a.sort(((m,n)=>x.get(m)-x.get(n))),i(a,((m,n)=>m!==n));const e=s(a);let o=t.get(e);return void 0===o&&(o=m.createNode(),a.some((m=>n.isFinal(m)))&&m.makeFinal(o),t.set(e,o),r.set(o,a)),o}(o)}return t.set(s([n.initial]),m.initial),r.set(m.initial,[n.initial]),n.isFinal(n.initial)&&m.makeFinal(m.initial),{initial:m.initial,getOut:n=>{const i=(a=n,r.get(a));var a;for(const a of e.sets){const x=o(i,a.ranges[0].min);void 0!==x&&m.linkNodes(n,x,a)}return n},isFinal:n=>m.isFinal(n)}}class cm extends Error{static assert(m,n,i){let a=m,x=n;if("number"!=typeof a&&(a=a.maxCharacter),"number"!=typeof x&&(x=x.maxCharacter),a!==x)throw new cm(void 0!==i?`The two ${i} do not have the same max character. ${a} != ${x}`:`Different max character. ${a} != ${x}`)}}class hm extends Error{static assert(m,n,i){if(m>n)throw new hm(`The ${i} is not allowed to create more than ${n} nodes.`)}}class um{constructor(m=1/0){this._counter=0,this.initial=new Map,this.finals=new Set,this._limit=m}makeFinal(m){this.finals.add(m)}isFinal(m){return this.finals.has(m)}createNode(){return hm.assert(++this._counter,this._limit,"MapFABuilder"),new Map}linkNodes(m,n,i){const a=m.get(n);void 0===a?m.set(n,i):m.set(n,a.union(i))}}function fm(m,n){const{initial:i,getOut:a,isFinal:x}=im(m),e=new Map;function t(m){const i=e.get(m);if(void 0!==i)return i;if(x(m))return e.set(m,!0),!0;const t=new Map,r=new Set([m]);let s=[m];for(;s.length>0;){const m=[];for(let i=0,o=s.length;i<o;i++){const o=s[i];for(const i of a(o)){const a=n(i);let s=t.get(a);if(void 0===s&&(s=[],t.set(a,s)),s.push(o),r.has(a))continue;r.add(a);const l=e.get(a);if(!0===l||x(a))return pm(e,a,t),!0;!1!==l&&m.push(a)}}s=m}return r.forEach((m=>e.set(m,!1))),!1}return{initial:i,getOut:function(m){const i=[];for(const x of a(m))t(n(x))&&i.push(x);return i},isFinal:x}}function pm(m,n,i){var a;m.set(n,!0);let x=[n];for(;x.length>0;){const n=[];for(let e=0,t=x.length;e<t;e++){const t=x[e];null===(a=i.get(t))||void 0===a||a.forEach((i=>{m.has(i)||(m.set(i,!0),n.push(i))}))}x=n}}function dm(m){const n=im(X(m,e)),i=[...am(Y(n,(([m])=>m)))],a=new Map(i.map(((m,n)=>[m,n])));return{stableIter:n,states:i,info:{isInitial:m=>m===n.initial,isFinal:n.isFinal,getId:m=>a.get(m),getNumberOfOutgoingEdges:m=>n.getOut(m).length}}}function gm(m,n){const{getEdgeAttributes:i,getGraphAttributes:a=Cm,getNodeAttributes:x=_m}="transitionToString"in n?function({transitionToString:m,ordered:n=!1}){return{getEdgeAttributes(i,a,x,e,t){const r={label:m(i)};return n&&t.getNumberOfOutgoingEdges(x)>1&&(r.taillabel=String(a+1)),r}}}(n):n,{stableIter:e,states:t,info:r}=dm(m);let s="";function o(m){if(/^[a-zA-Z_]\w*$/.test(m))s+=m;else{let n=m.replace(/[\\"]/g,(m=>"\\"+m));"\\"===n[n.length-1]&&(n+=" "),s+='"'+n+'"'}}function l(m){if("number"==typeof m){const n=String(m);/^-?(?:\.\d+|\d+(?:\.\d*)?)$/.test(n)?s+=n:o(n)}else o(m)}function c(m){s+="[";let n=!0;for(const i in m)if(Object.prototype.hasOwnProperty.call(m,i)){const a=m[i];if(void 0===a)continue;n?n=!1:s+=", ",o(i),s+="=",l(a)}s+="]"}function h(m){s+="n"+m}s+="digraph ",s+="{\n",s+="\t// graph attributes\n";const u=a();for(const m in u)if(Object.prototype.hasOwnProperty.call(u,m)){const n=u[m];if(void 0===n)continue;s+="\t",o(m),s+="=",l(n),s+=";\n"}return s+="\n\t// nodes\n",s+="\tnull [shape=point];\n",t.forEach(((m,n)=>{s+="\t",h(n),s+=" ",c(x(m,r)),s+=";\n"})),s+="\n\t// edges\n",s+="\tnull -> n0;\n",t.forEach(((m,n)=>{e.getOut(m).forEach((([a,x],e)=>{s+="\t",h(n),s+=" -> ",function(m){s+="n"+r.getId(m)}(a),s+=" ",c(i(x,e,m,a,r)),s+=";\n"}))})),s+="}",s}const _m=(m,n)=>({label:String(n.getId(m)),shape:n.isFinal(m)?"doublecircle":"circle"}),Cm=()=>({rankdir:"LR"});function vm(m,n){const{getEdgeAttributes:i,getNodeAttributes:a=ym}="transitionToString"in n?function({transitionToString:m,ordered:n=!1}){return{getEdgeAttributes(i,a,x,e,t){let r=m(i),s=1;return n&&t.getNumberOfOutgoingEdges(x)>1&&(r=`(${a+1}) ${r}`,s=a+1),{label:r,length:s}}}}(n):n,{stableIter:x,states:e,info:t}=dm(m);let r="";function s(m){0===m.length?r+=" ":/^\w+$/.test(m)?r+=m:r+='"'+m.replace(/"/g,"&quot")+'"'}function o(m){r+="n"+m}return r+="flowchart LR\n",r+="%% nodes\n",r+="\tnull(( ))\n",e.forEach(((m,n)=>{r+="\t",o(n),function(m){r+=m.shape[0],s(m.label),r+=m.shape[1]}(a(m,t)),r+="\n"})),r+="\n%% edges\n",r+="\tnull -.-> n0\n",e.forEach(((m,n)=>{x.getOut(m).forEach((([a,x],e)=>{var l,c;r+="\t",o(n),r+=" ",l=i(x,e,m,a,t),r+="-".repeat((null!==(c=l.length)&&void 0!==c?c:1)+1)+">",void 0!==l.label&&(r+="|",s(l.label),r+="|"),r+=" ",function(m){r+="n"+t.getId(m)}(a),r+="\n"}))})),r.trim()}const ym=(m,n)=>({label:String(n.getId(m)),shape:n.isFinal(m)?["(((",")))"]:["((","))"]});function Sm(m){if(Array.isArray(m))return m.every(Sm);switch(m.type){case"Alternation":case"Expression":return Sm(m.alternatives);case"Assertion":return!0;case"CharacterClass":case"Unknown":return!1;case"Concatenation":return m.elements.every(Sm);case"Quantifier":return 0===m.max||Sm(m.alternatives);default:h(m)}}function wm(m){if(Array.isArray(m))return m.length>=1&&m.every(wm);switch(m.type){case"Alternation":case"Expression":return wm(m.alternatives);case"Assertion":return Om(m);case"CharacterClass":case"Unknown":return!1;case"Concatenation":return m.elements.every(wm);case"Quantifier":return 0===m.max||wm(m.alternatives);default:h(m)}}function km(m){if(Array.isArray(m))return m.some(km);switch(m.type){case"Alternation":case"Expression":return km(m.alternatives);case"Assertion":return Om(m);case"CharacterClass":case"Unknown":return!1;case"Concatenation":return m.elements.every(km);case"Quantifier":return 0===m.min||km(m.alternatives);default:h(m)}}function Em(m){if(Array.isArray(m))return m.every(Em);switch(m.type){case"Alternation":case"Expression":return Em(m.alternatives);case"Assertion":case"Unknown":return!1;case"CharacterClass":return!0;case"Concatenation":return m.elements.some(Em);case"Quantifier":return m.min>0&&Em(m.alternatives);default:h(m)}}function Om(m){return m.negate?0===m.alternatives.length:km(m.alternatives)}function Nm(m,n,i){if(n(m))return!0;if(i&&!i(m))return!1;switch(m.type){case"Alternation":case"Expression":case"Assertion":case"Quantifier":return m.alternatives.some((m=>Nm(m,n,i)));case"Concatenation":return m.elements.some((m=>Nm(m,n,i)))}return!1}function bm(m,n){return new Am([...m,n])}class Am{constructor(m){if(this.stack=m,"Expression"!==m[0].type)throw new Error("Invalid stack")}get node(){return this.stack[this.stack.length-1]}toParentPath(){return this.stack.pop(),0===this.stack.length?null:this}toChildPath(m){return this.stack.push(m),this}}const Im={min:0,max:0},Jm={min:1,max:1};function Mm(m){if(Array.isArray(m)){let n=1/0,i=0;for(const a of m){const m=Mm(a);m&&(n=Math.min(n,m.min),i=Math.max(i,m.max))}return n>i?void 0:{min:n,max:i}}switch(m.type){case"Alternation":case"Expression":return Mm(m.alternatives);case"Assertion":return Im;case"CharacterClass":return m.characters.isEmpty?void 0:Jm;case"Concatenation":{let n=0,i=0;for(const a of m.elements){const m=Mm(a);if(!m)return;n+=m.min,i+=m.max}return{min:n,max:i}}case"Quantifier":{if(0===m.max)return Im;const n=Mm(m.alternatives);return n?0===n.max?Im:{min:n.min*m.min,max:n.max*m.max}:0===m.min?Im:void 0}case"Unknown":return;default:throw h(m)}}const Lm={min:0,max:0,assertMax:0},Pm={min:1,max:1,assertMax:1};function Fm(m,n){if(Array.isArray(m)){let i=1/0,a=0,x=0;for(const e of m){const m=Fm(e,n);m&&(i=Math.min(i,m.min),a=Math.max(a,m.max),x=Math.max(x,m.assertMax))}return i>a?void 0:{min:i,max:a,assertMax:x}}switch(m.type){case"Alternation":case"Expression":return Fm(m.alternatives,n);case"Assertion":return m.kind===n?Fm(m.alternatives,n):Lm;case"CharacterClass":return m.characters.isEmpty?void 0:Pm;case"Concatenation":{let i=0,a=0,x=0;for(const e of m.elements){const m=Fm(e,n);if(!m)return;x=Math.max(x,a+m.assertMax),i+=m.min,a+=m.max}return{min:i,max:a,assertMax:x}}case"Quantifier":{if(0===m.max)return Lm;const i=Fm(m.alternatives,n);if(!i)return 0===m.min?Lm:void 0;if(0===i.max)return Lm;const a=i.max*m.max;return{min:i.min*m.min,max:a,assertMax:a+i.assertMax===1/0?1/0:a+i.assertMax-i.max}}case"Unknown":return;default:throw h(m)}}function Tm(m){return"ltr"===m||"ahead"===m?"ltr":"rtl"}function Dm(m){return"ltr"===m||"ahead"===m?"rtl":"ltr"}function Um(m,n,i){if(Array.isArray(m))return Rm(m.map((m=>Um(m,n,i))),i);switch(m.type){case"Alternation":case"Expression":return Um(m.alternatives,n,i);case"Assertion":if(Tm(m.kind)===n){if(m.negate){if(Nm(m,(n=>n!==m&&"Assertion"===n.type)))return a();const e=Um(m.alternatives,n,i),t=Mm(m.alternatives);return e.empty||!t?{char:I.empty(i),empty:!1,exact:!0}:e.exact&&1===t.max?x({char:e.char.negate(),edge:!0,exact:!0}):a()}return x(Vm(Um(m.alternatives,n,i)))}return a();case"CharacterClass":return{char:m.characters,empty:!1,exact:!0};case"Concatenation":{let a=m.elements;return"rtl"===n&&(a=[...a],a.reverse()),zm(function*(){for(const m of a)yield Um(m,n,i)}(),i)}case"Quantifier":{if(0===m.max)return x();const a=Um(m.alternatives,n,i);return 0===m.min?Rm([x(),a],i):a}case"Unknown":return{char:I.all(i),empty:!1,exact:!1};default:throw h(m)}function a(){return x({char:I.all(i),edge:!0,exact:!1})}function x(m){return jm(i,m)}}function Bm(m){return{char:I.all(m),edge:!0,exact:!0}}function jm(m,n){return{char:I.empty(m),empty:!0,exact:!0,look:null!=n?n:Bm(m)}}class Gm{constructor(m){this.char=I.empty(m),this.exact=!0}add(m,n){!this.exact||n||this.char.isSupersetOf(m)?!this.exact&&n&&m.isSupersetOf(this.char)&&(this.exact=!0):this.exact=!1,this.char=this.char.union(m)}}function Rm(m,n){const i=new Gm(n),a=[];for(const n of m)i.add(n.char,n.exact),n.empty&&a.push(n.look);if(a.length>0){const m=new Gm(n);let x=!1;for(const n of a)m.add(n.char,n.exact),x=x||n.edge;return{char:i.char,exact:i.exact,empty:!0,look:{char:m.char,exact:m.exact,edge:x}}}return{char:i.char,exact:i.exact,empty:!1}}function zm(m,n){const i=new Gm(n);let a=Bm(n);for(const n of m){if(i.add(n.char.intersect(a.char),a.exact&&n.exact),!n.empty)return{char:i.char,exact:i.exact,empty:!1};{const m=a.char.intersect(n.look.char);a={char:m,exact:a.exact&&n.look.exact||m.isEmpty,edge:a.edge&&n.look.edge}}}return{char:i.char,exact:i.exact,empty:!0,look:a}}function Vm(m){if(m.empty){const n=new Gm(m.char.maximum);return n.add(m.char,m.exact),n.add(m.look.char,m.look.exact),{char:n.char,exact:n.exact,edge:m.look.edge}}return{char:m.char,exact:m.exact,edge:!1}}function Wm(m,n,i,a,x){function e(m,n,i){var x,e,r,s,o,l,c,h,u,f;const p=n=null!==(e=null===(x=a.enter)||void 0===x?void 0:x.call(a,m,n,i))&&void 0!==e?e:n;if(null===(s=null===(r=a.continueInto)||void 0===r?void 0:r.call(a,m,n,i))||void 0===s||s)switch(m.type){case"Alternation":n=a.join(m.alternatives.map((m=>t(m,a.fork(n,i),i))),i);break;case"Assertion":{const x=Tm(m.kind),e=a.join(m.alternatives.map((m=>t(m,a.fork(n,i),x))),x);n=null!==(l=null===(o=a.endPath)||void 0===o?void 0:o.call(a,n,x,"assertion"))&&void 0!==l?l:n,n=null!==(h=null===(c=a.assert)||void 0===c?void 0:c.call(a,n,i,e,x))&&void 0!==h?h:n;break}case"Quantifier":if(0===m.max);else{const x=m.alternatives.map((m=>t(m,a.fork(n,i),i)));0===m.min&&x.push(n),n=a.join(x,i)}}return n=null!==(f=null===(u=a.leave)||void 0===u?void 0:u.call(a,m,n,p,i))&&void 0!==f?f:n}function t(m,n,i){var x,t;let r="ltr"===i?0:m.elements.length-1;const s="ltr"===i?1:-1;for(;0<=r&&r<m.elements.length;r+=s){const s=m.elements[r];n=e(s,n,i);if(!(null===(t=null===(x=a.continueAfter)||void 0===x?void 0:x.call(a,s,n,i))||void 0===t||t))break}return n}return"enter"===n&&(i=e(m.node,i,x)),function(m,n,i){var x,t;function r(m){var x,e;const t=m.node;if(!(null===(e=null===(x=a.continueAfter)||void 0===x?void 0:x.call(a,t,n,i))||void 0===e||e))return!1;const s=m.toParentPath(),o=s.node,l=o.elements.indexOf(t)+("ltr"===i?1:-1),c=o.elements[l];if(c)return s.toChildPath(c);{const m=s.toParentPath(),n=m.node;if("Expression"===n.type)return"expression";if("Assertion"===n.type)return"assertion";if("Alternation"===n.type)return r(m);if("Quantifier"===n.type)return n.max<=1?r(m):[n,r(m)];throw h(n)}}for(;;){let s=r(m);for(;Array.isArray(s);){const[m,x]=s;n=a.join([n,e(m,a.fork(n,i),i)],i),s=x}if(!1===s)return n;if("assertion"===s||"expression"===s)return n=null!==(t=null===(x=a.endPath)||void 0===x?void 0:x.call(a,n,i,s))&&void 0!==t?t:n;n=e(s.node,n,i),m=s}}(m,i,x)}function Qm(m,n,i){const a=function(m,n,i){return Wm(m,"next",jm(i),{fork:m=>m,join:m=>Rm(m,i),enter:(m,n,a)=>zm([n,Um(m,a,i)],i),continueInto:()=>!1,continueAfter:(m,n)=>n.empty},n)}(m,n,i);return Vm(a)}function Hm(m,n){if(Array.isArray(m))return!!Array.isArray(n)&&qm(m,n);if(Array.isArray(n))return!1;if(m.type!==n.type)return!1;switch(m.type){case"Alternation":case"Expression":{const i=n;return qm(m.alternatives,i.alternatives)}case"Assertion":{const i=n;return m.kind===i.kind&&m.negate===i.negate&&qm(m.alternatives,i.alternatives)}case"CharacterClass":{const i=n;return m.characters.equals(i.characters)}case"Concatenation":{const i=n,a=m.elements.length;if(a!==i.elements.length)return!1;for(let n=0;n<a;n++)if(!Hm(m.elements[n],i.elements[n]))return!1;return!0}case"Quantifier":{const i=n;return m.min===i.min&&m.max===i.max&&m.lazy===i.lazy&&qm(m.alternatives,i.alternatives)}case"Unknown":{const i=n;return m.id===i.id}default:throw h(m)}}function qm(m,n){const i=m.length;if(i!==n.length)return!1;for(let a=0;a<i;a++)if(!Hm(m[a],n[a]))return!1;return!0}function $m(m,n){if(Array.isArray(n))return qm(m.alternatives,n);if("Alternation"===n.type)return qm(m.alternatives,n.alternatives);if("Concatenation"===n.type)return 1===n.elements.length?$m(m,n.elements[0]):1===m.alternatives.length&&Hm(m.alternatives[0],n);if(1===m.alternatives.length){const i=m.alternatives[0];return 1===i.elements.length&&Hm(i.elements[0],n)}return!1}function Km(m){if(n(m))return m;switch(m.type){case"Expression":return m.alternatives;case"Concatenation":return[m];default:return[{type:"Concatenation",elements:[m],source:m.source}]}}function Zm(m){return m?{start:m.start,end:m.end}:void 0}function Xm(m){return function(m){const n=m;switch(n.type){case"Alternation":return{type:"Alternation",source:Zm(n.source),alternatives:n.alternatives.map((m=>Xm(m)))};case"Assertion":return{type:"Assertion",kind:n.kind,negate:n.negate,source:Zm(n.source),alternatives:n.alternatives.map((m=>Xm(m)))};case"CharacterClass":return{type:"CharacterClass",source:Zm(n.source),characters:n.characters};case"Concatenation":return{type:"Concatenation",source:Zm(n.source),elements:n.elements.map((m=>Xm(m)))};case"Expression":return{type:"Expression",source:Zm(n.source),alternatives:n.alternatives.map((m=>Xm(m)))};case"Quantifier":return{type:"Quantifier",lazy:n.lazy,min:n.min,max:n.max,source:Zm(n.source),alternatives:n.alternatives.map((m=>Xm(m)))};case"Unknown":return{type:"Unknown",id:n.id,source:Zm(n.source)};default:h(n)}}(m)}function Ym(m){switch(m.type){case"CharacterClass":case"Unknown":return 1;case"Alternation":case"Assertion":case"Expression":case"Quantifier":return m.alternatives.reduce(((m,n)=>m+Ym(n)),1);case"Concatenation":return m.elements.reduce(((m,n)=>m+Ym(n)),1);default:return h(m)}}function mn(m){switch(m.type){case"CharacterClass":case"Unknown":return 1;case"Alternation":case"Assertion":case"Expression":case"Quantifier":return m.alternatives.reduce(((m,n)=>Math.max(m,mn(n))),0)+1;case"Concatenation":return m.elements.reduce(((m,n)=>Math.max(m,mn(n))),0)+1;default:return h(m)}}function nn(m,n){return n<0&&(n+=m.length),m[n]}function an(m,n){return n<0&&(n+=m.length),m[n]}function xn(m,n,i){n<0&&(n+=m.length),m[n]=i}function en(m,n){return n<m.length&&-n<=m.length}function tn(m){return"ltr"===m?0:-1}function rn(m){return"ltr"===m?1:-1}function sn(m){return 1===m.alternatives.length&&1===m.alternatives[0].elements.length&&"CharacterClass"===m.alternatives[0].elements[0].type}function on(m,n){let i=!1;for(const a of m)ln(a,n)&&(i=!0);return i}function ln({elements:m},n){if(0===m.length)return!1;const i="behind"===n?1:-1,a="behind"===n?0:-1;let x,e=NaN;for(let t=a;en(m,t);t+=i){const i=an(m,t);if("Assertion"===i.type&&!i.negate&&i.kind===n){x=i,e=t;break}if(!Sm(i))break}if(x){m.splice(e,1),on(x.alternatives,n);const i=1===x.alternatives.length?x.alternatives[0].elements:[{type:"Alternation",alternatives:x.alternatives,source:x.source}];return"behind"===n?m.unshift(...i):m.push(...i),!0}{const i=nn(m,a);return!(!i||"Alternation"!==i.type&&("Quantifier"!==i.type||1!==i.max))&&on(i.alternatives,n)}}function cn(m,n,a,x,e){let t=!1;function r(m){switch(m.type){case"Assertion":if(!a||!m.negate){const i=m.negate?1:0,r=m.negate?0:1;if(0===m.alternatives.length)return i;if(km(m.alternatives))return r;if(Tm(m.kind)===x){if(cn(m,n,a,x,e)&&(t=!0,0===m.alternatives.length))return i;const s=Um(m.alternatives,x,e);if(s.empty)return 2;if(n.isDisjointWith(s.char))return i;if(!Nm(m,(n=>n!==m&&"Assertion"===n.type))){const i=Mm(m.alternatives);if(i&&1===i.max&&s.exact&&n.isSubsetOf(s.char))return r}}}return 2;case"Alternation":return cn(m,n,a,x,e)&&(t=!0),0===m.alternatives.length?0:2;case"CharacterClass":return m.characters.isDisjointWith(n)?0:2;case"Quantifier":if(0===m.max)return 1;if(1===m.max)return cn(m,n,a,x,e)&&(t=!0),0===m.alternatives.length?0===m.min?1:0:2;{const i=Um(m.alternatives,x,e);return!i.empty&&i.char.isDisjointWith(n)?0===m.min?1:0:2}case"Unknown":return 2;default:h(m)}}return i(m.alternatives,(m=>{const n="ltr"===x?1:-1;for(let i="ltr"===x?0:-1;en(m.elements,i);i+=n){const a=an(m.elements,i),x=r(a);if(1===x)t=!0,m.elements.splice(i,1),i-=n;else{if(0===x)return t=!0,!1;if("Assertion"===a.type);else{if("Alternation"!==a.type&&("Quantifier"!==a.type||1!==a.min||1!==a.max)||1!==a.alternatives.length)return!0;t=!0,m.elements.splice(i,1,...a.alternatives[0].elements),i-=n}}}return!0})),t}function hn(m,n){return"rtl"===m&&n.reverse(),n}function un(m,n,i){"ltr"===m?n.push(i):n.unshift(i)}function fn(m,n,i){"ltr"===m?n.unshift(i):n.push(i)}function pn(m,n,i){const a=Tm(m.kind);if(cn(m,n.characters,!1,a,i.maxCharacter)&&i.signalMutation(),m.negate){const x=new Set;for(const a of m.alternatives)if(1===a.elements.length){const m=a.elements[0];"CharacterClass"===m.type&&(n.characters=n.characters.without(m.characters),i.signalMutation(),x.add(a))}if(x.size>0)return m.alternatives=m.alternatives.filter((m=>!x.has(m))),i.signalMutation(),hn(Tm(m.kind),[m,n]);for(const x of m.alternatives){const{elements:e}=x,t=tn(a),r=nn(e,t);if(r&&dn(r)){const s=_n(r).characters;i.signalMutation(),"CharacterClass"===r.type?e.splice(t,1):(r.min--,r.max--);const o=1===m.alternatives.length?[]:[{type:"Assertion",negate:m.negate,kind:m.kind,alternatives:m.alternatives.filter((m=>m!==x)).map(Xm),source:Zm(m.source)}];if(s.isSupersetOf(n.characters))return hn(a,[...o,n,m]);{const x=s.intersect(n.characters);if(x.isEmpty)throw new Error("Rejecting branch wasn't removed properly.");return i.signalMutation(),n.characters=n.characters.without(s),hn(a,[...o,{type:"Alternation",alternatives:[{type:"Concatenation",elements:[n]},{type:"Concatenation",elements:hn(a,[{type:"CharacterClass",characters:x},m])}]}])}}}}else if(1===m.alternatives.length){const{elements:x}=m.alternatives[0],e=tn(a),t=nn(x,e);if(t&&dn(t)){const a=_n(t).characters;i.signalMutation(),"CharacterClass"===t.type?x.splice(e,1):(t.min--,t.max--);const r=a.intersect(n.characters);if(r.isEmpty)throw new Error("Rejecting branch wasn't removed properly.");return i.signalMutation(),n.characters=r,hn(Tm(m.kind),[n,m])}return}}function dn(m){return"CharacterClass"===m.type||"Quantifier"===m.type&&m.min>=1&&sn(m)}function gn(m,n,i){for(let a=n;en(m,a);a+=i){const n=an(m,a);if(dn(n))return n;if(!Sm(n))break}}function _n(m){if("CharacterClass"===m.type)return m;{const n=m.alternatives[0].elements[0];return{type:"CharacterClass",characters:n.characters,source:Zm(n.source)}}}function Cn(m){if(m.negate&&!sn(m))return;const n=tn(Tm(m.kind)),i=nn(m.alternatives[0].elements,n);void 0!==i&&dn(i);const a=_n(i);return m.negate?a.characters.negate():a.characters}function vn(m,n,i){if(m.length<2)return;const a=Tm(n),x=tn(a),e=rn(a);for(let t=x;en(m,t);t+=e){const x=an(m,t);if("Assertion"!==x.type||x.kind!==n)continue;const r=gn(m,t+e,e);if(void 0===r)continue;let s=pn(x,_n(r),i);void 0===s?Om(x)&&(i.signalMutation(),m.splice(t,1),t-=e):(i.signalMutation(),m.splice(t,1),t-=e,s=s.filter((m=>"Assertion"!==m.type||!Om(m))),"Quantifier"===r.type&&(r.min--,r.max--,un(a,s,r)),m.splice(m.indexOf(r),1,...s))}}function yn(m,n,i){const{elements:a}=m;if(a.length<2)return;const x=Tm(n),e=tn(x),t=rn(x);function r(m){for(let n=m;en(a,n);n+=t){const m=an(a,n);if(!Sm(m)){if("Quantifier"===m.type||"Alternation"===m.type)return m;break}}}for(let s=e;en(a,s);s+=t){const e=an(a,s);if("Assertion"!==e.type||e.kind!==n)continue;if(e.negate&&!sn(e))continue;const o=r(s+t);if(void 0===o)continue;const l=Um(e.alternatives,x,i.maxCharacter);if(l.empty)continue;const c=e.negate?l.char.negate():l.char,h=e.negate;if("Quantifier"===o.type&&0===o.min&&o.max>=1){const n=Um(o.alternatives,x,i.maxCharacter);if(!n.empty){if(n.char.isDisjointWith(c)){i.signalMutation(),a.splice(a.indexOf(o),1);continue}const e=Qm(bm([{type:"Expression",alternatives:[m]},m],o),x,i.maxCharacter);if(e.char.isDisjointWith(c)&&!(e.edge&&h)){i.signalMutation(),o.min=1;continue}}}("Alternation"===o.type||"Quantifier"===o.type&&1===o.max)&&cn(o,c,h,x,i.maxCharacter)&&i.signalMutation()}}function Sn(m,n,i){if(m.length<2)return;const a=Tm(n),x=tn(a),e=rn(a);for(let t=x+e;en(m,t);t+=e){const x=t-e,r=an(m,x);if("Assertion"!==r.type||r.kind!==n||!sn(r))continue;const s=t,o=an(m,s);if("Quantifier"!==o.type||!(0===o.min&&o.max>0)||!Em(o.alternatives))continue;i.signalMutation(),o.min++;const l={type:"Alternation",alternatives:[{type:"Concatenation",elements:hn(a,[Xm(r),o])},{type:"Concatenation",elements:[r]}]};o.lazy&&l.alternatives.reverse(),xn(m,x,l),m.splice(s,1)}}function wn(m){0===m.min&&m.max;const n={type:"Alternation",alternatives:m.alternatives,source:Zm(m.source)},i={type:"Concatenation",elements:[],source:Zm(m.source)};return m.lazy?n.alternatives.unshift(i):n.alternatives.push(i),n}function kn(m,n,a){var x;if(m.length<2)return;const e=Tm(n),t=tn(e),r=rn(e),s=m=>{const i=function(m){return"ltr"===m?-1:0}(e),a=nn(m.elements,i);return void 0!==a&&"Assertion"===a.type&&a.kind===n&&function(m){if(1!==m.alternatives.length)return!1;const n=m.alternatives[0],i=tn(Tm(m.kind)),a=nn(n.elements,i);return void 0!==a&&dn(a)}(a)?a:void 0};for(let n=t+r;en(m,n);n+=r){const t=n,l=an(m,t);let c;if(!dn(l))continue;c=l;const h=n-r,u=an(m,h);let f;if("Alternation"===u.type)f=u;else{if("Quantifier"!==u.type||0!==u.min||1!==u.max||!u.alternatives.some(s))continue;f=wn(u),a.signalMutation(),xn(m,h,f)}const p="CharacterClass"===(o=c).type?o.characters:o.alternatives[0].elements[0].characters,d=new Map;if(i(f.alternatives,(m=>{const n=s(m);if(void 0!==n){const i=Cn(n);if(void 0!==i){if(i.isDisjointWith(p))return a.signalMutation(),!1;if(sn(n))return p.isSubsetOf(i)?(a.signalMutation(),m.elements.splice(m.elements.indexOf(n),1),!0):(a.signalMutation(),m.elements.splice(m.elements.indexOf(n),1),d.set(m,i.intersect(p)),!0)}return d.set(m,p),!0}return!0})),d.size>0){a.signalMutation();for(const m of f.alternatives)un(e,m.elements,{type:"CharacterClass",characters:null!==(x=d.get(m))&&void 0!==x?x:p});"CharacterClass"===c.type?m.splice(t,1):(c.min--,c.max--)}}var o}function En(m,n,a){if(m.length<2)return;const x=Tm(n),e=tn(x),t=rn(x);for(let r=e+t;en(m,r);r+=t){const e=r-t,s=an(m,e);if("Assertion"!==s.type||s.kind!==n)continue;const o=r,l=an(m,o);let c,h;if("Alternation"!==l.type||Sm(l))if("Quantifier"===l.type&&l.min>=1&&Em(l)&&!sn(l)){const n=l;n.min--,n.max--,c={type:"Alternation",alternatives:Xm(n).alternatives,source:Zm(n.source)};const i=[c,n];"rtl"===x&&i.reverse(),a.signalMutation(),m.splice(m.indexOf(l),1,...i),a.signalMutation(),m.splice(m.indexOf(s),1)}else{if("Quantifier"!==l.type||0!==l.min||1!==l.max||sn(l))continue;c=wn(l),xn(m,o,c),a.signalMutation(),m.splice(e,1)}else c=l,a.signalMutation(),m.splice(e,1);let u=!1;if(sn(s)){const m=s.alternatives[0].elements[0].characters;h=s.negate?m.negate():m,u=!0}else if(!s.negate){const m=Vm(Um(s.alternatives,x,a.maxCharacter));m.edge||(h=m.char,u=!0)}i(c.alternatives,(m=>{if(h){const n=Um(m,x,a.maxCharacter);if(!n.empty){if(n.char.isDisjointWith(h))return!1;if(u&&n.char.isSubsetOf(h))return!0}}return fn(x,m.elements,Xm(s)),!0}))}}function On(m,n,i){const a=Tm(n),x=m=>{const i=rn(Dm(a));for(let x=tn(Dm(a));en(m.elements,x);x+=i){const i=an(m.elements,x);if("Assertion"===i.type&&i.kind===n&&sn(i))return i;if(!Sm(i))break}};for(let n=0;n<m.length;n++){const e=m[n];if("Quantifier"!==e.type||1!==e.alternatives.length||e.max<2||!Em(e.alternatives))continue;const t=e.alternatives[0],r=x(t);if(!r)continue;let s=r.alternatives[0].elements[0].characters;s=r.negate?s.negate():s;const o=Um(t,a,i.maxCharacter),l=!o.empty&&o.char.isSubsetOf(s),c=e.min;let h;if(0===e.min&&(e.min=1),i.signalMutation(),t.elements.splice(t.elements.indexOf(r),1),l)h=hn(a,[e,r]);else{const m=Xm(t).elements,n=Xm(r);fn(a,t.elements,n),e.min--,e.max--,h="ltr"===a?[