curious-odd-man / RgxGen

Regex: generate matching and non matching strings based on regex pattern.
Apache License 2.0
83 stars 13 forks source link

generating password string from specific Rule does not function #65

Closed ZingerDerGOD closed 1 year ago

ZingerDerGOD commented 3 years ago

Describe the bug Consider a common use-case: We have a regex, used to validate a "password" string. F.e. ^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])[A-Za-z0-9@$!*#&]{8,25}$ Limits:

Then, if we try to feed it to the library, and afterwards generate a password, we are getting passwords which are

THen, for the sake of experiment, if we would consider simplifying the workflow by introducing another pattern, which would be used only for generating the password, with something more simple, like that: ^[A-Za-z0-9@$!*#&]{8,25}$ - we do actually get proper passwords generated, but not every time. As this regex does not qualify any occurrence-times-per-group restrictions, only the overall pattern - generated password might have inclusions from all groups, or might not have... F.e. 7GgDIEFsD, lZcYX6IpgGwOMOO5vQD#pT. Both generated from single run, using simplified regex.

Honestly - I have no ideas of how to tackle this issue nicely, and any advisory/workaround would be as welcomed as the fix.

To Reproduce Steps to reproduce the behavior:

  1. With regex pattern ^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])[A-Za-z0-9@$!*#&]{8,25}$
  2. Use code/API
val rgxGen:RgxGen = new RgxGen("^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])[A-Za-z0-9@$!*#&]{8,25}$");
rgxGen.generate();
  1. See error Semantic: Generated string does not match the regex restrictions.

Expected behavior Generated string would follow original Regex restrictions.

Environment (please complete the following information):

ZingerDerGOD commented 3 years ago

Just to clarify few things:

This is scala code, but should be no difference from java.

Specific version is: "com.github.curious-odd-man" % "rgxgen" % "1.3"

I have also tried playing around with settings (specificly generation.infinite.repeat), as with default settings generated strings are reeeally looong... But overall - it does not solve the issue, as with default regexp generated strings still have inclusion of non-valid characters.

Perfect solution for me would be - using same regex for checking, and for generating the passwords. But in case this issue is "solvable" with just adding custom regexp, used for generating the password - I'm fine wht that too :)

And - yes, apologies, I'm not that good with regexps in general, so I might be overlooking obvious things here. Sorry :)

ZingerDerGOD commented 3 years ago

Atm "solved" the issue by re-generating password... ugly, but will do as a temporary solution, until I'll get some help form you, sir :)

For the reference, my working code:

    val rgxGen:RgxGen = new RgxGen(getPasswordRule().passwordGenerationRule);
    var props:RgxGenProperties = new RgxGenProperties()
    props.setProperty("generation.infinite.repeat", "10");
    rgxGen.setProperties(props);
    var newPassword = "";
    var matches:Boolean = false;
    var attempts = 0;
    do {
      newPassword = rgxGen.generate();
      matches = checkStrength(newPassword);
      attempts = attempts + 1;
    }
    while (!matches && attempts < RANDOM_PASSWORD_GENERATION_ATTEMPTS)
    if (!matches) {
      throw new Exception("ERROR: Password generator failed to generate proper password after " + RANDOM_PASSWORD_GENERATION_ATTEMPTS + " attempts. Please try again.")
    }
    newPassword

I guess it can be used as a pseudocode, if somebody would need it.

Checking with RANDOM_PASSWORD_GENERATION_ATTEMPTS < 5 showed quite high error rate (up to 10%), but with 8+ error rate is close to 0% (with 10 attempts - out of 100.000 password generation requests all resulted in success). Be wary tho that these rates should be valid only for described above strength checks.

curious-odd-man commented 3 years ago

Hello!

Thank you for reaching out and reporting this issue. The issue you've described is a known one and it is mentioned among limitations here. Moreover there is already opened ticked for this kind of issue - #63.

The long story short - the problem is that it is quite hard at the moment to handle situation when lookbehind/lookahead should influence/limit possible variations of other parts of expression.

From my current view your case is particularly complex. And most probably will be solved (if I will not find any nicer approach), by just brute-force:

  1. Generate text by: [A-Za-z0-9@$!*#&]{8,25}
  2. Check that each other lookahead is satisfied. This is because even though it is possible to "understand" that you require to have all of these characters at least once in generated text, though I would need to tamper with randomness to enforce this kind of rule. And this complicates things a lot, which I probably would like to avoid.

Let's keep this ticket open for now and I will think about the solution for this and the previously mentioned ticket, though I don't want to promise that the solution will be in a nearest time available.

I will need to think more about approaching this issue, but most probably I will have quite limited solution with a brute-force approach and some configuration options to fine-tune the process.

In the meantime - regarding your solution:

The approach you've taken works only by a miracle. The fact is that it currently works as follows:

  1. Generate value matching (?=.*[A-Z]) - first positive lookahead
  2. Generate value matching (?=.*[!@#$&*])
  3. Generate value matching (?=.*[0-9])
  4. Generate value matching (?=.*[a-z])
  5. Generate value matching [A-Za-z0-9@$!*#&]{8,25}
  6. Concatenate all values

This is obviously incorrect approach and the results are also only occasionally might be valid.

There are few ways I see how you can improve this: First Generate by final part - [A-Za-z0-9@$!*#&]{8,25} - and then validate with your whole pattern, if does not match - regenerate. I think it will result in a more successes. Alternatively You can change a pattern a bit:

Java test:

 String newPattern = "(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])([A-Z]|[a-z]|[0-9]|[!@#$&*]){8,25}";

Pattern compile = Pattern.compile(newPattern);
RgxGen rgxGen = new RgxGen(newPattern);
RgxGenProperties props = new RgxGenProperties();
props.setProperty("generation.infinite.repeat", "0");             // NOTE this 0 !!!
rgxGen.setProperties(props);
String text;
do {
    text = rgxGen.generate();
    System.out.println(text);
} while(compile.matcher(text).find());

This tricks RgxGen with the fact, that each alternative has equal probability to be selected for each character generation. And given that you have at least 8 character long password and only 4 groups - the probability for each group to appear is quite high. Though you still need your check. I've ran this sample code above for a several seconds and it did not stop - meaning all generated values matched.

Hope that helps. :)

ZingerDerGOD commented 3 years ago

Good day :)

Ok, then let's hope this will get resolved with the version, that will contain that #63 fix :)

Meanwhile, my 5 cents on your latest comment:

First of all I totally understand that this is a really complicated case of regex for generating a string. But this regex is actually quite common for the task it is designed for: validating password complexity. So - I'm not saying that you have to get it working or something sir :) But I do think, that this is (imho) one of the most common use-cases for the generate string out of RegEx in general :) Just a couple of cents on why this feature even required :)

Then, about your last comment.

String newPattern = "(?=.[A-Z])(?=.[!@#$&])(?=.[0-9])(?=.[a-z])([A-Z]|[a-z]|[0-9]|[!@#$&]){8,25}";

First of all - thank you very much for this new RegEx. It works properly for generating, and validating passwords, both way :) But, just for the information - it does yield wrong passwords sometimes. Same as with simplified RegEx (^[A-Za-z0-9@$!*#&]{8,25}$), which I've tried before, and to which I've provided some statistics on errors. And error rate of new Regex is pretty much the same.

But anyways, it does bring a benefit of using single regex for both generator, and validator, which simplifies things on my end a lot :)

I will need to think more about approaching this issue, but most probably I will have quite limited solution with a brute-force approach and some configuration options to fine-tune the process.

I can speak for myself at least - this would be good enough approach for me, because then I would just rely on the Library to deliver a password, without taking care of these extra checks and complexities. And as Password Generation (at least in my case) is not a streamlined process, but manual on-demand - delays implied by this additional complexity should be more than acceptable.

Thank you very much for your product sir, and I wish you best of luck!

curious-odd-man commented 3 years ago

That is very strange that you say it provides same rate of errors. Please check it once again. Because for me it can generate 1000 values without a single one failing in a row.

I'm not sure how do you check pattern in Scala, but in Java there are 2 methods:

  1. matches- for patterns without lookaround
  2. find - for patterns with lookaround. In other words matches does not work correctly for pattern with lookahead, as you have.

For this code:

        String newPattern = "(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z])([A-Z]|[a-z]|[0-9]|[!@#$&*]){8,25}";

        Pattern compile = Pattern.compile(newPattern);
        RgxGen rgxGen = new RgxGen(newPattern);
        RgxGenProperties props = new RgxGenProperties();
        props.setProperty("generation.infinite.repeat", "0");
        rgxGen.setProperties(props);
        String text;
        for (int i = 0; i < 1000; i++) {
            text = rgxGen.generate();
            System.out.println(compile.matcher(text).find() + "\t" + text);
        }

I get output like:

true W*6qI62wg3OICn4 true V&4u#UHVtr#5MfrjcxftJ5Tmf&#T true B#1i#Oy@l*$s@Hn9T153 true X$2yppUDj0n2#0M85 true J!3oIW10!P51!$41$WG47K3 true V*5p*k@5H6*rNC!zo true C#3iH$06I@2UFX9 true B#8v2y69fM&NgZEu true E$4fc881jRSM69375lLMZ true N*4m&hn$hW7nR#W@6f!9LY3 true F&7cc2k!$95I$@2Z*WsvXV9MB true N@3y$sAfZqjv$*UX true A&3lot7m&*$# true X@5mBiK9$lfy2 true V!1i83Yz**9@B&$RlH@eY*ZJqk@3@ true Y$5u92@1A4#6k7@9*92#X*@# true A*2xTZ4El&P2e@$CA&z true E#4gP*e5k7lG!v$4w85M true S!2du&6#n$#FFj&f true E#9mdPzz9#@Q@9&91 true K!4i@EJ@#8YsDd true K#3m$Ky*&ak7bn* true W#1t&#N7mx$o@!bxMYuqPXa true Z!5hjFDao1#v4RD!L6FH6iKT true V&2p@#ksE5&4!c& true V@2b!8R@W80*texS90n true M&0sUk&9$S!!lD@2O3N10$8dL0 true F$9k!88Q5@@$#$qG$UBnI8V*w82e@ true O@9bX!762vBc@*iFxX!5683Tu#U#8 true X@7pN*T942Ki26Ygf!Hd! true W$6xtLtO4@v! true N&7e$95pqF56 true M!5mHAgv&L51SDP76N!34iz true I$9dK5hG179jykbQP@3a true H&7a#!Cr$3S3j545V@&lm3N!3 true B$3jI56e6RT$j@t!f true A&3m3$LaN9#XY*1!v6*3!A1m7@k true S&2ol66@6WW0i$$3wIZ$D#1d@0&N true D#5chI##&dRKcD*cB true O!4jQk@4pr@Z#@&5AQ$nJL true E#6k8t#xD@35!x true P*0cI*aT9#yVRPa4fJik!$WO true W$4bqU5n6C1SQ$m5*xw6&7Qb#3no5 true D*3q8eVJ&a#!l!KU67144I#S#k8* true N#3y8K3GIdP7c7Gcht$VR@eR true N&2qKU#5!4*K24$#xo90 true X@9l$871U2!A true L!2qgreY#Bm0!4Lh*!80#5ct4bkVO true L#6e5D@B&&m&!lz6 true S@4m#58&3&$$J5zl&#Twp1 true V#0b1iA$qQX4p$#@3919zh4 true D@1pon2##z@4S0D&rcTf$ true P@7aX*4hkRgxcD&f true W&0q&&637ARJq@Y!P**r$gBcS true D!4eDgG@C*hZch&G0#* true T!3s!4E0c58&51d$h**fP7*P9 true O$7g0l*$&0D*!*6* true R$7uDmwP9UZVPYW6eRK8o7 true V*4hATM5$K#!uKQ#Rt1x9@d7 true U!2u80Ul&P*# true Q#4sO53xe@!Ye& true W$4l3a1UU7e37#F9cDIW7T**5041 true N#5ib!J$!gHu1VUNUOEWrX true P&2lwa$S$vk0iTnrH&a true X$3pM#lo5@6@z$@j true E@5dfAWJsmm62xv true H&4k1*Q@4x@&5Q8zJlqY7&H* true D!7r0!24e19A2PS&18r true O$2t6Sq&63JD0 true Q$6a@!CcsTAAY true H!6oo5O6DqH#G true K#7v&c4t74l#&@k5z6*p*1&3gJ true F!6hyguQ#JeVx5&Fr true G!5h6vH3*aM3*4I14rd*eo9E#A true T&5kDv#1#YWL20i5267j! true E&3s*HdR7C3!$085$lJ7 true Z$7u!#A7844$ko!V7WI4qic*!UU true L#0ls7q4$m4&l@6@a*@w true V&8dBn1ty9T0JW61S#c true E*6od73n6@@5g# true V$5lJ&e$vy5Y*4#2n#q6$1*07lf true I!7hiyz5@$aX#6rt*!3w$0Sne1D true B$2vnCs$*Q$#@r*9i true J#1g4UO&qz73#OL2H! true L&4gg2x$!$&Jxn!A38# true Q*5b*a@H!c2713i0SzOi$G4@993 true L$9e&W01D&E8*8!Zl*QGjd$6@5z6J true G*6vU8MOfa!Dno5@1LucFt& true J$9ziDkEjJ72ioLDrkY&lD true L#9z71QU#2tCv0*v true W$4u*wc6t6@l9x6r@$1&$n true F$5m*yvf#7@7q74vA*JT true H#6a*Ef#0W*Z@7nVv&7*Z8!U2H3 true S&1o#bV13!I@7qf@3! true M$4qt#w2P#YS2* true B&0kSDHr@@09d# true T$8sf3Bra8bp*8V0EJF0*#5Lc true D!2oYy#$setrYy@38f true E#0x8s@Q9!*#a#5H@8fW0#Tk$Kp true H#0l50R&*YYf# true L#2a1Q&FVt5&&RDTs4m2X32r true T$4xc#JOZ#E&!@&N7wHc@ true R&5u6j*modMq1#KX21#&# true Q&8lD1Te!8402&@@oc true R$3b5x&@1GNFA&*Rr true V&3z832&*a&V6 true F@2bzBVS!C&48mc46cn&07DSGs2h true Z$9mXLx@c3$qy*i&@#BYi5#4G1 true X*3z8j2D45!@G true Y@5j!xig46M8CqXUfq0@BZ true P*0dR&&c#JI9*#d@vIV13#J4z8$pd true P@2z!6l#bta&v true H&9iv*p4e!r4j5y#&qSJYCaT83 true F*4dFa$IFY&5QI$041to&n2* true Z&5lMpc&T*zY2VE8q&eV8 true Q#8dC*cVd!xg$wnqVl$ZD08H true L!8l&P##7#P2y!d true B$4u*a2e&JW!v!!IIo*X6@&eD true J*7m$r0!yj!qholu651R true J#1vO#@1*@VdaO!0ij! true T@8u2$8I*L*9s02 true O@9jq*we!XE@2ka6 true P&0f@364VirTxKJJP true F@6b25xf*9umb06a58r88xu5*Z5P@ true N*9j!@ZS4f*9AE true Y&5fsj!8$80ZY7Vk@Ao7*z!@9zOY1 true Z$9l1lddxvtBnmm#A&q7*1 true U#2f$$js@UO85E6q true K&9oH&5aY9&ch8 true T!4gFtf7&3337*&E true B&4nZWCn00WF!Aoqs#v*An true X!4skX@@*sncH9N true E!0l$s6A*&lMLY@rzNZTe* true I!9j1Bt5!O5D7@AA&4*r@@Q95Qm& true P!3gX1q#B742L true E@4x$Uzentm& true K$2qyE2x9!#tp46! true Y$4e*I6exV1N&2&j true O&6b!H662Lx&3 true A!7s!#Hcr&Aq3z3G9 true T@0i$9!#ktbs80*0Xj&5 true Q@9ptNu&J93&q@WbP14*5E true L*5ko8@#M*C&h*!MA$@D202Q*9 true K$3wnce8*1ZZ true P$2bleu!g83$0*8!@r86&2XAp$ true H#5nNP03e@*3@ true S!6b!c9wng&Ib$Frd!Dj true Z$4x9KNg&7jO$932#$$pY true Q$1yBfqdyT!Exn$K$!#Z$!4!Nr$l true M!7k@c#774OfO0gNNoL$xn6TpFeQ0 true C#5hb&L!o@A0l0V$4#H!$@4!! true P*4tw4##v6!sZm9R06 true H@2j19nFvk&fnxPL4s499 true M#3h#5m5#vn@0#!5einJ true W*6hM70729049lq839f! true H#3xY&ZI@HDBN6nE!s$m true F!8vDD$@!K71&y4*4&A5$ true S&4s@*#&!jyFT38&*kPB12xs true P!6y$@oB5&ba3&VU79 true K@2wa@@9g8x#7OHi722!2s true O#7eGF@52cNU6B$37 true F$6a0I@k!8#QHY3Uuu8vi true S&3w#n1Te@c@85x*mmXY true D&2des90j83f5rfG!BJl9 true Z*4cA7v6S!6q$S*Tq6!q#Vl6$6 true Q@3g!n94$D@iRa13eH true T!0r84qng8aW8!@6#2@z5 true N!1eY&&32t7&yNj30$3H8LyIA6@ true E*4d6Z8rCnefh$UP6IuRr1XOBNkQc true Q&0zXYl816OSWB@@9rR@#N75x true O*7pi#4!D9*&!TgkH@$2l true M#8o93Wx$!T2AE@@$kvm true G@4gKL@X4f8a9auVRk!7x&8cZ&# true Q!8k36BMoW84 true I#2m3vx$NhS&9$ true U!7na$*9022!oN true J&4x*Y*o&cB9sx#eO true N*5l&zV!c&zDDv true M!6ik$WA@2fp4*4@tU&54#L!9@ true K$2j59&4k0@@&XS43@j31 true Y!5nLN2v3#mgO93!09a8A$ true I#5dMc2!OtbP45EJz#2H**y#lxPV2 true A#0g61JD*Q4LE3L0 true I!8a39@3*$1zONDgv true F@9kw3jRI07*WR$285 true C@0odU3@Ppgn#nT8*&E#nP&$y true T#2c6K&i!&4C! true K*3ePYrr&d$NGN#$*2doEg*P**A true Y&3n#Ko9h8484FCD1!WENF0 true B!8w9d3$@f@#8O!P#@3m$@5H true N@7iu5@GPtJ!W@I6 true B$0f$5@4!JR3!S1 true Z#3i64vap!N9&oV#zJ5AGc1g*T2 true H#6q&u*n!*!br2 true P*6fIC3&!@&F7uT**0!r!d73Lp$0 true V@0u0*R6*z#s*$hN@V&@n true S@8pMXe2h#dd1 true Z$2b5@J@LZUU&r*l35Zq#1 true Z$0p1Z990N4j*w true Z#1fed89OY714#$$G!Z2qvP true B*4jy$#Y9&jJ1YP3$3a*r!$*Y*5 true J*5n9**#8fGwk&7!82T0LFHP661$ true C*8m*5CGPm8y*jX@J19&#DbZz true B@1u!4B@M28XE9*$M4Y2EvR true C*3m2405$6&&TFwFz#8*5$&&0@h true E$1urT#F6f3e&6KPBTg10d2yY22yi true R#4bm@$b7b#grn9@*Z true T#8tM#r*4*A6WG0LKoj true T!0k77#JZ0$9#X4TUGu*z#B true N@9fUEn*!&AkuV!@!#W04@7 true J$5rmi3782t&F0tB2$z!Om@$us& true T*0s@d*0@DMrS4h07&5b!$ true A&9i&8E!z&pp#C!p$vIP*9!72X97I true Y&8po48!s0#4D5 true L!6fVx$aelT#H&1FmC7R*NclY3A# true B#4vlaIb$&bXq64B$1*>D5tf true N*5haH9*l#G2!Z true C#2gfA!*4rU*kB5#5FFmMg0@ true F$3n0#g!ytuH6gw493 true U*8t$b1!792C86*9&@U!0d true G*6dPV4q$@XVYG&np70NM5N6T2G* true P*3t82DY#tph7Rqw9SeZF*742I true X#7e583#o#6o*JS5C118L2J60n6* true M*8n&3&09iXG@QVGQHq0dG79b true K*3q$rg#B2PSG true K$2rA!iYZ!X*e@@7h*#4*bfg$# true D&5d130G&&Lbp9mj!wcBmw2Qz true G*3pfdEk@Rti true X@8lZz8lY5My4K#qdc6 true H#9m&Yay#uoAnV@4NAv277Q true J$8bP*#k3I!fTi3y#7$ofZ#V true A#3d0wfKrb#I8!F4hy1#D#9 true U*3dlvtB57ci!!A2i8DE@0 true R*8sj3Ya@hCN@33TT&pZomG2 true I*0l1I**X84& true I$2sO1b4!8#4#48OG true Y*2gwD#&62gedWfOKwNV6lt96$P4l true N@7vY6U&!C@F5rh!mJNJ$a#K5 true L$4k@C@2!a&4LMf0Vf@&!wh& true U@0zGQU4!&@sE*Jx$17O&!TsY$8jb true C*8t3$qYqVXw*JC$avj@ true W*0rpm36@3$k*W50Ekmeu3@cn4QI true W@6vU!pdAr33@pW@QMP$$& true N&0u0D8@*M279*B#v true W@0iLNDn3@c1$GH# true W#8cNlp8993V$ true L&9jUMO&45g1fh*a true F$3a1&3Z1y@!qI4oG*w797Ga!Z& true I#6p*@*$I1L&3l!48$*T# true S!4nC&5U!QZqyCr41Q85txU$78$!n true K$6uX1!&!1#*d9u#EW#a#&fG!7h true U@2tK2rSrLTK4uO615ov!*$Xo! true H@4rB!BW9!**e1#1 true G@1f#92#@Q$QGA0b1 true I&4n8qCm6rjrmtA2$5!vR true Q&9aUS8$#jjK59o true W$8e4&zyv$3qmG3&TVw*@#$8& true S#1i@K!OZ08yW0A true V&1oQT$or!rb@2# true R&0sH5E5#a0j*vH*M!Z!S true K&9hu9#O*p$#j09*!Q!&2E3E3 true F$2zv8@&89S#ups&@!HTu#0#k9 true L&3k2T@dUU10*k*O true F@6rz88p2okP5st4fW true Y!7x5PX0!#6rCu true D$7ai4@dCk535$ true R$9iXD&tZ2CzX$9 true E$3p3Al1644n34*5Cjvx@c9u true W@8r#vBrL#I*v3ej* true O!8m#*!cz8#$6r6qH7Ol8F4P!DNC true T!4jf5F1Tl!riB20!*n&! true P!7lqFYvL8t@1Y$J true X#4vM94*@1Z6Zwr&F2E@4E2GqboQ8 true E#1hI8$@XPOzC* true K*0a6EoMn#K#uG&@Kf1 true D&3v$NkJn78zBx#y3$53!B6B true M!8b5uM*7X9$@tN6bJrq56mDv85 true S$3cp8*8jkV*ov true O&0h$GSE78fk8H$$&p@5cvC&i* true T&5ux&y*8!i*@#T$20dMP56LBk5Z true L!6rbB7$IY006d true Y&7y$8!E!tU!67QXI true A*6x&&!R*yC$TPl*t#94R7!oq true R@5n$6*&7P$9&2mED true L&7nr7F*G5!w true S*9k80AC5!gYZX61S!!msu*q true T&5s7&39jgapW8@d true H#3t90w!6@*COWRezN601 true Q@1o*$JJw5e#&riw9oQ&l$Tx$!X@$ true M!7ut5!j9&sL$@n$Q*A&Z true S*5eSH&$!D*0zp!1Mm true L*7zB8@t21@p0A0R!A true C*8k891V2jch true K@3uk3jQ2jIOJ3t0&0E&TLgcqG true E$4moA#@OzLp*40y&x3H!D true S$9jZAoj4$46mE@3p865 true Z$6ufHR*#7B6B65&pZ&$uu$6$9*P true E@7p!Xw5&$Kt$#4#&a7# true M$6qMk!11$oB8!0G true V&9j1h!aOQVl!8&$GXc506 true M#9s1J24HzK@3@@@@91a$e&H$&3*W true C$6j#X7F*9yHvgo&zw true U!6mwpj$G66r true N!5v0K@f@9r4z&weVPq#nD$##*&iW true M*7n0*2g*k@U8g4C1QJ1ZtaEu true Z&3a69321WQ*QtxEd$ true R$7paPqkQ##5L@#&3Fkj true K$0ot8xu9&48JfQZ!1WO true U*6tP!69s5h*0s@U!7 true C@3liZ349*n#1Z6#$sTkAcc5 true M*7d@sc*0p$2N29*9bYzZY2$9PX true Q!3m#&&V2$EIuk true H*7vj09#W4N0G true D&8qst77Nvt@ true F*8f*l!j&2@$!I85WbwiN86ILkJ true J*3v#@62IQ2uze$Zhb9q true T!1sm2vn5*pr#tf*fBCj*8#r*5L# true Q&0iek5!EH4!#e6@0 true Y&8chbQfl0S*$pe15wkb true T!5tf6tCd$oX#mX@3u6$@@$ true N*4q624b&*Nu#6nTpaunW true E$8l##K2F$h0783I#dP4 true W$8gw7A8ryu1zS41Nz@&V42! true E$0emFx3&sJT@jJ94Z# true W!3a0Aio7A$*P true K!7f93!f2v7DY*!# true T*8c5&$C7#!*N&d&b282y9*pfy true D@2z$b*n71WjLzSt true M@2coZ#&#R5BOUn3 true U@2zDrkKEaxNwC*4l1#Z7g true M!1z05&2oLU8*yM6#9QOHgCbI6@Ix true O&9qk*dG&O#o0ZR$$Z true B*5k05OO*6B#0v true L&4e$6!&n!0w28IfiLs0!#K true Y@1o5J2iH8X0f8K9Fc& true S!0q@#3�@9U&rN@@24QKxG true G!2x#WE@xG5h21h*K!G&XwfYqc$Eg true H#4t&Fji$!aTD5mr@$n#H4S6U true A*8l!Dr!*&gK@t8cY3* true U&6otd!7!01M*T true M$5a39$REiSsA0 true Y#2m#o8j&IJ@Y&&&U!K@ true A*3qC&H9$e*V&&GVo*O1oD4#7GV true R&9q$&L7Z9f824s true W*8z7J0e69mY&yG4$Rg&@ true L*0tTqO8rB$1BV!Z3xK&Xl69 true F!5sUV#n#cZc#&$0n true U#4sj*$8i3!5 true B@8xGLg@@fFB true R#6f74&g95Keww89@9g*w5!7pGT true I&9u8kBM8&j*WCc7 true V$7v&!$qk*2#w true C*5me7QYm#Z6sG1 true A&1hs*72856jJ5q*c4m3y true N&6j8ke*IE49j*7#C# true T#6t#$OmqONu#x true M@5rpwC!u!1371#$w5#G true Q$6i$0FM5sr40z2$808psgj4pgdM true L#3pGU8&Hf2iH3 true O$6e6si55tVh#k66o4i@*1Mp@E6@ true J@8e!YJ*T&GX2o8ZjqwIT52 true V@2n$2$3#&$Cewc#1537a81U*SNTE true B$3mAx6R0@#IB98Z$2 true S*6e6$4!u$R4v2@fTsZ!@ true R$4i6AqxHh904 true M@0vifMIK4p1&77rG true Q$3dsb8!QaE& true H&4f8vdxJGrqKC*H&$b5Aet true Q@9rpZUR9!ALV2$r@*!wyy40#A84& true G#9uIU!3a$E#&3m1q1I true G#3s7!#33qK02oND*!0 true M#0ll!WJqQ5&C860#*G3Na56L1*9 true W&7ofl!#z&e4yH1RXW6FpVZ# true L$0fDt@TN@24916 true M!7j3!6WM0xj!9*20$m!1@&XfQZhB true I@5y9GR97e!J9AV5o@aC* true K@8zk&2Bz@Ax3l7CD&a true K&4vs4&#rWK$y@0&5m!AD8pf2q true X*0uvk9!U&BL0V&*#4#ap7vk true Y*5pu@HDO2c81L0H72a true U$2zj$36ZY7* true B!4z@3niD9$rV@6X5j true Y$0i*0Jx@z3S2d@huW8B7&&WK1@ true J&1dMNmiun9M&w1 true U!9n7X@@d*#a true G*6aO1#4Zw*F8@oY@1KUs3vI true O&6xAr&&!j2Pa5*@5G9@335NGm4 true U$3lb3NnJO5bxY6AsEB@Po6!$ true L&2m*8ZFwhXRMF&@B true R&3b&l*KBl4UY5U&*p$*$8W4!0i true R$9x@3@cHt@5fN&*&*p true Q*0o&z0*@9Di!K!9r!**d@d* true V$8lT$02ex5mTCs@C&uG581yo$ true C*1joa!4kXV*4 true P&6s72hyXP$#Iv!$c true W#3e1C$Xi#xP8N2 true O@5vQM&603t$!3&jI$4$gt3e!Db true C#1v$s@39q0j$CwVL true P*0oE#c$F*l$HJo true F$2qF@&ChN3$$HQ969675Alzz6j& true F@4tjVxQ5$*go7442@*#gMk#0Hc true G*7wkU9i6z!D2u&W#4JG0P0LcM*G# true B!9c*#x!&Ka#M$f6*1&4GE7R0$* true T$1b2Hu6Y@$K1 true O@8zry!Y0!@$lX63p40&U*JKbxuhE true J$1z7g5yl80D*$VN true S&4jb@G3327Qrj4O2222D$FMv9F true M*8emIT0ik7&r*7@O3A8 true M#5k9DM7*C*$cik$if!YPq&b82! true N@1qP#84iW@@@5!15xx3rX!ky4 true X&2yes*Crz@k$lrN true Q$5sU&M&qvb$&txRi0RD7AZ true R!3n78#6WnK$&2*3Xbi2n*95&5 true T&4nk3J17J3$5886D4u#Dq$xN true J&4m8&C5L64rx8y$$7#1&*!7j3 true W$0j!smO&F*ise$yuF*8sQ6G1 true P#2bNF#$rfmUr##qYO true D$5zb#fK4$xluE!x8 true E@6h#ivQcExhf$UO* true G*2oC9@DtCV40Au7&WR@F30a true U&8zD*662!12K##&#y0*&7W true X*7r81&8#3g$5C7#id true S$9q6YWFV4$#v@3v#Yt$B9c true L@2z9Z5X@LI2#Rhp4TV604!S*& true O$8byzoK2y8**6$HM2003h#N*7CY true W@2rusf4@nlMP6Q8AJO2*n true W&6pAe5$aMUE7 true O!3x5h22YX1uRD3WFId1t&#H!#M true K!8is2Ct3##@ true V$3lTqnq!4*hs true R@2pK4!7lSOmvRc! true M#5p!$M4A!$a* true E@0j*6ih$!roGj6Q3@9$#Md!CV true P#8k@@iG$T9mf2L!b#9 true K@4r2#UIF0j!i!vC7 true L$8x7fu42392dE@Xr*UrQtB true U*8l1cmtr!P&5J$yKq282$ true P!3c$yRIx8W8e$ true R*9mK$B4!wFLp*1L$*7q$9o true D&9kYN2*wN&xZi1b#C*m&8e&374V true I&8l&w&&LNr2#Gwrd&7fo7 true D*0yu#P1RU$$SaQ16 true W@3chv3938q6Kog&&95&&$Lk7 true Q*9o&t**#4qo5$ true H*5ou49x6k$@K$ true N@1eau9v254S&rCQb233Tg true O!8w4341yTr@aKABV&*U389& true U!1w5DvrI@Yz$*!E9ZIjX$ true P#9e6G@KZ!5I!Lg!agRT1#Xf!PR true D*8o41#TxgI#ZKj true W$1p#9n44*QHAQ9Qn true E#2c*C1!aLd@vp5 true F$5itaJttw9weExK1w*B!4K0o12K@ true T*8bkLQ22AvwC3*OsSKhPc3&z@ true B#7lGLq$71#XQ3$9 true A&4sL*!h6*G&2@71sx*wjv@ true K!2mO@$@gw3Ba1ul!@*#0H@oi true P&1imFiHyvT@3&eq$$@I!*M true R#4i&wSbImb#5CvuFjr08 true K@7wFBx$z2H&@$5gA2@hKp&iA true T#1weJNE!r!H true C$9eS#AGw7F!0242#!yy@*@APN true Z!9yV&$#k5HAt6 true J@1mR&TsHX9ci@FmBYr$*s3&2K true W$6p&Ys2!$mWv@p2Y true P*6xP*!mvjN24P9#d&*93vEO*26L true C@8nf$#!#&l@ql!o5EK&B! true J*9w8*P&$8vbt8@!Z#L true Z#5z4&Y4WG&$A!* true G@2wiv$D$dfC8p8EOp true N&1kg#a7f*D6 true T@5deLX6@JHYQ5xjX true B&0jcausz8NbK&jXiC@38f3cp true Y#7yf43n7Bfl true D!2ahAI0r77TUSAUN@4C true U*1v7&R9*m$p@4*@12*L@ true H$3j2o88va#7#7&6qw@tfltChB! true Q@7l&3g10#Vs true Z!2m$IdfL#iZ!2 true K*1iLdmv549@JU$z9dvcYz682L0Y9 true P&3kj$$!@*12 true G*0tyavu##HDn@LQitn$UNkaE#7 true E@3hH6DGiX5AoKxQ8$haYMZ1 true I@7j739&KLC3d#V9dT5X2 true P&8qN11wH2q1na#ES3a* true W@7iAsM#I5Wi true V*6yCSd#!SHz$$6#Xq71F7 true C*7fXAw9O!$5x0D2Eq9W9!*q!$n true N!9v91v*o*89&*!Q$fIn&u$zwT!75 true P!6o!*9@3E4*Uqc!$NT&2!#I true X&4g!3K9InhP#*xYud2##md true M!3k6fO@43!Qd3#0@LUo511ok63 true C!8bYRTylm#Mk true A#6c*8eE&iPR true H!0tMTB3ZWjjf14Z$$!1*8tkX true V*6q#IxkiVK7c!V true P&0rXnZ&XB2# true M#8c8BiM9q6QZgS94z5Y true A#2e$02!@!g2oP#1&Nu true G!0m5T4g*pB4@DF8 true M*9wIs0&b!$T0iI46#C true X@6n$jnFJbM&9#A&kRq@r0t7 true X@0g&!5@0s@v true X&6z70I$HjPqQA1u#j5k96 true T#7oe0H$!S&cRUeaG!N0 true Z!7m8@$04BnSu$Vh3d61itEU true T$7z*4@7@@K$99*03@ZO true O!9tAP5l!qo@ReI## true B@3z8CM!#1EG*G37h!0 true I!6iFLK!R19!Q3&53$667Ds0x3 true R&8xhyhT*r7s&n!yC1823 true S@4dYn&6M9HL!ss true E*4t&#z&oVG#nn12L!H$3 true C#0t@2Nlz*Kb@Q@898lE7**Y$bCN true S@0ueJ#$Q@khsm3 true X#4y$&0#M#rfyv*6@2*#3K#N true S&7mC033l#an true X@7vr!9BY5o8X#E0V true P#5aERKe3dAv4qY!3R0VY@j2b#* true G!0b2D!HB4F*wso@Yp5 true D$4fzb21##O@AbuVLZxG*Xe8 true U#3y2MQrT1H63rYIw* true S#1g*8!!R!QAt@pE! true U*6uQcp6C$Kd#@a7L4NsL#!7c* true L!1e5&d#@!*0lE*bwv true I@7hbl0$$m8y4@YsNKT06k5f!BQ8s true M*4n74$rNmn7#10!E4$8GQC@K* true P@0ehmLXO$n87& true K&4g#$D$5#mLP$&vW&49oeT79jp*s true M!7n#!Og0A2S0SU true Z#4by!*67!3# true A*9k$#!!W3FKl#&3u6*CqKN&ECQ4 true Y!1v3$K1eKkJE!mWm1 true O&3r*O29xWZIGS true X!9mrQZBX#v38g3HcK$tB61*FF1XD true I@3y$PI8yP96!cl&vc@@4*p#1 true Z&9bv#X5000$C8$LUJO true J$9ie2@75@6!0g&*@ true P@3kP2I*eYq!0$ true F@8ewkxG9X!2$1y5$3iES4$z true G!9hn*@TA##vWSi*22976 true E*8wF@I8U0k7c*!V3ixOB02& true D&1escU4Hl7$XIzxxr*yWS*@VoU* true K&8dhiv3H@P!k*4 true L$9t9*wom&*H1812@ true L*6o1IL91!@@ true E!7m1RWz@J*&1LnJ9 true X*7wsg5wdp88cq1LQz4da8 true P$5b@5S*7p39me true Q#0p4v2nRwJ5BmN*2u true D@4l&f&@E*p@EJ&9Rf6&j0!*9&!b3 true N&5cA8j#duZ6&tT9sw1D$ true H!9soqu0grWrmp$4$Ftnm$*b true Z&0ys7L&#p&!#Y9 true G*7n5Z#vM91iO true Y#0jg2Qdq@$s@1mVJa#R true D$8dxbN#$bof$21Pq124 true Q$4o64wg8I$CkR48D* true T#0w2v@r3L1d@vLE@#nm0lse true O&8tg4oj93p6!z true A#1p5@Je#@@*F1#h7Ag25Em4 true U#8c&9!Zu944N*Mq4JA1!9@$K true O$2w#o5FEu9KdLD0dH true D$3s$IAdc!&R&A true J!3dmJ4!@6fn5fZ true R$4jnVw9@peI true H$4p6WMX2cVi1Qp@!556vqe*jS0 true Z@9suB@ZT8UB5#3WR*& true J$5u30Mqfz1tHkT781$8h8Qp#87* true L!8hu!CLkd907&m@6@mnr true R$1jJ4*I1!y&&5*#9JYP&m&k@S true E$7h5xu@M2Aq true A$6q*ls$6fg4801!q0@5 true W@5u334#zz3kkD!G8!89 true C#2t!73&h7I#! true X$9vg@Z67pOm#&wiN*931z6 true F#3cN@7ju6j*$# true V!6y@4f3&0L&y1&z91R50T#5G6@O true Y$6a693R1n8yb1&dyp@AY7&*8 true S$2j@tL1Wt7OiJ$pyCG0o#9&*slo2 true G@2qOH!Qpu!WjQS true K@7l3r@D6j#S*3 true S*7r9@1*X@9&89*Fl6L*Q!x true Z@7c7SM*k!!7c*ETh13$ true E!9nQv#526EeF33y true S#4f11RPPG@4C1 true W&9u#&6S22qf$er#2Z@ true S*3rBR0T*2Ij*C6IR#s*A*#9R true C#3t3i*GOwBf!J!fL#m@W77#CCh true L&8sL*90#haz@dm2SX$!w*HQ true R&9zH&BDn@2&q*bqftBq&8*v5#xZ true T$9tJ9!PCxG4SB true M$0br7J&q$3gewdsUoI5j true P!6hyM5D31NaC&934E8@w3QY7j742 true I#2jDeqGy!5s1K!Z@*N$$*n3 true B!5vLxC2pic&k true B!1wz0fQwmeN true D!7pz!#62wQm*R!@XxNyn!d*&B$a true W#4vUWP1CX$ykk*ZjI true B$9cJ7#L#07ii46#P6DaFCyd&17 true M#3pJJ#C5l2*86JlA2Z true J@5d@5qoI@&j85Q66# true J#3tO6AR$@Wh*D!Q@Y3$4nY true Z$8d6P88@Z@e true O$4j$BxgjO7Gg$w1A9R!X true B@1cD!7Uv4y#w$t@LNwL5nR true W*3xd#Ttv!@1Ts@S9G&5V true C#4f7@v0$UCFM5r&11F1@TddYY4 true Y!3ix570@BcRj true N$1g4sz&j0t!C6W0 true R&3q0i*Ogy6438tx6Q!!&f25X9y6 true E@3vwYkHELbg$54 true S#8oesEBqK6$!6n2zd$# true Z@9w2vZg6LXNY0Zbt$lH20 true N@1zoS543l*G@*#*&!&v#0mTu@E true S@3nz9#b1P5* true T*3i1q*Cu$@773S*t*2#NW5*7 true O&4tebv#8#w** true U!9e@70Ex$94j$O true I*7ekp0S0B21$B#ap7A&r!ubJk true U@2o5GN2&hC*PDr true S#7z@4*5jVm49 true I&0h&j&ps!Iptm#Q5234 true F!0zVv@fq9b3T true M!9bw!&@$0Mc211 true J*8toR#w$YRg$l2 true U*3krHAUBa61 true G@6bY&0*71!1tu68317U*l# true L*8p25jx&HR!9*3MT5kG true A*5w$@d$f$9gwy54Q!SQL6 true T@2hrub87tWE6LacM!84 true M#7ve8b&w&6Q** true M$8lq*VP@45W0*Tc0j!3D true O*7gkD827bbDK&Re0$fNFcPR* true D@7q!$Or*V75R true N@9s2tL$&f$X!wl5pJT@5D2MD7 true Z*2eBnl&cbo9YDutY933$*9#Ki true C$8me98!Cm86W5 true H#1n&6h#1LoUj&*c@GMPf2Zy8@ true B#1a!y*#r9iS6pd12Q*bv*jV true G#2w&L2i!Sd@!Hn true W&5q7&*WYDxAzvV@&04&@r@*S true G&7ma!!Sy!w4##se*u#qK8$zU5*B true W!9kRl*6CiNkF true K@5i7#6g87s!$#9@ true U@2uUHZq03#*AQ8y3d true K!1zy9$M!SK$!#9!*9dlF!$5Shs0 true N&9x5ex7#H69q$0leR true J@3rnFsulq!8&d true E&3x$@Jx03Vf&a#p9L!T true Q$4z9zg&@nf8x57!8W true K$2w4!Py6B*X!Bw10c17Nc$1M$ahn true P#7lc!e*&b@OA39 true Y#3ypmZZ$VZs*eiH12EpL5$V true L&1b32uF9I*Thhj&Xv@ true U@1j7PRwj&O$A51 true J*1hs86@c&d4#*2h46T2@fL true B@8n!373!hFT@pp#rgwR817rY true L!9rw0RUqj$3$tJi#@pWq#!@J3Y true Q$4iBxZ@&iIQ#$G0V true S#1bg7YT!*bA!@PEm#2 true G&1ym206J!&9 true I*0r@&8pT4hj*Q7!TY4P#7 true W!9cq&oU!@29$5Py&1Kx&4ER5s!g true A*1bQnXY*2*99*o7BPIB9JOZSJBXm true C&4znA!f0aL8!4tDp true B@9nY#@399$5v2SKDlVic true B$9ki4Q*!#VB!noq1Qdo&!@ true B&7yS@dG$DLA$B*B**33!*@ true V#1f#Xk9*&$uDBPnE## true X!9g1N3A69E#b4UlXR$m*dk!E true H@5j25@6E7oHG8daW6rk2&i9 true C*5w!u&4jNgY$&*$ true H#9pIDq4!0$3$4fJNB3HkY7h2@2i2 true R&8n#dIx7ztE4mV true B$9cg4&W0MTB04!j7#ma3H7 true W$3v*O$WA3d@!32*c$ true J$9r&2*37*z*W7oN*S**u$J5L5P#p true B!0i2$d0x3u6YO!Z&W$!W true L$0sF@9d3!MrM9b@6EE*zjH3b@&*6 true T!4kfi6$fS3*i66$e#ltX4 true F&2f0qtj&n2jw true Y@3oF8Jb9m3I true I*4u#5@@07G1$05VT@FSb6U!N@c0 true F!0t!9f!$DI#k2T$ad0x&w&2 true X!8t*Nb#94z7i# true V@2eFbt@b9mO&*0MW!17!#$F true T!8h$@2oa#!jw59K&P true K$5o!o!@&xwtx*96Y@EXL& true U&0iLM*jy97#YN#08ePPI1L5 true V!0px1$$D8i7MzPB#@ true A*8dXc#337&K1 true X*7g&l23fI7z8Ggv#84A true B&5eU1&D6@h6PWe5*o!r@ true H$3v#d3tkg$Z8vT!15hx#qC9 true N!4ovm446m225234LjWY!RQ9@79 true B&8uT4$1V7b00&*DvWBs1A#!SIE! true L$8e@E&ru10y!oN7mHqt@$@ true V!0m$lj70fWuIRT#7c@ob!4 true L#1vbf@65&N@RjC5$7@MZLJ true J!1b@M@j73$gcRA96E4$016sn$@ true S$9x#kTO!dL*3Il3*a**&1 true F*7m6R0Ju8&9@N&@wp0wGYv5QFf3C true O&2w@b$6q#&!8TL*3IY8e150 true R$1n1G$8vD$2cB49$@r true H*0jtb*0CvsXqvi$cM true J&5i5ZYl1&&@L#Lv!@GxgoifVG true X@0rrs*7!&k&D@Lf9*t$#0 true A*6ghw7pwa2j&94M true G$4x*a6e4c8TGO843AU5&05cJZ true N!9tA$zHY&!q! true S$2n&&o&tb*4*5$Wq8pZETDRyP! true R&9d@7$7*43@u$! true S#6lo3@!ioMUQso0 true W!4uf1cV*IL0T#@Hy8W1!#Y0 true B&4ce*RPp*l$a#!@B1wW9V@6 true U$4n02Tjb!Tme2m5$Bn$f@@a5As true W@2eh95B2Aq3@4! true H!6y85W#p0&4zC70F2$&dGF3#2w$ true F@8hRlG!##*&! true D*5b9*6b4Jik& true D&8oO5DM8BKf*L*XR0*2 true N*8b4mlv31mpXQI&0 true S&9s3@8g#H5s!G* true E@4j*#2h@hli&H#p9@OvSq true D$6fdA0A6U1fo true S$5o2hnPm#4VPZ&tf2AS4!8315 true N$3m41a$@L0@@L8 true Y&0u1@$Pu$o$N!!7@9f1*k#B true A@9fMhhm59vV$oRZ9Wc3OO3y0eU true F*5eL*Q806YRs#F##&#zg& true O&9b185fn@WnBjz08D3845d true U&8i6&$9t!0c6Ut845 true R@7g#@*p2VpQ*@@8! true N*7u20C9p4*8Y true N@4owu$6ef9T7TpG&*J3F true P$0h#PYz$C9&Vab!74AJt$9NM6G# true F&1e#j4rr&N!*iDEa4Rr690$dub true F*1ue778bCCOHks&91iIZSxW#*RHX true A#4aR38!#tGVRS true H#5o*jC4v9x7E7FA0k&u true H&6p&E#N56Cf&BC**!9fn66V!Y true X@1gTgc#!Sli5*30eWY2K30#M true F$3lYb13RDE1Hs true S#8e0!RQKrFckT58r*9!&*$ true K$5u#8sZFus&I true Z@4kf#48F2$l&*lc$2! true Y$3dq$7@Z8ubc9K$K*4CRx*h3u3L@ true E@0i!O7@N$9V#lN$ true I&4j7d95myhQz9Ux2 true M!7kP6ayI3*1&o7EA&SD&TsA2001 true D!2kj1@j#l5&3RdXk!u$B!K0ryWpi true R#7u71R8MVK#um#$S$Z@l0TF true Q@7mK1coj#@7q37xv$@JEM true T$1u55G8R3O* true O*6p$2#38hm$88M9*bI3iWgi7!1 true R*5iQJ@qW9x9rXHR&6DiR true C#7t6T5#lkma2q true K*9i06A$2De58@&2#5 true E#9vTso7uy6ud@d6 true D!2c*K9#m9L#1442##3k*n#mjk&@ true F&9ze9#uM0&&vd@Y true U&1l4&70F@C@!!Wlxn2s8aC20vA true S#1j$E63@vZbTPO!B true Q*4i#Ua!Kx#BV*xKI0 true I@8wJjP74s0w2P6#bR!5is52!Lq9 true R#0d568*tR*0JI4L true V#6o3$H&NUj# true C!7s!4y1W*GdM8**V* true V*0m@BMsb#sVMr49r&*yU17f6a! true B!5p2W$@4##EMp3P3QTi#aU2Ny true W*6jU*grilZr1mldezr*o@ true I&5r&141H&QVd8Ju true J*4b**q1NVY! true R#0tJ9*0pxR7IJO2r7@$L!!oY*25 true R*3rWcE5CtH53VPL#D&t true E@7uAK@j!$o@1jMa!23P true G$4m5!y2z7QZ!!!bf!Z2$ true O@7bMFaKkgD1 true M!2clUnZP3V4yLW!Rzmy*y8b$# true L&6uYuC*d*5e@#5U7 true W$0ock#3a96l true F&2q3An@&ZyG$QPV true M@2fH#3#Ul@d16&5@* true P*4fxqA*s*e!6Hd$&J1dw9 true Z&7lY83FERr#*h6$f&*1&*8yxh true H@1a!pK$cE7R**B@O2oLA4xFgh1 true P*7w$Ahi8#q&T true E#7p@50Vf6h1@4R$0*LMW true P$0g&&&#@n#S!R4&Y! true H@8tKlA$1Xaq$ true B*8gk4cMI2N$QAG*dgo true D#5h$25I7ab*3qXR9W$ true T*0ziP6n!Vjct!Q9ygd5*Kp$ true S#9p1Os@@5Qq#S27f@@k9 true D@6jlJ9$rq5@U*1*@ true A!4s!7l6#ha*z!d23*E*E0@lz8*@ true D$0k6lt99&MAw$01#2MX8#Kk0 true B&9yZ4UW1PxLq*6y true R#6be*85A892 true H*4p$aQ5@m72*$3 true O$6e!#6eXqw$@1!@D$@*2* true W&2yx4$*#s!Yp3002TKKF2e true H&7o71l6L574#$x4# true H#7l!$IJ#7!W2! true R*9e#Gc4GtBZJr&024q true H!5a$rzF@R&* true V!8u!PDB*h861 true L$4pN@IX!kf1$m6w3 true N*5q$3***x!6B8!7RUD! true X*9gm*67$6o22$s true I$4j7#yhh$5@ true U&8cDI&kb1$3635 true T$7y!$MBbcW!l7&u true N#2ebN7nW&L1V8i true U*5w5@D7Ce*$4*RQn true P@3gV!&$$r$u&0&@420 true C!2yd90#3s78whC8 true P&1bY#g&&aUs0kt*7&5$ true B@7kz03@5w@1G1&mW*Y true U&5jk94GLmVIW true A$6epUXy27O#S9 true J$6leTr&0aM#5@7 true D*7e&&#U&@uLv0#P!waT* true W!6r!hZeJ*4$16iz@W7T$l@t#0 true M$1h!M@7@t5&a3V$ true J$2oK!W*v2rj@R!q#!m4t2&aJc8* true D*8ixPX$0&4CP*3p1 true O@7lk15Xbb*bf#16$5k true J@6m7NE4@21l@!qQV0*nO0nO0es true X*2vKJ$6@oFhp5UwIV*&$Fq47bo0# true Q#1l*saG61o&k56p$l true Y$9qRNj!2M*w*E5&9ZC848! true F#7sMp9$GC!g!t*#EG&@ true S!0fs$u##$D1ARyM true F#7cdtA#0h82$!9jREOa9 true M$3nh9*8C&PLt39*&Mg!*p9$! true M*7zO#0@v858N50Q*gL1TZ!@O true P!1i5zSU75i@$rmCVC1P#VU$ true D*6d9GY9WdNe!&AVkT$ true Z$6d50N@0&*B true B*5yueQq!C&@#k!@8hM3 true I$3gkB4m!&Q97@ak2x@qS*&96@$V true F!6vf#4&N@4r true P@6gc&iG513@ true L#1c*GT57Iq@*iiv*&!&C&2*ql true U$2i61J2*b4&*Y$n true P*5ls8w$@D!C1d$ true S#7k@!&Dh$YS2L*FI true S&2xf!$#*1!7H&1&afixG$Eg8 true G!6i38Am*34b7Hm*y#*2 true W@1qV9T0$2**2YRL&i9mJfWf5r true H$1mx!6619ah!#@U*$g*5!9F7Qa&* true P&7d!S@dM0AR6z true T&5m6Vz*7t&6L5p2nkS true I*7i5$6g&8q5en3C9#e3t5*3m@H true U!1v&mXK@lhePd true I!3mk3&R15o&U*V5Ne# true U&4uVBab4@V5#lD*U*c*7LA0B60& true Z*0h$$6V@$bQ$U**I94aI7F1 true Z#2v#@3tpk#b6#U!*F4095* true X*9w57iw&!w#ipfm@Q34c9@QM!5As true N#1g0sy*$I4!Z3&K8#0&qN96* true T#1z#o$9V$$wCb6# true H$3gVL*#Z3ncC46*7l4i0 true U&1hI@lSNqx2LakUwZ true P$2lxc5&1#jp70&@#s!9hc true D#9zHv*Yi@1D$2S7zaU2VVEx true U$1t95#*##2&*@ true P@8yPnD76T@bA*j!!8G true E@9lb$T@gcVU4v&$V7! true Q&5t7Q#&X@H&fj5PXV true C!2d5HT3SD$A true O!6lj3ixMkR1qXZw*Rkon&Nj$*36 true Z*9k@m4@H!C7SM!s@ true Q$7iu*17k&h#nBw@0 true G@5k*8vV5&Vp&a#11@N549LCs@ true D#3bKV80d9efmXjvXC true J#9w*F2e*0F$5gu&1i&!v6!9E5ju true D$5r@*ewYsHf true B$1h!85y@*&LRq2&*&riA!6! true T#5itt#DAUHOd2@4N true K@1oVt@XC!9H true G#1clB#3&rpD#X#e6#*74#72o!!4 true U#7w6k4@Ulf@F6O9u*7#*o true E$8gVxZ32!$s1nV&C22uR$d6 true W*7pEjnVDfv1@v7JyjiiUvG true E!5lB8*QiepxqYR4& true G#2w0inR&L6pn&4S&k*h3f true P!7iGNr#x##n1#@nF!XE@7hP$G8*c true R!8c&C*kq*6&7tE$B@6*N73W*4 true W*6gJE1a3!*$95c#C true U!7t&Y73&g46#TEi!1TA$6ULneY&K true R!2qr3lz*Zt32rM true M*4b!k*$5ev!n98U@RZ!2e3W9Rf$# true O&9pYeoej&E*PRFMH*hv28Ly*& true C@2iMa&6jj9Y7& true E&6oM*b5&fN3D9*3*K6&k! true F&2k5Wt!&*0@Oo$*66r$ true I!7sCYuwG2V$c8a@k#*&8M@ true R!8kX&2!X7O!!fV6 true O!7s$0R0G!#k#8061!YPdC& true K$1g0!O890R#4@ true X&8p&p$3*$6jfWU&e7MT234 true L#2jwY&U1!#$24@0cN!&&*G! true M&8ayl#NCZ!t0 true G*2sKBnns0Vka$mD2Qi#$W&N40 true W#6h#3l3Bxa5wA!#8BT7a#2iq5rZr true E!1uy6$z@9hZ true K@2g$n@G5xqN true O&2z!uX$q@j!2vnWI@nC true Q*0fU*6$mYz$t# true D!5l@!u60VCd true Q@6b80&!P!*@*EzW*fYn!ui$2a!&@ true H!3p4810&D3szP1r@#@U3mo#! true Y!6qpc8E6Jm!EBy@9pbGJZGA#&lw1 true U*6zZf$S6GAJ&17mcS true K$2jGBfY1&45*3N8&@5ZpqQ@ true X*5nr*NWqCg72Y true L$4i093@to#223@8Ta3iH2&95zp true R$4l2J4u!vL1#31WM true J!7c5X&wH0p&4k32m true L&0g3Li03F6N6X2b true F@7e9@GS!xKo$Nn@1z$YB5Nib*# true A@1f@4*sJesV&vf$@HW&cX true S@5kdM!U8*4#L5Oq4ZpKP*2$5KX true V!2oLP*@GhaadYnL77q6!5$w true X!1n4i@7ajF@w$kU3Qyx820 true D&3fl#97@M!@0Js1S!H0toRL3&K9* true A!0mMZynU&R9!@uBGLA25D02v true X!5eWC#*gU256@j7dC true S&0uCq0&Oz#Ripm#n true N*8gF#b*R0PM37i*9$EqCK26Dj!k true Z#2l@on91T77K8B$&!e$y!5 true A!5w5Dkl9#@C4xh0410*&0Vn!U true U&4z@G#4SS#m true Q@7f$1&sp2v472D1$Ia3@AJrn6K9j true R$1eVlh&aZ$i@6&!3 true K!8x$OeI&@bU3NFQm23$Pw8#RR true K!3nI$8hu!79p0gq true T#2eQux*92gy& true J*2vK!#H!#G$7&4KoR0v9@A&*y6@ true X$8fR@@#vRni@d&l#RgUVn8M true G#0fNGM$sm&c$L99C!J&5 true V$2q#b@8DPy&&Y83Q$mKF!$zt3$j true Y@0t4s#1wgOE*p7oV&50E#Z88yNj7 true N!9tMHO*Eo@fYh2#M5@xx0HmoD true V@2tdm&CkdPPK84!@f7U true Z*7r#Wn$I!so#*&R!Bc@fi*As true Z&3dbukDBGs*#30j#e&$Lmjw true H$6h3$RP7edUW@ true U@5yATf*1bk@@k2nm199M&$ true P!3o4&sg&F2N3R7c true Z!1u56b&3I#75&q!&ANF* true S#3ni4x!27M6@uvhRJ7a8E32N true P&0a3!O*7!UQoZ&0o1bFTyN*Cgg46 true H&1wAZ92#$U!0&DE#u true B!3t9A7jw&d@k@QJ!X! true Y$4gS7A@323&8dMfos#Cg7 true K*0a913Ym675D9!!bvDv4$gZZsP77 true S$0r@ORq@yD*1O3$ml13 T8cP true F!3h#fhGL@j$xeV true J$2h6EKY!0BS8N$&0j57! true I!9fQ*28B2*!Ntkv&J#!$55 true L&6q@p7$c9f&Cc&NT$Ky&f! true L@3g#7!#&3@GQ3**vQy!!99#45uP# true T!2x1@GBq#4!K51l true N$9gf82TF#S*Z true A#9sQo$!7o88&tl*31QVk$2$ true B@3yqSi*JY#pv6@B#5X@d5hFh1i$C true U$5a#9Xq5Uqj#st#h true Y#3y#J7AB1L1v#8bU7@crcX true V@1aH@TL6803#l*! true D!0apZlQG#Rhh4!nig#34 true P*1fPQJ20bZ#$RA#Pd*L9nC5 true Z!4d!BXyG3@#38@O true P$9h6bxKR3Ua3e@#S3k# true V!8z9XjQ95aB true F$6d2M2exvuzWmse0 true N!0i!*3$#I4&I&19q78!4SIBW3 true K&6hrECd0vf1WJ#xU!0*HxEtZgn3 true B$8g@r*IVQzzI#EfUR$P!2wT#7V67 true Y@3bS#V0Q!9$w1r0521& true I@9h6941tk9r2jH8Q##7#@1 true N&2e1b*J&n!@42pkXnrWUi9c6pF$ true J#0c5qJ$$QuE7!HoEei9SI9Jmu true I@5hL3Zt!@3UV*S5 true V!7q8N&*PL$F2GYNTeL6z0t& true O@1wU$pht!nat*@Hn@J true V#2g3&&gle$5zN2FMztMw4k1@@P true D&6rj0LMZJ&5o$76ip* true H$5iN$bq2$T*w@@03ean7LwN@xLa true U$4r5b52W9$8g3w1@8r5 true T&5g5UK*np7!$7@!O61*9M true V&3zf!#$9V2528j&DYi&a1a*t!@ true E#1g!h@y!5#U5#5V7$M*8!aOL true C@1xv#s*wXI7I true Z@8g4*Q@iy7JS4!u*XTKdZn4!#7I true P!3biJ05Ram4@S14OBeyZH true A!2fRKX9VXf0@24 Process finished with exit code 0
Unrealman1 commented 3 years ago

can confirm Adapted Pattern as described above works like a charm if you use Java Pattern compile = Pattern.compile(newPattern); compile.matcher(text).find() to validate your string instead of String.match(text). P.S. thank you for your hard work.