@amritk/nish-x86_64-linux 0.27.2 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL.md +13 -8
- package/bin/nish +0 -0
- package/docs/AI.md +19 -2
- package/package.json +1 -1
- package/runtime/core.d.ts +47 -0
- package/runtime/core.mjs +67 -0
- package/runtime/nish.d.ts +49 -0
- package/runtime/nish.h +50 -5
- package/runtime/nish.mjs +6 -0
- package/runtime/runtime-checksum.c +270 -0
- package/runtime/runtime-parallel.c +21 -0
- package/runtime/runtime-sandbox.c +470 -0
- package/runtime/runtime-sha256.c +239 -0
- package/scripts/build.sh +44 -23
- package/std/README.md +15 -10
- package/std/compress/checksum.ts +88 -75
- package/std/compress/deflate.ts +224 -0
- package/std/compress/gzip.ts +52 -0
- package/std/crypto/bcrypt.ts +816 -280
- package/std/json-equal.ts +335 -0
- package/std/json-format.ts +1070 -0
- package/std/json-number.ts +428 -0
- package/std/json-pointer.ts +245 -0
- package/std/json-value.ts +510 -17
- package/std/net/http-compress.ts +259 -16
- package/std/net/http1-client.ts +104 -19
- package/std/net/http1-server.ts +61 -12
- package/std/net/postgres.ts +405 -0
- package/std/net/websocket.ts +295 -14
- package/std/regex.ts +613 -52
- package/std/term-io.ts +35 -8
- package/std/yaml-json.ts +841 -0
package/std/regex.ts
CHANGED
|
@@ -22,13 +22,22 @@
|
|
|
22
22
|
* {n} {n,} {n,m}` with their lazy `?` forms. Escapes are `\n \r \t \f \v \0`,
|
|
23
23
|
* `\cX`, `\xHH`, `\uHHHH`, `\u{H…}` and a backslash before any syntax
|
|
24
24
|
* character; a `{`, `}` or `]` that does not belong to a quantifier or a
|
|
25
|
-
* class is an error rather than a literal, so write `\{`.
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* class is an error rather than a literal, so write `\{`. `\p{…}` and
|
|
26
|
+
* `\P{…}` are Unicode 16.0's properties as JavaScript names them: a
|
|
27
|
+
* General_Category value (`L`, `Lu`, `Letter`, `gc=Nd`), `Script=` or
|
|
28
|
+
* `Script_Extensions=` a script (`sc=Grek`, `scx=Deva`), or a binary property
|
|
29
|
+
* (`Alphabetic`, `Emoji`, `ASCII`, `Any`, `Assigned`). The flags are `i`, `m`
|
|
30
|
+
* (`^` and `$` at line terminators), `s` (`.` matches them too) and `u`,
|
|
31
|
+
* which changes nothing. `i` folds A-Z to a-z, and above ASCII follows
|
|
32
|
+
* Unicode's simple case folding, so `σ` matches `Σ` and `ς` and `[α-ω]` the
|
|
33
|
+
* capitals; unlike JavaScript nothing folds across ASCII, so the Kelvin sign
|
|
34
|
+
* and `ſ` match no `k` or `s`, though under `i` both are word characters to
|
|
35
|
+
* `\w`, `\W`, `\b` and `\B`, as with JavaScript's `iu`. **Backreferences and
|
|
28
36
|
* lookaround are refused at compile time**: they are what makes a matcher
|
|
29
37
|
* backtrack, and this one never does. A repeat count is at most 1,000, a
|
|
30
38
|
* pattern at most 100,000 instructions once its repeats are written out,
|
|
31
|
-
* 1,024 capturing groups and 10,000 ranges in one class
|
|
39
|
+
* 1,024 capturing groups and 10,000 ranges in one class, and its property
|
|
40
|
+
* escapes and case folding add at most 100,000 ranges to its classes.
|
|
32
41
|
*
|
|
33
42
|
* **Matching never backtracks.** A search runs a lazy DFA first: it builds
|
|
34
43
|
* its states from the compiled program as the text needs them, so it reads a
|
|
@@ -83,6 +92,65 @@
|
|
|
83
92
|
|
|
84
93
|
import { uncheckedGet } from "nish:unsafe"
|
|
85
94
|
|
|
95
|
+
// Derived from the Unicode Character Database 16.0.0 (https://www.unicode.org/Public/16.0.0/ucd/), the files scripts/gen-regex-unicode.mjs names. Copyright © 1991-2026 Unicode, Inc. Used under the Unicode License v3, whose text follows.
|
|
96
|
+
//
|
|
97
|
+
// UNICODE LICENSE V3
|
|
98
|
+
//
|
|
99
|
+
// COPYRIGHT AND PERMISSION NOTICE
|
|
100
|
+
//
|
|
101
|
+
// Copyright © 1991-2026 Unicode, Inc.
|
|
102
|
+
//
|
|
103
|
+
// NOTICE TO USER: Carefully read the following legal agreement. BY
|
|
104
|
+
// DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
|
|
105
|
+
// SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
|
|
106
|
+
// TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
|
|
107
|
+
// DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
|
|
108
|
+
//
|
|
109
|
+
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
110
|
+
// copy of data files and any associated documentation (the "Data Files") or
|
|
111
|
+
// software and any associated documentation (the "Software") to deal in the
|
|
112
|
+
// Data Files or Software without restriction, including without limitation
|
|
113
|
+
// the rights to use, copy, modify, merge, publish, distribute, and/or sell
|
|
114
|
+
// copies of the Data Files or Software, and to permit persons to whom the
|
|
115
|
+
// Data Files or Software are furnished to do so, provided that either (a)
|
|
116
|
+
// this copyright and permission notice appear with all copies of the Data
|
|
117
|
+
// Files or Software, or (b) this copyright and permission notice appear in
|
|
118
|
+
// associated Documentation.
|
|
119
|
+
//
|
|
120
|
+
// THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
|
121
|
+
// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
122
|
+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
123
|
+
// THIRD PARTY RIGHTS.
|
|
124
|
+
//
|
|
125
|
+
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
|
|
126
|
+
// BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
|
|
127
|
+
// OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
128
|
+
// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
129
|
+
// ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
|
|
130
|
+
// FILES OR SOFTWARE.
|
|
131
|
+
//
|
|
132
|
+
// Except as contained in this notice, the name of a copyright holder shall
|
|
133
|
+
// not be used in advertising or otherwise to promote the sale, use or other
|
|
134
|
+
// dealings in these Data Files or Software without prior written
|
|
135
|
+
// authorization of the copyright holder.
|
|
136
|
+
// gen-regex-unicode:begin -- generated by scripts/gen-regex-unicode.mjs; edit that, not this.
|
|
137
|
+
/** `\p{…}` names, `|key=offset|`; the key is `g`, `b` or `s` and the name (Unicode 16.0.0). */
|
|
138
|
+
const REGEX_PROPERTY_NAMES: string =
|
|
139
|
+
"|gC=0|gOther=0|gCc=1789|gControl=1789|gcntrl=1789|gCf=1796|gFormat=1796|gCn=1868|gUnassigned=1868|gCo=3649|gPrivate_Use=3649|gCs=3670|gSurrogate=3670|gL=3678|gLetter=3678|gLC=5316|gCased_Letter=5316|gLl=5684|gLowercase_Letter=5684|gLm=7068|gModifier_Letter=7068|gLo=7286|gOther_Letter=7286|gLt=8596|gTitlecase_Letter=8596|gLu=8622|gUppercase_Letter=8622|gM=9979|gMark=9979|gCombining_Mark=9979|gMc=10777|gSpacing_Mark=10777|gMe=11241|gEnclosing_Mark=11241|gMn=11261|gNonspacing_Mark=11261|gN=12129|gNumber=12129|gNd=12548|gDecimal_Number=12548|gdigit=12548|gNl=12772|gLetter_Number=12772|gNo=12814|gOther_Number=12814|gP=13031|gPunctuation=13031|gpunct=13031|gPc=13562|gConnector_Punctuation=13562|gPd=13582|gDash_Punctuation=13582|gPe=13645|gClose_Punctuation=13645|gPf=13825|gFinal_Punctuation=13825|gPi=13851|gInitial_Punctuation=13851|gPo=13879|gOther_Punctuation=13879|gPs=14388|gOpen_Punctuation=14388|gS=14574|gSymbol=14574|gSc=15185|gCurrency_Symbol=15185|gSk=15258|gModifier_Symbol=15258|gSm=15342|gMath_Symbol=15342|gSo=15512|gOther_Symbol=15512|gZ=16010|gSeparator=16010|gZl=16036|gLine_Separator=16036|gZp=16041|gParagraph_Separator=16041|gZs=16046|gSpace_Separator=16046|bASCII=16071|bASCII_Hex_Digit=16075|bAHex=16075|bAlphabetic=16083|bAlpha=16083|bAny=17887|bAssigned=~1868|bBidi_Control=17894|bBidi_C=17894|bBidi_Mirrored=17908|bBidi_M=17908|bCase_Ignorable=18170|bCI=18170|bCased=19267|bChanges_When_Casefolded=19670|bCWCF=19670|bChanges_When_Casemapped=20974|bCWCM=20974|bChanges_When_Lowercased=21306|bCWL=21306|bChanges_When_NFKC_Casefolded=22582|bCWKCF=22582|bChanges_When_Titlecased=24407|bCWT=24407|bChanges_When_Uppercased=25716|bCWU=25716|bDash=27030|bDefault_Ignorable_Code_Point=27104|bDI=27104|bDeprecated=27168|bDep=27168|bDiacritic=27198|bDia=27198|bEmoji=27770|bEmoji_Component=28111|bEComp=28111|bEmoji_Modifier=28149|bEMod=28149|bEmoji_Modifier_Base=28155|bEBase=28155|bEmoji_Presentation=28253|bEPres=28253|bExtended_Pictographic=28448|bExtPict=28448|bExtender=28647|bExt=28647|bGrapheme_Base=28780|bGr_Base=28780|bGrapheme_Extend=30873|bGr_Ext=30873|bHex_Digit=31781|bHex=31781|bIDS_Binary_Operator=31798|bIDSB=31798|bIDS_Trinary_Operator=31808|bIDST=31808|bID_Continue=31813|bIDC=31813|bID_Start=33689|bIDS=33689|bIdeographic=35328|bIdeo=35328|bJoin_Control=35415|bJoin_C=35415|bLogical_Order_Exception=35420|bLOE=35420|bLowercase=35443|bLower=35443|bMath=36859|bNoncharacter_Code_Point=37177|bNChar=37177|bPattern_Syntax=37266|bPat_Syn=37266|bPattern_White_Space=37340|bPat_WS=37340|bQuotation_Mark=37354|bQMark=37354|bRadical=37393|bRegional_Indicator=37404|bRI=37404|bSentence_Terminal=37410|bSTerm=37410|bSoft_Dotted=37662|bSD=37662|bTerminal_Punctuation=37765|bTerm=37765|bUnified_Ideograph=38087|bUIdeo=38087|bUppercase=38151|bUpper=38151|bVariation_Selector=39520|bVS=39520|bWhite_Space=39538|bWSpace=39538|bspace=39538|bXID_Continue=39567|bXIDC=39567|bXID_Start=41459|bXIDS=41459|sAdlm=43113,43124|sAdlam=43113,43124|sAghb=43149,43158|sCaucasian_Albanian=43149,43158|sAhom=43176,43176|sArab=43186,43331|sArabic=43186,43331|sArmi=43472,43472|sImperial_Aramaic=43472,43472|sArmn=43480,43496|sArmenian=43480,43496|sAvst=43514,43523|sAvestan=43514,43523|sBali=43539,43539|sBalinese=43539,43539|sBamu=43548,43548|sBamum=43548,43548|sBass=43561,43561|sBassa_Vah=43561,43561|sBatk=43569,43569|sBatak=43569,43569|sBeng=43577,43608|sBengali=43577,43608|sBhks=43671,43671|sBhaiksuki=43671,43671|sBopo=43684,43696|sBopomofo=43684,43696|sBrah=43737,43737|sBrahmi=43737,43737|sBrai=43749,43749|sBraille=43749,43749|sBugi=43755,43762|sBuginese=43755,43762|sBuhd=43774,43779|sBuhid=43774,43779|sCakm=43786,43795|sChakma=43786,43795|sCans=43812,43812|sCanadian_Aboriginal=43812,43812|sCari=43827,43834|sCarian=43827,43834|sCham=43854,43854|sCher=43867,43881|sCherokee=43867,43881|sChrs=43906,43906|sChorasmian=43906,43906|sCopt=43912,43923|sCoptic=43912,43923|sQaac=43912,43923|sCpmn=43955,43962|sCypro_Minoan=43955,43962|sCprt=43973,43990|sCypriot=43973,43990|sCyrl=44016,44057|sCyrillic=44016,44057|sDeva=44116,44135|sDevanagari=44116,44135|sDiak=44169,44169|sDives_Akuru=44169,44169|sDogr=44189,44196|sDogra=44189,44196|sDsrt=44211,44211|sDeseret=44211,44211|sDupl=44218,44233|sDuployan=44218,44233|sEgyp=44262,44262|sEgyptian_Hieroglyphs=44262,44262|sElba=44274,44281|sElbasan=44274,44281|sElym=44294,44294|sElymaic=44294,44294|sEthi=44300,44388|sEthiopic=44300,44388|sGara=44479,44490|sGaray=44479,44490|sGeor=44509,44540|sGeorgian=44509,44540|sGlag=44582,44601|sGlagolitic=44582,44601|sGong=44651,44668|sGunjala_Gondi=44651,44668|sGonm=44692,44711|sMasaram_Gondi=44692,44711|sGoth=44734,44740|sGothic=44734,44740|sGran=44757,44791|sGrantha=44757,44791|sGrek=44853,44947|sGreek=44853,44947|sGujr=45061,45092|sGujarati=45061,45092|sGukh=45133,45140|sGurung_Khema=45133,45140|sGuru=45151,45186|sGurmukhi=45151,45186|sHang=45231,45277|sHangul=45231,45277|sHani=45340,45425|sHan=45340,45425|sHano=45567,45572|sHanunoo=45567,45572|sHatr=45577,45577|sHatran=45577,45577|sHebr=45587,45612|sHebrew=45587,45612|sHira=45639,45661|sHiragana=45639,45661|sHluw=45711,45711|sAnatolian_Hieroglyphs=45711,45711|sHmng=45718,45718|sPahawh_Hmong=45718,45718|sHmnp=45733,45733|sNyiakeng_Puachue_Hmong=45733,45733|sHung=45746,45758|sOld_Hungarian=45746,45758|sItal=45782,45782|sOld_Italic=45782,45782|sJava=45791,45802|sJavanese=45791,45802|sKali=45813,45822|sKayah_Li=45813,45822|sKana=45829,45874|sKatakana=45829,45874|sKawi=45938,45938|sKhar=45949,45949|sKharoshthi=45949,45949|sKhmr=45969,45969|sKhmer=45969,45969|sKhoj=45982,45991|sKhojki=45982,45991|sKits=46008,46008|sKhitan_Small_Script=46008,46008|sKnda=46022,46051|sKannada=46022,46051|sKrai=46102,46102|sKirat_Rai=46102,46102|sKthi=46109,46118|sKaithi=46109,46118|sLana=46138,46138|sTai_Tham=46138,46138|sLaoo=46152,46152|sLao=46152,46152|sLatn=46177,46289|sLatin=46177,46289|sLepc=46462,46462|sLepcha=46462,46462|sLimb=46472,46485|sLimbu=46472,46485|sLina=46502,46513|sLinear_A=46502,46513|sLinb=46529,46549|sLinear_B=46529,46549|sLisu=46576,46587|sLyci=46606,46612|sLycian=46606,46612|sLydi=46622,46630|sLydian=46622,46630|sMahj=46645,46652|sMahajani=46645,46652|sMaka=46670,46670|sMakasar=46670,46670|sMand=46676,46683|sMandaic=46676,46683|sMani=46693,46702|sManichaean=46693,46702|sMarc=46715,46715|sMarchen=46715,46715|sMedf=46725,46725|sMedefaidrin=46725,46725|sMend=46732,46732|sMende_Kikakui=46732,46732|sMerc=46741,46741|sMeroitic_Cursive=46741,46741|sMero=46752,46758|sMeroitic_Hieroglyphs=46752,46758|sMlym=46768,46786|sMalayalam=46768,46786|sModi=46820,46829|sMong=46842,46862|sMongolian=46842,46862|sMroo=46888,46888|sMro=46888,46888|sMtei=46898,46898|sMeetei_Mayek=46898,46898|sMult=46910,46924|sMultani=46910,46924|sMymr=46942,46960|sMyanmar=46942,46960|sNagm=46981,46981|sNag_Mundari=46981,46981|sNand=46988,46999|sNandinagari=46988,46999|sNarb=47029,47029|sOld_North_Arabian=47029,47029|sNbat=47035,47035|sNabataean=47035,47035|sNewa=47043,47043|sNkoo=47052,47060|sNko=47052,47060|sNshu=47080,47080|sNushu=47080,47080|sOgam=47091,47091|sOgham=47091,47091|sOlck=47096,47096|sOl_Chiki=47096,47096|sOnao=47102,47111|sOl_Onal=47102,47111|sOrkh=47124,47131|sOld_Turkic=47124,47131|sOrya=47146,47177|sOriya=47146,47177|sOsge=47219,47229|sOsage=47219,47229|sOsma=47249,47249|sOsmanya=47249,47249|sOugr=47257,47263|sOld_Uyghur=47257,47263|sPalm=47277,47277|sPalmyrene=47277,47277|sPauc=47283,47283|sPau_Cin_Hau=47283,47283|sPerm=47290,47297|sOld_Permic=47290,47297|sPhag=47317,47324|sPhags_Pa=47317,47324|sPhli=47344,47344|sInscriptional_Pahlavi=47344,47344|sPhlp=47352,47362|sPsalter_Pahlavi=47352,47362|sPhnx=47376,47376|sPhoenician=47376,47376|sPlrd=47384,47384|sMiao=47384,47384|sPrti=47396,47396|sInscriptional_Parthian=47396,47396|sRjng=47404,47404|sRejang=47404,47404|sRohg=47413,47422|sHanifi_Rohingya=47413,47422|sRunr=47444,47452|sRunic=47444,47452|sSamr=47458,47466|sSamaritan=47458,47466|sSarb=47478,47478|sOld_South_Arabian=47478,47478|sSaur=47484,47484|sSaurashtra=47484,47484|sSgnw=47493,47493|sSignWriting=47493,47493|sShaw=47504,47511|sShavian=47504,47511|sShrd=47521,47528|sSharada=47521,47528|sSidd=47555,47555|sSiddham=47555,47555|sSind=47565,47574|sKhudawadi=47565,47574|sSinh=47591,47623|sSinhala=47591,47623|sSogd=47663,47670|sSogdian=47663,47670|sSogo=47681,47681|sOld_Sogdian=47681,47681|sSora=47688,47688|sSora_Sompeng=47688,47688|sSoyo=47696,47696|sSoyombo=47696,47696|sSund=47703,47703|sSundanese=47703,47703|sSunu=47712,47721|sSunuwar=47712,47721|sSylo=47743,47750|sSyloti_Nagri=47743,47750|sSyrc=47764,47777|sSyriac=47764,47777|sTagb=47823,47832|sTagbanwa=47823,47832|sTakr=47844,47853|sTakri=47844,47853|sTale=47870,47877|sTai_Le=47870,47877|sTalu=47895,47895|sNew_Tai_Lue=47895,47895|sTaml=47907,47950|sTamil=47907,47950|sTang=48015,48031|sTangut=48015,48031|sTavt=48054,48054|sTai_Viet=48054,48054|sTelu=48063,48092|sTelugu=48063,48092|sTfng=48132,48142|sTifinagh=48132,48142|sTglg=48161,48168|sTagalog=48161,48168|sThaa=48177,48183|sThaana=48177,48183|sThai=48206,48214|sTibt=48233,48254|sTibetan=48233,48254|sTirh=48279,48288|sTirhuta=48279,48288|sTnsa=48311,48311|sTangsa=48311,48311|sTodr=48320,48327|sTodhri=48320,48327|sToto=48348,48354|sTutg=48363,48390|sTulu_Tigalari=48363,48390|sUgar=48434,48434|sUgaritic=48434,48434|sVaii=48442,48442|sVai=48442,48442|sVith=48449,48449|sVithkuqi=48449,48449|sWara=48469,48469|sWarang_Citi=48469,48469|sWcho=48478,48478|sWancho=48478,48478|sXpeo=48487,48487|sOld_Persian=48487,48487|sXsux=48496,48496|sCuneiform=48496,48496|sYezi=48512,48523|sYezidi=48512,48523|sYiii=48545,48556|sYi=48545,48556|sZanb=48581,48581|sZanabazar_Square=48581,48581|sZinh=48588,48679|sInherited=48588,48679|sQaai=48588,48679|sZyyy=48758,49225|sCommon=48758,49225|sZzzz=49635,49635|sUnknown=49635,49635|"
|
|
140
|
+
/** The range lists `REGEX_PROPERTY_NAMES` points into, in base-32 digits from `0`. */
|
|
141
|
+
const REGEX_PROPERTY_DATA: string =
|
|
142
|
+
"g00ORNQ0<0f91536000C0\\<0Q51QA120QF7J35@E0UO0Q?1QJ1S4=QJ1Q@1>0K100:4N7R:0U007111E0600231811137031041H1205311E06010101100431122063006@9208020E06010419020210>31;660207111E0601041811126231041A9105220321000121222;3422031050=D4<020F0?18020361021013196E020F09041802036151031902;<020QB02053?1I020A2G080016203500075912;QI3LQ4100040G000F1400060913OR70Q33Q60Q30>0<Q4V500401[H031600031Q8031Q0031600031>0QH031R21O2I5RE151dL2RH6E8G8C;<0201;RM19595=0:5RH6Q:4R59N0;3;302Q914:Q;3I5:2QM1R00L1:595=1NQ@R<0U57QK2>2QM4Q:1:7Q:4`E151Q515170000000N1QD0>0=150B12080:4I4Q@?11J0<2Q0>Q0>T;3dIE:DQhC1O0ZL4Q<00401QG61=G86060606060606060SMQ1I0RH;VEIR?0RE1S64Q:0RM0RE8Q?0lc<2QF8ZKCUG7V=110007DQJ295QG7R57;5SC:M2R=0:3Q00QF8=191S6GK95151586060QK3SM195Zm3;F3Q@XX3[=1S9Q56;44I040001010SL?]L1QE60OQ95QB0B03340T63UM251515122606<11;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q=T1L2Q@>K3Q38M4Q:4M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1QA0147020L1239686QOOQ63;8QE2L1J4I63;6R?R8QFQB<QB6Q=795Q52L71V?N0Q90211?2QFQ;7Q9EIQ5KCF8R=3Q38QM04<H695QD0A7Q68RO0C:A0Q>QM600030>0:5QJ495307111E0601040911121050461624:900100Q509001003090171LRK04MR779U5QE1Q5Q1R4:95<BQI595CKJ1>3FUHQKS3RB;71017010M011;89R571Q=1:JR77RB<R869UEQ1=9580Q<0=9L2O1E0=R86010Q;2001087955010Q4010569YEH6@0Q82LRD0>QA<lJS5S>04:V3Rb;S2<QQ??E9SlJ4b6VeHQIQf5aH6N093R@095M159R599060D4B]?QIV5RJS4R:3QH6@QO4:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286913SjOWI5]CR;Q=1F8SCQKWE9Q61R97S?DR5SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31eM>40>QR?N55VD60@1601044QMQ00S?Q<2=1931YON@QI40^?Q9VEQ:30^O603010>0V41?Q8R;3931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegZ?W?Uo`?20ORNQ0EU=0QZA5E0UO0Q@0[O1R?0Si:0QoK4I4Q@409Qgd>0WH2TV00>0Xk1?QRRO3UV>7h[d50MROfKkH1536000C0\\<0Q51QA120QF7J35:X=0QK1S4=QJ1Q@1>0K100:4N014W<07111E0600231811137031041H1205311E06010101100431122063006@9208020E06010419020210>31;660207111E0601041811126231041A9105220321000121222;3422031050=D4<020F0?18020361021013196E020F09041802036151031902;<020QB02053?1I020A2G080016203500075912;QI3LQ4100040G000F1400060913OR70Q33Q60Q30>0<Q4V500401[H031600031Q8031Q0031600031>0QH031R21O2I5RE151dL2RH6E8G8C;<0201;RM19595I5RH6Q:4R59N0;3;302Q914:Q;3I5:2QM1R00L1:595=1NQ@R<0U57QK2>2QM4Q:1:7Q:4`E151Q515170000000N1QD0>0=150B12080S40;1J0<2Q0>Q0>T;3dIE:DQhC1O0ZL4Q<00401QG61=G86060606060606060SMQ1I0RH;VEIR?0RE1S64Q:0RM0RE8Q?0lc<2QF8ZKCUG7V=110007DQJ295QG7R57;5SC:M2R=0:3Q00QF8=191S6GK95151586060QK3SM195Zm3;F3Q@3Xc=1S9Q56;44I040001010SL?]L1QE60OQ95QB0B03340T6100UM251515122606941;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q=T1L2Q@>K3Q38M4Q:4M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1QA0147020L1239686QOOQ63;8QE2L1J4I63;6R?R8QFQB<QB6Q=795Q52L71V?N0Q90211?2QFQ;7Q9EIQ5KCF8R=3Q38R3901H695QD0A7Q68RO0C:A0Q>QM600030>0:5QJ495307111E0601040911121050461624:900100Q509001003090171LRK04MR779U5QE1Q5Q1R4:95<BQI595CKJ1>3FUHQKS3RB;71017010M011;89R571Q=1:JR77RB<R869UEQ1=9580Q<0=9L2O1E0=R86010Q;2001087955010Q4010569YEH6@0Q82LRD0>QA<lJS5S>04:V3Rb;S2<QRE9SlJ4b6VeHQIQf5aH6N093R@095M159R599060D4B]?QIV5RJS4R:3QH6@QO4:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286917SjKWI5]CR;Q=1F8SCQKWE9Q61V1DR5SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31eM>40>QR?N55VD60@1601044QMQ00S?Q<2=1931YON@QI40^?Q9VEQ:30^O603010>0V41?Q8R;3931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegR@0MROSOW?Qo`?QooM1QooM13QhP0VWOlQgOQooM1QooM1QfP0QoOe5R1I5IQ>090304F0N0^93;=46000T040113005002000C0RB0T:7U50Q5105Q8R6J33Q<Q:Q210S200>1619210?00MLRH:0GQ081304E308020FH6:4G05@Q9QIQE20A069>?37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?01;6QI100040G000901801400D3O0QN70Q3J4SBQ:C0?5332021623<;0@Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:576A<B=A=<02>QCQ2030R2RH641Q1004R59NQ@M14:Q;3IQEF8QDRA0RLQ>@7QEM<19Q;IQ3Q829Q31:4Q:12Q830501204UOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S4030190024500000030:134430QC1RcJW45321;Q500401QG60?F8606060606060606R?0^D1Q94413RE520RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>?N1R5Q@81S61R2110007D?02030FLQC=QAQM52001:K9FHL6Q>K0?409940Q8F207CF202QA0021141000G21:62;5151586060Q:0=5SBLZm3;F3Q@XX3[=1S9Q56;440090<040001010S;Q0[:AQO1QEQ7;SC40T6Q3I5I:RH25151512Q2;0I0B010>1=Q1SJ\\4L2Q@Q>O<C075Q59M1Q337Q?TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q3Q5K8FWIQ951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;SCQON71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIW5V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:40R1<QO100KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<2869Uk5RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55X4QMTAQ<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR360QUC30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROTAR1I5IQI09F0N0V2033V?0JUO31122005002000C0RB0T:7U50Q58Q8RhFQ500401Q:12dORE15RT1:4Q:12QOQ;QN<0Q1S4XE151Q515170000000N1QD0600220623153<4206X4030190024500000030530134430QC1RcJSK1S65321;Q50040nXAQ=AKT5R=0F230QM110007G120iDQ:486R?ciO6;4QP8I5IQU4R?ROQ33Q3SC:0>06010:0>0601Qf2QB<QBRLE9ERhIQOeZOQOi[ORD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiC90C55R^DR3dFS1IQI0Q8G0700000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000111250101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000R40JV00002022A0JQ20122000000000000000000000004001011QBQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q?Q8Rj6Q:12gG5RT1800SDQ;QN<0Q1S500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=17777774015022017311779201XA02120J03030117330QD0Re:Q?00210000003001054000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000000T600000000000020000000000000000000000000000000000000000000000000000000000000007000010000000003000100200000000000000000000404000000000000000300010200000000000I020iDQ:486R?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601Qh2QBSLERiIOe[OOi\\III60AIII300060:IIIIIIIIIIIIIIIIIKKH05IH05IH05IH05IH0500QiC90C55R_FQ1R;e@A3;=46000T4040^M0W50U31X<130N08020TO0U60QVC0SN0aD0QfI0S:0c20^?5U=QN<0Q1Q4e@0<0?<RnN1W@0UN0^D0Q:440S01RL2khE0QW15X=0SA0K1SH8R?0F0S8221^D0E0T80S;0D1S6380eP50Q<1QnO50Q908Q\\B0O0g^?3_K2Q71a5<QO100`P;30601\\Q@QMV86m<0QRN0`@U:0>0WO033V?0iJJ33Q<O09Q210S200G19210?00MLRH:0GQ0DEQ9H6:4G05@Q8QJQE20A069?>37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?01;5QJ100040G0009018014F3O0QN70Q3J4SBQ:C0?5332021623<;0S@Z8031600031Q8031Q0031600031>0QH031R2Q4?S@c;1@0I4R:576A<B=A=<02>QCQ70R2Q20QD641Q1004R59NQ@M14:Q;3IQEF8QDU?Q>@7QEM<19Q;IQ3Q829MS@3050120QQI3RoFQGGF8606060606060606a60QD03RE700RI304Q:0RM@OQ??_OV]OQOd`D0QSFR2Q77X;3?91R10Q@R5U80S602602030FLQC=QAQM52001:K9FHL6Q>Q<418940Q8F207C?05202QA0021141000G12:60=515158606T@Q2LZm3;F3Q@XX3[=1S9R20090<040001010S;Q0[:AQO1QEQ7;SC40T6S890Q<1N25151512Q2;0I0B010>1=Q1SJ\\4L2Q@Q>O<C075Q59M1Q337SOR=S1Q77QCRKQC;YF8E97TG5100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8UFQ3Q5300Y?Q951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;VB71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIW5V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ?QBD4B]BQ7\\DR:40U>UoG7QVEQ89XgFY2>0L210=37\\;RX3S:4<2869Xc?0_DQ<Q00Z0MAQ;_3JW4M10_>603010>0V4QYJ30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO:^501010Q50W\\D77777;0>0Q>0d;R1IS4F06Q000000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000120601010100000000000000010000000000000000010100200000000000000000000000000000000000000000000000000000000006101100300000000Y00002070500200010@08Q20122000000000000000000000004010011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Rj8Q50040fARERTB05Q:12YO00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077R73;3;3;4:3X50302212102450000003139140QL0RcKQ?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0ei:IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOi\\OIIIIII00110111307III1031706J103040026JIIIIIIIIIIIMHQ0HQ0HQ0HQ0HQ00TYDQ1Z1h0S?XB6X6Q<00010100R7:Q?D?0S46151103Q20MJRJ:QI880G3080204Q:2QJ8Q9G0Q0QE20A0691L2QG00611128091I012QG004311220M120:2QG0070202C1E502QG00611126291M0QJ4220380Q74QF006020361:1L2QG006020361:1>0;3QF10602038091L2R50350007A1QL016;7S1018:6R81J0000031Q@C014:0Q380S3CF332021623<;0093eN2mA3K2L1M1QOO80Q<200SD1Q10SE;3;VJ4QH90L10Q?NQ@4Q>@Q58;2M<QG=Q?CTG20D305012V5QOf?Q0RoM2T<0ROOa95S81m^C309O1R?1X?02030F430RB1QAAIA<0Q57H<Q;3Q>=Q30R2=;071Q<2QA002114100Q8441W;701ci?0g0???n<0W10TD4Qd520143Q7230U41aL3R04YL1R>3R5:Q@3SI2QD>Q801193Q<:60QL2Q3=?1Q;0;2Q?=7301RK;5010TL;D3QF106111280911624R280010030400=1RAAF0R@CW:618J1RA@S9<S4>WO>WD501130001T<61620K9Q7603708:Q=?\\D707RAE0=SI520010600R140104ZJ38100Q?624F0UW405>[V7AR]O4QJ6QPG00QF63R@0:1cU:1Tc0Q=1F`M4257716M3TC2QmJQF3QA70=0E40>QZ?60@160104S30TO6[F0QL3_K3WM1fO6S<6hUmDW?UNRX30QF0127301QA1QI2511190Q:0QI2R10QI27001QD1QI000511190S5101220290Q82QL3QL1QI004110181K0=1QI2420290Q91R:257A1Z91QN0U:1305011H19216D1151092QcG0M0T006701ZI3123105VO1QI000800175T@0Q?0400401QL0M03110QK0120021Q?771U:0D0TiE1moB110RG1QA?T=1Q>0Q?13112S=111G0Q<000S<01140W<1010100iPB000SN0Q<231SB0G1QJ0Q?281<0RL22100U92N1QI10311128091RC26010030100S427120S92500310W<25310S@27100S<00150S600130X4280WF501301000T=27330RC0L1QM0\\F0=0S906010VD43100ZM1;0Q?17100`_72Sa3QFS71h[B1555QT81UaC0Q`M302QQ\\:2[5h0S?XB4X8Q<00010100R7:Q?D?0S46151103Q20MJRJ:QI880G3080204Q:2QJ8Q9G0OQF00037302691L0QI03370C1I011QH031311220M120:1QH0340130C1E500QI010037061:1M0QL0;0QA020QF002420361:1L0QI0105041C1K1QH13370C1L0R706200RI016;7S1018:6R81J00000QF=04014:0Q380S53050111H132?3<01150>0eN2mA2L1M1M1QO106701:80Q<200SD1Q10SE2318052VJ110QI0060000175910Q?=0?Q@3Q?0040040Q78;1O31102QG0012002QI711TG20<06305021V5QOf?<302;RoM2T<0ROOa93S:1m^C039O1R?1X?02030H140TF1IA<0Q57H:Q=2Q?01311Q60R251111;070Q>0QB002114100Q9170W=01030ci?0g0???n<0W10TD4Qd520143Q7230U41aL3R04YL1R>3R5:Q@3SJ0QE>Q801192Q@31160QL2Q3407QM0;1QC89310RN210015010TL027D1QH120Q4624R55<00000=1RD71200F0RC5003101W=35101J1RD71001S90001500S40001304X2801WO10030T?31130O9Q7513708512Q=<01\\E60500RAE160101SI520010600R712000ZJ1:1QC44000F0UW405>[V7;22R]O4QJ6QPG0QN3R@0cUG1Tc0Q=1F`O2@716M3TC2QmJQF3QA70=0E40>QZ?60@160104S30TO6[F0QL3_K3WM1fO6S<6hUmDW?T@Q@9SG14012Q]09T59V59\\K9SE935S;9SE9SE915S=<SB976S69S766BS<9RO9SE9R5CX;9R59f>Ck@2W>959E9Y;9SO:U4959UE9RE9T5959QPE02559V5QB14fEQKR=EcEMQ[80h80H8=2ZF3T99M70>O9Q6>ljO9UK9YO5TI9Q59V59E9RE9\\E9dhE9_<Q<;QH@1ZDJQ33L070T54V99m=7H6Q68R:4E5TO11?1Q=QO8QC1M2R:4S77G7Q86Z95Q?959XENTM9Q93S?6T5MSO9QK9T?96CWJ9ZE9SE9[E9S595CR;;]3BRL9dE9RELW29R59]59S5DQQ:S>_V09RY59RE9T5906`=9X5FgbH9Q^5C;CS;HQRDQARYO9]59_E9WF9f;8SO9hFQJ0203R;Q<0>n1<Rg29R7Q@9Qa59T59V59\\K9SE9SE9SE9SE9SE9SE9SE9SE9SE9RO9SE9R59XE9R59Qj59Q59Y;9SO9U5959UE9RE9T5959QR^59e59Q59V59E9RE9\\E9dhE9Q\\59RT5959hK9SO9QK9T?9XE9ZE9SE9[E9S595CR;9]59S59dE9RE9WE9R59]59`^E9RY59RE9T59`E9gkE9RfCQARYO9]59_E9WF9jD9TdE9<Ug>2Rc>Q213ScM0H8=2me:9fb?QD^;070T54XQ9S>R8UB14012RYD5[G5SG2T46VH6@8]@9QQDCQSB9^O0QdD02559V5?Q80fEQKR=EcEMQ[80QTC3T99M70>O9Q6>m[?5fV@Q<R03@1ZDJQ33QYC7H6Q68R:4E5TO11?1Q=QO8QC1M2R:4S77G7Q86Z95ZONTM9Q93S?6T5C[JCQZ41]=8k6BjBDbl56hMFiQ8C;CS;HUZ=8m0QJ0203R;Q<0>n1<V6Q1205039121I200J000Q204020912020eM070^A5Q81QB0001010Q;1C101<002R93S50Q:=W82QE>N0X4190T;0SG0SH0\\50;0[>0RI091U7>00Q43R60R9431S>5U:0c38TF0c<0Q;1R=2R61TL202Q4:YH1VG1SO605TO196K2SK3QJ4QM1QO7:0iKG7C0<0;M1=1cH3L1QQL=R>1N9\\BEQN3O1gJ301S?0T>Q>0O1;]22391;?0;0S10RI0mP11X<2S2090SB5[K3RE1Q7200Q@1Q>0S0<?1SK3SM1?1WH0dZA1V?9EQ20=003001TD205039121I200J00006\\I2dK0Q?0\\M0g60V60N0X?8Q50S?6R16RH3^@0YM0U64Q;3UL6S<103SM3Q?1R>330<002RG5S:0Y9101SA49100S70WIFS82K<R;0T12WK0X72TJ0RK7RB204RL9VF0RN4Q91d41R9<U>0QS?4RkK1^cJ1T40R0470a72Y63Z60cUK0W_64RkB0jM16RO0WnN1B0Qg^M1G2W>0DQ=0QZK0QB0Sb00QP40RP85S`0010N130K0]M0B0S>0Qc\\?1Q4090U80SbO0YM0R<Q90QB0N0SeL000QjM0R]80QF0>0cI000M0QQM0000000000000R?0O000000000\\C000000000000000000000QO000Q00QQ40000000Q;0000000];0000000002000000011QcXM0VH0L00000000000000020@00000U90QB0N01010:UK0WjL020K0S^70003010>020;U;0Wk;01110H0S^70003010>020V1Q12021000019121J0R3040=160eM070^A5Q80QE01010Q;1C101<002R93S50Q:=W82QE>N0X4190T;0SG0SH0\\50;0[>0RI091U7>00S?0R9431S>5U:0c38h40SK2R61TL202Q4503YH1VG1SO605TO196K2SK3QJ4QM1QO7:0j11777813122:0009STI301S?0T>1321018010011940913000<12];2QH0UL0mP11X<2S2090SB5[K3RE1Q7200Q@1Q>0S0<?1SK3SM1?1WH0da3610E0C1132203625001TD2021000019121J0Q3011\\I2dK0Q?0\\M0g60V60N0X?8Q50S?6R16RH3mG4Q;3UL6S<103SM3Q?1R>330<002RG5S:0Y9101SA49100S70WIFS82K<R;0T12WK0X72TJ0RK7RB204RL9VF0RN4Q91d41R9<U>0QS?4RkK1^cJ1T40R0470a72Y63Z60cUK0W_64RkB0jM1R?Q80QA0N0SeM000QjM0R[M020Q50QF0>0cI000M0QQM0000000000000R?0O000000000\\C000000000000000000000QO000Q00QQ40000000H0A0000000];0000000002000000010QcY00VF0L00000000000000020@00000U90QA0N02010W<Q4050?2N000J000Q240110031020M0N0^93;=46000@SD0=1S?0T:0X92SE21011V=090B1WF061T70[8151WD0SM0T17T30V>0Q80V40V02>00215C00000T47050143V41g?9fB0[<0[30TLQ1[0988QQO002:2<2<2<1R40<0Q62<2BQ0QN1030190024500000030:1344300QI13[G3L1WNE:R@R=Ec7Q;Q@1N9\\BEQN3O1[E1O0S8W45[41Q=I0RH;VEI?30<1;0D151RJ1WB139OQ580?N:M70>O9Q6>YOV]OQOed?QFaHF81S61TL393aL2W00=1cmL0T7@[L?SN0Q;3S100210TI050?2N000J000T0606<1YH8QH@120<20Q>Q<QcI1b>0f41R]>0RTDLbj9340dZE0Sk2W??]CTKSCQKWE9Q61QK42E16M3QLDR120UIRFk90H0N0H0N0H0N0H0N0H0QK_OQF3QA70=01Qf70]>0R];020SL0^01X=Q;3S3;>1>0>0Q4FU0QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0RKEQ40SL3QW80SJ0_A1_A160WD0X60b40R\\J0RV3Q0QQkF0e^20S;0TI0VJ121WoE3Q`hM0R]?0ORN000R60503020`83;=46000@SD0=1QX10UiC002:2<2<2<1TTK1mc2F81S61n?0=1dR5@kJ000U10QmPF4R1Q;0?2QL000Q<030Q40N0gM0`>2VaJ0<0Q62<2T:0Q6450R344130101060N11000NX;O1RI0MHQ75^D080QE7S>0Z?41N9?WOT2EQN3O1X1Q?D15QcnK0iG002U30?2QL000T2053S]01QbY@0H0N0H0N0H0N0H0N0H0Ui;1UKU60103000n@0X91SN1V=090B1WF0`20[D0T1500T30V>0Q80\\62>00215C00000T47050143V41g?9fB0fA0TLQ1[0988Q\\21030190015500000030:1=00100QI184130101060N11000NX;73C161R@0MHQ75R7E:R@R=EUF080QE7S>0WGQ;Q;QOWO_OQ?D15Q61O0S8W45[41Q=I0RH;VEI?30<1;0D151Z?139OQ580?N:M70>O9Q6>YOV]OQOed?QFk039100aL2df5?SN0Q<2_302031<1YH8QH@120<20Q>Q<QcI1b>0SSE0RTD73@bj9340dZE0Sk2W??]CTKSCQKWE9Q61QK42E16M3QLDR120UIRFQU8_OQF3QA70=01Qf70RjK0T00f@Q;3S3;>1>0>0Q4FU0QGL<Q;3861=5TIWJ4fG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0RK8Q00SN0U^N0R[N:L140Q>0SlO01XQ801XQ907Q00SN0U^N0R[N:Q30Q>0SlO010SO3Q@965I5gER1I5IQ>090304F0N0^93;=46000RE0LA0113005002000C0RB0T:7U50Q5105Q8Q6=000101007J33L:4QG06=S50737329210?Q?<S4GQ081304G1BBH6:4G05707Q99;265R;0?023><B07111E06002327111100703104;1903205311E06010101343111306300@5:208020E06010428020120>3D33207111E060104271111813104<0?105220321000121222;3422022050Q7<020F0?27020271021013K307020F0904270202715103<2;<020Q8170202004364E5020A2G080016750007A1<QI4650QB100040G000B02140050=3O0QN70Q33B3?0Q3R2QF0014?QO931Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:2:6C:D;C;<0201;QC1B=030R2RH6Q:4R59N0;38FM14:Q;3IQEK3QN1CQA0F1:2Q@QC0>07QBQ9139Q;0:=QFE29Q31:4Q:12Q830501204UOBQ1:XE151Q515170000000N1QD0600220623153<4206SC0<0?<S4030190024500000030:134430@Q8i<QCQhEW45321;Q500401QG60?F86060606060606060OQ>0^D2H864143RE520RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>472S@Q681S61R2110007DC0Q0GQC;R300Q;520029Q04Q2<L2QB0;>0??940QF8=AF2R40000G21?13:5151586060Q:0=5SJDZm3;F3Q@XX3[=1S9Q56;44;0<040001010S;Q0[:AQO1QEQ7;SC40T6Q3I5I:RH25151512Q2;0I0B010>1=Q1SJR4QDX:L2Q@Q>O<M4Q:4M1Q33704Q9TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO30147020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q7Q1K204FWIQ90121?2QF02L907EQ9AQ=DJF8R5Q:49QH80<HFQB@37Q2208QO03819000Q2A0Q11053QM600030>096QHF307111E060104271111205046K900100Q509001003012000Q;R10203C2MR11100UGQE16H5Q1QN0020QJQE10R6J1=D6UHQHS6QON71017010M011113RL71Q=150001JQB19@R740AR8V6Q0N80Q<0600Q@M1E0=R86010Q;2001020011G5010Q4010300Z6F8@0Q822S>0R>lIS5S>@V3Rb;S0>QQ?@5HSlJ4b6VeHQ>Qf@aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:3QH6@QO100;1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286930Uk0RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55VD60@1601044QMQ00S?Q<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR32020QUC30J0100100903000050300000020100100000000001001306030300090@42040@cCI5I5IScEQYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO10QQooO4Q`L0V_@1I4QF3SBQ81A000K000L000Q<0>0ScM3QjL1R\\K191QE1=1U@0UO32520212303000038400A438100070O1340811B4184113G1?73C161QQL=R9013010243422=\\BE150=7065203401143002119511;B03100010034152G1:13301113Q:170Q740002442302400WO0`232101=119Q:7]:917QcaL541U11A000K000L0000101QekF0QH0QH0QH0QH0^4Q7050:0Q2000R6030003011_FUO31308100WJ6V>040Q@Q<00010100Q;0:59:00Q209D?0S470903Q0000MJRJ:QI:3010GGQ:2Q;06148Q8QIQF00037302691<0>0QI03370C1I011QH031311220M120:1QH0340130C1E500QI010037061:1M0QL0;0QA020QF002420361:1L0QI0105041C1K1QH13370C1L0R706200RI016:8S10188006R81J00000QF=04014:0Q380S53050111H132?3<01150>0RM0bO2mA2L1M1M1QO106701:2040Q<4QB0R01Q10SE2318052VJ110QI0060000175910Q607NQ@3Q?0040040Q78;1O31102QG0012002QI711QO5RA20<06305021QAQN<0Q1S4]L002:2<2<2<1;471901014Q@40900<0?<QBQ0Rl:1S@2SL0>0ROOQ>0^D0Q332440RL5RL2khE0QW15X=0S130900K3R?1=Q1R=0F2S6221702030H140TF1IA<0Q57H:Q=2Q?01311@0D1R151111;070Q20:0QB002114100J0=14100S3482SH01030ci?0TB@aL?20;?Q1010U806050:0Q2000Q>0Q<1R20D2`00W10TD4QP450Q908b520143Q7230U41aL3Q50I400YJ1R>3R5:Q@3SJ0QE>Q801192Q@311103090QA2Q3407QM0;1QC89310RN210015010TL027D1QH120Q4624R55<00000=1RD71200F0RC5003101W=35101J1RD71001S90001500S40001304X2801WO10030T?31130O9Q7513708512Q=<01\\E60500RAE160101SI520010600R712000ZJ1:1QC44000F0UVD@5>[V7;22R]O4QJ683_K2Q71_10QN@QO101`P:30601STM103TbKQ=1F`O28?16M3TC2QmJQF3QA70=0E40>QZ?60@1601044QMQ00TO=[?0QL3_J4WM1fO6S<7Re>4hSP00MROSOW?TOR1I5IQ>090304F0N0V2033V?0Q361M4RO0Q931113005002000C0RB0T:7U50Q58Q8RhFQ500401Q:03dORE15RT1:4Q:12QOUOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S4030190024500000030530134430@O21i@QCQhEW45321;Q50040nXAQ=AMT3S5230QM110007D402iDQ:0=5R?ciO6;4QP8I5IQU4R?ROQ33Q3SC:0>06010:0>0601^20120Q908QV4QB<QBRLE9ERhIQOeZOQOi[ORD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiC90C55X4QMRTAR3Qo;I5I5IcBR1IRI09F07O0000000000000000000000000000000000000000000000000000000100000000000000001000000000000000000000000000000000000000000000100000001000102130102210100000100100102000120610101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000WE0Q90002070500200010@08E0;221000000000000000000000000011100011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Q?0RhGQ50040i95RT195Q:12YO0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077?Q?12154215:3;44215Y802150Q<?B0iAIQi?Q?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0kIR?ciO6;4QP8IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOndOQ1T3R1I5IQI09F0N0QO0RC0K1=11003RL0A5J010001210304100110601001254091U50Q931122005002000C0Q>2Q0040T47U50Q59Q6RhGQ500401Q:12dORE15RT1:4Q:12UH020?0S@TK100SE151Q515170000000N1QD0600220623153<4206Y802150J0@O21i@QCQhES@01016S56321;Q50040nXAQ=AKT5=1QM8>22140H0M1136G1jK0KR?ciO6;4QP8I5IQU4R?ROQ33Q3SC:0>06010:0>0601Qf2QB<QBRLE9ERhIQOeZOQOncOR3c6R1IS4F06Q000000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000120610101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000Y00002070500200010@08Q207000000000000000000000004010011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Rj8Q50040fARERTB05Q:12YO00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077G7777774:4:3;4:4Y802150Q<?B0iAIQi?Q?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0ei:IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOndOQ1j<R1IR40600010001312020F07O0000000000000000000000000000000000000000000000000020010000002000000010000000000000000000000000000000000000000000001000000010001021301022101000001001001020001206900000000000000100000000000000000130200000000000000000000000000000000000000000000000000000000006101100300000000S08N514RJ10280O000000020213600010@08E0;7000000000000000000000000020100011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Q?0TC0RG3fN7SK100RB010Q1210WL1fD0SN0Q71Q=0QE080303030;0800460@080303030;0W5Q50040Q=0S11dF5mE1RD4QS?95Q:12S;20:0A0K<0Q1Q4QO0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077000000000000001Q?121=18203302203712170?0040;2252101300072<06B1J0<:0RF3020:011412000000030:05345Q?2040U1101WG1YDT:QY00S62S40Y2Q?Q?0021000000300105400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030SK0Y>0RB0;VEQ90QD002RO110RN0Q@RM2=RON0Q77Q>0[OlaO000000000000000000000000000000000000000000000B00000000000000000000000000001T3000000000000020000000000000000000000000000000000000000000000000000000000000007000010000000030001000200000000000000000000404000000000000000300012040000000D311k13805R?cYOX=1000190000112R31S9Q56;4400G040001010S;Q0[:AQO1QEQ7<2IED1;0B0332000T6100UM25151512260608QP6Q7T7Q3TK:0>0601_:40Q908QV4QBTLERiIOe[OOcaO3TQAQ3QS36=7QO5aNRD0R6011011130;00060R00317060K030400260ZC1Y31QARQ?QMRTAQ1QVM30J0100100903000050300000020100100000000001001306030300090@42040@b3:4N0OI2Q20S>2<Q;3861R\\M9QoP5`MfQ_1SoOcES1IQI0Q8G07000000000000000000000000000000000000000000000000000000001000000000000001000000000000000000000000000000000000000000000010000210001020401022101000001030102000102000300101000000000000000001000000000000000002000020000000000000000000000000000000000000002000000000000000007011003000000005010001210304100110601001254091U50Q:0002022A0JQ20122000000000000000000000004001010QCQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q@Q6Sc?5RT1800W=020?0SA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=17777774015022017311779201ZE0Q0?30j:IQj5Q?002100000050109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000100000000030300110000000000000000000:00000000000000030001020400000I0jK0KR?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601Qh2QBSLERiIOe[OOne1Q1cFS1IQI0Q8G070000000000000000000000000000000000000000000000000000000010000000000000010000000000000000000000000000000000000000000000100002100010204010221010000010301020001020004101010000000000000001000000000000000001010020000000000000000000000000000000000000002000000000000000007011003000000005010001210304100110601001254091U50Q:0002022A0JQ20122000000000000000000000004001010QCQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q@Q6Rj7Q:12gG5RT1800W=020?0SA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=1QD013000220130231177920130Z@0Q0?30j:IQj5Q?002100000050109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000100000000030300110000000000000000000:00000000000000030001020400000I0jK0KR?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601Qh2QBSLERiIOe[OOne1Q1HQ=0QZK0QB0Sb00QP40RP85QL0Q60>0\\50SP3010N130K0]M0B0S>0Qc\\?1Q4090U80SbO0YM0AU=0e00f;0Rj11QbB1RD4QoJ4I4Q@?TWC0QcTJ?W>0TO0R>8Q_U63UV>7h[d4SoO8Z90QY80RX2000RQ81RV45eH1kgVE0VFRN000R60503011_FTN0745@13081WL4V@0QF@0J000100T5731T513122R2JRJ:QI:Q11SM7Q89?KQL0?023K0R90?0S=0?0S=0?0Q>2QK0?060SF0S=0?0S=0?0S<1?0SK0S>0;500S:0<4R:1J0000031R1201QM0S?001Q7134H60091f02mC1M0TC:80ZJ2Y30C710Q?>1:S70>0Q58QE1QI0:1R11QO5RAH305012QAQNRH;Q4:]L002:2<2<2<1SW?2YL0_I5S83RN0m[A0;100K1RA1=Q1S52S<1;0Q40TF0JAQH3Q30RN0;0Q30TD2R03QB0S3482SO1ci?0h0?X=000Q>0Q<1R20gK0QTN50Q908cL230U41aJ5Q50I4\\>2R5:Q@3UO0Q80R71SG1QM0R;082S71UA1R?1?0G624RH201<1RN020SJ1WJ1SM0SE1SB0X<1X1130TK0RB0A0R@0]40X1001R@0]81F0UW;>[VH0R]O4QJ6aC1a1@R?1_oM30601Wh0Q=1F`O2257716M3Sd1QMV16[F0QL3gM1fO6S<202TFQ305049S>030Wl<0;0VG0E0RI5>1[>1;0U50H:32V60W619080QI304801011103010011020217240004;:1100100A011A5000121401131:14110410001C14503103010150010000050205091>01030003200:1Q?280=0=0[C1^>2B1QB030QVI0;0bH000S_[90V90TO1;1=019R:I01F0C018D1U=Q11S?11021RB120X60QN:50G6117;0131031<110718042;27210003050205REQ?R547123920012019W2;30XJQ>090UHS?<294QG6>1:58:Q305049WnB0VD0QgY:0QlnEI_J4Q]?3hQc;RO1SloK4Q8Y`M0VJ0?3ScSF0QK21012SD11:DB2032026000G0V8130D031U=224RB0?280:0aN01077508912QG0QL10100@20<W42Q98R@XhJ1V<32010`81D1QA;Q:0B0<071@1417040D0610030106031K0Q20003200QL2G0=0jJ1QB030SaU=0V90UM019R:I00G0C01402D1U=Q0;80R50E;Q:34;@202R6000UJ1QN<30GA0I1<0RERDQ?R550221233:168W2;30XJQ>090UHS?<294QG6>1:58R>U9030Wl<0;0VG0E0RI5>1[>1;0RN0R50H:32V60W619080QI3050;0SA9SE1:000050205091>01030003200:4Q<280=0=0[C1^>2B1QB030QVI0;0bH000S_[5WO<2N0QK5;1=019AQHJ>90C018038]A4YM7X9Q?SOSC;RDQ:;3QG795Q77MRA;Q>090]HWOoMQ9UG0`G1k=0]H0cE0T80RH0g?0SN0RZ20QG0c20\\=0R30Tl80Q:4S61RL2khE0Q_E0n10E0T80S;0D1eSJ0RP?1Q^:0J030QV60Y40SC1_A2QV>0dU81QTK100lZG1QU@0jC2kNQ0RNQ0<0bAS?71536000C0VO6U50Q51QA12Q=00010108J35@9:00Q=D?0S47051103O100MLRH:0=Q:862G3080206>0H400:4N@Q9QHQF00037302691L0107111E0600232001511100<1023G4005311E0601010132G300691200;008020E06010423700120>13;607107111E06010420105111>1023A:005220321000121222;4001220220DD5207020F0?2023B2101139690:020F0904211001G1013902=:020Q8100142020132093I110A2G08001681566912;Q?01:77<Q4100040G0009018014008913OG1J00000=0Q3A04014Q@7050<Q4Q<3050111H132?3<01150>0Q700401[H031600031Q8031Q0031600031>0QH031R24L2I5RE151dL2RH6A<B218A=<02>QC106701:829595:495RH641Q1004R59N33123105602Q914:Q;3I5:2QH112QG00800175<9595=REQ?93270L8;1O315QG001200<Q?714>2QM4Q:1::0<0630502104UOQOXE151Q515170000000N1QD0>0=150B12080:4G6Q@?11J0<2Q0QNT;3dIE:DQhC1O0ZG214Q<00401QG61>F8606060606060606Q0RMQ1I0RH;VEIQI5?0RE3S44Q:0RM0RE8Q?0lc<2QF8ZKCQ>309O1R?157V=110007D?02030H14395QG7R39;G<0Q57H:0;M5Q?0131110<0:360H0Q85111:20700191O0QB0021141000G@17:5151586060QK3SD0103295Zm3;F3Q@XX3[=1S9Q56;4400G040001010SL?]L1QE60O??9EQ20B03340T63TL1N251515122606<11;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q<T2L2Q@?J3Q38M4Q59M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1Q>>3020L98686QOOQ45;8QE2L1J4I63;6R?R8QFQB<QB6Q9;95Q57G71V?N0Q92011?2QJQ77E:8EA33Q5KCF800QE>63M0110;Q@311103=H698Q3408A7Q202:QC8007310?0C:A0K213501QN600030>0:5Q>02<97107111E060104200003111120;6K900100Q50001>001200201Q6QG71200D0002MQ?01500100101379U5Q>0153101JQ3QB710013:95<BQ:000171595CKJ2001308FUHQ>8010S3RB;71017010G0401530289R571Q97303J09Q7513780512Q=<018<R869UEQ1=9580Q5=0059L2OH06010R:6010Q5D08955010Q431000069YEB138>0Q3712FRE0>QA<lJS5S>04:V3Rb;S2<QQ?@5HSlJ4b6VeHM;229Qf5aH6N093R@095M609Q?6>99060D4B]?QIV5RJS4R:4QG:<QO3KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<28691010SjOWI5]CTKSCQKWE9Q61QK42E16M3QLDR120SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31aAQF3QA70=06QSCN55X4QMTAQ<961931YOMAQ;3940^?K39VEM1:30^O603010>0V418Q?R3603931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO[Gh0S?XB6X6Q<00010100R7:Q?D?0S46151103Q20MJRJ:QI880G3080204Q:2QJ8Q9G0OQF00037302691L0QI00013708091I011QH031311220M120:1QH0340130C1E500QI00103706291M0QJ000;080Q7020QF002420361:1L0QI01100220361:1K1QH10013708091L0R7030120070R@016;7S1018:6R81J00000QF=04014:0Q380S53050111H132?3<01150>0eN2mA3K2L1M1QO106701:80Q<200SD1Q10SE2318052VJ110QI0060000175910Q?NQ@3Q?932Q58;1O315QG0012004QG711TG20<06305021V5QO`;0V2Q0RoM2T<0ROOa95S81m^C309O1R?1X?02030H140TF1IA<0Q57H:00Q;2Q?0131110Q30R251111;070Q>0QB002114100Q9170W=01030ci?0g0???[=1bL0W10TD4Qd520143Q7230U41aL3R04YL1R>3R5:Q@3SJ0QE>Q801192Q@31160QL2Q3407QM0;1QC8007310RN2135010TL027D1QH10000;080=624R20150010023200=1RD71200F0R@01500100101W:0135101J1RD71001S900017S40001304X2801WD09330T?31130O9Q7513708512Q=<01\\E60500RAE160101SI520010600R712000ZJ1:1QC442F0UW405>[V7;22R]O4QJ6QPG0QN3R@0:1cU:1Tc0Q=1F`M4257716M3TC2QmJQF3QA70=0E40>QZ?60@160104S30TO6[F0QL3_K3WM1fO6S<6hUfDROSOW?6Q@965I5Qoe8965I53[o@119_@01[oB1hIQ@96I300IQ>09000104F0N0^93;=46000@SD01130054000C0RB0T:041U50Q5105Q87Q<000101007J33L:4R93S507190B10?QJ1S4=QE30101Q=AK3:4G057R:0T0190B07111E0600231811137031041;90001205311E06010101100431122063006?:208020E06010419020210>319860207111E0601041811126231041900?105220321000121222;3422031050=9?<020F0?1802036102101319?307020F09041802036151031902;<020QB020443641995020A2G080016203500075911<QI4>09Q6100040G000F1400060913O0F159:00000390Q33C0A0Q380QHR95R=1Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R21288=??RE152c;1@0I4R:2:6E8E:C;<0201;RC203119Q020:5RH6Q:4R59N0;3;9Q714:Q;3I5:Q4K3QN0L1:59<07=0?Q@R<29@8;SC;QG792Q@1:4Q:12?20Q64`E151Q515170000000N1QD0600220623153<4206>1Q@1B0K0<0?<QB<302;@0301900155000000?134430@Q8RcFW458;Q500401QG60>G86060606060606060O`42H>04143RE160RN4Q:0RM@OQ??_OV]OQOed<R2Q=1X<2KCQ?390SBQ481S61R2110007DQE30BQC;R5995G200Q@1Q3;L2R0=:5N0QF8=195F2R8G21?1495151586060Q:0=5SJ01195Zm3;F3Q@XX3[=1S9Q56;44;0<040001010S;Q0[:AQO1QEQ7;3???21G2O40T6B96I300I9RI25151512Q2;0I0B010>1=Q1SJR4QDT70T1L2Q@>0NO<M4Q:4M1Q33704Q9TM195Q33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO30147020L1230OL2LQ270MHQE9E9B<AS=R8QFQB<QB<Q7795Q5240FWIQ90121?2QFQ0907Q0NEQ9DJF8R6N?8QK60<H695QD09337Q3108R4330<00Q2A0Q453QM600030>096QJ495307111E0601040911121050461624:900100Q50900100307<1LR:4933MR50079U5QE18F5Q1R020:9Q5QH695CKJ1>3956UHQJS4R9D71017010M0118;9R571Q=1701JQN707R920AR8V6Q0>9580Q<08>9GM1E0=R86010Q;2001087955010Q4010569YEF8@0Q824<:RD0R>lIS5S>@V3Rb;S0>QQ??E9SlJ4b6VeHQIQf5aH6N095R>095M14:QF83;98D4B]?Q<29V5QOSOR:3QH6@QO101:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286921TR@9`5Q=1F`M4257716M3TC2]JRD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H071QA_OQF3QA70=0E40>QR?N55VD60@1601044QMQ00S?Q<2=1930Z0N@QI^EQ9VEQ:_4603010>0V4:6Q8R;39QU530J0100100903000050300000020100100000000001001306030300090@42040@SYC9QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegZ?W?e5R1I5IQ>090304F0N0^93;=46000T040113005002000C0RB0T:7U50Q5105Q8R6J33Q<Q:Q210S200>1619210?00MLRH:0GQ081304E308020FH6:4G05@Q9QIQE20A069>?37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?01;6QI100040G000901801400D3O0QN70Q3J4SBQ:C0?5332021623<;0@Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:2:6A<B=A=<02>QCQ2030R2RH6Q8004R59NQ@M14:Q;3IQEF8QDRA0RLQ>@7QEM<19Q;IQ3Q829Q31:4Q:12Q830501204UOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S40301900155000000?134430@Q8RcFW45321;Q500401QG60?F8606060606060606a52H864143RE340RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>?N1R?Q681S61R2110007D?02030FLQC=QAQM52001:K9FHL6Q>K0?409940Q8F207CF202QA0021141000G21:62;5151586060Q:0=5SBLZm3;F3Q@XX3[=1S9Q56;440090<040001010S;Q0[:AQO1QEQ7;SC40T6Q3I5I:RH25151512Q2;0I0B010>1=Q1SJR4QDX:L2Q@Q>O<M4Q59M1Q33704Q9TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q3Q5K8FWIQ951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;SCQON71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIS5S>@V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:40R1<QO100KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<2869Uk5RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55X4QMTAQ<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR360QUC30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROE\\P61H8=2n4V]OQOd_OfWO[=1S9mX90JUoG7QVEQ89YS6\\;cX3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO1XP<17Sb04SJ4Rg?210QTWI11001e3S1IQ>09030Q3G0700000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000111250101000000000000000010000000000000000011000200000000000000000000000000000000000000000000000000000000006101100300000000R40Q361M4RO0Q:0002013A0JQ20122000000000000000000000004001011QBQ?000000000000000000000000000000000080000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Q?Q8Rj6Q:03gG5RT1800SDUOR000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087597777597777=17777774015022017311779201SH0<0?<S<02120J03030117330Q0?30j:IQj5Q?00210000003001072000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600030;Q50040nXB000000000000000000000000000000000000000000000B000000000000000000000000002T4000000000000200000000000000000000000000000000000000000000000000000000000009000010000000003000100200000000000000000000404000000000000000300010200000000000E20002iDQ:0=5R?ciO6;4QQ8IQV<Q7T7Q3TJ:0>0601^20120Q908QX4QBSLERiIOe[OOi\\III60AIII300060:IIIIIIIIIIIIIIIIIKKH05IH05IH05IH05IH0500QiC90C55X4QMRUCQ1T;Q;0?2N0L000Q<030Q40N0fG210I112`>2V`<0J2:020<0=3D4:4R0<302134A03019001550211102052=00R3G0501313O0051=X;73C1RI0MJ00G0:6]L1;935311124=00015:741QH000L382Z?QOWO_OQ?D15QcnK0iF500U10?2L000L000T2053S]01Qac?RD0R6011011130;00060R00317060K030400260ZC1Y31QAU_O30J0100100903000050300000020100100000000001001306030300090@42040@QC1BQo^@O`=1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1QooM1LQ1>96I300I3Q1600010001303020F0N0WhGG7>1B09Y@f?TOcEMQS;_OSO\\023H>0QcX<1X41594A0S30Wl71G1=Q2030T20>0WjK7H1S`60^83<2Qca03UL030RI13[d0I0RH;VE1Sl_6IRHQ10;0?0QZ80TB2UC0Q:2WE0QL00021Y41Qg31hE031h40V51TL1Q<040YI1[13U119111L2UJ1R01m30F182SU>2YA0<0E1]<0mWK0X=1W2020[M1RE1RN0TG1TB2T?1WH0da5011QJ021U80;0?0R00RgC1QWL4Q;3UL1SD3SN2T0150?1RG101S;0Y91SD1[D14>S81WH2`4000WJ1RF1]31eC1R91bi81T40R01:0a81Y70c`50W_70Q2S91V30XH0M0QC0C0YO0S1000VX80QB0<020T30TL0]40VE1RiA0SYm41QA1QA1QA1QA1QA1QA1QA1QA1QA1QA1QA1QA1RT50Y@1I0SDQ109000:120iM070`00QH0R70=002UC0Q::00W:1QE507N0X41QWC1U;035YF1hD7h40SK2R61TL220Q6311YI1[13U119102L2UJ4QM1m30F182SU>2YA0<030900121];1mWJ1X<2W24[M1RE1RN0TF2TB2SN0?1WH0da5011QH203U809000:120R0010QQI0Q?0QT50V60YE1TG5R35RH3mG4Q;3UL6S?3SN2T0150?1RG4S;0Y91SD2;1[532>S81WH2`4000WJ1RF131\\M2Q<0d41R91QY:4a_H1T40R0290a81Y61c`50W_63A]P0V]OQOd_Of`=1000190000112RQ^EQYfOOTQI5VM1Ud1=WY@>c=T]1Tj:4TROd@R1IS4F06Q000000000000000000000000000000000000000000000000000000001000000000000000100000000000000000000000000000000000000000000001000021000102130102210100000100100102000120601010100000000000000010000000000000000010100200000000000000000000000000000000000000000000000000000000006101100300000000Y00002070500200010@08Q20122000000000000000000000004010011QBQ?000000000000000000000000000000000800000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Q5Rj8Q50040fARERTB05Q:12YO00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008775977775:000000077R73;3;3;4:3X50302212102450000003139140I?B0iAIQi?Q?Q?0021000000300107200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700030nZ<000000000000000000000000000000000000000000000B000000000000000000000000000T60000000000000200000000000000000000000000000000000000000000000000000000000009000010000000030001000200000000000000000000404000000000000000300012040000000G0ei:IQV4Q7T7Q3TK:0>0601Qg9QBTLERiIOe[OOi\\OIIIIII00110111307III1031706J103040026JIIIIIIIIIIIMHQ0HQ0HQ0HQ0HQ00TYDQ1RP=I5I5I4VP;200Qi_??jPg?W?:94A0S30I0U^N0R[N:L140Q>0SlO0i0Q@96I300IQ>09000104F0N0^93;=46000@SD01220054000C0RB0T:041U50Q5105Q87Q<000101007J33L:4R93S507190B10?QJ1S4=QE30101Q=AK3:4G057R:0T0190B07111E0600231811137031041;90001205311E06010101100431122063006?:208020E06010419020210>319860207111E0601041811126231041900?105220321000121222;3422031050=9?<020F0?1802036102101319?307020F09041802036151031902;<020QB020443641995020A2G080016203500075911<QI4>09Q6100040G000F1400060913O0F159:00000390Q33C0A0Q380QHR95R=1Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R21288=??RE152c;1@0I4R:2:6E8E:C;<0201;RC203119Q020:5RH6Q:4R59N0;3;9Q714:Q;3I5:Q4K3QN0L1:59<07=0?Q@R<29@8;SC;QG792Q@1:4Q:12?20Q64`E151Q515170000000N1QD0600220623153<4206>1Q@1B0K0<0?<QB<302;@0301900155000000?134430@Q8RcFW458;Q500401QG60>G86060606060606060O`42H>04143RE11120RN4Q:0RM@OQ??_OV]OQOed<R2Q=1X<2KCQ?390SBQ481S61R2110007DQE30BQC;R5995G200Q@1Q3;L2R0=:5N0QF8=195F2R8G21?1495151586060Q:0=5SJ01195Zm3;F3Q@XX3[=1S9Q56;44;0<040001010S;Q0T:5VIAQO1QEQ795???21G2Q0000200000000SMB96I300I9RI25151512Q2;0I0B010>1=Q1SJR4QDT70T1L2Q@>0NO<M4Q:4M1Q33704Q9TM195Q33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO30147020L1230OL2LQ270MHQE9E9B<AS=R8QFQB<QB<Q7795Q5240FWIQ90121?2QFQ0907Q0NEQ9DJF8R6N?8QK60<H695QD09337Q3108R4330<00Q2A0Q453QM600030>096QJ495307111E0601040911121050461624:900100Q50900100307<1LR:4933MR50079U5QE18F5Q1R020:9Q5QH695CKJ1>3956UHQJS4R9D71017010M0118;9R571Q=1701JQN707R920AR8V6Q0>9580Q<08>9GM1E0=R86010Q;2001087955010Q4010569YEF8@0Q824<:RD0R>lIS5S>@V3Rb;S0>QQ??E9SlJ4b6VeHQIQf5aH6N095R>095M14:QF83;98D4B]?Q<29V5QOSOR:3QH6@QO101:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286921TR@9`5Q=1F`M4257716M3TC2]JRD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H071QA_OQF3QA70=0E40>QR?N55VD60@1601044QMQ00S?Q<2=1930Z0N@QI^EQ9VEQ:_4603010>0V4:6Q8R;39QU530J0100100903000050300000020100100000000001001306030300090@42040@SYC9QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegZ?W?e<R1I5IQ>090304F0N0^93;=46000T040122005002000C0RB0T:7U50Q5105Q8R6J33Q<Q:Q210S200>1619210?00MLRH:0GQ081304E308020FH6:4G05@Q9QIQE20A069>?37111E06002320?0<102=19075311E06010101N300B2?8020E06010420A0>1F0:7111E06010420M102>0@005220321000121222;E0QC7020F0?20I21011M037020F090420N101>1@8020Q810?04272G54A2G080016QIQ?00<6QI100040G000900901400D3O0QN70Q3J4SBQ:C0?5332021623<;0@Q500401Q:0Z<031600031Q8031Q0031600031>0QH031R2Q4??RE152c;1@0I4R:2:6A<B=A=<02>QCQ2030R2RH6Q8004R59NQ@M14:Q;3IQEF8QDRA0RLQ>@7QEM<19Q;IQ3Q829Q31:4Q:12Q830501204UOQOXE151Q515170000000N1QD0600220623153<4206SC0<0?<S40301900155000000?134430@Q8RcFW45321;Q500401QG60?F8606060606060606a52H864143RE520RI034Q:0RM@OQ??_OV]OQOed<R2Q=1X<2?91CQ>?N1R?Q681S61R2110007D?02030FLQC=QAQM52001:K9FHL6Q>K0?409940Q8F207CF202QA0021141000G21:62;5151586060Q:0=5SBLZm3;F3Q@XX3[=1S9Q56;440090<040001010S;Q0T:5VIAQO1QEQ79SF000200000000SMQ3I5I:QG1N25151512Q2;0I0B010>1=Q1SJR4QDX:L2Q@Q>O<M4Q59M1Q33704Q9TMAQ33Q33Q77QC;:0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F9F8NR0B019E9IR5QG51QO0>3020LQ9L2LQ270KJQE9E9B<AS=R8QFQB<QB<Q3Q5K8FWIQ951?2QJL907EQ9AQ=DJF;QDQH110<Q<OHIQ3L0107Q220;Q?=3D000Q2A0HB1QN600030>096Q>Q57111E06010420A0;4M900100Q500H000Q;QDA3C2MQ?C100UGQ>Q83Q3Q?C0QJQ:<0R6JQ46UHQ;SCQON71017010G>000RM71Q6?000K09Q760D0:Q=B0AR8V6Q0N80Q4@0Q@MS?6010Q5D0H5010O=0Z6B>00<0Q1SK0R>lIS5S>@V3Rb;S0>QQ?@5HSlJ4b6VeHMQg1aH6N@R>@MAQ??3ND4B]?Q<VBQOSOR:40R1<QO100KUoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<2869Uk5RD0R6011011130;00060R00317060K030400260ZC1H0H0N0H0N0H0N0H0N0H07QiCN55X4QMTAQ<96?0Z0MAQ;_3KW3M10_>603010>0V4QJR360QUC30J0100100903000050300000020100100000000001001306030300090@42040@TZ3QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO3SjX0R;39317Q`O0O0V`=0S_@0S^eMR;39312RQY@QC:05h40Q;0Q;0RP^@QC:03RUh0J1>3FQKQ`04050=020O09:I0S;0Q1R?Q?W?N014R:0LQlb?SB?[:1R?1QE60O?S?40T6Sk2NR22QF3QggO30J0100100903000050300000020100100000000001001306030300090@42040@QC1QGQ`040VF0Q1R?Q?W?N014R:0LUj>0S_@0QcX=SB?]L1QE60O?S?40T6o2KRk3NR22QF3QggO30J0100100903000050300000020100100000000001001306030300090@42040@QC12RRR0E084QYAQ51QA12Qm\\245h80a7Q51QA12Qm\\242RRh0QE264UG0[[G1QgV=QE262Vh0R<0QA2QYe0RGQ`X7aH2Rjf@M152Vn0QC73>R\\0307111E0600231811137031041HKeL0QdC1@1I307111E0600231811137031041HTf@00011007070103012QRoH04RWP080Q<0=9L3g:1[`HQ:S?O?f7002<0?1[XD2390<931050V208Q:S?OQcT41XI43RTP0R=3Q3801ZP0WO2V`0K113V`0K11QSm>01Uj0C2UiE18C2RTX0QD0A4R_69Qb?9RPUEQD0A3UP0cOa?R5RP]I?1RPe0Q@5UG0Wm1010S^B0QeS=Q@4QZ`0QF8=19133Tm0RE15QUkAR?8h020051E1:1TS=RE15QUkAR?1RSm@K3o2=ZT?SC46:UG0b702100S;1S;=ZT?SC46XF0QeV7K1R[l@S22RPX01[d=S26RRP05100Q;0120109RPX023Q<28QeO5100Q;012010:QP0T41U8Uj?:TO0R;0TS6OnQOROel=1Qh_OQMQ00BeL0R220000001040W=Y?Uj?:TO0R;0SN0So6OR20moKROel=1Qh_OQMQ005RX0R@3>1IQWjOOl_O99eL0Qb2RB1Q:Tj?Q601oE0QQiN9U5Ol_O98RVX061017010M011;891RVP0QK3R[4;QWeO9kn5QK1RQP0R?5S_P0S:4<286913:UG0b>100G1ZhF0SS^2S:4<2869172R\\P0QRE9SlJ1RQX0Q73UG0b<0RP_IQ71RSo0FQ4T`0R8031600031Q8031Q0031600031>0QH031R21O2IV_5F8606060606060606oY1515158606R_U@603010>Q5h>0Sg@R8031600031Q8031Q0031600031>0QH031R21O2IV_5F8606060606060606oY1515158606R_U@603010>3RSZ0Q52L716Q`<0=020RQhOQ52L71:TU0Q500401Q:03Rl?Q:12TQOQ50040=UG0QV@0RhEQ500401Q?Rl?Q:12lI0SU4Q50040X206[P0ROS\\lO60@160104@UG0b:000[M010X00Rk@0SjM0Rm4RO_20nQ:0R^\\?60@1601046RW[05010Q40105698UG0RU;1RToI5010Q40105697RWX06010Q;200108798R[41RTlI6010Q;200108791RPi@J5UG0b;110Q70QooMJ?RTh0307111E0601041811121050461624IRZA1@1cO=TVK001M221oE0Ql`>307111E0601040911121050461624SRJ100Q4k@3021300300002000C0QN=?VY54QA434RC0YOE151Q515170000000N1QD0>0=150B1208Y60QRaM0e^IR>@0QdRNR5Q<UG0b7110000090Q=010Q971300300002000C0QN=?VY54QA434RC2YME151Q515170000000N1QD0>0=150B1208RM0V70QRaM0e^IR>@0QdRNR5>Rd1208020E06010419020210>31;66ARZA1@1XJ208020E06010419020210>31;66QWY?91RhX0QI2R[50RelIQI@R`1205311E06010101100431122063006@CRZA1@1TJ205311E06010101100431122063006@QW]H9>TX0WOWa=1X0RMS@NR0Nmg0Ld2Zm3;F3Q@Ym3N25151512ETX0WOW`02390<=250V20QDRMS@NR0Nmg0Ld2Zm3;F3Q@Yb81XI4QIN25151512F[d0I0RH;VEQ>000H8=3n3V]OQOd_OfWO[=1S9mX71;1QTP=QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROQ:UG0[^7I0RH;VEI?020<0<0<1058UJ0TC?OQ580Q?Q7QGQ@>;QB0RGH94RON0V]OQOd_OQgO7d_G[=1S9k:1XI4lSK1;1hk=AWfM1S]=QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TRO1Ui0D1Ui0F3RRW0B01449Q\\AQF7J35QmY7I0400010109:h71d7QF7J35QmY7I04000101096\\R1RE52Rok0XNA0L2`U<0A\\P12390<?500312RE17RI1QcZ71XI490Q<1Q\\S0XNA0L2`U<01RaP0b65Rjh0R599060D4B4ShX0Q<2=19313RST0QB<QB657XRJ010S^B0>0QgaMQB<QB652RPh0Q3823QZ\\0R=19313QZ\\0R=0:312QZX0Q=001QZX0Q?>\\U1RI12W??V?Q>0RGQcP=90Q<Q\\RA3060100XN2QA0=3Fh50L0[VL2390<?50031RJ32ROW??V?Q>0RGQbg<1XIQNQ\\R?3060100XN2QA0=33RWh0@0Q82L8RR`030147020L1239684Ul0RM1959_5O2RT`0A0Q>4Rg69QWYO9j^5A0Q>3Rko40VhJ^EQ80=ST0<020F09041802036151031902ERZA1@1hI<020F09041802036151031902SnK00150F000QRiJ51RkZ0QI2RTT0R2905R[69YV00n_M9jR5R2905Va0QN0L1:595=;Sd1100040G000F1400060913Q7R1I5IQ>0>04F0N0^0Q64V`JQ55Q@434<0R5R0WO[@0<0?<T<150J0@Q8RfFOne1S52R2110007D=i?Q:0803clE6QPII5IRQ450Q908Qej4N55R1R1I5IQ>0;0104F0N0^020900200800054J>0100;0126101Q50403<XD1QV91Qm70SP3Q55Q@434<0R5QH06WOY>0R00<0?<RB0QH150J0@Q8RfFO\\F0nW77IS52R2110007D=Y=0`0Q:0803clE6QPII5IRQ450Q908Qej4N553WP0QG2>225VX0N0;3;302;6R[50SlIN0;3;302;3RQ`0YF8E974RPX7Q<QV;YF8E977RPP0;0I0B010>1=Q1SJ:RPP0;0I0B010>1=Q1SJ423Q<282QYV@Q?ne?05eL0?0[YK1mV3Q?ne?01RPd0L2XRJ0Qha4L2RRY0I404UG0[[H0Qfg=I401RTZ@Q64UG0RU;;QWeO9jXEQ61RWg0H2RR0K103Qb00_NK102RRf0Q63;3Qb00RQSNQ63;3RWS@O1E0=1Rkb0RJ2SjP0V41?3RR]0G3C1Q=1RR\\0O2XRM0QjY1O7SX0<020QB02053?1I<RZA1@1lI<020QB02053?1ISjI0F0QRiL22RU`0R4:93QZQ@9k^5R4:96VP01100C5RH6Q:Qo]D<7VP0I5RH6Q:Ql30Sn@143QibC<3Rjb0N09313QZg0FV8Q=195RTd0600030>0:6Rc69RRP?600030>0:4TP0TOQVYONS0OkR?C5TP0TOQVT=0U@NS0OkR?C1SiV@Q93RV]071Q=1:9R[41kO9SoH07060QRiD5l[971Q=1:1RRd0O2RRT0N782RUP0RK042Qn0QJ126Q`<0=020\\OQJ12QmYM12Rko10`\\=\\;1Ud0L1WR@Q?2Si^@Q:303R[41SgS9Q:301RSP0R83XRJ0S^D0Qg^>R8>Rh1207111E0601041811126231041ABRZA1@1\\J207111E0601041811126231041AT[10F02RQU@Q33Q36h101050R;0RPZFQ33Q32RQT0M191RSk@I3Qb00RQU@0QSLI1RRS0O1RVf0QH1RPj@Q:6UG0b704290[>0Qof;Q:1QZR0QG5VP2100RQ80SnA0nQLQG2RRk0B473RRl0A63;64Qb00RQYNA63;62RRX0K203Rkh0R:3QH6@2RRj0E172QZY@Q3:02RSX0Q7797Q`<0=020O0TB0RQa:Q7792Ue0R:2:1Ue0RH2RP0Q=1>3RP0Q=1>Y_A01RRc0O2QZT0R57;3SfP0d;>40>1RQR@Q?2UG0RPlGQ?1RT\\0RO8RZA0Tl40001110QRj>510jZ6RO2RU\\0QE1Q52RTe@QJ494R[41QWf99jcEQJ49=S\\120A2G080016203500075912RPo;C?R[41QPJ20A2G080016203500075912SgL0QmW=C1RSi@Q92Qb00RRW>Q91RSh0Q72RTV@H691RVb@RB2Vl0QOWO72RVn0Q1=98h01008010K020RVT=Q1=91QZP0Q<3R[41SO9QW`?Q<4Qh0=0QK12X?:Ch311100D0126100fJ0=110O09:I0T>=0QK12X?:U\\<0003Uk0<02014UiE1Q8<02012RUd0QI594R[41QWf99kb5QI592VZ@M146h014120SYB9RX5M144V\\0Q;3I5:21BRl2105220321000121222;3422031050=DRTn4QA<0IRZA1@1`K105220321000121222;3422031050=DTVN0QSPG0j`<000QF1ST2QA<04Rko00NUoG7gO_O86[o@?_>0R__?0NUoG7gO_O82QZd0R2G4=SP0<020F0?180203610210131968ARZA1@1dI<020F0?180203610210131968TRI0F03[Y@QG61=07h20001000Za5QG61=02Uh0E803Uh0E80D11Ql0QA7Q`<0=110QO9XEQAQmaO0902S`1QI4K6eL0I0Q:0Q<0Rf>QI4K7Sh0R70Q33Q60Q30>06318Sh0R70Q33Q60Q30>0631XQ<32RUT0R7796RZA1@1Tl;0QRiL9kR5R7792Rjc@R>091RQ^0QC7h1010108000R90RPc0QC1Shd@N2eL0SgnBN;RTl0900100Q509001003090171@SW69TP1000QRiJ5UJ0jd=900100Q5090010030901712RPl0M001QYX0Y;8RQ[@:0>06010:0>06012RVU0RB;02Shf0QI402RPm0Q33=4RXP0lIS5S>04:V33RSd0Q902117Q`<0=020QO9RRPEQ902112QXP0QT<2QF7\\P114917VN0kh3QT<2QFfdI41RV`0R7Mh0S?XD1^3:I0fO3TZJN`020<06305021V5QO`;1V1Q0SiH3S:1Qc[4??=n>0W10TRI0Q^n3Q=1F`O2@716M3h[jAW?Lh?0100;0126101?010A0403Q_?1TZJNgBQE0004`;1V1OQgX???=n>0QcX1Q=1F`O2@716M3h[jAW?U>0R0I5IQ>0>04F0N0^0Q6441CSC0805000cL050=020O0TK0`30T01QVH0\\D3Y10Q_>2R61V:100QV<0<063050210h4;1RF0:2:0>@Q0QNQ502150J0@Q823dIE:DlOWOcC1O0S8_ORM\\AD000H>733RJ120RI1TB?OQ580Q?QONR@Q>0RGU7V]OQOfWOQ1S52U49WC0TO0\\:0=1d^A1V?9EQ20B03TB00OI5I:90Q<1QO60694X123Q<28R?<QBQ<W3JQ^]33SjKWI5]CTKSCQKWE9Q61QM2@716M3QLVDC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31QAUS@R3R;QLf1Q;3S3;>1>0>0Q49U=QGI01<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5hQP60MROTO0R0I5IQ>0;0104F0N0^02090020080005441CSM05000cL0VF0`30QZK0\\D3TQ6;1Q00N0901060:2:0>@Q0QNQ502150J0@Q823dIE:DlOWOcC1O0S8_OF0G1903000I]1020<0<0D0`@GN0Q@>;3U094RON0V]OQOfX7IS52n?0=1de39ED1;0B03TB00OI5I5SN60694\\A<QBQ<Qb`2WI5]CTKSCQKWE9Q61QM2@716M3QLVDC;C;RFJ6T6RD0R6011011130;00060R00317060K030400260ZC1Y31QAUS@R3R;QLf1Q;3S3;>1>0>0Q49U=QGI01<Q;38F5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5hQP60MROfIkH1536000C0\\<0Q51QA120QF7J35:X=0QK1S4=QJ1Q@1>0K100:4N014W<07111E0600231811137031041H1205311E06010101100431122063006@9208020E06010419020210>31;660207111E0601041811126231041A9105220321000121222;3422031050=D4<020F0?18020361021013196E020F09041802036151031902;<020QB02053?1I020A2G080016203500075912;QI3LQ4100040G000F1400060913OR70Q33Q60Q30>0<Q4V500401[H031600031Q8031Q0031600031>0QH031R21O2I5RE151dL2RH6E8G8C;<0201;RM19595I5RH6Q:4R59N0;3;302Q914:Q;3I5:2QM1R00L1:595=1NQ@R<0U57QK2>2QM4Q:1:7Q:4`E151Q515170000000N1QD0>0=150B12080S40;1J0<2Q0>Q0>T;3dIE:DQhC1O0ZL4Q<00401QG61=G86060606060606060SMQ1I0RH;VEIR?0RE1S64Q:0RM0RE8Q?0lc<2QF8ZKCUG7V=110007DQJ295QG7R57;5SC:M2R=0:3Q00QF8=191S6GK95151586060QK3SM195Zm3;F3Q@XX3[=1S9Q56;44I040001010SL?]L1QE60OQ95QB0B03340T6100UM251515122606941;0I0B010>1=Q1SJ423Q<2RG0<20Q>Q=T1L2Q@>K3Q38M4Q:4M0Q43=Q9TM195Q33Q33Q77QC:;0>06010:0>06012QC;YF8E97G50Q908R45100Q;01201F0R778Q?B014Q02J40QOQG3C1QA0147020L1239686QOOQ63;8QE2L1J4I63;6R?R8QFQB<QB6Q=795Q52L71V?N0Q90211?2QFQ;7Q9EIQ5KCF8R=3Q38R3901H695QD0A7Q68RO0C:A0Q>QM600030>0:5QJ495307111E0601040911121050461624:900100Q509001003090171LRK04MR779U5QE1Q5Q1R4:95<BQI595CKJ1>3FUHQKS3RB;71017010M011;89R571Q=1:JR77RB<R869UEQ1=9580Q<0=9L2O1E0=R86010Q;2001087955010Q4010569YEH6@0Q82LRD0>QA<lJS5S>04:V3Rb;S2<QRE9SlJ4b6VeHQIQf5aH6N093R@095M159R599060D4B]?QIV5RJS4R:3QH6@QO4:1=UoG7QVEQ89Xg6306010Y2>0L210=37\\;RX3S:4<286917SjKWI5]CR;Q=1F8SCQKWE9Q61V1DR5SIC;C;RF8HT6RD0R6011011130;00060R00317060K030400260ZC1Y31eM>40>QR?N55VD60@1601044QMQ00S?Q<2=1931YON@QI40^?Q9VEQ:30^O603010>0V41?Q8R;3931h@R3R;QLV130J0100100903000050300000020100100000000001001306030300090@42040@QC1X=Q;3S3;>1>0>0Q49U=QGL<Q;3861=5TInG3@2<2SF3RN5;30>;3QG795Q77M1;31QMZC;=1<294QG6>1:586TB0S5QP5QYfOOTQI5VM1Ud1=WY@>c=R]1`MQ_1Tj:4TROegR@0MROSOW?Uo`?"
|
|
143
|
+
/** Simple case folding above ASCII: per member of an orbit, its gap and the zigzag step to the next member, doubled, plus one in a pair. */
|
|
144
|
+
const REGEX_FOLD_DATA: string =
|
|
145
|
+
"UERlL;T11T11T11T11T11T01T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T12T11T11T11T11T11T11T11mgM1SO1SO1SO1SO1SO1QPXH1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO2SO1SO1SO1SO1SO1SO1SO1_515131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151335131513151325131513151315131513151315131513251315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131_31513151315132h=1j9151315131iI15131iE1iE15132YM1i91i=15131iE1iM1\\51j=1j515131d=1UVX51j=1jE1`91jI1513151315131k915131k935131k915131k51k5151315131k=151335132W1541416141416141416151315131513151315131513151315131YK15131513151315131513151315131513151324141615131\\31VO151315131513151315131513151315131513151315131513151315131513151315131513151315131`72513151315131513151315131513151315137QZU=15131d;1QZU11QZWM1QZWM15131h;1XE1XM151315131513151315131QZSM1QZSA1QZSI1j71iG2iC1iC2i72i;1UUYM4iC1UUY=2iK1UU\\M1UUU11UUXA2j31j;1UUXA1QYnM1UUX53j;2QYoE1jC3jG8QYlM3k72UUX=1k74UUU91k71XC1k31k31XK6k;;UURE1UUR9U7Z@Q;513151335134`91`91`92^A7TI2TE1TE1TE2X12WM1WM1lX=1T11T01T11T11T01T11T11T01T01T01T11T01T11T11T11T01T02SL1T11T11T01T11T11T01T11T11TG1TC1TC1TC1lV=1SO1SH1SO1SO1X01SO1SO1S41lPD1VH1SO1SPJ1SO1SO1SO1RH1V0141SN1SO1SO1QL1SO1SO1m[D1SO1SO1WO1WK1WK1Q11WF1T<4UJ1VF1O1513151315131513151315131513151315131513151315131ZF1YN1M1^?1[>1[N25131K15132`71`71`71Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11Z11T11T11T01T11T01T11T11T11T11T11T11T11T11T11T01T11T11T01T01T11T11T11T11T11T11T11T01T11T11T11T11T11SO1SO1hYH1SO1hYD1SO1SO1SO1SO1SO1SO1SO1SO1SO1hX@1SO1SO1hX81hX81SO1SO1SO1SO1SO1SO1SO1hW@1SO1SO1SO1SO1SO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1YO1513141hT@1513151315131513151315131513151315131513151315131513151315139513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131QM15131513151315131513151315131QK1513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315132V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V1;UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UORhJl\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\11l\\12l\\16l\\13[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h11[h13[h11[h11[h1e1Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Tgj11Q11Q11Q11Q11Q11Q13O1O1O1O1O1ORT3h]F1h]B1h\\>1h\\6141h\\:1h[>1hTB1TYh815136[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO1[gO3[gO1[gO1[gOUJTZPA4^lIATZW1SB51315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513141W8151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315136W:3mgK2513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q13O1O1O1O1O1O3Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q13O1O1O1O1O1O4Q12Q12Q12Q12O2O2O2O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Y91Y91ZI1ZI1ZI1ZI1\\A1\\A1`11`11^11^11_I1_I3Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q11Q11Q11Q11Q11Q11Q11O1O1O1O1O1O1O1O1Q11Q12Q55O1O1Y71Y71Q32l_25Q55ZG1ZG1ZG1ZG1Q34Q11Q12lX;5O1O1\\?1\\?5Q11Q12lV;2M3O1O1]O1]O1K7Q55_O1_O1_G1_G1Q3Y:m_B5QP\\F7SALS?BR11R11R11R11R11R11R11R11R11R11R11R11R11R11R11R11QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO1QO4513iBS91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S91S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S71S7QhGV11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11V11UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO1UO15131QYnK1^lG1QYlK1QZU;1QZTO1513151315131QZS?1QYoC1QZSK1QZSG251325138QZWK1QZWK15131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513851315134513=l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O1l[O2l[O6l[OnXC5131513151315131513141TYh:15131513151315131513151315131513151315131513151315131513151315131513C5131513151315131513151315131513151315131513151315131513T75131513151315131513151315133513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513151315131513:51315131TZP?1513151315131513151345131UUTO351315131V125131513151315131513151315131513151315131UUX?1UUYK1UUY;1UUX31UUX?2UUR71UUU71UURC1Sd1151315131513151315131513151315131UO1UUX;1TZVO151315131UU\\K151335135513151315131UVX3I513jMScOMTgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiO1TgiOcj6513QPKT11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T17SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SOQU6U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TOS1U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U11U15TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TO1TOSETM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM2TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM1TM2TM1TM1TM1TM1TM1TM1TM2TM1TM2TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK2TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK1TK2TK1TK1TK1TK1TK1TK1TK2TK1TKQf4X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X11X1>WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WO1WORNT11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T1;SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SORhKT11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SOe[1T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11T11SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SO1SOnd1T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T91T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T71T7"
|
|
146
|
+
/** The code points `REGEX_FOLD_DATA` folds, as runs: per run its first and last, four base-32 digits each. */
|
|
147
|
+
const REGEX_FOLD_SPANS: string =
|
|
148
|
+
"005E005E0060006F006H007F007H009?009B009G009I00:800::00;N00<000<<00<>00=900=<00=I00=L00=M00=O00=O00>400??00?A00A000A200AC00AJ00BD00BF00BG00BI00BI00BK00BL00C000C100C300C600C800C<00C?00C?00CA00CB00CE00CE00CM00CM00D000D000D200D300D700D<00DB00DB00DM00DN00J500J500K@00KC00KF00KG00KK00KM00KO00KO00L600L600L800L:00L<00L<00L>00M100M300NA00NE00OE00OG00OK00OM0141014:019?019A01:F01;101<60450046504670467046=046=046@047J047M047O04M004OE04OH04OM0740074:074@075J075M075O07;I07;I07;M07;M07<>07<>07@007DE07DK07DK07DN07DN07E007HE07HH07HM07I007J507J807J=07JA07JA07JC07JC07JE07JE07JG07JG07JI07JI07JK07JK07JM07JM07JO07KM07L007MA07MC07MC07MH07ML07MN07MN07N307N307N807N<07N@07NA07NC07NC07NH07NK07O007O107O307O307O507O507O807O<07OC07OC07OH07OL08960896089;089;089B089B08:>08:>08;008;O08<308<4095F09790;000;3@0;3B0;3C0;3E0;3F0;3N0;730;7;0;7>0;7B0;7C0;800;950;970;970;9=0;9=19B019C=19D019DK19I219I?19IB19K?19KI19L719L;19L=19L@19LD19LF19M>19M@19N=19N@19NA19NF19NL19OE19OF1:JC1:JC1:K@1:MO1NH51NH61OI11OIJ1OJ11OJJ2100212?215@216C216H217K21;@21;J21;L21<:21<<21<B21<D21<E21<G21=121=321=A21=C21=I21=K21=L2340235B2360237B23:@23;523;@23<52650266O2KB02KCO3J803J:3"
|
|
149
|
+
/** Per block of 16 members in `REGEX_FOLD_DATA`, the first and where its step starts, four base-32 digits each. */
|
|
150
|
+
const REGEX_FOLD_INDEX: string =
|
|
151
|
+
"005E0002006?001C00700034007@004F00810065008A007500910085009C009500:400:500:E00;500;500<500;E00=500<600>800<G00?B00=700@L00=I00B100>@00C200?000D300?A00E300@100F500@A00G500A200H600AB00I600B800JF00BK00L400CE00N600KA010100L@011<00M0012M00MA014>00N1016000NA017@00O4018C00OD019F010601;1010F01<A011601>1011F01?C012601A6012F01BG013601D3013F01E3014>01F3014N01G3015>01H3015N01I3016>01J4016N01K5017>01L5017N01M5018>01N5018N01O5019>0205019O021C01:?023301;9024C01;I02630452027G045B029G046202;G046J02=G047:02?G047J02AG04M<02D404ML02FD04N<02I404NL02KD04O<02N4074002OH074E031C0755033C075E035C07@4037?07@D038?07A4039?07AD03:?07B403;?07BD03<?07C403=@07CD03>@07D403?@07DD03@@07E<03AC07EL03BC07F<03CC07FL03DC07G<03EC07GL03FC07H<03GK07I003I107I@03J907J003KA07JI03LK07K<03N307KL03O?07L>040I07LN042107M>043907N<044F07O<046308;5047F08;E0496095I04:E096904<5096I04=E097904?50;0?04@G0;0O04B70;1?04CG0;1O04E70;2?04FG0;2O04H70;3?04IL0;4804K80;4H04L80;5804M80;5H04N80;6804O80;6H05080;7B05180;8>05340;8N055419B6056J19BF057M19C6058M19D8059M19DH05:M19I>05;N19J005<N19J@05=N19K005>N19KI05?N19L<05A119LO05B519M@05CD19N005DO19NF05F91:KF05H11:L605JA1:LF05M11:M605OA1:MF06211OI506471OIE065G1OJ;06772100068I210@06:9211006;I211@06=9212006>I215@06@:216006AJ216@06C:217406DJ217D06F:21;H06GK21<906I;21<L06JK21==06L;234206MM234B06O=2352070M235B072=236?073M236O075=237?076M23:L078>23;F079N265007;@265@07=0266007>@266@07@02KB007AB2KB@07C22KC007DB2KC@07F23J8007GD3J8@07I43J9007JD3J9@07L43J:007MD"
|
|
152
|
+
// gen-regex-unicode:end
|
|
153
|
+
|
|
86
154
|
/** The most instructions a compiled pattern may have. */
|
|
87
155
|
export const REGEX_MAX_INSTRUCTIONS: i32 = 100000
|
|
88
156
|
/** The largest count `{n}`, `{n,}` or `{n,m}` may give. */
|
|
@@ -95,6 +163,10 @@ const REGEX_MAX_SLOT_TABLE: i32 = 4194304
|
|
|
95
163
|
export const REGEX_MAX_GROUPS: i32 = 1024
|
|
96
164
|
/** The most ranges one class may list; the class sorts them by insertion. */
|
|
97
165
|
export const REGEX_MAX_CLASS_RANGES: i32 = 10000
|
|
166
|
+
/** Most ranges the property escapes and case folding of one pattern may add to its classes. */
|
|
167
|
+
export const REGEX_MAX_PROPERTY_RANGES: i32 = 100000
|
|
168
|
+
/** Most ranges a class sorts by insertion; a longer one is merge-sorted. */
|
|
169
|
+
const REGEX_INSERTION_SORT: i32 = 64
|
|
98
170
|
/**
|
|
99
171
|
* How many levels of nested marked iterations the VM keeps apart; a mark
|
|
100
172
|
* nested deeper leaves the closure's stamps as they are.
|
|
@@ -156,6 +228,13 @@ const ASSERT_BEGIN_LINE: i32 = 2
|
|
|
156
228
|
const ASSERT_END_LINE: i32 = 3
|
|
157
229
|
const ASSERT_WORD: i32 = 4
|
|
158
230
|
const ASSERT_NOT_WORD: i32 = 5
|
|
231
|
+
// `\b` and `\B` under `i`, where U+017F and U+212A, which fold to `s` and
|
|
232
|
+
// `k`, are word characters too, as for JavaScript's `iu`.
|
|
233
|
+
const ASSERT_WORD_FOLD: i32 = 6
|
|
234
|
+
const ASSERT_NOT_WORD_FOLD: i32 = 7
|
|
235
|
+
/** The bits `1 << kind` of the kinds `\b` and `\B` compile to, and of those under `i`. */
|
|
236
|
+
const ASSERT_WORD_BITS: i32 = 0xf0
|
|
237
|
+
const ASSERT_FOLD_BITS: i32 = 0xc0
|
|
159
238
|
|
|
160
239
|
// The parsed pattern's nodes.
|
|
161
240
|
const NODE_EMPTY: i32 = 0
|
|
@@ -175,6 +254,42 @@ const SET_SPACE: i32 = 2
|
|
|
175
254
|
|
|
176
255
|
/** The highest code point. */
|
|
177
256
|
const REGEX_MAX_CP: i32 = 0x10ffff
|
|
257
|
+
|
|
258
|
+
/** The number `table` holds at `at`, four base-32 digits. */
|
|
259
|
+
const regexFixedAt = (table: string, at: i32): i32 => {
|
|
260
|
+
let v: i32 = 0
|
|
261
|
+
let i: i32 = 0
|
|
262
|
+
while (i < 4) {
|
|
263
|
+
v = v * 32 + toI32(table.charCodeAt(at + i)) - 48
|
|
264
|
+
i += 1
|
|
265
|
+
}
|
|
266
|
+
return v
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** The member a `REGEX_FOLD_DATA` step leads to from `c`: the step is a zigzag-coded difference, doubled, plus one in a pair. */
|
|
270
|
+
const regexFoldTarget = (c: i32, step: i32): i32 => ((step & 2) === 2 ? c - (step >> 2) - 1 : c + (step >> 2))
|
|
271
|
+
|
|
272
|
+
/** The code point `REGEX_FOLD_SPANS` holds at `at`. */
|
|
273
|
+
const regexSpanAt = (at: i32): i32 => regexFixedAt(REGEX_FOLD_SPANS, at)
|
|
274
|
+
|
|
275
|
+
/** Whether some code point in `[lo, hi]` folds under `i`; a range it misses needs no fold table. */
|
|
276
|
+
const regexFoldsIn = (lo: i32, hi: i32): boolean => {
|
|
277
|
+
if (hi < regexSpanAt(0)) {
|
|
278
|
+
return false
|
|
279
|
+
}
|
|
280
|
+
// The first run ending at or after `lo`, by binary search.
|
|
281
|
+
let a: i32 = 0
|
|
282
|
+
let b: i32 = toI32(REGEX_FOLD_SPANS.length) >> 3
|
|
283
|
+
while (a < b) {
|
|
284
|
+
const mid: i32 = (a + b) >> 1
|
|
285
|
+
if (regexSpanAt(mid * 8 + 4) < lo) {
|
|
286
|
+
a = mid + 1
|
|
287
|
+
} else {
|
|
288
|
+
b = mid
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return a < toI32(REGEX_FOLD_SPANS.length) >> 3 && regexSpanAt(a * 8) <= hi
|
|
292
|
+
}
|
|
178
293
|
/** A byte `b` that is not part of valid UTF-8 is the character `REGEX_INVALID + b`, which nothing written in a pattern equals. */
|
|
179
294
|
const REGEX_INVALID: i32 = 0x110000
|
|
180
295
|
|
|
@@ -193,6 +308,43 @@ const regexOtherCase = (c: i32): i32 => {
|
|
|
193
308
|
const isRegexWordByte = (b: i32): boolean =>
|
|
194
309
|
(b >= 97 && b <= 122) || (b >= 65 && b <= 90) || (b >= 48 && b <= 57) || b === 95
|
|
195
310
|
|
|
311
|
+
/** Whether U+017F (C5 BF) or U+212A (E2 84 AA), word characters under `i`, ends at byte `p`. */
|
|
312
|
+
const regexFoldWordBefore = (text: string, p: i32): boolean => {
|
|
313
|
+
if (p < 2) {
|
|
314
|
+
return false
|
|
315
|
+
}
|
|
316
|
+
const b: i32 = toI32(text.charCodeAt(p - 1))
|
|
317
|
+
if (b === 0xbf) {
|
|
318
|
+
return toI32(text.charCodeAt(p - 2)) === 0xc5
|
|
319
|
+
}
|
|
320
|
+
return (
|
|
321
|
+
b === 0xaa && p >= 3 && toI32(text.charCodeAt(p - 2)) === 0x84 && toI32(text.charCodeAt(p - 3)) === 0xe2
|
|
322
|
+
)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/** Whether U+017F or U+212A starts at byte `p` of `text`, `len` bytes long. */
|
|
326
|
+
const regexFoldWordAt = (text: string, p: i32, len: i32): boolean => {
|
|
327
|
+
if (p + 1 >= len) {
|
|
328
|
+
return false
|
|
329
|
+
}
|
|
330
|
+
const b: i32 = toI32(text.charCodeAt(p))
|
|
331
|
+
if (b === 0xc5) {
|
|
332
|
+
return toI32(text.charCodeAt(p + 1)) === 0xbf
|
|
333
|
+
}
|
|
334
|
+
return (
|
|
335
|
+
b === 0xe2 &&
|
|
336
|
+
p + 2 < len &&
|
|
337
|
+
toI32(text.charCodeAt(p + 1)) === 0x84 &&
|
|
338
|
+
toI32(text.charCodeAt(p + 2)) === 0xaa
|
|
339
|
+
)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/** Where the value of `key` starts in `REGEX_PROPERTY_NAMES`, or -1 if it has none. */
|
|
343
|
+
const regexPropertyEntry = (key: string): i32 => {
|
|
344
|
+
const i: i32 = toI32(REGEX_PROPERTY_NAMES.indexOf(`|${key}=`))
|
|
345
|
+
return i < 0 ? -1 : i + toI32(key.length) + 2
|
|
346
|
+
}
|
|
347
|
+
|
|
196
348
|
/** Whether every character of `s` is ASCII. */
|
|
197
349
|
const isRegexAscii = (s: string): boolean => {
|
|
198
350
|
let i: i32 = 0
|
|
@@ -333,7 +485,6 @@ class RegexParser {
|
|
|
333
485
|
/** The class being parsed: its ranges, unsorted, `tmpCount` of them. */
|
|
334
486
|
tmpLo: i32[]
|
|
335
487
|
tmpHi: i32[]
|
|
336
|
-
|
|
337
488
|
len: i32
|
|
338
489
|
pos: i32
|
|
339
490
|
errorAt: i32
|
|
@@ -343,6 +494,10 @@ class RegexParser {
|
|
|
343
494
|
/** What `parseBraces` read. */
|
|
344
495
|
qMin: i32
|
|
345
496
|
qMax: i32
|
|
497
|
+
/** Where `tableNumber` reads next. */
|
|
498
|
+
tablePos: i32
|
|
499
|
+
/** The ranges property escapes and case folding have added, against `REGEX_MAX_PROPERTY_RANGES`. */
|
|
500
|
+
propertyRanges: i32
|
|
346
501
|
|
|
347
502
|
icase: boolean
|
|
348
503
|
multiline: boolean
|
|
@@ -382,6 +537,8 @@ class RegexParser {
|
|
|
382
537
|
this.tmpCount = 0
|
|
383
538
|
this.qMin = 0
|
|
384
539
|
this.qMax = 0
|
|
540
|
+
this.tablePos = 0
|
|
541
|
+
this.propertyRanges = 0
|
|
385
542
|
}
|
|
386
543
|
|
|
387
544
|
fail(message: string, at: i32): i32 {
|
|
@@ -410,12 +567,82 @@ class RegexParser {
|
|
|
410
567
|
return n
|
|
411
568
|
}
|
|
412
569
|
|
|
413
|
-
/**
|
|
570
|
+
/**
|
|
571
|
+
* A node for code point `cp`, with its other case under `i`: one other
|
|
572
|
+
* case is a character's second operand, more make a class of them all.
|
|
573
|
+
*/
|
|
414
574
|
charNode(cp: i32): i32 {
|
|
415
|
-
if (this.icase) {
|
|
575
|
+
if (!this.icase) {
|
|
576
|
+
return this.node(NODE_CHAR, cp, cp)
|
|
577
|
+
}
|
|
578
|
+
if (cp < 128) {
|
|
416
579
|
return this.node(NODE_CHAR, cp, regexOtherCase(cp))
|
|
417
580
|
}
|
|
418
|
-
|
|
581
|
+
if (!regexFoldsIn(cp, cp)) {
|
|
582
|
+
return this.node(NODE_CHAR, cp, cp)
|
|
583
|
+
}
|
|
584
|
+
const step: i32 = this.foldStepOf(cp)
|
|
585
|
+
if (step < 0) {
|
|
586
|
+
return this.node(NODE_CHAR, cp, cp)
|
|
587
|
+
}
|
|
588
|
+
const next: i32 = regexFoldTarget(cp, step)
|
|
589
|
+
if ((step & 1) === 1) {
|
|
590
|
+
return this.node(NODE_CHAR, cp, next)
|
|
591
|
+
}
|
|
592
|
+
this.tmpCount = 0
|
|
593
|
+
this.addRange(cp, cp)
|
|
594
|
+
let c: i32 = next
|
|
595
|
+
while (c !== cp) {
|
|
596
|
+
this.addRange(c, c)
|
|
597
|
+
c = regexFoldTarget(c, this.foldStepOf(c))
|
|
598
|
+
}
|
|
599
|
+
return this.finishClass(false)
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/** The number at `tablePos` in `table`, a generated table's base-32 digits, `tablePos` moved past it. */
|
|
603
|
+
tableNumber(table: string): i32 {
|
|
604
|
+
let v: i32 = 0
|
|
605
|
+
let d: i32 = toI32(table.charCodeAt(this.tablePos)) - 48
|
|
606
|
+
this.tablePos += 1
|
|
607
|
+
while (d >= 32) {
|
|
608
|
+
v = v * 32 + d - 32
|
|
609
|
+
d = toI32(table.charCodeAt(this.tablePos)) - 48
|
|
610
|
+
this.tablePos += 1
|
|
611
|
+
}
|
|
612
|
+
return v * 32 + d
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* The member of the `REGEX_FOLD_DATA` block that may hold `cp`: the last
|
|
617
|
+
* block starting at or before it, or the first. `tablePos` is left at that
|
|
618
|
+
* member's step.
|
|
619
|
+
*/
|
|
620
|
+
foldSeek(cp: i32): i32 {
|
|
621
|
+
let a: i32 = 0
|
|
622
|
+
let b: i32 = toI32(REGEX_FOLD_INDEX.length) >> 3
|
|
623
|
+
while (b - a > 1) {
|
|
624
|
+
const mid: i32 = (a + b) >> 1
|
|
625
|
+
if (regexFixedAt(REGEX_FOLD_INDEX, mid * 8) <= cp) {
|
|
626
|
+
a = mid
|
|
627
|
+
} else {
|
|
628
|
+
b = mid
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
this.tablePos = regexFixedAt(REGEX_FOLD_INDEX, a * 8 + 4)
|
|
632
|
+
return regexFixedAt(REGEX_FOLD_INDEX, a * 8)
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/** `cp`'s step in `REGEX_FOLD_DATA`, for `regexFoldTarget`, or -1 if it folds to nothing. */
|
|
636
|
+
foldStepOf(cp: i32): i32 {
|
|
637
|
+
let c: i32 = this.foldSeek(cp)
|
|
638
|
+
const end: i32 = toI32(REGEX_FOLD_DATA.length)
|
|
639
|
+
while (c < cp && this.tablePos < end) {
|
|
640
|
+
this.tableNumber(REGEX_FOLD_DATA)
|
|
641
|
+
if (this.tablePos < end) {
|
|
642
|
+
c += this.tableNumber(REGEX_FOLD_DATA)
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return c === cp && this.tablePos < end ? this.tableNumber(REGEX_FOLD_DATA) : -1
|
|
419
646
|
}
|
|
420
647
|
|
|
421
648
|
/** `alternative ('|' alternative)*`. */
|
|
@@ -713,15 +940,32 @@ class RegexParser {
|
|
|
713
940
|
this.pos += 1
|
|
714
941
|
this.tmpCount = 0
|
|
715
942
|
this.addSet(c)
|
|
943
|
+
// `\d`, `\w` and `\s` and their capitals are closed under case
|
|
944
|
+
// folding already: `\d` and `\s` hold no code point that folds, and
|
|
945
|
+
// under `i` `\w` holds both cases of every ASCII letter and the two
|
|
946
|
+
// code points above ASCII that fold into them, U+017F and U+212A,
|
|
947
|
+
// which `\W` leaves out. So the class is finished as if `i` were off.
|
|
948
|
+
const icase: boolean = this.icase
|
|
949
|
+
this.icase = false
|
|
950
|
+
const node: i32 = this.finishClass(false)
|
|
951
|
+
this.icase = icase
|
|
952
|
+
return node
|
|
953
|
+
}
|
|
954
|
+
if (c === 112 || c === 80) {
|
|
955
|
+
this.tmpCount = 0
|
|
956
|
+
this.addProperty(at, c === 80)
|
|
957
|
+
if (this.failed) {
|
|
958
|
+
return -1
|
|
959
|
+
}
|
|
716
960
|
return this.finishClass(false)
|
|
717
961
|
}
|
|
718
962
|
if (c === 98) {
|
|
719
963
|
this.pos += 1
|
|
720
|
-
return this.node(NODE_ASSERT, ASSERT_WORD, REGEX_NIL)
|
|
964
|
+
return this.node(NODE_ASSERT, this.icase ? ASSERT_WORD_FOLD : ASSERT_WORD, REGEX_NIL)
|
|
721
965
|
}
|
|
722
966
|
if (c === 66) {
|
|
723
967
|
this.pos += 1
|
|
724
|
-
return this.node(NODE_ASSERT, ASSERT_NOT_WORD, REGEX_NIL)
|
|
968
|
+
return this.node(NODE_ASSERT, this.icase ? ASSERT_NOT_WORD_FOLD : ASSERT_NOT_WORD, REGEX_NIL)
|
|
725
969
|
}
|
|
726
970
|
if ((c >= 49 && c <= 57) || c === 107) {
|
|
727
971
|
return this.fail("backreferences are not supported", at)
|
|
@@ -910,6 +1154,14 @@ class RegexParser {
|
|
|
910
1154
|
r.push(95)
|
|
911
1155
|
r.push(97)
|
|
912
1156
|
r.push(122)
|
|
1157
|
+
if (this.icase) {
|
|
1158
|
+
// U+017F and U+212A fold to `s` and `k`, so under `i` they are word
|
|
1159
|
+
// characters, as for JavaScript's `iu`, and `\W` leaves them out.
|
|
1160
|
+
r.push(0x17f)
|
|
1161
|
+
r.push(0x17f)
|
|
1162
|
+
r.push(0x212a)
|
|
1163
|
+
r.push(0x212a)
|
|
1164
|
+
}
|
|
913
1165
|
} else {
|
|
914
1166
|
r.push(9)
|
|
915
1167
|
r.push(13)
|
|
@@ -956,6 +1208,114 @@ class RegexParser {
|
|
|
956
1208
|
}
|
|
957
1209
|
}
|
|
958
1210
|
|
|
1211
|
+
/**
|
|
1212
|
+
* Add the ranges of `\p{…}`, or with `negate` the gaps between them as
|
|
1213
|
+
* `\P{…}` does, to the class being parsed. The cursor is on the `p`, `at`
|
|
1214
|
+
* on the `\`. The name is a General_Category value or a binary property
|
|
1215
|
+
* alone, or `General_Category`, `Script` or `Script_Extensions` (or `gc`,
|
|
1216
|
+
* `sc`, `scx`) `=` a value, spelled as ECMA-262 spells them.
|
|
1217
|
+
*/
|
|
1218
|
+
addProperty(at: i32, negate: boolean): void {
|
|
1219
|
+
this.pos += 1
|
|
1220
|
+
if (this.pos >= this.len || this.byteAt(this.pos) !== 123) {
|
|
1221
|
+
this.fail("invalid property name", at)
|
|
1222
|
+
return
|
|
1223
|
+
}
|
|
1224
|
+
const start: i32 = this.pos + 1
|
|
1225
|
+
let eq: i32 = -1
|
|
1226
|
+
let i: i32 = start
|
|
1227
|
+
while (i < this.len && this.byteAt(i) !== 125) {
|
|
1228
|
+
if (this.byteAt(i) === 61 && eq < 0) {
|
|
1229
|
+
eq = i
|
|
1230
|
+
} else if (!isRegexWordByte(this.byteAt(i))) {
|
|
1231
|
+
this.fail("invalid property name", at)
|
|
1232
|
+
return
|
|
1233
|
+
}
|
|
1234
|
+
i += 1
|
|
1235
|
+
}
|
|
1236
|
+
if (i >= this.len || i === start) {
|
|
1237
|
+
this.fail("invalid property name", at)
|
|
1238
|
+
return
|
|
1239
|
+
}
|
|
1240
|
+
this.pos = i + 1
|
|
1241
|
+
let entry: i32 = -1
|
|
1242
|
+
if (eq < 0) {
|
|
1243
|
+
const name: string = this.src.slice(start, i)
|
|
1244
|
+
entry = regexPropertyEntry(`g${name}`)
|
|
1245
|
+
if (entry < 0) {
|
|
1246
|
+
entry = regexPropertyEntry(`b${name}`)
|
|
1247
|
+
}
|
|
1248
|
+
if (entry < 0) {
|
|
1249
|
+
this.fail("invalid property name", at)
|
|
1250
|
+
return
|
|
1251
|
+
}
|
|
1252
|
+
} else {
|
|
1253
|
+
const name: string = this.src.slice(start, eq)
|
|
1254
|
+
const value: string = this.src.slice(eq + 1, i)
|
|
1255
|
+
const script: boolean = name === "Script" || name === "sc"
|
|
1256
|
+
const extensions: boolean = name === "Script_Extensions" || name === "scx"
|
|
1257
|
+
if (name === "General_Category" || name === "gc") {
|
|
1258
|
+
entry = regexPropertyEntry(`g${value}`)
|
|
1259
|
+
} else if (script || extensions) {
|
|
1260
|
+
entry = regexPropertyEntry(`s${value}`)
|
|
1261
|
+
} else {
|
|
1262
|
+
this.fail("invalid property name", at)
|
|
1263
|
+
return
|
|
1264
|
+
}
|
|
1265
|
+
if (entry < 0) {
|
|
1266
|
+
this.fail("invalid property value", at)
|
|
1267
|
+
return
|
|
1268
|
+
}
|
|
1269
|
+
// A script's entry is its Script list, a comma, then its Script_Extensions list.
|
|
1270
|
+
if (extensions) {
|
|
1271
|
+
entry = toI32(REGEX_PROPERTY_NAMES.indexOf(",", entry)) + 1
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
// An entry is the offset of its list in `REGEX_PROPERTY_DATA`, after a `~` for its complement.
|
|
1275
|
+
let gaps: boolean = negate
|
|
1276
|
+
if (toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) === 126) {
|
|
1277
|
+
gaps = !gaps
|
|
1278
|
+
entry += 1
|
|
1279
|
+
}
|
|
1280
|
+
let offset: i32 = 0
|
|
1281
|
+
while (
|
|
1282
|
+
toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) >= 48 &&
|
|
1283
|
+
toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) <= 57
|
|
1284
|
+
) {
|
|
1285
|
+
offset = offset * 10 + toI32(REGEX_PROPERTY_NAMES.charCodeAt(entry)) - 48
|
|
1286
|
+
entry += 1
|
|
1287
|
+
}
|
|
1288
|
+
this.tablePos = offset
|
|
1289
|
+
const n: i32 = this.tableNumber(REGEX_PROPERTY_DATA)
|
|
1290
|
+
const before: i32 = this.tmpCount
|
|
1291
|
+
let from: i32 = 0
|
|
1292
|
+
let hi: i32 = -2
|
|
1293
|
+
let k: i32 = 0
|
|
1294
|
+
while (k < n) {
|
|
1295
|
+
const lo: i32 = hi + 2 + this.tableNumber(REGEX_PROPERTY_DATA)
|
|
1296
|
+
hi = lo + this.tableNumber(REGEX_PROPERTY_DATA)
|
|
1297
|
+
if (!gaps) {
|
|
1298
|
+
this.addRange(lo, hi)
|
|
1299
|
+
} else if (lo > from) {
|
|
1300
|
+
this.addRange(from, lo - 1)
|
|
1301
|
+
}
|
|
1302
|
+
from = hi + 1
|
|
1303
|
+
k += 1
|
|
1304
|
+
}
|
|
1305
|
+
if (gaps && from <= REGEX_MAX_CP) {
|
|
1306
|
+
this.addRange(from, REGEX_MAX_CP)
|
|
1307
|
+
}
|
|
1308
|
+
this.countPropertyRanges(this.tmpCount - before, at)
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
/** Count `n` more ranges against `REGEX_MAX_PROPERTY_RANGES`, failing at `at` past it. */
|
|
1312
|
+
countPropertyRanges(n: i32, at: i32): void {
|
|
1313
|
+
this.propertyRanges += n
|
|
1314
|
+
if (this.propertyRanges > REGEX_MAX_PROPERTY_RANGES) {
|
|
1315
|
+
this.fail("property escapes and case folding add more than 100000 ranges", at)
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
|
|
959
1319
|
/** One member of a class: a code point, or -2 once a set escape has added its ranges. */
|
|
960
1320
|
parseClassAtom(): i32 {
|
|
961
1321
|
const c: i32 = this.byteAt(this.pos)
|
|
@@ -971,6 +1331,10 @@ class RegexParser {
|
|
|
971
1331
|
this.addSet(e)
|
|
972
1332
|
return -2
|
|
973
1333
|
}
|
|
1334
|
+
if (e === 112 || e === 80) {
|
|
1335
|
+
this.addProperty(at, e === 80)
|
|
1336
|
+
return -2
|
|
1337
|
+
}
|
|
974
1338
|
if ((e >= 49 && e <= 57) || e === 107) {
|
|
975
1339
|
return this.fail("backreferences are not supported", at)
|
|
976
1340
|
}
|
|
@@ -1078,33 +1442,59 @@ class RegexParser {
|
|
|
1078
1442
|
c += 1
|
|
1079
1443
|
}
|
|
1080
1444
|
}
|
|
1081
|
-
|
|
1445
|
+
let from: i32 = toI32(this.clsLo.length)
|
|
1446
|
+
let out: i32 = this.storeRanges()
|
|
1447
|
+
// Under `i`, the class closed under simple case folding above ASCII.
|
|
1448
|
+
if (this.icase && out > from && this.foldRanges(from, out)) {
|
|
1449
|
+
if (this.failed) {
|
|
1450
|
+
return -1
|
|
1451
|
+
}
|
|
1452
|
+
from = toI32(this.clsLo.length)
|
|
1453
|
+
out = this.storeRanges()
|
|
1454
|
+
}
|
|
1455
|
+
this.clsFrom.push(from)
|
|
1456
|
+
this.clsTo.push(out)
|
|
1457
|
+
this.clsNeg.push(negated ? toU8(1) : toU8(0))
|
|
1458
|
+
// The merged ranges past `out` are dead; later classes start after them.
|
|
1459
|
+
return this.node(NODE_CLASS, k, REGEX_NIL)
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
/**
|
|
1463
|
+
* Append the non-ASCII part of the class being parsed to `clsLo` /
|
|
1464
|
+
* `clsHi`, sorted by start and merged, and answer where the merged run ends.
|
|
1465
|
+
*/
|
|
1466
|
+
storeRanges(): i32 {
|
|
1082
1467
|
const from: i32 = toI32(this.clsLo.length)
|
|
1083
|
-
i = 0
|
|
1468
|
+
let i: i32 = 0
|
|
1084
1469
|
while (i < this.tmpCount) {
|
|
1085
|
-
let lo: i32 = this.tmpLo[i]
|
|
1086
1470
|
const hi: i32 = this.tmpHi[i]
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1471
|
+
if (hi >= 128) {
|
|
1472
|
+
const lo: i32 = this.tmpLo[i] < 128 ? 128 : this.tmpLo[i]
|
|
1473
|
+
this.clsLo.push(lo)
|
|
1474
|
+
this.clsHi.push(hi)
|
|
1090
1475
|
}
|
|
1091
|
-
|
|
1092
|
-
lo = 128
|
|
1093
|
-
}
|
|
1094
|
-
this.clsLo.push(lo)
|
|
1095
|
-
this.clsHi.push(hi)
|
|
1096
|
-
let m: i32 = toI32(this.clsLo.length) - 1
|
|
1097
|
-
while (m > from && this.clsLo[m - 1] > lo) {
|
|
1098
|
-
this.clsLo[m] = this.clsLo[m - 1]
|
|
1099
|
-
this.clsHi[m] = this.clsHi[m - 1]
|
|
1100
|
-
m -= 1
|
|
1101
|
-
}
|
|
1102
|
-
this.clsLo[m] = lo
|
|
1103
|
-
this.clsHi[m] = hi
|
|
1476
|
+
i += 1
|
|
1104
1477
|
}
|
|
1105
|
-
// Merge in place, then drop what merging left past the end by copying
|
|
1106
|
-
// the merged run back over a fresh tail.
|
|
1107
1478
|
const end: i32 = toI32(this.clsLo.length)
|
|
1479
|
+
if (end - from <= REGEX_INSERTION_SORT) {
|
|
1480
|
+
i = from + 1
|
|
1481
|
+
while (i < end) {
|
|
1482
|
+
const lo: i32 = this.clsLo[i]
|
|
1483
|
+
const hi: i32 = this.clsHi[i]
|
|
1484
|
+
let m: i32 = i
|
|
1485
|
+
while (m > from && this.clsLo[m - 1] > lo) {
|
|
1486
|
+
this.clsLo[m] = this.clsLo[m - 1]
|
|
1487
|
+
this.clsHi[m] = this.clsHi[m - 1]
|
|
1488
|
+
m -= 1
|
|
1489
|
+
}
|
|
1490
|
+
this.clsLo[m] = lo
|
|
1491
|
+
this.clsHi[m] = hi
|
|
1492
|
+
i += 1
|
|
1493
|
+
}
|
|
1494
|
+
} else {
|
|
1495
|
+
this.mergeSort(from, end)
|
|
1496
|
+
}
|
|
1497
|
+
// Merge in place; what merging leaves past `out` is dead.
|
|
1108
1498
|
let out: i32 = from
|
|
1109
1499
|
i = from
|
|
1110
1500
|
while (i < end) {
|
|
@@ -1121,11 +1511,151 @@ class RegexParser {
|
|
|
1121
1511
|
}
|
|
1122
1512
|
i += 1
|
|
1123
1513
|
}
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1514
|
+
return out
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
/**
|
|
1518
|
+
* Sort `clsLo` / `clsHi` over `[from, end)` by start, bottom-up through a
|
|
1519
|
+
* scratch copy, so that a class of many ranges, such as a few property
|
|
1520
|
+
* escapes in one, costs n log n rather than the n² insertion would.
|
|
1521
|
+
*/
|
|
1522
|
+
mergeSort(from: i32, end: i32): void {
|
|
1523
|
+
const n: i32 = end - from
|
|
1524
|
+
let srcLo: i32[] = []
|
|
1525
|
+
let srcHi: i32[] = []
|
|
1526
|
+
let dstLo: i32[] = []
|
|
1527
|
+
let dstHi: i32[] = []
|
|
1528
|
+
let i: i32 = from
|
|
1529
|
+
while (i < end) {
|
|
1530
|
+
srcLo.push(this.clsLo[i])
|
|
1531
|
+
srcHi.push(this.clsHi[i])
|
|
1532
|
+
dstLo.push(this.clsLo[i])
|
|
1533
|
+
dstHi.push(this.clsHi[i])
|
|
1534
|
+
i += 1
|
|
1535
|
+
}
|
|
1536
|
+
let width: i32 = 1
|
|
1537
|
+
while (width < n) {
|
|
1538
|
+
let left: i32 = 0
|
|
1539
|
+
while (left < n) {
|
|
1540
|
+
const mid: i32 = left + width < n ? left + width : n
|
|
1541
|
+
const right: i32 = mid + width < n ? mid + width : n
|
|
1542
|
+
let a: i32 = left
|
|
1543
|
+
let b: i32 = mid
|
|
1544
|
+
let o: i32 = left
|
|
1545
|
+
// Every scratch array holds `n` entries and `a`, `b`, `o` stay below
|
|
1546
|
+
// `n`; the length tests say so where the prover reads them.
|
|
1547
|
+
while (o >= 0 && o < right && o < toI32(dstLo.length) && o < toI32(dstHi.length)) {
|
|
1548
|
+
let fromA: boolean = a < mid
|
|
1549
|
+
if (fromA && b < right && a >= 0 && a < toI32(srcLo.length) && b >= 0 && b < toI32(srcLo.length)) {
|
|
1550
|
+
fromA = srcLo[a] <= srcLo[b]
|
|
1551
|
+
}
|
|
1552
|
+
const pick: i32 = fromA ? a : b
|
|
1553
|
+
if (pick >= 0 && pick < toI32(srcLo.length) && pick < toI32(srcHi.length)) {
|
|
1554
|
+
dstLo[o] = srcLo[pick]
|
|
1555
|
+
dstHi[o] = srcHi[pick]
|
|
1556
|
+
}
|
|
1557
|
+
if (fromA) {
|
|
1558
|
+
a += 1
|
|
1559
|
+
} else {
|
|
1560
|
+
b += 1
|
|
1561
|
+
}
|
|
1562
|
+
o += 1
|
|
1563
|
+
}
|
|
1564
|
+
left = right
|
|
1565
|
+
}
|
|
1566
|
+
const lo: i32[] = srcLo
|
|
1567
|
+
const hi: i32[] = srcHi
|
|
1568
|
+
srcLo = dstLo
|
|
1569
|
+
srcHi = dstHi
|
|
1570
|
+
dstLo = lo
|
|
1571
|
+
dstHi = hi
|
|
1572
|
+
width *= 2
|
|
1573
|
+
}
|
|
1574
|
+
i = 0
|
|
1575
|
+
while (i < n && i < toI32(srcLo.length) && i < toI32(srcHi.length)) {
|
|
1576
|
+
this.clsLo[from + i] = srcLo[i]
|
|
1577
|
+
this.clsHi[from + i] = srcHi[i]
|
|
1578
|
+
i += 1
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
/**
|
|
1583
|
+
* Whether the merged ranges `[from, out)` miss a code point some member
|
|
1584
|
+
* folds to; if they do, the class being parsed becomes them and the
|
|
1585
|
+
* missing code points, to be stored again.
|
|
1586
|
+
*/
|
|
1587
|
+
foldRanges(from: i32, out: i32): boolean {
|
|
1588
|
+
// A class closed already, holding no folding code point or all of them, leaves the fold table unread.
|
|
1589
|
+
let touches: boolean = false
|
|
1590
|
+
let covers: boolean = true
|
|
1591
|
+
let gap: i32 = 128
|
|
1592
|
+
let r0: i32 = from
|
|
1593
|
+
while (r0 < out) {
|
|
1594
|
+
if (!touches && regexFoldsIn(this.clsLo[r0], this.clsHi[r0])) {
|
|
1595
|
+
touches = true
|
|
1596
|
+
}
|
|
1597
|
+
if (covers && gap < this.clsLo[r0] && regexFoldsIn(gap, this.clsLo[r0] - 1)) {
|
|
1598
|
+
covers = false
|
|
1599
|
+
}
|
|
1600
|
+
gap = this.clsHi[r0] + 1
|
|
1601
|
+
r0 += 1
|
|
1602
|
+
}
|
|
1603
|
+
if (covers && gap <= REGEX_MAX_CP && regexFoldsIn(gap, REGEX_MAX_CP)) {
|
|
1604
|
+
covers = false
|
|
1605
|
+
}
|
|
1606
|
+
if (!touches || covers) {
|
|
1607
|
+
return false
|
|
1608
|
+
}
|
|
1609
|
+
const end: i32 = toI32(REGEX_FOLD_DATA.length)
|
|
1610
|
+
let added: i32 = 0
|
|
1611
|
+
let r: i32 = from
|
|
1612
|
+
while (r < out) {
|
|
1613
|
+
// The folding code points in the range, read on from the block that may hold its first.
|
|
1614
|
+
let f: i32 = this.foldSeek(this.clsLo[r])
|
|
1615
|
+
while (f <= this.clsHi[r] && this.tablePos < end) {
|
|
1616
|
+
const step: i32 = this.tableNumber(REGEX_FOLD_DATA)
|
|
1617
|
+
const at: i32 = this.tablePos
|
|
1618
|
+
let c: i32 = regexFoldTarget(f, step)
|
|
1619
|
+
while (f >= this.clsLo[r] && c !== f) {
|
|
1620
|
+
if (!this.rangesHave(from, out, c)) {
|
|
1621
|
+
if (added === 0) {
|
|
1622
|
+
this.tmpCount = 0
|
|
1623
|
+
}
|
|
1624
|
+
this.addRange(c, c)
|
|
1625
|
+
added += 1
|
|
1626
|
+
}
|
|
1627
|
+
c = (step & 1) === 1 ? f : regexFoldTarget(c, this.foldStepOf(c))
|
|
1628
|
+
}
|
|
1629
|
+
this.tablePos = at
|
|
1630
|
+
f = at < end ? f + this.tableNumber(REGEX_FOLD_DATA) : REGEX_MAX_CP + 1
|
|
1631
|
+
}
|
|
1632
|
+
r += 1
|
|
1633
|
+
}
|
|
1634
|
+
if (added === 0) {
|
|
1635
|
+
return false
|
|
1636
|
+
}
|
|
1637
|
+
r = from
|
|
1638
|
+
while (r < out) {
|
|
1639
|
+
this.addRange(this.clsLo[r], this.clsHi[r])
|
|
1640
|
+
r += 1
|
|
1641
|
+
}
|
|
1642
|
+
this.countPropertyRanges(added, this.pos)
|
|
1643
|
+
return true
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
/** Whether the sorted, merged ranges `[from, out)` hold `c`. */
|
|
1647
|
+
rangesHave(from: i32, out: i32, c: i32): boolean {
|
|
1648
|
+
let lo: i32 = from
|
|
1649
|
+
let hi: i32 = out
|
|
1650
|
+
while (lo < hi) {
|
|
1651
|
+
const mid: i32 = (lo + hi) >> 1
|
|
1652
|
+
if (this.clsHi[mid] < c) {
|
|
1653
|
+
lo = mid + 1
|
|
1654
|
+
} else {
|
|
1655
|
+
hi = mid
|
|
1656
|
+
}
|
|
1657
|
+
}
|
|
1658
|
+
return lo < out && this.clsLo[lo] <= c
|
|
1129
1659
|
}
|
|
1130
1660
|
}
|
|
1131
1661
|
|
|
@@ -1207,6 +1737,8 @@ const CTX_LINE: i32 = 2
|
|
|
1207
1737
|
const CTX_OTHER: i32 = 3
|
|
1208
1738
|
const CTX_EOT: i32 = 4
|
|
1209
1739
|
const CTX_KINDS: i32 = 5
|
|
1740
|
+
// The kinds, then the slot that says whether U+017F and U+212A are word characters.
|
|
1741
|
+
const CTX_MASK_LEN: i32 = 6
|
|
1210
1742
|
const CTX_SLOTS: i32 = 4
|
|
1211
1743
|
|
|
1212
1744
|
/**
|
|
@@ -1216,7 +1748,7 @@ const CTX_SLOTS: i32 = 4
|
|
|
1216
1748
|
* twice.
|
|
1217
1749
|
*/
|
|
1218
1750
|
const regexContextMask = (bits: i32): i32[] => {
|
|
1219
|
-
const m: i32[] = new Array<i32>(
|
|
1751
|
+
const m: i32[] = new Array<i32>(CTX_MASK_LEN)
|
|
1220
1752
|
const line: boolean = (bits & (1 << ASSERT_BEGIN_LINE)) !== 0
|
|
1221
1753
|
if ((bits & (1 << ASSERT_BEGIN_TEXT)) !== 0) {
|
|
1222
1754
|
m[CTX_START] = CTX_START
|
|
@@ -1225,11 +1757,12 @@ const regexContextMask = (bits: i32): i32[] => {
|
|
|
1225
1757
|
} else {
|
|
1226
1758
|
m[CTX_START] = CTX_OTHER
|
|
1227
1759
|
}
|
|
1228
|
-
const word: boolean = (bits &
|
|
1760
|
+
const word: boolean = (bits & ASSERT_WORD_BITS) !== 0
|
|
1229
1761
|
m[CTX_WORD] = word ? CTX_WORD : CTX_OTHER
|
|
1230
1762
|
m[CTX_LINE] = line ? CTX_LINE : CTX_OTHER
|
|
1231
1763
|
m[CTX_OTHER] = CTX_OTHER
|
|
1232
1764
|
m[CTX_EOT] = CTX_OTHER
|
|
1765
|
+
m[CTX_KINDS] = (bits & ASSERT_FOLD_BITS) !== 0 ? 1 : 0
|
|
1233
1766
|
return m
|
|
1234
1767
|
}
|
|
1235
1768
|
|
|
@@ -2484,8 +3017,13 @@ export class Regex {
|
|
|
2484
3017
|
const b2: i32 = toI32(text.charCodeAt(p + 2))
|
|
2485
3018
|
return toI32(text.charCodeAt(p + 1)) === 0x80 && (b2 === 0xa8 || b2 === 0xa9)
|
|
2486
3019
|
}
|
|
2487
|
-
|
|
2488
|
-
|
|
3020
|
+
let before: boolean = p > 0 && isRegexWordByte(toI32(text.charCodeAt(p - 1)))
|
|
3021
|
+
let after: boolean = p < len && isRegexWordByte(toI32(text.charCodeAt(p)))
|
|
3022
|
+
if (kind >= ASSERT_WORD_FOLD) {
|
|
3023
|
+
before = before || regexFoldWordBefore(text, p)
|
|
3024
|
+
after = after || regexFoldWordAt(text, p, len)
|
|
3025
|
+
return kind === ASSERT_WORD_FOLD ? before !== after : before === after
|
|
3026
|
+
}
|
|
2489
3027
|
return kind === ASSERT_WORD ? before !== after : before === after
|
|
2490
3028
|
}
|
|
2491
3029
|
|
|
@@ -2724,7 +3262,12 @@ export class Regex {
|
|
|
2724
3262
|
}
|
|
2725
3263
|
const bits: i32 = bitsF | bitsR
|
|
2726
3264
|
const lines: boolean = anyNl || (bits & ((1 << ASSERT_BEGIN_LINE) | (1 << ASSERT_END_LINE))) !== 0
|
|
2727
|
-
const words: boolean = (bits &
|
|
3265
|
+
const words: boolean = (bits & ASSERT_WORD_BITS) !== 0
|
|
3266
|
+
const wordFold: boolean = (bits & ASSERT_FOLD_BITS) !== 0
|
|
3267
|
+
// A program needs one view of U+017F and U+212A: give up on a mix.
|
|
3268
|
+
if (wordFold && (bits & ((1 << ASSERT_WORD) | (1 << ASSERT_NOT_WORD))) !== 0) {
|
|
3269
|
+
return
|
|
3270
|
+
}
|
|
2728
3271
|
// The boundaries above ASCII: where a literal, a range or a line
|
|
2729
3272
|
// terminator starts and where it stops. The reverse program reads the
|
|
2730
3273
|
// same characters, so the forward one is enough.
|
|
@@ -2767,6 +3310,12 @@ export class Regex {
|
|
|
2767
3310
|
points.push(0x2028)
|
|
2768
3311
|
points.push(0x202a)
|
|
2769
3312
|
}
|
|
3313
|
+
if (wordFold) {
|
|
3314
|
+
points.push(0x17f)
|
|
3315
|
+
points.push(0x180)
|
|
3316
|
+
points.push(0x212a)
|
|
3317
|
+
points.push(0x212b)
|
|
3318
|
+
}
|
|
2770
3319
|
regexSortPoints(points)
|
|
2771
3320
|
const lows: i32[] = [128]
|
|
2772
3321
|
let i: i32 = 0
|
|
@@ -2878,7 +3427,8 @@ export class Regex {
|
|
|
2878
3427
|
u = 0
|
|
2879
3428
|
while (u < toI32(hit.length) && u < toI32(rep.length)) {
|
|
2880
3429
|
const r: i32 = rep[u]
|
|
2881
|
-
const word: boolean =
|
|
3430
|
+
const word: boolean =
|
|
3431
|
+
(r >= 0 && r < 128 && isRegexWordByte(r)) || (wordFold && (r === 0x17f || r === 0x212a))
|
|
2882
3432
|
if (u < toI32(hit.length)) {
|
|
2883
3433
|
hit[u] = toU8(word ? 1 : 0)
|
|
2884
3434
|
}
|
|
@@ -2936,7 +3486,7 @@ export class Regex {
|
|
|
2936
3486
|
kind = CTX_EOT
|
|
2937
3487
|
} else if (r === 10 || r === 13 || r === 0x2028 || r === 0x2029) {
|
|
2938
3488
|
kind = CTX_LINE
|
|
2939
|
-
} else if (r < 128 && isRegexWordByte(r)) {
|
|
3489
|
+
} else if ((r < 128 && isRegexWordByte(r)) || (wordFold && (r === 0x17f || r === 0x212a))) {
|
|
2940
3490
|
kind = CTX_WORD
|
|
2941
3491
|
}
|
|
2942
3492
|
this.dNextK[c] = kind
|
|
@@ -3038,7 +3588,7 @@ export class Regex {
|
|
|
3038
3588
|
return nk === CTX_EOT || nk === CTX_LINE
|
|
3039
3589
|
}
|
|
3040
3590
|
const boundary: boolean = (ctx === CTX_WORD) !== (nk === CTX_WORD)
|
|
3041
|
-
return kind === ASSERT_WORD ? boundary : !boundary
|
|
3591
|
+
return kind === ASSERT_WORD || kind === ASSERT_WORD_FOLD ? boundary : !boundary
|
|
3042
3592
|
}
|
|
3043
3593
|
|
|
3044
3594
|
/**
|
|
@@ -3422,13 +3972,17 @@ export class Regex {
|
|
|
3422
3972
|
kind = CTX_LINE
|
|
3423
3973
|
} else if (isRegexWordByte(b)) {
|
|
3424
3974
|
kind = CTX_WORD
|
|
3425
|
-
} else if (
|
|
3426
|
-
(
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3975
|
+
} else if (b >= 0x80) {
|
|
3976
|
+
if (
|
|
3977
|
+
(b === 0xa8 || b === 0xa9) &&
|
|
3978
|
+
p >= 3 &&
|
|
3979
|
+
toI32(text.charCodeAt(p - 2)) === 0x80 &&
|
|
3980
|
+
toI32(text.charCodeAt(p - 3)) === 0xe2
|
|
3981
|
+
) {
|
|
3982
|
+
kind = CTX_LINE
|
|
3983
|
+
} else if (this.dMaskF[CTX_KINDS] !== 0 && regexFoldWordBefore(text, p)) {
|
|
3984
|
+
kind = CTX_WORD
|
|
3985
|
+
}
|
|
3432
3986
|
}
|
|
3433
3987
|
}
|
|
3434
3988
|
return this.dMaskF[kind]
|
|
@@ -3452,6 +4006,9 @@ export class Regex {
|
|
|
3452
4006
|
kind = CTX_LINE
|
|
3453
4007
|
}
|
|
3454
4008
|
}
|
|
4009
|
+
if (kind === CTX_OTHER && b >= 0x80 && this.dMaskR[CTX_KINDS] !== 0 && regexFoldWordAt(text, p, len)) {
|
|
4010
|
+
kind = CTX_WORD
|
|
4011
|
+
}
|
|
3455
4012
|
}
|
|
3456
4013
|
return this.dMaskR[kind]
|
|
3457
4014
|
}
|
|
@@ -4195,13 +4752,15 @@ export class Regex {
|
|
|
4195
4752
|
}
|
|
4196
4753
|
|
|
4197
4754
|
/**
|
|
4198
|
-
* Compile `pattern` with `flags`, a string of `i`, `m` and `
|
|
4755
|
+
* Compile `pattern` with `flags`, a string of `i`, `m`, `s` and `u` in any
|
|
4756
|
+
* order; `u` changes nothing, as patterns are always read by code point.
|
|
4199
4757
|
* The error names what is wrong and its byte in the pattern.
|
|
4200
4758
|
*/
|
|
4201
4759
|
export const regexCompile = (pattern: string, flags: string): Result<Regex, string> => {
|
|
4202
4760
|
let icase: boolean = false
|
|
4203
4761
|
let multiline: boolean = false
|
|
4204
4762
|
let dotAll: boolean = false
|
|
4763
|
+
let unicode: boolean = false
|
|
4205
4764
|
const nflags: i32 = toI32(flags.length)
|
|
4206
4765
|
let i: i32 = 0
|
|
4207
4766
|
while (i < nflags) {
|
|
@@ -4212,6 +4771,8 @@ export const regexCompile = (pattern: string, flags: string): Result<Regex, stri
|
|
|
4212
4771
|
multiline = true
|
|
4213
4772
|
} else if (c === 115 && !dotAll) {
|
|
4214
4773
|
dotAll = true
|
|
4774
|
+
} else if (c === 117 && !unicode) {
|
|
4775
|
+
unicode = true
|
|
4215
4776
|
} else {
|
|
4216
4777
|
return Err(`regex: invalid flags "${flags}"`)
|
|
4217
4778
|
}
|