diff --git a/Mpdf/Config/ConfigVariables.php b/Mpdf/Config/ConfigVariables.php index bf1eb50..41deafd 100755 --- a/Mpdf/Config/ConfigVariables.php +++ b/Mpdf/Config/ConfigVariables.php @@ -76,7 +76,7 @@ class ConfigVariables // Uses Adobe CJK fonts for CJK languages // default TRUE, only set false if you have defined some available fonts that support CJK // If true this will not stop use of other CJK fonts if specified by font-family: - // and vice versa i.e. only dictates behaviour when specified by lang="" incl. AutoFont() + // and vice versa i.e. only dictates behavior when specified by lang="" incl. AutoFont() 'useAdobeCJK' => false, // When embedding full TTF font files, remakes the font file using only core tables diff --git a/OpenLayers/tests/data/utfgrid/demo-1.1.json b/OpenLayers/tests/data/utfgrid/demo-1.1.json index 0848e26..f5897f2 100644 --- a/OpenLayers/tests/data/utfgrid/demo-1.1.json +++ b/OpenLayers/tests/data/utfgrid/demo-1.1.json @@ -1 +1 @@ -{"grid":[" !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġ","ĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡ","ȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿̡̛̖̗̘̙̜̝̞̟̠̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̕̚","̴̵̶̷̸̢̧̨̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮͯ͘͜͟͢͝͞͠͡ͰͱͲͳʹ͵Ͷͷ͸͹ͺͻͼͽ;Ϳ΀΁΂΃΄΅Ά·ΈΉΊ΋Ό΍ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙϚϛϜϝϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРС","ТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡ","ԢԣԤԥԦԧԨԩԪԫԬԭԮԯ԰ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖ՗՘ՙ՚՛՜՝՞՟ՠաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևֈ։֊֋֌֍֎֏֐ְֱֲֳִֵֶַָֹֺֻּֽ֑֖֛֢֣֤֥֦֧֪֚֭֮֒֓֔֕֗֘֙֜֝֞֟֠֡֨֩֫֬֯־ֿ׀ׁׂ׃ׅׄ׆ׇ׈׉׊׋׌׍׎׏אבגדהוזחטיךכלםמןנסעףפץצקרשת׫׬׭׮ׯװױײ׳״׵׶׷׸׹׺׻׼׽׾׿؀؁؂؃؄؅؆؇؈؉؊؋،؍؎؏ؘؙؚؐؑؒؓؔؕؖؗ؛؜؝؞؟ؠء","آأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّْٕٖٜٟٓٔٗ٘ٙٚٛٝٞ٠١٢٣٤٥٦٧٨٩٪٫٬٭ٮٯٰٱٲٳٴٵٶٷٸٹٺٻټٽپٿڀځڂڃڄڅچڇڈډڊڋڌڍڎڏڐڑڒړڔڕږڗژڙښڛڜڝڞڟڠڡڢڣڤڥڦڧڨکڪګڬڭڮگڰڱڲڳڴڵڶڷڸڹںڻڼڽھڿۀہۂۃۄۅۆۇۈۉۊۋیۍێۏېۑےۓ۔ەۖۗۘۙۚۛۜ۝۞ۣ۟۠ۡۢۤۥۦۧۨ۩۪ۭ۫۬ۮۯ۰۱۲۳۴۵۶۷۸۹ۺۻۼ۽۾ۿ܀܁܂܃܄܅܆܇܈܉܊܋܌܍܎܏ܐܑܒܓܔܕܖܗܘܙܚܛܜܝܞܟܠܡ","ܢܣܤܥܦܧܨܩܪܫܬܭܮܯܱܴܷܸܹܻܼܾ݂݄݆݈ܰܲܳܵܶܺܽܿ݀݁݃݅݇݉݊݋݌ݍݎݏݐݑݒݓݔݕݖݗݘݙݚݛݜݝݞݟݠݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶݷݸݹݺݻݼݽݾݿހށނރބޅކއވމފދތލގޏސޑޒޓޔޕޖޗޘޙޚޛޜޝޞޟޠޡޢޣޤޥަާިީުޫެޭޮޯްޱ޲޳޴޵޶޷޸޹޺޻޼޽޾޿߀߁߂߃߄߅߆߇߈߉ߊߋߌߍߎߏߐߑߒߓߔߕߖߗߘߙߚߛߜߝߞߟߠߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ߶߷߸߹ߺ߻߼߽߾߿ࠀࠁࠂࠃࠄࠅࠆࠇࠈࠉࠊࠋࠌࠍࠎࠏࠐࠑࠒࠓࠔࠕࠖࠗ࠘࠙ࠚࠛࠜࠝࠞࠟࠠࠡ","ࠢࠣࠤࠥࠦࠧࠨࠩࠪࠫࠬ࠭࠮࠯࠰࠱࠲࠳࠴࠵࠶࠷࠸࠹࠺࠻࠼࠽࠾࠿ࡀࡁࡂࡃࡄࡅࡆࡇࡈࡉࡊࡋࡌࡍࡎࡏࡐࡑࡒࡓࡔࡕࡖࡗࡘ࡙࡚࡛࡜࡝࡞࡟ࡠࡡࡢࡣࡤࡥࡦࡧࡨࡩࡪ࡫࡬࡭࡮࡯ࡰࡱࡲࡳࡴࡵࡶࡷࡸࡹࡺࡻࡼࡽࡾࡿࢀࢁࢂࢃࢄࢅࢆࢇ࢈ࢉࢊࢋࢌࢍࢎ࢏࢐࢑࢒࢓࢔࢕࢖࢙࢚࢛ࢗ࢘࢜࢝࢞࢟ࢠࢡࢢࢣࢤࢥࢦࢧࢨࢩࢪࢫࢬࢭࢮࢯࢰࢱࢲࢳࢴࢵࢶࢷࢸࢹࢺࢻࢼࢽࢾࢿࣀࣁࣂࣃࣄࣅࣆࣇࣈࣉ࣏࣐࣑࣒࣓࣊࣋࣌࣍࣎ࣔࣕࣖࣗࣘࣙࣚࣛࣜࣝࣞࣟ࣠࣡࣢ࣰࣱࣲࣣࣦࣩ࣭࣮࣯ࣶࣹࣺࣤࣥࣧࣨ࣪࣫࣬ࣳࣴࣵࣷࣸࣻࣼࣽࣾࣿऀँंःऄअआइईउऊऋऌऍऎएऐऑऒओऔकखगघङचछजझञटठड","ढणतथदधनऩपफबभमयरऱलळऴवशषसहऺऻ़ऽािीुूृॄॅॆेैॉॊोौ्ॎॏॐ॒॑॓॔ॕॖॗक़ख़ग़ज़ड़ढ़फ़य़ॠॡॢॣ।॥०१२३४५६७८९॰ॱॲॳॴॵॶॷॸॹॺॻॼॽॾॿঀঁংঃ঄অআইঈউঊঋঌ঍঎এঐ঑঒ওঔকখগঘঙচছজঝঞটঠডঢণতথদধন঩পফবভমযর঱ল঳঴঵শষসহ঺঻়ঽািীুূৃৄ৅৆েৈ৉৊োৌ্ৎ৏৐৑৒৓৔৕৖ৗ৘৙৚৛ড়ঢ়৞য়ৠৡৢৣ৤৥০১২৩৪৫৬৭৮৯ৰৱ৲৳৴৵৶৷৸৹৺৻ৼ৽৾৿਀ਁਂਃ਄ਅਆਇਈਉਊ਋਌਍਎ਏਐ਑਒ਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡ","ਢਣਤਥਦਧਨ਩ਪਫਬਭਮਯਰ਱ਲਲ਼਴ਵਸ਼਷ਸਹ਺਻਼਽ਾਿੀੁੂ੃੄੅੆ੇੈ੉੊ੋੌ੍੎੏੐ੑ੒੓੔੕੖੗੘ਖ਼ਗ਼ਜ਼ੜ੝ਫ਼੟੠੡੢੣੤੥੦੧੨੩੪੫੬੭੮੯ੰੱੲੳੴੵ੶੷੸੹੺੻੼੽੾੿઀ઁંઃ઄અઆઇઈઉઊઋઌઍ઎એઐઑ઒ઓઔકખગઘઙચછજઝઞટઠડઢણતથદધન઩પફબભમયર઱લળ઴વશષસહ઺઻઼ઽાિીુૂૃૄૅ૆ેૈૉ૊ોૌ્૎૏ૐ૑૒૓૔૕૖૗૘૙૚૛૜૝૞૟ૠૡૢૣ૤૥૦૧૨૩૪૫૬૭૮૯૰૱૲૳૴૵૶૷૸ૹૺૻૼ૽૾૿଀ଁଂଃ଄ଅଆଇଈଉଊଋଌ଍଎ଏଐ଑଒ଓଔକଖଗଘଙଚଛଜଝଞଟଠଡ","ଢଣତଥଦଧନ଩ପଫବଭମଯର଱ଲଳ଴ଵଶଷସହ଺଻଼ଽାିୀୁୂୃୄ୅୆େୈ୉୊ୋୌ୍୎୏୐୑୒୓୔୕ୖୗ୘୙୚୛ଡ଼ଢ଼୞ୟୠୡୢୣ୤୥୦୧୨୩୪୫୬୭୮୯୰ୱ୲୳୴୵୶୷୸୹୺୻୼୽୾୿஀஁ஂஃ஄அஆஇஈஉஊ஋஌஍எஏஐ஑ஒஓஔக஖஗஘ஙச஛ஜ஝ஞட஠஡஢ணத஥஦஧நனப஫஬஭மயரறலளழவஶஷஸஹ஺஻஼஽ாிீுூ௃௄௅ெேை௉ொோௌ்௎௏ௐ௑௒௓௔௕௖ௗ௘௙௚௛௜௝௞௟௠௡௢௣௤௥௦௧௨௩௪௫௬௭௮௯௰௱௲௳௴௵௶௷௸௹௺௻௼௽௾௿ఀఁంఃఄఅఆఇఈఉఊఋఌ఍ఎఏఐ఑ఒఓఔకఖగఘఙచఛజఝఞటఠడ","ఢణతథదధన఩పఫబభమయరఱలళఴవశషసహ఺఻఼ఽాిీుూృౄ౅ెేై౉ొోౌ్౎౏౐౑౒౓౔ౕౖ౗ౘౙౚ౛౜ౝ౞౟ౠౡౢౣ౤౥౦౧౨౩౪౫౬౭౮౯౰౱౲౳౴౵౶౷౸౹౺౻౼౽౾౿ಀಁಂಃ಄ಅಆಇಈಉಊಋಌ಍ಎಏಐ಑ಒಓಔಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನ಩ಪಫಬಭಮಯರಱಲಳ಴ವಶಷಸಹ಺಻಼ಽಾಿೀುೂೃೄ೅ೆೇೈ೉ೊೋೌ್೎೏೐೑೒೓೔ೕೖ೗೘೙೚೛೜ೝೞ೟ೠೡೢೣ೤೥೦೧೨೩೪೫೬೭೮೯೰ೱೲೳ೴೵೶೷೸೹೺೻೼೽೾೿ഀഁംഃഄഅആഇഈഉഊഋഌ഍എഏഐ഑ഒഓഔകഖഗഘങചഛജഝഞടഠഡ","ഢണതഥദധനഩപഫബഭമയരറലളഴവശഷസഹഺ഻഼ഽാിീുൂൃൄ൅െേൈ൉ൊോൌ്ൎ൏൐൑൒൓ൔൕൖൗ൘൙൚൛൜൝൞ൟൠൡൢൣ൤൥൦൧൨൩൪൫൬൭൮൯൰൱൲൳൴൵൶൷൸൹ൺൻർൽൾൿ඀ඁංඃ඄අආඇඈඉඊඋඌඍඎඏඐඑඒඓඔඕඖ඗඘඙කඛගඝඞඟචඡජඣඤඥඦටඨඩඪණඬතථදධන඲ඳපඵබභමඹයර඼ල඾඿වශෂසහළෆ෇෈෉්෋෌෍෎ාැෑිීු෕ූ෗ෘෙේෛොෝෞෟ෠෡෢෣෤෥෦෧෨෩෪෫෬෭෮෯෰෱ෲෳ෴෵෶෷෸෹෺෻෼෽෾෿฀กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภม","ยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฻฼฽฾฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛๜๝๞๟๠๡๢๣๤๥๦๧๨๩๪๫๬๭๮๯๰๱๲๳๴๵๶๷๸๹๺๻๼๽๾๿຀ກຂ຃ຄ຅ຆງຈຉຊ຋ຌຍຎຏຐຑຒຓດຕຖທຘນບປຜຝພຟຠມຢຣ຤ລ຦ວຨຩສຫຬອຮຯະັາຳິີຶື຺ຸູົຼຽ຾຿ເແໂໃໄ໅ໆ໇່້໊໋໌ໍ໎໏໐໑໒໓໔໕໖໗໘໙໚໛ໜໝໞໟ໠໡໢໣໤໥໦໧໨໩໪໫໬໭໮໯໰໱໲໳໴໵໶໷໸໹໺໻໼໽໾໿ༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗༘༙༚༛༜༝༞༟༠༡","༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳༴༵༶༷༸༹༺༻༼༽༾༿ཀཁགགྷངཅཆཇ཈ཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟའཡརལཤཥསཧཨཀྵཪཫཬ཭཮཯཰ཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗ྘ྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྽྾྿࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚࿛࿜࿝࿞࿟࿠࿡࿢࿣࿤࿥࿦࿧࿨࿩࿪࿫࿬࿭࿮࿯࿰࿱࿲࿳࿴࿵࿶࿷࿸࿹࿺࿻࿼࿽࿾࿿ကခဂဃငစဆဇဈဉညဋဌဍဎဏတထဒဓနပဖဗဘမယရလဝသဟဠအ","ဢဣဤဥဦဧဨဩဪါာိီုူေဲဳဴဵံ့း္်ျြွှဿ၀၁၂၃၄၅၆၇၈၉၊။၌၍၎၏ၐၑၒၓၔၕၖၗၘၙၚၛၜၝၞၟၠၡၢၣၤၥၦၧၨၩၪၫၬၭၮၯၰၱၲၳၴၵၶၷၸၹၺၻၼၽၾၿႀႁႂႃႄႅႆႇႈႉႊႋႌႍႎႏ႐႑႒႓႔႕႖႗႘႙ႚႛႜႝ႞႟ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅ჆Ⴧ჈჉჊჋჌Ⴭ჎჏აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ჻ჼჽჾჿᄀᄁᄂᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒᄓᄔᄕᄖᄗᄘᄙᄚᄛᄜᄝᄞᄟᄠᄡ","ᄢᄣᄤᄥᄦᄧᄨᄩᄪᄫᄬᄭᄮᄯᄰᄱᄲᄳᄴᄵᄶᄷᄸᄹᄺᄻᄼᄽᄾᄿᅀᅁᅂᅃᅄᅅᅆᅇᅈᅉᅊᅋᅌᅍᅎᅏᅐᅑᅒᅓᅔᅕᅖᅗᅘᅙᅚᅛᅜᅝᅞᅟᅠᅡᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵᅶᅷᅸᅹᅺᅻᅼᅽᅾᅿᆀᆁᆂᆃᆄᆅᆆᆇᆈᆉᆊᆋᆌᆍᆎᆏᆐᆑᆒᆓᆔᆕᆖᆗᆘᆙᆚᆛᆜᆝᆞᆟᆠᆡᆢᆣᆤᆥᆦᆧᆨᆩᆪᆫᆬᆭᆮᆯᆰᆱᆲᆳᆴᆵᆶᆷᆸᆹᆺᆻᆼᆽᆾᆿᇀᇁᇂᇃᇄᇅᇆᇇᇈᇉᇊᇋᇌᇍᇎᇏᇐᇑᇒᇓᇔᇕᇖᇗᇘᇙᇚᇛᇜᇝᇞᇟᇠᇡᇢᇣᇤᇥᇦᇧᇨᇩᇪᇫᇬᇭᇮᇯᇰᇱᇲᇳᇴᇵᇶᇷᇸᇹᇺᇻᇼᇽᇾᇿሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟሠሡ","ሢሣሤሥሦሧረሩሪራሬርሮሯሰሱሲሳሴስሶሷሸሹሺሻሼሽሾሿቀቁቂቃቄቅቆቇቈ቉ቊቋቌቍ቎቏ቐቑቒቓቔቕቖ቗ቘ቙ቚቛቜቝ቞቟በቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿኀኁኂኃኄኅኆኇኈ኉ኊኋኌኍ኎኏ነኑኒናኔንኖኗኘኙኚኛኜኝኞኟአኡኢኣኤእኦኧከኩኪካኬክኮኯኰ኱ኲኳኴኵ኶኷ኸኹኺኻኼኽኾ኿ዀ዁ዂዃዄዅ዆዇ወዉዊዋዌውዎዏዐዑዒዓዔዕዖ዗ዘዙዚዛዜዝዞዟዠዡዢዣዤዥዦዧየዩዪያዬይዮዯደዱዲዳዴድዶዷዸዹዺዻዼዽዾዿጀጁጂጃጄጅጆጇገጉጊጋጌግጎጏጐ጑ጒጓጔጕ጖጗ጘጙጚጛጜጝጞጟጠጡ","ጢጣጤጥጦጧጨጩጪጫጬጭጮጯጰጱጲጳጴጵጶጷጸጹጺጻጼጽጾጿፀፁፂፃፄፅፆፇፈፉፊፋፌፍፎፏፐፑፒፓፔፕፖፗፘፙፚ፛፜፝፞፟፠፡።፣፤፥፦፧፨፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼፽፾፿ᎀᎁᎂᎃᎄᎅᎆᎇᎈᎉᎊᎋᎌᎍᎎᎏ᎐᎑᎒᎓᎔᎕᎖᎗᎘᎙᎚᎛᎜᎝᎞᎟ᎠᎡᎢᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴᏵ᏶᏷ᏸᏹᏺᏻᏼᏽ᏾᏿᐀ᐁᐂᐃᐄᐅᐆᐇᐈᐉᐊᐋᐌᐍᐎᐏᐐᐑᐒᐓᐔᐕᐖᐗᐘᐙᐚᐛᐜᐝᐞᐟᐠᐡ","ᐢᐣᐤᐥᐦᐧᐨᐩᐪᐫᐬᐭᐮᐯᐰᐱᐲᐳᐴᐵᐶᐷᐸᐹᐺᐻᐼᐽᐾᐿᑀᑁᑂᑃᑄᑅᑆᑇᑈᑉᑊᑋᑌᑍᑎᑏᑐᑑᑒᑓᑔᑕᑖᑗᑘᑙᑚᑛᑜᑝᑞᑟᑠᑡᑢᑣᑤᑥᑦᑧᑨᑩᑪᑫᑬᑭᑮᑯᑰᑱᑲᑳᑴᑵᑶᑷᑸᑹᑺᑻᑼᑽᑾᑿᒀᒁᒂᒃᒄᒅᒆᒇᒈᒉᒊᒋᒌᒍᒎᒏᒐᒑᒒᒓᒔᒕᒖᒗᒘᒙᒚᒛᒜᒝᒞᒟᒠᒡᒢᒣᒤᒥᒦᒧᒨᒩᒪᒫᒬᒭᒮᒯᒰᒱᒲᒳᒴᒵᒶᒷᒸᒹᒺᒻᒼᒽᒾᒿᓀᓁᓂᓃᓄᓅᓆᓇᓈᓉᓊᓋᓌᓍᓎᓏᓐᓑᓒᓓᓔᓕᓖᓗᓘᓙᓚᓛᓜᓝᓞᓟᓠᓡᓢᓣᓤᓥᓦᓧᓨᓩᓪᓫᓬᓭᓮᓯᓰᓱᓲᓳᓴᓵᓶᓷᓸᓹᓺᓻᓼᓽᓾᓿᔀᔁᔂᔃᔄᔅᔆᔇᔈᔉᔊᔋᔌᔍᔎᔏᔐᔑᔒᔓᔔᔕᔖᔗᔘᔙᔚᔛᔜᔝᔞᔟᔠᔡ","ᔢᔣᔤᔥᔦᔧᔨᔩᔪᔫᔬᔭᔮᔯᔰᔱᔲᔳᔴᔵᔶᔷᔸᔹᔺᔻᔼᔽᔾᔿᕀᕁᕂᕃᕄᕅᕆᕇᕈᕉᕊᕋᕌᕍᕎᕏᕐᕑᕒᕓᕔᕕᕖᕗᕘᕙᕚᕛᕜᕝᕞᕟᕠᕡᕢᕣᕤᕥᕦᕧᕨᕩᕪᕫᕬᕭᕮᕯᕰᕱᕲᕳᕴᕵᕶᕷᕸᕹᕺᕻᕼᕽᕾᕿᖀᖁᖂᖃᖄᖅᖆᖇᖈᖉᖊᖋᖌᖍᖎᖏᖐᖑᖒᖓᖔᖕᖖᖗᖘᖙᖚᖛᖜᖝᖞᖟᖠᖡᖢᖣᖤᖥᖦᖧᖨᖩᖪᖫᖬᖭᖮᖯᖰᖱᖲᖳᖴᖵᖶᖷᖸᖹᖺᖻᖼᖽᖾᖿᗀᗁᗂᗃᗄᗅᗆᗇᗈᗉᗊᗋᗌᗍᗎᗏᗐᗑᗒᗓᗔᗕᗖᗗᗘᗙᗚᗛᗜᗝᗞᗟᗠᗡᗢᗣᗤᗥᗦᗧᗨᗩᗪᗫᗬᗭᗮᗯᗰᗱᗲᗳᗴᗵᗶᗷᗸᗹᗺᗻᗼᗽᗾᗿᘀᘁᘂᘃᘄᘅᘆᘇᘈᘉᘊᘋᘌᘍᘎᘏᘐᘑᘒᘓᘔᘕᘖᘗᘘᘙᘚᘛᘜᘝᘞᘟᘠᘡ","ᘢᘣᘤᘥᘦᘧᘨᘩᘪᘫᘬᘭᘮᘯᘰᘱᘲᘳᘴᘵᘶᘷᘸᘹᘺᘻᘼᘽᘾᘿᙀᙁᙂᙃᙄᙅᙆᙇᙈᙉᙊᙋᙌᙍᙎᙏᙐᙑᙒᙓᙔᙕᙖᙗᙘᙙᙚᙛᙜᙝᙞᙟᙠᙡᙢᙣᙤᙥᙦᙧᙨᙩᙪᙫᙬ᙭᙮ᙯᙰᙱᙲᙳᙴᙵᙶᙷᙸᙹᙺᙻᙼᙽᙾᙿ ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔᚕᚖᚗᚘᚙᚚ᚛᚜᚝᚞᚟ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰᛱᛲᛳᛴᛵᛶᛷᛸ᛹᛺᛻᛼᛽᛾᛿ᜀᜁᜂᜃᜄᜅᜆᜇᜈᜉᜊᜋᜌᜍᜎᜏᜐᜑᜒᜓ᜔᜕᜖᜗᜘᜙᜚᜛᜜᜝᜞ᜟᜠᜡ","ᜢᜣᜤᜥᜦᜧᜨᜩᜪᜫᜬᜭᜮᜯᜰᜱᜲᜳ᜴᜵᜶᜷᜸᜹᜺᜻᜼᜽᜾᜿ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑᝒᝓ᝔᝕᝖᝗᝘᝙᝚᝛᝜᝝᝞᝟ᝠᝡᝢᝣᝤᝥᝦᝧᝨᝩᝪᝫᝬ᝭ᝮᝯᝰ᝱ᝲᝳ᝴᝵᝶᝷᝸᝹᝺᝻᝼᝽᝾᝿កខគឃងចឆជឈញដឋឌឍណតថទធនបផពភមយរលវឝឞសហឡអឣឤឥឦឧឨឩឪឫឬឭឮឯឰឱឲឳ឴឵ាិីឹឺុូួើឿៀេែៃោៅំះៈ៉៊់៌៍៎៏័៑្៓។៕៖ៗ៘៙៚៛ៜ៝៞៟០១២៣៤៥៦៧៨៩៪៫៬៭៮៯៰៱៲៳៴៵៶៷៸៹៺៻៼៽៾៿᠀᠁᠂᠃᠄᠅᠆᠇᠈᠉᠊᠋᠌᠍᠎᠏᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙᠚᠛᠜᠝᠞᠟ᠠᠡ","ᠢᠣᠤᠥᠦᠧᠨᠩᠪᠫᠬᠭᠮᠯᠰᠱᠲᠳᠴᠵᠶᠷᠸᠹᠺᠻᠼᠽᠾᠿᡀᡁᡂᡃᡄᡅᡆᡇᡈᡉᡊᡋᡌᡍᡎᡏᡐᡑᡒᡓᡔᡕᡖᡗᡘᡙᡚᡛᡜᡝᡞᡟᡠᡡᡢᡣᡤᡥᡦᡧᡨᡩᡪᡫᡬᡭᡮᡯᡰᡱᡲᡳᡴᡵᡶᡷᡸ᡹᡺᡻᡼᡽᡾᡿ᢀᢁᢂᢃᢄᢅᢆᢇᢈᢉᢊᢋᢌᢍᢎᢏᢐᢑᢒᢓᢔᢕᢖᢗᢘᢙᢚᢛᢜᢝᢞᢟᢠᢡᢢᢣᢤᢥᢦᢧᢨᢩᢪ᢫᢬᢭᢮᢯ᢰᢱᢲᢳᢴᢵᢶᢷᢸᢹᢺᢻᢼᢽᢾᢿᣀᣁᣂᣃᣄᣅᣆᣇᣈᣉᣊᣋᣌᣍᣎᣏᣐᣑᣒᣓᣔᣕᣖᣗᣘᣙᣚᣛᣜᣝᣞᣟᣠᣡᣢᣣᣤᣥᣦᣧᣨᣩᣪᣫᣬᣭᣮᣯᣰᣱᣲᣳᣴᣵ᣶᣷᣸᣹᣺᣻᣼᣽᣾᣿ᤀᤁᤂᤃᤄᤅᤆᤇᤈᤉᤊᤋᤌᤍᤎᤏᤐᤑᤒᤓᤔᤕᤖᤗᤘᤙᤚᤛᤜᤝᤞ᤟ᤠᤡ","ᤢᤣᤤᤥᤦᤧᤨᤩᤪᤫ᤬᤭᤮᤯ᤰᤱᤲᤳᤴᤵᤶᤷᤸ᤻᤹᤺᤼᤽᤾᤿᥀᥁᥂᥃᥄᥅᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏ᥐᥑᥒᥓᥔᥕᥖᥗᥘᥙᥚᥛᥜᥝᥞᥟᥠᥡᥢᥣᥤᥥᥦᥧᥨᥩᥪᥫᥬᥭ᥮᥯ᥰᥱᥲᥳᥴ᥵᥶᥷᥸᥹᥺᥻᥼᥽᥾᥿ᦀᦁᦂᦃᦄᦅᦆᦇᦈᦉᦊᦋᦌᦍᦎᦏᦐᦑᦒᦓᦔᦕᦖᦗᦘᦙᦚᦛᦜᦝᦞᦟᦠᦡᦢᦣᦤᦥᦦᦧᦨᦩᦪᦫ᦬᦭᦮᦯ᦰᦱᦲᦳᦴᦵᦶᦷᦸᦹᦺᦻᦼᦽᦾᦿᧀᧁᧂᧃᧄᧅᧆᧇᧈᧉ᧊᧋᧌᧍᧎᧏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᧚᧛᧜᧝᧞᧟᧠᧡᧢᧣᧤᧥᧦᧧᧨᧩᧪᧫᧬᧭᧮᧯᧰᧱᧲᧳᧴᧵᧶᧷᧸᧹᧺᧻᧼᧽᧾᧿ᨀᨁᨂᨃᨄᨅᨆᨇᨈᨉᨊᨋᨌᨍᨎᨏᨐᨑᨒᨓᨔᨕᨖᨘᨗᨙᨚᨛ᨜᨝᨞᨟ᨠᨡ","ᨢᨣᨤᨥᨦᨧᨨᨩᨪᨫᨬᨭᨮᨯᨰᨱᨲᨳᨴᨵᨶᨷᨸᨹᨺᨻᨼᨽᨾᨿᩀᩁᩂᩃᩄᩅᩆᩇᩈᩉᩊᩋᩌᩍᩎᩏᩐᩑᩒᩓᩔᩕᩖᩗᩘᩙᩚᩛᩜᩝᩞ᩟᩠ᩡᩢᩣᩤᩥᩦᩧᩨᩩᩪᩫᩬᩭᩮᩯᩰᩱᩲᩳᩴ᩵᩶᩷᩸᩹᩺᩻᩼᩽᩾᩿᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪊᪋᪌᪍᪎᪏᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙᪚᪛᪜᪝᪞᪟᪠᪡᪢᪣᪤᪥᪦ᪧ᪨᪩᪪᪫᪬᪭᪮᪯᪵᪶᪷᪸᪹᪺᪽᪰᪱᪲᪳᪴᪻᪼᪾ᪿᫀ᫃᫄᫊᫁᫂᫅᫆᫇᫈᫉᫋ᫌᫍᫎ᫏᫐᫑᫒᫓᫔᫕᫖᫗᫘᫙᫚᫛᫜᫝᫞᫟᫠᫡᫢᫣᫤᫥᫦᫧᫨᫩᫪᫫᫬᫭᫮᫯᫰᫱᫲᫳᫴᫵᫶᫷᫸᫹᫺᫻᫼᫽᫾᫿ᬀᬁᬂᬃᬄᬅᬆᬇᬈᬉᬊᬋᬌᬍᬎᬏᬐᬑᬒᬓᬔᬕᬖᬗᬘᬙᬚᬛᬜᬝᬞᬟᬠᬡ","ᬢᬣᬤᬥᬦᬧᬨᬩᬪᬫᬬᬭᬮᬯᬰᬱᬲᬳ᬴ᬵᬶᬷᬸᬹᬺᬻᬼᬽᬾᬿᭀᭁᭂᭃ᭄ᭅᭆᭇᭈᭉᭊᭋᭌ᭍᭎᭏᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᭚᭛᭜᭝᭞᭟᭠᭡᭢᭣᭤᭥᭦᭧᭨᭩᭪᭬᭫᭭᭮᭯᭰᭱᭲᭳᭴᭵᭶᭷᭸᭹᭺᭻᭼᭽᭾᭿ᮀᮁᮂᮃᮄᮅᮆᮇᮈᮉᮊᮋᮌᮍᮎᮏᮐᮑᮒᮓᮔᮕᮖᮗᮘᮙᮚᮛᮜᮝᮞᮟᮠᮡᮢᮣᮤᮥᮦᮧᮨᮩ᮪᮫ᮬᮭᮮᮯ᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹ᮺᮻᮼᮽᮾᮿᯀᯁᯂᯃᯄᯅᯆᯇᯈᯉᯊᯋᯌᯍᯎᯏᯐᯑᯒᯓᯔᯕᯖᯗᯘᯙᯚᯛᯜᯝᯞᯟᯠᯡᯢᯣᯤᯥ᯦ᯧᯨᯩᯪᯫᯬᯭᯮᯯᯰᯱ᯲᯳᯴᯵᯶᯷᯸᯹᯺᯻᯼᯽᯾᯿ᰀᰁᰂᰃᰄᰅᰆᰇᰈᰉᰊᰋᰌᰍᰎᰏᰐᰑᰒᰓᰔᰕᰖᰗᰘᰙᰚᰛᰜᰝᰞᰟᰠᰡ","ᰢᰣᰤᰥᰦᰧᰨᰩᰪᰫᰬᰭᰮᰯᰰᰱᰲᰳᰴᰵᰶ᰷᰸᰹᰺᰻᰼᰽᰾᰿᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱊᱋᱌ᱍᱎᱏ᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙ᱚᱛᱜᱝᱞᱟᱠᱡᱢᱣᱤᱥᱦᱧᱨᱩᱪᱫᱬᱭᱮᱯᱰᱱᱲᱳᱴᱵᱶᱷᱸᱹᱺᱻᱼᱽ᱾᱿ᲀᲁᲂᲃᲄᲅᲆᲇᲈᲉᲊ᲋᲌᲍᲎᲏ᲐᲑᲒᲓᲔᲕᲖᲗᲘᲙᲚᲛᲜᲝᲞᲟᲠᲡᲢᲣᲤᲥᲦᲧᲨᲩᲪᲫᲬᲭᲮᲯᲰᲱᲲᲳᲴᲵᲶᲷᲸᲹᲺ᲻᲼ᲽᲾᲿ᳀᳁᳂᳃᳄᳅᳆᳇᳈᳉᳊᳋᳌᳍᳎᳏᳐᳑᳒᳓᳔᳕᳖᳗᳘᳙᳜᳝᳞᳟᳚᳛᳠᳡᳢᳣᳤᳥᳦᳧᳨ᳩᳪᳫᳬ᳭ᳮᳯᳰᳱᳲᳳ᳴ᳵᳶ᳷᳸᳹ᳺ᳻᳼᳽᳾᳿ᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡ","ᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿ᷐᷎᷺᷂᷊᷏᷹᷽᷿᷷᷸᷀᷁᷃᷄᷅᷆᷇᷈᷉᷋᷌᷑᷒ᷓᷔᷕᷖᷗᷘᷙᷚᷛᷜᷝᷞᷟᷠᷡᷢᷣᷤᷥᷦᷧᷨᷩᷪᷫᷬᷭᷮᷯᷰᷱᷲᷳᷴ᷵᷻᷾᷶᷼᷍ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡ","ḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕ἖἗ἘἙἚἛἜἝ἞἟ἠἡ","ἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃὄὅ὆὇ὈὉὊὋὌὍ὎὏ὐὑὒὓὔὕὖὗ὘Ὑ὚Ὓ὜Ὕ὞ὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώ὾὿ᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴ᾵ᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄ῅ῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐ῔῕ῖῗῘῙῚΊ῜῝῞῟ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`῰῱ῲῳῴ῵ῶῷῸΌῺΏῼ´῾῿           ​‌‍‎‏‐‑‒–—―‖‗‘’‚‛“”„‟†‡","•‣․‥…‧

‪‫‬‭‮ ‰‱′″‴‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞ ⁠⁡⁢⁣⁤⁥⁦⁧⁨⁩⁰ⁱ⁲⁳⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎₏ₐₑₒₓₔₕₖₗₘₙₚₛₜ₝₞₟₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽₾₿⃀⃁⃂⃃⃄⃅⃆⃇⃈⃉⃊⃋⃌⃍⃎⃏⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛⃜⃝⃞⃟⃠⃡⃢⃣⃤⃥⃦⃪⃫⃨⃬⃭⃮⃯⃧⃩⃰⃱⃲⃳⃴⃵⃶⃷⃸⃹⃺⃻⃼⃽⃾⃿℀℁ℂ℃℄℅℆ℇ℈℉ℊℋℌℍℎℏℐℑℒℓ℔ℕ№℗℘ℙℚℛℜℝ℞℟℠℡","™℣ℤ℥Ω℧ℨ℩KÅℬℭ℮ℯℰℱℲℳℴℵℶℷℸℹ℺℻ℼℽℾℿ⅀⅁⅂⅃⅄ⅅⅆⅇⅈⅉ⅊⅋⅌⅍ⅎ⅏⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉↊↋↌↍↎↏←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡","∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟⌠⌡","⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍼⍽⍾⍿⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎕⎖⎗⎘⎙⎚⎛⎜⎝⎞⎟⎠⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎮⎯⎰⎱⎲⎳⎴⎵⎶⎷⎸⎹⎺⎻⎼⎽⎾⎿⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏜⏝⏞⏟⏠⏡⏢⏣⏤⏥⏦⏧⏨⏩⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏴⏵⏶⏷⏸⏹⏺⏻⏼⏽⏾⏿␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡","␢␣␤␥␦␧␨␩␪␫␬␭␮␯␰␱␲␳␴␵␶␷␸␹␺␻␼␽␾␿⑀⑁⑂⑃⑄⑅⑆⑇⑈⑉⑊⑋⑌⑍⑎⑏⑐⑑⑒⑓⑔⑕⑖⑗⑘⑙⑚⑛⑜⑝⑞⑟①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡","┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡","☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡","✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟋⟌⟍⟎⟏⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡","⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡","⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹⤺⤻⤼⤽⤾⤿⥀⥁⥂⥃⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚⨛⨜⨝⨞⨟⨠⨡","⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾⨿⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩙⩚⩛⩜⩝⩞⩟⩠⩡⩢⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚⫛⫝̸⫝⫞⫟⫠⫡⫢⫣⫤⫥⫦⫧⫨⫩⫪⫫⫬⫭⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟⬠⬡","⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭍⭎⭏⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙⭚⭛⭜⭝⭞⭟⭠⭡⭢⭣⭤⭥⭦⭧⭨⭩⭪⭫⭬⭭⭮⭯⭰⭱⭲⭳⭴⭵⭶⭷⭸⭹⭺⭻⭼⭽⭾⭿⮀⮁⮂⮃⮄⮅⮆⮇⮈⮉⮊⮋⮌⮍⮎⮏⮐⮑⮒⮓⮔⮕⮖⮗⮘⮙⮚⮛⮜⮝⮞⮟⮠⮡⮢⮣⮤⮥⮦⮧⮨⮩⮪⮫⮬⮭⮮⮯⮰⮱⮲⮳⮴⮵⮶⮷⮸⮹⮺⮻⮼⮽⮾⮿⯀⯁⯂⯃⯄⯅⯆⯇⯈⯉⯊⯋⯌⯍⯎⯏⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯾⯿ⰀⰁⰂⰃⰄⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟⰠⰡ","ⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰯⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿⱀⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕⱖⱗⱘⱙⱚⱛⱜⱝⱞⱟⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟⲠⲡⲢⲣⲤⲥⲦⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟⳠⳡⳢⳣⳤ⳥⳦⳧⳨⳩⳪ⳫⳬⳭⳮ⳯⳰⳱Ⳳⳳ⳴⳵⳶⳷⳸⳹⳺⳻⳼⳽⳾⳿ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡ","ⴢⴣⴤⴥ⴦ⴧ⴨⴩⴪⴫⴬ⴭ⴮⴯ⴰⴱⴲⴳⴴⴵⴶⴷⴸⴹⴺⴻⴼⴽⴾⴿⵀⵁⵂⵃⵄⵅⵆⵇⵈⵉⵊⵋⵌⵍⵎⵏⵐⵑⵒⵓⵔⵕⵖⵗⵘⵙⵚⵛⵜⵝⵞⵟⵠⵡⵢⵣⵤⵥⵦⵧ⵨⵩⵪⵫⵬⵭⵮ⵯ⵰⵱⵲⵳⵴⵵⵶⵷⵸⵹⵺⵻⵼⵽⵾⵿ⶀⶁⶂⶃⶄⶅⶆⶇⶈⶉⶊⶋⶌⶍⶎⶏⶐⶑⶒⶓⶔⶕⶖ⶗⶘⶙⶚⶛⶜⶝⶞⶟ⶠⶡⶢⶣⶤⶥⶦ⶧ⶨⶩⶪⶫⶬⶭⶮ⶯ⶰⶱⶲⶳⶴⶵⶶ⶷ⶸⶹⶺⶻⶼⶽⶾ⶿ⷀⷁⷂⷃⷄⷅⷆ⷇ⷈⷉⷊⷋⷌⷍⷎ⷏ⷐⷑⷒⷓⷔⷕⷖ⷗ⷘⷙⷚⷛⷜⷝⷞ⷟ⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷⷸⷹⷺⷻⷼⷽⷾⷿ⸀⸁⸂⸃⸄⸅⸆⸇⸈⸉⸊⸋⸌⸍⸎⸏⸐⸑⸒⸓⸔⸕⸖⸗⸘⸙⸚⸛⸜⸝⸞⸟⸠⸡","⸢⸣⸤⸥⸦⸧⸨⸩⸪⸫⸬⸭⸮ⸯ⸰⸱⸲⸳⸴⸵⸶⸷⸸⸹⸺⸻⸼⸽⸾⸿⹀⹁⹂⹃⹄⹅⹆⹇⹈⹉⹊⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜⹝⹞⹟⹠⹡⹢⹣⹤⹥⹦⹧⹨⹩⹪⹫⹬⹭⹮⹯⹰⹱⹲⹳⹴⹵⹶⹷⹸⹹⹺⹻⹼⹽⹾⹿⺀⺁⺂⺃⺄⺅⺆⺇⺈⺉⺊⺋⺌⺍⺎⺏⺐⺑⺒⺓⺔⺕⺖⺗⺘⺙⺚⺛⺜⺝⺞⺟⺠⺡⺢⺣⺤⺥⺦⺧⺨⺩⺪⺫⺬⺭⺮⺯⺰⺱⺲⺳⺴⺵⺶⺷⺸⺹⺺⺻⺼⺽⺾⺿⻀⻁⻂⻃⻄⻅⻆⻇⻈⻉⻊⻋⻌⻍⻎⻏⻐⻑⻒⻓⻔⻕⻖⻗⻘⻙⻚⻛⻜⻝⻞⻟⻠⻡⻢⻣⻤⻥⻦⻧⻨⻩⻪⻫⻬⻭⻮⻯⻰⻱⻲⻳⻴⻵⻶⻷⻸⻹⻺⻻⻼⻽⻾⻿⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟⼠⼡","⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕⿖⿗⿘⿙⿚⿛⿜⿝⿞⿟⿠⿡⿢⿣⿤⿥⿦⿧⿨⿩⿪⿫⿬⿭⿮⿯⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻⿼⿽⿾⿿ 、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡","〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾〿぀ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゗゘゙゚゛゜ゝゞゟ゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ㄀㄁㄂㄃㄄ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡ","ㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄮㄯ㄰ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ㆏㆐㆑㆒㆓㆔㆕㆖㆗㆘㆙㆚㆛㆜㆝㆞㆟ㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆵㆶㆷㆸㆹㆺㆻㆼㆽㆾㆿ㇀㇁㇂㇃㇄㇅㇆㇇㇈㇉㇊㇋㇌㇍㇎㇏㇐㇑㇒㇓㇔㇕㇖㇗㇘㇙㇚㇛㇜㇝㇞㇟㇠㇡㇢㇣㇤㇥㇦㇧㇨㇩㇪㇫㇬㇭㇮㇯ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㈝㈞㈟㈠㈡","㈢㈣㈤㈥㈦㈧㈨㈩㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃㉄㉅㉆㉇㉈㉉㉊㉋㉌㉍㉎㉏㉐㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉼㉽㉾㉿㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㋌㋍㋎㋏㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾㋿㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡","㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㍻㍼㍽㍾㍿㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㏿㐀㐁㐂㐃㐄㐅㐆㐇㐈㐉㐊㐋㐌㐍㐎㐏㐐㐑㐒㐓㐔㐕㐖㐗㐘㐙㐚㐛㐜㐝㐞㐟㐠㐡","㐢㐣㐤㐥㐦㐧㐨㐩㐪㐫㐬㐭㐮㐯㐰㐱㐲㐳㐴㐵㐶㐷㐸㐹㐺㐻㐼㐽㐾㐿㑀㑁㑂㑃㑄㑅㑆㑇㑈㑉㑊㑋㑌㑍㑎㑏㑐㑑㑒㑓㑔㑕㑖㑗㑘㑙㑚㑛㑜㑝㑞㑟㑠㑡㑢㑣㑤㑥㑦㑧㑨㑩㑪㑫㑬㑭㑮㑯㑰㑱㑲㑳㑴㑵㑶㑷㑸㑹㑺㑻㑼㑽㑾㑿㒀㒁㒂㒃㒄㒅㒆㒇㒈㒉㒊㒋㒌㒍㒎㒏㒐㒑㒒㒓㒔㒕㒖㒗㒘㒙㒚㒛㒜㒝㒞㒟㒠㒡㒢㒣㒤㒥㒦㒧㒨㒩㒪㒫㒬㒭㒮㒯㒰㒱㒲㒳㒴㒵㒶㒷㒸㒹㒺㒻㒼㒽㒾㒿㓀㓁㓂㓃㓄㓅㓆㓇㓈㓉㓊㓋㓌㓍㓎㓏㓐㓑㓒㓓㓔㓕㓖㓗㓘㓙㓚㓛㓜㓝㓞㓟㓠㓡㓢㓣㓤㓥㓦㓧㓨㓩㓪㓫㓬㓭㓮㓯㓰㓱㓲㓳㓴㓵㓶㓷㓸㓹㓺㓻㓼㓽㓾㓿㔀㔁㔂㔃㔄㔅㔆㔇㔈㔉㔊㔋㔌㔍㔎㔏㔐㔑㔒㔓㔔㔕㔖㔗㔘㔙㔚㔛㔜㔝㔞㔟㔠㔡","㔢㔣㔤㔥㔦㔧㔨㔩㔪㔫㔬㔭㔮㔯㔰㔱㔲㔳㔴㔵㔶㔷㔸㔹㔺㔻㔼㔽㔾㔿㕀㕁㕂㕃㕄㕅㕆㕇㕈㕉㕊㕋㕌㕍㕎㕏㕐㕑㕒㕓㕔㕕㕖㕗㕘㕙㕚㕛㕜㕝㕞㕟㕠㕡㕢㕣㕤㕥㕦㕧㕨㕩㕪㕫㕬㕭㕮㕯㕰㕱㕲㕳㕴㕵㕶㕷㕸㕹㕺㕻㕼㕽㕾㕿㖀㖁㖂㖃㖄㖅㖆㖇㖈㖉㖊㖋㖌㖍㖎㖏㖐㖑㖒㖓㖔㖕㖖㖗㖘㖙㖚㖛㖜㖝㖞㖟㖠㖡㖢㖣㖤㖥㖦㖧㖨㖩㖪㖫㖬㖭㖮㖯㖰㖱㖲㖳㖴㖵㖶㖷㖸㖹㖺㖻㖼㖽㖾㖿㗀㗁㗂㗃㗄㗅㗆㗇㗈㗉㗊㗋㗌㗍㗎㗏㗐㗑㗒㗓㗔㗕㗖㗗㗘㗙㗚㗛㗜㗝㗞㗟㗠㗡㗢㗣㗤㗥㗦㗧㗨㗩㗪㗫㗬㗭㗮㗯㗰㗱㗲㗳㗴㗵㗶㗷㗸㗹㗺㗻㗼㗽㗾㗿㘀㘁㘂㘃㘄㘅㘆㘇㘈㘉㘊㘋㘌㘍㘎㘏㘐㘑㘒㘓㘔㘕㘖㘗㘘㘙㘚㘛㘜㘝㘞㘟㘠㘡","㘢㘣㘤㘥㘦㘧㘨㘩㘪㘫㘬㘭㘮㘯㘰㘱㘲㘳㘴㘵㘶㘷㘸㘹㘺㘻㘼㘽㘾㘿㙀㙁㙂㙃㙄㙅㙆㙇㙈㙉㙊㙋㙌㙍㙎㙏㙐㙑㙒㙓㙔㙕㙖㙗㙘㙙㙚㙛㙜㙝㙞㙟㙠㙡㙢㙣㙤㙥㙦㙧㙨㙩㙪㙫㙬㙭㙮㙯㙰㙱㙲㙳㙴㙵㙶㙷㙸㙹㙺㙻㙼㙽㙾㙿㚀㚁㚂㚃㚄㚅㚆㚇㚈㚉㚊㚋㚌㚍㚎㚏㚐㚑㚒㚓㚔㚕㚖㚗㚘㚙㚚㚛㚜㚝㚞㚟㚠㚡㚢㚣㚤㚥㚦㚧㚨㚩㚪㚫㚬㚭㚮㚯㚰㚱㚲㚳㚴㚵㚶㚷㚸㚹㚺㚻㚼㚽㚾㚿㛀㛁㛂㛃㛄㛅㛆㛇㛈㛉㛊㛋㛌㛍㛎㛏㛐㛑㛒㛓㛔㛕㛖㛗㛘㛙㛚㛛㛜㛝㛞㛟㛠㛡㛢㛣㛤㛥㛦㛧㛨㛩㛪㛫㛬㛭㛮㛯㛰㛱㛲㛳㛴㛵㛶㛷㛸㛹㛺㛻㛼㛽㛾㛿㜀㜁㜂㜃㜄㜅㜆㜇㜈㜉㜊㜋㜌㜍㜎㜏㜐㜑㜒㜓㜔㜕㜖㜗㜘㜙㜚㜛㜜㜝㜞㜟㜠㜡","㜢㜣㜤㜥㜦㜧㜨㜩㜪㜫㜬㜭㜮㜯㜰㜱㜲㜳㜴㜵㜶㜷㜸㜹㜺㜻㜼㜽㜾㜿㝀㝁㝂㝃㝄㝅㝆㝇㝈㝉㝊㝋㝌㝍㝎㝏㝐㝑㝒㝓㝔㝕㝖㝗㝘㝙㝚㝛㝜㝝㝞㝟㝠㝡㝢㝣㝤㝥㝦㝧㝨㝩㝪㝫㝬㝭㝮㝯㝰㝱㝲㝳㝴㝵㝶㝷㝸㝹㝺㝻㝼㝽㝾㝿㞀㞁㞂㞃㞄㞅㞆㞇㞈㞉㞊㞋㞌㞍㞎㞏㞐㞑㞒㞓㞔㞕㞖㞗㞘㞙㞚㞛㞜㞝㞞㞟㞠㞡㞢㞣㞤㞥㞦㞧㞨㞩㞪㞫㞬㞭㞮㞯㞰㞱㞲㞳㞴㞵㞶㞷㞸㞹㞺㞻㞼㞽㞾㞿㟀㟁㟂㟃㟄㟅㟆㟇㟈㟉㟊㟋㟌㟍㟎㟏㟐㟑㟒㟓㟔㟕㟖㟗㟘㟙㟚㟛㟜㟝㟞㟟㟠㟡㟢㟣㟤㟥㟦㟧㟨㟩㟪㟫㟬㟭㟮㟯㟰㟱㟲㟳㟴㟵㟶㟷㟸㟹㟺㟻㟼㟽㟾㟿㠀㠁㠂㠃㠄㠅㠆㠇㠈㠉㠊㠋㠌㠍㠎㠏㠐㠑㠒㠓㠔㠕㠖㠗㠘㠙㠚㠛㠜㠝㠞㠟㠠㠡","㠢㠣㠤㠥㠦㠧㠨㠩㠪㠫㠬㠭㠮㠯㠰㠱㠲㠳㠴㠵㠶㠷㠸㠹㠺㠻㠼㠽㠾㠿㡀㡁㡂㡃㡄㡅㡆㡇㡈㡉㡊㡋㡌㡍㡎㡏㡐㡑㡒㡓㡔㡕㡖㡗㡘㡙㡚㡛㡜㡝㡞㡟㡠㡡㡢㡣㡤㡥㡦㡧㡨㡩㡪㡫㡬㡭㡮㡯㡰㡱㡲㡳㡴㡵㡶㡷㡸㡹㡺㡻㡼㡽㡾㡿㢀㢁㢂㢃㢄㢅㢆㢇㢈㢉㢊㢋㢌㢍㢎㢏㢐㢑㢒㢓㢔㢕㢖㢗㢘㢙㢚㢛㢜㢝㢞㢟㢠㢡㢢㢣㢤㢥㢦㢧㢨㢩㢪㢫㢬㢭㢮㢯㢰㢱㢲㢳㢴㢵㢶㢷㢸㢹㢺㢻㢼㢽㢾㢿㣀㣁㣂㣃㣄㣅㣆㣇㣈㣉㣊㣋㣌㣍㣎㣏㣐㣑㣒㣓㣔㣕㣖㣗㣘㣙㣚㣛㣜㣝㣞㣟㣠㣡㣢㣣㣤㣥㣦㣧㣨㣩㣪㣫㣬㣭㣮㣯㣰㣱㣲㣳㣴㣵㣶㣷㣸㣹㣺㣻㣼㣽㣾㣿㤀㤁㤂㤃㤄㤅㤆㤇㤈㤉㤊㤋㤌㤍㤎㤏㤐㤑㤒㤓㤔㤕㤖㤗㤘㤙㤚㤛㤜㤝㤞㤟㤠㤡","㤢㤣㤤㤥㤦㤧㤨㤩㤪㤫㤬㤭㤮㤯㤰㤱㤲㤳㤴㤵㤶㤷㤸㤹㤺㤻㤼㤽㤾㤿㥀㥁㥂㥃㥄㥅㥆㥇㥈㥉㥊㥋㥌㥍㥎㥏㥐㥑㥒㥓㥔㥕㥖㥗㥘㥙㥚㥛㥜㥝㥞㥟㥠㥡㥢㥣㥤㥥㥦㥧㥨㥩㥪㥫㥬㥭㥮㥯㥰㥱㥲㥳㥴㥵㥶㥷㥸㥹㥺㥻㥼㥽㥾㥿㦀㦁㦂㦃㦄㦅㦆㦇㦈㦉㦊㦋㦌㦍㦎㦏㦐㦑㦒㦓㦔㦕㦖㦗㦘㦙㦚㦛㦜㦝㦞㦟㦠㦡㦢㦣㦤㦥㦦㦧㦨㦩㦪㦫㦬㦭㦮㦯㦰㦱㦲㦳㦴㦵㦶㦷㦸㦹㦺㦻㦼㦽㦾㦿㧀㧁㧂㧃㧄㧅㧆㧇㧈㧉㧊㧋㧌㧍㧎㧏㧐㧑㧒㧓㧔㧕㧖㧗㧘㧙㧚㧛㧜㧝㧞㧟㧠㧡㧢㧣㧤㧥㧦㧧㧨㧩㧪㧫㧬㧭㧮㧯㧰㧱㧲㧳㧴㧵㧶㧷㧸㧹㧺㧻㧼㧽㧾㧿㨀㨁㨂㨃㨄㨅㨆㨇㨈㨉㨊㨋㨌㨍㨎㨏㨐㨑㨒㨓㨔㨕㨖㨗㨘㨙㨚㨛㨜㨝㨞㨟㨠㨡","㨢㨣㨤㨥㨦㨧㨨㨩㨪㨫㨬㨭㨮㨯㨰㨱㨲㨳㨴㨵㨶㨷㨸㨹㨺㨻㨼㨽㨾㨿㩀㩁㩂㩃㩄㩅㩆㩇㩈㩉㩊㩋㩌㩍㩎㩏㩐㩑㩒㩓㩔㩕㩖㩗㩘㩙㩚㩛㩜㩝㩞㩟㩠㩡㩢㩣㩤㩥㩦㩧㩨㩩㩪㩫㩬㩭㩮㩯㩰㩱㩲㩳㩴㩵㩶㩷㩸㩹㩺㩻㩼㩽㩾㩿㪀㪁㪂㪃㪄㪅㪆㪇㪈㪉㪊㪋㪌㪍㪎㪏㪐㪑㪒㪓㪔㪕㪖㪗㪘㪙㪚㪛㪜㪝㪞㪟㪠㪡㪢㪣㪤㪥㪦㪧㪨㪩㪪㪫㪬㪭㪮㪯㪰㪱㪲㪳㪴㪵㪶㪷㪸㪹㪺㪻㪼㪽㪾㪿㫀㫁㫂㫃㫄㫅㫆㫇㫈㫉㫊㫋㫌㫍㫎㫏㫐㫑㫒㫓㫔㫕㫖㫗㫘㫙㫚㫛㫜㫝㫞㫟㫠㫡㫢㫣㫤㫥㫦㫧㫨㫩㫪㫫㫬㫭㫮㫯㫰㫱㫲㫳㫴㫵㫶㫷㫸㫹㫺㫻㫼㫽㫾㫿㬀㬁㬂㬃㬄㬅㬆㬇㬈㬉㬊㬋㬌㬍㬎㬏㬐㬑㬒㬓㬔㬕㬖㬗㬘㬙㬚㬛㬜㬝㬞㬟㬠㬡","㬢㬣㬤㬥㬦㬧㬨㬩㬪㬫㬬㬭㬮㬯㬰㬱㬲㬳㬴㬵㬶㬷㬸㬹㬺㬻㬼㬽㬾㬿㭀㭁㭂㭃㭄㭅㭆㭇㭈㭉㭊㭋㭌㭍㭎㭏㭐㭑㭒㭓㭔㭕㭖㭗㭘㭙㭚㭛㭜㭝㭞㭟㭠㭡㭢㭣㭤㭥㭦㭧㭨㭩㭪㭫㭬㭭㭮㭯㭰㭱㭲㭳㭴㭵㭶㭷㭸㭹㭺㭻㭼㭽㭾㭿㮀㮁㮂㮃㮄㮅㮆㮇㮈㮉㮊㮋㮌㮍㮎㮏㮐㮑㮒㮓㮔㮕㮖㮗㮘㮙㮚㮛㮜㮝㮞㮟㮠㮡㮢㮣㮤㮥㮦㮧㮨㮩㮪㮫㮬㮭㮮㮯㮰㮱㮲㮳㮴㮵㮶㮷㮸㮹㮺㮻㮼㮽㮾㮿㯀㯁㯂㯃㯄㯅㯆㯇㯈㯉㯊㯋㯌㯍㯎㯏㯐㯑㯒㯓㯔㯕㯖㯗㯘㯙㯚㯛㯜㯝㯞㯟㯠㯡㯢㯣㯤㯥㯦㯧㯨㯩㯪㯫㯬㯭㯮㯯㯰㯱㯲㯳㯴㯵㯶㯷㯸㯹㯺㯻㯼㯽㯾㯿㰀㰁㰂㰃㰄㰅㰆㰇㰈㰉㰊㰋㰌㰍㰎㰏㰐㰑㰒㰓㰔㰕㰖㰗㰘㰙㰚㰛㰜㰝㰞㰟㰠㰡","㰢㰣㰤㰥㰦㰧㰨㰩㰪㰫㰬㰭㰮㰯㰰㰱㰲㰳㰴㰵㰶㰷㰸㰹㰺㰻㰼㰽㰾㰿㱀㱁㱂㱃㱄㱅㱆㱇㱈㱉㱊㱋㱌㱍㱎㱏㱐㱑㱒㱓㱔㱕㱖㱗㱘㱙㱚㱛㱜㱝㱞㱟㱠㱡㱢㱣㱤㱥㱦㱧㱨㱩㱪㱫㱬㱭㱮㱯㱰㱱㱲㱳㱴㱵㱶㱷㱸㱹㱺㱻㱼㱽㱾㱿㲀㲁㲂㲃㲄㲅㲆㲇㲈㲉㲊㲋㲌㲍㲎㲏㲐㲑㲒㲓㲔㲕㲖㲗㲘㲙㲚㲛㲜㲝㲞㲟㲠㲡㲢㲣㲤㲥㲦㲧㲨㲩㲪㲫㲬㲭㲮㲯㲰㲱㲲㲳㲴㲵㲶㲷㲸㲹㲺㲻㲼㲽㲾㲿㳀㳁㳂㳃㳄㳅㳆㳇㳈㳉㳊㳋㳌㳍㳎㳏㳐㳑㳒㳓㳔㳕㳖㳗㳘㳙㳚㳛㳜㳝㳞㳟㳠㳡㳢㳣㳤㳥㳦㳧㳨㳩㳪㳫㳬㳭㳮㳯㳰㳱㳲㳳㳴㳵㳶㳷㳸㳹㳺㳻㳼㳽㳾㳿㴀㴁㴂㴃㴄㴅㴆㴇㴈㴉㴊㴋㴌㴍㴎㴏㴐㴑㴒㴓㴔㴕㴖㴗㴘㴙㴚㴛㴜㴝㴞㴟㴠㴡","㴢㴣㴤㴥㴦㴧㴨㴩㴪㴫㴬㴭㴮㴯㴰㴱㴲㴳㴴㴵㴶㴷㴸㴹㴺㴻㴼㴽㴾㴿㵀㵁㵂㵃㵄㵅㵆㵇㵈㵉㵊㵋㵌㵍㵎㵏㵐㵑㵒㵓㵔㵕㵖㵗㵘㵙㵚㵛㵜㵝㵞㵟㵠㵡㵢㵣㵤㵥㵦㵧㵨㵩㵪㵫㵬㵭㵮㵯㵰㵱㵲㵳㵴㵵㵶㵷㵸㵹㵺㵻㵼㵽㵾㵿㶀㶁㶂㶃㶄㶅㶆㶇㶈㶉㶊㶋㶌㶍㶎㶏㶐㶑㶒㶓㶔㶕㶖㶗㶘㶙㶚㶛㶜㶝㶞㶟㶠㶡㶢㶣㶤㶥㶦㶧㶨㶩㶪㶫㶬㶭㶮㶯㶰㶱㶲㶳㶴㶵㶶㶷㶸㶹㶺㶻㶼㶽㶾㶿㷀㷁㷂㷃㷄㷅㷆㷇㷈㷉㷊㷋㷌㷍㷎㷏㷐㷑㷒㷓㷔㷕㷖㷗㷘㷙㷚㷛㷜㷝㷞㷟㷠㷡㷢㷣㷤㷥㷦㷧㷨㷩㷪㷫㷬㷭㷮㷯㷰㷱㷲㷳㷴㷵㷶㷷㷸㷹㷺㷻㷼㷽㷾㷿㸀㸁㸂㸃㸄㸅㸆㸇㸈㸉㸊㸋㸌㸍㸎㸏㸐㸑㸒㸓㸔㸕㸖㸗㸘㸙㸚㸛㸜㸝㸞㸟㸠㸡","㸢㸣㸤㸥㸦㸧㸨㸩㸪㸫㸬㸭㸮㸯㸰㸱㸲㸳㸴㸵㸶㸷㸸㸹㸺㸻㸼㸽㸾㸿㹀㹁㹂㹃㹄㹅㹆㹇㹈㹉㹊㹋㹌㹍㹎㹏㹐㹑㹒㹓㹔㹕㹖㹗㹘㹙㹚㹛㹜㹝㹞㹟㹠㹡㹢㹣㹤㹥㹦㹧㹨㹩㹪㹫㹬㹭㹮㹯㹰㹱㹲㹳㹴㹵㹶㹷㹸㹹㹺㹻㹼㹽㹾㹿㺀㺁㺂㺃㺄㺅㺆㺇㺈㺉㺊㺋㺌㺍㺎㺏㺐㺑㺒㺓㺔㺕㺖㺗㺘㺙㺚㺛㺜㺝㺞㺟㺠㺡㺢㺣㺤㺥㺦㺧㺨㺩㺪㺫㺬㺭㺮㺯㺰㺱㺲㺳㺴㺵㺶㺷㺸㺹㺺㺻㺼㺽㺾㺿㻀㻁㻂㻃㻄㻅㻆㻇㻈㻉㻊㻋㻌㻍㻎㻏㻐㻑㻒㻓㻔㻕㻖㻗㻘㻙㻚㻛㻜㻝㻞㻟㻠㻡㻢㻣㻤㻥㻦㻧㻨㻩㻪㻫㻬㻭㻮㻯㻰㻱㻲㻳㻴㻵㻶㻷㻸㻹㻺㻻㻼㻽㻾㻿㼀㼁㼂㼃㼄㼅㼆㼇㼈㼉㼊㼋㼌㼍㼎㼏㼐㼑㼒㼓㼔㼕㼖㼗㼘㼙㼚㼛㼜㼝㼞㼟㼠㼡","㼢㼣㼤㼥㼦㼧㼨㼩㼪㼫㼬㼭㼮㼯㼰㼱㼲㼳㼴㼵㼶㼷㼸㼹㼺㼻㼼㼽㼾㼿㽀㽁㽂㽃㽄㽅㽆㽇㽈㽉㽊㽋㽌㽍㽎㽏㽐㽑㽒㽓㽔㽕㽖㽗㽘㽙㽚㽛㽜㽝㽞㽟㽠㽡㽢㽣㽤㽥㽦㽧㽨㽩㽪㽫㽬㽭㽮㽯㽰㽱㽲㽳㽴㽵㽶㽷㽸㽹㽺㽻㽼㽽㽾㽿㾀㾁㾂㾃㾄㾅㾆㾇㾈㾉㾊㾋㾌㾍㾎㾏㾐㾑㾒㾓㾔㾕㾖㾗㾘㾙㾚㾛㾜㾝㾞㾟㾠㾡㾢㾣㾤㾥㾦㾧㾨㾩㾪㾫㾬㾭㾮㾯㾰㾱㾲㾳㾴㾵㾶㾷㾸㾹㾺㾻㾼㾽㾾㾿㿀㿁㿂㿃㿄㿅㿆㿇㿈㿉㿊㿋㿌㿍㿎㿏㿐㿑㿒㿓㿔㿕㿖㿗㿘㿙㿚㿛㿜㿝㿞㿟㿠㿡㿢㿣㿤㿥㿦㿧㿨㿩㿪㿫㿬㿭㿮㿯㿰㿱㿲㿳㿴㿵㿶㿷㿸㿹㿺㿻㿼㿽㿾㿿䀀䀁䀂䀃䀄䀅䀆䀇䀈䀉䀊䀋䀌䀍䀎䀏䀐䀑䀒䀓䀔䀕䀖䀗䀘䀙䀚䀛䀜䀝䀞䀟䀠䀡","䀢䀣䀤䀥䀦䀧䀨䀩䀪䀫䀬䀭䀮䀯䀰䀱䀲䀳䀴䀵䀶䀷䀸䀹䀺䀻䀼䀽䀾䀿䁀䁁䁂䁃䁄䁅䁆䁇䁈䁉䁊䁋䁌䁍䁎䁏䁐䁑䁒䁓䁔䁕䁖䁗䁘䁙䁚䁛䁜䁝䁞䁟䁠䁡䁢䁣䁤䁥䁦䁧䁨䁩䁪䁫䁬䁭䁮䁯䁰䁱䁲䁳䁴䁵䁶䁷䁸䁹䁺䁻䁼䁽䁾䁿䂀䂁䂂䂃䂄䂅䂆䂇䂈䂉䂊䂋䂌䂍䂎䂏䂐䂑䂒䂓䂔䂕䂖䂗䂘䂙䂚䂛䂜䂝䂞䂟䂠䂡䂢䂣䂤䂥䂦䂧䂨䂩䂪䂫䂬䂭䂮䂯䂰䂱䂲䂳䂴䂵䂶䂷䂸䂹䂺䂻䂼䂽䂾䂿䃀䃁䃂䃃䃄䃅䃆䃇䃈䃉䃊䃋䃌䃍䃎䃏䃐䃑䃒䃓䃔䃕䃖䃗䃘䃙䃚䃛䃜䃝䃞䃟䃠䃡䃢䃣䃤䃥䃦䃧䃨䃩䃪䃫䃬䃭䃮䃯䃰䃱䃲䃳䃴䃵䃶䃷䃸䃹䃺䃻䃼䃽䃾䃿䄀䄁䄂䄃䄄䄅䄆䄇䄈䄉䄊䄋䄌䄍䄎䄏䄐䄑䄒䄓䄔䄕䄖䄗䄘䄙䄚䄛䄜䄝䄞䄟䄠䄡","䄢䄣䄤䄥䄦䄧䄨䄩䄪䄫䄬䄭䄮䄯䄰䄱䄲䄳䄴䄵䄶䄷䄸䄹䄺䄻䄼䄽䄾䄿䅀䅁䅂䅃䅄䅅䅆䅇䅈䅉䅊䅋䅌䅍䅎䅏䅐䅑䅒䅓䅔䅕䅖䅗䅘䅙䅚䅛䅜䅝䅞䅟䅠䅡䅢䅣䅤䅥䅦䅧䅨䅩䅪䅫䅬䅭䅮䅯䅰䅱䅲䅳䅴䅵䅶䅷䅸䅹䅺䅻䅼䅽䅾䅿䆀䆁䆂䆃䆄䆅䆆䆇䆈䆉䆊䆋䆌䆍䆎䆏䆐䆑䆒䆓䆔䆕䆖䆗䆘䆙䆚䆛䆜䆝䆞䆟䆠䆡䆢䆣䆤䆥䆦䆧䆨䆩䆪䆫䆬䆭䆮䆯䆰䆱䆲䆳䆴䆵䆶䆷䆸䆹䆺䆻䆼䆽䆾䆿䇀䇁䇂䇃䇄䇅䇆䇇䇈䇉䇊䇋䇌䇍䇎䇏䇐䇑䇒䇓䇔䇕䇖䇗䇘䇙䇚䇛䇜䇝䇞䇟䇠䇡䇢䇣䇤䇥䇦䇧䇨䇩䇪䇫䇬䇭䇮䇯䇰䇱䇲䇳䇴䇵䇶䇷䇸䇹䇺䇻䇼䇽䇾䇿䈀䈁䈂䈃䈄䈅䈆䈇䈈䈉䈊䈋䈌䈍䈎䈏䈐䈑䈒䈓䈔䈕䈖䈗䈘䈙䈚䈛䈜䈝䈞䈟䈠䈡","䈢䈣䈤䈥䈦䈧䈨䈩䈪䈫䈬䈭䈮䈯䈰䈱䈲䈳䈴䈵䈶䈷䈸䈹䈺䈻䈼䈽䈾䈿䉀䉁䉂䉃䉄䉅䉆䉇䉈䉉䉊䉋䉌䉍䉎䉏䉐䉑䉒䉓䉔䉕䉖䉗䉘䉙䉚䉛䉜䉝䉞䉟䉠䉡䉢䉣䉤䉥䉦䉧䉨䉩䉪䉫䉬䉭䉮䉯䉰䉱䉲䉳䉴䉵䉶䉷䉸䉹䉺䉻䉼䉽䉾䉿䊀䊁䊂䊃䊄䊅䊆䊇䊈䊉䊊䊋䊌䊍䊎䊏䊐䊑䊒䊓䊔䊕䊖䊗䊘䊙䊚䊛䊜䊝䊞䊟䊠䊡䊢䊣䊤䊥䊦䊧䊨䊩䊪䊫䊬䊭䊮䊯䊰䊱䊲䊳䊴䊵䊶䊷䊸䊹䊺䊻䊼䊽䊾䊿䋀䋁䋂䋃䋄䋅䋆䋇䋈䋉䋊䋋䋌䋍䋎䋏䋐䋑䋒䋓䋔䋕䋖䋗䋘䋙䋚䋛䋜䋝䋞䋟䋠䋡䋢䋣䋤䋥䋦䋧䋨䋩䋪䋫䋬䋭䋮䋯䋰䋱䋲䋳䋴䋵䋶䋷䋸䋹䋺䋻䋼䋽䋾䋿䌀䌁䌂䌃䌄䌅䌆䌇䌈䌉䌊䌋䌌䌍䌎䌏䌐䌑䌒䌓䌔䌕䌖䌗䌘䌙䌚䌛䌜䌝䌞䌟䌠䌡","䌢䌣䌤䌥䌦䌧䌨䌩䌪䌫䌬䌭䌮䌯䌰䌱䌲䌳䌴䌵䌶䌷䌸䌹䌺䌻䌼䌽䌾䌿䍀䍁䍂䍃䍄䍅䍆䍇䍈䍉䍊䍋䍌䍍䍎䍏䍐䍑䍒䍓䍔䍕䍖䍗䍘䍙䍚䍛䍜䍝䍞䍟䍠䍡䍢䍣䍤䍥䍦䍧䍨䍩䍪䍫䍬䍭䍮䍯䍰䍱䍲䍳䍴䍵䍶䍷䍸䍹䍺䍻䍼䍽䍾䍿䎀䎁䎂䎃䎄䎅䎆䎇䎈䎉䎊䎋䎌䎍䎎䎏䎐䎑䎒䎓䎔䎕䎖䎗䎘䎙䎚䎛䎜䎝䎞䎟䎠䎡䎢䎣䎤䎥䎦䎧䎨䎩䎪䎫䎬䎭䎮䎯䎰䎱䎲䎳䎴䎵䎶䎷䎸䎹䎺䎻䎼䎽䎾䎿䏀䏁䏂䏃䏄䏅䏆䏇䏈䏉䏊䏋䏌䏍䏎䏏䏐䏑䏒䏓䏔䏕䏖䏗䏘䏙䏚䏛䏜䏝䏞䏟䏠䏡䏢䏣䏤䏥䏦䏧䏨䏩䏪䏫䏬䏭䏮䏯䏰䏱䏲䏳䏴䏵䏶䏷䏸䏹䏺䏻䏼䏽䏾䏿䐀䐁䐂䐃䐄䐅䐆䐇䐈䐉䐊䐋䐌䐍䐎䐏䐐䐑䐒䐓䐔䐕䐖䐗䐘䐙䐚䐛䐜䐝䐞䐟䐠䐡","䐢䐣䐤䐥䐦䐧䐨䐩䐪䐫䐬䐭䐮䐯䐰䐱䐲䐳䐴䐵䐶䐷䐸䐹䐺䐻䐼䐽䐾䐿䑀䑁䑂䑃䑄䑅䑆䑇䑈䑉䑊䑋䑌䑍䑎䑏䑐䑑䑒䑓䑔䑕䑖䑗䑘䑙䑚䑛䑜䑝䑞䑟䑠䑡䑢䑣䑤䑥䑦䑧䑨䑩䑪䑫䑬䑭䑮䑯䑰䑱䑲䑳䑴䑵䑶䑷䑸䑹䑺䑻䑼䑽䑾䑿䒀䒁䒂䒃䒄䒅䒆䒇䒈䒉䒊䒋䒌䒍䒎䒏䒐䒑䒒䒓䒔䒕䒖䒗䒘䒙䒚䒛䒜䒝䒞䒟䒠䒡䒢䒣䒤䒥䒦䒧䒨䒩䒪䒫䒬䒭䒮䒯䒰䒱䒲䒳䒴䒵䒶䒷䒸䒹䒺䒻䒼䒽䒾䒿䓀䓁䓂䓃䓄䓅䓆䓇䓈䓉䓊䓋䓌䓍䓎䓏䓐䓑䓒䓓䓔䓕䓖䓗䓘䓙䓚䓛䓜䓝䓞䓟䓠䓡䓢䓣䓤䓥䓦䓧䓨䓩䓪䓫䓬䓭䓮䓯䓰䓱䓲䓳䓴䓵䓶䓷䓸䓹䓺䓻䓼䓽䓾䓿䔀䔁䔂䔃䔄䔅䔆䔇䔈䔉䔊䔋䔌䔍䔎䔏䔐䔑䔒䔓䔔䔕䔖䔗䔘䔙䔚䔛䔜䔝䔞䔟䔠䔡","䔢䔣䔤䔥䔦䔧䔨䔩䔪䔫䔬䔭䔮䔯䔰䔱䔲䔳䔴䔵䔶䔷䔸䔹䔺䔻䔼䔽䔾䔿䕀䕁䕂䕃䕄䕅䕆䕇䕈䕉䕊䕋䕌䕍䕎䕏䕐䕑䕒䕓䕔䕕䕖䕗䕘䕙䕚䕛䕜䕝䕞䕟䕠䕡䕢䕣䕤䕥䕦䕧䕨䕩䕪䕫䕬䕭䕮䕯䕰䕱䕲䕳䕴䕵䕶䕷䕸䕹䕺䕻䕼䕽䕾䕿䖀䖁䖂䖃䖄䖅䖆䖇䖈䖉䖊䖋䖌䖍䖎䖏䖐䖑䖒䖓䖔䖕䖖䖗䖘䖙䖚䖛䖜䖝䖞䖟䖠䖡䖢䖣䖤䖥䖦䖧䖨䖩䖪䖫䖬䖭䖮䖯䖰䖱䖲䖳䖴䖵䖶䖷䖸䖹䖺䖻䖼䖽䖾䖿䗀䗁䗂䗃䗄䗅䗆䗇䗈䗉䗊䗋䗌䗍䗎䗏䗐䗑䗒䗓䗔䗕䗖䗗䗘䗙䗚䗛䗜䗝䗞䗟䗠䗡䗢䗣䗤䗥䗦䗧䗨䗩䗪䗫䗬䗭䗮䗯䗰䗱䗲䗳䗴䗵䗶䗷䗸䗹䗺䗻䗼䗽䗾䗿䘀䘁䘂䘃䘄䘅䘆䘇䘈䘉䘊䘋䘌䘍䘎䘏䘐䘑䘒䘓䘔䘕䘖䘗䘘䘙䘚䘛䘜䘝䘞䘟䘠䘡","䘢䘣䘤䘥䘦䘧䘨䘩䘪䘫䘬䘭䘮䘯䘰䘱䘲䘳䘴䘵䘶䘷䘸䘹䘺䘻䘼䘽䘾䘿䙀䙁䙂䙃䙄䙅䙆䙇䙈䙉䙊䙋䙌䙍䙎䙏䙐䙑䙒䙓䙔䙕䙖䙗䙘䙙䙚䙛䙜䙝䙞䙟䙠䙡䙢䙣䙤䙥䙦䙧䙨䙩䙪䙫䙬䙭䙮䙯䙰䙱䙲䙳䙴䙵䙶䙷䙸䙹䙺䙻䙼䙽䙾䙿䚀䚁䚂䚃䚄䚅䚆䚇䚈䚉䚊䚋䚌䚍䚎䚏䚐䚑䚒䚓䚔䚕䚖䚗䚘䚙䚚䚛䚜䚝䚞䚟䚠䚡䚢䚣䚤䚥䚦䚧䚨䚩䚪䚫䚬䚭䚮䚯䚰䚱䚲䚳䚴䚵䚶䚷䚸䚹䚺䚻䚼䚽䚾䚿䛀䛁䛂䛃䛄䛅䛆䛇䛈䛉䛊䛋䛌䛍䛎䛏䛐䛑䛒䛓䛔䛕䛖䛗䛘䛙䛚䛛䛜䛝䛞䛟䛠䛡䛢䛣䛤䛥䛦䛧䛨䛩䛪䛫䛬䛭䛮䛯䛰䛱䛲䛳䛴䛵䛶䛷䛸䛹䛺䛻䛼䛽䛾䛿䜀䜁䜂䜃䜄䜅䜆䜇䜈䜉䜊䜋䜌䜍䜎䜏䜐䜑䜒䜓䜔䜕䜖䜗䜘䜙䜚䜛䜜䜝䜞䜟䜠䜡","䜢䜣䜤䜥䜦䜧䜨䜩䜪䜫䜬䜭䜮䜯䜰䜱䜲䜳䜴䜵䜶䜷䜸䜹䜺䜻䜼䜽䜾䜿䝀䝁䝂䝃䝄䝅䝆䝇䝈䝉䝊䝋䝌䝍䝎䝏䝐䝑䝒䝓䝔䝕䝖䝗䝘䝙䝚䝛䝜䝝䝞䝟䝠䝡䝢䝣䝤䝥䝦䝧䝨䝩䝪䝫䝬䝭䝮䝯䝰䝱䝲䝳䝴䝵䝶䝷䝸䝹䝺䝻䝼䝽䝾䝿䞀䞁䞂䞃䞄䞅䞆䞇䞈䞉䞊䞋䞌䞍䞎䞏䞐䞑䞒䞓䞔䞕䞖䞗䞘䞙䞚䞛䞜䞝䞞䞟䞠䞡䞢䞣䞤䞥䞦䞧䞨䞩䞪䞫䞬䞭䞮䞯䞰䞱䞲䞳䞴䞵䞶䞷䞸䞹䞺䞻䞼䞽䞾䞿䟀䟁䟂䟃䟄䟅䟆䟇䟈䟉䟊䟋䟌䟍䟎䟏䟐䟑䟒䟓䟔䟕䟖䟗䟘䟙䟚䟛䟜䟝䟞䟟䟠䟡䟢䟣䟤䟥䟦䟧䟨䟩䟪䟫䟬䟭䟮䟯䟰䟱䟲䟳䟴䟵䟶䟷䟸䟹䟺䟻䟼䟽䟾䟿䠀䠁䠂䠃䠄䠅䠆䠇䠈䠉䠊䠋䠌䠍䠎䠏䠐䠑䠒䠓䠔䠕䠖䠗䠘䠙䠚䠛䠜䠝䠞䠟䠠䠡","䠢䠣䠤䠥䠦䠧䠨䠩䠪䠫䠬䠭䠮䠯䠰䠱䠲䠳䠴䠵䠶䠷䠸䠹䠺䠻䠼䠽䠾䠿䡀䡁䡂䡃䡄䡅䡆䡇䡈䡉䡊䡋䡌䡍䡎䡏䡐䡑䡒䡓䡔䡕䡖䡗䡘䡙䡚䡛䡜䡝䡞䡟䡠䡡䡢䡣䡤䡥䡦䡧䡨䡩䡪䡫䡬䡭䡮䡯䡰䡱䡲䡳䡴䡵䡶䡷䡸䡹䡺䡻䡼䡽䡾䡿䢀䢁䢂䢃䢄䢅䢆䢇䢈䢉䢊䢋䢌䢍䢎䢏䢐䢑䢒䢓䢔䢕䢖䢗䢘䢙䢚䢛䢜䢝䢞䢟䢠䢡䢢䢣䢤䢥䢦䢧䢨䢩䢪䢫䢬䢭䢮䢯䢰䢱䢲䢳䢴䢵䢶䢷䢸䢹䢺䢻䢼䢽䢾䢿䣀䣁䣂䣃䣄䣅䣆䣇䣈䣉䣊䣋䣌䣍䣎䣏䣐䣑䣒䣓䣔䣕䣖䣗䣘䣙䣚䣛䣜䣝䣞䣟䣠䣡䣢䣣䣤䣥䣦䣧䣨䣩䣪䣫䣬䣭䣮䣯䣰䣱䣲䣳䣴䣵䣶䣷䣸䣹䣺䣻䣼䣽䣾䣿䤀䤁䤂䤃䤄䤅䤆䤇䤈䤉䤊䤋䤌䤍䤎䤏䤐䤑䤒䤓䤔䤕䤖䤗䤘䤙䤚䤛䤜䤝䤞䤟䤠䤡","䤢䤣䤤䤥䤦䤧䤨䤩䤪䤫䤬䤭䤮䤯䤰䤱䤲䤳䤴䤵䤶䤷䤸䤹䤺䤻䤼䤽䤾䤿䥀䥁䥂䥃䥄䥅䥆䥇䥈䥉䥊䥋䥌䥍䥎䥏䥐䥑䥒䥓䥔䥕䥖䥗䥘䥙䥚䥛䥜䥝䥞䥟䥠䥡䥢䥣䥤䥥䥦䥧䥨䥩䥪䥫䥬䥭䥮䥯䥰䥱䥲䥳䥴䥵䥶䥷䥸䥹䥺䥻䥼䥽䥾䥿䦀䦁䦂䦃䦄䦅䦆䦇䦈䦉䦊䦋䦌䦍䦎䦏䦐䦑䦒䦓䦔䦕䦖䦗䦘䦙䦚䦛䦜䦝䦞䦟䦠䦡䦢䦣䦤䦥䦦䦧䦨䦩䦪䦫䦬䦭䦮䦯䦰䦱䦲䦳䦴䦵䦶䦷䦸䦹䦺䦻䦼䦽䦾䦿䧀䧁䧂䧃䧄䧅䧆䧇䧈䧉䧊䧋䧌䧍䧎䧏䧐䧑䧒䧓䧔䧕䧖䧗䧘䧙䧚䧛䧜䧝䧞䧟䧠䧡䧢䧣䧤䧥䧦䧧䧨䧩䧪䧫䧬䧭䧮䧯䧰䧱䧲䧳䧴䧵䧶䧷䧸䧹䧺䧻䧼䧽䧾䧿䨀䨁䨂䨃䨄䨅䨆䨇䨈䨉䨊䨋䨌䨍䨎䨏䨐䨑䨒䨓䨔䨕䨖䨗䨘䨙䨚䨛䨜䨝䨞䨟䨠䨡","䨢䨣䨤䨥䨦䨧䨨䨩䨪䨫䨬䨭䨮䨯䨰䨱䨲䨳䨴䨵䨶䨷䨸䨹䨺䨻䨼䨽䨾䨿䩀䩁䩂䩃䩄䩅䩆䩇䩈䩉䩊䩋䩌䩍䩎䩏䩐䩑䩒䩓䩔䩕䩖䩗䩘䩙䩚䩛䩜䩝䩞䩟䩠䩡䩢䩣䩤䩥䩦䩧䩨䩩䩪䩫䩬䩭䩮䩯䩰䩱䩲䩳䩴䩵䩶䩷䩸䩹䩺䩻䩼䩽䩾䩿䪀䪁䪂䪃䪄䪅䪆䪇䪈䪉䪊䪋䪌䪍䪎䪏䪐䪑䪒䪓䪔䪕䪖䪗䪘䪙䪚䪛䪜䪝䪞䪟䪠䪡䪢䪣䪤䪥䪦䪧䪨䪩䪪䪫䪬䪭䪮䪯䪰䪱䪲䪳䪴䪵䪶䪷䪸䪹䪺䪻䪼䪽䪾䪿䫀䫁䫂䫃䫄䫅䫆䫇䫈䫉䫊䫋䫌䫍䫎䫏䫐䫑䫒䫓䫔䫕䫖䫗䫘䫙䫚䫛䫜䫝䫞䫟䫠䫡䫢䫣䫤䫥䫦䫧䫨䫩䫪䫫䫬䫭䫮䫯䫰䫱䫲䫳䫴䫵䫶䫷䫸䫹䫺䫻䫼䫽䫾䫿䬀䬁䬂䬃䬄䬅䬆䬇䬈䬉䬊䬋䬌䬍䬎䬏䬐䬑䬒䬓䬔䬕䬖䬗䬘䬙䬚䬛䬜䬝䬞䬟䬠䬡","䬢䬣䬤䬥䬦䬧䬨䬩䬪䬫䬬䬭䬮䬯䬰䬱䬲䬳䬴䬵䬶䬷䬸䬹䬺䬻䬼䬽䬾䬿䭀䭁䭂䭃䭄䭅䭆䭇䭈䭉䭊䭋䭌䭍䭎䭏䭐䭑䭒䭓䭔䭕䭖䭗䭘䭙䭚䭛䭜䭝䭞䭟䭠䭡䭢䭣䭤䭥䭦䭧䭨䭩䭪䭫䭬䭭䭮䭯䭰䭱䭲䭳䭴䭵䭶䭷䭸䭹䭺䭻䭼䭽䭾䭿䮀䮁䮂䮃䮄䮅䮆䮇䮈䮉䮊䮋䮌䮍䮎䮏䮐䮑䮒䮓䮔䮕䮖䮗䮘䮙䮚䮛䮜䮝䮞䮟䮠䮡䮢䮣䮤䮥䮦䮧䮨䮩䮪䮫䮬䮭䮮䮯䮰䮱䮲䮳䮴䮵䮶䮷䮸䮹䮺䮻䮼䮽䮾䮿䯀䯁䯂䯃䯄䯅䯆䯇䯈䯉䯊䯋䯌䯍䯎䯏䯐䯑䯒䯓䯔䯕䯖䯗䯘䯙䯚䯛䯜䯝䯞䯟䯠䯡䯢䯣䯤䯥䯦䯧䯨䯩䯪䯫䯬䯭䯮䯯䯰䯱䯲䯳䯴䯵䯶䯷䯸䯹䯺䯻䯼䯽䯾䯿䰀䰁䰂䰃䰄䰅䰆䰇䰈䰉䰊䰋䰌䰍䰎䰏䰐䰑䰒䰓䰔䰕䰖䰗䰘䰙䰚䰛䰜䰝䰞䰟䰠䰡","䰢䰣䰤䰥䰦䰧䰨䰩䰪䰫䰬䰭䰮䰯䰰䰱䰲䰳䰴䰵䰶䰷䰸䰹䰺䰻䰼䰽䰾䰿䱀䱁䱂䱃䱄䱅䱆䱇䱈䱉䱊䱋䱌䱍䱎䱏䱐䱑䱒䱓䱔䱕䱖䱗䱘䱙䱚䱛䱜䱝䱞䱟䱠䱡䱢䱣䱤䱥䱦䱧䱨䱩䱪䱫䱬䱭䱮䱯䱰䱱䱲䱳䱴䱵䱶䱷䱸䱹䱺䱻䱼䱽䱾䱿䲀䲁䲂䲃䲄䲅䲆䲇䲈䲉䲊䲋䲌䲍䲎䲏䲐䲑䲒䲓䲔䲕䲖䲗䲘䲙䲚䲛䲜䲝䲞䲟䲠䲡䲢䲣䲤䲥䲦䲧䲨䲩䲪䲫䲬䲭䲮䲯䲰䲱䲲䲳䲴䲵䲶䲷䲸䲹䲺䲻䲼䲽䲾䲿䳀䳁䳂䳃䳄䳅䳆䳇䳈䳉䳊䳋䳌䳍䳎䳏䳐䳑䳒䳓䳔䳕䳖䳗䳘䳙䳚䳛䳜䳝䳞䳟䳠䳡䳢䳣䳤䳥䳦䳧䳨䳩䳪䳫䳬䳭䳮䳯䳰䳱䳲䳳䳴䳵䳶䳷䳸䳹䳺䳻䳼䳽䳾䳿䴀䴁䴂䴃䴄䴅䴆䴇䴈䴉䴊䴋䴌䴍䴎䴏䴐䴑䴒䴓䴔䴕䴖䴗䴘䴙䴚䴛䴜䴝䴞䴟䴠䴡","䴢䴣䴤䴥䴦䴧䴨䴩䴪䴫䴬䴭䴮䴯䴰䴱䴲䴳䴴䴵䴶䴷䴸䴹䴺䴻䴼䴽䴾䴿䵀䵁䵂䵃䵄䵅䵆䵇䵈䵉䵊䵋䵌䵍䵎䵏䵐䵑䵒䵓䵔䵕䵖䵗䵘䵙䵚䵛䵜䵝䵞䵟䵠䵡䵢䵣䵤䵥䵦䵧䵨䵩䵪䵫䵬䵭䵮䵯䵰䵱䵲䵳䵴䵵䵶䵷䵸䵹䵺䵻䵼䵽䵾䵿䶀䶁䶂䶃䶄䶅䶆䶇䶈䶉䶊䶋䶌䶍䶎䶏䶐䶑䶒䶓䶔䶕䶖䶗䶘䶙䶚䶛䶜䶝䶞䶟䶠䶡䶢䶣䶤䶥䶦䶧䶨䶩䶪䶫䶬䶭䶮䶯䶰䶱䶲䶳䶴䶵䶶䶷䶸䶹䶺䶻䶼䶽䶾䶿䷀䷁䷂䷃䷄䷅䷆䷇䷈䷉䷊䷋䷌䷍䷎䷏䷐䷑䷒䷓䷔䷕䷖䷗䷘䷙䷚䷛䷜䷝䷞䷟䷠䷡䷢䷣䷤䷥䷦䷧䷨䷩䷪䷫䷬䷭䷮䷯䷰䷱䷲䷳䷴䷵䷶䷷䷸䷹䷺䷻䷼䷽䷾䷿一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両","丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿伀企伂伃伄伅伆伇伈伉伊伋伌伍伎伏伐休伒伓伔伕伖众优伙会伛伜伝伞伟传伡","伢伣伤伥伦伧伨伩伪伫伬伭伮伯估伱伲伳伴伵伶伷伸伹伺伻似伽伾伿佀佁佂佃佄佅但佇佈佉佊佋佌位低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟你佡佢佣佤佥佦佧佨佩佪佫佬佭佮佯佰佱佲佳佴併佶佷佸佹佺佻佼佽佾使侀侁侂侃侄侅來侇侈侉侊例侌侍侎侏侐侑侒侓侔侕侖侗侘侙侚供侜依侞侟侠価侢侣侤侥侦侧侨侩侪侫侬侭侮侯侰侱侲侳侴侵侶侷侸侹侺侻侼侽侾便俀俁係促俄俅俆俇俈俉俊俋俌俍俎俏俐俑俒俓俔俕俖俗俘俙俚俛俜保俞俟俠信俢俣俤俥俦俧俨俩俪俫俬俭修俯俰俱俲俳俴俵俶俷俸俹俺俻俼俽俾俿倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡","倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿偀偁偂偃偄偅偆假偈偉偊偋偌偍偎偏偐偑偒偓偔偕偖偗偘偙做偛停偝偞偟偠偡偢偣偤健偦偧偨偩偪偫偬偭偮偯偰偱偲偳側偵偶偷偸偹偺偻偼偽偾偿傀傁傂傃傄傅傆傇傈傉傊傋傌傍傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傣傤傥傦傧储傩傪傫催傭傮傯傰傱傲傳傴債傶傷傸傹傺傻傼傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎像僐僑僒僓僔僕僖僗僘僙僚僛僜僝僞僟僠僡僢僣僤僥僦僧僨僩僪僫僬僭僮僯僰僱僲僳僴僵僶僷僸價僺僻僼僽僾僿儀儁儂儃億儅儆儇儈儉儊儋儌儍儎儏儐儑儒儓儔儕儖儗儘儙儚儛儜儝儞償儠儡","儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾儿兀允兂元兄充兆兇先光兊克兌免兎兏児兑兒兓兔兕兖兗兘兙党兛兜兝兞兟兠兡兢兣兤入兦內全兩兪八公六兮兯兰共兲关兴兵其具典兹兺养兼兽兾兿冀冁冂冃冄内円冇冈冉冊冋册再冎冏冐冑冒冓冔冕冖冗冘写冚军农冝冞冟冠冡冢冣冤冥冦冧冨冩冪冫冬冭冮冯冰冱冲决冴况冶冷冸冹冺冻冼冽冾冿净凁凂凃凄凅准凇凈凉凊凋凌凍凎减凐凑凒凓凔凕凖凗凘凙凚凛凜凝凞凟几凡凢凣凤凥処凧凨凩凪凫凬凭凮凯凰凱凲凳凴凵凶凷凸凹出击凼函凾凿刀刁刂刃刄刅分切刈刉刊刋刌刍刎刏刐刑划刓刔刕刖列刘则刚创刜初刞刟删刡","刢刣判別刦刧刨利刪别刬刭刮刯到刱刲刳刴刵制刷券刹刺刻刼刽刾刿剀剁剂剃剄剅剆則剈剉削剋剌前剎剏剐剑剒剓剔剕剖剗剘剙剚剛剜剝剞剟剠剡剢剣剤剥剦剧剨剩剪剫剬剭剮副剰剱割剳剴創剶剷剸剹剺剻剼剽剾剿劀劁劂劃劄劅劆劇劈劉劊劋劌劍劎劏劐劑劒劓劔劕劖劗劘劙劚力劜劝办功加务劢劣劤劥劦劧动助努劫劬劭劮劯劰励劲劳労劵劶劷劸効劺劻劼劽劾势勀勁勂勃勄勅勆勇勈勉勊勋勌勍勎勏勐勑勒勓勔動勖勗勘務勚勛勜勝勞募勠勡勢勣勤勥勦勧勨勩勪勫勬勭勮勯勰勱勲勳勴勵勶勷勸勹勺勻勼勽勾勿匀匁匂匃匄包匆匇匈匉匊匋匌匍匎匏匐匑匒匓匔匕化北匘匙匚匛匜匝匞匟匠匡","匢匣匤匥匦匧匨匩匪匫匬匭匮匯匰匱匲匳匴匵匶匷匸匹区医匼匽匾匿區十卂千卄卅卆升午卉半卋卌卍华协卐卑卒卓協单卖南単卙博卛卜卝卞卟占卡卢卣卤卥卦卧卨卩卪卫卬卭卮卯印危卲即却卵卶卷卸卹卺卻卼卽卾卿厀厁厂厃厄厅历厇厈厉厊压厌厍厎厏厐厑厒厓厔厕厖厗厘厙厚厛厜厝厞原厠厡厢厣厤厥厦厧厨厩厪厫厬厭厮厯厰厱厲厳厴厵厶厷厸厹厺去厼厽厾县叀叁参參叄叅叆叇又叉及友双反収叏叐发叒叓叔叕取受变叙叚叛叜叝叞叟叠叡叢口古句另叧叨叩只叫召叭叮可台叱史右叴叵叶号司叹叺叻叼叽叾叿吀吁吂吃各吅吆吇合吉吊吋同名后吏吐向吒吓吔吕吖吗吘吙吚君吜吝吞吟吠吡","吢吣吤吥否吧吨吩吪含听吭吮启吰吱吲吳吴吵吶吷吸吹吺吻吼吽吾吿呀呁呂呃呄呅呆呇呈呉告呋呌呍呎呏呐呑呒呓呔呕呖呗员呙呚呛呜呝呞呟呠呡呢呣呤呥呦呧周呩呪呫呬呭呮呯呰呱呲味呴呵呶呷呸呹呺呻呼命呾呿咀咁咂咃咄咅咆咇咈咉咊咋和咍咎咏咐咑咒咓咔咕咖咗咘咙咚咛咜咝咞咟咠咡咢咣咤咥咦咧咨咩咪咫咬咭咮咯咰咱咲咳咴咵咶咷咸咹咺咻咼咽咾咿哀品哂哃哄哅哆哇哈哉哊哋哌响哎哏哐哑哒哓哔哕哖哗哘哙哚哛哜哝哞哟哠員哢哣哤哥哦哧哨哩哪哫哬哭哮哯哰哱哲哳哴哵哶哷哸哹哺哻哼哽哾哿唀唁唂唃唄唅唆唇唈唉唊唋唌唍唎唏唐唑唒唓唔唕唖唗唘唙唚唛唜唝唞唟唠唡","唢唣唤唥唦唧唨唩唪唫唬唭售唯唰唱唲唳唴唵唶唷唸唹唺唻唼唽唾唿啀啁啂啃啄啅商啇啈啉啊啋啌啍啎問啐啑啒啓啔啕啖啗啘啙啚啛啜啝啞啟啠啡啢啣啤啥啦啧啨啩啪啫啬啭啮啯啰啱啲啳啴啵啶啷啸啹啺啻啼啽啾啿喀喁喂喃善喅喆喇喈喉喊喋喌喍喎喏喐喑喒喓喔喕喖喗喘喙喚喛喜喝喞喟喠喡喢喣喤喥喦喧喨喩喪喫喬喭單喯喰喱喲喳喴喵営喷喸喹喺喻喼喽喾喿嗀嗁嗂嗃嗄嗅嗆嗇嗈嗉嗊嗋嗌嗍嗎嗏嗐嗑嗒嗓嗔嗕嗖嗗嗘嗙嗚嗛嗜嗝嗞嗟嗠嗡嗢嗣嗤嗥嗦嗧嗨嗩嗪嗫嗬嗭嗮嗯嗰嗱嗲嗳嗴嗵嗶嗷嗸嗹嗺嗻嗼嗽嗾嗿嘀嘁嘂嘃嘄嘅嘆嘇嘈嘉嘊嘋嘌嘍嘎嘏嘐嘑嘒嘓嘔嘕嘖嘗嘘嘙嘚嘛嘜嘝嘞嘟嘠嘡","嘢嘣嘤嘥嘦嘧嘨嘩嘪嘫嘬嘭嘮嘯嘰嘱嘲嘳嘴嘵嘶嘷嘸嘹嘺嘻嘼嘽嘾嘿噀噁噂噃噄噅噆噇噈噉噊噋噌噍噎噏噐噑噒噓噔噕噖噗噘噙噚噛噜噝噞噟噠噡噢噣噤噥噦噧器噩噪噫噬噭噮噯噰噱噲噳噴噵噶噷噸噹噺噻噼噽噾噿嚀嚁嚂嚃嚄嚅嚆嚇嚈嚉嚊嚋嚌嚍嚎嚏嚐嚑嚒嚓嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚣嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚯嚰嚱嚲嚳嚴嚵嚶嚷嚸嚹嚺嚻嚼嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囊囋囌囍囎囏囐囑囒囓囔囕囖囗囘囙囚四囜囝回囟因囡团団囤囥囦囧囨囩囪囫囬园囮囯困囱囲図围囵囶囷囸囹固囻囼国图囿圀圁圂圃圄圅圆圇圈圉圊國圌圍圎圏圐圑園圓圔圕圖圗團圙圚圛圜圝圞土圠圡","圢圣圤圥圦圧在圩圪圫圬圭圮圯地圱圲圳圴圵圶圷圸圹场圻圼圽圾圿址坁坂坃坄坅坆均坈坉坊坋坌坍坎坏坐坑坒坓坔坕坖块坘坙坚坛坜坝坞坟坠坡坢坣坤坥坦坧坨坩坪坫坬坭坮坯坰坱坲坳坴坵坶坷坸坹坺坻坼坽坾坿垀垁垂垃垄垅垆垇垈垉垊型垌垍垎垏垐垑垒垓垔垕垖垗垘垙垚垛垜垝垞垟垠垡垢垣垤垥垦垧垨垩垪垫垬垭垮垯垰垱垲垳垴垵垶垷垸垹垺垻垼垽垾垿埀埁埂埃埄埅埆埇埈埉埊埋埌埍城埏埐埑埒埓埔埕埖埗埘埙埚埛埜埝埞域埠埡埢埣埤埥埦埧埨埩埪埫埬埭埮埯埰埱埲埳埴埵埶執埸培基埻埼埽埾埿堀堁堂堃堄堅堆堇堈堉堊堋堌堍堎堏堐堑堒堓堔堕堖堗堘堙堚堛堜堝堞堟堠堡","堢堣堤堥堦堧堨堩堪堫堬堭堮堯堰報堲堳場堵堶堷堸堹堺堻堼堽堾堿塀塁塂塃塄塅塆塇塈塉塊塋塌塍塎塏塐塑塒塓塔塕塖塗塘塙塚塛塜塝塞塟塠塡塢塣塤塥塦塧塨塩塪填塬塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塾塿墀墁墂境墄墅墆墇墈墉墊墋墌墍墎墏墐墑墒墓墔墕墖増墘墙墚墛墜墝增墟墠墡墢墣墤墥墦墧墨墩墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墼墽墾墿壀壁壂壃壄壅壆壇壈壉壊壋壌壍壎壏壐壑壒壓壔壕壖壗壘壙壚壛壜壝壞壟壠壡壢壣壤壥壦壧壨壩壪士壬壭壮壯声壱売壳壴壵壶壷壸壹壺壻壼壽壾壿夀夁夂夃处夅夆备夈変夊夋夌复夎夏夐夑夒夓夔夕外夗夘夙多夛夜夝夞够夠夡","夢夣夤夥夦大夨天太夫夬夭央夯夰失夲夳头夵夶夷夸夹夺夻夼夽夾夿奀奁奂奃奄奅奆奇奈奉奊奋奌奍奎奏奐契奒奓奔奕奖套奘奙奚奛奜奝奞奟奠奡奢奣奤奥奦奧奨奩奪奫奬奭奮奯奰奱奲女奴奵奶奷奸她奺奻奼好奾奿妀妁如妃妄妅妆妇妈妉妊妋妌妍妎妏妐妑妒妓妔妕妖妗妘妙妚妛妜妝妞妟妠妡妢妣妤妥妦妧妨妩妪妫妬妭妮妯妰妱妲妳妴妵妶妷妸妹妺妻妼妽妾妿姀姁姂姃姄姅姆姇姈姉姊始姌姍姎姏姐姑姒姓委姕姖姗姘姙姚姛姜姝姞姟姠姡姢姣姤姥姦姧姨姩姪姫姬姭姮姯姰姱姲姳姴姵姶姷姸姹姺姻姼姽姾姿娀威娂娃娄娅娆娇娈娉娊娋娌娍娎娏娐娑娒娓娔娕娖娗娘娙娚娛娜娝娞娟娠娡","娢娣娤娥娦娧娨娩娪娫娬娭娮娯娰娱娲娳娴娵娶娷娸娹娺娻娼娽娾娿婀婁婂婃婄婅婆婇婈婉婊婋婌婍婎婏婐婑婒婓婔婕婖婗婘婙婚婛婜婝婞婟婠婡婢婣婤婥婦婧婨婩婪婫婬婭婮婯婰婱婲婳婴婵婶婷婸婹婺婻婼婽婾婿媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媒媓媔媕媖媗媘媙媚媛媜媝媞媟媠媡媢媣媤媥媦媧媨媩媪媫媬媭媮媯媰媱媲媳媴媵媶媷媸媹媺媻媼媽媾媿嫀嫁嫂嫃嫄嫅嫆嫇嫈嫉嫊嫋嫌嫍嫎嫏嫐嫑嫒嫓嫔嫕嫖嫗嫘嫙嫚嫛嫜嫝嫞嫟嫠嫡嫢嫣嫤嫥嫦嫧嫨嫩嫪嫫嫬嫭嫮嫯嫰嫱嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬉嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬖嬗嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡","嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬲嬳嬴嬵嬶嬷嬸嬹嬺嬻嬼嬽嬾嬿孀孁孂孃孄孅孆孇孈孉孊孋孌孍孎孏子孑孒孓孔孕孖字存孙孚孛孜孝孞孟孠孡孢季孤孥学孧孨孩孪孫孬孭孮孯孰孱孲孳孴孵孶孷學孹孺孻孼孽孾孿宀宁宂它宄宅宆宇守安宊宋完宍宎宏宐宑宒宓宔宕宖宗官宙定宛宜宝实実宠审客宣室宥宦宧宨宩宪宫宬宭宮宯宰宱宲害宴宵家宷宸容宺宻宼宽宾宿寀寁寂寃寄寅密寇寈寉寊寋富寍寎寏寐寑寒寓寔寕寖寗寘寙寚寛寜寝寞察寠寡寢寣寤寥實寧寨審寪寫寬寭寮寯寰寱寲寳寴寵寶寷寸对寺寻导寽対寿尀封専尃射尅将將專尉尊尋尌對導小尐少尒尓尔尕尖尗尘尙尚尛尜尝尞尟尠尡","尢尣尤尥尦尧尨尩尪尫尬尭尮尯尰就尲尳尴尵尶尷尸尹尺尻尼尽尾尿局屁层屃屄居屆屇屈屉届屋屌屍屎屏屐屑屒屓屔展屖屗屘屙屚屛屜屝属屟屠屡屢屣層履屦屧屨屩屪屫屬屭屮屯屰山屲屳屴屵屶屷屸屹屺屻屼屽屾屿岀岁岂岃岄岅岆岇岈岉岊岋岌岍岎岏岐岑岒岓岔岕岖岗岘岙岚岛岜岝岞岟岠岡岢岣岤岥岦岧岨岩岪岫岬岭岮岯岰岱岲岳岴岵岶岷岸岹岺岻岼岽岾岿峀峁峂峃峄峅峆峇峈峉峊峋峌峍峎峏峐峑峒峓峔峕峖峗峘峙峚峛峜峝峞峟峠峡峢峣峤峥峦峧峨峩峪峫峬峭峮峯峰峱峲峳峴峵島峷峸峹峺峻峼峽峾峿崀崁崂崃崄崅崆崇崈崉崊崋崌崍崎崏崐崑崒崓崔崕崖崗崘崙崚崛崜崝崞崟崠崡","崢崣崤崥崦崧崨崩崪崫崬崭崮崯崰崱崲崳崴崵崶崷崸崹崺崻崼崽崾崿嵀嵁嵂嵃嵄嵅嵆嵇嵈嵉嵊嵋嵌嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵘嵙嵚嵛嵜嵝嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵩嵪嵫嵬嵭嵮嵯嵰嵱嵲嵳嵴嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶂嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶙嶚嶛嶜嶝嶞嶟嶠嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶷嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巅巆巇巈巉巊巋巌巍巎巏巐巑巒巓巔巕巖巗巘巙巚巛巜川州巟巠巡巢巣巤工左巧巨巩巪巫巬巭差巯巰己已巳巴巵巶巷巸巹巺巻巼巽巾巿帀币市布帄帅帆帇师帉帊帋希帍帎帏帐帑帒帓帔帕帖帗帘帙帚帛帜帝帞帟帠帡","帢帣帤帥带帧帨帩帪師帬席帮帯帰帱帲帳帴帵帶帷常帹帺帻帼帽帾帿幀幁幂幃幄幅幆幇幈幉幊幋幌幍幎幏幐幑幒幓幔幕幖幗幘幙幚幛幜幝幞幟幠幡幢幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱干平年幵并幷幸幹幺幻幼幽幾广庀庁庂広庄庅庆庇庈庉床庋庌庍庎序庐庑庒库应底庖店庘庙庚庛府庝庞废庠庡庢庣庤庥度座庨庩庪庫庬庭庮庯庰庱庲庳庴庵庶康庸庹庺庻庼庽庾庿廀廁廂廃廄廅廆廇廈廉廊廋廌廍廎廏廐廑廒廓廔廕廖廗廘廙廚廛廜廝廞廟廠廡廢廣廤廥廦廧廨廩廪廫廬廭廮廯廰廱廲廳廴廵延廷廸廹建廻廼廽廾廿开弁异弃弄弅弆弇弈弉弊弋弌弍弎式弐弑弒弓弔引弖弗弘弙弚弛弜弝弞弟张弡","弢弣弤弥弦弧弨弩弪弫弬弭弮弯弰弱弲弳弴張弶強弸弹强弻弼弽弾弿彀彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彐彑归当彔录彖彗彘彙彚彛彜彝彞彟彠彡形彣彤彥彦彧彨彩彪彫彬彭彮彯彰影彲彳彴彵彶彷彸役彺彻彼彽彾彿往征徂徃径待徆徇很徉徊律後徍徎徏徐徑徒従徔徕徖得徘徙徚徛徜徝從徟徠御徢徣徤徥徦徧徨復循徫徬徭微徯徰徱徲徳徴徵徶德徸徹徺徻徼徽徾徿忀忁忂心忄必忆忇忈忉忊忋忌忍忎忏忐忑忒忓忔忕忖志忘忙忚忛応忝忞忟忠忡忢忣忤忥忦忧忨忩忪快忬忭忮忯忰忱忲忳忴念忶忷忸忹忺忻忼忽忾忿怀态怂怃怄怅怆怇怈怉怊怋怌怍怎怏怐怑怒怓怔怕怖怗怘怙怚怛怜思怞怟怠怡","怢怣怤急怦性怨怩怪怫怬怭怮怯怰怱怲怳怴怵怶怷怸怹怺总怼怽怾怿恀恁恂恃恄恅恆恇恈恉恊恋恌恍恎恏恐恑恒恓恔恕恖恗恘恙恚恛恜恝恞恟恠恡恢恣恤恥恦恧恨恩恪恫恬恭恮息恰恱恲恳恴恵恶恷恸恹恺恻恼恽恾恿悀悁悂悃悄悅悆悇悈悉悊悋悌悍悎悏悐悑悒悓悔悕悖悗悘悙悚悛悜悝悞悟悠悡悢患悤悥悦悧您悩悪悫悬悭悮悯悰悱悲悳悴悵悶悷悸悹悺悻悼悽悾悿惀惁惂惃惄情惆惇惈惉惊惋惌惍惎惏惐惑惒惓惔惕惖惗惘惙惚惛惜惝惞惟惠惡惢惣惤惥惦惧惨惩惪惫惬惭惮惯惰惱惲想惴惵惶惷惸惹惺惻惼惽惾惿愀愁愂愃愄愅愆愇愈愉愊愋愌愍愎意愐愑愒愓愔愕愖愗愘愙愚愛愜愝愞感愠愡","愢愣愤愥愦愧愨愩愪愫愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾愿慀慁慂慃慄慅慆慇慈慉慊態慌慍慎慏慐慑慒慓慔慕慖慗慘慙慚慛慜慝慞慟慠慡慢慣慤慥慦慧慨慩慪慫慬慭慮慯慰慱慲慳慴慵慶慷慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憋憌憍憎憏憐憑憒憓憔憕憖憗憘憙憚憛憜憝憞憟憠憡憢憣憤憥憦憧憨憩憪憫憬憭憮憯憰憱憲憳憴憵憶憷憸憹憺憻憼憽憾憿懀懁懂懃懄懅懆懇懈應懊懋懌懍懎懏懐懑懒懓懔懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懦懧懨懩懪懫懬懭懮懯懰懱懲懳懴懵懶懷懸懹懺懻懼懽懾懿戀戁戂戃戄戅戆戇戈戉戊戋戌戍戎戏成我戒戓戔戕或戗战戙戚戛戜戝戞戟戠戡","戢戣戤戥戦戧戨戩截戫戬戭戮戯戰戱戲戳戴戵戶户戸戹戺戻戼戽戾房所扁扂扃扄扅扆扇扈扉扊手扌才扎扏扐扑扒打扔払扖扗托扙扚扛扜扝扞扟扠扡扢扣扤扥扦执扨扩扪扫扬扭扮扯扰扱扲扳扴扵扶扷扸批扺扻扼扽找承技抁抂抃抄抅抆抇抈抉把抋抌抍抎抏抐抑抒抓抔投抖抗折抙抚抛抜抝択抟抠抡抢抣护报抦抧抨抩抪披抬抭抮抯抰抱抲抳抴抵抶抷抸抹抺抻押抽抾抿拀拁拂拃拄担拆拇拈拉拊拋拌拍拎拏拐拑拒拓拔拕拖拗拘拙拚招拜拝拞拟拠拡拢拣拤拥拦拧拨择拪拫括拭拮拯拰拱拲拳拴拵拶拷拸拹拺拻拼拽拾拿挀持挂挃挄挅挆指挈按挊挋挌挍挎挏挐挑挒挓挔挕挖挗挘挙挚挛挜挝挞挟挠挡","挢挣挤挥挦挧挨挩挪挫挬挭挮振挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿捀捁捂捃捄捅捆捇捈捉捊捋捌捍捎捏捐捑捒捓捔捕捖捗捘捙捚捛捜捝捞损捠捡换捣捤捥捦捧捨捩捪捫捬捭据捯捰捱捲捳捴捵捶捷捸捹捺捻捼捽捾捿掀掁掂掃掄掅掆掇授掉掊掋掌掍掎掏掐掑排掓掔掕掖掗掘掙掚掛掜掝掞掟掠採探掣掤接掦控推掩措掫掬掭掮掯掰掱掲掳掴掵掶掷掸掹掺掻掼掽掾掿揀揁揂揃揄揅揆揇揈揉揊揋揌揍揎描提揑插揓揔揕揖揗揘揙揚換揜揝揞揟揠握揢揣揤揥揦揧揨揩揪揫揬揭揮揯揰揱揲揳援揵揶揷揸揹揺揻揼揽揾揿搀搁搂搃搄搅搆搇搈搉搊搋搌損搎搏搐搑搒搓搔搕搖搗搘搙搚搛搜搝搞搟搠搡","搢搣搤搥搦搧搨搩搪搫搬搭搮搯搰搱搲搳搴搵搶搷搸搹携搻搼搽搾搿摀摁摂摃摄摅摆摇摈摉摊摋摌摍摎摏摐摑摒摓摔摕摖摗摘摙摚摛摜摝摞摟摠摡摢摣摤摥摦摧摨摩摪摫摬摭摮摯摰摱摲摳摴摵摶摷摸摹摺摻摼摽摾摿撀撁撂撃撄撅撆撇撈撉撊撋撌撍撎撏撐撑撒撓撔撕撖撗撘撙撚撛撜撝撞撟撠撡撢撣撤撥撦撧撨撩撪撫撬播撮撯撰撱撲撳撴撵撶撷撸撹撺撻撼撽撾撿擀擁擂擃擄擅擆擇擈擉擊擋擌操擎擏擐擑擒擓擔擕擖擗擘擙據擛擜擝擞擟擠擡擢擣擤擥擦擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攀攁攂攃攄攅攆攇攈攉攊攋攌攍攎攏攐攑攒攓攔攕攖攗攘攙攚攛攜攝攞攟攠攡","攢攣攤攥攦攧攨攩攪攫攬攭攮支攰攱攲攳攴攵收攷攸改攺攻攼攽放政敀敁敂敃敄故敆敇效敉敊敋敌敍敎敏敐救敒敓敔敕敖敗敘教敚敛敜敝敞敟敠敡敢散敤敥敦敧敨敩敪敫敬敭敮敯数敱敲敳整敵敶敷數敹敺敻敼敽敾敿斀斁斂斃斄斅斆文斈斉斊斋斌斍斎斏斐斑斒斓斔斕斖斗斘料斚斛斜斝斞斟斠斡斢斣斤斥斦斧斨斩斪斫斬断斮斯新斱斲斳斴斵斶斷斸方斺斻於施斾斿旀旁旂旃旄旅旆旇旈旉旊旋旌旍旎族旐旑旒旓旔旕旖旗旘旙旚旛旜旝旞旟无旡既旣旤日旦旧旨早旪旫旬旭旮旯旰旱旲旳旴旵时旷旸旹旺旻旼旽旾旿昀昁昂昃昄昅昆昇昈昉昊昋昌昍明昏昐昑昒易昔昕昖昗昘昙昚昛昜昝昞星映昡","昢昣昤春昦昧昨昩昪昫昬昭昮是昰昱昲昳昴昵昶昷昸昹昺昻昼昽显昿晀晁時晃晄晅晆晇晈晉晊晋晌晍晎晏晐晑晒晓晔晕晖晗晘晙晚晛晜晝晞晟晠晡晢晣晤晥晦晧晨晩晪晫晬晭普景晰晱晲晳晴晵晶晷晸晹智晻晼晽晾晿暀暁暂暃暄暅暆暇暈暉暊暋暌暍暎暏暐暑暒暓暔暕暖暗暘暙暚暛暜暝暞暟暠暡暢暣暤暥暦暧暨暩暪暫暬暭暮暯暰暱暲暳暴暵暶暷暸暹暺暻暼暽暾暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曙曚曛曜曝曞曟曠曡曢曣曤曥曦曧曨曩曪曫曬曭曮曯曰曱曲曳更曵曶曷書曹曺曻曼曽曾替最朁朂會朄朅朆朇月有朊朋朌服朎朏朐朑朒朓朔朕朖朗朘朙朚望朜朝朞期朠朡","朢朣朤朥朦朧木朩未末本札朮术朰朱朲朳朴朵朶朷朸朹机朻朼朽朾朿杀杁杂权杄杅杆杇杈杉杊杋杌杍李杏材村杒杓杔杕杖杗杘杙杚杛杜杝杞束杠条杢杣杤来杦杧杨杩杪杫杬杭杮杯杰東杲杳杴杵杶杷杸杹杺杻杼杽松板枀极枂枃构枅枆枇枈枉枊枋枌枍枎枏析枑枒枓枔枕枖林枘枙枚枛果枝枞枟枠枡枢枣枤枥枦枧枨枩枪枫枬枭枮枯枰枱枲枳枴枵架枷枸枹枺枻枼枽枾枿柀柁柂柃柄柅柆柇柈柉柊柋柌柍柎柏某柑柒染柔柕柖柗柘柙柚柛柜柝柞柟柠柡柢柣柤查柦柧柨柩柪柫柬柭柮柯柰柱柲柳柴柵柶柷柸柹柺査柼柽柾柿栀栁栂栃栄栅栆标栈栉栊栋栌栍栎栏栐树栒栓栔栕栖栗栘栙栚栛栜栝栞栟栠校","栢栣栤栥栦栧栨栩株栫栬栭栮栯栰栱栲栳栴栵栶样核根栺栻格栽栾栿桀桁桂桃桄桅框桇案桉桊桋桌桍桎桏桐桑桒桓桔桕桖桗桘桙桚桛桜桝桞桟桠桡桢档桤桥桦桧桨桩桪桫桬桭桮桯桰桱桲桳桴桵桶桷桸桹桺桻桼桽桾桿梀梁梂梃梄梅梆梇梈梉梊梋梌梍梎梏梐梑梒梓梔梕梖梗梘梙梚梛梜條梞梟梠梡梢梣梤梥梦梧梨梩梪梫梬梭梮梯械梱梲梳梴梵梶梷梸梹梺梻梼梽梾梿检棁棂棃棄棅棆棇棈棉棊棋棌棍棎棏棐棑棒棓棔棕棖棗棘棙棚棛棜棝棞棟棠棡棢棣棤棥棦棧棨棩棪棫棬棭森棯棰棱棲棳棴棵棶棷棸棹棺棻棼棽棾棿椀椁椂椃椄椅椆椇椈椉椊椋椌植椎椏椐椑椒椓椔椕椖椗椘椙椚椛検椝椞椟椠椡","椢椣椤椥椦椧椨椩椪椫椬椭椮椯椰椱椲椳椴椵椶椷椸椹椺椻椼椽椾椿楀楁楂楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楔楕楖楗楘楙楚楛楜楝楞楟楠楡楢楣楤楥楦楧楨楩楪楫楬業楮楯楰楱楲楳楴極楶楷楸楹楺楻楼楽楾楿榀榁概榃榄榅榆榇榈榉榊榋榌榍榎榏榐榑榒榓榔榕榖榗榘榙榚榛榜榝榞榟榠榡榢榣榤榥榦榧榨榩榪榫榬榭榮榯榰榱榲榳榴榵榶榷榸榹榺榻榼榽榾榿槀槁槂槃槄槅槆槇槈槉槊構槌槍槎槏槐槑槒槓槔槕槖槗様槙槚槛槜槝槞槟槠槡槢槣槤槥槦槧槨槩槪槫槬槭槮槯槰槱槲槳槴槵槶槷槸槹槺槻槼槽槾槿樀樁樂樃樄樅樆樇樈樉樊樋樌樍樎樏樐樑樒樓樔樕樖樗樘標樚樛樜樝樞樟樠模","樢樣樤樥樦樧樨権横樫樬樭樮樯樰樱樲樳樴樵樶樷樸樹樺樻樼樽樾樿橀橁橂橃橄橅橆橇橈橉橊橋橌橍橎橏橐橑橒橓橔橕橖橗橘橙橚橛橜橝橞機橠橡橢橣橤橥橦橧橨橩橪橫橬橭橮橯橰橱橲橳橴橵橶橷橸橹橺橻橼橽橾橿檀檁檂檃檄檅檆檇檈檉檊檋檌檍檎檏檐檑檒檓檔檕檖檗檘檙檚檛檜檝檞檟檠檡檢檣檤檥檦檧檨檩檪檫檬檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欠次","欢欣欤欥欦欧欨欩欪欫欬欭欮欯欰欱欲欳欴欵欶欷欸欹欺欻欼欽款欿歀歁歂歃歄歅歆歇歈歉歊歋歌歍歎歏歐歑歒歓歔歕歖歗歘歙歚歛歜歝歞歟歠歡止正此步武歧歨歩歪歫歬歭歮歯歰歱歲歳歴歵歶歷歸歹歺死歼歽歾歿殀殁殂殃殄殅殆殇殈殉殊残殌殍殎殏殐殑殒殓殔殕殖殗殘殙殚殛殜殝殞殟殠殡殢殣殤殥殦殧殨殩殪殫殬殭殮殯殰殱殲殳殴段殶殷殸殹殺殻殼殽殾殿毀毁毂毃毄毅毆毇毈毉毊毋毌母毎每毐毑毒毓比毕毖毗毘毙毚毛毜毝毞毟毠毡毢毣毤毥毦毧毨毩毪毫毬毭毮毯毰毱毲毳毴毵毶毷毸毹毺毻毼毽毾毿氀氁氂氃氄氅氆氇氈氉氊氋氌氍氎氏氐民氒氓气氕氖気氘氙氚氛氜氝氞氟氠氡","氢氣氤氥氦氧氨氩氪氫氬氭氮氯氰氱氲氳水氵氶氷永氹氺氻氼氽氾氿汀汁求汃汄汅汆汇汈汉汊汋汌汍汎汏汐汑汒汓汔汕汖汗汘汙汚汛汜汝汞江池污汢汣汤汥汦汧汨汩汪汫汬汭汮汯汰汱汲汳汴汵汶汷汸汹決汻汼汽汾汿沀沁沂沃沄沅沆沇沈沉沊沋沌沍沎沏沐沑沒沓沔沕沖沗沘沙沚沛沜沝沞沟沠没沢沣沤沥沦沧沨沩沪沫沬沭沮沯沰沱沲河沴沵沶沷沸油沺治沼沽沾沿泀況泂泃泄泅泆泇泈泉泊泋泌泍泎泏泐泑泒泓泔法泖泗泘泙泚泛泜泝泞泟泠泡波泣泤泥泦泧注泩泪泫泬泭泮泯泰泱泲泳泴泵泶泷泸泹泺泻泼泽泾泿洀洁洂洃洄洅洆洇洈洉洊洋洌洍洎洏洐洑洒洓洔洕洖洗洘洙洚洛洜洝洞洟洠洡","洢洣洤津洦洧洨洩洪洫洬洭洮洯洰洱洲洳洴洵洶洷洸洹洺活洼洽派洿浀流浂浃浄浅浆浇浈浉浊测浌浍济浏浐浑浒浓浔浕浖浗浘浙浚浛浜浝浞浟浠浡浢浣浤浥浦浧浨浩浪浫浬浭浮浯浰浱浲浳浴浵浶海浸浹浺浻浼浽浾浿涀涁涂涃涄涅涆涇消涉涊涋涌涍涎涏涐涑涒涓涔涕涖涗涘涙涚涛涜涝涞涟涠涡涢涣涤涥润涧涨涩涪涫涬涭涮涯涰涱液涳涴涵涶涷涸涹涺涻涼涽涾涿淀淁淂淃淄淅淆淇淈淉淊淋淌淍淎淏淐淑淒淓淔淕淖淗淘淙淚淛淜淝淞淟淠淡淢淣淤淥淦淧淨淩淪淫淬淭淮淯淰深淲淳淴淵淶混淸淹淺添淼淽淾淿渀渁渂渃渄清渆渇済渉渊渋渌渍渎渏渐渑渒渓渔渕渖渗渘渙渚減渜渝渞渟渠渡","渢渣渤渥渦渧渨温渪渫測渭渮港渰渱渲渳渴渵渶渷游渹渺渻渼渽渾渿湀湁湂湃湄湅湆湇湈湉湊湋湌湍湎湏湐湑湒湓湔湕湖湗湘湙湚湛湜湝湞湟湠湡湢湣湤湥湦湧湨湩湪湫湬湭湮湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽湾湿満溁溂溃溄溅溆溇溈溉溊溋溌溍溎溏源溑溒溓溔溕準溗溘溙溚溛溜溝溞溟溠溡溢溣溤溥溦溧溨溩溪溫溬溭溮溯溰溱溲溳溴溵溶溷溸溹溺溻溼溽溾溿滀滁滂滃滄滅滆滇滈滉滊滋滌滍滎滏滐滑滒滓滔滕滖滗滘滙滚滛滜滝滞滟滠满滢滣滤滥滦滧滨滩滪滫滬滭滮滯滰滱滲滳滴滵滶滷滸滹滺滻滼滽滾滿漀漁漂漃漄漅漆漇漈漉漊漋漌漍漎漏漐漑漒漓演漕漖漗漘漙漚漛漜漝漞漟漠漡","漢漣漤漥漦漧漨漩漪漫漬漭漮漯漰漱漲漳漴漵漶漷漸漹漺漻漼漽漾漿潀潁潂潃潄潅潆潇潈潉潊潋潌潍潎潏潐潑潒潓潔潕潖潗潘潙潚潛潜潝潞潟潠潡潢潣潤潥潦潧潨潩潪潫潬潭潮潯潰潱潲潳潴潵潶潷潸潹潺潻潼潽潾潿澀澁澂澃澄澅澆澇澈澉澊澋澌澍澎澏澐澑澒澓澔澕澖澗澘澙澚澛澜澝澞澟澠澡澢澣澤澥澦澧澨澩澪澫澬澭澮澯澰澱澲澳澴澵澶澷澸澹澺澻澼澽澾澿激濁濂濃濄濅濆濇濈濉濊濋濌濍濎濏濐濑濒濓濔濕濖濗濘濙濚濛濜濝濞濟濠濡濢濣濤濥濦濧濨濩濪濫濬濭濮濯濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀑瀒瀓瀔瀕瀖瀗瀘瀙瀚瀛瀜瀝瀞瀟瀠瀡","瀢瀣瀤瀥瀦瀧瀨瀩瀪瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀵瀶瀷瀸瀹瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灌灍灎灏灐灑灒灓灔灕灖灗灘灙灚灛灜灝灞灟灠灡灢灣灤灥灦灧灨灩灪火灬灭灮灯灰灱灲灳灴灵灶灷灸灹灺灻灼災灾灿炀炁炂炃炄炅炆炇炈炉炊炋炌炍炎炏炐炑炒炓炔炕炖炗炘炙炚炛炜炝炞炟炠炡炢炣炤炥炦炧炨炩炪炫炬炭炮炯炰炱炲炳炴炵炶炷炸点為炻炼炽炾炿烀烁烂烃烄烅烆烇烈烉烊烋烌烍烎烏烐烑烒烓烔烕烖烗烘烙烚烛烜烝烞烟烠烡烢烣烤烥烦烧烨烩烪烫烬热烮烯烰烱烲烳烴烵烶烷烸烹烺烻烼烽烾烿焀焁焂焃焄焅焆焇焈焉焊焋焌焍焎焏焐焑焒焓焔焕焖焗焘焙焚焛焜焝焞焟焠無","焢焣焤焥焦焧焨焩焪焫焬焭焮焯焰焱焲焳焴焵然焷焸焹焺焻焼焽焾焿煀煁煂煃煄煅煆煇煈煉煊煋煌煍煎煏煐煑煒煓煔煕煖煗煘煙煚煛煜煝煞煟煠煡煢煣煤煥煦照煨煩煪煫煬煭煮煯煰煱煲煳煴煵煶煷煸煹煺煻煼煽煾煿熀熁熂熃熄熅熆熇熈熉熊熋熌熍熎熏熐熑熒熓熔熕熖熗熘熙熚熛熜熝熞熟熠熡熢熣熤熥熦熧熨熩熪熫熬熭熮熯熰熱熲熳熴熵熶熷熸熹熺熻熼熽熾熿燀燁燂燃燄燅燆燇燈燉燊燋燌燍燎燏燐燑燒燓燔燕燖燗燘燙燚燛燜燝燞營燠燡燢燣燤燥燦燧燨燩燪燫燬燭燮燯燰燱燲燳燴燵燶燷燸燹燺燻燼燽燾燿爀爁爂爃爄爅爆爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚爛爜爝爞爟爠爡","爢爣爤爥爦爧爨爩爪爫爬爭爮爯爰爱爲爳爴爵父爷爸爹爺爻爼爽爾爿牀牁牂牃牄牅牆片版牉牊牋牌牍牎牏牐牑牒牓牔牕牖牗牘牙牚牛牜牝牞牟牠牡牢牣牤牥牦牧牨物牪牫牬牭牮牯牰牱牲牳牴牵牶牷牸特牺牻牼牽牾牿犀犁犂犃犄犅犆犇犈犉犊犋犌犍犎犏犐犑犒犓犔犕犖犗犘犙犚犛犜犝犞犟犠犡犢犣犤犥犦犧犨犩犪犫犬犭犮犯犰犱犲犳犴犵状犷犸犹犺犻犼犽犾犿狀狁狂狃狄狅狆狇狈狉狊狋狌狍狎狏狐狑狒狓狔狕狖狗狘狙狚狛狜狝狞狟狠狡狢狣狤狥狦狧狨狩狪狫独狭狮狯狰狱狲狳狴狵狶狷狸狹狺狻狼狽狾狿猀猁猂猃猄猅猆猇猈猉猊猋猌猍猎猏猐猑猒猓猔猕猖猗猘猙猚猛猜猝猞猟猠猡","猢猣猤猥猦猧猨猩猪猫猬猭献猯猰猱猲猳猴猵猶猷猸猹猺猻猼猽猾猿獀獁獂獃獄獅獆獇獈獉獊獋獌獍獎獏獐獑獒獓獔獕獖獗獘獙獚獛獜獝獞獟獠獡獢獣獤獥獦獧獨獩獪獫獬獭獮獯獰獱獲獳獴獵獶獷獸獹獺獻獼獽獾獿玀玁玂玃玄玅玆率玈玉玊王玌玍玎玏玐玑玒玓玔玕玖玗玘玙玚玛玜玝玞玟玠玡玢玣玤玥玦玧玨玩玪玫玬玭玮环现玱玲玳玴玵玶玷玸玹玺玻玼玽玾玿珀珁珂珃珄珅珆珇珈珉珊珋珌珍珎珏珐珑珒珓珔珕珖珗珘珙珚珛珜珝珞珟珠珡珢珣珤珥珦珧珨珩珪珫珬班珮珯珰珱珲珳珴珵珶珷珸珹珺珻珼珽現珿琀琁琂球琄琅理琇琈琉琊琋琌琍琎琏琐琑琒琓琔琕琖琗琘琙琚琛琜琝琞琟琠琡","琢琣琤琥琦琧琨琩琪琫琬琭琮琯琰琱琲琳琴琵琶琷琸琹琺琻琼琽琾琿瑀瑁瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍瑎瑏瑐瑑瑒瑓瑔瑕瑖瑗瑘瑙瑚瑛瑜瑝瑞瑟瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑭瑮瑯瑰瑱瑲瑳瑴瑵瑶瑷瑸瑹瑺瑻瑼瑽瑾瑿璀璁璂璃璄璅璆璇璈璉璊璋璌璍璎璏璐璑璒璓璔璕璖璗璘璙璚璛璜璝璞璟璠璡璢璣璤璥璦璧璨璩璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璺璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓒瓓瓔瓕瓖瓗瓘瓙瓚瓛瓜瓝瓞瓟瓠瓡瓢瓣瓤瓥瓦瓧瓨瓩瓪瓫瓬瓭瓮瓯瓰瓱瓲瓳瓴瓵瓶瓷瓸瓹瓺瓻瓼瓽瓾瓿甀甁甂甃甄甅甆甇甈甉甊甋甌甍甎甏甐甑甒甓甔甕甖甗甘甙甚甛甜甝甞生甠甡","產産甤甥甦甧用甩甪甫甬甭甮甯田由甲申甴电甶男甸甹町画甼甽甾甿畀畁畂畃畄畅畆畇畈畉畊畋界畍畎畏畐畑畒畓畔畕畖畗畘留畚畛畜畝畞畟畠畡畢畣畤略畦畧畨畩番畫畬畭畮畯異畱畲畳畴畵當畷畸畹畺畻畼畽畾畿疀疁疂疃疄疅疆疇疈疉疊疋疌疍疎疏疐疑疒疓疔疕疖疗疘疙疚疛疜疝疞疟疠疡疢疣疤疥疦疧疨疩疪疫疬疭疮疯疰疱疲疳疴疵疶疷疸疹疺疻疼疽疾疿痀痁痂痃痄病痆症痈痉痊痋痌痍痎痏痐痑痒痓痔痕痖痗痘痙痚痛痜痝痞痟痠痡痢痣痤痥痦痧痨痩痪痫痬痭痮痯痰痱痲痳痴痵痶痷痸痹痺痻痼痽痾痿瘀瘁瘂瘃瘄瘅瘆瘇瘈瘉瘊瘋瘌瘍瘎瘏瘐瘑瘒瘓瘔瘕瘖瘗瘘瘙瘚瘛瘜瘝瘞瘟瘠瘡","瘢瘣瘤瘥瘦瘧瘨瘩瘪瘫瘬瘭瘮瘯瘰瘱瘲瘳瘴瘵瘶瘷瘸瘹瘺瘻瘼瘽瘾瘿癀癁療癃癄癅癆癇癈癉癊癋癌癍癎癏癐癑癒癓癔癕癖癗癘癙癚癛癜癝癞癟癠癡癢癣癤癥癦癧癨癩癪癫癬癭癮癯癰癱癲癳癴癵癶癷癸癹発登發白百癿皀皁皂皃的皅皆皇皈皉皊皋皌皍皎皏皐皑皒皓皔皕皖皗皘皙皚皛皜皝皞皟皠皡皢皣皤皥皦皧皨皩皪皫皬皭皮皯皰皱皲皳皴皵皶皷皸皹皺皻皼皽皾皿盀盁盂盃盄盅盆盇盈盉益盋盌盍盎盏盐监盒盓盔盕盖盗盘盙盚盛盜盝盞盟盠盡盢監盤盥盦盧盨盩盪盫盬盭目盯盰盱盲盳直盵盶盷相盹盺盻盼盽盾盿眀省眂眃眄眅眆眇眈眉眊看県眍眎眏眐眑眒眓眔眕眖眗眘眙眚眛眜眝眞真眠眡","眢眣眤眥眦眧眨眩眪眫眬眭眮眯眰眱眲眳眴眵眶眷眸眹眺眻眼眽眾眿着睁睂睃睄睅睆睇睈睉睊睋睌睍睎睏睐睑睒睓睔睕睖睗睘睙睚睛睜睝睞睟睠睡睢督睤睥睦睧睨睩睪睫睬睭睮睯睰睱睲睳睴睵睶睷睸睹睺睻睼睽睾睿瞀瞁瞂瞃瞄瞅瞆瞇瞈瞉瞊瞋瞌瞍瞎瞏瞐瞑瞒瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞟瞠瞡瞢瞣瞤瞥瞦瞧瞨瞩瞪瞫瞬瞭瞮瞯瞰瞱瞲瞳瞴瞵瞶瞷瞸瞹瞺瞻瞼瞽瞾瞿矀矁矂矃矄矅矆矇矈矉矊矋矌矍矎矏矐矑矒矓矔矕矖矗矘矙矚矛矜矝矞矟矠矡矢矣矤知矦矧矨矩矪矫矬短矮矯矰矱矲石矴矵矶矷矸矹矺矻矼矽矾矿砀码砂砃砄砅砆砇砈砉砊砋砌砍砎砏砐砑砒砓研砕砖砗砘砙砚砛砜砝砞砟砠砡","砢砣砤砥砦砧砨砩砪砫砬砭砮砯砰砱砲砳破砵砶砷砸砹砺砻砼砽砾砿础硁硂硃硄硅硆硇硈硉硊硋硌硍硎硏硐硑硒硓硔硕硖硗硘硙硚硛硜硝硞硟硠硡硢硣硤硥硦硧硨硩硪硫硬硭确硯硰硱硲硳硴硵硶硷硸硹硺硻硼硽硾硿碀碁碂碃碄碅碆碇碈碉碊碋碌碍碎碏碐碑碒碓碔碕碖碗碘碙碚碛碜碝碞碟碠碡碢碣碤碥碦碧碨碩碪碫碬碭碮碯碰碱碲碳碴碵碶碷碸碹確碻碼碽碾碿磀磁磂磃磄磅磆磇磈磉磊磋磌磍磎磏磐磑磒磓磔磕磖磗磘磙磚磛磜磝磞磟磠磡磢磣磤磥磦磧磨磩磪磫磬磭磮磯磰磱磲磳磴磵磶磷磸磹磺磻磼磽磾磿礀礁礂礃礄礅礆礇礈礉礊礋礌礍礎礏礐礑礒礓礔礕礖礗礘礙礚礛礜礝礞礟礠礡","礢礣礤礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礴礵礶礷礸礹示礻礼礽社礿祀祁祂祃祄祅祆祇祈祉祊祋祌祍祎祏祐祑祒祓祔祕祖祗祘祙祚祛祜祝神祟祠祡祢祣祤祥祦祧票祩祪祫祬祭祮祯祰祱祲祳祴祵祶祷祸祹祺祻祼祽祾祿禀禁禂禃禄禅禆禇禈禉禊禋禌禍禎福禐禑禒禓禔禕禖禗禘禙禚禛禜禝禞禟禠禡禢禣禤禥禦禧禨禩禪禫禬禭禮禯禰禱禲禳禴禵禶禷禸禹禺离禼禽禾禿秀私秂秃秄秅秆秇秈秉秊秋秌种秎秏秐科秒秓秔秕秖秗秘秙秚秛秜秝秞租秠秡秢秣秤秥秦秧秨秩秪秫秬秭秮积称秱秲秳秴秵秶秷秸秹秺移秼秽秾秿稀稁稂稃稄稅稆稇稈稉稊程稌稍税稏稐稑稒稓稔稕稖稗稘稙稚稛稜稝稞稟稠稡","稢稣稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稳稴稵稶稷稸稹稺稻稼稽稾稿穀穁穂穃穄穅穆穇穈穉穊穋穌積穎穏穐穑穒穓穔穕穖穗穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨穩穪穫穬穭穮穯穰穱穲穳穴穵究穷穸穹空穻穼穽穾穿窀突窂窃窄窅窆窇窈窉窊窋窌窍窎窏窐窑窒窓窔窕窖窗窘窙窚窛窜窝窞窟窠窡窢窣窤窥窦窧窨窩窪窫窬窭窮窯窰窱窲窳窴窵窶窷窸窹窺窻窼窽窾窿竀竁竂竃竄竅竆竇竈竉竊立竌竍竎竏竐竑竒竓竔竕竖竗竘站竚竛竜竝竞竟章竡竢竣竤童竦竧竨竩竪竫竬竭竮端竰竱竲竳竴竵競竷竸竹竺竻竼竽竾竿笀笁笂笃笄笅笆笇笈笉笊笋笌笍笎笏笐笑笒笓笔笕笖笗笘笙笚笛笜笝笞笟笠笡","笢笣笤笥符笧笨笩笪笫第笭笮笯笰笱笲笳笴笵笶笷笸笹笺笻笼笽笾笿筀筁筂筃筄筅筆筇筈等筊筋筌筍筎筏筐筑筒筓答筕策筗筘筙筚筛筜筝筞筟筠筡筢筣筤筥筦筧筨筩筪筫筬筭筮筯筰筱筲筳筴筵筶筷筸筹筺筻筼筽签筿简箁箂箃箄箅箆箇箈箉箊箋箌箍箎箏箐箑箒箓箔箕箖算箘箙箚箛箜箝箞箟箠管箢箣箤箥箦箧箨箩箪箫箬箭箮箯箰箱箲箳箴箵箶箷箸箹箺箻箼箽箾箿節篁篂篃範篅篆篇篈築篊篋篌篍篎篏篐篑篒篓篔篕篖篗篘篙篚篛篜篝篞篟篠篡篢篣篤篥篦篧篨篩篪篫篬篭篮篯篰篱篲篳篴篵篶篷篸篹篺篻篼篽篾篿簀簁簂簃簄簅簆簇簈簉簊簋簌簍簎簏簐簑簒簓簔簕簖簗簘簙簚簛簜簝簞簟簠簡","簢簣簤簥簦簧簨簩簪簫簬簭簮簯簰簱簲簳簴簵簶簷簸簹簺簻簼簽簾簿籀籁籂籃籄籅籆籇籈籉籊籋籌籍籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲米籴籵籶籷籸籹籺类籼籽籾籿粀粁粂粃粄粅粆粇粈粉粊粋粌粍粎粏粐粑粒粓粔粕粖粗粘粙粚粛粜粝粞粟粠粡粢粣粤粥粦粧粨粩粪粫粬粭粮粯粰粱粲粳粴粵粶粷粸粹粺粻粼粽精粿糀糁糂糃糄糅糆糇糈糉糊糋糌糍糎糏糐糑糒糓糔糕糖糗糘糙糚糛糜糝糞糟糠糡糢糣糤糥糦糧糨糩糪糫糬糭糮糯糰糱糲糳糴糵糶糷糸糹糺系糼糽糾糿紀紁紂紃約紅紆紇紈紉紊紋紌納紎紏紐紑紒紓純紕紖紗紘紙級紛紜紝紞紟素紡","索紣紤紥紦紧紨紩紪紫紬紭紮累細紱紲紳紴紵紶紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絮絯絰統絲絳絴絵絶絷絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘継続綛綜綝綞綟綠綡綢綣綤綥綦綧綨綩綪綫綬維綮綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡","縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹縺縻縼總績縿繀繁繂繃繄繅繆繇繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纂纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纛纜纝纞纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡","缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵缶缷缸缹缺缻缼缽缾缿罀罁罂罃罄罅罆罇罈罉罊罋罌罍罎罏罐网罒罓罔罕罖罗罘罙罚罛罜罝罞罟罠罡罢罣罤罥罦罧罨罩罪罫罬罭置罯罰罱署罳罴罵罶罷罸罹罺罻罼罽罾罿羀羁羂羃羄羅羆羇羈羉羊羋羌羍美羏羐羑羒羓羔羕羖羗羘羙羚羛羜羝羞羟羠羡羢羣群羥羦羧羨義羪羫羬羭羮羯羰羱羲羳羴羵羶羷羸羹羺羻羼羽羾羿翀翁翂翃翄翅翆翇翈翉翊翋翌翍翎翏翐翑習翓翔翕翖翗翘翙翚翛翜翝翞翟翠翡翢翣翤翥翦翧翨翩翪翫翬翭翮翯翰翱翲翳翴翵翶翷翸翹翺翻翼翽翾翿耀老耂考耄者耆耇耈耉耊耋而耍耎耏耐耑耒耓耔耕耖耗耘耙耚耛耜耝耞耟耠耡","耢耣耤耥耦耧耨耩耪耫耬耭耮耯耰耱耲耳耴耵耶耷耸耹耺耻耼耽耾耿聀聁聂聃聄聅聆聇聈聉聊聋职聍聎聏聐聑聒聓联聕聖聗聘聙聚聛聜聝聞聟聠聡聢聣聤聥聦聧聨聩聪聫聬聭聮聯聰聱聲聳聴聵聶職聸聹聺聻聼聽聾聿肀肁肂肃肄肅肆肇肈肉肊肋肌肍肎肏肐肑肒肓肔肕肖肗肘肙肚肛肜肝肞肟肠股肢肣肤肥肦肧肨肩肪肫肬肭肮肯肰肱育肳肴肵肶肷肸肹肺肻肼肽肾肿胀胁胂胃胄胅胆胇胈胉胊胋背胍胎胏胐胑胒胓胔胕胖胗胘胙胚胛胜胝胞胟胠胡胢胣胤胥胦胧胨胩胪胫胬胭胮胯胰胱胲胳胴胵胶胷胸胹胺胻胼能胾胿脀脁脂脃脄脅脆脇脈脉脊脋脌脍脎脏脐脑脒脓脔脕脖脗脘脙脚脛脜脝脞脟脠脡","脢脣脤脥脦脧脨脩脪脫脬脭脮脯脰脱脲脳脴脵脶脷脸脹脺脻脼脽脾脿腀腁腂腃腄腅腆腇腈腉腊腋腌腍腎腏腐腑腒腓腔腕腖腗腘腙腚腛腜腝腞腟腠腡腢腣腤腥腦腧腨腩腪腫腬腭腮腯腰腱腲腳腴腵腶腷腸腹腺腻腼腽腾腿膀膁膂膃膄膅膆膇膈膉膊膋膌膍膎膏膐膑膒膓膔膕膖膗膘膙膚膛膜膝膞膟膠膡膢膣膤膥膦膧膨膩膪膫膬膭膮膯膰膱膲膳膴膵膶膷膸膹膺膻膼膽膾膿臀臁臂臃臄臅臆臇臈臉臊臋臌臍臎臏臐臑臒臓臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臣臤臥臦臧臨臩自臫臬臭臮臯臰臱臲至致臵臶臷臸臹臺臻臼臽臾臿舀舁舂舃舄舅舆與興舉舊舋舌舍舎舏舐舑舒舓舔舕舖舗舘舙舚舛舜舝舞舟舠舡","舢舣舤舥舦舧舨舩航舫般舭舮舯舰舱舲舳舴舵舶舷舸船舺舻舼舽舾舿艀艁艂艃艄艅艆艇艈艉艊艋艌艍艎艏艐艑艒艓艔艕艖艗艘艙艚艛艜艝艞艟艠艡艢艣艤艥艦艧艨艩艪艫艬艭艮良艰艱色艳艴艵艶艷艸艹艺艻艼艽艾艿芀芁节芃芄芅芆芇芈芉芊芋芌芍芎芏芐芑芒芓芔芕芖芗芘芙芚芛芜芝芞芟芠芡芢芣芤芥芦芧芨芩芪芫芬芭芮芯芰花芲芳芴芵芶芷芸芹芺芻芼芽芾芿苀苁苂苃苄苅苆苇苈苉苊苋苌苍苎苏苐苑苒苓苔苕苖苗苘苙苚苛苜苝苞苟苠苡苢苣苤若苦苧苨苩苪苫苬苭苮苯苰英苲苳苴苵苶苷苸苹苺苻苼苽苾苿茀茁茂范茄茅茆茇茈茉茊茋茌茍茎茏茐茑茒茓茔茕茖茗茘茙茚茛茜茝茞茟茠茡","茢茣茤茥茦茧茨茩茪茫茬茭茮茯茰茱茲茳茴茵茶茷茸茹茺茻茼茽茾茿荀荁荂荃荄荅荆荇荈草荊荋荌荍荎荏荐荑荒荓荔荕荖荗荘荙荚荛荜荝荞荟荠荡荢荣荤荥荦荧荨荩荪荫荬荭荮药荰荱荲荳荴荵荶荷荸荹荺荻荼荽荾荿莀莁莂莃莄莅莆莇莈莉莊莋莌莍莎莏莐莑莒莓莔莕莖莗莘莙莚莛莜莝莞莟莠莡莢莣莤莥莦莧莨莩莪莫莬莭莮莯莰莱莲莳莴莵莶获莸莹莺莻莼莽莾莿菀菁菂菃菄菅菆菇菈菉菊菋菌菍菎菏菐菑菒菓菔菕菖菗菘菙菚菛菜菝菞菟菠菡菢菣菤菥菦菧菨菩菪菫菬菭菮華菰菱菲菳菴菵菶菷菸菹菺菻菼菽菾菿萀萁萂萃萄萅萆萇萈萉萊萋萌萍萎萏萐萑萒萓萔萕萖萗萘萙萚萛萜萝萞萟萠萡","萢萣萤营萦萧萨萩萪萫萬萭萮萯萰萱萲萳萴萵萶萷萸萹萺萻萼落萾萿葀葁葂葃葄葅葆葇葈葉葊葋葌葍葎葏葐葑葒葓葔葕葖著葘葙葚葛葜葝葞葟葠葡葢董葤葥葦葧葨葩葪葫葬葭葮葯葰葱葲葳葴葵葶葷葸葹葺葻葼葽葾葿蒀蒁蒂蒃蒄蒅蒆蒇蒈蒉蒊蒋蒌蒍蒎蒏蒐蒑蒒蒓蒔蒕蒖蒗蒘蒙蒚蒛蒜蒝蒞蒟蒠蒡蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒯蒰蒱蒲蒳蒴蒵蒶蒷蒸蒹蒺蒻蒼蒽蒾蒿蓀蓁蓂蓃蓄蓅蓆蓇蓈蓉蓊蓋蓌蓍蓎蓏蓐蓑蓒蓓蓔蓕蓖蓗蓘蓙蓚蓛蓜蓝蓞蓟蓠蓡蓢蓣蓤蓥蓦蓧蓨蓩蓪蓫蓬蓭蓮蓯蓰蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓼蓽蓾蓿蔀蔁蔂蔃蔄蔅蔆蔇蔈蔉蔊蔋蔌蔍蔎蔏蔐蔑蔒蔓蔔蔕蔖蔗蔘蔙蔚蔛蔜蔝蔞蔟蔠蔡","蔢蔣蔤蔥蔦蔧蔨蔩蔪蔫蔬蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔷蔸蔹蔺蔻蔼蔽蔾蔿蕀蕁蕂蕃蕄蕅蕆蕇蕈蕉蕊蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕蕖蕗蕘蕙蕚蕛蕜蕝蕞蕟蕠蕡蕢蕣蕤蕥蕦蕧蕨蕩蕪蕫蕬蕭蕮蕯蕰蕱蕲蕳蕴蕵蕶蕷蕸蕹蕺蕻蕼蕽蕾蕿薀薁薂薃薄薅薆薇薈薉薊薋薌薍薎薏薐薑薒薓薔薕薖薗薘薙薚薛薜薝薞薟薠薡薢薣薤薥薦薧薨薩薪薫薬薭薮薯薰薱薲薳薴薵薶薷薸薹薺薻薼薽薾薿藀藁藂藃藄藅藆藇藈藉藊藋藌藍藎藏藐藑藒藓藔藕藖藗藘藙藚藛藜藝藞藟藠藡藢藣藤藥藦藧藨藩藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸藹藺藻藼藽藾藿蘀蘁蘂蘃蘄蘅蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘑蘒蘓蘔蘕蘖蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡","蘢蘣蘤蘥蘦蘧蘨蘩蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘸蘹蘺蘻蘼蘽蘾蘿虀虁虂虃虄虅虆虇虈虉虊虋虌虍虎虏虐虑虒虓虔處虖虗虘虙虚虛虜虝虞號虠虡虢虣虤虥虦虧虨虩虪虫虬虭虮虯虰虱虲虳虴虵虶虷虸虹虺虻虼虽虾虿蚀蚁蚂蚃蚄蚅蚆蚇蚈蚉蚊蚋蚌蚍蚎蚏蚐蚑蚒蚓蚔蚕蚖蚗蚘蚙蚚蚛蚜蚝蚞蚟蚠蚡蚢蚣蚤蚥蚦蚧蚨蚩蚪蚫蚬蚭蚮蚯蚰蚱蚲蚳蚴蚵蚶蚷蚸蚹蚺蚻蚼蚽蚾蚿蛀蛁蛂蛃蛄蛅蛆蛇蛈蛉蛊蛋蛌蛍蛎蛏蛐蛑蛒蛓蛔蛕蛖蛗蛘蛙蛚蛛蛜蛝蛞蛟蛠蛡蛢蛣蛤蛥蛦蛧蛨蛩蛪蛫蛬蛭蛮蛯蛰蛱蛲蛳蛴蛵蛶蛷蛸蛹蛺蛻蛼蛽蛾蛿蜀蜁蜂蜃蜄蜅蜆蜇蜈蜉蜊蜋蜌蜍蜎蜏蜐蜑蜒蜓蜔蜕蜖蜗蜘蜙蜚蜛蜜蜝蜞蜟蜠蜡","蜢蜣蜤蜥蜦蜧蜨蜩蜪蜫蜬蜭蜮蜯蜰蜱蜲蜳蜴蜵蜶蜷蜸蜹蜺蜻蜼蜽蜾蜿蝀蝁蝂蝃蝄蝅蝆蝇蝈蝉蝊蝋蝌蝍蝎蝏蝐蝑蝒蝓蝔蝕蝖蝗蝘蝙蝚蝛蝜蝝蝞蝟蝠蝡蝢蝣蝤蝥蝦蝧蝨蝩蝪蝫蝬蝭蝮蝯蝰蝱蝲蝳蝴蝵蝶蝷蝸蝹蝺蝻蝼蝽蝾蝿螀螁螂螃螄螅螆螇螈螉螊螋螌融螎螏螐螑螒螓螔螕螖螗螘螙螚螛螜螝螞螟螠螡螢螣螤螥螦螧螨螩螪螫螬螭螮螯螰螱螲螳螴螵螶螷螸螹螺螻螼螽螾螿蟀蟁蟂蟃蟄蟅蟆蟇蟈蟉蟊蟋蟌蟍蟎蟏蟐蟑蟒蟓蟔蟕蟖蟗蟘蟙蟚蟛蟜蟝蟞蟟蟠蟡蟢蟣蟤蟥蟦蟧蟨蟩蟪蟫蟬蟭蟮蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸蟹蟺蟻蟼蟽蟾蟿蠀蠁蠂蠃蠄蠅蠆蠇蠈蠉蠊蠋蠌蠍蠎蠏蠐蠑蠒蠓蠔蠕蠖蠗蠘蠙蠚蠛蠜蠝蠞蠟蠠蠡","蠢蠣蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠲蠳蠴蠵蠶蠷蠸蠹蠺蠻蠼蠽蠾蠿血衁衂衃衄衅衆衇衈衉衊衋行衍衎衏衐衑衒術衔衕衖街衘衙衚衛衜衝衞衟衠衡衢衣衤补衦衧表衩衪衫衬衭衮衯衰衱衲衳衴衵衶衷衸衹衺衻衼衽衾衿袀袁袂袃袄袅袆袇袈袉袊袋袌袍袎袏袐袑袒袓袔袕袖袗袘袙袚袛袜袝袞袟袠袡袢袣袤袥袦袧袨袩袪被袬袭袮袯袰袱袲袳袴袵袶袷袸袹袺袻袼袽袾袿裀裁裂裃裄装裆裇裈裉裊裋裌裍裎裏裐裑裒裓裔裕裖裗裘裙裚裛補裝裞裟裠裡裢裣裤裥裦裧裨裩裪裫裬裭裮裯裰裱裲裳裴裵裶裷裸裹裺裻裼製裾裿褀褁褂褃褄褅褆複褈褉褊褋褌褍褎褏褐褑褒褓褔褕褖褗褘褙褚褛褜褝褞褟褠褡","褢褣褤褥褦褧褨褩褪褫褬褭褮褯褰褱褲褳褴褵褶褷褸褹褺褻褼褽褾褿襀襁襂襃襄襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襞襟襠襡襢襣襤襥襦襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襻襼襽襾西覀要覂覃覄覅覆覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀见观觃规觅视觇览觉觊觋觌觍觎觏觐觑角觓觔觕觖觗觘觙觚觛觜觝觞觟觠觡觢解觤觥触觧觨觩觪觫觬觭觮觯觰觱觲觳觴觵觶觷觸觹觺觻觼觽觾觿言訁訂訃訄訅訆訇計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝訞訟訠訡","訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訾訿詀詁詂詃詄詅詆詇詈詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詹詺詻詼詽詾詿誀誁誂誃誄誅誆誇誈誉誊誋誌認誎誏誐誑誒誓誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謇謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡","謢謣謤謥謦謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥警譧譨譩譪譫譬譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讠计订讣认讥讦讧讨让讪讫讬训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谉谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡","谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷谸谹谺谻谼谽谾谿豀豁豂豃豄豅豆豇豈豉豊豋豌豍豎豏豐豑豒豓豔豕豖豗豘豙豚豛豜豝豞豟豠象豢豣豤豥豦豧豨豩豪豫豬豭豮豯豰豱豲豳豴豵豶豷豸豹豺豻豼豽豾豿貀貁貂貃貄貅貆貇貈貉貊貋貌貍貎貏貐貑貒貓貔貕貖貗貘貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贝贞负贠贡","财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赤赥赦赧赨赩赪赫赬赭赮赯走赱赲赳赴赵赶起赸赹赺赻赼赽赾赿趀趁趂趃趄超趆趇趈趉越趋趌趍趎趏趐趑趒趓趔趕趖趗趘趙趚趛趜趝趞趟趠趡趢趣趤趥趦趧趨趩趪趫趬趭趮趯趰趱趲足趴趵趶趷趸趹趺趻趼趽趾趿跀跁跂跃跄跅跆跇跈跉跊跋跌跍跎跏跐跑跒跓跔跕跖跗跘跙跚跛跜距跞跟跠跡跢跣跤跥跦跧跨跩跪跫跬跭跮路跰跱跲跳跴践跶跷跸跹跺跻跼跽跾跿踀踁踂踃踄踅踆踇踈踉踊踋踌踍踎踏踐踑踒踓踔踕踖踗踘踙踚踛踜踝踞踟踠踡","踢踣踤踥踦踧踨踩踪踫踬踭踮踯踰踱踲踳踴踵踶踷踸踹踺踻踼踽踾踿蹀蹁蹂蹃蹄蹅蹆蹇蹈蹉蹊蹋蹌蹍蹎蹏蹐蹑蹒蹓蹔蹕蹖蹗蹘蹙蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹦蹧蹨蹩蹪蹫蹬蹭蹮蹯蹰蹱蹲蹳蹴蹵蹶蹷蹸蹹蹺蹻蹼蹽蹾蹿躀躁躂躃躄躅躆躇躈躉躊躋躌躍躎躏躐躑躒躓躔躕躖躗躘躙躚躛躜躝躞躟躠躡躢躣躤躥躦躧躨躩躪身躬躭躮躯躰躱躲躳躴躵躶躷躸躹躺躻躼躽躾躿軀軁軂軃軄軅軆軇軈軉車軋軌軍軎軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡","輢輣輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辛辜辝辞辟辠辡辢辣辤辥辦辧辨辩辪辫辬辭辮辯辰辱農辳辴辵辶辷辸边辺辻込辽达辿迀迁迂迃迄迅迆过迈迉迊迋迌迍迎迏运近迒迓返迕迖迗还这迚进远违连迟迠迡迢迣迤迥迦迧迨迩迪迫迬迭迮迯述迱迲迳迴迵迶迷迸迹迺迻迼追迾迿退送适逃逄逅逆逇逈选逊逋逌逍逎透逐逑递逓途逕逖逗逘這通逛逜逝逞速造逡","逢連逤逥逦逧逨逩逪逫逬逭逮逯逰週進逳逴逵逶逷逸逹逺逻逼逽逾逿遀遁遂遃遄遅遆遇遈遉遊運遌遍過遏遐遑遒道達違遖遗遘遙遚遛遜遝遞遟遠遡遢遣遤遥遦遧遨適遪遫遬遭遮遯遰遱遲遳遴遵遶遷選遹遺遻遼遽遾避邀邁邂邃還邅邆邇邈邉邊邋邌邍邎邏邐邑邒邓邔邕邖邗邘邙邚邛邜邝邞邟邠邡邢那邤邥邦邧邨邩邪邫邬邭邮邯邰邱邲邳邴邵邶邷邸邹邺邻邼邽邾邿郀郁郂郃郄郅郆郇郈郉郊郋郌郍郎郏郐郑郒郓郔郕郖郗郘郙郚郛郜郝郞郟郠郡郢郣郤郥郦郧部郩郪郫郬郭郮郯郰郱郲郳郴郵郶郷郸郹郺郻郼都郾郿鄀鄁鄂鄃鄄鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄙鄚鄛鄜鄝鄞鄟鄠鄡","鄢鄣鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄯鄰鄱鄲鄳鄴鄵鄶鄷鄸鄹鄺鄻鄼鄽鄾鄿酀酁酂酃酄酅酆酇酈酉酊酋酌配酎酏酐酑酒酓酔酕酖酗酘酙酚酛酜酝酞酟酠酡酢酣酤酥酦酧酨酩酪酫酬酭酮酯酰酱酲酳酴酵酶酷酸酹酺酻酼酽酾酿醀醁醂醃醄醅醆醇醈醉醊醋醌醍醎醏醐醑醒醓醔醕醖醗醘醙醚醛醜醝醞醟醠醡醢醣醤醥醦醧醨醩醪醫醬醭醮醯醰醱醲醳醴醵醶醷醸醹醺醻醼醽醾醿釀釁釂釃釄釅釆采釈釉释釋里重野量釐金釒釓釔釕釖釗釘釙釚釛釜針釞釟釠釡釢釣釤釥釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡","鈢鈣鈤鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉴鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅銆銇銈銉銊銋銌銍銎銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧銨銩銪銫銬銭銮銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋈鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡","錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錾錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍪鍫鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎏鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏊鏋鏌鏍鏎鏏鏐鏑鏒鏓鏔鏕鏖鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡","鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐾鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑫鑬鑭鑮鑯鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钅钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钜钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铇铈铉铊铋铌铍铎铏铐铑铒铓铔铕铖铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铩铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗锘错锚锛锜锝锞锟锠锡","锢锣锤锥锦锧锨锩锪锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镄镅镆镇镈镉镊镋镌镍镎镏镐镑镒镓镔镕镖镗镘镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镵镶長镸镹镺镻镼镽镾长門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛阜阝阞队阠阡","阢阣阤阥阦阧阨阩阪阫阬阭阮阯阰阱防阳阴阵阶阷阸阹阺阻阼阽阾阿陀陁陂陃附际陆陇陈陉陊陋陌降陎陏限陑陒陓陔陕陖陗陘陙陚陛陜陝陞陟陠陡院陣除陥陦陧陨险陪陫陬陭陮陯陰陱陲陳陴陵陶陷陸陹険陻陼陽陾陿隀隁隂隃隄隅隆隇隈隉隊隋隌隍階随隐隑隒隓隔隕隖隗隘隙隚際障隝隞隟隠隡隢隣隤隥隦隧隨隩險隫隬隭隮隯隰隱隲隳隴隵隶隷隸隹隺隻隼隽难隿雀雁雂雃雄雅集雇雈雉雊雋雌雍雎雏雐雑雒雓雔雕雖雗雘雙雚雛雜雝雞雟雠雡離難雤雥雦雧雨雩雪雫雬雭雮雯雰雱雲雳雴雵零雷雸雹雺電雼雽雾雿需霁霂霃霄霅霆震霈霉霊霋霌霍霎霏霐霑霒霓霔霕霖霗霘霙霚霛霜霝霞霟霠霡","霢霣霤霥霦霧霨霩霪霫霬霭霮霯霰霱露霳霴霵霶霷霸霹霺霻霼霽霾霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑青靓靔靕靖靗靘静靚靛靜靝非靟靠靡面靣靤靥靦靧靨革靪靫靬靭靮靯靰靱靲靳靴靵靶靷靸靹靺靻靼靽靾靿鞀鞁鞂鞃鞄鞅鞆鞇鞈鞉鞊鞋鞌鞍鞎鞏鞐鞑鞒鞓鞔鞕鞖鞗鞘鞙鞚鞛鞜鞝鞞鞟鞠鞡鞢鞣鞤鞥鞦鞧鞨鞩鞪鞫鞬鞭鞮鞯鞰鞱鞲鞳鞴鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣韤韥韦韧韨韩韪韫韬韭韮韯韰韱韲音韴韵韶韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡","頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮顯顰顱顲顳顴页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍风飏飐飑飒飓飔飕飖飗飘飙飚飛飜飝飞食飠飡飢飣飤飥飦飧飨飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇餈餉養餋餌餍餎餏餐餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡","餢餣餤餥餦餧館餩餪餫餬餭餮餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉饊饋饌饍饎饏饐饑饒饓饔饕饖饗饘饙饚饛饜饝饞饟饠饡饢饣饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕首馗馘香馚馛馜馝馞馟馠馡馢馣馤馥馦馧馨馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡","騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧骨骩骪骫骬骭骮骯骰骱骲骳骴骵骶骷骸骹骺骻骼骽骾骿髀髁髂髃髄髅髆髇髈髉髊髋髌髍髎髏髐髑髒髓體髕髖髗高髙髚髛髜髝髞髟髠髡髢髣髤髥髦髧髨髩髪髫髬髭髮髯髰髱髲髳髴髵髶髷髸髹髺髻髼髽髾髿鬀鬁鬂鬃鬄鬅鬆鬇鬈鬉鬊鬋鬌鬍鬎鬏鬐鬑鬒鬓鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬟鬠鬡","鬢鬣鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬯鬰鬱鬲鬳鬴鬵鬶鬷鬸鬹鬺鬻鬼鬽鬾鬿魀魁魂魃魄魅魆魇魈魉魊魋魌魍魎魏魐魑魒魓魔魕魖魗魘魙魚魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚鰛鰜鰝鰞鰟鰠鰡","鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺鱻鱼鱽鱾鱿鲀鲁鲂鲃鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳚鳛鳜鳝鳞鳟鳠鳡鳢鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡","鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸟鸠鸡","鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹙鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹮鹯鹰鹱鹲鹳鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽鹾鹿麀麁麂麃麄麅麆麇麈麉麊麋麌麍麎麏麐麑麒麓麔麕麖麗麘麙麚麛麜麝麞麟麠麡麢麣麤麥麦麧麨麩麪麫麬麭麮麯麰麱麲麳麴麵麶麷麸麹麺麻麼麽麾麿黀黁黂黃黄黅黆黇黈黉黊黋黌黍黎黏黐黑黒黓黔黕黖黗默黙黚黛黜黝點黟黠黡黢黣黤黥黦黧黨黩黪黫黬黭黮黯黰黱黲黳黴黵黶黷黸黹黺黻黼黽黾黿鼀鼁鼂鼃鼄鼅鼆鼇鼈鼉鼊鼋鼌鼍鼎鼏鼐鼑鼒鼓鼔鼕鼖鼗鼘鼙鼚鼛鼜鼝鼞鼟鼠鼡","鼢鼣鼤鼥鼦鼧鼨鼩鼪鼫鼬鼭鼮鼯鼰鼱鼲鼳鼴鼵鼶鼷鼸鼹鼺鼻鼼鼽鼾鼿齀齁齂齃齄齅齆齇齈齉齊齋齌齍齎齏齐齑齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸齹齺齻齼齽齾齿龀龁龂龃龄龅龆龇龈龉龊龋龌龍龎龏龐龑龒龓龔龕龖龗龘龙龚龛龜龝龞龟龠龡龢龣龤龥龦龧龨龩龪龫龬龭龮龯龰龱龲龳龴龵龶龷龸龹龺龻龼龽龾龿鿀鿁鿂鿃鿄鿅鿆鿇鿈鿉鿊鿋鿌鿍鿎鿏鿐鿑鿒鿓鿔鿕鿖鿗鿘鿙鿚鿛鿜鿝鿞鿟鿠鿡鿢鿣鿤鿥鿦鿧鿨鿩鿪鿫鿬鿭鿮鿯鿰鿱鿲鿳鿴鿵鿶鿷鿸鿹鿺鿻鿼鿽鿾鿿ꀀꀁꀂꀃꀄꀅꀆꀇꀈꀉꀊꀋꀌꀍꀎꀏꀐꀑꀒꀓꀔꀕꀖꀗꀘꀙꀚꀛꀜꀝꀞꀟꀠꀡ","ꀢꀣꀤꀥꀦꀧꀨꀩꀪꀫꀬꀭꀮꀯꀰꀱꀲꀳꀴꀵꀶꀷꀸꀹꀺꀻꀼꀽꀾꀿꁀꁁꁂꁃꁄꁅꁆꁇꁈꁉꁊꁋꁌꁍꁎꁏꁐꁑꁒꁓꁔꁕꁖꁗꁘꁙꁚꁛꁜꁝꁞꁟꁠꁡꁢꁣꁤꁥꁦꁧꁨꁩꁪꁫꁬꁭꁮꁯꁰꁱꁲꁳꁴꁵꁶꁷꁸꁹꁺꁻꁼꁽꁾꁿꂀꂁꂂꂃꂄꂅꂆꂇꂈꂉꂊꂋꂌꂍꂎꂏꂐꂑꂒꂓꂔꂕꂖꂗꂘꂙꂚꂛꂜꂝꂞꂟꂠꂡꂢꂣꂤꂥꂦꂧꂨꂩꂪꂫꂬꂭꂮꂯꂰꂱꂲꂳꂴꂵꂶꂷꂸꂹꂺꂻꂼꂽꂾꂿꃀꃁꃂꃃꃄꃅꃆꃇꃈꃉꃊꃋꃌꃍꃎꃏꃐꃑꃒꃓꃔꃕꃖꃗꃘꃙꃚꃛꃜꃝꃞꃟꃠꃡꃢꃣꃤꃥꃦꃧꃨꃩꃪꃫꃬꃭꃮꃯꃰꃱꃲꃳꃴꃵꃶꃷꃸꃹꃺꃻꃼꃽꃾꃿꄀꄁꄂꄃꄄꄅꄆꄇꄈꄉꄊꄋꄌꄍꄎꄏꄐꄑꄒꄓꄔꄕꄖꄗꄘꄙꄚꄛꄜꄝꄞꄟꄠꄡ","ꄢꄣꄤꄥꄦꄧꄨꄩꄪꄫꄬꄭꄮꄯꄰꄱꄲꄳꄴꄵꄶꄷꄸꄹꄺꄻꄼꄽꄾꄿꅀꅁꅂꅃꅄꅅꅆꅇꅈꅉꅊꅋꅌꅍꅎꅏꅐꅑꅒꅓꅔꅕꅖꅗꅘꅙꅚꅛꅜꅝꅞꅟꅠꅡꅢꅣꅤꅥꅦꅧꅨꅩꅪꅫꅬꅭꅮꅯꅰꅱꅲꅳꅴꅵꅶꅷꅸꅹꅺꅻꅼꅽꅾꅿꆀꆁꆂꆃꆄꆅꆆꆇꆈꆉꆊꆋꆌꆍꆎꆏꆐꆑꆒꆓꆔꆕꆖꆗꆘꆙꆚꆛꆜꆝꆞꆟꆠꆡꆢꆣꆤꆥꆦꆧꆨꆩꆪꆫꆬꆭꆮꆯꆰꆱꆲꆳꆴꆵꆶꆷꆸꆹꆺꆻꆼꆽꆾꆿꇀꇁꇂꇃꇄꇅꇆꇇꇈꇉꇊꇋꇌꇍꇎꇏꇐꇑꇒꇓꇔꇕꇖꇗꇘꇙꇚꇛꇜꇝꇞꇟꇠꇡꇢꇣꇤꇥꇦꇧꇨꇩꇪꇫꇬꇭꇮꇯꇰꇱꇲꇳꇴꇵꇶꇷꇸꇹꇺꇻꇼꇽꇾꇿꈀꈁꈂꈃꈄꈅꈆꈇꈈꈉꈊꈋꈌꈍꈎꈏꈐꈑꈒꈓꈔꈕꈖꈗꈘꈙꈚꈛꈜꈝꈞꈟꈠꈡ","ꈢꈣꈤꈥꈦꈧꈨꈩꈪꈫꈬꈭꈮꈯꈰꈱꈲꈳꈴꈵꈶꈷꈸꈹꈺꈻꈼꈽꈾꈿꉀꉁꉂꉃꉄꉅꉆꉇꉈꉉꉊꉋꉌꉍꉎꉏꉐꉑꉒꉓꉔꉕꉖꉗꉘꉙꉚꉛꉜꉝꉞꉟꉠꉡꉢꉣꉤꉥꉦꉧꉨꉩꉪꉫꉬꉭꉮꉯꉰꉱꉲꉳꉴꉵꉶꉷꉸꉹꉺꉻꉼꉽꉾꉿꊀꊁꊂꊃꊄꊅꊆꊇꊈꊉꊊꊋꊌꊍꊎꊏꊐꊑꊒꊓꊔꊕꊖꊗꊘꊙꊚꊛꊜꊝꊞꊟꊠꊡꊢꊣꊤꊥꊦꊧꊨꊩꊪꊫꊬꊭꊮꊯꊰꊱꊲꊳꊴꊵꊶꊷꊸꊹꊺꊻꊼꊽꊾꊿꋀꋁꋂꋃꋄꋅꋆꋇꋈꋉꋊꋋꋌꋍꋎꋏꋐꋑꋒꋓꋔꋕꋖꋗꋘꋙꋚꋛꋜꋝꋞꋟꋠꋡꋢꋣꋤꋥꋦꋧꋨꋩꋪꋫꋬꋭꋮꋯꋰꋱꋲꋳꋴꋵꋶꋷꋸꋹꋺꋻꋼꋽꋾꋿꌀꌁꌂꌃꌄꌅꌆꌇꌈꌉꌊꌋꌌꌍꌎꌏꌐꌑꌒꌓꌔꌕꌖꌗꌘꌙꌚꌛꌜꌝꌞꌟꌠꌡ","ꌢꌣꌤꌥꌦꌧꌨꌩꌪꌫꌬꌭꌮꌯꌰꌱꌲꌳꌴꌵꌶꌷꌸꌹꌺꌻꌼꌽꌾꌿꍀꍁꍂꍃꍄꍅꍆꍇꍈꍉꍊꍋꍌꍍꍎꍏꍐꍑꍒꍓꍔꍕꍖꍗꍘꍙꍚꍛꍜꍝꍞꍟꍠꍡꍢꍣꍤꍥꍦꍧꍨꍩꍪꍫꍬꍭꍮꍯꍰꍱꍲꍳꍴꍵꍶꍷꍸꍹꍺꍻꍼꍽꍾꍿꎀꎁꎂꎃꎄꎅꎆꎇꎈꎉꎊꎋꎌꎍꎎꎏꎐꎑꎒꎓꎔꎕꎖꎗꎘꎙꎚꎛꎜꎝꎞꎟꎠꎡꎢꎣꎤꎥꎦꎧꎨꎩꎪꎫꎬꎭꎮꎯꎰꎱꎲꎳꎴꎵꎶꎷꎸꎹꎺꎻꎼꎽꎾꎿꏀꏁꏂꏃꏄꏅꏆꏇꏈꏉꏊꏋꏌꏍꏎꏏꏐꏑꏒꏓꏔꏕꏖꏗꏘꏙꏚꏛꏜꏝꏞꏟꏠꏡꏢꏣꏤꏥꏦꏧꏨꏩꏪꏫꏬꏭꏮꏯꏰꏱꏲꏳꏴꏵꏶꏷꏸꏹꏺꏻꏼꏽꏾꏿꐀꐁꐂꐃꐄꐅꐆꐇꐈꐉꐊꐋꐌꐍꐎꐏꐐꐑꐒꐓꐔꐕꐖꐗꐘꐙꐚꐛꐜꐝꐞꐟꐠꐡ","ꐢꐣꐤꐥꐦꐧꐨꐩꐪꐫꐬꐭꐮꐯꐰꐱꐲꐳꐴꐵꐶꐷꐸꐹꐺꐻꐼꐽꐾꐿꑀꑁꑂꑃꑄꑅꑆꑇꑈꑉꑊꑋꑌꑍꑎꑏꑐꑑꑒꑓꑔꑕꑖꑗꑘꑙꑚꑛꑜꑝꑞꑟꑠꑡꑢꑣꑤꑥꑦꑧꑨꑩꑪꑫꑬꑭꑮꑯꑰꑱꑲꑳꑴꑵꑶꑷꑸꑹꑺꑻꑼꑽꑾꑿꒀꒁꒂꒃꒄꒅꒆꒇꒈꒉꒊꒋꒌ꒍꒎꒏꒐꒑꒒꒓꒔꒕꒖꒗꒘꒙꒚꒛꒜꒝꒞꒟꒠꒡꒢꒣꒤꒥꒦꒧꒨꒩꒪꒫꒬꒭꒮꒯꒰꒱꒲꒳꒴꒵꒶꒷꒸꒹꒺꒻꒼꒽꒾꒿꓀꓁꓂꓃꓄꓅꓆꓇꓈꓉꓊꓋꓌꓍꓎꓏ꓐꓑꓒꓓꓔꓕꓖꓗꓘꓙꓚꓛꓜꓝꓞꓟꓠꓡꓢꓣꓤꓥꓦꓧꓨꓩꓪꓫꓬꓭꓮꓯꓰꓱꓲꓳꓴꓵꓶꓷꓸꓹꓺꓻꓼꓽ꓾꓿ꔀꔁꔂꔃꔄꔅꔆꔇꔈꔉꔊꔋꔌꔍꔎꔏꔐꔑꔒꔓꔔꔕꔖꔗꔘꔙꔚꔛꔜꔝꔞꔟꔠꔡ","ꔢꔣꔤꔥꔦꔧꔨꔩꔪꔫꔬꔭꔮꔯꔰꔱꔲꔳꔴꔵꔶꔷꔸꔹꔺꔻꔼꔽꔾꔿꕀꕁꕂꕃꕄꕅꕆꕇꕈꕉꕊꕋꕌꕍꕎꕏꕐꕑꕒꕓꕔꕕꕖꕗꕘꕙꕚꕛꕜꕝꕞꕟꕠꕡꕢꕣꕤꕥꕦꕧꕨꕩꕪꕫꕬꕭꕮꕯꕰꕱꕲꕳꕴꕵꕶꕷꕸꕹꕺꕻꕼꕽꕾꕿꖀꖁꖂꖃꖄꖅꖆꖇꖈꖉꖊꖋꖌꖍꖎꖏꖐꖑꖒꖓꖔꖕꖖꖗꖘꖙꖚꖛꖜꖝꖞꖟꖠꖡꖢꖣꖤꖥꖦꖧꖨꖩꖪꖫꖬꖭꖮꖯꖰꖱꖲꖳꖴꖵꖶꖷꖸꖹꖺꖻꖼꖽꖾꖿꗀꗁꗂꗃꗄꗅꗆꗇꗈꗉꗊꗋꗌꗍꗎꗏꗐꗑꗒꗓꗔꗕꗖꗗꗘꗙꗚꗛꗜꗝꗞꗟꗠꗡꗢꗣꗤꗥꗦꗧꗨꗩꗪꗫꗬꗭꗮꗯꗰꗱꗲꗳꗴꗵꗶꗷꗸꗹꗺꗻꗼꗽꗾꗿꘀꘁꘂꘃꘄꘅꘆꘇꘈꘉꘊꘋꘌ꘍꘎꘏ꘐꘑꘒꘓꘔꘕꘖꘗꘘꘙꘚꘛꘜꘝꘞꘟ꘠꘡","꘢꘣꘤꘥꘦꘧꘨꘩ꘪꘫ꘬꘭꘮꘯꘰꘱꘲꘳꘴꘵꘶꘷꘸꘹꘺꘻꘼꘽꘾꘿ꙀꙁꙂꙃꙄꙅꙆꙇꙈꙉꙊꙋꙌꙍꙎꙏꙐꙑꙒꙓꙔꙕꙖꙗꙘꙙꙚꙛꙜꙝꙞꙟꙠꙡꙢꙣꙤꙥꙦꙧꙨꙩꙪꙫꙬꙭꙮ꙯꙰꙱꙲꙳ꙴꙵꙶꙷꙸꙹꙺꙻ꙼꙽꙾ꙿꚀꚁꚂꚃꚄꚅꚆꚇꚈꚉꚊꚋꚌꚍꚎꚏꚐꚑꚒꚓꚔꚕꚖꚗꚘꚙꚚꚛꚜꚝꚞꚟꚠꚡꚢꚣꚤꚥꚦꚧꚨꚩꚪꚫꚬꚭꚮꚯꚰꚱꚲꚳꚴꚵꚶꚷꚸꚹꚺꚻꚼꚽꚾꚿꛀꛁꛂꛃꛄꛅꛆꛇꛈꛉꛊꛋꛌꛍꛎꛏꛐꛑꛒꛓꛔꛕꛖꛗꛘꛙꛚꛛꛜꛝꛞꛟꛠꛡꛢꛣꛤꛥꛦꛧꛨꛩꛪꛫꛬꛭꛮꛯ꛰꛱꛲꛳꛴꛵꛶꛷꛸꛹꛺꛻꛼꛽꛾꛿꜀꜁꜂꜃꜄꜅꜆꜇꜈꜉꜊꜋꜌꜍꜎꜏꜐꜑꜒꜓꜔꜕꜖ꜗꜘꜙꜚꜛꜜꜝꜞꜟ꜠꜡","ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿꝀꝁꝂꝃꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿꞀꞁꞂꞃꞄꞅꞆꞇꞈ꞉꞊ꞋꞌꞍꞎꞏꞐꞑꞒꞓꞔꞕꞖꞗꞘꞙꞚꞛꞜꞝꞞꞟꞠꞡꞢꞣꞤꞥꞦꞧꞨꞩꞪꞫꞬꞭꞮꞯꞰꞱꞲꞳꞴꞵꞶꞷꞸꞹꞺꞻꞼꞽꞾꞿꟀꟁꟂꟃꟄꟅꟆꟇꟈꟉꟊꟋꟌꟍ꟎꟏Ꟑꟑ꟒ꟓ꟔ꟕꟖꟗꟘꟙꟚꟛꟜ꟝꟞꟟꟠꟡꟢꟣꟤꟥꟦꟧꟨꟩꟪꟫꟬꟭꟮꟯꟰꟱ꟲꟳꟴꟵꟶꟷꟸꟹꟺꟻꟼꟽꟾꟿꠀꠁꠂꠃꠄꠅ꠆ꠇꠈꠉꠊꠋꠌꠍꠎꠏꠐꠑꠒꠓꠔꠕꠖꠗꠘꠙꠚꠛꠜꠝꠞꠟꠠꠡ","ꠢꠣꠤꠥꠦꠧ꠨꠩꠪꠫꠬꠭꠮꠯꠰꠱꠲꠳꠴꠵꠶꠷꠸꠹꠺꠻꠼꠽꠾꠿ꡀꡁꡂꡃꡄꡅꡆꡇꡈꡉꡊꡋꡌꡍꡎꡏꡐꡑꡒꡓꡔꡕꡖꡗꡘꡙꡚꡛꡜꡝꡞꡟꡠꡡꡢꡣꡤꡥꡦꡧꡨꡩꡪꡫꡬꡭꡮꡯꡰꡱꡲꡳ꡴꡵꡶꡷꡸꡹꡺꡻꡼꡽꡾꡿ꢀꢁꢂꢃꢄꢅꢆꢇꢈꢉꢊꢋꢌꢍꢎꢏꢐꢑꢒꢓꢔꢕꢖꢗꢘꢙꢚꢛꢜꢝꢞꢟꢠꢡꢢꢣꢤꢥꢦꢧꢨꢩꢪꢫꢬꢭꢮꢯꢰꢱꢲꢳꢴꢵꢶꢷꢸꢹꢺꢻꢼꢽꢾꢿꣀꣁꣂꣃ꣄ꣅ꣆꣇꣈꣉꣊꣋꣌꣍꣎꣏꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꣚꣛꣜꣝꣞꣟꣠꣡꣢꣣꣤꣥꣦꣧꣨꣩꣪꣫꣬꣭꣮꣯꣰꣱ꣲꣳꣴꣵꣶꣷ꣸꣹꣺ꣻ꣼ꣽꣾꣿ꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉ꤊꤋꤌꤍꤎꤏꤐꤑꤒꤓꤔꤕꤖꤗꤘꤙꤚꤛꤜꤝꤞꤟꤠꤡ","ꤢꤣꤤꤥꤦꤧꤨꤩꤪ꤫꤬꤭꤮꤯ꤰꤱꤲꤳꤴꤵꤶꤷꤸꤹꤺꤻꤼꤽꤾꤿꥀꥁꥂꥃꥄꥅꥆꥇꥈꥉꥊꥋꥌꥍꥎꥏꥐꥑꥒ꥓꥔꥕꥖꥗꥘꥙꥚꥛꥜꥝꥞꥟ꥠꥡꥢꥣꥤꥥꥦꥧꥨꥩꥪꥫꥬꥭꥮꥯꥰꥱꥲꥳꥴꥵꥶꥷꥸꥹꥺꥻꥼ꥽꥾꥿ꦀꦁꦂꦃꦄꦅꦆꦇꦈꦉꦊꦋꦌꦍꦎꦏꦐꦑꦒꦓꦔꦕꦖꦗꦘꦙꦚꦛꦜꦝꦞꦟꦠꦡꦢꦣꦤꦥꦦꦧꦨꦩꦪꦫꦬꦭꦮꦯꦰꦱꦲ꦳ꦴꦵꦶꦷꦸꦹꦺꦻꦼꦽꦾꦿ꧀꧁꧂꧃꧄꧅꧆꧇꧈꧉꧊꧋꧌꧍꧎ꧏ꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙꧚꧛꧜꧝꧞꧟ꧠꧡꧢꧣꧤꧥꧦꧧꧨꧩꧪꧫꧬꧭꧮꧯ꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹ꧺꧻꧼꧽꧾ꧿ꨀꨁꨂꨃꨄꨅꨆꨇꨈꨉꨊꨋꨌꨍꨎꨏꨐꨑꨒꨓꨔꨕꨖꨗꨘꨙꨚꨛꨜꨝꨞꨟꨠꨡ","ꨢꨣꨤꨥꨦꨧꨨꨩꨪꨫꨬꨭꨮꨯꨰꨱꨲꨳꨴꨵꨶ꨷꨸꨹꨺꨻꨼꨽꨾꨿ꩀꩁꩂꩃꩄꩅꩆꩇꩈꩉꩊꩋꩌꩍ꩎꩏꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙꩚꩛꩜꩝꩞꩟ꩠꩡꩢꩣꩤꩥꩦꩧꩨꩩꩪꩫꩬꩭꩮꩯꩰꩱꩲꩳꩴꩵꩶ꩷꩸꩹ꩺꩻꩼꩽꩾꩿꪀꪁꪂꪃꪄꪅꪆꪇꪈꪉꪊꪋꪌꪍꪎꪏꪐꪑꪒꪓꪔꪕꪖꪗꪘꪙꪚꪛꪜꪝꪞꪟꪠꪡꪢꪣꪤꪥꪦꪧꪨꪩꪪꪫꪬꪭꪮꪯꪰꪱꪴꪲꪳꪵꪶꪷꪸꪹꪺꪻꪼꪽꪾ꪿ꫀ꫁ꫂ꫃꫄꫅꫆꫇꫈꫉꫊꫋꫌꫍꫎꫏꫐꫑꫒꫓꫔꫕꫖꫗꫘꫙꫚ꫛꫜꫝ꫞꫟ꫠꫡꫢꫣꫤꫥꫦꫧꫨꫩꫪꫫꫬꫭꫮꫯ꫰꫱ꫲꫳꫴꫵ꫶꫷꫸꫹꫺꫻꫼꫽꫾꫿꬀ꬁꬂꬃꬄꬅꬆ꬇꬈ꬉꬊꬋꬌꬍꬎ꬏꬐ꬑꬒꬓꬔꬕꬖ꬗꬘꬙꬚꬛꬜꬝꬞꬟ꬠꬡ","ꬢꬣꬤꬥꬦ꬧ꬨꬩꬪꬫꬬꬭꬮ꬯ꬰꬱꬲꬳꬴꬵꬶꬷꬸꬹꬺꬻꬼꬽꬾꬿꭀꭁꭂꭃꭄꭅꭆꭇꭈꭉꭊꭋꭌꭍꭎꭏꭐꭑꭒꭓꭔꭕꭖꭗꭘꭙꭚ꭛ꭜꭝꭞꭟꭠꭡꭢꭣꭤꭥꭦꭧꭨꭩ꭪꭫꭬꭭꭮꭯ꭰꭱꭲꭳꭴꭵꭶꭷꭸꭹꭺꭻꭼꭽꭾꭿꮀꮁꮂꮃꮄꮅꮆꮇꮈꮉꮊꮋꮌꮍꮎꮏꮐꮑꮒꮓꮔꮕꮖꮗꮘꮙꮚꮛꮜꮝꮞꮟꮠꮡꮢꮣꮤꮥꮦꮧꮨꮩꮪꮫꮬꮭꮮꮯꮰꮱꮲꮳꮴꮵꮶꮷꮸꮹꮺꮻꮼꮽꮾꮿꯀꯁꯂꯃꯄꯅꯆꯇꯈꯉꯊꯋꯌꯍꯎꯏꯐꯑꯒꯓꯔꯕꯖꯗꯘꯙꯚꯛꯜꯝꯞꯟꯠꯡꯢꯣꯤꯥꯦꯧꯨꯩꯪ꯫꯬꯭꯮꯯꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹꯺꯻꯼꯽꯾꯿가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛개객갞갟갠갡","갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓걔걕걖걗걘걙걚걛걜걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯거걱걲걳건걵걶걷걸걹걺걻걼걽걾걿검겁겂것겄겅겆겇겈겉겊겋게겍겎겏겐겑겒겓겔겕겖겗겘겙겚겛겜겝겞겟겠겡겢겣겤겥겦겧겨격겪겫견겭겮겯결겱겲겳겴겵겶겷겸겹겺겻겼경겾겿곀곁곂곃계곅곆곇곈곉곊곋곌곍곎곏곐곑곒곓곔곕곖곗곘곙곚곛곜곝곞곟고곡곢곣곤곥곦곧골곩곪곫곬곭곮곯곰곱곲곳곴공곶곷곸곹곺곻과곽곾곿관괁괂괃괄괅괆괇괈괉괊괋괌괍괎괏괐광괒괓괔괕괖괗괘괙괚괛괜괝괞괟괠괡","괢괣괤괥괦괧괨괩괪괫괬괭괮괯괰괱괲괳괴괵괶괷괸괹괺괻괼괽괾괿굀굁굂굃굄굅굆굇굈굉굊굋굌굍굎굏교굑굒굓굔굕굖굗굘굙굚굛굜굝굞굟굠굡굢굣굤굥굦굧굨굩굪굫구국굮굯군굱굲굳굴굵굶굷굸굹굺굻굼굽굾굿궀궁궂궃궄궅궆궇궈궉궊궋권궍궎궏궐궑궒궓궔궕궖궗궘궙궚궛궜궝궞궟궠궡궢궣궤궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궷궸궹궺궻궼궽궾궿귀귁귂귃귄귅귆귇귈귉귊귋귌귍귎귏귐귑귒귓귔귕귖귗귘귙귚귛규귝귞귟균귡귢귣귤귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷그극귺귻근귽귾귿글긁긂긃긄긅긆긇금급긊긋긌긍긎긏긐긑긒긓긔긕긖긗긘긙긚긛긜긝긞긟긠긡","긢긣긤긥긦긧긨긩긪긫긬긭긮긯기긱긲긳긴긵긶긷길긹긺긻긼긽긾긿김깁깂깃깄깅깆깇깈깉깊깋까깍깎깏깐깑깒깓깔깕깖깗깘깙깚깛깜깝깞깟깠깡깢깣깤깥깦깧깨깩깪깫깬깭깮깯깰깱깲깳깴깵깶깷깸깹깺깻깼깽깾깿꺀꺁꺂꺃꺄꺅꺆꺇꺈꺉꺊꺋꺌꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺼꺽꺾꺿껀껁껂껃껄껅껆껇껈껉껊껋껌껍껎껏껐껑껒껓껔껕껖껗께껙껚껛껜껝껞껟껠껡껢껣껤껥껦껧껨껩껪껫껬껭껮껯껰껱껲껳껴껵껶껷껸껹껺껻껼껽껾껿꼀꼁꼂꼃꼄꼅꼆꼇꼈꼉꼊꼋꼌꼍꼎꼏꼐꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡","꼢꼣꼤꼥꼦꼧꼨꼩꼪꼫꼬꼭꼮꼯꼰꼱꼲꼳꼴꼵꼶꼷꼸꼹꼺꼻꼼꼽꼾꼿꽀꽁꽂꽃꽄꽅꽆꽇꽈꽉꽊꽋꽌꽍꽎꽏꽐꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽜꽝꽞꽟꽠꽡꽢꽣꽤꽥꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽹꽺꽻꽼꽽꽾꽿꾀꾁꾂꾃꾄꾅꾆꾇꾈꾉꾊꾋꾌꾍꾎꾏꾐꾑꾒꾓꾔꾕꾖꾗꾘꾙꾚꾛꾜꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾸꾹꾺꾻꾼꾽꾾꾿꿀꿁꿂꿃꿄꿅꿆꿇꿈꿉꿊꿋꿌꿍꿎꿏꿐꿑꿒꿓꿔꿕꿖꿗꿘꿙꿚꿛꿜꿝꿞꿟꿠꿡꿢꿣꿤꿥꿦꿧꿨꿩꿪꿫꿬꿭꿮꿯꿰꿱꿲꿳꿴꿵꿶꿷꿸꿹꿺꿻꿼꿽꿾꿿뀀뀁뀂뀃뀄뀅뀆뀇뀈뀉뀊뀋뀌뀍뀎뀏뀐뀑뀒뀓뀔뀕뀖뀗뀘뀙뀚뀛뀜뀝뀞뀟뀠뀡","뀢뀣뀤뀥뀦뀧뀨뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끄끅끆끇끈끉끊끋끌끍끎끏끐끑끒끓끔끕끖끗끘끙끚끛끜끝끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끼끽끾끿낀낁낂낃낄낅낆낇낈낉낊낋낌낍낎낏낐낑낒낓낔낕낖낗나낙낚낛난낝낞낟날낡낢낣낤낥낦낧남납낪낫났낭낮낯낰낱낲낳내낵낶낷낸낹낺낻낼낽낾낿냀냁냂냃냄냅냆냇냈냉냊냋냌냍냎냏냐냑냒냓냔냕냖냗냘냙냚냛냜냝냞냟냠냡냢냣냤냥냦냧냨냩냪냫냬냭냮냯냰냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇너넉넊넋넌넍넎넏널넑넒넓넔넕넖넗넘넙넚넛넜넝넞넟넠넡","넢넣네넥넦넧넨넩넪넫넬넭넮넯넰넱넲넳넴넵넶넷넸넹넺넻넼넽넾넿녀녁녂녃년녅녆녇녈녉녊녋녌녍녎녏념녑녒녓녔녕녖녗녘녙녚녛녜녝녞녟녠녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷노녹녺녻논녽녾녿놀놁놂놃놄놅놆놇놈놉놊놋놌농놎놏놐놑높놓놔놕놖놗놘놙놚놛놜놝놞놟놠놡놢놣놤놥놦놧놨놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇌뇍뇎뇏뇐뇑뇒뇓뇔뇕뇖뇗뇘뇙뇚뇛뇜뇝뇞뇟뇠뇡뇢뇣뇤뇥뇦뇧뇨뇩뇪뇫뇬뇭뇮뇯뇰뇱뇲뇳뇴뇵뇶뇷뇸뇹뇺뇻뇼뇽뇾뇿눀눁눂눃누눅눆눇눈눉눊눋눌눍눎눏눐눑눒눓눔눕눖눗눘눙눚눛눜눝눞눟눠눡","눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눴눵눶눷눸눹눺눻눼눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉘뉙뉚뉛뉜뉝뉞뉟뉠뉡뉢뉣뉤뉥뉦뉧뉨뉩뉪뉫뉬뉭뉮뉯뉰뉱뉲뉳뉴뉵뉶뉷뉸뉹뉺뉻뉼뉽뉾뉿늀늁늂늃늄늅늆늇늈늉늊늋늌늍늎늏느늑늒늓는늕늖늗늘늙늚늛늜늝늞늟늠늡늢늣늤능늦늧늨늩늪늫늬늭늮늯늰늱늲늳늴늵늶늷늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇니닉닊닋닌닍닎닏닐닑닒닓닔닕닖닗님닙닚닛닜닝닞닟닠닡닢닣다닥닦닧단닩닪닫달닭닮닯닰닱닲닳담답닶닷닸당닺닻닼닽닾닿대댁댂댃댄댅댆댇댈댉댊댋댌댍댎댏댐댑댒댓댔댕댖댗댘댙댚댛댜댝댞댟댠댡","댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓더덕덖덗던덙덚덛덜덝덞덟덠덡덢덣덤덥덦덧덨덩덪덫덬덭덮덯데덱덲덳덴덵덶덷델덹덺덻덼덽덾덿뎀뎁뎂뎃뎄뎅뎆뎇뎈뎉뎊뎋뎌뎍뎎뎏뎐뎑뎒뎓뎔뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎠뎡뎢뎣뎤뎥뎦뎧뎨뎩뎪뎫뎬뎭뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃도독돆돇돈돉돊돋돌돍돎돏돐돑돒돓돔돕돖돗돘동돚돛돜돝돞돟돠돡돢돣돤돥돦돧돨돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돼돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됐됑됒됓됔됕됖됗되됙됚됛된됝됞됟될됡","됢됣됤됥됦됧됨됩됪됫됬됭됮됯됰됱됲됳됴됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄둅둆둇둈둉둊둋둌둍둎둏두둑둒둓둔둕둖둗둘둙둚둛둜둝둞둟둠둡둢둣둤둥둦둧둨둩둪둫둬둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒀뒁뒂뒃뒄뒅뒆뒇뒈뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒝뒞뒟뒠뒡뒢뒣뒤뒥뒦뒧뒨뒩뒪뒫뒬뒭뒮뒯뒰뒱뒲뒳뒴뒵뒶뒷뒸뒹뒺뒻뒼뒽뒾뒿듀듁듂듃듄듅듆듇듈듉듊듋듌듍듎듏듐듑듒듓듔듕듖듗듘듙듚듛드득듞듟든듡듢듣들듥듦듧듨듩듪듫듬듭듮듯듰등듲듳듴듵듶듷듸듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓디딕딖딗딘딙딚딛딜딝딞딟딠딡","딢딣딤딥딦딧딨딩딪딫딬딭딮딯따딱딲딳딴딵딶딷딸딹딺딻딼딽딾딿땀땁땂땃땄땅땆땇땈땉땊땋때땍땎땏땐땑땒땓땔땕땖땗땘땙땚땛땜땝땞땟땠땡땢땣땤땥땦땧땨땩땪땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떠떡떢떣떤떥떦떧떨떩떪떫떬떭떮떯떰떱떲떳떴떵떶떷떸떹떺떻떼떽떾떿뗀뗁뗂뗃뗄뗅뗆뗇뗈뗉뗊뗋뗌뗍뗎뗏뗐뗑뗒뗓뗔뗕뗖뗗뗘뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗬뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏또똑똒똓똔똕똖똗똘똙똚똛똜똝똞똟똠똡","똢똣똤똥똦똧똨똩똪똫똬똭똮똯똰똱똲똳똴똵똶똷똸똹똺똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙈뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙤뙥뙦뙧뙨뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚜뚝뚞뚟뚠뚡뚢뚣뚤뚥뚦뚧뚨뚩뚪뚫뚬뚭뚮뚯뚰뚱뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛔뛕뛖뛗뛘뛙뛚뛛뛜뛝뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛰뛱뛲뛳뛴뛵뛶뛷뛸뛹뛺뛻뛼뛽뛾뛿뜀뜁뜂뜃뜄뜅뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡","뜢뜣뜤뜥뜦뜧뜨뜩뜪뜫뜬뜭뜮뜯뜰뜱뜲뜳뜴뜵뜶뜷뜸뜹뜺뜻뜼뜽뜾뜿띀띁띂띃띄띅띆띇띈띉띊띋띌띍띎띏띐띑띒띓띔띕띖띗띘띙띚띛띜띝띞띟띠띡띢띣띤띥띦띧띨띩띪띫띬띭띮띯띰띱띲띳띴띵띶띷띸띹띺띻라락띾띿란랁랂랃랄랅랆랇랈랉랊랋람랍랎랏랐랑랒랓랔랕랖랗래랙랚랛랜랝랞랟랠랡랢랣랤랥랦랧램랩랪랫랬랭랮랯랰랱랲랳랴략랶랷랸랹랺랻랼랽랾랿럀럁럂럃럄럅럆럇럈량럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝럞럟럠럡럢럣럤럥럦럧럨럩럪럫러럭럮럯런럱럲럳럴럵럶럷럸럹럺럻럼럽럾럿렀렁렂렃렄렅렆렇레렉렊렋렌렍렎렏렐렑렒렓렔렕렖렗렘렙렚렛렜렝렞렟렠렡","렢렣려력렦렧련렩렪렫렬렭렮렯렰렱렲렳렴렵렶렷렸령렺렻렼렽렾렿례롁롂롃롄롅롆롇롈롉롊롋롌롍롎롏롐롑롒롓롔롕롖롗롘롙롚롛로록롞롟론롡롢롣롤롥롦롧롨롩롪롫롬롭롮롯롰롱롲롳롴롵롶롷롸롹롺롻롼롽롾롿뢀뢁뢂뢃뢄뢅뢆뢇뢈뢉뢊뢋뢌뢍뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟뢠뢡뢢뢣뢤뢥뢦뢧뢨뢩뢪뢫뢬뢭뢮뢯뢰뢱뢲뢳뢴뢵뢶뢷뢸뢹뢺뢻뢼뢽뢾뢿룀룁룂룃룄룅룆룇룈룉룊룋료룍룎룏룐룑룒룓룔룕룖룗룘룙룚룛룜룝룞룟룠룡룢룣룤룥룦룧루룩룪룫룬룭룮룯룰룱룲룳룴룵룶룷룸룹룺룻룼룽룾룿뤀뤁뤂뤃뤄뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤘뤙뤚뤛뤜뤝뤞뤟뤠뤡","뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤼뤽뤾뤿륀륁륂륃륄륅륆륇륈륉륊륋륌륍륎륏륐륑륒륓륔륕륖륗류륙륚륛륜륝륞륟률륡륢륣륤륥륦륧륨륩륪륫륬륭륮륯륰륱륲륳르륵륶륷른륹륺륻를륽륾륿릀릁릂릃름릅릆릇릈릉릊릋릌릍릎릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞릟릠릡릢릣릤릥릦릧릨릩릪릫리릭릮릯린릱릲릳릴릵릶릷릸릹릺릻림립릾릿맀링맂맃맄맅맆맇마막맊맋만맍많맏말맑맒맓맔맕맖맗맘맙맚맛맜망맞맟맠맡맢맣매맥맦맧맨맩맪맫맬맭맮맯맰맱맲맳맴맵맶맷맸맹맺맻맼맽맾맿먀먁먂먃먄먅먆먇먈먉먊먋먌먍먎먏먐먑먒먓먔먕먖먗먘먙먚먛먜먝먞먟먠먡","먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷머먹먺먻먼먽먾먿멀멁멂멃멄멅멆멇멈멉멊멋멌멍멎멏멐멑멒멓메멕멖멗멘멙멚멛멜멝멞멟멠멡멢멣멤멥멦멧멨멩멪멫멬멭멮멯며멱멲멳면멵멶멷멸멹멺멻멼멽멾멿몀몁몂몃몄명몆몇몈몉몊몋몌몍몎몏몐몑몒몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧모목몪몫몬몭몮몯몰몱몲몳몴몵몶몷몸몹몺못몼몽몾몿뫀뫁뫂뫃뫄뫅뫆뫇뫈뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫘뫙뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫼뫽뫾뫿묀묁묂묃묄묅묆묇묈묉묊묋묌묍묎묏묐묑묒묓묔묕묖묗묘묙묚묛묜묝묞묟묠묡","묢묣묤묥묦묧묨묩묪묫묬묭묮묯묰묱묲묳무묵묶묷문묹묺묻물묽묾묿뭀뭁뭂뭃뭄뭅뭆뭇뭈뭉뭊뭋뭌뭍뭎뭏뭐뭑뭒뭓뭔뭕뭖뭗뭘뭙뭚뭛뭜뭝뭞뭟뭠뭡뭢뭣뭤뭥뭦뭧뭨뭩뭪뭫뭬뭭뭮뭯뭰뭱뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮈뮉뮊뮋뮌뮍뮎뮏뮐뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮤뮥뮦뮧뮨뮩뮪뮫뮬뮭뮮뮯뮰뮱뮲뮳뮴뮵뮶뮷뮸뮹뮺뮻뮼뮽뮾뮿므믁믂믃믄믅믆믇믈믉믊믋믌믍믎믏믐믑믒믓믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷미믹믺믻민믽믾믿밀밁밂밃밄밅밆밇밈밉밊밋밌밍밎및밐밑밒밓바박밖밗반밙밚받발밝밞밟밠밡","밢밣밤밥밦밧밨방밪밫밬밭밮밯배백밲밳밴밵밶밷밸밹밺밻밼밽밾밿뱀뱁뱂뱃뱄뱅뱆뱇뱈뱉뱊뱋뱌뱍뱎뱏뱐뱑뱒뱓뱔뱕뱖뱗뱘뱙뱚뱛뱜뱝뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃버벅벆벇번벉벊벋벌벍벎벏벐벑벒벓범법벖벗벘벙벚벛벜벝벞벟베벡벢벣벤벥벦벧벨벩벪벫벬벭벮벯벰벱벲벳벴벵벶벷벸벹벺벻벼벽벾벿변볁볂볃별볅볆볇볈볉볊볋볌볍볎볏볐병볒볓볔볕볖볗볘볙볚볛볜볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳보복볶볷본볹볺볻볼볽볾볿봀봁봂봃봄봅봆봇봈봉봊봋봌봍봎봏봐봑봒봓봔봕봖봗봘봙봚봛봜봝봞봟봠봡","봢봣봤봥봦봧봨봩봪봫봬봭봮봯봰봱봲봳봴봵봶봷봸봹봺봻봼봽봾봿뵀뵁뵂뵃뵄뵅뵆뵇뵈뵉뵊뵋뵌뵍뵎뵏뵐뵑뵒뵓뵔뵕뵖뵗뵘뵙뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵤뵥뵦뵧뵨뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿부북붂붃분붅붆붇불붉붊붋붌붍붎붏붐붑붒붓붔붕붖붗붘붙붚붛붜붝붞붟붠붡붢붣붤붥붦붧붨붩붪붫붬붭붮붯붰붱붲붳붴붵붶붷붸붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑뷒뷓뷔뷕뷖뷗뷘뷙뷚뷛뷜뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷩뷪뷫뷬뷭뷮뷯뷰뷱뷲뷳뷴뷵뷶뷷뷸뷹뷺뷻뷼뷽뷾뷿븀븁븂븃븄븅븆븇븈븉븊븋브븍븎븏븐븑븒븓블븕븖븗븘븙븚븛븜븝븞븟븠븡","븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃비빅빆빇빈빉빊빋빌빍빎빏빐빑빒빓빔빕빖빗빘빙빚빛빜빝빞빟빠빡빢빣빤빥빦빧빨빩빪빫빬빭빮빯빰빱빲빳빴빵빶빷빸빹빺빻빼빽빾빿뺀뺁뺂뺃뺄뺅뺆뺇뺈뺉뺊뺋뺌뺍뺎뺏뺐뺑뺒뺓뺔뺕뺖뺗뺘뺙뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺨뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻐뻑뻒뻓뻔뻕뻖뻗뻘뻙뻚뻛뻜뻝뻞뻟뻠뻡뻢뻣뻤뻥뻦뻧뻨뻩뻪뻫뻬뻭뻮뻯뻰뻱뻲뻳뻴뻵뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼁뼂뼃뼄뼅뼆뼇뼈뼉뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼘뼙뼚뼛뼜뼝뼞뼟뼠뼡","뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽀뽁뽂뽃뽄뽅뽆뽇뽈뽉뽊뽋뽌뽍뽎뽏뽐뽑뽒뽓뽔뽕뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾔뾕뾖뾗뾘뾙뾚뾛뾜뾝뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾰뾱뾲뾳뾴뾵뾶뾷뾸뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿅뿆뿇뿈뿉뿊뿋뿌뿍뿎뿏뿐뿑뿒뿓뿔뿕뿖뿗뿘뿙뿚뿛뿜뿝뿞뿟뿠뿡뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡","쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀼쀽쀾쀿쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁑쁒쁓쁔쁕쁖쁗쁘쁙쁚쁛쁜쁝쁞쁟쁠쁡쁢쁣쁤쁥쁦쁧쁨쁩쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삐삑삒삓삔삕삖삗삘삙삚삛삜삝삞삟삠삡삢삣삤삥삦삧삨삩삪삫사삭삮삯산삱삲삳살삵삶삷삸삹삺삻삼삽삾삿샀상샂샃샄샅샆샇새색샊샋샌샍샎샏샐샑샒샓샔샕샖샗샘샙샚샛샜생샞샟샠샡샢샣샤샥샦샧샨샩샪샫샬샭샮샯샰샱샲샳샴샵샶샷샸샹샺샻샼샽샾샿섀섁섂섃섄섅섆섇섈섉섊섋섌섍섎섏섐섑섒섓섔섕섖섗섘섙섚섛서석섞섟선섡","섢섣설섥섦섧섨섩섪섫섬섭섮섯섰성섲섳섴섵섶섷세섹섺섻센섽섾섿셀셁셂셃셄셅셆셇셈셉셊셋셌셍셎셏셐셑셒셓셔셕셖셗션셙셚셛셜셝셞셟셠셡셢셣셤셥셦셧셨셩셪셫셬셭셮셯셰셱셲셳셴셵셶셷셸셹셺셻셼셽셾셿솀솁솂솃솄솅솆솇솈솉솊솋소속솎솏손솑솒솓솔솕솖솗솘솙솚솛솜솝솞솟솠송솢솣솤솥솦솧솨솩솪솫솬솭솮솯솰솱솲솳솴솵솶솷솸솹솺솻솼솽솾솿쇀쇁쇂쇃쇄쇅쇆쇇쇈쇉쇊쇋쇌쇍쇎쇏쇐쇑쇒쇓쇔쇕쇖쇗쇘쇙쇚쇛쇜쇝쇞쇟쇠쇡쇢쇣쇤쇥쇦쇧쇨쇩쇪쇫쇬쇭쇮쇯쇰쇱쇲쇳쇴쇵쇶쇷쇸쇹쇺쇻쇼쇽쇾쇿숀숁숂숃숄숅숆숇숈숉숊숋숌숍숎숏숐숑숒숓숔숕숖숗수숙숚숛순숝숞숟술숡","숢숣숤숥숦숧숨숩숪숫숬숭숮숯숰숱숲숳숴숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅쉆쉇쉈쉉쉊쉋쉌쉍쉎쉏쉐쉑쉒쉓쉔쉕쉖쉗쉘쉙쉚쉛쉜쉝쉞쉟쉠쉡쉢쉣쉤쉥쉦쉧쉨쉩쉪쉫쉬쉭쉮쉯쉰쉱쉲쉳쉴쉵쉶쉷쉸쉹쉺쉻쉼쉽쉾쉿슀슁슂슃슄슅슆슇슈슉슊슋슌슍슎슏슐슑슒슓슔슕슖슗슘슙슚슛슜슝슞슟슠슡슢슣스슥슦슧슨슩슪슫슬슭슮슯슰슱슲슳슴습슶슷슸승슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛시식싞싟신싡싢싣실싥싦싧싨싩싪싫심십싮싯싰싱싲싳싴싵싶싷싸싹싺싻싼싽싾싿쌀쌁쌂쌃쌄쌅쌆쌇쌈쌉쌊쌋쌌쌍쌎쌏쌐쌑쌒쌓쌔쌕쌖쌗쌘쌙쌚쌛쌜쌝쌞쌟쌠쌡","쌢쌣쌤쌥쌦쌧쌨쌩쌪쌫쌬쌭쌮쌯쌰쌱쌲쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썅썆썇썈썉썊썋썌썍썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧써썩썪썫썬썭썮썯썰썱썲썳썴썵썶썷썸썹썺썻썼썽썾썿쎀쎁쎂쎃쎄쎅쎆쎇쎈쎉쎊쎋쎌쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏀쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏘쏙쏚쏛쏜쏝쏞쏟쏠쏡쏢쏣쏤쏥쏦쏧쏨쏩쏪쏫쏬쏭쏮쏯쏰쏱쏲쏳쏴쏵쏶쏷쏸쏹쏺쏻쏼쏽쏾쏿쐀쐁쐂쐃쐄쐅쐆쐇쐈쐉쐊쐋쐌쐍쐎쐏쐐쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚쐛쐜쐝쐞쐟쐠쐡","쐢쐣쐤쐥쐦쐧쐨쐩쐪쐫쐬쐭쐮쐯쐰쐱쐲쐳쐴쐵쐶쐷쐸쐹쐺쐻쐼쐽쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑈쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑤쑥쑦쑧쑨쑩쑪쑫쑬쑭쑮쑯쑰쑱쑲쑳쑴쑵쑶쑷쑸쑹쑺쑻쑼쑽쑾쑿쒀쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒔쒕쒖쒗쒘쒙쒚쒛쒜쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒸쒹쒺쒻쒼쒽쒾쒿쓀쓁쓂쓃쓄쓅쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟쓠쓡쓢쓣쓤쓥쓦쓧쓨쓩쓪쓫쓬쓭쓮쓯쓰쓱쓲쓳쓴쓵쓶쓷쓸쓹쓺쓻쓼쓽쓾쓿씀씁씂씃씄씅씆씇씈씉씊씋씌씍씎씏씐씑씒씓씔씕씖씗씘씙씚씛씜씝씞씟씠씡","씢씣씤씥씦씧씨씩씪씫씬씭씮씯씰씱씲씳씴씵씶씷씸씹씺씻씼씽씾씿앀앁앂앃아악앆앇안앉않앋알앍앎앏앐앑앒앓암압앖앗았앙앚앛앜앝앞앟애액앢앣앤앥앦앧앨앩앪앫앬앭앮앯앰앱앲앳앴앵앶앷앸앹앺앻야약앾앿얀얁얂얃얄얅얆얇얈얉얊얋얌얍얎얏얐양얒얓얔얕얖얗얘얙얚얛얜얝얞얟얠얡얢얣얤얥얦얧얨얩얪얫얬얭얮얯얰얱얲얳어억얶얷언얹얺얻얼얽얾얿엀엁엂엃엄업없엇었엉엊엋엌엍엎엏에엑엒엓엔엕엖엗엘엙엚엛엜엝엞엟엠엡엢엣엤엥엦엧엨엩엪엫여역엮엯연엱엲엳열엵엶엷엸엹엺엻염엽엾엿였영옂옃옄옅옆옇예옉옊옋옌옍옎옏옐옑옒옓옔옕옖옗옘옙옚옛옜옝옞옟옠옡","옢옣오옥옦옧온옩옪옫올옭옮옯옰옱옲옳옴옵옶옷옸옹옺옻옼옽옾옿와왁왂왃완왅왆왇왈왉왊왋왌왍왎왏왐왑왒왓왔왕왖왗왘왙왚왛왜왝왞왟왠왡왢왣왤왥왦왧왨왩왪왫왬왭왮왯왰왱왲왳왴왵왶왷외왹왺왻왼왽왾왿욀욁욂욃욄욅욆욇욈욉욊욋욌욍욎욏욐욑욒욓요욕욖욗욘욙욚욛욜욝욞욟욠욡욢욣욤욥욦욧욨용욪욫욬욭욮욯우욱욲욳운욵욶욷울욹욺욻욼욽욾욿움웁웂웃웄웅웆웇웈웉웊웋워웍웎웏원웑웒웓월웕웖웗웘웙웚웛웜웝웞웟웠웡웢웣웤웥웦웧웨웩웪웫웬웭웮웯웰웱웲웳웴웵웶웷웸웹웺웻웼웽웾웿윀윁윂윃위윅윆윇윈윉윊윋윌윍윎윏윐윑윒윓윔윕윖윗윘윙윚윛윜윝윞윟유육","윢윣윤윥윦윧율윩윪윫윬윭윮윯윰윱윲윳윴융윶윷윸윹윺윻으윽윾윿은읁읂읃을읅읆읇읈읉읊읋음읍읎읏읐응읒읓읔읕읖읗의읙읚읛읜읝읞읟읠읡읢읣읤읥읦읧읨읩읪읫읬읭읮읯읰읱읲읳이익읶읷인읹읺읻일읽읾읿잀잁잂잃임입잆잇있잉잊잋잌잍잎잏자작잒잓잔잕잖잗잘잙잚잛잜잝잞잟잠잡잢잣잤장잦잧잨잩잪잫재잭잮잯잰잱잲잳잴잵잶잷잸잹잺잻잼잽잾잿쟀쟁쟂쟃쟄쟅쟆쟇쟈쟉쟊쟋쟌쟍쟎쟏쟐쟑쟒쟓쟔쟕쟖쟗쟘쟙쟚쟛쟜쟝쟞쟟쟠쟡쟢쟣쟤쟥쟦쟧쟨쟩쟪쟫쟬쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺쟻쟼쟽쟾쟿저적젂젃전젅젆젇절젉젊젋젌젍젎젏점접젒젓젔정젖젗젘젙젚젛제젝젞젟젠젡","젢젣젤젥젦젧젨젩젪젫젬젭젮젯젰젱젲젳젴젵젶젷져젹젺젻젼젽젾젿졀졁졂졃졄졅졆졇졈졉졊졋졌졍졎졏졐졑졒졓졔졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯조족졲졳존졵졶졷졸졹졺졻졼졽졾졿좀좁좂좃좄종좆좇좈좉좊좋좌좍좎좏좐좑좒좓좔좕좖좗좘좙좚좛좜좝좞좟좠좡좢좣좤좥좦좧좨좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좼좽좾좿죀죁죂죃죄죅죆죇죈죉죊죋죌죍죎죏죐죑죒죓죔죕죖죗죘죙죚죛죜죝죞죟죠죡죢죣죤죥죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죵죶죷죸죹죺죻주죽죾죿준줁줂줃줄줅줆줇줈줉줊줋줌줍줎줏줐중줒줓줔줕줖줗줘줙줚줛줜줝줞줟줠줡","줢줣줤줥줦줧줨줩줪줫줬줭줮줯줰줱줲줳줴줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇쥈쥉쥊쥋쥌쥍쥎쥏쥐쥑쥒쥓쥔쥕쥖쥗쥘쥙쥚쥛쥜쥝쥞쥟쥠쥡쥢쥣쥤쥥쥦쥧쥨쥩쥪쥫쥬쥭쥮쥯쥰쥱쥲쥳쥴쥵쥶쥷쥸쥹쥺쥻쥼쥽쥾쥿즀즁즂즃즄즅즆즇즈즉즊즋즌즍즎즏즐즑즒즓즔즕즖즗즘즙즚즛즜증즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿지직짂짃진짅짆짇질짉짊짋짌짍짎짏짐집짒짓짔징짖짗짘짙짚짛짜짝짞짟짠짡짢짣짤짥짦짧짨짩짪짫짬짭짮짯짰짱짲짳짴짵짶짷째짹짺짻짼짽짾짿쨀쨁쨂쨃쨄쨅쨆쨇쨈쨉쨊쨋쨌쨍쨎쨏쨐쨑쨒쨓쨔쨕쨖쨗쨘쨙쨚쨛쨜쨝쨞쨟쨠쨡","쨢쨣쨤쨥쨦쨧쨨쨩쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆쩇쩈쩉쩊쩋쩌쩍쩎쩏쩐쩑쩒쩓쩔쩕쩖쩗쩘쩙쩚쩛쩜쩝쩞쩟쩠쩡쩢쩣쩤쩥쩦쩧쩨쩩쩪쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩽쩾쩿쪀쪁쪂쪃쪄쪅쪆쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪘쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪼쪽쪾쪿쫀쫁쫂쫃쫄쫅쫆쫇쫈쫉쫊쫋쫌쫍쫎쫏쫐쫑쫒쫓쫔쫕쫖쫗쫘쫙쫚쫛쫜쫝쫞쫟쫠쫡쫢쫣쫤쫥쫦쫧쫨쫩쫪쫫쫬쫭쫮쫯쫰쫱쫲쫳쫴쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬈쬉쬊쬋쬌쬍쬎쬏쬐쬑쬒쬓쬔쬕쬖쬗쬘쬙쬚쬛쬜쬝쬞쬟쬠쬡","쬢쬣쬤쬥쬦쬧쬨쬩쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭁쭂쭃쭄쭅쭆쭇쭈쭉쭊쭋쭌쭍쭎쭏쭐쭑쭒쭓쭔쭕쭖쭗쭘쭙쭚쭛쭜쭝쭞쭟쭠쭡쭢쭣쭤쭥쭦쭧쭨쭩쭪쭫쭬쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭸쭹쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮜쮝쮞쮟쮠쮡쮢쮣쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮸쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯔쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟쯠쯡쯢쯣쯤쯥쯦쯧쯨쯩쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찌찍찎찏찐찑찒찓찔찕찖찗찘찙찚찛찜찝찞찟찠찡","찢찣찤찥찦찧차착찪찫찬찭찮찯찰찱찲찳찴찵찶찷참찹찺찻찼창찾찿챀챁챂챃채책챆챇챈챉챊챋챌챍챎챏챐챑챒챓챔챕챖챗챘챙챚챛챜챝챞챟챠챡챢챣챤챥챦챧챨챩챪챫챬챭챮챯챰챱챲챳챴챵챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓첔첕첖첗처척첚첛천첝첞첟철첡첢첣첤첥첦첧첨첩첪첫첬청첮첯첰첱첲첳체첵첶첷첸첹첺첻첼첽첾첿쳀쳁쳂쳃쳄쳅쳆쳇쳈쳉쳊쳋쳌쳍쳎쳏쳐쳑쳒쳓쳔쳕쳖쳗쳘쳙쳚쳛쳜쳝쳞쳟쳠쳡쳢쳣쳤쳥쳦쳧쳨쳩쳪쳫쳬쳭쳮쳯쳰쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽쳾쳿촀촁촂촃촄촅촆촇초촉촊촋촌촍촎촏촐촑촒촓촔촕촖촗촘촙촚촛촜총촞촟촠촡","촢촣촤촥촦촧촨촩촪촫촬촭촮촯촰촱촲촳촴촵촶촷촸촹촺촻촼촽촾촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛최쵝쵞쵟쵠쵡쵢쵣쵤쵥쵦쵧쵨쵩쵪쵫쵬쵭쵮쵯쵰쵱쵲쵳쵴쵵쵶쵷쵸쵹쵺쵻쵼쵽쵾쵿춀춁춂춃춄춅춆춇춈춉춊춋춌춍춎춏춐춑춒춓추축춖춗춘춙춚춛출춝춞춟춠춡춢춣춤춥춦춧춨충춪춫춬춭춮춯춰춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췄췅췆췇췈췉췊췋췌췍췎췏췐췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡췢췣췤췥췦췧취췩췪췫췬췭췮췯췰췱췲췳췴췵췶췷췸췹췺췻췼췽췾췿츀츁츂츃츄츅츆츇츈츉츊츋츌츍츎츏츐츑츒츓츔츕츖츗츘츙츚츛츜츝츞츟츠측","츢츣츤츥츦츧츨츩츪츫츬츭츮츯츰츱츲츳츴층츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉칊칋칌칍칎칏칐칑칒칓칔칕칖칗치칙칚칛친칝칞칟칠칡칢칣칤칥칦칧침칩칪칫칬칭칮칯칰칱칲칳카칵칶칷칸칹칺칻칼칽칾칿캀캁캂캃캄캅캆캇캈캉캊캋캌캍캎캏캐캑캒캓캔캕캖캗캘캙캚캛캜캝캞캟캠캡캢캣캤캥캦캧캨캩캪캫캬캭캮캯캰캱캲캳캴캵캶캷캸캹캺캻캼캽캾캿컀컁컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕컖컗컘컙컚컛컜컝컞컟컠컡컢컣커컥컦컧컨컩컪컫컬컭컮컯컰컱컲컳컴컵컶컷컸컹컺컻컼컽컾컿케켁켂켃켄켅켆켇켈켉켊켋켌켍켎켏켐켑켒켓켔켕켖켗켘켙켚켛켜켝켞켟켠켡","켢켣켤켥켦켧켨켩켪켫켬켭켮켯켰켱켲켳켴켵켶켷켸켹켺켻켼켽켾켿콀콁콂콃콄콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓코콕콖콗콘콙콚콛콜콝콞콟콠콡콢콣콤콥콦콧콨콩콪콫콬콭콮콯콰콱콲콳콴콵콶콷콸콹콺콻콼콽콾콿쾀쾁쾂쾃쾄쾅쾆쾇쾈쾉쾊쾋쾌쾍쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾡쾢쾣쾤쾥쾦쾧쾨쾩쾪쾫쾬쾭쾮쾯쾰쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿄쿅쿆쿇쿈쿉쿊쿋쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿠쿡쿢쿣쿤쿥쿦쿧쿨쿩쿪쿫쿬쿭쿮쿯쿰쿱쿲쿳쿴쿵쿶쿷쿸쿹쿺쿻쿼쿽쿾쿿퀀퀁퀂퀃퀄퀅퀆퀇퀈퀉퀊퀋퀌퀍퀎퀏퀐퀑퀒퀓퀔퀕퀖퀗퀘퀙퀚퀛퀜퀝퀞퀟퀠퀡","퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬퀭퀮퀯퀰퀱퀲퀳퀴퀵퀶퀷퀸퀹퀺퀻퀼퀽퀾퀿큀큁큂큃큄큅큆큇큈큉큊큋큌큍큎큏큐큑큒큓큔큕큖큗큘큙큚큛큜큝큞큟큠큡큢큣큤큥큦큧큨큩큪큫크큭큮큯큰큱큲큳클큵큶큷큸큹큺큻큼큽큾큿킀킁킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣키킥킦킧킨킩킪킫킬킭킮킯킰킱킲킳킴킵킶킷킸킹킺킻킼킽킾킿타탁탂탃탄탅탆탇탈탉탊탋탌탍탎탏탐탑탒탓탔탕탖탗탘탙탚탛태택탞탟탠탡탢탣탤탥탦탧탨탩탪탫탬탭탮탯탰탱탲탳탴탵탶탷탸탹탺탻탼탽탾탿턀턁턂턃턄턅턆턇턈턉턊턋턌턍턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟턠턡","턢턣턤턥턦턧턨턩턪턫턬턭턮턯터턱턲턳턴턵턶턷털턹턺턻턼턽턾턿텀텁텂텃텄텅텆텇텈텉텊텋테텍텎텏텐텑텒텓텔텕텖텗텘텙텚텛템텝텞텟텠텡텢텣텤텥텦텧텨텩텪텫텬텭텮텯텰텱텲텳텴텵텶텷텸텹텺텻텼텽텾텿톀톁톂톃톄톅톆톇톈톉톊톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟토톡톢톣톤톥톦톧톨톩톪톫톬톭톮톯톰톱톲톳톴통톶톷톸톹톺톻톼톽톾톿퇀퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏퇐퇑퇒퇓퇔퇕퇖퇗퇘퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪퇫퇬퇭퇮퇯퇰퇱퇲퇳퇴퇵퇶퇷퇸퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆툇툈툉툊툋툌툍툎툏툐툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡","툢툣툤툥툦툧툨툩툪툫투툭툮툯툰툱툲툳툴툵툶툷툸툹툺툻툼툽툾툿퉀퉁퉂퉃퉄퉅퉆퉇퉈퉉퉊퉋퉌퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉜퉝퉞퉟퉠퉡퉢퉣퉤퉥퉦퉧퉨퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튀튁튂튃튄튅튆튇튈튉튊튋튌튍튎튏튐튑튒튓튔튕튖튗튘튙튚튛튜튝튞튟튠튡튢튣튤튥튦튧튨튩튪튫튬튭튮튯튰튱튲튳튴튵튶튷트특튺튻튼튽튾튿틀틁틂틃틄틅틆틇틈틉틊틋틌틍틎틏틐틑틒틓틔틕틖틗틘틙틚틛틜틝틞틟틠틡틢틣틤틥틦틧틨틩틪틫틬틭틮틯티틱틲틳틴틵틶틷틸틹틺틻틼틽틾틿팀팁팂팃팄팅팆팇팈팉팊팋파팍팎팏판팑팒팓팔팕팖팗팘팙팚팛팜팝팞팟팠팡","팢팣팤팥팦팧패팩팪팫팬팭팮팯팰팱팲팳팴팵팶팷팸팹팺팻팼팽팾팿퍀퍁퍂퍃퍄퍅퍆퍇퍈퍉퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍼퍽퍾퍿펀펁펂펃펄펅펆펇펈펉펊펋펌펍펎펏펐펑펒펓펔펕펖펗페펙펚펛펜펝펞펟펠펡펢펣펤펥펦펧펨펩펪펫펬펭펮펯펰펱펲펳펴펵펶펷편펹펺펻펼펽펾펿폀폁폂폃폄폅폆폇폈평폊폋폌폍폎폏폐폑폒폓폔폕폖폗폘폙폚폛폜폝폞폟폠폡폢폣폤폥폦폧폨폩폪폫포폭폮폯폰폱폲폳폴폵폶폷폸폹폺폻폼폽폾폿퐀퐁퐂퐃퐄퐅퐆퐇퐈퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖퐗퐘퐙퐚퐛퐜퐝퐞퐟퐠퐡","퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷퐸퐹퐺퐻퐼퐽퐾퐿푀푁푂푃푄푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓푔푕푖푗푘푙푚푛표푝푞푟푠푡푢푣푤푥푦푧푨푩푪푫푬푭푮푯푰푱푲푳푴푵푶푷푸푹푺푻푼푽푾푿풀풁풂풃풄풅풆풇품풉풊풋풌풍풎풏풐풑풒풓풔풕풖풗풘풙풚풛풜풝풞풟풠풡풢풣풤풥풦풧풨풩풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓌퓍퓎퓏퓐퓑퓒퓓퓔퓕퓖퓗퓘퓙퓚퓛퓜퓝퓞퓟퓠퓡퓢퓣퓤퓥퓦퓧퓨퓩퓪퓫퓬퓭퓮퓯퓰퓱퓲퓳퓴퓵퓶퓷퓸퓹퓺퓻퓼퓽퓾퓿픀픁픂픃프픅픆픇픈픉픊픋플픍픎픏픐픑픒픓픔픕픖픗픘픙픚픛픜픝픞픟픠픡","픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷픸픹픺픻피픽픾픿핀핁핂핃필핅핆핇핈핉핊핋핌핍핎핏핐핑핒핓핔핕핖핗하학핚핛한핝핞핟할핡핢핣핤핥핦핧함합핪핫핬항핮핯핰핱핲핳해핵핶핷핸핹핺핻핼핽핾핿햀햁햂햃햄햅햆햇했행햊햋햌햍햎햏햐햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤향햦햧햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇허헉헊헋헌헍헎헏헐헑헒헓헔헕헖헗험헙헚헛헜헝헞헟헠헡헢헣헤헥헦헧헨헩헪헫헬헭헮헯헰헱헲헳헴헵헶헷헸헹헺헻헼헽헾헿혀혁혂혃현혅혆혇혈혉혊혋혌혍혎혏혐협혒혓혔형혖혗혘혙혚혛혜혝혞혟혠혡","혢혣혤혥혦혧혨혩혪혫혬혭혮혯혰혱혲혳혴혵혶혷호혹혺혻혼혽혾혿홀홁홂홃홄홅홆홇홈홉홊홋홌홍홎홏홐홑홒홓화확홖홗환홙홚홛활홝홞홟홠홡홢홣홤홥홦홧홨황홪홫홬홭홮홯홰홱홲홳홴홵홶홷홸홹홺홻홼홽홾홿횀횁횂횃횄횅횆횇횈횉횊횋회획횎횏횐횑횒횓횔횕횖횗횘횙횚횛횜횝횞횟횠횡횢횣횤횥횦횧효횩횪횫횬횭횮횯횰횱횲횳횴횵횶횷횸횹횺횻횼횽횾횿훀훁훂훃후훅훆훇훈훉훊훋훌훍훎훏훐훑훒훓훔훕훖훗훘훙훚훛훜훝훞훟훠훡훢훣훤훥훦훧훨훩훪훫훬훭훮훯훰훱훲훳훴훵훶훷훸훹훺훻훼훽훾훿휀휁휂휃휄휅휆휇휈휉휊휋휌휍휎휏휐휑휒휓휔휕휖휗휘휙휚휛휜휝휞휟휠휡","휢휣휤휥휦휧휨휩휪휫휬휭휮휯휰휱휲휳휴휵휶휷휸휹휺휻휼휽휾휿흀흁흂흃흄흅흆흇흈흉흊흋흌흍흎흏흐흑흒흓흔흕흖흗흘흙흚흛흜흝흞흟흠흡흢흣흤흥흦흧흨흩흪흫희흭흮흯흰흱흲흳흴흵흶흷흸흹흺흻흼흽흾흿힀힁힂힃힄힅힆힇히힉힊힋힌힍힎힏힐힑힒힓힔힕힖힗힘힙힚힛힜힝힞힟힠힡힢힣힤힥힦힧힨힩힪힫힬힭힮힯ힰힱힲힳힴힵힶힷힸힹힺힻힼힽힾힿퟀퟁퟂퟃퟄퟅퟆ퟇퟈퟉퟊ퟋퟌퟍퟎퟏퟐퟑퟒퟓퟔퟕퟖퟗퟘퟙퟚퟛퟜퟝퟞퟟퟠퟡퟢퟣퟤퟥퟦퟧퟨퟩퟪퟫퟬퟭퟮퟯퟰퟱퟲퟳퟴퟵퟶퟷퟸퟹퟺퟻ퟼퟽퟾퟿","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","豈更車賈滑串句龜龜契金喇奈懶癩羅蘿螺裸邏樂洛烙珞落酪駱亂卵欄爛蘭鸞嵐","濫藍襤拉臘蠟廊朗浪狼郎來冷勞擄櫓爐盧老蘆虜路露魯鷺碌祿綠菉錄鹿論壟弄籠聾牢磊賂雷壘屢樓淚漏累縷陋勒肋凜凌稜綾菱陵讀拏樂諾丹寧怒率異北磻便復不泌數索參塞省葉說殺辰沈拾若掠略亮兩凉梁糧良諒量勵呂女廬旅濾礪閭驪麗黎力曆歷轢年憐戀撚漣煉璉秊練聯輦蓮連鍊列劣咽烈裂說廉念捻殮簾獵令囹寧嶺怜玲瑩羚聆鈴零靈領例禮醴隸惡了僚寮尿料樂燎療蓼遼龍暈阮劉杻柳流溜琉留硫紐類六戮陸倫崙淪輪律慄栗率隆利吏履易李梨泥理痢罹裏裡里離匿溺吝燐璘藺隣鱗麟林淋臨立笠粒狀炙識什茶刺切度拓糖宅洞暴輻行降見廓兀嗀﨎﨏塚﨑晴﨓﨔凞猪益礼神祥福靖精羽﨟蘒﨡","諸﨣﨤逸都﨧﨨﨩飯飼館鶴郞隷侮僧免勉勤卑喝嘆器塀墨層屮悔慨憎懲敏既暑梅海渚漢煮爫琢碑社祉祈祐祖祝禍禎穀突節練縉繁署者臭艹艹著褐視謁謹賓贈辶逸難響頻恵𤋮舘﩮﩯並况全侀充冀勇勺喝啕喙嗢塚墳奄奔婢嬨廒廙彩徭惘慎愈憎慠懲戴揄搜摒敖晴朗望杖歹殺流滛滋漢瀞煮瞧爵犯猪瑱甆画瘝瘟益盛直睊着磌窱節类絛練缾者荒華蝹襁覆視調諸請謁諾諭謹變贈輸遲醙鉶陼難靖韛響頋頻鬒龜𢡊𢡄𣏕㮝䀘䀹𥉉𥳐𧻓齃龎﫚﫛﫜﫝﫞﫟﫠﫡﫢﫣﫤﫥﫦﫧﫨﫩﫪﫫﫬﫭﫮﫯﫰﫱﫲﫳﫴﫵﫶﫷﫸﫹﫺﫻﫼﫽﫾﫿fffiflffifflſtst﬇﬈﬉﬊﬋﬌﬍﬎﬏﬐﬑﬒ﬓﬔﬕﬖﬗ﬘﬙﬚﬛﬜יִﬞײַﬠﬡ","ﬢﬣﬤﬥﬦﬧﬨ﬩שׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּ﬷טּיּךּכּלּ﬽מּ﬿נּסּ﭂ףּפּ﭅צּקּרּשּתּוֹבֿכֿפֿﭏﭐﭑﭒﭓﭔﭕﭖﭗﭘﭙﭚﭛﭜﭝﭞﭟﭠﭡﭢﭣﭤﭥﭦﭧﭨﭩﭪﭫﭬﭭﭮﭯﭰﭱﭲﭳﭴﭵﭶﭷﭸﭹﭺﭻﭼﭽﭾﭿﮀﮁﮂﮃﮄﮅﮆﮇﮈﮉﮊﮋﮌﮍﮎﮏﮐﮑﮒﮓﮔﮕﮖﮗﮘﮙﮚﮛﮜﮝﮞﮟﮠﮡﮢﮣﮤﮥﮦﮧﮨﮩﮪﮫﮬﮭﮮﮯﮰﮱ﮲﮳﮴﮵﮶﮷﮸﮹﮺﮻﮼﮽﮾﮿﯀﯁﯂﯃﯄﯅﯆﯇﯈﯉﯊﯋﯌﯍﯎﯏﯐﯑﯒ﯓﯔﯕﯖﯗﯘﯙﯚﯛﯜﯝﯞﯟﯠﯡﯢﯣﯤﯥﯦﯧﯨﯩﯪﯫﯬﯭﯮﯯﯰﯱﯲﯳﯴﯵﯶﯷﯸﯹﯺﯻﯼﯽﯾﯿﰀﰁﰂﰃﰄﰅﰆﰇﰈﰉﰊﰋﰌﰍﰎﰏﰐﰑﰒﰓﰔﰕﰖﰗﰘﰙﰚﰛﰜﰝﰞﰟﰠﰡ","ﰢﰣﰤﰥﰦﰧﰨﰩﰪﰫﰬﰭﰮﰯﰰﰱﰲﰳﰴﰵﰶﰷﰸﰹﰺﰻﰼﰽﰾﰿﱀﱁﱂﱃﱄﱅﱆﱇﱈﱉﱊﱋﱌﱍﱎﱏﱐﱑﱒﱓﱔﱕﱖﱗﱘﱙﱚﱛﱜﱝﱞﱟﱠﱡﱢﱣﱤﱥﱦﱧﱨﱩﱪﱫﱬﱭﱮﱯﱰﱱﱲﱳﱴﱵﱶﱷﱸﱹﱺﱻﱼﱽﱾﱿﲀﲁﲂﲃﲄﲅﲆﲇﲈﲉﲊﲋﲌﲍﲎﲏﲐﲑﲒﲓﲔﲕﲖﲗﲘﲙﲚﲛﲜﲝﲞﲟﲠﲡﲢﲣﲤﲥﲦﲧﲨﲩﲪﲫﲬﲭﲮﲯﲰﲱﲲﲳﲴﲵﲶﲷﲸﲹﲺﲻﲼﲽﲾﲿﳀﳁﳂﳃﳄﳅﳆﳇﳈﳉﳊﳋﳌﳍﳎﳏﳐﳑﳒﳓﳔﳕﳖﳗﳘﳙﳚﳛﳜﳝﳞﳟﳠﳡﳢﳣﳤﳥﳦﳧﳨﳩﳪﳫﳬﳭﳮﳯﳰﳱﳲﳳﳴﳵﳶﳷﳸﳹﳺﳻﳼﳽﳾﳿﴀﴁﴂﴃﴄﴅﴆﴇﴈﴉﴊﴋﴌﴍﴎﴏﴐﴑﴒﴓﴔﴕﴖﴗﴘﴙﴚﴛﴜﴝﴞﴟﴠﴡ","ﴢﴣﴤﴥﴦﴧﴨﴩﴪﴫﴬﴭﴮﴯﴰﴱﴲﴳﴴﴵﴶﴷﴸﴹﴺﴻﴼﴽ﴾﴿﵀﵁﵂﵃﵄﵅﵆﵇﵈﵉﵊﵋﵌﵍﵎﵏ﵐﵑﵒﵓﵔﵕﵖﵗﵘﵙﵚﵛﵜﵝﵞﵟﵠﵡﵢﵣﵤﵥﵦﵧﵨﵩﵪﵫﵬﵭﵮﵯﵰﵱﵲﵳﵴﵵﵶﵷﵸﵹﵺﵻﵼﵽﵾﵿﶀﶁﶂﶃﶄﶅﶆﶇﶈﶉﶊﶋﶌﶍﶎﶏ﶐﶑ﶒﶓﶔﶕﶖﶗﶘﶙﶚﶛﶜﶝﶞﶟﶠﶡﶢﶣﶤﶥﶦﶧﶨﶩﶪﶫﶬﶭﶮﶯﶰﶱﶲﶳﶴﶵﶶﶷﶸﶹﶺﶻﶼﶽﶾﶿﷀﷁﷂﷃﷄﷅﷆﷇ﷈﷉﷊﷋﷌﷍﷎﷏﷐﷑﷒﷓﷔﷕﷖﷗﷘﷙﷚﷛﷜﷝﷞﷟﷠﷡﷢﷣﷤﷥﷦﷧﷨﷩﷪﷫﷬﷭﷮﷯ﷰﷱﷲﷳﷴﷵﷶﷷﷸﷹﷺﷻ﷼﷽﷾﷿︀︁︂︃︄︅︆︇︈︉︊︋︌︍︎️︐︑︒︓︔︕︖︗︘︙︚︛︜︝︞︟︠︡","︧︨︩︪︫︬︭︢︣︤︥︦︮︯︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹅﹆﹇﹈﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹓﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹢﹣﹤﹥﹦﹧﹨﹩﹪﹫﹬﹭﹮﹯ﹰﹱﹲﹳﹴ﹵ﹶﹷﹸﹹﹺﹻﹼﹽﹾﹿﺀﺁﺂﺃﺄﺅﺆﺇﺈﺉﺊﺋﺌﺍﺎﺏﺐﺑﺒﺓﺔﺕﺖﺗﺘﺙﺚﺛﺜﺝﺞﺟﺠﺡﺢﺣﺤﺥﺦﺧﺨﺩﺪﺫﺬﺭﺮﺯﺰﺱﺲﺳﺴﺵﺶﺷﺸﺹﺺﺻﺼﺽﺾﺿﻀﻁﻂﻃﻄﻅﻆﻇﻈﻉﻊﻋﻌﻍﻎﻏﻐﻑﻒﻓﻔﻕﻖﻗﻘﻙﻚﻛﻜﻝﻞﻟﻠﻡﻢﻣﻤﻥﻦﻧﻨﻩﻪﻫﻬﻭﻮﻯﻰﻱﻲﻳﻴﻵﻶﻷﻸﻹﻺﻻﻼ﻽﻾＀!"#$%&'()*+,-./0123456789:;<=>?@A","BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⦅⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᅠᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒ﾿￀￁ᅡᅢᅣᅤᅥᅦ￈￉ᅧᅨᅩᅪᅫᅬ￐￑ᅭᅮᅯᅰᅱᅲ￘￙ᅳᅴᅵ￝￞￟¢£¬ ̄¦¥₩￧│←↑→↓■○￯￰￱￲￳￴￵￶￷￸�￾￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿"],"keys":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255","256","257","258","259","260","261","262","263","264","265","266","267","268","269","270","271","272","273","274","275","276","277","278","279","280","281","282","283","284","285","286","287","288","289","290","291","292","293","294","295","296","297","298","299","300","301","302","303","304","305","306","307","308","309","310","311","312","313","314","315","316","317","318","319","320","321","322","323","324","325","326","327","328","329","330","331","332","333","334","335","336","337","338","339","340","341","342","343","344","345","346","347","348","349","350","351","352","353","354","355","356","357","358","359","360","361","362","363","364","365","366","367","368","369","370","371","372","373","374","375","376","377","378","379","380","381","382","383","384","385","386","387","388","389","390","391","392","393","394","395","396","397","398","399","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","419","420","421","422","423","424","425","426","427","428","429","430","431","432","433","434","435","436","437","438","439","440","441","442","443","444","445","446","447","448","449","450","451","452","453","454","455","456","457","458","459","460","461","462","463","464","465","466","467","468","469","470","471","472","473","474","475","476","477","478","479","480","481","482","483","484","485","486","487","488","489","490","491","492","493","494","495","496","497","498","499","500","501","502","503","504","505","506","507","508","509","510","511","512","513","514","515","516","517","518","519","520","521","522","523","524","525","526","527","528","529","530","531","532","533","534","535","536","537","538","539","540","541","542","543","544","545","546","547","548","549","550","551","552","553","554","555","556","557","558","559","560","561","562","563","564","565","566","567","568","569","570","571","572","573","574","575","576","577","578","579","580","581","582","583","584","585","586","587","588","589","590","591","592","593","594","595","596","597","598","599","600","601","602","603","604","605","606","607","608","609","610","611","612","613","614","615","616","617","618","619","620","621","622","623","624","625","626","627","628","629","630","631","632","633","634","635","636","637","638","639","640","641","642","643","644","645","646","647","648","649","650","651","652","653","654","655","656","657","658","659","660","661","662","663","664","665","666","667","668","669","670","671","672","673","674","675","676","677","678","679","680","681","682","683","684","685","686","687","688","689","690","691","692","693","694","695","696","697","698","699","700","701","702","703","704","705","706","707","708","709","710","711","712","713","714","715","716","717","718","719","720","721","722","723","724","725","726","727","728","729","730","731","732","733","734","735","736","737","738","739","740","741","742","743","744","745","746","747","748","749","750","751","752","753","754","755","756","757","758","759","760","761","762","763","764","765","766","767","768","769","770","771","772","773","774","775","776","777","778","779","780","781","782","783","784","785","786","787","788","789","790","791","792","793","794","795","796","797","798","799","800","801","802","803","804","805","806","807","808","809","810","811","812","813","814","815","816","817","818","819","820","821","822","823","824","825","826","827","828","829","830","831","832","833","834","835","836","837","838","839","840","841","842","843","844","845","846","847","848","849","850","851","852","853","854","855","856","857","858","859","860","861","862","863","864","865","866","867","868","869","870","871","872","873","874","875","876","877","878","879","880","881","882","883","884","885","886","887","888","889","890","891","892","893","894","895","896","897","898","899","900","901","902","903","904","905","906","907","908","909","910","911","912","913","914","915","916","917","918","919","920","921","922","923","924","925","926","927","928","929","930","931","932","933","934","935","936","937","938","939","940","941","942","943","944","945","946","947","948","949","950","951","952","953","954","955","956","957","958","959","960","961","962","963","964","965","966","967","968","969","970","971","972","973","974","975","976","977","978","979","980","981","982","983","984","985","986","987","988","989","990","991","992","993","994","995","996","997","998","999","1000","1001","1002","1003","1004","1005","1006","1007","1008","1009","1010","1011","1012","1013","1014","1015","1016","1017","1018","1019","1020","1021","1022","1023","1024","1025","1026","1027","1028","1029","1030","1031","1032","1033","1034","1035","1036","1037","1038","1039","1040","1041","1042","1043","1044","1045","1046","1047","1048","1049","1050","1051","1052","1053","1054","1055","1056","1057","1058","1059","1060","1061","1062","1063","1064","1065","1066","1067","1068","1069","1070","1071","1072","1073","1074","1075","1076","1077","1078","1079","1080","1081","1082","1083","1084","1085","1086","1087","1088","1089","1090","1091","1092","1093","1094","1095","1096","1097","1098","1099","1100","1101","1102","1103","1104","1105","1106","1107","1108","1109","1110","1111","1112","1113","1114","1115","1116","1117","1118","1119","1120","1121","1122","1123","1124","1125","1126","1127","1128","1129","1130","1131","1132","1133","1134","1135","1136","1137","1138","1139","1140","1141","1142","1143","1144","1145","1146","1147","1148","1149","1150","1151","1152","1153","1154","1155","1156","1157","1158","1159","1160","1161","1162","1163","1164","1165","1166","1167","1168","1169","1170","1171","1172","1173","1174","1175","1176","1177","1178","1179","1180","1181","1182","1183","1184","1185","1186","1187","1188","1189","1190","1191","1192","1193","1194","1195","1196","1197","1198","1199","1200","1201","1202","1203","1204","1205","1206","1207","1208","1209","1210","1211","1212","1213","1214","1215","1216","1217","1218","1219","1220","1221","1222","1223","1224","1225","1226","1227","1228","1229","1230","1231","1232","1233","1234","1235","1236","1237","1238","1239","1240","1241","1242","1243","1244","1245","1246","1247","1248","1249","1250","1251","1252","1253","1254","1255","1256","1257","1258","1259","1260","1261","1262","1263","1264","1265","1266","1267","1268","1269","1270","1271","1272","1273","1274","1275","1276","1277","1278","1279","1280","1281","1282","1283","1284","1285","1286","1287","1288","1289","1290","1291","1292","1293","1294","1295","1296","1297","1298","1299","1300","1301","1302","1303","1304","1305","1306","1307","1308","1309","1310","1311","1312","1313","1314","1315","1316","1317","1318","1319","1320","1321","1322","1323","1324","1325","1326","1327","1328","1329","1330","1331","1332","1333","1334","1335","1336","1337","1338","1339","1340","1341","1342","1343","1344","1345","1346","1347","1348","1349","1350","1351","1352","1353","1354","1355","1356","1357","1358","1359","1360","1361","1362","1363","1364","1365","1366","1367","1368","1369","1370","1371","1372","1373","1374","1375","1376","1377","1378","1379","1380","1381","1382","1383","1384","1385","1386","1387","1388","1389","1390","1391","1392","1393","1394","1395","1396","1397","1398","1399","1400","1401","1402","1403","1404","1405","1406","1407","1408","1409","1410","1411","1412","1413","1414","1415","1416","1417","1418","1419","1420","1421","1422","1423","1424","1425","1426","1427","1428","1429","1430","1431","1432","1433","1434","1435","1436","1437","1438","1439","1440","1441","1442","1443","1444","1445","1446","1447","1448","1449","1450","1451","1452","1453","1454","1455","1456","1457","1458","1459","1460","1461","1462","1463","1464","1465","1466","1467","1468","1469","1470","1471","1472","1473","1474","1475","1476","1477","1478","1479","1480","1481","1482","1483","1484","1485","1486","1487","1488","1489","1490","1491","1492","1493","1494","1495","1496","1497","1498","1499","1500","1501","1502","1503","1504","1505","1506","1507","1508","1509","1510","1511","1512","1513","1514","1515","1516","1517","1518","1519","1520","1521","1522","1523","1524","1525","1526","1527","1528","1529","1530","1531","1532","1533","1534","1535","1536","1537","1538","1539","1540","1541","1542","1543","1544","1545","1546","1547","1548","1549","1550","1551","1552","1553","1554","1555","1556","1557","1558","1559","1560","1561","1562","1563","1564","1565","1566","1567","1568","1569","1570","1571","1572","1573","1574","1575","1576","1577","1578","1579","1580","1581","1582","1583","1584","1585","1586","1587","1588","1589","1590","1591","1592","1593","1594","1595","1596","1597","1598","1599","1600","1601","1602","1603","1604","1605","1606","1607","1608","1609","1610","1611","1612","1613","1614","1615","1616","1617","1618","1619","1620","1621","1622","1623","1624","1625","1626","1627","1628","1629","1630","1631","1632","1633","1634","1635","1636","1637","1638","1639","1640","1641","1642","1643","1644","1645","1646","1647","1648","1649","1650","1651","1652","1653","1654","1655","1656","1657","1658","1659","1660","1661","1662","1663","1664","1665","1666","1667","1668","1669","1670","1671","1672","1673","1674","1675","1676","1677","1678","1679","1680","1681","1682","1683","1684","1685","1686","1687","1688","1689","1690","1691","1692","1693","1694","1695","1696","1697","1698","1699","1700","1701","1702","1703","1704","1705","1706","1707","1708","1709","1710","1711","1712","1713","1714","1715","1716","1717","1718","1719","1720","1721","1722","1723","1724","1725","1726","1727","1728","1729","1730","1731","1732","1733","1734","1735","1736","1737","1738","1739","1740","1741","1742","1743","1744","1745","1746","1747","1748","1749","1750","1751","1752","1753","1754","1755","1756","1757","1758","1759","1760","1761","1762","1763","1764","1765","1766","1767","1768","1769","1770","1771","1772","1773","1774","1775","1776","1777","1778","1779","1780","1781","1782","1783","1784","1785","1786","1787","1788","1789","1790","1791","1792","1793","1794","1795","1796","1797","1798","1799","1800","1801","1802","1803","1804","1805","1806","1807","1808","1809","1810","1811","1812","1813","1814","1815","1816","1817","1818","1819","1820","1821","1822","1823","1824","1825","1826","1827","1828","1829","1830","1831","1832","1833","1834","1835","1836","1837","1838","1839","1840","1841","1842","1843","1844","1845","1846","1847","1848","1849","1850","1851","1852","1853","1854","1855","1856","1857","1858","1859","1860","1861","1862","1863","1864","1865","1866","1867","1868","1869","1870","1871","1872","1873","1874","1875","1876","1877","1878","1879","1880","1881","1882","1883","1884","1885","1886","1887","1888","1889","1890","1891","1892","1893","1894","1895","1896","1897","1898","1899","1900","1901","1902","1903","1904","1905","1906","1907","1908","1909","1910","1911","1912","1913","1914","1915","1916","1917","1918","1919","1920","1921","1922","1923","1924","1925","1926","1927","1928","1929","1930","1931","1932","1933","1934","1935","1936","1937","1938","1939","1940","1941","1942","1943","1944","1945","1946","1947","1948","1949","1950","1951","1952","1953","1954","1955","1956","1957","1958","1959","1960","1961","1962","1963","1964","1965","1966","1967","1968","1969","1970","1971","1972","1973","1974","1975","1976","1977","1978","1979","1980","1981","1982","1983","1984","1985","1986","1987","1988","1989","1990","1991","1992","1993","1994","1995","1996","1997","1998","1999","2000","2001","2002","2003","2004","2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025","2026","2027","2028","2029","2030","2031","2032","2033","2034","2035","2036","2037","2038","2039","2040","2041","2042","2043","2044","2045","2046","2047","2048","2049","2050","2051","2052","2053","2054","2055","2056","2057","2058","2059","2060","2061","2062","2063","2064","2065","2066","2067","2068","2069","2070","2071","2072","2073","2074","2075","2076","2077","2078","2079","2080","2081","2082","2083","2084","2085","2086","2087","2088","2089","2090","2091","2092","2093","2094","2095","2096","2097","2098","2099","2100","2101","2102","2103","2104","2105","2106","2107","2108","2109","2110","2111","2112","2113","2114","2115","2116","2117","2118","2119","2120","2121","2122","2123","2124","2125","2126","2127","2128","2129","2130","2131","2132","2133","2134","2135","2136","2137","2138","2139","2140","2141","2142","2143","2144","2145","2146","2147","2148","2149","2150","2151","2152","2153","2154","2155","2156","2157","2158","2159","2160","2161","2162","2163","2164","2165","2166","2167","2168","2169","2170","2171","2172","2173","2174","2175","2176","2177","2178","2179","2180","2181","2182","2183","2184","2185","2186","2187","2188","2189","2190","2191","2192","2193","2194","2195","2196","2197","2198","2199","2200","2201","2202","2203","2204","2205","2206","2207","2208","2209","2210","2211","2212","2213","2214","2215","2216","2217","2218","2219","2220","2221","2222","2223","2224","2225","2226","2227","2228","2229","2230","2231","2232","2233","2234","2235","2236","2237","2238","2239","2240","2241","2242","2243","2244","2245","2246","2247","2248","2249","2250","2251","2252","2253","2254","2255","2256","2257","2258","2259","2260","2261","2262","2263","2264","2265","2266","2267","2268","2269","2270","2271","2272","2273","2274","2275","2276","2277","2278","2279","2280","2281","2282","2283","2284","2285","2286","2287","2288","2289","2290","2291","2292","2293","2294","2295","2296","2297","2298","2299","2300","2301","2302","2303","2304","2305","2306","2307","2308","2309","2310","2311","2312","2313","2314","2315","2316","2317","2318","2319","2320","2321","2322","2323","2324","2325","2326","2327","2328","2329","2330","2331","2332","2333","2334","2335","2336","2337","2338","2339","2340","2341","2342","2343","2344","2345","2346","2347","2348","2349","2350","2351","2352","2353","2354","2355","2356","2357","2358","2359","2360","2361","2362","2363","2364","2365","2366","2367","2368","2369","2370","2371","2372","2373","2374","2375","2376","2377","2378","2379","2380","2381","2382","2383","2384","2385","2386","2387","2388","2389","2390","2391","2392","2393","2394","2395","2396","2397","2398","2399","2400","2401","2402","2403","2404","2405","2406","2407","2408","2409","2410","2411","2412","2413","2414","2415","2416","2417","2418","2419","2420","2421","2422","2423","2424","2425","2426","2427","2428","2429","2430","2431","2432","2433","2434","2435","2436","2437","2438","2439","2440","2441","2442","2443","2444","2445","2446","2447","2448","2449","2450","2451","2452","2453","2454","2455","2456","2457","2458","2459","2460","2461","2462","2463","2464","2465","2466","2467","2468","2469","2470","2471","2472","2473","2474","2475","2476","2477","2478","2479","2480","2481","2482","2483","2484","2485","2486","2487","2488","2489","2490","2491","2492","2493","2494","2495","2496","2497","2498","2499","2500","2501","2502","2503","2504","2505","2506","2507","2508","2509","2510","2511","2512","2513","2514","2515","2516","2517","2518","2519","2520","2521","2522","2523","2524","2525","2526","2527","2528","2529","2530","2531","2532","2533","2534","2535","2536","2537","2538","2539","2540","2541","2542","2543","2544","2545","2546","2547","2548","2549","2550","2551","2552","2553","2554","2555","2556","2557","2558","2559","2560","2561","2562","2563","2564","2565","2566","2567","2568","2569","2570","2571","2572","2573","2574","2575","2576","2577","2578","2579","2580","2581","2582","2583","2584","2585","2586","2587","2588","2589","2590","2591","2592","2593","2594","2595","2596","2597","2598","2599","2600","2601","2602","2603","2604","2605","2606","2607","2608","2609","2610","2611","2612","2613","2614","2615","2616","2617","2618","2619","2620","2621","2622","2623","2624","2625","2626","2627","2628","2629","2630","2631","2632","2633","2634","2635","2636","2637","2638","2639","2640","2641","2642","2643","2644","2645","2646","2647","2648","2649","2650","2651","2652","2653","2654","2655","2656","2657","2658","2659","2660","2661","2662","2663","2664","2665","2666","2667","2668","2669","2670","2671","2672","2673","2674","2675","2676","2677","2678","2679","2680","2681","2682","2683","2684","2685","2686","2687","2688","2689","2690","2691","2692","2693","2694","2695","2696","2697","2698","2699","2700","2701","2702","2703","2704","2705","2706","2707","2708","2709","2710","2711","2712","2713","2714","2715","2716","2717","2718","2719","2720","2721","2722","2723","2724","2725","2726","2727","2728","2729","2730","2731","2732","2733","2734","2735","2736","2737","2738","2739","2740","2741","2742","2743","2744","2745","2746","2747","2748","2749","2750","2751","2752","2753","2754","2755","2756","2757","2758","2759","2760","2761","2762","2763","2764","2765","2766","2767","2768","2769","2770","2771","2772","2773","2774","2775","2776","2777","2778","2779","2780","2781","2782","2783","2784","2785","2786","2787","2788","2789","2790","2791","2792","2793","2794","2795","2796","2797","2798","2799","2800","2801","2802","2803","2804","2805","2806","2807","2808","2809","2810","2811","2812","2813","2814","2815","2816","2817","2818","2819","2820","2821","2822","2823","2824","2825","2826","2827","2828","2829","2830","2831","2832","2833","2834","2835","2836","2837","2838","2839","2840","2841","2842","2843","2844","2845","2846","2847","2848","2849","2850","2851","2852","2853","2854","2855","2856","2857","2858","2859","2860","2861","2862","2863","2864","2865","2866","2867","2868","2869","2870","2871","2872","2873","2874","2875","2876","2877","2878","2879","2880","2881","2882","2883","2884","2885","2886","2887","2888","2889","2890","2891","2892","2893","2894","2895","2896","2897","2898","2899","2900","2901","2902","2903","2904","2905","2906","2907","2908","2909","2910","2911","2912","2913","2914","2915","2916","2917","2918","2919","2920","2921","2922","2923","2924","2925","2926","2927","2928","2929","2930","2931","2932","2933","2934","2935","2936","2937","2938","2939","2940","2941","2942","2943","2944","2945","2946","2947","2948","2949","2950","2951","2952","2953","2954","2955","2956","2957","2958","2959","2960","2961","2962","2963","2964","2965","2966","2967","2968","2969","2970","2971","2972","2973","2974","2975","2976","2977","2978","2979","2980","2981","2982","2983","2984","2985","2986","2987","2988","2989","2990","2991","2992","2993","2994","2995","2996","2997","2998","2999","3000","3001","3002","3003","3004","3005","3006","3007","3008","3009","3010","3011","3012","3013","3014","3015","3016","3017","3018","3019","3020","3021","3022","3023","3024","3025","3026","3027","3028","3029","3030","3031","3032","3033","3034","3035","3036","3037","3038","3039","3040","3041","3042","3043","3044","3045","3046","3047","3048","3049","3050","3051","3052","3053","3054","3055","3056","3057","3058","3059","3060","3061","3062","3063","3064","3065","3066","3067","3068","3069","3070","3071","3072","3073","3074","3075","3076","3077","3078","3079","3080","3081","3082","3083","3084","3085","3086","3087","3088","3089","3090","3091","3092","3093","3094","3095","3096","3097","3098","3099","3100","3101","3102","3103","3104","3105","3106","3107","3108","3109","3110","3111","3112","3113","3114","3115","3116","3117","3118","3119","3120","3121","3122","3123","3124","3125","3126","3127","3128","3129","3130","3131","3132","3133","3134","3135","3136","3137","3138","3139","3140","3141","3142","3143","3144","3145","3146","3147","3148","3149","3150","3151","3152","3153","3154","3155","3156","3157","3158","3159","3160","3161","3162","3163","3164","3165","3166","3167","3168","3169","3170","3171","3172","3173","3174","3175","3176","3177","3178","3179","3180","3181","3182","3183","3184","3185","3186","3187","3188","3189","3190","3191","3192","3193","3194","3195","3196","3197","3198","3199","3200","3201","3202","3203","3204","3205","3206","3207","3208","3209","3210","3211","3212","3213","3214","3215","3216","3217","3218","3219","3220","3221","3222","3223","3224","3225","3226","3227","3228","3229","3230","3231","3232","3233","3234","3235","3236","3237","3238","3239","3240","3241","3242","3243","3244","3245","3246","3247","3248","3249","3250","3251","3252","3253","3254","3255","3256","3257","3258","3259","3260","3261","3262","3263","3264","3265","3266","3267","3268","3269","3270","3271","3272","3273","3274","3275","3276","3277","3278","3279","3280","3281","3282","3283","3284","3285","3286","3287","3288","3289","3290","3291","3292","3293","3294","3295","3296","3297","3298","3299","3300","3301","3302","3303","3304","3305","3306","3307","3308","3309","3310","3311","3312","3313","3314","3315","3316","3317","3318","3319","3320","3321","3322","3323","3324","3325","3326","3327","3328","3329","3330","3331","3332","3333","3334","3335","3336","3337","3338","3339","3340","3341","3342","3343","3344","3345","3346","3347","3348","3349","3350","3351","3352","3353","3354","3355","3356","3357","3358","3359","3360","3361","3362","3363","3364","3365","3366","3367","3368","3369","3370","3371","3372","3373","3374","3375","3376","3377","3378","3379","3380","3381","3382","3383","3384","3385","3386","3387","3388","3389","3390","3391","3392","3393","3394","3395","3396","3397","3398","3399","3400","3401","3402","3403","3404","3405","3406","3407","3408","3409","3410","3411","3412","3413","3414","3415","3416","3417","3418","3419","3420","3421","3422","3423","3424","3425","3426","3427","3428","3429","3430","3431","3432","3433","3434","3435","3436","3437","3438","3439","3440","3441","3442","3443","3444","3445","3446","3447","3448","3449","3450","3451","3452","3453","3454","3455","3456","3457","3458","3459","3460","3461","3462","3463","3464","3465","3466","3467","3468","3469","3470","3471","3472","3473","3474","3475","3476","3477","3478","3479","3480","3481","3482","3483","3484","3485","3486","3487","3488","3489","3490","3491","3492","3493","3494","3495","3496","3497","3498","3499","3500","3501","3502","3503","3504","3505","3506","3507","3508","3509","3510","3511","3512","3513","3514","3515","3516","3517","3518","3519","3520","3521","3522","3523","3524","3525","3526","3527","3528","3529","3530","3531","3532","3533","3534","3535","3536","3537","3538","3539","3540","3541","3542","3543","3544","3545","3546","3547","3548","3549","3550","3551","3552","3553","3554","3555","3556","3557","3558","3559","3560","3561","3562","3563","3564","3565","3566","3567","3568","3569","3570","3571","3572","3573","3574","3575","3576","3577","3578","3579","3580","3581","3582","3583","3584","3585","3586","3587","3588","3589","3590","3591","3592","3593","3594","3595","3596","3597","3598","3599","3600","3601","3602","3603","3604","3605","3606","3607","3608","3609","3610","3611","3612","3613","3614","3615","3616","3617","3618","3619","3620","3621","3622","3623","3624","3625","3626","3627","3628","3629","3630","3631","3632","3633","3634","3635","3636","3637","3638","3639","3640","3641","3642","3643","3644","3645","3646","3647","3648","3649","3650","3651","3652","3653","3654","3655","3656","3657","3658","3659","3660","3661","3662","3663","3664","3665","3666","3667","3668","3669","3670","3671","3672","3673","3674","3675","3676","3677","3678","3679","3680","3681","3682","3683","3684","3685","3686","3687","3688","3689","3690","3691","3692","3693","3694","3695","3696","3697","3698","3699","3700","3701","3702","3703","3704","3705","3706","3707","3708","3709","3710","3711","3712","3713","3714","3715","3716","3717","3718","3719","3720","3721","3722","3723","3724","3725","3726","3727","3728","3729","3730","3731","3732","3733","3734","3735","3736","3737","3738","3739","3740","3741","3742","3743","3744","3745","3746","3747","3748","3749","3750","3751","3752","3753","3754","3755","3756","3757","3758","3759","3760","3761","3762","3763","3764","3765","3766","3767","3768","3769","3770","3771","3772","3773","3774","3775","3776","3777","3778","3779","3780","3781","3782","3783","3784","3785","3786","3787","3788","3789","3790","3791","3792","3793","3794","3795","3796","3797","3798","3799","3800","3801","3802","3803","3804","3805","3806","3807","3808","3809","3810","3811","3812","3813","3814","3815","3816","3817","3818","3819","3820","3821","3822","3823","3824","3825","3826","3827","3828","3829","3830","3831","3832","3833","3834","3835","3836","3837","3838","3839","3840","3841","3842","3843","3844","3845","3846","3847","3848","3849","3850","3851","3852","3853","3854","3855","3856","3857","3858","3859","3860","3861","3862","3863","3864","3865","3866","3867","3868","3869","3870","3871","3872","3873","3874","3875","3876","3877","3878","3879","3880","3881","3882","3883","3884","3885","3886","3887","3888","3889","3890","3891","3892","3893","3894","3895","3896","3897","3898","3899","3900","3901","3902","3903","3904","3905","3906","3907","3908","3909","3910","3911","3912","3913","3914","3915","3916","3917","3918","3919","3920","3921","3922","3923","3924","3925","3926","3927","3928","3929","3930","3931","3932","3933","3934","3935","3936","3937","3938","3939","3940","3941","3942","3943","3944","3945","3946","3947","3948","3949","3950","3951","3952","3953","3954","3955","3956","3957","3958","3959","3960","3961","3962","3963","3964","3965","3966","3967","3968","3969","3970","3971","3972","3973","3974","3975","3976","3977","3978","3979","3980","3981","3982","3983","3984","3985","3986","3987","3988","3989","3990","3991","3992","3993","3994","3995","3996","3997","3998","3999","4000","4001","4002","4003","4004","4005","4006","4007","4008","4009","4010","4011","4012","4013","4014","4015","4016","4017","4018","4019","4020","4021","4022","4023","4024","4025","4026","4027","4028","4029","4030","4031","4032","4033","4034","4035","4036","4037","4038","4039","4040","4041","4042","4043","4044","4045","4046","4047","4048","4049","4050","4051","4052","4053","4054","4055","4056","4057","4058","4059","4060","4061","4062","4063","4064","4065","4066","4067","4068","4069","4070","4071","4072","4073","4074","4075","4076","4077","4078","4079","4080","4081","4082","4083","4084","4085","4086","4087","4088","4089","4090","4091","4092","4093","4094","4095","4096","4097","4098","4099","4100","4101","4102","4103","4104","4105","4106","4107","4108","4109","4110","4111","4112","4113","4114","4115","4116","4117","4118","4119","4120","4121","4122","4123","4124","4125","4126","4127","4128","4129","4130","4131","4132","4133","4134","4135","4136","4137","4138","4139","4140","4141","4142","4143","4144","4145","4146","4147","4148","4149","4150","4151","4152","4153","4154","4155","4156","4157","4158","4159","4160","4161","4162","4163","4164","4165","4166","4167","4168","4169","4170","4171","4172","4173","4174","4175","4176","4177","4178","4179","4180","4181","4182","4183","4184","4185","4186","4187","4188","4189","4190","4191","4192","4193","4194","4195","4196","4197","4198","4199","4200","4201","4202","4203","4204","4205","4206","4207","4208","4209","4210","4211","4212","4213","4214","4215","4216","4217","4218","4219","4220","4221","4222","4223","4224","4225","4226","4227","4228","4229","4230","4231","4232","4233","4234","4235","4236","4237","4238","4239","4240","4241","4242","4243","4244","4245","4246","4247","4248","4249","4250","4251","4252","4253","4254","4255","4256","4257","4258","4259","4260","4261","4262","4263","4264","4265","4266","4267","4268","4269","4270","4271","4272","4273","4274","4275","4276","4277","4278","4279","4280","4281","4282","4283","4284","4285","4286","4287","4288","4289","4290","4291","4292","4293","4294","4295","4296","4297","4298","4299","4300","4301","4302","4303","4304","4305","4306","4307","4308","4309","4310","4311","4312","4313","4314","4315","4316","4317","4318","4319","4320","4321","4322","4323","4324","4325","4326","4327","4328","4329","4330","4331","4332","4333","4334","4335","4336","4337","4338","4339","4340","4341","4342","4343","4344","4345","4346","4347","4348","4349","4350","4351","4352","4353","4354","4355","4356","4357","4358","4359","4360","4361","4362","4363","4364","4365","4366","4367","4368","4369","4370","4371","4372","4373","4374","4375","4376","4377","4378","4379","4380","4381","4382","4383","4384","4385","4386","4387","4388","4389","4390","4391","4392","4393","4394","4395","4396","4397","4398","4399","4400","4401","4402","4403","4404","4405","4406","4407","4408","4409","4410","4411","4412","4413","4414","4415","4416","4417","4418","4419","4420","4421","4422","4423","4424","4425","4426","4427","4428","4429","4430","4431","4432","4433","4434","4435","4436","4437","4438","4439","4440","4441","4442","4443","4444","4445","4446","4447","4448","4449","4450","4451","4452","4453","4454","4455","4456","4457","4458","4459","4460","4461","4462","4463","4464","4465","4466","4467","4468","4469","4470","4471","4472","4473","4474","4475","4476","4477","4478","4479","4480","4481","4482","4483","4484","4485","4486","4487","4488","4489","4490","4491","4492","4493","4494","4495","4496","4497","4498","4499","4500","4501","4502","4503","4504","4505","4506","4507","4508","4509","4510","4511","4512","4513","4514","4515","4516","4517","4518","4519","4520","4521","4522","4523","4524","4525","4526","4527","4528","4529","4530","4531","4532","4533","4534","4535","4536","4537","4538","4539","4540","4541","4542","4543","4544","4545","4546","4547","4548","4549","4550","4551","4552","4553","4554","4555","4556","4557","4558","4559","4560","4561","4562","4563","4564","4565","4566","4567","4568","4569","4570","4571","4572","4573","4574","4575","4576","4577","4578","4579","4580","4581","4582","4583","4584","4585","4586","4587","4588","4589","4590","4591","4592","4593","4594","4595","4596","4597","4598","4599","4600","4601","4602","4603","4604","4605","4606","4607","4608","4609","4610","4611","4612","4613","4614","4615","4616","4617","4618","4619","4620","4621","4622","4623","4624","4625","4626","4627","4628","4629","4630","4631","4632","4633","4634","4635","4636","4637","4638","4639","4640","4641","4642","4643","4644","4645","4646","4647","4648","4649","4650","4651","4652","4653","4654","4655","4656","4657","4658","4659","4660","4661","4662","4663","4664","4665","4666","4667","4668","4669","4670","4671","4672","4673","4674","4675","4676","4677","4678","4679","4680","4681","4682","4683","4684","4685","4686","4687","4688","4689","4690","4691","4692","4693","4694","4695","4696","4697","4698","4699","4700","4701","4702","4703","4704","4705","4706","4707","4708","4709","4710","4711","4712","4713","4714","4715","4716","4717","4718","4719","4720","4721","4722","4723","4724","4725","4726","4727","4728","4729","4730","4731","4732","4733","4734","4735","4736","4737","4738","4739","4740","4741","4742","4743","4744","4745","4746","4747","4748","4749","4750","4751","4752","4753","4754","4755","4756","4757","4758","4759","4760","4761","4762","4763","4764","4765","4766","4767","4768","4769","4770","4771","4772","4773","4774","4775","4776","4777","4778","4779","4780","4781","4782","4783","4784","4785","4786","4787","4788","4789","4790","4791","4792","4793","4794","4795","4796","4797","4798","4799","4800","4801","4802","4803","4804","4805","4806","4807","4808","4809","4810","4811","4812","4813","4814","4815","4816","4817","4818","4819","4820","4821","4822","4823","4824","4825","4826","4827","4828","4829","4830","4831","4832","4833","4834","4835","4836","4837","4838","4839","4840","4841","4842","4843","4844","4845","4846","4847","4848","4849","4850","4851","4852","4853","4854","4855","4856","4857","4858","4859","4860","4861","4862","4863","4864","4865","4866","4867","4868","4869","4870","4871","4872","4873","4874","4875","4876","4877","4878","4879","4880","4881","4882","4883","4884","4885","4886","4887","4888","4889","4890","4891","4892","4893","4894","4895","4896","4897","4898","4899","4900","4901","4902","4903","4904","4905","4906","4907","4908","4909","4910","4911","4912","4913","4914","4915","4916","4917","4918","4919","4920","4921","4922","4923","4924","4925","4926","4927","4928","4929","4930","4931","4932","4933","4934","4935","4936","4937","4938","4939","4940","4941","4942","4943","4944","4945","4946","4947","4948","4949","4950","4951","4952","4953","4954","4955","4956","4957","4958","4959","4960","4961","4962","4963","4964","4965","4966","4967","4968","4969","4970","4971","4972","4973","4974","4975","4976","4977","4978","4979","4980","4981","4982","4983","4984","4985","4986","4987","4988","4989","4990","4991","4992","4993","4994","4995","4996","4997","4998","4999","5000","5001","5002","5003","5004","5005","5006","5007","5008","5009","5010","5011","5012","5013","5014","5015","5016","5017","5018","5019","5020","5021","5022","5023","5024","5025","5026","5027","5028","5029","5030","5031","5032","5033","5034","5035","5036","5037","5038","5039","5040","5041","5042","5043","5044","5045","5046","5047","5048","5049","5050","5051","5052","5053","5054","5055","5056","5057","5058","5059","5060","5061","5062","5063","5064","5065","5066","5067","5068","5069","5070","5071","5072","5073","5074","5075","5076","5077","5078","5079","5080","5081","5082","5083","5084","5085","5086","5087","5088","5089","5090","5091","5092","5093","5094","5095","5096","5097","5098","5099","5100","5101","5102","5103","5104","5105","5106","5107","5108","5109","5110","5111","5112","5113","5114","5115","5116","5117","5118","5119","5120","5121","5122","5123","5124","5125","5126","5127","5128","5129","5130","5131","5132","5133","5134","5135","5136","5137","5138","5139","5140","5141","5142","5143","5144","5145","5146","5147","5148","5149","5150","5151","5152","5153","5154","5155","5156","5157","5158","5159","5160","5161","5162","5163","5164","5165","5166","5167","5168","5169","5170","5171","5172","5173","5174","5175","5176","5177","5178","5179","5180","5181","5182","5183","5184","5185","5186","5187","5188","5189","5190","5191","5192","5193","5194","5195","5196","5197","5198","5199","5200","5201","5202","5203","5204","5205","5206","5207","5208","5209","5210","5211","5212","5213","5214","5215","5216","5217","5218","5219","5220","5221","5222","5223","5224","5225","5226","5227","5228","5229","5230","5231","5232","5233","5234","5235","5236","5237","5238","5239","5240","5241","5242","5243","5244","5245","5246","5247","5248","5249","5250","5251","5252","5253","5254","5255","5256","5257","5258","5259","5260","5261","5262","5263","5264","5265","5266","5267","5268","5269","5270","5271","5272","5273","5274","5275","5276","5277","5278","5279","5280","5281","5282","5283","5284","5285","5286","5287","5288","5289","5290","5291","5292","5293","5294","5295","5296","5297","5298","5299","5300","5301","5302","5303","5304","5305","5306","5307","5308","5309","5310","5311","5312","5313","5314","5315","5316","5317","5318","5319","5320","5321","5322","5323","5324","5325","5326","5327","5328","5329","5330","5331","5332","5333","5334","5335","5336","5337","5338","5339","5340","5341","5342","5343","5344","5345","5346","5347","5348","5349","5350","5351","5352","5353","5354","5355","5356","5357","5358","5359","5360","5361","5362","5363","5364","5365","5366","5367","5368","5369","5370","5371","5372","5373","5374","5375","5376","5377","5378","5379","5380","5381","5382","5383","5384","5385","5386","5387","5388","5389","5390","5391","5392","5393","5394","5395","5396","5397","5398","5399","5400","5401","5402","5403","5404","5405","5406","5407","5408","5409","5410","5411","5412","5413","5414","5415","5416","5417","5418","5419","5420","5421","5422","5423","5424","5425","5426","5427","5428","5429","5430","5431","5432","5433","5434","5435","5436","5437","5438","5439","5440","5441","5442","5443","5444","5445","5446","5447","5448","5449","5450","5451","5452","5453","5454","5455","5456","5457","5458","5459","5460","5461","5462","5463","5464","5465","5466","5467","5468","5469","5470","5471","5472","5473","5474","5475","5476","5477","5478","5479","5480","5481","5482","5483","5484","5485","5486","5487","5488","5489","5490","5491","5492","5493","5494","5495","5496","5497","5498","5499","5500","5501","5502","5503","5504","5505","5506","5507","5508","5509","5510","5511","5512","5513","5514","5515","5516","5517","5518","5519","5520","5521","5522","5523","5524","5525","5526","5527","5528","5529","5530","5531","5532","5533","5534","5535","5536","5537","5538","5539","5540","5541","5542","5543","5544","5545","5546","5547","5548","5549","5550","5551","5552","5553","5554","5555","5556","5557","5558","5559","5560","5561","5562","5563","5564","5565","5566","5567","5568","5569","5570","5571","5572","5573","5574","5575","5576","5577","5578","5579","5580","5581","5582","5583","5584","5585","5586","5587","5588","5589","5590","5591","5592","5593","5594","5595","5596","5597","5598","5599","5600","5601","5602","5603","5604","5605","5606","5607","5608","5609","5610","5611","5612","5613","5614","5615","5616","5617","5618","5619","5620","5621","5622","5623","5624","5625","5626","5627","5628","5629","5630","5631","5632","5633","5634","5635","5636","5637","5638","5639","5640","5641","5642","5643","5644","5645","5646","5647","5648","5649","5650","5651","5652","5653","5654","5655","5656","5657","5658","5659","5660","5661","5662","5663","5664","5665","5666","5667","5668","5669","5670","5671","5672","5673","5674","5675","5676","5677","5678","5679","5680","5681","5682","5683","5684","5685","5686","5687","5688","5689","5690","5691","5692","5693","5694","5695","5696","5697","5698","5699","5700","5701","5702","5703","5704","5705","5706","5707","5708","5709","5710","5711","5712","5713","5714","5715","5716","5717","5718","5719","5720","5721","5722","5723","5724","5725","5726","5727","5728","5729","5730","5731","5732","5733","5734","5735","5736","5737","5738","5739","5740","5741","5742","5743","5744","5745","5746","5747","5748","5749","5750","5751","5752","5753","5754","5755","5756","5757","5758","5759","5760","5761","5762","5763","5764","5765","5766","5767","5768","5769","5770","5771","5772","5773","5774","5775","5776","5777","5778","5779","5780","5781","5782","5783","5784","5785","5786","5787","5788","5789","5790","5791","5792","5793","5794","5795","5796","5797","5798","5799","5800","5801","5802","5803","5804","5805","5806","5807","5808","5809","5810","5811","5812","5813","5814","5815","5816","5817","5818","5819","5820","5821","5822","5823","5824","5825","5826","5827","5828","5829","5830","5831","5832","5833","5834","5835","5836","5837","5838","5839","5840","5841","5842","5843","5844","5845","5846","5847","5848","5849","5850","5851","5852","5853","5854","5855","5856","5857","5858","5859","5860","5861","5862","5863","5864","5865","5866","5867","5868","5869","5870","5871","5872","5873","5874","5875","5876","5877","5878","5879","5880","5881","5882","5883","5884","5885","5886","5887","5888","5889","5890","5891","5892","5893","5894","5895","5896","5897","5898","5899","5900","5901","5902","5903","5904","5905","5906","5907","5908","5909","5910","5911","5912","5913","5914","5915","5916","5917","5918","5919","5920","5921","5922","5923","5924","5925","5926","5927","5928","5929","5930","5931","5932","5933","5934","5935","5936","5937","5938","5939","5940","5941","5942","5943","5944","5945","5946","5947","5948","5949","5950","5951","5952","5953","5954","5955","5956","5957","5958","5959","5960","5961","5962","5963","5964","5965","5966","5967","5968","5969","5970","5971","5972","5973","5974","5975","5976","5977","5978","5979","5980","5981","5982","5983","5984","5985","5986","5987","5988","5989","5990","5991","5992","5993","5994","5995","5996","5997","5998","5999","6000","6001","6002","6003","6004","6005","6006","6007","6008","6009","6010","6011","6012","6013","6014","6015","6016","6017","6018","6019","6020","6021","6022","6023","6024","6025","6026","6027","6028","6029","6030","6031","6032","6033","6034","6035","6036","6037","6038","6039","6040","6041","6042","6043","6044","6045","6046","6047","6048","6049","6050","6051","6052","6053","6054","6055","6056","6057","6058","6059","6060","6061","6062","6063","6064","6065","6066","6067","6068","6069","6070","6071","6072","6073","6074","6075","6076","6077","6078","6079","6080","6081","6082","6083","6084","6085","6086","6087","6088","6089","6090","6091","6092","6093","6094","6095","6096","6097","6098","6099","6100","6101","6102","6103","6104","6105","6106","6107","6108","6109","6110","6111","6112","6113","6114","6115","6116","6117","6118","6119","6120","6121","6122","6123","6124","6125","6126","6127","6128","6129","6130","6131","6132","6133","6134","6135","6136","6137","6138","6139","6140","6141","6142","6143","6144","6145","6146","6147","6148","6149","6150","6151","6152","6153","6154","6155","6156","6157","6158","6159","6160","6161","6162","6163","6164","6165","6166","6167","6168","6169","6170","6171","6172","6173","6174","6175","6176","6177","6178","6179","6180","6181","6182","6183","6184","6185","6186","6187","6188","6189","6190","6191","6192","6193","6194","6195","6196","6197","6198","6199","6200","6201","6202","6203","6204","6205","6206","6207","6208","6209","6210","6211","6212","6213","6214","6215","6216","6217","6218","6219","6220","6221","6222","6223","6224","6225","6226","6227","6228","6229","6230","6231","6232","6233","6234","6235","6236","6237","6238","6239","6240","6241","6242","6243","6244","6245","6246","6247","6248","6249","6250","6251","6252","6253","6254","6255","6256","6257","6258","6259","6260","6261","6262","6263","6264","6265","6266","6267","6268","6269","6270","6271","6272","6273","6274","6275","6276","6277","6278","6279","6280","6281","6282","6283","6284","6285","6286","6287","6288","6289","6290","6291","6292","6293","6294","6295","6296","6297","6298","6299","6300","6301","6302","6303","6304","6305","6306","6307","6308","6309","6310","6311","6312","6313","6314","6315","6316","6317","6318","6319","6320","6321","6322","6323","6324","6325","6326","6327","6328","6329","6330","6331","6332","6333","6334","6335","6336","6337","6338","6339","6340","6341","6342","6343","6344","6345","6346","6347","6348","6349","6350","6351","6352","6353","6354","6355","6356","6357","6358","6359","6360","6361","6362","6363","6364","6365","6366","6367","6368","6369","6370","6371","6372","6373","6374","6375","6376","6377","6378","6379","6380","6381","6382","6383","6384","6385","6386","6387","6388","6389","6390","6391","6392","6393","6394","6395","6396","6397","6398","6399","6400","6401","6402","6403","6404","6405","6406","6407","6408","6409","6410","6411","6412","6413","6414","6415","6416","6417","6418","6419","6420","6421","6422","6423","6424","6425","6426","6427","6428","6429","6430","6431","6432","6433","6434","6435","6436","6437","6438","6439","6440","6441","6442","6443","6444","6445","6446","6447","6448","6449","6450","6451","6452","6453","6454","6455","6456","6457","6458","6459","6460","6461","6462","6463","6464","6465","6466","6467","6468","6469","6470","6471","6472","6473","6474","6475","6476","6477","6478","6479","6480","6481","6482","6483","6484","6485","6486","6487","6488","6489","6490","6491","6492","6493","6494","6495","6496","6497","6498","6499","6500","6501","6502","6503","6504","6505","6506","6507","6508","6509","6510","6511","6512","6513","6514","6515","6516","6517","6518","6519","6520","6521","6522","6523","6524","6525","6526","6527","6528","6529","6530","6531","6532","6533","6534","6535","6536","6537","6538","6539","6540","6541","6542","6543","6544","6545","6546","6547","6548","6549","6550","6551","6552","6553","6554","6555","6556","6557","6558","6559","6560","6561","6562","6563","6564","6565","6566","6567","6568","6569","6570","6571","6572","6573","6574","6575","6576","6577","6578","6579","6580","6581","6582","6583","6584","6585","6586","6587","6588","6589","6590","6591","6592","6593","6594","6595","6596","6597","6598","6599","6600","6601","6602","6603","6604","6605","6606","6607","6608","6609","6610","6611","6612","6613","6614","6615","6616","6617","6618","6619","6620","6621","6622","6623","6624","6625","6626","6627","6628","6629","6630","6631","6632","6633","6634","6635","6636","6637","6638","6639","6640","6641","6642","6643","6644","6645","6646","6647","6648","6649","6650","6651","6652","6653","6654","6655","6656","6657","6658","6659","6660","6661","6662","6663","6664","6665","6666","6667","6668","6669","6670","6671","6672","6673","6674","6675","6676","6677","6678","6679","6680","6681","6682","6683","6684","6685","6686","6687","6688","6689","6690","6691","6692","6693","6694","6695","6696","6697","6698","6699","6700","6701","6702","6703","6704","6705","6706","6707","6708","6709","6710","6711","6712","6713","6714","6715","6716","6717","6718","6719","6720","6721","6722","6723","6724","6725","6726","6727","6728","6729","6730","6731","6732","6733","6734","6735","6736","6737","6738","6739","6740","6741","6742","6743","6744","6745","6746","6747","6748","6749","6750","6751","6752","6753","6754","6755","6756","6757","6758","6759","6760","6761","6762","6763","6764","6765","6766","6767","6768","6769","6770","6771","6772","6773","6774","6775","6776","6777","6778","6779","6780","6781","6782","6783","6784","6785","6786","6787","6788","6789","6790","6791","6792","6793","6794","6795","6796","6797","6798","6799","6800","6801","6802","6803","6804","6805","6806","6807","6808","6809","6810","6811","6812","6813","6814","6815","6816","6817","6818","6819","6820","6821","6822","6823","6824","6825","6826","6827","6828","6829","6830","6831","6832","6833","6834","6835","6836","6837","6838","6839","6840","6841","6842","6843","6844","6845","6846","6847","6848","6849","6850","6851","6852","6853","6854","6855","6856","6857","6858","6859","6860","6861","6862","6863","6864","6865","6866","6867","6868","6869","6870","6871","6872","6873","6874","6875","6876","6877","6878","6879","6880","6881","6882","6883","6884","6885","6886","6887","6888","6889","6890","6891","6892","6893","6894","6895","6896","6897","6898","6899","6900","6901","6902","6903","6904","6905","6906","6907","6908","6909","6910","6911","6912","6913","6914","6915","6916","6917","6918","6919","6920","6921","6922","6923","6924","6925","6926","6927","6928","6929","6930","6931","6932","6933","6934","6935","6936","6937","6938","6939","6940","6941","6942","6943","6944","6945","6946","6947","6948","6949","6950","6951","6952","6953","6954","6955","6956","6957","6958","6959","6960","6961","6962","6963","6964","6965","6966","6967","6968","6969","6970","6971","6972","6973","6974","6975","6976","6977","6978","6979","6980","6981","6982","6983","6984","6985","6986","6987","6988","6989","6990","6991","6992","6993","6994","6995","6996","6997","6998","6999","7000","7001","7002","7003","7004","7005","7006","7007","7008","7009","7010","7011","7012","7013","7014","7015","7016","7017","7018","7019","7020","7021","7022","7023","7024","7025","7026","7027","7028","7029","7030","7031","7032","7033","7034","7035","7036","7037","7038","7039","7040","7041","7042","7043","7044","7045","7046","7047","7048","7049","7050","7051","7052","7053","7054","7055","7056","7057","7058","7059","7060","7061","7062","7063","7064","7065","7066","7067","7068","7069","7070","7071","7072","7073","7074","7075","7076","7077","7078","7079","7080","7081","7082","7083","7084","7085","7086","7087","7088","7089","7090","7091","7092","7093","7094","7095","7096","7097","7098","7099","7100","7101","7102","7103","7104","7105","7106","7107","7108","7109","7110","7111","7112","7113","7114","7115","7116","7117","7118","7119","7120","7121","7122","7123","7124","7125","7126","7127","7128","7129","7130","7131","7132","7133","7134","7135","7136","7137","7138","7139","7140","7141","7142","7143","7144","7145","7146","7147","7148","7149","7150","7151","7152","7153","7154","7155","7156","7157","7158","7159","7160","7161","7162","7163","7164","7165","7166","7167","7168","7169","7170","7171","7172","7173","7174","7175","7176","7177","7178","7179","7180","7181","7182","7183","7184","7185","7186","7187","7188","7189","7190","7191","7192","7193","7194","7195","7196","7197","7198","7199","7200","7201","7202","7203","7204","7205","7206","7207","7208","7209","7210","7211","7212","7213","7214","7215","7216","7217","7218","7219","7220","7221","7222","7223","7224","7225","7226","7227","7228","7229","7230","7231","7232","7233","7234","7235","7236","7237","7238","7239","7240","7241","7242","7243","7244","7245","7246","7247","7248","7249","7250","7251","7252","7253","7254","7255","7256","7257","7258","7259","7260","7261","7262","7263","7264","7265","7266","7267","7268","7269","7270","7271","7272","7273","7274","7275","7276","7277","7278","7279","7280","7281","7282","7283","7284","7285","7286","7287","7288","7289","7290","7291","7292","7293","7294","7295","7296","7297","7298","7299","7300","7301","7302","7303","7304","7305","7306","7307","7308","7309","7310","7311","7312","7313","7314","7315","7316","7317","7318","7319","7320","7321","7322","7323","7324","7325","7326","7327","7328","7329","7330","7331","7332","7333","7334","7335","7336","7337","7338","7339","7340","7341","7342","7343","7344","7345","7346","7347","7348","7349","7350","7351","7352","7353","7354","7355","7356","7357","7358","7359","7360","7361","7362","7363","7364","7365","7366","7367","7368","7369","7370","7371","7372","7373","7374","7375","7376","7377","7378","7379","7380","7381","7382","7383","7384","7385","7386","7387","7388","7389","7390","7391","7392","7393","7394","7395","7396","7397","7398","7399","7400","7401","7402","7403","7404","7405","7406","7407","7408","7409","7410","7411","7412","7413","7414","7415","7416","7417","7418","7419","7420","7421","7422","7423","7424","7425","7426","7427","7428","7429","7430","7431","7432","7433","7434","7435","7436","7437","7438","7439","7440","7441","7442","7443","7444","7445","7446","7447","7448","7449","7450","7451","7452","7453","7454","7455","7456","7457","7458","7459","7460","7461","7462","7463","7464","7465","7466","7467","7468","7469","7470","7471","7472","7473","7474","7475","7476","7477","7478","7479","7480","7481","7482","7483","7484","7485","7486","7487","7488","7489","7490","7491","7492","7493","7494","7495","7496","7497","7498","7499","7500","7501","7502","7503","7504","7505","7506","7507","7508","7509","7510","7511","7512","7513","7514","7515","7516","7517","7518","7519","7520","7521","7522","7523","7524","7525","7526","7527","7528","7529","7530","7531","7532","7533","7534","7535","7536","7537","7538","7539","7540","7541","7542","7543","7544","7545","7546","7547","7548","7549","7550","7551","7552","7553","7554","7555","7556","7557","7558","7559","7560","7561","7562","7563","7564","7565","7566","7567","7568","7569","7570","7571","7572","7573","7574","7575","7576","7577","7578","7579","7580","7581","7582","7583","7584","7585","7586","7587","7588","7589","7590","7591","7592","7593","7594","7595","7596","7597","7598","7599","7600","7601","7602","7603","7604","7605","7606","7607","7608","7609","7610","7611","7612","7613","7614","7615","7616","7617","7618","7619","7620","7621","7622","7623","7624","7625","7626","7627","7628","7629","7630","7631","7632","7633","7634","7635","7636","7637","7638","7639","7640","7641","7642","7643","7644","7645","7646","7647","7648","7649","7650","7651","7652","7653","7654","7655","7656","7657","7658","7659","7660","7661","7662","7663","7664","7665","7666","7667","7668","7669","7670","7671","7672","7673","7674","7675","7676","7677","7678","7679","7680","7681","7682","7683","7684","7685","7686","7687","7688","7689","7690","7691","7692","7693","7694","7695","7696","7697","7698","7699","7700","7701","7702","7703","7704","7705","7706","7707","7708","7709","7710","7711","7712","7713","7714","7715","7716","7717","7718","7719","7720","7721","7722","7723","7724","7725","7726","7727","7728","7729","7730","7731","7732","7733","7734","7735","7736","7737","7738","7739","7740","7741","7742","7743","7744","7745","7746","7747","7748","7749","7750","7751","7752","7753","7754","7755","7756","7757","7758","7759","7760","7761","7762","7763","7764","7765","7766","7767","7768","7769","7770","7771","7772","7773","7774","7775","7776","7777","7778","7779","7780","7781","7782","7783","7784","7785","7786","7787","7788","7789","7790","7791","7792","7793","7794","7795","7796","7797","7798","7799","7800","7801","7802","7803","7804","7805","7806","7807","7808","7809","7810","7811","7812","7813","7814","7815","7816","7817","7818","7819","7820","7821","7822","7823","7824","7825","7826","7827","7828","7829","7830","7831","7832","7833","7834","7835","7836","7837","7838","7839","7840","7841","7842","7843","7844","7845","7846","7847","7848","7849","7850","7851","7852","7853","7854","7855","7856","7857","7858","7859","7860","7861","7862","7863","7864","7865","7866","7867","7868","7869","7870","7871","7872","7873","7874","7875","7876","7877","7878","7879","7880","7881","7882","7883","7884","7885","7886","7887","7888","7889","7890","7891","7892","7893","7894","7895","7896","7897","7898","7899","7900","7901","7902","7903","7904","7905","7906","7907","7908","7909","7910","7911","7912","7913","7914","7915","7916","7917","7918","7919","7920","7921","7922","7923","7924","7925","7926","7927","7928","7929","7930","7931","7932","7933","7934","7935","7936","7937","7938","7939","7940","7941","7942","7943","7944","7945","7946","7947","7948","7949","7950","7951","7952","7953","7954","7955","7956","7957","7958","7959","7960","7961","7962","7963","7964","7965","7966","7967","7968","7969","7970","7971","7972","7973","7974","7975","7976","7977","7978","7979","7980","7981","7982","7983","7984","7985","7986","7987","7988","7989","7990","7991","7992","7993","7994","7995","7996","7997","7998","7999","8000","8001","8002","8003","8004","8005","8006","8007","8008","8009","8010","8011","8012","8013","8014","8015","8016","8017","8018","8019","8020","8021","8022","8023","8024","8025","8026","8027","8028","8029","8030","8031","8032","8033","8034","8035","8036","8037","8038","8039","8040","8041","8042","8043","8044","8045","8046","8047","8048","8049","8050","8051","8052","8053","8054","8055","8056","8057","8058","8059","8060","8061","8062","8063","8064","8065","8066","8067","8068","8069","8070","8071","8072","8073","8074","8075","8076","8077","8078","8079","8080","8081","8082","8083","8084","8085","8086","8087","8088","8089","8090","8091","8092","8093","8094","8095","8096","8097","8098","8099","8100","8101","8102","8103","8104","8105","8106","8107","8108","8109","8110","8111","8112","8113","8114","8115","8116","8117","8118","8119","8120","8121","8122","8123","8124","8125","8126","8127","8128","8129","8130","8131","8132","8133","8134","8135","8136","8137","8138","8139","8140","8141","8142","8143","8144","8145","8146","8147","8148","8149","8150","8151","8152","8153","8154","8155","8156","8157","8158","8159","8160","8161","8162","8163","8164","8165","8166","8167","8168","8169","8170","8171","8172","8173","8174","8175","8176","8177","8178","8179","8180","8181","8182","8183","8184","8185","8186","8187","8188","8189","8190","8191","8192","8193","8194","8195","8196","8197","8198","8199","8200","8201","8202","8203","8204","8205","8206","8207","8208","8209","8210","8211","8212","8213","8214","8215","8216","8217","8218","8219","8220","8221","8222","8223","8224","8225","8226","8227","8228","8229","8230","8231","8232","8233","8234","8235","8236","8237","8238","8239","8240","8241","8242","8243","8244","8245","8246","8247","8248","8249","8250","8251","8252","8253","8254","8255","8256","8257","8258","8259","8260","8261","8262","8263","8264","8265","8266","8267","8268","8269","8270","8271","8272","8273","8274","8275","8276","8277","8278","8279","8280","8281","8282","8283","8284","8285","8286","8287","8288","8289","8290","8291","8292","8293","8294","8295","8296","8297","8298","8299","8300","8301","8302","8303","8304","8305","8306","8307","8308","8309","8310","8311","8312","8313","8314","8315","8316","8317","8318","8319","8320","8321","8322","8323","8324","8325","8326","8327","8328","8329","8330","8331","8332","8333","8334","8335","8336","8337","8338","8339","8340","8341","8342","8343","8344","8345","8346","8347","8348","8349","8350","8351","8352","8353","8354","8355","8356","8357","8358","8359","8360","8361","8362","8363","8364","8365","8366","8367","8368","8369","8370","8371","8372","8373","8374","8375","8376","8377","8378","8379","8380","8381","8382","8383","8384","8385","8386","8387","8388","8389","8390","8391","8392","8393","8394","8395","8396","8397","8398","8399","8400","8401","8402","8403","8404","8405","8406","8407","8408","8409","8410","8411","8412","8413","8414","8415","8416","8417","8418","8419","8420","8421","8422","8423","8424","8425","8426","8427","8428","8429","8430","8431","8432","8433","8434","8435","8436","8437","8438","8439","8440","8441","8442","8443","8444","8445","8446","8447","8448","8449","8450","8451","8452","8453","8454","8455","8456","8457","8458","8459","8460","8461","8462","8463","8464","8465","8466","8467","8468","8469","8470","8471","8472","8473","8474","8475","8476","8477","8478","8479","8480","8481","8482","8483","8484","8485","8486","8487","8488","8489","8490","8491","8492","8493","8494","8495","8496","8497","8498","8499","8500","8501","8502","8503","8504","8505","8506","8507","8508","8509","8510","8511","8512","8513","8514","8515","8516","8517","8518","8519","8520","8521","8522","8523","8524","8525","8526","8527","8528","8529","8530","8531","8532","8533","8534","8535","8536","8537","8538","8539","8540","8541","8542","8543","8544","8545","8546","8547","8548","8549","8550","8551","8552","8553","8554","8555","8556","8557","8558","8559","8560","8561","8562","8563","8564","8565","8566","8567","8568","8569","8570","8571","8572","8573","8574","8575","8576","8577","8578","8579","8580","8581","8582","8583","8584","8585","8586","8587","8588","8589","8590","8591","8592","8593","8594","8595","8596","8597","8598","8599","8600","8601","8602","8603","8604","8605","8606","8607","8608","8609","8610","8611","8612","8613","8614","8615","8616","8617","8618","8619","8620","8621","8622","8623","8624","8625","8626","8627","8628","8629","8630","8631","8632","8633","8634","8635","8636","8637","8638","8639","8640","8641","8642","8643","8644","8645","8646","8647","8648","8649","8650","8651","8652","8653","8654","8655","8656","8657","8658","8659","8660","8661","8662","8663","8664","8665","8666","8667","8668","8669","8670","8671","8672","8673","8674","8675","8676","8677","8678","8679","8680","8681","8682","8683","8684","8685","8686","8687","8688","8689","8690","8691","8692","8693","8694","8695","8696","8697","8698","8699","8700","8701","8702","8703","8704","8705","8706","8707","8708","8709","8710","8711","8712","8713","8714","8715","8716","8717","8718","8719","8720","8721","8722","8723","8724","8725","8726","8727","8728","8729","8730","8731","8732","8733","8734","8735","8736","8737","8738","8739","8740","8741","8742","8743","8744","8745","8746","8747","8748","8749","8750","8751","8752","8753","8754","8755","8756","8757","8758","8759","8760","8761","8762","8763","8764","8765","8766","8767","8768","8769","8770","8771","8772","8773","8774","8775","8776","8777","8778","8779","8780","8781","8782","8783","8784","8785","8786","8787","8788","8789","8790","8791","8792","8793","8794","8795","8796","8797","8798","8799","8800","8801","8802","8803","8804","8805","8806","8807","8808","8809","8810","8811","8812","8813","8814","8815","8816","8817","8818","8819","8820","8821","8822","8823","8824","8825","8826","8827","8828","8829","8830","8831","8832","8833","8834","8835","8836","8837","8838","8839","8840","8841","8842","8843","8844","8845","8846","8847","8848","8849","8850","8851","8852","8853","8854","8855","8856","8857","8858","8859","8860","8861","8862","8863","8864","8865","8866","8867","8868","8869","8870","8871","8872","8873","8874","8875","8876","8877","8878","8879","8880","8881","8882","8883","8884","8885","8886","8887","8888","8889","8890","8891","8892","8893","8894","8895","8896","8897","8898","8899","8900","8901","8902","8903","8904","8905","8906","8907","8908","8909","8910","8911","8912","8913","8914","8915","8916","8917","8918","8919","8920","8921","8922","8923","8924","8925","8926","8927","8928","8929","8930","8931","8932","8933","8934","8935","8936","8937","8938","8939","8940","8941","8942","8943","8944","8945","8946","8947","8948","8949","8950","8951","8952","8953","8954","8955","8956","8957","8958","8959","8960","8961","8962","8963","8964","8965","8966","8967","8968","8969","8970","8971","8972","8973","8974","8975","8976","8977","8978","8979","8980","8981","8982","8983","8984","8985","8986","8987","8988","8989","8990","8991","8992","8993","8994","8995","8996","8997","8998","8999","9000","9001","9002","9003","9004","9005","9006","9007","9008","9009","9010","9011","9012","9013","9014","9015","9016","9017","9018","9019","9020","9021","9022","9023","9024","9025","9026","9027","9028","9029","9030","9031","9032","9033","9034","9035","9036","9037","9038","9039","9040","9041","9042","9043","9044","9045","9046","9047","9048","9049","9050","9051","9052","9053","9054","9055","9056","9057","9058","9059","9060","9061","9062","9063","9064","9065","9066","9067","9068","9069","9070","9071","9072","9073","9074","9075","9076","9077","9078","9079","9080","9081","9082","9083","9084","9085","9086","9087","9088","9089","9090","9091","9092","9093","9094","9095","9096","9097","9098","9099","9100","9101","9102","9103","9104","9105","9106","9107","9108","9109","9110","9111","9112","9113","9114","9115","9116","9117","9118","9119","9120","9121","9122","9123","9124","9125","9126","9127","9128","9129","9130","9131","9132","9133","9134","9135","9136","9137","9138","9139","9140","9141","9142","9143","9144","9145","9146","9147","9148","9149","9150","9151","9152","9153","9154","9155","9156","9157","9158","9159","9160","9161","9162","9163","9164","9165","9166","9167","9168","9169","9170","9171","9172","9173","9174","9175","9176","9177","9178","9179","9180","9181","9182","9183","9184","9185","9186","9187","9188","9189","9190","9191","9192","9193","9194","9195","9196","9197","9198","9199","9200","9201","9202","9203","9204","9205","9206","9207","9208","9209","9210","9211","9212","9213","9214","9215","9216","9217","9218","9219","9220","9221","9222","9223","9224","9225","9226","9227","9228","9229","9230","9231","9232","9233","9234","9235","9236","9237","9238","9239","9240","9241","9242","9243","9244","9245","9246","9247","9248","9249","9250","9251","9252","9253","9254","9255","9256","9257","9258","9259","9260","9261","9262","9263","9264","9265","9266","9267","9268","9269","9270","9271","9272","9273","9274","9275","9276","9277","9278","9279","9280","9281","9282","9283","9284","9285","9286","9287","9288","9289","9290","9291","9292","9293","9294","9295","9296","9297","9298","9299","9300","9301","9302","9303","9304","9305","9306","9307","9308","9309","9310","9311","9312","9313","9314","9315","9316","9317","9318","9319","9320","9321","9322","9323","9324","9325","9326","9327","9328","9329","9330","9331","9332","9333","9334","9335","9336","9337","9338","9339","9340","9341","9342","9343","9344","9345","9346","9347","9348","9349","9350","9351","9352","9353","9354","9355","9356","9357","9358","9359","9360","9361","9362","9363","9364","9365","9366","9367","9368","9369","9370","9371","9372","9373","9374","9375","9376","9377","9378","9379","9380","9381","9382","9383","9384","9385","9386","9387","9388","9389","9390","9391","9392","9393","9394","9395","9396","9397","9398","9399","9400","9401","9402","9403","9404","9405","9406","9407","9408","9409","9410","9411","9412","9413","9414","9415","9416","9417","9418","9419","9420","9421","9422","9423","9424","9425","9426","9427","9428","9429","9430","9431","9432","9433","9434","9435","9436","9437","9438","9439","9440","9441","9442","9443","9444","9445","9446","9447","9448","9449","9450","9451","9452","9453","9454","9455","9456","9457","9458","9459","9460","9461","9462","9463","9464","9465","9466","9467","9468","9469","9470","9471","9472","9473","9474","9475","9476","9477","9478","9479","9480","9481","9482","9483","9484","9485","9486","9487","9488","9489","9490","9491","9492","9493","9494","9495","9496","9497","9498","9499","9500","9501","9502","9503","9504","9505","9506","9507","9508","9509","9510","9511","9512","9513","9514","9515","9516","9517","9518","9519","9520","9521","9522","9523","9524","9525","9526","9527","9528","9529","9530","9531","9532","9533","9534","9535","9536","9537","9538","9539","9540","9541","9542","9543","9544","9545","9546","9547","9548","9549","9550","9551","9552","9553","9554","9555","9556","9557","9558","9559","9560","9561","9562","9563","9564","9565","9566","9567","9568","9569","9570","9571","9572","9573","9574","9575","9576","9577","9578","9579","9580","9581","9582","9583","9584","9585","9586","9587","9588","9589","9590","9591","9592","9593","9594","9595","9596","9597","9598","9599","9600","9601","9602","9603","9604","9605","9606","9607","9608","9609","9610","9611","9612","9613","9614","9615","9616","9617","9618","9619","9620","9621","9622","9623","9624","9625","9626","9627","9628","9629","9630","9631","9632","9633","9634","9635","9636","9637","9638","9639","9640","9641","9642","9643","9644","9645","9646","9647","9648","9649","9650","9651","9652","9653","9654","9655","9656","9657","9658","9659","9660","9661","9662","9663","9664","9665","9666","9667","9668","9669","9670","9671","9672","9673","9674","9675","9676","9677","9678","9679","9680","9681","9682","9683","9684","9685","9686","9687","9688","9689","9690","9691","9692","9693","9694","9695","9696","9697","9698","9699","9700","9701","9702","9703","9704","9705","9706","9707","9708","9709","9710","9711","9712","9713","9714","9715","9716","9717","9718","9719","9720","9721","9722","9723","9724","9725","9726","9727","9728","9729","9730","9731","9732","9733","9734","9735","9736","9737","9738","9739","9740","9741","9742","9743","9744","9745","9746","9747","9748","9749","9750","9751","9752","9753","9754","9755","9756","9757","9758","9759","9760","9761","9762","9763","9764","9765","9766","9767","9768","9769","9770","9771","9772","9773","9774","9775","9776","9777","9778","9779","9780","9781","9782","9783","9784","9785","9786","9787","9788","9789","9790","9791","9792","9793","9794","9795","9796","9797","9798","9799","9800","9801","9802","9803","9804","9805","9806","9807","9808","9809","9810","9811","9812","9813","9814","9815","9816","9817","9818","9819","9820","9821","9822","9823","9824","9825","9826","9827","9828","9829","9830","9831","9832","9833","9834","9835","9836","9837","9838","9839","9840","9841","9842","9843","9844","9845","9846","9847","9848","9849","9850","9851","9852","9853","9854","9855","9856","9857","9858","9859","9860","9861","9862","9863","9864","9865","9866","9867","9868","9869","9870","9871","9872","9873","9874","9875","9876","9877","9878","9879","9880","9881","9882","9883","9884","9885","9886","9887","9888","9889","9890","9891","9892","9893","9894","9895","9896","9897","9898","9899","9900","9901","9902","9903","9904","9905","9906","9907","9908","9909","9910","9911","9912","9913","9914","9915","9916","9917","9918","9919","9920","9921","9922","9923","9924","9925","9926","9927","9928","9929","9930","9931","9932","9933","9934","9935","9936","9937","9938","9939","9940","9941","9942","9943","9944","9945","9946","9947","9948","9949","9950","9951","9952","9953","9954","9955","9956","9957","9958","9959","9960","9961","9962","9963","9964","9965","9966","9967","9968","9969","9970","9971","9972","9973","9974","9975","9976","9977","9978","9979","9980","9981","9982","9983","9984","9985","9986","9987","9988","9989","9990","9991","9992","9993","9994","9995","9996","9997","9998","9999","10000","10001","10002","10003","10004","10005","10006","10007","10008","10009","10010","10011","10012","10013","10014","10015","10016","10017","10018","10019","10020","10021","10022","10023","10024","10025","10026","10027","10028","10029","10030","10031","10032","10033","10034","10035","10036","10037","10038","10039","10040","10041","10042","10043","10044","10045","10046","10047","10048","10049","10050","10051","10052","10053","10054","10055","10056","10057","10058","10059","10060","10061","10062","10063","10064","10065","10066","10067","10068","10069","10070","10071","10072","10073","10074","10075","10076","10077","10078","10079","10080","10081","10082","10083","10084","10085","10086","10087","10088","10089","10090","10091","10092","10093","10094","10095","10096","10097","10098","10099","10100","10101","10102","10103","10104","10105","10106","10107","10108","10109","10110","10111","10112","10113","10114","10115","10116","10117","10118","10119","10120","10121","10122","10123","10124","10125","10126","10127","10128","10129","10130","10131","10132","10133","10134","10135","10136","10137","10138","10139","10140","10141","10142","10143","10144","10145","10146","10147","10148","10149","10150","10151","10152","10153","10154","10155","10156","10157","10158","10159","10160","10161","10162","10163","10164","10165","10166","10167","10168","10169","10170","10171","10172","10173","10174","10175","10176","10177","10178","10179","10180","10181","10182","10183","10184","10185","10186","10187","10188","10189","10190","10191","10192","10193","10194","10195","10196","10197","10198","10199","10200","10201","10202","10203","10204","10205","10206","10207","10208","10209","10210","10211","10212","10213","10214","10215","10216","10217","10218","10219","10220","10221","10222","10223","10224","10225","10226","10227","10228","10229","10230","10231","10232","10233","10234","10235","10236","10237","10238","10239","10240","10241","10242","10243","10244","10245","10246","10247","10248","10249","10250","10251","10252","10253","10254","10255","10256","10257","10258","10259","10260","10261","10262","10263","10264","10265","10266","10267","10268","10269","10270","10271","10272","10273","10274","10275","10276","10277","10278","10279","10280","10281","10282","10283","10284","10285","10286","10287","10288","10289","10290","10291","10292","10293","10294","10295","10296","10297","10298","10299","10300","10301","10302","10303","10304","10305","10306","10307","10308","10309","10310","10311","10312","10313","10314","10315","10316","10317","10318","10319","10320","10321","10322","10323","10324","10325","10326","10327","10328","10329","10330","10331","10332","10333","10334","10335","10336","10337","10338","10339","10340","10341","10342","10343","10344","10345","10346","10347","10348","10349","10350","10351","10352","10353","10354","10355","10356","10357","10358","10359","10360","10361","10362","10363","10364","10365","10366","10367","10368","10369","10370","10371","10372","10373","10374","10375","10376","10377","10378","10379","10380","10381","10382","10383","10384","10385","10386","10387","10388","10389","10390","10391","10392","10393","10394","10395","10396","10397","10398","10399","10400","10401","10402","10403","10404","10405","10406","10407","10408","10409","10410","10411","10412","10413","10414","10415","10416","10417","10418","10419","10420","10421","10422","10423","10424","10425","10426","10427","10428","10429","10430","10431","10432","10433","10434","10435","10436","10437","10438","10439","10440","10441","10442","10443","10444","10445","10446","10447","10448","10449","10450","10451","10452","10453","10454","10455","10456","10457","10458","10459","10460","10461","10462","10463","10464","10465","10466","10467","10468","10469","10470","10471","10472","10473","10474","10475","10476","10477","10478","10479","10480","10481","10482","10483","10484","10485","10486","10487","10488","10489","10490","10491","10492","10493","10494","10495","10496","10497","10498","10499","10500","10501","10502","10503","10504","10505","10506","10507","10508","10509","10510","10511","10512","10513","10514","10515","10516","10517","10518","10519","10520","10521","10522","10523","10524","10525","10526","10527","10528","10529","10530","10531","10532","10533","10534","10535","10536","10537","10538","10539","10540","10541","10542","10543","10544","10545","10546","10547","10548","10549","10550","10551","10552","10553","10554","10555","10556","10557","10558","10559","10560","10561","10562","10563","10564","10565","10566","10567","10568","10569","10570","10571","10572","10573","10574","10575","10576","10577","10578","10579","10580","10581","10582","10583","10584","10585","10586","10587","10588","10589","10590","10591","10592","10593","10594","10595","10596","10597","10598","10599","10600","10601","10602","10603","10604","10605","10606","10607","10608","10609","10610","10611","10612","10613","10614","10615","10616","10617","10618","10619","10620","10621","10622","10623","10624","10625","10626","10627","10628","10629","10630","10631","10632","10633","10634","10635","10636","10637","10638","10639","10640","10641","10642","10643","10644","10645","10646","10647","10648","10649","10650","10651","10652","10653","10654","10655","10656","10657","10658","10659","10660","10661","10662","10663","10664","10665","10666","10667","10668","10669","10670","10671","10672","10673","10674","10675","10676","10677","10678","10679","10680","10681","10682","10683","10684","10685","10686","10687","10688","10689","10690","10691","10692","10693","10694","10695","10696","10697","10698","10699","10700","10701","10702","10703","10704","10705","10706","10707","10708","10709","10710","10711","10712","10713","10714","10715","10716","10717","10718","10719","10720","10721","10722","10723","10724","10725","10726","10727","10728","10729","10730","10731","10732","10733","10734","10735","10736","10737","10738","10739","10740","10741","10742","10743","10744","10745","10746","10747","10748","10749","10750","10751","10752","10753","10754","10755","10756","10757","10758","10759","10760","10761","10762","10763","10764","10765","10766","10767","10768","10769","10770","10771","10772","10773","10774","10775","10776","10777","10778","10779","10780","10781","10782","10783","10784","10785","10786","10787","10788","10789","10790","10791","10792","10793","10794","10795","10796","10797","10798","10799","10800","10801","10802","10803","10804","10805","10806","10807","10808","10809","10810","10811","10812","10813","10814","10815","10816","10817","10818","10819","10820","10821","10822","10823","10824","10825","10826","10827","10828","10829","10830","10831","10832","10833","10834","10835","10836","10837","10838","10839","10840","10841","10842","10843","10844","10845","10846","10847","10848","10849","10850","10851","10852","10853","10854","10855","10856","10857","10858","10859","10860","10861","10862","10863","10864","10865","10866","10867","10868","10869","10870","10871","10872","10873","10874","10875","10876","10877","10878","10879","10880","10881","10882","10883","10884","10885","10886","10887","10888","10889","10890","10891","10892","10893","10894","10895","10896","10897","10898","10899","10900","10901","10902","10903","10904","10905","10906","10907","10908","10909","10910","10911","10912","10913","10914","10915","10916","10917","10918","10919","10920","10921","10922","10923","10924","10925","10926","10927","10928","10929","10930","10931","10932","10933","10934","10935","10936","10937","10938","10939","10940","10941","10942","10943","10944","10945","10946","10947","10948","10949","10950","10951","10952","10953","10954","10955","10956","10957","10958","10959","10960","10961","10962","10963","10964","10965","10966","10967","10968","10969","10970","10971","10972","10973","10974","10975","10976","10977","10978","10979","10980","10981","10982","10983","10984","10985","10986","10987","10988","10989","10990","10991","10992","10993","10994","10995","10996","10997","10998","10999","11000","11001","11002","11003","11004","11005","11006","11007","11008","11009","11010","11011","11012","11013","11014","11015","11016","11017","11018","11019","11020","11021","11022","11023","11024","11025","11026","11027","11028","11029","11030","11031","11032","11033","11034","11035","11036","11037","11038","11039","11040","11041","11042","11043","11044","11045","11046","11047","11048","11049","11050","11051","11052","11053","11054","11055","11056","11057","11058","11059","11060","11061","11062","11063","11064","11065","11066","11067","11068","11069","11070","11071","11072","11073","11074","11075","11076","11077","11078","11079","11080","11081","11082","11083","11084","11085","11086","11087","11088","11089","11090","11091","11092","11093","11094","11095","11096","11097","11098","11099","11100","11101","11102","11103","11104","11105","11106","11107","11108","11109","11110","11111","11112","11113","11114","11115","11116","11117","11118","11119","11120","11121","11122","11123","11124","11125","11126","11127","11128","11129","11130","11131","11132","11133","11134","11135","11136","11137","11138","11139","11140","11141","11142","11143","11144","11145","11146","11147","11148","11149","11150","11151","11152","11153","11154","11155","11156","11157","11158","11159","11160","11161","11162","11163","11164","11165","11166","11167","11168","11169","11170","11171","11172","11173","11174","11175","11176","11177","11178","11179","11180","11181","11182","11183","11184","11185","11186","11187","11188","11189","11190","11191","11192","11193","11194","11195","11196","11197","11198","11199","11200","11201","11202","11203","11204","11205","11206","11207","11208","11209","11210","11211","11212","11213","11214","11215","11216","11217","11218","11219","11220","11221","11222","11223","11224","11225","11226","11227","11228","11229","11230","11231","11232","11233","11234","11235","11236","11237","11238","11239","11240","11241","11242","11243","11244","11245","11246","11247","11248","11249","11250","11251","11252","11253","11254","11255","11256","11257","11258","11259","11260","11261","11262","11263","11264","11265","11266","11267","11268","11269","11270","11271","11272","11273","11274","11275","11276","11277","11278","11279","11280","11281","11282","11283","11284","11285","11286","11287","11288","11289","11290","11291","11292","11293","11294","11295","11296","11297","11298","11299","11300","11301","11302","11303","11304","11305","11306","11307","11308","11309","11310","11311","11312","11313","11314","11315","11316","11317","11318","11319","11320","11321","11322","11323","11324","11325","11326","11327","11328","11329","11330","11331","11332","11333","11334","11335","11336","11337","11338","11339","11340","11341","11342","11343","11344","11345","11346","11347","11348","11349","11350","11351","11352","11353","11354","11355","11356","11357","11358","11359","11360","11361","11362","11363","11364","11365","11366","11367","11368","11369","11370","11371","11372","11373","11374","11375","11376","11377","11378","11379","11380","11381","11382","11383","11384","11385","11386","11387","11388","11389","11390","11391","11392","11393","11394","11395","11396","11397","11398","11399","11400","11401","11402","11403","11404","11405","11406","11407","11408","11409","11410","11411","11412","11413","11414","11415","11416","11417","11418","11419","11420","11421","11422","11423","11424","11425","11426","11427","11428","11429","11430","11431","11432","11433","11434","11435","11436","11437","11438","11439","11440","11441","11442","11443","11444","11445","11446","11447","11448","11449","11450","11451","11452","11453","11454","11455","11456","11457","11458","11459","11460","11461","11462","11463","11464","11465","11466","11467","11468","11469","11470","11471","11472","11473","11474","11475","11476","11477","11478","11479","11480","11481","11482","11483","11484","11485","11486","11487","11488","11489","11490","11491","11492","11493","11494","11495","11496","11497","11498","11499","11500","11501","11502","11503","11504","11505","11506","11507","11508","11509","11510","11511","11512","11513","11514","11515","11516","11517","11518","11519","11520","11521","11522","11523","11524","11525","11526","11527","11528","11529","11530","11531","11532","11533","11534","11535","11536","11537","11538","11539","11540","11541","11542","11543","11544","11545","11546","11547","11548","11549","11550","11551","11552","11553","11554","11555","11556","11557","11558","11559","11560","11561","11562","11563","11564","11565","11566","11567","11568","11569","11570","11571","11572","11573","11574","11575","11576","11577","11578","11579","11580","11581","11582","11583","11584","11585","11586","11587","11588","11589","11590","11591","11592","11593","11594","11595","11596","11597","11598","11599","11600","11601","11602","11603","11604","11605","11606","11607","11608","11609","11610","11611","11612","11613","11614","11615","11616","11617","11618","11619","11620","11621","11622","11623","11624","11625","11626","11627","11628","11629","11630","11631","11632","11633","11634","11635","11636","11637","11638","11639","11640","11641","11642","11643","11644","11645","11646","11647","11648","11649","11650","11651","11652","11653","11654","11655","11656","11657","11658","11659","11660","11661","11662","11663","11664","11665","11666","11667","11668","11669","11670","11671","11672","11673","11674","11675","11676","11677","11678","11679","11680","11681","11682","11683","11684","11685","11686","11687","11688","11689","11690","11691","11692","11693","11694","11695","11696","11697","11698","11699","11700","11701","11702","11703","11704","11705","11706","11707","11708","11709","11710","11711","11712","11713","11714","11715","11716","11717","11718","11719","11720","11721","11722","11723","11724","11725","11726","11727","11728","11729","11730","11731","11732","11733","11734","11735","11736","11737","11738","11739","11740","11741","11742","11743","11744","11745","11746","11747","11748","11749","11750","11751","11752","11753","11754","11755","11756","11757","11758","11759","11760","11761","11762","11763","11764","11765","11766","11767","11768","11769","11770","11771","11772","11773","11774","11775","11776","11777","11778","11779","11780","11781","11782","11783","11784","11785","11786","11787","11788","11789","11790","11791","11792","11793","11794","11795","11796","11797","11798","11799","11800","11801","11802","11803","11804","11805","11806","11807","11808","11809","11810","11811","11812","11813","11814","11815","11816","11817","11818","11819","11820","11821","11822","11823","11824","11825","11826","11827","11828","11829","11830","11831","11832","11833","11834","11835","11836","11837","11838","11839","11840","11841","11842","11843","11844","11845","11846","11847","11848","11849","11850","11851","11852","11853","11854","11855","11856","11857","11858","11859","11860","11861","11862","11863","11864","11865","11866","11867","11868","11869","11870","11871","11872","11873","11874","11875","11876","11877","11878","11879","11880","11881","11882","11883","11884","11885","11886","11887","11888","11889","11890","11891","11892","11893","11894","11895","11896","11897","11898","11899","11900","11901","11902","11903","11904","11905","11906","11907","11908","11909","11910","11911","11912","11913","11914","11915","11916","11917","11918","11919","11920","11921","11922","11923","11924","11925","11926","11927","11928","11929","11930","11931","11932","11933","11934","11935","11936","11937","11938","11939","11940","11941","11942","11943","11944","11945","11946","11947","11948","11949","11950","11951","11952","11953","11954","11955","11956","11957","11958","11959","11960","11961","11962","11963","11964","11965","11966","11967","11968","11969","11970","11971","11972","11973","11974","11975","11976","11977","11978","11979","11980","11981","11982","11983","11984","11985","11986","11987","11988","11989","11990","11991","11992","11993","11994","11995","11996","11997","11998","11999","12000","12001","12002","12003","12004","12005","12006","12007","12008","12009","12010","12011","12012","12013","12014","12015","12016","12017","12018","12019","12020","12021","12022","12023","12024","12025","12026","12027","12028","12029","12030","12031","12032","12033","12034","12035","12036","12037","12038","12039","12040","12041","12042","12043","12044","12045","12046","12047","12048","12049","12050","12051","12052","12053","12054","12055","12056","12057","12058","12059","12060","12061","12062","12063","12064","12065","12066","12067","12068","12069","12070","12071","12072","12073","12074","12075","12076","12077","12078","12079","12080","12081","12082","12083","12084","12085","12086","12087","12088","12089","12090","12091","12092","12093","12094","12095","12096","12097","12098","12099","12100","12101","12102","12103","12104","12105","12106","12107","12108","12109","12110","12111","12112","12113","12114","12115","12116","12117","12118","12119","12120","12121","12122","12123","12124","12125","12126","12127","12128","12129","12130","12131","12132","12133","12134","12135","12136","12137","12138","12139","12140","12141","12142","12143","12144","12145","12146","12147","12148","12149","12150","12151","12152","12153","12154","12155","12156","12157","12158","12159","12160","12161","12162","12163","12164","12165","12166","12167","12168","12169","12170","12171","12172","12173","12174","12175","12176","12177","12178","12179","12180","12181","12182","12183","12184","12185","12186","12187","12188","12189","12190","12191","12192","12193","12194","12195","12196","12197","12198","12199","12200","12201","12202","12203","12204","12205","12206","12207","12208","12209","12210","12211","12212","12213","12214","12215","12216","12217","12218","12219","12220","12221","12222","12223","12224","12225","12226","12227","12228","12229","12230","12231","12232","12233","12234","12235","12236","12237","12238","12239","12240","12241","12242","12243","12244","12245","12246","12247","12248","12249","12250","12251","12252","12253","12254","12255","12256","12257","12258","12259","12260","12261","12262","12263","12264","12265","12266","12267","12268","12269","12270","12271","12272","12273","12274","12275","12276","12277","12278","12279","12280","12281","12282","12283","12284","12285","12286","12287","12288","12289","12290","12291","12292","12293","12294","12295","12296","12297","12298","12299","12300","12301","12302","12303","12304","12305","12306","12307","12308","12309","12310","12311","12312","12313","12314","12315","12316","12317","12318","12319","12320","12321","12322","12323","12324","12325","12326","12327","12328","12329","12330","12331","12332","12333","12334","12335","12336","12337","12338","12339","12340","12341","12342","12343","12344","12345","12346","12347","12348","12349","12350","12351","12352","12353","12354","12355","12356","12357","12358","12359","12360","12361","12362","12363","12364","12365","12366","12367","12368","12369","12370","12371","12372","12373","12374","12375","12376","12377","12378","12379","12380","12381","12382","12383","12384","12385","12386","12387","12388","12389","12390","12391","12392","12393","12394","12395","12396","12397","12398","12399","12400","12401","12402","12403","12404","12405","12406","12407","12408","12409","12410","12411","12412","12413","12414","12415","12416","12417","12418","12419","12420","12421","12422","12423","12424","12425","12426","12427","12428","12429","12430","12431","12432","12433","12434","12435","12436","12437","12438","12439","12440","12441","12442","12443","12444","12445","12446","12447","12448","12449","12450","12451","12452","12453","12454","12455","12456","12457","12458","12459","12460","12461","12462","12463","12464","12465","12466","12467","12468","12469","12470","12471","12472","12473","12474","12475","12476","12477","12478","12479","12480","12481","12482","12483","12484","12485","12486","12487","12488","12489","12490","12491","12492","12493","12494","12495","12496","12497","12498","12499","12500","12501","12502","12503","12504","12505","12506","12507","12508","12509","12510","12511","12512","12513","12514","12515","12516","12517","12518","12519","12520","12521","12522","12523","12524","12525","12526","12527","12528","12529","12530","12531","12532","12533","12534","12535","12536","12537","12538","12539","12540","12541","12542","12543","12544","12545","12546","12547","12548","12549","12550","12551","12552","12553","12554","12555","12556","12557","12558","12559","12560","12561","12562","12563","12564","12565","12566","12567","12568","12569","12570","12571","12572","12573","12574","12575","12576","12577","12578","12579","12580","12581","12582","12583","12584","12585","12586","12587","12588","12589","12590","12591","12592","12593","12594","12595","12596","12597","12598","12599","12600","12601","12602","12603","12604","12605","12606","12607","12608","12609","12610","12611","12612","12613","12614","12615","12616","12617","12618","12619","12620","12621","12622","12623","12624","12625","12626","12627","12628","12629","12630","12631","12632","12633","12634","12635","12636","12637","12638","12639","12640","12641","12642","12643","12644","12645","12646","12647","12648","12649","12650","12651","12652","12653","12654","12655","12656","12657","12658","12659","12660","12661","12662","12663","12664","12665","12666","12667","12668","12669","12670","12671","12672","12673","12674","12675","12676","12677","12678","12679","12680","12681","12682","12683","12684","12685","12686","12687","12688","12689","12690","12691","12692","12693","12694","12695","12696","12697","12698","12699","12700","12701","12702","12703","12704","12705","12706","12707","12708","12709","12710","12711","12712","12713","12714","12715","12716","12717","12718","12719","12720","12721","12722","12723","12724","12725","12726","12727","12728","12729","12730","12731","12732","12733","12734","12735","12736","12737","12738","12739","12740","12741","12742","12743","12744","12745","12746","12747","12748","12749","12750","12751","12752","12753","12754","12755","12756","12757","12758","12759","12760","12761","12762","12763","12764","12765","12766","12767","12768","12769","12770","12771","12772","12773","12774","12775","12776","12777","12778","12779","12780","12781","12782","12783","12784","12785","12786","12787","12788","12789","12790","12791","12792","12793","12794","12795","12796","12797","12798","12799","12800","12801","12802","12803","12804","12805","12806","12807","12808","12809","12810","12811","12812","12813","12814","12815","12816","12817","12818","12819","12820","12821","12822","12823","12824","12825","12826","12827","12828","12829","12830","12831","12832","12833","12834","12835","12836","12837","12838","12839","12840","12841","12842","12843","12844","12845","12846","12847","12848","12849","12850","12851","12852","12853","12854","12855","12856","12857","12858","12859","12860","12861","12862","12863","12864","12865","12866","12867","12868","12869","12870","12871","12872","12873","12874","12875","12876","12877","12878","12879","12880","12881","12882","12883","12884","12885","12886","12887","12888","12889","12890","12891","12892","12893","12894","12895","12896","12897","12898","12899","12900","12901","12902","12903","12904","12905","12906","12907","12908","12909","12910","12911","12912","12913","12914","12915","12916","12917","12918","12919","12920","12921","12922","12923","12924","12925","12926","12927","12928","12929","12930","12931","12932","12933","12934","12935","12936","12937","12938","12939","12940","12941","12942","12943","12944","12945","12946","12947","12948","12949","12950","12951","12952","12953","12954","12955","12956","12957","12958","12959","12960","12961","12962","12963","12964","12965","12966","12967","12968","12969","12970","12971","12972","12973","12974","12975","12976","12977","12978","12979","12980","12981","12982","12983","12984","12985","12986","12987","12988","12989","12990","12991","12992","12993","12994","12995","12996","12997","12998","12999","13000","13001","13002","13003","13004","13005","13006","13007","13008","13009","13010","13011","13012","13013","13014","13015","13016","13017","13018","13019","13020","13021","13022","13023","13024","13025","13026","13027","13028","13029","13030","13031","13032","13033","13034","13035","13036","13037","13038","13039","13040","13041","13042","13043","13044","13045","13046","13047","13048","13049","13050","13051","13052","13053","13054","13055","13056","13057","13058","13059","13060","13061","13062","13063","13064","13065","13066","13067","13068","13069","13070","13071","13072","13073","13074","13075","13076","13077","13078","13079","13080","13081","13082","13083","13084","13085","13086","13087","13088","13089","13090","13091","13092","13093","13094","13095","13096","13097","13098","13099","13100","13101","13102","13103","13104","13105","13106","13107","13108","13109","13110","13111","13112","13113","13114","13115","13116","13117","13118","13119","13120","13121","13122","13123","13124","13125","13126","13127","13128","13129","13130","13131","13132","13133","13134","13135","13136","13137","13138","13139","13140","13141","13142","13143","13144","13145","13146","13147","13148","13149","13150","13151","13152","13153","13154","13155","13156","13157","13158","13159","13160","13161","13162","13163","13164","13165","13166","13167","13168","13169","13170","13171","13172","13173","13174","13175","13176","13177","13178","13179","13180","13181","13182","13183","13184","13185","13186","13187","13188","13189","13190","13191","13192","13193","13194","13195","13196","13197","13198","13199","13200","13201","13202","13203","13204","13205","13206","13207","13208","13209","13210","13211","13212","13213","13214","13215","13216","13217","13218","13219","13220","13221","13222","13223","13224","13225","13226","13227","13228","13229","13230","13231","13232","13233","13234","13235","13236","13237","13238","13239","13240","13241","13242","13243","13244","13245","13246","13247","13248","13249","13250","13251","13252","13253","13254","13255","13256","13257","13258","13259","13260","13261","13262","13263","13264","13265","13266","13267","13268","13269","13270","13271","13272","13273","13274","13275","13276","13277","13278","13279","13280","13281","13282","13283","13284","13285","13286","13287","13288","13289","13290","13291","13292","13293","13294","13295","13296","13297","13298","13299","13300","13301","13302","13303","13304","13305","13306","13307","13308","13309","13310","13311","13312","13313","13314","13315","13316","13317","13318","13319","13320","13321","13322","13323","13324","13325","13326","13327","13328","13329","13330","13331","13332","13333","13334","13335","13336","13337","13338","13339","13340","13341","13342","13343","13344","13345","13346","13347","13348","13349","13350","13351","13352","13353","13354","13355","13356","13357","13358","13359","13360","13361","13362","13363","13364","13365","13366","13367","13368","13369","13370","13371","13372","13373","13374","13375","13376","13377","13378","13379","13380","13381","13382","13383","13384","13385","13386","13387","13388","13389","13390","13391","13392","13393","13394","13395","13396","13397","13398","13399","13400","13401","13402","13403","13404","13405","13406","13407","13408","13409","13410","13411","13412","13413","13414","13415","13416","13417","13418","13419","13420","13421","13422","13423","13424","13425","13426","13427","13428","13429","13430","13431","13432","13433","13434","13435","13436","13437","13438","13439","13440","13441","13442","13443","13444","13445","13446","13447","13448","13449","13450","13451","13452","13453","13454","13455","13456","13457","13458","13459","13460","13461","13462","13463","13464","13465","13466","13467","13468","13469","13470","13471","13472","13473","13474","13475","13476","13477","13478","13479","13480","13481","13482","13483","13484","13485","13486","13487","13488","13489","13490","13491","13492","13493","13494","13495","13496","13497","13498","13499","13500","13501","13502","13503","13504","13505","13506","13507","13508","13509","13510","13511","13512","13513","13514","13515","13516","13517","13518","13519","13520","13521","13522","13523","13524","13525","13526","13527","13528","13529","13530","13531","13532","13533","13534","13535","13536","13537","13538","13539","13540","13541","13542","13543","13544","13545","13546","13547","13548","13549","13550","13551","13552","13553","13554","13555","13556","13557","13558","13559","13560","13561","13562","13563","13564","13565","13566","13567","13568","13569","13570","13571","13572","13573","13574","13575","13576","13577","13578","13579","13580","13581","13582","13583","13584","13585","13586","13587","13588","13589","13590","13591","13592","13593","13594","13595","13596","13597","13598","13599","13600","13601","13602","13603","13604","13605","13606","13607","13608","13609","13610","13611","13612","13613","13614","13615","13616","13617","13618","13619","13620","13621","13622","13623","13624","13625","13626","13627","13628","13629","13630","13631","13632","13633","13634","13635","13636","13637","13638","13639","13640","13641","13642","13643","13644","13645","13646","13647","13648","13649","13650","13651","13652","13653","13654","13655","13656","13657","13658","13659","13660","13661","13662","13663","13664","13665","13666","13667","13668","13669","13670","13671","13672","13673","13674","13675","13676","13677","13678","13679","13680","13681","13682","13683","13684","13685","13686","13687","13688","13689","13690","13691","13692","13693","13694","13695","13696","13697","13698","13699","13700","13701","13702","13703","13704","13705","13706","13707","13708","13709","13710","13711","13712","13713","13714","13715","13716","13717","13718","13719","13720","13721","13722","13723","13724","13725","13726","13727","13728","13729","13730","13731","13732","13733","13734","13735","13736","13737","13738","13739","13740","13741","13742","13743","13744","13745","13746","13747","13748","13749","13750","13751","13752","13753","13754","13755","13756","13757","13758","13759","13760","13761","13762","13763","13764","13765","13766","13767","13768","13769","13770","13771","13772","13773","13774","13775","13776","13777","13778","13779","13780","13781","13782","13783","13784","13785","13786","13787","13788","13789","13790","13791","13792","13793","13794","13795","13796","13797","13798","13799","13800","13801","13802","13803","13804","13805","13806","13807","13808","13809","13810","13811","13812","13813","13814","13815","13816","13817","13818","13819","13820","13821","13822","13823","13824","13825","13826","13827","13828","13829","13830","13831","13832","13833","13834","13835","13836","13837","13838","13839","13840","13841","13842","13843","13844","13845","13846","13847","13848","13849","13850","13851","13852","13853","13854","13855","13856","13857","13858","13859","13860","13861","13862","13863","13864","13865","13866","13867","13868","13869","13870","13871","13872","13873","13874","13875","13876","13877","13878","13879","13880","13881","13882","13883","13884","13885","13886","13887","13888","13889","13890","13891","13892","13893","13894","13895","13896","13897","13898","13899","13900","13901","13902","13903","13904","13905","13906","13907","13908","13909","13910","13911","13912","13913","13914","13915","13916","13917","13918","13919","13920","13921","13922","13923","13924","13925","13926","13927","13928","13929","13930","13931","13932","13933","13934","13935","13936","13937","13938","13939","13940","13941","13942","13943","13944","13945","13946","13947","13948","13949","13950","13951","13952","13953","13954","13955","13956","13957","13958","13959","13960","13961","13962","13963","13964","13965","13966","13967","13968","13969","13970","13971","13972","13973","13974","13975","13976","13977","13978","13979","13980","13981","13982","13983","13984","13985","13986","13987","13988","13989","13990","13991","13992","13993","13994","13995","13996","13997","13998","13999","14000","14001","14002","14003","14004","14005","14006","14007","14008","14009","14010","14011","14012","14013","14014","14015","14016","14017","14018","14019","14020","14021","14022","14023","14024","14025","14026","14027","14028","14029","14030","14031","14032","14033","14034","14035","14036","14037","14038","14039","14040","14041","14042","14043","14044","14045","14046","14047","14048","14049","14050","14051","14052","14053","14054","14055","14056","14057","14058","14059","14060","14061","14062","14063","14064","14065","14066","14067","14068","14069","14070","14071","14072","14073","14074","14075","14076","14077","14078","14079","14080","14081","14082","14083","14084","14085","14086","14087","14088","14089","14090","14091","14092","14093","14094","14095","14096","14097","14098","14099","14100","14101","14102","14103","14104","14105","14106","14107","14108","14109","14110","14111","14112","14113","14114","14115","14116","14117","14118","14119","14120","14121","14122","14123","14124","14125","14126","14127","14128","14129","14130","14131","14132","14133","14134","14135","14136","14137","14138","14139","14140","14141","14142","14143","14144","14145","14146","14147","14148","14149","14150","14151","14152","14153","14154","14155","14156","14157","14158","14159","14160","14161","14162","14163","14164","14165","14166","14167","14168","14169","14170","14171","14172","14173","14174","14175","14176","14177","14178","14179","14180","14181","14182","14183","14184","14185","14186","14187","14188","14189","14190","14191","14192","14193","14194","14195","14196","14197","14198","14199","14200","14201","14202","14203","14204","14205","14206","14207","14208","14209","14210","14211","14212","14213","14214","14215","14216","14217","14218","14219","14220","14221","14222","14223","14224","14225","14226","14227","14228","14229","14230","14231","14232","14233","14234","14235","14236","14237","14238","14239","14240","14241","14242","14243","14244","14245","14246","14247","14248","14249","14250","14251","14252","14253","14254","14255","14256","14257","14258","14259","14260","14261","14262","14263","14264","14265","14266","14267","14268","14269","14270","14271","14272","14273","14274","14275","14276","14277","14278","14279","14280","14281","14282","14283","14284","14285","14286","14287","14288","14289","14290","14291","14292","14293","14294","14295","14296","14297","14298","14299","14300","14301","14302","14303","14304","14305","14306","14307","14308","14309","14310","14311","14312","14313","14314","14315","14316","14317","14318","14319","14320","14321","14322","14323","14324","14325","14326","14327","14328","14329","14330","14331","14332","14333","14334","14335","14336","14337","14338","14339","14340","14341","14342","14343","14344","14345","14346","14347","14348","14349","14350","14351","14352","14353","14354","14355","14356","14357","14358","14359","14360","14361","14362","14363","14364","14365","14366","14367","14368","14369","14370","14371","14372","14373","14374","14375","14376","14377","14378","14379","14380","14381","14382","14383","14384","14385","14386","14387","14388","14389","14390","14391","14392","14393","14394","14395","14396","14397","14398","14399","14400","14401","14402","14403","14404","14405","14406","14407","14408","14409","14410","14411","14412","14413","14414","14415","14416","14417","14418","14419","14420","14421","14422","14423","14424","14425","14426","14427","14428","14429","14430","14431","14432","14433","14434","14435","14436","14437","14438","14439","14440","14441","14442","14443","14444","14445","14446","14447","14448","14449","14450","14451","14452","14453","14454","14455","14456","14457","14458","14459","14460","14461","14462","14463","14464","14465","14466","14467","14468","14469","14470","14471","14472","14473","14474","14475","14476","14477","14478","14479","14480","14481","14482","14483","14484","14485","14486","14487","14488","14489","14490","14491","14492","14493","14494","14495","14496","14497","14498","14499","14500","14501","14502","14503","14504","14505","14506","14507","14508","14509","14510","14511","14512","14513","14514","14515","14516","14517","14518","14519","14520","14521","14522","14523","14524","14525","14526","14527","14528","14529","14530","14531","14532","14533","14534","14535","14536","14537","14538","14539","14540","14541","14542","14543","14544","14545","14546","14547","14548","14549","14550","14551","14552","14553","14554","14555","14556","14557","14558","14559","14560","14561","14562","14563","14564","14565","14566","14567","14568","14569","14570","14571","14572","14573","14574","14575","14576","14577","14578","14579","14580","14581","14582","14583","14584","14585","14586","14587","14588","14589","14590","14591","14592","14593","14594","14595","14596","14597","14598","14599","14600","14601","14602","14603","14604","14605","14606","14607","14608","14609","14610","14611","14612","14613","14614","14615","14616","14617","14618","14619","14620","14621","14622","14623","14624","14625","14626","14627","14628","14629","14630","14631","14632","14633","14634","14635","14636","14637","14638","14639","14640","14641","14642","14643","14644","14645","14646","14647","14648","14649","14650","14651","14652","14653","14654","14655","14656","14657","14658","14659","14660","14661","14662","14663","14664","14665","14666","14667","14668","14669","14670","14671","14672","14673","14674","14675","14676","14677","14678","14679","14680","14681","14682","14683","14684","14685","14686","14687","14688","14689","14690","14691","14692","14693","14694","14695","14696","14697","14698","14699","14700","14701","14702","14703","14704","14705","14706","14707","14708","14709","14710","14711","14712","14713","14714","14715","14716","14717","14718","14719","14720","14721","14722","14723","14724","14725","14726","14727","14728","14729","14730","14731","14732","14733","14734","14735","14736","14737","14738","14739","14740","14741","14742","14743","14744","14745","14746","14747","14748","14749","14750","14751","14752","14753","14754","14755","14756","14757","14758","14759","14760","14761","14762","14763","14764","14765","14766","14767","14768","14769","14770","14771","14772","14773","14774","14775","14776","14777","14778","14779","14780","14781","14782","14783","14784","14785","14786","14787","14788","14789","14790","14791","14792","14793","14794","14795","14796","14797","14798","14799","14800","14801","14802","14803","14804","14805","14806","14807","14808","14809","14810","14811","14812","14813","14814","14815","14816","14817","14818","14819","14820","14821","14822","14823","14824","14825","14826","14827","14828","14829","14830","14831","14832","14833","14834","14835","14836","14837","14838","14839","14840","14841","14842","14843","14844","14845","14846","14847","14848","14849","14850","14851","14852","14853","14854","14855","14856","14857","14858","14859","14860","14861","14862","14863","14864","14865","14866","14867","14868","14869","14870","14871","14872","14873","14874","14875","14876","14877","14878","14879","14880","14881","14882","14883","14884","14885","14886","14887","14888","14889","14890","14891","14892","14893","14894","14895","14896","14897","14898","14899","14900","14901","14902","14903","14904","14905","14906","14907","14908","14909","14910","14911","14912","14913","14914","14915","14916","14917","14918","14919","14920","14921","14922","14923","14924","14925","14926","14927","14928","14929","14930","14931","14932","14933","14934","14935","14936","14937","14938","14939","14940","14941","14942","14943","14944","14945","14946","14947","14948","14949","14950","14951","14952","14953","14954","14955","14956","14957","14958","14959","14960","14961","14962","14963","14964","14965","14966","14967","14968","14969","14970","14971","14972","14973","14974","14975","14976","14977","14978","14979","14980","14981","14982","14983","14984","14985","14986","14987","14988","14989","14990","14991","14992","14993","14994","14995","14996","14997","14998","14999","15000","15001","15002","15003","15004","15005","15006","15007","15008","15009","15010","15011","15012","15013","15014","15015","15016","15017","15018","15019","15020","15021","15022","15023","15024","15025","15026","15027","15028","15029","15030","15031","15032","15033","15034","15035","15036","15037","15038","15039","15040","15041","15042","15043","15044","15045","15046","15047","15048","15049","15050","15051","15052","15053","15054","15055","15056","15057","15058","15059","15060","15061","15062","15063","15064","15065","15066","15067","15068","15069","15070","15071","15072","15073","15074","15075","15076","15077","15078","15079","15080","15081","15082","15083","15084","15085","15086","15087","15088","15089","15090","15091","15092","15093","15094","15095","15096","15097","15098","15099","15100","15101","15102","15103","15104","15105","15106","15107","15108","15109","15110","15111","15112","15113","15114","15115","15116","15117","15118","15119","15120","15121","15122","15123","15124","15125","15126","15127","15128","15129","15130","15131","15132","15133","15134","15135","15136","15137","15138","15139","15140","15141","15142","15143","15144","15145","15146","15147","15148","15149","15150","15151","15152","15153","15154","15155","15156","15157","15158","15159","15160","15161","15162","15163","15164","15165","15166","15167","15168","15169","15170","15171","15172","15173","15174","15175","15176","15177","15178","15179","15180","15181","15182","15183","15184","15185","15186","15187","15188","15189","15190","15191","15192","15193","15194","15195","15196","15197","15198","15199","15200","15201","15202","15203","15204","15205","15206","15207","15208","15209","15210","15211","15212","15213","15214","15215","15216","15217","15218","15219","15220","15221","15222","15223","15224","15225","15226","15227","15228","15229","15230","15231","15232","15233","15234","15235","15236","15237","15238","15239","15240","15241","15242","15243","15244","15245","15246","15247","15248","15249","15250","15251","15252","15253","15254","15255","15256","15257","15258","15259","15260","15261","15262","15263","15264","15265","15266","15267","15268","15269","15270","15271","15272","15273","15274","15275","15276","15277","15278","15279","15280","15281","15282","15283","15284","15285","15286","15287","15288","15289","15290","15291","15292","15293","15294","15295","15296","15297","15298","15299","15300","15301","15302","15303","15304","15305","15306","15307","15308","15309","15310","15311","15312","15313","15314","15315","15316","15317","15318","15319","15320","15321","15322","15323","15324","15325","15326","15327","15328","15329","15330","15331","15332","15333","15334","15335","15336","15337","15338","15339","15340","15341","15342","15343","15344","15345","15346","15347","15348","15349","15350","15351","15352","15353","15354","15355","15356","15357","15358","15359","15360","15361","15362","15363","15364","15365","15366","15367","15368","15369","15370","15371","15372","15373","15374","15375","15376","15377","15378","15379","15380","15381","15382","15383","15384","15385","15386","15387","15388","15389","15390","15391","15392","15393","15394","15395","15396","15397","15398","15399","15400","15401","15402","15403","15404","15405","15406","15407","15408","15409","15410","15411","15412","15413","15414","15415","15416","15417","15418","15419","15420","15421","15422","15423","15424","15425","15426","15427","15428","15429","15430","15431","15432","15433","15434","15435","15436","15437","15438","15439","15440","15441","15442","15443","15444","15445","15446","15447","15448","15449","15450","15451","15452","15453","15454","15455","15456","15457","15458","15459","15460","15461","15462","15463","15464","15465","15466","15467","15468","15469","15470","15471","15472","15473","15474","15475","15476","15477","15478","15479","15480","15481","15482","15483","15484","15485","15486","15487","15488","15489","15490","15491","15492","15493","15494","15495","15496","15497","15498","15499","15500","15501","15502","15503","15504","15505","15506","15507","15508","15509","15510","15511","15512","15513","15514","15515","15516","15517","15518","15519","15520","15521","15522","15523","15524","15525","15526","15527","15528","15529","15530","15531","15532","15533","15534","15535","15536","15537","15538","15539","15540","15541","15542","15543","15544","15545","15546","15547","15548","15549","15550","15551","15552","15553","15554","15555","15556","15557","15558","15559","15560","15561","15562","15563","15564","15565","15566","15567","15568","15569","15570","15571","15572","15573","15574","15575","15576","15577","15578","15579","15580","15581","15582","15583","15584","15585","15586","15587","15588","15589","15590","15591","15592","15593","15594","15595","15596","15597","15598","15599","15600","15601","15602","15603","15604","15605","15606","15607","15608","15609","15610","15611","15612","15613","15614","15615","15616","15617","15618","15619","15620","15621","15622","15623","15624","15625","15626","15627","15628","15629","15630","15631","15632","15633","15634","15635","15636","15637","15638","15639","15640","15641","15642","15643","15644","15645","15646","15647","15648","15649","15650","15651","15652","15653","15654","15655","15656","15657","15658","15659","15660","15661","15662","15663","15664","15665","15666","15667","15668","15669","15670","15671","15672","15673","15674","15675","15676","15677","15678","15679","15680","15681","15682","15683","15684","15685","15686","15687","15688","15689","15690","15691","15692","15693","15694","15695","15696","15697","15698","15699","15700","15701","15702","15703","15704","15705","15706","15707","15708","15709","15710","15711","15712","15713","15714","15715","15716","15717","15718","15719","15720","15721","15722","15723","15724","15725","15726","15727","15728","15729","15730","15731","15732","15733","15734","15735","15736","15737","15738","15739","15740","15741","15742","15743","15744","15745","15746","15747","15748","15749","15750","15751","15752","15753","15754","15755","15756","15757","15758","15759","15760","15761","15762","15763","15764","15765","15766","15767","15768","15769","15770","15771","15772","15773","15774","15775","15776","15777","15778","15779","15780","15781","15782","15783","15784","15785","15786","15787","15788","15789","15790","15791","15792","15793","15794","15795","15796","15797","15798","15799","15800","15801","15802","15803","15804","15805","15806","15807","15808","15809","15810","15811","15812","15813","15814","15815","15816","15817","15818","15819","15820","15821","15822","15823","15824","15825","15826","15827","15828","15829","15830","15831","15832","15833","15834","15835","15836","15837","15838","15839","15840","15841","15842","15843","15844","15845","15846","15847","15848","15849","15850","15851","15852","15853","15854","15855","15856","15857","15858","15859","15860","15861","15862","15863","15864","15865","15866","15867","15868","15869","15870","15871","15872","15873","15874","15875","15876","15877","15878","15879","15880","15881","15882","15883","15884","15885","15886","15887","15888","15889","15890","15891","15892","15893","15894","15895","15896","15897","15898","15899","15900","15901","15902","15903","15904","15905","15906","15907","15908","15909","15910","15911","15912","15913","15914","15915","15916","15917","15918","15919","15920","15921","15922","15923","15924","15925","15926","15927","15928","15929","15930","15931","15932","15933","15934","15935","15936","15937","15938","15939","15940","15941","15942","15943","15944","15945","15946","15947","15948","15949","15950","15951","15952","15953","15954","15955","15956","15957","15958","15959","15960","15961","15962","15963","15964","15965","15966","15967","15968","15969","15970","15971","15972","15973","15974","15975","15976","15977","15978","15979","15980","15981","15982","15983","15984","15985","15986","15987","15988","15989","15990","15991","15992","15993","15994","15995","15996","15997","15998","15999","16000","16001","16002","16003","16004","16005","16006","16007","16008","16009","16010","16011","16012","16013","16014","16015","16016","16017","16018","16019","16020","16021","16022","16023","16024","16025","16026","16027","16028","16029","16030","16031","16032","16033","16034","16035","16036","16037","16038","16039","16040","16041","16042","16043","16044","16045","16046","16047","16048","16049","16050","16051","16052","16053","16054","16055","16056","16057","16058","16059","16060","16061","16062","16063","16064","16065","16066","16067","16068","16069","16070","16071","16072","16073","16074","16075","16076","16077","16078","16079","16080","16081","16082","16083","16084","16085","16086","16087","16088","16089","16090","16091","16092","16093","16094","16095","16096","16097","16098","16099","16100","16101","16102","16103","16104","16105","16106","16107","16108","16109","16110","16111","16112","16113","16114","16115","16116","16117","16118","16119","16120","16121","16122","16123","16124","16125","16126","16127","16128","16129","16130","16131","16132","16133","16134","16135","16136","16137","16138","16139","16140","16141","16142","16143","16144","16145","16146","16147","16148","16149","16150","16151","16152","16153","16154","16155","16156","16157","16158","16159","16160","16161","16162","16163","16164","16165","16166","16167","16168","16169","16170","16171","16172","16173","16174","16175","16176","16177","16178","16179","16180","16181","16182","16183","16184","16185","16186","16187","16188","16189","16190","16191","16192","16193","16194","16195","16196","16197","16198","16199","16200","16201","16202","16203","16204","16205","16206","16207","16208","16209","16210","16211","16212","16213","16214","16215","16216","16217","16218","16219","16220","16221","16222","16223","16224","16225","16226","16227","16228","16229","16230","16231","16232","16233","16234","16235","16236","16237","16238","16239","16240","16241","16242","16243","16244","16245","16246","16247","16248","16249","16250","16251","16252","16253","16254","16255","16256","16257","16258","16259","16260","16261","16262","16263","16264","16265","16266","16267","16268","16269","16270","16271","16272","16273","16274","16275","16276","16277","16278","16279","16280","16281","16282","16283","16284","16285","16286","16287","16288","16289","16290","16291","16292","16293","16294","16295","16296","16297","16298","16299","16300","16301","16302","16303","16304","16305","16306","16307","16308","16309","16310","16311","16312","16313","16314","16315","16316","16317","16318","16319","16320","16321","16322","16323","16324","16325","16326","16327","16328","16329","16330","16331","16332","16333","16334","16335","16336","16337","16338","16339","16340","16341","16342","16343","16344","16345","16346","16347","16348","16349","16350","16351","16352","16353","16354","16355","16356","16357","16358","16359","16360","16361","16362","16363","16364","16365","16366","16367","16368","16369","16370","16371","16372","16373","16374","16375","16376","16377","16378","16379","16380","16381","16382","16383","16384","16385","16386","16387","16388","16389","16390","16391","16392","16393","16394","16395","16396","16397","16398","16399","16400","16401","16402","16403","16404","16405","16406","16407","16408","16409","16410","16411","16412","16413","16414","16415","16416","16417","16418","16419","16420","16421","16422","16423","16424","16425","16426","16427","16428","16429","16430","16431","16432","16433","16434","16435","16436","16437","16438","16439","16440","16441","16442","16443","16444","16445","16446","16447","16448","16449","16450","16451","16452","16453","16454","16455","16456","16457","16458","16459","16460","16461","16462","16463","16464","16465","16466","16467","16468","16469","16470","16471","16472","16473","16474","16475","16476","16477","16478","16479","16480","16481","16482","16483","16484","16485","16486","16487","16488","16489","16490","16491","16492","16493","16494","16495","16496","16497","16498","16499","16500","16501","16502","16503","16504","16505","16506","16507","16508","16509","16510","16511","16512","16513","16514","16515","16516","16517","16518","16519","16520","16521","16522","16523","16524","16525","16526","16527","16528","16529","16530","16531","16532","16533","16534","16535","16536","16537","16538","16539","16540","16541","16542","16543","16544","16545","16546","16547","16548","16549","16550","16551","16552","16553","16554","16555","16556","16557","16558","16559","16560","16561","16562","16563","16564","16565","16566","16567","16568","16569","16570","16571","16572","16573","16574","16575","16576","16577","16578","16579","16580","16581","16582","16583","16584","16585","16586","16587","16588","16589","16590","16591","16592","16593","16594","16595","16596","16597","16598","16599","16600","16601","16602","16603","16604","16605","16606","16607","16608","16609","16610","16611","16612","16613","16614","16615","16616","16617","16618","16619","16620","16621","16622","16623","16624","16625","16626","16627","16628","16629","16630","16631","16632","16633","16634","16635","16636","16637","16638","16639","16640","16641","16642","16643","16644","16645","16646","16647","16648","16649","16650","16651","16652","16653","16654","16655","16656","16657","16658","16659","16660","16661","16662","16663","16664","16665","16666","16667","16668","16669","16670","16671","16672","16673","16674","16675","16676","16677","16678","16679","16680","16681","16682","16683","16684","16685","16686","16687","16688","16689","16690","16691","16692","16693","16694","16695","16696","16697","16698","16699","16700","16701","16702","16703","16704","16705","16706","16707","16708","16709","16710","16711","16712","16713","16714","16715","16716","16717","16718","16719","16720","16721","16722","16723","16724","16725","16726","16727","16728","16729","16730","16731","16732","16733","16734","16735","16736","16737","16738","16739","16740","16741","16742","16743","16744","16745","16746","16747","16748","16749","16750","16751","16752","16753","16754","16755","16756","16757","16758","16759","16760","16761","16762","16763","16764","16765","16766","16767","16768","16769","16770","16771","16772","16773","16774","16775","16776","16777","16778","16779","16780","16781","16782","16783","16784","16785","16786","16787","16788","16789","16790","16791","16792","16793","16794","16795","16796","16797","16798","16799","16800","16801","16802","16803","16804","16805","16806","16807","16808","16809","16810","16811","16812","16813","16814","16815","16816","16817","16818","16819","16820","16821","16822","16823","16824","16825","16826","16827","16828","16829","16830","16831","16832","16833","16834","16835","16836","16837","16838","16839","16840","16841","16842","16843","16844","16845","16846","16847","16848","16849","16850","16851","16852","16853","16854","16855","16856","16857","16858","16859","16860","16861","16862","16863","16864","16865","16866","16867","16868","16869","16870","16871","16872","16873","16874","16875","16876","16877","16878","16879","16880","16881","16882","16883","16884","16885","16886","16887","16888","16889","16890","16891","16892","16893","16894","16895","16896","16897","16898","16899","16900","16901","16902","16903","16904","16905","16906","16907","16908","16909","16910","16911","16912","16913","16914","16915","16916","16917","16918","16919","16920","16921","16922","16923","16924","16925","16926","16927","16928","16929","16930","16931","16932","16933","16934","16935","16936","16937","16938","16939","16940","16941","16942","16943","16944","16945","16946","16947","16948","16949","16950","16951","16952","16953","16954","16955","16956","16957","16958","16959","16960","16961","16962","16963","16964","16965","16966","16967","16968","16969","16970","16971","16972","16973","16974","16975","16976","16977","16978","16979","16980","16981","16982","16983","16984","16985","16986","16987","16988","16989","16990","16991","16992","16993","16994","16995","16996","16997","16998","16999","17000","17001","17002","17003","17004","17005","17006","17007","17008","17009","17010","17011","17012","17013","17014","17015","17016","17017","17018","17019","17020","17021","17022","17023","17024","17025","17026","17027","17028","17029","17030","17031","17032","17033","17034","17035","17036","17037","17038","17039","17040","17041","17042","17043","17044","17045","17046","17047","17048","17049","17050","17051","17052","17053","17054","17055","17056","17057","17058","17059","17060","17061","17062","17063","17064","17065","17066","17067","17068","17069","17070","17071","17072","17073","17074","17075","17076","17077","17078","17079","17080","17081","17082","17083","17084","17085","17086","17087","17088","17089","17090","17091","17092","17093","17094","17095","17096","17097","17098","17099","17100","17101","17102","17103","17104","17105","17106","17107","17108","17109","17110","17111","17112","17113","17114","17115","17116","17117","17118","17119","17120","17121","17122","17123","17124","17125","17126","17127","17128","17129","17130","17131","17132","17133","17134","17135","17136","17137","17138","17139","17140","17141","17142","17143","17144","17145","17146","17147","17148","17149","17150","17151","17152","17153","17154","17155","17156","17157","17158","17159","17160","17161","17162","17163","17164","17165","17166","17167","17168","17169","17170","17171","17172","17173","17174","17175","17176","17177","17178","17179","17180","17181","17182","17183","17184","17185","17186","17187","17188","17189","17190","17191","17192","17193","17194","17195","17196","17197","17198","17199","17200","17201","17202","17203","17204","17205","17206","17207","17208","17209","17210","17211","17212","17213","17214","17215","17216","17217","17218","17219","17220","17221","17222","17223","17224","17225","17226","17227","17228","17229","17230","17231","17232","17233","17234","17235","17236","17237","17238","17239","17240","17241","17242","17243","17244","17245","17246","17247","17248","17249","17250","17251","17252","17253","17254","17255","17256","17257","17258","17259","17260","17261","17262","17263","17264","17265","17266","17267","17268","17269","17270","17271","17272","17273","17274","17275","17276","17277","17278","17279","17280","17281","17282","17283","17284","17285","17286","17287","17288","17289","17290","17291","17292","17293","17294","17295","17296","17297","17298","17299","17300","17301","17302","17303","17304","17305","17306","17307","17308","17309","17310","17311","17312","17313","17314","17315","17316","17317","17318","17319","17320","17321","17322","17323","17324","17325","17326","17327","17328","17329","17330","17331","17332","17333","17334","17335","17336","17337","17338","17339","17340","17341","17342","17343","17344","17345","17346","17347","17348","17349","17350","17351","17352","17353","17354","17355","17356","17357","17358","17359","17360","17361","17362","17363","17364","17365","17366","17367","17368","17369","17370","17371","17372","17373","17374","17375","17376","17377","17378","17379","17380","17381","17382","17383","17384","17385","17386","17387","17388","17389","17390","17391","17392","17393","17394","17395","17396","17397","17398","17399","17400","17401","17402","17403","17404","17405","17406","17407","17408","17409","17410","17411","17412","17413","17414","17415","17416","17417","17418","17419","17420","17421","17422","17423","17424","17425","17426","17427","17428","17429","17430","17431","17432","17433","17434","17435","17436","17437","17438","17439","17440","17441","17442","17443","17444","17445","17446","17447","17448","17449","17450","17451","17452","17453","17454","17455","17456","17457","17458","17459","17460","17461","17462","17463","17464","17465","17466","17467","17468","17469","17470","17471","17472","17473","17474","17475","17476","17477","17478","17479","17480","17481","17482","17483","17484","17485","17486","17487","17488","17489","17490","17491","17492","17493","17494","17495","17496","17497","17498","17499","17500","17501","17502","17503","17504","17505","17506","17507","17508","17509","17510","17511","17512","17513","17514","17515","17516","17517","17518","17519","17520","17521","17522","17523","17524","17525","17526","17527","17528","17529","17530","17531","17532","17533","17534","17535","17536","17537","17538","17539","17540","17541","17542","17543","17544","17545","17546","17547","17548","17549","17550","17551","17552","17553","17554","17555","17556","17557","17558","17559","17560","17561","17562","17563","17564","17565","17566","17567","17568","17569","17570","17571","17572","17573","17574","17575","17576","17577","17578","17579","17580","17581","17582","17583","17584","17585","17586","17587","17588","17589","17590","17591","17592","17593","17594","17595","17596","17597","17598","17599","17600","17601","17602","17603","17604","17605","17606","17607","17608","17609","17610","17611","17612","17613","17614","17615","17616","17617","17618","17619","17620","17621","17622","17623","17624","17625","17626","17627","17628","17629","17630","17631","17632","17633","17634","17635","17636","17637","17638","17639","17640","17641","17642","17643","17644","17645","17646","17647","17648","17649","17650","17651","17652","17653","17654","17655","17656","17657","17658","17659","17660","17661","17662","17663","17664","17665","17666","17667","17668","17669","17670","17671","17672","17673","17674","17675","17676","17677","17678","17679","17680","17681","17682","17683","17684","17685","17686","17687","17688","17689","17690","17691","17692","17693","17694","17695","17696","17697","17698","17699","17700","17701","17702","17703","17704","17705","17706","17707","17708","17709","17710","17711","17712","17713","17714","17715","17716","17717","17718","17719","17720","17721","17722","17723","17724","17725","17726","17727","17728","17729","17730","17731","17732","17733","17734","17735","17736","17737","17738","17739","17740","17741","17742","17743","17744","17745","17746","17747","17748","17749","17750","17751","17752","17753","17754","17755","17756","17757","17758","17759","17760","17761","17762","17763","17764","17765","17766","17767","17768","17769","17770","17771","17772","17773","17774","17775","17776","17777","17778","17779","17780","17781","17782","17783","17784","17785","17786","17787","17788","17789","17790","17791","17792","17793","17794","17795","17796","17797","17798","17799","17800","17801","17802","17803","17804","17805","17806","17807","17808","17809","17810","17811","17812","17813","17814","17815","17816","17817","17818","17819","17820","17821","17822","17823","17824","17825","17826","17827","17828","17829","17830","17831","17832","17833","17834","17835","17836","17837","17838","17839","17840","17841","17842","17843","17844","17845","17846","17847","17848","17849","17850","17851","17852","17853","17854","17855","17856","17857","17858","17859","17860","17861","17862","17863","17864","17865","17866","17867","17868","17869","17870","17871","17872","17873","17874","17875","17876","17877","17878","17879","17880","17881","17882","17883","17884","17885","17886","17887","17888","17889","17890","17891","17892","17893","17894","17895","17896","17897","17898","17899","17900","17901","17902","17903","17904","17905","17906","17907","17908","17909","17910","17911","17912","17913","17914","17915","17916","17917","17918","17919","17920","17921","17922","17923","17924","17925","17926","17927","17928","17929","17930","17931","17932","17933","17934","17935","17936","17937","17938","17939","17940","17941","17942","17943","17944","17945","17946","17947","17948","17949","17950","17951","17952","17953","17954","17955","17956","17957","17958","17959","17960","17961","17962","17963","17964","17965","17966","17967","17968","17969","17970","17971","17972","17973","17974","17975","17976","17977","17978","17979","17980","17981","17982","17983","17984","17985","17986","17987","17988","17989","17990","17991","17992","17993","17994","17995","17996","17997","17998","17999","18000","18001","18002","18003","18004","18005","18006","18007","18008","18009","18010","18011","18012","18013","18014","18015","18016","18017","18018","18019","18020","18021","18022","18023","18024","18025","18026","18027","18028","18029","18030","18031","18032","18033","18034","18035","18036","18037","18038","18039","18040","18041","18042","18043","18044","18045","18046","18047","18048","18049","18050","18051","18052","18053","18054","18055","18056","18057","18058","18059","18060","18061","18062","18063","18064","18065","18066","18067","18068","18069","18070","18071","18072","18073","18074","18075","18076","18077","18078","18079","18080","18081","18082","18083","18084","18085","18086","18087","18088","18089","18090","18091","18092","18093","18094","18095","18096","18097","18098","18099","18100","18101","18102","18103","18104","18105","18106","18107","18108","18109","18110","18111","18112","18113","18114","18115","18116","18117","18118","18119","18120","18121","18122","18123","18124","18125","18126","18127","18128","18129","18130","18131","18132","18133","18134","18135","18136","18137","18138","18139","18140","18141","18142","18143","18144","18145","18146","18147","18148","18149","18150","18151","18152","18153","18154","18155","18156","18157","18158","18159","18160","18161","18162","18163","18164","18165","18166","18167","18168","18169","18170","18171","18172","18173","18174","18175","18176","18177","18178","18179","18180","18181","18182","18183","18184","18185","18186","18187","18188","18189","18190","18191","18192","18193","18194","18195","18196","18197","18198","18199","18200","18201","18202","18203","18204","18205","18206","18207","18208","18209","18210","18211","18212","18213","18214","18215","18216","18217","18218","18219","18220","18221","18222","18223","18224","18225","18226","18227","18228","18229","18230","18231","18232","18233","18234","18235","18236","18237","18238","18239","18240","18241","18242","18243","18244","18245","18246","18247","18248","18249","18250","18251","18252","18253","18254","18255","18256","18257","18258","18259","18260","18261","18262","18263","18264","18265","18266","18267","18268","18269","18270","18271","18272","18273","18274","18275","18276","18277","18278","18279","18280","18281","18282","18283","18284","18285","18286","18287","18288","18289","18290","18291","18292","18293","18294","18295","18296","18297","18298","18299","18300","18301","18302","18303","18304","18305","18306","18307","18308","18309","18310","18311","18312","18313","18314","18315","18316","18317","18318","18319","18320","18321","18322","18323","18324","18325","18326","18327","18328","18329","18330","18331","18332","18333","18334","18335","18336","18337","18338","18339","18340","18341","18342","18343","18344","18345","18346","18347","18348","18349","18350","18351","18352","18353","18354","18355","18356","18357","18358","18359","18360","18361","18362","18363","18364","18365","18366","18367","18368","18369","18370","18371","18372","18373","18374","18375","18376","18377","18378","18379","18380","18381","18382","18383","18384","18385","18386","18387","18388","18389","18390","18391","18392","18393","18394","18395","18396","18397","18398","18399","18400","18401","18402","18403","18404","18405","18406","18407","18408","18409","18410","18411","18412","18413","18414","18415","18416","18417","18418","18419","18420","18421","18422","18423","18424","18425","18426","18427","18428","18429","18430","18431","18432","18433","18434","18435","18436","18437","18438","18439","18440","18441","18442","18443","18444","18445","18446","18447","18448","18449","18450","18451","18452","18453","18454","18455","18456","18457","18458","18459","18460","18461","18462","18463","18464","18465","18466","18467","18468","18469","18470","18471","18472","18473","18474","18475","18476","18477","18478","18479","18480","18481","18482","18483","18484","18485","18486","18487","18488","18489","18490","18491","18492","18493","18494","18495","18496","18497","18498","18499","18500","18501","18502","18503","18504","18505","18506","18507","18508","18509","18510","18511","18512","18513","18514","18515","18516","18517","18518","18519","18520","18521","18522","18523","18524","18525","18526","18527","18528","18529","18530","18531","18532","18533","18534","18535","18536","18537","18538","18539","18540","18541","18542","18543","18544","18545","18546","18547","18548","18549","18550","18551","18552","18553","18554","18555","18556","18557","18558","18559","18560","18561","18562","18563","18564","18565","18566","18567","18568","18569","18570","18571","18572","18573","18574","18575","18576","18577","18578","18579","18580","18581","18582","18583","18584","18585","18586","18587","18588","18589","18590","18591","18592","18593","18594","18595","18596","18597","18598","18599","18600","18601","18602","18603","18604","18605","18606","18607","18608","18609","18610","18611","18612","18613","18614","18615","18616","18617","18618","18619","18620","18621","18622","18623","18624","18625","18626","18627","18628","18629","18630","18631","18632","18633","18634","18635","18636","18637","18638","18639","18640","18641","18642","18643","18644","18645","18646","18647","18648","18649","18650","18651","18652","18653","18654","18655","18656","18657","18658","18659","18660","18661","18662","18663","18664","18665","18666","18667","18668","18669","18670","18671","18672","18673","18674","18675","18676","18677","18678","18679","18680","18681","18682","18683","18684","18685","18686","18687","18688","18689","18690","18691","18692","18693","18694","18695","18696","18697","18698","18699","18700","18701","18702","18703","18704","18705","18706","18707","18708","18709","18710","18711","18712","18713","18714","18715","18716","18717","18718","18719","18720","18721","18722","18723","18724","18725","18726","18727","18728","18729","18730","18731","18732","18733","18734","18735","18736","18737","18738","18739","18740","18741","18742","18743","18744","18745","18746","18747","18748","18749","18750","18751","18752","18753","18754","18755","18756","18757","18758","18759","18760","18761","18762","18763","18764","18765","18766","18767","18768","18769","18770","18771","18772","18773","18774","18775","18776","18777","18778","18779","18780","18781","18782","18783","18784","18785","18786","18787","18788","18789","18790","18791","18792","18793","18794","18795","18796","18797","18798","18799","18800","18801","18802","18803","18804","18805","18806","18807","18808","18809","18810","18811","18812","18813","18814","18815","18816","18817","18818","18819","18820","18821","18822","18823","18824","18825","18826","18827","18828","18829","18830","18831","18832","18833","18834","18835","18836","18837","18838","18839","18840","18841","18842","18843","18844","18845","18846","18847","18848","18849","18850","18851","18852","18853","18854","18855","18856","18857","18858","18859","18860","18861","18862","18863","18864","18865","18866","18867","18868","18869","18870","18871","18872","18873","18874","18875","18876","18877","18878","18879","18880","18881","18882","18883","18884","18885","18886","18887","18888","18889","18890","18891","18892","18893","18894","18895","18896","18897","18898","18899","18900","18901","18902","18903","18904","18905","18906","18907","18908","18909","18910","18911","18912","18913","18914","18915","18916","18917","18918","18919","18920","18921","18922","18923","18924","18925","18926","18927","18928","18929","18930","18931","18932","18933","18934","18935","18936","18937","18938","18939","18940","18941","18942","18943","18944","18945","18946","18947","18948","18949","18950","18951","18952","18953","18954","18955","18956","18957","18958","18959","18960","18961","18962","18963","18964","18965","18966","18967","18968","18969","18970","18971","18972","18973","18974","18975","18976","18977","18978","18979","18980","18981","18982","18983","18984","18985","18986","18987","18988","18989","18990","18991","18992","18993","18994","18995","18996","18997","18998","18999","19000","19001","19002","19003","19004","19005","19006","19007","19008","19009","19010","19011","19012","19013","19014","19015","19016","19017","19018","19019","19020","19021","19022","19023","19024","19025","19026","19027","19028","19029","19030","19031","19032","19033","19034","19035","19036","19037","19038","19039","19040","19041","19042","19043","19044","19045","19046","19047","19048","19049","19050","19051","19052","19053","19054","19055","19056","19057","19058","19059","19060","19061","19062","19063","19064","19065","19066","19067","19068","19069","19070","19071","19072","19073","19074","19075","19076","19077","19078","19079","19080","19081","19082","19083","19084","19085","19086","19087","19088","19089","19090","19091","19092","19093","19094","19095","19096","19097","19098","19099","19100","19101","19102","19103","19104","19105","19106","19107","19108","19109","19110","19111","19112","19113","19114","19115","19116","19117","19118","19119","19120","19121","19122","19123","19124","19125","19126","19127","19128","19129","19130","19131","19132","19133","19134","19135","19136","19137","19138","19139","19140","19141","19142","19143","19144","19145","19146","19147","19148","19149","19150","19151","19152","19153","19154","19155","19156","19157","19158","19159","19160","19161","19162","19163","19164","19165","19166","19167","19168","19169","19170","19171","19172","19173","19174","19175","19176","19177","19178","19179","19180","19181","19182","19183","19184","19185","19186","19187","19188","19189","19190","19191","19192","19193","19194","19195","19196","19197","19198","19199","19200","19201","19202","19203","19204","19205","19206","19207","19208","19209","19210","19211","19212","19213","19214","19215","19216","19217","19218","19219","19220","19221","19222","19223","19224","19225","19226","19227","19228","19229","19230","19231","19232","19233","19234","19235","19236","19237","19238","19239","19240","19241","19242","19243","19244","19245","19246","19247","19248","19249","19250","19251","19252","19253","19254","19255","19256","19257","19258","19259","19260","19261","19262","19263","19264","19265","19266","19267","19268","19269","19270","19271","19272","19273","19274","19275","19276","19277","19278","19279","19280","19281","19282","19283","19284","19285","19286","19287","19288","19289","19290","19291","19292","19293","19294","19295","19296","19297","19298","19299","19300","19301","19302","19303","19304","19305","19306","19307","19308","19309","19310","19311","19312","19313","19314","19315","19316","19317","19318","19319","19320","19321","19322","19323","19324","19325","19326","19327","19328","19329","19330","19331","19332","19333","19334","19335","19336","19337","19338","19339","19340","19341","19342","19343","19344","19345","19346","19347","19348","19349","19350","19351","19352","19353","19354","19355","19356","19357","19358","19359","19360","19361","19362","19363","19364","19365","19366","19367","19368","19369","19370","19371","19372","19373","19374","19375","19376","19377","19378","19379","19380","19381","19382","19383","19384","19385","19386","19387","19388","19389","19390","19391","19392","19393","19394","19395","19396","19397","19398","19399","19400","19401","19402","19403","19404","19405","19406","19407","19408","19409","19410","19411","19412","19413","19414","19415","19416","19417","19418","19419","19420","19421","19422","19423","19424","19425","19426","19427","19428","19429","19430","19431","19432","19433","19434","19435","19436","19437","19438","19439","19440","19441","19442","19443","19444","19445","19446","19447","19448","19449","19450","19451","19452","19453","19454","19455","19456","19457","19458","19459","19460","19461","19462","19463","19464","19465","19466","19467","19468","19469","19470","19471","19472","19473","19474","19475","19476","19477","19478","19479","19480","19481","19482","19483","19484","19485","19486","19487","19488","19489","19490","19491","19492","19493","19494","19495","19496","19497","19498","19499","19500","19501","19502","19503","19504","19505","19506","19507","19508","19509","19510","19511","19512","19513","19514","19515","19516","19517","19518","19519","19520","19521","19522","19523","19524","19525","19526","19527","19528","19529","19530","19531","19532","19533","19534","19535","19536","19537","19538","19539","19540","19541","19542","19543","19544","19545","19546","19547","19548","19549","19550","19551","19552","19553","19554","19555","19556","19557","19558","19559","19560","19561","19562","19563","19564","19565","19566","19567","19568","19569","19570","19571","19572","19573","19574","19575","19576","19577","19578","19579","19580","19581","19582","19583","19584","19585","19586","19587","19588","19589","19590","19591","19592","19593","19594","19595","19596","19597","19598","19599","19600","19601","19602","19603","19604","19605","19606","19607","19608","19609","19610","19611","19612","19613","19614","19615","19616","19617","19618","19619","19620","19621","19622","19623","19624","19625","19626","19627","19628","19629","19630","19631","19632","19633","19634","19635","19636","19637","19638","19639","19640","19641","19642","19643","19644","19645","19646","19647","19648","19649","19650","19651","19652","19653","19654","19655","19656","19657","19658","19659","19660","19661","19662","19663","19664","19665","19666","19667","19668","19669","19670","19671","19672","19673","19674","19675","19676","19677","19678","19679","19680","19681","19682","19683","19684","19685","19686","19687","19688","19689","19690","19691","19692","19693","19694","19695","19696","19697","19698","19699","19700","19701","19702","19703","19704","19705","19706","19707","19708","19709","19710","19711","19712","19713","19714","19715","19716","19717","19718","19719","19720","19721","19722","19723","19724","19725","19726","19727","19728","19729","19730","19731","19732","19733","19734","19735","19736","19737","19738","19739","19740","19741","19742","19743","19744","19745","19746","19747","19748","19749","19750","19751","19752","19753","19754","19755","19756","19757","19758","19759","19760","19761","19762","19763","19764","19765","19766","19767","19768","19769","19770","19771","19772","19773","19774","19775","19776","19777","19778","19779","19780","19781","19782","19783","19784","19785","19786","19787","19788","19789","19790","19791","19792","19793","19794","19795","19796","19797","19798","19799","19800","19801","19802","19803","19804","19805","19806","19807","19808","19809","19810","19811","19812","19813","19814","19815","19816","19817","19818","19819","19820","19821","19822","19823","19824","19825","19826","19827","19828","19829","19830","19831","19832","19833","19834","19835","19836","19837","19838","19839","19840","19841","19842","19843","19844","19845","19846","19847","19848","19849","19850","19851","19852","19853","19854","19855","19856","19857","19858","19859","19860","19861","19862","19863","19864","19865","19866","19867","19868","19869","19870","19871","19872","19873","19874","19875","19876","19877","19878","19879","19880","19881","19882","19883","19884","19885","19886","19887","19888","19889","19890","19891","19892","19893","19894","19895","19896","19897","19898","19899","19900","19901","19902","19903","19904","19905","19906","19907","19908","19909","19910","19911","19912","19913","19914","19915","19916","19917","19918","19919","19920","19921","19922","19923","19924","19925","19926","19927","19928","19929","19930","19931","19932","19933","19934","19935","19936","19937","19938","19939","19940","19941","19942","19943","19944","19945","19946","19947","19948","19949","19950","19951","19952","19953","19954","19955","19956","19957","19958","19959","19960","19961","19962","19963","19964","19965","19966","19967","19968","19969","19970","19971","19972","19973","19974","19975","19976","19977","19978","19979","19980","19981","19982","19983","19984","19985","19986","19987","19988","19989","19990","19991","19992","19993","19994","19995","19996","19997","19998","19999","20000","20001","20002","20003","20004","20005","20006","20007","20008","20009","20010","20011","20012","20013","20014","20015","20016","20017","20018","20019","20020","20021","20022","20023","20024","20025","20026","20027","20028","20029","20030","20031","20032","20033","20034","20035","20036","20037","20038","20039","20040","20041","20042","20043","20044","20045","20046","20047","20048","20049","20050","20051","20052","20053","20054","20055","20056","20057","20058","20059","20060","20061","20062","20063","20064","20065","20066","20067","20068","20069","20070","20071","20072","20073","20074","20075","20076","20077","20078","20079","20080","20081","20082","20083","20084","20085","20086","20087","20088","20089","20090","20091","20092","20093","20094","20095","20096","20097","20098","20099","20100","20101","20102","20103","20104","20105","20106","20107","20108","20109","20110","20111","20112","20113","20114","20115","20116","20117","20118","20119","20120","20121","20122","20123","20124","20125","20126","20127","20128","20129","20130","20131","20132","20133","20134","20135","20136","20137","20138","20139","20140","20141","20142","20143","20144","20145","20146","20147","20148","20149","20150","20151","20152","20153","20154","20155","20156","20157","20158","20159","20160","20161","20162","20163","20164","20165","20166","20167","20168","20169","20170","20171","20172","20173","20174","20175","20176","20177","20178","20179","20180","20181","20182","20183","20184","20185","20186","20187","20188","20189","20190","20191","20192","20193","20194","20195","20196","20197","20198","20199","20200","20201","20202","20203","20204","20205","20206","20207","20208","20209","20210","20211","20212","20213","20214","20215","20216","20217","20218","20219","20220","20221","20222","20223","20224","20225","20226","20227","20228","20229","20230","20231","20232","20233","20234","20235","20236","20237","20238","20239","20240","20241","20242","20243","20244","20245","20246","20247","20248","20249","20250","20251","20252","20253","20254","20255","20256","20257","20258","20259","20260","20261","20262","20263","20264","20265","20266","20267","20268","20269","20270","20271","20272","20273","20274","20275","20276","20277","20278","20279","20280","20281","20282","20283","20284","20285","20286","20287","20288","20289","20290","20291","20292","20293","20294","20295","20296","20297","20298","20299","20300","20301","20302","20303","20304","20305","20306","20307","20308","20309","20310","20311","20312","20313","20314","20315","20316","20317","20318","20319","20320","20321","20322","20323","20324","20325","20326","20327","20328","20329","20330","20331","20332","20333","20334","20335","20336","20337","20338","20339","20340","20341","20342","20343","20344","20345","20346","20347","20348","20349","20350","20351","20352","20353","20354","20355","20356","20357","20358","20359","20360","20361","20362","20363","20364","20365","20366","20367","20368","20369","20370","20371","20372","20373","20374","20375","20376","20377","20378","20379","20380","20381","20382","20383","20384","20385","20386","20387","20388","20389","20390","20391","20392","20393","20394","20395","20396","20397","20398","20399","20400","20401","20402","20403","20404","20405","20406","20407","20408","20409","20410","20411","20412","20413","20414","20415","20416","20417","20418","20419","20420","20421","20422","20423","20424","20425","20426","20427","20428","20429","20430","20431","20432","20433","20434","20435","20436","20437","20438","20439","20440","20441","20442","20443","20444","20445","20446","20447","20448","20449","20450","20451","20452","20453","20454","20455","20456","20457","20458","20459","20460","20461","20462","20463","20464","20465","20466","20467","20468","20469","20470","20471","20472","20473","20474","20475","20476","20477","20478","20479","20480","20481","20482","20483","20484","20485","20486","20487","20488","20489","20490","20491","20492","20493","20494","20495","20496","20497","20498","20499","20500","20501","20502","20503","20504","20505","20506","20507","20508","20509","20510","20511","20512","20513","20514","20515","20516","20517","20518","20519","20520","20521","20522","20523","20524","20525","20526","20527","20528","20529","20530","20531","20532","20533","20534","20535","20536","20537","20538","20539","20540","20541","20542","20543","20544","20545","20546","20547","20548","20549","20550","20551","20552","20553","20554","20555","20556","20557","20558","20559","20560","20561","20562","20563","20564","20565","20566","20567","20568","20569","20570","20571","20572","20573","20574","20575","20576","20577","20578","20579","20580","20581","20582","20583","20584","20585","20586","20587","20588","20589","20590","20591","20592","20593","20594","20595","20596","20597","20598","20599","20600","20601","20602","20603","20604","20605","20606","20607","20608","20609","20610","20611","20612","20613","20614","20615","20616","20617","20618","20619","20620","20621","20622","20623","20624","20625","20626","20627","20628","20629","20630","20631","20632","20633","20634","20635","20636","20637","20638","20639","20640","20641","20642","20643","20644","20645","20646","20647","20648","20649","20650","20651","20652","20653","20654","20655","20656","20657","20658","20659","20660","20661","20662","20663","20664","20665","20666","20667","20668","20669","20670","20671","20672","20673","20674","20675","20676","20677","20678","20679","20680","20681","20682","20683","20684","20685","20686","20687","20688","20689","20690","20691","20692","20693","20694","20695","20696","20697","20698","20699","20700","20701","20702","20703","20704","20705","20706","20707","20708","20709","20710","20711","20712","20713","20714","20715","20716","20717","20718","20719","20720","20721","20722","20723","20724","20725","20726","20727","20728","20729","20730","20731","20732","20733","20734","20735","20736","20737","20738","20739","20740","20741","20742","20743","20744","20745","20746","20747","20748","20749","20750","20751","20752","20753","20754","20755","20756","20757","20758","20759","20760","20761","20762","20763","20764","20765","20766","20767","20768","20769","20770","20771","20772","20773","20774","20775","20776","20777","20778","20779","20780","20781","20782","20783","20784","20785","20786","20787","20788","20789","20790","20791","20792","20793","20794","20795","20796","20797","20798","20799","20800","20801","20802","20803","20804","20805","20806","20807","20808","20809","20810","20811","20812","20813","20814","20815","20816","20817","20818","20819","20820","20821","20822","20823","20824","20825","20826","20827","20828","20829","20830","20831","20832","20833","20834","20835","20836","20837","20838","20839","20840","20841","20842","20843","20844","20845","20846","20847","20848","20849","20850","20851","20852","20853","20854","20855","20856","20857","20858","20859","20860","20861","20862","20863","20864","20865","20866","20867","20868","20869","20870","20871","20872","20873","20874","20875","20876","20877","20878","20879","20880","20881","20882","20883","20884","20885","20886","20887","20888","20889","20890","20891","20892","20893","20894","20895","20896","20897","20898","20899","20900","20901","20902","20903","20904","20905","20906","20907","20908","20909","20910","20911","20912","20913","20914","20915","20916","20917","20918","20919","20920","20921","20922","20923","20924","20925","20926","20927","20928","20929","20930","20931","20932","20933","20934","20935","20936","20937","20938","20939","20940","20941","20942","20943","20944","20945","20946","20947","20948","20949","20950","20951","20952","20953","20954","20955","20956","20957","20958","20959","20960","20961","20962","20963","20964","20965","20966","20967","20968","20969","20970","20971","20972","20973","20974","20975","20976","20977","20978","20979","20980","20981","20982","20983","20984","20985","20986","20987","20988","20989","20990","20991","20992","20993","20994","20995","20996","20997","20998","20999","21000","21001","21002","21003","21004","21005","21006","21007","21008","21009","21010","21011","21012","21013","21014","21015","21016","21017","21018","21019","21020","21021","21022","21023","21024","21025","21026","21027","21028","21029","21030","21031","21032","21033","21034","21035","21036","21037","21038","21039","21040","21041","21042","21043","21044","21045","21046","21047","21048","21049","21050","21051","21052","21053","21054","21055","21056","21057","21058","21059","21060","21061","21062","21063","21064","21065","21066","21067","21068","21069","21070","21071","21072","21073","21074","21075","21076","21077","21078","21079","21080","21081","21082","21083","21084","21085","21086","21087","21088","21089","21090","21091","21092","21093","21094","21095","21096","21097","21098","21099","21100","21101","21102","21103","21104","21105","21106","21107","21108","21109","21110","21111","21112","21113","21114","21115","21116","21117","21118","21119","21120","21121","21122","21123","21124","21125","21126","21127","21128","21129","21130","21131","21132","21133","21134","21135","21136","21137","21138","21139","21140","21141","21142","21143","21144","21145","21146","21147","21148","21149","21150","21151","21152","21153","21154","21155","21156","21157","21158","21159","21160","21161","21162","21163","21164","21165","21166","21167","21168","21169","21170","21171","21172","21173","21174","21175","21176","21177","21178","21179","21180","21181","21182","21183","21184","21185","21186","21187","21188","21189","21190","21191","21192","21193","21194","21195","21196","21197","21198","21199","21200","21201","21202","21203","21204","21205","21206","21207","21208","21209","21210","21211","21212","21213","21214","21215","21216","21217","21218","21219","21220","21221","21222","21223","21224","21225","21226","21227","21228","21229","21230","21231","21232","21233","21234","21235","21236","21237","21238","21239","21240","21241","21242","21243","21244","21245","21246","21247","21248","21249","21250","21251","21252","21253","21254","21255","21256","21257","21258","21259","21260","21261","21262","21263","21264","21265","21266","21267","21268","21269","21270","21271","21272","21273","21274","21275","21276","21277","21278","21279","21280","21281","21282","21283","21284","21285","21286","21287","21288","21289","21290","21291","21292","21293","21294","21295","21296","21297","21298","21299","21300","21301","21302","21303","21304","21305","21306","21307","21308","21309","21310","21311","21312","21313","21314","21315","21316","21317","21318","21319","21320","21321","21322","21323","21324","21325","21326","21327","21328","21329","21330","21331","21332","21333","21334","21335","21336","21337","21338","21339","21340","21341","21342","21343","21344","21345","21346","21347","21348","21349","21350","21351","21352","21353","21354","21355","21356","21357","21358","21359","21360","21361","21362","21363","21364","21365","21366","21367","21368","21369","21370","21371","21372","21373","21374","21375","21376","21377","21378","21379","21380","21381","21382","21383","21384","21385","21386","21387","21388","21389","21390","21391","21392","21393","21394","21395","21396","21397","21398","21399","21400","21401","21402","21403","21404","21405","21406","21407","21408","21409","21410","21411","21412","21413","21414","21415","21416","21417","21418","21419","21420","21421","21422","21423","21424","21425","21426","21427","21428","21429","21430","21431","21432","21433","21434","21435","21436","21437","21438","21439","21440","21441","21442","21443","21444","21445","21446","21447","21448","21449","21450","21451","21452","21453","21454","21455","21456","21457","21458","21459","21460","21461","21462","21463","21464","21465","21466","21467","21468","21469","21470","21471","21472","21473","21474","21475","21476","21477","21478","21479","21480","21481","21482","21483","21484","21485","21486","21487","21488","21489","21490","21491","21492","21493","21494","21495","21496","21497","21498","21499","21500","21501","21502","21503","21504","21505","21506","21507","21508","21509","21510","21511","21512","21513","21514","21515","21516","21517","21518","21519","21520","21521","21522","21523","21524","21525","21526","21527","21528","21529","21530","21531","21532","21533","21534","21535","21536","21537","21538","21539","21540","21541","21542","21543","21544","21545","21546","21547","21548","21549","21550","21551","21552","21553","21554","21555","21556","21557","21558","21559","21560","21561","21562","21563","21564","21565","21566","21567","21568","21569","21570","21571","21572","21573","21574","21575","21576","21577","21578","21579","21580","21581","21582","21583","21584","21585","21586","21587","21588","21589","21590","21591","21592","21593","21594","21595","21596","21597","21598","21599","21600","21601","21602","21603","21604","21605","21606","21607","21608","21609","21610","21611","21612","21613","21614","21615","21616","21617","21618","21619","21620","21621","21622","21623","21624","21625","21626","21627","21628","21629","21630","21631","21632","21633","21634","21635","21636","21637","21638","21639","21640","21641","21642","21643","21644","21645","21646","21647","21648","21649","21650","21651","21652","21653","21654","21655","21656","21657","21658","21659","21660","21661","21662","21663","21664","21665","21666","21667","21668","21669","21670","21671","21672","21673","21674","21675","21676","21677","21678","21679","21680","21681","21682","21683","21684","21685","21686","21687","21688","21689","21690","21691","21692","21693","21694","21695","21696","21697","21698","21699","21700","21701","21702","21703","21704","21705","21706","21707","21708","21709","21710","21711","21712","21713","21714","21715","21716","21717","21718","21719","21720","21721","21722","21723","21724","21725","21726","21727","21728","21729","21730","21731","21732","21733","21734","21735","21736","21737","21738","21739","21740","21741","21742","21743","21744","21745","21746","21747","21748","21749","21750","21751","21752","21753","21754","21755","21756","21757","21758","21759","21760","21761","21762","21763","21764","21765","21766","21767","21768","21769","21770","21771","21772","21773","21774","21775","21776","21777","21778","21779","21780","21781","21782","21783","21784","21785","21786","21787","21788","21789","21790","21791","21792","21793","21794","21795","21796","21797","21798","21799","21800","21801","21802","21803","21804","21805","21806","21807","21808","21809","21810","21811","21812","21813","21814","21815","21816","21817","21818","21819","21820","21821","21822","21823","21824","21825","21826","21827","21828","21829","21830","21831","21832","21833","21834","21835","21836","21837","21838","21839","21840","21841","21842","21843","21844","21845","21846","21847","21848","21849","21850","21851","21852","21853","21854","21855","21856","21857","21858","21859","21860","21861","21862","21863","21864","21865","21866","21867","21868","21869","21870","21871","21872","21873","21874","21875","21876","21877","21878","21879","21880","21881","21882","21883","21884","21885","21886","21887","21888","21889","21890","21891","21892","21893","21894","21895","21896","21897","21898","21899","21900","21901","21902","21903","21904","21905","21906","21907","21908","21909","21910","21911","21912","21913","21914","21915","21916","21917","21918","21919","21920","21921","21922","21923","21924","21925","21926","21927","21928","21929","21930","21931","21932","21933","21934","21935","21936","21937","21938","21939","21940","21941","21942","21943","21944","21945","21946","21947","21948","21949","21950","21951","21952","21953","21954","21955","21956","21957","21958","21959","21960","21961","21962","21963","21964","21965","21966","21967","21968","21969","21970","21971","21972","21973","21974","21975","21976","21977","21978","21979","21980","21981","21982","21983","21984","21985","21986","21987","21988","21989","21990","21991","21992","21993","21994","21995","21996","21997","21998","21999","22000","22001","22002","22003","22004","22005","22006","22007","22008","22009","22010","22011","22012","22013","22014","22015","22016","22017","22018","22019","22020","22021","22022","22023","22024","22025","22026","22027","22028","22029","22030","22031","22032","22033","22034","22035","22036","22037","22038","22039","22040","22041","22042","22043","22044","22045","22046","22047","22048","22049","22050","22051","22052","22053","22054","22055","22056","22057","22058","22059","22060","22061","22062","22063","22064","22065","22066","22067","22068","22069","22070","22071","22072","22073","22074","22075","22076","22077","22078","22079","22080","22081","22082","22083","22084","22085","22086","22087","22088","22089","22090","22091","22092","22093","22094","22095","22096","22097","22098","22099","22100","22101","22102","22103","22104","22105","22106","22107","22108","22109","22110","22111","22112","22113","22114","22115","22116","22117","22118","22119","22120","22121","22122","22123","22124","22125","22126","22127","22128","22129","22130","22131","22132","22133","22134","22135","22136","22137","22138","22139","22140","22141","22142","22143","22144","22145","22146","22147","22148","22149","22150","22151","22152","22153","22154","22155","22156","22157","22158","22159","22160","22161","22162","22163","22164","22165","22166","22167","22168","22169","22170","22171","22172","22173","22174","22175","22176","22177","22178","22179","22180","22181","22182","22183","22184","22185","22186","22187","22188","22189","22190","22191","22192","22193","22194","22195","22196","22197","22198","22199","22200","22201","22202","22203","22204","22205","22206","22207","22208","22209","22210","22211","22212","22213","22214","22215","22216","22217","22218","22219","22220","22221","22222","22223","22224","22225","22226","22227","22228","22229","22230","22231","22232","22233","22234","22235","22236","22237","22238","22239","22240","22241","22242","22243","22244","22245","22246","22247","22248","22249","22250","22251","22252","22253","22254","22255","22256","22257","22258","22259","22260","22261","22262","22263","22264","22265","22266","22267","22268","22269","22270","22271","22272","22273","22274","22275","22276","22277","22278","22279","22280","22281","22282","22283","22284","22285","22286","22287","22288","22289","22290","22291","22292","22293","22294","22295","22296","22297","22298","22299","22300","22301","22302","22303","22304","22305","22306","22307","22308","22309","22310","22311","22312","22313","22314","22315","22316","22317","22318","22319","22320","22321","22322","22323","22324","22325","22326","22327","22328","22329","22330","22331","22332","22333","22334","22335","22336","22337","22338","22339","22340","22341","22342","22343","22344","22345","22346","22347","22348","22349","22350","22351","22352","22353","22354","22355","22356","22357","22358","22359","22360","22361","22362","22363","22364","22365","22366","22367","22368","22369","22370","22371","22372","22373","22374","22375","22376","22377","22378","22379","22380","22381","22382","22383","22384","22385","22386","22387","22388","22389","22390","22391","22392","22393","22394","22395","22396","22397","22398","22399","22400","22401","22402","22403","22404","22405","22406","22407","22408","22409","22410","22411","22412","22413","22414","22415","22416","22417","22418","22419","22420","22421","22422","22423","22424","22425","22426","22427","22428","22429","22430","22431","22432","22433","22434","22435","22436","22437","22438","22439","22440","22441","22442","22443","22444","22445","22446","22447","22448","22449","22450","22451","22452","22453","22454","22455","22456","22457","22458","22459","22460","22461","22462","22463","22464","22465","22466","22467","22468","22469","22470","22471","22472","22473","22474","22475","22476","22477","22478","22479","22480","22481","22482","22483","22484","22485","22486","22487","22488","22489","22490","22491","22492","22493","22494","22495","22496","22497","22498","22499","22500","22501","22502","22503","22504","22505","22506","22507","22508","22509","22510","22511","22512","22513","22514","22515","22516","22517","22518","22519","22520","22521","22522","22523","22524","22525","22526","22527","22528","22529","22530","22531","22532","22533","22534","22535","22536","22537","22538","22539","22540","22541","22542","22543","22544","22545","22546","22547","22548","22549","22550","22551","22552","22553","22554","22555","22556","22557","22558","22559","22560","22561","22562","22563","22564","22565","22566","22567","22568","22569","22570","22571","22572","22573","22574","22575","22576","22577","22578","22579","22580","22581","22582","22583","22584","22585","22586","22587","22588","22589","22590","22591","22592","22593","22594","22595","22596","22597","22598","22599","22600","22601","22602","22603","22604","22605","22606","22607","22608","22609","22610","22611","22612","22613","22614","22615","22616","22617","22618","22619","22620","22621","22622","22623","22624","22625","22626","22627","22628","22629","22630","22631","22632","22633","22634","22635","22636","22637","22638","22639","22640","22641","22642","22643","22644","22645","22646","22647","22648","22649","22650","22651","22652","22653","22654","22655","22656","22657","22658","22659","22660","22661","22662","22663","22664","22665","22666","22667","22668","22669","22670","22671","22672","22673","22674","22675","22676","22677","22678","22679","22680","22681","22682","22683","22684","22685","22686","22687","22688","22689","22690","22691","22692","22693","22694","22695","22696","22697","22698","22699","22700","22701","22702","22703","22704","22705","22706","22707","22708","22709","22710","22711","22712","22713","22714","22715","22716","22717","22718","22719","22720","22721","22722","22723","22724","22725","22726","22727","22728","22729","22730","22731","22732","22733","22734","22735","22736","22737","22738","22739","22740","22741","22742","22743","22744","22745","22746","22747","22748","22749","22750","22751","22752","22753","22754","22755","22756","22757","22758","22759","22760","22761","22762","22763","22764","22765","22766","22767","22768","22769","22770","22771","22772","22773","22774","22775","22776","22777","22778","22779","22780","22781","22782","22783","22784","22785","22786","22787","22788","22789","22790","22791","22792","22793","22794","22795","22796","22797","22798","22799","22800","22801","22802","22803","22804","22805","22806","22807","22808","22809","22810","22811","22812","22813","22814","22815","22816","22817","22818","22819","22820","22821","22822","22823","22824","22825","22826","22827","22828","22829","22830","22831","22832","22833","22834","22835","22836","22837","22838","22839","22840","22841","22842","22843","22844","22845","22846","22847","22848","22849","22850","22851","22852","22853","22854","22855","22856","22857","22858","22859","22860","22861","22862","22863","22864","22865","22866","22867","22868","22869","22870","22871","22872","22873","22874","22875","22876","22877","22878","22879","22880","22881","22882","22883","22884","22885","22886","22887","22888","22889","22890","22891","22892","22893","22894","22895","22896","22897","22898","22899","22900","22901","22902","22903","22904","22905","22906","22907","22908","22909","22910","22911","22912","22913","22914","22915","22916","22917","22918","22919","22920","22921","22922","22923","22924","22925","22926","22927","22928","22929","22930","22931","22932","22933","22934","22935","22936","22937","22938","22939","22940","22941","22942","22943","22944","22945","22946","22947","22948","22949","22950","22951","22952","22953","22954","22955","22956","22957","22958","22959","22960","22961","22962","22963","22964","22965","22966","22967","22968","22969","22970","22971","22972","22973","22974","22975","22976","22977","22978","22979","22980","22981","22982","22983","22984","22985","22986","22987","22988","22989","22990","22991","22992","22993","22994","22995","22996","22997","22998","22999","23000","23001","23002","23003","23004","23005","23006","23007","23008","23009","23010","23011","23012","23013","23014","23015","23016","23017","23018","23019","23020","23021","23022","23023","23024","23025","23026","23027","23028","23029","23030","23031","23032","23033","23034","23035","23036","23037","23038","23039","23040","23041","23042","23043","23044","23045","23046","23047","23048","23049","23050","23051","23052","23053","23054","23055","23056","23057","23058","23059","23060","23061","23062","23063","23064","23065","23066","23067","23068","23069","23070","23071","23072","23073","23074","23075","23076","23077","23078","23079","23080","23081","23082","23083","23084","23085","23086","23087","23088","23089","23090","23091","23092","23093","23094","23095","23096","23097","23098","23099","23100","23101","23102","23103","23104","23105","23106","23107","23108","23109","23110","23111","23112","23113","23114","23115","23116","23117","23118","23119","23120","23121","23122","23123","23124","23125","23126","23127","23128","23129","23130","23131","23132","23133","23134","23135","23136","23137","23138","23139","23140","23141","23142","23143","23144","23145","23146","23147","23148","23149","23150","23151","23152","23153","23154","23155","23156","23157","23158","23159","23160","23161","23162","23163","23164","23165","23166","23167","23168","23169","23170","23171","23172","23173","23174","23175","23176","23177","23178","23179","23180","23181","23182","23183","23184","23185","23186","23187","23188","23189","23190","23191","23192","23193","23194","23195","23196","23197","23198","23199","23200","23201","23202","23203","23204","23205","23206","23207","23208","23209","23210","23211","23212","23213","23214","23215","23216","23217","23218","23219","23220","23221","23222","23223","23224","23225","23226","23227","23228","23229","23230","23231","23232","23233","23234","23235","23236","23237","23238","23239","23240","23241","23242","23243","23244","23245","23246","23247","23248","23249","23250","23251","23252","23253","23254","23255","23256","23257","23258","23259","23260","23261","23262","23263","23264","23265","23266","23267","23268","23269","23270","23271","23272","23273","23274","23275","23276","23277","23278","23279","23280","23281","23282","23283","23284","23285","23286","23287","23288","23289","23290","23291","23292","23293","23294","23295","23296","23297","23298","23299","23300","23301","23302","23303","23304","23305","23306","23307","23308","23309","23310","23311","23312","23313","23314","23315","23316","23317","23318","23319","23320","23321","23322","23323","23324","23325","23326","23327","23328","23329","23330","23331","23332","23333","23334","23335","23336","23337","23338","23339","23340","23341","23342","23343","23344","23345","23346","23347","23348","23349","23350","23351","23352","23353","23354","23355","23356","23357","23358","23359","23360","23361","23362","23363","23364","23365","23366","23367","23368","23369","23370","23371","23372","23373","23374","23375","23376","23377","23378","23379","23380","23381","23382","23383","23384","23385","23386","23387","23388","23389","23390","23391","23392","23393","23394","23395","23396","23397","23398","23399","23400","23401","23402","23403","23404","23405","23406","23407","23408","23409","23410","23411","23412","23413","23414","23415","23416","23417","23418","23419","23420","23421","23422","23423","23424","23425","23426","23427","23428","23429","23430","23431","23432","23433","23434","23435","23436","23437","23438","23439","23440","23441","23442","23443","23444","23445","23446","23447","23448","23449","23450","23451","23452","23453","23454","23455","23456","23457","23458","23459","23460","23461","23462","23463","23464","23465","23466","23467","23468","23469","23470","23471","23472","23473","23474","23475","23476","23477","23478","23479","23480","23481","23482","23483","23484","23485","23486","23487","23488","23489","23490","23491","23492","23493","23494","23495","23496","23497","23498","23499","23500","23501","23502","23503","23504","23505","23506","23507","23508","23509","23510","23511","23512","23513","23514","23515","23516","23517","23518","23519","23520","23521","23522","23523","23524","23525","23526","23527","23528","23529","23530","23531","23532","23533","23534","23535","23536","23537","23538","23539","23540","23541","23542","23543","23544","23545","23546","23547","23548","23549","23550","23551","23552","23553","23554","23555","23556","23557","23558","23559","23560","23561","23562","23563","23564","23565","23566","23567","23568","23569","23570","23571","23572","23573","23574","23575","23576","23577","23578","23579","23580","23581","23582","23583","23584","23585","23586","23587","23588","23589","23590","23591","23592","23593","23594","23595","23596","23597","23598","23599","23600","23601","23602","23603","23604","23605","23606","23607","23608","23609","23610","23611","23612","23613","23614","23615","23616","23617","23618","23619","23620","23621","23622","23623","23624","23625","23626","23627","23628","23629","23630","23631","23632","23633","23634","23635","23636","23637","23638","23639","23640","23641","23642","23643","23644","23645","23646","23647","23648","23649","23650","23651","23652","23653","23654","23655","23656","23657","23658","23659","23660","23661","23662","23663","23664","23665","23666","23667","23668","23669","23670","23671","23672","23673","23674","23675","23676","23677","23678","23679","23680","23681","23682","23683","23684","23685","23686","23687","23688","23689","23690","23691","23692","23693","23694","23695","23696","23697","23698","23699","23700","23701","23702","23703","23704","23705","23706","23707","23708","23709","23710","23711","23712","23713","23714","23715","23716","23717","23718","23719","23720","23721","23722","23723","23724","23725","23726","23727","23728","23729","23730","23731","23732","23733","23734","23735","23736","23737","23738","23739","23740","23741","23742","23743","23744","23745","23746","23747","23748","23749","23750","23751","23752","23753","23754","23755","23756","23757","23758","23759","23760","23761","23762","23763","23764","23765","23766","23767","23768","23769","23770","23771","23772","23773","23774","23775","23776","23777","23778","23779","23780","23781","23782","23783","23784","23785","23786","23787","23788","23789","23790","23791","23792","23793","23794","23795","23796","23797","23798","23799","23800","23801","23802","23803","23804","23805","23806","23807","23808","23809","23810","23811","23812","23813","23814","23815","23816","23817","23818","23819","23820","23821","23822","23823","23824","23825","23826","23827","23828","23829","23830","23831","23832","23833","23834","23835","23836","23837","23838","23839","23840","23841","23842","23843","23844","23845","23846","23847","23848","23849","23850","23851","23852","23853","23854","23855","23856","23857","23858","23859","23860","23861","23862","23863","23864","23865","23866","23867","23868","23869","23870","23871","23872","23873","23874","23875","23876","23877","23878","23879","23880","23881","23882","23883","23884","23885","23886","23887","23888","23889","23890","23891","23892","23893","23894","23895","23896","23897","23898","23899","23900","23901","23902","23903","23904","23905","23906","23907","23908","23909","23910","23911","23912","23913","23914","23915","23916","23917","23918","23919","23920","23921","23922","23923","23924","23925","23926","23927","23928","23929","23930","23931","23932","23933","23934","23935","23936","23937","23938","23939","23940","23941","23942","23943","23944","23945","23946","23947","23948","23949","23950","23951","23952","23953","23954","23955","23956","23957","23958","23959","23960","23961","23962","23963","23964","23965","23966","23967","23968","23969","23970","23971","23972","23973","23974","23975","23976","23977","23978","23979","23980","23981","23982","23983","23984","23985","23986","23987","23988","23989","23990","23991","23992","23993","23994","23995","23996","23997","23998","23999","24000","24001","24002","24003","24004","24005","24006","24007","24008","24009","24010","24011","24012","24013","24014","24015","24016","24017","24018","24019","24020","24021","24022","24023","24024","24025","24026","24027","24028","24029","24030","24031","24032","24033","24034","24035","24036","24037","24038","24039","24040","24041","24042","24043","24044","24045","24046","24047","24048","24049","24050","24051","24052","24053","24054","24055","24056","24057","24058","24059","24060","24061","24062","24063","24064","24065","24066","24067","24068","24069","24070","24071","24072","24073","24074","24075","24076","24077","24078","24079","24080","24081","24082","24083","24084","24085","24086","24087","24088","24089","24090","24091","24092","24093","24094","24095","24096","24097","24098","24099","24100","24101","24102","24103","24104","24105","24106","24107","24108","24109","24110","24111","24112","24113","24114","24115","24116","24117","24118","24119","24120","24121","24122","24123","24124","24125","24126","24127","24128","24129","24130","24131","24132","24133","24134","24135","24136","24137","24138","24139","24140","24141","24142","24143","24144","24145","24146","24147","24148","24149","24150","24151","24152","24153","24154","24155","24156","24157","24158","24159","24160","24161","24162","24163","24164","24165","24166","24167","24168","24169","24170","24171","24172","24173","24174","24175","24176","24177","24178","24179","24180","24181","24182","24183","24184","24185","24186","24187","24188","24189","24190","24191","24192","24193","24194","24195","24196","24197","24198","24199","24200","24201","24202","24203","24204","24205","24206","24207","24208","24209","24210","24211","24212","24213","24214","24215","24216","24217","24218","24219","24220","24221","24222","24223","24224","24225","24226","24227","24228","24229","24230","24231","24232","24233","24234","24235","24236","24237","24238","24239","24240","24241","24242","24243","24244","24245","24246","24247","24248","24249","24250","24251","24252","24253","24254","24255","24256","24257","24258","24259","24260","24261","24262","24263","24264","24265","24266","24267","24268","24269","24270","24271","24272","24273","24274","24275","24276","24277","24278","24279","24280","24281","24282","24283","24284","24285","24286","24287","24288","24289","24290","24291","24292","24293","24294","24295","24296","24297","24298","24299","24300","24301","24302","24303","24304","24305","24306","24307","24308","24309","24310","24311","24312","24313","24314","24315","24316","24317","24318","24319","24320","24321","24322","24323","24324","24325","24326","24327","24328","24329","24330","24331","24332","24333","24334","24335","24336","24337","24338","24339","24340","24341","24342","24343","24344","24345","24346","24347","24348","24349","24350","24351","24352","24353","24354","24355","24356","24357","24358","24359","24360","24361","24362","24363","24364","24365","24366","24367","24368","24369","24370","24371","24372","24373","24374","24375","24376","24377","24378","24379","24380","24381","24382","24383","24384","24385","24386","24387","24388","24389","24390","24391","24392","24393","24394","24395","24396","24397","24398","24399","24400","24401","24402","24403","24404","24405","24406","24407","24408","24409","24410","24411","24412","24413","24414","24415","24416","24417","24418","24419","24420","24421","24422","24423","24424","24425","24426","24427","24428","24429","24430","24431","24432","24433","24434","24435","24436","24437","24438","24439","24440","24441","24442","24443","24444","24445","24446","24447","24448","24449","24450","24451","24452","24453","24454","24455","24456","24457","24458","24459","24460","24461","24462","24463","24464","24465","24466","24467","24468","24469","24470","24471","24472","24473","24474","24475","24476","24477","24478","24479","24480","24481","24482","24483","24484","24485","24486","24487","24488","24489","24490","24491","24492","24493","24494","24495","24496","24497","24498","24499","24500","24501","24502","24503","24504","24505","24506","24507","24508","24509","24510","24511","24512","24513","24514","24515","24516","24517","24518","24519","24520","24521","24522","24523","24524","24525","24526","24527","24528","24529","24530","24531","24532","24533","24534","24535","24536","24537","24538","24539","24540","24541","24542","24543","24544","24545","24546","24547","24548","24549","24550","24551","24552","24553","24554","24555","24556","24557","24558","24559","24560","24561","24562","24563","24564","24565","24566","24567","24568","24569","24570","24571","24572","24573","24574","24575","24576","24577","24578","24579","24580","24581","24582","24583","24584","24585","24586","24587","24588","24589","24590","24591","24592","24593","24594","24595","24596","24597","24598","24599","24600","24601","24602","24603","24604","24605","24606","24607","24608","24609","24610","24611","24612","24613","24614","24615","24616","24617","24618","24619","24620","24621","24622","24623","24624","24625","24626","24627","24628","24629","24630","24631","24632","24633","24634","24635","24636","24637","24638","24639","24640","24641","24642","24643","24644","24645","24646","24647","24648","24649","24650","24651","24652","24653","24654","24655","24656","24657","24658","24659","24660","24661","24662","24663","24664","24665","24666","24667","24668","24669","24670","24671","24672","24673","24674","24675","24676","24677","24678","24679","24680","24681","24682","24683","24684","24685","24686","24687","24688","24689","24690","24691","24692","24693","24694","24695","24696","24697","24698","24699","24700","24701","24702","24703","24704","24705","24706","24707","24708","24709","24710","24711","24712","24713","24714","24715","24716","24717","24718","24719","24720","24721","24722","24723","24724","24725","24726","24727","24728","24729","24730","24731","24732","24733","24734","24735","24736","24737","24738","24739","24740","24741","24742","24743","24744","24745","24746","24747","24748","24749","24750","24751","24752","24753","24754","24755","24756","24757","24758","24759","24760","24761","24762","24763","24764","24765","24766","24767","24768","24769","24770","24771","24772","24773","24774","24775","24776","24777","24778","24779","24780","24781","24782","24783","24784","24785","24786","24787","24788","24789","24790","24791","24792","24793","24794","24795","24796","24797","24798","24799","24800","24801","24802","24803","24804","24805","24806","24807","24808","24809","24810","24811","24812","24813","24814","24815","24816","24817","24818","24819","24820","24821","24822","24823","24824","24825","24826","24827","24828","24829","24830","24831","24832","24833","24834","24835","24836","24837","24838","24839","24840","24841","24842","24843","24844","24845","24846","24847","24848","24849","24850","24851","24852","24853","24854","24855","24856","24857","24858","24859","24860","24861","24862","24863","24864","24865","24866","24867","24868","24869","24870","24871","24872","24873","24874","24875","24876","24877","24878","24879","24880","24881","24882","24883","24884","24885","24886","24887","24888","24889","24890","24891","24892","24893","24894","24895","24896","24897","24898","24899","24900","24901","24902","24903","24904","24905","24906","24907","24908","24909","24910","24911","24912","24913","24914","24915","24916","24917","24918","24919","24920","24921","24922","24923","24924","24925","24926","24927","24928","24929","24930","24931","24932","24933","24934","24935","24936","24937","24938","24939","24940","24941","24942","24943","24944","24945","24946","24947","24948","24949","24950","24951","24952","24953","24954","24955","24956","24957","24958","24959","24960","24961","24962","24963","24964","24965","24966","24967","24968","24969","24970","24971","24972","24973","24974","24975","24976","24977","24978","24979","24980","24981","24982","24983","24984","24985","24986","24987","24988","24989","24990","24991","24992","24993","24994","24995","24996","24997","24998","24999","25000","25001","25002","25003","25004","25005","25006","25007","25008","25009","25010","25011","25012","25013","25014","25015","25016","25017","25018","25019","25020","25021","25022","25023","25024","25025","25026","25027","25028","25029","25030","25031","25032","25033","25034","25035","25036","25037","25038","25039","25040","25041","25042","25043","25044","25045","25046","25047","25048","25049","25050","25051","25052","25053","25054","25055","25056","25057","25058","25059","25060","25061","25062","25063","25064","25065","25066","25067","25068","25069","25070","25071","25072","25073","25074","25075","25076","25077","25078","25079","25080","25081","25082","25083","25084","25085","25086","25087","25088","25089","25090","25091","25092","25093","25094","25095","25096","25097","25098","25099","25100","25101","25102","25103","25104","25105","25106","25107","25108","25109","25110","25111","25112","25113","25114","25115","25116","25117","25118","25119","25120","25121","25122","25123","25124","25125","25126","25127","25128","25129","25130","25131","25132","25133","25134","25135","25136","25137","25138","25139","25140","25141","25142","25143","25144","25145","25146","25147","25148","25149","25150","25151","25152","25153","25154","25155","25156","25157","25158","25159","25160","25161","25162","25163","25164","25165","25166","25167","25168","25169","25170","25171","25172","25173","25174","25175","25176","25177","25178","25179","25180","25181","25182","25183","25184","25185","25186","25187","25188","25189","25190","25191","25192","25193","25194","25195","25196","25197","25198","25199","25200","25201","25202","25203","25204","25205","25206","25207","25208","25209","25210","25211","25212","25213","25214","25215","25216","25217","25218","25219","25220","25221","25222","25223","25224","25225","25226","25227","25228","25229","25230","25231","25232","25233","25234","25235","25236","25237","25238","25239","25240","25241","25242","25243","25244","25245","25246","25247","25248","25249","25250","25251","25252","25253","25254","25255","25256","25257","25258","25259","25260","25261","25262","25263","25264","25265","25266","25267","25268","25269","25270","25271","25272","25273","25274","25275","25276","25277","25278","25279","25280","25281","25282","25283","25284","25285","25286","25287","25288","25289","25290","25291","25292","25293","25294","25295","25296","25297","25298","25299","25300","25301","25302","25303","25304","25305","25306","25307","25308","25309","25310","25311","25312","25313","25314","25315","25316","25317","25318","25319","25320","25321","25322","25323","25324","25325","25326","25327","25328","25329","25330","25331","25332","25333","25334","25335","25336","25337","25338","25339","25340","25341","25342","25343","25344","25345","25346","25347","25348","25349","25350","25351","25352","25353","25354","25355","25356","25357","25358","25359","25360","25361","25362","25363","25364","25365","25366","25367","25368","25369","25370","25371","25372","25373","25374","25375","25376","25377","25378","25379","25380","25381","25382","25383","25384","25385","25386","25387","25388","25389","25390","25391","25392","25393","25394","25395","25396","25397","25398","25399","25400","25401","25402","25403","25404","25405","25406","25407","25408","25409","25410","25411","25412","25413","25414","25415","25416","25417","25418","25419","25420","25421","25422","25423","25424","25425","25426","25427","25428","25429","25430","25431","25432","25433","25434","25435","25436","25437","25438","25439","25440","25441","25442","25443","25444","25445","25446","25447","25448","25449","25450","25451","25452","25453","25454","25455","25456","25457","25458","25459","25460","25461","25462","25463","25464","25465","25466","25467","25468","25469","25470","25471","25472","25473","25474","25475","25476","25477","25478","25479","25480","25481","25482","25483","25484","25485","25486","25487","25488","25489","25490","25491","25492","25493","25494","25495","25496","25497","25498","25499","25500","25501","25502","25503","25504","25505","25506","25507","25508","25509","25510","25511","25512","25513","25514","25515","25516","25517","25518","25519","25520","25521","25522","25523","25524","25525","25526","25527","25528","25529","25530","25531","25532","25533","25534","25535","25536","25537","25538","25539","25540","25541","25542","25543","25544","25545","25546","25547","25548","25549","25550","25551","25552","25553","25554","25555","25556","25557","25558","25559","25560","25561","25562","25563","25564","25565","25566","25567","25568","25569","25570","25571","25572","25573","25574","25575","25576","25577","25578","25579","25580","25581","25582","25583","25584","25585","25586","25587","25588","25589","25590","25591","25592","25593","25594","25595","25596","25597","25598","25599","25600","25601","25602","25603","25604","25605","25606","25607","25608","25609","25610","25611","25612","25613","25614","25615","25616","25617","25618","25619","25620","25621","25622","25623","25624","25625","25626","25627","25628","25629","25630","25631","25632","25633","25634","25635","25636","25637","25638","25639","25640","25641","25642","25643","25644","25645","25646","25647","25648","25649","25650","25651","25652","25653","25654","25655","25656","25657","25658","25659","25660","25661","25662","25663","25664","25665","25666","25667","25668","25669","25670","25671","25672","25673","25674","25675","25676","25677","25678","25679","25680","25681","25682","25683","25684","25685","25686","25687","25688","25689","25690","25691","25692","25693","25694","25695","25696","25697","25698","25699","25700","25701","25702","25703","25704","25705","25706","25707","25708","25709","25710","25711","25712","25713","25714","25715","25716","25717","25718","25719","25720","25721","25722","25723","25724","25725","25726","25727","25728","25729","25730","25731","25732","25733","25734","25735","25736","25737","25738","25739","25740","25741","25742","25743","25744","25745","25746","25747","25748","25749","25750","25751","25752","25753","25754","25755","25756","25757","25758","25759","25760","25761","25762","25763","25764","25765","25766","25767","25768","25769","25770","25771","25772","25773","25774","25775","25776","25777","25778","25779","25780","25781","25782","25783","25784","25785","25786","25787","25788","25789","25790","25791","25792","25793","25794","25795","25796","25797","25798","25799","25800","25801","25802","25803","25804","25805","25806","25807","25808","25809","25810","25811","25812","25813","25814","25815","25816","25817","25818","25819","25820","25821","25822","25823","25824","25825","25826","25827","25828","25829","25830","25831","25832","25833","25834","25835","25836","25837","25838","25839","25840","25841","25842","25843","25844","25845","25846","25847","25848","25849","25850","25851","25852","25853","25854","25855","25856","25857","25858","25859","25860","25861","25862","25863","25864","25865","25866","25867","25868","25869","25870","25871","25872","25873","25874","25875","25876","25877","25878","25879","25880","25881","25882","25883","25884","25885","25886","25887","25888","25889","25890","25891","25892","25893","25894","25895","25896","25897","25898","25899","25900","25901","25902","25903","25904","25905","25906","25907","25908","25909","25910","25911","25912","25913","25914","25915","25916","25917","25918","25919","25920","25921","25922","25923","25924","25925","25926","25927","25928","25929","25930","25931","25932","25933","25934","25935","25936","25937","25938","25939","25940","25941","25942","25943","25944","25945","25946","25947","25948","25949","25950","25951","25952","25953","25954","25955","25956","25957","25958","25959","25960","25961","25962","25963","25964","25965","25966","25967","25968","25969","25970","25971","25972","25973","25974","25975","25976","25977","25978","25979","25980","25981","25982","25983","25984","25985","25986","25987","25988","25989","25990","25991","25992","25993","25994","25995","25996","25997","25998","25999","26000","26001","26002","26003","26004","26005","26006","26007","26008","26009","26010","26011","26012","26013","26014","26015","26016","26017","26018","26019","26020","26021","26022","26023","26024","26025","26026","26027","26028","26029","26030","26031","26032","26033","26034","26035","26036","26037","26038","26039","26040","26041","26042","26043","26044","26045","26046","26047","26048","26049","26050","26051","26052","26053","26054","26055","26056","26057","26058","26059","26060","26061","26062","26063","26064","26065","26066","26067","26068","26069","26070","26071","26072","26073","26074","26075","26076","26077","26078","26079","26080","26081","26082","26083","26084","26085","26086","26087","26088","26089","26090","26091","26092","26093","26094","26095","26096","26097","26098","26099","26100","26101","26102","26103","26104","26105","26106","26107","26108","26109","26110","26111","26112","26113","26114","26115","26116","26117","26118","26119","26120","26121","26122","26123","26124","26125","26126","26127","26128","26129","26130","26131","26132","26133","26134","26135","26136","26137","26138","26139","26140","26141","26142","26143","26144","26145","26146","26147","26148","26149","26150","26151","26152","26153","26154","26155","26156","26157","26158","26159","26160","26161","26162","26163","26164","26165","26166","26167","26168","26169","26170","26171","26172","26173","26174","26175","26176","26177","26178","26179","26180","26181","26182","26183","26184","26185","26186","26187","26188","26189","26190","26191","26192","26193","26194","26195","26196","26197","26198","26199","26200","26201","26202","26203","26204","26205","26206","26207","26208","26209","26210","26211","26212","26213","26214","26215","26216","26217","26218","26219","26220","26221","26222","26223","26224","26225","26226","26227","26228","26229","26230","26231","26232","26233","26234","26235","26236","26237","26238","26239","26240","26241","26242","26243","26244","26245","26246","26247","26248","26249","26250","26251","26252","26253","26254","26255","26256","26257","26258","26259","26260","26261","26262","26263","26264","26265","26266","26267","26268","26269","26270","26271","26272","26273","26274","26275","26276","26277","26278","26279","26280","26281","26282","26283","26284","26285","26286","26287","26288","26289","26290","26291","26292","26293","26294","26295","26296","26297","26298","26299","26300","26301","26302","26303","26304","26305","26306","26307","26308","26309","26310","26311","26312","26313","26314","26315","26316","26317","26318","26319","26320","26321","26322","26323","26324","26325","26326","26327","26328","26329","26330","26331","26332","26333","26334","26335","26336","26337","26338","26339","26340","26341","26342","26343","26344","26345","26346","26347","26348","26349","26350","26351","26352","26353","26354","26355","26356","26357","26358","26359","26360","26361","26362","26363","26364","26365","26366","26367","26368","26369","26370","26371","26372","26373","26374","26375","26376","26377","26378","26379","26380","26381","26382","26383","26384","26385","26386","26387","26388","26389","26390","26391","26392","26393","26394","26395","26396","26397","26398","26399","26400","26401","26402","26403","26404","26405","26406","26407","26408","26409","26410","26411","26412","26413","26414","26415","26416","26417","26418","26419","26420","26421","26422","26423","26424","26425","26426","26427","26428","26429","26430","26431","26432","26433","26434","26435","26436","26437","26438","26439","26440","26441","26442","26443","26444","26445","26446","26447","26448","26449","26450","26451","26452","26453","26454","26455","26456","26457","26458","26459","26460","26461","26462","26463","26464","26465","26466","26467","26468","26469","26470","26471","26472","26473","26474","26475","26476","26477","26478","26479","26480","26481","26482","26483","26484","26485","26486","26487","26488","26489","26490","26491","26492","26493","26494","26495","26496","26497","26498","26499","26500","26501","26502","26503","26504","26505","26506","26507","26508","26509","26510","26511","26512","26513","26514","26515","26516","26517","26518","26519","26520","26521","26522","26523","26524","26525","26526","26527","26528","26529","26530","26531","26532","26533","26534","26535","26536","26537","26538","26539","26540","26541","26542","26543","26544","26545","26546","26547","26548","26549","26550","26551","26552","26553","26554","26555","26556","26557","26558","26559","26560","26561","26562","26563","26564","26565","26566","26567","26568","26569","26570","26571","26572","26573","26574","26575","26576","26577","26578","26579","26580","26581","26582","26583","26584","26585","26586","26587","26588","26589","26590","26591","26592","26593","26594","26595","26596","26597","26598","26599","26600","26601","26602","26603","26604","26605","26606","26607","26608","26609","26610","26611","26612","26613","26614","26615","26616","26617","26618","26619","26620","26621","26622","26623","26624","26625","26626","26627","26628","26629","26630","26631","26632","26633","26634","26635","26636","26637","26638","26639","26640","26641","26642","26643","26644","26645","26646","26647","26648","26649","26650","26651","26652","26653","26654","26655","26656","26657","26658","26659","26660","26661","26662","26663","26664","26665","26666","26667","26668","26669","26670","26671","26672","26673","26674","26675","26676","26677","26678","26679","26680","26681","26682","26683","26684","26685","26686","26687","26688","26689","26690","26691","26692","26693","26694","26695","26696","26697","26698","26699","26700","26701","26702","26703","26704","26705","26706","26707","26708","26709","26710","26711","26712","26713","26714","26715","26716","26717","26718","26719","26720","26721","26722","26723","26724","26725","26726","26727","26728","26729","26730","26731","26732","26733","26734","26735","26736","26737","26738","26739","26740","26741","26742","26743","26744","26745","26746","26747","26748","26749","26750","26751","26752","26753","26754","26755","26756","26757","26758","26759","26760","26761","26762","26763","26764","26765","26766","26767","26768","26769","26770","26771","26772","26773","26774","26775","26776","26777","26778","26779","26780","26781","26782","26783","26784","26785","26786","26787","26788","26789","26790","26791","26792","26793","26794","26795","26796","26797","26798","26799","26800","26801","26802","26803","26804","26805","26806","26807","26808","26809","26810","26811","26812","26813","26814","26815","26816","26817","26818","26819","26820","26821","26822","26823","26824","26825","26826","26827","26828","26829","26830","26831","26832","26833","26834","26835","26836","26837","26838","26839","26840","26841","26842","26843","26844","26845","26846","26847","26848","26849","26850","26851","26852","26853","26854","26855","26856","26857","26858","26859","26860","26861","26862","26863","26864","26865","26866","26867","26868","26869","26870","26871","26872","26873","26874","26875","26876","26877","26878","26879","26880","26881","26882","26883","26884","26885","26886","26887","26888","26889","26890","26891","26892","26893","26894","26895","26896","26897","26898","26899","26900","26901","26902","26903","26904","26905","26906","26907","26908","26909","26910","26911","26912","26913","26914","26915","26916","26917","26918","26919","26920","26921","26922","26923","26924","26925","26926","26927","26928","26929","26930","26931","26932","26933","26934","26935","26936","26937","26938","26939","26940","26941","26942","26943","26944","26945","26946","26947","26948","26949","26950","26951","26952","26953","26954","26955","26956","26957","26958","26959","26960","26961","26962","26963","26964","26965","26966","26967","26968","26969","26970","26971","26972","26973","26974","26975","26976","26977","26978","26979","26980","26981","26982","26983","26984","26985","26986","26987","26988","26989","26990","26991","26992","26993","26994","26995","26996","26997","26998","26999","27000","27001","27002","27003","27004","27005","27006","27007","27008","27009","27010","27011","27012","27013","27014","27015","27016","27017","27018","27019","27020","27021","27022","27023","27024","27025","27026","27027","27028","27029","27030","27031","27032","27033","27034","27035","27036","27037","27038","27039","27040","27041","27042","27043","27044","27045","27046","27047","27048","27049","27050","27051","27052","27053","27054","27055","27056","27057","27058","27059","27060","27061","27062","27063","27064","27065","27066","27067","27068","27069","27070","27071","27072","27073","27074","27075","27076","27077","27078","27079","27080","27081","27082","27083","27084","27085","27086","27087","27088","27089","27090","27091","27092","27093","27094","27095","27096","27097","27098","27099","27100","27101","27102","27103","27104","27105","27106","27107","27108","27109","27110","27111","27112","27113","27114","27115","27116","27117","27118","27119","27120","27121","27122","27123","27124","27125","27126","27127","27128","27129","27130","27131","27132","27133","27134","27135","27136","27137","27138","27139","27140","27141","27142","27143","27144","27145","27146","27147","27148","27149","27150","27151","27152","27153","27154","27155","27156","27157","27158","27159","27160","27161","27162","27163","27164","27165","27166","27167","27168","27169","27170","27171","27172","27173","27174","27175","27176","27177","27178","27179","27180","27181","27182","27183","27184","27185","27186","27187","27188","27189","27190","27191","27192","27193","27194","27195","27196","27197","27198","27199","27200","27201","27202","27203","27204","27205","27206","27207","27208","27209","27210","27211","27212","27213","27214","27215","27216","27217","27218","27219","27220","27221","27222","27223","27224","27225","27226","27227","27228","27229","27230","27231","27232","27233","27234","27235","27236","27237","27238","27239","27240","27241","27242","27243","27244","27245","27246","27247","27248","27249","27250","27251","27252","27253","27254","27255","27256","27257","27258","27259","27260","27261","27262","27263","27264","27265","27266","27267","27268","27269","27270","27271","27272","27273","27274","27275","27276","27277","27278","27279","27280","27281","27282","27283","27284","27285","27286","27287","27288","27289","27290","27291","27292","27293","27294","27295","27296","27297","27298","27299","27300","27301","27302","27303","27304","27305","27306","27307","27308","27309","27310","27311","27312","27313","27314","27315","27316","27317","27318","27319","27320","27321","27322","27323","27324","27325","27326","27327","27328","27329","27330","27331","27332","27333","27334","27335","27336","27337","27338","27339","27340","27341","27342","27343","27344","27345","27346","27347","27348","27349","27350","27351","27352","27353","27354","27355","27356","27357","27358","27359","27360","27361","27362","27363","27364","27365","27366","27367","27368","27369","27370","27371","27372","27373","27374","27375","27376","27377","27378","27379","27380","27381","27382","27383","27384","27385","27386","27387","27388","27389","27390","27391","27392","27393","27394","27395","27396","27397","27398","27399","27400","27401","27402","27403","27404","27405","27406","27407","27408","27409","27410","27411","27412","27413","27414","27415","27416","27417","27418","27419","27420","27421","27422","27423","27424","27425","27426","27427","27428","27429","27430","27431","27432","27433","27434","27435","27436","27437","27438","27439","27440","27441","27442","27443","27444","27445","27446","27447","27448","27449","27450","27451","27452","27453","27454","27455","27456","27457","27458","27459","27460","27461","27462","27463","27464","27465","27466","27467","27468","27469","27470","27471","27472","27473","27474","27475","27476","27477","27478","27479","27480","27481","27482","27483","27484","27485","27486","27487","27488","27489","27490","27491","27492","27493","27494","27495","27496","27497","27498","27499","27500","27501","27502","27503","27504","27505","27506","27507","27508","27509","27510","27511","27512","27513","27514","27515","27516","27517","27518","27519","27520","27521","27522","27523","27524","27525","27526","27527","27528","27529","27530","27531","27532","27533","27534","27535","27536","27537","27538","27539","27540","27541","27542","27543","27544","27545","27546","27547","27548","27549","27550","27551","27552","27553","27554","27555","27556","27557","27558","27559","27560","27561","27562","27563","27564","27565","27566","27567","27568","27569","27570","27571","27572","27573","27574","27575","27576","27577","27578","27579","27580","27581","27582","27583","27584","27585","27586","27587","27588","27589","27590","27591","27592","27593","27594","27595","27596","27597","27598","27599","27600","27601","27602","27603","27604","27605","27606","27607","27608","27609","27610","27611","27612","27613","27614","27615","27616","27617","27618","27619","27620","27621","27622","27623","27624","27625","27626","27627","27628","27629","27630","27631","27632","27633","27634","27635","27636","27637","27638","27639","27640","27641","27642","27643","27644","27645","27646","27647","27648","27649","27650","27651","27652","27653","27654","27655","27656","27657","27658","27659","27660","27661","27662","27663","27664","27665","27666","27667","27668","27669","27670","27671","27672","27673","27674","27675","27676","27677","27678","27679","27680","27681","27682","27683","27684","27685","27686","27687","27688","27689","27690","27691","27692","27693","27694","27695","27696","27697","27698","27699","27700","27701","27702","27703","27704","27705","27706","27707","27708","27709","27710","27711","27712","27713","27714","27715","27716","27717","27718","27719","27720","27721","27722","27723","27724","27725","27726","27727","27728","27729","27730","27731","27732","27733","27734","27735","27736","27737","27738","27739","27740","27741","27742","27743","27744","27745","27746","27747","27748","27749","27750","27751","27752","27753","27754","27755","27756","27757","27758","27759","27760","27761","27762","27763","27764","27765","27766","27767","27768","27769","27770","27771","27772","27773","27774","27775","27776","27777","27778","27779","27780","27781","27782","27783","27784","27785","27786","27787","27788","27789","27790","27791","27792","27793","27794","27795","27796","27797","27798","27799","27800","27801","27802","27803","27804","27805","27806","27807","27808","27809","27810","27811","27812","27813","27814","27815","27816","27817","27818","27819","27820","27821","27822","27823","27824","27825","27826","27827","27828","27829","27830","27831","27832","27833","27834","27835","27836","27837","27838","27839","27840","27841","27842","27843","27844","27845","27846","27847","27848","27849","27850","27851","27852","27853","27854","27855","27856","27857","27858","27859","27860","27861","27862","27863","27864","27865","27866","27867","27868","27869","27870","27871","27872","27873","27874","27875","27876","27877","27878","27879","27880","27881","27882","27883","27884","27885","27886","27887","27888","27889","27890","27891","27892","27893","27894","27895","27896","27897","27898","27899","27900","27901","27902","27903","27904","27905","27906","27907","27908","27909","27910","27911","27912","27913","27914","27915","27916","27917","27918","27919","27920","27921","27922","27923","27924","27925","27926","27927","27928","27929","27930","27931","27932","27933","27934","27935","27936","27937","27938","27939","27940","27941","27942","27943","27944","27945","27946","27947","27948","27949","27950","27951","27952","27953","27954","27955","27956","27957","27958","27959","27960","27961","27962","27963","27964","27965","27966","27967","27968","27969","27970","27971","27972","27973","27974","27975","27976","27977","27978","27979","27980","27981","27982","27983","27984","27985","27986","27987","27988","27989","27990","27991","27992","27993","27994","27995","27996","27997","27998","27999","28000","28001","28002","28003","28004","28005","28006","28007","28008","28009","28010","28011","28012","28013","28014","28015","28016","28017","28018","28019","28020","28021","28022","28023","28024","28025","28026","28027","28028","28029","28030","28031","28032","28033","28034","28035","28036","28037","28038","28039","28040","28041","28042","28043","28044","28045","28046","28047","28048","28049","28050","28051","28052","28053","28054","28055","28056","28057","28058","28059","28060","28061","28062","28063","28064","28065","28066","28067","28068","28069","28070","28071","28072","28073","28074","28075","28076","28077","28078","28079","28080","28081","28082","28083","28084","28085","28086","28087","28088","28089","28090","28091","28092","28093","28094","28095","28096","28097","28098","28099","28100","28101","28102","28103","28104","28105","28106","28107","28108","28109","28110","28111","28112","28113","28114","28115","28116","28117","28118","28119","28120","28121","28122","28123","28124","28125","28126","28127","28128","28129","28130","28131","28132","28133","28134","28135","28136","28137","28138","28139","28140","28141","28142","28143","28144","28145","28146","28147","28148","28149","28150","28151","28152","28153","28154","28155","28156","28157","28158","28159","28160","28161","28162","28163","28164","28165","28166","28167","28168","28169","28170","28171","28172","28173","28174","28175","28176","28177","28178","28179","28180","28181","28182","28183","28184","28185","28186","28187","28188","28189","28190","28191","28192","28193","28194","28195","28196","28197","28198","28199","28200","28201","28202","28203","28204","28205","28206","28207","28208","28209","28210","28211","28212","28213","28214","28215","28216","28217","28218","28219","28220","28221","28222","28223","28224","28225","28226","28227","28228","28229","28230","28231","28232","28233","28234","28235","28236","28237","28238","28239","28240","28241","28242","28243","28244","28245","28246","28247","28248","28249","28250","28251","28252","28253","28254","28255","28256","28257","28258","28259","28260","28261","28262","28263","28264","28265","28266","28267","28268","28269","28270","28271","28272","28273","28274","28275","28276","28277","28278","28279","28280","28281","28282","28283","28284","28285","28286","28287","28288","28289","28290","28291","28292","28293","28294","28295","28296","28297","28298","28299","28300","28301","28302","28303","28304","28305","28306","28307","28308","28309","28310","28311","28312","28313","28314","28315","28316","28317","28318","28319","28320","28321","28322","28323","28324","28325","28326","28327","28328","28329","28330","28331","28332","28333","28334","28335","28336","28337","28338","28339","28340","28341","28342","28343","28344","28345","28346","28347","28348","28349","28350","28351","28352","28353","28354","28355","28356","28357","28358","28359","28360","28361","28362","28363","28364","28365","28366","28367","28368","28369","28370","28371","28372","28373","28374","28375","28376","28377","28378","28379","28380","28381","28382","28383","28384","28385","28386","28387","28388","28389","28390","28391","28392","28393","28394","28395","28396","28397","28398","28399","28400","28401","28402","28403","28404","28405","28406","28407","28408","28409","28410","28411","28412","28413","28414","28415","28416","28417","28418","28419","28420","28421","28422","28423","28424","28425","28426","28427","28428","28429","28430","28431","28432","28433","28434","28435","28436","28437","28438","28439","28440","28441","28442","28443","28444","28445","28446","28447","28448","28449","28450","28451","28452","28453","28454","28455","28456","28457","28458","28459","28460","28461","28462","28463","28464","28465","28466","28467","28468","28469","28470","28471","28472","28473","28474","28475","28476","28477","28478","28479","28480","28481","28482","28483","28484","28485","28486","28487","28488","28489","28490","28491","28492","28493","28494","28495","28496","28497","28498","28499","28500","28501","28502","28503","28504","28505","28506","28507","28508","28509","28510","28511","28512","28513","28514","28515","28516","28517","28518","28519","28520","28521","28522","28523","28524","28525","28526","28527","28528","28529","28530","28531","28532","28533","28534","28535","28536","28537","28538","28539","28540","28541","28542","28543","28544","28545","28546","28547","28548","28549","28550","28551","28552","28553","28554","28555","28556","28557","28558","28559","28560","28561","28562","28563","28564","28565","28566","28567","28568","28569","28570","28571","28572","28573","28574","28575","28576","28577","28578","28579","28580","28581","28582","28583","28584","28585","28586","28587","28588","28589","28590","28591","28592","28593","28594","28595","28596","28597","28598","28599","28600","28601","28602","28603","28604","28605","28606","28607","28608","28609","28610","28611","28612","28613","28614","28615","28616","28617","28618","28619","28620","28621","28622","28623","28624","28625","28626","28627","28628","28629","28630","28631","28632","28633","28634","28635","28636","28637","28638","28639","28640","28641","28642","28643","28644","28645","28646","28647","28648","28649","28650","28651","28652","28653","28654","28655","28656","28657","28658","28659","28660","28661","28662","28663","28664","28665","28666","28667","28668","28669","28670","28671","28672","28673","28674","28675","28676","28677","28678","28679","28680","28681","28682","28683","28684","28685","28686","28687","28688","28689","28690","28691","28692","28693","28694","28695","28696","28697","28698","28699","28700","28701","28702","28703","28704","28705","28706","28707","28708","28709","28710","28711","28712","28713","28714","28715","28716","28717","28718","28719","28720","28721","28722","28723","28724","28725","28726","28727","28728","28729","28730","28731","28732","28733","28734","28735","28736","28737","28738","28739","28740","28741","28742","28743","28744","28745","28746","28747","28748","28749","28750","28751","28752","28753","28754","28755","28756","28757","28758","28759","28760","28761","28762","28763","28764","28765","28766","28767","28768","28769","28770","28771","28772","28773","28774","28775","28776","28777","28778","28779","28780","28781","28782","28783","28784","28785","28786","28787","28788","28789","28790","28791","28792","28793","28794","28795","28796","28797","28798","28799","28800","28801","28802","28803","28804","28805","28806","28807","28808","28809","28810","28811","28812","28813","28814","28815","28816","28817","28818","28819","28820","28821","28822","28823","28824","28825","28826","28827","28828","28829","28830","28831","28832","28833","28834","28835","28836","28837","28838","28839","28840","28841","28842","28843","28844","28845","28846","28847","28848","28849","28850","28851","28852","28853","28854","28855","28856","28857","28858","28859","28860","28861","28862","28863","28864","28865","28866","28867","28868","28869","28870","28871","28872","28873","28874","28875","28876","28877","28878","28879","28880","28881","28882","28883","28884","28885","28886","28887","28888","28889","28890","28891","28892","28893","28894","28895","28896","28897","28898","28899","28900","28901","28902","28903","28904","28905","28906","28907","28908","28909","28910","28911","28912","28913","28914","28915","28916","28917","28918","28919","28920","28921","28922","28923","28924","28925","28926","28927","28928","28929","28930","28931","28932","28933","28934","28935","28936","28937","28938","28939","28940","28941","28942","28943","28944","28945","28946","28947","28948","28949","28950","28951","28952","28953","28954","28955","28956","28957","28958","28959","28960","28961","28962","28963","28964","28965","28966","28967","28968","28969","28970","28971","28972","28973","28974","28975","28976","28977","28978","28979","28980","28981","28982","28983","28984","28985","28986","28987","28988","28989","28990","28991","28992","28993","28994","28995","28996","28997","28998","28999","29000","29001","29002","29003","29004","29005","29006","29007","29008","29009","29010","29011","29012","29013","29014","29015","29016","29017","29018","29019","29020","29021","29022","29023","29024","29025","29026","29027","29028","29029","29030","29031","29032","29033","29034","29035","29036","29037","29038","29039","29040","29041","29042","29043","29044","29045","29046","29047","29048","29049","29050","29051","29052","29053","29054","29055","29056","29057","29058","29059","29060","29061","29062","29063","29064","29065","29066","29067","29068","29069","29070","29071","29072","29073","29074","29075","29076","29077","29078","29079","29080","29081","29082","29083","29084","29085","29086","29087","29088","29089","29090","29091","29092","29093","29094","29095","29096","29097","29098","29099","29100","29101","29102","29103","29104","29105","29106","29107","29108","29109","29110","29111","29112","29113","29114","29115","29116","29117","29118","29119","29120","29121","29122","29123","29124","29125","29126","29127","29128","29129","29130","29131","29132","29133","29134","29135","29136","29137","29138","29139","29140","29141","29142","29143","29144","29145","29146","29147","29148","29149","29150","29151","29152","29153","29154","29155","29156","29157","29158","29159","29160","29161","29162","29163","29164","29165","29166","29167","29168","29169","29170","29171","29172","29173","29174","29175","29176","29177","29178","29179","29180","29181","29182","29183","29184","29185","29186","29187","29188","29189","29190","29191","29192","29193","29194","29195","29196","29197","29198","29199","29200","29201","29202","29203","29204","29205","29206","29207","29208","29209","29210","29211","29212","29213","29214","29215","29216","29217","29218","29219","29220","29221","29222","29223","29224","29225","29226","29227","29228","29229","29230","29231","29232","29233","29234","29235","29236","29237","29238","29239","29240","29241","29242","29243","29244","29245","29246","29247","29248","29249","29250","29251","29252","29253","29254","29255","29256","29257","29258","29259","29260","29261","29262","29263","29264","29265","29266","29267","29268","29269","29270","29271","29272","29273","29274","29275","29276","29277","29278","29279","29280","29281","29282","29283","29284","29285","29286","29287","29288","29289","29290","29291","29292","29293","29294","29295","29296","29297","29298","29299","29300","29301","29302","29303","29304","29305","29306","29307","29308","29309","29310","29311","29312","29313","29314","29315","29316","29317","29318","29319","29320","29321","29322","29323","29324","29325","29326","29327","29328","29329","29330","29331","29332","29333","29334","29335","29336","29337","29338","29339","29340","29341","29342","29343","29344","29345","29346","29347","29348","29349","29350","29351","29352","29353","29354","29355","29356","29357","29358","29359","29360","29361","29362","29363","29364","29365","29366","29367","29368","29369","29370","29371","29372","29373","29374","29375","29376","29377","29378","29379","29380","29381","29382","29383","29384","29385","29386","29387","29388","29389","29390","29391","29392","29393","29394","29395","29396","29397","29398","29399","29400","29401","29402","29403","29404","29405","29406","29407","29408","29409","29410","29411","29412","29413","29414","29415","29416","29417","29418","29419","29420","29421","29422","29423","29424","29425","29426","29427","29428","29429","29430","29431","29432","29433","29434","29435","29436","29437","29438","29439","29440","29441","29442","29443","29444","29445","29446","29447","29448","29449","29450","29451","29452","29453","29454","29455","29456","29457","29458","29459","29460","29461","29462","29463","29464","29465","29466","29467","29468","29469","29470","29471","29472","29473","29474","29475","29476","29477","29478","29479","29480","29481","29482","29483","29484","29485","29486","29487","29488","29489","29490","29491","29492","29493","29494","29495","29496","29497","29498","29499","29500","29501","29502","29503","29504","29505","29506","29507","29508","29509","29510","29511","29512","29513","29514","29515","29516","29517","29518","29519","29520","29521","29522","29523","29524","29525","29526","29527","29528","29529","29530","29531","29532","29533","29534","29535","29536","29537","29538","29539","29540","29541","29542","29543","29544","29545","29546","29547","29548","29549","29550","29551","29552","29553","29554","29555","29556","29557","29558","29559","29560","29561","29562","29563","29564","29565","29566","29567","29568","29569","29570","29571","29572","29573","29574","29575","29576","29577","29578","29579","29580","29581","29582","29583","29584","29585","29586","29587","29588","29589","29590","29591","29592","29593","29594","29595","29596","29597","29598","29599","29600","29601","29602","29603","29604","29605","29606","29607","29608","29609","29610","29611","29612","29613","29614","29615","29616","29617","29618","29619","29620","29621","29622","29623","29624","29625","29626","29627","29628","29629","29630","29631","29632","29633","29634","29635","29636","29637","29638","29639","29640","29641","29642","29643","29644","29645","29646","29647","29648","29649","29650","29651","29652","29653","29654","29655","29656","29657","29658","29659","29660","29661","29662","29663","29664","29665","29666","29667","29668","29669","29670","29671","29672","29673","29674","29675","29676","29677","29678","29679","29680","29681","29682","29683","29684","29685","29686","29687","29688","29689","29690","29691","29692","29693","29694","29695","29696","29697","29698","29699","29700","29701","29702","29703","29704","29705","29706","29707","29708","29709","29710","29711","29712","29713","29714","29715","29716","29717","29718","29719","29720","29721","29722","29723","29724","29725","29726","29727","29728","29729","29730","29731","29732","29733","29734","29735","29736","29737","29738","29739","29740","29741","29742","29743","29744","29745","29746","29747","29748","29749","29750","29751","29752","29753","29754","29755","29756","29757","29758","29759","29760","29761","29762","29763","29764","29765","29766","29767","29768","29769","29770","29771","29772","29773","29774","29775","29776","29777","29778","29779","29780","29781","29782","29783","29784","29785","29786","29787","29788","29789","29790","29791","29792","29793","29794","29795","29796","29797","29798","29799","29800","29801","29802","29803","29804","29805","29806","29807","29808","29809","29810","29811","29812","29813","29814","29815","29816","29817","29818","29819","29820","29821","29822","29823","29824","29825","29826","29827","29828","29829","29830","29831","29832","29833","29834","29835","29836","29837","29838","29839","29840","29841","29842","29843","29844","29845","29846","29847","29848","29849","29850","29851","29852","29853","29854","29855","29856","29857","29858","29859","29860","29861","29862","29863","29864","29865","29866","29867","29868","29869","29870","29871","29872","29873","29874","29875","29876","29877","29878","29879","29880","29881","29882","29883","29884","29885","29886","29887","29888","29889","29890","29891","29892","29893","29894","29895","29896","29897","29898","29899","29900","29901","29902","29903","29904","29905","29906","29907","29908","29909","29910","29911","29912","29913","29914","29915","29916","29917","29918","29919","29920","29921","29922","29923","29924","29925","29926","29927","29928","29929","29930","29931","29932","29933","29934","29935","29936","29937","29938","29939","29940","29941","29942","29943","29944","29945","29946","29947","29948","29949","29950","29951","29952","29953","29954","29955","29956","29957","29958","29959","29960","29961","29962","29963","29964","29965","29966","29967","29968","29969","29970","29971","29972","29973","29974","29975","29976","29977","29978","29979","29980","29981","29982","29983","29984","29985","29986","29987","29988","29989","29990","29991","29992","29993","29994","29995","29996","29997","29998","29999","30000","30001","30002","30003","30004","30005","30006","30007","30008","30009","30010","30011","30012","30013","30014","30015","30016","30017","30018","30019","30020","30021","30022","30023","30024","30025","30026","30027","30028","30029","30030","30031","30032","30033","30034","30035","30036","30037","30038","30039","30040","30041","30042","30043","30044","30045","30046","30047","30048","30049","30050","30051","30052","30053","30054","30055","30056","30057","30058","30059","30060","30061","30062","30063","30064","30065","30066","30067","30068","30069","30070","30071","30072","30073","30074","30075","30076","30077","30078","30079","30080","30081","30082","30083","30084","30085","30086","30087","30088","30089","30090","30091","30092","30093","30094","30095","30096","30097","30098","30099","30100","30101","30102","30103","30104","30105","30106","30107","30108","30109","30110","30111","30112","30113","30114","30115","30116","30117","30118","30119","30120","30121","30122","30123","30124","30125","30126","30127","30128","30129","30130","30131","30132","30133","30134","30135","30136","30137","30138","30139","30140","30141","30142","30143","30144","30145","30146","30147","30148","30149","30150","30151","30152","30153","30154","30155","30156","30157","30158","30159","30160","30161","30162","30163","30164","30165","30166","30167","30168","30169","30170","30171","30172","30173","30174","30175","30176","30177","30178","30179","30180","30181","30182","30183","30184","30185","30186","30187","30188","30189","30190","30191","30192","30193","30194","30195","30196","30197","30198","30199","30200","30201","30202","30203","30204","30205","30206","30207","30208","30209","30210","30211","30212","30213","30214","30215","30216","30217","30218","30219","30220","30221","30222","30223","30224","30225","30226","30227","30228","30229","30230","30231","30232","30233","30234","30235","30236","30237","30238","30239","30240","30241","30242","30243","30244","30245","30246","30247","30248","30249","30250","30251","30252","30253","30254","30255","30256","30257","30258","30259","30260","30261","30262","30263","30264","30265","30266","30267","30268","30269","30270","30271","30272","30273","30274","30275","30276","30277","30278","30279","30280","30281","30282","30283","30284","30285","30286","30287","30288","30289","30290","30291","30292","30293","30294","30295","30296","30297","30298","30299","30300","30301","30302","30303","30304","30305","30306","30307","30308","30309","30310","30311","30312","30313","30314","30315","30316","30317","30318","30319","30320","30321","30322","30323","30324","30325","30326","30327","30328","30329","30330","30331","30332","30333","30334","30335","30336","30337","30338","30339","30340","30341","30342","30343","30344","30345","30346","30347","30348","30349","30350","30351","30352","30353","30354","30355","30356","30357","30358","30359","30360","30361","30362","30363","30364","30365","30366","30367","30368","30369","30370","30371","30372","30373","30374","30375","30376","30377","30378","30379","30380","30381","30382","30383","30384","30385","30386","30387","30388","30389","30390","30391","30392","30393","30394","30395","30396","30397","30398","30399","30400","30401","30402","30403","30404","30405","30406","30407","30408","30409","30410","30411","30412","30413","30414","30415","30416","30417","30418","30419","30420","30421","30422","30423","30424","30425","30426","30427","30428","30429","30430","30431","30432","30433","30434","30435","30436","30437","30438","30439","30440","30441","30442","30443","30444","30445","30446","30447","30448","30449","30450","30451","30452","30453","30454","30455","30456","30457","30458","30459","30460","30461","30462","30463","30464","30465","30466","30467","30468","30469","30470","30471","30472","30473","30474","30475","30476","30477","30478","30479","30480","30481","30482","30483","30484","30485","30486","30487","30488","30489","30490","30491","30492","30493","30494","30495","30496","30497","30498","30499","30500","30501","30502","30503","30504","30505","30506","30507","30508","30509","30510","30511","30512","30513","30514","30515","30516","30517","30518","30519","30520","30521","30522","30523","30524","30525","30526","30527","30528","30529","30530","30531","30532","30533","30534","30535","30536","30537","30538","30539","30540","30541","30542","30543","30544","30545","30546","30547","30548","30549","30550","30551","30552","30553","30554","30555","30556","30557","30558","30559","30560","30561","30562","30563","30564","30565","30566","30567","30568","30569","30570","30571","30572","30573","30574","30575","30576","30577","30578","30579","30580","30581","30582","30583","30584","30585","30586","30587","30588","30589","30590","30591","30592","30593","30594","30595","30596","30597","30598","30599","30600","30601","30602","30603","30604","30605","30606","30607","30608","30609","30610","30611","30612","30613","30614","30615","30616","30617","30618","30619","30620","30621","30622","30623","30624","30625","30626","30627","30628","30629","30630","30631","30632","30633","30634","30635","30636","30637","30638","30639","30640","30641","30642","30643","30644","30645","30646","30647","30648","30649","30650","30651","30652","30653","30654","30655","30656","30657","30658","30659","30660","30661","30662","30663","30664","30665","30666","30667","30668","30669","30670","30671","30672","30673","30674","30675","30676","30677","30678","30679","30680","30681","30682","30683","30684","30685","30686","30687","30688","30689","30690","30691","30692","30693","30694","30695","30696","30697","30698","30699","30700","30701","30702","30703","30704","30705","30706","30707","30708","30709","30710","30711","30712","30713","30714","30715","30716","30717","30718","30719","30720","30721","30722","30723","30724","30725","30726","30727","30728","30729","30730","30731","30732","30733","30734","30735","30736","30737","30738","30739","30740","30741","30742","30743","30744","30745","30746","30747","30748","30749","30750","30751","30752","30753","30754","30755","30756","30757","30758","30759","30760","30761","30762","30763","30764","30765","30766","30767","30768","30769","30770","30771","30772","30773","30774","30775","30776","30777","30778","30779","30780","30781","30782","30783","30784","30785","30786","30787","30788","30789","30790","30791","30792","30793","30794","30795","30796","30797","30798","30799","30800","30801","30802","30803","30804","30805","30806","30807","30808","30809","30810","30811","30812","30813","30814","30815","30816","30817","30818","30819","30820","30821","30822","30823","30824","30825","30826","30827","30828","30829","30830","30831","30832","30833","30834","30835","30836","30837","30838","30839","30840","30841","30842","30843","30844","30845","30846","30847","30848","30849","30850","30851","30852","30853","30854","30855","30856","30857","30858","30859","30860","30861","30862","30863","30864","30865","30866","30867","30868","30869","30870","30871","30872","30873","30874","30875","30876","30877","30878","30879","30880","30881","30882","30883","30884","30885","30886","30887","30888","30889","30890","30891","30892","30893","30894","30895","30896","30897","30898","30899","30900","30901","30902","30903","30904","30905","30906","30907","30908","30909","30910","30911","30912","30913","30914","30915","30916","30917","30918","30919","30920","30921","30922","30923","30924","30925","30926","30927","30928","30929","30930","30931","30932","30933","30934","30935","30936","30937","30938","30939","30940","30941","30942","30943","30944","30945","30946","30947","30948","30949","30950","30951","30952","30953","30954","30955","30956","30957","30958","30959","30960","30961","30962","30963","30964","30965","30966","30967","30968","30969","30970","30971","30972","30973","30974","30975","30976","30977","30978","30979","30980","30981","30982","30983","30984","30985","30986","30987","30988","30989","30990","30991","30992","30993","30994","30995","30996","30997","30998","30999","31000","31001","31002","31003","31004","31005","31006","31007","31008","31009","31010","31011","31012","31013","31014","31015","31016","31017","31018","31019","31020","31021","31022","31023","31024","31025","31026","31027","31028","31029","31030","31031","31032","31033","31034","31035","31036","31037","31038","31039","31040","31041","31042","31043","31044","31045","31046","31047","31048","31049","31050","31051","31052","31053","31054","31055","31056","31057","31058","31059","31060","31061","31062","31063","31064","31065","31066","31067","31068","31069","31070","31071","31072","31073","31074","31075","31076","31077","31078","31079","31080","31081","31082","31083","31084","31085","31086","31087","31088","31089","31090","31091","31092","31093","31094","31095","31096","31097","31098","31099","31100","31101","31102","31103","31104","31105","31106","31107","31108","31109","31110","31111","31112","31113","31114","31115","31116","31117","31118","31119","31120","31121","31122","31123","31124","31125","31126","31127","31128","31129","31130","31131","31132","31133","31134","31135","31136","31137","31138","31139","31140","31141","31142","31143","31144","31145","31146","31147","31148","31149","31150","31151","31152","31153","31154","31155","31156","31157","31158","31159","31160","31161","31162","31163","31164","31165","31166","31167","31168","31169","31170","31171","31172","31173","31174","31175","31176","31177","31178","31179","31180","31181","31182","31183","31184","31185","31186","31187","31188","31189","31190","31191","31192","31193","31194","31195","31196","31197","31198","31199","31200","31201","31202","31203","31204","31205","31206","31207","31208","31209","31210","31211","31212","31213","31214","31215","31216","31217","31218","31219","31220","31221","31222","31223","31224","31225","31226","31227","31228","31229","31230","31231","31232","31233","31234","31235","31236","31237","31238","31239","31240","31241","31242","31243","31244","31245","31246","31247","31248","31249","31250","31251","31252","31253","31254","31255","31256","31257","31258","31259","31260","31261","31262","31263","31264","31265","31266","31267","31268","31269","31270","31271","31272","31273","31274","31275","31276","31277","31278","31279","31280","31281","31282","31283","31284","31285","31286","31287","31288","31289","31290","31291","31292","31293","31294","31295","31296","31297","31298","31299","31300","31301","31302","31303","31304","31305","31306","31307","31308","31309","31310","31311","31312","31313","31314","31315","31316","31317","31318","31319","31320","31321","31322","31323","31324","31325","31326","31327","31328","31329","31330","31331","31332","31333","31334","31335","31336","31337","31338","31339","31340","31341","31342","31343","31344","31345","31346","31347","31348","31349","31350","31351","31352","31353","31354","31355","31356","31357","31358","31359","31360","31361","31362","31363","31364","31365","31366","31367","31368","31369","31370","31371","31372","31373","31374","31375","31376","31377","31378","31379","31380","31381","31382","31383","31384","31385","31386","31387","31388","31389","31390","31391","31392","31393","31394","31395","31396","31397","31398","31399","31400","31401","31402","31403","31404","31405","31406","31407","31408","31409","31410","31411","31412","31413","31414","31415","31416","31417","31418","31419","31420","31421","31422","31423","31424","31425","31426","31427","31428","31429","31430","31431","31432","31433","31434","31435","31436","31437","31438","31439","31440","31441","31442","31443","31444","31445","31446","31447","31448","31449","31450","31451","31452","31453","31454","31455","31456","31457","31458","31459","31460","31461","31462","31463","31464","31465","31466","31467","31468","31469","31470","31471","31472","31473","31474","31475","31476","31477","31478","31479","31480","31481","31482","31483","31484","31485","31486","31487","31488","31489","31490","31491","31492","31493","31494","31495","31496","31497","31498","31499","31500","31501","31502","31503","31504","31505","31506","31507","31508","31509","31510","31511","31512","31513","31514","31515","31516","31517","31518","31519","31520","31521","31522","31523","31524","31525","31526","31527","31528","31529","31530","31531","31532","31533","31534","31535","31536","31537","31538","31539","31540","31541","31542","31543","31544","31545","31546","31547","31548","31549","31550","31551","31552","31553","31554","31555","31556","31557","31558","31559","31560","31561","31562","31563","31564","31565","31566","31567","31568","31569","31570","31571","31572","31573","31574","31575","31576","31577","31578","31579","31580","31581","31582","31583","31584","31585","31586","31587","31588","31589","31590","31591","31592","31593","31594","31595","31596","31597","31598","31599","31600","31601","31602","31603","31604","31605","31606","31607","31608","31609","31610","31611","31612","31613","31614","31615","31616","31617","31618","31619","31620","31621","31622","31623","31624","31625","31626","31627","31628","31629","31630","31631","31632","31633","31634","31635","31636","31637","31638","31639","31640","31641","31642","31643","31644","31645","31646","31647","31648","31649","31650","31651","31652","31653","31654","31655","31656","31657","31658","31659","31660","31661","31662","31663","31664","31665","31666","31667","31668","31669","31670","31671","31672","31673","31674","31675","31676","31677","31678","31679","31680","31681","31682","31683","31684","31685","31686","31687","31688","31689","31690","31691","31692","31693","31694","31695","31696","31697","31698","31699","31700","31701","31702","31703","31704","31705","31706","31707","31708","31709","31710","31711","31712","31713","31714","31715","31716","31717","31718","31719","31720","31721","31722","31723","31724","31725","31726","31727","31728","31729","31730","31731","31732","31733","31734","31735","31736","31737","31738","31739","31740","31741","31742","31743","31744","31745","31746","31747","31748","31749","31750","31751","31752","31753","31754","31755","31756","31757","31758","31759","31760","31761","31762","31763","31764","31765","31766","31767","31768","31769","31770","31771","31772","31773","31774","31775","31776","31777","31778","31779","31780","31781","31782","31783","31784","31785","31786","31787","31788","31789","31790","31791","31792","31793","31794","31795","31796","31797","31798","31799","31800","31801","31802","31803","31804","31805","31806","31807","31808","31809","31810","31811","31812","31813","31814","31815","31816","31817","31818","31819","31820","31821","31822","31823","31824","31825","31826","31827","31828","31829","31830","31831","31832","31833","31834","31835","31836","31837","31838","31839","31840","31841","31842","31843","31844","31845","31846","31847","31848","31849","31850","31851","31852","31853","31854","31855","31856","31857","31858","31859","31860","31861","31862","31863","31864","31865","31866","31867","31868","31869","31870","31871","31872","31873","31874","31875","31876","31877","31878","31879","31880","31881","31882","31883","31884","31885","31886","31887","31888","31889","31890","31891","31892","31893","31894","31895","31896","31897","31898","31899","31900","31901","31902","31903","31904","31905","31906","31907","31908","31909","31910","31911","31912","31913","31914","31915","31916","31917","31918","31919","31920","31921","31922","31923","31924","31925","31926","31927","31928","31929","31930","31931","31932","31933","31934","31935","31936","31937","31938","31939","31940","31941","31942","31943","31944","31945","31946","31947","31948","31949","31950","31951","31952","31953","31954","31955","31956","31957","31958","31959","31960","31961","31962","31963","31964","31965","31966","31967","31968","31969","31970","31971","31972","31973","31974","31975","31976","31977","31978","31979","31980","31981","31982","31983","31984","31985","31986","31987","31988","31989","31990","31991","31992","31993","31994","31995","31996","31997","31998","31999","32000","32001","32002","32003","32004","32005","32006","32007","32008","32009","32010","32011","32012","32013","32014","32015","32016","32017","32018","32019","32020","32021","32022","32023","32024","32025","32026","32027","32028","32029","32030","32031","32032","32033","32034","32035","32036","32037","32038","32039","32040","32041","32042","32043","32044","32045","32046","32047","32048","32049","32050","32051","32052","32053","32054","32055","32056","32057","32058","32059","32060","32061","32062","32063","32064","32065","32066","32067","32068","32069","32070","32071","32072","32073","32074","32075","32076","32077","32078","32079","32080","32081","32082","32083","32084","32085","32086","32087","32088","32089","32090","32091","32092","32093","32094","32095","32096","32097","32098","32099","32100","32101","32102","32103","32104","32105","32106","32107","32108","32109","32110","32111","32112","32113","32114","32115","32116","32117","32118","32119","32120","32121","32122","32123","32124","32125","32126","32127","32128","32129","32130","32131","32132","32133","32134","32135","32136","32137","32138","32139","32140","32141","32142","32143","32144","32145","32146","32147","32148","32149","32150","32151","32152","32153","32154","32155","32156","32157","32158","32159","32160","32161","32162","32163","32164","32165","32166","32167","32168","32169","32170","32171","32172","32173","32174","32175","32176","32177","32178","32179","32180","32181","32182","32183","32184","32185","32186","32187","32188","32189","32190","32191","32192","32193","32194","32195","32196","32197","32198","32199","32200","32201","32202","32203","32204","32205","32206","32207","32208","32209","32210","32211","32212","32213","32214","32215","32216","32217","32218","32219","32220","32221","32222","32223","32224","32225","32226","32227","32228","32229","32230","32231","32232","32233","32234","32235","32236","32237","32238","32239","32240","32241","32242","32243","32244","32245","32246","32247","32248","32249","32250","32251","32252","32253","32254","32255","32256","32257","32258","32259","32260","32261","32262","32263","32264","32265","32266","32267","32268","32269","32270","32271","32272","32273","32274","32275","32276","32277","32278","32279","32280","32281","32282","32283","32284","32285","32286","32287","32288","32289","32290","32291","32292","32293","32294","32295","32296","32297","32298","32299","32300","32301","32302","32303","32304","32305","32306","32307","32308","32309","32310","32311","32312","32313","32314","32315","32316","32317","32318","32319","32320","32321","32322","32323","32324","32325","32326","32327","32328","32329","32330","32331","32332","32333","32334","32335","32336","32337","32338","32339","32340","32341","32342","32343","32344","32345","32346","32347","32348","32349","32350","32351","32352","32353","32354","32355","32356","32357","32358","32359","32360","32361","32362","32363","32364","32365","32366","32367","32368","32369","32370","32371","32372","32373","32374","32375","32376","32377","32378","32379","32380","32381","32382","32383","32384","32385","32386","32387","32388","32389","32390","32391","32392","32393","32394","32395","32396","32397","32398","32399","32400","32401","32402","32403","32404","32405","32406","32407","32408","32409","32410","32411","32412","32413","32414","32415","32416","32417","32418","32419","32420","32421","32422","32423","32424","32425","32426","32427","32428","32429","32430","32431","32432","32433","32434","32435","32436","32437","32438","32439","32440","32441","32442","32443","32444","32445","32446","32447","32448","32449","32450","32451","32452","32453","32454","32455","32456","32457","32458","32459","32460","32461","32462","32463","32464","32465","32466","32467","32468","32469","32470","32471","32472","32473","32474","32475","32476","32477","32478","32479","32480","32481","32482","32483","32484","32485","32486","32487","32488","32489","32490","32491","32492","32493","32494","32495","32496","32497","32498","32499","32500","32501","32502","32503","32504","32505","32506","32507","32508","32509","32510","32511","32512","32513","32514","32515","32516","32517","32518","32519","32520","32521","32522","32523","32524","32525","32526","32527","32528","32529","32530","32531","32532","32533","32534","32535","32536","32537","32538","32539","32540","32541","32542","32543","32544","32545","32546","32547","32548","32549","32550","32551","32552","32553","32554","32555","32556","32557","32558","32559","32560","32561","32562","32563","32564","32565","32566","32567","32568","32569","32570","32571","32572","32573","32574","32575","32576","32577","32578","32579","32580","32581","32582","32583","32584","32585","32586","32587","32588","32589","32590","32591","32592","32593","32594","32595","32596","32597","32598","32599","32600","32601","32602","32603","32604","32605","32606","32607","32608","32609","32610","32611","32612","32613","32614","32615","32616","32617","32618","32619","32620","32621","32622","32623","32624","32625","32626","32627","32628","32629","32630","32631","32632","32633","32634","32635","32636","32637","32638","32639","32640","32641","32642","32643","32644","32645","32646","32647","32648","32649","32650","32651","32652","32653","32654","32655","32656","32657","32658","32659","32660","32661","32662","32663","32664","32665","32666","32667","32668","32669","32670","32671","32672","32673","32674","32675","32676","32677","32678","32679","32680","32681","32682","32683","32684","32685","32686","32687","32688","32689","32690","32691","32692","32693","32694","32695","32696","32697","32698","32699","32700","32701","32702","32703","32704","32705","32706","32707","32708","32709","32710","32711","32712","32713","32714","32715","32716","32717","32718","32719","32720","32721","32722","32723","32724","32725","32726","32727","32728","32729","32730","32731","32732","32733","32734","32735","32736","32737","32738","32739","32740","32741","32742","32743","32744","32745","32746","32747","32748","32749","32750","32751","32752","32753","32754","32755","32756","32757","32758","32759","32760","32761","32762","32763","32764","32765","32766","32767","32768","32769","32770","32771","32772","32773","32774","32775","32776","32777","32778","32779","32780","32781","32782","32783","32784","32785","32786","32787","32788","32789","32790","32791","32792","32793","32794","32795","32796","32797","32798","32799","32800","32801","32802","32803","32804","32805","32806","32807","32808","32809","32810","32811","32812","32813","32814","32815","32816","32817","32818","32819","32820","32821","32822","32823","32824","32825","32826","32827","32828","32829","32830","32831","32832","32833","32834","32835","32836","32837","32838","32839","32840","32841","32842","32843","32844","32845","32846","32847","32848","32849","32850","32851","32852","32853","32854","32855","32856","32857","32858","32859","32860","32861","32862","32863","32864","32865","32866","32867","32868","32869","32870","32871","32872","32873","32874","32875","32876","32877","32878","32879","32880","32881","32882","32883","32884","32885","32886","32887","32888","32889","32890","32891","32892","32893","32894","32895","32896","32897","32898","32899","32900","32901","32902","32903","32904","32905","32906","32907","32908","32909","32910","32911","32912","32913","32914","32915","32916","32917","32918","32919","32920","32921","32922","32923","32924","32925","32926","32927","32928","32929","32930","32931","32932","32933","32934","32935","32936","32937","32938","32939","32940","32941","32942","32943","32944","32945","32946","32947","32948","32949","32950","32951","32952","32953","32954","32955","32956","32957","32958","32959","32960","32961","32962","32963","32964","32965","32966","32967","32968","32969","32970","32971","32972","32973","32974","32975","32976","32977","32978","32979","32980","32981","32982","32983","32984","32985","32986","32987","32988","32989","32990","32991","32992","32993","32994","32995","32996","32997","32998","32999","33000","33001","33002","33003","33004","33005","33006","33007","33008","33009","33010","33011","33012","33013","33014","33015","33016","33017","33018","33019","33020","33021","33022","33023","33024","33025","33026","33027","33028","33029","33030","33031","33032","33033","33034","33035","33036","33037","33038","33039","33040","33041","33042","33043","33044","33045","33046","33047","33048","33049","33050","33051","33052","33053","33054","33055","33056","33057","33058","33059","33060","33061","33062","33063","33064","33065","33066","33067","33068","33069","33070","33071","33072","33073","33074","33075","33076","33077","33078","33079","33080","33081","33082","33083","33084","33085","33086","33087","33088","33089","33090","33091","33092","33093","33094","33095","33096","33097","33098","33099","33100","33101","33102","33103","33104","33105","33106","33107","33108","33109","33110","33111","33112","33113","33114","33115","33116","33117","33118","33119","33120","33121","33122","33123","33124","33125","33126","33127","33128","33129","33130","33131","33132","33133","33134","33135","33136","33137","33138","33139","33140","33141","33142","33143","33144","33145","33146","33147","33148","33149","33150","33151","33152","33153","33154","33155","33156","33157","33158","33159","33160","33161","33162","33163","33164","33165","33166","33167","33168","33169","33170","33171","33172","33173","33174","33175","33176","33177","33178","33179","33180","33181","33182","33183","33184","33185","33186","33187","33188","33189","33190","33191","33192","33193","33194","33195","33196","33197","33198","33199","33200","33201","33202","33203","33204","33205","33206","33207","33208","33209","33210","33211","33212","33213","33214","33215","33216","33217","33218","33219","33220","33221","33222","33223","33224","33225","33226","33227","33228","33229","33230","33231","33232","33233","33234","33235","33236","33237","33238","33239","33240","33241","33242","33243","33244","33245","33246","33247","33248","33249","33250","33251","33252","33253","33254","33255","33256","33257","33258","33259","33260","33261","33262","33263","33264","33265","33266","33267","33268","33269","33270","33271","33272","33273","33274","33275","33276","33277","33278","33279","33280","33281","33282","33283","33284","33285","33286","33287","33288","33289","33290","33291","33292","33293","33294","33295","33296","33297","33298","33299","33300","33301","33302","33303","33304","33305","33306","33307","33308","33309","33310","33311","33312","33313","33314","33315","33316","33317","33318","33319","33320","33321","33322","33323","33324","33325","33326","33327","33328","33329","33330","33331","33332","33333","33334","33335","33336","33337","33338","33339","33340","33341","33342","33343","33344","33345","33346","33347","33348","33349","33350","33351","33352","33353","33354","33355","33356","33357","33358","33359","33360","33361","33362","33363","33364","33365","33366","33367","33368","33369","33370","33371","33372","33373","33374","33375","33376","33377","33378","33379","33380","33381","33382","33383","33384","33385","33386","33387","33388","33389","33390","33391","33392","33393","33394","33395","33396","33397","33398","33399","33400","33401","33402","33403","33404","33405","33406","33407","33408","33409","33410","33411","33412","33413","33414","33415","33416","33417","33418","33419","33420","33421","33422","33423","33424","33425","33426","33427","33428","33429","33430","33431","33432","33433","33434","33435","33436","33437","33438","33439","33440","33441","33442","33443","33444","33445","33446","33447","33448","33449","33450","33451","33452","33453","33454","33455","33456","33457","33458","33459","33460","33461","33462","33463","33464","33465","33466","33467","33468","33469","33470","33471","33472","33473","33474","33475","33476","33477","33478","33479","33480","33481","33482","33483","33484","33485","33486","33487","33488","33489","33490","33491","33492","33493","33494","33495","33496","33497","33498","33499","33500","33501","33502","33503","33504","33505","33506","33507","33508","33509","33510","33511","33512","33513","33514","33515","33516","33517","33518","33519","33520","33521","33522","33523","33524","33525","33526","33527","33528","33529","33530","33531","33532","33533","33534","33535","33536","33537","33538","33539","33540","33541","33542","33543","33544","33545","33546","33547","33548","33549","33550","33551","33552","33553","33554","33555","33556","33557","33558","33559","33560","33561","33562","33563","33564","33565","33566","33567","33568","33569","33570","33571","33572","33573","33574","33575","33576","33577","33578","33579","33580","33581","33582","33583","33584","33585","33586","33587","33588","33589","33590","33591","33592","33593","33594","33595","33596","33597","33598","33599","33600","33601","33602","33603","33604","33605","33606","33607","33608","33609","33610","33611","33612","33613","33614","33615","33616","33617","33618","33619","33620","33621","33622","33623","33624","33625","33626","33627","33628","33629","33630","33631","33632","33633","33634","33635","33636","33637","33638","33639","33640","33641","33642","33643","33644","33645","33646","33647","33648","33649","33650","33651","33652","33653","33654","33655","33656","33657","33658","33659","33660","33661","33662","33663","33664","33665","33666","33667","33668","33669","33670","33671","33672","33673","33674","33675","33676","33677","33678","33679","33680","33681","33682","33683","33684","33685","33686","33687","33688","33689","33690","33691","33692","33693","33694","33695","33696","33697","33698","33699","33700","33701","33702","33703","33704","33705","33706","33707","33708","33709","33710","33711","33712","33713","33714","33715","33716","33717","33718","33719","33720","33721","33722","33723","33724","33725","33726","33727","33728","33729","33730","33731","33732","33733","33734","33735","33736","33737","33738","33739","33740","33741","33742","33743","33744","33745","33746","33747","33748","33749","33750","33751","33752","33753","33754","33755","33756","33757","33758","33759","33760","33761","33762","33763","33764","33765","33766","33767","33768","33769","33770","33771","33772","33773","33774","33775","33776","33777","33778","33779","33780","33781","33782","33783","33784","33785","33786","33787","33788","33789","33790","33791","33792","33793","33794","33795","33796","33797","33798","33799","33800","33801","33802","33803","33804","33805","33806","33807","33808","33809","33810","33811","33812","33813","33814","33815","33816","33817","33818","33819","33820","33821","33822","33823","33824","33825","33826","33827","33828","33829","33830","33831","33832","33833","33834","33835","33836","33837","33838","33839","33840","33841","33842","33843","33844","33845","33846","33847","33848","33849","33850","33851","33852","33853","33854","33855","33856","33857","33858","33859","33860","33861","33862","33863","33864","33865","33866","33867","33868","33869","33870","33871","33872","33873","33874","33875","33876","33877","33878","33879","33880","33881","33882","33883","33884","33885","33886","33887","33888","33889","33890","33891","33892","33893","33894","33895","33896","33897","33898","33899","33900","33901","33902","33903","33904","33905","33906","33907","33908","33909","33910","33911","33912","33913","33914","33915","33916","33917","33918","33919","33920","33921","33922","33923","33924","33925","33926","33927","33928","33929","33930","33931","33932","33933","33934","33935","33936","33937","33938","33939","33940","33941","33942","33943","33944","33945","33946","33947","33948","33949","33950","33951","33952","33953","33954","33955","33956","33957","33958","33959","33960","33961","33962","33963","33964","33965","33966","33967","33968","33969","33970","33971","33972","33973","33974","33975","33976","33977","33978","33979","33980","33981","33982","33983","33984","33985","33986","33987","33988","33989","33990","33991","33992","33993","33994","33995","33996","33997","33998","33999","34000","34001","34002","34003","34004","34005","34006","34007","34008","34009","34010","34011","34012","34013","34014","34015","34016","34017","34018","34019","34020","34021","34022","34023","34024","34025","34026","34027","34028","34029","34030","34031","34032","34033","34034","34035","34036","34037","34038","34039","34040","34041","34042","34043","34044","34045","34046","34047","34048","34049","34050","34051","34052","34053","34054","34055","34056","34057","34058","34059","34060","34061","34062","34063","34064","34065","34066","34067","34068","34069","34070","34071","34072","34073","34074","34075","34076","34077","34078","34079","34080","34081","34082","34083","34084","34085","34086","34087","34088","34089","34090","34091","34092","34093","34094","34095","34096","34097","34098","34099","34100","34101","34102","34103","34104","34105","34106","34107","34108","34109","34110","34111","34112","34113","34114","34115","34116","34117","34118","34119","34120","34121","34122","34123","34124","34125","34126","34127","34128","34129","34130","34131","34132","34133","34134","34135","34136","34137","34138","34139","34140","34141","34142","34143","34144","34145","34146","34147","34148","34149","34150","34151","34152","34153","34154","34155","34156","34157","34158","34159","34160","34161","34162","34163","34164","34165","34166","34167","34168","34169","34170","34171","34172","34173","34174","34175","34176","34177","34178","34179","34180","34181","34182","34183","34184","34185","34186","34187","34188","34189","34190","34191","34192","34193","34194","34195","34196","34197","34198","34199","34200","34201","34202","34203","34204","34205","34206","34207","34208","34209","34210","34211","34212","34213","34214","34215","34216","34217","34218","34219","34220","34221","34222","34223","34224","34225","34226","34227","34228","34229","34230","34231","34232","34233","34234","34235","34236","34237","34238","34239","34240","34241","34242","34243","34244","34245","34246","34247","34248","34249","34250","34251","34252","34253","34254","34255","34256","34257","34258","34259","34260","34261","34262","34263","34264","34265","34266","34267","34268","34269","34270","34271","34272","34273","34274","34275","34276","34277","34278","34279","34280","34281","34282","34283","34284","34285","34286","34287","34288","34289","34290","34291","34292","34293","34294","34295","34296","34297","34298","34299","34300","34301","34302","34303","34304","34305","34306","34307","34308","34309","34310","34311","34312","34313","34314","34315","34316","34317","34318","34319","34320","34321","34322","34323","34324","34325","34326","34327","34328","34329","34330","34331","34332","34333","34334","34335","34336","34337","34338","34339","34340","34341","34342","34343","34344","34345","34346","34347","34348","34349","34350","34351","34352","34353","34354","34355","34356","34357","34358","34359","34360","34361","34362","34363","34364","34365","34366","34367","34368","34369","34370","34371","34372","34373","34374","34375","34376","34377","34378","34379","34380","34381","34382","34383","34384","34385","34386","34387","34388","34389","34390","34391","34392","34393","34394","34395","34396","34397","34398","34399","34400","34401","34402","34403","34404","34405","34406","34407","34408","34409","34410","34411","34412","34413","34414","34415","34416","34417","34418","34419","34420","34421","34422","34423","34424","34425","34426","34427","34428","34429","34430","34431","34432","34433","34434","34435","34436","34437","34438","34439","34440","34441","34442","34443","34444","34445","34446","34447","34448","34449","34450","34451","34452","34453","34454","34455","34456","34457","34458","34459","34460","34461","34462","34463","34464","34465","34466","34467","34468","34469","34470","34471","34472","34473","34474","34475","34476","34477","34478","34479","34480","34481","34482","34483","34484","34485","34486","34487","34488","34489","34490","34491","34492","34493","34494","34495","34496","34497","34498","34499","34500","34501","34502","34503","34504","34505","34506","34507","34508","34509","34510","34511","34512","34513","34514","34515","34516","34517","34518","34519","34520","34521","34522","34523","34524","34525","34526","34527","34528","34529","34530","34531","34532","34533","34534","34535","34536","34537","34538","34539","34540","34541","34542","34543","34544","34545","34546","34547","34548","34549","34550","34551","34552","34553","34554","34555","34556","34557","34558","34559","34560","34561","34562","34563","34564","34565","34566","34567","34568","34569","34570","34571","34572","34573","34574","34575","34576","34577","34578","34579","34580","34581","34582","34583","34584","34585","34586","34587","34588","34589","34590","34591","34592","34593","34594","34595","34596","34597","34598","34599","34600","34601","34602","34603","34604","34605","34606","34607","34608","34609","34610","34611","34612","34613","34614","34615","34616","34617","34618","34619","34620","34621","34622","34623","34624","34625","34626","34627","34628","34629","34630","34631","34632","34633","34634","34635","34636","34637","34638","34639","34640","34641","34642","34643","34644","34645","34646","34647","34648","34649","34650","34651","34652","34653","34654","34655","34656","34657","34658","34659","34660","34661","34662","34663","34664","34665","34666","34667","34668","34669","34670","34671","34672","34673","34674","34675","34676","34677","34678","34679","34680","34681","34682","34683","34684","34685","34686","34687","34688","34689","34690","34691","34692","34693","34694","34695","34696","34697","34698","34699","34700","34701","34702","34703","34704","34705","34706","34707","34708","34709","34710","34711","34712","34713","34714","34715","34716","34717","34718","34719","34720","34721","34722","34723","34724","34725","34726","34727","34728","34729","34730","34731","34732","34733","34734","34735","34736","34737","34738","34739","34740","34741","34742","34743","34744","34745","34746","34747","34748","34749","34750","34751","34752","34753","34754","34755","34756","34757","34758","34759","34760","34761","34762","34763","34764","34765","34766","34767","34768","34769","34770","34771","34772","34773","34774","34775","34776","34777","34778","34779","34780","34781","34782","34783","34784","34785","34786","34787","34788","34789","34790","34791","34792","34793","34794","34795","34796","34797","34798","34799","34800","34801","34802","34803","34804","34805","34806","34807","34808","34809","34810","34811","34812","34813","34814","34815","34816","34817","34818","34819","34820","34821","34822","34823","34824","34825","34826","34827","34828","34829","34830","34831","34832","34833","34834","34835","34836","34837","34838","34839","34840","34841","34842","34843","34844","34845","34846","34847","34848","34849","34850","34851","34852","34853","34854","34855","34856","34857","34858","34859","34860","34861","34862","34863","34864","34865","34866","34867","34868","34869","34870","34871","34872","34873","34874","34875","34876","34877","34878","34879","34880","34881","34882","34883","34884","34885","34886","34887","34888","34889","34890","34891","34892","34893","34894","34895","34896","34897","34898","34899","34900","34901","34902","34903","34904","34905","34906","34907","34908","34909","34910","34911","34912","34913","34914","34915","34916","34917","34918","34919","34920","34921","34922","34923","34924","34925","34926","34927","34928","34929","34930","34931","34932","34933","34934","34935","34936","34937","34938","34939","34940","34941","34942","34943","34944","34945","34946","34947","34948","34949","34950","34951","34952","34953","34954","34955","34956","34957","34958","34959","34960","34961","34962","34963","34964","34965","34966","34967","34968","34969","34970","34971","34972","34973","34974","34975","34976","34977","34978","34979","34980","34981","34982","34983","34984","34985","34986","34987","34988","34989","34990","34991","34992","34993","34994","34995","34996","34997","34998","34999","35000","35001","35002","35003","35004","35005","35006","35007","35008","35009","35010","35011","35012","35013","35014","35015","35016","35017","35018","35019","35020","35021","35022","35023","35024","35025","35026","35027","35028","35029","35030","35031","35032","35033","35034","35035","35036","35037","35038","35039","35040","35041","35042","35043","35044","35045","35046","35047","35048","35049","35050","35051","35052","35053","35054","35055","35056","35057","35058","35059","35060","35061","35062","35063","35064","35065","35066","35067","35068","35069","35070","35071","35072","35073","35074","35075","35076","35077","35078","35079","35080","35081","35082","35083","35084","35085","35086","35087","35088","35089","35090","35091","35092","35093","35094","35095","35096","35097","35098","35099","35100","35101","35102","35103","35104","35105","35106","35107","35108","35109","35110","35111","35112","35113","35114","35115","35116","35117","35118","35119","35120","35121","35122","35123","35124","35125","35126","35127","35128","35129","35130","35131","35132","35133","35134","35135","35136","35137","35138","35139","35140","35141","35142","35143","35144","35145","35146","35147","35148","35149","35150","35151","35152","35153","35154","35155","35156","35157","35158","35159","35160","35161","35162","35163","35164","35165","35166","35167","35168","35169","35170","35171","35172","35173","35174","35175","35176","35177","35178","35179","35180","35181","35182","35183","35184","35185","35186","35187","35188","35189","35190","35191","35192","35193","35194","35195","35196","35197","35198","35199","35200","35201","35202","35203","35204","35205","35206","35207","35208","35209","35210","35211","35212","35213","35214","35215","35216","35217","35218","35219","35220","35221","35222","35223","35224","35225","35226","35227","35228","35229","35230","35231","35232","35233","35234","35235","35236","35237","35238","35239","35240","35241","35242","35243","35244","35245","35246","35247","35248","35249","35250","35251","35252","35253","35254","35255","35256","35257","35258","35259","35260","35261","35262","35263","35264","35265","35266","35267","35268","35269","35270","35271","35272","35273","35274","35275","35276","35277","35278","35279","35280","35281","35282","35283","35284","35285","35286","35287","35288","35289","35290","35291","35292","35293","35294","35295","35296","35297","35298","35299","35300","35301","35302","35303","35304","35305","35306","35307","35308","35309","35310","35311","35312","35313","35314","35315","35316","35317","35318","35319","35320","35321","35322","35323","35324","35325","35326","35327","35328","35329","35330","35331","35332","35333","35334","35335","35336","35337","35338","35339","35340","35341","35342","35343","35344","35345","35346","35347","35348","35349","35350","35351","35352","35353","35354","35355","35356","35357","35358","35359","35360","35361","35362","35363","35364","35365","35366","35367","35368","35369","35370","35371","35372","35373","35374","35375","35376","35377","35378","35379","35380","35381","35382","35383","35384","35385","35386","35387","35388","35389","35390","35391","35392","35393","35394","35395","35396","35397","35398","35399","35400","35401","35402","35403","35404","35405","35406","35407","35408","35409","35410","35411","35412","35413","35414","35415","35416","35417","35418","35419","35420","35421","35422","35423","35424","35425","35426","35427","35428","35429","35430","35431","35432","35433","35434","35435","35436","35437","35438","35439","35440","35441","35442","35443","35444","35445","35446","35447","35448","35449","35450","35451","35452","35453","35454","35455","35456","35457","35458","35459","35460","35461","35462","35463","35464","35465","35466","35467","35468","35469","35470","35471","35472","35473","35474","35475","35476","35477","35478","35479","35480","35481","35482","35483","35484","35485","35486","35487","35488","35489","35490","35491","35492","35493","35494","35495","35496","35497","35498","35499","35500","35501","35502","35503","35504","35505","35506","35507","35508","35509","35510","35511","35512","35513","35514","35515","35516","35517","35518","35519","35520","35521","35522","35523","35524","35525","35526","35527","35528","35529","35530","35531","35532","35533","35534","35535","35536","35537","35538","35539","35540","35541","35542","35543","35544","35545","35546","35547","35548","35549","35550","35551","35552","35553","35554","35555","35556","35557","35558","35559","35560","35561","35562","35563","35564","35565","35566","35567","35568","35569","35570","35571","35572","35573","35574","35575","35576","35577","35578","35579","35580","35581","35582","35583","35584","35585","35586","35587","35588","35589","35590","35591","35592","35593","35594","35595","35596","35597","35598","35599","35600","35601","35602","35603","35604","35605","35606","35607","35608","35609","35610","35611","35612","35613","35614","35615","35616","35617","35618","35619","35620","35621","35622","35623","35624","35625","35626","35627","35628","35629","35630","35631","35632","35633","35634","35635","35636","35637","35638","35639","35640","35641","35642","35643","35644","35645","35646","35647","35648","35649","35650","35651","35652","35653","35654","35655","35656","35657","35658","35659","35660","35661","35662","35663","35664","35665","35666","35667","35668","35669","35670","35671","35672","35673","35674","35675","35676","35677","35678","35679","35680","35681","35682","35683","35684","35685","35686","35687","35688","35689","35690","35691","35692","35693","35694","35695","35696","35697","35698","35699","35700","35701","35702","35703","35704","35705","35706","35707","35708","35709","35710","35711","35712","35713","35714","35715","35716","35717","35718","35719","35720","35721","35722","35723","35724","35725","35726","35727","35728","35729","35730","35731","35732","35733","35734","35735","35736","35737","35738","35739","35740","35741","35742","35743","35744","35745","35746","35747","35748","35749","35750","35751","35752","35753","35754","35755","35756","35757","35758","35759","35760","35761","35762","35763","35764","35765","35766","35767","35768","35769","35770","35771","35772","35773","35774","35775","35776","35777","35778","35779","35780","35781","35782","35783","35784","35785","35786","35787","35788","35789","35790","35791","35792","35793","35794","35795","35796","35797","35798","35799","35800","35801","35802","35803","35804","35805","35806","35807","35808","35809","35810","35811","35812","35813","35814","35815","35816","35817","35818","35819","35820","35821","35822","35823","35824","35825","35826","35827","35828","35829","35830","35831","35832","35833","35834","35835","35836","35837","35838","35839","35840","35841","35842","35843","35844","35845","35846","35847","35848","35849","35850","35851","35852","35853","35854","35855","35856","35857","35858","35859","35860","35861","35862","35863","35864","35865","35866","35867","35868","35869","35870","35871","35872","35873","35874","35875","35876","35877","35878","35879","35880","35881","35882","35883","35884","35885","35886","35887","35888","35889","35890","35891","35892","35893","35894","35895","35896","35897","35898","35899","35900","35901","35902","35903","35904","35905","35906","35907","35908","35909","35910","35911","35912","35913","35914","35915","35916","35917","35918","35919","35920","35921","35922","35923","35924","35925","35926","35927","35928","35929","35930","35931","35932","35933","35934","35935","35936","35937","35938","35939","35940","35941","35942","35943","35944","35945","35946","35947","35948","35949","35950","35951","35952","35953","35954","35955","35956","35957","35958","35959","35960","35961","35962","35963","35964","35965","35966","35967","35968","35969","35970","35971","35972","35973","35974","35975","35976","35977","35978","35979","35980","35981","35982","35983","35984","35985","35986","35987","35988","35989","35990","35991","35992","35993","35994","35995","35996","35997","35998","35999","36000","36001","36002","36003","36004","36005","36006","36007","36008","36009","36010","36011","36012","36013","36014","36015","36016","36017","36018","36019","36020","36021","36022","36023","36024","36025","36026","36027","36028","36029","36030","36031","36032","36033","36034","36035","36036","36037","36038","36039","36040","36041","36042","36043","36044","36045","36046","36047","36048","36049","36050","36051","36052","36053","36054","36055","36056","36057","36058","36059","36060","36061","36062","36063","36064","36065","36066","36067","36068","36069","36070","36071","36072","36073","36074","36075","36076","36077","36078","36079","36080","36081","36082","36083","36084","36085","36086","36087","36088","36089","36090","36091","36092","36093","36094","36095","36096","36097","36098","36099","36100","36101","36102","36103","36104","36105","36106","36107","36108","36109","36110","36111","36112","36113","36114","36115","36116","36117","36118","36119","36120","36121","36122","36123","36124","36125","36126","36127","36128","36129","36130","36131","36132","36133","36134","36135","36136","36137","36138","36139","36140","36141","36142","36143","36144","36145","36146","36147","36148","36149","36150","36151","36152","36153","36154","36155","36156","36157","36158","36159","36160","36161","36162","36163","36164","36165","36166","36167","36168","36169","36170","36171","36172","36173","36174","36175","36176","36177","36178","36179","36180","36181","36182","36183","36184","36185","36186","36187","36188","36189","36190","36191","36192","36193","36194","36195","36196","36197","36198","36199","36200","36201","36202","36203","36204","36205","36206","36207","36208","36209","36210","36211","36212","36213","36214","36215","36216","36217","36218","36219","36220","36221","36222","36223","36224","36225","36226","36227","36228","36229","36230","36231","36232","36233","36234","36235","36236","36237","36238","36239","36240","36241","36242","36243","36244","36245","36246","36247","36248","36249","36250","36251","36252","36253","36254","36255","36256","36257","36258","36259","36260","36261","36262","36263","36264","36265","36266","36267","36268","36269","36270","36271","36272","36273","36274","36275","36276","36277","36278","36279","36280","36281","36282","36283","36284","36285","36286","36287","36288","36289","36290","36291","36292","36293","36294","36295","36296","36297","36298","36299","36300","36301","36302","36303","36304","36305","36306","36307","36308","36309","36310","36311","36312","36313","36314","36315","36316","36317","36318","36319","36320","36321","36322","36323","36324","36325","36326","36327","36328","36329","36330","36331","36332","36333","36334","36335","36336","36337","36338","36339","36340","36341","36342","36343","36344","36345","36346","36347","36348","36349","36350","36351","36352","36353","36354","36355","36356","36357","36358","36359","36360","36361","36362","36363","36364","36365","36366","36367","36368","36369","36370","36371","36372","36373","36374","36375","36376","36377","36378","36379","36380","36381","36382","36383","36384","36385","36386","36387","36388","36389","36390","36391","36392","36393","36394","36395","36396","36397","36398","36399","36400","36401","36402","36403","36404","36405","36406","36407","36408","36409","36410","36411","36412","36413","36414","36415","36416","36417","36418","36419","36420","36421","36422","36423","36424","36425","36426","36427","36428","36429","36430","36431","36432","36433","36434","36435","36436","36437","36438","36439","36440","36441","36442","36443","36444","36445","36446","36447","36448","36449","36450","36451","36452","36453","36454","36455","36456","36457","36458","36459","36460","36461","36462","36463","36464","36465","36466","36467","36468","36469","36470","36471","36472","36473","36474","36475","36476","36477","36478","36479","36480","36481","36482","36483","36484","36485","36486","36487","36488","36489","36490","36491","36492","36493","36494","36495","36496","36497","36498","36499","36500","36501","36502","36503","36504","36505","36506","36507","36508","36509","36510","36511","36512","36513","36514","36515","36516","36517","36518","36519","36520","36521","36522","36523","36524","36525","36526","36527","36528","36529","36530","36531","36532","36533","36534","36535","36536","36537","36538","36539","36540","36541","36542","36543","36544","36545","36546","36547","36548","36549","36550","36551","36552","36553","36554","36555","36556","36557","36558","36559","36560","36561","36562","36563","36564","36565","36566","36567","36568","36569","36570","36571","36572","36573","36574","36575","36576","36577","36578","36579","36580","36581","36582","36583","36584","36585","36586","36587","36588","36589","36590","36591","36592","36593","36594","36595","36596","36597","36598","36599","36600","36601","36602","36603","36604","36605","36606","36607","36608","36609","36610","36611","36612","36613","36614","36615","36616","36617","36618","36619","36620","36621","36622","36623","36624","36625","36626","36627","36628","36629","36630","36631","36632","36633","36634","36635","36636","36637","36638","36639","36640","36641","36642","36643","36644","36645","36646","36647","36648","36649","36650","36651","36652","36653","36654","36655","36656","36657","36658","36659","36660","36661","36662","36663","36664","36665","36666","36667","36668","36669","36670","36671","36672","36673","36674","36675","36676","36677","36678","36679","36680","36681","36682","36683","36684","36685","36686","36687","36688","36689","36690","36691","36692","36693","36694","36695","36696","36697","36698","36699","36700","36701","36702","36703","36704","36705","36706","36707","36708","36709","36710","36711","36712","36713","36714","36715","36716","36717","36718","36719","36720","36721","36722","36723","36724","36725","36726","36727","36728","36729","36730","36731","36732","36733","36734","36735","36736","36737","36738","36739","36740","36741","36742","36743","36744","36745","36746","36747","36748","36749","36750","36751","36752","36753","36754","36755","36756","36757","36758","36759","36760","36761","36762","36763","36764","36765","36766","36767","36768","36769","36770","36771","36772","36773","36774","36775","36776","36777","36778","36779","36780","36781","36782","36783","36784","36785","36786","36787","36788","36789","36790","36791","36792","36793","36794","36795","36796","36797","36798","36799","36800","36801","36802","36803","36804","36805","36806","36807","36808","36809","36810","36811","36812","36813","36814","36815","36816","36817","36818","36819","36820","36821","36822","36823","36824","36825","36826","36827","36828","36829","36830","36831","36832","36833","36834","36835","36836","36837","36838","36839","36840","36841","36842","36843","36844","36845","36846","36847","36848","36849","36850","36851","36852","36853","36854","36855","36856","36857","36858","36859","36860","36861","36862","36863","36864","36865","36866","36867","36868","36869","36870","36871","36872","36873","36874","36875","36876","36877","36878","36879","36880","36881","36882","36883","36884","36885","36886","36887","36888","36889","36890","36891","36892","36893","36894","36895","36896","36897","36898","36899","36900","36901","36902","36903","36904","36905","36906","36907","36908","36909","36910","36911","36912","36913","36914","36915","36916","36917","36918","36919","36920","36921","36922","36923","36924","36925","36926","36927","36928","36929","36930","36931","36932","36933","36934","36935","36936","36937","36938","36939","36940","36941","36942","36943","36944","36945","36946","36947","36948","36949","36950","36951","36952","36953","36954","36955","36956","36957","36958","36959","36960","36961","36962","36963","36964","36965","36966","36967","36968","36969","36970","36971","36972","36973","36974","36975","36976","36977","36978","36979","36980","36981","36982","36983","36984","36985","36986","36987","36988","36989","36990","36991","36992","36993","36994","36995","36996","36997","36998","36999","37000","37001","37002","37003","37004","37005","37006","37007","37008","37009","37010","37011","37012","37013","37014","37015","37016","37017","37018","37019","37020","37021","37022","37023","37024","37025","37026","37027","37028","37029","37030","37031","37032","37033","37034","37035","37036","37037","37038","37039","37040","37041","37042","37043","37044","37045","37046","37047","37048","37049","37050","37051","37052","37053","37054","37055","37056","37057","37058","37059","37060","37061","37062","37063","37064","37065","37066","37067","37068","37069","37070","37071","37072","37073","37074","37075","37076","37077","37078","37079","37080","37081","37082","37083","37084","37085","37086","37087","37088","37089","37090","37091","37092","37093","37094","37095","37096","37097","37098","37099","37100","37101","37102","37103","37104","37105","37106","37107","37108","37109","37110","37111","37112","37113","37114","37115","37116","37117","37118","37119","37120","37121","37122","37123","37124","37125","37126","37127","37128","37129","37130","37131","37132","37133","37134","37135","37136","37137","37138","37139","37140","37141","37142","37143","37144","37145","37146","37147","37148","37149","37150","37151","37152","37153","37154","37155","37156","37157","37158","37159","37160","37161","37162","37163","37164","37165","37166","37167","37168","37169","37170","37171","37172","37173","37174","37175","37176","37177","37178","37179","37180","37181","37182","37183","37184","37185","37186","37187","37188","37189","37190","37191","37192","37193","37194","37195","37196","37197","37198","37199","37200","37201","37202","37203","37204","37205","37206","37207","37208","37209","37210","37211","37212","37213","37214","37215","37216","37217","37218","37219","37220","37221","37222","37223","37224","37225","37226","37227","37228","37229","37230","37231","37232","37233","37234","37235","37236","37237","37238","37239","37240","37241","37242","37243","37244","37245","37246","37247","37248","37249","37250","37251","37252","37253","37254","37255","37256","37257","37258","37259","37260","37261","37262","37263","37264","37265","37266","37267","37268","37269","37270","37271","37272","37273","37274","37275","37276","37277","37278","37279","37280","37281","37282","37283","37284","37285","37286","37287","37288","37289","37290","37291","37292","37293","37294","37295","37296","37297","37298","37299","37300","37301","37302","37303","37304","37305","37306","37307","37308","37309","37310","37311","37312","37313","37314","37315","37316","37317","37318","37319","37320","37321","37322","37323","37324","37325","37326","37327","37328","37329","37330","37331","37332","37333","37334","37335","37336","37337","37338","37339","37340","37341","37342","37343","37344","37345","37346","37347","37348","37349","37350","37351","37352","37353","37354","37355","37356","37357","37358","37359","37360","37361","37362","37363","37364","37365","37366","37367","37368","37369","37370","37371","37372","37373","37374","37375","37376","37377","37378","37379","37380","37381","37382","37383","37384","37385","37386","37387","37388","37389","37390","37391","37392","37393","37394","37395","37396","37397","37398","37399","37400","37401","37402","37403","37404","37405","37406","37407","37408","37409","37410","37411","37412","37413","37414","37415","37416","37417","37418","37419","37420","37421","37422","37423","37424","37425","37426","37427","37428","37429","37430","37431","37432","37433","37434","37435","37436","37437","37438","37439","37440","37441","37442","37443","37444","37445","37446","37447","37448","37449","37450","37451","37452","37453","37454","37455","37456","37457","37458","37459","37460","37461","37462","37463","37464","37465","37466","37467","37468","37469","37470","37471","37472","37473","37474","37475","37476","37477","37478","37479","37480","37481","37482","37483","37484","37485","37486","37487","37488","37489","37490","37491","37492","37493","37494","37495","37496","37497","37498","37499","37500","37501","37502","37503","37504","37505","37506","37507","37508","37509","37510","37511","37512","37513","37514","37515","37516","37517","37518","37519","37520","37521","37522","37523","37524","37525","37526","37527","37528","37529","37530","37531","37532","37533","37534","37535","37536","37537","37538","37539","37540","37541","37542","37543","37544","37545","37546","37547","37548","37549","37550","37551","37552","37553","37554","37555","37556","37557","37558","37559","37560","37561","37562","37563","37564","37565","37566","37567","37568","37569","37570","37571","37572","37573","37574","37575","37576","37577","37578","37579","37580","37581","37582","37583","37584","37585","37586","37587","37588","37589","37590","37591","37592","37593","37594","37595","37596","37597","37598","37599","37600","37601","37602","37603","37604","37605","37606","37607","37608","37609","37610","37611","37612","37613","37614","37615","37616","37617","37618","37619","37620","37621","37622","37623","37624","37625","37626","37627","37628","37629","37630","37631","37632","37633","37634","37635","37636","37637","37638","37639","37640","37641","37642","37643","37644","37645","37646","37647","37648","37649","37650","37651","37652","37653","37654","37655","37656","37657","37658","37659","37660","37661","37662","37663","37664","37665","37666","37667","37668","37669","37670","37671","37672","37673","37674","37675","37676","37677","37678","37679","37680","37681","37682","37683","37684","37685","37686","37687","37688","37689","37690","37691","37692","37693","37694","37695","37696","37697","37698","37699","37700","37701","37702","37703","37704","37705","37706","37707","37708","37709","37710","37711","37712","37713","37714","37715","37716","37717","37718","37719","37720","37721","37722","37723","37724","37725","37726","37727","37728","37729","37730","37731","37732","37733","37734","37735","37736","37737","37738","37739","37740","37741","37742","37743","37744","37745","37746","37747","37748","37749","37750","37751","37752","37753","37754","37755","37756","37757","37758","37759","37760","37761","37762","37763","37764","37765","37766","37767","37768","37769","37770","37771","37772","37773","37774","37775","37776","37777","37778","37779","37780","37781","37782","37783","37784","37785","37786","37787","37788","37789","37790","37791","37792","37793","37794","37795","37796","37797","37798","37799","37800","37801","37802","37803","37804","37805","37806","37807","37808","37809","37810","37811","37812","37813","37814","37815","37816","37817","37818","37819","37820","37821","37822","37823","37824","37825","37826","37827","37828","37829","37830","37831","37832","37833","37834","37835","37836","37837","37838","37839","37840","37841","37842","37843","37844","37845","37846","37847","37848","37849","37850","37851","37852","37853","37854","37855","37856","37857","37858","37859","37860","37861","37862","37863","37864","37865","37866","37867","37868","37869","37870","37871","37872","37873","37874","37875","37876","37877","37878","37879","37880","37881","37882","37883","37884","37885","37886","37887","37888","37889","37890","37891","37892","37893","37894","37895","37896","37897","37898","37899","37900","37901","37902","37903","37904","37905","37906","37907","37908","37909","37910","37911","37912","37913","37914","37915","37916","37917","37918","37919","37920","37921","37922","37923","37924","37925","37926","37927","37928","37929","37930","37931","37932","37933","37934","37935","37936","37937","37938","37939","37940","37941","37942","37943","37944","37945","37946","37947","37948","37949","37950","37951","37952","37953","37954","37955","37956","37957","37958","37959","37960","37961","37962","37963","37964","37965","37966","37967","37968","37969","37970","37971","37972","37973","37974","37975","37976","37977","37978","37979","37980","37981","37982","37983","37984","37985","37986","37987","37988","37989","37990","37991","37992","37993","37994","37995","37996","37997","37998","37999","38000","38001","38002","38003","38004","38005","38006","38007","38008","38009","38010","38011","38012","38013","38014","38015","38016","38017","38018","38019","38020","38021","38022","38023","38024","38025","38026","38027","38028","38029","38030","38031","38032","38033","38034","38035","38036","38037","38038","38039","38040","38041","38042","38043","38044","38045","38046","38047","38048","38049","38050","38051","38052","38053","38054","38055","38056","38057","38058","38059","38060","38061","38062","38063","38064","38065","38066","38067","38068","38069","38070","38071","38072","38073","38074","38075","38076","38077","38078","38079","38080","38081","38082","38083","38084","38085","38086","38087","38088","38089","38090","38091","38092","38093","38094","38095","38096","38097","38098","38099","38100","38101","38102","38103","38104","38105","38106","38107","38108","38109","38110","38111","38112","38113","38114","38115","38116","38117","38118","38119","38120","38121","38122","38123","38124","38125","38126","38127","38128","38129","38130","38131","38132","38133","38134","38135","38136","38137","38138","38139","38140","38141","38142","38143","38144","38145","38146","38147","38148","38149","38150","38151","38152","38153","38154","38155","38156","38157","38158","38159","38160","38161","38162","38163","38164","38165","38166","38167","38168","38169","38170","38171","38172","38173","38174","38175","38176","38177","38178","38179","38180","38181","38182","38183","38184","38185","38186","38187","38188","38189","38190","38191","38192","38193","38194","38195","38196","38197","38198","38199","38200","38201","38202","38203","38204","38205","38206","38207","38208","38209","38210","38211","38212","38213","38214","38215","38216","38217","38218","38219","38220","38221","38222","38223","38224","38225","38226","38227","38228","38229","38230","38231","38232","38233","38234","38235","38236","38237","38238","38239","38240","38241","38242","38243","38244","38245","38246","38247","38248","38249","38250","38251","38252","38253","38254","38255","38256","38257","38258","38259","38260","38261","38262","38263","38264","38265","38266","38267","38268","38269","38270","38271","38272","38273","38274","38275","38276","38277","38278","38279","38280","38281","38282","38283","38284","38285","38286","38287","38288","38289","38290","38291","38292","38293","38294","38295","38296","38297","38298","38299","38300","38301","38302","38303","38304","38305","38306","38307","38308","38309","38310","38311","38312","38313","38314","38315","38316","38317","38318","38319","38320","38321","38322","38323","38324","38325","38326","38327","38328","38329","38330","38331","38332","38333","38334","38335","38336","38337","38338","38339","38340","38341","38342","38343","38344","38345","38346","38347","38348","38349","38350","38351","38352","38353","38354","38355","38356","38357","38358","38359","38360","38361","38362","38363","38364","38365","38366","38367","38368","38369","38370","38371","38372","38373","38374","38375","38376","38377","38378","38379","38380","38381","38382","38383","38384","38385","38386","38387","38388","38389","38390","38391","38392","38393","38394","38395","38396","38397","38398","38399","38400","38401","38402","38403","38404","38405","38406","38407","38408","38409","38410","38411","38412","38413","38414","38415","38416","38417","38418","38419","38420","38421","38422","38423","38424","38425","38426","38427","38428","38429","38430","38431","38432","38433","38434","38435","38436","38437","38438","38439","38440","38441","38442","38443","38444","38445","38446","38447","38448","38449","38450","38451","38452","38453","38454","38455","38456","38457","38458","38459","38460","38461","38462","38463","38464","38465","38466","38467","38468","38469","38470","38471","38472","38473","38474","38475","38476","38477","38478","38479","38480","38481","38482","38483","38484","38485","38486","38487","38488","38489","38490","38491","38492","38493","38494","38495","38496","38497","38498","38499","38500","38501","38502","38503","38504","38505","38506","38507","38508","38509","38510","38511","38512","38513","38514","38515","38516","38517","38518","38519","38520","38521","38522","38523","38524","38525","38526","38527","38528","38529","38530","38531","38532","38533","38534","38535","38536","38537","38538","38539","38540","38541","38542","38543","38544","38545","38546","38547","38548","38549","38550","38551","38552","38553","38554","38555","38556","38557","38558","38559","38560","38561","38562","38563","38564","38565","38566","38567","38568","38569","38570","38571","38572","38573","38574","38575","38576","38577","38578","38579","38580","38581","38582","38583","38584","38585","38586","38587","38588","38589","38590","38591","38592","38593","38594","38595","38596","38597","38598","38599","38600","38601","38602","38603","38604","38605","38606","38607","38608","38609","38610","38611","38612","38613","38614","38615","38616","38617","38618","38619","38620","38621","38622","38623","38624","38625","38626","38627","38628","38629","38630","38631","38632","38633","38634","38635","38636","38637","38638","38639","38640","38641","38642","38643","38644","38645","38646","38647","38648","38649","38650","38651","38652","38653","38654","38655","38656","38657","38658","38659","38660","38661","38662","38663","38664","38665","38666","38667","38668","38669","38670","38671","38672","38673","38674","38675","38676","38677","38678","38679","38680","38681","38682","38683","38684","38685","38686","38687","38688","38689","38690","38691","38692","38693","38694","38695","38696","38697","38698","38699","38700","38701","38702","38703","38704","38705","38706","38707","38708","38709","38710","38711","38712","38713","38714","38715","38716","38717","38718","38719","38720","38721","38722","38723","38724","38725","38726","38727","38728","38729","38730","38731","38732","38733","38734","38735","38736","38737","38738","38739","38740","38741","38742","38743","38744","38745","38746","38747","38748","38749","38750","38751","38752","38753","38754","38755","38756","38757","38758","38759","38760","38761","38762","38763","38764","38765","38766","38767","38768","38769","38770","38771","38772","38773","38774","38775","38776","38777","38778","38779","38780","38781","38782","38783","38784","38785","38786","38787","38788","38789","38790","38791","38792","38793","38794","38795","38796","38797","38798","38799","38800","38801","38802","38803","38804","38805","38806","38807","38808","38809","38810","38811","38812","38813","38814","38815","38816","38817","38818","38819","38820","38821","38822","38823","38824","38825","38826","38827","38828","38829","38830","38831","38832","38833","38834","38835","38836","38837","38838","38839","38840","38841","38842","38843","38844","38845","38846","38847","38848","38849","38850","38851","38852","38853","38854","38855","38856","38857","38858","38859","38860","38861","38862","38863","38864","38865","38866","38867","38868","38869","38870","38871","38872","38873","38874","38875","38876","38877","38878","38879","38880","38881","38882","38883","38884","38885","38886","38887","38888","38889","38890","38891","38892","38893","38894","38895","38896","38897","38898","38899","38900","38901","38902","38903","38904","38905","38906","38907","38908","38909","38910","38911","38912","38913","38914","38915","38916","38917","38918","38919","38920","38921","38922","38923","38924","38925","38926","38927","38928","38929","38930","38931","38932","38933","38934","38935","38936","38937","38938","38939","38940","38941","38942","38943","38944","38945","38946","38947","38948","38949","38950","38951","38952","38953","38954","38955","38956","38957","38958","38959","38960","38961","38962","38963","38964","38965","38966","38967","38968","38969","38970","38971","38972","38973","38974","38975","38976","38977","38978","38979","38980","38981","38982","38983","38984","38985","38986","38987","38988","38989","38990","38991","38992","38993","38994","38995","38996","38997","38998","38999","39000","39001","39002","39003","39004","39005","39006","39007","39008","39009","39010","39011","39012","39013","39014","39015","39016","39017","39018","39019","39020","39021","39022","39023","39024","39025","39026","39027","39028","39029","39030","39031","39032","39033","39034","39035","39036","39037","39038","39039","39040","39041","39042","39043","39044","39045","39046","39047","39048","39049","39050","39051","39052","39053","39054","39055","39056","39057","39058","39059","39060","39061","39062","39063","39064","39065","39066","39067","39068","39069","39070","39071","39072","39073","39074","39075","39076","39077","39078","39079","39080","39081","39082","39083","39084","39085","39086","39087","39088","39089","39090","39091","39092","39093","39094","39095","39096","39097","39098","39099","39100","39101","39102","39103","39104","39105","39106","39107","39108","39109","39110","39111","39112","39113","39114","39115","39116","39117","39118","39119","39120","39121","39122","39123","39124","39125","39126","39127","39128","39129","39130","39131","39132","39133","39134","39135","39136","39137","39138","39139","39140","39141","39142","39143","39144","39145","39146","39147","39148","39149","39150","39151","39152","39153","39154","39155","39156","39157","39158","39159","39160","39161","39162","39163","39164","39165","39166","39167","39168","39169","39170","39171","39172","39173","39174","39175","39176","39177","39178","39179","39180","39181","39182","39183","39184","39185","39186","39187","39188","39189","39190","39191","39192","39193","39194","39195","39196","39197","39198","39199","39200","39201","39202","39203","39204","39205","39206","39207","39208","39209","39210","39211","39212","39213","39214","39215","39216","39217","39218","39219","39220","39221","39222","39223","39224","39225","39226","39227","39228","39229","39230","39231","39232","39233","39234","39235","39236","39237","39238","39239","39240","39241","39242","39243","39244","39245","39246","39247","39248","39249","39250","39251","39252","39253","39254","39255","39256","39257","39258","39259","39260","39261","39262","39263","39264","39265","39266","39267","39268","39269","39270","39271","39272","39273","39274","39275","39276","39277","39278","39279","39280","39281","39282","39283","39284","39285","39286","39287","39288","39289","39290","39291","39292","39293","39294","39295","39296","39297","39298","39299","39300","39301","39302","39303","39304","39305","39306","39307","39308","39309","39310","39311","39312","39313","39314","39315","39316","39317","39318","39319","39320","39321","39322","39323","39324","39325","39326","39327","39328","39329","39330","39331","39332","39333","39334","39335","39336","39337","39338","39339","39340","39341","39342","39343","39344","39345","39346","39347","39348","39349","39350","39351","39352","39353","39354","39355","39356","39357","39358","39359","39360","39361","39362","39363","39364","39365","39366","39367","39368","39369","39370","39371","39372","39373","39374","39375","39376","39377","39378","39379","39380","39381","39382","39383","39384","39385","39386","39387","39388","39389","39390","39391","39392","39393","39394","39395","39396","39397","39398","39399","39400","39401","39402","39403","39404","39405","39406","39407","39408","39409","39410","39411","39412","39413","39414","39415","39416","39417","39418","39419","39420","39421","39422","39423","39424","39425","39426","39427","39428","39429","39430","39431","39432","39433","39434","39435","39436","39437","39438","39439","39440","39441","39442","39443","39444","39445","39446","39447","39448","39449","39450","39451","39452","39453","39454","39455","39456","39457","39458","39459","39460","39461","39462","39463","39464","39465","39466","39467","39468","39469","39470","39471","39472","39473","39474","39475","39476","39477","39478","39479","39480","39481","39482","39483","39484","39485","39486","39487","39488","39489","39490","39491","39492","39493","39494","39495","39496","39497","39498","39499","39500","39501","39502","39503","39504","39505","39506","39507","39508","39509","39510","39511","39512","39513","39514","39515","39516","39517","39518","39519","39520","39521","39522","39523","39524","39525","39526","39527","39528","39529","39530","39531","39532","39533","39534","39535","39536","39537","39538","39539","39540","39541","39542","39543","39544","39545","39546","39547","39548","39549","39550","39551","39552","39553","39554","39555","39556","39557","39558","39559","39560","39561","39562","39563","39564","39565","39566","39567","39568","39569","39570","39571","39572","39573","39574","39575","39576","39577","39578","39579","39580","39581","39582","39583","39584","39585","39586","39587","39588","39589","39590","39591","39592","39593","39594","39595","39596","39597","39598","39599","39600","39601","39602","39603","39604","39605","39606","39607","39608","39609","39610","39611","39612","39613","39614","39615","39616","39617","39618","39619","39620","39621","39622","39623","39624","39625","39626","39627","39628","39629","39630","39631","39632","39633","39634","39635","39636","39637","39638","39639","39640","39641","39642","39643","39644","39645","39646","39647","39648","39649","39650","39651","39652","39653","39654","39655","39656","39657","39658","39659","39660","39661","39662","39663","39664","39665","39666","39667","39668","39669","39670","39671","39672","39673","39674","39675","39676","39677","39678","39679","39680","39681","39682","39683","39684","39685","39686","39687","39688","39689","39690","39691","39692","39693","39694","39695","39696","39697","39698","39699","39700","39701","39702","39703","39704","39705","39706","39707","39708","39709","39710","39711","39712","39713","39714","39715","39716","39717","39718","39719","39720","39721","39722","39723","39724","39725","39726","39727","39728","39729","39730","39731","39732","39733","39734","39735","39736","39737","39738","39739","39740","39741","39742","39743","39744","39745","39746","39747","39748","39749","39750","39751","39752","39753","39754","39755","39756","39757","39758","39759","39760","39761","39762","39763","39764","39765","39766","39767","39768","39769","39770","39771","39772","39773","39774","39775","39776","39777","39778","39779","39780","39781","39782","39783","39784","39785","39786","39787","39788","39789","39790","39791","39792","39793","39794","39795","39796","39797","39798","39799","39800","39801","39802","39803","39804","39805","39806","39807","39808","39809","39810","39811","39812","39813","39814","39815","39816","39817","39818","39819","39820","39821","39822","39823","39824","39825","39826","39827","39828","39829","39830","39831","39832","39833","39834","39835","39836","39837","39838","39839","39840","39841","39842","39843","39844","39845","39846","39847","39848","39849","39850","39851","39852","39853","39854","39855","39856","39857","39858","39859","39860","39861","39862","39863","39864","39865","39866","39867","39868","39869","39870","39871","39872","39873","39874","39875","39876","39877","39878","39879","39880","39881","39882","39883","39884","39885","39886","39887","39888","39889","39890","39891","39892","39893","39894","39895","39896","39897","39898","39899","39900","39901","39902","39903","39904","39905","39906","39907","39908","39909","39910","39911","39912","39913","39914","39915","39916","39917","39918","39919","39920","39921","39922","39923","39924","39925","39926","39927","39928","39929","39930","39931","39932","39933","39934","39935","39936","39937","39938","39939","39940","39941","39942","39943","39944","39945","39946","39947","39948","39949","39950","39951","39952","39953","39954","39955","39956","39957","39958","39959","39960","39961","39962","39963","39964","39965","39966","39967","39968","39969","39970","39971","39972","39973","39974","39975","39976","39977","39978","39979","39980","39981","39982","39983","39984","39985","39986","39987","39988","39989","39990","39991","39992","39993","39994","39995","39996","39997","39998","39999","40000","40001","40002","40003","40004","40005","40006","40007","40008","40009","40010","40011","40012","40013","40014","40015","40016","40017","40018","40019","40020","40021","40022","40023","40024","40025","40026","40027","40028","40029","40030","40031","40032","40033","40034","40035","40036","40037","40038","40039","40040","40041","40042","40043","40044","40045","40046","40047","40048","40049","40050","40051","40052","40053","40054","40055","40056","40057","40058","40059","40060","40061","40062","40063","40064","40065","40066","40067","40068","40069","40070","40071","40072","40073","40074","40075","40076","40077","40078","40079","40080","40081","40082","40083","40084","40085","40086","40087","40088","40089","40090","40091","40092","40093","40094","40095","40096","40097","40098","40099","40100","40101","40102","40103","40104","40105","40106","40107","40108","40109","40110","40111","40112","40113","40114","40115","40116","40117","40118","40119","40120","40121","40122","40123","40124","40125","40126","40127","40128","40129","40130","40131","40132","40133","40134","40135","40136","40137","40138","40139","40140","40141","40142","40143","40144","40145","40146","40147","40148","40149","40150","40151","40152","40153","40154","40155","40156","40157","40158","40159","40160","40161","40162","40163","40164","40165","40166","40167","40168","40169","40170","40171","40172","40173","40174","40175","40176","40177","40178","40179","40180","40181","40182","40183","40184","40185","40186","40187","40188","40189","40190","40191","40192","40193","40194","40195","40196","40197","40198","40199","40200","40201","40202","40203","40204","40205","40206","40207","40208","40209","40210","40211","40212","40213","40214","40215","40216","40217","40218","40219","40220","40221","40222","40223","40224","40225","40226","40227","40228","40229","40230","40231","40232","40233","40234","40235","40236","40237","40238","40239","40240","40241","40242","40243","40244","40245","40246","40247","40248","40249","40250","40251","40252","40253","40254","40255","40256","40257","40258","40259","40260","40261","40262","40263","40264","40265","40266","40267","40268","40269","40270","40271","40272","40273","40274","40275","40276","40277","40278","40279","40280","40281","40282","40283","40284","40285","40286","40287","40288","40289","40290","40291","40292","40293","40294","40295","40296","40297","40298","40299","40300","40301","40302","40303","40304","40305","40306","40307","40308","40309","40310","40311","40312","40313","40314","40315","40316","40317","40318","40319","40320","40321","40322","40323","40324","40325","40326","40327","40328","40329","40330","40331","40332","40333","40334","40335","40336","40337","40338","40339","40340","40341","40342","40343","40344","40345","40346","40347","40348","40349","40350","40351","40352","40353","40354","40355","40356","40357","40358","40359","40360","40361","40362","40363","40364","40365","40366","40367","40368","40369","40370","40371","40372","40373","40374","40375","40376","40377","40378","40379","40380","40381","40382","40383","40384","40385","40386","40387","40388","40389","40390","40391","40392","40393","40394","40395","40396","40397","40398","40399","40400","40401","40402","40403","40404","40405","40406","40407","40408","40409","40410","40411","40412","40413","40414","40415","40416","40417","40418","40419","40420","40421","40422","40423","40424","40425","40426","40427","40428","40429","40430","40431","40432","40433","40434","40435","40436","40437","40438","40439","40440","40441","40442","40443","40444","40445","40446","40447","40448","40449","40450","40451","40452","40453","40454","40455","40456","40457","40458","40459","40460","40461","40462","40463","40464","40465","40466","40467","40468","40469","40470","40471","40472","40473","40474","40475","40476","40477","40478","40479","40480","40481","40482","40483","40484","40485","40486","40487","40488","40489","40490","40491","40492","40493","40494","40495","40496","40497","40498","40499","40500","40501","40502","40503","40504","40505","40506","40507","40508","40509","40510","40511","40512","40513","40514","40515","40516","40517","40518","40519","40520","40521","40522","40523","40524","40525","40526","40527","40528","40529","40530","40531","40532","40533","40534","40535","40536","40537","40538","40539","40540","40541","40542","40543","40544","40545","40546","40547","40548","40549","40550","40551","40552","40553","40554","40555","40556","40557","40558","40559","40560","40561","40562","40563","40564","40565","40566","40567","40568","40569","40570","40571","40572","40573","40574","40575","40576","40577","40578","40579","40580","40581","40582","40583","40584","40585","40586","40587","40588","40589","40590","40591","40592","40593","40594","40595","40596","40597","40598","40599","40600","40601","40602","40603","40604","40605","40606","40607","40608","40609","40610","40611","40612","40613","40614","40615","40616","40617","40618","40619","40620","40621","40622","40623","40624","40625","40626","40627","40628","40629","40630","40631","40632","40633","40634","40635","40636","40637","40638","40639","40640","40641","40642","40643","40644","40645","40646","40647","40648","40649","40650","40651","40652","40653","40654","40655","40656","40657","40658","40659","40660","40661","40662","40663","40664","40665","40666","40667","40668","40669","40670","40671","40672","40673","40674","40675","40676","40677","40678","40679","40680","40681","40682","40683","40684","40685","40686","40687","40688","40689","40690","40691","40692","40693","40694","40695","40696","40697","40698","40699","40700","40701","40702","40703","40704","40705","40706","40707","40708","40709","40710","40711","40712","40713","40714","40715","40716","40717","40718","40719","40720","40721","40722","40723","40724","40725","40726","40727","40728","40729","40730","40731","40732","40733","40734","40735","40736","40737","40738","40739","40740","40741","40742","40743","40744","40745","40746","40747","40748","40749","40750","40751","40752","40753","40754","40755","40756","40757","40758","40759","40760","40761","40762","40763","40764","40765","40766","40767","40768","40769","40770","40771","40772","40773","40774","40775","40776","40777","40778","40779","40780","40781","40782","40783","40784","40785","40786","40787","40788","40789","40790","40791","40792","40793","40794","40795","40796","40797","40798","40799","40800","40801","40802","40803","40804","40805","40806","40807","40808","40809","40810","40811","40812","40813","40814","40815","40816","40817","40818","40819","40820","40821","40822","40823","40824","40825","40826","40827","40828","40829","40830","40831","40832","40833","40834","40835","40836","40837","40838","40839","40840","40841","40842","40843","40844","40845","40846","40847","40848","40849","40850","40851","40852","40853","40854","40855","40856","40857","40858","40859","40860","40861","40862","40863","40864","40865","40866","40867","40868","40869","40870","40871","40872","40873","40874","40875","40876","40877","40878","40879","40880","40881","40882","40883","40884","40885","40886","40887","40888","40889","40890","40891","40892","40893","40894","40895","40896","40897","40898","40899","40900","40901","40902","40903","40904","40905","40906","40907","40908","40909","40910","40911","40912","40913","40914","40915","40916","40917","40918","40919","40920","40921","40922","40923","40924","40925","40926","40927","40928","40929","40930","40931","40932","40933","40934","40935","40936","40937","40938","40939","40940","40941","40942","40943","40944","40945","40946","40947","40948","40949","40950","40951","40952","40953","40954","40955","40956","40957","40958","40959","40960","40961","40962","40963","40964","40965","40966","40967","40968","40969","40970","40971","40972","40973","40974","40975","40976","40977","40978","40979","40980","40981","40982","40983","40984","40985","40986","40987","40988","40989","40990","40991","40992","40993","40994","40995","40996","40997","40998","40999","41000","41001","41002","41003","41004","41005","41006","41007","41008","41009","41010","41011","41012","41013","41014","41015","41016","41017","41018","41019","41020","41021","41022","41023","41024","41025","41026","41027","41028","41029","41030","41031","41032","41033","41034","41035","41036","41037","41038","41039","41040","41041","41042","41043","41044","41045","41046","41047","41048","41049","41050","41051","41052","41053","41054","41055","41056","41057","41058","41059","41060","41061","41062","41063","41064","41065","41066","41067","41068","41069","41070","41071","41072","41073","41074","41075","41076","41077","41078","41079","41080","41081","41082","41083","41084","41085","41086","41087","41088","41089","41090","41091","41092","41093","41094","41095","41096","41097","41098","41099","41100","41101","41102","41103","41104","41105","41106","41107","41108","41109","41110","41111","41112","41113","41114","41115","41116","41117","41118","41119","41120","41121","41122","41123","41124","41125","41126","41127","41128","41129","41130","41131","41132","41133","41134","41135","41136","41137","41138","41139","41140","41141","41142","41143","41144","41145","41146","41147","41148","41149","41150","41151","41152","41153","41154","41155","41156","41157","41158","41159","41160","41161","41162","41163","41164","41165","41166","41167","41168","41169","41170","41171","41172","41173","41174","41175","41176","41177","41178","41179","41180","41181","41182","41183","41184","41185","41186","41187","41188","41189","41190","41191","41192","41193","41194","41195","41196","41197","41198","41199","41200","41201","41202","41203","41204","41205","41206","41207","41208","41209","41210","41211","41212","41213","41214","41215","41216","41217","41218","41219","41220","41221","41222","41223","41224","41225","41226","41227","41228","41229","41230","41231","41232","41233","41234","41235","41236","41237","41238","41239","41240","41241","41242","41243","41244","41245","41246","41247","41248","41249","41250","41251","41252","41253","41254","41255","41256","41257","41258","41259","41260","41261","41262","41263","41264","41265","41266","41267","41268","41269","41270","41271","41272","41273","41274","41275","41276","41277","41278","41279","41280","41281","41282","41283","41284","41285","41286","41287","41288","41289","41290","41291","41292","41293","41294","41295","41296","41297","41298","41299","41300","41301","41302","41303","41304","41305","41306","41307","41308","41309","41310","41311","41312","41313","41314","41315","41316","41317","41318","41319","41320","41321","41322","41323","41324","41325","41326","41327","41328","41329","41330","41331","41332","41333","41334","41335","41336","41337","41338","41339","41340","41341","41342","41343","41344","41345","41346","41347","41348","41349","41350","41351","41352","41353","41354","41355","41356","41357","41358","41359","41360","41361","41362","41363","41364","41365","41366","41367","41368","41369","41370","41371","41372","41373","41374","41375","41376","41377","41378","41379","41380","41381","41382","41383","41384","41385","41386","41387","41388","41389","41390","41391","41392","41393","41394","41395","41396","41397","41398","41399","41400","41401","41402","41403","41404","41405","41406","41407","41408","41409","41410","41411","41412","41413","41414","41415","41416","41417","41418","41419","41420","41421","41422","41423","41424","41425","41426","41427","41428","41429","41430","41431","41432","41433","41434","41435","41436","41437","41438","41439","41440","41441","41442","41443","41444","41445","41446","41447","41448","41449","41450","41451","41452","41453","41454","41455","41456","41457","41458","41459","41460","41461","41462","41463","41464","41465","41466","41467","41468","41469","41470","41471","41472","41473","41474","41475","41476","41477","41478","41479","41480","41481","41482","41483","41484","41485","41486","41487","41488","41489","41490","41491","41492","41493","41494","41495","41496","41497","41498","41499","41500","41501","41502","41503","41504","41505","41506","41507","41508","41509","41510","41511","41512","41513","41514","41515","41516","41517","41518","41519","41520","41521","41522","41523","41524","41525","41526","41527","41528","41529","41530","41531","41532","41533","41534","41535","41536","41537","41538","41539","41540","41541","41542","41543","41544","41545","41546","41547","41548","41549","41550","41551","41552","41553","41554","41555","41556","41557","41558","41559","41560","41561","41562","41563","41564","41565","41566","41567","41568","41569","41570","41571","41572","41573","41574","41575","41576","41577","41578","41579","41580","41581","41582","41583","41584","41585","41586","41587","41588","41589","41590","41591","41592","41593","41594","41595","41596","41597","41598","41599","41600","41601","41602","41603","41604","41605","41606","41607","41608","41609","41610","41611","41612","41613","41614","41615","41616","41617","41618","41619","41620","41621","41622","41623","41624","41625","41626","41627","41628","41629","41630","41631","41632","41633","41634","41635","41636","41637","41638","41639","41640","41641","41642","41643","41644","41645","41646","41647","41648","41649","41650","41651","41652","41653","41654","41655","41656","41657","41658","41659","41660","41661","41662","41663","41664","41665","41666","41667","41668","41669","41670","41671","41672","41673","41674","41675","41676","41677","41678","41679","41680","41681","41682","41683","41684","41685","41686","41687","41688","41689","41690","41691","41692","41693","41694","41695","41696","41697","41698","41699","41700","41701","41702","41703","41704","41705","41706","41707","41708","41709","41710","41711","41712","41713","41714","41715","41716","41717","41718","41719","41720","41721","41722","41723","41724","41725","41726","41727","41728","41729","41730","41731","41732","41733","41734","41735","41736","41737","41738","41739","41740","41741","41742","41743","41744","41745","41746","41747","41748","41749","41750","41751","41752","41753","41754","41755","41756","41757","41758","41759","41760","41761","41762","41763","41764","41765","41766","41767","41768","41769","41770","41771","41772","41773","41774","41775","41776","41777","41778","41779","41780","41781","41782","41783","41784","41785","41786","41787","41788","41789","41790","41791","41792","41793","41794","41795","41796","41797","41798","41799","41800","41801","41802","41803","41804","41805","41806","41807","41808","41809","41810","41811","41812","41813","41814","41815","41816","41817","41818","41819","41820","41821","41822","41823","41824","41825","41826","41827","41828","41829","41830","41831","41832","41833","41834","41835","41836","41837","41838","41839","41840","41841","41842","41843","41844","41845","41846","41847","41848","41849","41850","41851","41852","41853","41854","41855","41856","41857","41858","41859","41860","41861","41862","41863","41864","41865","41866","41867","41868","41869","41870","41871","41872","41873","41874","41875","41876","41877","41878","41879","41880","41881","41882","41883","41884","41885","41886","41887","41888","41889","41890","41891","41892","41893","41894","41895","41896","41897","41898","41899","41900","41901","41902","41903","41904","41905","41906","41907","41908","41909","41910","41911","41912","41913","41914","41915","41916","41917","41918","41919","41920","41921","41922","41923","41924","41925","41926","41927","41928","41929","41930","41931","41932","41933","41934","41935","41936","41937","41938","41939","41940","41941","41942","41943","41944","41945","41946","41947","41948","41949","41950","41951","41952","41953","41954","41955","41956","41957","41958","41959","41960","41961","41962","41963","41964","41965","41966","41967","41968","41969","41970","41971","41972","41973","41974","41975","41976","41977","41978","41979","41980","41981","41982","41983","41984","41985","41986","41987","41988","41989","41990","41991","41992","41993","41994","41995","41996","41997","41998","41999","42000","42001","42002","42003","42004","42005","42006","42007","42008","42009","42010","42011","42012","42013","42014","42015","42016","42017","42018","42019","42020","42021","42022","42023","42024","42025","42026","42027","42028","42029","42030","42031","42032","42033","42034","42035","42036","42037","42038","42039","42040","42041","42042","42043","42044","42045","42046","42047","42048","42049","42050","42051","42052","42053","42054","42055","42056","42057","42058","42059","42060","42061","42062","42063","42064","42065","42066","42067","42068","42069","42070","42071","42072","42073","42074","42075","42076","42077","42078","42079","42080","42081","42082","42083","42084","42085","42086","42087","42088","42089","42090","42091","42092","42093","42094","42095","42096","42097","42098","42099","42100","42101","42102","42103","42104","42105","42106","42107","42108","42109","42110","42111","42112","42113","42114","42115","42116","42117","42118","42119","42120","42121","42122","42123","42124","42125","42126","42127","42128","42129","42130","42131","42132","42133","42134","42135","42136","42137","42138","42139","42140","42141","42142","42143","42144","42145","42146","42147","42148","42149","42150","42151","42152","42153","42154","42155","42156","42157","42158","42159","42160","42161","42162","42163","42164","42165","42166","42167","42168","42169","42170","42171","42172","42173","42174","42175","42176","42177","42178","42179","42180","42181","42182","42183","42184","42185","42186","42187","42188","42189","42190","42191","42192","42193","42194","42195","42196","42197","42198","42199","42200","42201","42202","42203","42204","42205","42206","42207","42208","42209","42210","42211","42212","42213","42214","42215","42216","42217","42218","42219","42220","42221","42222","42223","42224","42225","42226","42227","42228","42229","42230","42231","42232","42233","42234","42235","42236","42237","42238","42239","42240","42241","42242","42243","42244","42245","42246","42247","42248","42249","42250","42251","42252","42253","42254","42255","42256","42257","42258","42259","42260","42261","42262","42263","42264","42265","42266","42267","42268","42269","42270","42271","42272","42273","42274","42275","42276","42277","42278","42279","42280","42281","42282","42283","42284","42285","42286","42287","42288","42289","42290","42291","42292","42293","42294","42295","42296","42297","42298","42299","42300","42301","42302","42303","42304","42305","42306","42307","42308","42309","42310","42311","42312","42313","42314","42315","42316","42317","42318","42319","42320","42321","42322","42323","42324","42325","42326","42327","42328","42329","42330","42331","42332","42333","42334","42335","42336","42337","42338","42339","42340","42341","42342","42343","42344","42345","42346","42347","42348","42349","42350","42351","42352","42353","42354","42355","42356","42357","42358","42359","42360","42361","42362","42363","42364","42365","42366","42367","42368","42369","42370","42371","42372","42373","42374","42375","42376","42377","42378","42379","42380","42381","42382","42383","42384","42385","42386","42387","42388","42389","42390","42391","42392","42393","42394","42395","42396","42397","42398","42399","42400","42401","42402","42403","42404","42405","42406","42407","42408","42409","42410","42411","42412","42413","42414","42415","42416","42417","42418","42419","42420","42421","42422","42423","42424","42425","42426","42427","42428","42429","42430","42431","42432","42433","42434","42435","42436","42437","42438","42439","42440","42441","42442","42443","42444","42445","42446","42447","42448","42449","42450","42451","42452","42453","42454","42455","42456","42457","42458","42459","42460","42461","42462","42463","42464","42465","42466","42467","42468","42469","42470","42471","42472","42473","42474","42475","42476","42477","42478","42479","42480","42481","42482","42483","42484","42485","42486","42487","42488","42489","42490","42491","42492","42493","42494","42495","42496","42497","42498","42499","42500","42501","42502","42503","42504","42505","42506","42507","42508","42509","42510","42511","42512","42513","42514","42515","42516","42517","42518","42519","42520","42521","42522","42523","42524","42525","42526","42527","42528","42529","42530","42531","42532","42533","42534","42535","42536","42537","42538","42539","42540","42541","42542","42543","42544","42545","42546","42547","42548","42549","42550","42551","42552","42553","42554","42555","42556","42557","42558","42559","42560","42561","42562","42563","42564","42565","42566","42567","42568","42569","42570","42571","42572","42573","42574","42575","42576","42577","42578","42579","42580","42581","42582","42583","42584","42585","42586","42587","42588","42589","42590","42591","42592","42593","42594","42595","42596","42597","42598","42599","42600","42601","42602","42603","42604","42605","42606","42607","42608","42609","42610","42611","42612","42613","42614","42615","42616","42617","42618","42619","42620","42621","42622","42623","42624","42625","42626","42627","42628","42629","42630","42631","42632","42633","42634","42635","42636","42637","42638","42639","42640","42641","42642","42643","42644","42645","42646","42647","42648","42649","42650","42651","42652","42653","42654","42655","42656","42657","42658","42659","42660","42661","42662","42663","42664","42665","42666","42667","42668","42669","42670","42671","42672","42673","42674","42675","42676","42677","42678","42679","42680","42681","42682","42683","42684","42685","42686","42687","42688","42689","42690","42691","42692","42693","42694","42695","42696","42697","42698","42699","42700","42701","42702","42703","42704","42705","42706","42707","42708","42709","42710","42711","42712","42713","42714","42715","42716","42717","42718","42719","42720","42721","42722","42723","42724","42725","42726","42727","42728","42729","42730","42731","42732","42733","42734","42735","42736","42737","42738","42739","42740","42741","42742","42743","42744","42745","42746","42747","42748","42749","42750","42751","42752","42753","42754","42755","42756","42757","42758","42759","42760","42761","42762","42763","42764","42765","42766","42767","42768","42769","42770","42771","42772","42773","42774","42775","42776","42777","42778","42779","42780","42781","42782","42783","42784","42785","42786","42787","42788","42789","42790","42791","42792","42793","42794","42795","42796","42797","42798","42799","42800","42801","42802","42803","42804","42805","42806","42807","42808","42809","42810","42811","42812","42813","42814","42815","42816","42817","42818","42819","42820","42821","42822","42823","42824","42825","42826","42827","42828","42829","42830","42831","42832","42833","42834","42835","42836","42837","42838","42839","42840","42841","42842","42843","42844","42845","42846","42847","42848","42849","42850","42851","42852","42853","42854","42855","42856","42857","42858","42859","42860","42861","42862","42863","42864","42865","42866","42867","42868","42869","42870","42871","42872","42873","42874","42875","42876","42877","42878","42879","42880","42881","42882","42883","42884","42885","42886","42887","42888","42889","42890","42891","42892","42893","42894","42895","42896","42897","42898","42899","42900","42901","42902","42903","42904","42905","42906","42907","42908","42909","42910","42911","42912","42913","42914","42915","42916","42917","42918","42919","42920","42921","42922","42923","42924","42925","42926","42927","42928","42929","42930","42931","42932","42933","42934","42935","42936","42937","42938","42939","42940","42941","42942","42943","42944","42945","42946","42947","42948","42949","42950","42951","42952","42953","42954","42955","42956","42957","42958","42959","42960","42961","42962","42963","42964","42965","42966","42967","42968","42969","42970","42971","42972","42973","42974","42975","42976","42977","42978","42979","42980","42981","42982","42983","42984","42985","42986","42987","42988","42989","42990","42991","42992","42993","42994","42995","42996","42997","42998","42999","43000","43001","43002","43003","43004","43005","43006","43007","43008","43009","43010","43011","43012","43013","43014","43015","43016","43017","43018","43019","43020","43021","43022","43023","43024","43025","43026","43027","43028","43029","43030","43031","43032","43033","43034","43035","43036","43037","43038","43039","43040","43041","43042","43043","43044","43045","43046","43047","43048","43049","43050","43051","43052","43053","43054","43055","43056","43057","43058","43059","43060","43061","43062","43063","43064","43065","43066","43067","43068","43069","43070","43071","43072","43073","43074","43075","43076","43077","43078","43079","43080","43081","43082","43083","43084","43085","43086","43087","43088","43089","43090","43091","43092","43093","43094","43095","43096","43097","43098","43099","43100","43101","43102","43103","43104","43105","43106","43107","43108","43109","43110","43111","43112","43113","43114","43115","43116","43117","43118","43119","43120","43121","43122","43123","43124","43125","43126","43127","43128","43129","43130","43131","43132","43133","43134","43135","43136","43137","43138","43139","43140","43141","43142","43143","43144","43145","43146","43147","43148","43149","43150","43151","43152","43153","43154","43155","43156","43157","43158","43159","43160","43161","43162","43163","43164","43165","43166","43167","43168","43169","43170","43171","43172","43173","43174","43175","43176","43177","43178","43179","43180","43181","43182","43183","43184","43185","43186","43187","43188","43189","43190","43191","43192","43193","43194","43195","43196","43197","43198","43199","43200","43201","43202","43203","43204","43205","43206","43207","43208","43209","43210","43211","43212","43213","43214","43215","43216","43217","43218","43219","43220","43221","43222","43223","43224","43225","43226","43227","43228","43229","43230","43231","43232","43233","43234","43235","43236","43237","43238","43239","43240","43241","43242","43243","43244","43245","43246","43247","43248","43249","43250","43251","43252","43253","43254","43255","43256","43257","43258","43259","43260","43261","43262","43263","43264","43265","43266","43267","43268","43269","43270","43271","43272","43273","43274","43275","43276","43277","43278","43279","43280","43281","43282","43283","43284","43285","43286","43287","43288","43289","43290","43291","43292","43293","43294","43295","43296","43297","43298","43299","43300","43301","43302","43303","43304","43305","43306","43307","43308","43309","43310","43311","43312","43313","43314","43315","43316","43317","43318","43319","43320","43321","43322","43323","43324","43325","43326","43327","43328","43329","43330","43331","43332","43333","43334","43335","43336","43337","43338","43339","43340","43341","43342","43343","43344","43345","43346","43347","43348","43349","43350","43351","43352","43353","43354","43355","43356","43357","43358","43359","43360","43361","43362","43363","43364","43365","43366","43367","43368","43369","43370","43371","43372","43373","43374","43375","43376","43377","43378","43379","43380","43381","43382","43383","43384","43385","43386","43387","43388","43389","43390","43391","43392","43393","43394","43395","43396","43397","43398","43399","43400","43401","43402","43403","43404","43405","43406","43407","43408","43409","43410","43411","43412","43413","43414","43415","43416","43417","43418","43419","43420","43421","43422","43423","43424","43425","43426","43427","43428","43429","43430","43431","43432","43433","43434","43435","43436","43437","43438","43439","43440","43441","43442","43443","43444","43445","43446","43447","43448","43449","43450","43451","43452","43453","43454","43455","43456","43457","43458","43459","43460","43461","43462","43463","43464","43465","43466","43467","43468","43469","43470","43471","43472","43473","43474","43475","43476","43477","43478","43479","43480","43481","43482","43483","43484","43485","43486","43487","43488","43489","43490","43491","43492","43493","43494","43495","43496","43497","43498","43499","43500","43501","43502","43503","43504","43505","43506","43507","43508","43509","43510","43511","43512","43513","43514","43515","43516","43517","43518","43519","43520","43521","43522","43523","43524","43525","43526","43527","43528","43529","43530","43531","43532","43533","43534","43535","43536","43537","43538","43539","43540","43541","43542","43543","43544","43545","43546","43547","43548","43549","43550","43551","43552","43553","43554","43555","43556","43557","43558","43559","43560","43561","43562","43563","43564","43565","43566","43567","43568","43569","43570","43571","43572","43573","43574","43575","43576","43577","43578","43579","43580","43581","43582","43583","43584","43585","43586","43587","43588","43589","43590","43591","43592","43593","43594","43595","43596","43597","43598","43599","43600","43601","43602","43603","43604","43605","43606","43607","43608","43609","43610","43611","43612","43613","43614","43615","43616","43617","43618","43619","43620","43621","43622","43623","43624","43625","43626","43627","43628","43629","43630","43631","43632","43633","43634","43635","43636","43637","43638","43639","43640","43641","43642","43643","43644","43645","43646","43647","43648","43649","43650","43651","43652","43653","43654","43655","43656","43657","43658","43659","43660","43661","43662","43663","43664","43665","43666","43667","43668","43669","43670","43671","43672","43673","43674","43675","43676","43677","43678","43679","43680","43681","43682","43683","43684","43685","43686","43687","43688","43689","43690","43691","43692","43693","43694","43695","43696","43697","43698","43699","43700","43701","43702","43703","43704","43705","43706","43707","43708","43709","43710","43711","43712","43713","43714","43715","43716","43717","43718","43719","43720","43721","43722","43723","43724","43725","43726","43727","43728","43729","43730","43731","43732","43733","43734","43735","43736","43737","43738","43739","43740","43741","43742","43743","43744","43745","43746","43747","43748","43749","43750","43751","43752","43753","43754","43755","43756","43757","43758","43759","43760","43761","43762","43763","43764","43765","43766","43767","43768","43769","43770","43771","43772","43773","43774","43775","43776","43777","43778","43779","43780","43781","43782","43783","43784","43785","43786","43787","43788","43789","43790","43791","43792","43793","43794","43795","43796","43797","43798","43799","43800","43801","43802","43803","43804","43805","43806","43807","43808","43809","43810","43811","43812","43813","43814","43815","43816","43817","43818","43819","43820","43821","43822","43823","43824","43825","43826","43827","43828","43829","43830","43831","43832","43833","43834","43835","43836","43837","43838","43839","43840","43841","43842","43843","43844","43845","43846","43847","43848","43849","43850","43851","43852","43853","43854","43855","43856","43857","43858","43859","43860","43861","43862","43863","43864","43865","43866","43867","43868","43869","43870","43871","43872","43873","43874","43875","43876","43877","43878","43879","43880","43881","43882","43883","43884","43885","43886","43887","43888","43889","43890","43891","43892","43893","43894","43895","43896","43897","43898","43899","43900","43901","43902","43903","43904","43905","43906","43907","43908","43909","43910","43911","43912","43913","43914","43915","43916","43917","43918","43919","43920","43921","43922","43923","43924","43925","43926","43927","43928","43929","43930","43931","43932","43933","43934","43935","43936","43937","43938","43939","43940","43941","43942","43943","43944","43945","43946","43947","43948","43949","43950","43951","43952","43953","43954","43955","43956","43957","43958","43959","43960","43961","43962","43963","43964","43965","43966","43967","43968","43969","43970","43971","43972","43973","43974","43975","43976","43977","43978","43979","43980","43981","43982","43983","43984","43985","43986","43987","43988","43989","43990","43991","43992","43993","43994","43995","43996","43997","43998","43999","44000","44001","44002","44003","44004","44005","44006","44007","44008","44009","44010","44011","44012","44013","44014","44015","44016","44017","44018","44019","44020","44021","44022","44023","44024","44025","44026","44027","44028","44029","44030","44031","44032","44033","44034","44035","44036","44037","44038","44039","44040","44041","44042","44043","44044","44045","44046","44047","44048","44049","44050","44051","44052","44053","44054","44055","44056","44057","44058","44059","44060","44061","44062","44063","44064","44065","44066","44067","44068","44069","44070","44071","44072","44073","44074","44075","44076","44077","44078","44079","44080","44081","44082","44083","44084","44085","44086","44087","44088","44089","44090","44091","44092","44093","44094","44095","44096","44097","44098","44099","44100","44101","44102","44103","44104","44105","44106","44107","44108","44109","44110","44111","44112","44113","44114","44115","44116","44117","44118","44119","44120","44121","44122","44123","44124","44125","44126","44127","44128","44129","44130","44131","44132","44133","44134","44135","44136","44137","44138","44139","44140","44141","44142","44143","44144","44145","44146","44147","44148","44149","44150","44151","44152","44153","44154","44155","44156","44157","44158","44159","44160","44161","44162","44163","44164","44165","44166","44167","44168","44169","44170","44171","44172","44173","44174","44175","44176","44177","44178","44179","44180","44181","44182","44183","44184","44185","44186","44187","44188","44189","44190","44191","44192","44193","44194","44195","44196","44197","44198","44199","44200","44201","44202","44203","44204","44205","44206","44207","44208","44209","44210","44211","44212","44213","44214","44215","44216","44217","44218","44219","44220","44221","44222","44223","44224","44225","44226","44227","44228","44229","44230","44231","44232","44233","44234","44235","44236","44237","44238","44239","44240","44241","44242","44243","44244","44245","44246","44247","44248","44249","44250","44251","44252","44253","44254","44255","44256","44257","44258","44259","44260","44261","44262","44263","44264","44265","44266","44267","44268","44269","44270","44271","44272","44273","44274","44275","44276","44277","44278","44279","44280","44281","44282","44283","44284","44285","44286","44287","44288","44289","44290","44291","44292","44293","44294","44295","44296","44297","44298","44299","44300","44301","44302","44303","44304","44305","44306","44307","44308","44309","44310","44311","44312","44313","44314","44315","44316","44317","44318","44319","44320","44321","44322","44323","44324","44325","44326","44327","44328","44329","44330","44331","44332","44333","44334","44335","44336","44337","44338","44339","44340","44341","44342","44343","44344","44345","44346","44347","44348","44349","44350","44351","44352","44353","44354","44355","44356","44357","44358","44359","44360","44361","44362","44363","44364","44365","44366","44367","44368","44369","44370","44371","44372","44373","44374","44375","44376","44377","44378","44379","44380","44381","44382","44383","44384","44385","44386","44387","44388","44389","44390","44391","44392","44393","44394","44395","44396","44397","44398","44399","44400","44401","44402","44403","44404","44405","44406","44407","44408","44409","44410","44411","44412","44413","44414","44415","44416","44417","44418","44419","44420","44421","44422","44423","44424","44425","44426","44427","44428","44429","44430","44431","44432","44433","44434","44435","44436","44437","44438","44439","44440","44441","44442","44443","44444","44445","44446","44447","44448","44449","44450","44451","44452","44453","44454","44455","44456","44457","44458","44459","44460","44461","44462","44463","44464","44465","44466","44467","44468","44469","44470","44471","44472","44473","44474","44475","44476","44477","44478","44479","44480","44481","44482","44483","44484","44485","44486","44487","44488","44489","44490","44491","44492","44493","44494","44495","44496","44497","44498","44499","44500","44501","44502","44503","44504","44505","44506","44507","44508","44509","44510","44511","44512","44513","44514","44515","44516","44517","44518","44519","44520","44521","44522","44523","44524","44525","44526","44527","44528","44529","44530","44531","44532","44533","44534","44535","44536","44537","44538","44539","44540","44541","44542","44543","44544","44545","44546","44547","44548","44549","44550","44551","44552","44553","44554","44555","44556","44557","44558","44559","44560","44561","44562","44563","44564","44565","44566","44567","44568","44569","44570","44571","44572","44573","44574","44575","44576","44577","44578","44579","44580","44581","44582","44583","44584","44585","44586","44587","44588","44589","44590","44591","44592","44593","44594","44595","44596","44597","44598","44599","44600","44601","44602","44603","44604","44605","44606","44607","44608","44609","44610","44611","44612","44613","44614","44615","44616","44617","44618","44619","44620","44621","44622","44623","44624","44625","44626","44627","44628","44629","44630","44631","44632","44633","44634","44635","44636","44637","44638","44639","44640","44641","44642","44643","44644","44645","44646","44647","44648","44649","44650","44651","44652","44653","44654","44655","44656","44657","44658","44659","44660","44661","44662","44663","44664","44665","44666","44667","44668","44669","44670","44671","44672","44673","44674","44675","44676","44677","44678","44679","44680","44681","44682","44683","44684","44685","44686","44687","44688","44689","44690","44691","44692","44693","44694","44695","44696","44697","44698","44699","44700","44701","44702","44703","44704","44705","44706","44707","44708","44709","44710","44711","44712","44713","44714","44715","44716","44717","44718","44719","44720","44721","44722","44723","44724","44725","44726","44727","44728","44729","44730","44731","44732","44733","44734","44735","44736","44737","44738","44739","44740","44741","44742","44743","44744","44745","44746","44747","44748","44749","44750","44751","44752","44753","44754","44755","44756","44757","44758","44759","44760","44761","44762","44763","44764","44765","44766","44767","44768","44769","44770","44771","44772","44773","44774","44775","44776","44777","44778","44779","44780","44781","44782","44783","44784","44785","44786","44787","44788","44789","44790","44791","44792","44793","44794","44795","44796","44797","44798","44799","44800","44801","44802","44803","44804","44805","44806","44807","44808","44809","44810","44811","44812","44813","44814","44815","44816","44817","44818","44819","44820","44821","44822","44823","44824","44825","44826","44827","44828","44829","44830","44831","44832","44833","44834","44835","44836","44837","44838","44839","44840","44841","44842","44843","44844","44845","44846","44847","44848","44849","44850","44851","44852","44853","44854","44855","44856","44857","44858","44859","44860","44861","44862","44863","44864","44865","44866","44867","44868","44869","44870","44871","44872","44873","44874","44875","44876","44877","44878","44879","44880","44881","44882","44883","44884","44885","44886","44887","44888","44889","44890","44891","44892","44893","44894","44895","44896","44897","44898","44899","44900","44901","44902","44903","44904","44905","44906","44907","44908","44909","44910","44911","44912","44913","44914","44915","44916","44917","44918","44919","44920","44921","44922","44923","44924","44925","44926","44927","44928","44929","44930","44931","44932","44933","44934","44935","44936","44937","44938","44939","44940","44941","44942","44943","44944","44945","44946","44947","44948","44949","44950","44951","44952","44953","44954","44955","44956","44957","44958","44959","44960","44961","44962","44963","44964","44965","44966","44967","44968","44969","44970","44971","44972","44973","44974","44975","44976","44977","44978","44979","44980","44981","44982","44983","44984","44985","44986","44987","44988","44989","44990","44991","44992","44993","44994","44995","44996","44997","44998","44999","45000","45001","45002","45003","45004","45005","45006","45007","45008","45009","45010","45011","45012","45013","45014","45015","45016","45017","45018","45019","45020","45021","45022","45023","45024","45025","45026","45027","45028","45029","45030","45031","45032","45033","45034","45035","45036","45037","45038","45039","45040","45041","45042","45043","45044","45045","45046","45047","45048","45049","45050","45051","45052","45053","45054","45055","45056","45057","45058","45059","45060","45061","45062","45063","45064","45065","45066","45067","45068","45069","45070","45071","45072","45073","45074","45075","45076","45077","45078","45079","45080","45081","45082","45083","45084","45085","45086","45087","45088","45089","45090","45091","45092","45093","45094","45095","45096","45097","45098","45099","45100","45101","45102","45103","45104","45105","45106","45107","45108","45109","45110","45111","45112","45113","45114","45115","45116","45117","45118","45119","45120","45121","45122","45123","45124","45125","45126","45127","45128","45129","45130","45131","45132","45133","45134","45135","45136","45137","45138","45139","45140","45141","45142","45143","45144","45145","45146","45147","45148","45149","45150","45151","45152","45153","45154","45155","45156","45157","45158","45159","45160","45161","45162","45163","45164","45165","45166","45167","45168","45169","45170","45171","45172","45173","45174","45175","45176","45177","45178","45179","45180","45181","45182","45183","45184","45185","45186","45187","45188","45189","45190","45191","45192","45193","45194","45195","45196","45197","45198","45199","45200","45201","45202","45203","45204","45205","45206","45207","45208","45209","45210","45211","45212","45213","45214","45215","45216","45217","45218","45219","45220","45221","45222","45223","45224","45225","45226","45227","45228","45229","45230","45231","45232","45233","45234","45235","45236","45237","45238","45239","45240","45241","45242","45243","45244","45245","45246","45247","45248","45249","45250","45251","45252","45253","45254","45255","45256","45257","45258","45259","45260","45261","45262","45263","45264","45265","45266","45267","45268","45269","45270","45271","45272","45273","45274","45275","45276","45277","45278","45279","45280","45281","45282","45283","45284","45285","45286","45287","45288","45289","45290","45291","45292","45293","45294","45295","45296","45297","45298","45299","45300","45301","45302","45303","45304","45305","45306","45307","45308","45309","45310","45311","45312","45313","45314","45315","45316","45317","45318","45319","45320","45321","45322","45323","45324","45325","45326","45327","45328","45329","45330","45331","45332","45333","45334","45335","45336","45337","45338","45339","45340","45341","45342","45343","45344","45345","45346","45347","45348","45349","45350","45351","45352","45353","45354","45355","45356","45357","45358","45359","45360","45361","45362","45363","45364","45365","45366","45367","45368","45369","45370","45371","45372","45373","45374","45375","45376","45377","45378","45379","45380","45381","45382","45383","45384","45385","45386","45387","45388","45389","45390","45391","45392","45393","45394","45395","45396","45397","45398","45399","45400","45401","45402","45403","45404","45405","45406","45407","45408","45409","45410","45411","45412","45413","45414","45415","45416","45417","45418","45419","45420","45421","45422","45423","45424","45425","45426","45427","45428","45429","45430","45431","45432","45433","45434","45435","45436","45437","45438","45439","45440","45441","45442","45443","45444","45445","45446","45447","45448","45449","45450","45451","45452","45453","45454","45455","45456","45457","45458","45459","45460","45461","45462","45463","45464","45465","45466","45467","45468","45469","45470","45471","45472","45473","45474","45475","45476","45477","45478","45479","45480","45481","45482","45483","45484","45485","45486","45487","45488","45489","45490","45491","45492","45493","45494","45495","45496","45497","45498","45499","45500","45501","45502","45503","45504","45505","45506","45507","45508","45509","45510","45511","45512","45513","45514","45515","45516","45517","45518","45519","45520","45521","45522","45523","45524","45525","45526","45527","45528","45529","45530","45531","45532","45533","45534","45535","45536","45537","45538","45539","45540","45541","45542","45543","45544","45545","45546","45547","45548","45549","45550","45551","45552","45553","45554","45555","45556","45557","45558","45559","45560","45561","45562","45563","45564","45565","45566","45567","45568","45569","45570","45571","45572","45573","45574","45575","45576","45577","45578","45579","45580","45581","45582","45583","45584","45585","45586","45587","45588","45589","45590","45591","45592","45593","45594","45595","45596","45597","45598","45599","45600","45601","45602","45603","45604","45605","45606","45607","45608","45609","45610","45611","45612","45613","45614","45615","45616","45617","45618","45619","45620","45621","45622","45623","45624","45625","45626","45627","45628","45629","45630","45631","45632","45633","45634","45635","45636","45637","45638","45639","45640","45641","45642","45643","45644","45645","45646","45647","45648","45649","45650","45651","45652","45653","45654","45655","45656","45657","45658","45659","45660","45661","45662","45663","45664","45665","45666","45667","45668","45669","45670","45671","45672","45673","45674","45675","45676","45677","45678","45679","45680","45681","45682","45683","45684","45685","45686","45687","45688","45689","45690","45691","45692","45693","45694","45695","45696","45697","45698","45699","45700","45701","45702","45703","45704","45705","45706","45707","45708","45709","45710","45711","45712","45713","45714","45715","45716","45717","45718","45719","45720","45721","45722","45723","45724","45725","45726","45727","45728","45729","45730","45731","45732","45733","45734","45735","45736","45737","45738","45739","45740","45741","45742","45743","45744","45745","45746","45747","45748","45749","45750","45751","45752","45753","45754","45755","45756","45757","45758","45759","45760","45761","45762","45763","45764","45765","45766","45767","45768","45769","45770","45771","45772","45773","45774","45775","45776","45777","45778","45779","45780","45781","45782","45783","45784","45785","45786","45787","45788","45789","45790","45791","45792","45793","45794","45795","45796","45797","45798","45799","45800","45801","45802","45803","45804","45805","45806","45807","45808","45809","45810","45811","45812","45813","45814","45815","45816","45817","45818","45819","45820","45821","45822","45823","45824","45825","45826","45827","45828","45829","45830","45831","45832","45833","45834","45835","45836","45837","45838","45839","45840","45841","45842","45843","45844","45845","45846","45847","45848","45849","45850","45851","45852","45853","45854","45855","45856","45857","45858","45859","45860","45861","45862","45863","45864","45865","45866","45867","45868","45869","45870","45871","45872","45873","45874","45875","45876","45877","45878","45879","45880","45881","45882","45883","45884","45885","45886","45887","45888","45889","45890","45891","45892","45893","45894","45895","45896","45897","45898","45899","45900","45901","45902","45903","45904","45905","45906","45907","45908","45909","45910","45911","45912","45913","45914","45915","45916","45917","45918","45919","45920","45921","45922","45923","45924","45925","45926","45927","45928","45929","45930","45931","45932","45933","45934","45935","45936","45937","45938","45939","45940","45941","45942","45943","45944","45945","45946","45947","45948","45949","45950","45951","45952","45953","45954","45955","45956","45957","45958","45959","45960","45961","45962","45963","45964","45965","45966","45967","45968","45969","45970","45971","45972","45973","45974","45975","45976","45977","45978","45979","45980","45981","45982","45983","45984","45985","45986","45987","45988","45989","45990","45991","45992","45993","45994","45995","45996","45997","45998","45999","46000","46001","46002","46003","46004","46005","46006","46007","46008","46009","46010","46011","46012","46013","46014","46015","46016","46017","46018","46019","46020","46021","46022","46023","46024","46025","46026","46027","46028","46029","46030","46031","46032","46033","46034","46035","46036","46037","46038","46039","46040","46041","46042","46043","46044","46045","46046","46047","46048","46049","46050","46051","46052","46053","46054","46055","46056","46057","46058","46059","46060","46061","46062","46063","46064","46065","46066","46067","46068","46069","46070","46071","46072","46073","46074","46075","46076","46077","46078","46079","46080","46081","46082","46083","46084","46085","46086","46087","46088","46089","46090","46091","46092","46093","46094","46095","46096","46097","46098","46099","46100","46101","46102","46103","46104","46105","46106","46107","46108","46109","46110","46111","46112","46113","46114","46115","46116","46117","46118","46119","46120","46121","46122","46123","46124","46125","46126","46127","46128","46129","46130","46131","46132","46133","46134","46135","46136","46137","46138","46139","46140","46141","46142","46143","46144","46145","46146","46147","46148","46149","46150","46151","46152","46153","46154","46155","46156","46157","46158","46159","46160","46161","46162","46163","46164","46165","46166","46167","46168","46169","46170","46171","46172","46173","46174","46175","46176","46177","46178","46179","46180","46181","46182","46183","46184","46185","46186","46187","46188","46189","46190","46191","46192","46193","46194","46195","46196","46197","46198","46199","46200","46201","46202","46203","46204","46205","46206","46207","46208","46209","46210","46211","46212","46213","46214","46215","46216","46217","46218","46219","46220","46221","46222","46223","46224","46225","46226","46227","46228","46229","46230","46231","46232","46233","46234","46235","46236","46237","46238","46239","46240","46241","46242","46243","46244","46245","46246","46247","46248","46249","46250","46251","46252","46253","46254","46255","46256","46257","46258","46259","46260","46261","46262","46263","46264","46265","46266","46267","46268","46269","46270","46271","46272","46273","46274","46275","46276","46277","46278","46279","46280","46281","46282","46283","46284","46285","46286","46287","46288","46289","46290","46291","46292","46293","46294","46295","46296","46297","46298","46299","46300","46301","46302","46303","46304","46305","46306","46307","46308","46309","46310","46311","46312","46313","46314","46315","46316","46317","46318","46319","46320","46321","46322","46323","46324","46325","46326","46327","46328","46329","46330","46331","46332","46333","46334","46335","46336","46337","46338","46339","46340","46341","46342","46343","46344","46345","46346","46347","46348","46349","46350","46351","46352","46353","46354","46355","46356","46357","46358","46359","46360","46361","46362","46363","46364","46365","46366","46367","46368","46369","46370","46371","46372","46373","46374","46375","46376","46377","46378","46379","46380","46381","46382","46383","46384","46385","46386","46387","46388","46389","46390","46391","46392","46393","46394","46395","46396","46397","46398","46399","46400","46401","46402","46403","46404","46405","46406","46407","46408","46409","46410","46411","46412","46413","46414","46415","46416","46417","46418","46419","46420","46421","46422","46423","46424","46425","46426","46427","46428","46429","46430","46431","46432","46433","46434","46435","46436","46437","46438","46439","46440","46441","46442","46443","46444","46445","46446","46447","46448","46449","46450","46451","46452","46453","46454","46455","46456","46457","46458","46459","46460","46461","46462","46463","46464","46465","46466","46467","46468","46469","46470","46471","46472","46473","46474","46475","46476","46477","46478","46479","46480","46481","46482","46483","46484","46485","46486","46487","46488","46489","46490","46491","46492","46493","46494","46495","46496","46497","46498","46499","46500","46501","46502","46503","46504","46505","46506","46507","46508","46509","46510","46511","46512","46513","46514","46515","46516","46517","46518","46519","46520","46521","46522","46523","46524","46525","46526","46527","46528","46529","46530","46531","46532","46533","46534","46535","46536","46537","46538","46539","46540","46541","46542","46543","46544","46545","46546","46547","46548","46549","46550","46551","46552","46553","46554","46555","46556","46557","46558","46559","46560","46561","46562","46563","46564","46565","46566","46567","46568","46569","46570","46571","46572","46573","46574","46575","46576","46577","46578","46579","46580","46581","46582","46583","46584","46585","46586","46587","46588","46589","46590","46591","46592","46593","46594","46595","46596","46597","46598","46599","46600","46601","46602","46603","46604","46605","46606","46607","46608","46609","46610","46611","46612","46613","46614","46615","46616","46617","46618","46619","46620","46621","46622","46623","46624","46625","46626","46627","46628","46629","46630","46631","46632","46633","46634","46635","46636","46637","46638","46639","46640","46641","46642","46643","46644","46645","46646","46647","46648","46649","46650","46651","46652","46653","46654","46655","46656","46657","46658","46659","46660","46661","46662","46663","46664","46665","46666","46667","46668","46669","46670","46671","46672","46673","46674","46675","46676","46677","46678","46679","46680","46681","46682","46683","46684","46685","46686","46687","46688","46689","46690","46691","46692","46693","46694","46695","46696","46697","46698","46699","46700","46701","46702","46703","46704","46705","46706","46707","46708","46709","46710","46711","46712","46713","46714","46715","46716","46717","46718","46719","46720","46721","46722","46723","46724","46725","46726","46727","46728","46729","46730","46731","46732","46733","46734","46735","46736","46737","46738","46739","46740","46741","46742","46743","46744","46745","46746","46747","46748","46749","46750","46751","46752","46753","46754","46755","46756","46757","46758","46759","46760","46761","46762","46763","46764","46765","46766","46767","46768","46769","46770","46771","46772","46773","46774","46775","46776","46777","46778","46779","46780","46781","46782","46783","46784","46785","46786","46787","46788","46789","46790","46791","46792","46793","46794","46795","46796","46797","46798","46799","46800","46801","46802","46803","46804","46805","46806","46807","46808","46809","46810","46811","46812","46813","46814","46815","46816","46817","46818","46819","46820","46821","46822","46823","46824","46825","46826","46827","46828","46829","46830","46831","46832","46833","46834","46835","46836","46837","46838","46839","46840","46841","46842","46843","46844","46845","46846","46847","46848","46849","46850","46851","46852","46853","46854","46855","46856","46857","46858","46859","46860","46861","46862","46863","46864","46865","46866","46867","46868","46869","46870","46871","46872","46873","46874","46875","46876","46877","46878","46879","46880","46881","46882","46883","46884","46885","46886","46887","46888","46889","46890","46891","46892","46893","46894","46895","46896","46897","46898","46899","46900","46901","46902","46903","46904","46905","46906","46907","46908","46909","46910","46911","46912","46913","46914","46915","46916","46917","46918","46919","46920","46921","46922","46923","46924","46925","46926","46927","46928","46929","46930","46931","46932","46933","46934","46935","46936","46937","46938","46939","46940","46941","46942","46943","46944","46945","46946","46947","46948","46949","46950","46951","46952","46953","46954","46955","46956","46957","46958","46959","46960","46961","46962","46963","46964","46965","46966","46967","46968","46969","46970","46971","46972","46973","46974","46975","46976","46977","46978","46979","46980","46981","46982","46983","46984","46985","46986","46987","46988","46989","46990","46991","46992","46993","46994","46995","46996","46997","46998","46999","47000","47001","47002","47003","47004","47005","47006","47007","47008","47009","47010","47011","47012","47013","47014","47015","47016","47017","47018","47019","47020","47021","47022","47023","47024","47025","47026","47027","47028","47029","47030","47031","47032","47033","47034","47035","47036","47037","47038","47039","47040","47041","47042","47043","47044","47045","47046","47047","47048","47049","47050","47051","47052","47053","47054","47055","47056","47057","47058","47059","47060","47061","47062","47063","47064","47065","47066","47067","47068","47069","47070","47071","47072","47073","47074","47075","47076","47077","47078","47079","47080","47081","47082","47083","47084","47085","47086","47087","47088","47089","47090","47091","47092","47093","47094","47095","47096","47097","47098","47099","47100","47101","47102","47103","47104","47105","47106","47107","47108","47109","47110","47111","47112","47113","47114","47115","47116","47117","47118","47119","47120","47121","47122","47123","47124","47125","47126","47127","47128","47129","47130","47131","47132","47133","47134","47135","47136","47137","47138","47139","47140","47141","47142","47143","47144","47145","47146","47147","47148","47149","47150","47151","47152","47153","47154","47155","47156","47157","47158","47159","47160","47161","47162","47163","47164","47165","47166","47167","47168","47169","47170","47171","47172","47173","47174","47175","47176","47177","47178","47179","47180","47181","47182","47183","47184","47185","47186","47187","47188","47189","47190","47191","47192","47193","47194","47195","47196","47197","47198","47199","47200","47201","47202","47203","47204","47205","47206","47207","47208","47209","47210","47211","47212","47213","47214","47215","47216","47217","47218","47219","47220","47221","47222","47223","47224","47225","47226","47227","47228","47229","47230","47231","47232","47233","47234","47235","47236","47237","47238","47239","47240","47241","47242","47243","47244","47245","47246","47247","47248","47249","47250","47251","47252","47253","47254","47255","47256","47257","47258","47259","47260","47261","47262","47263","47264","47265","47266","47267","47268","47269","47270","47271","47272","47273","47274","47275","47276","47277","47278","47279","47280","47281","47282","47283","47284","47285","47286","47287","47288","47289","47290","47291","47292","47293","47294","47295","47296","47297","47298","47299","47300","47301","47302","47303","47304","47305","47306","47307","47308","47309","47310","47311","47312","47313","47314","47315","47316","47317","47318","47319","47320","47321","47322","47323","47324","47325","47326","47327","47328","47329","47330","47331","47332","47333","47334","47335","47336","47337","47338","47339","47340","47341","47342","47343","47344","47345","47346","47347","47348","47349","47350","47351","47352","47353","47354","47355","47356","47357","47358","47359","47360","47361","47362","47363","47364","47365","47366","47367","47368","47369","47370","47371","47372","47373","47374","47375","47376","47377","47378","47379","47380","47381","47382","47383","47384","47385","47386","47387","47388","47389","47390","47391","47392","47393","47394","47395","47396","47397","47398","47399","47400","47401","47402","47403","47404","47405","47406","47407","47408","47409","47410","47411","47412","47413","47414","47415","47416","47417","47418","47419","47420","47421","47422","47423","47424","47425","47426","47427","47428","47429","47430","47431","47432","47433","47434","47435","47436","47437","47438","47439","47440","47441","47442","47443","47444","47445","47446","47447","47448","47449","47450","47451","47452","47453","47454","47455","47456","47457","47458","47459","47460","47461","47462","47463","47464","47465","47466","47467","47468","47469","47470","47471","47472","47473","47474","47475","47476","47477","47478","47479","47480","47481","47482","47483","47484","47485","47486","47487","47488","47489","47490","47491","47492","47493","47494","47495","47496","47497","47498","47499","47500","47501","47502","47503","47504","47505","47506","47507","47508","47509","47510","47511","47512","47513","47514","47515","47516","47517","47518","47519","47520","47521","47522","47523","47524","47525","47526","47527","47528","47529","47530","47531","47532","47533","47534","47535","47536","47537","47538","47539","47540","47541","47542","47543","47544","47545","47546","47547","47548","47549","47550","47551","47552","47553","47554","47555","47556","47557","47558","47559","47560","47561","47562","47563","47564","47565","47566","47567","47568","47569","47570","47571","47572","47573","47574","47575","47576","47577","47578","47579","47580","47581","47582","47583","47584","47585","47586","47587","47588","47589","47590","47591","47592","47593","47594","47595","47596","47597","47598","47599","47600","47601","47602","47603","47604","47605","47606","47607","47608","47609","47610","47611","47612","47613","47614","47615","47616","47617","47618","47619","47620","47621","47622","47623","47624","47625","47626","47627","47628","47629","47630","47631","47632","47633","47634","47635","47636","47637","47638","47639","47640","47641","47642","47643","47644","47645","47646","47647","47648","47649","47650","47651","47652","47653","47654","47655","47656","47657","47658","47659","47660","47661","47662","47663","47664","47665","47666","47667","47668","47669","47670","47671","47672","47673","47674","47675","47676","47677","47678","47679","47680","47681","47682","47683","47684","47685","47686","47687","47688","47689","47690","47691","47692","47693","47694","47695","47696","47697","47698","47699","47700","47701","47702","47703","47704","47705","47706","47707","47708","47709","47710","47711","47712","47713","47714","47715","47716","47717","47718","47719","47720","47721","47722","47723","47724","47725","47726","47727","47728","47729","47730","47731","47732","47733","47734","47735","47736","47737","47738","47739","47740","47741","47742","47743","47744","47745","47746","47747","47748","47749","47750","47751","47752","47753","47754","47755","47756","47757","47758","47759","47760","47761","47762","47763","47764","47765","47766","47767","47768","47769","47770","47771","47772","47773","47774","47775","47776","47777","47778","47779","47780","47781","47782","47783","47784","47785","47786","47787","47788","47789","47790","47791","47792","47793","47794","47795","47796","47797","47798","47799","47800","47801","47802","47803","47804","47805","47806","47807","47808","47809","47810","47811","47812","47813","47814","47815","47816","47817","47818","47819","47820","47821","47822","47823","47824","47825","47826","47827","47828","47829","47830","47831","47832","47833","47834","47835","47836","47837","47838","47839","47840","47841","47842","47843","47844","47845","47846","47847","47848","47849","47850","47851","47852","47853","47854","47855","47856","47857","47858","47859","47860","47861","47862","47863","47864","47865","47866","47867","47868","47869","47870","47871","47872","47873","47874","47875","47876","47877","47878","47879","47880","47881","47882","47883","47884","47885","47886","47887","47888","47889","47890","47891","47892","47893","47894","47895","47896","47897","47898","47899","47900","47901","47902","47903","47904","47905","47906","47907","47908","47909","47910","47911","47912","47913","47914","47915","47916","47917","47918","47919","47920","47921","47922","47923","47924","47925","47926","47927","47928","47929","47930","47931","47932","47933","47934","47935","47936","47937","47938","47939","47940","47941","47942","47943","47944","47945","47946","47947","47948","47949","47950","47951","47952","47953","47954","47955","47956","47957","47958","47959","47960","47961","47962","47963","47964","47965","47966","47967","47968","47969","47970","47971","47972","47973","47974","47975","47976","47977","47978","47979","47980","47981","47982","47983","47984","47985","47986","47987","47988","47989","47990","47991","47992","47993","47994","47995","47996","47997","47998","47999","48000","48001","48002","48003","48004","48005","48006","48007","48008","48009","48010","48011","48012","48013","48014","48015","48016","48017","48018","48019","48020","48021","48022","48023","48024","48025","48026","48027","48028","48029","48030","48031","48032","48033","48034","48035","48036","48037","48038","48039","48040","48041","48042","48043","48044","48045","48046","48047","48048","48049","48050","48051","48052","48053","48054","48055","48056","48057","48058","48059","48060","48061","48062","48063","48064","48065","48066","48067","48068","48069","48070","48071","48072","48073","48074","48075","48076","48077","48078","48079","48080","48081","48082","48083","48084","48085","48086","48087","48088","48089","48090","48091","48092","48093","48094","48095","48096","48097","48098","48099","48100","48101","48102","48103","48104","48105","48106","48107","48108","48109","48110","48111","48112","48113","48114","48115","48116","48117","48118","48119","48120","48121","48122","48123","48124","48125","48126","48127","48128","48129","48130","48131","48132","48133","48134","48135","48136","48137","48138","48139","48140","48141","48142","48143","48144","48145","48146","48147","48148","48149","48150","48151","48152","48153","48154","48155","48156","48157","48158","48159","48160","48161","48162","48163","48164","48165","48166","48167","48168","48169","48170","48171","48172","48173","48174","48175","48176","48177","48178","48179","48180","48181","48182","48183","48184","48185","48186","48187","48188","48189","48190","48191","48192","48193","48194","48195","48196","48197","48198","48199","48200","48201","48202","48203","48204","48205","48206","48207","48208","48209","48210","48211","48212","48213","48214","48215","48216","48217","48218","48219","48220","48221","48222","48223","48224","48225","48226","48227","48228","48229","48230","48231","48232","48233","48234","48235","48236","48237","48238","48239","48240","48241","48242","48243","48244","48245","48246","48247","48248","48249","48250","48251","48252","48253","48254","48255","48256","48257","48258","48259","48260","48261","48262","48263","48264","48265","48266","48267","48268","48269","48270","48271","48272","48273","48274","48275","48276","48277","48278","48279","48280","48281","48282","48283","48284","48285","48286","48287","48288","48289","48290","48291","48292","48293","48294","48295","48296","48297","48298","48299","48300","48301","48302","48303","48304","48305","48306","48307","48308","48309","48310","48311","48312","48313","48314","48315","48316","48317","48318","48319","48320","48321","48322","48323","48324","48325","48326","48327","48328","48329","48330","48331","48332","48333","48334","48335","48336","48337","48338","48339","48340","48341","48342","48343","48344","48345","48346","48347","48348","48349","48350","48351","48352","48353","48354","48355","48356","48357","48358","48359","48360","48361","48362","48363","48364","48365","48366","48367","48368","48369","48370","48371","48372","48373","48374","48375","48376","48377","48378","48379","48380","48381","48382","48383","48384","48385","48386","48387","48388","48389","48390","48391","48392","48393","48394","48395","48396","48397","48398","48399","48400","48401","48402","48403","48404","48405","48406","48407","48408","48409","48410","48411","48412","48413","48414","48415","48416","48417","48418","48419","48420","48421","48422","48423","48424","48425","48426","48427","48428","48429","48430","48431","48432","48433","48434","48435","48436","48437","48438","48439","48440","48441","48442","48443","48444","48445","48446","48447","48448","48449","48450","48451","48452","48453","48454","48455","48456","48457","48458","48459","48460","48461","48462","48463","48464","48465","48466","48467","48468","48469","48470","48471","48472","48473","48474","48475","48476","48477","48478","48479","48480","48481","48482","48483","48484","48485","48486","48487","48488","48489","48490","48491","48492","48493","48494","48495","48496","48497","48498","48499","48500","48501","48502","48503","48504","48505","48506","48507","48508","48509","48510","48511","48512","48513","48514","48515","48516","48517","48518","48519","48520","48521","48522","48523","48524","48525","48526","48527","48528","48529","48530","48531","48532","48533","48534","48535","48536","48537","48538","48539","48540","48541","48542","48543","48544","48545","48546","48547","48548","48549","48550","48551","48552","48553","48554","48555","48556","48557","48558","48559","48560","48561","48562","48563","48564","48565","48566","48567","48568","48569","48570","48571","48572","48573","48574","48575","48576","48577","48578","48579","48580","48581","48582","48583","48584","48585","48586","48587","48588","48589","48590","48591","48592","48593","48594","48595","48596","48597","48598","48599","48600","48601","48602","48603","48604","48605","48606","48607","48608","48609","48610","48611","48612","48613","48614","48615","48616","48617","48618","48619","48620","48621","48622","48623","48624","48625","48626","48627","48628","48629","48630","48631","48632","48633","48634","48635","48636","48637","48638","48639","48640","48641","48642","48643","48644","48645","48646","48647","48648","48649","48650","48651","48652","48653","48654","48655","48656","48657","48658","48659","48660","48661","48662","48663","48664","48665","48666","48667","48668","48669","48670","48671","48672","48673","48674","48675","48676","48677","48678","48679","48680","48681","48682","48683","48684","48685","48686","48687","48688","48689","48690","48691","48692","48693","48694","48695","48696","48697","48698","48699","48700","48701","48702","48703","48704","48705","48706","48707","48708","48709","48710","48711","48712","48713","48714","48715","48716","48717","48718","48719","48720","48721","48722","48723","48724","48725","48726","48727","48728","48729","48730","48731","48732","48733","48734","48735","48736","48737","48738","48739","48740","48741","48742","48743","48744","48745","48746","48747","48748","48749","48750","48751","48752","48753","48754","48755","48756","48757","48758","48759","48760","48761","48762","48763","48764","48765","48766","48767","48768","48769","48770","48771","48772","48773","48774","48775","48776","48777","48778","48779","48780","48781","48782","48783","48784","48785","48786","48787","48788","48789","48790","48791","48792","48793","48794","48795","48796","48797","48798","48799","48800","48801","48802","48803","48804","48805","48806","48807","48808","48809","48810","48811","48812","48813","48814","48815","48816","48817","48818","48819","48820","48821","48822","48823","48824","48825","48826","48827","48828","48829","48830","48831","48832","48833","48834","48835","48836","48837","48838","48839","48840","48841","48842","48843","48844","48845","48846","48847","48848","48849","48850","48851","48852","48853","48854","48855","48856","48857","48858","48859","48860","48861","48862","48863","48864","48865","48866","48867","48868","48869","48870","48871","48872","48873","48874","48875","48876","48877","48878","48879","48880","48881","48882","48883","48884","48885","48886","48887","48888","48889","48890","48891","48892","48893","48894","48895","48896","48897","48898","48899","48900","48901","48902","48903","48904","48905","48906","48907","48908","48909","48910","48911","48912","48913","48914","48915","48916","48917","48918","48919","48920","48921","48922","48923","48924","48925","48926","48927","48928","48929","48930","48931","48932","48933","48934","48935","48936","48937","48938","48939","48940","48941","48942","48943","48944","48945","48946","48947","48948","48949","48950","48951","48952","48953","48954","48955","48956","48957","48958","48959","48960","48961","48962","48963","48964","48965","48966","48967","48968","48969","48970","48971","48972","48973","48974","48975","48976","48977","48978","48979","48980","48981","48982","48983","48984","48985","48986","48987","48988","48989","48990","48991","48992","48993","48994","48995","48996","48997","48998","48999","49000","49001","49002","49003","49004","49005","49006","49007","49008","49009","49010","49011","49012","49013","49014","49015","49016","49017","49018","49019","49020","49021","49022","49023","49024","49025","49026","49027","49028","49029","49030","49031","49032","49033","49034","49035","49036","49037","49038","49039","49040","49041","49042","49043","49044","49045","49046","49047","49048","49049","49050","49051","49052","49053","49054","49055","49056","49057","49058","49059","49060","49061","49062","49063","49064","49065","49066","49067","49068","49069","49070","49071","49072","49073","49074","49075","49076","49077","49078","49079","49080","49081","49082","49083","49084","49085","49086","49087","49088","49089","49090","49091","49092","49093","49094","49095","49096","49097","49098","49099","49100","49101","49102","49103","49104","49105","49106","49107","49108","49109","49110","49111","49112","49113","49114","49115","49116","49117","49118","49119","49120","49121","49122","49123","49124","49125","49126","49127","49128","49129","49130","49131","49132","49133","49134","49135","49136","49137","49138","49139","49140","49141","49142","49143","49144","49145","49146","49147","49148","49149","49150","49151","49152","49153","49154","49155","49156","49157","49158","49159","49160","49161","49162","49163","49164","49165","49166","49167","49168","49169","49170","49171","49172","49173","49174","49175","49176","49177","49178","49179","49180","49181","49182","49183","49184","49185","49186","49187","49188","49189","49190","49191","49192","49193","49194","49195","49196","49197","49198","49199","49200","49201","49202","49203","49204","49205","49206","49207","49208","49209","49210","49211","49212","49213","49214","49215","49216","49217","49218","49219","49220","49221","49222","49223","49224","49225","49226","49227","49228","49229","49230","49231","49232","49233","49234","49235","49236","49237","49238","49239","49240","49241","49242","49243","49244","49245","49246","49247","49248","49249","49250","49251","49252","49253","49254","49255","49256","49257","49258","49259","49260","49261","49262","49263","49264","49265","49266","49267","49268","49269","49270","49271","49272","49273","49274","49275","49276","49277","49278","49279","49280","49281","49282","49283","49284","49285","49286","49287","49288","49289","49290","49291","49292","49293","49294","49295","49296","49297","49298","49299","49300","49301","49302","49303","49304","49305","49306","49307","49308","49309","49310","49311","49312","49313","49314","49315","49316","49317","49318","49319","49320","49321","49322","49323","49324","49325","49326","49327","49328","49329","49330","49331","49332","49333","49334","49335","49336","49337","49338","49339","49340","49341","49342","49343","49344","49345","49346","49347","49348","49349","49350","49351","49352","49353","49354","49355","49356","49357","49358","49359","49360","49361","49362","49363","49364","49365","49366","49367","49368","49369","49370","49371","49372","49373","49374","49375","49376","49377","49378","49379","49380","49381","49382","49383","49384","49385","49386","49387","49388","49389","49390","49391","49392","49393","49394","49395","49396","49397","49398","49399","49400","49401","49402","49403","49404","49405","49406","49407","49408","49409","49410","49411","49412","49413","49414","49415","49416","49417","49418","49419","49420","49421","49422","49423","49424","49425","49426","49427","49428","49429","49430","49431","49432","49433","49434","49435","49436","49437","49438","49439","49440","49441","49442","49443","49444","49445","49446","49447","49448","49449","49450","49451","49452","49453","49454","49455","49456","49457","49458","49459","49460","49461","49462","49463","49464","49465","49466","49467","49468","49469","49470","49471","49472","49473","49474","49475","49476","49477","49478","49479","49480","49481","49482","49483","49484","49485","49486","49487","49488","49489","49490","49491","49492","49493","49494","49495","49496","49497","49498","49499","49500","49501","49502","49503","49504","49505","49506","49507","49508","49509","49510","49511","49512","49513","49514","49515","49516","49517","49518","49519","49520","49521","49522","49523","49524","49525","49526","49527","49528","49529","49530","49531","49532","49533","49534","49535","49536","49537","49538","49539","49540","49541","49542","49543","49544","49545","49546","49547","49548","49549","49550","49551","49552","49553","49554","49555","49556","49557","49558","49559","49560","49561","49562","49563","49564","49565","49566","49567","49568","49569","49570","49571","49572","49573","49574","49575","49576","49577","49578","49579","49580","49581","49582","49583","49584","49585","49586","49587","49588","49589","49590","49591","49592","49593","49594","49595","49596","49597","49598","49599","49600","49601","49602","49603","49604","49605","49606","49607","49608","49609","49610","49611","49612","49613","49614","49615","49616","49617","49618","49619","49620","49621","49622","49623","49624","49625","49626","49627","49628","49629","49630","49631","49632","49633","49634","49635","49636","49637","49638","49639","49640","49641","49642","49643","49644","49645","49646","49647","49648","49649","49650","49651","49652","49653","49654","49655","49656","49657","49658","49659","49660","49661","49662","49663","49664","49665","49666","49667","49668","49669","49670","49671","49672","49673","49674","49675","49676","49677","49678","49679","49680","49681","49682","49683","49684","49685","49686","49687","49688","49689","49690","49691","49692","49693","49694","49695","49696","49697","49698","49699","49700","49701","49702","49703","49704","49705","49706","49707","49708","49709","49710","49711","49712","49713","49714","49715","49716","49717","49718","49719","49720","49721","49722","49723","49724","49725","49726","49727","49728","49729","49730","49731","49732","49733","49734","49735","49736","49737","49738","49739","49740","49741","49742","49743","49744","49745","49746","49747","49748","49749","49750","49751","49752","49753","49754","49755","49756","49757","49758","49759","49760","49761","49762","49763","49764","49765","49766","49767","49768","49769","49770","49771","49772","49773","49774","49775","49776","49777","49778","49779","49780","49781","49782","49783","49784","49785","49786","49787","49788","49789","49790","49791","49792","49793","49794","49795","49796","49797","49798","49799","49800","49801","49802","49803","49804","49805","49806","49807","49808","49809","49810","49811","49812","49813","49814","49815","49816","49817","49818","49819","49820","49821","49822","49823","49824","49825","49826","49827","49828","49829","49830","49831","49832","49833","49834","49835","49836","49837","49838","49839","49840","49841","49842","49843","49844","49845","49846","49847","49848","49849","49850","49851","49852","49853","49854","49855","49856","49857","49858","49859","49860","49861","49862","49863","49864","49865","49866","49867","49868","49869","49870","49871","49872","49873","49874","49875","49876","49877","49878","49879","49880","49881","49882","49883","49884","49885","49886","49887","49888","49889","49890","49891","49892","49893","49894","49895","49896","49897","49898","49899","49900","49901","49902","49903","49904","49905","49906","49907","49908","49909","49910","49911","49912","49913","49914","49915","49916","49917","49918","49919","49920","49921","49922","49923","49924","49925","49926","49927","49928","49929","49930","49931","49932","49933","49934","49935","49936","49937","49938","49939","49940","49941","49942","49943","49944","49945","49946","49947","49948","49949","49950","49951","49952","49953","49954","49955","49956","49957","49958","49959","49960","49961","49962","49963","49964","49965","49966","49967","49968","49969","49970","49971","49972","49973","49974","49975","49976","49977","49978","49979","49980","49981","49982","49983","49984","49985","49986","49987","49988","49989","49990","49991","49992","49993","49994","49995","49996","49997","49998","49999","50000","50001","50002","50003","50004","50005","50006","50007","50008","50009","50010","50011","50012","50013","50014","50015","50016","50017","50018","50019","50020","50021","50022","50023","50024","50025","50026","50027","50028","50029","50030","50031","50032","50033","50034","50035","50036","50037","50038","50039","50040","50041","50042","50043","50044","50045","50046","50047","50048","50049","50050","50051","50052","50053","50054","50055","50056","50057","50058","50059","50060","50061","50062","50063","50064","50065","50066","50067","50068","50069","50070","50071","50072","50073","50074","50075","50076","50077","50078","50079","50080","50081","50082","50083","50084","50085","50086","50087","50088","50089","50090","50091","50092","50093","50094","50095","50096","50097","50098","50099","50100","50101","50102","50103","50104","50105","50106","50107","50108","50109","50110","50111","50112","50113","50114","50115","50116","50117","50118","50119","50120","50121","50122","50123","50124","50125","50126","50127","50128","50129","50130","50131","50132","50133","50134","50135","50136","50137","50138","50139","50140","50141","50142","50143","50144","50145","50146","50147","50148","50149","50150","50151","50152","50153","50154","50155","50156","50157","50158","50159","50160","50161","50162","50163","50164","50165","50166","50167","50168","50169","50170","50171","50172","50173","50174","50175","50176","50177","50178","50179","50180","50181","50182","50183","50184","50185","50186","50187","50188","50189","50190","50191","50192","50193","50194","50195","50196","50197","50198","50199","50200","50201","50202","50203","50204","50205","50206","50207","50208","50209","50210","50211","50212","50213","50214","50215","50216","50217","50218","50219","50220","50221","50222","50223","50224","50225","50226","50227","50228","50229","50230","50231","50232","50233","50234","50235","50236","50237","50238","50239","50240","50241","50242","50243","50244","50245","50246","50247","50248","50249","50250","50251","50252","50253","50254","50255","50256","50257","50258","50259","50260","50261","50262","50263","50264","50265","50266","50267","50268","50269","50270","50271","50272","50273","50274","50275","50276","50277","50278","50279","50280","50281","50282","50283","50284","50285","50286","50287","50288","50289","50290","50291","50292","50293","50294","50295","50296","50297","50298","50299","50300","50301","50302","50303","50304","50305","50306","50307","50308","50309","50310","50311","50312","50313","50314","50315","50316","50317","50318","50319","50320","50321","50322","50323","50324","50325","50326","50327","50328","50329","50330","50331","50332","50333","50334","50335","50336","50337","50338","50339","50340","50341","50342","50343","50344","50345","50346","50347","50348","50349","50350","50351","50352","50353","50354","50355","50356","50357","50358","50359","50360","50361","50362","50363","50364","50365","50366","50367","50368","50369","50370","50371","50372","50373","50374","50375","50376","50377","50378","50379","50380","50381","50382","50383","50384","50385","50386","50387","50388","50389","50390","50391","50392","50393","50394","50395","50396","50397","50398","50399","50400","50401","50402","50403","50404","50405","50406","50407","50408","50409","50410","50411","50412","50413","50414","50415","50416","50417","50418","50419","50420","50421","50422","50423","50424","50425","50426","50427","50428","50429","50430","50431","50432","50433","50434","50435","50436","50437","50438","50439","50440","50441","50442","50443","50444","50445","50446","50447","50448","50449","50450","50451","50452","50453","50454","50455","50456","50457","50458","50459","50460","50461","50462","50463","50464","50465","50466","50467","50468","50469","50470","50471","50472","50473","50474","50475","50476","50477","50478","50479","50480","50481","50482","50483","50484","50485","50486","50487","50488","50489","50490","50491","50492","50493","50494","50495","50496","50497","50498","50499","50500","50501","50502","50503","50504","50505","50506","50507","50508","50509","50510","50511","50512","50513","50514","50515","50516","50517","50518","50519","50520","50521","50522","50523","50524","50525","50526","50527","50528","50529","50530","50531","50532","50533","50534","50535","50536","50537","50538","50539","50540","50541","50542","50543","50544","50545","50546","50547","50548","50549","50550","50551","50552","50553","50554","50555","50556","50557","50558","50559","50560","50561","50562","50563","50564","50565","50566","50567","50568","50569","50570","50571","50572","50573","50574","50575","50576","50577","50578","50579","50580","50581","50582","50583","50584","50585","50586","50587","50588","50589","50590","50591","50592","50593","50594","50595","50596","50597","50598","50599","50600","50601","50602","50603","50604","50605","50606","50607","50608","50609","50610","50611","50612","50613","50614","50615","50616","50617","50618","50619","50620","50621","50622","50623","50624","50625","50626","50627","50628","50629","50630","50631","50632","50633","50634","50635","50636","50637","50638","50639","50640","50641","50642","50643","50644","50645","50646","50647","50648","50649","50650","50651","50652","50653","50654","50655","50656","50657","50658","50659","50660","50661","50662","50663","50664","50665","50666","50667","50668","50669","50670","50671","50672","50673","50674","50675","50676","50677","50678","50679","50680","50681","50682","50683","50684","50685","50686","50687","50688","50689","50690","50691","50692","50693","50694","50695","50696","50697","50698","50699","50700","50701","50702","50703","50704","50705","50706","50707","50708","50709","50710","50711","50712","50713","50714","50715","50716","50717","50718","50719","50720","50721","50722","50723","50724","50725","50726","50727","50728","50729","50730","50731","50732","50733","50734","50735","50736","50737","50738","50739","50740","50741","50742","50743","50744","50745","50746","50747","50748","50749","50750","50751","50752","50753","50754","50755","50756","50757","50758","50759","50760","50761","50762","50763","50764","50765","50766","50767","50768","50769","50770","50771","50772","50773","50774","50775","50776","50777","50778","50779","50780","50781","50782","50783","50784","50785","50786","50787","50788","50789","50790","50791","50792","50793","50794","50795","50796","50797","50798","50799","50800","50801","50802","50803","50804","50805","50806","50807","50808","50809","50810","50811","50812","50813","50814","50815","50816","50817","50818","50819","50820","50821","50822","50823","50824","50825","50826","50827","50828","50829","50830","50831","50832","50833","50834","50835","50836","50837","50838","50839","50840","50841","50842","50843","50844","50845","50846","50847","50848","50849","50850","50851","50852","50853","50854","50855","50856","50857","50858","50859","50860","50861","50862","50863","50864","50865","50866","50867","50868","50869","50870","50871","50872","50873","50874","50875","50876","50877","50878","50879","50880","50881","50882","50883","50884","50885","50886","50887","50888","50889","50890","50891","50892","50893","50894","50895","50896","50897","50898","50899","50900","50901","50902","50903","50904","50905","50906","50907","50908","50909","50910","50911","50912","50913","50914","50915","50916","50917","50918","50919","50920","50921","50922","50923","50924","50925","50926","50927","50928","50929","50930","50931","50932","50933","50934","50935","50936","50937","50938","50939","50940","50941","50942","50943","50944","50945","50946","50947","50948","50949","50950","50951","50952","50953","50954","50955","50956","50957","50958","50959","50960","50961","50962","50963","50964","50965","50966","50967","50968","50969","50970","50971","50972","50973","50974","50975","50976","50977","50978","50979","50980","50981","50982","50983","50984","50985","50986","50987","50988","50989","50990","50991","50992","50993","50994","50995","50996","50997","50998","50999","51000","51001","51002","51003","51004","51005","51006","51007","51008","51009","51010","51011","51012","51013","51014","51015","51016","51017","51018","51019","51020","51021","51022","51023","51024","51025","51026","51027","51028","51029","51030","51031","51032","51033","51034","51035","51036","51037","51038","51039","51040","51041","51042","51043","51044","51045","51046","51047","51048","51049","51050","51051","51052","51053","51054","51055","51056","51057","51058","51059","51060","51061","51062","51063","51064","51065","51066","51067","51068","51069","51070","51071","51072","51073","51074","51075","51076","51077","51078","51079","51080","51081","51082","51083","51084","51085","51086","51087","51088","51089","51090","51091","51092","51093","51094","51095","51096","51097","51098","51099","51100","51101","51102","51103","51104","51105","51106","51107","51108","51109","51110","51111","51112","51113","51114","51115","51116","51117","51118","51119","51120","51121","51122","51123","51124","51125","51126","51127","51128","51129","51130","51131","51132","51133","51134","51135","51136","51137","51138","51139","51140","51141","51142","51143","51144","51145","51146","51147","51148","51149","51150","51151","51152","51153","51154","51155","51156","51157","51158","51159","51160","51161","51162","51163","51164","51165","51166","51167","51168","51169","51170","51171","51172","51173","51174","51175","51176","51177","51178","51179","51180","51181","51182","51183","51184","51185","51186","51187","51188","51189","51190","51191","51192","51193","51194","51195","51196","51197","51198","51199","51200","51201","51202","51203","51204","51205","51206","51207","51208","51209","51210","51211","51212","51213","51214","51215","51216","51217","51218","51219","51220","51221","51222","51223","51224","51225","51226","51227","51228","51229","51230","51231","51232","51233","51234","51235","51236","51237","51238","51239","51240","51241","51242","51243","51244","51245","51246","51247","51248","51249","51250","51251","51252","51253","51254","51255","51256","51257","51258","51259","51260","51261","51262","51263","51264","51265","51266","51267","51268","51269","51270","51271","51272","51273","51274","51275","51276","51277","51278","51279","51280","51281","51282","51283","51284","51285","51286","51287","51288","51289","51290","51291","51292","51293","51294","51295","51296","51297","51298","51299","51300","51301","51302","51303","51304","51305","51306","51307","51308","51309","51310","51311","51312","51313","51314","51315","51316","51317","51318","51319","51320","51321","51322","51323","51324","51325","51326","51327","51328","51329","51330","51331","51332","51333","51334","51335","51336","51337","51338","51339","51340","51341","51342","51343","51344","51345","51346","51347","51348","51349","51350","51351","51352","51353","51354","51355","51356","51357","51358","51359","51360","51361","51362","51363","51364","51365","51366","51367","51368","51369","51370","51371","51372","51373","51374","51375","51376","51377","51378","51379","51380","51381","51382","51383","51384","51385","51386","51387","51388","51389","51390","51391","51392","51393","51394","51395","51396","51397","51398","51399","51400","51401","51402","51403","51404","51405","51406","51407","51408","51409","51410","51411","51412","51413","51414","51415","51416","51417","51418","51419","51420","51421","51422","51423","51424","51425","51426","51427","51428","51429","51430","51431","51432","51433","51434","51435","51436","51437","51438","51439","51440","51441","51442","51443","51444","51445","51446","51447","51448","51449","51450","51451","51452","51453","51454","51455","51456","51457","51458","51459","51460","51461","51462","51463","51464","51465","51466","51467","51468","51469","51470","51471","51472","51473","51474","51475","51476","51477","51478","51479","51480","51481","51482","51483","51484","51485","51486","51487","51488","51489","51490","51491","51492","51493","51494","51495","51496","51497","51498","51499","51500","51501","51502","51503","51504","51505","51506","51507","51508","51509","51510","51511","51512","51513","51514","51515","51516","51517","51518","51519","51520","51521","51522","51523","51524","51525","51526","51527","51528","51529","51530","51531","51532","51533","51534","51535","51536","51537","51538","51539","51540","51541","51542","51543","51544","51545","51546","51547","51548","51549","51550","51551","51552","51553","51554","51555","51556","51557","51558","51559","51560","51561","51562","51563","51564","51565","51566","51567","51568","51569","51570","51571","51572","51573","51574","51575","51576","51577","51578","51579","51580","51581","51582","51583","51584","51585","51586","51587","51588","51589","51590","51591","51592","51593","51594","51595","51596","51597","51598","51599","51600","51601","51602","51603","51604","51605","51606","51607","51608","51609","51610","51611","51612","51613","51614","51615","51616","51617","51618","51619","51620","51621","51622","51623","51624","51625","51626","51627","51628","51629","51630","51631","51632","51633","51634","51635","51636","51637","51638","51639","51640","51641","51642","51643","51644","51645","51646","51647","51648","51649","51650","51651","51652","51653","51654","51655","51656","51657","51658","51659","51660","51661","51662","51663","51664","51665","51666","51667","51668","51669","51670","51671","51672","51673","51674","51675","51676","51677","51678","51679","51680","51681","51682","51683","51684","51685","51686","51687","51688","51689","51690","51691","51692","51693","51694","51695","51696","51697","51698","51699","51700","51701","51702","51703","51704","51705","51706","51707","51708","51709","51710","51711","51712","51713","51714","51715","51716","51717","51718","51719","51720","51721","51722","51723","51724","51725","51726","51727","51728","51729","51730","51731","51732","51733","51734","51735","51736","51737","51738","51739","51740","51741","51742","51743","51744","51745","51746","51747","51748","51749","51750","51751","51752","51753","51754","51755","51756","51757","51758","51759","51760","51761","51762","51763","51764","51765","51766","51767","51768","51769","51770","51771","51772","51773","51774","51775","51776","51777","51778","51779","51780","51781","51782","51783","51784","51785","51786","51787","51788","51789","51790","51791","51792","51793","51794","51795","51796","51797","51798","51799","51800","51801","51802","51803","51804","51805","51806","51807","51808","51809","51810","51811","51812","51813","51814","51815","51816","51817","51818","51819","51820","51821","51822","51823","51824","51825","51826","51827","51828","51829","51830","51831","51832","51833","51834","51835","51836","51837","51838","51839","51840","51841","51842","51843","51844","51845","51846","51847","51848","51849","51850","51851","51852","51853","51854","51855","51856","51857","51858","51859","51860","51861","51862","51863","51864","51865","51866","51867","51868","51869","51870","51871","51872","51873","51874","51875","51876","51877","51878","51879","51880","51881","51882","51883","51884","51885","51886","51887","51888","51889","51890","51891","51892","51893","51894","51895","51896","51897","51898","51899","51900","51901","51902","51903","51904","51905","51906","51907","51908","51909","51910","51911","51912","51913","51914","51915","51916","51917","51918","51919","51920","51921","51922","51923","51924","51925","51926","51927","51928","51929","51930","51931","51932","51933","51934","51935","51936","51937","51938","51939","51940","51941","51942","51943","51944","51945","51946","51947","51948","51949","51950","51951","51952","51953","51954","51955","51956","51957","51958","51959","51960","51961","51962","51963","51964","51965","51966","51967","51968","51969","51970","51971","51972","51973","51974","51975","51976","51977","51978","51979","51980","51981","51982","51983","51984","51985","51986","51987","51988","51989","51990","51991","51992","51993","51994","51995","51996","51997","51998","51999","52000","52001","52002","52003","52004","52005","52006","52007","52008","52009","52010","52011","52012","52013","52014","52015","52016","52017","52018","52019","52020","52021","52022","52023","52024","52025","52026","52027","52028","52029","52030","52031","52032","52033","52034","52035","52036","52037","52038","52039","52040","52041","52042","52043","52044","52045","52046","52047","52048","52049","52050","52051","52052","52053","52054","52055","52056","52057","52058","52059","52060","52061","52062","52063","52064","52065","52066","52067","52068","52069","52070","52071","52072","52073","52074","52075","52076","52077","52078","52079","52080","52081","52082","52083","52084","52085","52086","52087","52088","52089","52090","52091","52092","52093","52094","52095","52096","52097","52098","52099","52100","52101","52102","52103","52104","52105","52106","52107","52108","52109","52110","52111","52112","52113","52114","52115","52116","52117","52118","52119","52120","52121","52122","52123","52124","52125","52126","52127","52128","52129","52130","52131","52132","52133","52134","52135","52136","52137","52138","52139","52140","52141","52142","52143","52144","52145","52146","52147","52148","52149","52150","52151","52152","52153","52154","52155","52156","52157","52158","52159","52160","52161","52162","52163","52164","52165","52166","52167","52168","52169","52170","52171","52172","52173","52174","52175","52176","52177","52178","52179","52180","52181","52182","52183","52184","52185","52186","52187","52188","52189","52190","52191","52192","52193","52194","52195","52196","52197","52198","52199","52200","52201","52202","52203","52204","52205","52206","52207","52208","52209","52210","52211","52212","52213","52214","52215","52216","52217","52218","52219","52220","52221","52222","52223","52224","52225","52226","52227","52228","52229","52230","52231","52232","52233","52234","52235","52236","52237","52238","52239","52240","52241","52242","52243","52244","52245","52246","52247","52248","52249","52250","52251","52252","52253","52254","52255","52256","52257","52258","52259","52260","52261","52262","52263","52264","52265","52266","52267","52268","52269","52270","52271","52272","52273","52274","52275","52276","52277","52278","52279","52280","52281","52282","52283","52284","52285","52286","52287","52288","52289","52290","52291","52292","52293","52294","52295","52296","52297","52298","52299","52300","52301","52302","52303","52304","52305","52306","52307","52308","52309","52310","52311","52312","52313","52314","52315","52316","52317","52318","52319","52320","52321","52322","52323","52324","52325","52326","52327","52328","52329","52330","52331","52332","52333","52334","52335","52336","52337","52338","52339","52340","52341","52342","52343","52344","52345","52346","52347","52348","52349","52350","52351","52352","52353","52354","52355","52356","52357","52358","52359","52360","52361","52362","52363","52364","52365","52366","52367","52368","52369","52370","52371","52372","52373","52374","52375","52376","52377","52378","52379","52380","52381","52382","52383","52384","52385","52386","52387","52388","52389","52390","52391","52392","52393","52394","52395","52396","52397","52398","52399","52400","52401","52402","52403","52404","52405","52406","52407","52408","52409","52410","52411","52412","52413","52414","52415","52416","52417","52418","52419","52420","52421","52422","52423","52424","52425","52426","52427","52428","52429","52430","52431","52432","52433","52434","52435","52436","52437","52438","52439","52440","52441","52442","52443","52444","52445","52446","52447","52448","52449","52450","52451","52452","52453","52454","52455","52456","52457","52458","52459","52460","52461","52462","52463","52464","52465","52466","52467","52468","52469","52470","52471","52472","52473","52474","52475","52476","52477","52478","52479","52480","52481","52482","52483","52484","52485","52486","52487","52488","52489","52490","52491","52492","52493","52494","52495","52496","52497","52498","52499","52500","52501","52502","52503","52504","52505","52506","52507","52508","52509","52510","52511","52512","52513","52514","52515","52516","52517","52518","52519","52520","52521","52522","52523","52524","52525","52526","52527","52528","52529","52530","52531","52532","52533","52534","52535","52536","52537","52538","52539","52540","52541","52542","52543","52544","52545","52546","52547","52548","52549","52550","52551","52552","52553","52554","52555","52556","52557","52558","52559","52560","52561","52562","52563","52564","52565","52566","52567","52568","52569","52570","52571","52572","52573","52574","52575","52576","52577","52578","52579","52580","52581","52582","52583","52584","52585","52586","52587","52588","52589","52590","52591","52592","52593","52594","52595","52596","52597","52598","52599","52600","52601","52602","52603","52604","52605","52606","52607","52608","52609","52610","52611","52612","52613","52614","52615","52616","52617","52618","52619","52620","52621","52622","52623","52624","52625","52626","52627","52628","52629","52630","52631","52632","52633","52634","52635","52636","52637","52638","52639","52640","52641","52642","52643","52644","52645","52646","52647","52648","52649","52650","52651","52652","52653","52654","52655","52656","52657","52658","52659","52660","52661","52662","52663","52664","52665","52666","52667","52668","52669","52670","52671","52672","52673","52674","52675","52676","52677","52678","52679","52680","52681","52682","52683","52684","52685","52686","52687","52688","52689","52690","52691","52692","52693","52694","52695","52696","52697","52698","52699","52700","52701","52702","52703","52704","52705","52706","52707","52708","52709","52710","52711","52712","52713","52714","52715","52716","52717","52718","52719","52720","52721","52722","52723","52724","52725","52726","52727","52728","52729","52730","52731","52732","52733","52734","52735","52736","52737","52738","52739","52740","52741","52742","52743","52744","52745","52746","52747","52748","52749","52750","52751","52752","52753","52754","52755","52756","52757","52758","52759","52760","52761","52762","52763","52764","52765","52766","52767","52768","52769","52770","52771","52772","52773","52774","52775","52776","52777","52778","52779","52780","52781","52782","52783","52784","52785","52786","52787","52788","52789","52790","52791","52792","52793","52794","52795","52796","52797","52798","52799","52800","52801","52802","52803","52804","52805","52806","52807","52808","52809","52810","52811","52812","52813","52814","52815","52816","52817","52818","52819","52820","52821","52822","52823","52824","52825","52826","52827","52828","52829","52830","52831","52832","52833","52834","52835","52836","52837","52838","52839","52840","52841","52842","52843","52844","52845","52846","52847","52848","52849","52850","52851","52852","52853","52854","52855","52856","52857","52858","52859","52860","52861","52862","52863","52864","52865","52866","52867","52868","52869","52870","52871","52872","52873","52874","52875","52876","52877","52878","52879","52880","52881","52882","52883","52884","52885","52886","52887","52888","52889","52890","52891","52892","52893","52894","52895","52896","52897","52898","52899","52900","52901","52902","52903","52904","52905","52906","52907","52908","52909","52910","52911","52912","52913","52914","52915","52916","52917","52918","52919","52920","52921","52922","52923","52924","52925","52926","52927","52928","52929","52930","52931","52932","52933","52934","52935","52936","52937","52938","52939","52940","52941","52942","52943","52944","52945","52946","52947","52948","52949","52950","52951","52952","52953","52954","52955","52956","52957","52958","52959","52960","52961","52962","52963","52964","52965","52966","52967","52968","52969","52970","52971","52972","52973","52974","52975","52976","52977","52978","52979","52980","52981","52982","52983","52984","52985","52986","52987","52988","52989","52990","52991","52992","52993","52994","52995","52996","52997","52998","52999","53000","53001","53002","53003","53004","53005","53006","53007","53008","53009","53010","53011","53012","53013","53014","53015","53016","53017","53018","53019","53020","53021","53022","53023","53024","53025","53026","53027","53028","53029","53030","53031","53032","53033","53034","53035","53036","53037","53038","53039","53040","53041","53042","53043","53044","53045","53046","53047","53048","53049","53050","53051","53052","53053","53054","53055","53056","53057","53058","53059","53060","53061","53062","53063","53064","53065","53066","53067","53068","53069","53070","53071","53072","53073","53074","53075","53076","53077","53078","53079","53080","53081","53082","53083","53084","53085","53086","53087","53088","53089","53090","53091","53092","53093","53094","53095","53096","53097","53098","53099","53100","53101","53102","53103","53104","53105","53106","53107","53108","53109","53110","53111","53112","53113","53114","53115","53116","53117","53118","53119","53120","53121","53122","53123","53124","53125","53126","53127","53128","53129","53130","53131","53132","53133","53134","53135","53136","53137","53138","53139","53140","53141","53142","53143","53144","53145","53146","53147","53148","53149","53150","53151","53152","53153","53154","53155","53156","53157","53158","53159","53160","53161","53162","53163","53164","53165","53166","53167","53168","53169","53170","53171","53172","53173","53174","53175","53176","53177","53178","53179","53180","53181","53182","53183","53184","53185","53186","53187","53188","53189","53190","53191","53192","53193","53194","53195","53196","53197","53198","53199","53200","53201","53202","53203","53204","53205","53206","53207","53208","53209","53210","53211","53212","53213","53214","53215","53216","53217","53218","53219","53220","53221","53222","53223","53224","53225","53226","53227","53228","53229","53230","53231","53232","53233","53234","53235","53236","53237","53238","53239","53240","53241","53242","53243","53244","53245","53246","53247","53248","53249","53250","53251","53252","53253","53254","53255","53256","53257","53258","53259","53260","53261","53262","53263","53264","53265","53266","53267","53268","53269","53270","53271","53272","53273","53274","53275","53276","53277","53278","53279","53280","53281","53282","53283","53284","53285","53286","53287","53288","53289","53290","53291","53292","53293","53294","53295","53296","53297","53298","53299","53300","53301","53302","53303","53304","53305","53306","53307","53308","53309","53310","53311","53312","53313","53314","53315","53316","53317","53318","53319","53320","53321","53322","53323","53324","53325","53326","53327","53328","53329","53330","53331","53332","53333","53334","53335","53336","53337","53338","53339","53340","53341","53342","53343","53344","53345","53346","53347","53348","53349","53350","53351","53352","53353","53354","53355","53356","53357","53358","53359","53360","53361","53362","53363","53364","53365","53366","53367","53368","53369","53370","53371","53372","53373","53374","53375","53376","53377","53378","53379","53380","53381","53382","53383","53384","53385","53386","53387","53388","53389","53390","53391","53392","53393","53394","53395","53396","53397","53398","53399","53400","53401","53402","53403","53404","53405","53406","53407","53408","53409","53410","53411","53412","53413","53414","53415","53416","53417","53418","53419","53420","53421","53422","53423","53424","53425","53426","53427","53428","53429","53430","53431","53432","53433","53434","53435","53436","53437","53438","53439","53440","53441","53442","53443","53444","53445","53446","53447","53448","53449","53450","53451","53452","53453","53454","53455","53456","53457","53458","53459","53460","53461","53462","53463","53464","53465","53466","53467","53468","53469","53470","53471","53472","53473","53474","53475","53476","53477","53478","53479","53480","53481","53482","53483","53484","53485","53486","53487","53488","53489","53490","53491","53492","53493","53494","53495","53496","53497","53498","53499","53500","53501","53502","53503","53504","53505","53506","53507","53508","53509","53510","53511","53512","53513","53514","53515","53516","53517","53518","53519","53520","53521","53522","53523","53524","53525","53526","53527","53528","53529","53530","53531","53532","53533","53534","53535","53536","53537","53538","53539","53540","53541","53542","53543","53544","53545","53546","53547","53548","53549","53550","53551","53552","53553","53554","53555","53556","53557","53558","53559","53560","53561","53562","53563","53564","53565","53566","53567","53568","53569","53570","53571","53572","53573","53574","53575","53576","53577","53578","53579","53580","53581","53582","53583","53584","53585","53586","53587","53588","53589","53590","53591","53592","53593","53594","53595","53596","53597","53598","53599","53600","53601","53602","53603","53604","53605","53606","53607","53608","53609","53610","53611","53612","53613","53614","53615","53616","53617","53618","53619","53620","53621","53622","53623","53624","53625","53626","53627","53628","53629","53630","53631","53632","53633","53634","53635","53636","53637","53638","53639","53640","53641","53642","53643","53644","53645","53646","53647","53648","53649","53650","53651","53652","53653","53654","53655","53656","53657","53658","53659","53660","53661","53662","53663","53664","53665","53666","53667","53668","53669","53670","53671","53672","53673","53674","53675","53676","53677","53678","53679","53680","53681","53682","53683","53684","53685","53686","53687","53688","53689","53690","53691","53692","53693","53694","53695","53696","53697","53698","53699","53700","53701","53702","53703","53704","53705","53706","53707","53708","53709","53710","53711","53712","53713","53714","53715","53716","53717","53718","53719","53720","53721","53722","53723","53724","53725","53726","53727","53728","53729","53730","53731","53732","53733","53734","53735","53736","53737","53738","53739","53740","53741","53742","53743","53744","53745","53746","53747","53748","53749","53750","53751","53752","53753","53754","53755","53756","53757","53758","53759","53760","53761","53762","53763","53764","53765","53766","53767","53768","53769","53770","53771","53772","53773","53774","53775","53776","53777","53778","53779","53780","53781","53782","53783","53784","53785","53786","53787","53788","53789","53790","53791","53792","53793","53794","53795","53796","53797","53798","53799","53800","53801","53802","53803","53804","53805","53806","53807","53808","53809","53810","53811","53812","53813","53814","53815","53816","53817","53818","53819","53820","53821","53822","53823","53824","53825","53826","53827","53828","53829","53830","53831","53832","53833","53834","53835","53836","53837","53838","53839","53840","53841","53842","53843","53844","53845","53846","53847","53848","53849","53850","53851","53852","53853","53854","53855","53856","53857","53858","53859","53860","53861","53862","53863","53864","53865","53866","53867","53868","53869","53870","53871","53872","53873","53874","53875","53876","53877","53878","53879","53880","53881","53882","53883","53884","53885","53886","53887","53888","53889","53890","53891","53892","53893","53894","53895","53896","53897","53898","53899","53900","53901","53902","53903","53904","53905","53906","53907","53908","53909","53910","53911","53912","53913","53914","53915","53916","53917","53918","53919","53920","53921","53922","53923","53924","53925","53926","53927","53928","53929","53930","53931","53932","53933","53934","53935","53936","53937","53938","53939","53940","53941","53942","53943","53944","53945","53946","53947","53948","53949","53950","53951","53952","53953","53954","53955","53956","53957","53958","53959","53960","53961","53962","53963","53964","53965","53966","53967","53968","53969","53970","53971","53972","53973","53974","53975","53976","53977","53978","53979","53980","53981","53982","53983","53984","53985","53986","53987","53988","53989","53990","53991","53992","53993","53994","53995","53996","53997","53998","53999","54000","54001","54002","54003","54004","54005","54006","54007","54008","54009","54010","54011","54012","54013","54014","54015","54016","54017","54018","54019","54020","54021","54022","54023","54024","54025","54026","54027","54028","54029","54030","54031","54032","54033","54034","54035","54036","54037","54038","54039","54040","54041","54042","54043","54044","54045","54046","54047","54048","54049","54050","54051","54052","54053","54054","54055","54056","54057","54058","54059","54060","54061","54062","54063","54064","54065","54066","54067","54068","54069","54070","54071","54072","54073","54074","54075","54076","54077","54078","54079","54080","54081","54082","54083","54084","54085","54086","54087","54088","54089","54090","54091","54092","54093","54094","54095","54096","54097","54098","54099","54100","54101","54102","54103","54104","54105","54106","54107","54108","54109","54110","54111","54112","54113","54114","54115","54116","54117","54118","54119","54120","54121","54122","54123","54124","54125","54126","54127","54128","54129","54130","54131","54132","54133","54134","54135","54136","54137","54138","54139","54140","54141","54142","54143","54144","54145","54146","54147","54148","54149","54150","54151","54152","54153","54154","54155","54156","54157","54158","54159","54160","54161","54162","54163","54164","54165","54166","54167","54168","54169","54170","54171","54172","54173","54174","54175","54176","54177","54178","54179","54180","54181","54182","54183","54184","54185","54186","54187","54188","54189","54190","54191","54192","54193","54194","54195","54196","54197","54198","54199","54200","54201","54202","54203","54204","54205","54206","54207","54208","54209","54210","54211","54212","54213","54214","54215","54216","54217","54218","54219","54220","54221","54222","54223","54224","54225","54226","54227","54228","54229","54230","54231","54232","54233","54234","54235","54236","54237","54238","54239","54240","54241","54242","54243","54244","54245","54246","54247","54248","54249","54250","54251","54252","54253","54254","54255","54256","54257","54258","54259","54260","54261","54262","54263","54264","54265","54266","54267","54268","54269","54270","54271","54272","54273","54274","54275","54276","54277","54278","54279","54280","54281","54282","54283","54284","54285","54286","54287","54288","54289","54290","54291","54292","54293","54294","54295","54296","54297","54298","54299","54300","54301","54302","54303","54304","54305","54306","54307","54308","54309","54310","54311","54312","54313","54314","54315","54316","54317","54318","54319","54320","54321","54322","54323","54324","54325","54326","54327","54328","54329","54330","54331","54332","54333","54334","54335","54336","54337","54338","54339","54340","54341","54342","54343","54344","54345","54346","54347","54348","54349","54350","54351","54352","54353","54354","54355","54356","54357","54358","54359","54360","54361","54362","54363","54364","54365","54366","54367","54368","54369","54370","54371","54372","54373","54374","54375","54376","54377","54378","54379","54380","54381","54382","54383","54384","54385","54386","54387","54388","54389","54390","54391","54392","54393","54394","54395","54396","54397","54398","54399","54400","54401","54402","54403","54404","54405","54406","54407","54408","54409","54410","54411","54412","54413","54414","54415","54416","54417","54418","54419","54420","54421","54422","54423","54424","54425","54426","54427","54428","54429","54430","54431","54432","54433","54434","54435","54436","54437","54438","54439","54440","54441","54442","54443","54444","54445","54446","54447","54448","54449","54450","54451","54452","54453","54454","54455","54456","54457","54458","54459","54460","54461","54462","54463","54464","54465","54466","54467","54468","54469","54470","54471","54472","54473","54474","54475","54476","54477","54478","54479","54480","54481","54482","54483","54484","54485","54486","54487","54488","54489","54490","54491","54492","54493","54494","54495","54496","54497","54498","54499","54500","54501","54502","54503","54504","54505","54506","54507","54508","54509","54510","54511","54512","54513","54514","54515","54516","54517","54518","54519","54520","54521","54522","54523","54524","54525","54526","54527","54528","54529","54530","54531","54532","54533","54534","54535","54536","54537","54538","54539","54540","54541","54542","54543","54544","54545","54546","54547","54548","54549","54550","54551","54552","54553","54554","54555","54556","54557","54558","54559","54560","54561","54562","54563","54564","54565","54566","54567","54568","54569","54570","54571","54572","54573","54574","54575","54576","54577","54578","54579","54580","54581","54582","54583","54584","54585","54586","54587","54588","54589","54590","54591","54592","54593","54594","54595","54596","54597","54598","54599","54600","54601","54602","54603","54604","54605","54606","54607","54608","54609","54610","54611","54612","54613","54614","54615","54616","54617","54618","54619","54620","54621","54622","54623","54624","54625","54626","54627","54628","54629","54630","54631","54632","54633","54634","54635","54636","54637","54638","54639","54640","54641","54642","54643","54644","54645","54646","54647","54648","54649","54650","54651","54652","54653","54654","54655","54656","54657","54658","54659","54660","54661","54662","54663","54664","54665","54666","54667","54668","54669","54670","54671","54672","54673","54674","54675","54676","54677","54678","54679","54680","54681","54682","54683","54684","54685","54686","54687","54688","54689","54690","54691","54692","54693","54694","54695","54696","54697","54698","54699","54700","54701","54702","54703","54704","54705","54706","54707","54708","54709","54710","54711","54712","54713","54714","54715","54716","54717","54718","54719","54720","54721","54722","54723","54724","54725","54726","54727","54728","54729","54730","54731","54732","54733","54734","54735","54736","54737","54738","54739","54740","54741","54742","54743","54744","54745","54746","54747","54748","54749","54750","54751","54752","54753","54754","54755","54756","54757","54758","54759","54760","54761","54762","54763","54764","54765","54766","54767","54768","54769","54770","54771","54772","54773","54774","54775","54776","54777","54778","54779","54780","54781","54782","54783","54784","54785","54786","54787","54788","54789","54790","54791","54792","54793","54794","54795","54796","54797","54798","54799","54800","54801","54802","54803","54804","54805","54806","54807","54808","54809","54810","54811","54812","54813","54814","54815","54816","54817","54818","54819","54820","54821","54822","54823","54824","54825","54826","54827","54828","54829","54830","54831","54832","54833","54834","54835","54836","54837","54838","54839","54840","54841","54842","54843","54844","54845","54846","54847","54848","54849","54850","54851","54852","54853","54854","54855","54856","54857","54858","54859","54860","54861","54862","54863","54864","54865","54866","54867","54868","54869","54870","54871","54872","54873","54874","54875","54876","54877","54878","54879","54880","54881","54882","54883","54884","54885","54886","54887","54888","54889","54890","54891","54892","54893","54894","54895","54896","54897","54898","54899","54900","54901","54902","54903","54904","54905","54906","54907","54908","54909","54910","54911","54912","54913","54914","54915","54916","54917","54918","54919","54920","54921","54922","54923","54924","54925","54926","54927","54928","54929","54930","54931","54932","54933","54934","54935","54936","54937","54938","54939","54940","54941","54942","54943","54944","54945","54946","54947","54948","54949","54950","54951","54952","54953","54954","54955","54956","54957","54958","54959","54960","54961","54962","54963","54964","54965","54966","54967","54968","54969","54970","54971","54972","54973","54974","54975","54976","54977","54978","54979","54980","54981","54982","54983","54984","54985","54986","54987","54988","54989","54990","54991","54992","54993","54994","54995","54996","54997","54998","54999","55000","55001","55002","55003","55004","55005","55006","55007","55008","55009","55010","55011","55012","55013","55014","55015","55016","55017","55018","55019","55020","55021","55022","55023","55024","55025","55026","55027","55028","55029","55030","55031","55032","55033","55034","55035","55036","55037","55038","55039","55040","55041","55042","55043","55044","55045","55046","55047","55048","55049","55050","55051","55052","55053","55054","55055","55056","55057","55058","55059","55060","55061","55062","55063","55064","55065","55066","55067","55068","55069","55070","55071","55072","55073","55074","55075","55076","55077","55078","55079","55080","55081","55082","55083","55084","55085","55086","55087","55088","55089","55090","55091","55092","55093","55094","55095","55096","55097","55098","55099","55100","55101","55102","55103","55104","55105","55106","55107","55108","55109","55110","55111","55112","55113","55114","55115","55116","55117","55118","55119","55120","55121","55122","55123","55124","55125","55126","55127","55128","55129","55130","55131","55132","55133","55134","55135","55136","55137","55138","55139","55140","55141","55142","55143","55144","55145","55146","55147","55148","55149","55150","55151","55152","55153","55154","55155","55156","55157","55158","55159","55160","55161","55162","55163","55164","55165","55166","55167","55168","55169","55170","55171","55172","55173","55174","55175","55176","55177","55178","55179","55180","55181","55182","55183","55184","55185","55186","55187","55188","55189","55190","55191","55192","55193","55194","55195","55196","55197","55198","55199","55200","55201","55202","55203","55204","55205","55206","55207","55208","55209","55210","55211","55212","55213","55214","55215","55216","55217","55218","55219","55220","55221","55222","55223","55224","55225","55226","55227","55228","55229","55230","55231","55232","55233","55234","55235","55236","55237","55238","55239","55240","55241","55242","55243","55244","55245","55246","55247","55248","55249","55250","55251","55252","55253","55254","55255","55256","55257","55258","55259","55260","55261","55262","55263","55264","55265","55266","55267","55268","55269","55270","55271","55272","55273","55274","55275","55276","55277","55278","55279","55280","55281","55282","55283","55284","55285","55286","55287","55288","55289","55290","55291","55292","55293","55294","55295","55296","55297","55298","55299","55300","55301","55302","55303","55304","55305","55306","55307","55308","55309","55310","55311","55312","55313","55314","55315","55316","55317","55318","55319","55320","55321","55322","55323","55324","55325","55326","55327","55328","55329","55330","55331","55332","55333","55334","55335","55336","55337","55338","55339","55340","55341","55342","55343","55344","55345","55346","55347","55348","55349","55350","55351","55352","55353","55354","55355","55356","55357","55358","55359","55360","55361","55362","55363","55364","55365","55366","55367","55368","55369","55370","55371","55372","55373","55374","55375","55376","55377","55378","55379","55380","55381","55382","55383","55384","55385","55386","55387","55388","55389","55390","55391","55392","55393","55394","55395","55396","55397","55398","55399","55400","55401","55402","55403","55404","55405","55406","55407","55408","55409","55410","55411","55412","55413","55414","55415","55416","55417","55418","55419","55420","55421","55422","55423","55424","55425","55426","55427","55428","55429","55430","55431","55432","55433","55434","55435","55436","55437","55438","55439","55440","55441","55442","55443","55444","55445","55446","55447","55448","55449","55450","55451","55452","55453","55454","55455","55456","55457","55458","55459","55460","55461","55462","55463","55464","55465","55466","55467","55468","55469","55470","55471","55472","55473","55474","55475","55476","55477","55478","55479","55480","55481","55482","55483","55484","55485","55486","55487","55488","55489","55490","55491","55492","55493","55494","55495","55496","55497","55498","55499","55500","55501","55502","55503","55504","55505","55506","55507","55508","55509","55510","55511","55512","55513","55514","55515","55516","55517","55518","55519","55520","55521","55522","55523","55524","55525","55526","55527","55528","55529","55530","55531","55532","55533","55534","55535","55536","55537","55538","55539","55540","55541","55542","55543","55544","55545","55546","55547","55548","55549","55550","55551","55552","55553","55554","55555","55556","55557","55558","55559","55560","55561","55562","55563","55564","55565","55566","55567","55568","55569","55570","55571","55572","55573","55574","55575","55576","55577","55578","55579","55580","55581","55582","55583","55584","55585","55586","55587","55588","55589","55590","55591","55592","55593","55594","55595","55596","55597","55598","55599","55600","55601","55602","55603","55604","55605","55606","55607","55608","55609","55610","55611","55612","55613","55614","55615","55616","55617","55618","55619","55620","55621","55622","55623","55624","55625","55626","55627","55628","55629","55630","55631","55632","55633","55634","55635","55636","55637","55638","55639","55640","55641","55642","55643","55644","55645","55646","55647","55648","55649","55650","55651","55652","55653","55654","55655","55656","55657","55658","55659","55660","55661","55662","55663","55664","55665","55666","55667","55668","55669","55670","55671","55672","55673","55674","55675","55676","55677","55678","55679","55680","55681","55682","55683","55684","55685","55686","55687","55688","55689","55690","55691","55692","55693","55694","55695","55696","55697","55698","55699","55700","55701","55702","55703","55704","55705","55706","55707","55708","55709","55710","55711","55712","55713","55714","55715","55716","55717","55718","55719","55720","55721","55722","55723","55724","55725","55726","55727","55728","55729","55730","55731","55732","55733","55734","55735","55736","55737","55738","55739","55740","55741","55742","55743","55744","55745","55746","55747","55748","55749","55750","55751","55752","55753","55754","55755","55756","55757","55758","55759","55760","55761","55762","55763","55764","55765","55766","55767","55768","55769","55770","55771","55772","55773","55774","55775","55776","55777","55778","55779","55780","55781","55782","55783","55784","55785","55786","55787","55788","55789","55790","55791","55792","55793","55794","55795","55796","55797","55798","55799","55800","55801","55802","55803","55804","55805","55806","55807","55808","55809","55810","55811","55812","55813","55814","55815","55816","55817","55818","55819","55820","55821","55822","55823","55824","55825","55826","55827","55828","55829","55830","55831","55832","55833","55834","55835","55836","55837","55838","55839","55840","55841","55842","55843","55844","55845","55846","55847","55848","55849","55850","55851","55852","55853","55854","55855","55856","55857","55858","55859","55860","55861","55862","55863","55864","55865","55866","55867","55868","55869","55870","55871","55872","55873","55874","55875","55876","55877","55878","55879","55880","55881","55882","55883","55884","55885","55886","55887","55888","55889","55890","55891","55892","55893","55894","55895","55896","55897","55898","55899","55900","55901","55902","55903","55904","55905","55906","55907","55908","55909","55910","55911","55912","55913","55914","55915","55916","55917","55918","55919","55920","55921","55922","55923","55924","55925","55926","55927","55928","55929","55930","55931","55932","55933","55934","55935","55936","55937","55938","55939","55940","55941","55942","55943","55944","55945","55946","55947","55948","55949","55950","55951","55952","55953","55954","55955","55956","55957","55958","55959","55960","55961","55962","55963","55964","55965","55966","55967","55968","55969","55970","55971","55972","55973","55974","55975","55976","55977","55978","55979","55980","55981","55982","55983","55984","55985","55986","55987","55988","55989","55990","55991","55992","55993","55994","55995","55996","55997","55998","55999","56000","56001","56002","56003","56004","56005","56006","56007","56008","56009","56010","56011","56012","56013","56014","56015","56016","56017","56018","56019","56020","56021","56022","56023","56024","56025","56026","56027","56028","56029","56030","56031","56032","56033","56034","56035","56036","56037","56038","56039","56040","56041","56042","56043","56044","56045","56046","56047","56048","56049","56050","56051","56052","56053","56054","56055","56056","56057","56058","56059","56060","56061","56062","56063","56064","56065","56066","56067","56068","56069","56070","56071","56072","56073","56074","56075","56076","56077","56078","56079","56080","56081","56082","56083","56084","56085","56086","56087","56088","56089","56090","56091","56092","56093","56094","56095","56096","56097","56098","56099","56100","56101","56102","56103","56104","56105","56106","56107","56108","56109","56110","56111","56112","56113","56114","56115","56116","56117","56118","56119","56120","56121","56122","56123","56124","56125","56126","56127","56128","56129","56130","56131","56132","56133","56134","56135","56136","56137","56138","56139","56140","56141","56142","56143","56144","56145","56146","56147","56148","56149","56150","56151","56152","56153","56154","56155","56156","56157","56158","56159","56160","56161","56162","56163","56164","56165","56166","56167","56168","56169","56170","56171","56172","56173","56174","56175","56176","56177","56178","56179","56180","56181","56182","56183","56184","56185","56186","56187","56188","56189","56190","56191","56192","56193","56194","56195","56196","56197","56198","56199","56200","56201","56202","56203","56204","56205","56206","56207","56208","56209","56210","56211","56212","56213","56214","56215","56216","56217","56218","56219","56220","56221","56222","56223","56224","56225","56226","56227","56228","56229","56230","56231","56232","56233","56234","56235","56236","56237","56238","56239","56240","56241","56242","56243","56244","56245","56246","56247","56248","56249","56250","56251","56252","56253","56254","56255","56256","56257","56258","56259","56260","56261","56262","56263","56264","56265","56266","56267","56268","56269","56270","56271","56272","56273","56274","56275","56276","56277","56278","56279","56280","56281","56282","56283","56284","56285","56286","56287","56288","56289","56290","56291","56292","56293","56294","56295","56296","56297","56298","56299","56300","56301","56302","56303","56304","56305","56306","56307","56308","56309","56310","56311","56312","56313","56314","56315","56316","56317","56318","56319","56320","56321","56322","56323","56324","56325","56326","56327","56328","56329","56330","56331","56332","56333","56334","56335","56336","56337","56338","56339","56340","56341","56342","56343","56344","56345","56346","56347","56348","56349","56350","56351","56352","56353","56354","56355","56356","56357","56358","56359","56360","56361","56362","56363","56364","56365","56366","56367","56368","56369","56370","56371","56372","56373","56374","56375","56376","56377","56378","56379","56380","56381","56382","56383","56384","56385","56386","56387","56388","56389","56390","56391","56392","56393","56394","56395","56396","56397","56398","56399","56400","56401","56402","56403","56404","56405","56406","56407","56408","56409","56410","56411","56412","56413","56414","56415","56416","56417","56418","56419","56420","56421","56422","56423","56424","56425","56426","56427","56428","56429","56430","56431","56432","56433","56434","56435","56436","56437","56438","56439","56440","56441","56442","56443","56444","56445","56446","56447","56448","56449","56450","56451","56452","56453","56454","56455","56456","56457","56458","56459","56460","56461","56462","56463","56464","56465","56466","56467","56468","56469","56470","56471","56472","56473","56474","56475","56476","56477","56478","56479","56480","56481","56482","56483","56484","56485","56486","56487","56488","56489","56490","56491","56492","56493","56494","56495","56496","56497","56498","56499","56500","56501","56502","56503","56504","56505","56506","56507","56508","56509","56510","56511","56512","56513","56514","56515","56516","56517","56518","56519","56520","56521","56522","56523","56524","56525","56526","56527","56528","56529","56530","56531","56532","56533","56534","56535","56536","56537","56538","56539","56540","56541","56542","56543","56544","56545","56546","56547","56548","56549","56550","56551","56552","56553","56554","56555","56556","56557","56558","56559","56560","56561","56562","56563","56564","56565","56566","56567","56568","56569","56570","56571","56572","56573","56574","56575","56576","56577","56578","56579","56580","56581","56582","56583","56584","56585","56586","56587","56588","56589","56590","56591","56592","56593","56594","56595","56596","56597","56598","56599","56600","56601","56602","56603","56604","56605","56606","56607","56608","56609","56610","56611","56612","56613","56614","56615","56616","56617","56618","56619","56620","56621","56622","56623","56624","56625","56626","56627","56628","56629","56630","56631","56632","56633","56634","56635","56636","56637","56638","56639","56640","56641","56642","56643","56644","56645","56646","56647","56648","56649","56650","56651","56652","56653","56654","56655","56656","56657","56658","56659","56660","56661","56662","56663","56664","56665","56666","56667","56668","56669","56670","56671","56672","56673","56674","56675","56676","56677","56678","56679","56680","56681","56682","56683","56684","56685","56686","56687","56688","56689","56690","56691","56692","56693","56694","56695","56696","56697","56698","56699","56700","56701","56702","56703","56704","56705","56706","56707","56708","56709","56710","56711","56712","56713","56714","56715","56716","56717","56718","56719","56720","56721","56722","56723","56724","56725","56726","56727","56728","56729","56730","56731","56732","56733","56734","56735","56736","56737","56738","56739","56740","56741","56742","56743","56744","56745","56746","56747","56748","56749","56750","56751","56752","56753","56754","56755","56756","56757","56758","56759","56760","56761","56762","56763","56764","56765","56766","56767","56768","56769","56770","56771","56772","56773","56774","56775","56776","56777","56778","56779","56780","56781","56782","56783","56784","56785","56786","56787","56788","56789","56790","56791","56792","56793","56794","56795","56796","56797","56798","56799","56800","56801","56802","56803","56804","56805","56806","56807","56808","56809","56810","56811","56812","56813","56814","56815","56816","56817","56818","56819","56820","56821","56822","56823","56824","56825","56826","56827","56828","56829","56830","56831","56832","56833","56834","56835","56836","56837","56838","56839","56840","56841","56842","56843","56844","56845","56846","56847","56848","56849","56850","56851","56852","56853","56854","56855","56856","56857","56858","56859","56860","56861","56862","56863","56864","56865","56866","56867","56868","56869","56870","56871","56872","56873","56874","56875","56876","56877","56878","56879","56880","56881","56882","56883","56884","56885","56886","56887","56888","56889","56890","56891","56892","56893","56894","56895","56896","56897","56898","56899","56900","56901","56902","56903","56904","56905","56906","56907","56908","56909","56910","56911","56912","56913","56914","56915","56916","56917","56918","56919","56920","56921","56922","56923","56924","56925","56926","56927","56928","56929","56930","56931","56932","56933","56934","56935","56936","56937","56938","56939","56940","56941","56942","56943","56944","56945","56946","56947","56948","56949","56950","56951","56952","56953","56954","56955","56956","56957","56958","56959","56960","56961","56962","56963","56964","56965","56966","56967","56968","56969","56970","56971","56972","56973","56974","56975","56976","56977","56978","56979","56980","56981","56982","56983","56984","56985","56986","56987","56988","56989","56990","56991","56992","56993","56994","56995","56996","56997","56998","56999","57000","57001","57002","57003","57004","57005","57006","57007","57008","57009","57010","57011","57012","57013","57014","57015","57016","57017","57018","57019","57020","57021","57022","57023","57024","57025","57026","57027","57028","57029","57030","57031","57032","57033","57034","57035","57036","57037","57038","57039","57040","57041","57042","57043","57044","57045","57046","57047","57048","57049","57050","57051","57052","57053","57054","57055","57056","57057","57058","57059","57060","57061","57062","57063","57064","57065","57066","57067","57068","57069","57070","57071","57072","57073","57074","57075","57076","57077","57078","57079","57080","57081","57082","57083","57084","57085","57086","57087","57088","57089","57090","57091","57092","57093","57094","57095","57096","57097","57098","57099","57100","57101","57102","57103","57104","57105","57106","57107","57108","57109","57110","57111","57112","57113","57114","57115","57116","57117","57118","57119","57120","57121","57122","57123","57124","57125","57126","57127","57128","57129","57130","57131","57132","57133","57134","57135","57136","57137","57138","57139","57140","57141","57142","57143","57144","57145","57146","57147","57148","57149","57150","57151","57152","57153","57154","57155","57156","57157","57158","57159","57160","57161","57162","57163","57164","57165","57166","57167","57168","57169","57170","57171","57172","57173","57174","57175","57176","57177","57178","57179","57180","57181","57182","57183","57184","57185","57186","57187","57188","57189","57190","57191","57192","57193","57194","57195","57196","57197","57198","57199","57200","57201","57202","57203","57204","57205","57206","57207","57208","57209","57210","57211","57212","57213","57214","57215","57216","57217","57218","57219","57220","57221","57222","57223","57224","57225","57226","57227","57228","57229","57230","57231","57232","57233","57234","57235","57236","57237","57238","57239","57240","57241","57242","57243","57244","57245","57246","57247","57248","57249","57250","57251","57252","57253","57254","57255","57256","57257","57258","57259","57260","57261","57262","57263","57264","57265","57266","57267","57268","57269","57270","57271","57272","57273","57274","57275","57276","57277","57278","57279","57280","57281","57282","57283","57284","57285","57286","57287","57288","57289","57290","57291","57292","57293","57294","57295","57296","57297","57298","57299","57300","57301","57302","57303","57304","57305","57306","57307","57308","57309","57310","57311","57312","57313","57314","57315","57316","57317","57318","57319","57320","57321","57322","57323","57324","57325","57326","57327","57328","57329","57330","57331","57332","57333","57334","57335","57336","57337","57338","57339","57340","57341","57342","57343","57344","57345","57346","57347","57348","57349","57350","57351","57352","57353","57354","57355","57356","57357","57358","57359","57360","57361","57362","57363","57364","57365","57366","57367","57368","57369","57370","57371","57372","57373","57374","57375","57376","57377","57378","57379","57380","57381","57382","57383","57384","57385","57386","57387","57388","57389","57390","57391","57392","57393","57394","57395","57396","57397","57398","57399","57400","57401","57402","57403","57404","57405","57406","57407","57408","57409","57410","57411","57412","57413","57414","57415","57416","57417","57418","57419","57420","57421","57422","57423","57424","57425","57426","57427","57428","57429","57430","57431","57432","57433","57434","57435","57436","57437","57438","57439","57440","57441","57442","57443","57444","57445","57446","57447","57448","57449","57450","57451","57452","57453","57454","57455","57456","57457","57458","57459","57460","57461","57462","57463","57464","57465","57466","57467","57468","57469","57470","57471","57472","57473","57474","57475","57476","57477","57478","57479","57480","57481","57482","57483","57484","57485","57486","57487","57488","57489","57490","57491","57492","57493","57494","57495","57496","57497","57498","57499","57500","57501","57502","57503","57504","57505","57506","57507","57508","57509","57510","57511","57512","57513","57514","57515","57516","57517","57518","57519","57520","57521","57522","57523","57524","57525","57526","57527","57528","57529","57530","57531","57532","57533","57534","57535","57536","57537","57538","57539","57540","57541","57542","57543","57544","57545","57546","57547","57548","57549","57550","57551","57552","57553","57554","57555","57556","57557","57558","57559","57560","57561","57562","57563","57564","57565","57566","57567","57568","57569","57570","57571","57572","57573","57574","57575","57576","57577","57578","57579","57580","57581","57582","57583","57584","57585","57586","57587","57588","57589","57590","57591","57592","57593","57594","57595","57596","57597","57598","57599","57600","57601","57602","57603","57604","57605","57606","57607","57608","57609","57610","57611","57612","57613","57614","57615","57616","57617","57618","57619","57620","57621","57622","57623","57624","57625","57626","57627","57628","57629","57630","57631","57632","57633","57634","57635","57636","57637","57638","57639","57640","57641","57642","57643","57644","57645","57646","57647","57648","57649","57650","57651","57652","57653","57654","57655","57656","57657","57658","57659","57660","57661","57662","57663","57664","57665","57666","57667","57668","57669","57670","57671","57672","57673","57674","57675","57676","57677","57678","57679","57680","57681","57682","57683","57684","57685","57686","57687","57688","57689","57690","57691","57692","57693","57694","57695","57696","57697","57698","57699","57700","57701","57702","57703","57704","57705","57706","57707","57708","57709","57710","57711","57712","57713","57714","57715","57716","57717","57718","57719","57720","57721","57722","57723","57724","57725","57726","57727","57728","57729","57730","57731","57732","57733","57734","57735","57736","57737","57738","57739","57740","57741","57742","57743","57744","57745","57746","57747","57748","57749","57750","57751","57752","57753","57754","57755","57756","57757","57758","57759","57760","57761","57762","57763","57764","57765","57766","57767","57768","57769","57770","57771","57772","57773","57774","57775","57776","57777","57778","57779","57780","57781","57782","57783","57784","57785","57786","57787","57788","57789","57790","57791","57792","57793","57794","57795","57796","57797","57798","57799","57800","57801","57802","57803","57804","57805","57806","57807","57808","57809","57810","57811","57812","57813","57814","57815","57816","57817","57818","57819","57820","57821","57822","57823","57824","57825","57826","57827","57828","57829","57830","57831","57832","57833","57834","57835","57836","57837","57838","57839","57840","57841","57842","57843","57844","57845","57846","57847","57848","57849","57850","57851","57852","57853","57854","57855","57856","57857","57858","57859","57860","57861","57862","57863","57864","57865","57866","57867","57868","57869","57870","57871","57872","57873","57874","57875","57876","57877","57878","57879","57880","57881","57882","57883","57884","57885","57886","57887","57888","57889","57890","57891","57892","57893","57894","57895","57896","57897","57898","57899","57900","57901","57902","57903","57904","57905","57906","57907","57908","57909","57910","57911","57912","57913","57914","57915","57916","57917","57918","57919","57920","57921","57922","57923","57924","57925","57926","57927","57928","57929","57930","57931","57932","57933","57934","57935","57936","57937","57938","57939","57940","57941","57942","57943","57944","57945","57946","57947","57948","57949","57950","57951","57952","57953","57954","57955","57956","57957","57958","57959","57960","57961","57962","57963","57964","57965","57966","57967","57968","57969","57970","57971","57972","57973","57974","57975","57976","57977","57978","57979","57980","57981","57982","57983","57984","57985","57986","57987","57988","57989","57990","57991","57992","57993","57994","57995","57996","57997","57998","57999","58000","58001","58002","58003","58004","58005","58006","58007","58008","58009","58010","58011","58012","58013","58014","58015","58016","58017","58018","58019","58020","58021","58022","58023","58024","58025","58026","58027","58028","58029","58030","58031","58032","58033","58034","58035","58036","58037","58038","58039","58040","58041","58042","58043","58044","58045","58046","58047","58048","58049","58050","58051","58052","58053","58054","58055","58056","58057","58058","58059","58060","58061","58062","58063","58064","58065","58066","58067","58068","58069","58070","58071","58072","58073","58074","58075","58076","58077","58078","58079","58080","58081","58082","58083","58084","58085","58086","58087","58088","58089","58090","58091","58092","58093","58094","58095","58096","58097","58098","58099","58100","58101","58102","58103","58104","58105","58106","58107","58108","58109","58110","58111","58112","58113","58114","58115","58116","58117","58118","58119","58120","58121","58122","58123","58124","58125","58126","58127","58128","58129","58130","58131","58132","58133","58134","58135","58136","58137","58138","58139","58140","58141","58142","58143","58144","58145","58146","58147","58148","58149","58150","58151","58152","58153","58154","58155","58156","58157","58158","58159","58160","58161","58162","58163","58164","58165","58166","58167","58168","58169","58170","58171","58172","58173","58174","58175","58176","58177","58178","58179","58180","58181","58182","58183","58184","58185","58186","58187","58188","58189","58190","58191","58192","58193","58194","58195","58196","58197","58198","58199","58200","58201","58202","58203","58204","58205","58206","58207","58208","58209","58210","58211","58212","58213","58214","58215","58216","58217","58218","58219","58220","58221","58222","58223","58224","58225","58226","58227","58228","58229","58230","58231","58232","58233","58234","58235","58236","58237","58238","58239","58240","58241","58242","58243","58244","58245","58246","58247","58248","58249","58250","58251","58252","58253","58254","58255","58256","58257","58258","58259","58260","58261","58262","58263","58264","58265","58266","58267","58268","58269","58270","58271","58272","58273","58274","58275","58276","58277","58278","58279","58280","58281","58282","58283","58284","58285","58286","58287","58288","58289","58290","58291","58292","58293","58294","58295","58296","58297","58298","58299","58300","58301","58302","58303","58304","58305","58306","58307","58308","58309","58310","58311","58312","58313","58314","58315","58316","58317","58318","58319","58320","58321","58322","58323","58324","58325","58326","58327","58328","58329","58330","58331","58332","58333","58334","58335","58336","58337","58338","58339","58340","58341","58342","58343","58344","58345","58346","58347","58348","58349","58350","58351","58352","58353","58354","58355","58356","58357","58358","58359","58360","58361","58362","58363","58364","58365","58366","58367","58368","58369","58370","58371","58372","58373","58374","58375","58376","58377","58378","58379","58380","58381","58382","58383","58384","58385","58386","58387","58388","58389","58390","58391","58392","58393","58394","58395","58396","58397","58398","58399","58400","58401","58402","58403","58404","58405","58406","58407","58408","58409","58410","58411","58412","58413","58414","58415","58416","58417","58418","58419","58420","58421","58422","58423","58424","58425","58426","58427","58428","58429","58430","58431","58432","58433","58434","58435","58436","58437","58438","58439","58440","58441","58442","58443","58444","58445","58446","58447","58448","58449","58450","58451","58452","58453","58454","58455","58456","58457","58458","58459","58460","58461","58462","58463","58464","58465","58466","58467","58468","58469","58470","58471","58472","58473","58474","58475","58476","58477","58478","58479","58480","58481","58482","58483","58484","58485","58486","58487","58488","58489","58490","58491","58492","58493","58494","58495","58496","58497","58498","58499","58500","58501","58502","58503","58504","58505","58506","58507","58508","58509","58510","58511","58512","58513","58514","58515","58516","58517","58518","58519","58520","58521","58522","58523","58524","58525","58526","58527","58528","58529","58530","58531","58532","58533","58534","58535","58536","58537","58538","58539","58540","58541","58542","58543","58544","58545","58546","58547","58548","58549","58550","58551","58552","58553","58554","58555","58556","58557","58558","58559","58560","58561","58562","58563","58564","58565","58566","58567","58568","58569","58570","58571","58572","58573","58574","58575","58576","58577","58578","58579","58580","58581","58582","58583","58584","58585","58586","58587","58588","58589","58590","58591","58592","58593","58594","58595","58596","58597","58598","58599","58600","58601","58602","58603","58604","58605","58606","58607","58608","58609","58610","58611","58612","58613","58614","58615","58616","58617","58618","58619","58620","58621","58622","58623","58624","58625","58626","58627","58628","58629","58630","58631","58632","58633","58634","58635","58636","58637","58638","58639","58640","58641","58642","58643","58644","58645","58646","58647","58648","58649","58650","58651","58652","58653","58654","58655","58656","58657","58658","58659","58660","58661","58662","58663","58664","58665","58666","58667","58668","58669","58670","58671","58672","58673","58674","58675","58676","58677","58678","58679","58680","58681","58682","58683","58684","58685","58686","58687","58688","58689","58690","58691","58692","58693","58694","58695","58696","58697","58698","58699","58700","58701","58702","58703","58704","58705","58706","58707","58708","58709","58710","58711","58712","58713","58714","58715","58716","58717","58718","58719","58720","58721","58722","58723","58724","58725","58726","58727","58728","58729","58730","58731","58732","58733","58734","58735","58736","58737","58738","58739","58740","58741","58742","58743","58744","58745","58746","58747","58748","58749","58750","58751","58752","58753","58754","58755","58756","58757","58758","58759","58760","58761","58762","58763","58764","58765","58766","58767","58768","58769","58770","58771","58772","58773","58774","58775","58776","58777","58778","58779","58780","58781","58782","58783","58784","58785","58786","58787","58788","58789","58790","58791","58792","58793","58794","58795","58796","58797","58798","58799","58800","58801","58802","58803","58804","58805","58806","58807","58808","58809","58810","58811","58812","58813","58814","58815","58816","58817","58818","58819","58820","58821","58822","58823","58824","58825","58826","58827","58828","58829","58830","58831","58832","58833","58834","58835","58836","58837","58838","58839","58840","58841","58842","58843","58844","58845","58846","58847","58848","58849","58850","58851","58852","58853","58854","58855","58856","58857","58858","58859","58860","58861","58862","58863","58864","58865","58866","58867","58868","58869","58870","58871","58872","58873","58874","58875","58876","58877","58878","58879","58880","58881","58882","58883","58884","58885","58886","58887","58888","58889","58890","58891","58892","58893","58894","58895","58896","58897","58898","58899","58900","58901","58902","58903","58904","58905","58906","58907","58908","58909","58910","58911","58912","58913","58914","58915","58916","58917","58918","58919","58920","58921","58922","58923","58924","58925","58926","58927","58928","58929","58930","58931","58932","58933","58934","58935","58936","58937","58938","58939","58940","58941","58942","58943","58944","58945","58946","58947","58948","58949","58950","58951","58952","58953","58954","58955","58956","58957","58958","58959","58960","58961","58962","58963","58964","58965","58966","58967","58968","58969","58970","58971","58972","58973","58974","58975","58976","58977","58978","58979","58980","58981","58982","58983","58984","58985","58986","58987","58988","58989","58990","58991","58992","58993","58994","58995","58996","58997","58998","58999","59000","59001","59002","59003","59004","59005","59006","59007","59008","59009","59010","59011","59012","59013","59014","59015","59016","59017","59018","59019","59020","59021","59022","59023","59024","59025","59026","59027","59028","59029","59030","59031","59032","59033","59034","59035","59036","59037","59038","59039","59040","59041","59042","59043","59044","59045","59046","59047","59048","59049","59050","59051","59052","59053","59054","59055","59056","59057","59058","59059","59060","59061","59062","59063","59064","59065","59066","59067","59068","59069","59070","59071","59072","59073","59074","59075","59076","59077","59078","59079","59080","59081","59082","59083","59084","59085","59086","59087","59088","59089","59090","59091","59092","59093","59094","59095","59096","59097","59098","59099","59100","59101","59102","59103","59104","59105","59106","59107","59108","59109","59110","59111","59112","59113","59114","59115","59116","59117","59118","59119","59120","59121","59122","59123","59124","59125","59126","59127","59128","59129","59130","59131","59132","59133","59134","59135","59136","59137","59138","59139","59140","59141","59142","59143","59144","59145","59146","59147","59148","59149","59150","59151","59152","59153","59154","59155","59156","59157","59158","59159","59160","59161","59162","59163","59164","59165","59166","59167","59168","59169","59170","59171","59172","59173","59174","59175","59176","59177","59178","59179","59180","59181","59182","59183","59184","59185","59186","59187","59188","59189","59190","59191","59192","59193","59194","59195","59196","59197","59198","59199","59200","59201","59202","59203","59204","59205","59206","59207","59208","59209","59210","59211","59212","59213","59214","59215","59216","59217","59218","59219","59220","59221","59222","59223","59224","59225","59226","59227","59228","59229","59230","59231","59232","59233","59234","59235","59236","59237","59238","59239","59240","59241","59242","59243","59244","59245","59246","59247","59248","59249","59250","59251","59252","59253","59254","59255","59256","59257","59258","59259","59260","59261","59262","59263","59264","59265","59266","59267","59268","59269","59270","59271","59272","59273","59274","59275","59276","59277","59278","59279","59280","59281","59282","59283","59284","59285","59286","59287","59288","59289","59290","59291","59292","59293","59294","59295","59296","59297","59298","59299","59300","59301","59302","59303","59304","59305","59306","59307","59308","59309","59310","59311","59312","59313","59314","59315","59316","59317","59318","59319","59320","59321","59322","59323","59324","59325","59326","59327","59328","59329","59330","59331","59332","59333","59334","59335","59336","59337","59338","59339","59340","59341","59342","59343","59344","59345","59346","59347","59348","59349","59350","59351","59352","59353","59354","59355","59356","59357","59358","59359","59360","59361","59362","59363","59364","59365","59366","59367","59368","59369","59370","59371","59372","59373","59374","59375","59376","59377","59378","59379","59380","59381","59382","59383","59384","59385","59386","59387","59388","59389","59390","59391","59392","59393","59394","59395","59396","59397","59398","59399","59400","59401","59402","59403","59404","59405","59406","59407","59408","59409","59410","59411","59412","59413","59414","59415","59416","59417","59418","59419","59420","59421","59422","59423","59424","59425","59426","59427","59428","59429","59430","59431","59432","59433","59434","59435","59436","59437","59438","59439","59440","59441","59442","59443","59444","59445","59446","59447","59448","59449","59450","59451","59452","59453","59454","59455","59456","59457","59458","59459","59460","59461","59462","59463","59464","59465","59466","59467","59468","59469","59470","59471","59472","59473","59474","59475","59476","59477","59478","59479","59480","59481","59482","59483","59484","59485","59486","59487","59488","59489","59490","59491","59492","59493","59494","59495","59496","59497","59498","59499","59500","59501","59502","59503","59504","59505","59506","59507","59508","59509","59510","59511","59512","59513","59514","59515","59516","59517","59518","59519","59520","59521","59522","59523","59524","59525","59526","59527","59528","59529","59530","59531","59532","59533","59534","59535","59536","59537","59538","59539","59540","59541","59542","59543","59544","59545","59546","59547","59548","59549","59550","59551","59552","59553","59554","59555","59556","59557","59558","59559","59560","59561","59562","59563","59564","59565","59566","59567","59568","59569","59570","59571","59572","59573","59574","59575","59576","59577","59578","59579","59580","59581","59582","59583","59584","59585","59586","59587","59588","59589","59590","59591","59592","59593","59594","59595","59596","59597","59598","59599","59600","59601","59602","59603","59604","59605","59606","59607","59608","59609","59610","59611","59612","59613","59614","59615","59616","59617","59618","59619","59620","59621","59622","59623","59624","59625","59626","59627","59628","59629","59630","59631","59632","59633","59634","59635","59636","59637","59638","59639","59640","59641","59642","59643","59644","59645","59646","59647","59648","59649","59650","59651","59652","59653","59654","59655","59656","59657","59658","59659","59660","59661","59662","59663","59664","59665","59666","59667","59668","59669","59670","59671","59672","59673","59674","59675","59676","59677","59678","59679","59680","59681","59682","59683","59684","59685","59686","59687","59688","59689","59690","59691","59692","59693","59694","59695","59696","59697","59698","59699","59700","59701","59702","59703","59704","59705","59706","59707","59708","59709","59710","59711","59712","59713","59714","59715","59716","59717","59718","59719","59720","59721","59722","59723","59724","59725","59726","59727","59728","59729","59730","59731","59732","59733","59734","59735","59736","59737","59738","59739","59740","59741","59742","59743","59744","59745","59746","59747","59748","59749","59750","59751","59752","59753","59754","59755","59756","59757","59758","59759","59760","59761","59762","59763","59764","59765","59766","59767","59768","59769","59770","59771","59772","59773","59774","59775","59776","59777","59778","59779","59780","59781","59782","59783","59784","59785","59786","59787","59788","59789","59790","59791","59792","59793","59794","59795","59796","59797","59798","59799","59800","59801","59802","59803","59804","59805","59806","59807","59808","59809","59810","59811","59812","59813","59814","59815","59816","59817","59818","59819","59820","59821","59822","59823","59824","59825","59826","59827","59828","59829","59830","59831","59832","59833","59834","59835","59836","59837","59838","59839","59840","59841","59842","59843","59844","59845","59846","59847","59848","59849","59850","59851","59852","59853","59854","59855","59856","59857","59858","59859","59860","59861","59862","59863","59864","59865","59866","59867","59868","59869","59870","59871","59872","59873","59874","59875","59876","59877","59878","59879","59880","59881","59882","59883","59884","59885","59886","59887","59888","59889","59890","59891","59892","59893","59894","59895","59896","59897","59898","59899","59900","59901","59902","59903","59904","59905","59906","59907","59908","59909","59910","59911","59912","59913","59914","59915","59916","59917","59918","59919","59920","59921","59922","59923","59924","59925","59926","59927","59928","59929","59930","59931","59932","59933","59934","59935","59936","59937","59938","59939","59940","59941","59942","59943","59944","59945","59946","59947","59948","59949","59950","59951","59952","59953","59954","59955","59956","59957","59958","59959","59960","59961","59962","59963","59964","59965","59966","59967","59968","59969","59970","59971","59972","59973","59974","59975","59976","59977","59978","59979","59980","59981","59982","59983","59984","59985","59986","59987","59988","59989","59990","59991","59992","59993","59994","59995","59996","59997","59998","59999","60000","60001","60002","60003","60004","60005","60006","60007","60008","60009","60010","60011","60012","60013","60014","60015","60016","60017","60018","60019","60020","60021","60022","60023","60024","60025","60026","60027","60028","60029","60030","60031","60032","60033","60034","60035","60036","60037","60038","60039","60040","60041","60042","60043","60044","60045","60046","60047","60048","60049","60050","60051","60052","60053","60054","60055","60056","60057","60058","60059","60060","60061","60062","60063","60064","60065","60066","60067","60068","60069","60070","60071","60072","60073","60074","60075","60076","60077","60078","60079","60080","60081","60082","60083","60084","60085","60086","60087","60088","60089","60090","60091","60092","60093","60094","60095","60096","60097","60098","60099","60100","60101","60102","60103","60104","60105","60106","60107","60108","60109","60110","60111","60112","60113","60114","60115","60116","60117","60118","60119","60120","60121","60122","60123","60124","60125","60126","60127","60128","60129","60130","60131","60132","60133","60134","60135","60136","60137","60138","60139","60140","60141","60142","60143","60144","60145","60146","60147","60148","60149","60150","60151","60152","60153","60154","60155","60156","60157","60158","60159","60160","60161","60162","60163","60164","60165","60166","60167","60168","60169","60170","60171","60172","60173","60174","60175","60176","60177","60178","60179","60180","60181","60182","60183","60184","60185","60186","60187","60188","60189","60190","60191","60192","60193","60194","60195","60196","60197","60198","60199","60200","60201","60202","60203","60204","60205","60206","60207","60208","60209","60210","60211","60212","60213","60214","60215","60216","60217","60218","60219","60220","60221","60222","60223","60224","60225","60226","60227","60228","60229","60230","60231","60232","60233","60234","60235","60236","60237","60238","60239","60240","60241","60242","60243","60244","60245","60246","60247","60248","60249","60250","60251","60252","60253","60254","60255","60256","60257","60258","60259","60260","60261","60262","60263","60264","60265","60266","60267","60268","60269","60270","60271","60272","60273","60274","60275","60276","60277","60278","60279","60280","60281","60282","60283","60284","60285","60286","60287","60288","60289","60290","60291","60292","60293","60294","60295","60296","60297","60298","60299","60300","60301","60302","60303","60304","60305","60306","60307","60308","60309","60310","60311","60312","60313","60314","60315","60316","60317","60318","60319","60320","60321","60322","60323","60324","60325","60326","60327","60328","60329","60330","60331","60332","60333","60334","60335","60336","60337","60338","60339","60340","60341","60342","60343","60344","60345","60346","60347","60348","60349","60350","60351","60352","60353","60354","60355","60356","60357","60358","60359","60360","60361","60362","60363","60364","60365","60366","60367","60368","60369","60370","60371","60372","60373","60374","60375","60376","60377","60378","60379","60380","60381","60382","60383","60384","60385","60386","60387","60388","60389","60390","60391","60392","60393","60394","60395","60396","60397","60398","60399","60400","60401","60402","60403","60404","60405","60406","60407","60408","60409","60410","60411","60412","60413","60414","60415","60416","60417","60418","60419","60420","60421","60422","60423","60424","60425","60426","60427","60428","60429","60430","60431","60432","60433","60434","60435","60436","60437","60438","60439","60440","60441","60442","60443","60444","60445","60446","60447","60448","60449","60450","60451","60452","60453","60454","60455","60456","60457","60458","60459","60460","60461","60462","60463","60464","60465","60466","60467","60468","60469","60470","60471","60472","60473","60474","60475","60476","60477","60478","60479","60480","60481","60482","60483","60484","60485","60486","60487","60488","60489","60490","60491","60492","60493","60494","60495","60496","60497","60498","60499","60500","60501","60502","60503","60504","60505","60506","60507","60508","60509","60510","60511","60512","60513","60514","60515","60516","60517","60518","60519","60520","60521","60522","60523","60524","60525","60526","60527","60528","60529","60530","60531","60532","60533","60534","60535","60536","60537","60538","60539","60540","60541","60542","60543","60544","60545","60546","60547","60548","60549","60550","60551","60552","60553","60554","60555","60556","60557","60558","60559","60560","60561","60562","60563","60564","60565","60566","60567","60568","60569","60570","60571","60572","60573","60574","60575","60576","60577","60578","60579","60580","60581","60582","60583","60584","60585","60586","60587","60588","60589","60590","60591","60592","60593","60594","60595","60596","60597","60598","60599","60600","60601","60602","60603","60604","60605","60606","60607","60608","60609","60610","60611","60612","60613","60614","60615","60616","60617","60618","60619","60620","60621","60622","60623","60624","60625","60626","60627","60628","60629","60630","60631","60632","60633","60634","60635","60636","60637","60638","60639","60640","60641","60642","60643","60644","60645","60646","60647","60648","60649","60650","60651","60652","60653","60654","60655","60656","60657","60658","60659","60660","60661","60662","60663","60664","60665","60666","60667","60668","60669","60670","60671","60672","60673","60674","60675","60676","60677","60678","60679","60680","60681","60682","60683","60684","60685","60686","60687","60688","60689","60690","60691","60692","60693","60694","60695","60696","60697","60698","60699","60700","60701","60702","60703","60704","60705","60706","60707","60708","60709","60710","60711","60712","60713","60714","60715","60716","60717","60718","60719","60720","60721","60722","60723","60724","60725","60726","60727","60728","60729","60730","60731","60732","60733","60734","60735","60736","60737","60738","60739","60740","60741","60742","60743","60744","60745","60746","60747","60748","60749","60750","60751","60752","60753","60754","60755","60756","60757","60758","60759","60760","60761","60762","60763","60764","60765","60766","60767","60768","60769","60770","60771","60772","60773","60774","60775","60776","60777","60778","60779","60780","60781","60782","60783","60784","60785","60786","60787","60788","60789","60790","60791","60792","60793","60794","60795","60796","60797","60798","60799","60800","60801","60802","60803","60804","60805","60806","60807","60808","60809","60810","60811","60812","60813","60814","60815","60816","60817","60818","60819","60820","60821","60822","60823","60824","60825","60826","60827","60828","60829","60830","60831","60832","60833","60834","60835","60836","60837","60838","60839","60840","60841","60842","60843","60844","60845","60846","60847","60848","60849","60850","60851","60852","60853","60854","60855","60856","60857","60858","60859","60860","60861","60862","60863","60864","60865","60866","60867","60868","60869","60870","60871","60872","60873","60874","60875","60876","60877","60878","60879","60880","60881","60882","60883","60884","60885","60886","60887","60888","60889","60890","60891","60892","60893","60894","60895","60896","60897","60898","60899","60900","60901","60902","60903","60904","60905","60906","60907","60908","60909","60910","60911","60912","60913","60914","60915","60916","60917","60918","60919","60920","60921","60922","60923","60924","60925","60926","60927","60928","60929","60930","60931","60932","60933","60934","60935","60936","60937","60938","60939","60940","60941","60942","60943","60944","60945","60946","60947","60948","60949","60950","60951","60952","60953","60954","60955","60956","60957","60958","60959","60960","60961","60962","60963","60964","60965","60966","60967","60968","60969","60970","60971","60972","60973","60974","60975","60976","60977","60978","60979","60980","60981","60982","60983","60984","60985","60986","60987","60988","60989","60990","60991","60992","60993","60994","60995","60996","60997","60998","60999","61000","61001","61002","61003","61004","61005","61006","61007","61008","61009","61010","61011","61012","61013","61014","61015","61016","61017","61018","61019","61020","61021","61022","61023","61024","61025","61026","61027","61028","61029","61030","61031","61032","61033","61034","61035","61036","61037","61038","61039","61040","61041","61042","61043","61044","61045","61046","61047","61048","61049","61050","61051","61052","61053","61054","61055","61056","61057","61058","61059","61060","61061","61062","61063","61064","61065","61066","61067","61068","61069","61070","61071","61072","61073","61074","61075","61076","61077","61078","61079","61080","61081","61082","61083","61084","61085","61086","61087","61088","61089","61090","61091","61092","61093","61094","61095","61096","61097","61098","61099","61100","61101","61102","61103","61104","61105","61106","61107","61108","61109","61110","61111","61112","61113","61114","61115","61116","61117","61118","61119","61120","61121","61122","61123","61124","61125","61126","61127","61128","61129","61130","61131","61132","61133","61134","61135","61136","61137","61138","61139","61140","61141","61142","61143","61144","61145","61146","61147","61148","61149","61150","61151","61152","61153","61154","61155","61156","61157","61158","61159","61160","61161","61162","61163","61164","61165","61166","61167","61168","61169","61170","61171","61172","61173","61174","61175","61176","61177","61178","61179","61180","61181","61182","61183","61184","61185","61186","61187","61188","61189","61190","61191","61192","61193","61194","61195","61196","61197","61198","61199","61200","61201","61202","61203","61204","61205","61206","61207","61208","61209","61210","61211","61212","61213","61214","61215","61216","61217","61218","61219","61220","61221","61222","61223","61224","61225","61226","61227","61228","61229","61230","61231","61232","61233","61234","61235","61236","61237","61238","61239","61240","61241","61242","61243","61244","61245","61246","61247","61248","61249","61250","61251","61252","61253","61254","61255","61256","61257","61258","61259","61260","61261","61262","61263","61264","61265","61266","61267","61268","61269","61270","61271","61272","61273","61274","61275","61276","61277","61278","61279","61280","61281","61282","61283","61284","61285","61286","61287","61288","61289","61290","61291","61292","61293","61294","61295","61296","61297","61298","61299","61300","61301","61302","61303","61304","61305","61306","61307","61308","61309","61310","61311","61312","61313","61314","61315","61316","61317","61318","61319","61320","61321","61322","61323","61324","61325","61326","61327","61328","61329","61330","61331","61332","61333","61334","61335","61336","61337","61338","61339","61340","61341","61342","61343","61344","61345","61346","61347","61348","61349","61350","61351","61352","61353","61354","61355","61356","61357","61358","61359","61360","61361","61362","61363","61364","61365","61366","61367","61368","61369","61370","61371","61372","61373","61374","61375","61376","61377","61378","61379","61380","61381","61382","61383","61384","61385","61386","61387","61388","61389","61390","61391","61392","61393","61394","61395","61396","61397","61398","61399","61400","61401","61402","61403","61404","61405","61406","61407","61408","61409","61410","61411","61412","61413","61414","61415","61416","61417","61418","61419","61420","61421","61422","61423","61424","61425","61426","61427","61428","61429","61430","61431","61432","61433","61434","61435","61436","61437","61438","61439","61440","61441","61442","61443","61444","61445","61446","61447","61448","61449","61450","61451","61452","61453","61454","61455","61456","61457","61458","61459","61460","61461","61462","61463","61464","61465","61466","61467","61468","61469","61470","61471","61472","61473","61474","61475","61476","61477","61478","61479","61480","61481","61482","61483","61484","61485","61486","61487","61488","61489","61490","61491","61492","61493","61494","61495","61496","61497","61498","61499","61500","61501","61502","61503","61504","61505","61506","61507","61508","61509","61510","61511","61512","61513","61514","61515","61516","61517","61518","61519","61520","61521","61522","61523","61524","61525","61526","61527","61528","61529","61530","61531","61532","61533","61534","61535","61536","61537","61538","61539","61540","61541","61542","61543","61544","61545","61546","61547","61548","61549","61550","61551","61552","61553","61554","61555","61556","61557","61558","61559","61560","61561","61562","61563","61564","61565","61566","61567","61568","61569","61570","61571","61572","61573","61574","61575","61576","61577","61578","61579","61580","61581","61582","61583","61584","61585","61586","61587","61588","61589","61590","61591","61592","61593","61594","61595","61596","61597","61598","61599","61600","61601","61602","61603","61604","61605","61606","61607","61608","61609","61610","61611","61612","61613","61614","61615","61616","61617","61618","61619","61620","61621","61622","61623","61624","61625","61626","61627","61628","61629","61630","61631","61632","61633","61634","61635","61636","61637","61638","61639","61640","61641","61642","61643","61644","61645","61646","61647","61648","61649","61650","61651","61652","61653","61654","61655","61656","61657","61658","61659","61660","61661","61662","61663","61664","61665","61666","61667","61668","61669","61670","61671","61672","61673","61674","61675","61676","61677","61678","61679","61680","61681","61682","61683","61684","61685","61686","61687","61688","61689","61690","61691","61692","61693","61694","61695","61696","61697","61698","61699","61700","61701","61702","61703","61704","61705","61706","61707","61708","61709","61710","61711","61712","61713","61714","61715","61716","61717","61718","61719","61720","61721","61722","61723","61724","61725","61726","61727","61728","61729","61730","61731","61732","61733","61734","61735","61736","61737","61738","61739","61740","61741","61742","61743","61744","61745","61746","61747","61748","61749","61750","61751","61752","61753","61754","61755","61756","61757","61758","61759","61760","61761","61762","61763","61764","61765","61766","61767","61768","61769","61770","61771","61772","61773","61774","61775","61776","61777","61778","61779","61780","61781","61782","61783","61784","61785","61786","61787","61788","61789","61790","61791","61792","61793","61794","61795","61796","61797","61798","61799","61800","61801","61802","61803","61804","61805","61806","61807","61808","61809","61810","61811","61812","61813","61814","61815","61816","61817","61818","61819","61820","61821","61822","61823","61824","61825","61826","61827","61828","61829","61830","61831","61832","61833","61834","61835","61836","61837","61838","61839","61840","61841","61842","61843","61844","61845","61846","61847","61848","61849","61850","61851","61852","61853","61854","61855","61856","61857","61858","61859","61860","61861","61862","61863","61864","61865","61866","61867","61868","61869","61870","61871","61872","61873","61874","61875","61876","61877","61878","61879","61880","61881","61882","61883","61884","61885","61886","61887","61888","61889","61890","61891","61892","61893","61894","61895","61896","61897","61898","61899","61900","61901","61902","61903","61904","61905","61906","61907","61908","61909","61910","61911","61912","61913","61914","61915","61916","61917","61918","61919","61920","61921","61922","61923","61924","61925","61926","61927","61928","61929","61930","61931","61932","61933","61934","61935","61936","61937","61938","61939","61940","61941","61942","61943","61944","61945","61946","61947","61948","61949","61950","61951","61952","61953","61954","61955","61956","61957","61958","61959","61960","61961","61962","61963","61964","61965","61966","61967","61968","61969","61970","61971","61972","61973","61974","61975","61976","61977","61978","61979","61980","61981","61982","61983","61984","61985","61986","61987","61988","61989","61990","61991","61992","61993","61994","61995","61996","61997","61998","61999","62000","62001","62002","62003","62004","62005","62006","62007","62008","62009","62010","62011","62012","62013","62014","62015","62016","62017","62018","62019","62020","62021","62022","62023","62024","62025","62026","62027","62028","62029","62030","62031","62032","62033","62034","62035","62036","62037","62038","62039","62040","62041","62042","62043","62044","62045","62046","62047","62048","62049","62050","62051","62052","62053","62054","62055","62056","62057","62058","62059","62060","62061","62062","62063","62064","62065","62066","62067","62068","62069","62070","62071","62072","62073","62074","62075","62076","62077","62078","62079","62080","62081","62082","62083","62084","62085","62086","62087","62088","62089","62090","62091","62092","62093","62094","62095","62096","62097","62098","62099","62100","62101","62102","62103","62104","62105","62106","62107","62108","62109","62110","62111","62112","62113","62114","62115","62116","62117","62118","62119","62120","62121","62122","62123","62124","62125","62126","62127","62128","62129","62130","62131","62132","62133","62134","62135","62136","62137","62138","62139","62140","62141","62142","62143","62144","62145","62146","62147","62148","62149","62150","62151","62152","62153","62154","62155","62156","62157","62158","62159","62160","62161","62162","62163","62164","62165","62166","62167","62168","62169","62170","62171","62172","62173","62174","62175","62176","62177","62178","62179","62180","62181","62182","62183","62184","62185","62186","62187","62188","62189","62190","62191","62192","62193","62194","62195","62196","62197","62198","62199","62200","62201","62202","62203","62204","62205","62206","62207","62208","62209","62210","62211","62212","62213","62214","62215","62216","62217","62218","62219","62220","62221","62222","62223","62224","62225","62226","62227","62228","62229","62230","62231","62232","62233","62234","62235","62236","62237","62238","62239","62240","62241","62242","62243","62244","62245","62246","62247","62248","62249","62250","62251","62252","62253","62254","62255","62256","62257","62258","62259","62260","62261","62262","62263","62264","62265","62266","62267","62268","62269","62270","62271","62272","62273","62274","62275","62276","62277","62278","62279","62280","62281","62282","62283","62284","62285","62286","62287","62288","62289","62290","62291","62292","62293","62294","62295","62296","62297","62298","62299","62300","62301","62302","62303","62304","62305","62306","62307","62308","62309","62310","62311","62312","62313","62314","62315","62316","62317","62318","62319","62320","62321","62322","62323","62324","62325","62326","62327","62328","62329","62330","62331","62332","62333","62334","62335","62336","62337","62338","62339","62340","62341","62342","62343","62344","62345","62346","62347","62348","62349","62350","62351","62352","62353","62354","62355","62356","62357","62358","62359","62360","62361","62362","62363","62364","62365","62366","62367","62368","62369","62370","62371","62372","62373","62374","62375","62376","62377","62378","62379","62380","62381","62382","62383","62384","62385","62386","62387","62388","62389","62390","62391","62392","62393","62394","62395","62396","62397","62398","62399","62400","62401","62402","62403","62404","62405","62406","62407","62408","62409","62410","62411","62412","62413","62414","62415","62416","62417","62418","62419","62420","62421","62422","62423","62424","62425","62426","62427","62428","62429","62430","62431","62432","62433","62434","62435","62436","62437","62438","62439","62440","62441","62442","62443","62444","62445","62446","62447","62448","62449","62450","62451","62452","62453","62454","62455","62456","62457","62458","62459","62460","62461","62462","62463","62464","62465","62466","62467","62468","62469","62470","62471","62472","62473","62474","62475","62476","62477","62478","62479","62480","62481","62482","62483","62484","62485","62486","62487","62488","62489","62490","62491","62492","62493","62494","62495","62496","62497","62498","62499","62500","62501","62502","62503","62504","62505","62506","62507","62508","62509","62510","62511","62512","62513","62514","62515","62516","62517","62518","62519","62520","62521","62522","62523","62524","62525","62526","62527","62528","62529","62530","62531","62532","62533","62534","62535","62536","62537","62538","62539","62540","62541","62542","62543","62544","62545","62546","62547","62548","62549","62550","62551","62552","62553","62554","62555","62556","62557","62558","62559","62560","62561","62562","62563","62564","62565","62566","62567","62568","62569","62570","62571","62572","62573","62574","62575","62576","62577","62578","62579","62580","62581","62582","62583","62584","62585","62586","62587","62588","62589","62590","62591","62592","62593","62594","62595","62596","62597","62598","62599","62600","62601","62602","62603","62604","62605","62606","62607","62608","62609","62610","62611","62612","62613","62614","62615","62616","62617","62618","62619","62620","62621","62622","62623","62624","62625","62626","62627","62628","62629","62630","62631","62632","62633","62634","62635","62636","62637","62638","62639","62640","62641","62642","62643","62644","62645","62646","62647","62648","62649","62650","62651","62652","62653","62654","62655","62656","62657","62658","62659","62660","62661","62662","62663","62664","62665","62666","62667","62668","62669","62670","62671","62672","62673","62674","62675","62676","62677","62678","62679","62680","62681","62682","62683","62684","62685","62686","62687","62688","62689","62690","62691","62692","62693","62694","62695","62696","62697","62698","62699","62700","62701","62702","62703","62704","62705","62706","62707","62708","62709","62710","62711","62712","62713","62714","62715","62716","62717","62718","62719","62720","62721","62722","62723","62724","62725","62726","62727","62728","62729","62730","62731","62732","62733","62734","62735","62736","62737","62738","62739","62740","62741","62742","62743","62744","62745","62746","62747","62748","62749","62750","62751","62752","62753","62754","62755","62756","62757","62758","62759","62760","62761","62762","62763","62764","62765","62766","62767","62768","62769","62770","62771","62772","62773","62774","62775","62776","62777","62778","62779","62780","62781","62782","62783","62784","62785","62786","62787","62788","62789","62790","62791","62792","62793","62794","62795","62796","62797","62798","62799","62800","62801","62802","62803","62804","62805","62806","62807","62808","62809","62810","62811","62812","62813","62814","62815","62816","62817","62818","62819","62820","62821","62822","62823","62824","62825","62826","62827","62828","62829","62830","62831","62832","62833","62834","62835","62836","62837","62838","62839","62840","62841","62842","62843","62844","62845","62846","62847","62848","62849","62850","62851","62852","62853","62854","62855","62856","62857","62858","62859","62860","62861","62862","62863","62864","62865","62866","62867","62868","62869","62870","62871","62872","62873","62874","62875","62876","62877","62878","62879","62880","62881","62882","62883","62884","62885","62886","62887","62888","62889","62890","62891","62892","62893","62894","62895","62896","62897","62898","62899","62900","62901","62902","62903","62904","62905","62906","62907","62908","62909","62910","62911","62912","62913","62914","62915","62916","62917","62918","62919","62920","62921","62922","62923","62924","62925","62926","62927","62928","62929","62930","62931","62932","62933","62934","62935","62936","62937","62938","62939","62940","62941","62942","62943","62944","62945","62946","62947","62948","62949","62950","62951","62952","62953","62954","62955","62956","62957","62958","62959","62960","62961","62962","62963","62964","62965","62966","62967","62968","62969","62970","62971","62972","62973","62974","62975","62976","62977","62978","62979","62980","62981","62982","62983","62984","62985","62986","62987","62988","62989","62990","62991","62992","62993","62994","62995","62996","62997","62998","62999","63000","63001","63002","63003","63004","63005","63006","63007","63008","63009","63010","63011","63012","63013","63014","63015","63016","63017","63018","63019","63020","63021","63022","63023","63024","63025","63026","63027","63028","63029","63030","63031","63032","63033","63034","63035","63036","63037","63038","63039","63040","63041","63042","63043","63044","63045","63046","63047","63048","63049","63050","63051","63052","63053","63054","63055","63056","63057","63058","63059","63060","63061","63062","63063","63064","63065","63066","63067","63068","63069","63070","63071","63072","63073","63074","63075","63076","63077","63078","63079","63080","63081","63082","63083","63084","63085","63086","63087","63088","63089","63090","63091","63092","63093","63094","63095","63096","63097","63098","63099","63100","63101","63102","63103","63104","63105","63106","63107","63108","63109","63110","63111","63112","63113","63114","63115","63116","63117","63118","63119","63120","63121","63122","63123","63124","63125","63126","63127","63128","63129","63130","63131","63132","63133","63134","63135","63136","63137","63138","63139","63140","63141","63142","63143","63144","63145","63146","63147","63148","63149","63150","63151","63152","63153","63154","63155","63156","63157","63158","63159","63160","63161","63162","63163","63164","63165","63166","63167","63168","63169","63170","63171","63172","63173","63174","63175","63176","63177","63178","63179","63180","63181","63182","63183","63184","63185","63186","63187","63188","63189","63190","63191","63192","63193","63194","63195","63196","63197","63198","63199","63200","63201","63202","63203","63204","63205","63206","63207","63208","63209","63210","63211","63212","63213","63214","63215","63216","63217","63218","63219","63220","63221","63222","63223","63224","63225","63226","63227","63228","63229","63230","63231","63232","63233","63234","63235","63236","63237","63238","63239","63240","63241","63242","63243","63244","63245","63246","63247","63248","63249","63250","63251","63252","63253","63254","63255","63256","63257","63258","63259","63260","63261","63262","63263","63264","63265","63266","63267","63268","63269","63270","63271","63272","63273","63274","63275","63276","63277","63278","63279","63280","63281","63282","63283","63284","63285","63286","63287","63288","63289","63290","63291","63292","63293","63294","63295","63296","63297","63298","63299","63300","63301","63302","63303","63304","63305","63306","63307","63308","63309","63310","63311","63312","63313","63314","63315","63316","63317","63318","63319","63320","63321","63322","63323","63324","63325","63326","63327","63328","63329","63330","63331","63332","63333","63334","63335","63336","63337","63338","63339","63340","63341","63342","63343","63344","63345","63346","63347","63348","63349","63350","63351","63352","63353","63354","63355","63356","63357","63358","63359","63360","63361","63362","63363","63364","63365","63366","63367","63368","63369","63370","63371","63372","63373","63374","63375","63376","63377","63378","63379","63380","63381","63382","63383","63384","63385","63386","63387","63388","63389","63390","63391","63392","63393","63394","63395","63396","63397","63398","63399","63400","63401","63402","63403","63404","63405","63406","63407","63408","63409","63410","63411","63412","63413","63414","63415","63416","63417","63418","63419","63420","63421","63422","63423","63424","63425","63426","63427","63428","63429","63430","63431","63432","63433","63434","63435","63436","63437","63438","63439","63440","63441","63442","63443","63444","63445","63446","63447","63448","63449","63450","63451","63452","63453","63454","63455","63456","63457","63458","63459","63460","63461","63462","63463","63464","63465","63466","63467","63468","63469","63470","63471","63472","63473","63474","63475","63476","63477","63478","63479","63480","63481","63482","63483","63484","63485","63486","63487","63488","63489","63490","63491","63492","63493","63494","63495","63496","63497","63498","63499","63500","63501","63502","63503","63504","63505","63506","63507","63508","63509","63510","63511","63512","63513","63514","63515","63516","63517","63518","63519","63520","63521","63522","63523","63524","63525","63526","63527","63528","63529","63530","63531","63532","63533","63534","63535","63536","63537","63538","63539","63540","63541","63542","63543","63544","63545","63546","63547","63548","63549","63550","63551","63552","63553","63554","63555","63556","63557","63558","63559","63560","63561","63562","63563","63564","63565","63566","63567","63568","63569","63570","63571","63572","63573","63574","63575","63576","63577","63578","63579","63580","63581","63582","63583","63584","63585","63586","63587","63588","63589","63590","63591","63592","63593","63594","63595","63596","63597","63598","63599","63600","63601","63602","63603","63604","63605","63606","63607","63608","63609","63610","63611","63612","63613","63614","63615","63616","63617","63618","63619","63620","63621","63622","63623","63624","63625","63626","63627","63628","63629","63630","63631","63632","63633","63634","63635","63636","63637","63638","63639","63640","63641","63642","63643","63644","63645","63646","63647","63648","63649","63650","63651","63652","63653","63654","63655","63656","63657","63658","63659","63660","63661","63662","63663","63664","63665","63666","63667","63668","63669","63670","63671","63672","63673","63674","63675","63676","63677","63678","63679","63680","63681","63682","63683","63684","63685","63686","63687","63688","63689","63690","63691","63692","63693","63694","63695","63696","63697","63698","63699","63700","63701","63702","63703","63704","63705","63706","63707","63708","63709","63710","63711","63712","63713","63714","63715","63716","63717","63718","63719","63720","63721","63722","63723","63724","63725","63726","63727","63728","63729","63730","63731","63732","63733","63734","63735","63736","63737","63738","63739","63740","63741","63742","63743","63744","63745","63746","63747","63748","63749","63750","63751","63752","63753","63754","63755","63756","63757","63758","63759","63760","63761","63762","63763","63764","63765","63766","63767","63768","63769","63770","63771","63772","63773","63774","63775","63776","63777","63778","63779","63780","63781","63782","63783","63784","63785","63786","63787","63788","63789","63790","63791","63792","63793","63794","63795","63796","63797","63798","63799","63800","63801","63802","63803","63804","63805","63806","63807","63808","63809","63810","63811","63812","63813","63814","63815","63816","63817","63818","63819","63820","63821","63822","63823","63824","63825","63826","63827","63828","63829","63830","63831","63832","63833","63834","63835","63836","63837","63838","63839","63840","63841","63842","63843","63844","63845","63846","63847","63848","63849","63850","63851","63852","63853","63854","63855","63856","63857","63858","63859","63860","63861","63862","63863","63864","63865","63866","63867","63868","63869","63870","63871","63872","63873","63874","63875","63876","63877","63878","63879","63880","63881","63882","63883","63884","63885","63886","63887","63888","63889","63890","63891","63892","63893","63894","63895","63896","63897","63898","63899","63900","63901","63902","63903","63904","63905","63906","63907","63908","63909","63910","63911","63912","63913","63914","63915","63916","63917","63918","63919","63920","63921","63922","63923","63924","63925","63926","63927","63928","63929","63930","63931","63932","63933","63934","63935","63936","63937","63938","63939","63940","63941","63942","63943","63944","63945","63946","63947","63948","63949","63950","63951","63952","63953","63954","63955","63956","63957","63958","63959","63960","63961","63962","63963","63964","63965","63966","63967","63968","63969","63970","63971","63972","63973","63974","63975","63976","63977","63978","63979","63980","63981","63982","63983","63984","63985","63986","63987","63988","63989","63990","63991","63992","63993","63994","63995","63996","63997","63998","63999","64000","64001","64002","64003","64004","64005","64006","64007","64008","64009","64010","64011","64012","64013","64014","64015","64016","64017","64018","64019","64020","64021","64022","64023","64024","64025","64026","64027","64028","64029","64030","64031","64032","64033","64034","64035","64036","64037","64038","64039","64040","64041","64042","64043","64044","64045","64046","64047","64048","64049","64050","64051","64052","64053","64054","64055","64056","64057","64058","64059","64060","64061","64062","64063","64064","64065","64066","64067","64068","64069","64070","64071","64072","64073","64074","64075","64076","64077","64078","64079","64080","64081","64082","64083","64084","64085","64086","64087","64088","64089","64090","64091","64092","64093","64094","64095","64096","64097","64098","64099","64100","64101","64102","64103","64104","64105","64106","64107","64108","64109","64110","64111","64112","64113","64114","64115","64116","64117","64118","64119","64120","64121","64122","64123","64124","64125","64126","64127","64128","64129","64130","64131","64132","64133","64134","64135","64136","64137","64138","64139","64140","64141","64142","64143","64144","64145","64146","64147","64148","64149","64150","64151","64152","64153","64154","64155","64156","64157","64158","64159","64160","64161","64162","64163","64164","64165","64166","64167","64168","64169","64170","64171","64172","64173","64174","64175","64176","64177","64178","64179","64180","64181","64182","64183","64184","64185","64186","64187","64188","64189","64190","64191","64192","64193","64194","64195","64196","64197","64198","64199","64200","64201","64202","64203","64204","64205","64206","64207","64208","64209","64210","64211","64212","64213","64214","64215","64216","64217","64218","64219","64220","64221","64222","64223","64224","64225","64226","64227","64228","64229","64230","64231","64232","64233","64234","64235","64236","64237","64238","64239","64240","64241","64242","64243","64244","64245","64246","64247","64248","64249","64250","64251","64252","64253","64254","64255","64256","64257","64258","64259","64260","64261","64262","64263","64264","64265","64266","64267","64268","64269","64270","64271","64272","64273","64274","64275","64276","64277","64278","64279","64280","64281","64282","64283","64284","64285","64286","64287","64288","64289","64290","64291","64292","64293","64294","64295","64296","64297","64298","64299","64300","64301","64302","64303","64304","64305","64306","64307","64308","64309","64310","64311","64312","64313","64314","64315","64316","64317","64318","64319","64320","64321","64322","64323","64324","64325","64326","64327","64328","64329","64330","64331","64332","64333","64334","64335","64336","64337","64338","64339","64340","64341","64342","64343","64344","64345","64346","64347","64348","64349","64350","64351","64352","64353","64354","64355","64356","64357","64358","64359","64360","64361","64362","64363","64364","64365","64366","64367","64368","64369","64370","64371","64372","64373","64374","64375","64376","64377","64378","64379","64380","64381","64382","64383","64384","64385","64386","64387","64388","64389","64390","64391","64392","64393","64394","64395","64396","64397","64398","64399","64400","64401","64402","64403","64404","64405","64406","64407","64408","64409","64410","64411","64412","64413","64414","64415","64416","64417","64418","64419","64420","64421","64422","64423","64424","64425","64426","64427","64428","64429","64430","64431","64432","64433","64434","64435","64436","64437","64438","64439","64440","64441","64442","64443","64444","64445","64446","64447","64448","64449","64450","64451","64452","64453","64454","64455","64456","64457","64458","64459","64460","64461","64462","64463","64464","64465","64466","64467","64468","64469","64470","64471","64472","64473","64474","64475","64476","64477","64478","64479","64480","64481","64482","64483","64484","64485","64486","64487","64488","64489","64490","64491","64492","64493","64494","64495","64496","64497","64498","64499","64500","64501","64502","64503","64504","64505","64506","64507","64508","64509","64510","64511","64512","64513","64514","64515","64516","64517","64518","64519","64520","64521","64522","64523","64524","64525","64526","64527","64528","64529","64530","64531","64532","64533","64534","64535","64536","64537","64538","64539","64540","64541","64542","64543","64544","64545","64546","64547","64548","64549","64550","64551","64552","64553","64554","64555","64556","64557","64558","64559","64560","64561","64562","64563","64564","64565","64566","64567","64568","64569","64570","64571","64572","64573","64574","64575","64576","64577","64578","64579","64580","64581","64582","64583","64584","64585","64586","64587","64588","64589","64590","64591","64592","64593","64594","64595","64596","64597","64598","64599","64600","64601","64602","64603","64604","64605","64606","64607","64608","64609","64610","64611","64612","64613","64614","64615","64616","64617","64618","64619","64620","64621","64622","64623","64624","64625","64626","64627","64628","64629","64630","64631","64632","64633","64634","64635","64636","64637","64638","64639","64640","64641","64642","64643","64644","64645","64646","64647","64648","64649","64650","64651","64652","64653","64654","64655","64656","64657","64658","64659","64660","64661","64662","64663","64664","64665","64666","64667","64668","64669","64670","64671","64672","64673","64674","64675","64676","64677","64678","64679","64680","64681","64682","64683","64684","64685","64686","64687","64688","64689","64690","64691","64692","64693","64694","64695","64696","64697","64698","64699","64700","64701","64702","64703","64704","64705","64706","64707","64708","64709","64710","64711","64712","64713","64714","64715","64716","64717","64718","64719","64720","64721","64722","64723","64724","64725","64726","64727","64728","64729","64730","64731","64732","64733","64734","64735","64736","64737","64738","64739","64740","64741","64742","64743","64744","64745","64746","64747","64748","64749","64750","64751","64752","64753","64754","64755","64756","64757","64758","64759","64760","64761","64762","64763","64764","64765","64766","64767","64768","64769","64770","64771","64772","64773","64774","64775","64776","64777","64778","64779","64780","64781","64782","64783","64784","64785","64786","64787","64788","64789","64790","64791","64792","64793","64794","64795","64796","64797","64798","64799","64800","64801","64802","64803","64804","64805","64806","64807","64808","64809","64810","64811","64812","64813","64814","64815","64816","64817","64818","64819","64820","64821","64822","64823","64824","64825","64826","64827","64828","64829","64830","64831","64832","64833","64834","64835","64836","64837","64838","64839","64840","64841","64842","64843","64844","64845","64846","64847","64848","64849","64850","64851","64852","64853","64854","64855","64856","64857","64858","64859","64860","64861","64862","64863","64864","64865","64866","64867","64868","64869","64870","64871","64872","64873","64874","64875","64876","64877","64878","64879","64880","64881","64882","64883","64884","64885","64886","64887","64888","64889","64890","64891","64892","64893","64894","64895","64896","64897","64898","64899","64900","64901","64902","64903","64904","64905","64906","64907","64908","64909","64910","64911","64912","64913","64914","64915","64916","64917","64918","64919","64920","64921","64922","64923","64924","64925","64926","64927","64928","64929","64930","64931","64932","64933","64934","64935","64936","64937","64938","64939","64940","64941","64942","64943","64944","64945","64946","64947","64948","64949","64950","64951","64952","64953","64954","64955","64956","64957","64958","64959","64960","64961","64962","64963","64964","64965","64966","64967","64968","64969","64970","64971","64972","64973","64974","64975","64976","64977","64978","64979","64980","64981","64982","64983","64984","64985","64986","64987","64988","64989","64990","64991","64992","64993","64994","64995","64996","64997","64998","64999","65000","65001","65002","65003","65004","65005","65006","65007","65008","65009","65010","65011","65012","65013","65014","65015","65016","65017","65018","65019","65020","65021","65022","65023","65024","65025","65026","65027","65028","65029","65030","65031","65032","65033","65034","65035","65036","65037","65038","65039","65040","65041","65042","65043","65044","65045","65046","65047","65048","65049","65050","65051","65052","65053","65054","65055","65056","65057","65058","65059","65060","65061","65062","65063","65064","65065","65066","65067","65068","65069","65070","65071","65072","65073","65074","65075","65076","65077","65078","65079","65080","65081","65082","65083","65084","65085","65086","65087","65088","65089","65090","65091","65092","65093","65094","65095","65096","65097","65098","65099","65100","65101","65102","65103","65104","65105","65106","65107","65108","65109","65110","65111","65112","65113","65114","65115","65116","65117","65118","65119","65120","65121","65122","65123","65124","65125","65126","65127","65128","65129","65130","65131","65132","65133","65134","65135","65136","65137","65138","65139","65140","65141","65142","65143","65144","65145","65146","65147","65148","65149","65150","65151","65152","65153","65154","65155","65156","65157","65158","65159","65160","65161","65162","65163","65164","65165","65166","65167","65168","65169","65170","65171","65172","65173","65174","65175","65176","65177","65178","65179","65180","65181","65182","65183","65184","65185","65186","65187","65188","65189","65190","65191","65192","65193","65194","65195","65196","65197","65198","65199","65200","65201","65202","65203","65204","65205","65206","65207","65208","65209","65210","65211","65212","65213","65214","65215","65216","65217","65218","65219","65220","65221","65222","65223","65224","65225","65226","65227","65228","65229","65230","65231","65232","65233","65234","65235","65236","65237","65238","65239","65240","65241","65242","65243","65244","65245","65246","65247","65248","65249","65250","65251","65252","65253","65254","65255","65256","65257","65258","65259","65260","65261","65262","65263","65264","65265","65266","65267","65268","65269","65270","65271","65272","65273","65274","65275","65276","65277","65278","65279","65280","65281","65282","65283","65284","65285","65286","65287","65288","65289","65290","65291","65292","65293","65294","65295","65296","65297","65298","65299","65300","65301","65302","65303","65304","65305","65306","65307","65308","65309","65310","65311","65312","65313","65314","65315","65316","65317","65318","65319","65320","65321","65322","65323","65324","65325","65326","65327","65328","65329","65330","65331","65332","65333","65334","65335","65336","65337","65338","65339","65340","65341","65342","65343","65344","65345","65346","65347","65348","65349","65350","65351","65352","65353","65354","65355","65356","65357","65358","65359","65360","65361","65362","65363","65364","65365","65366","65367","65368","65369","65370","65371","65372","65373","65374","65375","65376","65377","65378","65379","65380","65381","65382","65383","65384","65385","65386","65387","65388","65389","65390","65391","65392","65393","65394","65395","65396","65397","65398","65399","65400","65401","65402","65403","65404","65405","65406","65407","65408","65409","65410","65411","65412","65413","65414","65415","65416","65417","65418","65419","65420","65421","65422","65423","65424","65425","65426","65427","65428","65429","65430","65431","65432","65433","65434","65435","65436","65437","65438","65439","65440","65441","65442","65443","65444","65445","65446","65447","65448","65449","65450","65451","65452","65453","65454","65455","65456","65457","65458","65459","65460","65461","65462","65463","65464","65465","65466","65467","65468","65469","65470","65471","65472","65473","65474","65475","65476","65477","65478","65479","65480","65481","65482","65483","65484","65485","65486","65487","65488","65489","65490","65491","65492","65493","65494","65495","65496","65497","65498","65499","65500","65501"]} +{"grid":[" !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġ","ĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡ","ȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿̡̛̖̗̘̙̜̝̞̟̠̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̕̚","̴̵̶̷̸̢̧̨̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̽̾̿̀́͂̓̈́͆͊͋͌ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮͯ͘͜͟͢͝͞͠͡ͰͱͲͳʹ͵Ͷͷ͸͹ͺͻͼͽ;Ϳ΀΁΂΃΄΅Ά·ΈΉΊ΋Ό΍ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙϚϛϜϝϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРС","ТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡ","ԢԣԤԥԦԧԨԩԪԫԬԭԮԯ԰ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖ՗՘ՙ՚՛՜՝՞՟ՠաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևֈ։֊֋֌֍֎֏֐ְֱֲֳִֵֶַָֹֺֻּֽ֑֖֛֢֣֤֥֦֧֪֚֭֮֒֓֔֕֗֘֙֜֝֞֟֠֡֨֩֫֬֯־ֿ׀ׁׂ׃ׅׄ׆ׇ׈׉׊׋׌׍׎׏אבגדהוזחטיךכלםמןנסעףפץצקרשת׫׬׭׮ׯװױײ׳״׵׶׷׸׹׺׻׼׽׾׿؀؁؂؃؄؅؆؇؈؉؊؋،؍؎؏ؘؙؚؐؑؒؓؔؕؖؗ؛؜؝؞؟ؠء","آأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّْٕٖٜٟٓٔٗ٘ٙٚٛٝٞ٠١٢٣٤٥٦٧٨٩٪٫٬٭ٮٯٰٱٲٳٴٵٶٷٸٹٺٻټٽپٿڀځڂڃڄڅچڇڈډڊڋڌڍڎڏڐڑڒړڔڕږڗژڙښڛڜڝڞڟڠڡڢڣڤڥڦڧڨکڪګڬڭڮگڰڱڲڳڴڵڶڷڸڹںڻڼڽھڿۀہۂۃۄۅۆۇۈۉۊۋیۍێۏېۑےۓ۔ەۖۗۘۙۚۛۜ۝۞ۣ۟۠ۡۢۤۥۦۧۨ۩۪ۭ۫۬ۮۯ۰۱۲۳۴۵۶۷۸۹ۺۻۼ۽۾ۿ܀܁܂܃܄܅܆܇܈܉܊܋܌܍܎܏ܐܑܒܓܔܕܖܗܘܙܚܛܜܝܞܟܠܡ","ܢܣܤܥܦܧܨܩܪܫܬܭܮܯܱܴܷܸܹܻܼܾ݂݄݆݈ܰܲܳܵܶܺܽܿ݀݁݃݅݇݉݊݋݌ݍݎݏݐݑݒݓݔݕݖݗݘݙݚݛݜݝݞݟݠݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶݷݸݹݺݻݼݽݾݿހށނރބޅކއވމފދތލގޏސޑޒޓޔޕޖޗޘޙޚޛޜޝޞޟޠޡޢޣޤޥަާިީުޫެޭޮޯްޱ޲޳޴޵޶޷޸޹޺޻޼޽޾޿߀߁߂߃߄߅߆߇߈߉ߊߋߌߍߎߏߐߑߒߓߔߕߖߗߘߙߚߛߜߝߞߟߠߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ߶߷߸߹ߺ߻߼߽߾߿ࠀࠁࠂࠃࠄࠅࠆࠇࠈࠉࠊࠋࠌࠍࠎࠏࠐࠑࠒࠓࠔࠕࠖࠗ࠘࠙ࠚࠛࠜࠝࠞࠟࠠࠡ","ࠢࠣࠤࠥࠦࠧࠨࠩࠪࠫࠬ࠭࠮࠯࠰࠱࠲࠳࠴࠵࠶࠷࠸࠹࠺࠻࠼࠽࠾࠿ࡀࡁࡂࡃࡄࡅࡆࡇࡈࡉࡊࡋࡌࡍࡎࡏࡐࡑࡒࡓࡔࡕࡖࡗࡘ࡙࡚࡛࡜࡝࡞࡟ࡠࡡࡢࡣࡤࡥࡦࡧࡨࡩࡪ࡫࡬࡭࡮࡯ࡰࡱࡲࡳࡴࡵࡶࡷࡸࡹࡺࡻࡼࡽࡾࡿࢀࢁࢂࢃࢄࢅࢆࢇ࢈ࢉࢊࢋࢌࢍࢎ࢏࢐࢑࢒࢓࢔࢕࢖࢙࢚࢛ࢗ࢘࢜࢝࢞࢟ࢠࢡࢢࢣࢤࢥࢦࢧࢨࢩࢪࢫࢬࢭࢮࢯࢰࢱࢲࢳࢴࢵࢶࢷࢸࢹࢺࢻࢼࢽࢾࢿࣀࣁࣂࣃࣄࣅࣆࣇࣈࣉ࣏࣐࣑࣒࣓࣊࣋࣌࣍࣎ࣔࣕࣖࣗࣘࣙࣚࣛࣜࣝࣞࣟ࣠࣡࣢ࣰࣱࣲࣣࣦࣩ࣭࣮࣯ࣶࣹࣺࣤࣥࣧࣨ࣪࣫࣬ࣳࣴࣵࣷࣸࣻࣼࣽࣾࣿऀँंःऄअआइईउऊऋऌऍऎएऐऑऒओऔकखगघङचछजझञटठड","ढणतथदधनऩपफबभमयरऱलळऴवशषसहऺऻ़ऽािीुूृॄॅॆेैॉॊोौ्ॎॏॐ॒॑॓॔ॕॖॗक़ख़ग़ज़ड़ढ़फ़य़ॠॡॢॣ।॥०१२३४५६७८९॰ॱॲॳॴॵॶॷॸॹॺॻॼॽॾॿঀঁংঃ঄অআইঈউঊঋঌ঍঎এঐ঑঒ওঔকখগঘঙচছজঝঞটঠডঢণতথদধন঩পফবভমযর঱ল঳঴঵শষসহ঺঻়ঽািীুূৃৄ৅৆েৈ৉৊োৌ্ৎ৏৐৑৒৓৔৕৖ৗ৘৙৚৛ড়ঢ়৞য়ৠৡৢৣ৤৥০১২৩৪৫৬৭৮৯ৰৱ৲৳৴৵৶৷৸৹৺৻ৼ৽৾৿਀ਁਂਃ਄ਅਆਇਈਉਊ਋਌਍਎ਏਐ਑਒ਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡ","ਢਣਤਥਦਧਨ਩ਪਫਬਭਮਯਰ਱ਲਲ਼਴ਵਸ਼਷ਸਹ਺਻਼਽ਾਿੀੁੂ੃੄੅੆ੇੈ੉੊ੋੌ੍੎੏੐ੑ੒੓੔੕੖੗੘ਖ਼ਗ਼ਜ਼ੜ੝ਫ਼੟੠੡੢੣੤੥੦੧੨੩੪੫੬੭੮੯ੰੱੲੳੴੵ੶੷੸੹੺੻੼੽੾੿઀ઁંઃ઄અઆઇઈઉઊઋઌઍ઎એઐઑ઒ઓઔકખગઘઙચછજઝઞટઠડઢણતથદધન઩પફબભમયર઱લળ઴વશષસહ઺઻઼ઽાિીુૂૃૄૅ૆ેૈૉ૊ોૌ્૎૏ૐ૑૒૓૔૕૖૗૘૙૚૛૜૝૞૟ૠૡૢૣ૤૥૦૧૨૩૪૫૬૭૮૯૰૱૲૳૴૵૶૷૸ૹૺૻૼ૽૾૿଀ଁଂଃ଄ଅଆଇଈଉଊଋଌ଍଎ଏଐ଑଒ଓଔକଖଗଘଙଚଛଜଝଞଟଠଡ","ଢଣତଥଦଧନ଩ପଫବଭମଯର଱ଲଳ଴ଵଶଷସହ଺଻଼ଽାିୀୁୂୃୄ୅୆େୈ୉୊ୋୌ୍୎୏୐୑୒୓୔୕ୖୗ୘୙୚୛ଡ଼ଢ଼୞ୟୠୡୢୣ୤୥୦୧୨୩୪୫୬୭୮୯୰ୱ୲୳୴୵୶୷୸୹୺୻୼୽୾୿஀஁ஂஃ஄அஆஇஈஉஊ஋஌஍எஏஐ஑ஒஓஔக஖஗஘ஙச஛ஜ஝ஞட஠஡஢ணத஥஦஧நனப஫஬஭மயரறலளழவஶஷஸஹ஺஻஼஽ாிீுூ௃௄௅ெேை௉ொோௌ்௎௏ௐ௑௒௓௔௕௖ௗ௘௙௚௛௜௝௞௟௠௡௢௣௤௥௦௧௨௩௪௫௬௭௮௯௰௱௲௳௴௵௶௷௸௹௺௻௼௽௾௿ఀఁంఃఄఅఆఇఈఉఊఋఌ఍ఎఏఐ఑ఒఓఔకఖగఘఙచఛజఝఞటఠడ","ఢణతథదధన఩పఫబభమయరఱలళఴవశషసహ఺఻఼ఽాిీుూృౄ౅ెేై౉ొోౌ్౎౏౐౑౒౓౔ౕౖ౗ౘౙౚ౛౜ౝ౞౟ౠౡౢౣ౤౥౦౧౨౩౪౫౬౭౮౯౰౱౲౳౴౵౶౷౸౹౺౻౼౽౾౿ಀಁಂಃ಄ಅಆಇಈಉಊಋಌ಍ಎಏಐ಑ಒಓಔಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನ಩ಪಫಬಭಮಯರಱಲಳ಴ವಶಷಸಹ಺಻಼ಽಾಿೀುೂೃೄ೅ೆೇೈ೉ೊೋೌ್೎೏೐೑೒೓೔ೕೖ೗೘೙೚೛೜ೝೞ೟ೠೡೢೣ೤೥೦೧೨೩೪೫೬೭೮೯೰ೱೲೳ೴೵೶೷೸೹೺೻೼೽೾೿ഀഁംഃഄഅആഇഈഉഊഋഌ഍എഏഐ഑ഒഓഔകഖഗഘങചഛജഝഞടഠഡ","ഢണതഥദധനഩപഫബഭമയരറലളഴവശഷസഹഺ഻഼ഽാിീുൂൃൄ൅െേൈ൉ൊോൌ്ൎ൏൐൑൒൓ൔൕൖൗ൘൙൚൛൜൝൞ൟൠൡൢൣ൤൥൦൧൨൩൪൫൬൭൮൯൰൱൲൳൴൵൶൷൸൹ൺൻർൽൾൿ඀ඁංඃ඄අආඇඈඉඊඋඌඍඎඏඐඑඒඓඔඕඖ඗඘඙කඛගඝඞඟචඡජඣඤඥඦටඨඩඪණඬතථදධන඲ඳපඵබභමඹයර඼ල඾඿වශෂසහළෆ෇෈෉්෋෌෍෎ාැෑිීු෕ූ෗ෘෙේෛොෝෞෟ෠෡෢෣෤෥෦෧෨෩෪෫෬෭෮෯෰෱ෲෳ෴෵෶෷෸෹෺෻෼෽෾෿฀กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภม","ยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฻฼฽฾฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛๜๝๞๟๠๡๢๣๤๥๦๧๨๩๪๫๬๭๮๯๰๱๲๳๴๵๶๷๸๹๺๻๼๽๾๿຀ກຂ຃ຄ຅ຆງຈຉຊ຋ຌຍຎຏຐຑຒຓດຕຖທຘນບປຜຝພຟຠມຢຣ຤ລ຦ວຨຩສຫຬອຮຯະັາຳິີຶື຺ຸູົຼຽ຾຿ເແໂໃໄ໅ໆ໇່້໊໋໌ໍ໎໏໐໑໒໓໔໕໖໗໘໙໚໛ໜໝໞໟ໠໡໢໣໤໥໦໧໨໩໪໫໬໭໮໯໰໱໲໳໴໵໶໷໸໹໺໻໼໽໾໿ༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗༘༙༚༛༜༝༞༟༠༡","༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳༴༵༶༷༸༹༺༻༼༽༾༿ཀཁགགྷངཅཆཇ཈ཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟའཡརལཤཥསཧཨཀྵཪཫཬ཭཮཯཰ཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗ྘ྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྽྾྿࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚࿛࿜࿝࿞࿟࿠࿡࿢࿣࿤࿥࿦࿧࿨࿩࿪࿫࿬࿭࿮࿯࿰࿱࿲࿳࿴࿵࿶࿷࿸࿹࿺࿻࿼࿽࿾࿿ကခဂဃငစဆဇဈဉညဋဌဍဎဏတထဒဓနပဖဗဘမယရလဝသဟဠအ","ဢဣဤဥဦဧဨဩဪါာိီုူေဲဳဴဵံ့း္်ျြွှဿ၀၁၂၃၄၅၆၇၈၉၊။၌၍၎၏ၐၑၒၓၔၕၖၗၘၙၚၛၜၝၞၟၠၡၢၣၤၥၦၧၨၩၪၫၬၭၮၯၰၱၲၳၴၵၶၷၸၹၺၻၼၽၾၿႀႁႂႃႄႅႆႇႈႉႊႋႌႍႎႏ႐႑႒႓႔႕႖႗႘႙ႚႛႜႝ႞႟ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅ჆Ⴧ჈჉჊჋჌Ⴭ჎჏აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ჻ჼჽჾჿᄀᄁᄂᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒᄓᄔᄕᄖᄗᄘᄙᄚᄛᄜᄝᄞᄟᄠᄡ","ᄢᄣᄤᄥᄦᄧᄨᄩᄪᄫᄬᄭᄮᄯᄰᄱᄲᄳᄴᄵᄶᄷᄸᄹᄺᄻᄼᄽᄾᄿᅀᅁᅂᅃᅄᅅᅆᅇᅈᅉᅊᅋᅌᅍᅎᅏᅐᅑᅒᅓᅔᅕᅖᅗᅘᅙᅚᅛᅜᅝᅞᅟᅠᅡᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵᅶᅷᅸᅹᅺᅻᅼᅽᅾᅿᆀᆁᆂᆃᆄᆅᆆᆇᆈᆉᆊᆋᆌᆍᆎᆏᆐᆑᆒᆓᆔᆕᆖᆗᆘᆙᆚᆛᆜᆝᆞᆟᆠᆡᆢᆣᆤᆥᆦᆧᆨᆩᆪᆫᆬᆭᆮᆯᆰᆱᆲᆳᆴᆵᆶᆷᆸᆹᆺᆻᆼᆽᆾᆿᇀᇁᇂᇃᇄᇅᇆᇇᇈᇉᇊᇋᇌᇍᇎᇏᇐᇑᇒᇓᇔᇕᇖᇗᇘᇙᇚᇛᇜᇝᇞᇟᇠᇡᇢᇣᇤᇥᇦᇧᇨᇩᇪᇫᇬᇭᇮᇯᇰᇱᇲᇳᇴᇵᇶᇷᇸᇹᇺᇻᇼᇽᇾᇿሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟሠሡ","ሢሣሤሥሦሧረሩሪራሬርሮሯሰሱሲሳሴስሶሷሸሹሺሻሼሽሾሿቀቁቂቃቄቅቆቇቈ቉ቊቋቌቍ቎቏ቐቑቒቓቔቕቖ቗ቘ቙ቚቛቜቝ቞቟በቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿኀኁኂኃኄኅኆኇኈ኉ኊኋኌኍ኎኏ነኑኒናኔንኖኗኘኙኚኛኜኝኞኟአኡኢኣኤእኦኧከኩኪካኬክኮኯኰ኱ኲኳኴኵ኶኷ኸኹኺኻኼኽኾ኿ዀ዁ዂዃዄዅ዆዇ወዉዊዋዌውዎዏዐዑዒዓዔዕዖ዗ዘዙዚዛዜዝዞዟዠዡዢዣዤዥዦዧየዩዪያዬይዮዯደዱዲዳዴድዶዷዸዹዺዻዼዽዾዿጀጁጂጃጄጅጆጇገጉጊጋጌግጎጏጐ጑ጒጓጔጕ጖጗ጘጙጚጛጜጝጞጟጠጡ","ጢጣጤጥጦጧጨጩጪጫጬጭጮጯጰጱጲጳጴጵጶጷጸጹጺጻጼጽጾጿፀፁፂፃፄፅፆፇፈፉፊፋፌፍፎፏፐፑፒፓፔፕፖፗፘፙፚ፛፜፝፞፟፠፡።፣፤፥፦፧፨፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼፽፾፿ᎀᎁᎂᎃᎄᎅᎆᎇᎈᎉᎊᎋᎌᎍᎎᎏ᎐᎑᎒᎓᎔᎕᎖᎗᎘᎙᎚᎛᎜᎝᎞᎟ᎠᎡᎢᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴᏵ᏶᏷ᏸᏹᏺᏻᏼᏽ᏾᏿᐀ᐁᐂᐃᐄᐅᐆᐇᐈᐉᐊᐋᐌᐍᐎᐏᐐᐑᐒᐓᐔᐕᐖᐗᐘᐙᐚᐛᐜᐝᐞᐟᐠᐡ","ᐢᐣᐤᐥᐦᐧᐨᐩᐪᐫᐬᐭᐮᐯᐰᐱᐲᐳᐴᐵᐶᐷᐸᐹᐺᐻᐼᐽᐾᐿᑀᑁᑂᑃᑄᑅᑆᑇᑈᑉᑊᑋᑌᑍᑎᑏᑐᑑᑒᑓᑔᑕᑖᑗᑘᑙᑚᑛᑜᑝᑞᑟᑠᑡᑢᑣᑤᑥᑦᑧᑨᑩᑪᑫᑬᑭᑮᑯᑰᑱᑲᑳᑴᑵᑶᑷᑸᑹᑺᑻᑼᑽᑾᑿᒀᒁᒂᒃᒄᒅᒆᒇᒈᒉᒊᒋᒌᒍᒎᒏᒐᒑᒒᒓᒔᒕᒖᒗᒘᒙᒚᒛᒜᒝᒞᒟᒠᒡᒢᒣᒤᒥᒦᒧᒨᒩᒪᒫᒬᒭᒮᒯᒰᒱᒲᒳᒴᒵᒶᒷᒸᒹᒺᒻᒼᒽᒾᒿᓀᓁᓂᓃᓄᓅᓆᓇᓈᓉᓊᓋᓌᓍᓎᓏᓐᓑᓒᓓᓔᓕᓖᓗᓘᓙᓚᓛᓜᓝᓞᓟᓠᓡᓢᓣᓤᓥᓦᓧᓨᓩᓪᓫᓬᓭᓮᓯᓰᓱᓲᓳᓴᓵᓶᓷᓸᓹᓺᓻᓼᓽᓾᓿᔀᔁᔂᔃᔄᔅᔆᔇᔈᔉᔊᔋᔌᔍᔎᔏᔐᔑᔒᔓᔔᔕᔖᔗᔘᔙᔚᔛᔜᔝᔞᔟᔠᔡ","ᔢᔣᔤᔥᔦᔧᔨᔩᔪᔫᔬᔭᔮᔯᔰᔱᔲᔳᔴᔵᔶᔷᔸᔹᔺᔻᔼᔽᔾᔿᕀᕁᕂᕃᕄᕅᕆᕇᕈᕉᕊᕋᕌᕍᕎᕏᕐᕑᕒᕓᕔᕕᕖᕗᕘᕙᕚᕛᕜᕝᕞᕟᕠᕡᕢᕣᕤᕥᕦᕧᕨᕩᕪᕫᕬᕭᕮᕯᕰᕱᕲᕳᕴᕵᕶᕷᕸᕹᕺᕻᕼᕽᕾᕿᖀᖁᖂᖃᖄᖅᖆᖇᖈᖉᖊᖋᖌᖍᖎᖏᖐᖑᖒᖓᖔᖕᖖᖗᖘᖙᖚᖛᖜᖝᖞᖟᖠᖡᖢᖣᖤᖥᖦᖧᖨᖩᖪᖫᖬᖭᖮᖯᖰᖱᖲᖳᖴᖵᖶᖷᖸᖹᖺᖻᖼᖽᖾᖿᗀᗁᗂᗃᗄᗅᗆᗇᗈᗉᗊᗋᗌᗍᗎᗏᗐᗑᗒᗓᗔᗕᗖᗗᗘᗙᗚᗛᗜᗝᗞᗟᗠᗡᗢᗣᗤᗥᗦᗧᗨᗩᗪᗫᗬᗭᗮᗯᗰᗱᗲᗳᗴᗵᗶᗷᗸᗹᗺᗻᗼᗽᗾᗿᘀᘁᘂᘃᘄᘅᘆᘇᘈᘉᘊᘋᘌᘍᘎᘏᘐᘑᘒᘓᘔᘕᘖᘗᘘᘙᘚᘛᘜᘝᘞᘟᘠᘡ","ᘢᘣᘤᘥᘦᘧᘨᘩᘪᘫᘬᘭᘮᘯᘰᘱᘲᘳᘴᘵᘶᘷᘸᘹᘺᘻᘼᘽᘾᘿᙀᙁᙂᙃᙄᙅᙆᙇᙈᙉᙊᙋᙌᙍᙎᙏᙐᙑᙒᙓᙔᙕᙖᙗᙘᙙᙚᙛᙜᙝᙞᙟᙠᙡᙢᙣᙤᙥᙦᙧᙨᙩᙪᙫᙬ᙭᙮ᙯᙰᙱᙲᙳᙴᙵᙶᙷᙸᙹᙺᙻᙼᙽᙾᙿ ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔᚕᚖᚗᚘᚙᚚ᚛᚜᚝᚞᚟ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰᛱᛲᛳᛴᛵᛶᛷᛸ᛹᛺᛻᛼᛽᛾᛿ᜀᜁᜂᜃᜄᜅᜆᜇᜈᜉᜊᜋᜌᜍᜎᜏᜐᜑᜒᜓ᜔᜕᜖᜗᜘᜙᜚᜛᜜᜝᜞ᜟᜠᜡ","ᜢᜣᜤᜥᜦᜧᜨᜩᜪᜫᜬᜭᜮᜯᜰᜱᜲᜳ᜴᜵᜶᜷᜸᜹᜺᜻᜼᜽᜾᜿ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑᝒᝓ᝔᝕᝖᝗᝘᝙᝚᝛᝜᝝᝞᝟ᝠᝡᝢᝣᝤᝥᝦᝧᝨᝩᝪᝫᝬ᝭ᝮᝯᝰ᝱ᝲᝳ᝴᝵᝶᝷᝸᝹᝺᝻᝼᝽᝾᝿កខគឃងចឆជឈញដឋឌឍណតថទធនបផពភមយរលវឝឞសហឡអឣឤឥឦឧឨឩឪឫឬឭឮឯឰឱឲឳ឴឵ាិីឹឺុូួើឿៀេែៃោៅំះៈ៉៊់៌៍៎៏័៑្៓។៕៖ៗ៘៙៚៛ៜ៝៞៟០១២៣៤៥៦៧៨៩៪៫៬៭៮៯៰៱៲៳៴៵៶៷៸៹៺៻៼៽៾៿᠀᠁᠂᠃᠄᠅᠆᠇᠈᠉᠊᠋᠌᠍᠎᠏᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙᠚᠛᠜᠝᠞᠟ᠠᠡ","ᠢᠣᠤᠥᠦᠧᠨᠩᠪᠫᠬᠭᠮᠯᠰᠱᠲᠳᠴᠵᠶᠷᠸᠹᠺᠻᠼᠽᠾᠿᡀᡁᡂᡃᡄᡅᡆᡇᡈᡉᡊᡋᡌᡍᡎᡏᡐᡑᡒᡓᡔᡕᡖᡗᡘᡙᡚᡛᡜᡝᡞᡟᡠᡡᡢᡣᡤᡥᡦᡧᡨᡩᡪᡫᡬᡭᡮᡯᡰᡱᡲᡳᡴᡵᡶᡷᡸ᡹᡺᡻᡼᡽᡾᡿ᢀᢁᢂᢃᢄᢅᢆᢇᢈᢉᢊᢋᢌᢍᢎᢏᢐᢑᢒᢓᢔᢕᢖᢗᢘᢙᢚᢛᢜᢝᢞᢟᢠᢡᢢᢣᢤᢥᢦᢧᢨᢩᢪ᢫᢬᢭᢮᢯ᢰᢱᢲᢳᢴᢵᢶᢷᢸᢹᢺᢻᢼᢽᢾᢿᣀᣁᣂᣃᣄᣅᣆᣇᣈᣉᣊᣋᣌᣍᣎᣏᣐᣑᣒᣓᣔᣕᣖᣗᣘᣙᣚᣛᣜᣝᣞᣟᣠᣡᣢᣣᣤᣥᣦᣧᣨᣩᣪᣫᣬᣭᣮᣯᣰᣱᣲᣳᣴᣵ᣶᣷᣸᣹᣺᣻᣼᣽᣾᣿ᤀᤁᤂᤃᤄᤅᤆᤇᤈᤉᤊᤋᤌᤍᤎᤏᤐᤑᤒᤓᤔᤕᤖᤗᤘᤙᤚᤛᤜᤝᤞ᤟ᤠᤡ","ᤢᤣᤤᤥᤦᤧᤨᤩᤪᤫ᤬᤭᤮᤯ᤰᤱᤲᤳᤴᤵᤶᤷᤸ᤻᤹᤺᤼᤽᤾᤿᥀᥁᥂᥃᥄᥅᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏ᥐᥑᥒᥓᥔᥕᥖᥗᥘᥙᥚᥛᥜᥝᥞᥟᥠᥡᥢᥣᥤᥥᥦᥧᥨᥩᥪᥫᥬᥭ᥮᥯ᥰᥱᥲᥳᥴ᥵᥶᥷᥸᥹᥺᥻᥼᥽᥾᥿ᦀᦁᦂᦃᦄᦅᦆᦇᦈᦉᦊᦋᦌᦍᦎᦏᦐᦑᦒᦓᦔᦕᦖᦗᦘᦙᦚᦛᦜᦝᦞᦟᦠᦡᦢᦣᦤᦥᦦᦧᦨᦩᦪᦫ᦬᦭᦮᦯ᦰᦱᦲᦳᦴᦵᦶᦷᦸᦹᦺᦻᦼᦽᦾᦿᧀᧁᧂᧃᧄᧅᧆᧇᧈᧉ᧊᧋᧌᧍᧎᧏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᧚᧛᧜᧝᧞᧟᧠᧡᧢᧣᧤᧥᧦᧧᧨᧩᧪᧫᧬᧭᧮᧯᧰᧱᧲᧳᧴᧵᧶᧷᧸᧹᧺᧻᧼᧽᧾᧿ᨀᨁᨂᨃᨄᨅᨆᨇᨈᨉᨊᨋᨌᨍᨎᨏᨐᨑᨒᨓᨔᨕᨖᨘᨗᨙᨚᨛ᨜᨝᨞᨟ᨠᨡ","ᨢᨣᨤᨥᨦᨧᨨᨩᨪᨫᨬᨭᨮᨯᨰᨱᨲᨳᨴᨵᨶᨷᨸᨹᨺᨻᨼᨽᨾᨿᩀᩁᩂᩃᩄᩅᩆᩇᩈᩉᩊᩋᩌᩍᩎᩏᩐᩑᩒᩓᩔᩕᩖᩗᩘᩙᩚᩛᩜᩝᩞ᩟᩠ᩡᩢᩣᩤᩥᩦᩧᩨᩩᩪᩫᩬᩭᩮᩯᩰᩱᩲᩳᩴ᩵᩶᩷᩸᩹᩺᩻᩼᩽᩾᩿᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪊᪋᪌᪍᪎᪏᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙᪚᪛᪜᪝᪞᪟᪠᪡᪢᪣᪤᪥᪦ᪧ᪨᪩᪪᪫᪬᪭᪮᪯᪵᪶᪷᪸᪹᪺᪽᪰᪱᪲᪳᪴᪻᪼᪾ᪿᫀ᫃᫄᫊᫁᫂᫅᫆᫇᫈᫉᫋ᫌᫍᫎ᫏᫐᫑᫒᫓᫔᫕᫖᫗᫘᫙᫚᫛᫜᫝᫞᫟᫠᫡᫢᫣᫤᫥᫦᫧᫨᫩᫪᫫᫬᫭᫮᫯᫰᫱᫲᫳᫴᫵᫶᫷᫸᫹᫺᫻᫼᫽᫾᫿ᬀᬁᬂᬃᬄᬅᬆᬇᬈᬉᬊᬋᬌᬍᬎᬏᬐᬑᬒᬓᬔᬕᬖᬗᬘᬙᬚᬛᬜᬝᬞᬟᬠᬡ","ᬢᬣᬤᬥᬦᬧᬨᬩᬪᬫᬬᬭᬮᬯᬰᬱᬲᬳ᬴ᬵᬶᬷᬸᬹᬺᬻᬼᬽᬾᬿᭀᭁᭂᭃ᭄ᭅᭆᭇᭈᭉᭊᭋᭌ᭍᭎᭏᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᭚᭛᭜᭝᭞᭟᭠᭡᭢᭣᭤᭥᭦᭧᭨᭩᭪᭬᭫᭭᭮᭯᭰᭱᭲᭳᭴᭵᭶᭷᭸᭹᭺᭻᭼᭽᭾᭿ᮀᮁᮂᮃᮄᮅᮆᮇᮈᮉᮊᮋᮌᮍᮎᮏᮐᮑᮒᮓᮔᮕᮖᮗᮘᮙᮚᮛᮜᮝᮞᮟᮠᮡᮢᮣᮤᮥᮦᮧᮨᮩ᮪᮫ᮬᮭᮮᮯ᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹ᮺᮻᮼᮽᮾᮿᯀᯁᯂᯃᯄᯅᯆᯇᯈᯉᯊᯋᯌᯍᯎᯏᯐᯑᯒᯓᯔᯕᯖᯗᯘᯙᯚᯛᯜᯝᯞᯟᯠᯡᯢᯣᯤᯥ᯦ᯧᯨᯩᯪᯫᯬᯭᯮᯯᯰᯱ᯲᯳᯴᯵᯶᯷᯸᯹᯺᯻᯼᯽᯾᯿ᰀᰁᰂᰃᰄᰅᰆᰇᰈᰉᰊᰋᰌᰍᰎᰏᰐᰑᰒᰓᰔᰕᰖᰗᰘᰙᰚᰛᰜᰝᰞᰟᰠᰡ","ᰢᰣᰤᰥᰦᰧᰨᰩᰪᰫᰬᰭᰮᰯᰰᰱᰲᰳᰴᰵᰶ᰷᰸᰹᰺᰻᰼᰽᰾᰿᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱊᱋᱌ᱍᱎᱏ᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙ᱚᱛᱜᱝᱞᱟᱠᱡᱢᱣᱤᱥᱦᱧᱨᱩᱪᱫᱬᱭᱮᱯᱰᱱᱲᱳᱴᱵᱶᱷᱸᱹᱺᱻᱼᱽ᱾᱿ᲀᲁᲂᲃᲄᲅᲆᲇᲈᲉᲊ᲋᲌᲍᲎᲏ᲐᲑᲒᲓᲔᲕᲖᲗᲘᲙᲚᲛᲜᲝᲞᲟᲠᲡᲢᲣᲤᲥᲦᲧᲨᲩᲪᲫᲬᲭᲮᲯᲰᲱᲲᲳᲴᲵᲶᲷᲸᲹᲺ᲻᲼ᲽᲾᲿ᳀᳁᳂᳃᳄᳅᳆᳇᳈᳉᳊᳋᳌᳍᳎᳏᳐᳑᳒᳓᳔᳕᳖᳗᳘᳙᳜᳝᳞᳟᳚᳛᳠᳡᳢᳣᳤᳥᳦᳧᳨ᳩᳪᳫᳬ᳭ᳮᳯᳰᳱᳲᳳ᳴ᳵᳶ᳷᳸᳹ᳺ᳻᳼᳽᳾᳿ᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡ","ᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿ᷐᷎᷺᷂᷊᷏᷹᷽᷿᷷᷸᷀᷁᷃᷄᷅᷆᷇᷈᷉᷋᷌᷑᷒ᷓᷔᷕᷖᷗᷘᷙᷚᷛᷜᷝᷞᷟᷠᷡᷢᷣᷤᷥᷦᷧᷨᷩᷪᷫᷬᷭᷮᷯᷰᷱᷲᷳᷴ᷵᷻᷾᷶᷼᷍ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡ","ḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕ἖἗ἘἙἚἛἜἝ἞἟ἠἡ","ἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃὄὅ὆὇ὈὉὊὋὌὍ὎὏ὐὑὒὓὔὕὖὗ὘Ὑ὚Ὓ὜Ὕ὞ὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώ὾὿ᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴ᾵ᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄ῅ῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐ῔῕ῖῗῘῙῚΊ῜῝῞῟ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`῰῱ῲῳῴ῵ῶῷῸΌῺΏῼ´῾῿           ​‌‍‎‏‐‑‒–—―‖‗‘’‚‛“”„‟†‡","•‣․‥…‧

‪‫‬‭‮ ‰‱′″‴‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞ ⁠⁡⁢⁣⁤⁥⁦⁧⁨⁩⁰ⁱ⁲⁳⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎₏ₐₑₒₓₔₕₖₗₘₙₚₛₜ₝₞₟₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽₾₿⃀⃁⃂⃃⃄⃅⃆⃇⃈⃉⃊⃋⃌⃍⃎⃏⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛⃜⃝⃞⃟⃠⃡⃢⃣⃤⃥⃦⃪⃫⃨⃬⃭⃮⃯⃧⃩⃰⃱⃲⃳⃴⃵⃶⃷⃸⃹⃺⃻⃼⃽⃾⃿℀℁ℂ℃℄℅℆ℇ℈℉ℊℋℌℍℎℏℐℑℒℓ℔ℕ№℗℘ℙℚℛℜℝ℞℟℠℡","™℣ℤ℥Ω℧ℨ℩KÅℬℭ℮ℯℰℱℲℳℴℵℶℷℸℹ℺℻ℼℽℾℿ⅀⅁⅂⅃⅄ⅅⅆⅇⅈⅉ⅊⅋⅌⅍ⅎ⅏⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉↊↋↌↍↎↏←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡","∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟⌠⌡","⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍼⍽⍾⍿⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎕⎖⎗⎘⎙⎚⎛⎜⎝⎞⎟⎠⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎮⎯⎰⎱⎲⎳⎴⎵⎶⎷⎸⎹⎺⎻⎼⎽⎾⎿⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏜⏝⏞⏟⏠⏡⏢⏣⏤⏥⏦⏧⏨⏩⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏴⏵⏶⏷⏸⏹⏺⏻⏼⏽⏾⏿␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡","␢␣␤␥␦␧␨␩␪␫␬␭␮␯␰␱␲␳␴␵␶␷␸␹␺␻␼␽␾␿⑀⑁⑂⑃⑄⑅⑆⑇⑈⑉⑊⑋⑌⑍⑎⑏⑐⑑⑒⑓⑔⑕⑖⑗⑘⑙⑚⑛⑜⑝⑞⑟①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡","┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐█▒▓▔▕▖▗▘▙▚▛▜▝▞▟■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡","☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡","✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟋⟌⟍⟎⟏⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡","⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡","⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹⤺⤻⤼⤽⤾⤿⥀⥁⥂⥃⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚⨛⨜⨝⨞⨟⨠⨡","⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾⨿⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩙⩚⩛⩜⩝⩞⩟⩠⩡⩢⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚⫛⫝̸⫝⫞⫟⫠⫡⫢⫣⫤⫥⫦⫧⫨⫩⫪⫫⫬⫭⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟⬠⬡","⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭍⭎⭏⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙⭚⭛⭜⭝⭞⭟⭠⭡⭢⭣⭤⭥⭦⭧⭨⭩⭪⭫⭬⭭⭮⭯⭰⭱⭲⭳⭴⭵⭶⭷⭸⭹⭺⭻⭼⭽⭾⭿⮀⮁⮂⮃⮄⮅⮆⮇⮈⮉⮊⮋⮌⮍⮎⮏⮐⮑⮒⮓⮔⮕⮖⮗⮘⮙⮚⮛⮜⮝⮞⮟⮠⮡⮢⮣⮤⮥⮦⮧⮨⮩⮪⮫⮬⮭⮮⮯⮰⮱⮲⮳⮴⮵⮶⮷⮸⮹⮺⮻⮼⮽⮾⮿⯀⯁⯂⯃⯄⯅⯆⯇⯈⯉⯊⯋⯌⯍⯎⯏⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯾⯿ⰀⰁⰂⰃⰄⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟⰠⰡ","ⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰯⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿⱀⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕⱖⱗⱘⱙⱚⱛⱜⱝⱞⱟⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟⲠⲡⲢⲣⲤⲥⲦⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟⳠⳡⳢⳣⳤ⳥⳦⳧⳨⳩⳪ⳫⳬⳭⳮ⳯⳰⳱Ⳳⳳ⳴⳵⳶⳷⳸⳹⳺⳻⳼⳽⳾⳿ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡ","ⴢⴣⴤⴥ⴦ⴧ⴨⴩⴪⴫⴬ⴭ⴮⴯ⴰⴱⴲⴳⴴⴵⴶⴷⴸⴹⴺⴻⴼⴽⴾⴿⵀⵁⵂⵃⵄⵅⵆⵇⵈⵉⵊⵋⵌⵍⵎⵏⵐⵑⵒⵓⵔⵕⵖⵗⵘⵙⵚⵛⵜⵝⵞⵟⵠⵡⵢⵣⵤⵥⵦⵧ⵨⵩⵪⵫⵬⵭⵮ⵯ⵰⵱⵲⵳⵴⵵⵶⵷⵸⵹⵺⵻⵼⵽⵾⵿ⶀⶁⶂⶃⶄⶅⶆⶇⶈⶉⶊⶋⶌⶍⶎⶏⶐⶑⶒⶓⶔⶕⶖ⶗⶘⶙⶚⶛⶜⶝⶞⶟ⶠⶡⶢⶣⶤⶥⶦ⶧ⶨⶩⶪⶫⶬⶭⶮ⶯ⶰⶱⶲⶳⶴⶵⶶ⶷ⶸⶹⶺⶻⶼⶽⶾ⶿ⷀⷁⷂⷃⷄⷅⷆ⷇ⷈⷉⷊⷋⷌⷍⷎ⷏ⷐⷑⷒⷓⷔⷕⷖ⷗ⷘⷙⷚⷛⷜⷝⷞ⷟ⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷⷸⷹⷺⷻⷼⷽⷾⷿ⸀⸁⸂⸃⸄⸅⸆⸇⸈⸉⸊⸋⸌⸍⸎⸏⸐⸑⸒⸓⸔⸕⸖⸗⸘⸙⸚⸛⸜⸝⸞⸟⸠⸡","⸢⸣⸤⸥⸦⸧⸨⸩⸪⸫⸬⸭⸮ⸯ⸰⸱⸲⸳⸴⸵⸶⸷⸸⸹⸺⸻⸼⸽⸾⸿⹀⹁⹂⹃⹄⹅⹆⹇⹈⹉⹊⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜⹝⹞⹟⹠⹡⹢⹣⹤⹥⹦⹧⹨⹩⹪⹫⹬⹭⹮⹯⹰⹱⹲⹳⹴⹵⹶⹷⹸⹹⹺⹻⹼⹽⹾⹿⺀⺁⺂⺃⺄⺅⺆⺇⺈⺉⺊⺋⺌⺍⺎⺏⺐⺑⺒⺓⺔⺕⺖⺗⺘⺙⺚⺛⺜⺝⺞⺟⺠⺡⺢⺣⺤⺥⺦⺧⺨⺩⺪⺫⺬⺭⺮⺯⺰⺱⺲⺳⺴⺵⺶⺷⺸⺹⺺⺻⺼⺽⺾⺿⻀⻁⻂⻃⻄⻅⻆⻇⻈⻉⻊⻋⻌⻍⻎⻏⻐⻑⻒⻓⻔⻕⻖⻗⻘⻙⻚⻛⻜⻝⻞⻟⻠⻡⻢⻣⻤⻥⻦⻧⻨⻩⻪⻫⻬⻭⻮⻯⻰⻱⻲⻳⻴⻵⻶⻷⻸⻹⻺⻻⻼⻽⻾⻿⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟⼠⼡","⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕⿖⿗⿘⿙⿚⿛⿜⿝⿞⿟⿠⿡⿢⿣⿤⿥⿦⿧⿨⿩⿪⿫⿬⿭⿮⿯⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻⿼⿽⿾⿿ 、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡","〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾〿぀ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゗゘゙゚゛゜ゝゞゟ゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ㄀㄁㄂㄃㄄ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡ","ㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄮㄯ㄰ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ㆏㆐㆑㆒㆓㆔㆕㆖㆗㆘㆙㆚㆛㆜㆝㆞㆟ㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆵㆶㆷㆸㆹㆺㆻㆼㆽㆾㆿ㇀㇁㇂㇃㇄㇅㇆㇇㇈㇉㇊㇋㇌㇍㇎㇏㇐㇑㇒㇓㇔㇕㇖㇗㇘㇙㇚㇛㇜㇝㇞㇟㇠㇡㇢㇣㇤㇥㇦㇧㇨㇩㇪㇫㇬㇭㇮㇯ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㈝㈞㈟㈠㈡","㈢㈣㈤㈥㈦㈧㈨㈩㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃㉄㉅㉆㉇㉈㉉㉊㉋㉌㉍㉎㉏㉐㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉼㉽㉾㉿㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㋌㋍㋎㋏㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾㋿㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡","㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㍻㍼㍽㍾㍿㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㏿㐀㐁㐂㐃㐄㐅㐆㐇㐈㐉㐊㐋㐌㐍㐎㐏㐐㐑㐒㐓㐔㐕㐖㐗㐘㐙㐚㐛㐜㐝㐞㐟㐠㐡","㐢㐣㐤㐥㐦㐧㐨㐩㐪㐫㐬㐭㐮㐯㐰㐱㐲㐳㐴㐵㐶㐷㐸㐹㐺㐻㐼㐽㐾㐿㑀㑁㑂㑃㑄㑅㑆㑇㑈㑉㑊㑋㑌㑍㑎㑏㑐㑑㑒㑓㑔㑕㑖㑗㑘㑙㑚㑛㑜㑝㑞㑟㑠㑡㑢㑣㑤㑥㑦㑧㑨㑩㑪㑫㑬㑭㑮㑯㑰㑱㑲㑳㑴㑵㑶㑷㑸㑹㑺㑻㑼㑽㑾㑿㒀㒁㒂㒃㒄㒅㒆㒇㒈㒉㒊㒋㒌㒍㒎㒏㒐㒑㒒㒓㒔㒕㒖㒗㒘㒙㒚㒛㒜㒝㒞㒟㒠㒡㒢㒣㒤㒥㒦㒧㒨㒩㒪㒫㒬㒭㒮㒯㒰㒱㒲㒳㒴㒵㒶㒷㒸㒹㒺㒻㒼㒽㒾㒿㓀㓁㓂㓃㓄㓅㓆㓇㓈㓉㓊㓋㓌㓍㓎㓏㓐㓑㓒㓓㓔㓕㓖㓗㓘㓙㓚㓛㓜㓝㓞㓟㓠㓡㓢㓣㓤㓥㓦㓧㓨㓩㓪㓫㓬㓭㓮㓯㓰㓱㓲㓳㓴㓵㓶㓷㓸㓹㓺㓻㓼㓽㓾㓿㔀㔁㔂㔃㔄㔅㔆㔇㔈㔉㔊㔋㔌㔍㔎㔏㔐㔑㔒㔓㔔㔕㔖㔗㔘㔙㔚㔛㔜㔝㔞㔟㔠㔡","㔢㔣㔤㔥㔦㔧㔨㔩㔪㔫㔬㔭㔮㔯㔰㔱㔲㔳㔴㔵㔶㔷㔸㔹㔺㔻㔼㔽㔾㔿㕀㕁㕂㕃㕄㕅㕆㕇㕈㕉㕊㕋㕌㕍㕎㕏㕐㕑㕒㕓㕔㕕㕖㕗㕘㕙㕚㕛㕜㕝㕞㕟㕠㕡㕢㕣㕤㕥㕦㕧㕨㕩㕪㕫㕬㕭㕮㕯㕰㕱㕲㕳㕴㕵㕶㕷㕸㕹㕺㕻㕼㕽㕾㕿㖀㖁㖂㖃㖄㖅㖆㖇㖈㖉㖊㖋㖌㖍㖎㖏㖐㖑㖒㖓㖔㖕㖖㖗㖘㖙㖚㖛㖜㖝㖞㖟㖠㖡㖢㖣㖤㖥㖦㖧㖨㖩㖪㖫㖬㖭㖮㖯㖰㖱㖲㖳㖴㖵㖶㖷㖸㖹㖺㖻㖼㖽㖾㖿㗀㗁㗂㗃㗄㗅㗆㗇㗈㗉㗊㗋㗌㗍㗎㗏㗐㗑㗒㗓㗔㗕㗖㗗㗘㗙㗚㗛㗜㗝㗞㗟㗠㗡㗢㗣㗤㗥㗦㗧㗨㗩㗪㗫㗬㗭㗮㗯㗰㗱㗲㗳㗴㗵㗶㗷㗸㗹㗺㗻㗼㗽㗾㗿㘀㘁㘂㘃㘄㘅㘆㘇㘈㘉㘊㘋㘌㘍㘎㘏㘐㘑㘒㘓㘔㘕㘖㘗㘘㘙㘚㘛㘜㘝㘞㘟㘠㘡","㘢㘣㘤㘥㘦㘧㘨㘩㘪㘫㘬㘭㘮㘯㘰㘱㘲㘳㘴㘵㘶㘷㘸㘹㘺㘻㘼㘽㘾㘿㙀㙁㙂㙃㙄㙅㙆㙇㙈㙉㙊㙋㙌㙍㙎㙏㙐㙑㙒㙓㙔㙕㙖㙗㙘㙙㙚㙛㙜㙝㙞㙟㙠㙡㙢㙣㙤㙥㙦㙧㙨㙩㙪㙫㙬㙭㙮㙯㙰㙱㙲㙳㙴㙵㙶㙷㙸㙹㙺㙻㙼㙽㙾㙿㚀㚁㚂㚃㚄㚅㚆㚇㚈㚉㚊㚋㚌㚍㚎㚏㚐㚑㚒㚓㚔㚕㚖㚗㚘㚙㚚㚛㚜㚝㚞㚟㚠㚡㚢㚣㚤㚥㚦㚧㚨㚩㚪㚫㚬㚭㚮㚯㚰㚱㚲㚳㚴㚵㚶㚷㚸㚹㚺㚻㚼㚽㚾㚿㛀㛁㛂㛃㛄㛅㛆㛇㛈㛉㛊㛋㛌㛍㛎㛏㛐㛑㛒㛓㛔㛕㛖㛗㛘㛙㛚㛛㛜㛝㛞㛟㛠㛡㛢㛣㛤㛥㛦㛧㛨㛩㛪㛫㛬㛭㛮㛯㛰㛱㛲㛳㛴㛵㛶㛷㛸㛹㛺㛻㛼㛽㛾㛿㜀㜁㜂㜃㜄㜅㜆㜇㜈㜉㜊㜋㜌㜍㜎㜏㜐㜑㜒㜓㜔㜕㜖㜗㜘㜙㜚㜛㜜㜝㜞㜟㜠㜡","㜢㜣㜤㜥㜦㜧㜨㜩㜪㜫㜬㜭㜮㜯㜰㜱㜲㜳㜴㜵㜶㜷㜸㜹㜺㜻㜼㜽㜾㜿㝀㝁㝂㝃㝄㝅㝆㝇㝈㝉㝊㝋㝌㝍㝎㝏㝐㝑㝒㝓㝔㝕㝖㝗㝘㝙㝚㝛㝜㝝㝞㝟㝠㝡㝢㝣㝤㝥㝦㝧㝨㝩㝪㝫㝬㝭㝮㝯㝰㝱㝲㝳㝴㝵㝶㝷㝸㝹㝺㝻㝼㝽㝾㝿㞀㞁㞂㞃㞄㞅㞆㞇㞈㞉㞊㞋㞌㞍㞎㞏㞐㞑㞒㞓㞔㞕㞖㞗㞘㞙㞚㞛㞜㞝㞞㞟㞠㞡㞢㞣㞤㞥㞦㞧㞨㞩㞪㞫㞬㞭㞮㞯㞰㞱㞲㞳㞴㞵㞶㞷㞸㞹㞺㞻㞼㞽㞾㞿㟀㟁㟂㟃㟄㟅㟆㟇㟈㟉㟊㟋㟌㟍㟎㟏㟐㟑㟒㟓㟔㟕㟖㟗㟘㟙㟚㟛㟜㟝㟞㟟㟠㟡㟢㟣㟤㟥㟦㟧㟨㟩㟪㟫㟬㟭㟮㟯㟰㟱㟲㟳㟴㟵㟶㟷㟸㟹㟺㟻㟼㟽㟾㟿㠀㠁㠂㠃㠄㠅㠆㠇㠈㠉㠊㠋㠌㠍㠎㠏㠐㠑㠒㠓㠔㠕㠖㠗㠘㠙㠚㠛㠜㠝㠞㠟㠠㠡","㠢㠣㠤㠥㠦㠧㠨㠩㠪㠫㠬㠭㠮㠯㠰㠱㠲㠳㠴㠵㠶㠷㠸㠹㠺㠻㠼㠽㠾㠿㡀㡁㡂㡃㡄㡅㡆㡇㡈㡉㡊㡋㡌㡍㡎㡏㡐㡑㡒㡓㡔㡕㡖㡗㡘㡙㡚㡛㡜㡝㡞㡟㡠㡡㡢㡣㡤㡥㡦㡧㡨㡩㡪㡫㡬㡭㡮㡯㡰㡱㡲㡳㡴㡵㡶㡷㡸㡹㡺㡻㡼㡽㡾㡿㢀㢁㢂㢃㢄㢅㢆㢇㢈㢉㢊㢋㢌㢍㢎㢏㢐㢑㢒㢓㢔㢕㢖㢗㢘㢙㢚㢛㢜㢝㢞㢟㢠㢡㢢㢣㢤㢥㢦㢧㢨㢩㢪㢫㢬㢭㢮㢯㢰㢱㢲㢳㢴㢵㢶㢷㢸㢹㢺㢻㢼㢽㢾㢿㣀㣁㣂㣃㣄㣅㣆㣇㣈㣉㣊㣋㣌㣍㣎㣏㣐㣑㣒㣓㣔㣕㣖㣗㣘㣙㣚㣛㣜㣝㣞㣟㣠㣡㣢㣣㣤㣥㣦㣧㣨㣩㣪㣫㣬㣭㣮㣯㣰㣱㣲㣳㣴㣵㣶㣷㣸㣹㣺㣻㣼㣽㣾㣿㤀㤁㤂㤃㤄㤅㤆㤇㤈㤉㤊㤋㤌㤍㤎㤏㤐㤑㤒㤓㤔㤕㤖㤗㤘㤙㤚㤛㤜㤝㤞㤟㤠㤡","㤢㤣㤤㤥㤦㤧㤨㤩㤪㤫㤬㤭㤮㤯㤰㤱㤲㤳㤴㤵㤶㤷㤸㤹㤺㤻㤼㤽㤾㤿㥀㥁㥂㥃㥄㥅㥆㥇㥈㥉㥊㥋㥌㥍㥎㥏㥐㥑㥒㥓㥔㥕㥖㥗㥘㥙㥚㥛㥜㥝㥞㥟㥠㥡㥢㥣㥤㥥㥦㥧㥨㥩㥪㥫㥬㥭㥮㥯㥰㥱㥲㥳㥴㥵㥶㥷㥸㥹㥺㥻㥼㥽㥾㥿㦀㦁㦂㦃㦄㦅㦆㦇㦈㦉㦊㦋㦌㦍㦎㦏㦐㦑㦒㦓㦔㦕㦖㦗㦘㦙㦚㦛㦜㦝㦞㦟㦠㦡㦢㦣㦤㦥㦦㦧㦨㦩㦪㦫㦬㦭㦮㦯㦰㦱㦲㦳㦴㦵㦶㦷㦸㦹㦺㦻㦼㦽㦾㦿㧀㧁㧂㧃㧄㧅㧆㧇㧈㧉㧊㧋㧌㧍㧎㧏㧐㧑㧒㧓㧔㧕㧖㧗㧘㧙㧚㧛㧜㧝㧞㧟㧠㧡㧢㧣㧤㧥㧦㧧㧨㧩㧪㧫㧬㧭㧮㧯㧰㧱㧲㧳㧴㧵㧶㧷㧸㧹㧺㧻㧼㧽㧾㧿㨀㨁㨂㨃㨄㨅㨆㨇㨈㨉㨊㨋㨌㨍㨎㨏㨐㨑㨒㨓㨔㨕㨖㨗㨘㨙㨚㨛㨜㨝㨞㨟㨠㨡","㨢㨣㨤㨥㨦㨧㨨㨩㨪㨫㨬㨭㨮㨯㨰㨱㨲㨳㨴㨵㨶㨷㨸㨹㨺㨻㨼㨽㨾㨿㩀㩁㩂㩃㩄㩅㩆㩇㩈㩉㩊㩋㩌㩍㩎㩏㩐㩑㩒㩓㩔㩕㩖㩗㩘㩙㩚㩛㩜㩝㩞㩟㩠㩡㩢㩣㩤㩥㩦㩧㩨㩩㩪㩫㩬㩭㩮㩯㩰㩱㩲㩳㩴㩵㩶㩷㩸㩹㩺㩻㩼㩽㩾㩿㪀㪁㪂㪃㪄㪅㪆㪇㪈㪉㪊㪋㪌㪍㪎㪏㪐㪑㪒㪓㪔㪕㪖㪗㪘㪙㪚㪛㪜㪝㪞㪟㪠㪡㪢㪣㪤㪥㪦㪧㪨㪩㪪㪫㪬㪭㪮㪯㪰㪱㪲㪳㪴㪵㪶㪷㪸㪹㪺㪻㪼㪽㪾㪿㫀㫁㫂㫃㫄㫅㫆㫇㫈㫉㫊㫋㫌㫍㫎㫏㫐㫑㫒㫓㫔㫕㫖㫗㫘㫙㫚㫛㫜㫝㫞㫟㫠㫡㫢㫣㫤㫥㫦㫧㫨㫩㫪㫫㫬㫭㫮㫯㫰㫱㫲㫳㫴㫵㫶㫷㫸㫹㫺㫻㫼㫽㫾㫿㬀㬁㬂㬃㬄㬅㬆㬇㬈㬉㬊㬋㬌㬍㬎㬏㬐㬑㬒㬓㬔㬕㬖㬗㬘㬙㬚㬛㬜㬝㬞㬟㬠㬡","㬢㬣㬤㬥㬦㬧㬨㬩㬪㬫㬬㬭㬮㬯㬰㬱㬲㬳㬴㬵㬶㬷㬸㬹㬺㬻㬼㬽㬾㬿㭀㭁㭂㭃㭄㭅㭆㭇㭈㭉㭊㭋㭌㭍㭎㭏㭐㭑㭒㭓㭔㭕㭖㭗㭘㭙㭚㭛㭜㭝㭞㭟㭠㭡㭢㭣㭤㭥㭦㭧㭨㭩㭪㭫㭬㭭㭮㭯㭰㭱㭲㭳㭴㭵㭶㭷㭸㭹㭺㭻㭼㭽㭾㭿㮀㮁㮂㮃㮄㮅㮆㮇㮈㮉㮊㮋㮌㮍㮎㮏㮐㮑㮒㮓㮔㮕㮖㮗㮘㮙㮚㮛㮜㮝㮞㮟㮠㮡㮢㮣㮤㮥㮦㮧㮨㮩㮪㮫㮬㮭㮮㮯㮰㮱㮲㮳㮴㮵㮶㮷㮸㮹㮺㮻㮼㮽㮾㮿㯀㯁㯂㯃㯄㯅㯆㯇㯈㯉㯊㯋㯌㯍㯎㯏㯐㯑㯒㯓㯔㯕㯖㯗㯘㯙㯚㯛㯜㯝㯞㯟㯠㯡㯢㯣㯤㯥㯦㯧㯨㯩㯪㯫㯬㯭㯮㯯㯰㯱㯲㯳㯴㯵㯶㯷㯸㯹㯺㯻㯼㯽㯾㯿㰀㰁㰂㰃㰄㰅㰆㰇㰈㰉㰊㰋㰌㰍㰎㰏㰐㰑㰒㰓㰔㰕㰖㰗㰘㰙㰚㰛㰜㰝㰞㰟㰠㰡","㰢㰣㰤㰥㰦㰧㰨㰩㰪㰫㰬㰭㰮㰯㰰㰱㰲㰳㰴㰵㰶㰷㰸㰹㰺㰻㰼㰽㰾㰿㱀㱁㱂㱃㱄㱅㱆㱇㱈㱉㱊㱋㱌㱍㱎㱏㱐㱑㱒㱓㱔㱕㱖㱗㱘㱙㱚㱛㱜㱝㱞㱟㱠㱡㱢㱣㱤㱥㱦㱧㱨㱩㱪㱫㱬㱭㱮㱯㱰㱱㱲㱳㱴㱵㱶㱷㱸㱹㱺㱻㱼㱽㱾㱿㲀㲁㲂㲃㲄㲅㲆㲇㲈㲉㲊㲋㲌㲍㲎㲏㲐㲑㲒㲓㲔㲕㲖㲗㲘㲙㲚㲛㲜㲝㲞㲟㲠㲡㲢㲣㲤㲥㲦㲧㲨㲩㲪㲫㲬㲭㲮㲯㲰㲱㲲㲳㲴㲵㲶㲷㲸㲹㲺㲻㲼㲽㲾㲿㳀㳁㳂㳃㳄㳅㳆㳇㳈㳉㳊㳋㳌㳍㳎㳏㳐㳑㳒㳓㳔㳕㳖㳗㳘㳙㳚㳛㳜㳝㳞㳟㳠㳡㳢㳣㳤㳥㳦㳧㳨㳩㳪㳫㳬㳭㳮㳯㳰㳱㳲㳳㳴㳵㳶㳷㳸㳹㳺㳻㳼㳽㳾㳿㴀㴁㴂㴃㴄㴅㴆㴇㴈㴉㴊㴋㴌㴍㴎㴏㴐㴑㴒㴓㴔㴕㴖㴗㴘㴙㴚㴛㴜㴝㴞㴟㴠㴡","㴢㴣㴤㴥㴦㴧㴨㴩㴪㴫㴬㴭㴮㴯㴰㴱㴲㴳㴴㴵㴶㴷㴸㴹㴺㴻㴼㴽㴾㴿㵀㵁㵂㵃㵄㵅㵆㵇㵈㵉㵊㵋㵌㵍㵎㵏㵐㵑㵒㵓㵔㵕㵖㵗㵘㵙㵚㵛㵜㵝㵞㵟㵠㵡㵢㵣㵤㵥㵦㵧㵨㵩㵪㵫㵬㵭㵮㵯㵰㵱㵲㵳㵴㵵㵶㵷㵸㵹㵺㵻㵼㵽㵾㵿㶀㶁㶂㶃㶄㶅㶆㶇㶈㶉㶊㶋㶌㶍㶎㶏㶐㶑㶒㶓㶔㶕㶖㶗㶘㶙㶚㶛㶜㶝㶞㶟㶠㶡㶢㶣㶤㶥㶦㶧㶨㶩㶪㶫㶬㶭㶮㶯㶰㶱㶲㶳㶴㶵㶶㶷㶸㶹㶺㶻㶼㶽㶾㶿㷀㷁㷂㷃㷄㷅㷆㷇㷈㷉㷊㷋㷌㷍㷎㷏㷐㷑㷒㷓㷔㷕㷖㷗㷘㷙㷚㷛㷜㷝㷞㷟㷠㷡㷢㷣㷤㷥㷦㷧㷨㷩㷪㷫㷬㷭㷮㷯㷰㷱㷲㷳㷴㷵㷶㷷㷸㷹㷺㷻㷼㷽㷾㷿㸀㸁㸂㸃㸄㸅㸆㸇㸈㸉㸊㸋㸌㸍㸎㸏㸐㸑㸒㸓㸔㸕㸖㸗㸘㸙㸚㸛㸜㸝㸞㸟㸠㸡","㸢㸣㸤㸥㸦㸧㸨㸩㸪㸫㸬㸭㸮㸯㸰㸱㸲㸳㸴㸵㸶㸷㸸㸹㸺㸻㸼㸽㸾㸿㹀㹁㹂㹃㹄㹅㹆㹇㹈㹉㹊㹋㹌㹍㹎㹏㹐㹑㹒㹓㹔㹕㹖㹗㹘㹙㹚㹛㹜㹝㹞㹟㹠㹡㹢㹣㹤㹥㹦㹧㹨㹩㹪㹫㹬㹭㹮㹯㹰㹱㹲㹳㹴㹵㹶㹷㹸㹹㹺㹻㹼㹽㹾㹿㺀㺁㺂㺃㺄㺅㺆㺇㺈㺉㺊㺋㺌㺍㺎㺏㺐㺑㺒㺓㺔㺕㺖㺗㺘㺙㺚㺛㺜㺝㺞㺟㺠㺡㺢㺣㺤㺥㺦㺧㺨㺩㺪㺫㺬㺭㺮㺯㺰㺱㺲㺳㺴㺵㺶㺷㺸㺹㺺㺻㺼㺽㺾㺿㻀㻁㻂㻃㻄㻅㻆㻇㻈㻉㻊㻋㻌㻍㻎㻏㻐㻑㻒㻓㻔㻕㻖㻗㻘㻙㻚㻛㻜㻝㻞㻟㻠㻡㻢㻣㻤㻥㻦㻧㻨㻩㻪㻫㻬㻭㻮㻯㻰㻱㻲㻳㻴㻵㻶㻷㻸㻹㻺㻻㻼㻽㻾㻿㼀㼁㼂㼃㼄㼅㼆㼇㼈㼉㼊㼋㼌㼍㼎㼏㼐㼑㼒㼓㼔㼕㼖㼗㼘㼙㼚㼛㼜㼝㼞㼟㼠㼡","㼢㼣㼤㼥㼦㼧㼨㼩㼪㼫㼬㼭㼮㼯㼰㼱㼲㼳㼴㼵㼶㼷㼸㼹㼺㼻㼼㼽㼾㼿㽀㽁㽂㽃㽄㽅㽆㽇㽈㽉㽊㽋㽌㽍㽎㽏㽐㽑㽒㽓㽔㽕㽖㽗㽘㽙㽚㽛㽜㽝㽞㽟㽠㽡㽢㽣㽤㽥㽦㽧㽨㽩㽪㽫㽬㽭㽮㽯㽰㽱㽲㽳㽴㽵㽶㽷㽸㽹㽺㽻㽼㽽㽾㽿㾀㾁㾂㾃㾄㾅㾆㾇㾈㾉㾊㾋㾌㾍㾎㾏㾐㾑㾒㾓㾔㾕㾖㾗㾘㾙㾚㾛㾜㾝㾞㾟㾠㾡㾢㾣㾤㾥㾦㾧㾨㾩㾪㾫㾬㾭㾮㾯㾰㾱㾲㾳㾴㾵㾶㾷㾸㾹㾺㾻㾼㾽㾾㾿㿀㿁㿂㿃㿄㿅㿆㿇㿈㿉㿊㿋㿌㿍㿎㿏㿐㿑㿒㿓㿔㿕㿖㿗㿘㿙㿚㿛㿜㿝㿞㿟㿠㿡㿢㿣㿤㿥㿦㿧㿨㿩㿪㿫㿬㿭㿮㿯㿰㿱㿲㿳㿴㿵㿶㿷㿸㿹㿺㿻㿼㿽㿾㿿䀀䀁䀂䀃䀄䀅䀆䀇䀈䀉䀊䀋䀌䀍䀎䀏䀐䀑䀒䀓䀔䀕䀖䀗䀘䀙䀚䀛䀜䀝䀞䀟䀠䀡","䀢䀣䀤䀥䀦䀧䀨䀩䀪䀫䀬䀭䀮䀯䀰䀱䀲䀳䀴䀵䀶䀷䀸䀹䀺䀻䀼䀽䀾䀿䁀䁁䁂䁃䁄䁅䁆䁇䁈䁉䁊䁋䁌䁍䁎䁏䁐䁑䁒䁓䁔䁕䁖䁗䁘䁙䁚䁛䁜䁝䁞䁟䁠䁡䁢䁣䁤䁥䁦䁧䁨䁩䁪䁫䁬䁭䁮䁯䁰䁱䁲䁳䁴䁵䁶䁷䁸䁹䁺䁻䁼䁽䁾䁿䂀䂁䂂䂃䂄䂅䂆䂇䂈䂉䂊䂋䂌䂍䂎䂏䂐䂑䂒䂓䂔䂕䂖䂗䂘䂙䂚䂛䂜䂝䂞䂟䂠䂡䂢䂣䂤䂥䂦䂧䂨䂩䂪䂫䂬䂭䂮䂯䂰䂱䂲䂳䂴䂵䂶䂷䂸䂹䂺䂻䂼䂽䂾䂿䃀䃁䃂䃃䃄䃅䃆䃇䃈䃉䃊䃋䃌䃍䃎䃏䃐䃑䃒䃓䃔䃕䃖䃗䃘䃙䃚䃛䃜䃝䃞䃟䃠䃡䃢䃣䃤䃥䃦䃧䃨䃩䃪䃫䃬䃭䃮䃯䃰䃱䃲䃳䃴䃵䃶䃷䃸䃹䃺䃻䃼䃽䃾䃿䄀䄁䄂䄃䄄䄅䄆䄇䄈䄉䄊䄋䄌䄍䄎䄏䄐䄑䄒䄓䄔䄕䄖䄗䄘䄙䄚䄛䄜䄝䄞䄟䄠䄡","䄢䄣䄤䄥䄦䄧䄨䄩䄪䄫䄬䄭䄮䄯䄰䄱䄲䄳䄴䄵䄶䄷䄸䄹䄺䄻䄼䄽䄾䄿䅀䅁䅂䅃䅄䅅䅆䅇䅈䅉䅊䅋䅌䅍䅎䅏䅐䅑䅒䅓䅔䅕䅖䅗䅘䅙䅚䅛䅜䅝䅞䅟䅠䅡䅢䅣䅤䅥䅦䅧䅨䅩䅪䅫䅬䅭䅮䅯䅰䅱䅲䅳䅴䅵䅶䅷䅸䅹䅺䅻䅼䅽䅾䅿䆀䆁䆂䆃䆄䆅䆆䆇䆈䆉䆊䆋䆌䆍䆎䆏䆐䆑䆒䆓䆔䆕䆖䆗䆘䆙䆚䆛䆜䆝䆞䆟䆠䆡䆢䆣䆤䆥䆦䆧䆨䆩䆪䆫䆬䆭䆮䆯䆰䆱䆲䆳䆴䆵䆶䆷䆸䆹䆺䆻䆼䆽䆾䆿䇀䇁䇂䇃䇄䇅䇆䇇䇈䇉䇊䇋䇌䇍䇎䇏䇐䇑䇒䇓䇔䇕䇖䇗䇘䇙䇚䇛䇜䇝䇞䇟䇠䇡䇢䇣䇤䇥䇦䇧䇨䇩䇪䇫䇬䇭䇮䇯䇰䇱䇲䇳䇴䇵䇶䇷䇸䇹䇺䇻䇼䇽䇾䇿䈀䈁䈂䈃䈄䈅䈆䈇䈈䈉䈊䈋䈌䈍䈎䈏䈐䈑䈒䈓䈔䈕䈖䈗䈘䈙䈚䈛䈜䈝䈞䈟䈠䈡","䈢䈣䈤䈥䈦䈧䈨䈩䈪䈫䈬䈭䈮䈯䈰䈱䈲䈳䈴䈵䈶䈷䈸䈹䈺䈻䈼䈽䈾䈿䉀䉁䉂䉃䉄䉅䉆䉇䉈䉉䉊䉋䉌䉍䉎䉏䉐䉑䉒䉓䉔䉕䉖䉗䉘䉙䉚䉛䉜䉝䉞䉟䉠䉡䉢䉣䉤䉥䉦䉧䉨䉩䉪䉫䉬䉭䉮䉯䉰䉱䉲䉳䉴䉵䉶䉷䉸䉹䉺䉻䉼䉽䉾䉿䊀䊁䊂䊃䊄䊅䊆䊇䊈䊉䊊䊋䊌䊍䊎䊏䊐䊑䊒䊓䊔䊕䊖䊗䊘䊙䊚䊛䊜䊝䊞䊟䊠䊡䊢䊣䊤䊥䊦䊧䊨䊩䊪䊫䊬䊭䊮䊯䊰䊱䊲䊳䊴䊵䊶䊷䊸䊹䊺䊻䊼䊽䊾䊿䋀䋁䋂䋃䋄䋅䋆䋇䋈䋉䋊䋋䋌䋍䋎䋏䋐䋑䋒䋓䋔䋕䋖䋗䋘䋙䋚䋛䋜䋝䋞䋟䋠䋡䋢䋣䋤䋥䋦䋧䋨䋩䋪䋫䋬䋭䋮䋯䋰䋱䋲䋳䋴䋵䋶䋷䋸䋹䋺䋻䋼䋽䋾䋿䌀䌁䌂䌃䌄䌅䌆䌇䌈䌉䌊䌋䌌䌍䌎䌏䌐䌑䌒䌓䌔䌕䌖䌗䌘䌙䌚䌛䌜䌝䌞䌟䌠䌡","䌢䌣䌤䌥䌦䌧䌨䌩䌪䌫䌬䌭䌮䌯䌰䌱䌲䌳䌴䌵䌶䌷䌸䌹䌺䌻䌼䌽䌾䌿䍀䍁䍂䍃䍄䍅䍆䍇䍈䍉䍊䍋䍌䍍䍎䍏䍐䍑䍒䍓䍔䍕䍖䍗䍘䍙䍚䍛䍜䍝䍞䍟䍠䍡䍢䍣䍤䍥䍦䍧䍨䍩䍪䍫䍬䍭䍮䍯䍰䍱䍲䍳䍴䍵䍶䍷䍸䍹䍺䍻䍼䍽䍾䍿䎀䎁䎂䎃䎄䎅䎆䎇䎈䎉䎊䎋䎌䎍䎎䎏䎐䎑䎒䎓䎔䎕䎖䎗䎘䎙䎚䎛䎜䎝䎞䎟䎠䎡䎢䎣䎤䎥䎦䎧䎨䎩䎪䎫䎬䎭䎮䎯䎰䎱䎲䎳䎴䎵䎶䎷䎸䎹䎺䎻䎼䎽䎾䎿䏀䏁䏂䏃䏄䏅䏆䏇䏈䏉䏊䏋䏌䏍䏎䏏䏐䏑䏒䏓䏔䏕䏖䏗䏘䏙䏚䏛䏜䏝䏞䏟䏠䏡䏢䏣䏤䏥䏦䏧䏨䏩䏪䏫䏬䏭䏮䏯䏰䏱䏲䏳䏴䏵䏶䏷䏸䏹䏺䏻䏼䏽䏾䏿䐀䐁䐂䐃䐄䐅䐆䐇䐈䐉䐊䐋䐌䐍䐎䐏䐐䐑䐒䐓䐔䐕䐖䐗䐘䐙䐚䐛䐜䐝䐞䐟䐠䐡","䐢䐣䐤䐥䐦䐧䐨䐩䐪䐫䐬䐭䐮䐯䐰䐱䐲䐳䐴䐵䐶䐷䐸䐹䐺䐻䐼䐽䐾䐿䑀䑁䑂䑃䑄䑅䑆䑇䑈䑉䑊䑋䑌䑍䑎䑏䑐䑑䑒䑓䑔䑕䑖䑗䑘䑙䑚䑛䑜䑝䑞䑟䑠䑡䑢䑣䑤䑥䑦䑧䑨䑩䑪䑫䑬䑭䑮䑯䑰䑱䑲䑳䑴䑵䑶䑷䑸䑹䑺䑻䑼䑽䑾䑿䒀䒁䒂䒃䒄䒅䒆䒇䒈䒉䒊䒋䒌䒍䒎䒏䒐䒑䒒䒓䒔䒕䒖䒗䒘䒙䒚䒛䒜䒝䒞䒟䒠䒡䒢䒣䒤䒥䒦䒧䒨䒩䒪䒫䒬䒭䒮䒯䒰䒱䒲䒳䒴䒵䒶䒷䒸䒹䒺䒻䒼䒽䒾䒿䓀䓁䓂䓃䓄䓅䓆䓇䓈䓉䓊䓋䓌䓍䓎䓏䓐䓑䓒䓓䓔䓕䓖䓗䓘䓙䓚䓛䓜䓝䓞䓟䓠䓡䓢䓣䓤䓥䓦䓧䓨䓩䓪䓫䓬䓭䓮䓯䓰䓱䓲䓳䓴䓵䓶䓷䓸䓹䓺䓻䓼䓽䓾䓿䔀䔁䔂䔃䔄䔅䔆䔇䔈䔉䔊䔋䔌䔍䔎䔏䔐䔑䔒䔓䔔䔕䔖䔗䔘䔙䔚䔛䔜䔝䔞䔟䔠䔡","䔢䔣䔤䔥䔦䔧䔨䔩䔪䔫䔬䔭䔮䔯䔰䔱䔲䔳䔴䔵䔶䔷䔸䔹䔺䔻䔼䔽䔾䔿䕀䕁䕂䕃䕄䕅䕆䕇䕈䕉䕊䕋䕌䕍䕎䕏䕐䕑䕒䕓䕔䕕䕖䕗䕘䕙䕚䕛䕜䕝䕞䕟䕠䕡䕢䕣䕤䕥䕦䕧䕨䕩䕪䕫䕬䕭䕮䕯䕰䕱䕲䕳䕴䕵䕶䕷䕸䕹䕺䕻䕼䕽䕾䕿䖀䖁䖂䖃䖄䖅䖆䖇䖈䖉䖊䖋䖌䖍䖎䖏䖐䖑䖒䖓䖔䖕䖖䖗䖘䖙䖚䖛䖜䖝䖞䖟䖠䖡䖢䖣䖤䖥䖦䖧䖨䖩䖪䖫䖬䖭䖮䖯䖰䖱䖲䖳䖴䖵䖶䖷䖸䖹䖺䖻䖼䖽䖾䖿䗀䗁䗂䗃䗄䗅䗆䗇䗈䗉䗊䗋䗌䗍䗎䗏䗐䗑䗒䗓䗔䗕䗖䗗䗘䗙䗚䗛䗜䗝䗞䗟䗠䗡䗢䗣䗤䗥䗦䗧䗨䗩䗪䗫䗬䗭䗮䗯䗰䗱䗲䗳䗴䗵䗶䗷䗸䗹䗺䗻䗼䗽䗾䗿䘀䘁䘂䘃䘄䘅䘆䘇䘈䘉䘊䘋䘌䘍䘎䘏䘐䘑䘒䘓䘔䘕䘖䘗䘘䘙䘚䘛䘜䘝䘞䘟䘠䘡","䘢䘣䘤䘥䘦䘧䘨䘩䘪䘫䘬䘭䘮䘯䘰䘱䘲䘳䘴䘵䘶䘷䘸䘹䘺䘻䘼䘽䘾䘿䙀䙁䙂䙃䙄䙅䙆䙇䙈䙉䙊䙋䙌䙍䙎䙏䙐䙑䙒䙓䙔䙕䙖䙗䙘䙙䙚䙛䙜䙝䙞䙟䙠䙡䙢䙣䙤䙥䙦䙧䙨䙩䙪䙫䙬䙭䙮䙯䙰䙱䙲䙳䙴䙵䙶䙷䙸䙹䙺䙻䙼䙽䙾䙿䚀䚁䚂䚃䚄䚅䚆䚇䚈䚉䚊䚋䚌䚍䚎䚏䚐䚑䚒䚓䚔䚕䚖䚗䚘䚙䚚䚛䚜䚝䚞䚟䚠䚡䚢䚣䚤䚥䚦䚧䚨䚩䚪䚫䚬䚭䚮䚯䚰䚱䚲䚳䚴䚵䚶䚷䚸䚹䚺䚻䚼䚽䚾䚿䛀䛁䛂䛃䛄䛅䛆䛇䛈䛉䛊䛋䛌䛍䛎䛏䛐䛑䛒䛓䛔䛕䛖䛗䛘䛙䛚䛛䛜䛝䛞䛟䛠䛡䛢䛣䛤䛥䛦䛧䛨䛩䛪䛫䛬䛭䛮䛯䛰䛱䛲䛳䛴䛵䛶䛷䛸䛹䛺䛻䛼䛽䛾䛿䜀䜁䜂䜃䜄䜅䜆䜇䜈䜉䜊䜋䜌䜍䜎䜏䜐䜑䜒䜓䜔䜕䜖䜗䜘䜙䜚䜛䜜䜝䜞䜟䜠䜡","䜢䜣䜤䜥䜦䜧䜨䜩䜪䜫䜬䜭䜮䜯䜰䜱䜲䜳䜴䜵䜶䜷䜸䜹䜺䜻䜼䜽䜾䜿䝀䝁䝂䝃䝄䝅䝆䝇䝈䝉䝊䝋䝌䝍䝎䝏䝐䝑䝒䝓䝔䝕䝖䝗䝘䝙䝚䝛䝜䝝䝞䝟䝠䝡䝢䝣䝤䝥䝦䝧䝨䝩䝪䝫䝬䝭䝮䝯䝰䝱䝲䝳䝴䝵䝶䝷䝸䝹䝺䝻䝼䝽䝾䝿䞀䞁䞂䞃䞄䞅䞆䞇䞈䞉䞊䞋䞌䞍䞎䞏䞐䞑䞒䞓䞔䞕䞖䞗䞘䞙䞚䞛䞜䞝䞞䞟䞠䞡䞢䞣䞤䞥䞦䞧䞨䞩䞪䞫䞬䞭䞮䞯䞰䞱䞲䞳䞴䞵䞶䞷䞸䞹䞺䞻䞼䞽䞾䞿䟀䟁䟂䟃䟄䟅䟆䟇䟈䟉䟊䟋䟌䟍䟎䟏䟐䟑䟒䟓䟔䟕䟖䟗䟘䟙䟚䟛䟜䟝䟞䟟䟠䟡䟢䟣䟤䟥䟦䟧䟨䟩䟪䟫䟬䟭䟮䟯䟰䟱䟲䟳䟴䟵䟶䟷䟸䟹䟺䟻䟼䟽䟾䟿䠀䠁䠂䠃䠄䠅䠆䠇䠈䠉䠊䠋䠌䠍䠎䠏䠐䠑䠒䠓䠔䠕䠖䠗䠘䠙䠚䠛䠜䠝䠞䠟䠠䠡","䠢䠣䠤䠥䠦䠧䠨䠩䠪䠫䠬䠭䠮䠯䠰䠱䠲䠳䠴䠵䠶䠷䠸䠹䠺䠻䠼䠽䠾䠿䡀䡁䡂䡃䡄䡅䡆䡇䡈䡉䡊䡋䡌䡍䡎䡏䡐䡑䡒䡓䡔䡕䡖䡗䡘䡙䡚䡛䡜䡝䡞䡟䡠䡡䡢䡣䡤䡥䡦䡧䡨䡩䡪䡫䡬䡭䡮䡯䡰䡱䡲䡳䡴䡵䡶䡷䡸䡹䡺䡻䡼䡽䡾䡿䢀䢁䢂䢃䢄䢅䢆䢇䢈䢉䢊䢋䢌䢍䢎䢏䢐䢑䢒䢓䢔䢕䢖䢗䢘䢙䢚䢛䢜䢝䢞䢟䢠䢡䢢䢣䢤䢥䢦䢧䢨䢩䢪䢫䢬䢭䢮䢯䢰䢱䢲䢳䢴䢵䢶䢷䢸䢹䢺䢻䢼䢽䢾䢿䣀䣁䣂䣃䣄䣅䣆䣇䣈䣉䣊䣋䣌䣍䣎䣏䣐䣑䣒䣓䣔䣕䣖䣗䣘䣙䣚䣛䣜䣝䣞䣟䣠䣡䣢䣣䣤䣥䣦䣧䣨䣩䣪䣫䣬䣭䣮䣯䣰䣱䣲䣳䣴䣵䣶䣷䣸䣹䣺䣻䣼䣽䣾䣿䤀䤁䤂䤃䤄䤅䤆䤇䤈䤉䤊䤋䤌䤍䤎䤏䤐䤑䤒䤓䤔䤕䤖䤗䤘䤙䤚䤛䤜䤝䤞䤟䤠䤡","䤢䤣䤤䤥䤦䤧䤨䤩䤪䤫䤬䤭䤮䤯䤰䤱䤲䤳䤴䤵䤶䤷䤸䤹䤺䤻䤼䤽䤾䤿䥀䥁䥂䥃䥄䥅䥆䥇䥈䥉䥊䥋䥌䥍䥎䥏䥐䥑䥒䥓䥔䥕䥖䥗䥘䥙䥚䥛䥜䥝䥞䥟䥠䥡䥢䥣䥤䥥䥦䥧䥨䥩䥪䥫䥬䥭䥮䥯䥰䥱䥲䥳䥴䥵䥶䥷䥸䥹䥺䥻䥼䥽䥾䥿䦀䦁䦂䦃䦄䦅䦆䦇䦈䦉䦊䦋䦌䦍䦎䦏䦐䦑䦒䦓䦔䦕䦖䦗䦘䦙䦚䦛䦜䦝䦞䦟䦠䦡䦢䦣䦤䦥䦦䦧䦨䦩䦪䦫䦬䦭䦮䦯䦰䦱䦲䦳䦴䦵䦶䦷䦸䦹䦺䦻䦼䦽䦾䦿䧀䧁䧂䧃䧄䧅䧆䧇䧈䧉䧊䧋䧌䧍䧎䧏䧐䧑䧒䧓䧔䧕䧖䧗䧘䧙䧚䧛䧜䧝䧞䧟䧠䧡䧢䧣䧤䧥䧦䧧䧨䧩䧪䧫䧬䧭䧮䧯䧰䧱䧲䧳䧴䧵䧶䧷䧸䧹䧺䧻䧼䧽䧾䧿䨀䨁䨂䨃䨄䨅䨆䨇䨈䨉䨊䨋䨌䨍䨎䨏䨐䨑䨒䨓䨔䨕䨖䨗䨘䨙䨚䨛䨜䨝䨞䨟䨠䨡","䨢䨣䨤䨥䨦䨧䨨䨩䨪䨫䨬䨭䨮䨯䨰䨱䨲䨳䨴䨵䨶䨷䨸䨹䨺䨻䨼䨽䨾䨿䩀䩁䩂䩃䩄䩅䩆䩇䩈䩉䩊䩋䩌䩍䩎䩏䩐䩑䩒䩓䩔䩕䩖䩗䩘䩙䩚䩛䩜䩝䩞䩟䩠䩡䩢䩣䩤䩥䩦䩧䩨䩩䩪䩫䩬䩭䩮䩯䩰䩱䩲䩳䩴䩵䩶䩷䩸䩹䩺䩻䩼䩽䩾䩿䪀䪁䪂䪃䪄䪅䪆䪇䪈䪉䪊䪋䪌䪍䪎䪏䪐䪑䪒䪓䪔䪕䪖䪗䪘䪙䪚䪛䪜䪝䪞䪟䪠䪡䪢䪣䪤䪥䪦䪧䪨䪩䪪䪫䪬䪭䪮䪯䪰䪱䪲䪳䪴䪵䪶䪷䪸䪹䪺䪻䪼䪽䪾䪿䫀䫁䫂䫃䫄䫅䫆䫇䫈䫉䫊䫋䫌䫍䫎䫏䫐䫑䫒䫓䫔䫕䫖䫗䫘䫙䫚䫛䫜䫝䫞䫟䫠䫡䫢䫣䫤䫥䫦䫧䫨䫩䫪䫫䫬䫭䫮䫯䫰䫱䫲䫳䫴䫵䫶䫷䫸䫹䫺䫻䫼䫽䫾䫿䬀䬁䬂䬃䬄䬅䬆䬇䬈䬉䬊䬋䬌䬍䬎䬏䬐䬑䬒䬓䬔䬕䬖䬗䬘䬙䬚䬛䬜䬝䬞䬟䬠䬡","䬢䬣䬤䬥䬦䬧䬨䬩䬪䬫䬬䬭䬮䬯䬰䬱䬲䬳䬴䬵䬶䬷䬸䬹䬺䬻䬼䬽䬾䬿䭀䭁䭂䭃䭄䭅䭆䭇䭈䭉䭊䭋䭌䭍䭎䭏䭐䭑䭒䭓䭔䭕䭖䭗䭘䭙䭚䭛䭜䭝䭞䭟䭠䭡䭢䭣䭤䭥䭦䭧䭨䭩䭪䭫䭬䭭䭮䭯䭰䭱䭲䭳䭴䭵䭶䭷䭸䭹䭺䭻䭼䭽䭾䭿䮀䮁䮂䮃䮄䮅䮆䮇䮈䮉䮊䮋䮌䮍䮎䮏䮐䮑䮒䮓䮔䮕䮖䮗䮘䮙䮚䮛䮜䮝䮞䮟䮠䮡䮢䮣䮤䮥䮦䮧䮨䮩䮪䮫䮬䮭䮮䮯䮰䮱䮲䮳䮴䮵䮶䮷䮸䮹䮺䮻䮼䮽䮾䮿䯀䯁䯂䯃䯄䯅䯆䯇䯈䯉䯊䯋䯌䯍䯎䯏䯐䯑䯒䯓䯔䯕䯖䯗䯘䯙䯚䯛䯜䯝䯞䯟䯠䯡䯢䯣䯤䯥䯦䯧䯨䯩䯪䯫䯬䯭䯮䯯䯰䯱䯲䯳䯴䯵䯶䯷䯸䯹䯺䯻䯼䯽䯾䯿䰀䰁䰂䰃䰄䰅䰆䰇䰈䰉䰊䰋䰌䰍䰎䰏䰐䰑䰒䰓䰔䰕䰖䰗䰘䰙䰚䰛䰜䰝䰞䰟䰠䰡","䰢䰣䰤䰥䰦䰧䰨䰩䰪䰫䰬䰭䰮䰯䰰䰱䰲䰳䰴䰵䰶䰷䰸䰹䰺䰻䰼䰽䰾䰿䱀䱁䱂䱃䱄䱅䱆䱇䱈䱉䱊䱋䱌䱍䱎䱏䱐䱑䱒䱓䱔䱕䱖䱗䱘䱙䱚䱛䱜䱝䱞䱟䱠䱡䱢䱣䱤䱥䱦䱧䱨䱩䱪䱫䱬䱭䱮䱯䱰䱱䱲䱳䱴䱵䱶䱷䱸䱹䱺䱻䱼䱽䱾䱿䲀䲁䲂䲃䲄䲅䲆䲇䲈䲉䲊䲋䲌䲍䲎䲏䲐䲑䲒䲓䲔䲕䲖䲗䲘䲙䲚䲛䲜䲝䲞䲟䲠䲡䲢䲣䲤䲥䲦䲧䲨䲩䲪䲫䲬䲭䲮䲯䲰䲱䲲䲳䲴䲵䲶䲷䲸䲹䲺䲻䲼䲽䲾䲿䳀䳁䳂䳃䳄䳅䳆䳇䳈䳉䳊䳋䳌䳍䳎䳏䳐䳑䳒䳓䳔䳕䳖䳗䳘䳙䳚䳛䳜䳝䳞䳟䳠䳡䳢䳣䳤䳥䳦䳧䳨䳩䳪䳫䳬䳭䳮䳯䳰䳱䳲䳳䳴䳵䳶䳷䳸䳹䳺䳻䳼䳽䳾䳿䴀䴁䴂䴃䴄䴅䴆䴇䴈䴉䴊䴋䴌䴍䴎䴏䴐䴑䴒䴓䴔䴕䴖䴗䴘䴙䴚䴛䴜䴝䴞䴟䴠䴡","䴢䴣䴤䴥䴦䴧䴨䴩䴪䴫䴬䴭䴮䴯䴰䴱䴲䴳䴴䴵䴶䴷䴸䴹䴺䴻䴼䴽䴾䴿䵀䵁䵂䵃䵄䵅䵆䵇䵈䵉䵊䵋䵌䵍䵎䵏䵐䵑䵒䵓䵔䵕䵖䵗䵘䵙䵚䵛䵜䵝䵞䵟䵠䵡䵢䵣䵤䵥䵦䵧䵨䵩䵪䵫䵬䵭䵮䵯䵰䵱䵲䵳䵴䵵䵶䵷䵸䵹䵺䵻䵼䵽䵾䵿䶀䶁䶂䶃䶄䶅䶆䶇䶈䶉䶊䶋䶌䶍䶎䶏䶐䶑䶒䶓䶔䶕䶖䶗䶘䶙䶚䶛䶜䶝䶞䶟䶠䶡䶢䶣䶤䶥䶦䶧䶨䶩䶪䶫䶬䶭䶮䶯䶰䶱䶲䶳䶴䶵䶶䶷䶸䶹䶺䶻䶼䶽䶾䶿䷀䷁䷂䷃䷄䷅䷆䷇䷈䷉䷊䷋䷌䷍䷎䷏䷐䷑䷒䷓䷔䷕䷖䷗䷘䷙䷚䷛䷜䷝䷞䷟䷠䷡䷢䷣䷤䷥䷦䷧䷨䷩䷪䷫䷬䷭䷮䷯䷰䷱䷲䷳䷴䷵䷶䷷䷸䷹䷺䷻䷼䷽䷾䷿一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両","丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿伀企伂伃伄伅伆伇伈伉伊伋伌伍伎伏伐休伒伓伔伕伖众优伙会伛伜伝伞伟传伡","伢伣伤伥伦伧伨伩伪伫伬伭伮伯估伱伲伳伴伵伶伷伸伹伺伻似伽伾伿佀佁佂佃佄佅但佇佈佉佊佋佌位低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟你佡佢佣佤佥佦佧佨佩佪佫佬佭佮佯佰佱佲佳佴併佶佷佸佹佺佻佼佽佾使侀侁侂侃侄侅來侇侈侉侊例侌侍侎侏侐侑侒侓侔侕侖侗侘侙侚供侜依侞侟侠価侢侣侤侥侦侧侨侩侪侫侬侭侮侯侰侱侲侳侴侵侶侷侸侹侺侻侼侽侾便俀俁係促俄俅俆俇俈俉俊俋俌俍俎俏俐俑俒俓俔俕俖俗俘俙俚俛俜保俞俟俠信俢俣俤俥俦俧俨俩俪俫俬俭修俯俰俱俲俳俴俵俶俷俸俹俺俻俼俽俾俿倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡","倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿偀偁偂偃偄偅偆假偈偉偊偋偌偍偎偏偐偑偒偓偔偕偖偗偘偙做偛停偝偞偟偠偡偢偣偤健偦偧偨偩偪偫偬偭偮偯偰偱偲偳側偵偶偷偸偹偺偻偼偽偾偿傀傁傂傃傄傅傆傇傈傉傊傋傌傍傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傣傤傥傦傧储傩傪傫催傭傮傯傰傱傲傳傴債傶傷傸傹傺傻傼傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎像僐僑僒僓僔僕僖僗僘僙僚僛僜僝僞僟僠僡僢僣僤僥僦僧僨僩僪僫僬僭僮僯僰僱僲僳僴僵僶僷僸價僺僻僼僽僾僿儀儁儂儃億儅儆儇儈儉儊儋儌儍儎儏儐儑儒儓儔儕儖儗儘儙儚儛儜儝儞償儠儡","儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾儿兀允兂元兄充兆兇先光兊克兌免兎兏児兑兒兓兔兕兖兗兘兙党兛兜兝兞兟兠兡兢兣兤入兦內全兩兪八公六兮兯兰共兲关兴兵其具典兹兺养兼兽兾兿冀冁冂冃冄内円冇冈冉冊冋册再冎冏冐冑冒冓冔冕冖冗冘写冚军农冝冞冟冠冡冢冣冤冥冦冧冨冩冪冫冬冭冮冯冰冱冲决冴况冶冷冸冹冺冻冼冽冾冿净凁凂凃凄凅准凇凈凉凊凋凌凍凎减凐凑凒凓凔凕凖凗凘凙凚凛凜凝凞凟几凡凢凣凤凥処凧凨凩凪凫凬凭凮凯凰凱凲凳凴凵凶凷凸凹出击凼函凾凿刀刁刂刃刄刅分切刈刉刊刋刌刍刎刏刐刑划刓刔刕刖列刘则刚创刜初刞刟删刡","刢刣判別刦刧刨利刪别刬刭刮刯到刱刲刳刴刵制刷券刹刺刻刼刽刾刿剀剁剂剃剄剅剆則剈剉削剋剌前剎剏剐剑剒剓剔剕剖剗剘剙剚剛剜剝剞剟剠剡剢剣剤剥剦剧剨剩剪剫剬剭剮副剰剱割剳剴創剶剷剸剹剺剻剼剽剾剿劀劁劂劃劄劅劆劇劈劉劊劋劌劍劎劏劐劑劒劓劔劕劖劗劘劙劚力劜劝办功加务劢劣劤劥劦劧动助努劫劬劭劮劯劰励劲劳労劵劶劷劸効劺劻劼劽劾势勀勁勂勃勄勅勆勇勈勉勊勋勌勍勎勏勐勑勒勓勔動勖勗勘務勚勛勜勝勞募勠勡勢勣勤勥勦勧勨勩勪勫勬勭勮勯勰勱勲勳勴勵勶勷勸勹勺勻勼勽勾勿匀匁匂匃匄包匆匇匈匉匊匋匌匍匎匏匐匑匒匓匔匕化北匘匙匚匛匜匝匞匟匠匡","匢匣匤匥匦匧匨匩匪匫匬匭匮匯匰匱匲匳匴匵匶匷匸匹区医匼匽匾匿區十卂千卄卅卆升午卉半卋卌卍华协卐卑卒卓協单卖南単卙博卛卜卝卞卟占卡卢卣卤卥卦卧卨卩卪卫卬卭卮卯印危卲即却卵卶卷卸卹卺卻卼卽卾卿厀厁厂厃厄厅历厇厈厉厊压厌厍厎厏厐厑厒厓厔厕厖厗厘厙厚厛厜厝厞原厠厡厢厣厤厥厦厧厨厩厪厫厬厭厮厯厰厱厲厳厴厵厶厷厸厹厺去厼厽厾县叀叁参參叄叅叆叇又叉及友双反収叏叐发叒叓叔叕取受变叙叚叛叜叝叞叟叠叡叢口古句另叧叨叩只叫召叭叮可台叱史右叴叵叶号司叹叺叻叼叽叾叿吀吁吂吃各吅吆吇合吉吊吋同名后吏吐向吒吓吔吕吖吗吘吙吚君吜吝吞吟吠吡","吢吣吤吥否吧吨吩吪含听吭吮启吰吱吲吳吴吵吶吷吸吹吺吻吼吽吾吿呀呁呂呃呄呅呆呇呈呉告呋呌呍呎呏呐呑呒呓呔呕呖呗员呙呚呛呜呝呞呟呠呡呢呣呤呥呦呧周呩呪呫呬呭呮呯呰呱呲味呴呵呶呷呸呹呺呻呼命呾呿咀咁咂咃咄咅咆咇咈咉咊咋和咍咎咏咐咑咒咓咔咕咖咗咘咙咚咛咜咝咞咟咠咡咢咣咤咥咦咧咨咩咪咫咬咭咮咯咰咱咲咳咴咵咶咷咸咹咺咻咼咽咾咿哀品哂哃哄哅哆哇哈哉哊哋哌响哎哏哐哑哒哓哔哕哖哗哘哙哚哛哜哝哞哟哠員哢哣哤哥哦哧哨哩哪哫哬哭哮哯哰哱哲哳哴哵哶哷哸哹哺哻哼哽哾哿唀唁唂唃唄唅唆唇唈唉唊唋唌唍唎唏唐唑唒唓唔唕唖唗唘唙唚唛唜唝唞唟唠唡","唢唣唤唥唦唧唨唩唪唫唬唭售唯唰唱唲唳唴唵唶唷唸唹唺唻唼唽唾唿啀啁啂啃啄啅商啇啈啉啊啋啌啍啎問啐啑啒啓啔啕啖啗啘啙啚啛啜啝啞啟啠啡啢啣啤啥啦啧啨啩啪啫啬啭啮啯啰啱啲啳啴啵啶啷啸啹啺啻啼啽啾啿喀喁喂喃善喅喆喇喈喉喊喋喌喍喎喏喐喑喒喓喔喕喖喗喘喙喚喛喜喝喞喟喠喡喢喣喤喥喦喧喨喩喪喫喬喭單喯喰喱喲喳喴喵営喷喸喹喺喻喼喽喾喿嗀嗁嗂嗃嗄嗅嗆嗇嗈嗉嗊嗋嗌嗍嗎嗏嗐嗑嗒嗓嗔嗕嗖嗗嗘嗙嗚嗛嗜嗝嗞嗟嗠嗡嗢嗣嗤嗥嗦嗧嗨嗩嗪嗫嗬嗭嗮嗯嗰嗱嗲嗳嗴嗵嗶嗷嗸嗹嗺嗻嗼嗽嗾嗿嘀嘁嘂嘃嘄嘅嘆嘇嘈嘉嘊嘋嘌嘍嘎嘏嘐嘑嘒嘓嘔嘕嘖嘗嘘嘙嘚嘛嘜嘝嘞嘟嘠嘡","嘢嘣嘤嘥嘦嘧嘨嘩嘪嘫嘬嘭嘮嘯嘰嘱嘲嘳嘴嘵嘶嘷嘸嘹嘺嘻嘼嘽嘾嘿噀噁噂噃噄噅噆噇噈噉噊噋噌噍噎噏噐噑噒噓噔噕噖噗噘噙噚噛噜噝噞噟噠噡噢噣噤噥噦噧器噩噪噫噬噭噮噯噰噱噲噳噴噵噶噷噸噹噺噻噼噽噾噿嚀嚁嚂嚃嚄嚅嚆嚇嚈嚉嚊嚋嚌嚍嚎嚏嚐嚑嚒嚓嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚣嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚯嚰嚱嚲嚳嚴嚵嚶嚷嚸嚹嚺嚻嚼嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囊囋囌囍囎囏囐囑囒囓囔囕囖囗囘囙囚四囜囝回囟因囡团団囤囥囦囧囨囩囪囫囬园囮囯困囱囲図围囵囶囷囸囹固囻囼国图囿圀圁圂圃圄圅圆圇圈圉圊國圌圍圎圏圐圑園圓圔圕圖圗團圙圚圛圜圝圞土圠圡","圢圣圤圥圦圧在圩圪圫圬圭圮圯地圱圲圳圴圵圶圷圸圹场圻圼圽圾圿址坁坂坃坄坅坆均坈坉坊坋坌坍坎坏坐坑坒坓坔坕坖块坘坙坚坛坜坝坞坟坠坡坢坣坤坥坦坧坨坩坪坫坬坭坮坯坰坱坲坳坴坵坶坷坸坹坺坻坼坽坾坿垀垁垂垃垄垅垆垇垈垉垊型垌垍垎垏垐垑垒垓垔垕垖垗垘垙垚垛垜垝垞垟垠垡垢垣垤垥垦垧垨垩垪垫垬垭垮垯垰垱垲垳垴垵垶垷垸垹垺垻垼垽垾垿埀埁埂埃埄埅埆埇埈埉埊埋埌埍城埏埐埑埒埓埔埕埖埗埘埙埚埛埜埝埞域埠埡埢埣埤埥埦埧埨埩埪埫埬埭埮埯埰埱埲埳埴埵埶執埸培基埻埼埽埾埿堀堁堂堃堄堅堆堇堈堉堊堋堌堍堎堏堐堑堒堓堔堕堖堗堘堙堚堛堜堝堞堟堠堡","堢堣堤堥堦堧堨堩堪堫堬堭堮堯堰報堲堳場堵堶堷堸堹堺堻堼堽堾堿塀塁塂塃塄塅塆塇塈塉塊塋塌塍塎塏塐塑塒塓塔塕塖塗塘塙塚塛塜塝塞塟塠塡塢塣塤塥塦塧塨塩塪填塬塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塾塿墀墁墂境墄墅墆墇墈墉墊墋墌墍墎墏墐墑墒墓墔墕墖増墘墙墚墛墜墝增墟墠墡墢墣墤墥墦墧墨墩墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墼墽墾墿壀壁壂壃壄壅壆壇壈壉壊壋壌壍壎壏壐壑壒壓壔壕壖壗壘壙壚壛壜壝壞壟壠壡壢壣壤壥壦壧壨壩壪士壬壭壮壯声壱売壳壴壵壶壷壸壹壺壻壼壽壾壿夀夁夂夃处夅夆备夈変夊夋夌复夎夏夐夑夒夓夔夕外夗夘夙多夛夜夝夞够夠夡","夢夣夤夥夦大夨天太夫夬夭央夯夰失夲夳头夵夶夷夸夹夺夻夼夽夾夿奀奁奂奃奄奅奆奇奈奉奊奋奌奍奎奏奐契奒奓奔奕奖套奘奙奚奛奜奝奞奟奠奡奢奣奤奥奦奧奨奩奪奫奬奭奮奯奰奱奲女奴奵奶奷奸她奺奻奼好奾奿妀妁如妃妄妅妆妇妈妉妊妋妌妍妎妏妐妑妒妓妔妕妖妗妘妙妚妛妜妝妞妟妠妡妢妣妤妥妦妧妨妩妪妫妬妭妮妯妰妱妲妳妴妵妶妷妸妹妺妻妼妽妾妿姀姁姂姃姄姅姆姇姈姉姊始姌姍姎姏姐姑姒姓委姕姖姗姘姙姚姛姜姝姞姟姠姡姢姣姤姥姦姧姨姩姪姫姬姭姮姯姰姱姲姳姴姵姶姷姸姹姺姻姼姽姾姿娀威娂娃娄娅娆娇娈娉娊娋娌娍娎娏娐娑娒娓娔娕娖娗娘娙娚娛娜娝娞娟娠娡","娢娣娤娥娦娧娨娩娪娫娬娭娮娯娰娱娲娳娴娵娶娷娸娹娺娻娼娽娾娿婀婁婂婃婄婅婆婇婈婉婊婋婌婍婎婏婐婑婒婓婔婕婖婗婘婙婚婛婜婝婞婟婠婡婢婣婤婥婦婧婨婩婪婫婬婭婮婯婰婱婲婳婴婵婶婷婸婹婺婻婼婽婾婿媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媒媓媔媕媖媗媘媙媚媛媜媝媞媟媠媡媢媣媤媥媦媧媨媩媪媫媬媭媮媯媰媱媲媳媴媵媶媷媸媹媺媻媼媽媾媿嫀嫁嫂嫃嫄嫅嫆嫇嫈嫉嫊嫋嫌嫍嫎嫏嫐嫑嫒嫓嫔嫕嫖嫗嫘嫙嫚嫛嫜嫝嫞嫟嫠嫡嫢嫣嫤嫥嫦嫧嫨嫩嫪嫫嫬嫭嫮嫯嫰嫱嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬉嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬖嬗嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡","嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬲嬳嬴嬵嬶嬷嬸嬹嬺嬻嬼嬽嬾嬿孀孁孂孃孄孅孆孇孈孉孊孋孌孍孎孏子孑孒孓孔孕孖字存孙孚孛孜孝孞孟孠孡孢季孤孥学孧孨孩孪孫孬孭孮孯孰孱孲孳孴孵孶孷學孹孺孻孼孽孾孿宀宁宂它宄宅宆宇守安宊宋完宍宎宏宐宑宒宓宔宕宖宗官宙定宛宜宝实実宠审客宣室宥宦宧宨宩宪宫宬宭宮宯宰宱宲害宴宵家宷宸容宺宻宼宽宾宿寀寁寂寃寄寅密寇寈寉寊寋富寍寎寏寐寑寒寓寔寕寖寗寘寙寚寛寜寝寞察寠寡寢寣寤寥實寧寨審寪寫寬寭寮寯寰寱寲寳寴寵寶寷寸对寺寻导寽対寿尀封専尃射尅将將專尉尊尋尌對導小尐少尒尓尔尕尖尗尘尙尚尛尜尝尞尟尠尡","尢尣尤尥尦尧尨尩尪尫尬尭尮尯尰就尲尳尴尵尶尷尸尹尺尻尼尽尾尿局屁层屃屄居屆屇屈屉届屋屌屍屎屏屐屑屒屓屔展屖屗屘屙屚屛屜屝属屟屠屡屢屣層履屦屧屨屩屪屫屬屭屮屯屰山屲屳屴屵屶屷屸屹屺屻屼屽屾屿岀岁岂岃岄岅岆岇岈岉岊岋岌岍岎岏岐岑岒岓岔岕岖岗岘岙岚岛岜岝岞岟岠岡岢岣岤岥岦岧岨岩岪岫岬岭岮岯岰岱岲岳岴岵岶岷岸岹岺岻岼岽岾岿峀峁峂峃峄峅峆峇峈峉峊峋峌峍峎峏峐峑峒峓峔峕峖峗峘峙峚峛峜峝峞峟峠峡峢峣峤峥峦峧峨峩峪峫峬峭峮峯峰峱峲峳峴峵島峷峸峹峺峻峼峽峾峿崀崁崂崃崄崅崆崇崈崉崊崋崌崍崎崏崐崑崒崓崔崕崖崗崘崙崚崛崜崝崞崟崠崡","崢崣崤崥崦崧崨崩崪崫崬崭崮崯崰崱崲崳崴崵崶崷崸崹崺崻崼崽崾崿嵀嵁嵂嵃嵄嵅嵆嵇嵈嵉嵊嵋嵌嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵘嵙嵚嵛嵜嵝嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵩嵪嵫嵬嵭嵮嵯嵰嵱嵲嵳嵴嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶂嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶙嶚嶛嶜嶝嶞嶟嶠嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶷嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巅巆巇巈巉巊巋巌巍巎巏巐巑巒巓巔巕巖巗巘巙巚巛巜川州巟巠巡巢巣巤工左巧巨巩巪巫巬巭差巯巰己已巳巴巵巶巷巸巹巺巻巼巽巾巿帀币市布帄帅帆帇师帉帊帋希帍帎帏帐帑帒帓帔帕帖帗帘帙帚帛帜帝帞帟帠帡","帢帣帤帥带帧帨帩帪師帬席帮帯帰帱帲帳帴帵帶帷常帹帺帻帼帽帾帿幀幁幂幃幄幅幆幇幈幉幊幋幌幍幎幏幐幑幒幓幔幕幖幗幘幙幚幛幜幝幞幟幠幡幢幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱干平年幵并幷幸幹幺幻幼幽幾广庀庁庂広庄庅庆庇庈庉床庋庌庍庎序庐庑庒库应底庖店庘庙庚庛府庝庞废庠庡庢庣庤庥度座庨庩庪庫庬庭庮庯庰庱庲庳庴庵庶康庸庹庺庻庼庽庾庿廀廁廂廃廄廅廆廇廈廉廊廋廌廍廎廏廐廑廒廓廔廕廖廗廘廙廚廛廜廝廞廟廠廡廢廣廤廥廦廧廨廩廪廫廬廭廮廯廰廱廲廳廴廵延廷廸廹建廻廼廽廾廿开弁异弃弄弅弆弇弈弉弊弋弌弍弎式弐弑弒弓弔引弖弗弘弙弚弛弜弝弞弟张弡","弢弣弤弥弦弧弨弩弪弫弬弭弮弯弰弱弲弳弴張弶強弸弹强弻弼弽弾弿彀彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彐彑归当彔录彖彗彘彙彚彛彜彝彞彟彠彡形彣彤彥彦彧彨彩彪彫彬彭彮彯彰影彲彳彴彵彶彷彸役彺彻彼彽彾彿往征徂徃径待徆徇很徉徊律後徍徎徏徐徑徒従徔徕徖得徘徙徚徛徜徝從徟徠御徢徣徤徥徦徧徨復循徫徬徭微徯徰徱徲徳徴徵徶德徸徹徺徻徼徽徾徿忀忁忂心忄必忆忇忈忉忊忋忌忍忎忏忐忑忒忓忔忕忖志忘忙忚忛応忝忞忟忠忡忢忣忤忥忦忧忨忩忪快忬忭忮忯忰忱忲忳忴念忶忷忸忹忺忻忼忽忾忿怀态怂怃怄怅怆怇怈怉怊怋怌怍怎怏怐怑怒怓怔怕怖怗怘怙怚怛怜思怞怟怠怡","怢怣怤急怦性怨怩怪怫怬怭怮怯怰怱怲怳怴怵怶怷怸怹怺总怼怽怾怿恀恁恂恃恄恅恆恇恈恉恊恋恌恍恎恏恐恑恒恓恔恕恖恗恘恙恚恛恜恝恞恟恠恡恢恣恤恥恦恧恨恩恪恫恬恭恮息恰恱恲恳恴恵恶恷恸恹恺恻恼恽恾恿悀悁悂悃悄悅悆悇悈悉悊悋悌悍悎悏悐悑悒悓悔悕悖悗悘悙悚悛悜悝悞悟悠悡悢患悤悥悦悧您悩悪悫悬悭悮悯悰悱悲悳悴悵悶悷悸悹悺悻悼悽悾悿惀惁惂惃惄情惆惇惈惉惊惋惌惍惎惏惐惑惒惓惔惕惖惗惘惙惚惛惜惝惞惟惠惡惢惣惤惥惦惧惨惩惪惫惬惭惮惯惰惱惲想惴惵惶惷惸惹惺惻惼惽惾惿愀愁愂愃愄愅愆愇愈愉愊愋愌愍愎意愐愑愒愓愔愕愖愗愘愙愚愛愜愝愞感愠愡","愢愣愤愥愦愧愨愩愪愫愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾愿慀慁慂慃慄慅慆慇慈慉慊態慌慍慎慏慐慑慒慓慔慕慖慗慘慙慚慛慜慝慞慟慠慡慢慣慤慥慦慧慨慩慪慫慬慭慮慯慰慱慲慳慴慵慶慷慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憋憌憍憎憏憐憑憒憓憔憕憖憗憘憙憚憛憜憝憞憟憠憡憢憣憤憥憦憧憨憩憪憫憬憭憮憯憰憱憲憳憴憵憶憷憸憹憺憻憼憽憾憿懀懁懂懃懄懅懆懇懈應懊懋懌懍懎懏懐懑懒懓懔懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懦懧懨懩懪懫懬懭懮懯懰懱懲懳懴懵懶懷懸懹懺懻懼懽懾懿戀戁戂戃戄戅戆戇戈戉戊戋戌戍戎戏成我戒戓戔戕或戗战戙戚戛戜戝戞戟戠戡","戢戣戤戥戦戧戨戩截戫戬戭戮戯戰戱戲戳戴戵戶户戸戹戺戻戼戽戾房所扁扂扃扄扅扆扇扈扉扊手扌才扎扏扐扑扒打扔払扖扗托扙扚扛扜扝扞扟扠扡扢扣扤扥扦执扨扩扪扫扬扭扮扯扰扱扲扳扴扵扶扷扸批扺扻扼扽找承技抁抂抃抄抅抆抇抈抉把抋抌抍抎抏抐抑抒抓抔投抖抗折抙抚抛抜抝択抟抠抡抢抣护报抦抧抨抩抪披抬抭抮抯抰抱抲抳抴抵抶抷抸抹抺抻押抽抾抿拀拁拂拃拄担拆拇拈拉拊拋拌拍拎拏拐拑拒拓拔拕拖拗拘拙拚招拜拝拞拟拠拡拢拣拤拥拦拧拨择拪拫括拭拮拯拰拱拲拳拴拵拶拷拸拹拺拻拼拽拾拿挀持挂挃挄挅挆指挈按挊挋挌挍挎挏挐挑挒挓挔挕挖挗挘挙挚挛挜挝挞挟挠挡","挢挣挤挥挦挧挨挩挪挫挬挭挮振挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿捀捁捂捃捄捅捆捇捈捉捊捋捌捍捎捏捐捑捒捓捔捕捖捗捘捙捚捛捜捝捞损捠捡换捣捤捥捦捧捨捩捪捫捬捭据捯捰捱捲捳捴捵捶捷捸捹捺捻捼捽捾捿掀掁掂掃掄掅掆掇授掉掊掋掌掍掎掏掐掑排掓掔掕掖掗掘掙掚掛掜掝掞掟掠採探掣掤接掦控推掩措掫掬掭掮掯掰掱掲掳掴掵掶掷掸掹掺掻掼掽掾掿揀揁揂揃揄揅揆揇揈揉揊揋揌揍揎描提揑插揓揔揕揖揗揘揙揚換揜揝揞揟揠握揢揣揤揥揦揧揨揩揪揫揬揭揮揯揰揱揲揳援揵揶揷揸揹揺揻揼揽揾揿搀搁搂搃搄搅搆搇搈搉搊搋搌損搎搏搐搑搒搓搔搕搖搗搘搙搚搛搜搝搞搟搠搡","搢搣搤搥搦搧搨搩搪搫搬搭搮搯搰搱搲搳搴搵搶搷搸搹携搻搼搽搾搿摀摁摂摃摄摅摆摇摈摉摊摋摌摍摎摏摐摑摒摓摔摕摖摗摘摙摚摛摜摝摞摟摠摡摢摣摤摥摦摧摨摩摪摫摬摭摮摯摰摱摲摳摴摵摶摷摸摹摺摻摼摽摾摿撀撁撂撃撄撅撆撇撈撉撊撋撌撍撎撏撐撑撒撓撔撕撖撗撘撙撚撛撜撝撞撟撠撡撢撣撤撥撦撧撨撩撪撫撬播撮撯撰撱撲撳撴撵撶撷撸撹撺撻撼撽撾撿擀擁擂擃擄擅擆擇擈擉擊擋擌操擎擏擐擑擒擓擔擕擖擗擘擙據擛擜擝擞擟擠擡擢擣擤擥擦擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攀攁攂攃攄攅攆攇攈攉攊攋攌攍攎攏攐攑攒攓攔攕攖攗攘攙攚攛攜攝攞攟攠攡","攢攣攤攥攦攧攨攩攪攫攬攭攮支攰攱攲攳攴攵收攷攸改攺攻攼攽放政敀敁敂敃敄故敆敇效敉敊敋敌敍敎敏敐救敒敓敔敕敖敗敘教敚敛敜敝敞敟敠敡敢散敤敥敦敧敨敩敪敫敬敭敮敯数敱敲敳整敵敶敷數敹敺敻敼敽敾敿斀斁斂斃斄斅斆文斈斉斊斋斌斍斎斏斐斑斒斓斔斕斖斗斘料斚斛斜斝斞斟斠斡斢斣斤斥斦斧斨斩斪斫斬断斮斯新斱斲斳斴斵斶斷斸方斺斻於施斾斿旀旁旂旃旄旅旆旇旈旉旊旋旌旍旎族旐旑旒旓旔旕旖旗旘旙旚旛旜旝旞旟无旡既旣旤日旦旧旨早旪旫旬旭旮旯旰旱旲旳旴旵时旷旸旹旺旻旼旽旾旿昀昁昂昃昄昅昆昇昈昉昊昋昌昍明昏昐昑昒易昔昕昖昗昘昙昚昛昜昝昞星映昡","昢昣昤春昦昧昨昩昪昫昬昭昮是昰昱昲昳昴昵昶昷昸昹昺昻昼昽显昿晀晁時晃晄晅晆晇晈晉晊晋晌晍晎晏晐晑晒晓晔晕晖晗晘晙晚晛晜晝晞晟晠晡晢晣晤晥晦晧晨晩晪晫晬晭普景晰晱晲晳晴晵晶晷晸晹智晻晼晽晾晿暀暁暂暃暄暅暆暇暈暉暊暋暌暍暎暏暐暑暒暓暔暕暖暗暘暙暚暛暜暝暞暟暠暡暢暣暤暥暦暧暨暩暪暫暬暭暮暯暰暱暲暳暴暵暶暷暸暹暺暻暼暽暾暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曙曚曛曜曝曞曟曠曡曢曣曤曥曦曧曨曩曪曫曬曭曮曯曰曱曲曳更曵曶曷書曹曺曻曼曽曾替最朁朂會朄朅朆朇月有朊朋朌服朎朏朐朑朒朓朔朕朖朗朘朙朚望朜朝朞期朠朡","朢朣朤朥朦朧木朩未末本札朮术朰朱朲朳朴朵朶朷朸朹机朻朼朽朾朿杀杁杂权杄杅杆杇杈杉杊杋杌杍李杏材村杒杓杔杕杖杗杘杙杚杛杜杝杞束杠条杢杣杤来杦杧杨杩杪杫杬杭杮杯杰東杲杳杴杵杶杷杸杹杺杻杼杽松板枀极枂枃构枅枆枇枈枉枊枋枌枍枎枏析枑枒枓枔枕枖林枘枙枚枛果枝枞枟枠枡枢枣枤枥枦枧枨枩枪枫枬枭枮枯枰枱枲枳枴枵架枷枸枹枺枻枼枽枾枿柀柁柂柃柄柅柆柇柈柉柊柋柌柍柎柏某柑柒染柔柕柖柗柘柙柚柛柜柝柞柟柠柡柢柣柤查柦柧柨柩柪柫柬柭柮柯柰柱柲柳柴柵柶柷柸柹柺査柼柽柾柿栀栁栂栃栄栅栆标栈栉栊栋栌栍栎栏栐树栒栓栔栕栖栗栘栙栚栛栜栝栞栟栠校","栢栣栤栥栦栧栨栩株栫栬栭栮栯栰栱栲栳栴栵栶样核根栺栻格栽栾栿桀桁桂桃桄桅框桇案桉桊桋桌桍桎桏桐桑桒桓桔桕桖桗桘桙桚桛桜桝桞桟桠桡桢档桤桥桦桧桨桩桪桫桬桭桮桯桰桱桲桳桴桵桶桷桸桹桺桻桼桽桾桿梀梁梂梃梄梅梆梇梈梉梊梋梌梍梎梏梐梑梒梓梔梕梖梗梘梙梚梛梜條梞梟梠梡梢梣梤梥梦梧梨梩梪梫梬梭梮梯械梱梲梳梴梵梶梷梸梹梺梻梼梽梾梿检棁棂棃棄棅棆棇棈棉棊棋棌棍棎棏棐棑棒棓棔棕棖棗棘棙棚棛棜棝棞棟棠棡棢棣棤棥棦棧棨棩棪棫棬棭森棯棰棱棲棳棴棵棶棷棸棹棺棻棼棽棾棿椀椁椂椃椄椅椆椇椈椉椊椋椌植椎椏椐椑椒椓椔椕椖椗椘椙椚椛検椝椞椟椠椡","椢椣椤椥椦椧椨椩椪椫椬椭椮椯椰椱椲椳椴椵椶椷椸椹椺椻椼椽椾椿楀楁楂楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楔楕楖楗楘楙楚楛楜楝楞楟楠楡楢楣楤楥楦楧楨楩楪楫楬業楮楯楰楱楲楳楴極楶楷楸楹楺楻楼楽楾楿榀榁概榃榄榅榆榇榈榉榊榋榌榍榎榏榐榑榒榓榔榕榖榗榘榙榚榛榜榝榞榟榠榡榢榣榤榥榦榧榨榩榪榫榬榭榮榯榰榱榲榳榴榵榶榷榸榹榺榻榼榽榾榿槀槁槂槃槄槅槆槇槈槉槊構槌槍槎槏槐槑槒槓槔槕槖槗様槙槚槛槜槝槞槟槠槡槢槣槤槥槦槧槨槩槪槫槬槭槮槯槰槱槲槳槴槵槶槷槸槹槺槻槼槽槾槿樀樁樂樃樄樅樆樇樈樉樊樋樌樍樎樏樐樑樒樓樔樕樖樗樘標樚樛樜樝樞樟樠模","樢樣樤樥樦樧樨権横樫樬樭樮樯樰樱樲樳樴樵樶樷樸樹樺樻樼樽樾樿橀橁橂橃橄橅橆橇橈橉橊橋橌橍橎橏橐橑橒橓橔橕橖橗橘橙橚橛橜橝橞機橠橡橢橣橤橥橦橧橨橩橪橫橬橭橮橯橰橱橲橳橴橵橶橷橸橹橺橻橼橽橾橿檀檁檂檃檄檅檆檇檈檉檊檋檌檍檎檏檐檑檒檓檔檕檖檗檘檙檚檛檜檝檞檟檠檡檢檣檤檥檦檧檨檩檪檫檬檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欠次","欢欣欤欥欦欧欨欩欪欫欬欭欮欯欰欱欲欳欴欵欶欷欸欹欺欻欼欽款欿歀歁歂歃歄歅歆歇歈歉歊歋歌歍歎歏歐歑歒歓歔歕歖歗歘歙歚歛歜歝歞歟歠歡止正此步武歧歨歩歪歫歬歭歮歯歰歱歲歳歴歵歶歷歸歹歺死歼歽歾歿殀殁殂殃殄殅殆殇殈殉殊残殌殍殎殏殐殑殒殓殔殕殖殗殘殙殚殛殜殝殞殟殠殡殢殣殤殥殦殧殨殩殪殫殬殭殮殯殰殱殲殳殴段殶殷殸殹殺殻殼殽殾殿毀毁毂毃毄毅毆毇毈毉毊毋毌母毎每毐毑毒毓比毕毖毗毘毙毚毛毜毝毞毟毠毡毢毣毤毥毦毧毨毩毪毫毬毭毮毯毰毱毲毳毴毵毶毷毸毹毺毻毼毽毾毿氀氁氂氃氄氅氆氇氈氉氊氋氌氍氎氏氐民氒氓气氕氖気氘氙氚氛氜氝氞氟氠氡","氢氣氤氥氦氧氨氩氪氫氬氭氮氯氰氱氲氳水氵氶氷永氹氺氻氼氽氾氿汀汁求汃汄汅汆汇汈汉汊汋汌汍汎汏汐汑汒汓汔汕汖汗汘汙汚汛汜汝汞江池污汢汣汤汥汦汧汨汩汪汫汬汭汮汯汰汱汲汳汴汵汶汷汸汹決汻汼汽汾汿沀沁沂沃沄沅沆沇沈沉沊沋沌沍沎沏沐沑沒沓沔沕沖沗沘沙沚沛沜沝沞沟沠没沢沣沤沥沦沧沨沩沪沫沬沭沮沯沰沱沲河沴沵沶沷沸油沺治沼沽沾沿泀況泂泃泄泅泆泇泈泉泊泋泌泍泎泏泐泑泒泓泔法泖泗泘泙泚泛泜泝泞泟泠泡波泣泤泥泦泧注泩泪泫泬泭泮泯泰泱泲泳泴泵泶泷泸泹泺泻泼泽泾泿洀洁洂洃洄洅洆洇洈洉洊洋洌洍洎洏洐洑洒洓洔洕洖洗洘洙洚洛洜洝洞洟洠洡","洢洣洤津洦洧洨洩洪洫洬洭洮洯洰洱洲洳洴洵洶洷洸洹洺活洼洽派洿浀流浂浃浄浅浆浇浈浉浊测浌浍济浏浐浑浒浓浔浕浖浗浘浙浚浛浜浝浞浟浠浡浢浣浤浥浦浧浨浩浪浫浬浭浮浯浰浱浲浳浴浵浶海浸浹浺浻浼浽浾浿涀涁涂涃涄涅涆涇消涉涊涋涌涍涎涏涐涑涒涓涔涕涖涗涘涙涚涛涜涝涞涟涠涡涢涣涤涥润涧涨涩涪涫涬涭涮涯涰涱液涳涴涵涶涷涸涹涺涻涼涽涾涿淀淁淂淃淄淅淆淇淈淉淊淋淌淍淎淏淐淑淒淓淔淕淖淗淘淙淚淛淜淝淞淟淠淡淢淣淤淥淦淧淨淩淪淫淬淭淮淯淰深淲淳淴淵淶混淸淹淺添淼淽淾淿渀渁渂渃渄清渆渇済渉渊渋渌渍渎渏渐渑渒渓渔渕渖渗渘渙渚減渜渝渞渟渠渡","渢渣渤渥渦渧渨温渪渫測渭渮港渰渱渲渳渴渵渶渷游渹渺渻渼渽渾渿湀湁湂湃湄湅湆湇湈湉湊湋湌湍湎湏湐湑湒湓湔湕湖湗湘湙湚湛湜湝湞湟湠湡湢湣湤湥湦湧湨湩湪湫湬湭湮湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽湾湿満溁溂溃溄溅溆溇溈溉溊溋溌溍溎溏源溑溒溓溔溕準溗溘溙溚溛溜溝溞溟溠溡溢溣溤溥溦溧溨溩溪溫溬溭溮溯溰溱溲溳溴溵溶溷溸溹溺溻溼溽溾溿滀滁滂滃滄滅滆滇滈滉滊滋滌滍滎滏滐滑滒滓滔滕滖滗滘滙滚滛滜滝滞滟滠满滢滣滤滥滦滧滨滩滪滫滬滭滮滯滰滱滲滳滴滵滶滷滸滹滺滻滼滽滾滿漀漁漂漃漄漅漆漇漈漉漊漋漌漍漎漏漐漑漒漓演漕漖漗漘漙漚漛漜漝漞漟漠漡","漢漣漤漥漦漧漨漩漪漫漬漭漮漯漰漱漲漳漴漵漶漷漸漹漺漻漼漽漾漿潀潁潂潃潄潅潆潇潈潉潊潋潌潍潎潏潐潑潒潓潔潕潖潗潘潙潚潛潜潝潞潟潠潡潢潣潤潥潦潧潨潩潪潫潬潭潮潯潰潱潲潳潴潵潶潷潸潹潺潻潼潽潾潿澀澁澂澃澄澅澆澇澈澉澊澋澌澍澎澏澐澑澒澓澔澕澖澗澘澙澚澛澜澝澞澟澠澡澢澣澤澥澦澧澨澩澪澫澬澭澮澯澰澱澲澳澴澵澶澷澸澹澺澻澼澽澾澿激濁濂濃濄濅濆濇濈濉濊濋濌濍濎濏濐濑濒濓濔濕濖濗濘濙濚濛濜濝濞濟濠濡濢濣濤濥濦濧濨濩濪濫濬濭濮濯濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀑瀒瀓瀔瀕瀖瀗瀘瀙瀚瀛瀜瀝瀞瀟瀠瀡","瀢瀣瀤瀥瀦瀧瀨瀩瀪瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀵瀶瀷瀸瀹瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灌灍灎灏灐灑灒灓灔灕灖灗灘灙灚灛灜灝灞灟灠灡灢灣灤灥灦灧灨灩灪火灬灭灮灯灰灱灲灳灴灵灶灷灸灹灺灻灼災灾灿炀炁炂炃炄炅炆炇炈炉炊炋炌炍炎炏炐炑炒炓炔炕炖炗炘炙炚炛炜炝炞炟炠炡炢炣炤炥炦炧炨炩炪炫炬炭炮炯炰炱炲炳炴炵炶炷炸点為炻炼炽炾炿烀烁烂烃烄烅烆烇烈烉烊烋烌烍烎烏烐烑烒烓烔烕烖烗烘烙烚烛烜烝烞烟烠烡烢烣烤烥烦烧烨烩烪烫烬热烮烯烰烱烲烳烴烵烶烷烸烹烺烻烼烽烾烿焀焁焂焃焄焅焆焇焈焉焊焋焌焍焎焏焐焑焒焓焔焕焖焗焘焙焚焛焜焝焞焟焠無","焢焣焤焥焦焧焨焩焪焫焬焭焮焯焰焱焲焳焴焵然焷焸焹焺焻焼焽焾焿煀煁煂煃煄煅煆煇煈煉煊煋煌煍煎煏煐煑煒煓煔煕煖煗煘煙煚煛煜煝煞煟煠煡煢煣煤煥煦照煨煩煪煫煬煭煮煯煰煱煲煳煴煵煶煷煸煹煺煻煼煽煾煿熀熁熂熃熄熅熆熇熈熉熊熋熌熍熎熏熐熑熒熓熔熕熖熗熘熙熚熛熜熝熞熟熠熡熢熣熤熥熦熧熨熩熪熫熬熭熮熯熰熱熲熳熴熵熶熷熸熹熺熻熼熽熾熿燀燁燂燃燄燅燆燇燈燉燊燋燌燍燎燏燐燑燒燓燔燕燖燗燘燙燚燛燜燝燞營燠燡燢燣燤燥燦燧燨燩燪燫燬燭燮燯燰燱燲燳燴燵燶燷燸燹燺燻燼燽燾燿爀爁爂爃爄爅爆爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚爛爜爝爞爟爠爡","爢爣爤爥爦爧爨爩爪爫爬爭爮爯爰爱爲爳爴爵父爷爸爹爺爻爼爽爾爿牀牁牂牃牄牅牆片版牉牊牋牌牍牎牏牐牑牒牓牔牕牖牗牘牙牚牛牜牝牞牟牠牡牢牣牤牥牦牧牨物牪牫牬牭牮牯牰牱牲牳牴牵牶牷牸特牺牻牼牽牾牿犀犁犂犃犄犅犆犇犈犉犊犋犌犍犎犏犐犑犒犓犔犕犖犗犘犙犚犛犜犝犞犟犠犡犢犣犤犥犦犧犨犩犪犫犬犭犮犯犰犱犲犳犴犵状犷犸犹犺犻犼犽犾犿狀狁狂狃狄狅狆狇狈狉狊狋狌狍狎狏狐狑狒狓狔狕狖狗狘狙狚狛狜狝狞狟狠狡狢狣狤狥狦狧狨狩狪狫独狭狮狯狰狱狲狳狴狵狶狷狸狹狺狻狼狽狾狿猀猁猂猃猄猅猆猇猈猉猊猋猌猍猎猏猐猑猒猓猔猕猖猗猘猙猚猛猜猝猞猟猠猡","猢猣猤猥猦猧猨猩猪猫猬猭献猯猰猱猲猳猴猵猶猷猸猹猺猻猼猽猾猿獀獁獂獃獄獅獆獇獈獉獊獋獌獍獎獏獐獑獒獓獔獕獖獗獘獙獚獛獜獝獞獟獠獡獢獣獤獥獦獧獨獩獪獫獬獭獮獯獰獱獲獳獴獵獶獷獸獹獺獻獼獽獾獿玀玁玂玃玄玅玆率玈玉玊王玌玍玎玏玐玑玒玓玔玕玖玗玘玙玚玛玜玝玞玟玠玡玢玣玤玥玦玧玨玩玪玫玬玭玮环现玱玲玳玴玵玶玷玸玹玺玻玼玽玾玿珀珁珂珃珄珅珆珇珈珉珊珋珌珍珎珏珐珑珒珓珔珕珖珗珘珙珚珛珜珝珞珟珠珡珢珣珤珥珦珧珨珩珪珫珬班珮珯珰珱珲珳珴珵珶珷珸珹珺珻珼珽現珿琀琁琂球琄琅理琇琈琉琊琋琌琍琎琏琐琑琒琓琔琕琖琗琘琙琚琛琜琝琞琟琠琡","琢琣琤琥琦琧琨琩琪琫琬琭琮琯琰琱琲琳琴琵琶琷琸琹琺琻琼琽琾琿瑀瑁瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍瑎瑏瑐瑑瑒瑓瑔瑕瑖瑗瑘瑙瑚瑛瑜瑝瑞瑟瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑭瑮瑯瑰瑱瑲瑳瑴瑵瑶瑷瑸瑹瑺瑻瑼瑽瑾瑿璀璁璂璃璄璅璆璇璈璉璊璋璌璍璎璏璐璑璒璓璔璕璖璗璘璙璚璛璜璝璞璟璠璡璢璣璤璥璦璧璨璩璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璺璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓒瓓瓔瓕瓖瓗瓘瓙瓚瓛瓜瓝瓞瓟瓠瓡瓢瓣瓤瓥瓦瓧瓨瓩瓪瓫瓬瓭瓮瓯瓰瓱瓲瓳瓴瓵瓶瓷瓸瓹瓺瓻瓼瓽瓾瓿甀甁甂甃甄甅甆甇甈甉甊甋甌甍甎甏甐甑甒甓甔甕甖甗甘甙甚甛甜甝甞生甠甡","產産甤甥甦甧用甩甪甫甬甭甮甯田由甲申甴电甶男甸甹町画甼甽甾甿畀畁畂畃畄畅畆畇畈畉畊畋界畍畎畏畐畑畒畓畔畕畖畗畘留畚畛畜畝畞畟畠畡畢畣畤略畦畧畨畩番畫畬畭畮畯異畱畲畳畴畵當畷畸畹畺畻畼畽畾畿疀疁疂疃疄疅疆疇疈疉疊疋疌疍疎疏疐疑疒疓疔疕疖疗疘疙疚疛疜疝疞疟疠疡疢疣疤疥疦疧疨疩疪疫疬疭疮疯疰疱疲疳疴疵疶疷疸疹疺疻疼疽疾疿痀痁痂痃痄病痆症痈痉痊痋痌痍痎痏痐痑痒痓痔痕痖痗痘痙痚痛痜痝痞痟痠痡痢痣痤痥痦痧痨痩痪痫痬痭痮痯痰痱痲痳痴痵痶痷痸痹痺痻痼痽痾痿瘀瘁瘂瘃瘄瘅瘆瘇瘈瘉瘊瘋瘌瘍瘎瘏瘐瘑瘒瘓瘔瘕瘖瘗瘘瘙瘚瘛瘜瘝瘞瘟瘠瘡","瘢瘣瘤瘥瘦瘧瘨瘩瘪瘫瘬瘭瘮瘯瘰瘱瘲瘳瘴瘵瘶瘷瘸瘹瘺瘻瘼瘽瘾瘿癀癁療癃癄癅癆癇癈癉癊癋癌癍癎癏癐癑癒癓癔癕癖癗癘癙癚癛癜癝癞癟癠癡癢癣癤癥癦癧癨癩癪癫癬癭癮癯癰癱癲癳癴癵癶癷癸癹発登發白百癿皀皁皂皃的皅皆皇皈皉皊皋皌皍皎皏皐皑皒皓皔皕皖皗皘皙皚皛皜皝皞皟皠皡皢皣皤皥皦皧皨皩皪皫皬皭皮皯皰皱皲皳皴皵皶皷皸皹皺皻皼皽皾皿盀盁盂盃盄盅盆盇盈盉益盋盌盍盎盏盐监盒盓盔盕盖盗盘盙盚盛盜盝盞盟盠盡盢監盤盥盦盧盨盩盪盫盬盭目盯盰盱盲盳直盵盶盷相盹盺盻盼盽盾盿眀省眂眃眄眅眆眇眈眉眊看県眍眎眏眐眑眒眓眔眕眖眗眘眙眚眛眜眝眞真眠眡","眢眣眤眥眦眧眨眩眪眫眬眭眮眯眰眱眲眳眴眵眶眷眸眹眺眻眼眽眾眿着睁睂睃睄睅睆睇睈睉睊睋睌睍睎睏睐睑睒睓睔睕睖睗睘睙睚睛睜睝睞睟睠睡睢督睤睥睦睧睨睩睪睫睬睭睮睯睰睱睲睳睴睵睶睷睸睹睺睻睼睽睾睿瞀瞁瞂瞃瞄瞅瞆瞇瞈瞉瞊瞋瞌瞍瞎瞏瞐瞑瞒瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞟瞠瞡瞢瞣瞤瞥瞦瞧瞨瞩瞪瞫瞬瞭瞮瞯瞰瞱瞲瞳瞴瞵瞶瞷瞸瞹瞺瞻瞼瞽瞾瞿矀矁矂矃矄矅矆矇矈矉矊矋矌矍矎矏矐矑矒矓矔矕矖矗矘矙矚矛矜矝矞矟矠矡矢矣矤知矦矧矨矩矪矫矬短矮矯矰矱矲石矴矵矶矷矸矹矺矻矼矽矾矿砀码砂砃砄砅砆砇砈砉砊砋砌砍砎砏砐砑砒砓研砕砖砗砘砙砚砛砜砝砞砟砠砡","砢砣砤砥砦砧砨砩砪砫砬砭砮砯砰砱砲砳破砵砶砷砸砹砺砻砼砽砾砿础硁硂硃硄硅硆硇硈硉硊硋硌硍硎硏硐硑硒硓硔硕硖硗硘硙硚硛硜硝硞硟硠硡硢硣硤硥硦硧硨硩硪硫硬硭确硯硰硱硲硳硴硵硶硷硸硹硺硻硼硽硾硿碀碁碂碃碄碅碆碇碈碉碊碋碌碍碎碏碐碑碒碓碔碕碖碗碘碙碚碛碜碝碞碟碠碡碢碣碤碥碦碧碨碩碪碫碬碭碮碯碰碱碲碳碴碵碶碷碸碹確碻碼碽碾碿磀磁磂磃磄磅磆磇磈磉磊磋磌磍磎磏磐磑磒磓磔磕磖磗磘磙磚磛磜磝磞磟磠磡磢磣磤磥磦磧磨磩磪磫磬磭磮磯磰磱磲磳磴磵磶磷磸磹磺磻磼磽磾磿礀礁礂礃礄礅礆礇礈礉礊礋礌礍礎礏礐礑礒礓礔礕礖礗礘礙礚礛礜礝礞礟礠礡","礢礣礤礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礴礵礶礷礸礹示礻礼礽社礿祀祁祂祃祄祅祆祇祈祉祊祋祌祍祎祏祐祑祒祓祔祕祖祗祘祙祚祛祜祝神祟祠祡祢祣祤祥祦祧票祩祪祫祬祭祮祯祰祱祲祳祴祵祶祷祸祹祺祻祼祽祾祿禀禁禂禃禄禅禆禇禈禉禊禋禌禍禎福禐禑禒禓禔禕禖禗禘禙禚禛禜禝禞禟禠禡禢禣禤禥禦禧禨禩禪禫禬禭禮禯禰禱禲禳禴禵禶禷禸禹禺离禼禽禾禿秀私秂秃秄秅秆秇秈秉秊秋秌种秎秏秐科秒秓秔秕秖秗秘秙秚秛秜秝秞租秠秡秢秣秤秥秦秧秨秩秪秫秬秭秮积称秱秲秳秴秵秶秷秸秹秺移秼秽秾秿稀稁稂稃稄稅稆稇稈稉稊程稌稍税稏稐稑稒稓稔稕稖稗稘稙稚稛稜稝稞稟稠稡","稢稣稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稳稴稵稶稷稸稹稺稻稼稽稾稿穀穁穂穃穄穅穆穇穈穉穊穋穌積穎穏穐穑穒穓穔穕穖穗穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨穩穪穫穬穭穮穯穰穱穲穳穴穵究穷穸穹空穻穼穽穾穿窀突窂窃窄窅窆窇窈窉窊窋窌窍窎窏窐窑窒窓窔窕窖窗窘窙窚窛窜窝窞窟窠窡窢窣窤窥窦窧窨窩窪窫窬窭窮窯窰窱窲窳窴窵窶窷窸窹窺窻窼窽窾窿竀竁竂竃竄竅竆竇竈竉竊立竌竍竎竏竐竑竒竓竔竕竖竗竘站竚竛竜竝竞竟章竡竢竣竤童竦竧竨竩竪竫竬竭竮端竰竱竲竳竴竵競竷竸竹竺竻竼竽竾竿笀笁笂笃笄笅笆笇笈笉笊笋笌笍笎笏笐笑笒笓笔笕笖笗笘笙笚笛笜笝笞笟笠笡","笢笣笤笥符笧笨笩笪笫第笭笮笯笰笱笲笳笴笵笶笷笸笹笺笻笼笽笾笿筀筁筂筃筄筅筆筇筈等筊筋筌筍筎筏筐筑筒筓答筕策筗筘筙筚筛筜筝筞筟筠筡筢筣筤筥筦筧筨筩筪筫筬筭筮筯筰筱筲筳筴筵筶筷筸筹筺筻筼筽签筿简箁箂箃箄箅箆箇箈箉箊箋箌箍箎箏箐箑箒箓箔箕箖算箘箙箚箛箜箝箞箟箠管箢箣箤箥箦箧箨箩箪箫箬箭箮箯箰箱箲箳箴箵箶箷箸箹箺箻箼箽箾箿節篁篂篃範篅篆篇篈築篊篋篌篍篎篏篐篑篒篓篔篕篖篗篘篙篚篛篜篝篞篟篠篡篢篣篤篥篦篧篨篩篪篫篬篭篮篯篰篱篲篳篴篵篶篷篸篹篺篻篼篽篾篿簀簁簂簃簄簅簆簇簈簉簊簋簌簍簎簏簐簑簒簓簔簕簖簗簘簙簚簛簜簝簞簟簠簡","簢簣簤簥簦簧簨簩簪簫簬簭簮簯簰簱簲簳簴簵簶簷簸簹簺簻簼簽簾簿籀籁籂籃籄籅籆籇籈籉籊籋籌籍籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲米籴籵籶籷籸籹籺类籼籽籾籿粀粁粂粃粄粅粆粇粈粉粊粋粌粍粎粏粐粑粒粓粔粕粖粗粘粙粚粛粜粝粞粟粠粡粢粣粤粥粦粧粨粩粪粫粬粭粮粯粰粱粲粳粴粵粶粷粸粹粺粻粼粽精粿糀糁糂糃糄糅糆糇糈糉糊糋糌糍糎糏糐糑糒糓糔糕糖糗糘糙糚糛糜糝糞糟糠糡糢糣糤糥糦糧糨糩糪糫糬糭糮糯糰糱糲糳糴糵糶糷糸糹糺系糼糽糾糿紀紁紂紃約紅紆紇紈紉紊紋紌納紎紏紐紑紒紓純紕紖紗紘紙級紛紜紝紞紟素紡","索紣紤紥紦紧紨紩紪紫紬紭紮累細紱紲紳紴紵紶紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絮絯絰統絲絳絴絵絶絷絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘継続綛綜綝綞綟綠綡綢綣綤綥綦綧綨綩綪綫綬維綮綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡","縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹縺縻縼總績縿繀繁繂繃繄繅繆繇繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纂纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纛纜纝纞纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡","缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵缶缷缸缹缺缻缼缽缾缿罀罁罂罃罄罅罆罇罈罉罊罋罌罍罎罏罐网罒罓罔罕罖罗罘罙罚罛罜罝罞罟罠罡罢罣罤罥罦罧罨罩罪罫罬罭置罯罰罱署罳罴罵罶罷罸罹罺罻罼罽罾罿羀羁羂羃羄羅羆羇羈羉羊羋羌羍美羏羐羑羒羓羔羕羖羗羘羙羚羛羜羝羞羟羠羡羢羣群羥羦羧羨義羪羫羬羭羮羯羰羱羲羳羴羵羶羷羸羹羺羻羼羽羾羿翀翁翂翃翄翅翆翇翈翉翊翋翌翍翎翏翐翑習翓翔翕翖翗翘翙翚翛翜翝翞翟翠翡翢翣翤翥翦翧翨翩翪翫翬翭翮翯翰翱翲翳翴翵翶翷翸翹翺翻翼翽翾翿耀老耂考耄者耆耇耈耉耊耋而耍耎耏耐耑耒耓耔耕耖耗耘耙耚耛耜耝耞耟耠耡","耢耣耤耥耦耧耨耩耪耫耬耭耮耯耰耱耲耳耴耵耶耷耸耹耺耻耼耽耾耿聀聁聂聃聄聅聆聇聈聉聊聋职聍聎聏聐聑聒聓联聕聖聗聘聙聚聛聜聝聞聟聠聡聢聣聤聥聦聧聨聩聪聫聬聭聮聯聰聱聲聳聴聵聶職聸聹聺聻聼聽聾聿肀肁肂肃肄肅肆肇肈肉肊肋肌肍肎肏肐肑肒肓肔肕肖肗肘肙肚肛肜肝肞肟肠股肢肣肤肥肦肧肨肩肪肫肬肭肮肯肰肱育肳肴肵肶肷肸肹肺肻肼肽肾肿胀胁胂胃胄胅胆胇胈胉胊胋背胍胎胏胐胑胒胓胔胕胖胗胘胙胚胛胜胝胞胟胠胡胢胣胤胥胦胧胨胩胪胫胬胭胮胯胰胱胲胳胴胵胶胷胸胹胺胻胼能胾胿脀脁脂脃脄脅脆脇脈脉脊脋脌脍脎脏脐脑脒脓脔脕脖脗脘脙脚脛脜脝脞脟脠脡","脢脣脤脥脦脧脨脩脪脫脬脭脮脯脰脱脲脳脴脵脶脷脸脹脺脻脼脽脾脿腀腁腂腃腄腅腆腇腈腉腊腋腌腍腎腏腐腑腒腓腔腕腖腗腘腙腚腛腜腝腞腟腠腡腢腣腤腥腦腧腨腩腪腫腬腭腮腯腰腱腲腳腴腵腶腷腸腹腺腻腼腽腾腿膀膁膂膃膄膅膆膇膈膉膊膋膌膍膎膏膐膑膒膓膔膕膖膗膘膙膚膛膜膝膞膟膠膡膢膣膤膥膦膧膨膩膪膫膬膭膮膯膰膱膲膳膴膵膶膷膸膹膺膻膼膽膾膿臀臁臂臃臄臅臆臇臈臉臊臋臌臍臎臏臐臑臒臓臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臣臤臥臦臧臨臩自臫臬臭臮臯臰臱臲至致臵臶臷臸臹臺臻臼臽臾臿舀舁舂舃舄舅舆與興舉舊舋舌舍舎舏舐舑舒舓舔舕舖舗舘舙舚舛舜舝舞舟舠舡","舢舣舤舥舦舧舨舩航舫般舭舮舯舰舱舲舳舴舵舶舷舸船舺舻舼舽舾舿艀艁艂艃艄艅艆艇艈艉艊艋艌艍艎艏艐艑艒艓艔艕艖艗艘艙艚艛艜艝艞艟艠艡艢艣艤艥艦艧艨艩艪艫艬艭艮良艰艱色艳艴艵艶艷艸艹艺艻艼艽艾艿芀芁节芃芄芅芆芇芈芉芊芋芌芍芎芏芐芑芒芓芔芕芖芗芘芙芚芛芜芝芞芟芠芡芢芣芤芥芦芧芨芩芪芫芬芭芮芯芰花芲芳芴芵芶芷芸芹芺芻芼芽芾芿苀苁苂苃苄苅苆苇苈苉苊苋苌苍苎苏苐苑苒苓苔苕苖苗苘苙苚苛苜苝苞苟苠苡苢苣苤若苦苧苨苩苪苫苬苭苮苯苰英苲苳苴苵苶苷苸苹苺苻苼苽苾苿茀茁茂范茄茅茆茇茈茉茊茋茌茍茎茏茐茑茒茓茔茕茖茗茘茙茚茛茜茝茞茟茠茡","茢茣茤茥茦茧茨茩茪茫茬茭茮茯茰茱茲茳茴茵茶茷茸茹茺茻茼茽茾茿荀荁荂荃荄荅荆荇荈草荊荋荌荍荎荏荐荑荒荓荔荕荖荗荘荙荚荛荜荝荞荟荠荡荢荣荤荥荦荧荨荩荪荫荬荭荮药荰荱荲荳荴荵荶荷荸荹荺荻荼荽荾荿莀莁莂莃莄莅莆莇莈莉莊莋莌莍莎莏莐莑莒莓莔莕莖莗莘莙莚莛莜莝莞莟莠莡莢莣莤莥莦莧莨莩莪莫莬莭莮莯莰莱莲莳莴莵莶获莸莹莺莻莼莽莾莿菀菁菂菃菄菅菆菇菈菉菊菋菌菍菎菏菐菑菒菓菔菕菖菗菘菙菚菛菜菝菞菟菠菡菢菣菤菥菦菧菨菩菪菫菬菭菮華菰菱菲菳菴菵菶菷菸菹菺菻菼菽菾菿萀萁萂萃萄萅萆萇萈萉萊萋萌萍萎萏萐萑萒萓萔萕萖萗萘萙萚萛萜萝萞萟萠萡","萢萣萤营萦萧萨萩萪萫萬萭萮萯萰萱萲萳萴萵萶萷萸萹萺萻萼落萾萿葀葁葂葃葄葅葆葇葈葉葊葋葌葍葎葏葐葑葒葓葔葕葖著葘葙葚葛葜葝葞葟葠葡葢董葤葥葦葧葨葩葪葫葬葭葮葯葰葱葲葳葴葵葶葷葸葹葺葻葼葽葾葿蒀蒁蒂蒃蒄蒅蒆蒇蒈蒉蒊蒋蒌蒍蒎蒏蒐蒑蒒蒓蒔蒕蒖蒗蒘蒙蒚蒛蒜蒝蒞蒟蒠蒡蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒯蒰蒱蒲蒳蒴蒵蒶蒷蒸蒹蒺蒻蒼蒽蒾蒿蓀蓁蓂蓃蓄蓅蓆蓇蓈蓉蓊蓋蓌蓍蓎蓏蓐蓑蓒蓓蓔蓕蓖蓗蓘蓙蓚蓛蓜蓝蓞蓟蓠蓡蓢蓣蓤蓥蓦蓧蓨蓩蓪蓫蓬蓭蓮蓯蓰蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓼蓽蓾蓿蔀蔁蔂蔃蔄蔅蔆蔇蔈蔉蔊蔋蔌蔍蔎蔏蔐蔑蔒蔓蔔蔕蔖蔗蔘蔙蔚蔛蔜蔝蔞蔟蔠蔡","蔢蔣蔤蔥蔦蔧蔨蔩蔪蔫蔬蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔷蔸蔹蔺蔻蔼蔽蔾蔿蕀蕁蕂蕃蕄蕅蕆蕇蕈蕉蕊蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕蕖蕗蕘蕙蕚蕛蕜蕝蕞蕟蕠蕡蕢蕣蕤蕥蕦蕧蕨蕩蕪蕫蕬蕭蕮蕯蕰蕱蕲蕳蕴蕵蕶蕷蕸蕹蕺蕻蕼蕽蕾蕿薀薁薂薃薄薅薆薇薈薉薊薋薌薍薎薏薐薑薒薓薔薕薖薗薘薙薚薛薜薝薞薟薠薡薢薣薤薥薦薧薨薩薪薫薬薭薮薯薰薱薲薳薴薵薶薷薸薹薺薻薼薽薾薿藀藁藂藃藄藅藆藇藈藉藊藋藌藍藎藏藐藑藒藓藔藕藖藗藘藙藚藛藜藝藞藟藠藡藢藣藤藥藦藧藨藩藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸藹藺藻藼藽藾藿蘀蘁蘂蘃蘄蘅蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘑蘒蘓蘔蘕蘖蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡","蘢蘣蘤蘥蘦蘧蘨蘩蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘸蘹蘺蘻蘼蘽蘾蘿虀虁虂虃虄虅虆虇虈虉虊虋虌虍虎虏虐虑虒虓虔處虖虗虘虙虚虛虜虝虞號虠虡虢虣虤虥虦虧虨虩虪虫虬虭虮虯虰虱虲虳虴虵虶虷虸虹虺虻虼虽虾虿蚀蚁蚂蚃蚄蚅蚆蚇蚈蚉蚊蚋蚌蚍蚎蚏蚐蚑蚒蚓蚔蚕蚖蚗蚘蚙蚚蚛蚜蚝蚞蚟蚠蚡蚢蚣蚤蚥蚦蚧蚨蚩蚪蚫蚬蚭蚮蚯蚰蚱蚲蚳蚴蚵蚶蚷蚸蚹蚺蚻蚼蚽蚾蚿蛀蛁蛂蛃蛄蛅蛆蛇蛈蛉蛊蛋蛌蛍蛎蛏蛐蛑蛒蛓蛔蛕蛖蛗蛘蛙蛚蛛蛜蛝蛞蛟蛠蛡蛢蛣蛤蛥蛦蛧蛨蛩蛪蛫蛬蛭蛮蛯蛰蛱蛲蛳蛴蛵蛶蛷蛸蛹蛺蛻蛼蛽蛾蛿蜀蜁蜂蜃蜄蜅蜆蜇蜈蜉蜊蜋蜌蜍蜎蜏蜐蜑蜒蜓蜔蜕蜖蜗蜘蜙蜚蜛蜜蜝蜞蜟蜠蜡","蜢蜣蜤蜥蜦蜧蜨蜩蜪蜫蜬蜭蜮蜯蜰蜱蜲蜳蜴蜵蜶蜷蜸蜹蜺蜻蜼蜽蜾蜿蝀蝁蝂蝃蝄蝅蝆蝇蝈蝉蝊蝋蝌蝍蝎蝏蝐蝑蝒蝓蝔蝕蝖蝗蝘蝙蝚蝛蝜蝝蝞蝟蝠蝡蝢蝣蝤蝥蝦蝧蝨蝩蝪蝫蝬蝭蝮蝯蝰蝱蝲蝳蝴蝵蝶蝷蝸蝹蝺蝻蝼蝽蝾蝿螀螁螂螃螄螅螆螇螈螉螊螋螌融螎螏螐螑螒螓螔螕螖螗螘螙螚螛螜螝螞螟螠螡螢螣螤螥螦螧螨螩螪螫螬螭螮螯螰螱螲螳螴螵螶螷螸螹螺螻螼螽螾螿蟀蟁蟂蟃蟄蟅蟆蟇蟈蟉蟊蟋蟌蟍蟎蟏蟐蟑蟒蟓蟔蟕蟖蟗蟘蟙蟚蟛蟜蟝蟞蟟蟠蟡蟢蟣蟤蟥蟦蟧蟨蟩蟪蟫蟬蟭蟮蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸蟹蟺蟻蟼蟽蟾蟿蠀蠁蠂蠃蠄蠅蠆蠇蠈蠉蠊蠋蠌蠍蠎蠏蠐蠑蠒蠓蠔蠕蠖蠗蠘蠙蠚蠛蠜蠝蠞蠟蠠蠡","蠢蠣蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠲蠳蠴蠵蠶蠷蠸蠹蠺蠻蠼蠽蠾蠿血衁衂衃衄衅衆衇衈衉衊衋行衍衎衏衐衑衒術衔衕衖街衘衙衚衛衜衝衞衟衠衡衢衣衤补衦衧表衩衪衫衬衭衮衯衰衱衲衳衴衵衶衷衸衹衺衻衼衽衾衿袀袁袂袃袄袅袆袇袈袉袊袋袌袍袎袏袐袑袒袓袔袕袖袗袘袙袚袛袜袝袞袟袠袡袢袣袤袥袦袧袨袩袪被袬袭袮袯袰袱袲袳袴袵袶袷袸袹袺袻袼袽袾袿裀裁裂裃裄装裆裇裈裉裊裋裌裍裎裏裐裑裒裓裔裕裖裗裘裙裚裛補裝裞裟裠裡裢裣裤裥裦裧裨裩裪裫裬裭裮裯裰裱裲裳裴裵裶裷裸裹裺裻裼製裾裿褀褁褂褃褄褅褆複褈褉褊褋褌褍褎褏褐褑褒褓褔褕褖褗褘褙褚褛褜褝褞褟褠褡","褢褣褤褥褦褧褨褩褪褫褬褭褮褯褰褱褲褳褴褵褶褷褸褹褺褻褼褽褾褿襀襁襂襃襄襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襞襟襠襡襢襣襤襥襦襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襻襼襽襾西覀要覂覃覄覅覆覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀见观觃规觅视觇览觉觊觋觌觍觎觏觐觑角觓觔觕觖觗觘觙觚觛觜觝觞觟觠觡觢解觤觥触觧觨觩觪觫觬觭觮觯觰觱觲觳觴觵觶觷觸觹觺觻觼觽觾觿言訁訂訃訄訅訆訇計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝訞訟訠訡","訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訾訿詀詁詂詃詄詅詆詇詈詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詹詺詻詼詽詾詿誀誁誂誃誄誅誆誇誈誉誊誋誌認誎誏誐誑誒誓誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謇謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡","謢謣謤謥謦謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥警譧譨譩譪譫譬譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讠计订讣认讥讦讧讨让讪讫讬训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谉谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡","谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷谸谹谺谻谼谽谾谿豀豁豂豃豄豅豆豇豈豉豊豋豌豍豎豏豐豑豒豓豔豕豖豗豘豙豚豛豜豝豞豟豠象豢豣豤豥豦豧豨豩豪豫豬豭豮豯豰豱豲豳豴豵豶豷豸豹豺豻豼豽豾豿貀貁貂貃貄貅貆貇貈貉貊貋貌貍貎貏貐貑貒貓貔貕貖貗貘貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贝贞负贠贡","财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赤赥赦赧赨赩赪赫赬赭赮赯走赱赲赳赴赵赶起赸赹赺赻赼赽赾赿趀趁趂趃趄超趆趇趈趉越趋趌趍趎趏趐趑趒趓趔趕趖趗趘趙趚趛趜趝趞趟趠趡趢趣趤趥趦趧趨趩趪趫趬趭趮趯趰趱趲足趴趵趶趷趸趹趺趻趼趽趾趿跀跁跂跃跄跅跆跇跈跉跊跋跌跍跎跏跐跑跒跓跔跕跖跗跘跙跚跛跜距跞跟跠跡跢跣跤跥跦跧跨跩跪跫跬跭跮路跰跱跲跳跴践跶跷跸跹跺跻跼跽跾跿踀踁踂踃踄踅踆踇踈踉踊踋踌踍踎踏踐踑踒踓踔踕踖踗踘踙踚踛踜踝踞踟踠踡","踢踣踤踥踦踧踨踩踪踫踬踭踮踯踰踱踲踳踴踵踶踷踸踹踺踻踼踽踾踿蹀蹁蹂蹃蹄蹅蹆蹇蹈蹉蹊蹋蹌蹍蹎蹏蹐蹑蹒蹓蹔蹕蹖蹗蹘蹙蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹦蹧蹨蹩蹪蹫蹬蹭蹮蹯蹰蹱蹲蹳蹴蹵蹶蹷蹸蹹蹺蹻蹼蹽蹾蹿躀躁躂躃躄躅躆躇躈躉躊躋躌躍躎躏躐躑躒躓躔躕躖躗躘躙躚躛躜躝躞躟躠躡躢躣躤躥躦躧躨躩躪身躬躭躮躯躰躱躲躳躴躵躶躷躸躹躺躻躼躽躾躿軀軁軂軃軄軅軆軇軈軉車軋軌軍軎軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡","輢輣輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辛辜辝辞辟辠辡辢辣辤辥辦辧辨辩辪辫辬辭辮辯辰辱農辳辴辵辶辷辸边辺辻込辽达辿迀迁迂迃迄迅迆过迈迉迊迋迌迍迎迏运近迒迓返迕迖迗还这迚进远违连迟迠迡迢迣迤迥迦迧迨迩迪迫迬迭迮迯述迱迲迳迴迵迶迷迸迹迺迻迼追迾迿退送适逃逄逅逆逇逈选逊逋逌逍逎透逐逑递逓途逕逖逗逘這通逛逜逝逞速造逡","逢連逤逥逦逧逨逩逪逫逬逭逮逯逰週進逳逴逵逶逷逸逹逺逻逼逽逾逿遀遁遂遃遄遅遆遇遈遉遊運遌遍過遏遐遑遒道達違遖遗遘遙遚遛遜遝遞遟遠遡遢遣遤遥遦遧遨適遪遫遬遭遮遯遰遱遲遳遴遵遶遷選遹遺遻遼遽遾避邀邁邂邃還邅邆邇邈邉邊邋邌邍邎邏邐邑邒邓邔邕邖邗邘邙邚邛邜邝邞邟邠邡邢那邤邥邦邧邨邩邪邫邬邭邮邯邰邱邲邳邴邵邶邷邸邹邺邻邼邽邾邿郀郁郂郃郄郅郆郇郈郉郊郋郌郍郎郏郐郑郒郓郔郕郖郗郘郙郚郛郜郝郞郟郠郡郢郣郤郥郦郧部郩郪郫郬郭郮郯郰郱郲郳郴郵郶郷郸郹郺郻郼都郾郿鄀鄁鄂鄃鄄鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄙鄚鄛鄜鄝鄞鄟鄠鄡","鄢鄣鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄯鄰鄱鄲鄳鄴鄵鄶鄷鄸鄹鄺鄻鄼鄽鄾鄿酀酁酂酃酄酅酆酇酈酉酊酋酌配酎酏酐酑酒酓酔酕酖酗酘酙酚酛酜酝酞酟酠酡酢酣酤酥酦酧酨酩酪酫酬酭酮酯酰酱酲酳酴酵酶酷酸酹酺酻酼酽酾酿醀醁醂醃醄醅醆醇醈醉醊醋醌醍醎醏醐醑醒醓醔醕醖醗醘醙醚醛醜醝醞醟醠醡醢醣醤醥醦醧醨醩醪醫醬醭醮醯醰醱醲醳醴醵醶醷醸醹醺醻醼醽醾醿釀釁釂釃釄釅釆采釈釉释釋里重野量釐金釒釓釔釕釖釗釘釙釚釛釜針釞釟釠釡釢釣釤釥釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡","鈢鈣鈤鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉴鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅銆銇銈銉銊銋銌銍銎銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧銨銩銪銫銬銭銮銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋈鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡","錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錾錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍪鍫鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎏鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏊鏋鏌鏍鏎鏏鏐鏑鏒鏓鏔鏕鏖鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡","鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐾鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑫鑬鑭鑮鑯鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钅钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钜钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铇铈铉铊铋铌铍铎铏铐铑铒铓铔铕铖铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铩铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗锘错锚锛锜锝锞锟锠锡","锢锣锤锥锦锧锨锩锪锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镄镅镆镇镈镉镊镋镌镍镎镏镐镑镒镓镔镕镖镗镘镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镵镶長镸镹镺镻镼镽镾长門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛阜阝阞队阠阡","阢阣阤阥阦阧阨阩阪阫阬阭阮阯阰阱防阳阴阵阶阷阸阹阺阻阼阽阾阿陀陁陂陃附际陆陇陈陉陊陋陌降陎陏限陑陒陓陔陕陖陗陘陙陚陛陜陝陞陟陠陡院陣除陥陦陧陨险陪陫陬陭陮陯陰陱陲陳陴陵陶陷陸陹険陻陼陽陾陿隀隁隂隃隄隅隆隇隈隉隊隋隌隍階随隐隑隒隓隔隕隖隗隘隙隚際障隝隞隟隠隡隢隣隤隥隦隧隨隩險隫隬隭隮隯隰隱隲隳隴隵隶隷隸隹隺隻隼隽难隿雀雁雂雃雄雅集雇雈雉雊雋雌雍雎雏雐雑雒雓雔雕雖雗雘雙雚雛雜雝雞雟雠雡離難雤雥雦雧雨雩雪雫雬雭雮雯雰雱雲雳雴雵零雷雸雹雺電雼雽雾雿需霁霂霃霄霅霆震霈霉霊霋霌霍霎霏霐霑霒霓霔霕霖霗霘霙霚霛霜霝霞霟霠霡","霢霣霤霥霦霧霨霩霪霫霬霭霮霯霰霱露霳霴霵霶霷霸霹霺霻霼霽霾霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑青靓靔靕靖靗靘静靚靛靜靝非靟靠靡面靣靤靥靦靧靨革靪靫靬靭靮靯靰靱靲靳靴靵靶靷靸靹靺靻靼靽靾靿鞀鞁鞂鞃鞄鞅鞆鞇鞈鞉鞊鞋鞌鞍鞎鞏鞐鞑鞒鞓鞔鞕鞖鞗鞘鞙鞚鞛鞜鞝鞞鞟鞠鞡鞢鞣鞤鞥鞦鞧鞨鞩鞪鞫鞬鞭鞮鞯鞰鞱鞲鞳鞴鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣韤韥韦韧韨韩韪韫韬韭韮韯韰韱韲音韴韵韶韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡","頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮顯顰顱顲顳顴页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍风飏飐飑飒飓飔飕飖飗飘飙飚飛飜飝飞食飠飡飢飣飤飥飦飧飨飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇餈餉養餋餌餍餎餏餐餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡","餢餣餤餥餦餧館餩餪餫餬餭餮餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉饊饋饌饍饎饏饐饑饒饓饔饕饖饗饘饙饚饛饜饝饞饟饠饡饢饣饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕首馗馘香馚馛馜馝馞馟馠馡馢馣馤馥馦馧馨馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡","騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧骨骩骪骫骬骭骮骯骰骱骲骳骴骵骶骷骸骹骺骻骼骽骾骿髀髁髂髃髄髅髆髇髈髉髊髋髌髍髎髏髐髑髒髓體髕髖髗高髙髚髛髜髝髞髟髠髡髢髣髤髥髦髧髨髩髪髫髬髭髮髯髰髱髲髳髴髵髶髷髸髹髺髻髼髽髾髿鬀鬁鬂鬃鬄鬅鬆鬇鬈鬉鬊鬋鬌鬍鬎鬏鬐鬑鬒鬓鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬟鬠鬡","鬢鬣鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬯鬰鬱鬲鬳鬴鬵鬶鬷鬸鬹鬺鬻鬼鬽鬾鬿魀魁魂魃魄魅魆魇魈魉魊魋魌魍魎魏魐魑魒魓魔魕魖魗魘魙魚魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚鰛鰜鰝鰞鰟鰠鰡","鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺鱻鱼鱽鱾鱿鲀鲁鲂鲃鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳚鳛鳜鳝鳞鳟鳠鳡鳢鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡","鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸟鸠鸡","鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹙鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹮鹯鹰鹱鹲鹳鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽鹾鹿麀麁麂麃麄麅麆麇麈麉麊麋麌麍麎麏麐麑麒麓麔麕麖麗麘麙麚麛麜麝麞麟麠麡麢麣麤麥麦麧麨麩麪麫麬麭麮麯麰麱麲麳麴麵麶麷麸麹麺麻麼麽麾麿黀黁黂黃黄黅黆黇黈黉黊黋黌黍黎黏黐黑黒黓黔黕黖黗默黙黚黛黜黝點黟黠黡黢黣黤黥黦黧黨黩黪黫黬黭黮黯黰黱黲黳黴黵黶黷黸黹黺黻黼黽黾黿鼀鼁鼂鼃鼄鼅鼆鼇鼈鼉鼊鼋鼌鼍鼎鼏鼐鼑鼒鼓鼔鼕鼖鼗鼘鼙鼚鼛鼜鼝鼞鼟鼠鼡","鼢鼣鼤鼥鼦鼧鼨鼩鼪鼫鼬鼭鼮鼯鼰鼱鼲鼳鼴鼵鼶鼷鼸鼹鼺鼻鼼鼽鼾鼿齀齁齂齃齄齅齆齇齈齉齊齋齌齍齎齏齐齑齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸齹齺齻齼齽齾齿龀龁龂龃龄龅龆龇龈龉龊龋龌龍龎龏龐龑龒龓龔龕龖龗龘龙龚龛龜龝龞龟龠龡龢龣龤龥龦龧龨龩龪龫龬龭龮龯龰龱龲龳龴龵龶龷龸龹龺龻龼龽龾龿鿀鿁鿂鿃鿄鿅鿆鿇鿈鿉鿊鿋鿌鿍鿎鿏鿐鿑鿒鿓鿔鿕鿖鿗鿘鿙鿚鿛鿜鿝鿞鿟鿠鿡鿢鿣鿤鿥鿦鿧鿨鿩鿪鿫鿬鿭鿮鿯鿰鿱鿲鿳鿴鿵鿶鿷鿸鿹鿺鿻鿼鿽鿾鿿ꀀꀁꀂꀃꀄꀅꀆꀇꀈꀉꀊꀋꀌꀍꀎꀏꀐꀑꀒꀓꀔꀕꀖꀗꀘꀙꀚꀛꀜꀝꀞꀟꀠꀡ","ꀢꀣꀤꀥꀦꀧꀨꀩꀪꀫꀬꀭꀮꀯꀰꀱꀲꀳꀴꀵꀶꀷꀸꀹꀺꀻꀼꀽꀾꀿꁀꁁꁂꁃꁄꁅꁆꁇꁈꁉꁊꁋꁌꁍꁎꁏꁐꁑꁒꁓꁔꁕꁖꁗꁘꁙꁚꁛꁜꁝꁞꁟꁠꁡꁢꁣꁤꁥꁦꁧꁨꁩꁪꁫꁬꁭꁮꁯꁰꁱꁲꁳꁴꁵꁶꁷꁸꁹꁺꁻꁼꁽꁾꁿꂀꂁꂂꂃꂄꂅꂆꂇꂈꂉꂊꂋꂌꂍꂎꂏꂐꂑꂒꂓꂔꂕꂖꂗꂘꂙꂚꂛꂜꂝꂞꂟꂠꂡꂢꂣꂤꂥꂦꂧꂨꂩꂪꂫꂬꂭꂮꂯꂰꂱꂲꂳꂴꂵꂶꂷꂸꂹꂺꂻꂼꂽꂾꂿꃀꃁꃂꃃꃄꃅꃆꃇꃈꃉꃊꃋꃌꃍꃎꃏꃐꃑꃒꃓꃔꃕꃖꃗꃘꃙꃚꃛꃜꃝꃞꃟꃠꃡꃢꃣꃤꃥꃦꃧꃨꃩꃪꃫꃬꃭꃮꃯꃰꃱꃲꃳꃴꃵꃶꃷꃸꃹꃺꃻꃼꃽꃾꃿꄀꄁꄂꄃꄄꄅꄆꄇꄈꄉꄊꄋꄌꄍꄎꄏꄐꄑꄒꄓꄔꄕꄖꄗꄘꄙꄚꄛꄜꄝꄞꄟꄠꄡ","ꄢꄣꄤꄥꄦꄧꄨꄩꄪꄫꄬꄭꄮꄯꄰꄱꄲꄳꄴꄵꄶꄷꄸꄹꄺꄻꄼꄽꄾꄿꅀꅁꅂꅃꅄꅅꅆꅇꅈꅉꅊꅋꅌꅍꅎꅏꅐꅑꅒꅓꅔꅕꅖꅗꅘꅙꅚꅛꅜꅝꅞꅟꅠꅡꅢꅣꅤꅥꅦꅧꅨꅩꅪꅫꅬꅭꅮꅯꅰꅱꅲꅳꅴꅵꅶꅷꅸꅹꅺꅻꅼꅽꅾꅿꆀꆁꆂꆃꆄꆅꆆꆇꆈꆉꆊꆋꆌꆍꆎꆏꆐꆑꆒꆓꆔꆕꆖꆗꆘꆙꆚꆛꆜꆝꆞꆟꆠꆡꆢꆣꆤꆥꆦꆧꆨꆩꆪꆫꆬꆭꆮꆯꆰꆱꆲꆳꆴꆵꆶꆷꆸꆹꆺꆻꆼꆽꆾꆿꇀꇁꇂꇃꇄꇅꇆꇇꇈꇉꇊꇋꇌꇍꇎꇏꇐꇑꇒꇓꇔꇕꇖꇗꇘꇙꇚꇛꇜꇝꇞꇟꇠꇡꇢꇣꇤꇥꇦꇧꇨꇩꇪꇫꇬꇭꇮꇯꇰꇱꇲꇳꇴꇵꇶꇷꇸꇹꇺꇻꇼꇽꇾꇿꈀꈁꈂꈃꈄꈅꈆꈇꈈꈉꈊꈋꈌꈍꈎꈏꈐꈑꈒꈓꈔꈕꈖꈗꈘꈙꈚꈛꈜꈝꈞꈟꈠꈡ","ꈢꈣꈤꈥꈦꈧꈨꈩꈪꈫꈬꈭꈮꈯꈰꈱꈲꈳꈴꈵꈶꈷꈸꈹꈺꈻꈼꈽꈾꈿꉀꉁꉂꉃꉄꉅꉆꉇꉈꉉꉊꉋꉌꉍꉎꉏꉐꉑꉒꉓꉔꉕꉖꉗꉘꉙꉚꉛꉜꉝꉞꉟꉠꉡꉢꉣꉤꉥꉦꉧꉨꉩꉪꉫꉬꉭꉮꉯꉰꉱꉲꉳꉴꉵꉶꉷꉸꉹꉺꉻꉼꉽꉾꉿꊀꊁꊂꊃꊄꊅꊆꊇꊈꊉꊊꊋꊌꊍꊎꊏꊐꊑꊒꊓꊔꊕꊖꊗꊘꊙꊚꊛꊜꊝꊞꊟꊠꊡꊢꊣꊤꊥꊦꊧꊨꊩꊪꊫꊬꊭꊮꊯꊰꊱꊲꊳꊴꊵꊶꊷꊸꊹꊺꊻꊼꊽꊾꊿꋀꋁꋂꋃꋄꋅꋆꋇꋈꋉꋊꋋꋌꋍꋎꋏꋐꋑꋒꋓꋔꋕꋖꋗꋘꋙꋚꋛꋜꋝꋞꋟꋠꋡꋢꋣꋤꋥꋦꋧꋨꋩꋪꋫꋬꋭꋮꋯꋰꋱꋲꋳꋴꋵꋶꋷꋸꋹꋺꋻꋼꋽꋾꋿꌀꌁꌂꌃꌄꌅꌆꌇꌈꌉꌊꌋꌌꌍꌎꌏꌐꌑꌒꌓꌔꌕꌖꌗꌘꌙꌚꌛꌜꌝꌞꌟꌠꌡ","ꌢꌣꌤꌥꌦꌧꌨꌩꌪꌫꌬꌭꌮꌯꌰꌱꌲꌳꌴꌵꌶꌷꌸꌹꌺꌻꌼꌽꌾꌿꍀꍁꍂꍃꍄꍅꍆꍇꍈꍉꍊꍋꍌꍍꍎꍏꍐꍑꍒꍓꍔꍕꍖꍗꍘꍙꍚꍛꍜꍝꍞꍟꍠꍡꍢꍣꍤꍥꍦꍧꍨꍩꍪꍫꍬꍭꍮꍯꍰꍱꍲꍳꍴꍵꍶꍷꍸꍹꍺꍻꍼꍽꍾꍿꎀꎁꎂꎃꎄꎅꎆꎇꎈꎉꎊꎋꎌꎍꎎꎏꎐꎑꎒꎓꎔꎕꎖꎗꎘꎙꎚꎛꎜꎝꎞꎟꎠꎡꎢꎣꎤꎥꎦꎧꎨꎩꎪꎫꎬꎭꎮꎯꎰꎱꎲꎳꎴꎵꎶꎷꎸꎹꎺꎻꎼꎽꎾꎿꏀꏁꏂꏃꏄꏅꏆꏇꏈꏉꏊꏋꏌꏍꏎꏏꏐꏑꏒꏓꏔꏕꏖꏗꏘꏙꏚꏛꏜꏝꏞꏟꏠꏡꏢꏣꏤꏥꏦꏧꏨꏩꏪꏫꏬꏭꏮꏯꏰꏱꏲꏳꏴꏵꏶꏷꏸꏹꏺꏻꏼꏽꏾꏿꐀꐁꐂꐃꐄꐅꐆꐇꐈꐉꐊꐋꐌꐍꐎꐏꐐꐑꐒꐓꐔꐕꐖꐗꐘꐙꐚꐛꐜꐝꐞꐟꐠꐡ","ꐢꐣꐤꐥꐦꐧꐨꐩꐪꐫꐬꐭꐮꐯꐰꐱꐲꐳꐴꐵꐶꐷꐸꐹꐺꐻꐼꐽꐾꐿꑀꑁꑂꑃꑄꑅꑆꑇꑈꑉꑊꑋꑌꑍꑎꑏꑐꑑꑒꑓꑔꑕꑖꑗꑘꑙꑚꑛꑜꑝꑞꑟꑠꑡꑢꑣꑤꑥꑦꑧꑨꑩꑪꑫꑬꑭꑮꑯꑰꑱꑲꑳꑴꑵꑶꑷꑸꑹꑺꑻꑼꑽꑾꑿꒀꒁꒂꒃꒄꒅꒆꒇꒈꒉꒊꒋꒌ꒍꒎꒏꒐꒑꒒꒓꒔꒕꒖꒗꒘꒙꒚꒛꒜꒝꒞꒟꒠꒡꒢꒣꒤꒥꒦꒧꒨꒩꒪꒫꒬꒭꒮꒯꒰꒱꒲꒳꒴꒵꒶꒷꒸꒹꒺꒻꒼꒽꒾꒿꓀꓁꓂꓃꓄꓅꓆꓇꓈꓉꓊꓋꓌꓍꓎꓏ꓐꓑꓒꓓꓔꓕꓖꓗꓘꓙꓚꓛꓜꓝꓞꓟꓠꓡꓢꓣꓤꓥꓦꓧꓨꓩꓪꓫꓬꓭꓮꓯꓰꓱꓲꓳꓴꓵꓶꓷꓸꓹꓺꓻꓼꓽ꓾꓿ꔀꔁꔂꔃꔄꔅꔆꔇꔈꔉꔊꔋꔌꔍꔎꔏꔐꔑꔒꔓꔔꔕꔖꔗꔘꔙꔚꔛꔜꔝꔞꔟꔠꔡ","ꔢꔣꔤꔥꔦꔧꔨꔩꔪꔫꔬꔭꔮꔯꔰꔱꔲꔳꔴꔵꔶꔷꔸꔹꔺꔻꔼꔽꔾꔿꕀꕁꕂꕃꕄꕅꕆꕇꕈꕉꕊꕋꕌꕍꕎꕏꕐꕑꕒꕓꕔꕕꕖꕗꕘꕙꕚꕛꕜꕝꕞꕟꕠꕡꕢꕣꕤꕥꕦꕧꕨꕩꕪꕫꕬꕭꕮꕯꕰꕱꕲꕳꕴꕵꕶꕷꕸꕹꕺꕻꕼꕽꕾꕿꖀꖁꖂꖃꖄꖅꖆꖇꖈꖉꖊꖋꖌꖍꖎꖏꖐꖑꖒꖓꖔꖕꖖꖗꖘꖙꖚꖛꖜꖝꖞꖟꖠꖡꖢꖣꖤꖥꖦꖧꖨꖩꖪꖫꖬꖭꖮꖯꖰꖱꖲꖳꖴꖵꖶꖷꖸꖹꖺꖻꖼꖽꖾꖿꗀꗁꗂꗃꗄꗅꗆꗇꗈꗉꗊꗋꗌꗍꗎꗏꗐꗑꗒꗓꗔꗕꗖꗗꗘꗙꗚꗛꗜꗝꗞꗟꗠꗡꗢꗣꗤꗥꗦꗧꗨꗩꗪꗫꗬꗭꗮꗯꗰꗱꗲꗳꗴꗵꗶꗷꗸꗹꗺꗻꗼꗽꗾꗿꘀꘁꘂꘃꘄꘅꘆꘇꘈꘉꘊꘋꘌ꘍꘎꘏ꘐꘑꘒꘓꘔꘕꘖꘗꘘꘙꘚꘛꘜꘝꘞꘟ꘠꘡","꘢꘣꘤꘥꘦꘧꘨꘩ꘪꘫ꘬꘭꘮꘯꘰꘱꘲꘳꘴꘵꘶꘷꘸꘹꘺꘻꘼꘽꘾꘿ꙀꙁꙂꙃꙄꙅꙆꙇꙈꙉꙊꙋꙌꙍꙎꙏꙐꙑꙒꙓꙔꙕꙖꙗꙘꙙꙚꙛꙜꙝꙞꙟꙠꙡꙢꙣꙤꙥꙦꙧꙨꙩꙪꙫꙬꙭꙮ꙯꙰꙱꙲꙳ꙴꙵꙶꙷꙸꙹꙺꙻ꙼꙽꙾ꙿꚀꚁꚂꚃꚄꚅꚆꚇꚈꚉꚊꚋꚌꚍꚎꚏꚐꚑꚒꚓꚔꚕꚖꚗꚘꚙꚚꚛꚜꚝꚞꚟꚠꚡꚢꚣꚤꚥꚦꚧꚨꚩꚪꚫꚬꚭꚮꚯꚰꚱꚲꚳꚴꚵꚶꚷꚸꚹꚺꚻꚼꚽꚾꚿꛀꛁꛂꛃꛄꛅꛆꛇꛈꛉꛊꛋꛌꛍꛎꛏꛐꛑꛒꛓꛔꛕꛖꛗꛘꛙꛚꛛꛜꛝꛞꛟꛠꛡꛢꛣꛤꛥꛦꛧꛨꛩꛪꛫꛬꛭꛮꛯ꛰꛱꛲꛳꛴꛵꛶꛷꛸꛹꛺꛻꛼꛽꛾꛿꜀꜁꜂꜃꜄꜅꜆꜇꜈꜉꜊꜋꜌꜍꜎꜏꜐꜑꜒꜓꜔꜕꜖ꜗꜘꜙꜚꜛꜜꜝꜞꜟ꜠꜡","ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿꝀꝁꝂꝃꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿꞀꞁꞂꞃꞄꞅꞆꞇꞈ꞉꞊ꞋꞌꞍꞎꞏꞐꞑꞒꞓꞔꞕꞖꞗꞘꞙꞚꞛꞜꞝꞞꞟꞠꞡꞢꞣꞤꞥꞦꞧꞨꞩꞪꞫꞬꞭꞮꞯꞰꞱꞲꞳꞴꞵꞶꞷꞸꞹꞺꞻꞼꞽꞾꞿꟀꟁꟂꟃꟄꟅꟆꟇꟈꟉꟊꟋꟌꟍ꟎꟏Ꟑꟑ꟒ꟓ꟔ꟕꟖꟗꟘꟙꟚꟛꟜ꟝꟞꟟꟠꟡꟢꟣꟤꟥꟦꟧꟨꟩꟪꟫꟬꟭꟮꟯꟰꟱ꟲꟳꟴꟵꟶꟷꟸꟹꟺꟻꟼꟽꟾꟿꠀꠁꠂꠃꠄꠅ꠆ꠇꠈꠉꠊꠋꠌꠍꠎꠏꠐꠑꠒꠓꠔꠕꠖꠗꠘꠙꠚꠛꠜꠝꠞꠟꠠꠡ","ꠢꠣꠤꠥꠦꠧ꠨꠩꠪꠫꠬꠭꠮꠯꠰꠱꠲꠳꠴꠵꠶꠷꠸꠹꠺꠻꠼꠽꠾꠿ꡀꡁꡂꡃꡄꡅꡆꡇꡈꡉꡊꡋꡌꡍꡎꡏꡐꡑꡒꡓꡔꡕꡖꡗꡘꡙꡚꡛꡜꡝꡞꡟꡠꡡꡢꡣꡤꡥꡦꡧꡨꡩꡪꡫꡬꡭꡮꡯꡰꡱꡲꡳ꡴꡵꡶꡷꡸꡹꡺꡻꡼꡽꡾꡿ꢀꢁꢂꢃꢄꢅꢆꢇꢈꢉꢊꢋꢌꢍꢎꢏꢐꢑꢒꢓꢔꢕꢖꢗꢘꢙꢚꢛꢜꢝꢞꢟꢠꢡꢢꢣꢤꢥꢦꢧꢨꢩꢪꢫꢬꢭꢮꢯꢰꢱꢲꢳꢴꢵꢶꢷꢸꢹꢺꢻꢼꢽꢾꢿꣀꣁꣂꣃ꣄ꣅ꣆꣇꣈꣉꣊꣋꣌꣍꣎꣏꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꣚꣛꣜꣝꣞꣟꣠꣡꣢꣣꣤꣥꣦꣧꣨꣩꣪꣫꣬꣭꣮꣯꣰꣱ꣲꣳꣴꣵꣶꣷ꣸꣹꣺ꣻ꣼ꣽꣾꣿ꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉ꤊꤋꤌꤍꤎꤏꤐꤑꤒꤓꤔꤕꤖꤗꤘꤙꤚꤛꤜꤝꤞꤟꤠꤡ","ꤢꤣꤤꤥꤦꤧꤨꤩꤪ꤫꤬꤭꤮꤯ꤰꤱꤲꤳꤴꤵꤶꤷꤸꤹꤺꤻꤼꤽꤾꤿꥀꥁꥂꥃꥄꥅꥆꥇꥈꥉꥊꥋꥌꥍꥎꥏꥐꥑꥒ꥓꥔꥕꥖꥗꥘꥙꥚꥛꥜꥝꥞꥟ꥠꥡꥢꥣꥤꥥꥦꥧꥨꥩꥪꥫꥬꥭꥮꥯꥰꥱꥲꥳꥴꥵꥶꥷꥸꥹꥺꥻꥼ꥽꥾꥿ꦀꦁꦂꦃꦄꦅꦆꦇꦈꦉꦊꦋꦌꦍꦎꦏꦐꦑꦒꦓꦔꦕꦖꦗꦘꦙꦚꦛꦜꦝꦞꦟꦠꦡꦢꦣꦤꦥꦦꦧꦨꦩꦪꦫꦬꦭꦮꦯꦰꦱꦲ꦳ꦴꦵꦶꦷꦸꦹꦺꦻꦼꦽꦾꦿ꧀꧁꧂꧃꧄꧅꧆꧇꧈꧉꧊꧋꧌꧍꧎ꧏ꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙꧚꧛꧜꧝꧞꧟ꧠꧡꧢꧣꧤꧥꧦꧧꧨꧩꧪꧫꧬꧭꧮꧯ꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹ꧺꧻꧼꧽꧾ꧿ꨀꨁꨂꨃꨄꨅꨆꨇꨈꨉꨊꨋꨌꨍꨎꨏꨐꨑꨒꨓꨔꨕꨖꨗꨘꨙꨚꨛꨜꨝꨞꨟꨠꨡ","ꨢꨣꨤꨥꨦꨧꨨꨩꨪꨫꨬꨭꨮꨯꨰꨱꨲꨳꨴꨵꨶ꨷꨸꨹꨺꨻꨼꨽꨾꨿ꩀꩁꩂꩃꩄꩅꩆꩇꩈꩉꩊꩋꩌꩍ꩎꩏꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙꩚꩛꩜꩝꩞꩟ꩠꩡꩢꩣꩤꩥꩦꩧꩨꩩꩪꩫꩬꩭꩮꩯꩰꩱꩲꩳꩴꩵꩶ꩷꩸꩹ꩺꩻꩼꩽꩾꩿꪀꪁꪂꪃꪄꪅꪆꪇꪈꪉꪊꪋꪌꪍꪎꪏꪐꪑꪒꪓꪔꪕꪖꪗꪘꪙꪚꪛꪜꪝꪞꪟꪠꪡꪢꪣꪤꪥꪦꪧꪨꪩꪪꪫꪬꪭꪮꪯꪰꪱꪴꪲꪳꪵꪶꪷꪸꪹꪺꪻꪼꪽꪾ꪿ꫀ꫁ꫂ꫃꫄꫅꫆꫇꫈꫉꫊꫋꫌꫍꫎꫏꫐꫑꫒꫓꫔꫕꫖꫗꫘꫙꫚ꫛꫜꫝ꫞꫟ꫠꫡꫢꫣꫤꫥꫦꫧꫨꫩꫪꫫꫬꫭꫮꫯ꫰꫱ꫲꫳꫴꫵ꫶꫷꫸꫹꫺꫻꫼꫽꫾꫿꬀ꬁꬂꬃꬄꬅꬆ꬇꬈ꬉꬊꬋꬌꬍꬎ꬏꬐ꬑꬒꬓꬔꬕꬖ꬗꬘꬙꬚꬛꬜꬝꬞꬟ꬠꬡ","ꬢꬣꬤꬥꬦ꬧ꬨꬩꬪꬫꬬꬭꬮ꬯ꬰꬱꬲꬳꬴꬵꬶꬷꬸꬹꬺꬻꬼꬽꬾꬿꭀꭁꭂꭃꭄꭅꭆꭇꭈꭉꭊꭋꭌꭍꭎꭏꭐꭑꭒꭓꭔꭕꭖꭗꭘꭙꭚ꭛ꭜꭝꭞꭟꭠꭡꭢꭣꭤꭥꭦꭧꭨꭩ꭪꭫꭬꭭꭮꭯ꭰꭱꭲꭳꭴꭵꭶꭷꭸꭹꭺꭻꭼꭽꭾꭿꮀꮁꮂꮃꮄꮅꮆꮇꮈꮉꮊꮋꮌꮍꮎꮏꮐꮑꮒꮓꮔꮕꮖꮗꮘꮙꮚꮛꮜꮝꮞꮟꮠꮡꮢꮣꮤꮥꮦꮧꮨꮩꮪꮫꮬꮭꮮꮯꮰꮱꮲꮳꮴꮵꮶꮷꮸꮹꮺꮻꮼꮽꮾꮿꯀꯁꯂꯃꯄꯅꯆꯇꯈꯉꯊꯋꯌꯍꯎꯏꯐꯑꯒꯓꯔꯕꯖꯗꯘꯙꯚꯛꯜꯝꯞꯟꯠꯡꯢꯣꯤꯥꯦꯧꯨꯩꯪ꯫꯬꯭꯮꯯꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹꯺꯻꯼꯽꯾꯿가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛개객갞갟갠갡","갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓걔걕걖걗걘걙걚걛걜걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯거걱걲걳건걵걶걷걸걹걺걻걼걽걾걿검겁겂것겄겅겆겇겈겉겊겋게겍겎겏겐겑겒겓겔겕겖겗겘겙겚겛겜겝겞겟겠겡겢겣겤겥겦겧겨격겪겫견겭겮겯결겱겲겳겴겵겶겷겸겹겺겻겼경겾겿곀곁곂곃계곅곆곇곈곉곊곋곌곍곎곏곐곑곒곓곔곕곖곗곘곙곚곛곜곝곞곟고곡곢곣곤곥곦곧골곩곪곫곬곭곮곯곰곱곲곳곴공곶곷곸곹곺곻과곽곾곿관괁괂괃괄괅괆괇괈괉괊괋괌괍괎괏괐광괒괓괔괕괖괗괘괙괚괛괜괝괞괟괠괡","괢괣괤괥괦괧괨괩괪괫괬괭괮괯괰괱괲괳괴괵괶괷괸괹괺괻괼괽괾괿굀굁굂굃굄굅굆굇굈굉굊굋굌굍굎굏교굑굒굓굔굕굖굗굘굙굚굛굜굝굞굟굠굡굢굣굤굥굦굧굨굩굪굫구국굮굯군굱굲굳굴굵굶굷굸굹굺굻굼굽굾굿궀궁궂궃궄궅궆궇궈궉궊궋권궍궎궏궐궑궒궓궔궕궖궗궘궙궚궛궜궝궞궟궠궡궢궣궤궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궷궸궹궺궻궼궽궾궿귀귁귂귃귄귅귆귇귈귉귊귋귌귍귎귏귐귑귒귓귔귕귖귗귘귙귚귛규귝귞귟균귡귢귣귤귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷그극귺귻근귽귾귿글긁긂긃긄긅긆긇금급긊긋긌긍긎긏긐긑긒긓긔긕긖긗긘긙긚긛긜긝긞긟긠긡","긢긣긤긥긦긧긨긩긪긫긬긭긮긯기긱긲긳긴긵긶긷길긹긺긻긼긽긾긿김깁깂깃깄깅깆깇깈깉깊깋까깍깎깏깐깑깒깓깔깕깖깗깘깙깚깛깜깝깞깟깠깡깢깣깤깥깦깧깨깩깪깫깬깭깮깯깰깱깲깳깴깵깶깷깸깹깺깻깼깽깾깿꺀꺁꺂꺃꺄꺅꺆꺇꺈꺉꺊꺋꺌꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺼꺽꺾꺿껀껁껂껃껄껅껆껇껈껉껊껋껌껍껎껏껐껑껒껓껔껕껖껗께껙껚껛껜껝껞껟껠껡껢껣껤껥껦껧껨껩껪껫껬껭껮껯껰껱껲껳껴껵껶껷껸껹껺껻껼껽껾껿꼀꼁꼂꼃꼄꼅꼆꼇꼈꼉꼊꼋꼌꼍꼎꼏꼐꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡","꼢꼣꼤꼥꼦꼧꼨꼩꼪꼫꼬꼭꼮꼯꼰꼱꼲꼳꼴꼵꼶꼷꼸꼹꼺꼻꼼꼽꼾꼿꽀꽁꽂꽃꽄꽅꽆꽇꽈꽉꽊꽋꽌꽍꽎꽏꽐꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽜꽝꽞꽟꽠꽡꽢꽣꽤꽥꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽹꽺꽻꽼꽽꽾꽿꾀꾁꾂꾃꾄꾅꾆꾇꾈꾉꾊꾋꾌꾍꾎꾏꾐꾑꾒꾓꾔꾕꾖꾗꾘꾙꾚꾛꾜꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾸꾹꾺꾻꾼꾽꾾꾿꿀꿁꿂꿃꿄꿅꿆꿇꿈꿉꿊꿋꿌꿍꿎꿏꿐꿑꿒꿓꿔꿕꿖꿗꿘꿙꿚꿛꿜꿝꿞꿟꿠꿡꿢꿣꿤꿥꿦꿧꿨꿩꿪꿫꿬꿭꿮꿯꿰꿱꿲꿳꿴꿵꿶꿷꿸꿹꿺꿻꿼꿽꿾꿿뀀뀁뀂뀃뀄뀅뀆뀇뀈뀉뀊뀋뀌뀍뀎뀏뀐뀑뀒뀓뀔뀕뀖뀗뀘뀙뀚뀛뀜뀝뀞뀟뀠뀡","뀢뀣뀤뀥뀦뀧뀨뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끄끅끆끇끈끉끊끋끌끍끎끏끐끑끒끓끔끕끖끗끘끙끚끛끜끝끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끼끽끾끿낀낁낂낃낄낅낆낇낈낉낊낋낌낍낎낏낐낑낒낓낔낕낖낗나낙낚낛난낝낞낟날낡낢낣낤낥낦낧남납낪낫났낭낮낯낰낱낲낳내낵낶낷낸낹낺낻낼낽낾낿냀냁냂냃냄냅냆냇냈냉냊냋냌냍냎냏냐냑냒냓냔냕냖냗냘냙냚냛냜냝냞냟냠냡냢냣냤냥냦냧냨냩냪냫냬냭냮냯냰냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇너넉넊넋넌넍넎넏널넑넒넓넔넕넖넗넘넙넚넛넜넝넞넟넠넡","넢넣네넥넦넧넨넩넪넫넬넭넮넯넰넱넲넳넴넵넶넷넸넹넺넻넼넽넾넿녀녁녂녃년녅녆녇녈녉녊녋녌녍녎녏념녑녒녓녔녕녖녗녘녙녚녛녜녝녞녟녠녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷노녹녺녻논녽녾녿놀놁놂놃놄놅놆놇놈놉놊놋놌농놎놏놐놑높놓놔놕놖놗놘놙놚놛놜놝놞놟놠놡놢놣놤놥놦놧놨놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇌뇍뇎뇏뇐뇑뇒뇓뇔뇕뇖뇗뇘뇙뇚뇛뇜뇝뇞뇟뇠뇡뇢뇣뇤뇥뇦뇧뇨뇩뇪뇫뇬뇭뇮뇯뇰뇱뇲뇳뇴뇵뇶뇷뇸뇹뇺뇻뇼뇽뇾뇿눀눁눂눃누눅눆눇눈눉눊눋눌눍눎눏눐눑눒눓눔눕눖눗눘눙눚눛눜눝눞눟눠눡","눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눴눵눶눷눸눹눺눻눼눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉘뉙뉚뉛뉜뉝뉞뉟뉠뉡뉢뉣뉤뉥뉦뉧뉨뉩뉪뉫뉬뉭뉮뉯뉰뉱뉲뉳뉴뉵뉶뉷뉸뉹뉺뉻뉼뉽뉾뉿늀늁늂늃늄늅늆늇늈늉늊늋늌늍늎늏느늑늒늓는늕늖늗늘늙늚늛늜늝늞늟늠늡늢늣늤능늦늧늨늩늪늫늬늭늮늯늰늱늲늳늴늵늶늷늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇니닉닊닋닌닍닎닏닐닑닒닓닔닕닖닗님닙닚닛닜닝닞닟닠닡닢닣다닥닦닧단닩닪닫달닭닮닯닰닱닲닳담답닶닷닸당닺닻닼닽닾닿대댁댂댃댄댅댆댇댈댉댊댋댌댍댎댏댐댑댒댓댔댕댖댗댘댙댚댛댜댝댞댟댠댡","댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓더덕덖덗던덙덚덛덜덝덞덟덠덡덢덣덤덥덦덧덨덩덪덫덬덭덮덯데덱덲덳덴덵덶덷델덹덺덻덼덽덾덿뎀뎁뎂뎃뎄뎅뎆뎇뎈뎉뎊뎋뎌뎍뎎뎏뎐뎑뎒뎓뎔뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎠뎡뎢뎣뎤뎥뎦뎧뎨뎩뎪뎫뎬뎭뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃도독돆돇돈돉돊돋돌돍돎돏돐돑돒돓돔돕돖돗돘동돚돛돜돝돞돟돠돡돢돣돤돥돦돧돨돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돼돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됐됑됒됓됔됕됖됗되됙됚됛된됝됞됟될됡","됢됣됤됥됦됧됨됩됪됫됬됭됮됯됰됱됲됳됴됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄둅둆둇둈둉둊둋둌둍둎둏두둑둒둓둔둕둖둗둘둙둚둛둜둝둞둟둠둡둢둣둤둥둦둧둨둩둪둫둬둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒀뒁뒂뒃뒄뒅뒆뒇뒈뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒝뒞뒟뒠뒡뒢뒣뒤뒥뒦뒧뒨뒩뒪뒫뒬뒭뒮뒯뒰뒱뒲뒳뒴뒵뒶뒷뒸뒹뒺뒻뒼뒽뒾뒿듀듁듂듃듄듅듆듇듈듉듊듋듌듍듎듏듐듑듒듓듔듕듖듗듘듙듚듛드득듞듟든듡듢듣들듥듦듧듨듩듪듫듬듭듮듯듰등듲듳듴듵듶듷듸듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓디딕딖딗딘딙딚딛딜딝딞딟딠딡","딢딣딤딥딦딧딨딩딪딫딬딭딮딯따딱딲딳딴딵딶딷딸딹딺딻딼딽딾딿땀땁땂땃땄땅땆땇땈땉땊땋때땍땎땏땐땑땒땓땔땕땖땗땘땙땚땛땜땝땞땟땠땡땢땣땤땥땦땧땨땩땪땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떠떡떢떣떤떥떦떧떨떩떪떫떬떭떮떯떰떱떲떳떴떵떶떷떸떹떺떻떼떽떾떿뗀뗁뗂뗃뗄뗅뗆뗇뗈뗉뗊뗋뗌뗍뗎뗏뗐뗑뗒뗓뗔뗕뗖뗗뗘뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗬뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏또똑똒똓똔똕똖똗똘똙똚똛똜똝똞똟똠똡","똢똣똤똥똦똧똨똩똪똫똬똭똮똯똰똱똲똳똴똵똶똷똸똹똺똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙈뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙤뙥뙦뙧뙨뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚜뚝뚞뚟뚠뚡뚢뚣뚤뚥뚦뚧뚨뚩뚪뚫뚬뚭뚮뚯뚰뚱뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛔뛕뛖뛗뛘뛙뛚뛛뛜뛝뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛰뛱뛲뛳뛴뛵뛶뛷뛸뛹뛺뛻뛼뛽뛾뛿뜀뜁뜂뜃뜄뜅뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡","뜢뜣뜤뜥뜦뜧뜨뜩뜪뜫뜬뜭뜮뜯뜰뜱뜲뜳뜴뜵뜶뜷뜸뜹뜺뜻뜼뜽뜾뜿띀띁띂띃띄띅띆띇띈띉띊띋띌띍띎띏띐띑띒띓띔띕띖띗띘띙띚띛띜띝띞띟띠띡띢띣띤띥띦띧띨띩띪띫띬띭띮띯띰띱띲띳띴띵띶띷띸띹띺띻라락띾띿란랁랂랃랄랅랆랇랈랉랊랋람랍랎랏랐랑랒랓랔랕랖랗래랙랚랛랜랝랞랟랠랡랢랣랤랥랦랧램랩랪랫랬랭랮랯랰랱랲랳랴략랶랷랸랹랺랻랼랽랾랿럀럁럂럃럄럅럆럇럈량럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝럞럟럠럡럢럣럤럥럦럧럨럩럪럫러럭럮럯런럱럲럳럴럵럶럷럸럹럺럻럼럽럾럿렀렁렂렃렄렅렆렇레렉렊렋렌렍렎렏렐렑렒렓렔렕렖렗렘렙렚렛렜렝렞렟렠렡","렢렣려력렦렧련렩렪렫렬렭렮렯렰렱렲렳렴렵렶렷렸령렺렻렼렽렾렿례롁롂롃롄롅롆롇롈롉롊롋롌롍롎롏롐롑롒롓롔롕롖롗롘롙롚롛로록롞롟론롡롢롣롤롥롦롧롨롩롪롫롬롭롮롯롰롱롲롳롴롵롶롷롸롹롺롻롼롽롾롿뢀뢁뢂뢃뢄뢅뢆뢇뢈뢉뢊뢋뢌뢍뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟뢠뢡뢢뢣뢤뢥뢦뢧뢨뢩뢪뢫뢬뢭뢮뢯뢰뢱뢲뢳뢴뢵뢶뢷뢸뢹뢺뢻뢼뢽뢾뢿룀룁룂룃룄룅룆룇룈룉룊룋료룍룎룏룐룑룒룓룔룕룖룗룘룙룚룛룜룝룞룟룠룡룢룣룤룥룦룧루룩룪룫룬룭룮룯룰룱룲룳룴룵룶룷룸룹룺룻룼룽룾룿뤀뤁뤂뤃뤄뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤘뤙뤚뤛뤜뤝뤞뤟뤠뤡","뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤼뤽뤾뤿륀륁륂륃륄륅륆륇륈륉륊륋륌륍륎륏륐륑륒륓륔륕륖륗류륙륚륛륜륝륞륟률륡륢륣륤륥륦륧륨륩륪륫륬륭륮륯륰륱륲륳르륵륶륷른륹륺륻를륽륾륿릀릁릂릃름릅릆릇릈릉릊릋릌릍릎릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞릟릠릡릢릣릤릥릦릧릨릩릪릫리릭릮릯린릱릲릳릴릵릶릷릸릹릺릻림립릾릿맀링맂맃맄맅맆맇마막맊맋만맍많맏말맑맒맓맔맕맖맗맘맙맚맛맜망맞맟맠맡맢맣매맥맦맧맨맩맪맫맬맭맮맯맰맱맲맳맴맵맶맷맸맹맺맻맼맽맾맿먀먁먂먃먄먅먆먇먈먉먊먋먌먍먎먏먐먑먒먓먔먕먖먗먘먙먚먛먜먝먞먟먠먡","먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷머먹먺먻먼먽먾먿멀멁멂멃멄멅멆멇멈멉멊멋멌멍멎멏멐멑멒멓메멕멖멗멘멙멚멛멜멝멞멟멠멡멢멣멤멥멦멧멨멩멪멫멬멭멮멯며멱멲멳면멵멶멷멸멹멺멻멼멽멾멿몀몁몂몃몄명몆몇몈몉몊몋몌몍몎몏몐몑몒몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧모목몪몫몬몭몮몯몰몱몲몳몴몵몶몷몸몹몺못몼몽몾몿뫀뫁뫂뫃뫄뫅뫆뫇뫈뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫘뫙뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫼뫽뫾뫿묀묁묂묃묄묅묆묇묈묉묊묋묌묍묎묏묐묑묒묓묔묕묖묗묘묙묚묛묜묝묞묟묠묡","묢묣묤묥묦묧묨묩묪묫묬묭묮묯묰묱묲묳무묵묶묷문묹묺묻물묽묾묿뭀뭁뭂뭃뭄뭅뭆뭇뭈뭉뭊뭋뭌뭍뭎뭏뭐뭑뭒뭓뭔뭕뭖뭗뭘뭙뭚뭛뭜뭝뭞뭟뭠뭡뭢뭣뭤뭥뭦뭧뭨뭩뭪뭫뭬뭭뭮뭯뭰뭱뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮈뮉뮊뮋뮌뮍뮎뮏뮐뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮤뮥뮦뮧뮨뮩뮪뮫뮬뮭뮮뮯뮰뮱뮲뮳뮴뮵뮶뮷뮸뮹뮺뮻뮼뮽뮾뮿므믁믂믃믄믅믆믇믈믉믊믋믌믍믎믏믐믑믒믓믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷미믹믺믻민믽믾믿밀밁밂밃밄밅밆밇밈밉밊밋밌밍밎및밐밑밒밓바박밖밗반밙밚받발밝밞밟밠밡","밢밣밤밥밦밧밨방밪밫밬밭밮밯배백밲밳밴밵밶밷밸밹밺밻밼밽밾밿뱀뱁뱂뱃뱄뱅뱆뱇뱈뱉뱊뱋뱌뱍뱎뱏뱐뱑뱒뱓뱔뱕뱖뱗뱘뱙뱚뱛뱜뱝뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃버벅벆벇번벉벊벋벌벍벎벏벐벑벒벓범법벖벗벘벙벚벛벜벝벞벟베벡벢벣벤벥벦벧벨벩벪벫벬벭벮벯벰벱벲벳벴벵벶벷벸벹벺벻벼벽벾벿변볁볂볃별볅볆볇볈볉볊볋볌볍볎볏볐병볒볓볔볕볖볗볘볙볚볛볜볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳보복볶볷본볹볺볻볼볽볾볿봀봁봂봃봄봅봆봇봈봉봊봋봌봍봎봏봐봑봒봓봔봕봖봗봘봙봚봛봜봝봞봟봠봡","봢봣봤봥봦봧봨봩봪봫봬봭봮봯봰봱봲봳봴봵봶봷봸봹봺봻봼봽봾봿뵀뵁뵂뵃뵄뵅뵆뵇뵈뵉뵊뵋뵌뵍뵎뵏뵐뵑뵒뵓뵔뵕뵖뵗뵘뵙뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵤뵥뵦뵧뵨뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿부북붂붃분붅붆붇불붉붊붋붌붍붎붏붐붑붒붓붔붕붖붗붘붙붚붛붜붝붞붟붠붡붢붣붤붥붦붧붨붩붪붫붬붭붮붯붰붱붲붳붴붵붶붷붸붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑뷒뷓뷔뷕뷖뷗뷘뷙뷚뷛뷜뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷩뷪뷫뷬뷭뷮뷯뷰뷱뷲뷳뷴뷵뷶뷷뷸뷹뷺뷻뷼뷽뷾뷿븀븁븂븃븄븅븆븇븈븉븊븋브븍븎븏븐븑븒븓블븕븖븗븘븙븚븛븜븝븞븟븠븡","븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃비빅빆빇빈빉빊빋빌빍빎빏빐빑빒빓빔빕빖빗빘빙빚빛빜빝빞빟빠빡빢빣빤빥빦빧빨빩빪빫빬빭빮빯빰빱빲빳빴빵빶빷빸빹빺빻빼빽빾빿뺀뺁뺂뺃뺄뺅뺆뺇뺈뺉뺊뺋뺌뺍뺎뺏뺐뺑뺒뺓뺔뺕뺖뺗뺘뺙뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺨뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻐뻑뻒뻓뻔뻕뻖뻗뻘뻙뻚뻛뻜뻝뻞뻟뻠뻡뻢뻣뻤뻥뻦뻧뻨뻩뻪뻫뻬뻭뻮뻯뻰뻱뻲뻳뻴뻵뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼁뼂뼃뼄뼅뼆뼇뼈뼉뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼘뼙뼚뼛뼜뼝뼞뼟뼠뼡","뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽀뽁뽂뽃뽄뽅뽆뽇뽈뽉뽊뽋뽌뽍뽎뽏뽐뽑뽒뽓뽔뽕뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾔뾕뾖뾗뾘뾙뾚뾛뾜뾝뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾰뾱뾲뾳뾴뾵뾶뾷뾸뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿅뿆뿇뿈뿉뿊뿋뿌뿍뿎뿏뿐뿑뿒뿓뿔뿕뿖뿗뿘뿙뿚뿛뿜뿝뿞뿟뿠뿡뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡","쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀼쀽쀾쀿쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁑쁒쁓쁔쁕쁖쁗쁘쁙쁚쁛쁜쁝쁞쁟쁠쁡쁢쁣쁤쁥쁦쁧쁨쁩쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삐삑삒삓삔삕삖삗삘삙삚삛삜삝삞삟삠삡삢삣삤삥삦삧삨삩삪삫사삭삮삯산삱삲삳살삵삶삷삸삹삺삻삼삽삾삿샀상샂샃샄샅샆샇새색샊샋샌샍샎샏샐샑샒샓샔샕샖샗샘샙샚샛샜생샞샟샠샡샢샣샤샥샦샧샨샩샪샫샬샭샮샯샰샱샲샳샴샵샶샷샸샹샺샻샼샽샾샿섀섁섂섃섄섅섆섇섈섉섊섋섌섍섎섏섐섑섒섓섔섕섖섗섘섙섚섛서석섞섟선섡","섢섣설섥섦섧섨섩섪섫섬섭섮섯섰성섲섳섴섵섶섷세섹섺섻센섽섾섿셀셁셂셃셄셅셆셇셈셉셊셋셌셍셎셏셐셑셒셓셔셕셖셗션셙셚셛셜셝셞셟셠셡셢셣셤셥셦셧셨셩셪셫셬셭셮셯셰셱셲셳셴셵셶셷셸셹셺셻셼셽셾셿솀솁솂솃솄솅솆솇솈솉솊솋소속솎솏손솑솒솓솔솕솖솗솘솙솚솛솜솝솞솟솠송솢솣솤솥솦솧솨솩솪솫솬솭솮솯솰솱솲솳솴솵솶솷솸솹솺솻솼솽솾솿쇀쇁쇂쇃쇄쇅쇆쇇쇈쇉쇊쇋쇌쇍쇎쇏쇐쇑쇒쇓쇔쇕쇖쇗쇘쇙쇚쇛쇜쇝쇞쇟쇠쇡쇢쇣쇤쇥쇦쇧쇨쇩쇪쇫쇬쇭쇮쇯쇰쇱쇲쇳쇴쇵쇶쇷쇸쇹쇺쇻쇼쇽쇾쇿숀숁숂숃숄숅숆숇숈숉숊숋숌숍숎숏숐숑숒숓숔숕숖숗수숙숚숛순숝숞숟술숡","숢숣숤숥숦숧숨숩숪숫숬숭숮숯숰숱숲숳숴숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅쉆쉇쉈쉉쉊쉋쉌쉍쉎쉏쉐쉑쉒쉓쉔쉕쉖쉗쉘쉙쉚쉛쉜쉝쉞쉟쉠쉡쉢쉣쉤쉥쉦쉧쉨쉩쉪쉫쉬쉭쉮쉯쉰쉱쉲쉳쉴쉵쉶쉷쉸쉹쉺쉻쉼쉽쉾쉿슀슁슂슃슄슅슆슇슈슉슊슋슌슍슎슏슐슑슒슓슔슕슖슗슘슙슚슛슜슝슞슟슠슡슢슣스슥슦슧슨슩슪슫슬슭슮슯슰슱슲슳슴습슶슷슸승슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛시식싞싟신싡싢싣실싥싦싧싨싩싪싫심십싮싯싰싱싲싳싴싵싶싷싸싹싺싻싼싽싾싿쌀쌁쌂쌃쌄쌅쌆쌇쌈쌉쌊쌋쌌쌍쌎쌏쌐쌑쌒쌓쌔쌕쌖쌗쌘쌙쌚쌛쌜쌝쌞쌟쌠쌡","쌢쌣쌤쌥쌦쌧쌨쌩쌪쌫쌬쌭쌮쌯쌰쌱쌲쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썅썆썇썈썉썊썋썌썍썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧써썩썪썫썬썭썮썯썰썱썲썳썴썵썶썷썸썹썺썻썼썽썾썿쎀쎁쎂쎃쎄쎅쎆쎇쎈쎉쎊쎋쎌쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏀쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏘쏙쏚쏛쏜쏝쏞쏟쏠쏡쏢쏣쏤쏥쏦쏧쏨쏩쏪쏫쏬쏭쏮쏯쏰쏱쏲쏳쏴쏵쏶쏷쏸쏹쏺쏻쏼쏽쏾쏿쐀쐁쐂쐃쐄쐅쐆쐇쐈쐉쐊쐋쐌쐍쐎쐏쐐쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚쐛쐜쐝쐞쐟쐠쐡","쐢쐣쐤쐥쐦쐧쐨쐩쐪쐫쐬쐭쐮쐯쐰쐱쐲쐳쐴쐵쐶쐷쐸쐹쐺쐻쐼쐽쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑈쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑤쑥쑦쑧쑨쑩쑪쑫쑬쑭쑮쑯쑰쑱쑲쑳쑴쑵쑶쑷쑸쑹쑺쑻쑼쑽쑾쑿쒀쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒔쒕쒖쒗쒘쒙쒚쒛쒜쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒸쒹쒺쒻쒼쒽쒾쒿쓀쓁쓂쓃쓄쓅쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟쓠쓡쓢쓣쓤쓥쓦쓧쓨쓩쓪쓫쓬쓭쓮쓯쓰쓱쓲쓳쓴쓵쓶쓷쓸쓹쓺쓻쓼쓽쓾쓿씀씁씂씃씄씅씆씇씈씉씊씋씌씍씎씏씐씑씒씓씔씕씖씗씘씙씚씛씜씝씞씟씠씡","씢씣씤씥씦씧씨씩씪씫씬씭씮씯씰씱씲씳씴씵씶씷씸씹씺씻씼씽씾씿앀앁앂앃아악앆앇안앉않앋알앍앎앏앐앑앒앓암압앖앗았앙앚앛앜앝앞앟애액앢앣앤앥앦앧앨앩앪앫앬앭앮앯앰앱앲앳앴앵앶앷앸앹앺앻야약앾앿얀얁얂얃얄얅얆얇얈얉얊얋얌얍얎얏얐양얒얓얔얕얖얗얘얙얚얛얜얝얞얟얠얡얢얣얤얥얦얧얨얩얪얫얬얭얮얯얰얱얲얳어억얶얷언얹얺얻얼얽얾얿엀엁엂엃엄업없엇었엉엊엋엌엍엎엏에엑엒엓엔엕엖엗엘엙엚엛엜엝엞엟엠엡엢엣엤엥엦엧엨엩엪엫여역엮엯연엱엲엳열엵엶엷엸엹엺엻염엽엾엿였영옂옃옄옅옆옇예옉옊옋옌옍옎옏옐옑옒옓옔옕옖옗옘옙옚옛옜옝옞옟옠옡","옢옣오옥옦옧온옩옪옫올옭옮옯옰옱옲옳옴옵옶옷옸옹옺옻옼옽옾옿와왁왂왃완왅왆왇왈왉왊왋왌왍왎왏왐왑왒왓왔왕왖왗왘왙왚왛왜왝왞왟왠왡왢왣왤왥왦왧왨왩왪왫왬왭왮왯왰왱왲왳왴왵왶왷외왹왺왻왼왽왾왿욀욁욂욃욄욅욆욇욈욉욊욋욌욍욎욏욐욑욒욓요욕욖욗욘욙욚욛욜욝욞욟욠욡욢욣욤욥욦욧욨용욪욫욬욭욮욯우욱욲욳운욵욶욷울욹욺욻욼욽욾욿움웁웂웃웄웅웆웇웈웉웊웋워웍웎웏원웑웒웓월웕웖웗웘웙웚웛웜웝웞웟웠웡웢웣웤웥웦웧웨웩웪웫웬웭웮웯웰웱웲웳웴웵웶웷웸웹웺웻웼웽웾웿윀윁윂윃위윅윆윇윈윉윊윋윌윍윎윏윐윑윒윓윔윕윖윗윘윙윚윛윜윝윞윟유육","윢윣윤윥윦윧율윩윪윫윬윭윮윯윰윱윲윳윴융윶윷윸윹윺윻으윽윾윿은읁읂읃을읅읆읇읈읉읊읋음읍읎읏읐응읒읓읔읕읖읗의읙읚읛읜읝읞읟읠읡읢읣읤읥읦읧읨읩읪읫읬읭읮읯읰읱읲읳이익읶읷인읹읺읻일읽읾읿잀잁잂잃임입잆잇있잉잊잋잌잍잎잏자작잒잓잔잕잖잗잘잙잚잛잜잝잞잟잠잡잢잣잤장잦잧잨잩잪잫재잭잮잯잰잱잲잳잴잵잶잷잸잹잺잻잼잽잾잿쟀쟁쟂쟃쟄쟅쟆쟇쟈쟉쟊쟋쟌쟍쟎쟏쟐쟑쟒쟓쟔쟕쟖쟗쟘쟙쟚쟛쟜쟝쟞쟟쟠쟡쟢쟣쟤쟥쟦쟧쟨쟩쟪쟫쟬쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺쟻쟼쟽쟾쟿저적젂젃전젅젆젇절젉젊젋젌젍젎젏점접젒젓젔정젖젗젘젙젚젛제젝젞젟젠젡","젢젣젤젥젦젧젨젩젪젫젬젭젮젯젰젱젲젳젴젵젶젷져젹젺젻젼젽젾젿졀졁졂졃졄졅졆졇졈졉졊졋졌졍졎졏졐졑졒졓졔졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯조족졲졳존졵졶졷졸졹졺졻졼졽졾졿좀좁좂좃좄종좆좇좈좉좊좋좌좍좎좏좐좑좒좓좔좕좖좗좘좙좚좛좜좝좞좟좠좡좢좣좤좥좦좧좨좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좼좽좾좿죀죁죂죃죄죅죆죇죈죉죊죋죌죍죎죏죐죑죒죓죔죕죖죗죘죙죚죛죜죝죞죟죠죡죢죣죤죥죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죵죶죷죸죹죺죻주죽죾죿준줁줂줃줄줅줆줇줈줉줊줋줌줍줎줏줐중줒줓줔줕줖줗줘줙줚줛줜줝줞줟줠줡","줢줣줤줥줦줧줨줩줪줫줬줭줮줯줰줱줲줳줴줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇쥈쥉쥊쥋쥌쥍쥎쥏쥐쥑쥒쥓쥔쥕쥖쥗쥘쥙쥚쥛쥜쥝쥞쥟쥠쥡쥢쥣쥤쥥쥦쥧쥨쥩쥪쥫쥬쥭쥮쥯쥰쥱쥲쥳쥴쥵쥶쥷쥸쥹쥺쥻쥼쥽쥾쥿즀즁즂즃즄즅즆즇즈즉즊즋즌즍즎즏즐즑즒즓즔즕즖즗즘즙즚즛즜증즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿지직짂짃진짅짆짇질짉짊짋짌짍짎짏짐집짒짓짔징짖짗짘짙짚짛짜짝짞짟짠짡짢짣짤짥짦짧짨짩짪짫짬짭짮짯짰짱짲짳짴짵짶짷째짹짺짻짼짽짾짿쨀쨁쨂쨃쨄쨅쨆쨇쨈쨉쨊쨋쨌쨍쨎쨏쨐쨑쨒쨓쨔쨕쨖쨗쨘쨙쨚쨛쨜쨝쨞쨟쨠쨡","쨢쨣쨤쨥쨦쨧쨨쨩쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆쩇쩈쩉쩊쩋쩌쩍쩎쩏쩐쩑쩒쩓쩔쩕쩖쩗쩘쩙쩚쩛쩜쩝쩞쩟쩠쩡쩢쩣쩤쩥쩦쩧쩨쩩쩪쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩽쩾쩿쪀쪁쪂쪃쪄쪅쪆쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪘쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪼쪽쪾쪿쫀쫁쫂쫃쫄쫅쫆쫇쫈쫉쫊쫋쫌쫍쫎쫏쫐쫑쫒쫓쫔쫕쫖쫗쫘쫙쫚쫛쫜쫝쫞쫟쫠쫡쫢쫣쫤쫥쫦쫧쫨쫩쫪쫫쫬쫭쫮쫯쫰쫱쫲쫳쫴쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬈쬉쬊쬋쬌쬍쬎쬏쬐쬑쬒쬓쬔쬕쬖쬗쬘쬙쬚쬛쬜쬝쬞쬟쬠쬡","쬢쬣쬤쬥쬦쬧쬨쬩쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭁쭂쭃쭄쭅쭆쭇쭈쭉쭊쭋쭌쭍쭎쭏쭐쭑쭒쭓쭔쭕쭖쭗쭘쭙쭚쭛쭜쭝쭞쭟쭠쭡쭢쭣쭤쭥쭦쭧쭨쭩쭪쭫쭬쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭸쭹쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮜쮝쮞쮟쮠쮡쮢쮣쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮸쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯔쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟쯠쯡쯢쯣쯤쯥쯦쯧쯨쯩쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찌찍찎찏찐찑찒찓찔찕찖찗찘찙찚찛찜찝찞찟찠찡","찢찣찤찥찦찧차착찪찫찬찭찮찯찰찱찲찳찴찵찶찷참찹찺찻찼창찾찿챀챁챂챃채책챆챇챈챉챊챋챌챍챎챏챐챑챒챓챔챕챖챗챘챙챚챛챜챝챞챟챠챡챢챣챤챥챦챧챨챩챪챫챬챭챮챯챰챱챲챳챴챵챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓첔첕첖첗처척첚첛천첝첞첟철첡첢첣첤첥첦첧첨첩첪첫첬청첮첯첰첱첲첳체첵첶첷첸첹첺첻첼첽첾첿쳀쳁쳂쳃쳄쳅쳆쳇쳈쳉쳊쳋쳌쳍쳎쳏쳐쳑쳒쳓쳔쳕쳖쳗쳘쳙쳚쳛쳜쳝쳞쳟쳠쳡쳢쳣쳤쳥쳦쳧쳨쳩쳪쳫쳬쳭쳮쳯쳰쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽쳾쳿촀촁촂촃촄촅촆촇초촉촊촋촌촍촎촏촐촑촒촓촔촕촖촗촘촙촚촛촜총촞촟촠촡","촢촣촤촥촦촧촨촩촪촫촬촭촮촯촰촱촲촳촴촵촶촷촸촹촺촻촼촽촾촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛최쵝쵞쵟쵠쵡쵢쵣쵤쵥쵦쵧쵨쵩쵪쵫쵬쵭쵮쵯쵰쵱쵲쵳쵴쵵쵶쵷쵸쵹쵺쵻쵼쵽쵾쵿춀춁춂춃춄춅춆춇춈춉춊춋춌춍춎춏춐춑춒춓추축춖춗춘춙춚춛출춝춞춟춠춡춢춣춤춥춦춧춨충춪춫춬춭춮춯춰춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췄췅췆췇췈췉췊췋췌췍췎췏췐췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡췢췣췤췥췦췧취췩췪췫췬췭췮췯췰췱췲췳췴췵췶췷췸췹췺췻췼췽췾췿츀츁츂츃츄츅츆츇츈츉츊츋츌츍츎츏츐츑츒츓츔츕츖츗츘츙츚츛츜츝츞츟츠측","츢츣츤츥츦츧츨츩츪츫츬츭츮츯츰츱츲츳츴층츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉칊칋칌칍칎칏칐칑칒칓칔칕칖칗치칙칚칛친칝칞칟칠칡칢칣칤칥칦칧침칩칪칫칬칭칮칯칰칱칲칳카칵칶칷칸칹칺칻칼칽칾칿캀캁캂캃캄캅캆캇캈캉캊캋캌캍캎캏캐캑캒캓캔캕캖캗캘캙캚캛캜캝캞캟캠캡캢캣캤캥캦캧캨캩캪캫캬캭캮캯캰캱캲캳캴캵캶캷캸캹캺캻캼캽캾캿컀컁컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕컖컗컘컙컚컛컜컝컞컟컠컡컢컣커컥컦컧컨컩컪컫컬컭컮컯컰컱컲컳컴컵컶컷컸컹컺컻컼컽컾컿케켁켂켃켄켅켆켇켈켉켊켋켌켍켎켏켐켑켒켓켔켕켖켗켘켙켚켛켜켝켞켟켠켡","켢켣켤켥켦켧켨켩켪켫켬켭켮켯켰켱켲켳켴켵켶켷켸켹켺켻켼켽켾켿콀콁콂콃콄콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓코콕콖콗콘콙콚콛콜콝콞콟콠콡콢콣콤콥콦콧콨콩콪콫콬콭콮콯콰콱콲콳콴콵콶콷콸콹콺콻콼콽콾콿쾀쾁쾂쾃쾄쾅쾆쾇쾈쾉쾊쾋쾌쾍쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾡쾢쾣쾤쾥쾦쾧쾨쾩쾪쾫쾬쾭쾮쾯쾰쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿄쿅쿆쿇쿈쿉쿊쿋쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿠쿡쿢쿣쿤쿥쿦쿧쿨쿩쿪쿫쿬쿭쿮쿯쿰쿱쿲쿳쿴쿵쿶쿷쿸쿹쿺쿻쿼쿽쿾쿿퀀퀁퀂퀃퀄퀅퀆퀇퀈퀉퀊퀋퀌퀍퀎퀏퀐퀑퀒퀓퀔퀕퀖퀗퀘퀙퀚퀛퀜퀝퀞퀟퀠퀡","퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬퀭퀮퀯퀰퀱퀲퀳퀴퀵퀶퀷퀸퀹퀺퀻퀼퀽퀾퀿큀큁큂큃큄큅큆큇큈큉큊큋큌큍큎큏큐큑큒큓큔큕큖큗큘큙큚큛큜큝큞큟큠큡큢큣큤큥큦큧큨큩큪큫크큭큮큯큰큱큲큳클큵큶큷큸큹큺큻큼큽큾큿킀킁킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣키킥킦킧킨킩킪킫킬킭킮킯킰킱킲킳킴킵킶킷킸킹킺킻킼킽킾킿타탁탂탃탄탅탆탇탈탉탊탋탌탍탎탏탐탑탒탓탔탕탖탗탘탙탚탛태택탞탟탠탡탢탣탤탥탦탧탨탩탪탫탬탭탮탯탰탱탲탳탴탵탶탷탸탹탺탻탼탽탾탿턀턁턂턃턄턅턆턇턈턉턊턋턌턍턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟턠턡","턢턣턤턥턦턧턨턩턪턫턬턭턮턯터턱턲턳턴턵턶턷털턹턺턻턼턽턾턿텀텁텂텃텄텅텆텇텈텉텊텋테텍텎텏텐텑텒텓텔텕텖텗텘텙텚텛템텝텞텟텠텡텢텣텤텥텦텧텨텩텪텫텬텭텮텯텰텱텲텳텴텵텶텷텸텹텺텻텼텽텾텿톀톁톂톃톄톅톆톇톈톉톊톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟토톡톢톣톤톥톦톧톨톩톪톫톬톭톮톯톰톱톲톳톴통톶톷톸톹톺톻톼톽톾톿퇀퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏퇐퇑퇒퇓퇔퇕퇖퇗퇘퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪퇫퇬퇭퇮퇯퇰퇱퇲퇳퇴퇵퇶퇷퇸퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆툇툈툉툊툋툌툍툎툏툐툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡","툢툣툤툥툦툧툨툩툪툫투툭툮툯툰툱툲툳툴툵툶툷툸툹툺툻툼툽툾툿퉀퉁퉂퉃퉄퉅퉆퉇퉈퉉퉊퉋퉌퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉜퉝퉞퉟퉠퉡퉢퉣퉤퉥퉦퉧퉨퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튀튁튂튃튄튅튆튇튈튉튊튋튌튍튎튏튐튑튒튓튔튕튖튗튘튙튚튛튜튝튞튟튠튡튢튣튤튥튦튧튨튩튪튫튬튭튮튯튰튱튲튳튴튵튶튷트특튺튻튼튽튾튿틀틁틂틃틄틅틆틇틈틉틊틋틌틍틎틏틐틑틒틓틔틕틖틗틘틙틚틛틜틝틞틟틠틡틢틣틤틥틦틧틨틩틪틫틬틭틮틯티틱틲틳틴틵틶틷틸틹틺틻틼틽틾틿팀팁팂팃팄팅팆팇팈팉팊팋파팍팎팏판팑팒팓팔팕팖팗팘팙팚팛팜팝팞팟팠팡","팢팣팤팥팦팧패팩팪팫팬팭팮팯팰팱팲팳팴팵팶팷팸팹팺팻팼팽팾팿퍀퍁퍂퍃퍄퍅퍆퍇퍈퍉퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍼퍽퍾퍿펀펁펂펃펄펅펆펇펈펉펊펋펌펍펎펏펐펑펒펓펔펕펖펗페펙펚펛펜펝펞펟펠펡펢펣펤펥펦펧펨펩펪펫펬펭펮펯펰펱펲펳펴펵펶펷편펹펺펻펼펽펾펿폀폁폂폃폄폅폆폇폈평폊폋폌폍폎폏폐폑폒폓폔폕폖폗폘폙폚폛폜폝폞폟폠폡폢폣폤폥폦폧폨폩폪폫포폭폮폯폰폱폲폳폴폵폶폷폸폹폺폻폼폽폾폿퐀퐁퐂퐃퐄퐅퐆퐇퐈퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖퐗퐘퐙퐚퐛퐜퐝퐞퐟퐠퐡","퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷퐸퐹퐺퐻퐼퐽퐾퐿푀푁푂푃푄푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓푔푕푖푗푘푙푚푛표푝푞푟푠푡푢푣푤푥푦푧푨푩푪푫푬푭푮푯푰푱푲푳푴푵푶푷푸푹푺푻푼푽푾푿풀풁풂풃풄풅풆풇품풉풊풋풌풍풎풏풐풑풒풓풔풕풖풗풘풙풚풛풜풝풞풟풠풡풢풣풤풥풦풧풨풩풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓌퓍퓎퓏퓐퓑퓒퓓퓔퓕퓖퓗퓘퓙퓚퓛퓜퓝퓞퓟퓠퓡퓢퓣퓤퓥퓦퓧퓨퓩퓪퓫퓬퓭퓮퓯퓰퓱퓲퓳퓴퓵퓶퓷퓸퓹퓺퓻퓼퓽퓾퓿픀픁픂픃프픅픆픇픈픉픊픋플픍픎픏픐픑픒픓픔픕픖픗픘픙픚픛픜픝픞픟픠픡","픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷픸픹픺픻피픽픾픿핀핁핂핃필핅핆핇핈핉핊핋핌핍핎핏핐핑핒핓핔핕핖핗하학핚핛한핝핞핟할핡핢핣핤핥핦핧함합핪핫핬항핮핯핰핱핲핳해핵핶핷핸핹핺핻핼핽핾핿햀햁햂햃햄햅햆햇했행햊햋햌햍햎햏햐햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤향햦햧햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇허헉헊헋헌헍헎헏헐헑헒헓헔헕헖헗험헙헚헛헜헝헞헟헠헡헢헣헤헥헦헧헨헩헪헫헬헭헮헯헰헱헲헳헴헵헶헷헸헹헺헻헼헽헾헿혀혁혂혃현혅혆혇혈혉혊혋혌혍혎혏혐협혒혓혔형혖혗혘혙혚혛혜혝혞혟혠혡","혢혣혤혥혦혧혨혩혪혫혬혭혮혯혰혱혲혳혴혵혶혷호혹혺혻혼혽혾혿홀홁홂홃홄홅홆홇홈홉홊홋홌홍홎홏홐홑홒홓화확홖홗환홙홚홛활홝홞홟홠홡홢홣홤홥홦홧홨황홪홫홬홭홮홯홰홱홲홳홴홵홶홷홸홹홺홻홼홽홾홿횀횁횂횃횄횅횆횇횈횉횊횋회획횎횏횐횑횒횓횔횕횖횗횘횙횚횛횜횝횞횟횠횡횢횣횤횥횦횧효횩횪횫횬횭횮횯횰횱횲횳횴횵횶횷횸횹횺횻횼횽횾횿훀훁훂훃후훅훆훇훈훉훊훋훌훍훎훏훐훑훒훓훔훕훖훗훘훙훚훛훜훝훞훟훠훡훢훣훤훥훦훧훨훩훪훫훬훭훮훯훰훱훲훳훴훵훶훷훸훹훺훻훼훽훾훿휀휁휂휃휄휅휆휇휈휉휊휋휌휍휎휏휐휑휒휓휔휕휖휗휘휙휚휛휜휝휞휟휠휡","휢휣휤휥휦휧휨휩휪휫휬휭휮휯휰휱휲휳휴휵휶휷휸휹휺휻휼휽휾휿흀흁흂흃흄흅흆흇흈흉흊흋흌흍흎흏흐흑흒흓흔흕흖흗흘흙흚흛흜흝흞흟흠흡흢흣흤흥흦흧흨흩흪흫희흭흮흯흰흱흲흳흴흵흶흷흸흹흺흻흼흽흾흿힀힁힂힃힄힅힆힇히힉힊힋힌힍힎힏힐힑힒힓힔힕힖힗힘힙힚힛힜힝힞힟힠힡힢힣힤힥힦힧힨힩힪힫힬힭힮힯ힰힱힲힳힴힵힶힷힸힹힺힻힼힽힾힿퟀퟁퟂퟃퟄퟅퟆ퟇퟈퟉퟊ퟋퟌퟍퟎퟏퟐퟑퟒퟓퟔퟕퟖퟗퟘퟙퟚퟛퟜퟝퟞퟟퟠퟡퟢퟣퟤퟥퟦퟧퟨퟩퟪퟫퟬퟭퟮퟯퟰퟱퟲퟳퟴퟵퟶퟷퟸퟹퟺퟻ퟼퟽퟾퟿������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","","","","","","","","","","","","","","","","","","","","","","","","","豈更車賈滑串句龜龜契金喇奈懶癩羅蘿螺裸邏樂洛烙珞落酪駱亂卵欄爛蘭鸞嵐","濫藍襤拉臘蠟廊朗浪狼郎來冷勞擄櫓爐盧老蘆虜路露魯鷺碌祿綠菉錄鹿論壟弄籠聾牢磊賂雷壘屢樓淚漏累縷陋勒肋凜凌稜綾菱陵讀拏樂諾丹寧怒率異北磻便復不泌數索參塞省葉說殺辰沈拾若掠略亮兩凉梁糧良諒量勵呂女廬旅濾礪閭驪麗黎力曆歷轢年憐戀撚漣煉璉秊練聯輦蓮連鍊列劣咽烈裂說廉念捻殮簾獵令囹寧嶺怜玲瑩羚聆鈴零靈領例禮醴隸惡了僚寮尿料樂燎療蓼遼龍暈阮劉杻柳流溜琉留硫紐類六戮陸倫崙淪輪律慄栗率隆利吏履易李梨泥理痢罹裏裡里離匿溺吝燐璘藺隣鱗麟林淋臨立笠粒狀炙識什茶刺切度拓糖宅洞暴輻行降見廓兀嗀﨎﨏塚﨑晴﨓﨔凞猪益礼神祥福靖精羽﨟蘒﨡","諸﨣﨤逸都﨧﨨﨩飯飼館鶴郞隷侮僧免勉勤卑喝嘆器塀墨層屮悔慨憎懲敏既暑梅海渚漢煮爫琢碑社祉祈祐祖祝禍禎穀突節練縉繁署者臭艹艹著褐視謁謹賓贈辶逸難響頻恵𤋮舘﩮﩯並况全侀充冀勇勺喝啕喙嗢塚墳奄奔婢嬨廒廙彩徭惘慎愈憎慠懲戴揄搜摒敖晴朗望杖歹殺流滛滋漢瀞煮瞧爵犯猪瑱甆画瘝瘟益盛直睊着磌窱節类絛練缾者荒華蝹襁覆視調諸請謁諾諭謹變贈輸遲醙鉶陼難靖韛響頋頻鬒龜𢡊𢡄𣏕㮝䀘䀹𥉉𥳐𧻓齃龎﫚﫛﫜﫝﫞﫟﫠﫡﫢﫣﫤﫥﫦﫧﫨﫩﫪﫫﫬﫭﫮﫯﫰﫱﫲﫳﫴﫵﫶﫷﫸﫹﫺﫻﫼﫽﫾﫿fffiflffifflſtst﬇﬈﬉﬊﬋﬌﬍﬎﬏﬐﬑﬒ﬓﬔﬕﬖﬗ﬘﬙﬚﬛﬜יִﬞײַﬠﬡ","ﬢﬣﬤﬥﬦﬧﬨ﬩שׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּ﬷טּיּךּכּלּ﬽מּ﬿נּסּ﭂ףּפּ﭅צּקּרּשּתּוֹבֿכֿפֿﭏﭐﭑﭒﭓﭔﭕﭖﭗﭘﭙﭚﭛﭜﭝﭞﭟﭠﭡﭢﭣﭤﭥﭦﭧﭨﭩﭪﭫﭬﭭﭮﭯﭰﭱﭲﭳﭴﭵﭶﭷﭸﭹﭺﭻﭼﭽﭾﭿﮀﮁﮂﮃﮄﮅﮆﮇﮈﮉﮊﮋﮌﮍﮎﮏﮐﮑﮒﮓﮔﮕﮖﮗﮘﮙﮚﮛﮜﮝﮞﮟﮠﮡﮢﮣﮤﮥﮦﮧﮨﮩﮪﮫﮬﮭﮮﮯﮰﮱ﮲﮳﮴﮵﮶﮷﮸﮹﮺﮻﮼﮽﮾﮿﯀﯁﯂﯃﯄﯅﯆﯇﯈﯉﯊﯋﯌﯍﯎﯏﯐﯑﯒ﯓﯔﯕﯖﯗﯘﯙﯚﯛﯜﯝﯞﯟﯠﯡﯢﯣﯤﯥﯦﯧﯨﯩﯪﯫﯬﯭﯮﯯﯰﯱﯲﯳﯴﯵﯶﯷﯸﯹﯺﯻﯼﯽﯾﯿﰀﰁﰂﰃﰄﰅﰆﰇﰈﰉﰊﰋﰌﰍﰎﰏﰐﰑﰒﰓﰔﰕﰖﰗﰘﰙﰚﰛﰜﰝﰞﰟﰠﰡ","ﰢﰣﰤﰥﰦﰧﰨﰩﰪﰫﰬﰭﰮﰯﰰﰱﰲﰳﰴﰵﰶﰷﰸﰹﰺﰻﰼﰽﰾﰿﱀﱁﱂﱃﱄﱅﱆﱇﱈﱉﱊﱋﱌﱍﱎﱏﱐﱑﱒﱓﱔﱕﱖﱗﱘﱙﱚﱛﱜﱝﱞﱟﱠﱡﱢﱣﱤﱥﱦﱧﱨﱩﱪﱫﱬﱭﱮﱯﱰﱱﱲﱳﱴﱵﱶﱷﱸﱹﱺﱻﱼﱽﱾﱿﲀﲁﲂﲃﲄﲅﲆﲇﲈﲉﲊﲋﲌﲍﲎﲏﲐﲑﲒﲓﲔﲕﲖﲗﲘﲙﲚﲛﲜﲝﲞﲟﲠﲡﲢﲣﲤﲥﲦﲧﲨﲩﲪﲫﲬﲭﲮﲯﲰﲱﲲﲳﲴﲵﲶﲷﲸﲹﲺﲻﲼﲽﲾﲿﳀﳁﳂﳃﳄﳅﳆﳇﳈﳉﳊﳋﳌﳍﳎﳏﳐﳑﳒﳓﳔﳕﳖﳗﳘﳙﳚﳛﳜﳝﳞﳟﳠﳡﳢﳣﳤﳥﳦﳧﳨﳩﳪﳫﳬﳭﳮﳯﳰﳱﳲﳳﳴﳵﳶﳷﳸﳹﳺﳻﳼﳽﳾﳿﴀﴁﴂﴃﴄﴅﴆﴇﴈﴉﴊﴋﴌﴍﴎﴏﴐﴑﴒﴓﴔﴕﴖﴗﴘﴙﴚﴛﴜﴝﴞﴟﴠﴡ","ﴢﴣﴤﴥﴦﴧﴨﴩﴪﴫﴬﴭﴮﴯﴰﴱﴲﴳﴴﴵﴶﴷﴸﴹﴺﴻﴼﴽ﴾﴿﵀﵁﵂﵃﵄﵅﵆﵇﵈﵉﵊﵋﵌﵍﵎﵏ﵐﵑﵒﵓﵔﵕﵖﵗﵘﵙﵚﵛﵜﵝﵞﵟﵠﵡﵢﵣﵤﵥﵦﵧﵨﵩﵪﵫﵬﵭﵮﵯﵰﵱﵲﵳﵴﵵﵶﵷﵸﵹﵺﵻﵼﵽﵾﵿﶀﶁﶂﶃﶄﶅﶆﶇﶈﶉﶊﶋﶌﶍﶎﶏ﶐﶑ﶒﶓﶔﶕﶖﶗﶘﶙﶚﶛﶜﶝﶞﶟﶠﶡﶢﶣﶤﶥﶦﶧﶨﶩﶪﶫﶬﶭﶮﶯﶰﶱﶲﶳﶴﶵﶶﶷﶸﶹﶺﶻﶼﶽﶾﶿﷀﷁﷂﷃﷄﷅﷆﷇ﷈﷉﷊﷋﷌﷍﷎﷏﷐﷑﷒﷓﷔﷕﷖﷗﷘﷙﷚﷛﷜﷝﷞﷟﷠﷡﷢﷣﷤﷥﷦﷧﷨﷩﷪﷫﷬﷭﷮﷯ﷰﷱﷲﷳﷴﷵﷶﷷﷸﷹﷺﷻ﷼﷽﷾﷿︀︁︂︃︄︅︆︇︈︉︊︋︌︍︎️︐︑︒︓︔︕︖︗︘︙︚︛︜︝︞︟︠︡","︧︨︩︪︫︬︭︢︣︤︥︦︮︯︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹅﹆﹇﹈﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹓﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹢﹣﹤﹥﹦﹧﹨﹩﹪﹫﹬﹭﹮﹯ﹰﹱﹲﹳﹴ﹵ﹶﹷﹸﹹﹺﹻﹼﹽﹾﹿﺀﺁﺂﺃﺄﺅﺆﺇﺈﺉﺊﺋﺌﺍﺎﺏﺐﺑﺒﺓﺔﺕﺖﺗﺘﺙﺚﺛﺜﺝﺞﺟﺠﺡﺢﺣﺤﺥﺦﺧﺨﺩﺪﺫﺬﺭﺮﺯﺰﺱﺲﺳﺴﺵﺶﺷﺸﺹﺺﺻﺼﺽﺾﺿﻀﻁﻂﻃﻄﻅﻆﻇﻈﻉﻊﻋﻌﻍﻎﻏﻐﻑﻒﻓﻔﻕﻖﻗﻘﻙﻚﻛﻜﻝﻞﻟﻠﻡﻢﻣﻤﻥﻦﻧﻨﻩﻪﻫﻬﻭﻮﻯﻰﻱﻲﻳﻴﻵﻶﻷﻸﻹﻺﻻﻼ﻽﻾＀!"#$%&'()*+,-./0123456789:;<=>?@A","BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⦅⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᅠᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒ﾿￀￁ᅡᅢᅣᅤᅥᅦ￈￉ᅧᅨᅩᅪᅫᅬ￐￑ᅭᅮᅯᅰᅱᅲ￘￙ᅳᅴᅵ￝￞￟¢£¬ ̄¦¥₩￧│←↑→↓■○￯￰￱￲￳￴￵￶￷￸�￾￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿"],"keys":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255","256","257","258","259","260","261","262","263","264","265","266","267","268","269","270","271","272","273","274","275","276","277","278","279","280","281","282","283","284","285","286","287","288","289","290","291","292","293","294","295","296","297","298","299","300","301","302","303","304","305","306","307","308","309","310","311","312","313","314","315","316","317","318","319","320","321","322","323","324","325","326","327","328","329","330","331","332","333","334","335","336","337","338","339","340","341","342","343","344","345","346","347","348","349","350","351","352","353","354","355","356","357","358","359","360","361","362","363","364","365","366","367","368","369","370","371","372","373","374","375","376","377","378","379","380","381","382","383","384","385","386","387","388","389","390","391","392","393","394","395","396","397","398","399","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","419","420","421","422","423","424","425","426","427","428","429","430","431","432","433","434","435","436","437","438","439","440","441","442","443","444","445","446","447","448","449","450","451","452","453","454","455","456","457","458","459","460","461","462","463","464","465","466","467","468","469","470","471","472","473","474","475","476","477","478","479","480","481","482","483","484","485","486","487","488","489","490","491","492","493","494","495","496","497","498","499","500","501","502","503","504","505","506","507","508","509","510","511","512","513","514","515","516","517","518","519","520","521","522","523","524","525","526","527","528","529","530","531","532","533","534","535","536","537","538","539","540","541","542","543","544","545","546","547","548","549","550","551","552","553","554","555","556","557","558","559","560","561","562","563","564","565","566","567","568","569","570","571","572","573","574","575","576","577","578","579","580","581","582","583","584","585","586","587","588","589","590","591","592","593","594","595","596","597","598","599","600","601","602","603","604","605","606","607","608","609","610","611","612","613","614","615","616","617","618","619","620","621","622","623","624","625","626","627","628","629","630","631","632","633","634","635","636","637","638","639","640","641","642","643","644","645","646","647","648","649","650","651","652","653","654","655","656","657","658","659","660","661","662","663","664","665","666","667","668","669","670","671","672","673","674","675","676","677","678","679","680","681","682","683","684","685","686","687","688","689","690","691","692","693","694","695","696","697","698","699","700","701","702","703","704","705","706","707","708","709","710","711","712","713","714","715","716","717","718","719","720","721","722","723","724","725","726","727","728","729","730","731","732","733","734","735","736","737","738","739","740","741","742","743","744","745","746","747","748","749","750","751","752","753","754","755","756","757","758","759","760","761","762","763","764","765","766","767","768","769","770","771","772","773","774","775","776","777","778","779","780","781","782","783","784","785","786","787","788","789","790","791","792","793","794","795","796","797","798","799","800","801","802","803","804","805","806","807","808","809","810","811","812","813","814","815","816","817","818","819","820","821","822","823","824","825","826","827","828","829","830","831","832","833","834","835","836","837","838","839","840","841","842","843","844","845","846","847","848","849","850","851","852","853","854","855","856","857","858","859","860","861","862","863","864","865","866","867","868","869","870","871","872","873","874","875","876","877","878","879","880","881","882","883","884","885","886","887","888","889","890","891","892","893","894","895","896","897","898","899","900","901","902","903","904","905","906","907","908","909","910","911","912","913","914","915","916","917","918","919","920","921","922","923","924","925","926","927","928","929","930","931","932","933","934","935","936","937","938","939","940","941","942","943","944","945","946","947","948","949","950","951","952","953","954","955","956","957","958","959","960","961","962","963","964","965","966","967","968","969","970","971","972","973","974","975","976","977","978","979","980","981","982","983","984","985","986","987","988","989","990","991","992","993","994","995","996","997","998","999","1000","1001","1002","1003","1004","1005","1006","1007","1008","1009","1010","1011","1012","1013","1014","1015","1016","1017","1018","1019","1020","1021","1022","1023","1024","1025","1026","1027","1028","1029","1030","1031","1032","1033","1034","1035","1036","1037","1038","1039","1040","1041","1042","1043","1044","1045","1046","1047","1048","1049","1050","1051","1052","1053","1054","1055","1056","1057","1058","1059","1060","1061","1062","1063","1064","1065","1066","1067","1068","1069","1070","1071","1072","1073","1074","1075","1076","1077","1078","1079","1080","1081","1082","1083","1084","1085","1086","1087","1088","1089","1090","1091","1092","1093","1094","1095","1096","1097","1098","1099","1100","1101","1102","1103","1104","1105","1106","1107","1108","1109","1110","1111","1112","1113","1114","1115","1116","1117","1118","1119","1120","1121","1122","1123","1124","1125","1126","1127","1128","1129","1130","1131","1132","1133","1134","1135","1136","1137","1138","1139","1140","1141","1142","1143","1144","1145","1146","1147","1148","1149","1150","1151","1152","1153","1154","1155","1156","1157","1158","1159","1160","1161","1162","1163","1164","1165","1166","1167","1168","1169","1170","1171","1172","1173","1174","1175","1176","1177","1178","1179","1180","1181","1182","1183","1184","1185","1186","1187","1188","1189","1190","1191","1192","1193","1194","1195","1196","1197","1198","1199","1200","1201","1202","1203","1204","1205","1206","1207","1208","1209","1210","1211","1212","1213","1214","1215","1216","1217","1218","1219","1220","1221","1222","1223","1224","1225","1226","1227","1228","1229","1230","1231","1232","1233","1234","1235","1236","1237","1238","1239","1240","1241","1242","1243","1244","1245","1246","1247","1248","1249","1250","1251","1252","1253","1254","1255","1256","1257","1258","1259","1260","1261","1262","1263","1264","1265","1266","1267","1268","1269","1270","1271","1272","1273","1274","1275","1276","1277","1278","1279","1280","1281","1282","1283","1284","1285","1286","1287","1288","1289","1290","1291","1292","1293","1294","1295","1296","1297","1298","1299","1300","1301","1302","1303","1304","1305","1306","1307","1308","1309","1310","1311","1312","1313","1314","1315","1316","1317","1318","1319","1320","1321","1322","1323","1324","1325","1326","1327","1328","1329","1330","1331","1332","1333","1334","1335","1336","1337","1338","1339","1340","1341","1342","1343","1344","1345","1346","1347","1348","1349","1350","1351","1352","1353","1354","1355","1356","1357","1358","1359","1360","1361","1362","1363","1364","1365","1366","1367","1368","1369","1370","1371","1372","1373","1374","1375","1376","1377","1378","1379","1380","1381","1382","1383","1384","1385","1386","1387","1388","1389","1390","1391","1392","1393","1394","1395","1396","1397","1398","1399","1400","1401","1402","1403","1404","1405","1406","1407","1408","1409","1410","1411","1412","1413","1414","1415","1416","1417","1418","1419","1420","1421","1422","1423","1424","1425","1426","1427","1428","1429","1430","1431","1432","1433","1434","1435","1436","1437","1438","1439","1440","1441","1442","1443","1444","1445","1446","1447","1448","1449","1450","1451","1452","1453","1454","1455","1456","1457","1458","1459","1460","1461","1462","1463","1464","1465","1466","1467","1468","1469","1470","1471","1472","1473","1474","1475","1476","1477","1478","1479","1480","1481","1482","1483","1484","1485","1486","1487","1488","1489","1490","1491","1492","1493","1494","1495","1496","1497","1498","1499","1500","1501","1502","1503","1504","1505","1506","1507","1508","1509","1510","1511","1512","1513","1514","1515","1516","1517","1518","1519","1520","1521","1522","1523","1524","1525","1526","1527","1528","1529","1530","1531","1532","1533","1534","1535","1536","1537","1538","1539","1540","1541","1542","1543","1544","1545","1546","1547","1548","1549","1550","1551","1552","1553","1554","1555","1556","1557","1558","1559","1560","1561","1562","1563","1564","1565","1566","1567","1568","1569","1570","1571","1572","1573","1574","1575","1576","1577","1578","1579","1580","1581","1582","1583","1584","1585","1586","1587","1588","1589","1590","1591","1592","1593","1594","1595","1596","1597","1598","1599","1600","1601","1602","1603","1604","1605","1606","1607","1608","1609","1610","1611","1612","1613","1614","1615","1616","1617","1618","1619","1620","1621","1622","1623","1624","1625","1626","1627","1628","1629","1630","1631","1632","1633","1634","1635","1636","1637","1638","1639","1640","1641","1642","1643","1644","1645","1646","1647","1648","1649","1650","1651","1652","1653","1654","1655","1656","1657","1658","1659","1660","1661","1662","1663","1664","1665","1666","1667","1668","1669","1670","1671","1672","1673","1674","1675","1676","1677","1678","1679","1680","1681","1682","1683","1684","1685","1686","1687","1688","1689","1690","1691","1692","1693","1694","1695","1696","1697","1698","1699","1700","1701","1702","1703","1704","1705","1706","1707","1708","1709","1710","1711","1712","1713","1714","1715","1716","1717","1718","1719","1720","1721","1722","1723","1724","1725","1726","1727","1728","1729","1730","1731","1732","1733","1734","1735","1736","1737","1738","1739","1740","1741","1742","1743","1744","1745","1746","1747","1748","1749","1750","1751","1752","1753","1754","1755","1756","1757","1758","1759","1760","1761","1762","1763","1764","1765","1766","1767","1768","1769","1770","1771","1772","1773","1774","1775","1776","1777","1778","1779","1780","1781","1782","1783","1784","1785","1786","1787","1788","1789","1790","1791","1792","1793","1794","1795","1796","1797","1798","1799","1800","1801","1802","1803","1804","1805","1806","1807","1808","1809","1810","1811","1812","1813","1814","1815","1816","1817","1818","1819","1820","1821","1822","1823","1824","1825","1826","1827","1828","1829","1830","1831","1832","1833","1834","1835","1836","1837","1838","1839","1840","1841","1842","1843","1844","1845","1846","1847","1848","1849","1850","1851","1852","1853","1854","1855","1856","1857","1858","1859","1860","1861","1862","1863","1864","1865","1866","1867","1868","1869","1870","1871","1872","1873","1874","1875","1876","1877","1878","1879","1880","1881","1882","1883","1884","1885","1886","1887","1888","1889","1890","1891","1892","1893","1894","1895","1896","1897","1898","1899","1900","1901","1902","1903","1904","1905","1906","1907","1908","1909","1910","1911","1912","1913","1914","1915","1916","1917","1918","1919","1920","1921","1922","1923","1924","1925","1926","1927","1928","1929","1930","1931","1932","1933","1934","1935","1936","1937","1938","1939","1940","1941","1942","1943","1944","1945","1946","1947","1948","1949","1950","1951","1952","1953","1954","1955","1956","1957","1958","1959","1960","1961","1962","1963","1964","1965","1966","1967","1968","1969","1970","1971","1972","1973","1974","1975","1976","1977","1978","1979","1980","1981","1982","1983","1984","1985","1986","1987","1988","1989","1990","1991","1992","1993","1994","1995","1996","1997","1998","1999","2000","2001","2002","2003","2004","2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025","2026","2027","2028","2029","2030","2031","2032","2033","2034","2035","2036","2037","2038","2039","2040","2041","2042","2043","2044","2045","2046","2047","2048","2049","2050","2051","2052","2053","2054","2055","2056","2057","2058","2059","2060","2061","2062","2063","2064","2065","2066","2067","2068","2069","2070","2071","2072","2073","2074","2075","2076","2077","2078","2079","2080","2081","2082","2083","2084","2085","2086","2087","2088","2089","2090","2091","2092","2093","2094","2095","2096","2097","2098","2099","2100","2101","2102","2103","2104","2105","2106","2107","2108","2109","2110","2111","2112","2113","2114","2115","2116","2117","2118","2119","2120","2121","2122","2123","2124","2125","2126","2127","2128","2129","2130","2131","2132","2133","2134","2135","2136","2137","2138","2139","2140","2141","2142","2143","2144","2145","2146","2147","2148","2149","2150","2151","2152","2153","2154","2155","2156","2157","2158","2159","2160","2161","2162","2163","2164","2165","2166","2167","2168","2169","2170","2171","2172","2173","2174","2175","2176","2177","2178","2179","2180","2181","2182","2183","2184","2185","2186","2187","2188","2189","2190","2191","2192","2193","2194","2195","2196","2197","2198","2199","2200","2201","2202","2203","2204","2205","2206","2207","2208","2209","2210","2211","2212","2213","2214","2215","2216","2217","2218","2219","2220","2221","2222","2223","2224","2225","2226","2227","2228","2229","2230","2231","2232","2233","2234","2235","2236","2237","2238","2239","2240","2241","2242","2243","2244","2245","2246","2247","2248","2249","2250","2251","2252","2253","2254","2255","2256","2257","2258","2259","2260","2261","2262","2263","2264","2265","2266","2267","2268","2269","2270","2271","2272","2273","2274","2275","2276","2277","2278","2279","2280","2281","2282","2283","2284","2285","2286","2287","2288","2289","2290","2291","2292","2293","2294","2295","2296","2297","2298","2299","2300","2301","2302","2303","2304","2305","2306","2307","2308","2309","2310","2311","2312","2313","2314","2315","2316","2317","2318","2319","2320","2321","2322","2323","2324","2325","2326","2327","2328","2329","2330","2331","2332","2333","2334","2335","2336","2337","2338","2339","2340","2341","2342","2343","2344","2345","2346","2347","2348","2349","2350","2351","2352","2353","2354","2355","2356","2357","2358","2359","2360","2361","2362","2363","2364","2365","2366","2367","2368","2369","2370","2371","2372","2373","2374","2375","2376","2377","2378","2379","2380","2381","2382","2383","2384","2385","2386","2387","2388","2389","2390","2391","2392","2393","2394","2395","2396","2397","2398","2399","2400","2401","2402","2403","2404","2405","2406","2407","2408","2409","2410","2411","2412","2413","2414","2415","2416","2417","2418","2419","2420","2421","2422","2423","2424","2425","2426","2427","2428","2429","2430","2431","2432","2433","2434","2435","2436","2437","2438","2439","2440","2441","2442","2443","2444","2445","2446","2447","2448","2449","2450","2451","2452","2453","2454","2455","2456","2457","2458","2459","2460","2461","2462","2463","2464","2465","2466","2467","2468","2469","2470","2471","2472","2473","2474","2475","2476","2477","2478","2479","2480","2481","2482","2483","2484","2485","2486","2487","2488","2489","2490","2491","2492","2493","2494","2495","2496","2497","2498","2499","2500","2501","2502","2503","2504","2505","2506","2507","2508","2509","2510","2511","2512","2513","2514","2515","2516","2517","2518","2519","2520","2521","2522","2523","2524","2525","2526","2527","2528","2529","2530","2531","2532","2533","2534","2535","2536","2537","2538","2539","2540","2541","2542","2543","2544","2545","2546","2547","2548","2549","2550","2551","2552","2553","2554","2555","2556","2557","2558","2559","2560","2561","2562","2563","2564","2565","2566","2567","2568","2569","2570","2571","2572","2573","2574","2575","2576","2577","2578","2579","2580","2581","2582","2583","2584","2585","2586","2587","2588","2589","2590","2591","2592","2593","2594","2595","2596","2597","2598","2599","2600","2601","2602","2603","2604","2605","2606","2607","2608","2609","2610","2611","2612","2613","2614","2615","2616","2617","2618","2619","2620","2621","2622","2623","2624","2625","2626","2627","2628","2629","2630","2631","2632","2633","2634","2635","2636","2637","2638","2639","2640","2641","2642","2643","2644","2645","2646","2647","2648","2649","2650","2651","2652","2653","2654","2655","2656","2657","2658","2659","2660","2661","2662","2663","2664","2665","2666","2667","2668","2669","2670","2671","2672","2673","2674","2675","2676","2677","2678","2679","2680","2681","2682","2683","2684","2685","2686","2687","2688","2689","2690","2691","2692","2693","2694","2695","2696","2697","2698","2699","2700","2701","2702","2703","2704","2705","2706","2707","2708","2709","2710","2711","2712","2713","2714","2715","2716","2717","2718","2719","2720","2721","2722","2723","2724","2725","2726","2727","2728","2729","2730","2731","2732","2733","2734","2735","2736","2737","2738","2739","2740","2741","2742","2743","2744","2745","2746","2747","2748","2749","2750","2751","2752","2753","2754","2755","2756","2757","2758","2759","2760","2761","2762","2763","2764","2765","2766","2767","2768","2769","2770","2771","2772","2773","2774","2775","2776","2777","2778","2779","2780","2781","2782","2783","2784","2785","2786","2787","2788","2789","2790","2791","2792","2793","2794","2795","2796","2797","2798","2799","2800","2801","2802","2803","2804","2805","2806","2807","2808","2809","2810","2811","2812","2813","2814","2815","2816","2817","2818","2819","2820","2821","2822","2823","2824","2825","2826","2827","2828","2829","2830","2831","2832","2833","2834","2835","2836","2837","2838","2839","2840","2841","2842","2843","2844","2845","2846","2847","2848","2849","2850","2851","2852","2853","2854","2855","2856","2857","2858","2859","2860","2861","2862","2863","2864","2865","2866","2867","2868","2869","2870","2871","2872","2873","2874","2875","2876","2877","2878","2879","2880","2881","2882","2883","2884","2885","2886","2887","2888","2889","2890","2891","2892","2893","2894","2895","2896","2897","2898","2899","2900","2901","2902","2903","2904","2905","2906","2907","2908","2909","2910","2911","2912","2913","2914","2915","2916","2917","2918","2919","2920","2921","2922","2923","2924","2925","2926","2927","2928","2929","2930","2931","2932","2933","2934","2935","2936","2937","2938","2939","2940","2941","2942","2943","2944","2945","2946","2947","2948","2949","2950","2951","2952","2953","2954","2955","2956","2957","2958","2959","2960","2961","2962","2963","2964","2965","2966","2967","2968","2969","2970","2971","2972","2973","2974","2975","2976","2977","2978","2979","2980","2981","2982","2983","2984","2985","2986","2987","2988","2989","2990","2991","2992","2993","2994","2995","2996","2997","2998","2999","3000","3001","3002","3003","3004","3005","3006","3007","3008","3009","3010","3011","3012","3013","3014","3015","3016","3017","3018","3019","3020","3021","3022","3023","3024","3025","3026","3027","3028","3029","3030","3031","3032","3033","3034","3035","3036","3037","3038","3039","3040","3041","3042","3043","3044","3045","3046","3047","3048","3049","3050","3051","3052","3053","3054","3055","3056","3057","3058","3059","3060","3061","3062","3063","3064","3065","3066","3067","3068","3069","3070","3071","3072","3073","3074","3075","3076","3077","3078","3079","3080","3081","3082","3083","3084","3085","3086","3087","3088","3089","3090","3091","3092","3093","3094","3095","3096","3097","3098","3099","3100","3101","3102","3103","3104","3105","3106","3107","3108","3109","3110","3111","3112","3113","3114","3115","3116","3117","3118","3119","3120","3121","3122","3123","3124","3125","3126","3127","3128","3129","3130","3131","3132","3133","3134","3135","3136","3137","3138","3139","3140","3141","3142","3143","3144","3145","3146","3147","3148","3149","3150","3151","3152","3153","3154","3155","3156","3157","3158","3159","3160","3161","3162","3163","3164","3165","3166","3167","3168","3169","3170","3171","3172","3173","3174","3175","3176","3177","3178","3179","3180","3181","3182","3183","3184","3185","3186","3187","3188","3189","3190","3191","3192","3193","3194","3195","3196","3197","3198","3199","3200","3201","3202","3203","3204","3205","3206","3207","3208","3209","3210","3211","3212","3213","3214","3215","3216","3217","3218","3219","3220","3221","3222","3223","3224","3225","3226","3227","3228","3229","3230","3231","3232","3233","3234","3235","3236","3237","3238","3239","3240","3241","3242","3243","3244","3245","3246","3247","3248","3249","3250","3251","3252","3253","3254","3255","3256","3257","3258","3259","3260","3261","3262","3263","3264","3265","3266","3267","3268","3269","3270","3271","3272","3273","3274","3275","3276","3277","3278","3279","3280","3281","3282","3283","3284","3285","3286","3287","3288","3289","3290","3291","3292","3293","3294","3295","3296","3297","3298","3299","3300","3301","3302","3303","3304","3305","3306","3307","3308","3309","3310","3311","3312","3313","3314","3315","3316","3317","3318","3319","3320","3321","3322","3323","3324","3325","3326","3327","3328","3329","3330","3331","3332","3333","3334","3335","3336","3337","3338","3339","3340","3341","3342","3343","3344","3345","3346","3347","3348","3349","3350","3351","3352","3353","3354","3355","3356","3357","3358","3359","3360","3361","3362","3363","3364","3365","3366","3367","3368","3369","3370","3371","3372","3373","3374","3375","3376","3377","3378","3379","3380","3381","3382","3383","3384","3385","3386","3387","3388","3389","3390","3391","3392","3393","3394","3395","3396","3397","3398","3399","3400","3401","3402","3403","3404","3405","3406","3407","3408","3409","3410","3411","3412","3413","3414","3415","3416","3417","3418","3419","3420","3421","3422","3423","3424","3425","3426","3427","3428","3429","3430","3431","3432","3433","3434","3435","3436","3437","3438","3439","3440","3441","3442","3443","3444","3445","3446","3447","3448","3449","3450","3451","3452","3453","3454","3455","3456","3457","3458","3459","3460","3461","3462","3463","3464","3465","3466","3467","3468","3469","3470","3471","3472","3473","3474","3475","3476","3477","3478","3479","3480","3481","3482","3483","3484","3485","3486","3487","3488","3489","3490","3491","3492","3493","3494","3495","3496","3497","3498","3499","3500","3501","3502","3503","3504","3505","3506","3507","3508","3509","3510","3511","3512","3513","3514","3515","3516","3517","3518","3519","3520","3521","3522","3523","3524","3525","3526","3527","3528","3529","3530","3531","3532","3533","3534","3535","3536","3537","3538","3539","3540","3541","3542","3543","3544","3545","3546","3547","3548","3549","3550","3551","3552","3553","3554","3555","3556","3557","3558","3559","3560","3561","3562","3563","3564","3565","3566","3567","3568","3569","3570","3571","3572","3573","3574","3575","3576","3577","3578","3579","3580","3581","3582","3583","3584","3585","3586","3587","3588","3589","3590","3591","3592","3593","3594","3595","3596","3597","3598","3599","3600","3601","3602","3603","3604","3605","3606","3607","3608","3609","3610","3611","3612","3613","3614","3615","3616","3617","3618","3619","3620","3621","3622","3623","3624","3625","3626","3627","3628","3629","3630","3631","3632","3633","3634","3635","3636","3637","3638","3639","3640","3641","3642","3643","3644","3645","3646","3647","3648","3649","3650","3651","3652","3653","3654","3655","3656","3657","3658","3659","3660","3661","3662","3663","3664","3665","3666","3667","3668","3669","3670","3671","3672","3673","3674","3675","3676","3677","3678","3679","3680","3681","3682","3683","3684","3685","3686","3687","3688","3689","3690","3691","3692","3693","3694","3695","3696","3697","3698","3699","3700","3701","3702","3703","3704","3705","3706","3707","3708","3709","3710","3711","3712","3713","3714","3715","3716","3717","3718","3719","3720","3721","3722","3723","3724","3725","3726","3727","3728","3729","3730","3731","3732","3733","3734","3735","3736","3737","3738","3739","3740","3741","3742","3743","3744","3745","3746","3747","3748","3749","3750","3751","3752","3753","3754","3755","3756","3757","3758","3759","3760","3761","3762","3763","3764","3765","3766","3767","3768","3769","3770","3771","3772","3773","3774","3775","3776","3777","3778","3779","3780","3781","3782","3783","3784","3785","3786","3787","3788","3789","3790","3791","3792","3793","3794","3795","3796","3797","3798","3799","3800","3801","3802","3803","3804","3805","3806","3807","3808","3809","3810","3811","3812","3813","3814","3815","3816","3817","3818","3819","3820","3821","3822","3823","3824","3825","3826","3827","3828","3829","3830","3831","3832","3833","3834","3835","3836","3837","3838","3839","3840","3841","3842","3843","3844","3845","3846","3847","3848","3849","3850","3851","3852","3853","3854","3855","3856","3857","3858","3859","3860","3861","3862","3863","3864","3865","3866","3867","3868","3869","3870","3871","3872","3873","3874","3875","3876","3877","3878","3879","3880","3881","3882","3883","3884","3885","3886","3887","3888","3889","3890","3891","3892","3893","3894","3895","3896","3897","3898","3899","3900","3901","3902","3903","3904","3905","3906","3907","3908","3909","3910","3911","3912","3913","3914","3915","3916","3917","3918","3919","3920","3921","3922","3923","3924","3925","3926","3927","3928","3929","3930","3931","3932","3933","3934","3935","3936","3937","3938","3939","3940","3941","3942","3943","3944","3945","3946","3947","3948","3949","3950","3951","3952","3953","3954","3955","3956","3957","3958","3959","3960","3961","3962","3963","3964","3965","3966","3967","3968","3969","3970","3971","3972","3973","3974","3975","3976","3977","3978","3979","3980","3981","3982","3983","3984","3985","3986","3987","3988","3989","3990","3991","3992","3993","3994","3995","3996","3997","3998","3999","4000","4001","4002","4003","4004","4005","4006","4007","4008","4009","4010","4011","4012","4013","4014","4015","4016","4017","4018","4019","4020","4021","4022","4023","4024","4025","4026","4027","4028","4029","4030","4031","4032","4033","4034","4035","4036","4037","4038","4039","4040","4041","4042","4043","4044","4045","4046","4047","4048","4049","4050","4051","4052","4053","4054","4055","4056","4057","4058","4059","4060","4061","4062","4063","4064","4065","4066","4067","4068","4069","4070","4071","4072","4073","4074","4075","4076","4077","4078","4079","4080","4081","4082","4083","4084","4085","4086","4087","4088","4089","4090","4091","4092","4093","4094","4095","4096","4097","4098","4099","4100","4101","4102","4103","4104","4105","4106","4107","4108","4109","4110","4111","4112","4113","4114","4115","4116","4117","4118","4119","4120","4121","4122","4123","4124","4125","4126","4127","4128","4129","4130","4131","4132","4133","4134","4135","4136","4137","4138","4139","4140","4141","4142","4143","4144","4145","4146","4147","4148","4149","4150","4151","4152","4153","4154","4155","4156","4157","4158","4159","4160","4161","4162","4163","4164","4165","4166","4167","4168","4169","4170","4171","4172","4173","4174","4175","4176","4177","4178","4179","4180","4181","4182","4183","4184","4185","4186","4187","4188","4189","4190","4191","4192","4193","4194","4195","4196","4197","4198","4199","4200","4201","4202","4203","4204","4205","4206","4207","4208","4209","4210","4211","4212","4213","4214","4215","4216","4217","4218","4219","4220","4221","4222","4223","4224","4225","4226","4227","4228","4229","4230","4231","4232","4233","4234","4235","4236","4237","4238","4239","4240","4241","4242","4243","4244","4245","4246","4247","4248","4249","4250","4251","4252","4253","4254","4255","4256","4257","4258","4259","4260","4261","4262","4263","4264","4265","4266","4267","4268","4269","4270","4271","4272","4273","4274","4275","4276","4277","4278","4279","4280","4281","4282","4283","4284","4285","4286","4287","4288","4289","4290","4291","4292","4293","4294","4295","4296","4297","4298","4299","4300","4301","4302","4303","4304","4305","4306","4307","4308","4309","4310","4311","4312","4313","4314","4315","4316","4317","4318","4319","4320","4321","4322","4323","4324","4325","4326","4327","4328","4329","4330","4331","4332","4333","4334","4335","4336","4337","4338","4339","4340","4341","4342","4343","4344","4345","4346","4347","4348","4349","4350","4351","4352","4353","4354","4355","4356","4357","4358","4359","4360","4361","4362","4363","4364","4365","4366","4367","4368","4369","4370","4371","4372","4373","4374","4375","4376","4377","4378","4379","4380","4381","4382","4383","4384","4385","4386","4387","4388","4389","4390","4391","4392","4393","4394","4395","4396","4397","4398","4399","4400","4401","4402","4403","4404","4405","4406","4407","4408","4409","4410","4411","4412","4413","4414","4415","4416","4417","4418","4419","4420","4421","4422","4423","4424","4425","4426","4427","4428","4429","4430","4431","4432","4433","4434","4435","4436","4437","4438","4439","4440","4441","4442","4443","4444","4445","4446","4447","4448","4449","4450","4451","4452","4453","4454","4455","4456","4457","4458","4459","4460","4461","4462","4463","4464","4465","4466","4467","4468","4469","4470","4471","4472","4473","4474","4475","4476","4477","4478","4479","4480","4481","4482","4483","4484","4485","4486","4487","4488","4489","4490","4491","4492","4493","4494","4495","4496","4497","4498","4499","4500","4501","4502","4503","4504","4505","4506","4507","4508","4509","4510","4511","4512","4513","4514","4515","4516","4517","4518","4519","4520","4521","4522","4523","4524","4525","4526","4527","4528","4529","4530","4531","4532","4533","4534","4535","4536","4537","4538","4539","4540","4541","4542","4543","4544","4545","4546","4547","4548","4549","4550","4551","4552","4553","4554","4555","4556","4557","4558","4559","4560","4561","4562","4563","4564","4565","4566","4567","4568","4569","4570","4571","4572","4573","4574","4575","4576","4577","4578","4579","4580","4581","4582","4583","4584","4585","4586","4587","4588","4589","4590","4591","4592","4593","4594","4595","4596","4597","4598","4599","4600","4601","4602","4603","4604","4605","4606","4607","4608","4609","4610","4611","4612","4613","4614","4615","4616","4617","4618","4619","4620","4621","4622","4623","4624","4625","4626","4627","4628","4629","4630","4631","4632","4633","4634","4635","4636","4637","4638","4639","4640","4641","4642","4643","4644","4645","4646","4647","4648","4649","4650","4651","4652","4653","4654","4655","4656","4657","4658","4659","4660","4661","4662","4663","4664","4665","4666","4667","4668","4669","4670","4671","4672","4673","4674","4675","4676","4677","4678","4679","4680","4681","4682","4683","4684","4685","4686","4687","4688","4689","4690","4691","4692","4693","4694","4695","4696","4697","4698","4699","4700","4701","4702","4703","4704","4705","4706","4707","4708","4709","4710","4711","4712","4713","4714","4715","4716","4717","4718","4719","4720","4721","4722","4723","4724","4725","4726","4727","4728","4729","4730","4731","4732","4733","4734","4735","4736","4737","4738","4739","4740","4741","4742","4743","4744","4745","4746","4747","4748","4749","4750","4751","4752","4753","4754","4755","4756","4757","4758","4759","4760","4761","4762","4763","4764","4765","4766","4767","4768","4769","4770","4771","4772","4773","4774","4775","4776","4777","4778","4779","4780","4781","4782","4783","4784","4785","4786","4787","4788","4789","4790","4791","4792","4793","4794","4795","4796","4797","4798","4799","4800","4801","4802","4803","4804","4805","4806","4807","4808","4809","4810","4811","4812","4813","4814","4815","4816","4817","4818","4819","4820","4821","4822","4823","4824","4825","4826","4827","4828","4829","4830","4831","4832","4833","4834","4835","4836","4837","4838","4839","4840","4841","4842","4843","4844","4845","4846","4847","4848","4849","4850","4851","4852","4853","4854","4855","4856","4857","4858","4859","4860","4861","4862","4863","4864","4865","4866","4867","4868","4869","4870","4871","4872","4873","4874","4875","4876","4877","4878","4879","4880","4881","4882","4883","4884","4885","4886","4887","4888","4889","4890","4891","4892","4893","4894","4895","4896","4897","4898","4899","4900","4901","4902","4903","4904","4905","4906","4907","4908","4909","4910","4911","4912","4913","4914","4915","4916","4917","4918","4919","4920","4921","4922","4923","4924","4925","4926","4927","4928","4929","4930","4931","4932","4933","4934","4935","4936","4937","4938","4939","4940","4941","4942","4943","4944","4945","4946","4947","4948","4949","4950","4951","4952","4953","4954","4955","4956","4957","4958","4959","4960","4961","4962","4963","4964","4965","4966","4967","4968","4969","4970","4971","4972","4973","4974","4975","4976","4977","4978","4979","4980","4981","4982","4983","4984","4985","4986","4987","4988","4989","4990","4991","4992","4993","4994","4995","4996","4997","4998","4999","5000","5001","5002","5003","5004","5005","5006","5007","5008","5009","5010","5011","5012","5013","5014","5015","5016","5017","5018","5019","5020","5021","5022","5023","5024","5025","5026","5027","5028","5029","5030","5031","5032","5033","5034","5035","5036","5037","5038","5039","5040","5041","5042","5043","5044","5045","5046","5047","5048","5049","5050","5051","5052","5053","5054","5055","5056","5057","5058","5059","5060","5061","5062","5063","5064","5065","5066","5067","5068","5069","5070","5071","5072","5073","5074","5075","5076","5077","5078","5079","5080","5081","5082","5083","5084","5085","5086","5087","5088","5089","5090","5091","5092","5093","5094","5095","5096","5097","5098","5099","5100","5101","5102","5103","5104","5105","5106","5107","5108","5109","5110","5111","5112","5113","5114","5115","5116","5117","5118","5119","5120","5121","5122","5123","5124","5125","5126","5127","5128","5129","5130","5131","5132","5133","5134","5135","5136","5137","5138","5139","5140","5141","5142","5143","5144","5145","5146","5147","5148","5149","5150","5151","5152","5153","5154","5155","5156","5157","5158","5159","5160","5161","5162","5163","5164","5165","5166","5167","5168","5169","5170","5171","5172","5173","5174","5175","5176","5177","5178","5179","5180","5181","5182","5183","5184","5185","5186","5187","5188","5189","5190","5191","5192","5193","5194","5195","5196","5197","5198","5199","5200","5201","5202","5203","5204","5205","5206","5207","5208","5209","5210","5211","5212","5213","5214","5215","5216","5217","5218","5219","5220","5221","5222","5223","5224","5225","5226","5227","5228","5229","5230","5231","5232","5233","5234","5235","5236","5237","5238","5239","5240","5241","5242","5243","5244","5245","5246","5247","5248","5249","5250","5251","5252","5253","5254","5255","5256","5257","5258","5259","5260","5261","5262","5263","5264","5265","5266","5267","5268","5269","5270","5271","5272","5273","5274","5275","5276","5277","5278","5279","5280","5281","5282","5283","5284","5285","5286","5287","5288","5289","5290","5291","5292","5293","5294","5295","5296","5297","5298","5299","5300","5301","5302","5303","5304","5305","5306","5307","5308","5309","5310","5311","5312","5313","5314","5315","5316","5317","5318","5319","5320","5321","5322","5323","5324","5325","5326","5327","5328","5329","5330","5331","5332","5333","5334","5335","5336","5337","5338","5339","5340","5341","5342","5343","5344","5345","5346","5347","5348","5349","5350","5351","5352","5353","5354","5355","5356","5357","5358","5359","5360","5361","5362","5363","5364","5365","5366","5367","5368","5369","5370","5371","5372","5373","5374","5375","5376","5377","5378","5379","5380","5381","5382","5383","5384","5385","5386","5387","5388","5389","5390","5391","5392","5393","5394","5395","5396","5397","5398","5399","5400","5401","5402","5403","5404","5405","5406","5407","5408","5409","5410","5411","5412","5413","5414","5415","5416","5417","5418","5419","5420","5421","5422","5423","5424","5425","5426","5427","5428","5429","5430","5431","5432","5433","5434","5435","5436","5437","5438","5439","5440","5441","5442","5443","5444","5445","5446","5447","5448","5449","5450","5451","5452","5453","5454","5455","5456","5457","5458","5459","5460","5461","5462","5463","5464","5465","5466","5467","5468","5469","5470","5471","5472","5473","5474","5475","5476","5477","5478","5479","5480","5481","5482","5483","5484","5485","5486","5487","5488","5489","5490","5491","5492","5493","5494","5495","5496","5497","5498","5499","5500","5501","5502","5503","5504","5505","5506","5507","5508","5509","5510","5511","5512","5513","5514","5515","5516","5517","5518","5519","5520","5521","5522","5523","5524","5525","5526","5527","5528","5529","5530","5531","5532","5533","5534","5535","5536","5537","5538","5539","5540","5541","5542","5543","5544","5545","5546","5547","5548","5549","5550","5551","5552","5553","5554","5555","5556","5557","5558","5559","5560","5561","5562","5563","5564","5565","5566","5567","5568","5569","5570","5571","5572","5573","5574","5575","5576","5577","5578","5579","5580","5581","5582","5583","5584","5585","5586","5587","5588","5589","5590","5591","5592","5593","5594","5595","5596","5597","5598","5599","5600","5601","5602","5603","5604","5605","5606","5607","5608","5609","5610","5611","5612","5613","5614","5615","5616","5617","5618","5619","5620","5621","5622","5623","5624","5625","5626","5627","5628","5629","5630","5631","5632","5633","5634","5635","5636","5637","5638","5639","5640","5641","5642","5643","5644","5645","5646","5647","5648","5649","5650","5651","5652","5653","5654","5655","5656","5657","5658","5659","5660","5661","5662","5663","5664","5665","5666","5667","5668","5669","5670","5671","5672","5673","5674","5675","5676","5677","5678","5679","5680","5681","5682","5683","5684","5685","5686","5687","5688","5689","5690","5691","5692","5693","5694","5695","5696","5697","5698","5699","5700","5701","5702","5703","5704","5705","5706","5707","5708","5709","5710","5711","5712","5713","5714","5715","5716","5717","5718","5719","5720","5721","5722","5723","5724","5725","5726","5727","5728","5729","5730","5731","5732","5733","5734","5735","5736","5737","5738","5739","5740","5741","5742","5743","5744","5745","5746","5747","5748","5749","5750","5751","5752","5753","5754","5755","5756","5757","5758","5759","5760","5761","5762","5763","5764","5765","5766","5767","5768","5769","5770","5771","5772","5773","5774","5775","5776","5777","5778","5779","5780","5781","5782","5783","5784","5785","5786","5787","5788","5789","5790","5791","5792","5793","5794","5795","5796","5797","5798","5799","5800","5801","5802","5803","5804","5805","5806","5807","5808","5809","5810","5811","5812","5813","5814","5815","5816","5817","5818","5819","5820","5821","5822","5823","5824","5825","5826","5827","5828","5829","5830","5831","5832","5833","5834","5835","5836","5837","5838","5839","5840","5841","5842","5843","5844","5845","5846","5847","5848","5849","5850","5851","5852","5853","5854","5855","5856","5857","5858","5859","5860","5861","5862","5863","5864","5865","5866","5867","5868","5869","5870","5871","5872","5873","5874","5875","5876","5877","5878","5879","5880","5881","5882","5883","5884","5885","5886","5887","5888","5889","5890","5891","5892","5893","5894","5895","5896","5897","5898","5899","5900","5901","5902","5903","5904","5905","5906","5907","5908","5909","5910","5911","5912","5913","5914","5915","5916","5917","5918","5919","5920","5921","5922","5923","5924","5925","5926","5927","5928","5929","5930","5931","5932","5933","5934","5935","5936","5937","5938","5939","5940","5941","5942","5943","5944","5945","5946","5947","5948","5949","5950","5951","5952","5953","5954","5955","5956","5957","5958","5959","5960","5961","5962","5963","5964","5965","5966","5967","5968","5969","5970","5971","5972","5973","5974","5975","5976","5977","5978","5979","5980","5981","5982","5983","5984","5985","5986","5987","5988","5989","5990","5991","5992","5993","5994","5995","5996","5997","5998","5999","6000","6001","6002","6003","6004","6005","6006","6007","6008","6009","6010","6011","6012","6013","6014","6015","6016","6017","6018","6019","6020","6021","6022","6023","6024","6025","6026","6027","6028","6029","6030","6031","6032","6033","6034","6035","6036","6037","6038","6039","6040","6041","6042","6043","6044","6045","6046","6047","6048","6049","6050","6051","6052","6053","6054","6055","6056","6057","6058","6059","6060","6061","6062","6063","6064","6065","6066","6067","6068","6069","6070","6071","6072","6073","6074","6075","6076","6077","6078","6079","6080","6081","6082","6083","6084","6085","6086","6087","6088","6089","6090","6091","6092","6093","6094","6095","6096","6097","6098","6099","6100","6101","6102","6103","6104","6105","6106","6107","6108","6109","6110","6111","6112","6113","6114","6115","6116","6117","6118","6119","6120","6121","6122","6123","6124","6125","6126","6127","6128","6129","6130","6131","6132","6133","6134","6135","6136","6137","6138","6139","6140","6141","6142","6143","6144","6145","6146","6147","6148","6149","6150","6151","6152","6153","6154","6155","6156","6157","6158","6159","6160","6161","6162","6163","6164","6165","6166","6167","6168","6169","6170","6171","6172","6173","6174","6175","6176","6177","6178","6179","6180","6181","6182","6183","6184","6185","6186","6187","6188","6189","6190","6191","6192","6193","6194","6195","6196","6197","6198","6199","6200","6201","6202","6203","6204","6205","6206","6207","6208","6209","6210","6211","6212","6213","6214","6215","6216","6217","6218","6219","6220","6221","6222","6223","6224","6225","6226","6227","6228","6229","6230","6231","6232","6233","6234","6235","6236","6237","6238","6239","6240","6241","6242","6243","6244","6245","6246","6247","6248","6249","6250","6251","6252","6253","6254","6255","6256","6257","6258","6259","6260","6261","6262","6263","6264","6265","6266","6267","6268","6269","6270","6271","6272","6273","6274","6275","6276","6277","6278","6279","6280","6281","6282","6283","6284","6285","6286","6287","6288","6289","6290","6291","6292","6293","6294","6295","6296","6297","6298","6299","6300","6301","6302","6303","6304","6305","6306","6307","6308","6309","6310","6311","6312","6313","6314","6315","6316","6317","6318","6319","6320","6321","6322","6323","6324","6325","6326","6327","6328","6329","6330","6331","6332","6333","6334","6335","6336","6337","6338","6339","6340","6341","6342","6343","6344","6345","6346","6347","6348","6349","6350","6351","6352","6353","6354","6355","6356","6357","6358","6359","6360","6361","6362","6363","6364","6365","6366","6367","6368","6369","6370","6371","6372","6373","6374","6375","6376","6377","6378","6379","6380","6381","6382","6383","6384","6385","6386","6387","6388","6389","6390","6391","6392","6393","6394","6395","6396","6397","6398","6399","6400","6401","6402","6403","6404","6405","6406","6407","6408","6409","6410","6411","6412","6413","6414","6415","6416","6417","6418","6419","6420","6421","6422","6423","6424","6425","6426","6427","6428","6429","6430","6431","6432","6433","6434","6435","6436","6437","6438","6439","6440","6441","6442","6443","6444","6445","6446","6447","6448","6449","6450","6451","6452","6453","6454","6455","6456","6457","6458","6459","6460","6461","6462","6463","6464","6465","6466","6467","6468","6469","6470","6471","6472","6473","6474","6475","6476","6477","6478","6479","6480","6481","6482","6483","6484","6485","6486","6487","6488","6489","6490","6491","6492","6493","6494","6495","6496","6497","6498","6499","6500","6501","6502","6503","6504","6505","6506","6507","6508","6509","6510","6511","6512","6513","6514","6515","6516","6517","6518","6519","6520","6521","6522","6523","6524","6525","6526","6527","6528","6529","6530","6531","6532","6533","6534","6535","6536","6537","6538","6539","6540","6541","6542","6543","6544","6545","6546","6547","6548","6549","6550","6551","6552","6553","6554","6555","6556","6557","6558","6559","6560","6561","6562","6563","6564","6565","6566","6567","6568","6569","6570","6571","6572","6573","6574","6575","6576","6577","6578","6579","6580","6581","6582","6583","6584","6585","6586","6587","6588","6589","6590","6591","6592","6593","6594","6595","6596","6597","6598","6599","6600","6601","6602","6603","6604","6605","6606","6607","6608","6609","6610","6611","6612","6613","6614","6615","6616","6617","6618","6619","6620","6621","6622","6623","6624","6625","6626","6627","6628","6629","6630","6631","6632","6633","6634","6635","6636","6637","6638","6639","6640","6641","6642","6643","6644","6645","6646","6647","6648","6649","6650","6651","6652","6653","6654","6655","6656","6657","6658","6659","6660","6661","6662","6663","6664","6665","6666","6667","6668","6669","6670","6671","6672","6673","6674","6675","6676","6677","6678","6679","6680","6681","6682","6683","6684","6685","6686","6687","6688","6689","6690","6691","6692","6693","6694","6695","6696","6697","6698","6699","6700","6701","6702","6703","6704","6705","6706","6707","6708","6709","6710","6711","6712","6713","6714","6715","6716","6717","6718","6719","6720","6721","6722","6723","6724","6725","6726","6727","6728","6729","6730","6731","6732","6733","6734","6735","6736","6737","6738","6739","6740","6741","6742","6743","6744","6745","6746","6747","6748","6749","6750","6751","6752","6753","6754","6755","6756","6757","6758","6759","6760","6761","6762","6763","6764","6765","6766","6767","6768","6769","6770","6771","6772","6773","6774","6775","6776","6777","6778","6779","6780","6781","6782","6783","6784","6785","6786","6787","6788","6789","6790","6791","6792","6793","6794","6795","6796","6797","6798","6799","6800","6801","6802","6803","6804","6805","6806","6807","6808","6809","6810","6811","6812","6813","6814","6815","6816","6817","6818","6819","6820","6821","6822","6823","6824","6825","6826","6827","6828","6829","6830","6831","6832","6833","6834","6835","6836","6837","6838","6839","6840","6841","6842","6843","6844","6845","6846","6847","6848","6849","6850","6851","6852","6853","6854","6855","6856","6857","6858","6859","6860","6861","6862","6863","6864","6865","6866","6867","6868","6869","6870","6871","6872","6873","6874","6875","6876","6877","6878","6879","6880","6881","6882","6883","6884","6885","6886","6887","6888","6889","6890","6891","6892","6893","6894","6895","6896","6897","6898","6899","6900","6901","6902","6903","6904","6905","6906","6907","6908","6909","6910","6911","6912","6913","6914","6915","6916","6917","6918","6919","6920","6921","6922","6923","6924","6925","6926","6927","6928","6929","6930","6931","6932","6933","6934","6935","6936","6937","6938","6939","6940","6941","6942","6943","6944","6945","6946","6947","6948","6949","6950","6951","6952","6953","6954","6955","6956","6957","6958","6959","6960","6961","6962","6963","6964","6965","6966","6967","6968","6969","6970","6971","6972","6973","6974","6975","6976","6977","6978","6979","6980","6981","6982","6983","6984","6985","6986","6987","6988","6989","6990","6991","6992","6993","6994","6995","6996","6997","6998","6999","7000","7001","7002","7003","7004","7005","7006","7007","7008","7009","7010","7011","7012","7013","7014","7015","7016","7017","7018","7019","7020","7021","7022","7023","7024","7025","7026","7027","7028","7029","7030","7031","7032","7033","7034","7035","7036","7037","7038","7039","7040","7041","7042","7043","7044","7045","7046","7047","7048","7049","7050","7051","7052","7053","7054","7055","7056","7057","7058","7059","7060","7061","7062","7063","7064","7065","7066","7067","7068","7069","7070","7071","7072","7073","7074","7075","7076","7077","7078","7079","7080","7081","7082","7083","7084","7085","7086","7087","7088","7089","7090","7091","7092","7093","7094","7095","7096","7097","7098","7099","7100","7101","7102","7103","7104","7105","7106","7107","7108","7109","7110","7111","7112","7113","7114","7115","7116","7117","7118","7119","7120","7121","7122","7123","7124","7125","7126","7127","7128","7129","7130","7131","7132","7133","7134","7135","7136","7137","7138","7139","7140","7141","7142","7143","7144","7145","7146","7147","7148","7149","7150","7151","7152","7153","7154","7155","7156","7157","7158","7159","7160","7161","7162","7163","7164","7165","7166","7167","7168","7169","7170","7171","7172","7173","7174","7175","7176","7177","7178","7179","7180","7181","7182","7183","7184","7185","7186","7187","7188","7189","7190","7191","7192","7193","7194","7195","7196","7197","7198","7199","7200","7201","7202","7203","7204","7205","7206","7207","7208","7209","7210","7211","7212","7213","7214","7215","7216","7217","7218","7219","7220","7221","7222","7223","7224","7225","7226","7227","7228","7229","7230","7231","7232","7233","7234","7235","7236","7237","7238","7239","7240","7241","7242","7243","7244","7245","7246","7247","7248","7249","7250","7251","7252","7253","7254","7255","7256","7257","7258","7259","7260","7261","7262","7263","7264","7265","7266","7267","7268","7269","7270","7271","7272","7273","7274","7275","7276","7277","7278","7279","7280","7281","7282","7283","7284","7285","7286","7287","7288","7289","7290","7291","7292","7293","7294","7295","7296","7297","7298","7299","7300","7301","7302","7303","7304","7305","7306","7307","7308","7309","7310","7311","7312","7313","7314","7315","7316","7317","7318","7319","7320","7321","7322","7323","7324","7325","7326","7327","7328","7329","7330","7331","7332","7333","7334","7335","7336","7337","7338","7339","7340","7341","7342","7343","7344","7345","7346","7347","7348","7349","7350","7351","7352","7353","7354","7355","7356","7357","7358","7359","7360","7361","7362","7363","7364","7365","7366","7367","7368","7369","7370","7371","7372","7373","7374","7375","7376","7377","7378","7379","7380","7381","7382","7383","7384","7385","7386","7387","7388","7389","7390","7391","7392","7393","7394","7395","7396","7397","7398","7399","7400","7401","7402","7403","7404","7405","7406","7407","7408","7409","7410","7411","7412","7413","7414","7415","7416","7417","7418","7419","7420","7421","7422","7423","7424","7425","7426","7427","7428","7429","7430","7431","7432","7433","7434","7435","7436","7437","7438","7439","7440","7441","7442","7443","7444","7445","7446","7447","7448","7449","7450","7451","7452","7453","7454","7455","7456","7457","7458","7459","7460","7461","7462","7463","7464","7465","7466","7467","7468","7469","7470","7471","7472","7473","7474","7475","7476","7477","7478","7479","7480","7481","7482","7483","7484","7485","7486","7487","7488","7489","7490","7491","7492","7493","7494","7495","7496","7497","7498","7499","7500","7501","7502","7503","7504","7505","7506","7507","7508","7509","7510","7511","7512","7513","7514","7515","7516","7517","7518","7519","7520","7521","7522","7523","7524","7525","7526","7527","7528","7529","7530","7531","7532","7533","7534","7535","7536","7537","7538","7539","7540","7541","7542","7543","7544","7545","7546","7547","7548","7549","7550","7551","7552","7553","7554","7555","7556","7557","7558","7559","7560","7561","7562","7563","7564","7565","7566","7567","7568","7569","7570","7571","7572","7573","7574","7575","7576","7577","7578","7579","7580","7581","7582","7583","7584","7585","7586","7587","7588","7589","7590","7591","7592","7593","7594","7595","7596","7597","7598","7599","7600","7601","7602","7603","7604","7605","7606","7607","7608","7609","7610","7611","7612","7613","7614","7615","7616","7617","7618","7619","7620","7621","7622","7623","7624","7625","7626","7627","7628","7629","7630","7631","7632","7633","7634","7635","7636","7637","7638","7639","7640","7641","7642","7643","7644","7645","7646","7647","7648","7649","7650","7651","7652","7653","7654","7655","7656","7657","7658","7659","7660","7661","7662","7663","7664","7665","7666","7667","7668","7669","7670","7671","7672","7673","7674","7675","7676","7677","7678","7679","7680","7681","7682","7683","7684","7685","7686","7687","7688","7689","7690","7691","7692","7693","7694","7695","7696","7697","7698","7699","7700","7701","7702","7703","7704","7705","7706","7707","7708","7709","7710","7711","7712","7713","7714","7715","7716","7717","7718","7719","7720","7721","7722","7723","7724","7725","7726","7727","7728","7729","7730","7731","7732","7733","7734","7735","7736","7737","7738","7739","7740","7741","7742","7743","7744","7745","7746","7747","7748","7749","7750","7751","7752","7753","7754","7755","7756","7757","7758","7759","7760","7761","7762","7763","7764","7765","7766","7767","7768","7769","7770","7771","7772","7773","7774","7775","7776","7777","7778","7779","7780","7781","7782","7783","7784","7785","7786","7787","7788","7789","7790","7791","7792","7793","7794","7795","7796","7797","7798","7799","7800","7801","7802","7803","7804","7805","7806","7807","7808","7809","7810","7811","7812","7813","7814","7815","7816","7817","7818","7819","7820","7821","7822","7823","7824","7825","7826","7827","7828","7829","7830","7831","7832","7833","7834","7835","7836","7837","7838","7839","7840","7841","7842","7843","7844","7845","7846","7847","7848","7849","7850","7851","7852","7853","7854","7855","7856","7857","7858","7859","7860","7861","7862","7863","7864","7865","7866","7867","7868","7869","7870","7871","7872","7873","7874","7875","7876","7877","7878","7879","7880","7881","7882","7883","7884","7885","7886","7887","7888","7889","7890","7891","7892","7893","7894","7895","7896","7897","7898","7899","7900","7901","7902","7903","7904","7905","7906","7907","7908","7909","7910","7911","7912","7913","7914","7915","7916","7917","7918","7919","7920","7921","7922","7923","7924","7925","7926","7927","7928","7929","7930","7931","7932","7933","7934","7935","7936","7937","7938","7939","7940","7941","7942","7943","7944","7945","7946","7947","7948","7949","7950","7951","7952","7953","7954","7955","7956","7957","7958","7959","7960","7961","7962","7963","7964","7965","7966","7967","7968","7969","7970","7971","7972","7973","7974","7975","7976","7977","7978","7979","7980","7981","7982","7983","7984","7985","7986","7987","7988","7989","7990","7991","7992","7993","7994","7995","7996","7997","7998","7999","8000","8001","8002","8003","8004","8005","8006","8007","8008","8009","8010","8011","8012","8013","8014","8015","8016","8017","8018","8019","8020","8021","8022","8023","8024","8025","8026","8027","8028","8029","8030","8031","8032","8033","8034","8035","8036","8037","8038","8039","8040","8041","8042","8043","8044","8045","8046","8047","8048","8049","8050","8051","8052","8053","8054","8055","8056","8057","8058","8059","8060","8061","8062","8063","8064","8065","8066","8067","8068","8069","8070","8071","8072","8073","8074","8075","8076","8077","8078","8079","8080","8081","8082","8083","8084","8085","8086","8087","8088","8089","8090","8091","8092","8093","8094","8095","8096","8097","8098","8099","8100","8101","8102","8103","8104","8105","8106","8107","8108","8109","8110","8111","8112","8113","8114","8115","8116","8117","8118","8119","8120","8121","8122","8123","8124","8125","8126","8127","8128","8129","8130","8131","8132","8133","8134","8135","8136","8137","8138","8139","8140","8141","8142","8143","8144","8145","8146","8147","8148","8149","8150","8151","8152","8153","8154","8155","8156","8157","8158","8159","8160","8161","8162","8163","8164","8165","8166","8167","8168","8169","8170","8171","8172","8173","8174","8175","8176","8177","8178","8179","8180","8181","8182","8183","8184","8185","8186","8187","8188","8189","8190","8191","8192","8193","8194","8195","8196","8197","8198","8199","8200","8201","8202","8203","8204","8205","8206","8207","8208","8209","8210","8211","8212","8213","8214","8215","8216","8217","8218","8219","8220","8221","8222","8223","8224","8225","8226","8227","8228","8229","8230","8231","8232","8233","8234","8235","8236","8237","8238","8239","8240","8241","8242","8243","8244","8245","8246","8247","8248","8249","8250","8251","8252","8253","8254","8255","8256","8257","8258","8259","8260","8261","8262","8263","8264","8265","8266","8267","8268","8269","8270","8271","8272","8273","8274","8275","8276","8277","8278","8279","8280","8281","8282","8283","8284","8285","8286","8287","8288","8289","8290","8291","8292","8293","8294","8295","8296","8297","8298","8299","8300","8301","8302","8303","8304","8305","8306","8307","8308","8309","8310","8311","8312","8313","8314","8315","8316","8317","8318","8319","8320","8321","8322","8323","8324","8325","8326","8327","8328","8329","8330","8331","8332","8333","8334","8335","8336","8337","8338","8339","8340","8341","8342","8343","8344","8345","8346","8347","8348","8349","8350","8351","8352","8353","8354","8355","8356","8357","8358","8359","8360","8361","8362","8363","8364","8365","8366","8367","8368","8369","8370","8371","8372","8373","8374","8375","8376","8377","8378","8379","8380","8381","8382","8383","8384","8385","8386","8387","8388","8389","8390","8391","8392","8393","8394","8395","8396","8397","8398","8399","8400","8401","8402","8403","8404","8405","8406","8407","8408","8409","8410","8411","8412","8413","8414","8415","8416","8417","8418","8419","8420","8421","8422","8423","8424","8425","8426","8427","8428","8429","8430","8431","8432","8433","8434","8435","8436","8437","8438","8439","8440","8441","8442","8443","8444","8445","8446","8447","8448","8449","8450","8451","8452","8453","8454","8455","8456","8457","8458","8459","8460","8461","8462","8463","8464","8465","8466","8467","8468","8469","8470","8471","8472","8473","8474","8475","8476","8477","8478","8479","8480","8481","8482","8483","8484","8485","8486","8487","8488","8489","8490","8491","8492","8493","8494","8495","8496","8497","8498","8499","8500","8501","8502","8503","8504","8505","8506","8507","8508","8509","8510","8511","8512","8513","8514","8515","8516","8517","8518","8519","8520","8521","8522","8523","8524","8525","8526","8527","8528","8529","8530","8531","8532","8533","8534","8535","8536","8537","8538","8539","8540","8541","8542","8543","8544","8545","8546","8547","8548","8549","8550","8551","8552","8553","8554","8555","8556","8557","8558","8559","8560","8561","8562","8563","8564","8565","8566","8567","8568","8569","8570","8571","8572","8573","8574","8575","8576","8577","8578","8579","8580","8581","8582","8583","8584","8585","8586","8587","8588","8589","8590","8591","8592","8593","8594","8595","8596","8597","8598","8599","8600","8601","8602","8603","8604","8605","8606","8607","8608","8609","8610","8611","8612","8613","8614","8615","8616","8617","8618","8619","8620","8621","8622","8623","8624","8625","8626","8627","8628","8629","8630","8631","8632","8633","8634","8635","8636","8637","8638","8639","8640","8641","8642","8643","8644","8645","8646","8647","8648","8649","8650","8651","8652","8653","8654","8655","8656","8657","8658","8659","8660","8661","8662","8663","8664","8665","8666","8667","8668","8669","8670","8671","8672","8673","8674","8675","8676","8677","8678","8679","8680","8681","8682","8683","8684","8685","8686","8687","8688","8689","8690","8691","8692","8693","8694","8695","8696","8697","8698","8699","8700","8701","8702","8703","8704","8705","8706","8707","8708","8709","8710","8711","8712","8713","8714","8715","8716","8717","8718","8719","8720","8721","8722","8723","8724","8725","8726","8727","8728","8729","8730","8731","8732","8733","8734","8735","8736","8737","8738","8739","8740","8741","8742","8743","8744","8745","8746","8747","8748","8749","8750","8751","8752","8753","8754","8755","8756","8757","8758","8759","8760","8761","8762","8763","8764","8765","8766","8767","8768","8769","8770","8771","8772","8773","8774","8775","8776","8777","8778","8779","8780","8781","8782","8783","8784","8785","8786","8787","8788","8789","8790","8791","8792","8793","8794","8795","8796","8797","8798","8799","8800","8801","8802","8803","8804","8805","8806","8807","8808","8809","8810","8811","8812","8813","8814","8815","8816","8817","8818","8819","8820","8821","8822","8823","8824","8825","8826","8827","8828","8829","8830","8831","8832","8833","8834","8835","8836","8837","8838","8839","8840","8841","8842","8843","8844","8845","8846","8847","8848","8849","8850","8851","8852","8853","8854","8855","8856","8857","8858","8859","8860","8861","8862","8863","8864","8865","8866","8867","8868","8869","8870","8871","8872","8873","8874","8875","8876","8877","8878","8879","8880","8881","8882","8883","8884","8885","8886","8887","8888","8889","8890","8891","8892","8893","8894","8895","8896","8897","8898","8899","8900","8901","8902","8903","8904","8905","8906","8907","8908","8909","8910","8911","8912","8913","8914","8915","8916","8917","8918","8919","8920","8921","8922","8923","8924","8925","8926","8927","8928","8929","8930","8931","8932","8933","8934","8935","8936","8937","8938","8939","8940","8941","8942","8943","8944","8945","8946","8947","8948","8949","8950","8951","8952","8953","8954","8955","8956","8957","8958","8959","8960","8961","8962","8963","8964","8965","8966","8967","8968","8969","8970","8971","8972","8973","8974","8975","8976","8977","8978","8979","8980","8981","8982","8983","8984","8985","8986","8987","8988","8989","8990","8991","8992","8993","8994","8995","8996","8997","8998","8999","9000","9001","9002","9003","9004","9005","9006","9007","9008","9009","9010","9011","9012","9013","9014","9015","9016","9017","9018","9019","9020","9021","9022","9023","9024","9025","9026","9027","9028","9029","9030","9031","9032","9033","9034","9035","9036","9037","9038","9039","9040","9041","9042","9043","9044","9045","9046","9047","9048","9049","9050","9051","9052","9053","9054","9055","9056","9057","9058","9059","9060","9061","9062","9063","9064","9065","9066","9067","9068","9069","9070","9071","9072","9073","9074","9075","9076","9077","9078","9079","9080","9081","9082","9083","9084","9085","9086","9087","9088","9089","9090","9091","9092","9093","9094","9095","9096","9097","9098","9099","9100","9101","9102","9103","9104","9105","9106","9107","9108","9109","9110","9111","9112","9113","9114","9115","9116","9117","9118","9119","9120","9121","9122","9123","9124","9125","9126","9127","9128","9129","9130","9131","9132","9133","9134","9135","9136","9137","9138","9139","9140","9141","9142","9143","9144","9145","9146","9147","9148","9149","9150","9151","9152","9153","9154","9155","9156","9157","9158","9159","9160","9161","9162","9163","9164","9165","9166","9167","9168","9169","9170","9171","9172","9173","9174","9175","9176","9177","9178","9179","9180","9181","9182","9183","9184","9185","9186","9187","9188","9189","9190","9191","9192","9193","9194","9195","9196","9197","9198","9199","9200","9201","9202","9203","9204","9205","9206","9207","9208","9209","9210","9211","9212","9213","9214","9215","9216","9217","9218","9219","9220","9221","9222","9223","9224","9225","9226","9227","9228","9229","9230","9231","9232","9233","9234","9235","9236","9237","9238","9239","9240","9241","9242","9243","9244","9245","9246","9247","9248","9249","9250","9251","9252","9253","9254","9255","9256","9257","9258","9259","9260","9261","9262","9263","9264","9265","9266","9267","9268","9269","9270","9271","9272","9273","9274","9275","9276","9277","9278","9279","9280","9281","9282","9283","9284","9285","9286","9287","9288","9289","9290","9291","9292","9293","9294","9295","9296","9297","9298","9299","9300","9301","9302","9303","9304","9305","9306","9307","9308","9309","9310","9311","9312","9313","9314","9315","9316","9317","9318","9319","9320","9321","9322","9323","9324","9325","9326","9327","9328","9329","9330","9331","9332","9333","9334","9335","9336","9337","9338","9339","9340","9341","9342","9343","9344","9345","9346","9347","9348","9349","9350","9351","9352","9353","9354","9355","9356","9357","9358","9359","9360","9361","9362","9363","9364","9365","9366","9367","9368","9369","9370","9371","9372","9373","9374","9375","9376","9377","9378","9379","9380","9381","9382","9383","9384","9385","9386","9387","9388","9389","9390","9391","9392","9393","9394","9395","9396","9397","9398","9399","9400","9401","9402","9403","9404","9405","9406","9407","9408","9409","9410","9411","9412","9413","9414","9415","9416","9417","9418","9419","9420","9421","9422","9423","9424","9425","9426","9427","9428","9429","9430","9431","9432","9433","9434","9435","9436","9437","9438","9439","9440","9441","9442","9443","9444","9445","9446","9447","9448","9449","9450","9451","9452","9453","9454","9455","9456","9457","9458","9459","9460","9461","9462","9463","9464","9465","9466","9467","9468","9469","9470","9471","9472","9473","9474","9475","9476","9477","9478","9479","9480","9481","9482","9483","9484","9485","9486","9487","9488","9489","9490","9491","9492","9493","9494","9495","9496","9497","9498","9499","9500","9501","9502","9503","9504","9505","9506","9507","9508","9509","9510","9511","9512","9513","9514","9515","9516","9517","9518","9519","9520","9521","9522","9523","9524","9525","9526","9527","9528","9529","9530","9531","9532","9533","9534","9535","9536","9537","9538","9539","9540","9541","9542","9543","9544","9545","9546","9547","9548","9549","9550","9551","9552","9553","9554","9555","9556","9557","9558","9559","9560","9561","9562","9563","9564","9565","9566","9567","9568","9569","9570","9571","9572","9573","9574","9575","9576","9577","9578","9579","9580","9581","9582","9583","9584","9585","9586","9587","9588","9589","9590","9591","9592","9593","9594","9595","9596","9597","9598","9599","9600","9601","9602","9603","9604","9605","9606","9607","9608","9609","9610","9611","9612","9613","9614","9615","9616","9617","9618","9619","9620","9621","9622","9623","9624","9625","9626","9627","9628","9629","9630","9631","9632","9633","9634","9635","9636","9637","9638","9639","9640","9641","9642","9643","9644","9645","9646","9647","9648","9649","9650","9651","9652","9653","9654","9655","9656","9657","9658","9659","9660","9661","9662","9663","9664","9665","9666","9667","9668","9669","9670","9671","9672","9673","9674","9675","9676","9677","9678","9679","9680","9681","9682","9683","9684","9685","9686","9687","9688","9689","9690","9691","9692","9693","9694","9695","9696","9697","9698","9699","9700","9701","9702","9703","9704","9705","9706","9707","9708","9709","9710","9711","9712","9713","9714","9715","9716","9717","9718","9719","9720","9721","9722","9723","9724","9725","9726","9727","9728","9729","9730","9731","9732","9733","9734","9735","9736","9737","9738","9739","9740","9741","9742","9743","9744","9745","9746","9747","9748","9749","9750","9751","9752","9753","9754","9755","9756","9757","9758","9759","9760","9761","9762","9763","9764","9765","9766","9767","9768","9769","9770","9771","9772","9773","9774","9775","9776","9777","9778","9779","9780","9781","9782","9783","9784","9785","9786","9787","9788","9789","9790","9791","9792","9793","9794","9795","9796","9797","9798","9799","9800","9801","9802","9803","9804","9805","9806","9807","9808","9809","9810","9811","9812","9813","9814","9815","9816","9817","9818","9819","9820","9821","9822","9823","9824","9825","9826","9827","9828","9829","9830","9831","9832","9833","9834","9835","9836","9837","9838","9839","9840","9841","9842","9843","9844","9845","9846","9847","9848","9849","9850","9851","9852","9853","9854","9855","9856","9857","9858","9859","9860","9861","9862","9863","9864","9865","9866","9867","9868","9869","9870","9871","9872","9873","9874","9875","9876","9877","9878","9879","9880","9881","9882","9883","9884","9885","9886","9887","9888","9889","9890","9891","9892","9893","9894","9895","9896","9897","9898","9899","9900","9901","9902","9903","9904","9905","9906","9907","9908","9909","9910","9911","9912","9913","9914","9915","9916","9917","9918","9919","9920","9921","9922","9923","9924","9925","9926","9927","9928","9929","9930","9931","9932","9933","9934","9935","9936","9937","9938","9939","9940","9941","9942","9943","9944","9945","9946","9947","9948","9949","9950","9951","9952","9953","9954","9955","9956","9957","9958","9959","9960","9961","9962","9963","9964","9965","9966","9967","9968","9969","9970","9971","9972","9973","9974","9975","9976","9977","9978","9979","9980","9981","9982","9983","9984","9985","9986","9987","9988","9989","9990","9991","9992","9993","9994","9995","9996","9997","9998","9999","10000","10001","10002","10003","10004","10005","10006","10007","10008","10009","10010","10011","10012","10013","10014","10015","10016","10017","10018","10019","10020","10021","10022","10023","10024","10025","10026","10027","10028","10029","10030","10031","10032","10033","10034","10035","10036","10037","10038","10039","10040","10041","10042","10043","10044","10045","10046","10047","10048","10049","10050","10051","10052","10053","10054","10055","10056","10057","10058","10059","10060","10061","10062","10063","10064","10065","10066","10067","10068","10069","10070","10071","10072","10073","10074","10075","10076","10077","10078","10079","10080","10081","10082","10083","10084","10085","10086","10087","10088","10089","10090","10091","10092","10093","10094","10095","10096","10097","10098","10099","10100","10101","10102","10103","10104","10105","10106","10107","10108","10109","10110","10111","10112","10113","10114","10115","10116","10117","10118","10119","10120","10121","10122","10123","10124","10125","10126","10127","10128","10129","10130","10131","10132","10133","10134","10135","10136","10137","10138","10139","10140","10141","10142","10143","10144","10145","10146","10147","10148","10149","10150","10151","10152","10153","10154","10155","10156","10157","10158","10159","10160","10161","10162","10163","10164","10165","10166","10167","10168","10169","10170","10171","10172","10173","10174","10175","10176","10177","10178","10179","10180","10181","10182","10183","10184","10185","10186","10187","10188","10189","10190","10191","10192","10193","10194","10195","10196","10197","10198","10199","10200","10201","10202","10203","10204","10205","10206","10207","10208","10209","10210","10211","10212","10213","10214","10215","10216","10217","10218","10219","10220","10221","10222","10223","10224","10225","10226","10227","10228","10229","10230","10231","10232","10233","10234","10235","10236","10237","10238","10239","10240","10241","10242","10243","10244","10245","10246","10247","10248","10249","10250","10251","10252","10253","10254","10255","10256","10257","10258","10259","10260","10261","10262","10263","10264","10265","10266","10267","10268","10269","10270","10271","10272","10273","10274","10275","10276","10277","10278","10279","10280","10281","10282","10283","10284","10285","10286","10287","10288","10289","10290","10291","10292","10293","10294","10295","10296","10297","10298","10299","10300","10301","10302","10303","10304","10305","10306","10307","10308","10309","10310","10311","10312","10313","10314","10315","10316","10317","10318","10319","10320","10321","10322","10323","10324","10325","10326","10327","10328","10329","10330","10331","10332","10333","10334","10335","10336","10337","10338","10339","10340","10341","10342","10343","10344","10345","10346","10347","10348","10349","10350","10351","10352","10353","10354","10355","10356","10357","10358","10359","10360","10361","10362","10363","10364","10365","10366","10367","10368","10369","10370","10371","10372","10373","10374","10375","10376","10377","10378","10379","10380","10381","10382","10383","10384","10385","10386","10387","10388","10389","10390","10391","10392","10393","10394","10395","10396","10397","10398","10399","10400","10401","10402","10403","10404","10405","10406","10407","10408","10409","10410","10411","10412","10413","10414","10415","10416","10417","10418","10419","10420","10421","10422","10423","10424","10425","10426","10427","10428","10429","10430","10431","10432","10433","10434","10435","10436","10437","10438","10439","10440","10441","10442","10443","10444","10445","10446","10447","10448","10449","10450","10451","10452","10453","10454","10455","10456","10457","10458","10459","10460","10461","10462","10463","10464","10465","10466","10467","10468","10469","10470","10471","10472","10473","10474","10475","10476","10477","10478","10479","10480","10481","10482","10483","10484","10485","10486","10487","10488","10489","10490","10491","10492","10493","10494","10495","10496","10497","10498","10499","10500","10501","10502","10503","10504","10505","10506","10507","10508","10509","10510","10511","10512","10513","10514","10515","10516","10517","10518","10519","10520","10521","10522","10523","10524","10525","10526","10527","10528","10529","10530","10531","10532","10533","10534","10535","10536","10537","10538","10539","10540","10541","10542","10543","10544","10545","10546","10547","10548","10549","10550","10551","10552","10553","10554","10555","10556","10557","10558","10559","10560","10561","10562","10563","10564","10565","10566","10567","10568","10569","10570","10571","10572","10573","10574","10575","10576","10577","10578","10579","10580","10581","10582","10583","10584","10585","10586","10587","10588","10589","10590","10591","10592","10593","10594","10595","10596","10597","10598","10599","10600","10601","10602","10603","10604","10605","10606","10607","10608","10609","10610","10611","10612","10613","10614","10615","10616","10617","10618","10619","10620","10621","10622","10623","10624","10625","10626","10627","10628","10629","10630","10631","10632","10633","10634","10635","10636","10637","10638","10639","10640","10641","10642","10643","10644","10645","10646","10647","10648","10649","10650","10651","10652","10653","10654","10655","10656","10657","10658","10659","10660","10661","10662","10663","10664","10665","10666","10667","10668","10669","10670","10671","10672","10673","10674","10675","10676","10677","10678","10679","10680","10681","10682","10683","10684","10685","10686","10687","10688","10689","10690","10691","10692","10693","10694","10695","10696","10697","10698","10699","10700","10701","10702","10703","10704","10705","10706","10707","10708","10709","10710","10711","10712","10713","10714","10715","10716","10717","10718","10719","10720","10721","10722","10723","10724","10725","10726","10727","10728","10729","10730","10731","10732","10733","10734","10735","10736","10737","10738","10739","10740","10741","10742","10743","10744","10745","10746","10747","10748","10749","10750","10751","10752","10753","10754","10755","10756","10757","10758","10759","10760","10761","10762","10763","10764","10765","10766","10767","10768","10769","10770","10771","10772","10773","10774","10775","10776","10777","10778","10779","10780","10781","10782","10783","10784","10785","10786","10787","10788","10789","10790","10791","10792","10793","10794","10795","10796","10797","10798","10799","10800","10801","10802","10803","10804","10805","10806","10807","10808","10809","10810","10811","10812","10813","10814","10815","10816","10817","10818","10819","10820","10821","10822","10823","10824","10825","10826","10827","10828","10829","10830","10831","10832","10833","10834","10835","10836","10837","10838","10839","10840","10841","10842","10843","10844","10845","10846","10847","10848","10849","10850","10851","10852","10853","10854","10855","10856","10857","10858","10859","10860","10861","10862","10863","10864","10865","10866","10867","10868","10869","10870","10871","10872","10873","10874","10875","10876","10877","10878","10879","10880","10881","10882","10883","10884","10885","10886","10887","10888","10889","10890","10891","10892","10893","10894","10895","10896","10897","10898","10899","10900","10901","10902","10903","10904","10905","10906","10907","10908","10909","10910","10911","10912","10913","10914","10915","10916","10917","10918","10919","10920","10921","10922","10923","10924","10925","10926","10927","10928","10929","10930","10931","10932","10933","10934","10935","10936","10937","10938","10939","10940","10941","10942","10943","10944","10945","10946","10947","10948","10949","10950","10951","10952","10953","10954","10955","10956","10957","10958","10959","10960","10961","10962","10963","10964","10965","10966","10967","10968","10969","10970","10971","10972","10973","10974","10975","10976","10977","10978","10979","10980","10981","10982","10983","10984","10985","10986","10987","10988","10989","10990","10991","10992","10993","10994","10995","10996","10997","10998","10999","11000","11001","11002","11003","11004","11005","11006","11007","11008","11009","11010","11011","11012","11013","11014","11015","11016","11017","11018","11019","11020","11021","11022","11023","11024","11025","11026","11027","11028","11029","11030","11031","11032","11033","11034","11035","11036","11037","11038","11039","11040","11041","11042","11043","11044","11045","11046","11047","11048","11049","11050","11051","11052","11053","11054","11055","11056","11057","11058","11059","11060","11061","11062","11063","11064","11065","11066","11067","11068","11069","11070","11071","11072","11073","11074","11075","11076","11077","11078","11079","11080","11081","11082","11083","11084","11085","11086","11087","11088","11089","11090","11091","11092","11093","11094","11095","11096","11097","11098","11099","11100","11101","11102","11103","11104","11105","11106","11107","11108","11109","11110","11111","11112","11113","11114","11115","11116","11117","11118","11119","11120","11121","11122","11123","11124","11125","11126","11127","11128","11129","11130","11131","11132","11133","11134","11135","11136","11137","11138","11139","11140","11141","11142","11143","11144","11145","11146","11147","11148","11149","11150","11151","11152","11153","11154","11155","11156","11157","11158","11159","11160","11161","11162","11163","11164","11165","11166","11167","11168","11169","11170","11171","11172","11173","11174","11175","11176","11177","11178","11179","11180","11181","11182","11183","11184","11185","11186","11187","11188","11189","11190","11191","11192","11193","11194","11195","11196","11197","11198","11199","11200","11201","11202","11203","11204","11205","11206","11207","11208","11209","11210","11211","11212","11213","11214","11215","11216","11217","11218","11219","11220","11221","11222","11223","11224","11225","11226","11227","11228","11229","11230","11231","11232","11233","11234","11235","11236","11237","11238","11239","11240","11241","11242","11243","11244","11245","11246","11247","11248","11249","11250","11251","11252","11253","11254","11255","11256","11257","11258","11259","11260","11261","11262","11263","11264","11265","11266","11267","11268","11269","11270","11271","11272","11273","11274","11275","11276","11277","11278","11279","11280","11281","11282","11283","11284","11285","11286","11287","11288","11289","11290","11291","11292","11293","11294","11295","11296","11297","11298","11299","11300","11301","11302","11303","11304","11305","11306","11307","11308","11309","11310","11311","11312","11313","11314","11315","11316","11317","11318","11319","11320","11321","11322","11323","11324","11325","11326","11327","11328","11329","11330","11331","11332","11333","11334","11335","11336","11337","11338","11339","11340","11341","11342","11343","11344","11345","11346","11347","11348","11349","11350","11351","11352","11353","11354","11355","11356","11357","11358","11359","11360","11361","11362","11363","11364","11365","11366","11367","11368","11369","11370","11371","11372","11373","11374","11375","11376","11377","11378","11379","11380","11381","11382","11383","11384","11385","11386","11387","11388","11389","11390","11391","11392","11393","11394","11395","11396","11397","11398","11399","11400","11401","11402","11403","11404","11405","11406","11407","11408","11409","11410","11411","11412","11413","11414","11415","11416","11417","11418","11419","11420","11421","11422","11423","11424","11425","11426","11427","11428","11429","11430","11431","11432","11433","11434","11435","11436","11437","11438","11439","11440","11441","11442","11443","11444","11445","11446","11447","11448","11449","11450","11451","11452","11453","11454","11455","11456","11457","11458","11459","11460","11461","11462","11463","11464","11465","11466","11467","11468","11469","11470","11471","11472","11473","11474","11475","11476","11477","11478","11479","11480","11481","11482","11483","11484","11485","11486","11487","11488","11489","11490","11491","11492","11493","11494","11495","11496","11497","11498","11499","11500","11501","11502","11503","11504","11505","11506","11507","11508","11509","11510","11511","11512","11513","11514","11515","11516","11517","11518","11519","11520","11521","11522","11523","11524","11525","11526","11527","11528","11529","11530","11531","11532","11533","11534","11535","11536","11537","11538","11539","11540","11541","11542","11543","11544","11545","11546","11547","11548","11549","11550","11551","11552","11553","11554","11555","11556","11557","11558","11559","11560","11561","11562","11563","11564","11565","11566","11567","11568","11569","11570","11571","11572","11573","11574","11575","11576","11577","11578","11579","11580","11581","11582","11583","11584","11585","11586","11587","11588","11589","11590","11591","11592","11593","11594","11595","11596","11597","11598","11599","11600","11601","11602","11603","11604","11605","11606","11607","11608","11609","11610","11611","11612","11613","11614","11615","11616","11617","11618","11619","11620","11621","11622","11623","11624","11625","11626","11627","11628","11629","11630","11631","11632","11633","11634","11635","11636","11637","11638","11639","11640","11641","11642","11643","11644","11645","11646","11647","11648","11649","11650","11651","11652","11653","11654","11655","11656","11657","11658","11659","11660","11661","11662","11663","11664","11665","11666","11667","11668","11669","11670","11671","11672","11673","11674","11675","11676","11677","11678","11679","11680","11681","11682","11683","11684","11685","11686","11687","11688","11689","11690","11691","11692","11693","11694","11695","11696","11697","11698","11699","11700","11701","11702","11703","11704","11705","11706","11707","11708","11709","11710","11711","11712","11713","11714","11715","11716","11717","11718","11719","11720","11721","11722","11723","11724","11725","11726","11727","11728","11729","11730","11731","11732","11733","11734","11735","11736","11737","11738","11739","11740","11741","11742","11743","11744","11745","11746","11747","11748","11749","11750","11751","11752","11753","11754","11755","11756","11757","11758","11759","11760","11761","11762","11763","11764","11765","11766","11767","11768","11769","11770","11771","11772","11773","11774","11775","11776","11777","11778","11779","11780","11781","11782","11783","11784","11785","11786","11787","11788","11789","11790","11791","11792","11793","11794","11795","11796","11797","11798","11799","11800","11801","11802","11803","11804","11805","11806","11807","11808","11809","11810","11811","11812","11813","11814","11815","11816","11817","11818","11819","11820","11821","11822","11823","11824","11825","11826","11827","11828","11829","11830","11831","11832","11833","11834","11835","11836","11837","11838","11839","11840","11841","11842","11843","11844","11845","11846","11847","11848","11849","11850","11851","11852","11853","11854","11855","11856","11857","11858","11859","11860","11861","11862","11863","11864","11865","11866","11867","11868","11869","11870","11871","11872","11873","11874","11875","11876","11877","11878","11879","11880","11881","11882","11883","11884","11885","11886","11887","11888","11889","11890","11891","11892","11893","11894","11895","11896","11897","11898","11899","11900","11901","11902","11903","11904","11905","11906","11907","11908","11909","11910","11911","11912","11913","11914","11915","11916","11917","11918","11919","11920","11921","11922","11923","11924","11925","11926","11927","11928","11929","11930","11931","11932","11933","11934","11935","11936","11937","11938","11939","11940","11941","11942","11943","11944","11945","11946","11947","11948","11949","11950","11951","11952","11953","11954","11955","11956","11957","11958","11959","11960","11961","11962","11963","11964","11965","11966","11967","11968","11969","11970","11971","11972","11973","11974","11975","11976","11977","11978","11979","11980","11981","11982","11983","11984","11985","11986","11987","11988","11989","11990","11991","11992","11993","11994","11995","11996","11997","11998","11999","12000","12001","12002","12003","12004","12005","12006","12007","12008","12009","12010","12011","12012","12013","12014","12015","12016","12017","12018","12019","12020","12021","12022","12023","12024","12025","12026","12027","12028","12029","12030","12031","12032","12033","12034","12035","12036","12037","12038","12039","12040","12041","12042","12043","12044","12045","12046","12047","12048","12049","12050","12051","12052","12053","12054","12055","12056","12057","12058","12059","12060","12061","12062","12063","12064","12065","12066","12067","12068","12069","12070","12071","12072","12073","12074","12075","12076","12077","12078","12079","12080","12081","12082","12083","12084","12085","12086","12087","12088","12089","12090","12091","12092","12093","12094","12095","12096","12097","12098","12099","12100","12101","12102","12103","12104","12105","12106","12107","12108","12109","12110","12111","12112","12113","12114","12115","12116","12117","12118","12119","12120","12121","12122","12123","12124","12125","12126","12127","12128","12129","12130","12131","12132","12133","12134","12135","12136","12137","12138","12139","12140","12141","12142","12143","12144","12145","12146","12147","12148","12149","12150","12151","12152","12153","12154","12155","12156","12157","12158","12159","12160","12161","12162","12163","12164","12165","12166","12167","12168","12169","12170","12171","12172","12173","12174","12175","12176","12177","12178","12179","12180","12181","12182","12183","12184","12185","12186","12187","12188","12189","12190","12191","12192","12193","12194","12195","12196","12197","12198","12199","12200","12201","12202","12203","12204","12205","12206","12207","12208","12209","12210","12211","12212","12213","12214","12215","12216","12217","12218","12219","12220","12221","12222","12223","12224","12225","12226","12227","12228","12229","12230","12231","12232","12233","12234","12235","12236","12237","12238","12239","12240","12241","12242","12243","12244","12245","12246","12247","12248","12249","12250","12251","12252","12253","12254","12255","12256","12257","12258","12259","12260","12261","12262","12263","12264","12265","12266","12267","12268","12269","12270","12271","12272","12273","12274","12275","12276","12277","12278","12279","12280","12281","12282","12283","12284","12285","12286","12287","12288","12289","12290","12291","12292","12293","12294","12295","12296","12297","12298","12299","12300","12301","12302","12303","12304","12305","12306","12307","12308","12309","12310","12311","12312","12313","12314","12315","12316","12317","12318","12319","12320","12321","12322","12323","12324","12325","12326","12327","12328","12329","12330","12331","12332","12333","12334","12335","12336","12337","12338","12339","12340","12341","12342","12343","12344","12345","12346","12347","12348","12349","12350","12351","12352","12353","12354","12355","12356","12357","12358","12359","12360","12361","12362","12363","12364","12365","12366","12367","12368","12369","12370","12371","12372","12373","12374","12375","12376","12377","12378","12379","12380","12381","12382","12383","12384","12385","12386","12387","12388","12389","12390","12391","12392","12393","12394","12395","12396","12397","12398","12399","12400","12401","12402","12403","12404","12405","12406","12407","12408","12409","12410","12411","12412","12413","12414","12415","12416","12417","12418","12419","12420","12421","12422","12423","12424","12425","12426","12427","12428","12429","12430","12431","12432","12433","12434","12435","12436","12437","12438","12439","12440","12441","12442","12443","12444","12445","12446","12447","12448","12449","12450","12451","12452","12453","12454","12455","12456","12457","12458","12459","12460","12461","12462","12463","12464","12465","12466","12467","12468","12469","12470","12471","12472","12473","12474","12475","12476","12477","12478","12479","12480","12481","12482","12483","12484","12485","12486","12487","12488","12489","12490","12491","12492","12493","12494","12495","12496","12497","12498","12499","12500","12501","12502","12503","12504","12505","12506","12507","12508","12509","12510","12511","12512","12513","12514","12515","12516","12517","12518","12519","12520","12521","12522","12523","12524","12525","12526","12527","12528","12529","12530","12531","12532","12533","12534","12535","12536","12537","12538","12539","12540","12541","12542","12543","12544","12545","12546","12547","12548","12549","12550","12551","12552","12553","12554","12555","12556","12557","12558","12559","12560","12561","12562","12563","12564","12565","12566","12567","12568","12569","12570","12571","12572","12573","12574","12575","12576","12577","12578","12579","12580","12581","12582","12583","12584","12585","12586","12587","12588","12589","12590","12591","12592","12593","12594","12595","12596","12597","12598","12599","12600","12601","12602","12603","12604","12605","12606","12607","12608","12609","12610","12611","12612","12613","12614","12615","12616","12617","12618","12619","12620","12621","12622","12623","12624","12625","12626","12627","12628","12629","12630","12631","12632","12633","12634","12635","12636","12637","12638","12639","12640","12641","12642","12643","12644","12645","12646","12647","12648","12649","12650","12651","12652","12653","12654","12655","12656","12657","12658","12659","12660","12661","12662","12663","12664","12665","12666","12667","12668","12669","12670","12671","12672","12673","12674","12675","12676","12677","12678","12679","12680","12681","12682","12683","12684","12685","12686","12687","12688","12689","12690","12691","12692","12693","12694","12695","12696","12697","12698","12699","12700","12701","12702","12703","12704","12705","12706","12707","12708","12709","12710","12711","12712","12713","12714","12715","12716","12717","12718","12719","12720","12721","12722","12723","12724","12725","12726","12727","12728","12729","12730","12731","12732","12733","12734","12735","12736","12737","12738","12739","12740","12741","12742","12743","12744","12745","12746","12747","12748","12749","12750","12751","12752","12753","12754","12755","12756","12757","12758","12759","12760","12761","12762","12763","12764","12765","12766","12767","12768","12769","12770","12771","12772","12773","12774","12775","12776","12777","12778","12779","12780","12781","12782","12783","12784","12785","12786","12787","12788","12789","12790","12791","12792","12793","12794","12795","12796","12797","12798","12799","12800","12801","12802","12803","12804","12805","12806","12807","12808","12809","12810","12811","12812","12813","12814","12815","12816","12817","12818","12819","12820","12821","12822","12823","12824","12825","12826","12827","12828","12829","12830","12831","12832","12833","12834","12835","12836","12837","12838","12839","12840","12841","12842","12843","12844","12845","12846","12847","12848","12849","12850","12851","12852","12853","12854","12855","12856","12857","12858","12859","12860","12861","12862","12863","12864","12865","12866","12867","12868","12869","12870","12871","12872","12873","12874","12875","12876","12877","12878","12879","12880","12881","12882","12883","12884","12885","12886","12887","12888","12889","12890","12891","12892","12893","12894","12895","12896","12897","12898","12899","12900","12901","12902","12903","12904","12905","12906","12907","12908","12909","12910","12911","12912","12913","12914","12915","12916","12917","12918","12919","12920","12921","12922","12923","12924","12925","12926","12927","12928","12929","12930","12931","12932","12933","12934","12935","12936","12937","12938","12939","12940","12941","12942","12943","12944","12945","12946","12947","12948","12949","12950","12951","12952","12953","12954","12955","12956","12957","12958","12959","12960","12961","12962","12963","12964","12965","12966","12967","12968","12969","12970","12971","12972","12973","12974","12975","12976","12977","12978","12979","12980","12981","12982","12983","12984","12985","12986","12987","12988","12989","12990","12991","12992","12993","12994","12995","12996","12997","12998","12999","13000","13001","13002","13003","13004","13005","13006","13007","13008","13009","13010","13011","13012","13013","13014","13015","13016","13017","13018","13019","13020","13021","13022","13023","13024","13025","13026","13027","13028","13029","13030","13031","13032","13033","13034","13035","13036","13037","13038","13039","13040","13041","13042","13043","13044","13045","13046","13047","13048","13049","13050","13051","13052","13053","13054","13055","13056","13057","13058","13059","13060","13061","13062","13063","13064","13065","13066","13067","13068","13069","13070","13071","13072","13073","13074","13075","13076","13077","13078","13079","13080","13081","13082","13083","13084","13085","13086","13087","13088","13089","13090","13091","13092","13093","13094","13095","13096","13097","13098","13099","13100","13101","13102","13103","13104","13105","13106","13107","13108","13109","13110","13111","13112","13113","13114","13115","13116","13117","13118","13119","13120","13121","13122","13123","13124","13125","13126","13127","13128","13129","13130","13131","13132","13133","13134","13135","13136","13137","13138","13139","13140","13141","13142","13143","13144","13145","13146","13147","13148","13149","13150","13151","13152","13153","13154","13155","13156","13157","13158","13159","13160","13161","13162","13163","13164","13165","13166","13167","13168","13169","13170","13171","13172","13173","13174","13175","13176","13177","13178","13179","13180","13181","13182","13183","13184","13185","13186","13187","13188","13189","13190","13191","13192","13193","13194","13195","13196","13197","13198","13199","13200","13201","13202","13203","13204","13205","13206","13207","13208","13209","13210","13211","13212","13213","13214","13215","13216","13217","13218","13219","13220","13221","13222","13223","13224","13225","13226","13227","13228","13229","13230","13231","13232","13233","13234","13235","13236","13237","13238","13239","13240","13241","13242","13243","13244","13245","13246","13247","13248","13249","13250","13251","13252","13253","13254","13255","13256","13257","13258","13259","13260","13261","13262","13263","13264","13265","13266","13267","13268","13269","13270","13271","13272","13273","13274","13275","13276","13277","13278","13279","13280","13281","13282","13283","13284","13285","13286","13287","13288","13289","13290","13291","13292","13293","13294","13295","13296","13297","13298","13299","13300","13301","13302","13303","13304","13305","13306","13307","13308","13309","13310","13311","13312","13313","13314","13315","13316","13317","13318","13319","13320","13321","13322","13323","13324","13325","13326","13327","13328","13329","13330","13331","13332","13333","13334","13335","13336","13337","13338","13339","13340","13341","13342","13343","13344","13345","13346","13347","13348","13349","13350","13351","13352","13353","13354","13355","13356","13357","13358","13359","13360","13361","13362","13363","13364","13365","13366","13367","13368","13369","13370","13371","13372","13373","13374","13375","13376","13377","13378","13379","13380","13381","13382","13383","13384","13385","13386","13387","13388","13389","13390","13391","13392","13393","13394","13395","13396","13397","13398","13399","13400","13401","13402","13403","13404","13405","13406","13407","13408","13409","13410","13411","13412","13413","13414","13415","13416","13417","13418","13419","13420","13421","13422","13423","13424","13425","13426","13427","13428","13429","13430","13431","13432","13433","13434","13435","13436","13437","13438","13439","13440","13441","13442","13443","13444","13445","13446","13447","13448","13449","13450","13451","13452","13453","13454","13455","13456","13457","13458","13459","13460","13461","13462","13463","13464","13465","13466","13467","13468","13469","13470","13471","13472","13473","13474","13475","13476","13477","13478","13479","13480","13481","13482","13483","13484","13485","13486","13487","13488","13489","13490","13491","13492","13493","13494","13495","13496","13497","13498","13499","13500","13501","13502","13503","13504","13505","13506","13507","13508","13509","13510","13511","13512","13513","13514","13515","13516","13517","13518","13519","13520","13521","13522","13523","13524","13525","13526","13527","13528","13529","13530","13531","13532","13533","13534","13535","13536","13537","13538","13539","13540","13541","13542","13543","13544","13545","13546","13547","13548","13549","13550","13551","13552","13553","13554","13555","13556","13557","13558","13559","13560","13561","13562","13563","13564","13565","13566","13567","13568","13569","13570","13571","13572","13573","13574","13575","13576","13577","13578","13579","13580","13581","13582","13583","13584","13585","13586","13587","13588","13589","13590","13591","13592","13593","13594","13595","13596","13597","13598","13599","13600","13601","13602","13603","13604","13605","13606","13607","13608","13609","13610","13611","13612","13613","13614","13615","13616","13617","13618","13619","13620","13621","13622","13623","13624","13625","13626","13627","13628","13629","13630","13631","13632","13633","13634","13635","13636","13637","13638","13639","13640","13641","13642","13643","13644","13645","13646","13647","13648","13649","13650","13651","13652","13653","13654","13655","13656","13657","13658","13659","13660","13661","13662","13663","13664","13665","13666","13667","13668","13669","13670","13671","13672","13673","13674","13675","13676","13677","13678","13679","13680","13681","13682","13683","13684","13685","13686","13687","13688","13689","13690","13691","13692","13693","13694","13695","13696","13697","13698","13699","13700","13701","13702","13703","13704","13705","13706","13707","13708","13709","13710","13711","13712","13713","13714","13715","13716","13717","13718","13719","13720","13721","13722","13723","13724","13725","13726","13727","13728","13729","13730","13731","13732","13733","13734","13735","13736","13737","13738","13739","13740","13741","13742","13743","13744","13745","13746","13747","13748","13749","13750","13751","13752","13753","13754","13755","13756","13757","13758","13759","13760","13761","13762","13763","13764","13765","13766","13767","13768","13769","13770","13771","13772","13773","13774","13775","13776","13777","13778","13779","13780","13781","13782","13783","13784","13785","13786","13787","13788","13789","13790","13791","13792","13793","13794","13795","13796","13797","13798","13799","13800","13801","13802","13803","13804","13805","13806","13807","13808","13809","13810","13811","13812","13813","13814","13815","13816","13817","13818","13819","13820","13821","13822","13823","13824","13825","13826","13827","13828","13829","13830","13831","13832","13833","13834","13835","13836","13837","13838","13839","13840","13841","13842","13843","13844","13845","13846","13847","13848","13849","13850","13851","13852","13853","13854","13855","13856","13857","13858","13859","13860","13861","13862","13863","13864","13865","13866","13867","13868","13869","13870","13871","13872","13873","13874","13875","13876","13877","13878","13879","13880","13881","13882","13883","13884","13885","13886","13887","13888","13889","13890","13891","13892","13893","13894","13895","13896","13897","13898","13899","13900","13901","13902","13903","13904","13905","13906","13907","13908","13909","13910","13911","13912","13913","13914","13915","13916","13917","13918","13919","13920","13921","13922","13923","13924","13925","13926","13927","13928","13929","13930","13931","13932","13933","13934","13935","13936","13937","13938","13939","13940","13941","13942","13943","13944","13945","13946","13947","13948","13949","13950","13951","13952","13953","13954","13955","13956","13957","13958","13959","13960","13961","13962","13963","13964","13965","13966","13967","13968","13969","13970","13971","13972","13973","13974","13975","13976","13977","13978","13979","13980","13981","13982","13983","13984","13985","13986","13987","13988","13989","13990","13991","13992","13993","13994","13995","13996","13997","13998","13999","14000","14001","14002","14003","14004","14005","14006","14007","14008","14009","14010","14011","14012","14013","14014","14015","14016","14017","14018","14019","14020","14021","14022","14023","14024","14025","14026","14027","14028","14029","14030","14031","14032","14033","14034","14035","14036","14037","14038","14039","14040","14041","14042","14043","14044","14045","14046","14047","14048","14049","14050","14051","14052","14053","14054","14055","14056","14057","14058","14059","14060","14061","14062","14063","14064","14065","14066","14067","14068","14069","14070","14071","14072","14073","14074","14075","14076","14077","14078","14079","14080","14081","14082","14083","14084","14085","14086","14087","14088","14089","14090","14091","14092","14093","14094","14095","14096","14097","14098","14099","14100","14101","14102","14103","14104","14105","14106","14107","14108","14109","14110","14111","14112","14113","14114","14115","14116","14117","14118","14119","14120","14121","14122","14123","14124","14125","14126","14127","14128","14129","14130","14131","14132","14133","14134","14135","14136","14137","14138","14139","14140","14141","14142","14143","14144","14145","14146","14147","14148","14149","14150","14151","14152","14153","14154","14155","14156","14157","14158","14159","14160","14161","14162","14163","14164","14165","14166","14167","14168","14169","14170","14171","14172","14173","14174","14175","14176","14177","14178","14179","14180","14181","14182","14183","14184","14185","14186","14187","14188","14189","14190","14191","14192","14193","14194","14195","14196","14197","14198","14199","14200","14201","14202","14203","14204","14205","14206","14207","14208","14209","14210","14211","14212","14213","14214","14215","14216","14217","14218","14219","14220","14221","14222","14223","14224","14225","14226","14227","14228","14229","14230","14231","14232","14233","14234","14235","14236","14237","14238","14239","14240","14241","14242","14243","14244","14245","14246","14247","14248","14249","14250","14251","14252","14253","14254","14255","14256","14257","14258","14259","14260","14261","14262","14263","14264","14265","14266","14267","14268","14269","14270","14271","14272","14273","14274","14275","14276","14277","14278","14279","14280","14281","14282","14283","14284","14285","14286","14287","14288","14289","14290","14291","14292","14293","14294","14295","14296","14297","14298","14299","14300","14301","14302","14303","14304","14305","14306","14307","14308","14309","14310","14311","14312","14313","14314","14315","14316","14317","14318","14319","14320","14321","14322","14323","14324","14325","14326","14327","14328","14329","14330","14331","14332","14333","14334","14335","14336","14337","14338","14339","14340","14341","14342","14343","14344","14345","14346","14347","14348","14349","14350","14351","14352","14353","14354","14355","14356","14357","14358","14359","14360","14361","14362","14363","14364","14365","14366","14367","14368","14369","14370","14371","14372","14373","14374","14375","14376","14377","14378","14379","14380","14381","14382","14383","14384","14385","14386","14387","14388","14389","14390","14391","14392","14393","14394","14395","14396","14397","14398","14399","14400","14401","14402","14403","14404","14405","14406","14407","14408","14409","14410","14411","14412","14413","14414","14415","14416","14417","14418","14419","14420","14421","14422","14423","14424","14425","14426","14427","14428","14429","14430","14431","14432","14433","14434","14435","14436","14437","14438","14439","14440","14441","14442","14443","14444","14445","14446","14447","14448","14449","14450","14451","14452","14453","14454","14455","14456","14457","14458","14459","14460","14461","14462","14463","14464","14465","14466","14467","14468","14469","14470","14471","14472","14473","14474","14475","14476","14477","14478","14479","14480","14481","14482","14483","14484","14485","14486","14487","14488","14489","14490","14491","14492","14493","14494","14495","14496","14497","14498","14499","14500","14501","14502","14503","14504","14505","14506","14507","14508","14509","14510","14511","14512","14513","14514","14515","14516","14517","14518","14519","14520","14521","14522","14523","14524","14525","14526","14527","14528","14529","14530","14531","14532","14533","14534","14535","14536","14537","14538","14539","14540","14541","14542","14543","14544","14545","14546","14547","14548","14549","14550","14551","14552","14553","14554","14555","14556","14557","14558","14559","14560","14561","14562","14563","14564","14565","14566","14567","14568","14569","14570","14571","14572","14573","14574","14575","14576","14577","14578","14579","14580","14581","14582","14583","14584","14585","14586","14587","14588","14589","14590","14591","14592","14593","14594","14595","14596","14597","14598","14599","14600","14601","14602","14603","14604","14605","14606","14607","14608","14609","14610","14611","14612","14613","14614","14615","14616","14617","14618","14619","14620","14621","14622","14623","14624","14625","14626","14627","14628","14629","14630","14631","14632","14633","14634","14635","14636","14637","14638","14639","14640","14641","14642","14643","14644","14645","14646","14647","14648","14649","14650","14651","14652","14653","14654","14655","14656","14657","14658","14659","14660","14661","14662","14663","14664","14665","14666","14667","14668","14669","14670","14671","14672","14673","14674","14675","14676","14677","14678","14679","14680","14681","14682","14683","14684","14685","14686","14687","14688","14689","14690","14691","14692","14693","14694","14695","14696","14697","14698","14699","14700","14701","14702","14703","14704","14705","14706","14707","14708","14709","14710","14711","14712","14713","14714","14715","14716","14717","14718","14719","14720","14721","14722","14723","14724","14725","14726","14727","14728","14729","14730","14731","14732","14733","14734","14735","14736","14737","14738","14739","14740","14741","14742","14743","14744","14745","14746","14747","14748","14749","14750","14751","14752","14753","14754","14755","14756","14757","14758","14759","14760","14761","14762","14763","14764","14765","14766","14767","14768","14769","14770","14771","14772","14773","14774","14775","14776","14777","14778","14779","14780","14781","14782","14783","14784","14785","14786","14787","14788","14789","14790","14791","14792","14793","14794","14795","14796","14797","14798","14799","14800","14801","14802","14803","14804","14805","14806","14807","14808","14809","14810","14811","14812","14813","14814","14815","14816","14817","14818","14819","14820","14821","14822","14823","14824","14825","14826","14827","14828","14829","14830","14831","14832","14833","14834","14835","14836","14837","14838","14839","14840","14841","14842","14843","14844","14845","14846","14847","14848","14849","14850","14851","14852","14853","14854","14855","14856","14857","14858","14859","14860","14861","14862","14863","14864","14865","14866","14867","14868","14869","14870","14871","14872","14873","14874","14875","14876","14877","14878","14879","14880","14881","14882","14883","14884","14885","14886","14887","14888","14889","14890","14891","14892","14893","14894","14895","14896","14897","14898","14899","14900","14901","14902","14903","14904","14905","14906","14907","14908","14909","14910","14911","14912","14913","14914","14915","14916","14917","14918","14919","14920","14921","14922","14923","14924","14925","14926","14927","14928","14929","14930","14931","14932","14933","14934","14935","14936","14937","14938","14939","14940","14941","14942","14943","14944","14945","14946","14947","14948","14949","14950","14951","14952","14953","14954","14955","14956","14957","14958","14959","14960","14961","14962","14963","14964","14965","14966","14967","14968","14969","14970","14971","14972","14973","14974","14975","14976","14977","14978","14979","14980","14981","14982","14983","14984","14985","14986","14987","14988","14989","14990","14991","14992","14993","14994","14995","14996","14997","14998","14999","15000","15001","15002","15003","15004","15005","15006","15007","15008","15009","15010","15011","15012","15013","15014","15015","15016","15017","15018","15019","15020","15021","15022","15023","15024","15025","15026","15027","15028","15029","15030","15031","15032","15033","15034","15035","15036","15037","15038","15039","15040","15041","15042","15043","15044","15045","15046","15047","15048","15049","15050","15051","15052","15053","15054","15055","15056","15057","15058","15059","15060","15061","15062","15063","15064","15065","15066","15067","15068","15069","15070","15071","15072","15073","15074","15075","15076","15077","15078","15079","15080","15081","15082","15083","15084","15085","15086","15087","15088","15089","15090","15091","15092","15093","15094","15095","15096","15097","15098","15099","15100","15101","15102","15103","15104","15105","15106","15107","15108","15109","15110","15111","15112","15113","15114","15115","15116","15117","15118","15119","15120","15121","15122","15123","15124","15125","15126","15127","15128","15129","15130","15131","15132","15133","15134","15135","15136","15137","15138","15139","15140","15141","15142","15143","15144","15145","15146","15147","15148","15149","15150","15151","15152","15153","15154","15155","15156","15157","15158","15159","15160","15161","15162","15163","15164","15165","15166","15167","15168","15169","15170","15171","15172","15173","15174","15175","15176","15177","15178","15179","15180","15181","15182","15183","15184","15185","15186","15187","15188","15189","15190","15191","15192","15193","15194","15195","15196","15197","15198","15199","15200","15201","15202","15203","15204","15205","15206","15207","15208","15209","15210","15211","15212","15213","15214","15215","15216","15217","15218","15219","15220","15221","15222","15223","15224","15225","15226","15227","15228","15229","15230","15231","15232","15233","15234","15235","15236","15237","15238","15239","15240","15241","15242","15243","15244","15245","15246","15247","15248","15249","15250","15251","15252","15253","15254","15255","15256","15257","15258","15259","15260","15261","15262","15263","15264","15265","15266","15267","15268","15269","15270","15271","15272","15273","15274","15275","15276","15277","15278","15279","15280","15281","15282","15283","15284","15285","15286","15287","15288","15289","15290","15291","15292","15293","15294","15295","15296","15297","15298","15299","15300","15301","15302","15303","15304","15305","15306","15307","15308","15309","15310","15311","15312","15313","15314","15315","15316","15317","15318","15319","15320","15321","15322","15323","15324","15325","15326","15327","15328","15329","15330","15331","15332","15333","15334","15335","15336","15337","15338","15339","15340","15341","15342","15343","15344","15345","15346","15347","15348","15349","15350","15351","15352","15353","15354","15355","15356","15357","15358","15359","15360","15361","15362","15363","15364","15365","15366","15367","15368","15369","15370","15371","15372","15373","15374","15375","15376","15377","15378","15379","15380","15381","15382","15383","15384","15385","15386","15387","15388","15389","15390","15391","15392","15393","15394","15395","15396","15397","15398","15399","15400","15401","15402","15403","15404","15405","15406","15407","15408","15409","15410","15411","15412","15413","15414","15415","15416","15417","15418","15419","15420","15421","15422","15423","15424","15425","15426","15427","15428","15429","15430","15431","15432","15433","15434","15435","15436","15437","15438","15439","15440","15441","15442","15443","15444","15445","15446","15447","15448","15449","15450","15451","15452","15453","15454","15455","15456","15457","15458","15459","15460","15461","15462","15463","15464","15465","15466","15467","15468","15469","15470","15471","15472","15473","15474","15475","15476","15477","15478","15479","15480","15481","15482","15483","15484","15485","15486","15487","15488","15489","15490","15491","15492","15493","15494","15495","15496","15497","15498","15499","15500","15501","15502","15503","15504","15505","15506","15507","15508","15509","15510","15511","15512","15513","15514","15515","15516","15517","15518","15519","15520","15521","15522","15523","15524","15525","15526","15527","15528","15529","15530","15531","15532","15533","15534","15535","15536","15537","15538","15539","15540","15541","15542","15543","15544","15545","15546","15547","15548","15549","15550","15551","15552","15553","15554","15555","15556","15557","15558","15559","15560","15561","15562","15563","15564","15565","15566","15567","15568","15569","15570","15571","15572","15573","15574","15575","15576","15577","15578","15579","15580","15581","15582","15583","15584","15585","15586","15587","15588","15589","15590","15591","15592","15593","15594","15595","15596","15597","15598","15599","15600","15601","15602","15603","15604","15605","15606","15607","15608","15609","15610","15611","15612","15613","15614","15615","15616","15617","15618","15619","15620","15621","15622","15623","15624","15625","15626","15627","15628","15629","15630","15631","15632","15633","15634","15635","15636","15637","15638","15639","15640","15641","15642","15643","15644","15645","15646","15647","15648","15649","15650","15651","15652","15653","15654","15655","15656","15657","15658","15659","15660","15661","15662","15663","15664","15665","15666","15667","15668","15669","15670","15671","15672","15673","15674","15675","15676","15677","15678","15679","15680","15681","15682","15683","15684","15685","15686","15687","15688","15689","15690","15691","15692","15693","15694","15695","15696","15697","15698","15699","15700","15701","15702","15703","15704","15705","15706","15707","15708","15709","15710","15711","15712","15713","15714","15715","15716","15717","15718","15719","15720","15721","15722","15723","15724","15725","15726","15727","15728","15729","15730","15731","15732","15733","15734","15735","15736","15737","15738","15739","15740","15741","15742","15743","15744","15745","15746","15747","15748","15749","15750","15751","15752","15753","15754","15755","15756","15757","15758","15759","15760","15761","15762","15763","15764","15765","15766","15767","15768","15769","15770","15771","15772","15773","15774","15775","15776","15777","15778","15779","15780","15781","15782","15783","15784","15785","15786","15787","15788","15789","15790","15791","15792","15793","15794","15795","15796","15797","15798","15799","15800","15801","15802","15803","15804","15805","15806","15807","15808","15809","15810","15811","15812","15813","15814","15815","15816","15817","15818","15819","15820","15821","15822","15823","15824","15825","15826","15827","15828","15829","15830","15831","15832","15833","15834","15835","15836","15837","15838","15839","15840","15841","15842","15843","15844","15845","15846","15847","15848","15849","15850","15851","15852","15853","15854","15855","15856","15857","15858","15859","15860","15861","15862","15863","15864","15865","15866","15867","15868","15869","15870","15871","15872","15873","15874","15875","15876","15877","15878","15879","15880","15881","15882","15883","15884","15885","15886","15887","15888","15889","15890","15891","15892","15893","15894","15895","15896","15897","15898","15899","15900","15901","15902","15903","15904","15905","15906","15907","15908","15909","15910","15911","15912","15913","15914","15915","15916","15917","15918","15919","15920","15921","15922","15923","15924","15925","15926","15927","15928","15929","15930","15931","15932","15933","15934","15935","15936","15937","15938","15939","15940","15941","15942","15943","15944","15945","15946","15947","15948","15949","15950","15951","15952","15953","15954","15955","15956","15957","15958","15959","15960","15961","15962","15963","15964","15965","15966","15967","15968","15969","15970","15971","15972","15973","15974","15975","15976","15977","15978","15979","15980","15981","15982","15983","15984","15985","15986","15987","15988","15989","15990","15991","15992","15993","15994","15995","15996","15997","15998","15999","16000","16001","16002","16003","16004","16005","16006","16007","16008","16009","16010","16011","16012","16013","16014","16015","16016","16017","16018","16019","16020","16021","16022","16023","16024","16025","16026","16027","16028","16029","16030","16031","16032","16033","16034","16035","16036","16037","16038","16039","16040","16041","16042","16043","16044","16045","16046","16047","16048","16049","16050","16051","16052","16053","16054","16055","16056","16057","16058","16059","16060","16061","16062","16063","16064","16065","16066","16067","16068","16069","16070","16071","16072","16073","16074","16075","16076","16077","16078","16079","16080","16081","16082","16083","16084","16085","16086","16087","16088","16089","16090","16091","16092","16093","16094","16095","16096","16097","16098","16099","16100","16101","16102","16103","16104","16105","16106","16107","16108","16109","16110","16111","16112","16113","16114","16115","16116","16117","16118","16119","16120","16121","16122","16123","16124","16125","16126","16127","16128","16129","16130","16131","16132","16133","16134","16135","16136","16137","16138","16139","16140","16141","16142","16143","16144","16145","16146","16147","16148","16149","16150","16151","16152","16153","16154","16155","16156","16157","16158","16159","16160","16161","16162","16163","16164","16165","16166","16167","16168","16169","16170","16171","16172","16173","16174","16175","16176","16177","16178","16179","16180","16181","16182","16183","16184","16185","16186","16187","16188","16189","16190","16191","16192","16193","16194","16195","16196","16197","16198","16199","16200","16201","16202","16203","16204","16205","16206","16207","16208","16209","16210","16211","16212","16213","16214","16215","16216","16217","16218","16219","16220","16221","16222","16223","16224","16225","16226","16227","16228","16229","16230","16231","16232","16233","16234","16235","16236","16237","16238","16239","16240","16241","16242","16243","16244","16245","16246","16247","16248","16249","16250","16251","16252","16253","16254","16255","16256","16257","16258","16259","16260","16261","16262","16263","16264","16265","16266","16267","16268","16269","16270","16271","16272","16273","16274","16275","16276","16277","16278","16279","16280","16281","16282","16283","16284","16285","16286","16287","16288","16289","16290","16291","16292","16293","16294","16295","16296","16297","16298","16299","16300","16301","16302","16303","16304","16305","16306","16307","16308","16309","16310","16311","16312","16313","16314","16315","16316","16317","16318","16319","16320","16321","16322","16323","16324","16325","16326","16327","16328","16329","16330","16331","16332","16333","16334","16335","16336","16337","16338","16339","16340","16341","16342","16343","16344","16345","16346","16347","16348","16349","16350","16351","16352","16353","16354","16355","16356","16357","16358","16359","16360","16361","16362","16363","16364","16365","16366","16367","16368","16369","16370","16371","16372","16373","16374","16375","16376","16377","16378","16379","16380","16381","16382","16383","16384","16385","16386","16387","16388","16389","16390","16391","16392","16393","16394","16395","16396","16397","16398","16399","16400","16401","16402","16403","16404","16405","16406","16407","16408","16409","16410","16411","16412","16413","16414","16415","16416","16417","16418","16419","16420","16421","16422","16423","16424","16425","16426","16427","16428","16429","16430","16431","16432","16433","16434","16435","16436","16437","16438","16439","16440","16441","16442","16443","16444","16445","16446","16447","16448","16449","16450","16451","16452","16453","16454","16455","16456","16457","16458","16459","16460","16461","16462","16463","16464","16465","16466","16467","16468","16469","16470","16471","16472","16473","16474","16475","16476","16477","16478","16479","16480","16481","16482","16483","16484","16485","16486","16487","16488","16489","16490","16491","16492","16493","16494","16495","16496","16497","16498","16499","16500","16501","16502","16503","16504","16505","16506","16507","16508","16509","16510","16511","16512","16513","16514","16515","16516","16517","16518","16519","16520","16521","16522","16523","16524","16525","16526","16527","16528","16529","16530","16531","16532","16533","16534","16535","16536","16537","16538","16539","16540","16541","16542","16543","16544","16545","16546","16547","16548","16549","16550","16551","16552","16553","16554","16555","16556","16557","16558","16559","16560","16561","16562","16563","16564","16565","16566","16567","16568","16569","16570","16571","16572","16573","16574","16575","16576","16577","16578","16579","16580","16581","16582","16583","16584","16585","16586","16587","16588","16589","16590","16591","16592","16593","16594","16595","16596","16597","16598","16599","16600","16601","16602","16603","16604","16605","16606","16607","16608","16609","16610","16611","16612","16613","16614","16615","16616","16617","16618","16619","16620","16621","16622","16623","16624","16625","16626","16627","16628","16629","16630","16631","16632","16633","16634","16635","16636","16637","16638","16639","16640","16641","16642","16643","16644","16645","16646","16647","16648","16649","16650","16651","16652","16653","16654","16655","16656","16657","16658","16659","16660","16661","16662","16663","16664","16665","16666","16667","16668","16669","16670","16671","16672","16673","16674","16675","16676","16677","16678","16679","16680","16681","16682","16683","16684","16685","16686","16687","16688","16689","16690","16691","16692","16693","16694","16695","16696","16697","16698","16699","16700","16701","16702","16703","16704","16705","16706","16707","16708","16709","16710","16711","16712","16713","16714","16715","16716","16717","16718","16719","16720","16721","16722","16723","16724","16725","16726","16727","16728","16729","16730","16731","16732","16733","16734","16735","16736","16737","16738","16739","16740","16741","16742","16743","16744","16745","16746","16747","16748","16749","16750","16751","16752","16753","16754","16755","16756","16757","16758","16759","16760","16761","16762","16763","16764","16765","16766","16767","16768","16769","16770","16771","16772","16773","16774","16775","16776","16777","16778","16779","16780","16781","16782","16783","16784","16785","16786","16787","16788","16789","16790","16791","16792","16793","16794","16795","16796","16797","16798","16799","16800","16801","16802","16803","16804","16805","16806","16807","16808","16809","16810","16811","16812","16813","16814","16815","16816","16817","16818","16819","16820","16821","16822","16823","16824","16825","16826","16827","16828","16829","16830","16831","16832","16833","16834","16835","16836","16837","16838","16839","16840","16841","16842","16843","16844","16845","16846","16847","16848","16849","16850","16851","16852","16853","16854","16855","16856","16857","16858","16859","16860","16861","16862","16863","16864","16865","16866","16867","16868","16869","16870","16871","16872","16873","16874","16875","16876","16877","16878","16879","16880","16881","16882","16883","16884","16885","16886","16887","16888","16889","16890","16891","16892","16893","16894","16895","16896","16897","16898","16899","16900","16901","16902","16903","16904","16905","16906","16907","16908","16909","16910","16911","16912","16913","16914","16915","16916","16917","16918","16919","16920","16921","16922","16923","16924","16925","16926","16927","16928","16929","16930","16931","16932","16933","16934","16935","16936","16937","16938","16939","16940","16941","16942","16943","16944","16945","16946","16947","16948","16949","16950","16951","16952","16953","16954","16955","16956","16957","16958","16959","16960","16961","16962","16963","16964","16965","16966","16967","16968","16969","16970","16971","16972","16973","16974","16975","16976","16977","16978","16979","16980","16981","16982","16983","16984","16985","16986","16987","16988","16989","16990","16991","16992","16993","16994","16995","16996","16997","16998","16999","17000","17001","17002","17003","17004","17005","17006","17007","17008","17009","17010","17011","17012","17013","17014","17015","17016","17017","17018","17019","17020","17021","17022","17023","17024","17025","17026","17027","17028","17029","17030","17031","17032","17033","17034","17035","17036","17037","17038","17039","17040","17041","17042","17043","17044","17045","17046","17047","17048","17049","17050","17051","17052","17053","17054","17055","17056","17057","17058","17059","17060","17061","17062","17063","17064","17065","17066","17067","17068","17069","17070","17071","17072","17073","17074","17075","17076","17077","17078","17079","17080","17081","17082","17083","17084","17085","17086","17087","17088","17089","17090","17091","17092","17093","17094","17095","17096","17097","17098","17099","17100","17101","17102","17103","17104","17105","17106","17107","17108","17109","17110","17111","17112","17113","17114","17115","17116","17117","17118","17119","17120","17121","17122","17123","17124","17125","17126","17127","17128","17129","17130","17131","17132","17133","17134","17135","17136","17137","17138","17139","17140","17141","17142","17143","17144","17145","17146","17147","17148","17149","17150","17151","17152","17153","17154","17155","17156","17157","17158","17159","17160","17161","17162","17163","17164","17165","17166","17167","17168","17169","17170","17171","17172","17173","17174","17175","17176","17177","17178","17179","17180","17181","17182","17183","17184","17185","17186","17187","17188","17189","17190","17191","17192","17193","17194","17195","17196","17197","17198","17199","17200","17201","17202","17203","17204","17205","17206","17207","17208","17209","17210","17211","17212","17213","17214","17215","17216","17217","17218","17219","17220","17221","17222","17223","17224","17225","17226","17227","17228","17229","17230","17231","17232","17233","17234","17235","17236","17237","17238","17239","17240","17241","17242","17243","17244","17245","17246","17247","17248","17249","17250","17251","17252","17253","17254","17255","17256","17257","17258","17259","17260","17261","17262","17263","17264","17265","17266","17267","17268","17269","17270","17271","17272","17273","17274","17275","17276","17277","17278","17279","17280","17281","17282","17283","17284","17285","17286","17287","17288","17289","17290","17291","17292","17293","17294","17295","17296","17297","17298","17299","17300","17301","17302","17303","17304","17305","17306","17307","17308","17309","17310","17311","17312","17313","17314","17315","17316","17317","17318","17319","17320","17321","17322","17323","17324","17325","17326","17327","17328","17329","17330","17331","17332","17333","17334","17335","17336","17337","17338","17339","17340","17341","17342","17343","17344","17345","17346","17347","17348","17349","17350","17351","17352","17353","17354","17355","17356","17357","17358","17359","17360","17361","17362","17363","17364","17365","17366","17367","17368","17369","17370","17371","17372","17373","17374","17375","17376","17377","17378","17379","17380","17381","17382","17383","17384","17385","17386","17387","17388","17389","17390","17391","17392","17393","17394","17395","17396","17397","17398","17399","17400","17401","17402","17403","17404","17405","17406","17407","17408","17409","17410","17411","17412","17413","17414","17415","17416","17417","17418","17419","17420","17421","17422","17423","17424","17425","17426","17427","17428","17429","17430","17431","17432","17433","17434","17435","17436","17437","17438","17439","17440","17441","17442","17443","17444","17445","17446","17447","17448","17449","17450","17451","17452","17453","17454","17455","17456","17457","17458","17459","17460","17461","17462","17463","17464","17465","17466","17467","17468","17469","17470","17471","17472","17473","17474","17475","17476","17477","17478","17479","17480","17481","17482","17483","17484","17485","17486","17487","17488","17489","17490","17491","17492","17493","17494","17495","17496","17497","17498","17499","17500","17501","17502","17503","17504","17505","17506","17507","17508","17509","17510","17511","17512","17513","17514","17515","17516","17517","17518","17519","17520","17521","17522","17523","17524","17525","17526","17527","17528","17529","17530","17531","17532","17533","17534","17535","17536","17537","17538","17539","17540","17541","17542","17543","17544","17545","17546","17547","17548","17549","17550","17551","17552","17553","17554","17555","17556","17557","17558","17559","17560","17561","17562","17563","17564","17565","17566","17567","17568","17569","17570","17571","17572","17573","17574","17575","17576","17577","17578","17579","17580","17581","17582","17583","17584","17585","17586","17587","17588","17589","17590","17591","17592","17593","17594","17595","17596","17597","17598","17599","17600","17601","17602","17603","17604","17605","17606","17607","17608","17609","17610","17611","17612","17613","17614","17615","17616","17617","17618","17619","17620","17621","17622","17623","17624","17625","17626","17627","17628","17629","17630","17631","17632","17633","17634","17635","17636","17637","17638","17639","17640","17641","17642","17643","17644","17645","17646","17647","17648","17649","17650","17651","17652","17653","17654","17655","17656","17657","17658","17659","17660","17661","17662","17663","17664","17665","17666","17667","17668","17669","17670","17671","17672","17673","17674","17675","17676","17677","17678","17679","17680","17681","17682","17683","17684","17685","17686","17687","17688","17689","17690","17691","17692","17693","17694","17695","17696","17697","17698","17699","17700","17701","17702","17703","17704","17705","17706","17707","17708","17709","17710","17711","17712","17713","17714","17715","17716","17717","17718","17719","17720","17721","17722","17723","17724","17725","17726","17727","17728","17729","17730","17731","17732","17733","17734","17735","17736","17737","17738","17739","17740","17741","17742","17743","17744","17745","17746","17747","17748","17749","17750","17751","17752","17753","17754","17755","17756","17757","17758","17759","17760","17761","17762","17763","17764","17765","17766","17767","17768","17769","17770","17771","17772","17773","17774","17775","17776","17777","17778","17779","17780","17781","17782","17783","17784","17785","17786","17787","17788","17789","17790","17791","17792","17793","17794","17795","17796","17797","17798","17799","17800","17801","17802","17803","17804","17805","17806","17807","17808","17809","17810","17811","17812","17813","17814","17815","17816","17817","17818","17819","17820","17821","17822","17823","17824","17825","17826","17827","17828","17829","17830","17831","17832","17833","17834","17835","17836","17837","17838","17839","17840","17841","17842","17843","17844","17845","17846","17847","17848","17849","17850","17851","17852","17853","17854","17855","17856","17857","17858","17859","17860","17861","17862","17863","17864","17865","17866","17867","17868","17869","17870","17871","17872","17873","17874","17875","17876","17877","17878","17879","17880","17881","17882","17883","17884","17885","17886","17887","17888","17889","17890","17891","17892","17893","17894","17895","17896","17897","17898","17899","17900","17901","17902","17903","17904","17905","17906","17907","17908","17909","17910","17911","17912","17913","17914","17915","17916","17917","17918","17919","17920","17921","17922","17923","17924","17925","17926","17927","17928","17929","17930","17931","17932","17933","17934","17935","17936","17937","17938","17939","17940","17941","17942","17943","17944","17945","17946","17947","17948","17949","17950","17951","17952","17953","17954","17955","17956","17957","17958","17959","17960","17961","17962","17963","17964","17965","17966","17967","17968","17969","17970","17971","17972","17973","17974","17975","17976","17977","17978","17979","17980","17981","17982","17983","17984","17985","17986","17987","17988","17989","17990","17991","17992","17993","17994","17995","17996","17997","17998","17999","18000","18001","18002","18003","18004","18005","18006","18007","18008","18009","18010","18011","18012","18013","18014","18015","18016","18017","18018","18019","18020","18021","18022","18023","18024","18025","18026","18027","18028","18029","18030","18031","18032","18033","18034","18035","18036","18037","18038","18039","18040","18041","18042","18043","18044","18045","18046","18047","18048","18049","18050","18051","18052","18053","18054","18055","18056","18057","18058","18059","18060","18061","18062","18063","18064","18065","18066","18067","18068","18069","18070","18071","18072","18073","18074","18075","18076","18077","18078","18079","18080","18081","18082","18083","18084","18085","18086","18087","18088","18089","18090","18091","18092","18093","18094","18095","18096","18097","18098","18099","18100","18101","18102","18103","18104","18105","18106","18107","18108","18109","18110","18111","18112","18113","18114","18115","18116","18117","18118","18119","18120","18121","18122","18123","18124","18125","18126","18127","18128","18129","18130","18131","18132","18133","18134","18135","18136","18137","18138","18139","18140","18141","18142","18143","18144","18145","18146","18147","18148","18149","18150","18151","18152","18153","18154","18155","18156","18157","18158","18159","18160","18161","18162","18163","18164","18165","18166","18167","18168","18169","18170","18171","18172","18173","18174","18175","18176","18177","18178","18179","18180","18181","18182","18183","18184","18185","18186","18187","18188","18189","18190","18191","18192","18193","18194","18195","18196","18197","18198","18199","18200","18201","18202","18203","18204","18205","18206","18207","18208","18209","18210","18211","18212","18213","18214","18215","18216","18217","18218","18219","18220","18221","18222","18223","18224","18225","18226","18227","18228","18229","18230","18231","18232","18233","18234","18235","18236","18237","18238","18239","18240","18241","18242","18243","18244","18245","18246","18247","18248","18249","18250","18251","18252","18253","18254","18255","18256","18257","18258","18259","18260","18261","18262","18263","18264","18265","18266","18267","18268","18269","18270","18271","18272","18273","18274","18275","18276","18277","18278","18279","18280","18281","18282","18283","18284","18285","18286","18287","18288","18289","18290","18291","18292","18293","18294","18295","18296","18297","18298","18299","18300","18301","18302","18303","18304","18305","18306","18307","18308","18309","18310","18311","18312","18313","18314","18315","18316","18317","18318","18319","18320","18321","18322","18323","18324","18325","18326","18327","18328","18329","18330","18331","18332","18333","18334","18335","18336","18337","18338","18339","18340","18341","18342","18343","18344","18345","18346","18347","18348","18349","18350","18351","18352","18353","18354","18355","18356","18357","18358","18359","18360","18361","18362","18363","18364","18365","18366","18367","18368","18369","18370","18371","18372","18373","18374","18375","18376","18377","18378","18379","18380","18381","18382","18383","18384","18385","18386","18387","18388","18389","18390","18391","18392","18393","18394","18395","18396","18397","18398","18399","18400","18401","18402","18403","18404","18405","18406","18407","18408","18409","18410","18411","18412","18413","18414","18415","18416","18417","18418","18419","18420","18421","18422","18423","18424","18425","18426","18427","18428","18429","18430","18431","18432","18433","18434","18435","18436","18437","18438","18439","18440","18441","18442","18443","18444","18445","18446","18447","18448","18449","18450","18451","18452","18453","18454","18455","18456","18457","18458","18459","18460","18461","18462","18463","18464","18465","18466","18467","18468","18469","18470","18471","18472","18473","18474","18475","18476","18477","18478","18479","18480","18481","18482","18483","18484","18485","18486","18487","18488","18489","18490","18491","18492","18493","18494","18495","18496","18497","18498","18499","18500","18501","18502","18503","18504","18505","18506","18507","18508","18509","18510","18511","18512","18513","18514","18515","18516","18517","18518","18519","18520","18521","18522","18523","18524","18525","18526","18527","18528","18529","18530","18531","18532","18533","18534","18535","18536","18537","18538","18539","18540","18541","18542","18543","18544","18545","18546","18547","18548","18549","18550","18551","18552","18553","18554","18555","18556","18557","18558","18559","18560","18561","18562","18563","18564","18565","18566","18567","18568","18569","18570","18571","18572","18573","18574","18575","18576","18577","18578","18579","18580","18581","18582","18583","18584","18585","18586","18587","18588","18589","18590","18591","18592","18593","18594","18595","18596","18597","18598","18599","18600","18601","18602","18603","18604","18605","18606","18607","18608","18609","18610","18611","18612","18613","18614","18615","18616","18617","18618","18619","18620","18621","18622","18623","18624","18625","18626","18627","18628","18629","18630","18631","18632","18633","18634","18635","18636","18637","18638","18639","18640","18641","18642","18643","18644","18645","18646","18647","18648","18649","18650","18651","18652","18653","18654","18655","18656","18657","18658","18659","18660","18661","18662","18663","18664","18665","18666","18667","18668","18669","18670","18671","18672","18673","18674","18675","18676","18677","18678","18679","18680","18681","18682","18683","18684","18685","18686","18687","18688","18689","18690","18691","18692","18693","18694","18695","18696","18697","18698","18699","18700","18701","18702","18703","18704","18705","18706","18707","18708","18709","18710","18711","18712","18713","18714","18715","18716","18717","18718","18719","18720","18721","18722","18723","18724","18725","18726","18727","18728","18729","18730","18731","18732","18733","18734","18735","18736","18737","18738","18739","18740","18741","18742","18743","18744","18745","18746","18747","18748","18749","18750","18751","18752","18753","18754","18755","18756","18757","18758","18759","18760","18761","18762","18763","18764","18765","18766","18767","18768","18769","18770","18771","18772","18773","18774","18775","18776","18777","18778","18779","18780","18781","18782","18783","18784","18785","18786","18787","18788","18789","18790","18791","18792","18793","18794","18795","18796","18797","18798","18799","18800","18801","18802","18803","18804","18805","18806","18807","18808","18809","18810","18811","18812","18813","18814","18815","18816","18817","18818","18819","18820","18821","18822","18823","18824","18825","18826","18827","18828","18829","18830","18831","18832","18833","18834","18835","18836","18837","18838","18839","18840","18841","18842","18843","18844","18845","18846","18847","18848","18849","18850","18851","18852","18853","18854","18855","18856","18857","18858","18859","18860","18861","18862","18863","18864","18865","18866","18867","18868","18869","18870","18871","18872","18873","18874","18875","18876","18877","18878","18879","18880","18881","18882","18883","18884","18885","18886","18887","18888","18889","18890","18891","18892","18893","18894","18895","18896","18897","18898","18899","18900","18901","18902","18903","18904","18905","18906","18907","18908","18909","18910","18911","18912","18913","18914","18915","18916","18917","18918","18919","18920","18921","18922","18923","18924","18925","18926","18927","18928","18929","18930","18931","18932","18933","18934","18935","18936","18937","18938","18939","18940","18941","18942","18943","18944","18945","18946","18947","18948","18949","18950","18951","18952","18953","18954","18955","18956","18957","18958","18959","18960","18961","18962","18963","18964","18965","18966","18967","18968","18969","18970","18971","18972","18973","18974","18975","18976","18977","18978","18979","18980","18981","18982","18983","18984","18985","18986","18987","18988","18989","18990","18991","18992","18993","18994","18995","18996","18997","18998","18999","19000","19001","19002","19003","19004","19005","19006","19007","19008","19009","19010","19011","19012","19013","19014","19015","19016","19017","19018","19019","19020","19021","19022","19023","19024","19025","19026","19027","19028","19029","19030","19031","19032","19033","19034","19035","19036","19037","19038","19039","19040","19041","19042","19043","19044","19045","19046","19047","19048","19049","19050","19051","19052","19053","19054","19055","19056","19057","19058","19059","19060","19061","19062","19063","19064","19065","19066","19067","19068","19069","19070","19071","19072","19073","19074","19075","19076","19077","19078","19079","19080","19081","19082","19083","19084","19085","19086","19087","19088","19089","19090","19091","19092","19093","19094","19095","19096","19097","19098","19099","19100","19101","19102","19103","19104","19105","19106","19107","19108","19109","19110","19111","19112","19113","19114","19115","19116","19117","19118","19119","19120","19121","19122","19123","19124","19125","19126","19127","19128","19129","19130","19131","19132","19133","19134","19135","19136","19137","19138","19139","19140","19141","19142","19143","19144","19145","19146","19147","19148","19149","19150","19151","19152","19153","19154","19155","19156","19157","19158","19159","19160","19161","19162","19163","19164","19165","19166","19167","19168","19169","19170","19171","19172","19173","19174","19175","19176","19177","19178","19179","19180","19181","19182","19183","19184","19185","19186","19187","19188","19189","19190","19191","19192","19193","19194","19195","19196","19197","19198","19199","19200","19201","19202","19203","19204","19205","19206","19207","19208","19209","19210","19211","19212","19213","19214","19215","19216","19217","19218","19219","19220","19221","19222","19223","19224","19225","19226","19227","19228","19229","19230","19231","19232","19233","19234","19235","19236","19237","19238","19239","19240","19241","19242","19243","19244","19245","19246","19247","19248","19249","19250","19251","19252","19253","19254","19255","19256","19257","19258","19259","19260","19261","19262","19263","19264","19265","19266","19267","19268","19269","19270","19271","19272","19273","19274","19275","19276","19277","19278","19279","19280","19281","19282","19283","19284","19285","19286","19287","19288","19289","19290","19291","19292","19293","19294","19295","19296","19297","19298","19299","19300","19301","19302","19303","19304","19305","19306","19307","19308","19309","19310","19311","19312","19313","19314","19315","19316","19317","19318","19319","19320","19321","19322","19323","19324","19325","19326","19327","19328","19329","19330","19331","19332","19333","19334","19335","19336","19337","19338","19339","19340","19341","19342","19343","19344","19345","19346","19347","19348","19349","19350","19351","19352","19353","19354","19355","19356","19357","19358","19359","19360","19361","19362","19363","19364","19365","19366","19367","19368","19369","19370","19371","19372","19373","19374","19375","19376","19377","19378","19379","19380","19381","19382","19383","19384","19385","19386","19387","19388","19389","19390","19391","19392","19393","19394","19395","19396","19397","19398","19399","19400","19401","19402","19403","19404","19405","19406","19407","19408","19409","19410","19411","19412","19413","19414","19415","19416","19417","19418","19419","19420","19421","19422","19423","19424","19425","19426","19427","19428","19429","19430","19431","19432","19433","19434","19435","19436","19437","19438","19439","19440","19441","19442","19443","19444","19445","19446","19447","19448","19449","19450","19451","19452","19453","19454","19455","19456","19457","19458","19459","19460","19461","19462","19463","19464","19465","19466","19467","19468","19469","19470","19471","19472","19473","19474","19475","19476","19477","19478","19479","19480","19481","19482","19483","19484","19485","19486","19487","19488","19489","19490","19491","19492","19493","19494","19495","19496","19497","19498","19499","19500","19501","19502","19503","19504","19505","19506","19507","19508","19509","19510","19511","19512","19513","19514","19515","19516","19517","19518","19519","19520","19521","19522","19523","19524","19525","19526","19527","19528","19529","19530","19531","19532","19533","19534","19535","19536","19537","19538","19539","19540","19541","19542","19543","19544","19545","19546","19547","19548","19549","19550","19551","19552","19553","19554","19555","19556","19557","19558","19559","19560","19561","19562","19563","19564","19565","19566","19567","19568","19569","19570","19571","19572","19573","19574","19575","19576","19577","19578","19579","19580","19581","19582","19583","19584","19585","19586","19587","19588","19589","19590","19591","19592","19593","19594","19595","19596","19597","19598","19599","19600","19601","19602","19603","19604","19605","19606","19607","19608","19609","19610","19611","19612","19613","19614","19615","19616","19617","19618","19619","19620","19621","19622","19623","19624","19625","19626","19627","19628","19629","19630","19631","19632","19633","19634","19635","19636","19637","19638","19639","19640","19641","19642","19643","19644","19645","19646","19647","19648","19649","19650","19651","19652","19653","19654","19655","19656","19657","19658","19659","19660","19661","19662","19663","19664","19665","19666","19667","19668","19669","19670","19671","19672","19673","19674","19675","19676","19677","19678","19679","19680","19681","19682","19683","19684","19685","19686","19687","19688","19689","19690","19691","19692","19693","19694","19695","19696","19697","19698","19699","19700","19701","19702","19703","19704","19705","19706","19707","19708","19709","19710","19711","19712","19713","19714","19715","19716","19717","19718","19719","19720","19721","19722","19723","19724","19725","19726","19727","19728","19729","19730","19731","19732","19733","19734","19735","19736","19737","19738","19739","19740","19741","19742","19743","19744","19745","19746","19747","19748","19749","19750","19751","19752","19753","19754","19755","19756","19757","19758","19759","19760","19761","19762","19763","19764","19765","19766","19767","19768","19769","19770","19771","19772","19773","19774","19775","19776","19777","19778","19779","19780","19781","19782","19783","19784","19785","19786","19787","19788","19789","19790","19791","19792","19793","19794","19795","19796","19797","19798","19799","19800","19801","19802","19803","19804","19805","19806","19807","19808","19809","19810","19811","19812","19813","19814","19815","19816","19817","19818","19819","19820","19821","19822","19823","19824","19825","19826","19827","19828","19829","19830","19831","19832","19833","19834","19835","19836","19837","19838","19839","19840","19841","19842","19843","19844","19845","19846","19847","19848","19849","19850","19851","19852","19853","19854","19855","19856","19857","19858","19859","19860","19861","19862","19863","19864","19865","19866","19867","19868","19869","19870","19871","19872","19873","19874","19875","19876","19877","19878","19879","19880","19881","19882","19883","19884","19885","19886","19887","19888","19889","19890","19891","19892","19893","19894","19895","19896","19897","19898","19899","19900","19901","19902","19903","19904","19905","19906","19907","19908","19909","19910","19911","19912","19913","19914","19915","19916","19917","19918","19919","19920","19921","19922","19923","19924","19925","19926","19927","19928","19929","19930","19931","19932","19933","19934","19935","19936","19937","19938","19939","19940","19941","19942","19943","19944","19945","19946","19947","19948","19949","19950","19951","19952","19953","19954","19955","19956","19957","19958","19959","19960","19961","19962","19963","19964","19965","19966","19967","19968","19969","19970","19971","19972","19973","19974","19975","19976","19977","19978","19979","19980","19981","19982","19983","19984","19985","19986","19987","19988","19989","19990","19991","19992","19993","19994","19995","19996","19997","19998","19999","20000","20001","20002","20003","20004","20005","20006","20007","20008","20009","20010","20011","20012","20013","20014","20015","20016","20017","20018","20019","20020","20021","20022","20023","20024","20025","20026","20027","20028","20029","20030","20031","20032","20033","20034","20035","20036","20037","20038","20039","20040","20041","20042","20043","20044","20045","20046","20047","20048","20049","20050","20051","20052","20053","20054","20055","20056","20057","20058","20059","20060","20061","20062","20063","20064","20065","20066","20067","20068","20069","20070","20071","20072","20073","20074","20075","20076","20077","20078","20079","20080","20081","20082","20083","20084","20085","20086","20087","20088","20089","20090","20091","20092","20093","20094","20095","20096","20097","20098","20099","20100","20101","20102","20103","20104","20105","20106","20107","20108","20109","20110","20111","20112","20113","20114","20115","20116","20117","20118","20119","20120","20121","20122","20123","20124","20125","20126","20127","20128","20129","20130","20131","20132","20133","20134","20135","20136","20137","20138","20139","20140","20141","20142","20143","20144","20145","20146","20147","20148","20149","20150","20151","20152","20153","20154","20155","20156","20157","20158","20159","20160","20161","20162","20163","20164","20165","20166","20167","20168","20169","20170","20171","20172","20173","20174","20175","20176","20177","20178","20179","20180","20181","20182","20183","20184","20185","20186","20187","20188","20189","20190","20191","20192","20193","20194","20195","20196","20197","20198","20199","20200","20201","20202","20203","20204","20205","20206","20207","20208","20209","20210","20211","20212","20213","20214","20215","20216","20217","20218","20219","20220","20221","20222","20223","20224","20225","20226","20227","20228","20229","20230","20231","20232","20233","20234","20235","20236","20237","20238","20239","20240","20241","20242","20243","20244","20245","20246","20247","20248","20249","20250","20251","20252","20253","20254","20255","20256","20257","20258","20259","20260","20261","20262","20263","20264","20265","20266","20267","20268","20269","20270","20271","20272","20273","20274","20275","20276","20277","20278","20279","20280","20281","20282","20283","20284","20285","20286","20287","20288","20289","20290","20291","20292","20293","20294","20295","20296","20297","20298","20299","20300","20301","20302","20303","20304","20305","20306","20307","20308","20309","20310","20311","20312","20313","20314","20315","20316","20317","20318","20319","20320","20321","20322","20323","20324","20325","20326","20327","20328","20329","20330","20331","20332","20333","20334","20335","20336","20337","20338","20339","20340","20341","20342","20343","20344","20345","20346","20347","20348","20349","20350","20351","20352","20353","20354","20355","20356","20357","20358","20359","20360","20361","20362","20363","20364","20365","20366","20367","20368","20369","20370","20371","20372","20373","20374","20375","20376","20377","20378","20379","20380","20381","20382","20383","20384","20385","20386","20387","20388","20389","20390","20391","20392","20393","20394","20395","20396","20397","20398","20399","20400","20401","20402","20403","20404","20405","20406","20407","20408","20409","20410","20411","20412","20413","20414","20415","20416","20417","20418","20419","20420","20421","20422","20423","20424","20425","20426","20427","20428","20429","20430","20431","20432","20433","20434","20435","20436","20437","20438","20439","20440","20441","20442","20443","20444","20445","20446","20447","20448","20449","20450","20451","20452","20453","20454","20455","20456","20457","20458","20459","20460","20461","20462","20463","20464","20465","20466","20467","20468","20469","20470","20471","20472","20473","20474","20475","20476","20477","20478","20479","20480","20481","20482","20483","20484","20485","20486","20487","20488","20489","20490","20491","20492","20493","20494","20495","20496","20497","20498","20499","20500","20501","20502","20503","20504","20505","20506","20507","20508","20509","20510","20511","20512","20513","20514","20515","20516","20517","20518","20519","20520","20521","20522","20523","20524","20525","20526","20527","20528","20529","20530","20531","20532","20533","20534","20535","20536","20537","20538","20539","20540","20541","20542","20543","20544","20545","20546","20547","20548","20549","20550","20551","20552","20553","20554","20555","20556","20557","20558","20559","20560","20561","20562","20563","20564","20565","20566","20567","20568","20569","20570","20571","20572","20573","20574","20575","20576","20577","20578","20579","20580","20581","20582","20583","20584","20585","20586","20587","20588","20589","20590","20591","20592","20593","20594","20595","20596","20597","20598","20599","20600","20601","20602","20603","20604","20605","20606","20607","20608","20609","20610","20611","20612","20613","20614","20615","20616","20617","20618","20619","20620","20621","20622","20623","20624","20625","20626","20627","20628","20629","20630","20631","20632","20633","20634","20635","20636","20637","20638","20639","20640","20641","20642","20643","20644","20645","20646","20647","20648","20649","20650","20651","20652","20653","20654","20655","20656","20657","20658","20659","20660","20661","20662","20663","20664","20665","20666","20667","20668","20669","20670","20671","20672","20673","20674","20675","20676","20677","20678","20679","20680","20681","20682","20683","20684","20685","20686","20687","20688","20689","20690","20691","20692","20693","20694","20695","20696","20697","20698","20699","20700","20701","20702","20703","20704","20705","20706","20707","20708","20709","20710","20711","20712","20713","20714","20715","20716","20717","20718","20719","20720","20721","20722","20723","20724","20725","20726","20727","20728","20729","20730","20731","20732","20733","20734","20735","20736","20737","20738","20739","20740","20741","20742","20743","20744","20745","20746","20747","20748","20749","20750","20751","20752","20753","20754","20755","20756","20757","20758","20759","20760","20761","20762","20763","20764","20765","20766","20767","20768","20769","20770","20771","20772","20773","20774","20775","20776","20777","20778","20779","20780","20781","20782","20783","20784","20785","20786","20787","20788","20789","20790","20791","20792","20793","20794","20795","20796","20797","20798","20799","20800","20801","20802","20803","20804","20805","20806","20807","20808","20809","20810","20811","20812","20813","20814","20815","20816","20817","20818","20819","20820","20821","20822","20823","20824","20825","20826","20827","20828","20829","20830","20831","20832","20833","20834","20835","20836","20837","20838","20839","20840","20841","20842","20843","20844","20845","20846","20847","20848","20849","20850","20851","20852","20853","20854","20855","20856","20857","20858","20859","20860","20861","20862","20863","20864","20865","20866","20867","20868","20869","20870","20871","20872","20873","20874","20875","20876","20877","20878","20879","20880","20881","20882","20883","20884","20885","20886","20887","20888","20889","20890","20891","20892","20893","20894","20895","20896","20897","20898","20899","20900","20901","20902","20903","20904","20905","20906","20907","20908","20909","20910","20911","20912","20913","20914","20915","20916","20917","20918","20919","20920","20921","20922","20923","20924","20925","20926","20927","20928","20929","20930","20931","20932","20933","20934","20935","20936","20937","20938","20939","20940","20941","20942","20943","20944","20945","20946","20947","20948","20949","20950","20951","20952","20953","20954","20955","20956","20957","20958","20959","20960","20961","20962","20963","20964","20965","20966","20967","20968","20969","20970","20971","20972","20973","20974","20975","20976","20977","20978","20979","20980","20981","20982","20983","20984","20985","20986","20987","20988","20989","20990","20991","20992","20993","20994","20995","20996","20997","20998","20999","21000","21001","21002","21003","21004","21005","21006","21007","21008","21009","21010","21011","21012","21013","21014","21015","21016","21017","21018","21019","21020","21021","21022","21023","21024","21025","21026","21027","21028","21029","21030","21031","21032","21033","21034","21035","21036","21037","21038","21039","21040","21041","21042","21043","21044","21045","21046","21047","21048","21049","21050","21051","21052","21053","21054","21055","21056","21057","21058","21059","21060","21061","21062","21063","21064","21065","21066","21067","21068","21069","21070","21071","21072","21073","21074","21075","21076","21077","21078","21079","21080","21081","21082","21083","21084","21085","21086","21087","21088","21089","21090","21091","21092","21093","21094","21095","21096","21097","21098","21099","21100","21101","21102","21103","21104","21105","21106","21107","21108","21109","21110","21111","21112","21113","21114","21115","21116","21117","21118","21119","21120","21121","21122","21123","21124","21125","21126","21127","21128","21129","21130","21131","21132","21133","21134","21135","21136","21137","21138","21139","21140","21141","21142","21143","21144","21145","21146","21147","21148","21149","21150","21151","21152","21153","21154","21155","21156","21157","21158","21159","21160","21161","21162","21163","21164","21165","21166","21167","21168","21169","21170","21171","21172","21173","21174","21175","21176","21177","21178","21179","21180","21181","21182","21183","21184","21185","21186","21187","21188","21189","21190","21191","21192","21193","21194","21195","21196","21197","21198","21199","21200","21201","21202","21203","21204","21205","21206","21207","21208","21209","21210","21211","21212","21213","21214","21215","21216","21217","21218","21219","21220","21221","21222","21223","21224","21225","21226","21227","21228","21229","21230","21231","21232","21233","21234","21235","21236","21237","21238","21239","21240","21241","21242","21243","21244","21245","21246","21247","21248","21249","21250","21251","21252","21253","21254","21255","21256","21257","21258","21259","21260","21261","21262","21263","21264","21265","21266","21267","21268","21269","21270","21271","21272","21273","21274","21275","21276","21277","21278","21279","21280","21281","21282","21283","21284","21285","21286","21287","21288","21289","21290","21291","21292","21293","21294","21295","21296","21297","21298","21299","21300","21301","21302","21303","21304","21305","21306","21307","21308","21309","21310","21311","21312","21313","21314","21315","21316","21317","21318","21319","21320","21321","21322","21323","21324","21325","21326","21327","21328","21329","21330","21331","21332","21333","21334","21335","21336","21337","21338","21339","21340","21341","21342","21343","21344","21345","21346","21347","21348","21349","21350","21351","21352","21353","21354","21355","21356","21357","21358","21359","21360","21361","21362","21363","21364","21365","21366","21367","21368","21369","21370","21371","21372","21373","21374","21375","21376","21377","21378","21379","21380","21381","21382","21383","21384","21385","21386","21387","21388","21389","21390","21391","21392","21393","21394","21395","21396","21397","21398","21399","21400","21401","21402","21403","21404","21405","21406","21407","21408","21409","21410","21411","21412","21413","21414","21415","21416","21417","21418","21419","21420","21421","21422","21423","21424","21425","21426","21427","21428","21429","21430","21431","21432","21433","21434","21435","21436","21437","21438","21439","21440","21441","21442","21443","21444","21445","21446","21447","21448","21449","21450","21451","21452","21453","21454","21455","21456","21457","21458","21459","21460","21461","21462","21463","21464","21465","21466","21467","21468","21469","21470","21471","21472","21473","21474","21475","21476","21477","21478","21479","21480","21481","21482","21483","21484","21485","21486","21487","21488","21489","21490","21491","21492","21493","21494","21495","21496","21497","21498","21499","21500","21501","21502","21503","21504","21505","21506","21507","21508","21509","21510","21511","21512","21513","21514","21515","21516","21517","21518","21519","21520","21521","21522","21523","21524","21525","21526","21527","21528","21529","21530","21531","21532","21533","21534","21535","21536","21537","21538","21539","21540","21541","21542","21543","21544","21545","21546","21547","21548","21549","21550","21551","21552","21553","21554","21555","21556","21557","21558","21559","21560","21561","21562","21563","21564","21565","21566","21567","21568","21569","21570","21571","21572","21573","21574","21575","21576","21577","21578","21579","21580","21581","21582","21583","21584","21585","21586","21587","21588","21589","21590","21591","21592","21593","21594","21595","21596","21597","21598","21599","21600","21601","21602","21603","21604","21605","21606","21607","21608","21609","21610","21611","21612","21613","21614","21615","21616","21617","21618","21619","21620","21621","21622","21623","21624","21625","21626","21627","21628","21629","21630","21631","21632","21633","21634","21635","21636","21637","21638","21639","21640","21641","21642","21643","21644","21645","21646","21647","21648","21649","21650","21651","21652","21653","21654","21655","21656","21657","21658","21659","21660","21661","21662","21663","21664","21665","21666","21667","21668","21669","21670","21671","21672","21673","21674","21675","21676","21677","21678","21679","21680","21681","21682","21683","21684","21685","21686","21687","21688","21689","21690","21691","21692","21693","21694","21695","21696","21697","21698","21699","21700","21701","21702","21703","21704","21705","21706","21707","21708","21709","21710","21711","21712","21713","21714","21715","21716","21717","21718","21719","21720","21721","21722","21723","21724","21725","21726","21727","21728","21729","21730","21731","21732","21733","21734","21735","21736","21737","21738","21739","21740","21741","21742","21743","21744","21745","21746","21747","21748","21749","21750","21751","21752","21753","21754","21755","21756","21757","21758","21759","21760","21761","21762","21763","21764","21765","21766","21767","21768","21769","21770","21771","21772","21773","21774","21775","21776","21777","21778","21779","21780","21781","21782","21783","21784","21785","21786","21787","21788","21789","21790","21791","21792","21793","21794","21795","21796","21797","21798","21799","21800","21801","21802","21803","21804","21805","21806","21807","21808","21809","21810","21811","21812","21813","21814","21815","21816","21817","21818","21819","21820","21821","21822","21823","21824","21825","21826","21827","21828","21829","21830","21831","21832","21833","21834","21835","21836","21837","21838","21839","21840","21841","21842","21843","21844","21845","21846","21847","21848","21849","21850","21851","21852","21853","21854","21855","21856","21857","21858","21859","21860","21861","21862","21863","21864","21865","21866","21867","21868","21869","21870","21871","21872","21873","21874","21875","21876","21877","21878","21879","21880","21881","21882","21883","21884","21885","21886","21887","21888","21889","21890","21891","21892","21893","21894","21895","21896","21897","21898","21899","21900","21901","21902","21903","21904","21905","21906","21907","21908","21909","21910","21911","21912","21913","21914","21915","21916","21917","21918","21919","21920","21921","21922","21923","21924","21925","21926","21927","21928","21929","21930","21931","21932","21933","21934","21935","21936","21937","21938","21939","21940","21941","21942","21943","21944","21945","21946","21947","21948","21949","21950","21951","21952","21953","21954","21955","21956","21957","21958","21959","21960","21961","21962","21963","21964","21965","21966","21967","21968","21969","21970","21971","21972","21973","21974","21975","21976","21977","21978","21979","21980","21981","21982","21983","21984","21985","21986","21987","21988","21989","21990","21991","21992","21993","21994","21995","21996","21997","21998","21999","22000","22001","22002","22003","22004","22005","22006","22007","22008","22009","22010","22011","22012","22013","22014","22015","22016","22017","22018","22019","22020","22021","22022","22023","22024","22025","22026","22027","22028","22029","22030","22031","22032","22033","22034","22035","22036","22037","22038","22039","22040","22041","22042","22043","22044","22045","22046","22047","22048","22049","22050","22051","22052","22053","22054","22055","22056","22057","22058","22059","22060","22061","22062","22063","22064","22065","22066","22067","22068","22069","22070","22071","22072","22073","22074","22075","22076","22077","22078","22079","22080","22081","22082","22083","22084","22085","22086","22087","22088","22089","22090","22091","22092","22093","22094","22095","22096","22097","22098","22099","22100","22101","22102","22103","22104","22105","22106","22107","22108","22109","22110","22111","22112","22113","22114","22115","22116","22117","22118","22119","22120","22121","22122","22123","22124","22125","22126","22127","22128","22129","22130","22131","22132","22133","22134","22135","22136","22137","22138","22139","22140","22141","22142","22143","22144","22145","22146","22147","22148","22149","22150","22151","22152","22153","22154","22155","22156","22157","22158","22159","22160","22161","22162","22163","22164","22165","22166","22167","22168","22169","22170","22171","22172","22173","22174","22175","22176","22177","22178","22179","22180","22181","22182","22183","22184","22185","22186","22187","22188","22189","22190","22191","22192","22193","22194","22195","22196","22197","22198","22199","22200","22201","22202","22203","22204","22205","22206","22207","22208","22209","22210","22211","22212","22213","22214","22215","22216","22217","22218","22219","22220","22221","22222","22223","22224","22225","22226","22227","22228","22229","22230","22231","22232","22233","22234","22235","22236","22237","22238","22239","22240","22241","22242","22243","22244","22245","22246","22247","22248","22249","22250","22251","22252","22253","22254","22255","22256","22257","22258","22259","22260","22261","22262","22263","22264","22265","22266","22267","22268","22269","22270","22271","22272","22273","22274","22275","22276","22277","22278","22279","22280","22281","22282","22283","22284","22285","22286","22287","22288","22289","22290","22291","22292","22293","22294","22295","22296","22297","22298","22299","22300","22301","22302","22303","22304","22305","22306","22307","22308","22309","22310","22311","22312","22313","22314","22315","22316","22317","22318","22319","22320","22321","22322","22323","22324","22325","22326","22327","22328","22329","22330","22331","22332","22333","22334","22335","22336","22337","22338","22339","22340","22341","22342","22343","22344","22345","22346","22347","22348","22349","22350","22351","22352","22353","22354","22355","22356","22357","22358","22359","22360","22361","22362","22363","22364","22365","22366","22367","22368","22369","22370","22371","22372","22373","22374","22375","22376","22377","22378","22379","22380","22381","22382","22383","22384","22385","22386","22387","22388","22389","22390","22391","22392","22393","22394","22395","22396","22397","22398","22399","22400","22401","22402","22403","22404","22405","22406","22407","22408","22409","22410","22411","22412","22413","22414","22415","22416","22417","22418","22419","22420","22421","22422","22423","22424","22425","22426","22427","22428","22429","22430","22431","22432","22433","22434","22435","22436","22437","22438","22439","22440","22441","22442","22443","22444","22445","22446","22447","22448","22449","22450","22451","22452","22453","22454","22455","22456","22457","22458","22459","22460","22461","22462","22463","22464","22465","22466","22467","22468","22469","22470","22471","22472","22473","22474","22475","22476","22477","22478","22479","22480","22481","22482","22483","22484","22485","22486","22487","22488","22489","22490","22491","22492","22493","22494","22495","22496","22497","22498","22499","22500","22501","22502","22503","22504","22505","22506","22507","22508","22509","22510","22511","22512","22513","22514","22515","22516","22517","22518","22519","22520","22521","22522","22523","22524","22525","22526","22527","22528","22529","22530","22531","22532","22533","22534","22535","22536","22537","22538","22539","22540","22541","22542","22543","22544","22545","22546","22547","22548","22549","22550","22551","22552","22553","22554","22555","22556","22557","22558","22559","22560","22561","22562","22563","22564","22565","22566","22567","22568","22569","22570","22571","22572","22573","22574","22575","22576","22577","22578","22579","22580","22581","22582","22583","22584","22585","22586","22587","22588","22589","22590","22591","22592","22593","22594","22595","22596","22597","22598","22599","22600","22601","22602","22603","22604","22605","22606","22607","22608","22609","22610","22611","22612","22613","22614","22615","22616","22617","22618","22619","22620","22621","22622","22623","22624","22625","22626","22627","22628","22629","22630","22631","22632","22633","22634","22635","22636","22637","22638","22639","22640","22641","22642","22643","22644","22645","22646","22647","22648","22649","22650","22651","22652","22653","22654","22655","22656","22657","22658","22659","22660","22661","22662","22663","22664","22665","22666","22667","22668","22669","22670","22671","22672","22673","22674","22675","22676","22677","22678","22679","22680","22681","22682","22683","22684","22685","22686","22687","22688","22689","22690","22691","22692","22693","22694","22695","22696","22697","22698","22699","22700","22701","22702","22703","22704","22705","22706","22707","22708","22709","22710","22711","22712","22713","22714","22715","22716","22717","22718","22719","22720","22721","22722","22723","22724","22725","22726","22727","22728","22729","22730","22731","22732","22733","22734","22735","22736","22737","22738","22739","22740","22741","22742","22743","22744","22745","22746","22747","22748","22749","22750","22751","22752","22753","22754","22755","22756","22757","22758","22759","22760","22761","22762","22763","22764","22765","22766","22767","22768","22769","22770","22771","22772","22773","22774","22775","22776","22777","22778","22779","22780","22781","22782","22783","22784","22785","22786","22787","22788","22789","22790","22791","22792","22793","22794","22795","22796","22797","22798","22799","22800","22801","22802","22803","22804","22805","22806","22807","22808","22809","22810","22811","22812","22813","22814","22815","22816","22817","22818","22819","22820","22821","22822","22823","22824","22825","22826","22827","22828","22829","22830","22831","22832","22833","22834","22835","22836","22837","22838","22839","22840","22841","22842","22843","22844","22845","22846","22847","22848","22849","22850","22851","22852","22853","22854","22855","22856","22857","22858","22859","22860","22861","22862","22863","22864","22865","22866","22867","22868","22869","22870","22871","22872","22873","22874","22875","22876","22877","22878","22879","22880","22881","22882","22883","22884","22885","22886","22887","22888","22889","22890","22891","22892","22893","22894","22895","22896","22897","22898","22899","22900","22901","22902","22903","22904","22905","22906","22907","22908","22909","22910","22911","22912","22913","22914","22915","22916","22917","22918","22919","22920","22921","22922","22923","22924","22925","22926","22927","22928","22929","22930","22931","22932","22933","22934","22935","22936","22937","22938","22939","22940","22941","22942","22943","22944","22945","22946","22947","22948","22949","22950","22951","22952","22953","22954","22955","22956","22957","22958","22959","22960","22961","22962","22963","22964","22965","22966","22967","22968","22969","22970","22971","22972","22973","22974","22975","22976","22977","22978","22979","22980","22981","22982","22983","22984","22985","22986","22987","22988","22989","22990","22991","22992","22993","22994","22995","22996","22997","22998","22999","23000","23001","23002","23003","23004","23005","23006","23007","23008","23009","23010","23011","23012","23013","23014","23015","23016","23017","23018","23019","23020","23021","23022","23023","23024","23025","23026","23027","23028","23029","23030","23031","23032","23033","23034","23035","23036","23037","23038","23039","23040","23041","23042","23043","23044","23045","23046","23047","23048","23049","23050","23051","23052","23053","23054","23055","23056","23057","23058","23059","23060","23061","23062","23063","23064","23065","23066","23067","23068","23069","23070","23071","23072","23073","23074","23075","23076","23077","23078","23079","23080","23081","23082","23083","23084","23085","23086","23087","23088","23089","23090","23091","23092","23093","23094","23095","23096","23097","23098","23099","23100","23101","23102","23103","23104","23105","23106","23107","23108","23109","23110","23111","23112","23113","23114","23115","23116","23117","23118","23119","23120","23121","23122","23123","23124","23125","23126","23127","23128","23129","23130","23131","23132","23133","23134","23135","23136","23137","23138","23139","23140","23141","23142","23143","23144","23145","23146","23147","23148","23149","23150","23151","23152","23153","23154","23155","23156","23157","23158","23159","23160","23161","23162","23163","23164","23165","23166","23167","23168","23169","23170","23171","23172","23173","23174","23175","23176","23177","23178","23179","23180","23181","23182","23183","23184","23185","23186","23187","23188","23189","23190","23191","23192","23193","23194","23195","23196","23197","23198","23199","23200","23201","23202","23203","23204","23205","23206","23207","23208","23209","23210","23211","23212","23213","23214","23215","23216","23217","23218","23219","23220","23221","23222","23223","23224","23225","23226","23227","23228","23229","23230","23231","23232","23233","23234","23235","23236","23237","23238","23239","23240","23241","23242","23243","23244","23245","23246","23247","23248","23249","23250","23251","23252","23253","23254","23255","23256","23257","23258","23259","23260","23261","23262","23263","23264","23265","23266","23267","23268","23269","23270","23271","23272","23273","23274","23275","23276","23277","23278","23279","23280","23281","23282","23283","23284","23285","23286","23287","23288","23289","23290","23291","23292","23293","23294","23295","23296","23297","23298","23299","23300","23301","23302","23303","23304","23305","23306","23307","23308","23309","23310","23311","23312","23313","23314","23315","23316","23317","23318","23319","23320","23321","23322","23323","23324","23325","23326","23327","23328","23329","23330","23331","23332","23333","23334","23335","23336","23337","23338","23339","23340","23341","23342","23343","23344","23345","23346","23347","23348","23349","23350","23351","23352","23353","23354","23355","23356","23357","23358","23359","23360","23361","23362","23363","23364","23365","23366","23367","23368","23369","23370","23371","23372","23373","23374","23375","23376","23377","23378","23379","23380","23381","23382","23383","23384","23385","23386","23387","23388","23389","23390","23391","23392","23393","23394","23395","23396","23397","23398","23399","23400","23401","23402","23403","23404","23405","23406","23407","23408","23409","23410","23411","23412","23413","23414","23415","23416","23417","23418","23419","23420","23421","23422","23423","23424","23425","23426","23427","23428","23429","23430","23431","23432","23433","23434","23435","23436","23437","23438","23439","23440","23441","23442","23443","23444","23445","23446","23447","23448","23449","23450","23451","23452","23453","23454","23455","23456","23457","23458","23459","23460","23461","23462","23463","23464","23465","23466","23467","23468","23469","23470","23471","23472","23473","23474","23475","23476","23477","23478","23479","23480","23481","23482","23483","23484","23485","23486","23487","23488","23489","23490","23491","23492","23493","23494","23495","23496","23497","23498","23499","23500","23501","23502","23503","23504","23505","23506","23507","23508","23509","23510","23511","23512","23513","23514","23515","23516","23517","23518","23519","23520","23521","23522","23523","23524","23525","23526","23527","23528","23529","23530","23531","23532","23533","23534","23535","23536","23537","23538","23539","23540","23541","23542","23543","23544","23545","23546","23547","23548","23549","23550","23551","23552","23553","23554","23555","23556","23557","23558","23559","23560","23561","23562","23563","23564","23565","23566","23567","23568","23569","23570","23571","23572","23573","23574","23575","23576","23577","23578","23579","23580","23581","23582","23583","23584","23585","23586","23587","23588","23589","23590","23591","23592","23593","23594","23595","23596","23597","23598","23599","23600","23601","23602","23603","23604","23605","23606","23607","23608","23609","23610","23611","23612","23613","23614","23615","23616","23617","23618","23619","23620","23621","23622","23623","23624","23625","23626","23627","23628","23629","23630","23631","23632","23633","23634","23635","23636","23637","23638","23639","23640","23641","23642","23643","23644","23645","23646","23647","23648","23649","23650","23651","23652","23653","23654","23655","23656","23657","23658","23659","23660","23661","23662","23663","23664","23665","23666","23667","23668","23669","23670","23671","23672","23673","23674","23675","23676","23677","23678","23679","23680","23681","23682","23683","23684","23685","23686","23687","23688","23689","23690","23691","23692","23693","23694","23695","23696","23697","23698","23699","23700","23701","23702","23703","23704","23705","23706","23707","23708","23709","23710","23711","23712","23713","23714","23715","23716","23717","23718","23719","23720","23721","23722","23723","23724","23725","23726","23727","23728","23729","23730","23731","23732","23733","23734","23735","23736","23737","23738","23739","23740","23741","23742","23743","23744","23745","23746","23747","23748","23749","23750","23751","23752","23753","23754","23755","23756","23757","23758","23759","23760","23761","23762","23763","23764","23765","23766","23767","23768","23769","23770","23771","23772","23773","23774","23775","23776","23777","23778","23779","23780","23781","23782","23783","23784","23785","23786","23787","23788","23789","23790","23791","23792","23793","23794","23795","23796","23797","23798","23799","23800","23801","23802","23803","23804","23805","23806","23807","23808","23809","23810","23811","23812","23813","23814","23815","23816","23817","23818","23819","23820","23821","23822","23823","23824","23825","23826","23827","23828","23829","23830","23831","23832","23833","23834","23835","23836","23837","23838","23839","23840","23841","23842","23843","23844","23845","23846","23847","23848","23849","23850","23851","23852","23853","23854","23855","23856","23857","23858","23859","23860","23861","23862","23863","23864","23865","23866","23867","23868","23869","23870","23871","23872","23873","23874","23875","23876","23877","23878","23879","23880","23881","23882","23883","23884","23885","23886","23887","23888","23889","23890","23891","23892","23893","23894","23895","23896","23897","23898","23899","23900","23901","23902","23903","23904","23905","23906","23907","23908","23909","23910","23911","23912","23913","23914","23915","23916","23917","23918","23919","23920","23921","23922","23923","23924","23925","23926","23927","23928","23929","23930","23931","23932","23933","23934","23935","23936","23937","23938","23939","23940","23941","23942","23943","23944","23945","23946","23947","23948","23949","23950","23951","23952","23953","23954","23955","23956","23957","23958","23959","23960","23961","23962","23963","23964","23965","23966","23967","23968","23969","23970","23971","23972","23973","23974","23975","23976","23977","23978","23979","23980","23981","23982","23983","23984","23985","23986","23987","23988","23989","23990","23991","23992","23993","23994","23995","23996","23997","23998","23999","24000","24001","24002","24003","24004","24005","24006","24007","24008","24009","24010","24011","24012","24013","24014","24015","24016","24017","24018","24019","24020","24021","24022","24023","24024","24025","24026","24027","24028","24029","24030","24031","24032","24033","24034","24035","24036","24037","24038","24039","24040","24041","24042","24043","24044","24045","24046","24047","24048","24049","24050","24051","24052","24053","24054","24055","24056","24057","24058","24059","24060","24061","24062","24063","24064","24065","24066","24067","24068","24069","24070","24071","24072","24073","24074","24075","24076","24077","24078","24079","24080","24081","24082","24083","24084","24085","24086","24087","24088","24089","24090","24091","24092","24093","24094","24095","24096","24097","24098","24099","24100","24101","24102","24103","24104","24105","24106","24107","24108","24109","24110","24111","24112","24113","24114","24115","24116","24117","24118","24119","24120","24121","24122","24123","24124","24125","24126","24127","24128","24129","24130","24131","24132","24133","24134","24135","24136","24137","24138","24139","24140","24141","24142","24143","24144","24145","24146","24147","24148","24149","24150","24151","24152","24153","24154","24155","24156","24157","24158","24159","24160","24161","24162","24163","24164","24165","24166","24167","24168","24169","24170","24171","24172","24173","24174","24175","24176","24177","24178","24179","24180","24181","24182","24183","24184","24185","24186","24187","24188","24189","24190","24191","24192","24193","24194","24195","24196","24197","24198","24199","24200","24201","24202","24203","24204","24205","24206","24207","24208","24209","24210","24211","24212","24213","24214","24215","24216","24217","24218","24219","24220","24221","24222","24223","24224","24225","24226","24227","24228","24229","24230","24231","24232","24233","24234","24235","24236","24237","24238","24239","24240","24241","24242","24243","24244","24245","24246","24247","24248","24249","24250","24251","24252","24253","24254","24255","24256","24257","24258","24259","24260","24261","24262","24263","24264","24265","24266","24267","24268","24269","24270","24271","24272","24273","24274","24275","24276","24277","24278","24279","24280","24281","24282","24283","24284","24285","24286","24287","24288","24289","24290","24291","24292","24293","24294","24295","24296","24297","24298","24299","24300","24301","24302","24303","24304","24305","24306","24307","24308","24309","24310","24311","24312","24313","24314","24315","24316","24317","24318","24319","24320","24321","24322","24323","24324","24325","24326","24327","24328","24329","24330","24331","24332","24333","24334","24335","24336","24337","24338","24339","24340","24341","24342","24343","24344","24345","24346","24347","24348","24349","24350","24351","24352","24353","24354","24355","24356","24357","24358","24359","24360","24361","24362","24363","24364","24365","24366","24367","24368","24369","24370","24371","24372","24373","24374","24375","24376","24377","24378","24379","24380","24381","24382","24383","24384","24385","24386","24387","24388","24389","24390","24391","24392","24393","24394","24395","24396","24397","24398","24399","24400","24401","24402","24403","24404","24405","24406","24407","24408","24409","24410","24411","24412","24413","24414","24415","24416","24417","24418","24419","24420","24421","24422","24423","24424","24425","24426","24427","24428","24429","24430","24431","24432","24433","24434","24435","24436","24437","24438","24439","24440","24441","24442","24443","24444","24445","24446","24447","24448","24449","24450","24451","24452","24453","24454","24455","24456","24457","24458","24459","24460","24461","24462","24463","24464","24465","24466","24467","24468","24469","24470","24471","24472","24473","24474","24475","24476","24477","24478","24479","24480","24481","24482","24483","24484","24485","24486","24487","24488","24489","24490","24491","24492","24493","24494","24495","24496","24497","24498","24499","24500","24501","24502","24503","24504","24505","24506","24507","24508","24509","24510","24511","24512","24513","24514","24515","24516","24517","24518","24519","24520","24521","24522","24523","24524","24525","24526","24527","24528","24529","24530","24531","24532","24533","24534","24535","24536","24537","24538","24539","24540","24541","24542","24543","24544","24545","24546","24547","24548","24549","24550","24551","24552","24553","24554","24555","24556","24557","24558","24559","24560","24561","24562","24563","24564","24565","24566","24567","24568","24569","24570","24571","24572","24573","24574","24575","24576","24577","24578","24579","24580","24581","24582","24583","24584","24585","24586","24587","24588","24589","24590","24591","24592","24593","24594","24595","24596","24597","24598","24599","24600","24601","24602","24603","24604","24605","24606","24607","24608","24609","24610","24611","24612","24613","24614","24615","24616","24617","24618","24619","24620","24621","24622","24623","24624","24625","24626","24627","24628","24629","24630","24631","24632","24633","24634","24635","24636","24637","24638","24639","24640","24641","24642","24643","24644","24645","24646","24647","24648","24649","24650","24651","24652","24653","24654","24655","24656","24657","24658","24659","24660","24661","24662","24663","24664","24665","24666","24667","24668","24669","24670","24671","24672","24673","24674","24675","24676","24677","24678","24679","24680","24681","24682","24683","24684","24685","24686","24687","24688","24689","24690","24691","24692","24693","24694","24695","24696","24697","24698","24699","24700","24701","24702","24703","24704","24705","24706","24707","24708","24709","24710","24711","24712","24713","24714","24715","24716","24717","24718","24719","24720","24721","24722","24723","24724","24725","24726","24727","24728","24729","24730","24731","24732","24733","24734","24735","24736","24737","24738","24739","24740","24741","24742","24743","24744","24745","24746","24747","24748","24749","24750","24751","24752","24753","24754","24755","24756","24757","24758","24759","24760","24761","24762","24763","24764","24765","24766","24767","24768","24769","24770","24771","24772","24773","24774","24775","24776","24777","24778","24779","24780","24781","24782","24783","24784","24785","24786","24787","24788","24789","24790","24791","24792","24793","24794","24795","24796","24797","24798","24799","24800","24801","24802","24803","24804","24805","24806","24807","24808","24809","24810","24811","24812","24813","24814","24815","24816","24817","24818","24819","24820","24821","24822","24823","24824","24825","24826","24827","24828","24829","24830","24831","24832","24833","24834","24835","24836","24837","24838","24839","24840","24841","24842","24843","24844","24845","24846","24847","24848","24849","24850","24851","24852","24853","24854","24855","24856","24857","24858","24859","24860","24861","24862","24863","24864","24865","24866","24867","24868","24869","24870","24871","24872","24873","24874","24875","24876","24877","24878","24879","24880","24881","24882","24883","24884","24885","24886","24887","24888","24889","24890","24891","24892","24893","24894","24895","24896","24897","24898","24899","24900","24901","24902","24903","24904","24905","24906","24907","24908","24909","24910","24911","24912","24913","24914","24915","24916","24917","24918","24919","24920","24921","24922","24923","24924","24925","24926","24927","24928","24929","24930","24931","24932","24933","24934","24935","24936","24937","24938","24939","24940","24941","24942","24943","24944","24945","24946","24947","24948","24949","24950","24951","24952","24953","24954","24955","24956","24957","24958","24959","24960","24961","24962","24963","24964","24965","24966","24967","24968","24969","24970","24971","24972","24973","24974","24975","24976","24977","24978","24979","24980","24981","24982","24983","24984","24985","24986","24987","24988","24989","24990","24991","24992","24993","24994","24995","24996","24997","24998","24999","25000","25001","25002","25003","25004","25005","25006","25007","25008","25009","25010","25011","25012","25013","25014","25015","25016","25017","25018","25019","25020","25021","25022","25023","25024","25025","25026","25027","25028","25029","25030","25031","25032","25033","25034","25035","25036","25037","25038","25039","25040","25041","25042","25043","25044","25045","25046","25047","25048","25049","25050","25051","25052","25053","25054","25055","25056","25057","25058","25059","25060","25061","25062","25063","25064","25065","25066","25067","25068","25069","25070","25071","25072","25073","25074","25075","25076","25077","25078","25079","25080","25081","25082","25083","25084","25085","25086","25087","25088","25089","25090","25091","25092","25093","25094","25095","25096","25097","25098","25099","25100","25101","25102","25103","25104","25105","25106","25107","25108","25109","25110","25111","25112","25113","25114","25115","25116","25117","25118","25119","25120","25121","25122","25123","25124","25125","25126","25127","25128","25129","25130","25131","25132","25133","25134","25135","25136","25137","25138","25139","25140","25141","25142","25143","25144","25145","25146","25147","25148","25149","25150","25151","25152","25153","25154","25155","25156","25157","25158","25159","25160","25161","25162","25163","25164","25165","25166","25167","25168","25169","25170","25171","25172","25173","25174","25175","25176","25177","25178","25179","25180","25181","25182","25183","25184","25185","25186","25187","25188","25189","25190","25191","25192","25193","25194","25195","25196","25197","25198","25199","25200","25201","25202","25203","25204","25205","25206","25207","25208","25209","25210","25211","25212","25213","25214","25215","25216","25217","25218","25219","25220","25221","25222","25223","25224","25225","25226","25227","25228","25229","25230","25231","25232","25233","25234","25235","25236","25237","25238","25239","25240","25241","25242","25243","25244","25245","25246","25247","25248","25249","25250","25251","25252","25253","25254","25255","25256","25257","25258","25259","25260","25261","25262","25263","25264","25265","25266","25267","25268","25269","25270","25271","25272","25273","25274","25275","25276","25277","25278","25279","25280","25281","25282","25283","25284","25285","25286","25287","25288","25289","25290","25291","25292","25293","25294","25295","25296","25297","25298","25299","25300","25301","25302","25303","25304","25305","25306","25307","25308","25309","25310","25311","25312","25313","25314","25315","25316","25317","25318","25319","25320","25321","25322","25323","25324","25325","25326","25327","25328","25329","25330","25331","25332","25333","25334","25335","25336","25337","25338","25339","25340","25341","25342","25343","25344","25345","25346","25347","25348","25349","25350","25351","25352","25353","25354","25355","25356","25357","25358","25359","25360","25361","25362","25363","25364","25365","25366","25367","25368","25369","25370","25371","25372","25373","25374","25375","25376","25377","25378","25379","25380","25381","25382","25383","25384","25385","25386","25387","25388","25389","25390","25391","25392","25393","25394","25395","25396","25397","25398","25399","25400","25401","25402","25403","25404","25405","25406","25407","25408","25409","25410","25411","25412","25413","25414","25415","25416","25417","25418","25419","25420","25421","25422","25423","25424","25425","25426","25427","25428","25429","25430","25431","25432","25433","25434","25435","25436","25437","25438","25439","25440","25441","25442","25443","25444","25445","25446","25447","25448","25449","25450","25451","25452","25453","25454","25455","25456","25457","25458","25459","25460","25461","25462","25463","25464","25465","25466","25467","25468","25469","25470","25471","25472","25473","25474","25475","25476","25477","25478","25479","25480","25481","25482","25483","25484","25485","25486","25487","25488","25489","25490","25491","25492","25493","25494","25495","25496","25497","25498","25499","25500","25501","25502","25503","25504","25505","25506","25507","25508","25509","25510","25511","25512","25513","25514","25515","25516","25517","25518","25519","25520","25521","25522","25523","25524","25525","25526","25527","25528","25529","25530","25531","25532","25533","25534","25535","25536","25537","25538","25539","25540","25541","25542","25543","25544","25545","25546","25547","25548","25549","25550","25551","25552","25553","25554","25555","25556","25557","25558","25559","25560","25561","25562","25563","25564","25565","25566","25567","25568","25569","25570","25571","25572","25573","25574","25575","25576","25577","25578","25579","25580","25581","25582","25583","25584","25585","25586","25587","25588","25589","25590","25591","25592","25593","25594","25595","25596","25597","25598","25599","25600","25601","25602","25603","25604","25605","25606","25607","25608","25609","25610","25611","25612","25613","25614","25615","25616","25617","25618","25619","25620","25621","25622","25623","25624","25625","25626","25627","25628","25629","25630","25631","25632","25633","25634","25635","25636","25637","25638","25639","25640","25641","25642","25643","25644","25645","25646","25647","25648","25649","25650","25651","25652","25653","25654","25655","25656","25657","25658","25659","25660","25661","25662","25663","25664","25665","25666","25667","25668","25669","25670","25671","25672","25673","25674","25675","25676","25677","25678","25679","25680","25681","25682","25683","25684","25685","25686","25687","25688","25689","25690","25691","25692","25693","25694","25695","25696","25697","25698","25699","25700","25701","25702","25703","25704","25705","25706","25707","25708","25709","25710","25711","25712","25713","25714","25715","25716","25717","25718","25719","25720","25721","25722","25723","25724","25725","25726","25727","25728","25729","25730","25731","25732","25733","25734","25735","25736","25737","25738","25739","25740","25741","25742","25743","25744","25745","25746","25747","25748","25749","25750","25751","25752","25753","25754","25755","25756","25757","25758","25759","25760","25761","25762","25763","25764","25765","25766","25767","25768","25769","25770","25771","25772","25773","25774","25775","25776","25777","25778","25779","25780","25781","25782","25783","25784","25785","25786","25787","25788","25789","25790","25791","25792","25793","25794","25795","25796","25797","25798","25799","25800","25801","25802","25803","25804","25805","25806","25807","25808","25809","25810","25811","25812","25813","25814","25815","25816","25817","25818","25819","25820","25821","25822","25823","25824","25825","25826","25827","25828","25829","25830","25831","25832","25833","25834","25835","25836","25837","25838","25839","25840","25841","25842","25843","25844","25845","25846","25847","25848","25849","25850","25851","25852","25853","25854","25855","25856","25857","25858","25859","25860","25861","25862","25863","25864","25865","25866","25867","25868","25869","25870","25871","25872","25873","25874","25875","25876","25877","25878","25879","25880","25881","25882","25883","25884","25885","25886","25887","25888","25889","25890","25891","25892","25893","25894","25895","25896","25897","25898","25899","25900","25901","25902","25903","25904","25905","25906","25907","25908","25909","25910","25911","25912","25913","25914","25915","25916","25917","25918","25919","25920","25921","25922","25923","25924","25925","25926","25927","25928","25929","25930","25931","25932","25933","25934","25935","25936","25937","25938","25939","25940","25941","25942","25943","25944","25945","25946","25947","25948","25949","25950","25951","25952","25953","25954","25955","25956","25957","25958","25959","25960","25961","25962","25963","25964","25965","25966","25967","25968","25969","25970","25971","25972","25973","25974","25975","25976","25977","25978","25979","25980","25981","25982","25983","25984","25985","25986","25987","25988","25989","25990","25991","25992","25993","25994","25995","25996","25997","25998","25999","26000","26001","26002","26003","26004","26005","26006","26007","26008","26009","26010","26011","26012","26013","26014","26015","26016","26017","26018","26019","26020","26021","26022","26023","26024","26025","26026","26027","26028","26029","26030","26031","26032","26033","26034","26035","26036","26037","26038","26039","26040","26041","26042","26043","26044","26045","26046","26047","26048","26049","26050","26051","26052","26053","26054","26055","26056","26057","26058","26059","26060","26061","26062","26063","26064","26065","26066","26067","26068","26069","26070","26071","26072","26073","26074","26075","26076","26077","26078","26079","26080","26081","26082","26083","26084","26085","26086","26087","26088","26089","26090","26091","26092","26093","26094","26095","26096","26097","26098","26099","26100","26101","26102","26103","26104","26105","26106","26107","26108","26109","26110","26111","26112","26113","26114","26115","26116","26117","26118","26119","26120","26121","26122","26123","26124","26125","26126","26127","26128","26129","26130","26131","26132","26133","26134","26135","26136","26137","26138","26139","26140","26141","26142","26143","26144","26145","26146","26147","26148","26149","26150","26151","26152","26153","26154","26155","26156","26157","26158","26159","26160","26161","26162","26163","26164","26165","26166","26167","26168","26169","26170","26171","26172","26173","26174","26175","26176","26177","26178","26179","26180","26181","26182","26183","26184","26185","26186","26187","26188","26189","26190","26191","26192","26193","26194","26195","26196","26197","26198","26199","26200","26201","26202","26203","26204","26205","26206","26207","26208","26209","26210","26211","26212","26213","26214","26215","26216","26217","26218","26219","26220","26221","26222","26223","26224","26225","26226","26227","26228","26229","26230","26231","26232","26233","26234","26235","26236","26237","26238","26239","26240","26241","26242","26243","26244","26245","26246","26247","26248","26249","26250","26251","26252","26253","26254","26255","26256","26257","26258","26259","26260","26261","26262","26263","26264","26265","26266","26267","26268","26269","26270","26271","26272","26273","26274","26275","26276","26277","26278","26279","26280","26281","26282","26283","26284","26285","26286","26287","26288","26289","26290","26291","26292","26293","26294","26295","26296","26297","26298","26299","26300","26301","26302","26303","26304","26305","26306","26307","26308","26309","26310","26311","26312","26313","26314","26315","26316","26317","26318","26319","26320","26321","26322","26323","26324","26325","26326","26327","26328","26329","26330","26331","26332","26333","26334","26335","26336","26337","26338","26339","26340","26341","26342","26343","26344","26345","26346","26347","26348","26349","26350","26351","26352","26353","26354","26355","26356","26357","26358","26359","26360","26361","26362","26363","26364","26365","26366","26367","26368","26369","26370","26371","26372","26373","26374","26375","26376","26377","26378","26379","26380","26381","26382","26383","26384","26385","26386","26387","26388","26389","26390","26391","26392","26393","26394","26395","26396","26397","26398","26399","26400","26401","26402","26403","26404","26405","26406","26407","26408","26409","26410","26411","26412","26413","26414","26415","26416","26417","26418","26419","26420","26421","26422","26423","26424","26425","26426","26427","26428","26429","26430","26431","26432","26433","26434","26435","26436","26437","26438","26439","26440","26441","26442","26443","26444","26445","26446","26447","26448","26449","26450","26451","26452","26453","26454","26455","26456","26457","26458","26459","26460","26461","26462","26463","26464","26465","26466","26467","26468","26469","26470","26471","26472","26473","26474","26475","26476","26477","26478","26479","26480","26481","26482","26483","26484","26485","26486","26487","26488","26489","26490","26491","26492","26493","26494","26495","26496","26497","26498","26499","26500","26501","26502","26503","26504","26505","26506","26507","26508","26509","26510","26511","26512","26513","26514","26515","26516","26517","26518","26519","26520","26521","26522","26523","26524","26525","26526","26527","26528","26529","26530","26531","26532","26533","26534","26535","26536","26537","26538","26539","26540","26541","26542","26543","26544","26545","26546","26547","26548","26549","26550","26551","26552","26553","26554","26555","26556","26557","26558","26559","26560","26561","26562","26563","26564","26565","26566","26567","26568","26569","26570","26571","26572","26573","26574","26575","26576","26577","26578","26579","26580","26581","26582","26583","26584","26585","26586","26587","26588","26589","26590","26591","26592","26593","26594","26595","26596","26597","26598","26599","26600","26601","26602","26603","26604","26605","26606","26607","26608","26609","26610","26611","26612","26613","26614","26615","26616","26617","26618","26619","26620","26621","26622","26623","26624","26625","26626","26627","26628","26629","26630","26631","26632","26633","26634","26635","26636","26637","26638","26639","26640","26641","26642","26643","26644","26645","26646","26647","26648","26649","26650","26651","26652","26653","26654","26655","26656","26657","26658","26659","26660","26661","26662","26663","26664","26665","26666","26667","26668","26669","26670","26671","26672","26673","26674","26675","26676","26677","26678","26679","26680","26681","26682","26683","26684","26685","26686","26687","26688","26689","26690","26691","26692","26693","26694","26695","26696","26697","26698","26699","26700","26701","26702","26703","26704","26705","26706","26707","26708","26709","26710","26711","26712","26713","26714","26715","26716","26717","26718","26719","26720","26721","26722","26723","26724","26725","26726","26727","26728","26729","26730","26731","26732","26733","26734","26735","26736","26737","26738","26739","26740","26741","26742","26743","26744","26745","26746","26747","26748","26749","26750","26751","26752","26753","26754","26755","26756","26757","26758","26759","26760","26761","26762","26763","26764","26765","26766","26767","26768","26769","26770","26771","26772","26773","26774","26775","26776","26777","26778","26779","26780","26781","26782","26783","26784","26785","26786","26787","26788","26789","26790","26791","26792","26793","26794","26795","26796","26797","26798","26799","26800","26801","26802","26803","26804","26805","26806","26807","26808","26809","26810","26811","26812","26813","26814","26815","26816","26817","26818","26819","26820","26821","26822","26823","26824","26825","26826","26827","26828","26829","26830","26831","26832","26833","26834","26835","26836","26837","26838","26839","26840","26841","26842","26843","26844","26845","26846","26847","26848","26849","26850","26851","26852","26853","26854","26855","26856","26857","26858","26859","26860","26861","26862","26863","26864","26865","26866","26867","26868","26869","26870","26871","26872","26873","26874","26875","26876","26877","26878","26879","26880","26881","26882","26883","26884","26885","26886","26887","26888","26889","26890","26891","26892","26893","26894","26895","26896","26897","26898","26899","26900","26901","26902","26903","26904","26905","26906","26907","26908","26909","26910","26911","26912","26913","26914","26915","26916","26917","26918","26919","26920","26921","26922","26923","26924","26925","26926","26927","26928","26929","26930","26931","26932","26933","26934","26935","26936","26937","26938","26939","26940","26941","26942","26943","26944","26945","26946","26947","26948","26949","26950","26951","26952","26953","26954","26955","26956","26957","26958","26959","26960","26961","26962","26963","26964","26965","26966","26967","26968","26969","26970","26971","26972","26973","26974","26975","26976","26977","26978","26979","26980","26981","26982","26983","26984","26985","26986","26987","26988","26989","26990","26991","26992","26993","26994","26995","26996","26997","26998","26999","27000","27001","27002","27003","27004","27005","27006","27007","27008","27009","27010","27011","27012","27013","27014","27015","27016","27017","27018","27019","27020","27021","27022","27023","27024","27025","27026","27027","27028","27029","27030","27031","27032","27033","27034","27035","27036","27037","27038","27039","27040","27041","27042","27043","27044","27045","27046","27047","27048","27049","27050","27051","27052","27053","27054","27055","27056","27057","27058","27059","27060","27061","27062","27063","27064","27065","27066","27067","27068","27069","27070","27071","27072","27073","27074","27075","27076","27077","27078","27079","27080","27081","27082","27083","27084","27085","27086","27087","27088","27089","27090","27091","27092","27093","27094","27095","27096","27097","27098","27099","27100","27101","27102","27103","27104","27105","27106","27107","27108","27109","27110","27111","27112","27113","27114","27115","27116","27117","27118","27119","27120","27121","27122","27123","27124","27125","27126","27127","27128","27129","27130","27131","27132","27133","27134","27135","27136","27137","27138","27139","27140","27141","27142","27143","27144","27145","27146","27147","27148","27149","27150","27151","27152","27153","27154","27155","27156","27157","27158","27159","27160","27161","27162","27163","27164","27165","27166","27167","27168","27169","27170","27171","27172","27173","27174","27175","27176","27177","27178","27179","27180","27181","27182","27183","27184","27185","27186","27187","27188","27189","27190","27191","27192","27193","27194","27195","27196","27197","27198","27199","27200","27201","27202","27203","27204","27205","27206","27207","27208","27209","27210","27211","27212","27213","27214","27215","27216","27217","27218","27219","27220","27221","27222","27223","27224","27225","27226","27227","27228","27229","27230","27231","27232","27233","27234","27235","27236","27237","27238","27239","27240","27241","27242","27243","27244","27245","27246","27247","27248","27249","27250","27251","27252","27253","27254","27255","27256","27257","27258","27259","27260","27261","27262","27263","27264","27265","27266","27267","27268","27269","27270","27271","27272","27273","27274","27275","27276","27277","27278","27279","27280","27281","27282","27283","27284","27285","27286","27287","27288","27289","27290","27291","27292","27293","27294","27295","27296","27297","27298","27299","27300","27301","27302","27303","27304","27305","27306","27307","27308","27309","27310","27311","27312","27313","27314","27315","27316","27317","27318","27319","27320","27321","27322","27323","27324","27325","27326","27327","27328","27329","27330","27331","27332","27333","27334","27335","27336","27337","27338","27339","27340","27341","27342","27343","27344","27345","27346","27347","27348","27349","27350","27351","27352","27353","27354","27355","27356","27357","27358","27359","27360","27361","27362","27363","27364","27365","27366","27367","27368","27369","27370","27371","27372","27373","27374","27375","27376","27377","27378","27379","27380","27381","27382","27383","27384","27385","27386","27387","27388","27389","27390","27391","27392","27393","27394","27395","27396","27397","27398","27399","27400","27401","27402","27403","27404","27405","27406","27407","27408","27409","27410","27411","27412","27413","27414","27415","27416","27417","27418","27419","27420","27421","27422","27423","27424","27425","27426","27427","27428","27429","27430","27431","27432","27433","27434","27435","27436","27437","27438","27439","27440","27441","27442","27443","27444","27445","27446","27447","27448","27449","27450","27451","27452","27453","27454","27455","27456","27457","27458","27459","27460","27461","27462","27463","27464","27465","27466","27467","27468","27469","27470","27471","27472","27473","27474","27475","27476","27477","27478","27479","27480","27481","27482","27483","27484","27485","27486","27487","27488","27489","27490","27491","27492","27493","27494","27495","27496","27497","27498","27499","27500","27501","27502","27503","27504","27505","27506","27507","27508","27509","27510","27511","27512","27513","27514","27515","27516","27517","27518","27519","27520","27521","27522","27523","27524","27525","27526","27527","27528","27529","27530","27531","27532","27533","27534","27535","27536","27537","27538","27539","27540","27541","27542","27543","27544","27545","27546","27547","27548","27549","27550","27551","27552","27553","27554","27555","27556","27557","27558","27559","27560","27561","27562","27563","27564","27565","27566","27567","27568","27569","27570","27571","27572","27573","27574","27575","27576","27577","27578","27579","27580","27581","27582","27583","27584","27585","27586","27587","27588","27589","27590","27591","27592","27593","27594","27595","27596","27597","27598","27599","27600","27601","27602","27603","27604","27605","27606","27607","27608","27609","27610","27611","27612","27613","27614","27615","27616","27617","27618","27619","27620","27621","27622","27623","27624","27625","27626","27627","27628","27629","27630","27631","27632","27633","27634","27635","27636","27637","27638","27639","27640","27641","27642","27643","27644","27645","27646","27647","27648","27649","27650","27651","27652","27653","27654","27655","27656","27657","27658","27659","27660","27661","27662","27663","27664","27665","27666","27667","27668","27669","27670","27671","27672","27673","27674","27675","27676","27677","27678","27679","27680","27681","27682","27683","27684","27685","27686","27687","27688","27689","27690","27691","27692","27693","27694","27695","27696","27697","27698","27699","27700","27701","27702","27703","27704","27705","27706","27707","27708","27709","27710","27711","27712","27713","27714","27715","27716","27717","27718","27719","27720","27721","27722","27723","27724","27725","27726","27727","27728","27729","27730","27731","27732","27733","27734","27735","27736","27737","27738","27739","27740","27741","27742","27743","27744","27745","27746","27747","27748","27749","27750","27751","27752","27753","27754","27755","27756","27757","27758","27759","27760","27761","27762","27763","27764","27765","27766","27767","27768","27769","27770","27771","27772","27773","27774","27775","27776","27777","27778","27779","27780","27781","27782","27783","27784","27785","27786","27787","27788","27789","27790","27791","27792","27793","27794","27795","27796","27797","27798","27799","27800","27801","27802","27803","27804","27805","27806","27807","27808","27809","27810","27811","27812","27813","27814","27815","27816","27817","27818","27819","27820","27821","27822","27823","27824","27825","27826","27827","27828","27829","27830","27831","27832","27833","27834","27835","27836","27837","27838","27839","27840","27841","27842","27843","27844","27845","27846","27847","27848","27849","27850","27851","27852","27853","27854","27855","27856","27857","27858","27859","27860","27861","27862","27863","27864","27865","27866","27867","27868","27869","27870","27871","27872","27873","27874","27875","27876","27877","27878","27879","27880","27881","27882","27883","27884","27885","27886","27887","27888","27889","27890","27891","27892","27893","27894","27895","27896","27897","27898","27899","27900","27901","27902","27903","27904","27905","27906","27907","27908","27909","27910","27911","27912","27913","27914","27915","27916","27917","27918","27919","27920","27921","27922","27923","27924","27925","27926","27927","27928","27929","27930","27931","27932","27933","27934","27935","27936","27937","27938","27939","27940","27941","27942","27943","27944","27945","27946","27947","27948","27949","27950","27951","27952","27953","27954","27955","27956","27957","27958","27959","27960","27961","27962","27963","27964","27965","27966","27967","27968","27969","27970","27971","27972","27973","27974","27975","27976","27977","27978","27979","27980","27981","27982","27983","27984","27985","27986","27987","27988","27989","27990","27991","27992","27993","27994","27995","27996","27997","27998","27999","28000","28001","28002","28003","28004","28005","28006","28007","28008","28009","28010","28011","28012","28013","28014","28015","28016","28017","28018","28019","28020","28021","28022","28023","28024","28025","28026","28027","28028","28029","28030","28031","28032","28033","28034","28035","28036","28037","28038","28039","28040","28041","28042","28043","28044","28045","28046","28047","28048","28049","28050","28051","28052","28053","28054","28055","28056","28057","28058","28059","28060","28061","28062","28063","28064","28065","28066","28067","28068","28069","28070","28071","28072","28073","28074","28075","28076","28077","28078","28079","28080","28081","28082","28083","28084","28085","28086","28087","28088","28089","28090","28091","28092","28093","28094","28095","28096","28097","28098","28099","28100","28101","28102","28103","28104","28105","28106","28107","28108","28109","28110","28111","28112","28113","28114","28115","28116","28117","28118","28119","28120","28121","28122","28123","28124","28125","28126","28127","28128","28129","28130","28131","28132","28133","28134","28135","28136","28137","28138","28139","28140","28141","28142","28143","28144","28145","28146","28147","28148","28149","28150","28151","28152","28153","28154","28155","28156","28157","28158","28159","28160","28161","28162","28163","28164","28165","28166","28167","28168","28169","28170","28171","28172","28173","28174","28175","28176","28177","28178","28179","28180","28181","28182","28183","28184","28185","28186","28187","28188","28189","28190","28191","28192","28193","28194","28195","28196","28197","28198","28199","28200","28201","28202","28203","28204","28205","28206","28207","28208","28209","28210","28211","28212","28213","28214","28215","28216","28217","28218","28219","28220","28221","28222","28223","28224","28225","28226","28227","28228","28229","28230","28231","28232","28233","28234","28235","28236","28237","28238","28239","28240","28241","28242","28243","28244","28245","28246","28247","28248","28249","28250","28251","28252","28253","28254","28255","28256","28257","28258","28259","28260","28261","28262","28263","28264","28265","28266","28267","28268","28269","28270","28271","28272","28273","28274","28275","28276","28277","28278","28279","28280","28281","28282","28283","28284","28285","28286","28287","28288","28289","28290","28291","28292","28293","28294","28295","28296","28297","28298","28299","28300","28301","28302","28303","28304","28305","28306","28307","28308","28309","28310","28311","28312","28313","28314","28315","28316","28317","28318","28319","28320","28321","28322","28323","28324","28325","28326","28327","28328","28329","28330","28331","28332","28333","28334","28335","28336","28337","28338","28339","28340","28341","28342","28343","28344","28345","28346","28347","28348","28349","28350","28351","28352","28353","28354","28355","28356","28357","28358","28359","28360","28361","28362","28363","28364","28365","28366","28367","28368","28369","28370","28371","28372","28373","28374","28375","28376","28377","28378","28379","28380","28381","28382","28383","28384","28385","28386","28387","28388","28389","28390","28391","28392","28393","28394","28395","28396","28397","28398","28399","28400","28401","28402","28403","28404","28405","28406","28407","28408","28409","28410","28411","28412","28413","28414","28415","28416","28417","28418","28419","28420","28421","28422","28423","28424","28425","28426","28427","28428","28429","28430","28431","28432","28433","28434","28435","28436","28437","28438","28439","28440","28441","28442","28443","28444","28445","28446","28447","28448","28449","28450","28451","28452","28453","28454","28455","28456","28457","28458","28459","28460","28461","28462","28463","28464","28465","28466","28467","28468","28469","28470","28471","28472","28473","28474","28475","28476","28477","28478","28479","28480","28481","28482","28483","28484","28485","28486","28487","28488","28489","28490","28491","28492","28493","28494","28495","28496","28497","28498","28499","28500","28501","28502","28503","28504","28505","28506","28507","28508","28509","28510","28511","28512","28513","28514","28515","28516","28517","28518","28519","28520","28521","28522","28523","28524","28525","28526","28527","28528","28529","28530","28531","28532","28533","28534","28535","28536","28537","28538","28539","28540","28541","28542","28543","28544","28545","28546","28547","28548","28549","28550","28551","28552","28553","28554","28555","28556","28557","28558","28559","28560","28561","28562","28563","28564","28565","28566","28567","28568","28569","28570","28571","28572","28573","28574","28575","28576","28577","28578","28579","28580","28581","28582","28583","28584","28585","28586","28587","28588","28589","28590","28591","28592","28593","28594","28595","28596","28597","28598","28599","28600","28601","28602","28603","28604","28605","28606","28607","28608","28609","28610","28611","28612","28613","28614","28615","28616","28617","28618","28619","28620","28621","28622","28623","28624","28625","28626","28627","28628","28629","28630","28631","28632","28633","28634","28635","28636","28637","28638","28639","28640","28641","28642","28643","28644","28645","28646","28647","28648","28649","28650","28651","28652","28653","28654","28655","28656","28657","28658","28659","28660","28661","28662","28663","28664","28665","28666","28667","28668","28669","28670","28671","28672","28673","28674","28675","28676","28677","28678","28679","28680","28681","28682","28683","28684","28685","28686","28687","28688","28689","28690","28691","28692","28693","28694","28695","28696","28697","28698","28699","28700","28701","28702","28703","28704","28705","28706","28707","28708","28709","28710","28711","28712","28713","28714","28715","28716","28717","28718","28719","28720","28721","28722","28723","28724","28725","28726","28727","28728","28729","28730","28731","28732","28733","28734","28735","28736","28737","28738","28739","28740","28741","28742","28743","28744","28745","28746","28747","28748","28749","28750","28751","28752","28753","28754","28755","28756","28757","28758","28759","28760","28761","28762","28763","28764","28765","28766","28767","28768","28769","28770","28771","28772","28773","28774","28775","28776","28777","28778","28779","28780","28781","28782","28783","28784","28785","28786","28787","28788","28789","28790","28791","28792","28793","28794","28795","28796","28797","28798","28799","28800","28801","28802","28803","28804","28805","28806","28807","28808","28809","28810","28811","28812","28813","28814","28815","28816","28817","28818","28819","28820","28821","28822","28823","28824","28825","28826","28827","28828","28829","28830","28831","28832","28833","28834","28835","28836","28837","28838","28839","28840","28841","28842","28843","28844","28845","28846","28847","28848","28849","28850","28851","28852","28853","28854","28855","28856","28857","28858","28859","28860","28861","28862","28863","28864","28865","28866","28867","28868","28869","28870","28871","28872","28873","28874","28875","28876","28877","28878","28879","28880","28881","28882","28883","28884","28885","28886","28887","28888","28889","28890","28891","28892","28893","28894","28895","28896","28897","28898","28899","28900","28901","28902","28903","28904","28905","28906","28907","28908","28909","28910","28911","28912","28913","28914","28915","28916","28917","28918","28919","28920","28921","28922","28923","28924","28925","28926","28927","28928","28929","28930","28931","28932","28933","28934","28935","28936","28937","28938","28939","28940","28941","28942","28943","28944","28945","28946","28947","28948","28949","28950","28951","28952","28953","28954","28955","28956","28957","28958","28959","28960","28961","28962","28963","28964","28965","28966","28967","28968","28969","28970","28971","28972","28973","28974","28975","28976","28977","28978","28979","28980","28981","28982","28983","28984","28985","28986","28987","28988","28989","28990","28991","28992","28993","28994","28995","28996","28997","28998","28999","29000","29001","29002","29003","29004","29005","29006","29007","29008","29009","29010","29011","29012","29013","29014","29015","29016","29017","29018","29019","29020","29021","29022","29023","29024","29025","29026","29027","29028","29029","29030","29031","29032","29033","29034","29035","29036","29037","29038","29039","29040","29041","29042","29043","29044","29045","29046","29047","29048","29049","29050","29051","29052","29053","29054","29055","29056","29057","29058","29059","29060","29061","29062","29063","29064","29065","29066","29067","29068","29069","29070","29071","29072","29073","29074","29075","29076","29077","29078","29079","29080","29081","29082","29083","29084","29085","29086","29087","29088","29089","29090","29091","29092","29093","29094","29095","29096","29097","29098","29099","29100","29101","29102","29103","29104","29105","29106","29107","29108","29109","29110","29111","29112","29113","29114","29115","29116","29117","29118","29119","29120","29121","29122","29123","29124","29125","29126","29127","29128","29129","29130","29131","29132","29133","29134","29135","29136","29137","29138","29139","29140","29141","29142","29143","29144","29145","29146","29147","29148","29149","29150","29151","29152","29153","29154","29155","29156","29157","29158","29159","29160","29161","29162","29163","29164","29165","29166","29167","29168","29169","29170","29171","29172","29173","29174","29175","29176","29177","29178","29179","29180","29181","29182","29183","29184","29185","29186","29187","29188","29189","29190","29191","29192","29193","29194","29195","29196","29197","29198","29199","29200","29201","29202","29203","29204","29205","29206","29207","29208","29209","29210","29211","29212","29213","29214","29215","29216","29217","29218","29219","29220","29221","29222","29223","29224","29225","29226","29227","29228","29229","29230","29231","29232","29233","29234","29235","29236","29237","29238","29239","29240","29241","29242","29243","29244","29245","29246","29247","29248","29249","29250","29251","29252","29253","29254","29255","29256","29257","29258","29259","29260","29261","29262","29263","29264","29265","29266","29267","29268","29269","29270","29271","29272","29273","29274","29275","29276","29277","29278","29279","29280","29281","29282","29283","29284","29285","29286","29287","29288","29289","29290","29291","29292","29293","29294","29295","29296","29297","29298","29299","29300","29301","29302","29303","29304","29305","29306","29307","29308","29309","29310","29311","29312","29313","29314","29315","29316","29317","29318","29319","29320","29321","29322","29323","29324","29325","29326","29327","29328","29329","29330","29331","29332","29333","29334","29335","29336","29337","29338","29339","29340","29341","29342","29343","29344","29345","29346","29347","29348","29349","29350","29351","29352","29353","29354","29355","29356","29357","29358","29359","29360","29361","29362","29363","29364","29365","29366","29367","29368","29369","29370","29371","29372","29373","29374","29375","29376","29377","29378","29379","29380","29381","29382","29383","29384","29385","29386","29387","29388","29389","29390","29391","29392","29393","29394","29395","29396","29397","29398","29399","29400","29401","29402","29403","29404","29405","29406","29407","29408","29409","29410","29411","29412","29413","29414","29415","29416","29417","29418","29419","29420","29421","29422","29423","29424","29425","29426","29427","29428","29429","29430","29431","29432","29433","29434","29435","29436","29437","29438","29439","29440","29441","29442","29443","29444","29445","29446","29447","29448","29449","29450","29451","29452","29453","29454","29455","29456","29457","29458","29459","29460","29461","29462","29463","29464","29465","29466","29467","29468","29469","29470","29471","29472","29473","29474","29475","29476","29477","29478","29479","29480","29481","29482","29483","29484","29485","29486","29487","29488","29489","29490","29491","29492","29493","29494","29495","29496","29497","29498","29499","29500","29501","29502","29503","29504","29505","29506","29507","29508","29509","29510","29511","29512","29513","29514","29515","29516","29517","29518","29519","29520","29521","29522","29523","29524","29525","29526","29527","29528","29529","29530","29531","29532","29533","29534","29535","29536","29537","29538","29539","29540","29541","29542","29543","29544","29545","29546","29547","29548","29549","29550","29551","29552","29553","29554","29555","29556","29557","29558","29559","29560","29561","29562","29563","29564","29565","29566","29567","29568","29569","29570","29571","29572","29573","29574","29575","29576","29577","29578","29579","29580","29581","29582","29583","29584","29585","29586","29587","29588","29589","29590","29591","29592","29593","29594","29595","29596","29597","29598","29599","29600","29601","29602","29603","29604","29605","29606","29607","29608","29609","29610","29611","29612","29613","29614","29615","29616","29617","29618","29619","29620","29621","29622","29623","29624","29625","29626","29627","29628","29629","29630","29631","29632","29633","29634","29635","29636","29637","29638","29639","29640","29641","29642","29643","29644","29645","29646","29647","29648","29649","29650","29651","29652","29653","29654","29655","29656","29657","29658","29659","29660","29661","29662","29663","29664","29665","29666","29667","29668","29669","29670","29671","29672","29673","29674","29675","29676","29677","29678","29679","29680","29681","29682","29683","29684","29685","29686","29687","29688","29689","29690","29691","29692","29693","29694","29695","29696","29697","29698","29699","29700","29701","29702","29703","29704","29705","29706","29707","29708","29709","29710","29711","29712","29713","29714","29715","29716","29717","29718","29719","29720","29721","29722","29723","29724","29725","29726","29727","29728","29729","29730","29731","29732","29733","29734","29735","29736","29737","29738","29739","29740","29741","29742","29743","29744","29745","29746","29747","29748","29749","29750","29751","29752","29753","29754","29755","29756","29757","29758","29759","29760","29761","29762","29763","29764","29765","29766","29767","29768","29769","29770","29771","29772","29773","29774","29775","29776","29777","29778","29779","29780","29781","29782","29783","29784","29785","29786","29787","29788","29789","29790","29791","29792","29793","29794","29795","29796","29797","29798","29799","29800","29801","29802","29803","29804","29805","29806","29807","29808","29809","29810","29811","29812","29813","29814","29815","29816","29817","29818","29819","29820","29821","29822","29823","29824","29825","29826","29827","29828","29829","29830","29831","29832","29833","29834","29835","29836","29837","29838","29839","29840","29841","29842","29843","29844","29845","29846","29847","29848","29849","29850","29851","29852","29853","29854","29855","29856","29857","29858","29859","29860","29861","29862","29863","29864","29865","29866","29867","29868","29869","29870","29871","29872","29873","29874","29875","29876","29877","29878","29879","29880","29881","29882","29883","29884","29885","29886","29887","29888","29889","29890","29891","29892","29893","29894","29895","29896","29897","29898","29899","29900","29901","29902","29903","29904","29905","29906","29907","29908","29909","29910","29911","29912","29913","29914","29915","29916","29917","29918","29919","29920","29921","29922","29923","29924","29925","29926","29927","29928","29929","29930","29931","29932","29933","29934","29935","29936","29937","29938","29939","29940","29941","29942","29943","29944","29945","29946","29947","29948","29949","29950","29951","29952","29953","29954","29955","29956","29957","29958","29959","29960","29961","29962","29963","29964","29965","29966","29967","29968","29969","29970","29971","29972","29973","29974","29975","29976","29977","29978","29979","29980","29981","29982","29983","29984","29985","29986","29987","29988","29989","29990","29991","29992","29993","29994","29995","29996","29997","29998","29999","30000","30001","30002","30003","30004","30005","30006","30007","30008","30009","30010","30011","30012","30013","30014","30015","30016","30017","30018","30019","30020","30021","30022","30023","30024","30025","30026","30027","30028","30029","30030","30031","30032","30033","30034","30035","30036","30037","30038","30039","30040","30041","30042","30043","30044","30045","30046","30047","30048","30049","30050","30051","30052","30053","30054","30055","30056","30057","30058","30059","30060","30061","30062","30063","30064","30065","30066","30067","30068","30069","30070","30071","30072","30073","30074","30075","30076","30077","30078","30079","30080","30081","30082","30083","30084","30085","30086","30087","30088","30089","30090","30091","30092","30093","30094","30095","30096","30097","30098","30099","30100","30101","30102","30103","30104","30105","30106","30107","30108","30109","30110","30111","30112","30113","30114","30115","30116","30117","30118","30119","30120","30121","30122","30123","30124","30125","30126","30127","30128","30129","30130","30131","30132","30133","30134","30135","30136","30137","30138","30139","30140","30141","30142","30143","30144","30145","30146","30147","30148","30149","30150","30151","30152","30153","30154","30155","30156","30157","30158","30159","30160","30161","30162","30163","30164","30165","30166","30167","30168","30169","30170","30171","30172","30173","30174","30175","30176","30177","30178","30179","30180","30181","30182","30183","30184","30185","30186","30187","30188","30189","30190","30191","30192","30193","30194","30195","30196","30197","30198","30199","30200","30201","30202","30203","30204","30205","30206","30207","30208","30209","30210","30211","30212","30213","30214","30215","30216","30217","30218","30219","30220","30221","30222","30223","30224","30225","30226","30227","30228","30229","30230","30231","30232","30233","30234","30235","30236","30237","30238","30239","30240","30241","30242","30243","30244","30245","30246","30247","30248","30249","30250","30251","30252","30253","30254","30255","30256","30257","30258","30259","30260","30261","30262","30263","30264","30265","30266","30267","30268","30269","30270","30271","30272","30273","30274","30275","30276","30277","30278","30279","30280","30281","30282","30283","30284","30285","30286","30287","30288","30289","30290","30291","30292","30293","30294","30295","30296","30297","30298","30299","30300","30301","30302","30303","30304","30305","30306","30307","30308","30309","30310","30311","30312","30313","30314","30315","30316","30317","30318","30319","30320","30321","30322","30323","30324","30325","30326","30327","30328","30329","30330","30331","30332","30333","30334","30335","30336","30337","30338","30339","30340","30341","30342","30343","30344","30345","30346","30347","30348","30349","30350","30351","30352","30353","30354","30355","30356","30357","30358","30359","30360","30361","30362","30363","30364","30365","30366","30367","30368","30369","30370","30371","30372","30373","30374","30375","30376","30377","30378","30379","30380","30381","30382","30383","30384","30385","30386","30387","30388","30389","30390","30391","30392","30393","30394","30395","30396","30397","30398","30399","30400","30401","30402","30403","30404","30405","30406","30407","30408","30409","30410","30411","30412","30413","30414","30415","30416","30417","30418","30419","30420","30421","30422","30423","30424","30425","30426","30427","30428","30429","30430","30431","30432","30433","30434","30435","30436","30437","30438","30439","30440","30441","30442","30443","30444","30445","30446","30447","30448","30449","30450","30451","30452","30453","30454","30455","30456","30457","30458","30459","30460","30461","30462","30463","30464","30465","30466","30467","30468","30469","30470","30471","30472","30473","30474","30475","30476","30477","30478","30479","30480","30481","30482","30483","30484","30485","30486","30487","30488","30489","30490","30491","30492","30493","30494","30495","30496","30497","30498","30499","30500","30501","30502","30503","30504","30505","30506","30507","30508","30509","30510","30511","30512","30513","30514","30515","30516","30517","30518","30519","30520","30521","30522","30523","30524","30525","30526","30527","30528","30529","30530","30531","30532","30533","30534","30535","30536","30537","30538","30539","30540","30541","30542","30543","30544","30545","30546","30547","30548","30549","30550","30551","30552","30553","30554","30555","30556","30557","30558","30559","30560","30561","30562","30563","30564","30565","30566","30567","30568","30569","30570","30571","30572","30573","30574","30575","30576","30577","30578","30579","30580","30581","30582","30583","30584","30585","30586","30587","30588","30589","30590","30591","30592","30593","30594","30595","30596","30597","30598","30599","30600","30601","30602","30603","30604","30605","30606","30607","30608","30609","30610","30611","30612","30613","30614","30615","30616","30617","30618","30619","30620","30621","30622","30623","30624","30625","30626","30627","30628","30629","30630","30631","30632","30633","30634","30635","30636","30637","30638","30639","30640","30641","30642","30643","30644","30645","30646","30647","30648","30649","30650","30651","30652","30653","30654","30655","30656","30657","30658","30659","30660","30661","30662","30663","30664","30665","30666","30667","30668","30669","30670","30671","30672","30673","30674","30675","30676","30677","30678","30679","30680","30681","30682","30683","30684","30685","30686","30687","30688","30689","30690","30691","30692","30693","30694","30695","30696","30697","30698","30699","30700","30701","30702","30703","30704","30705","30706","30707","30708","30709","30710","30711","30712","30713","30714","30715","30716","30717","30718","30719","30720","30721","30722","30723","30724","30725","30726","30727","30728","30729","30730","30731","30732","30733","30734","30735","30736","30737","30738","30739","30740","30741","30742","30743","30744","30745","30746","30747","30748","30749","30750","30751","30752","30753","30754","30755","30756","30757","30758","30759","30760","30761","30762","30763","30764","30765","30766","30767","30768","30769","30770","30771","30772","30773","30774","30775","30776","30777","30778","30779","30780","30781","30782","30783","30784","30785","30786","30787","30788","30789","30790","30791","30792","30793","30794","30795","30796","30797","30798","30799","30800","30801","30802","30803","30804","30805","30806","30807","30808","30809","30810","30811","30812","30813","30814","30815","30816","30817","30818","30819","30820","30821","30822","30823","30824","30825","30826","30827","30828","30829","30830","30831","30832","30833","30834","30835","30836","30837","30838","30839","30840","30841","30842","30843","30844","30845","30846","30847","30848","30849","30850","30851","30852","30853","30854","30855","30856","30857","30858","30859","30860","30861","30862","30863","30864","30865","30866","30867","30868","30869","30870","30871","30872","30873","30874","30875","30876","30877","30878","30879","30880","30881","30882","30883","30884","30885","30886","30887","30888","30889","30890","30891","30892","30893","30894","30895","30896","30897","30898","30899","30900","30901","30902","30903","30904","30905","30906","30907","30908","30909","30910","30911","30912","30913","30914","30915","30916","30917","30918","30919","30920","30921","30922","30923","30924","30925","30926","30927","30928","30929","30930","30931","30932","30933","30934","30935","30936","30937","30938","30939","30940","30941","30942","30943","30944","30945","30946","30947","30948","30949","30950","30951","30952","30953","30954","30955","30956","30957","30958","30959","30960","30961","30962","30963","30964","30965","30966","30967","30968","30969","30970","30971","30972","30973","30974","30975","30976","30977","30978","30979","30980","30981","30982","30983","30984","30985","30986","30987","30988","30989","30990","30991","30992","30993","30994","30995","30996","30997","30998","30999","31000","31001","31002","31003","31004","31005","31006","31007","31008","31009","31010","31011","31012","31013","31014","31015","31016","31017","31018","31019","31020","31021","31022","31023","31024","31025","31026","31027","31028","31029","31030","31031","31032","31033","31034","31035","31036","31037","31038","31039","31040","31041","31042","31043","31044","31045","31046","31047","31048","31049","31050","31051","31052","31053","31054","31055","31056","31057","31058","31059","31060","31061","31062","31063","31064","31065","31066","31067","31068","31069","31070","31071","31072","31073","31074","31075","31076","31077","31078","31079","31080","31081","31082","31083","31084","31085","31086","31087","31088","31089","31090","31091","31092","31093","31094","31095","31096","31097","31098","31099","31100","31101","31102","31103","31104","31105","31106","31107","31108","31109","31110","31111","31112","31113","31114","31115","31116","31117","31118","31119","31120","31121","31122","31123","31124","31125","31126","31127","31128","31129","31130","31131","31132","31133","31134","31135","31136","31137","31138","31139","31140","31141","31142","31143","31144","31145","31146","31147","31148","31149","31150","31151","31152","31153","31154","31155","31156","31157","31158","31159","31160","31161","31162","31163","31164","31165","31166","31167","31168","31169","31170","31171","31172","31173","31174","31175","31176","31177","31178","31179","31180","31181","31182","31183","31184","31185","31186","31187","31188","31189","31190","31191","31192","31193","31194","31195","31196","31197","31198","31199","31200","31201","31202","31203","31204","31205","31206","31207","31208","31209","31210","31211","31212","31213","31214","31215","31216","31217","31218","31219","31220","31221","31222","31223","31224","31225","31226","31227","31228","31229","31230","31231","31232","31233","31234","31235","31236","31237","31238","31239","31240","31241","31242","31243","31244","31245","31246","31247","31248","31249","31250","31251","31252","31253","31254","31255","31256","31257","31258","31259","31260","31261","31262","31263","31264","31265","31266","31267","31268","31269","31270","31271","31272","31273","31274","31275","31276","31277","31278","31279","31280","31281","31282","31283","31284","31285","31286","31287","31288","31289","31290","31291","31292","31293","31294","31295","31296","31297","31298","31299","31300","31301","31302","31303","31304","31305","31306","31307","31308","31309","31310","31311","31312","31313","31314","31315","31316","31317","31318","31319","31320","31321","31322","31323","31324","31325","31326","31327","31328","31329","31330","31331","31332","31333","31334","31335","31336","31337","31338","31339","31340","31341","31342","31343","31344","31345","31346","31347","31348","31349","31350","31351","31352","31353","31354","31355","31356","31357","31358","31359","31360","31361","31362","31363","31364","31365","31366","31367","31368","31369","31370","31371","31372","31373","31374","31375","31376","31377","31378","31379","31380","31381","31382","31383","31384","31385","31386","31387","31388","31389","31390","31391","31392","31393","31394","31395","31396","31397","31398","31399","31400","31401","31402","31403","31404","31405","31406","31407","31408","31409","31410","31411","31412","31413","31414","31415","31416","31417","31418","31419","31420","31421","31422","31423","31424","31425","31426","31427","31428","31429","31430","31431","31432","31433","31434","31435","31436","31437","31438","31439","31440","31441","31442","31443","31444","31445","31446","31447","31448","31449","31450","31451","31452","31453","31454","31455","31456","31457","31458","31459","31460","31461","31462","31463","31464","31465","31466","31467","31468","31469","31470","31471","31472","31473","31474","31475","31476","31477","31478","31479","31480","31481","31482","31483","31484","31485","31486","31487","31488","31489","31490","31491","31492","31493","31494","31495","31496","31497","31498","31499","31500","31501","31502","31503","31504","31505","31506","31507","31508","31509","31510","31511","31512","31513","31514","31515","31516","31517","31518","31519","31520","31521","31522","31523","31524","31525","31526","31527","31528","31529","31530","31531","31532","31533","31534","31535","31536","31537","31538","31539","31540","31541","31542","31543","31544","31545","31546","31547","31548","31549","31550","31551","31552","31553","31554","31555","31556","31557","31558","31559","31560","31561","31562","31563","31564","31565","31566","31567","31568","31569","31570","31571","31572","31573","31574","31575","31576","31577","31578","31579","31580","31581","31582","31583","31584","31585","31586","31587","31588","31589","31590","31591","31592","31593","31594","31595","31596","31597","31598","31599","31600","31601","31602","31603","31604","31605","31606","31607","31608","31609","31610","31611","31612","31613","31614","31615","31616","31617","31618","31619","31620","31621","31622","31623","31624","31625","31626","31627","31628","31629","31630","31631","31632","31633","31634","31635","31636","31637","31638","31639","31640","31641","31642","31643","31644","31645","31646","31647","31648","31649","31650","31651","31652","31653","31654","31655","31656","31657","31658","31659","31660","31661","31662","31663","31664","31665","31666","31667","31668","31669","31670","31671","31672","31673","31674","31675","31676","31677","31678","31679","31680","31681","31682","31683","31684","31685","31686","31687","31688","31689","31690","31691","31692","31693","31694","31695","31696","31697","31698","31699","31700","31701","31702","31703","31704","31705","31706","31707","31708","31709","31710","31711","31712","31713","31714","31715","31716","31717","31718","31719","31720","31721","31722","31723","31724","31725","31726","31727","31728","31729","31730","31731","31732","31733","31734","31735","31736","31737","31738","31739","31740","31741","31742","31743","31744","31745","31746","31747","31748","31749","31750","31751","31752","31753","31754","31755","31756","31757","31758","31759","31760","31761","31762","31763","31764","31765","31766","31767","31768","31769","31770","31771","31772","31773","31774","31775","31776","31777","31778","31779","31780","31781","31782","31783","31784","31785","31786","31787","31788","31789","31790","31791","31792","31793","31794","31795","31796","31797","31798","31799","31800","31801","31802","31803","31804","31805","31806","31807","31808","31809","31810","31811","31812","31813","31814","31815","31816","31817","31818","31819","31820","31821","31822","31823","31824","31825","31826","31827","31828","31829","31830","31831","31832","31833","31834","31835","31836","31837","31838","31839","31840","31841","31842","31843","31844","31845","31846","31847","31848","31849","31850","31851","31852","31853","31854","31855","31856","31857","31858","31859","31860","31861","31862","31863","31864","31865","31866","31867","31868","31869","31870","31871","31872","31873","31874","31875","31876","31877","31878","31879","31880","31881","31882","31883","31884","31885","31886","31887","31888","31889","31890","31891","31892","31893","31894","31895","31896","31897","31898","31899","31900","31901","31902","31903","31904","31905","31906","31907","31908","31909","31910","31911","31912","31913","31914","31915","31916","31917","31918","31919","31920","31921","31922","31923","31924","31925","31926","31927","31928","31929","31930","31931","31932","31933","31934","31935","31936","31937","31938","31939","31940","31941","31942","31943","31944","31945","31946","31947","31948","31949","31950","31951","31952","31953","31954","31955","31956","31957","31958","31959","31960","31961","31962","31963","31964","31965","31966","31967","31968","31969","31970","31971","31972","31973","31974","31975","31976","31977","31978","31979","31980","31981","31982","31983","31984","31985","31986","31987","31988","31989","31990","31991","31992","31993","31994","31995","31996","31997","31998","31999","32000","32001","32002","32003","32004","32005","32006","32007","32008","32009","32010","32011","32012","32013","32014","32015","32016","32017","32018","32019","32020","32021","32022","32023","32024","32025","32026","32027","32028","32029","32030","32031","32032","32033","32034","32035","32036","32037","32038","32039","32040","32041","32042","32043","32044","32045","32046","32047","32048","32049","32050","32051","32052","32053","32054","32055","32056","32057","32058","32059","32060","32061","32062","32063","32064","32065","32066","32067","32068","32069","32070","32071","32072","32073","32074","32075","32076","32077","32078","32079","32080","32081","32082","32083","32084","32085","32086","32087","32088","32089","32090","32091","32092","32093","32094","32095","32096","32097","32098","32099","32100","32101","32102","32103","32104","32105","32106","32107","32108","32109","32110","32111","32112","32113","32114","32115","32116","32117","32118","32119","32120","32121","32122","32123","32124","32125","32126","32127","32128","32129","32130","32131","32132","32133","32134","32135","32136","32137","32138","32139","32140","32141","32142","32143","32144","32145","32146","32147","32148","32149","32150","32151","32152","32153","32154","32155","32156","32157","32158","32159","32160","32161","32162","32163","32164","32165","32166","32167","32168","32169","32170","32171","32172","32173","32174","32175","32176","32177","32178","32179","32180","32181","32182","32183","32184","32185","32186","32187","32188","32189","32190","32191","32192","32193","32194","32195","32196","32197","32198","32199","32200","32201","32202","32203","32204","32205","32206","32207","32208","32209","32210","32211","32212","32213","32214","32215","32216","32217","32218","32219","32220","32221","32222","32223","32224","32225","32226","32227","32228","32229","32230","32231","32232","32233","32234","32235","32236","32237","32238","32239","32240","32241","32242","32243","32244","32245","32246","32247","32248","32249","32250","32251","32252","32253","32254","32255","32256","32257","32258","32259","32260","32261","32262","32263","32264","32265","32266","32267","32268","32269","32270","32271","32272","32273","32274","32275","32276","32277","32278","32279","32280","32281","32282","32283","32284","32285","32286","32287","32288","32289","32290","32291","32292","32293","32294","32295","32296","32297","32298","32299","32300","32301","32302","32303","32304","32305","32306","32307","32308","32309","32310","32311","32312","32313","32314","32315","32316","32317","32318","32319","32320","32321","32322","32323","32324","32325","32326","32327","32328","32329","32330","32331","32332","32333","32334","32335","32336","32337","32338","32339","32340","32341","32342","32343","32344","32345","32346","32347","32348","32349","32350","32351","32352","32353","32354","32355","32356","32357","32358","32359","32360","32361","32362","32363","32364","32365","32366","32367","32368","32369","32370","32371","32372","32373","32374","32375","32376","32377","32378","32379","32380","32381","32382","32383","32384","32385","32386","32387","32388","32389","32390","32391","32392","32393","32394","32395","32396","32397","32398","32399","32400","32401","32402","32403","32404","32405","32406","32407","32408","32409","32410","32411","32412","32413","32414","32415","32416","32417","32418","32419","32420","32421","32422","32423","32424","32425","32426","32427","32428","32429","32430","32431","32432","32433","32434","32435","32436","32437","32438","32439","32440","32441","32442","32443","32444","32445","32446","32447","32448","32449","32450","32451","32452","32453","32454","32455","32456","32457","32458","32459","32460","32461","32462","32463","32464","32465","32466","32467","32468","32469","32470","32471","32472","32473","32474","32475","32476","32477","32478","32479","32480","32481","32482","32483","32484","32485","32486","32487","32488","32489","32490","32491","32492","32493","32494","32495","32496","32497","32498","32499","32500","32501","32502","32503","32504","32505","32506","32507","32508","32509","32510","32511","32512","32513","32514","32515","32516","32517","32518","32519","32520","32521","32522","32523","32524","32525","32526","32527","32528","32529","32530","32531","32532","32533","32534","32535","32536","32537","32538","32539","32540","32541","32542","32543","32544","32545","32546","32547","32548","32549","32550","32551","32552","32553","32554","32555","32556","32557","32558","32559","32560","32561","32562","32563","32564","32565","32566","32567","32568","32569","32570","32571","32572","32573","32574","32575","32576","32577","32578","32579","32580","32581","32582","32583","32584","32585","32586","32587","32588","32589","32590","32591","32592","32593","32594","32595","32596","32597","32598","32599","32600","32601","32602","32603","32604","32605","32606","32607","32608","32609","32610","32611","32612","32613","32614","32615","32616","32617","32618","32619","32620","32621","32622","32623","32624","32625","32626","32627","32628","32629","32630","32631","32632","32633","32634","32635","32636","32637","32638","32639","32640","32641","32642","32643","32644","32645","32646","32647","32648","32649","32650","32651","32652","32653","32654","32655","32656","32657","32658","32659","32660","32661","32662","32663","32664","32665","32666","32667","32668","32669","32670","32671","32672","32673","32674","32675","32676","32677","32678","32679","32680","32681","32682","32683","32684","32685","32686","32687","32688","32689","32690","32691","32692","32693","32694","32695","32696","32697","32698","32699","32700","32701","32702","32703","32704","32705","32706","32707","32708","32709","32710","32711","32712","32713","32714","32715","32716","32717","32718","32719","32720","32721","32722","32723","32724","32725","32726","32727","32728","32729","32730","32731","32732","32733","32734","32735","32736","32737","32738","32739","32740","32741","32742","32743","32744","32745","32746","32747","32748","32749","32750","32751","32752","32753","32754","32755","32756","32757","32758","32759","32760","32761","32762","32763","32764","32765","32766","32767","32768","32769","32770","32771","32772","32773","32774","32775","32776","32777","32778","32779","32780","32781","32782","32783","32784","32785","32786","32787","32788","32789","32790","32791","32792","32793","32794","32795","32796","32797","32798","32799","32800","32801","32802","32803","32804","32805","32806","32807","32808","32809","32810","32811","32812","32813","32814","32815","32816","32817","32818","32819","32820","32821","32822","32823","32824","32825","32826","32827","32828","32829","32830","32831","32832","32833","32834","32835","32836","32837","32838","32839","32840","32841","32842","32843","32844","32845","32846","32847","32848","32849","32850","32851","32852","32853","32854","32855","32856","32857","32858","32859","32860","32861","32862","32863","32864","32865","32866","32867","32868","32869","32870","32871","32872","32873","32874","32875","32876","32877","32878","32879","32880","32881","32882","32883","32884","32885","32886","32887","32888","32889","32890","32891","32892","32893","32894","32895","32896","32897","32898","32899","32900","32901","32902","32903","32904","32905","32906","32907","32908","32909","32910","32911","32912","32913","32914","32915","32916","32917","32918","32919","32920","32921","32922","32923","32924","32925","32926","32927","32928","32929","32930","32931","32932","32933","32934","32935","32936","32937","32938","32939","32940","32941","32942","32943","32944","32945","32946","32947","32948","32949","32950","32951","32952","32953","32954","32955","32956","32957","32958","32959","32960","32961","32962","32963","32964","32965","32966","32967","32968","32969","32970","32971","32972","32973","32974","32975","32976","32977","32978","32979","32980","32981","32982","32983","32984","32985","32986","32987","32988","32989","32990","32991","32992","32993","32994","32995","32996","32997","32998","32999","33000","33001","33002","33003","33004","33005","33006","33007","33008","33009","33010","33011","33012","33013","33014","33015","33016","33017","33018","33019","33020","33021","33022","33023","33024","33025","33026","33027","33028","33029","33030","33031","33032","33033","33034","33035","33036","33037","33038","33039","33040","33041","33042","33043","33044","33045","33046","33047","33048","33049","33050","33051","33052","33053","33054","33055","33056","33057","33058","33059","33060","33061","33062","33063","33064","33065","33066","33067","33068","33069","33070","33071","33072","33073","33074","33075","33076","33077","33078","33079","33080","33081","33082","33083","33084","33085","33086","33087","33088","33089","33090","33091","33092","33093","33094","33095","33096","33097","33098","33099","33100","33101","33102","33103","33104","33105","33106","33107","33108","33109","33110","33111","33112","33113","33114","33115","33116","33117","33118","33119","33120","33121","33122","33123","33124","33125","33126","33127","33128","33129","33130","33131","33132","33133","33134","33135","33136","33137","33138","33139","33140","33141","33142","33143","33144","33145","33146","33147","33148","33149","33150","33151","33152","33153","33154","33155","33156","33157","33158","33159","33160","33161","33162","33163","33164","33165","33166","33167","33168","33169","33170","33171","33172","33173","33174","33175","33176","33177","33178","33179","33180","33181","33182","33183","33184","33185","33186","33187","33188","33189","33190","33191","33192","33193","33194","33195","33196","33197","33198","33199","33200","33201","33202","33203","33204","33205","33206","33207","33208","33209","33210","33211","33212","33213","33214","33215","33216","33217","33218","33219","33220","33221","33222","33223","33224","33225","33226","33227","33228","33229","33230","33231","33232","33233","33234","33235","33236","33237","33238","33239","33240","33241","33242","33243","33244","33245","33246","33247","33248","33249","33250","33251","33252","33253","33254","33255","33256","33257","33258","33259","33260","33261","33262","33263","33264","33265","33266","33267","33268","33269","33270","33271","33272","33273","33274","33275","33276","33277","33278","33279","33280","33281","33282","33283","33284","33285","33286","33287","33288","33289","33290","33291","33292","33293","33294","33295","33296","33297","33298","33299","33300","33301","33302","33303","33304","33305","33306","33307","33308","33309","33310","33311","33312","33313","33314","33315","33316","33317","33318","33319","33320","33321","33322","33323","33324","33325","33326","33327","33328","33329","33330","33331","33332","33333","33334","33335","33336","33337","33338","33339","33340","33341","33342","33343","33344","33345","33346","33347","33348","33349","33350","33351","33352","33353","33354","33355","33356","33357","33358","33359","33360","33361","33362","33363","33364","33365","33366","33367","33368","33369","33370","33371","33372","33373","33374","33375","33376","33377","33378","33379","33380","33381","33382","33383","33384","33385","33386","33387","33388","33389","33390","33391","33392","33393","33394","33395","33396","33397","33398","33399","33400","33401","33402","33403","33404","33405","33406","33407","33408","33409","33410","33411","33412","33413","33414","33415","33416","33417","33418","33419","33420","33421","33422","33423","33424","33425","33426","33427","33428","33429","33430","33431","33432","33433","33434","33435","33436","33437","33438","33439","33440","33441","33442","33443","33444","33445","33446","33447","33448","33449","33450","33451","33452","33453","33454","33455","33456","33457","33458","33459","33460","33461","33462","33463","33464","33465","33466","33467","33468","33469","33470","33471","33472","33473","33474","33475","33476","33477","33478","33479","33480","33481","33482","33483","33484","33485","33486","33487","33488","33489","33490","33491","33492","33493","33494","33495","33496","33497","33498","33499","33500","33501","33502","33503","33504","33505","33506","33507","33508","33509","33510","33511","33512","33513","33514","33515","33516","33517","33518","33519","33520","33521","33522","33523","33524","33525","33526","33527","33528","33529","33530","33531","33532","33533","33534","33535","33536","33537","33538","33539","33540","33541","33542","33543","33544","33545","33546","33547","33548","33549","33550","33551","33552","33553","33554","33555","33556","33557","33558","33559","33560","33561","33562","33563","33564","33565","33566","33567","33568","33569","33570","33571","33572","33573","33574","33575","33576","33577","33578","33579","33580","33581","33582","33583","33584","33585","33586","33587","33588","33589","33590","33591","33592","33593","33594","33595","33596","33597","33598","33599","33600","33601","33602","33603","33604","33605","33606","33607","33608","33609","33610","33611","33612","33613","33614","33615","33616","33617","33618","33619","33620","33621","33622","33623","33624","33625","33626","33627","33628","33629","33630","33631","33632","33633","33634","33635","33636","33637","33638","33639","33640","33641","33642","33643","33644","33645","33646","33647","33648","33649","33650","33651","33652","33653","33654","33655","33656","33657","33658","33659","33660","33661","33662","33663","33664","33665","33666","33667","33668","33669","33670","33671","33672","33673","33674","33675","33676","33677","33678","33679","33680","33681","33682","33683","33684","33685","33686","33687","33688","33689","33690","33691","33692","33693","33694","33695","33696","33697","33698","33699","33700","33701","33702","33703","33704","33705","33706","33707","33708","33709","33710","33711","33712","33713","33714","33715","33716","33717","33718","33719","33720","33721","33722","33723","33724","33725","33726","33727","33728","33729","33730","33731","33732","33733","33734","33735","33736","33737","33738","33739","33740","33741","33742","33743","33744","33745","33746","33747","33748","33749","33750","33751","33752","33753","33754","33755","33756","33757","33758","33759","33760","33761","33762","33763","33764","33765","33766","33767","33768","33769","33770","33771","33772","33773","33774","33775","33776","33777","33778","33779","33780","33781","33782","33783","33784","33785","33786","33787","33788","33789","33790","33791","33792","33793","33794","33795","33796","33797","33798","33799","33800","33801","33802","33803","33804","33805","33806","33807","33808","33809","33810","33811","33812","33813","33814","33815","33816","33817","33818","33819","33820","33821","33822","33823","33824","33825","33826","33827","33828","33829","33830","33831","33832","33833","33834","33835","33836","33837","33838","33839","33840","33841","33842","33843","33844","33845","33846","33847","33848","33849","33850","33851","33852","33853","33854","33855","33856","33857","33858","33859","33860","33861","33862","33863","33864","33865","33866","33867","33868","33869","33870","33871","33872","33873","33874","33875","33876","33877","33878","33879","33880","33881","33882","33883","33884","33885","33886","33887","33888","33889","33890","33891","33892","33893","33894","33895","33896","33897","33898","33899","33900","33901","33902","33903","33904","33905","33906","33907","33908","33909","33910","33911","33912","33913","33914","33915","33916","33917","33918","33919","33920","33921","33922","33923","33924","33925","33926","33927","33928","33929","33930","33931","33932","33933","33934","33935","33936","33937","33938","33939","33940","33941","33942","33943","33944","33945","33946","33947","33948","33949","33950","33951","33952","33953","33954","33955","33956","33957","33958","33959","33960","33961","33962","33963","33964","33965","33966","33967","33968","33969","33970","33971","33972","33973","33974","33975","33976","33977","33978","33979","33980","33981","33982","33983","33984","33985","33986","33987","33988","33989","33990","33991","33992","33993","33994","33995","33996","33997","33998","33999","34000","34001","34002","34003","34004","34005","34006","34007","34008","34009","34010","34011","34012","34013","34014","34015","34016","34017","34018","34019","34020","34021","34022","34023","34024","34025","34026","34027","34028","34029","34030","34031","34032","34033","34034","34035","34036","34037","34038","34039","34040","34041","34042","34043","34044","34045","34046","34047","34048","34049","34050","34051","34052","34053","34054","34055","34056","34057","34058","34059","34060","34061","34062","34063","34064","34065","34066","34067","34068","34069","34070","34071","34072","34073","34074","34075","34076","34077","34078","34079","34080","34081","34082","34083","34084","34085","34086","34087","34088","34089","34090","34091","34092","34093","34094","34095","34096","34097","34098","34099","34100","34101","34102","34103","34104","34105","34106","34107","34108","34109","34110","34111","34112","34113","34114","34115","34116","34117","34118","34119","34120","34121","34122","34123","34124","34125","34126","34127","34128","34129","34130","34131","34132","34133","34134","34135","34136","34137","34138","34139","34140","34141","34142","34143","34144","34145","34146","34147","34148","34149","34150","34151","34152","34153","34154","34155","34156","34157","34158","34159","34160","34161","34162","34163","34164","34165","34166","34167","34168","34169","34170","34171","34172","34173","34174","34175","34176","34177","34178","34179","34180","34181","34182","34183","34184","34185","34186","34187","34188","34189","34190","34191","34192","34193","34194","34195","34196","34197","34198","34199","34200","34201","34202","34203","34204","34205","34206","34207","34208","34209","34210","34211","34212","34213","34214","34215","34216","34217","34218","34219","34220","34221","34222","34223","34224","34225","34226","34227","34228","34229","34230","34231","34232","34233","34234","34235","34236","34237","34238","34239","34240","34241","34242","34243","34244","34245","34246","34247","34248","34249","34250","34251","34252","34253","34254","34255","34256","34257","34258","34259","34260","34261","34262","34263","34264","34265","34266","34267","34268","34269","34270","34271","34272","34273","34274","34275","34276","34277","34278","34279","34280","34281","34282","34283","34284","34285","34286","34287","34288","34289","34290","34291","34292","34293","34294","34295","34296","34297","34298","34299","34300","34301","34302","34303","34304","34305","34306","34307","34308","34309","34310","34311","34312","34313","34314","34315","34316","34317","34318","34319","34320","34321","34322","34323","34324","34325","34326","34327","34328","34329","34330","34331","34332","34333","34334","34335","34336","34337","34338","34339","34340","34341","34342","34343","34344","34345","34346","34347","34348","34349","34350","34351","34352","34353","34354","34355","34356","34357","34358","34359","34360","34361","34362","34363","34364","34365","34366","34367","34368","34369","34370","34371","34372","34373","34374","34375","34376","34377","34378","34379","34380","34381","34382","34383","34384","34385","34386","34387","34388","34389","34390","34391","34392","34393","34394","34395","34396","34397","34398","34399","34400","34401","34402","34403","34404","34405","34406","34407","34408","34409","34410","34411","34412","34413","34414","34415","34416","34417","34418","34419","34420","34421","34422","34423","34424","34425","34426","34427","34428","34429","34430","34431","34432","34433","34434","34435","34436","34437","34438","34439","34440","34441","34442","34443","34444","34445","34446","34447","34448","34449","34450","34451","34452","34453","34454","34455","34456","34457","34458","34459","34460","34461","34462","34463","34464","34465","34466","34467","34468","34469","34470","34471","34472","34473","34474","34475","34476","34477","34478","34479","34480","34481","34482","34483","34484","34485","34486","34487","34488","34489","34490","34491","34492","34493","34494","34495","34496","34497","34498","34499","34500","34501","34502","34503","34504","34505","34506","34507","34508","34509","34510","34511","34512","34513","34514","34515","34516","34517","34518","34519","34520","34521","34522","34523","34524","34525","34526","34527","34528","34529","34530","34531","34532","34533","34534","34535","34536","34537","34538","34539","34540","34541","34542","34543","34544","34545","34546","34547","34548","34549","34550","34551","34552","34553","34554","34555","34556","34557","34558","34559","34560","34561","34562","34563","34564","34565","34566","34567","34568","34569","34570","34571","34572","34573","34574","34575","34576","34577","34578","34579","34580","34581","34582","34583","34584","34585","34586","34587","34588","34589","34590","34591","34592","34593","34594","34595","34596","34597","34598","34599","34600","34601","34602","34603","34604","34605","34606","34607","34608","34609","34610","34611","34612","34613","34614","34615","34616","34617","34618","34619","34620","34621","34622","34623","34624","34625","34626","34627","34628","34629","34630","34631","34632","34633","34634","34635","34636","34637","34638","34639","34640","34641","34642","34643","34644","34645","34646","34647","34648","34649","34650","34651","34652","34653","34654","34655","34656","34657","34658","34659","34660","34661","34662","34663","34664","34665","34666","34667","34668","34669","34670","34671","34672","34673","34674","34675","34676","34677","34678","34679","34680","34681","34682","34683","34684","34685","34686","34687","34688","34689","34690","34691","34692","34693","34694","34695","34696","34697","34698","34699","34700","34701","34702","34703","34704","34705","34706","34707","34708","34709","34710","34711","34712","34713","34714","34715","34716","34717","34718","34719","34720","34721","34722","34723","34724","34725","34726","34727","34728","34729","34730","34731","34732","34733","34734","34735","34736","34737","34738","34739","34740","34741","34742","34743","34744","34745","34746","34747","34748","34749","34750","34751","34752","34753","34754","34755","34756","34757","34758","34759","34760","34761","34762","34763","34764","34765","34766","34767","34768","34769","34770","34771","34772","34773","34774","34775","34776","34777","34778","34779","34780","34781","34782","34783","34784","34785","34786","34787","34788","34789","34790","34791","34792","34793","34794","34795","34796","34797","34798","34799","34800","34801","34802","34803","34804","34805","34806","34807","34808","34809","34810","34811","34812","34813","34814","34815","34816","34817","34818","34819","34820","34821","34822","34823","34824","34825","34826","34827","34828","34829","34830","34831","34832","34833","34834","34835","34836","34837","34838","34839","34840","34841","34842","34843","34844","34845","34846","34847","34848","34849","34850","34851","34852","34853","34854","34855","34856","34857","34858","34859","34860","34861","34862","34863","34864","34865","34866","34867","34868","34869","34870","34871","34872","34873","34874","34875","34876","34877","34878","34879","34880","34881","34882","34883","34884","34885","34886","34887","34888","34889","34890","34891","34892","34893","34894","34895","34896","34897","34898","34899","34900","34901","34902","34903","34904","34905","34906","34907","34908","34909","34910","34911","34912","34913","34914","34915","34916","34917","34918","34919","34920","34921","34922","34923","34924","34925","34926","34927","34928","34929","34930","34931","34932","34933","34934","34935","34936","34937","34938","34939","34940","34941","34942","34943","34944","34945","34946","34947","34948","34949","34950","34951","34952","34953","34954","34955","34956","34957","34958","34959","34960","34961","34962","34963","34964","34965","34966","34967","34968","34969","34970","34971","34972","34973","34974","34975","34976","34977","34978","34979","34980","34981","34982","34983","34984","34985","34986","34987","34988","34989","34990","34991","34992","34993","34994","34995","34996","34997","34998","34999","35000","35001","35002","35003","35004","35005","35006","35007","35008","35009","35010","35011","35012","35013","35014","35015","35016","35017","35018","35019","35020","35021","35022","35023","35024","35025","35026","35027","35028","35029","35030","35031","35032","35033","35034","35035","35036","35037","35038","35039","35040","35041","35042","35043","35044","35045","35046","35047","35048","35049","35050","35051","35052","35053","35054","35055","35056","35057","35058","35059","35060","35061","35062","35063","35064","35065","35066","35067","35068","35069","35070","35071","35072","35073","35074","35075","35076","35077","35078","35079","35080","35081","35082","35083","35084","35085","35086","35087","35088","35089","35090","35091","35092","35093","35094","35095","35096","35097","35098","35099","35100","35101","35102","35103","35104","35105","35106","35107","35108","35109","35110","35111","35112","35113","35114","35115","35116","35117","35118","35119","35120","35121","35122","35123","35124","35125","35126","35127","35128","35129","35130","35131","35132","35133","35134","35135","35136","35137","35138","35139","35140","35141","35142","35143","35144","35145","35146","35147","35148","35149","35150","35151","35152","35153","35154","35155","35156","35157","35158","35159","35160","35161","35162","35163","35164","35165","35166","35167","35168","35169","35170","35171","35172","35173","35174","35175","35176","35177","35178","35179","35180","35181","35182","35183","35184","35185","35186","35187","35188","35189","35190","35191","35192","35193","35194","35195","35196","35197","35198","35199","35200","35201","35202","35203","35204","35205","35206","35207","35208","35209","35210","35211","35212","35213","35214","35215","35216","35217","35218","35219","35220","35221","35222","35223","35224","35225","35226","35227","35228","35229","35230","35231","35232","35233","35234","35235","35236","35237","35238","35239","35240","35241","35242","35243","35244","35245","35246","35247","35248","35249","35250","35251","35252","35253","35254","35255","35256","35257","35258","35259","35260","35261","35262","35263","35264","35265","35266","35267","35268","35269","35270","35271","35272","35273","35274","35275","35276","35277","35278","35279","35280","35281","35282","35283","35284","35285","35286","35287","35288","35289","35290","35291","35292","35293","35294","35295","35296","35297","35298","35299","35300","35301","35302","35303","35304","35305","35306","35307","35308","35309","35310","35311","35312","35313","35314","35315","35316","35317","35318","35319","35320","35321","35322","35323","35324","35325","35326","35327","35328","35329","35330","35331","35332","35333","35334","35335","35336","35337","35338","35339","35340","35341","35342","35343","35344","35345","35346","35347","35348","35349","35350","35351","35352","35353","35354","35355","35356","35357","35358","35359","35360","35361","35362","35363","35364","35365","35366","35367","35368","35369","35370","35371","35372","35373","35374","35375","35376","35377","35378","35379","35380","35381","35382","35383","35384","35385","35386","35387","35388","35389","35390","35391","35392","35393","35394","35395","35396","35397","35398","35399","35400","35401","35402","35403","35404","35405","35406","35407","35408","35409","35410","35411","35412","35413","35414","35415","35416","35417","35418","35419","35420","35421","35422","35423","35424","35425","35426","35427","35428","35429","35430","35431","35432","35433","35434","35435","35436","35437","35438","35439","35440","35441","35442","35443","35444","35445","35446","35447","35448","35449","35450","35451","35452","35453","35454","35455","35456","35457","35458","35459","35460","35461","35462","35463","35464","35465","35466","35467","35468","35469","35470","35471","35472","35473","35474","35475","35476","35477","35478","35479","35480","35481","35482","35483","35484","35485","35486","35487","35488","35489","35490","35491","35492","35493","35494","35495","35496","35497","35498","35499","35500","35501","35502","35503","35504","35505","35506","35507","35508","35509","35510","35511","35512","35513","35514","35515","35516","35517","35518","35519","35520","35521","35522","35523","35524","35525","35526","35527","35528","35529","35530","35531","35532","35533","35534","35535","35536","35537","35538","35539","35540","35541","35542","35543","35544","35545","35546","35547","35548","35549","35550","35551","35552","35553","35554","35555","35556","35557","35558","35559","35560","35561","35562","35563","35564","35565","35566","35567","35568","35569","35570","35571","35572","35573","35574","35575","35576","35577","35578","35579","35580","35581","35582","35583","35584","35585","35586","35587","35588","35589","35590","35591","35592","35593","35594","35595","35596","35597","35598","35599","35600","35601","35602","35603","35604","35605","35606","35607","35608","35609","35610","35611","35612","35613","35614","35615","35616","35617","35618","35619","35620","35621","35622","35623","35624","35625","35626","35627","35628","35629","35630","35631","35632","35633","35634","35635","35636","35637","35638","35639","35640","35641","35642","35643","35644","35645","35646","35647","35648","35649","35650","35651","35652","35653","35654","35655","35656","35657","35658","35659","35660","35661","35662","35663","35664","35665","35666","35667","35668","35669","35670","35671","35672","35673","35674","35675","35676","35677","35678","35679","35680","35681","35682","35683","35684","35685","35686","35687","35688","35689","35690","35691","35692","35693","35694","35695","35696","35697","35698","35699","35700","35701","35702","35703","35704","35705","35706","35707","35708","35709","35710","35711","35712","35713","35714","35715","35716","35717","35718","35719","35720","35721","35722","35723","35724","35725","35726","35727","35728","35729","35730","35731","35732","35733","35734","35735","35736","35737","35738","35739","35740","35741","35742","35743","35744","35745","35746","35747","35748","35749","35750","35751","35752","35753","35754","35755","35756","35757","35758","35759","35760","35761","35762","35763","35764","35765","35766","35767","35768","35769","35770","35771","35772","35773","35774","35775","35776","35777","35778","35779","35780","35781","35782","35783","35784","35785","35786","35787","35788","35789","35790","35791","35792","35793","35794","35795","35796","35797","35798","35799","35800","35801","35802","35803","35804","35805","35806","35807","35808","35809","35810","35811","35812","35813","35814","35815","35816","35817","35818","35819","35820","35821","35822","35823","35824","35825","35826","35827","35828","35829","35830","35831","35832","35833","35834","35835","35836","35837","35838","35839","35840","35841","35842","35843","35844","35845","35846","35847","35848","35849","35850","35851","35852","35853","35854","35855","35856","35857","35858","35859","35860","35861","35862","35863","35864","35865","35866","35867","35868","35869","35870","35871","35872","35873","35874","35875","35876","35877","35878","35879","35880","35881","35882","35883","35884","35885","35886","35887","35888","35889","35890","35891","35892","35893","35894","35895","35896","35897","35898","35899","35900","35901","35902","35903","35904","35905","35906","35907","35908","35909","35910","35911","35912","35913","35914","35915","35916","35917","35918","35919","35920","35921","35922","35923","35924","35925","35926","35927","35928","35929","35930","35931","35932","35933","35934","35935","35936","35937","35938","35939","35940","35941","35942","35943","35944","35945","35946","35947","35948","35949","35950","35951","35952","35953","35954","35955","35956","35957","35958","35959","35960","35961","35962","35963","35964","35965","35966","35967","35968","35969","35970","35971","35972","35973","35974","35975","35976","35977","35978","35979","35980","35981","35982","35983","35984","35985","35986","35987","35988","35989","35990","35991","35992","35993","35994","35995","35996","35997","35998","35999","36000","36001","36002","36003","36004","36005","36006","36007","36008","36009","36010","36011","36012","36013","36014","36015","36016","36017","36018","36019","36020","36021","36022","36023","36024","36025","36026","36027","36028","36029","36030","36031","36032","36033","36034","36035","36036","36037","36038","36039","36040","36041","36042","36043","36044","36045","36046","36047","36048","36049","36050","36051","36052","36053","36054","36055","36056","36057","36058","36059","36060","36061","36062","36063","36064","36065","36066","36067","36068","36069","36070","36071","36072","36073","36074","36075","36076","36077","36078","36079","36080","36081","36082","36083","36084","36085","36086","36087","36088","36089","36090","36091","36092","36093","36094","36095","36096","36097","36098","36099","36100","36101","36102","36103","36104","36105","36106","36107","36108","36109","36110","36111","36112","36113","36114","36115","36116","36117","36118","36119","36120","36121","36122","36123","36124","36125","36126","36127","36128","36129","36130","36131","36132","36133","36134","36135","36136","36137","36138","36139","36140","36141","36142","36143","36144","36145","36146","36147","36148","36149","36150","36151","36152","36153","36154","36155","36156","36157","36158","36159","36160","36161","36162","36163","36164","36165","36166","36167","36168","36169","36170","36171","36172","36173","36174","36175","36176","36177","36178","36179","36180","36181","36182","36183","36184","36185","36186","36187","36188","36189","36190","36191","36192","36193","36194","36195","36196","36197","36198","36199","36200","36201","36202","36203","36204","36205","36206","36207","36208","36209","36210","36211","36212","36213","36214","36215","36216","36217","36218","36219","36220","36221","36222","36223","36224","36225","36226","36227","36228","36229","36230","36231","36232","36233","36234","36235","36236","36237","36238","36239","36240","36241","36242","36243","36244","36245","36246","36247","36248","36249","36250","36251","36252","36253","36254","36255","36256","36257","36258","36259","36260","36261","36262","36263","36264","36265","36266","36267","36268","36269","36270","36271","36272","36273","36274","36275","36276","36277","36278","36279","36280","36281","36282","36283","36284","36285","36286","36287","36288","36289","36290","36291","36292","36293","36294","36295","36296","36297","36298","36299","36300","36301","36302","36303","36304","36305","36306","36307","36308","36309","36310","36311","36312","36313","36314","36315","36316","36317","36318","36319","36320","36321","36322","36323","36324","36325","36326","36327","36328","36329","36330","36331","36332","36333","36334","36335","36336","36337","36338","36339","36340","36341","36342","36343","36344","36345","36346","36347","36348","36349","36350","36351","36352","36353","36354","36355","36356","36357","36358","36359","36360","36361","36362","36363","36364","36365","36366","36367","36368","36369","36370","36371","36372","36373","36374","36375","36376","36377","36378","36379","36380","36381","36382","36383","36384","36385","36386","36387","36388","36389","36390","36391","36392","36393","36394","36395","36396","36397","36398","36399","36400","36401","36402","36403","36404","36405","36406","36407","36408","36409","36410","36411","36412","36413","36414","36415","36416","36417","36418","36419","36420","36421","36422","36423","36424","36425","36426","36427","36428","36429","36430","36431","36432","36433","36434","36435","36436","36437","36438","36439","36440","36441","36442","36443","36444","36445","36446","36447","36448","36449","36450","36451","36452","36453","36454","36455","36456","36457","36458","36459","36460","36461","36462","36463","36464","36465","36466","36467","36468","36469","36470","36471","36472","36473","36474","36475","36476","36477","36478","36479","36480","36481","36482","36483","36484","36485","36486","36487","36488","36489","36490","36491","36492","36493","36494","36495","36496","36497","36498","36499","36500","36501","36502","36503","36504","36505","36506","36507","36508","36509","36510","36511","36512","36513","36514","36515","36516","36517","36518","36519","36520","36521","36522","36523","36524","36525","36526","36527","36528","36529","36530","36531","36532","36533","36534","36535","36536","36537","36538","36539","36540","36541","36542","36543","36544","36545","36546","36547","36548","36549","36550","36551","36552","36553","36554","36555","36556","36557","36558","36559","36560","36561","36562","36563","36564","36565","36566","36567","36568","36569","36570","36571","36572","36573","36574","36575","36576","36577","36578","36579","36580","36581","36582","36583","36584","36585","36586","36587","36588","36589","36590","36591","36592","36593","36594","36595","36596","36597","36598","36599","36600","36601","36602","36603","36604","36605","36606","36607","36608","36609","36610","36611","36612","36613","36614","36615","36616","36617","36618","36619","36620","36621","36622","36623","36624","36625","36626","36627","36628","36629","36630","36631","36632","36633","36634","36635","36636","36637","36638","36639","36640","36641","36642","36643","36644","36645","36646","36647","36648","36649","36650","36651","36652","36653","36654","36655","36656","36657","36658","36659","36660","36661","36662","36663","36664","36665","36666","36667","36668","36669","36670","36671","36672","36673","36674","36675","36676","36677","36678","36679","36680","36681","36682","36683","36684","36685","36686","36687","36688","36689","36690","36691","36692","36693","36694","36695","36696","36697","36698","36699","36700","36701","36702","36703","36704","36705","36706","36707","36708","36709","36710","36711","36712","36713","36714","36715","36716","36717","36718","36719","36720","36721","36722","36723","36724","36725","36726","36727","36728","36729","36730","36731","36732","36733","36734","36735","36736","36737","36738","36739","36740","36741","36742","36743","36744","36745","36746","36747","36748","36749","36750","36751","36752","36753","36754","36755","36756","36757","36758","36759","36760","36761","36762","36763","36764","36765","36766","36767","36768","36769","36770","36771","36772","36773","36774","36775","36776","36777","36778","36779","36780","36781","36782","36783","36784","36785","36786","36787","36788","36789","36790","36791","36792","36793","36794","36795","36796","36797","36798","36799","36800","36801","36802","36803","36804","36805","36806","36807","36808","36809","36810","36811","36812","36813","36814","36815","36816","36817","36818","36819","36820","36821","36822","36823","36824","36825","36826","36827","36828","36829","36830","36831","36832","36833","36834","36835","36836","36837","36838","36839","36840","36841","36842","36843","36844","36845","36846","36847","36848","36849","36850","36851","36852","36853","36854","36855","36856","36857","36858","36859","36860","36861","36862","36863","36864","36865","36866","36867","36868","36869","36870","36871","36872","36873","36874","36875","36876","36877","36878","36879","36880","36881","36882","36883","36884","36885","36886","36887","36888","36889","36890","36891","36892","36893","36894","36895","36896","36897","36898","36899","36900","36901","36902","36903","36904","36905","36906","36907","36908","36909","36910","36911","36912","36913","36914","36915","36916","36917","36918","36919","36920","36921","36922","36923","36924","36925","36926","36927","36928","36929","36930","36931","36932","36933","36934","36935","36936","36937","36938","36939","36940","36941","36942","36943","36944","36945","36946","36947","36948","36949","36950","36951","36952","36953","36954","36955","36956","36957","36958","36959","36960","36961","36962","36963","36964","36965","36966","36967","36968","36969","36970","36971","36972","36973","36974","36975","36976","36977","36978","36979","36980","36981","36982","36983","36984","36985","36986","36987","36988","36989","36990","36991","36992","36993","36994","36995","36996","36997","36998","36999","37000","37001","37002","37003","37004","37005","37006","37007","37008","37009","37010","37011","37012","37013","37014","37015","37016","37017","37018","37019","37020","37021","37022","37023","37024","37025","37026","37027","37028","37029","37030","37031","37032","37033","37034","37035","37036","37037","37038","37039","37040","37041","37042","37043","37044","37045","37046","37047","37048","37049","37050","37051","37052","37053","37054","37055","37056","37057","37058","37059","37060","37061","37062","37063","37064","37065","37066","37067","37068","37069","37070","37071","37072","37073","37074","37075","37076","37077","37078","37079","37080","37081","37082","37083","37084","37085","37086","37087","37088","37089","37090","37091","37092","37093","37094","37095","37096","37097","37098","37099","37100","37101","37102","37103","37104","37105","37106","37107","37108","37109","37110","37111","37112","37113","37114","37115","37116","37117","37118","37119","37120","37121","37122","37123","37124","37125","37126","37127","37128","37129","37130","37131","37132","37133","37134","37135","37136","37137","37138","37139","37140","37141","37142","37143","37144","37145","37146","37147","37148","37149","37150","37151","37152","37153","37154","37155","37156","37157","37158","37159","37160","37161","37162","37163","37164","37165","37166","37167","37168","37169","37170","37171","37172","37173","37174","37175","37176","37177","37178","37179","37180","37181","37182","37183","37184","37185","37186","37187","37188","37189","37190","37191","37192","37193","37194","37195","37196","37197","37198","37199","37200","37201","37202","37203","37204","37205","37206","37207","37208","37209","37210","37211","37212","37213","37214","37215","37216","37217","37218","37219","37220","37221","37222","37223","37224","37225","37226","37227","37228","37229","37230","37231","37232","37233","37234","37235","37236","37237","37238","37239","37240","37241","37242","37243","37244","37245","37246","37247","37248","37249","37250","37251","37252","37253","37254","37255","37256","37257","37258","37259","37260","37261","37262","37263","37264","37265","37266","37267","37268","37269","37270","37271","37272","37273","37274","37275","37276","37277","37278","37279","37280","37281","37282","37283","37284","37285","37286","37287","37288","37289","37290","37291","37292","37293","37294","37295","37296","37297","37298","37299","37300","37301","37302","37303","37304","37305","37306","37307","37308","37309","37310","37311","37312","37313","37314","37315","37316","37317","37318","37319","37320","37321","37322","37323","37324","37325","37326","37327","37328","37329","37330","37331","37332","37333","37334","37335","37336","37337","37338","37339","37340","37341","37342","37343","37344","37345","37346","37347","37348","37349","37350","37351","37352","37353","37354","37355","37356","37357","37358","37359","37360","37361","37362","37363","37364","37365","37366","37367","37368","37369","37370","37371","37372","37373","37374","37375","37376","37377","37378","37379","37380","37381","37382","37383","37384","37385","37386","37387","37388","37389","37390","37391","37392","37393","37394","37395","37396","37397","37398","37399","37400","37401","37402","37403","37404","37405","37406","37407","37408","37409","37410","37411","37412","37413","37414","37415","37416","37417","37418","37419","37420","37421","37422","37423","37424","37425","37426","37427","37428","37429","37430","37431","37432","37433","37434","37435","37436","37437","37438","37439","37440","37441","37442","37443","37444","37445","37446","37447","37448","37449","37450","37451","37452","37453","37454","37455","37456","37457","37458","37459","37460","37461","37462","37463","37464","37465","37466","37467","37468","37469","37470","37471","37472","37473","37474","37475","37476","37477","37478","37479","37480","37481","37482","37483","37484","37485","37486","37487","37488","37489","37490","37491","37492","37493","37494","37495","37496","37497","37498","37499","37500","37501","37502","37503","37504","37505","37506","37507","37508","37509","37510","37511","37512","37513","37514","37515","37516","37517","37518","37519","37520","37521","37522","37523","37524","37525","37526","37527","37528","37529","37530","37531","37532","37533","37534","37535","37536","37537","37538","37539","37540","37541","37542","37543","37544","37545","37546","37547","37548","37549","37550","37551","37552","37553","37554","37555","37556","37557","37558","37559","37560","37561","37562","37563","37564","37565","37566","37567","37568","37569","37570","37571","37572","37573","37574","37575","37576","37577","37578","37579","37580","37581","37582","37583","37584","37585","37586","37587","37588","37589","37590","37591","37592","37593","37594","37595","37596","37597","37598","37599","37600","37601","37602","37603","37604","37605","37606","37607","37608","37609","37610","37611","37612","37613","37614","37615","37616","37617","37618","37619","37620","37621","37622","37623","37624","37625","37626","37627","37628","37629","37630","37631","37632","37633","37634","37635","37636","37637","37638","37639","37640","37641","37642","37643","37644","37645","37646","37647","37648","37649","37650","37651","37652","37653","37654","37655","37656","37657","37658","37659","37660","37661","37662","37663","37664","37665","37666","37667","37668","37669","37670","37671","37672","37673","37674","37675","37676","37677","37678","37679","37680","37681","37682","37683","37684","37685","37686","37687","37688","37689","37690","37691","37692","37693","37694","37695","37696","37697","37698","37699","37700","37701","37702","37703","37704","37705","37706","37707","37708","37709","37710","37711","37712","37713","37714","37715","37716","37717","37718","37719","37720","37721","37722","37723","37724","37725","37726","37727","37728","37729","37730","37731","37732","37733","37734","37735","37736","37737","37738","37739","37740","37741","37742","37743","37744","37745","37746","37747","37748","37749","37750","37751","37752","37753","37754","37755","37756","37757","37758","37759","37760","37761","37762","37763","37764","37765","37766","37767","37768","37769","37770","37771","37772","37773","37774","37775","37776","37777","37778","37779","37780","37781","37782","37783","37784","37785","37786","37787","37788","37789","37790","37791","37792","37793","37794","37795","37796","37797","37798","37799","37800","37801","37802","37803","37804","37805","37806","37807","37808","37809","37810","37811","37812","37813","37814","37815","37816","37817","37818","37819","37820","37821","37822","37823","37824","37825","37826","37827","37828","37829","37830","37831","37832","37833","37834","37835","37836","37837","37838","37839","37840","37841","37842","37843","37844","37845","37846","37847","37848","37849","37850","37851","37852","37853","37854","37855","37856","37857","37858","37859","37860","37861","37862","37863","37864","37865","37866","37867","37868","37869","37870","37871","37872","37873","37874","37875","37876","37877","37878","37879","37880","37881","37882","37883","37884","37885","37886","37887","37888","37889","37890","37891","37892","37893","37894","37895","37896","37897","37898","37899","37900","37901","37902","37903","37904","37905","37906","37907","37908","37909","37910","37911","37912","37913","37914","37915","37916","37917","37918","37919","37920","37921","37922","37923","37924","37925","37926","37927","37928","37929","37930","37931","37932","37933","37934","37935","37936","37937","37938","37939","37940","37941","37942","37943","37944","37945","37946","37947","37948","37949","37950","37951","37952","37953","37954","37955","37956","37957","37958","37959","37960","37961","37962","37963","37964","37965","37966","37967","37968","37969","37970","37971","37972","37973","37974","37975","37976","37977","37978","37979","37980","37981","37982","37983","37984","37985","37986","37987","37988","37989","37990","37991","37992","37993","37994","37995","37996","37997","37998","37999","38000","38001","38002","38003","38004","38005","38006","38007","38008","38009","38010","38011","38012","38013","38014","38015","38016","38017","38018","38019","38020","38021","38022","38023","38024","38025","38026","38027","38028","38029","38030","38031","38032","38033","38034","38035","38036","38037","38038","38039","38040","38041","38042","38043","38044","38045","38046","38047","38048","38049","38050","38051","38052","38053","38054","38055","38056","38057","38058","38059","38060","38061","38062","38063","38064","38065","38066","38067","38068","38069","38070","38071","38072","38073","38074","38075","38076","38077","38078","38079","38080","38081","38082","38083","38084","38085","38086","38087","38088","38089","38090","38091","38092","38093","38094","38095","38096","38097","38098","38099","38100","38101","38102","38103","38104","38105","38106","38107","38108","38109","38110","38111","38112","38113","38114","38115","38116","38117","38118","38119","38120","38121","38122","38123","38124","38125","38126","38127","38128","38129","38130","38131","38132","38133","38134","38135","38136","38137","38138","38139","38140","38141","38142","38143","38144","38145","38146","38147","38148","38149","38150","38151","38152","38153","38154","38155","38156","38157","38158","38159","38160","38161","38162","38163","38164","38165","38166","38167","38168","38169","38170","38171","38172","38173","38174","38175","38176","38177","38178","38179","38180","38181","38182","38183","38184","38185","38186","38187","38188","38189","38190","38191","38192","38193","38194","38195","38196","38197","38198","38199","38200","38201","38202","38203","38204","38205","38206","38207","38208","38209","38210","38211","38212","38213","38214","38215","38216","38217","38218","38219","38220","38221","38222","38223","38224","38225","38226","38227","38228","38229","38230","38231","38232","38233","38234","38235","38236","38237","38238","38239","38240","38241","38242","38243","38244","38245","38246","38247","38248","38249","38250","38251","38252","38253","38254","38255","38256","38257","38258","38259","38260","38261","38262","38263","38264","38265","38266","38267","38268","38269","38270","38271","38272","38273","38274","38275","38276","38277","38278","38279","38280","38281","38282","38283","38284","38285","38286","38287","38288","38289","38290","38291","38292","38293","38294","38295","38296","38297","38298","38299","38300","38301","38302","38303","38304","38305","38306","38307","38308","38309","38310","38311","38312","38313","38314","38315","38316","38317","38318","38319","38320","38321","38322","38323","38324","38325","38326","38327","38328","38329","38330","38331","38332","38333","38334","38335","38336","38337","38338","38339","38340","38341","38342","38343","38344","38345","38346","38347","38348","38349","38350","38351","38352","38353","38354","38355","38356","38357","38358","38359","38360","38361","38362","38363","38364","38365","38366","38367","38368","38369","38370","38371","38372","38373","38374","38375","38376","38377","38378","38379","38380","38381","38382","38383","38384","38385","38386","38387","38388","38389","38390","38391","38392","38393","38394","38395","38396","38397","38398","38399","38400","38401","38402","38403","38404","38405","38406","38407","38408","38409","38410","38411","38412","38413","38414","38415","38416","38417","38418","38419","38420","38421","38422","38423","38424","38425","38426","38427","38428","38429","38430","38431","38432","38433","38434","38435","38436","38437","38438","38439","38440","38441","38442","38443","38444","38445","38446","38447","38448","38449","38450","38451","38452","38453","38454","38455","38456","38457","38458","38459","38460","38461","38462","38463","38464","38465","38466","38467","38468","38469","38470","38471","38472","38473","38474","38475","38476","38477","38478","38479","38480","38481","38482","38483","38484","38485","38486","38487","38488","38489","38490","38491","38492","38493","38494","38495","38496","38497","38498","38499","38500","38501","38502","38503","38504","38505","38506","38507","38508","38509","38510","38511","38512","38513","38514","38515","38516","38517","38518","38519","38520","38521","38522","38523","38524","38525","38526","38527","38528","38529","38530","38531","38532","38533","38534","38535","38536","38537","38538","38539","38540","38541","38542","38543","38544","38545","38546","38547","38548","38549","38550","38551","38552","38553","38554","38555","38556","38557","38558","38559","38560","38561","38562","38563","38564","38565","38566","38567","38568","38569","38570","38571","38572","38573","38574","38575","38576","38577","38578","38579","38580","38581","38582","38583","38584","38585","38586","38587","38588","38589","38590","38591","38592","38593","38594","38595","38596","38597","38598","38599","38600","38601","38602","38603","38604","38605","38606","38607","38608","38609","38610","38611","38612","38613","38614","38615","38616","38617","38618","38619","38620","38621","38622","38623","38624","38625","38626","38627","38628","38629","38630","38631","38632","38633","38634","38635","38636","38637","38638","38639","38640","38641","38642","38643","38644","38645","38646","38647","38648","38649","38650","38651","38652","38653","38654","38655","38656","38657","38658","38659","38660","38661","38662","38663","38664","38665","38666","38667","38668","38669","38670","38671","38672","38673","38674","38675","38676","38677","38678","38679","38680","38681","38682","38683","38684","38685","38686","38687","38688","38689","38690","38691","38692","38693","38694","38695","38696","38697","38698","38699","38700","38701","38702","38703","38704","38705","38706","38707","38708","38709","38710","38711","38712","38713","38714","38715","38716","38717","38718","38719","38720","38721","38722","38723","38724","38725","38726","38727","38728","38729","38730","38731","38732","38733","38734","38735","38736","38737","38738","38739","38740","38741","38742","38743","38744","38745","38746","38747","38748","38749","38750","38751","38752","38753","38754","38755","38756","38757","38758","38759","38760","38761","38762","38763","38764","38765","38766","38767","38768","38769","38770","38771","38772","38773","38774","38775","38776","38777","38778","38779","38780","38781","38782","38783","38784","38785","38786","38787","38788","38789","38790","38791","38792","38793","38794","38795","38796","38797","38798","38799","38800","38801","38802","38803","38804","38805","38806","38807","38808","38809","38810","38811","38812","38813","38814","38815","38816","38817","38818","38819","38820","38821","38822","38823","38824","38825","38826","38827","38828","38829","38830","38831","38832","38833","38834","38835","38836","38837","38838","38839","38840","38841","38842","38843","38844","38845","38846","38847","38848","38849","38850","38851","38852","38853","38854","38855","38856","38857","38858","38859","38860","38861","38862","38863","38864","38865","38866","38867","38868","38869","38870","38871","38872","38873","38874","38875","38876","38877","38878","38879","38880","38881","38882","38883","38884","38885","38886","38887","38888","38889","38890","38891","38892","38893","38894","38895","38896","38897","38898","38899","38900","38901","38902","38903","38904","38905","38906","38907","38908","38909","38910","38911","38912","38913","38914","38915","38916","38917","38918","38919","38920","38921","38922","38923","38924","38925","38926","38927","38928","38929","38930","38931","38932","38933","38934","38935","38936","38937","38938","38939","38940","38941","38942","38943","38944","38945","38946","38947","38948","38949","38950","38951","38952","38953","38954","38955","38956","38957","38958","38959","38960","38961","38962","38963","38964","38965","38966","38967","38968","38969","38970","38971","38972","38973","38974","38975","38976","38977","38978","38979","38980","38981","38982","38983","38984","38985","38986","38987","38988","38989","38990","38991","38992","38993","38994","38995","38996","38997","38998","38999","39000","39001","39002","39003","39004","39005","39006","39007","39008","39009","39010","39011","39012","39013","39014","39015","39016","39017","39018","39019","39020","39021","39022","39023","39024","39025","39026","39027","39028","39029","39030","39031","39032","39033","39034","39035","39036","39037","39038","39039","39040","39041","39042","39043","39044","39045","39046","39047","39048","39049","39050","39051","39052","39053","39054","39055","39056","39057","39058","39059","39060","39061","39062","39063","39064","39065","39066","39067","39068","39069","39070","39071","39072","39073","39074","39075","39076","39077","39078","39079","39080","39081","39082","39083","39084","39085","39086","39087","39088","39089","39090","39091","39092","39093","39094","39095","39096","39097","39098","39099","39100","39101","39102","39103","39104","39105","39106","39107","39108","39109","39110","39111","39112","39113","39114","39115","39116","39117","39118","39119","39120","39121","39122","39123","39124","39125","39126","39127","39128","39129","39130","39131","39132","39133","39134","39135","39136","39137","39138","39139","39140","39141","39142","39143","39144","39145","39146","39147","39148","39149","39150","39151","39152","39153","39154","39155","39156","39157","39158","39159","39160","39161","39162","39163","39164","39165","39166","39167","39168","39169","39170","39171","39172","39173","39174","39175","39176","39177","39178","39179","39180","39181","39182","39183","39184","39185","39186","39187","39188","39189","39190","39191","39192","39193","39194","39195","39196","39197","39198","39199","39200","39201","39202","39203","39204","39205","39206","39207","39208","39209","39210","39211","39212","39213","39214","39215","39216","39217","39218","39219","39220","39221","39222","39223","39224","39225","39226","39227","39228","39229","39230","39231","39232","39233","39234","39235","39236","39237","39238","39239","39240","39241","39242","39243","39244","39245","39246","39247","39248","39249","39250","39251","39252","39253","39254","39255","39256","39257","39258","39259","39260","39261","39262","39263","39264","39265","39266","39267","39268","39269","39270","39271","39272","39273","39274","39275","39276","39277","39278","39279","39280","39281","39282","39283","39284","39285","39286","39287","39288","39289","39290","39291","39292","39293","39294","39295","39296","39297","39298","39299","39300","39301","39302","39303","39304","39305","39306","39307","39308","39309","39310","39311","39312","39313","39314","39315","39316","39317","39318","39319","39320","39321","39322","39323","39324","39325","39326","39327","39328","39329","39330","39331","39332","39333","39334","39335","39336","39337","39338","39339","39340","39341","39342","39343","39344","39345","39346","39347","39348","39349","39350","39351","39352","39353","39354","39355","39356","39357","39358","39359","39360","39361","39362","39363","39364","39365","39366","39367","39368","39369","39370","39371","39372","39373","39374","39375","39376","39377","39378","39379","39380","39381","39382","39383","39384","39385","39386","39387","39388","39389","39390","39391","39392","39393","39394","39395","39396","39397","39398","39399","39400","39401","39402","39403","39404","39405","39406","39407","39408","39409","39410","39411","39412","39413","39414","39415","39416","39417","39418","39419","39420","39421","39422","39423","39424","39425","39426","39427","39428","39429","39430","39431","39432","39433","39434","39435","39436","39437","39438","39439","39440","39441","39442","39443","39444","39445","39446","39447","39448","39449","39450","39451","39452","39453","39454","39455","39456","39457","39458","39459","39460","39461","39462","39463","39464","39465","39466","39467","39468","39469","39470","39471","39472","39473","39474","39475","39476","39477","39478","39479","39480","39481","39482","39483","39484","39485","39486","39487","39488","39489","39490","39491","39492","39493","39494","39495","39496","39497","39498","39499","39500","39501","39502","39503","39504","39505","39506","39507","39508","39509","39510","39511","39512","39513","39514","39515","39516","39517","39518","39519","39520","39521","39522","39523","39524","39525","39526","39527","39528","39529","39530","39531","39532","39533","39534","39535","39536","39537","39538","39539","39540","39541","39542","39543","39544","39545","39546","39547","39548","39549","39550","39551","39552","39553","39554","39555","39556","39557","39558","39559","39560","39561","39562","39563","39564","39565","39566","39567","39568","39569","39570","39571","39572","39573","39574","39575","39576","39577","39578","39579","39580","39581","39582","39583","39584","39585","39586","39587","39588","39589","39590","39591","39592","39593","39594","39595","39596","39597","39598","39599","39600","39601","39602","39603","39604","39605","39606","39607","39608","39609","39610","39611","39612","39613","39614","39615","39616","39617","39618","39619","39620","39621","39622","39623","39624","39625","39626","39627","39628","39629","39630","39631","39632","39633","39634","39635","39636","39637","39638","39639","39640","39641","39642","39643","39644","39645","39646","39647","39648","39649","39650","39651","39652","39653","39654","39655","39656","39657","39658","39659","39660","39661","39662","39663","39664","39665","39666","39667","39668","39669","39670","39671","39672","39673","39674","39675","39676","39677","39678","39679","39680","39681","39682","39683","39684","39685","39686","39687","39688","39689","39690","39691","39692","39693","39694","39695","39696","39697","39698","39699","39700","39701","39702","39703","39704","39705","39706","39707","39708","39709","39710","39711","39712","39713","39714","39715","39716","39717","39718","39719","39720","39721","39722","39723","39724","39725","39726","39727","39728","39729","39730","39731","39732","39733","39734","39735","39736","39737","39738","39739","39740","39741","39742","39743","39744","39745","39746","39747","39748","39749","39750","39751","39752","39753","39754","39755","39756","39757","39758","39759","39760","39761","39762","39763","39764","39765","39766","39767","39768","39769","39770","39771","39772","39773","39774","39775","39776","39777","39778","39779","39780","39781","39782","39783","39784","39785","39786","39787","39788","39789","39790","39791","39792","39793","39794","39795","39796","39797","39798","39799","39800","39801","39802","39803","39804","39805","39806","39807","39808","39809","39810","39811","39812","39813","39814","39815","39816","39817","39818","39819","39820","39821","39822","39823","39824","39825","39826","39827","39828","39829","39830","39831","39832","39833","39834","39835","39836","39837","39838","39839","39840","39841","39842","39843","39844","39845","39846","39847","39848","39849","39850","39851","39852","39853","39854","39855","39856","39857","39858","39859","39860","39861","39862","39863","39864","39865","39866","39867","39868","39869","39870","39871","39872","39873","39874","39875","39876","39877","39878","39879","39880","39881","39882","39883","39884","39885","39886","39887","39888","39889","39890","39891","39892","39893","39894","39895","39896","39897","39898","39899","39900","39901","39902","39903","39904","39905","39906","39907","39908","39909","39910","39911","39912","39913","39914","39915","39916","39917","39918","39919","39920","39921","39922","39923","39924","39925","39926","39927","39928","39929","39930","39931","39932","39933","39934","39935","39936","39937","39938","39939","39940","39941","39942","39943","39944","39945","39946","39947","39948","39949","39950","39951","39952","39953","39954","39955","39956","39957","39958","39959","39960","39961","39962","39963","39964","39965","39966","39967","39968","39969","39970","39971","39972","39973","39974","39975","39976","39977","39978","39979","39980","39981","39982","39983","39984","39985","39986","39987","39988","39989","39990","39991","39992","39993","39994","39995","39996","39997","39998","39999","40000","40001","40002","40003","40004","40005","40006","40007","40008","40009","40010","40011","40012","40013","40014","40015","40016","40017","40018","40019","40020","40021","40022","40023","40024","40025","40026","40027","40028","40029","40030","40031","40032","40033","40034","40035","40036","40037","40038","40039","40040","40041","40042","40043","40044","40045","40046","40047","40048","40049","40050","40051","40052","40053","40054","40055","40056","40057","40058","40059","40060","40061","40062","40063","40064","40065","40066","40067","40068","40069","40070","40071","40072","40073","40074","40075","40076","40077","40078","40079","40080","40081","40082","40083","40084","40085","40086","40087","40088","40089","40090","40091","40092","40093","40094","40095","40096","40097","40098","40099","40100","40101","40102","40103","40104","40105","40106","40107","40108","40109","40110","40111","40112","40113","40114","40115","40116","40117","40118","40119","40120","40121","40122","40123","40124","40125","40126","40127","40128","40129","40130","40131","40132","40133","40134","40135","40136","40137","40138","40139","40140","40141","40142","40143","40144","40145","40146","40147","40148","40149","40150","40151","40152","40153","40154","40155","40156","40157","40158","40159","40160","40161","40162","40163","40164","40165","40166","40167","40168","40169","40170","40171","40172","40173","40174","40175","40176","40177","40178","40179","40180","40181","40182","40183","40184","40185","40186","40187","40188","40189","40190","40191","40192","40193","40194","40195","40196","40197","40198","40199","40200","40201","40202","40203","40204","40205","40206","40207","40208","40209","40210","40211","40212","40213","40214","40215","40216","40217","40218","40219","40220","40221","40222","40223","40224","40225","40226","40227","40228","40229","40230","40231","40232","40233","40234","40235","40236","40237","40238","40239","40240","40241","40242","40243","40244","40245","40246","40247","40248","40249","40250","40251","40252","40253","40254","40255","40256","40257","40258","40259","40260","40261","40262","40263","40264","40265","40266","40267","40268","40269","40270","40271","40272","40273","40274","40275","40276","40277","40278","40279","40280","40281","40282","40283","40284","40285","40286","40287","40288","40289","40290","40291","40292","40293","40294","40295","40296","40297","40298","40299","40300","40301","40302","40303","40304","40305","40306","40307","40308","40309","40310","40311","40312","40313","40314","40315","40316","40317","40318","40319","40320","40321","40322","40323","40324","40325","40326","40327","40328","40329","40330","40331","40332","40333","40334","40335","40336","40337","40338","40339","40340","40341","40342","40343","40344","40345","40346","40347","40348","40349","40350","40351","40352","40353","40354","40355","40356","40357","40358","40359","40360","40361","40362","40363","40364","40365","40366","40367","40368","40369","40370","40371","40372","40373","40374","40375","40376","40377","40378","40379","40380","40381","40382","40383","40384","40385","40386","40387","40388","40389","40390","40391","40392","40393","40394","40395","40396","40397","40398","40399","40400","40401","40402","40403","40404","40405","40406","40407","40408","40409","40410","40411","40412","40413","40414","40415","40416","40417","40418","40419","40420","40421","40422","40423","40424","40425","40426","40427","40428","40429","40430","40431","40432","40433","40434","40435","40436","40437","40438","40439","40440","40441","40442","40443","40444","40445","40446","40447","40448","40449","40450","40451","40452","40453","40454","40455","40456","40457","40458","40459","40460","40461","40462","40463","40464","40465","40466","40467","40468","40469","40470","40471","40472","40473","40474","40475","40476","40477","40478","40479","40480","40481","40482","40483","40484","40485","40486","40487","40488","40489","40490","40491","40492","40493","40494","40495","40496","40497","40498","40499","40500","40501","40502","40503","40504","40505","40506","40507","40508","40509","40510","40511","40512","40513","40514","40515","40516","40517","40518","40519","40520","40521","40522","40523","40524","40525","40526","40527","40528","40529","40530","40531","40532","40533","40534","40535","40536","40537","40538","40539","40540","40541","40542","40543","40544","40545","40546","40547","40548","40549","40550","40551","40552","40553","40554","40555","40556","40557","40558","40559","40560","40561","40562","40563","40564","40565","40566","40567","40568","40569","40570","40571","40572","40573","40574","40575","40576","40577","40578","40579","40580","40581","40582","40583","40584","40585","40586","40587","40588","40589","40590","40591","40592","40593","40594","40595","40596","40597","40598","40599","40600","40601","40602","40603","40604","40605","40606","40607","40608","40609","40610","40611","40612","40613","40614","40615","40616","40617","40618","40619","40620","40621","40622","40623","40624","40625","40626","40627","40628","40629","40630","40631","40632","40633","40634","40635","40636","40637","40638","40639","40640","40641","40642","40643","40644","40645","40646","40647","40648","40649","40650","40651","40652","40653","40654","40655","40656","40657","40658","40659","40660","40661","40662","40663","40664","40665","40666","40667","40668","40669","40670","40671","40672","40673","40674","40675","40676","40677","40678","40679","40680","40681","40682","40683","40684","40685","40686","40687","40688","40689","40690","40691","40692","40693","40694","40695","40696","40697","40698","40699","40700","40701","40702","40703","40704","40705","40706","40707","40708","40709","40710","40711","40712","40713","40714","40715","40716","40717","40718","40719","40720","40721","40722","40723","40724","40725","40726","40727","40728","40729","40730","40731","40732","40733","40734","40735","40736","40737","40738","40739","40740","40741","40742","40743","40744","40745","40746","40747","40748","40749","40750","40751","40752","40753","40754","40755","40756","40757","40758","40759","40760","40761","40762","40763","40764","40765","40766","40767","40768","40769","40770","40771","40772","40773","40774","40775","40776","40777","40778","40779","40780","40781","40782","40783","40784","40785","40786","40787","40788","40789","40790","40791","40792","40793","40794","40795","40796","40797","40798","40799","40800","40801","40802","40803","40804","40805","40806","40807","40808","40809","40810","40811","40812","40813","40814","40815","40816","40817","40818","40819","40820","40821","40822","40823","40824","40825","40826","40827","40828","40829","40830","40831","40832","40833","40834","40835","40836","40837","40838","40839","40840","40841","40842","40843","40844","40845","40846","40847","40848","40849","40850","40851","40852","40853","40854","40855","40856","40857","40858","40859","40860","40861","40862","40863","40864","40865","40866","40867","40868","40869","40870","40871","40872","40873","40874","40875","40876","40877","40878","40879","40880","40881","40882","40883","40884","40885","40886","40887","40888","40889","40890","40891","40892","40893","40894","40895","40896","40897","40898","40899","40900","40901","40902","40903","40904","40905","40906","40907","40908","40909","40910","40911","40912","40913","40914","40915","40916","40917","40918","40919","40920","40921","40922","40923","40924","40925","40926","40927","40928","40929","40930","40931","40932","40933","40934","40935","40936","40937","40938","40939","40940","40941","40942","40943","40944","40945","40946","40947","40948","40949","40950","40951","40952","40953","40954","40955","40956","40957","40958","40959","40960","40961","40962","40963","40964","40965","40966","40967","40968","40969","40970","40971","40972","40973","40974","40975","40976","40977","40978","40979","40980","40981","40982","40983","40984","40985","40986","40987","40988","40989","40990","40991","40992","40993","40994","40995","40996","40997","40998","40999","41000","41001","41002","41003","41004","41005","41006","41007","41008","41009","41010","41011","41012","41013","41014","41015","41016","41017","41018","41019","41020","41021","41022","41023","41024","41025","41026","41027","41028","41029","41030","41031","41032","41033","41034","41035","41036","41037","41038","41039","41040","41041","41042","41043","41044","41045","41046","41047","41048","41049","41050","41051","41052","41053","41054","41055","41056","41057","41058","41059","41060","41061","41062","41063","41064","41065","41066","41067","41068","41069","41070","41071","41072","41073","41074","41075","41076","41077","41078","41079","41080","41081","41082","41083","41084","41085","41086","41087","41088","41089","41090","41091","41092","41093","41094","41095","41096","41097","41098","41099","41100","41101","41102","41103","41104","41105","41106","41107","41108","41109","41110","41111","41112","41113","41114","41115","41116","41117","41118","41119","41120","41121","41122","41123","41124","41125","41126","41127","41128","41129","41130","41131","41132","41133","41134","41135","41136","41137","41138","41139","41140","41141","41142","41143","41144","41145","41146","41147","41148","41149","41150","41151","41152","41153","41154","41155","41156","41157","41158","41159","41160","41161","41162","41163","41164","41165","41166","41167","41168","41169","41170","41171","41172","41173","41174","41175","41176","41177","41178","41179","41180","41181","41182","41183","41184","41185","41186","41187","41188","41189","41190","41191","41192","41193","41194","41195","41196","41197","41198","41199","41200","41201","41202","41203","41204","41205","41206","41207","41208","41209","41210","41211","41212","41213","41214","41215","41216","41217","41218","41219","41220","41221","41222","41223","41224","41225","41226","41227","41228","41229","41230","41231","41232","41233","41234","41235","41236","41237","41238","41239","41240","41241","41242","41243","41244","41245","41246","41247","41248","41249","41250","41251","41252","41253","41254","41255","41256","41257","41258","41259","41260","41261","41262","41263","41264","41265","41266","41267","41268","41269","41270","41271","41272","41273","41274","41275","41276","41277","41278","41279","41280","41281","41282","41283","41284","41285","41286","41287","41288","41289","41290","41291","41292","41293","41294","41295","41296","41297","41298","41299","41300","41301","41302","41303","41304","41305","41306","41307","41308","41309","41310","41311","41312","41313","41314","41315","41316","41317","41318","41319","41320","41321","41322","41323","41324","41325","41326","41327","41328","41329","41330","41331","41332","41333","41334","41335","41336","41337","41338","41339","41340","41341","41342","41343","41344","41345","41346","41347","41348","41349","41350","41351","41352","41353","41354","41355","41356","41357","41358","41359","41360","41361","41362","41363","41364","41365","41366","41367","41368","41369","41370","41371","41372","41373","41374","41375","41376","41377","41378","41379","41380","41381","41382","41383","41384","41385","41386","41387","41388","41389","41390","41391","41392","41393","41394","41395","41396","41397","41398","41399","41400","41401","41402","41403","41404","41405","41406","41407","41408","41409","41410","41411","41412","41413","41414","41415","41416","41417","41418","41419","41420","41421","41422","41423","41424","41425","41426","41427","41428","41429","41430","41431","41432","41433","41434","41435","41436","41437","41438","41439","41440","41441","41442","41443","41444","41445","41446","41447","41448","41449","41450","41451","41452","41453","41454","41455","41456","41457","41458","41459","41460","41461","41462","41463","41464","41465","41466","41467","41468","41469","41470","41471","41472","41473","41474","41475","41476","41477","41478","41479","41480","41481","41482","41483","41484","41485","41486","41487","41488","41489","41490","41491","41492","41493","41494","41495","41496","41497","41498","41499","41500","41501","41502","41503","41504","41505","41506","41507","41508","41509","41510","41511","41512","41513","41514","41515","41516","41517","41518","41519","41520","41521","41522","41523","41524","41525","41526","41527","41528","41529","41530","41531","41532","41533","41534","41535","41536","41537","41538","41539","41540","41541","41542","41543","41544","41545","41546","41547","41548","41549","41550","41551","41552","41553","41554","41555","41556","41557","41558","41559","41560","41561","41562","41563","41564","41565","41566","41567","41568","41569","41570","41571","41572","41573","41574","41575","41576","41577","41578","41579","41580","41581","41582","41583","41584","41585","41586","41587","41588","41589","41590","41591","41592","41593","41594","41595","41596","41597","41598","41599","41600","41601","41602","41603","41604","41605","41606","41607","41608","41609","41610","41611","41612","41613","41614","41615","41616","41617","41618","41619","41620","41621","41622","41623","41624","41625","41626","41627","41628","41629","41630","41631","41632","41633","41634","41635","41636","41637","41638","41639","41640","41641","41642","41643","41644","41645","41646","41647","41648","41649","41650","41651","41652","41653","41654","41655","41656","41657","41658","41659","41660","41661","41662","41663","41664","41665","41666","41667","41668","41669","41670","41671","41672","41673","41674","41675","41676","41677","41678","41679","41680","41681","41682","41683","41684","41685","41686","41687","41688","41689","41690","41691","41692","41693","41694","41695","41696","41697","41698","41699","41700","41701","41702","41703","41704","41705","41706","41707","41708","41709","41710","41711","41712","41713","41714","41715","41716","41717","41718","41719","41720","41721","41722","41723","41724","41725","41726","41727","41728","41729","41730","41731","41732","41733","41734","41735","41736","41737","41738","41739","41740","41741","41742","41743","41744","41745","41746","41747","41748","41749","41750","41751","41752","41753","41754","41755","41756","41757","41758","41759","41760","41761","41762","41763","41764","41765","41766","41767","41768","41769","41770","41771","41772","41773","41774","41775","41776","41777","41778","41779","41780","41781","41782","41783","41784","41785","41786","41787","41788","41789","41790","41791","41792","41793","41794","41795","41796","41797","41798","41799","41800","41801","41802","41803","41804","41805","41806","41807","41808","41809","41810","41811","41812","41813","41814","41815","41816","41817","41818","41819","41820","41821","41822","41823","41824","41825","41826","41827","41828","41829","41830","41831","41832","41833","41834","41835","41836","41837","41838","41839","41840","41841","41842","41843","41844","41845","41846","41847","41848","41849","41850","41851","41852","41853","41854","41855","41856","41857","41858","41859","41860","41861","41862","41863","41864","41865","41866","41867","41868","41869","41870","41871","41872","41873","41874","41875","41876","41877","41878","41879","41880","41881","41882","41883","41884","41885","41886","41887","41888","41889","41890","41891","41892","41893","41894","41895","41896","41897","41898","41899","41900","41901","41902","41903","41904","41905","41906","41907","41908","41909","41910","41911","41912","41913","41914","41915","41916","41917","41918","41919","41920","41921","41922","41923","41924","41925","41926","41927","41928","41929","41930","41931","41932","41933","41934","41935","41936","41937","41938","41939","41940","41941","41942","41943","41944","41945","41946","41947","41948","41949","41950","41951","41952","41953","41954","41955","41956","41957","41958","41959","41960","41961","41962","41963","41964","41965","41966","41967","41968","41969","41970","41971","41972","41973","41974","41975","41976","41977","41978","41979","41980","41981","41982","41983","41984","41985","41986","41987","41988","41989","41990","41991","41992","41993","41994","41995","41996","41997","41998","41999","42000","42001","42002","42003","42004","42005","42006","42007","42008","42009","42010","42011","42012","42013","42014","42015","42016","42017","42018","42019","42020","42021","42022","42023","42024","42025","42026","42027","42028","42029","42030","42031","42032","42033","42034","42035","42036","42037","42038","42039","42040","42041","42042","42043","42044","42045","42046","42047","42048","42049","42050","42051","42052","42053","42054","42055","42056","42057","42058","42059","42060","42061","42062","42063","42064","42065","42066","42067","42068","42069","42070","42071","42072","42073","42074","42075","42076","42077","42078","42079","42080","42081","42082","42083","42084","42085","42086","42087","42088","42089","42090","42091","42092","42093","42094","42095","42096","42097","42098","42099","42100","42101","42102","42103","42104","42105","42106","42107","42108","42109","42110","42111","42112","42113","42114","42115","42116","42117","42118","42119","42120","42121","42122","42123","42124","42125","42126","42127","42128","42129","42130","42131","42132","42133","42134","42135","42136","42137","42138","42139","42140","42141","42142","42143","42144","42145","42146","42147","42148","42149","42150","42151","42152","42153","42154","42155","42156","42157","42158","42159","42160","42161","42162","42163","42164","42165","42166","42167","42168","42169","42170","42171","42172","42173","42174","42175","42176","42177","42178","42179","42180","42181","42182","42183","42184","42185","42186","42187","42188","42189","42190","42191","42192","42193","42194","42195","42196","42197","42198","42199","42200","42201","42202","42203","42204","42205","42206","42207","42208","42209","42210","42211","42212","42213","42214","42215","42216","42217","42218","42219","42220","42221","42222","42223","42224","42225","42226","42227","42228","42229","42230","42231","42232","42233","42234","42235","42236","42237","42238","42239","42240","42241","42242","42243","42244","42245","42246","42247","42248","42249","42250","42251","42252","42253","42254","42255","42256","42257","42258","42259","42260","42261","42262","42263","42264","42265","42266","42267","42268","42269","42270","42271","42272","42273","42274","42275","42276","42277","42278","42279","42280","42281","42282","42283","42284","42285","42286","42287","42288","42289","42290","42291","42292","42293","42294","42295","42296","42297","42298","42299","42300","42301","42302","42303","42304","42305","42306","42307","42308","42309","42310","42311","42312","42313","42314","42315","42316","42317","42318","42319","42320","42321","42322","42323","42324","42325","42326","42327","42328","42329","42330","42331","42332","42333","42334","42335","42336","42337","42338","42339","42340","42341","42342","42343","42344","42345","42346","42347","42348","42349","42350","42351","42352","42353","42354","42355","42356","42357","42358","42359","42360","42361","42362","42363","42364","42365","42366","42367","42368","42369","42370","42371","42372","42373","42374","42375","42376","42377","42378","42379","42380","42381","42382","42383","42384","42385","42386","42387","42388","42389","42390","42391","42392","42393","42394","42395","42396","42397","42398","42399","42400","42401","42402","42403","42404","42405","42406","42407","42408","42409","42410","42411","42412","42413","42414","42415","42416","42417","42418","42419","42420","42421","42422","42423","42424","42425","42426","42427","42428","42429","42430","42431","42432","42433","42434","42435","42436","42437","42438","42439","42440","42441","42442","42443","42444","42445","42446","42447","42448","42449","42450","42451","42452","42453","42454","42455","42456","42457","42458","42459","42460","42461","42462","42463","42464","42465","42466","42467","42468","42469","42470","42471","42472","42473","42474","42475","42476","42477","42478","42479","42480","42481","42482","42483","42484","42485","42486","42487","42488","42489","42490","42491","42492","42493","42494","42495","42496","42497","42498","42499","42500","42501","42502","42503","42504","42505","42506","42507","42508","42509","42510","42511","42512","42513","42514","42515","42516","42517","42518","42519","42520","42521","42522","42523","42524","42525","42526","42527","42528","42529","42530","42531","42532","42533","42534","42535","42536","42537","42538","42539","42540","42541","42542","42543","42544","42545","42546","42547","42548","42549","42550","42551","42552","42553","42554","42555","42556","42557","42558","42559","42560","42561","42562","42563","42564","42565","42566","42567","42568","42569","42570","42571","42572","42573","42574","42575","42576","42577","42578","42579","42580","42581","42582","42583","42584","42585","42586","42587","42588","42589","42590","42591","42592","42593","42594","42595","42596","42597","42598","42599","42600","42601","42602","42603","42604","42605","42606","42607","42608","42609","42610","42611","42612","42613","42614","42615","42616","42617","42618","42619","42620","42621","42622","42623","42624","42625","42626","42627","42628","42629","42630","42631","42632","42633","42634","42635","42636","42637","42638","42639","42640","42641","42642","42643","42644","42645","42646","42647","42648","42649","42650","42651","42652","42653","42654","42655","42656","42657","42658","42659","42660","42661","42662","42663","42664","42665","42666","42667","42668","42669","42670","42671","42672","42673","42674","42675","42676","42677","42678","42679","42680","42681","42682","42683","42684","42685","42686","42687","42688","42689","42690","42691","42692","42693","42694","42695","42696","42697","42698","42699","42700","42701","42702","42703","42704","42705","42706","42707","42708","42709","42710","42711","42712","42713","42714","42715","42716","42717","42718","42719","42720","42721","42722","42723","42724","42725","42726","42727","42728","42729","42730","42731","42732","42733","42734","42735","42736","42737","42738","42739","42740","42741","42742","42743","42744","42745","42746","42747","42748","42749","42750","42751","42752","42753","42754","42755","42756","42757","42758","42759","42760","42761","42762","42763","42764","42765","42766","42767","42768","42769","42770","42771","42772","42773","42774","42775","42776","42777","42778","42779","42780","42781","42782","42783","42784","42785","42786","42787","42788","42789","42790","42791","42792","42793","42794","42795","42796","42797","42798","42799","42800","42801","42802","42803","42804","42805","42806","42807","42808","42809","42810","42811","42812","42813","42814","42815","42816","42817","42818","42819","42820","42821","42822","42823","42824","42825","42826","42827","42828","42829","42830","42831","42832","42833","42834","42835","42836","42837","42838","42839","42840","42841","42842","42843","42844","42845","42846","42847","42848","42849","42850","42851","42852","42853","42854","42855","42856","42857","42858","42859","42860","42861","42862","42863","42864","42865","42866","42867","42868","42869","42870","42871","42872","42873","42874","42875","42876","42877","42878","42879","42880","42881","42882","42883","42884","42885","42886","42887","42888","42889","42890","42891","42892","42893","42894","42895","42896","42897","42898","42899","42900","42901","42902","42903","42904","42905","42906","42907","42908","42909","42910","42911","42912","42913","42914","42915","42916","42917","42918","42919","42920","42921","42922","42923","42924","42925","42926","42927","42928","42929","42930","42931","42932","42933","42934","42935","42936","42937","42938","42939","42940","42941","42942","42943","42944","42945","42946","42947","42948","42949","42950","42951","42952","42953","42954","42955","42956","42957","42958","42959","42960","42961","42962","42963","42964","42965","42966","42967","42968","42969","42970","42971","42972","42973","42974","42975","42976","42977","42978","42979","42980","42981","42982","42983","42984","42985","42986","42987","42988","42989","42990","42991","42992","42993","42994","42995","42996","42997","42998","42999","43000","43001","43002","43003","43004","43005","43006","43007","43008","43009","43010","43011","43012","43013","43014","43015","43016","43017","43018","43019","43020","43021","43022","43023","43024","43025","43026","43027","43028","43029","43030","43031","43032","43033","43034","43035","43036","43037","43038","43039","43040","43041","43042","43043","43044","43045","43046","43047","43048","43049","43050","43051","43052","43053","43054","43055","43056","43057","43058","43059","43060","43061","43062","43063","43064","43065","43066","43067","43068","43069","43070","43071","43072","43073","43074","43075","43076","43077","43078","43079","43080","43081","43082","43083","43084","43085","43086","43087","43088","43089","43090","43091","43092","43093","43094","43095","43096","43097","43098","43099","43100","43101","43102","43103","43104","43105","43106","43107","43108","43109","43110","43111","43112","43113","43114","43115","43116","43117","43118","43119","43120","43121","43122","43123","43124","43125","43126","43127","43128","43129","43130","43131","43132","43133","43134","43135","43136","43137","43138","43139","43140","43141","43142","43143","43144","43145","43146","43147","43148","43149","43150","43151","43152","43153","43154","43155","43156","43157","43158","43159","43160","43161","43162","43163","43164","43165","43166","43167","43168","43169","43170","43171","43172","43173","43174","43175","43176","43177","43178","43179","43180","43181","43182","43183","43184","43185","43186","43187","43188","43189","43190","43191","43192","43193","43194","43195","43196","43197","43198","43199","43200","43201","43202","43203","43204","43205","43206","43207","43208","43209","43210","43211","43212","43213","43214","43215","43216","43217","43218","43219","43220","43221","43222","43223","43224","43225","43226","43227","43228","43229","43230","43231","43232","43233","43234","43235","43236","43237","43238","43239","43240","43241","43242","43243","43244","43245","43246","43247","43248","43249","43250","43251","43252","43253","43254","43255","43256","43257","43258","43259","43260","43261","43262","43263","43264","43265","43266","43267","43268","43269","43270","43271","43272","43273","43274","43275","43276","43277","43278","43279","43280","43281","43282","43283","43284","43285","43286","43287","43288","43289","43290","43291","43292","43293","43294","43295","43296","43297","43298","43299","43300","43301","43302","43303","43304","43305","43306","43307","43308","43309","43310","43311","43312","43313","43314","43315","43316","43317","43318","43319","43320","43321","43322","43323","43324","43325","43326","43327","43328","43329","43330","43331","43332","43333","43334","43335","43336","43337","43338","43339","43340","43341","43342","43343","43344","43345","43346","43347","43348","43349","43350","43351","43352","43353","43354","43355","43356","43357","43358","43359","43360","43361","43362","43363","43364","43365","43366","43367","43368","43369","43370","43371","43372","43373","43374","43375","43376","43377","43378","43379","43380","43381","43382","43383","43384","43385","43386","43387","43388","43389","43390","43391","43392","43393","43394","43395","43396","43397","43398","43399","43400","43401","43402","43403","43404","43405","43406","43407","43408","43409","43410","43411","43412","43413","43414","43415","43416","43417","43418","43419","43420","43421","43422","43423","43424","43425","43426","43427","43428","43429","43430","43431","43432","43433","43434","43435","43436","43437","43438","43439","43440","43441","43442","43443","43444","43445","43446","43447","43448","43449","43450","43451","43452","43453","43454","43455","43456","43457","43458","43459","43460","43461","43462","43463","43464","43465","43466","43467","43468","43469","43470","43471","43472","43473","43474","43475","43476","43477","43478","43479","43480","43481","43482","43483","43484","43485","43486","43487","43488","43489","43490","43491","43492","43493","43494","43495","43496","43497","43498","43499","43500","43501","43502","43503","43504","43505","43506","43507","43508","43509","43510","43511","43512","43513","43514","43515","43516","43517","43518","43519","43520","43521","43522","43523","43524","43525","43526","43527","43528","43529","43530","43531","43532","43533","43534","43535","43536","43537","43538","43539","43540","43541","43542","43543","43544","43545","43546","43547","43548","43549","43550","43551","43552","43553","43554","43555","43556","43557","43558","43559","43560","43561","43562","43563","43564","43565","43566","43567","43568","43569","43570","43571","43572","43573","43574","43575","43576","43577","43578","43579","43580","43581","43582","43583","43584","43585","43586","43587","43588","43589","43590","43591","43592","43593","43594","43595","43596","43597","43598","43599","43600","43601","43602","43603","43604","43605","43606","43607","43608","43609","43610","43611","43612","43613","43614","43615","43616","43617","43618","43619","43620","43621","43622","43623","43624","43625","43626","43627","43628","43629","43630","43631","43632","43633","43634","43635","43636","43637","43638","43639","43640","43641","43642","43643","43644","43645","43646","43647","43648","43649","43650","43651","43652","43653","43654","43655","43656","43657","43658","43659","43660","43661","43662","43663","43664","43665","43666","43667","43668","43669","43670","43671","43672","43673","43674","43675","43676","43677","43678","43679","43680","43681","43682","43683","43684","43685","43686","43687","43688","43689","43690","43691","43692","43693","43694","43695","43696","43697","43698","43699","43700","43701","43702","43703","43704","43705","43706","43707","43708","43709","43710","43711","43712","43713","43714","43715","43716","43717","43718","43719","43720","43721","43722","43723","43724","43725","43726","43727","43728","43729","43730","43731","43732","43733","43734","43735","43736","43737","43738","43739","43740","43741","43742","43743","43744","43745","43746","43747","43748","43749","43750","43751","43752","43753","43754","43755","43756","43757","43758","43759","43760","43761","43762","43763","43764","43765","43766","43767","43768","43769","43770","43771","43772","43773","43774","43775","43776","43777","43778","43779","43780","43781","43782","43783","43784","43785","43786","43787","43788","43789","43790","43791","43792","43793","43794","43795","43796","43797","43798","43799","43800","43801","43802","43803","43804","43805","43806","43807","43808","43809","43810","43811","43812","43813","43814","43815","43816","43817","43818","43819","43820","43821","43822","43823","43824","43825","43826","43827","43828","43829","43830","43831","43832","43833","43834","43835","43836","43837","43838","43839","43840","43841","43842","43843","43844","43845","43846","43847","43848","43849","43850","43851","43852","43853","43854","43855","43856","43857","43858","43859","43860","43861","43862","43863","43864","43865","43866","43867","43868","43869","43870","43871","43872","43873","43874","43875","43876","43877","43878","43879","43880","43881","43882","43883","43884","43885","43886","43887","43888","43889","43890","43891","43892","43893","43894","43895","43896","43897","43898","43899","43900","43901","43902","43903","43904","43905","43906","43907","43908","43909","43910","43911","43912","43913","43914","43915","43916","43917","43918","43919","43920","43921","43922","43923","43924","43925","43926","43927","43928","43929","43930","43931","43932","43933","43934","43935","43936","43937","43938","43939","43940","43941","43942","43943","43944","43945","43946","43947","43948","43949","43950","43951","43952","43953","43954","43955","43956","43957","43958","43959","43960","43961","43962","43963","43964","43965","43966","43967","43968","43969","43970","43971","43972","43973","43974","43975","43976","43977","43978","43979","43980","43981","43982","43983","43984","43985","43986","43987","43988","43989","43990","43991","43992","43993","43994","43995","43996","43997","43998","43999","44000","44001","44002","44003","44004","44005","44006","44007","44008","44009","44010","44011","44012","44013","44014","44015","44016","44017","44018","44019","44020","44021","44022","44023","44024","44025","44026","44027","44028","44029","44030","44031","44032","44033","44034","44035","44036","44037","44038","44039","44040","44041","44042","44043","44044","44045","44046","44047","44048","44049","44050","44051","44052","44053","44054","44055","44056","44057","44058","44059","44060","44061","44062","44063","44064","44065","44066","44067","44068","44069","44070","44071","44072","44073","44074","44075","44076","44077","44078","44079","44080","44081","44082","44083","44084","44085","44086","44087","44088","44089","44090","44091","44092","44093","44094","44095","44096","44097","44098","44099","44100","44101","44102","44103","44104","44105","44106","44107","44108","44109","44110","44111","44112","44113","44114","44115","44116","44117","44118","44119","44120","44121","44122","44123","44124","44125","44126","44127","44128","44129","44130","44131","44132","44133","44134","44135","44136","44137","44138","44139","44140","44141","44142","44143","44144","44145","44146","44147","44148","44149","44150","44151","44152","44153","44154","44155","44156","44157","44158","44159","44160","44161","44162","44163","44164","44165","44166","44167","44168","44169","44170","44171","44172","44173","44174","44175","44176","44177","44178","44179","44180","44181","44182","44183","44184","44185","44186","44187","44188","44189","44190","44191","44192","44193","44194","44195","44196","44197","44198","44199","44200","44201","44202","44203","44204","44205","44206","44207","44208","44209","44210","44211","44212","44213","44214","44215","44216","44217","44218","44219","44220","44221","44222","44223","44224","44225","44226","44227","44228","44229","44230","44231","44232","44233","44234","44235","44236","44237","44238","44239","44240","44241","44242","44243","44244","44245","44246","44247","44248","44249","44250","44251","44252","44253","44254","44255","44256","44257","44258","44259","44260","44261","44262","44263","44264","44265","44266","44267","44268","44269","44270","44271","44272","44273","44274","44275","44276","44277","44278","44279","44280","44281","44282","44283","44284","44285","44286","44287","44288","44289","44290","44291","44292","44293","44294","44295","44296","44297","44298","44299","44300","44301","44302","44303","44304","44305","44306","44307","44308","44309","44310","44311","44312","44313","44314","44315","44316","44317","44318","44319","44320","44321","44322","44323","44324","44325","44326","44327","44328","44329","44330","44331","44332","44333","44334","44335","44336","44337","44338","44339","44340","44341","44342","44343","44344","44345","44346","44347","44348","44349","44350","44351","44352","44353","44354","44355","44356","44357","44358","44359","44360","44361","44362","44363","44364","44365","44366","44367","44368","44369","44370","44371","44372","44373","44374","44375","44376","44377","44378","44379","44380","44381","44382","44383","44384","44385","44386","44387","44388","44389","44390","44391","44392","44393","44394","44395","44396","44397","44398","44399","44400","44401","44402","44403","44404","44405","44406","44407","44408","44409","44410","44411","44412","44413","44414","44415","44416","44417","44418","44419","44420","44421","44422","44423","44424","44425","44426","44427","44428","44429","44430","44431","44432","44433","44434","44435","44436","44437","44438","44439","44440","44441","44442","44443","44444","44445","44446","44447","44448","44449","44450","44451","44452","44453","44454","44455","44456","44457","44458","44459","44460","44461","44462","44463","44464","44465","44466","44467","44468","44469","44470","44471","44472","44473","44474","44475","44476","44477","44478","44479","44480","44481","44482","44483","44484","44485","44486","44487","44488","44489","44490","44491","44492","44493","44494","44495","44496","44497","44498","44499","44500","44501","44502","44503","44504","44505","44506","44507","44508","44509","44510","44511","44512","44513","44514","44515","44516","44517","44518","44519","44520","44521","44522","44523","44524","44525","44526","44527","44528","44529","44530","44531","44532","44533","44534","44535","44536","44537","44538","44539","44540","44541","44542","44543","44544","44545","44546","44547","44548","44549","44550","44551","44552","44553","44554","44555","44556","44557","44558","44559","44560","44561","44562","44563","44564","44565","44566","44567","44568","44569","44570","44571","44572","44573","44574","44575","44576","44577","44578","44579","44580","44581","44582","44583","44584","44585","44586","44587","44588","44589","44590","44591","44592","44593","44594","44595","44596","44597","44598","44599","44600","44601","44602","44603","44604","44605","44606","44607","44608","44609","44610","44611","44612","44613","44614","44615","44616","44617","44618","44619","44620","44621","44622","44623","44624","44625","44626","44627","44628","44629","44630","44631","44632","44633","44634","44635","44636","44637","44638","44639","44640","44641","44642","44643","44644","44645","44646","44647","44648","44649","44650","44651","44652","44653","44654","44655","44656","44657","44658","44659","44660","44661","44662","44663","44664","44665","44666","44667","44668","44669","44670","44671","44672","44673","44674","44675","44676","44677","44678","44679","44680","44681","44682","44683","44684","44685","44686","44687","44688","44689","44690","44691","44692","44693","44694","44695","44696","44697","44698","44699","44700","44701","44702","44703","44704","44705","44706","44707","44708","44709","44710","44711","44712","44713","44714","44715","44716","44717","44718","44719","44720","44721","44722","44723","44724","44725","44726","44727","44728","44729","44730","44731","44732","44733","44734","44735","44736","44737","44738","44739","44740","44741","44742","44743","44744","44745","44746","44747","44748","44749","44750","44751","44752","44753","44754","44755","44756","44757","44758","44759","44760","44761","44762","44763","44764","44765","44766","44767","44768","44769","44770","44771","44772","44773","44774","44775","44776","44777","44778","44779","44780","44781","44782","44783","44784","44785","44786","44787","44788","44789","44790","44791","44792","44793","44794","44795","44796","44797","44798","44799","44800","44801","44802","44803","44804","44805","44806","44807","44808","44809","44810","44811","44812","44813","44814","44815","44816","44817","44818","44819","44820","44821","44822","44823","44824","44825","44826","44827","44828","44829","44830","44831","44832","44833","44834","44835","44836","44837","44838","44839","44840","44841","44842","44843","44844","44845","44846","44847","44848","44849","44850","44851","44852","44853","44854","44855","44856","44857","44858","44859","44860","44861","44862","44863","44864","44865","44866","44867","44868","44869","44870","44871","44872","44873","44874","44875","44876","44877","44878","44879","44880","44881","44882","44883","44884","44885","44886","44887","44888","44889","44890","44891","44892","44893","44894","44895","44896","44897","44898","44899","44900","44901","44902","44903","44904","44905","44906","44907","44908","44909","44910","44911","44912","44913","44914","44915","44916","44917","44918","44919","44920","44921","44922","44923","44924","44925","44926","44927","44928","44929","44930","44931","44932","44933","44934","44935","44936","44937","44938","44939","44940","44941","44942","44943","44944","44945","44946","44947","44948","44949","44950","44951","44952","44953","44954","44955","44956","44957","44958","44959","44960","44961","44962","44963","44964","44965","44966","44967","44968","44969","44970","44971","44972","44973","44974","44975","44976","44977","44978","44979","44980","44981","44982","44983","44984","44985","44986","44987","44988","44989","44990","44991","44992","44993","44994","44995","44996","44997","44998","44999","45000","45001","45002","45003","45004","45005","45006","45007","45008","45009","45010","45011","45012","45013","45014","45015","45016","45017","45018","45019","45020","45021","45022","45023","45024","45025","45026","45027","45028","45029","45030","45031","45032","45033","45034","45035","45036","45037","45038","45039","45040","45041","45042","45043","45044","45045","45046","45047","45048","45049","45050","45051","45052","45053","45054","45055","45056","45057","45058","45059","45060","45061","45062","45063","45064","45065","45066","45067","45068","45069","45070","45071","45072","45073","45074","45075","45076","45077","45078","45079","45080","45081","45082","45083","45084","45085","45086","45087","45088","45089","45090","45091","45092","45093","45094","45095","45096","45097","45098","45099","45100","45101","45102","45103","45104","45105","45106","45107","45108","45109","45110","45111","45112","45113","45114","45115","45116","45117","45118","45119","45120","45121","45122","45123","45124","45125","45126","45127","45128","45129","45130","45131","45132","45133","45134","45135","45136","45137","45138","45139","45140","45141","45142","45143","45144","45145","45146","45147","45148","45149","45150","45151","45152","45153","45154","45155","45156","45157","45158","45159","45160","45161","45162","45163","45164","45165","45166","45167","45168","45169","45170","45171","45172","45173","45174","45175","45176","45177","45178","45179","45180","45181","45182","45183","45184","45185","45186","45187","45188","45189","45190","45191","45192","45193","45194","45195","45196","45197","45198","45199","45200","45201","45202","45203","45204","45205","45206","45207","45208","45209","45210","45211","45212","45213","45214","45215","45216","45217","45218","45219","45220","45221","45222","45223","45224","45225","45226","45227","45228","45229","45230","45231","45232","45233","45234","45235","45236","45237","45238","45239","45240","45241","45242","45243","45244","45245","45246","45247","45248","45249","45250","45251","45252","45253","45254","45255","45256","45257","45258","45259","45260","45261","45262","45263","45264","45265","45266","45267","45268","45269","45270","45271","45272","45273","45274","45275","45276","45277","45278","45279","45280","45281","45282","45283","45284","45285","45286","45287","45288","45289","45290","45291","45292","45293","45294","45295","45296","45297","45298","45299","45300","45301","45302","45303","45304","45305","45306","45307","45308","45309","45310","45311","45312","45313","45314","45315","45316","45317","45318","45319","45320","45321","45322","45323","45324","45325","45326","45327","45328","45329","45330","45331","45332","45333","45334","45335","45336","45337","45338","45339","45340","45341","45342","45343","45344","45345","45346","45347","45348","45349","45350","45351","45352","45353","45354","45355","45356","45357","45358","45359","45360","45361","45362","45363","45364","45365","45366","45367","45368","45369","45370","45371","45372","45373","45374","45375","45376","45377","45378","45379","45380","45381","45382","45383","45384","45385","45386","45387","45388","45389","45390","45391","45392","45393","45394","45395","45396","45397","45398","45399","45400","45401","45402","45403","45404","45405","45406","45407","45408","45409","45410","45411","45412","45413","45414","45415","45416","45417","45418","45419","45420","45421","45422","45423","45424","45425","45426","45427","45428","45429","45430","45431","45432","45433","45434","45435","45436","45437","45438","45439","45440","45441","45442","45443","45444","45445","45446","45447","45448","45449","45450","45451","45452","45453","45454","45455","45456","45457","45458","45459","45460","45461","45462","45463","45464","45465","45466","45467","45468","45469","45470","45471","45472","45473","45474","45475","45476","45477","45478","45479","45480","45481","45482","45483","45484","45485","45486","45487","45488","45489","45490","45491","45492","45493","45494","45495","45496","45497","45498","45499","45500","45501","45502","45503","45504","45505","45506","45507","45508","45509","45510","45511","45512","45513","45514","45515","45516","45517","45518","45519","45520","45521","45522","45523","45524","45525","45526","45527","45528","45529","45530","45531","45532","45533","45534","45535","45536","45537","45538","45539","45540","45541","45542","45543","45544","45545","45546","45547","45548","45549","45550","45551","45552","45553","45554","45555","45556","45557","45558","45559","45560","45561","45562","45563","45564","45565","45566","45567","45568","45569","45570","45571","45572","45573","45574","45575","45576","45577","45578","45579","45580","45581","45582","45583","45584","45585","45586","45587","45588","45589","45590","45591","45592","45593","45594","45595","45596","45597","45598","45599","45600","45601","45602","45603","45604","45605","45606","45607","45608","45609","45610","45611","45612","45613","45614","45615","45616","45617","45618","45619","45620","45621","45622","45623","45624","45625","45626","45627","45628","45629","45630","45631","45632","45633","45634","45635","45636","45637","45638","45639","45640","45641","45642","45643","45644","45645","45646","45647","45648","45649","45650","45651","45652","45653","45654","45655","45656","45657","45658","45659","45660","45661","45662","45663","45664","45665","45666","45667","45668","45669","45670","45671","45672","45673","45674","45675","45676","45677","45678","45679","45680","45681","45682","45683","45684","45685","45686","45687","45688","45689","45690","45691","45692","45693","45694","45695","45696","45697","45698","45699","45700","45701","45702","45703","45704","45705","45706","45707","45708","45709","45710","45711","45712","45713","45714","45715","45716","45717","45718","45719","45720","45721","45722","45723","45724","45725","45726","45727","45728","45729","45730","45731","45732","45733","45734","45735","45736","45737","45738","45739","45740","45741","45742","45743","45744","45745","45746","45747","45748","45749","45750","45751","45752","45753","45754","45755","45756","45757","45758","45759","45760","45761","45762","45763","45764","45765","45766","45767","45768","45769","45770","45771","45772","45773","45774","45775","45776","45777","45778","45779","45780","45781","45782","45783","45784","45785","45786","45787","45788","45789","45790","45791","45792","45793","45794","45795","45796","45797","45798","45799","45800","45801","45802","45803","45804","45805","45806","45807","45808","45809","45810","45811","45812","45813","45814","45815","45816","45817","45818","45819","45820","45821","45822","45823","45824","45825","45826","45827","45828","45829","45830","45831","45832","45833","45834","45835","45836","45837","45838","45839","45840","45841","45842","45843","45844","45845","45846","45847","45848","45849","45850","45851","45852","45853","45854","45855","45856","45857","45858","45859","45860","45861","45862","45863","45864","45865","45866","45867","45868","45869","45870","45871","45872","45873","45874","45875","45876","45877","45878","45879","45880","45881","45882","45883","45884","45885","45886","45887","45888","45889","45890","45891","45892","45893","45894","45895","45896","45897","45898","45899","45900","45901","45902","45903","45904","45905","45906","45907","45908","45909","45910","45911","45912","45913","45914","45915","45916","45917","45918","45919","45920","45921","45922","45923","45924","45925","45926","45927","45928","45929","45930","45931","45932","45933","45934","45935","45936","45937","45938","45939","45940","45941","45942","45943","45944","45945","45946","45947","45948","45949","45950","45951","45952","45953","45954","45955","45956","45957","45958","45959","45960","45961","45962","45963","45964","45965","45966","45967","45968","45969","45970","45971","45972","45973","45974","45975","45976","45977","45978","45979","45980","45981","45982","45983","45984","45985","45986","45987","45988","45989","45990","45991","45992","45993","45994","45995","45996","45997","45998","45999","46000","46001","46002","46003","46004","46005","46006","46007","46008","46009","46010","46011","46012","46013","46014","46015","46016","46017","46018","46019","46020","46021","46022","46023","46024","46025","46026","46027","46028","46029","46030","46031","46032","46033","46034","46035","46036","46037","46038","46039","46040","46041","46042","46043","46044","46045","46046","46047","46048","46049","46050","46051","46052","46053","46054","46055","46056","46057","46058","46059","46060","46061","46062","46063","46064","46065","46066","46067","46068","46069","46070","46071","46072","46073","46074","46075","46076","46077","46078","46079","46080","46081","46082","46083","46084","46085","46086","46087","46088","46089","46090","46091","46092","46093","46094","46095","46096","46097","46098","46099","46100","46101","46102","46103","46104","46105","46106","46107","46108","46109","46110","46111","46112","46113","46114","46115","46116","46117","46118","46119","46120","46121","46122","46123","46124","46125","46126","46127","46128","46129","46130","46131","46132","46133","46134","46135","46136","46137","46138","46139","46140","46141","46142","46143","46144","46145","46146","46147","46148","46149","46150","46151","46152","46153","46154","46155","46156","46157","46158","46159","46160","46161","46162","46163","46164","46165","46166","46167","46168","46169","46170","46171","46172","46173","46174","46175","46176","46177","46178","46179","46180","46181","46182","46183","46184","46185","46186","46187","46188","46189","46190","46191","46192","46193","46194","46195","46196","46197","46198","46199","46200","46201","46202","46203","46204","46205","46206","46207","46208","46209","46210","46211","46212","46213","46214","46215","46216","46217","46218","46219","46220","46221","46222","46223","46224","46225","46226","46227","46228","46229","46230","46231","46232","46233","46234","46235","46236","46237","46238","46239","46240","46241","46242","46243","46244","46245","46246","46247","46248","46249","46250","46251","46252","46253","46254","46255","46256","46257","46258","46259","46260","46261","46262","46263","46264","46265","46266","46267","46268","46269","46270","46271","46272","46273","46274","46275","46276","46277","46278","46279","46280","46281","46282","46283","46284","46285","46286","46287","46288","46289","46290","46291","46292","46293","46294","46295","46296","46297","46298","46299","46300","46301","46302","46303","46304","46305","46306","46307","46308","46309","46310","46311","46312","46313","46314","46315","46316","46317","46318","46319","46320","46321","46322","46323","46324","46325","46326","46327","46328","46329","46330","46331","46332","46333","46334","46335","46336","46337","46338","46339","46340","46341","46342","46343","46344","46345","46346","46347","46348","46349","46350","46351","46352","46353","46354","46355","46356","46357","46358","46359","46360","46361","46362","46363","46364","46365","46366","46367","46368","46369","46370","46371","46372","46373","46374","46375","46376","46377","46378","46379","46380","46381","46382","46383","46384","46385","46386","46387","46388","46389","46390","46391","46392","46393","46394","46395","46396","46397","46398","46399","46400","46401","46402","46403","46404","46405","46406","46407","46408","46409","46410","46411","46412","46413","46414","46415","46416","46417","46418","46419","46420","46421","46422","46423","46424","46425","46426","46427","46428","46429","46430","46431","46432","46433","46434","46435","46436","46437","46438","46439","46440","46441","46442","46443","46444","46445","46446","46447","46448","46449","46450","46451","46452","46453","46454","46455","46456","46457","46458","46459","46460","46461","46462","46463","46464","46465","46466","46467","46468","46469","46470","46471","46472","46473","46474","46475","46476","46477","46478","46479","46480","46481","46482","46483","46484","46485","46486","46487","46488","46489","46490","46491","46492","46493","46494","46495","46496","46497","46498","46499","46500","46501","46502","46503","46504","46505","46506","46507","46508","46509","46510","46511","46512","46513","46514","46515","46516","46517","46518","46519","46520","46521","46522","46523","46524","46525","46526","46527","46528","46529","46530","46531","46532","46533","46534","46535","46536","46537","46538","46539","46540","46541","46542","46543","46544","46545","46546","46547","46548","46549","46550","46551","46552","46553","46554","46555","46556","46557","46558","46559","46560","46561","46562","46563","46564","46565","46566","46567","46568","46569","46570","46571","46572","46573","46574","46575","46576","46577","46578","46579","46580","46581","46582","46583","46584","46585","46586","46587","46588","46589","46590","46591","46592","46593","46594","46595","46596","46597","46598","46599","46600","46601","46602","46603","46604","46605","46606","46607","46608","46609","46610","46611","46612","46613","46614","46615","46616","46617","46618","46619","46620","46621","46622","46623","46624","46625","46626","46627","46628","46629","46630","46631","46632","46633","46634","46635","46636","46637","46638","46639","46640","46641","46642","46643","46644","46645","46646","46647","46648","46649","46650","46651","46652","46653","46654","46655","46656","46657","46658","46659","46660","46661","46662","46663","46664","46665","46666","46667","46668","46669","46670","46671","46672","46673","46674","46675","46676","46677","46678","46679","46680","46681","46682","46683","46684","46685","46686","46687","46688","46689","46690","46691","46692","46693","46694","46695","46696","46697","46698","46699","46700","46701","46702","46703","46704","46705","46706","46707","46708","46709","46710","46711","46712","46713","46714","46715","46716","46717","46718","46719","46720","46721","46722","46723","46724","46725","46726","46727","46728","46729","46730","46731","46732","46733","46734","46735","46736","46737","46738","46739","46740","46741","46742","46743","46744","46745","46746","46747","46748","46749","46750","46751","46752","46753","46754","46755","46756","46757","46758","46759","46760","46761","46762","46763","46764","46765","46766","46767","46768","46769","46770","46771","46772","46773","46774","46775","46776","46777","46778","46779","46780","46781","46782","46783","46784","46785","46786","46787","46788","46789","46790","46791","46792","46793","46794","46795","46796","46797","46798","46799","46800","46801","46802","46803","46804","46805","46806","46807","46808","46809","46810","46811","46812","46813","46814","46815","46816","46817","46818","46819","46820","46821","46822","46823","46824","46825","46826","46827","46828","46829","46830","46831","46832","46833","46834","46835","46836","46837","46838","46839","46840","46841","46842","46843","46844","46845","46846","46847","46848","46849","46850","46851","46852","46853","46854","46855","46856","46857","46858","46859","46860","46861","46862","46863","46864","46865","46866","46867","46868","46869","46870","46871","46872","46873","46874","46875","46876","46877","46878","46879","46880","46881","46882","46883","46884","46885","46886","46887","46888","46889","46890","46891","46892","46893","46894","46895","46896","46897","46898","46899","46900","46901","46902","46903","46904","46905","46906","46907","46908","46909","46910","46911","46912","46913","46914","46915","46916","46917","46918","46919","46920","46921","46922","46923","46924","46925","46926","46927","46928","46929","46930","46931","46932","46933","46934","46935","46936","46937","46938","46939","46940","46941","46942","46943","46944","46945","46946","46947","46948","46949","46950","46951","46952","46953","46954","46955","46956","46957","46958","46959","46960","46961","46962","46963","46964","46965","46966","46967","46968","46969","46970","46971","46972","46973","46974","46975","46976","46977","46978","46979","46980","46981","46982","46983","46984","46985","46986","46987","46988","46989","46990","46991","46992","46993","46994","46995","46996","46997","46998","46999","47000","47001","47002","47003","47004","47005","47006","47007","47008","47009","47010","47011","47012","47013","47014","47015","47016","47017","47018","47019","47020","47021","47022","47023","47024","47025","47026","47027","47028","47029","47030","47031","47032","47033","47034","47035","47036","47037","47038","47039","47040","47041","47042","47043","47044","47045","47046","47047","47048","47049","47050","47051","47052","47053","47054","47055","47056","47057","47058","47059","47060","47061","47062","47063","47064","47065","47066","47067","47068","47069","47070","47071","47072","47073","47074","47075","47076","47077","47078","47079","47080","47081","47082","47083","47084","47085","47086","47087","47088","47089","47090","47091","47092","47093","47094","47095","47096","47097","47098","47099","47100","47101","47102","47103","47104","47105","47106","47107","47108","47109","47110","47111","47112","47113","47114","47115","47116","47117","47118","47119","47120","47121","47122","47123","47124","47125","47126","47127","47128","47129","47130","47131","47132","47133","47134","47135","47136","47137","47138","47139","47140","47141","47142","47143","47144","47145","47146","47147","47148","47149","47150","47151","47152","47153","47154","47155","47156","47157","47158","47159","47160","47161","47162","47163","47164","47165","47166","47167","47168","47169","47170","47171","47172","47173","47174","47175","47176","47177","47178","47179","47180","47181","47182","47183","47184","47185","47186","47187","47188","47189","47190","47191","47192","47193","47194","47195","47196","47197","47198","47199","47200","47201","47202","47203","47204","47205","47206","47207","47208","47209","47210","47211","47212","47213","47214","47215","47216","47217","47218","47219","47220","47221","47222","47223","47224","47225","47226","47227","47228","47229","47230","47231","47232","47233","47234","47235","47236","47237","47238","47239","47240","47241","47242","47243","47244","47245","47246","47247","47248","47249","47250","47251","47252","47253","47254","47255","47256","47257","47258","47259","47260","47261","47262","47263","47264","47265","47266","47267","47268","47269","47270","47271","47272","47273","47274","47275","47276","47277","47278","47279","47280","47281","47282","47283","47284","47285","47286","47287","47288","47289","47290","47291","47292","47293","47294","47295","47296","47297","47298","47299","47300","47301","47302","47303","47304","47305","47306","47307","47308","47309","47310","47311","47312","47313","47314","47315","47316","47317","47318","47319","47320","47321","47322","47323","47324","47325","47326","47327","47328","47329","47330","47331","47332","47333","47334","47335","47336","47337","47338","47339","47340","47341","47342","47343","47344","47345","47346","47347","47348","47349","47350","47351","47352","47353","47354","47355","47356","47357","47358","47359","47360","47361","47362","47363","47364","47365","47366","47367","47368","47369","47370","47371","47372","47373","47374","47375","47376","47377","47378","47379","47380","47381","47382","47383","47384","47385","47386","47387","47388","47389","47390","47391","47392","47393","47394","47395","47396","47397","47398","47399","47400","47401","47402","47403","47404","47405","47406","47407","47408","47409","47410","47411","47412","47413","47414","47415","47416","47417","47418","47419","47420","47421","47422","47423","47424","47425","47426","47427","47428","47429","47430","47431","47432","47433","47434","47435","47436","47437","47438","47439","47440","47441","47442","47443","47444","47445","47446","47447","47448","47449","47450","47451","47452","47453","47454","47455","47456","47457","47458","47459","47460","47461","47462","47463","47464","47465","47466","47467","47468","47469","47470","47471","47472","47473","47474","47475","47476","47477","47478","47479","47480","47481","47482","47483","47484","47485","47486","47487","47488","47489","47490","47491","47492","47493","47494","47495","47496","47497","47498","47499","47500","47501","47502","47503","47504","47505","47506","47507","47508","47509","47510","47511","47512","47513","47514","47515","47516","47517","47518","47519","47520","47521","47522","47523","47524","47525","47526","47527","47528","47529","47530","47531","47532","47533","47534","47535","47536","47537","47538","47539","47540","47541","47542","47543","47544","47545","47546","47547","47548","47549","47550","47551","47552","47553","47554","47555","47556","47557","47558","47559","47560","47561","47562","47563","47564","47565","47566","47567","47568","47569","47570","47571","47572","47573","47574","47575","47576","47577","47578","47579","47580","47581","47582","47583","47584","47585","47586","47587","47588","47589","47590","47591","47592","47593","47594","47595","47596","47597","47598","47599","47600","47601","47602","47603","47604","47605","47606","47607","47608","47609","47610","47611","47612","47613","47614","47615","47616","47617","47618","47619","47620","47621","47622","47623","47624","47625","47626","47627","47628","47629","47630","47631","47632","47633","47634","47635","47636","47637","47638","47639","47640","47641","47642","47643","47644","47645","47646","47647","47648","47649","47650","47651","47652","47653","47654","47655","47656","47657","47658","47659","47660","47661","47662","47663","47664","47665","47666","47667","47668","47669","47670","47671","47672","47673","47674","47675","47676","47677","47678","47679","47680","47681","47682","47683","47684","47685","47686","47687","47688","47689","47690","47691","47692","47693","47694","47695","47696","47697","47698","47699","47700","47701","47702","47703","47704","47705","47706","47707","47708","47709","47710","47711","47712","47713","47714","47715","47716","47717","47718","47719","47720","47721","47722","47723","47724","47725","47726","47727","47728","47729","47730","47731","47732","47733","47734","47735","47736","47737","47738","47739","47740","47741","47742","47743","47744","47745","47746","47747","47748","47749","47750","47751","47752","47753","47754","47755","47756","47757","47758","47759","47760","47761","47762","47763","47764","47765","47766","47767","47768","47769","47770","47771","47772","47773","47774","47775","47776","47777","47778","47779","47780","47781","47782","47783","47784","47785","47786","47787","47788","47789","47790","47791","47792","47793","47794","47795","47796","47797","47798","47799","47800","47801","47802","47803","47804","47805","47806","47807","47808","47809","47810","47811","47812","47813","47814","47815","47816","47817","47818","47819","47820","47821","47822","47823","47824","47825","47826","47827","47828","47829","47830","47831","47832","47833","47834","47835","47836","47837","47838","47839","47840","47841","47842","47843","47844","47845","47846","47847","47848","47849","47850","47851","47852","47853","47854","47855","47856","47857","47858","47859","47860","47861","47862","47863","47864","47865","47866","47867","47868","47869","47870","47871","47872","47873","47874","47875","47876","47877","47878","47879","47880","47881","47882","47883","47884","47885","47886","47887","47888","47889","47890","47891","47892","47893","47894","47895","47896","47897","47898","47899","47900","47901","47902","47903","47904","47905","47906","47907","47908","47909","47910","47911","47912","47913","47914","47915","47916","47917","47918","47919","47920","47921","47922","47923","47924","47925","47926","47927","47928","47929","47930","47931","47932","47933","47934","47935","47936","47937","47938","47939","47940","47941","47942","47943","47944","47945","47946","47947","47948","47949","47950","47951","47952","47953","47954","47955","47956","47957","47958","47959","47960","47961","47962","47963","47964","47965","47966","47967","47968","47969","47970","47971","47972","47973","47974","47975","47976","47977","47978","47979","47980","47981","47982","47983","47984","47985","47986","47987","47988","47989","47990","47991","47992","47993","47994","47995","47996","47997","47998","47999","48000","48001","48002","48003","48004","48005","48006","48007","48008","48009","48010","48011","48012","48013","48014","48015","48016","48017","48018","48019","48020","48021","48022","48023","48024","48025","48026","48027","48028","48029","48030","48031","48032","48033","48034","48035","48036","48037","48038","48039","48040","48041","48042","48043","48044","48045","48046","48047","48048","48049","48050","48051","48052","48053","48054","48055","48056","48057","48058","48059","48060","48061","48062","48063","48064","48065","48066","48067","48068","48069","48070","48071","48072","48073","48074","48075","48076","48077","48078","48079","48080","48081","48082","48083","48084","48085","48086","48087","48088","48089","48090","48091","48092","48093","48094","48095","48096","48097","48098","48099","48100","48101","48102","48103","48104","48105","48106","48107","48108","48109","48110","48111","48112","48113","48114","48115","48116","48117","48118","48119","48120","48121","48122","48123","48124","48125","48126","48127","48128","48129","48130","48131","48132","48133","48134","48135","48136","48137","48138","48139","48140","48141","48142","48143","48144","48145","48146","48147","48148","48149","48150","48151","48152","48153","48154","48155","48156","48157","48158","48159","48160","48161","48162","48163","48164","48165","48166","48167","48168","48169","48170","48171","48172","48173","48174","48175","48176","48177","48178","48179","48180","48181","48182","48183","48184","48185","48186","48187","48188","48189","48190","48191","48192","48193","48194","48195","48196","48197","48198","48199","48200","48201","48202","48203","48204","48205","48206","48207","48208","48209","48210","48211","48212","48213","48214","48215","48216","48217","48218","48219","48220","48221","48222","48223","48224","48225","48226","48227","48228","48229","48230","48231","48232","48233","48234","48235","48236","48237","48238","48239","48240","48241","48242","48243","48244","48245","48246","48247","48248","48249","48250","48251","48252","48253","48254","48255","48256","48257","48258","48259","48260","48261","48262","48263","48264","48265","48266","48267","48268","48269","48270","48271","48272","48273","48274","48275","48276","48277","48278","48279","48280","48281","48282","48283","48284","48285","48286","48287","48288","48289","48290","48291","48292","48293","48294","48295","48296","48297","48298","48299","48300","48301","48302","48303","48304","48305","48306","48307","48308","48309","48310","48311","48312","48313","48314","48315","48316","48317","48318","48319","48320","48321","48322","48323","48324","48325","48326","48327","48328","48329","48330","48331","48332","48333","48334","48335","48336","48337","48338","48339","48340","48341","48342","48343","48344","48345","48346","48347","48348","48349","48350","48351","48352","48353","48354","48355","48356","48357","48358","48359","48360","48361","48362","48363","48364","48365","48366","48367","48368","48369","48370","48371","48372","48373","48374","48375","48376","48377","48378","48379","48380","48381","48382","48383","48384","48385","48386","48387","48388","48389","48390","48391","48392","48393","48394","48395","48396","48397","48398","48399","48400","48401","48402","48403","48404","48405","48406","48407","48408","48409","48410","48411","48412","48413","48414","48415","48416","48417","48418","48419","48420","48421","48422","48423","48424","48425","48426","48427","48428","48429","48430","48431","48432","48433","48434","48435","48436","48437","48438","48439","48440","48441","48442","48443","48444","48445","48446","48447","48448","48449","48450","48451","48452","48453","48454","48455","48456","48457","48458","48459","48460","48461","48462","48463","48464","48465","48466","48467","48468","48469","48470","48471","48472","48473","48474","48475","48476","48477","48478","48479","48480","48481","48482","48483","48484","48485","48486","48487","48488","48489","48490","48491","48492","48493","48494","48495","48496","48497","48498","48499","48500","48501","48502","48503","48504","48505","48506","48507","48508","48509","48510","48511","48512","48513","48514","48515","48516","48517","48518","48519","48520","48521","48522","48523","48524","48525","48526","48527","48528","48529","48530","48531","48532","48533","48534","48535","48536","48537","48538","48539","48540","48541","48542","48543","48544","48545","48546","48547","48548","48549","48550","48551","48552","48553","48554","48555","48556","48557","48558","48559","48560","48561","48562","48563","48564","48565","48566","48567","48568","48569","48570","48571","48572","48573","48574","48575","48576","48577","48578","48579","48580","48581","48582","48583","48584","48585","48586","48587","48588","48589","48590","48591","48592","48593","48594","48595","48596","48597","48598","48599","48600","48601","48602","48603","48604","48605","48606","48607","48608","48609","48610","48611","48612","48613","48614","48615","48616","48617","48618","48619","48620","48621","48622","48623","48624","48625","48626","48627","48628","48629","48630","48631","48632","48633","48634","48635","48636","48637","48638","48639","48640","48641","48642","48643","48644","48645","48646","48647","48648","48649","48650","48651","48652","48653","48654","48655","48656","48657","48658","48659","48660","48661","48662","48663","48664","48665","48666","48667","48668","48669","48670","48671","48672","48673","48674","48675","48676","48677","48678","48679","48680","48681","48682","48683","48684","48685","48686","48687","48688","48689","48690","48691","48692","48693","48694","48695","48696","48697","48698","48699","48700","48701","48702","48703","48704","48705","48706","48707","48708","48709","48710","48711","48712","48713","48714","48715","48716","48717","48718","48719","48720","48721","48722","48723","48724","48725","48726","48727","48728","48729","48730","48731","48732","48733","48734","48735","48736","48737","48738","48739","48740","48741","48742","48743","48744","48745","48746","48747","48748","48749","48750","48751","48752","48753","48754","48755","48756","48757","48758","48759","48760","48761","48762","48763","48764","48765","48766","48767","48768","48769","48770","48771","48772","48773","48774","48775","48776","48777","48778","48779","48780","48781","48782","48783","48784","48785","48786","48787","48788","48789","48790","48791","48792","48793","48794","48795","48796","48797","48798","48799","48800","48801","48802","48803","48804","48805","48806","48807","48808","48809","48810","48811","48812","48813","48814","48815","48816","48817","48818","48819","48820","48821","48822","48823","48824","48825","48826","48827","48828","48829","48830","48831","48832","48833","48834","48835","48836","48837","48838","48839","48840","48841","48842","48843","48844","48845","48846","48847","48848","48849","48850","48851","48852","48853","48854","48855","48856","48857","48858","48859","48860","48861","48862","48863","48864","48865","48866","48867","48868","48869","48870","48871","48872","48873","48874","48875","48876","48877","48878","48879","48880","48881","48882","48883","48884","48885","48886","48887","48888","48889","48890","48891","48892","48893","48894","48895","48896","48897","48898","48899","48900","48901","48902","48903","48904","48905","48906","48907","48908","48909","48910","48911","48912","48913","48914","48915","48916","48917","48918","48919","48920","48921","48922","48923","48924","48925","48926","48927","48928","48929","48930","48931","48932","48933","48934","48935","48936","48937","48938","48939","48940","48941","48942","48943","48944","48945","48946","48947","48948","48949","48950","48951","48952","48953","48954","48955","48956","48957","48958","48959","48960","48961","48962","48963","48964","48965","48966","48967","48968","48969","48970","48971","48972","48973","48974","48975","48976","48977","48978","48979","48980","48981","48982","48983","48984","48985","48986","48987","48988","48989","48990","48991","48992","48993","48994","48995","48996","48997","48998","48999","49000","49001","49002","49003","49004","49005","49006","49007","49008","49009","49010","49011","49012","49013","49014","49015","49016","49017","49018","49019","49020","49021","49022","49023","49024","49025","49026","49027","49028","49029","49030","49031","49032","49033","49034","49035","49036","49037","49038","49039","49040","49041","49042","49043","49044","49045","49046","49047","49048","49049","49050","49051","49052","49053","49054","49055","49056","49057","49058","49059","49060","49061","49062","49063","49064","49065","49066","49067","49068","49069","49070","49071","49072","49073","49074","49075","49076","49077","49078","49079","49080","49081","49082","49083","49084","49085","49086","49087","49088","49089","49090","49091","49092","49093","49094","49095","49096","49097","49098","49099","49100","49101","49102","49103","49104","49105","49106","49107","49108","49109","49110","49111","49112","49113","49114","49115","49116","49117","49118","49119","49120","49121","49122","49123","49124","49125","49126","49127","49128","49129","49130","49131","49132","49133","49134","49135","49136","49137","49138","49139","49140","49141","49142","49143","49144","49145","49146","49147","49148","49149","49150","49151","49152","49153","49154","49155","49156","49157","49158","49159","49160","49161","49162","49163","49164","49165","49166","49167","49168","49169","49170","49171","49172","49173","49174","49175","49176","49177","49178","49179","49180","49181","49182","49183","49184","49185","49186","49187","49188","49189","49190","49191","49192","49193","49194","49195","49196","49197","49198","49199","49200","49201","49202","49203","49204","49205","49206","49207","49208","49209","49210","49211","49212","49213","49214","49215","49216","49217","49218","49219","49220","49221","49222","49223","49224","49225","49226","49227","49228","49229","49230","49231","49232","49233","49234","49235","49236","49237","49238","49239","49240","49241","49242","49243","49244","49245","49246","49247","49248","49249","49250","49251","49252","49253","49254","49255","49256","49257","49258","49259","49260","49261","49262","49263","49264","49265","49266","49267","49268","49269","49270","49271","49272","49273","49274","49275","49276","49277","49278","49279","49280","49281","49282","49283","49284","49285","49286","49287","49288","49289","49290","49291","49292","49293","49294","49295","49296","49297","49298","49299","49300","49301","49302","49303","49304","49305","49306","49307","49308","49309","49310","49311","49312","49313","49314","49315","49316","49317","49318","49319","49320","49321","49322","49323","49324","49325","49326","49327","49328","49329","49330","49331","49332","49333","49334","49335","49336","49337","49338","49339","49340","49341","49342","49343","49344","49345","49346","49347","49348","49349","49350","49351","49352","49353","49354","49355","49356","49357","49358","49359","49360","49361","49362","49363","49364","49365","49366","49367","49368","49369","49370","49371","49372","49373","49374","49375","49376","49377","49378","49379","49380","49381","49382","49383","49384","49385","49386","49387","49388","49389","49390","49391","49392","49393","49394","49395","49396","49397","49398","49399","49400","49401","49402","49403","49404","49405","49406","49407","49408","49409","49410","49411","49412","49413","49414","49415","49416","49417","49418","49419","49420","49421","49422","49423","49424","49425","49426","49427","49428","49429","49430","49431","49432","49433","49434","49435","49436","49437","49438","49439","49440","49441","49442","49443","49444","49445","49446","49447","49448","49449","49450","49451","49452","49453","49454","49455","49456","49457","49458","49459","49460","49461","49462","49463","49464","49465","49466","49467","49468","49469","49470","49471","49472","49473","49474","49475","49476","49477","49478","49479","49480","49481","49482","49483","49484","49485","49486","49487","49488","49489","49490","49491","49492","49493","49494","49495","49496","49497","49498","49499","49500","49501","49502","49503","49504","49505","49506","49507","49508","49509","49510","49511","49512","49513","49514","49515","49516","49517","49518","49519","49520","49521","49522","49523","49524","49525","49526","49527","49528","49529","49530","49531","49532","49533","49534","49535","49536","49537","49538","49539","49540","49541","49542","49543","49544","49545","49546","49547","49548","49549","49550","49551","49552","49553","49554","49555","49556","49557","49558","49559","49560","49561","49562","49563","49564","49565","49566","49567","49568","49569","49570","49571","49572","49573","49574","49575","49576","49577","49578","49579","49580","49581","49582","49583","49584","49585","49586","49587","49588","49589","49590","49591","49592","49593","49594","49595","49596","49597","49598","49599","49600","49601","49602","49603","49604","49605","49606","49607","49608","49609","49610","49611","49612","49613","49614","49615","49616","49617","49618","49619","49620","49621","49622","49623","49624","49625","49626","49627","49628","49629","49630","49631","49632","49633","49634","49635","49636","49637","49638","49639","49640","49641","49642","49643","49644","49645","49646","49647","49648","49649","49650","49651","49652","49653","49654","49655","49656","49657","49658","49659","49660","49661","49662","49663","49664","49665","49666","49667","49668","49669","49670","49671","49672","49673","49674","49675","49676","49677","49678","49679","49680","49681","49682","49683","49684","49685","49686","49687","49688","49689","49690","49691","49692","49693","49694","49695","49696","49697","49698","49699","49700","49701","49702","49703","49704","49705","49706","49707","49708","49709","49710","49711","49712","49713","49714","49715","49716","49717","49718","49719","49720","49721","49722","49723","49724","49725","49726","49727","49728","49729","49730","49731","49732","49733","49734","49735","49736","49737","49738","49739","49740","49741","49742","49743","49744","49745","49746","49747","49748","49749","49750","49751","49752","49753","49754","49755","49756","49757","49758","49759","49760","49761","49762","49763","49764","49765","49766","49767","49768","49769","49770","49771","49772","49773","49774","49775","49776","49777","49778","49779","49780","49781","49782","49783","49784","49785","49786","49787","49788","49789","49790","49791","49792","49793","49794","49795","49796","49797","49798","49799","49800","49801","49802","49803","49804","49805","49806","49807","49808","49809","49810","49811","49812","49813","49814","49815","49816","49817","49818","49819","49820","49821","49822","49823","49824","49825","49826","49827","49828","49829","49830","49831","49832","49833","49834","49835","49836","49837","49838","49839","49840","49841","49842","49843","49844","49845","49846","49847","49848","49849","49850","49851","49852","49853","49854","49855","49856","49857","49858","49859","49860","49861","49862","49863","49864","49865","49866","49867","49868","49869","49870","49871","49872","49873","49874","49875","49876","49877","49878","49879","49880","49881","49882","49883","49884","49885","49886","49887","49888","49889","49890","49891","49892","49893","49894","49895","49896","49897","49898","49899","49900","49901","49902","49903","49904","49905","49906","49907","49908","49909","49910","49911","49912","49913","49914","49915","49916","49917","49918","49919","49920","49921","49922","49923","49924","49925","49926","49927","49928","49929","49930","49931","49932","49933","49934","49935","49936","49937","49938","49939","49940","49941","49942","49943","49944","49945","49946","49947","49948","49949","49950","49951","49952","49953","49954","49955","49956","49957","49958","49959","49960","49961","49962","49963","49964","49965","49966","49967","49968","49969","49970","49971","49972","49973","49974","49975","49976","49977","49978","49979","49980","49981","49982","49983","49984","49985","49986","49987","49988","49989","49990","49991","49992","49993","49994","49995","49996","49997","49998","49999","50000","50001","50002","50003","50004","50005","50006","50007","50008","50009","50010","50011","50012","50013","50014","50015","50016","50017","50018","50019","50020","50021","50022","50023","50024","50025","50026","50027","50028","50029","50030","50031","50032","50033","50034","50035","50036","50037","50038","50039","50040","50041","50042","50043","50044","50045","50046","50047","50048","50049","50050","50051","50052","50053","50054","50055","50056","50057","50058","50059","50060","50061","50062","50063","50064","50065","50066","50067","50068","50069","50070","50071","50072","50073","50074","50075","50076","50077","50078","50079","50080","50081","50082","50083","50084","50085","50086","50087","50088","50089","50090","50091","50092","50093","50094","50095","50096","50097","50098","50099","50100","50101","50102","50103","50104","50105","50106","50107","50108","50109","50110","50111","50112","50113","50114","50115","50116","50117","50118","50119","50120","50121","50122","50123","50124","50125","50126","50127","50128","50129","50130","50131","50132","50133","50134","50135","50136","50137","50138","50139","50140","50141","50142","50143","50144","50145","50146","50147","50148","50149","50150","50151","50152","50153","50154","50155","50156","50157","50158","50159","50160","50161","50162","50163","50164","50165","50166","50167","50168","50169","50170","50171","50172","50173","50174","50175","50176","50177","50178","50179","50180","50181","50182","50183","50184","50185","50186","50187","50188","50189","50190","50191","50192","50193","50194","50195","50196","50197","50198","50199","50200","50201","50202","50203","50204","50205","50206","50207","50208","50209","50210","50211","50212","50213","50214","50215","50216","50217","50218","50219","50220","50221","50222","50223","50224","50225","50226","50227","50228","50229","50230","50231","50232","50233","50234","50235","50236","50237","50238","50239","50240","50241","50242","50243","50244","50245","50246","50247","50248","50249","50250","50251","50252","50253","50254","50255","50256","50257","50258","50259","50260","50261","50262","50263","50264","50265","50266","50267","50268","50269","50270","50271","50272","50273","50274","50275","50276","50277","50278","50279","50280","50281","50282","50283","50284","50285","50286","50287","50288","50289","50290","50291","50292","50293","50294","50295","50296","50297","50298","50299","50300","50301","50302","50303","50304","50305","50306","50307","50308","50309","50310","50311","50312","50313","50314","50315","50316","50317","50318","50319","50320","50321","50322","50323","50324","50325","50326","50327","50328","50329","50330","50331","50332","50333","50334","50335","50336","50337","50338","50339","50340","50341","50342","50343","50344","50345","50346","50347","50348","50349","50350","50351","50352","50353","50354","50355","50356","50357","50358","50359","50360","50361","50362","50363","50364","50365","50366","50367","50368","50369","50370","50371","50372","50373","50374","50375","50376","50377","50378","50379","50380","50381","50382","50383","50384","50385","50386","50387","50388","50389","50390","50391","50392","50393","50394","50395","50396","50397","50398","50399","50400","50401","50402","50403","50404","50405","50406","50407","50408","50409","50410","50411","50412","50413","50414","50415","50416","50417","50418","50419","50420","50421","50422","50423","50424","50425","50426","50427","50428","50429","50430","50431","50432","50433","50434","50435","50436","50437","50438","50439","50440","50441","50442","50443","50444","50445","50446","50447","50448","50449","50450","50451","50452","50453","50454","50455","50456","50457","50458","50459","50460","50461","50462","50463","50464","50465","50466","50467","50468","50469","50470","50471","50472","50473","50474","50475","50476","50477","50478","50479","50480","50481","50482","50483","50484","50485","50486","50487","50488","50489","50490","50491","50492","50493","50494","50495","50496","50497","50498","50499","50500","50501","50502","50503","50504","50505","50506","50507","50508","50509","50510","50511","50512","50513","50514","50515","50516","50517","50518","50519","50520","50521","50522","50523","50524","50525","50526","50527","50528","50529","50530","50531","50532","50533","50534","50535","50536","50537","50538","50539","50540","50541","50542","50543","50544","50545","50546","50547","50548","50549","50550","50551","50552","50553","50554","50555","50556","50557","50558","50559","50560","50561","50562","50563","50564","50565","50566","50567","50568","50569","50570","50571","50572","50573","50574","50575","50576","50577","50578","50579","50580","50581","50582","50583","50584","50585","50586","50587","50588","50589","50590","50591","50592","50593","50594","50595","50596","50597","50598","50599","50600","50601","50602","50603","50604","50605","50606","50607","50608","50609","50610","50611","50612","50613","50614","50615","50616","50617","50618","50619","50620","50621","50622","50623","50624","50625","50626","50627","50628","50629","50630","50631","50632","50633","50634","50635","50636","50637","50638","50639","50640","50641","50642","50643","50644","50645","50646","50647","50648","50649","50650","50651","50652","50653","50654","50655","50656","50657","50658","50659","50660","50661","50662","50663","50664","50665","50666","50667","50668","50669","50670","50671","50672","50673","50674","50675","50676","50677","50678","50679","50680","50681","50682","50683","50684","50685","50686","50687","50688","50689","50690","50691","50692","50693","50694","50695","50696","50697","50698","50699","50700","50701","50702","50703","50704","50705","50706","50707","50708","50709","50710","50711","50712","50713","50714","50715","50716","50717","50718","50719","50720","50721","50722","50723","50724","50725","50726","50727","50728","50729","50730","50731","50732","50733","50734","50735","50736","50737","50738","50739","50740","50741","50742","50743","50744","50745","50746","50747","50748","50749","50750","50751","50752","50753","50754","50755","50756","50757","50758","50759","50760","50761","50762","50763","50764","50765","50766","50767","50768","50769","50770","50771","50772","50773","50774","50775","50776","50777","50778","50779","50780","50781","50782","50783","50784","50785","50786","50787","50788","50789","50790","50791","50792","50793","50794","50795","50796","50797","50798","50799","50800","50801","50802","50803","50804","50805","50806","50807","50808","50809","50810","50811","50812","50813","50814","50815","50816","50817","50818","50819","50820","50821","50822","50823","50824","50825","50826","50827","50828","50829","50830","50831","50832","50833","50834","50835","50836","50837","50838","50839","50840","50841","50842","50843","50844","50845","50846","50847","50848","50849","50850","50851","50852","50853","50854","50855","50856","50857","50858","50859","50860","50861","50862","50863","50864","50865","50866","50867","50868","50869","50870","50871","50872","50873","50874","50875","50876","50877","50878","50879","50880","50881","50882","50883","50884","50885","50886","50887","50888","50889","50890","50891","50892","50893","50894","50895","50896","50897","50898","50899","50900","50901","50902","50903","50904","50905","50906","50907","50908","50909","50910","50911","50912","50913","50914","50915","50916","50917","50918","50919","50920","50921","50922","50923","50924","50925","50926","50927","50928","50929","50930","50931","50932","50933","50934","50935","50936","50937","50938","50939","50940","50941","50942","50943","50944","50945","50946","50947","50948","50949","50950","50951","50952","50953","50954","50955","50956","50957","50958","50959","50960","50961","50962","50963","50964","50965","50966","50967","50968","50969","50970","50971","50972","50973","50974","50975","50976","50977","50978","50979","50980","50981","50982","50983","50984","50985","50986","50987","50988","50989","50990","50991","50992","50993","50994","50995","50996","50997","50998","50999","51000","51001","51002","51003","51004","51005","51006","51007","51008","51009","51010","51011","51012","51013","51014","51015","51016","51017","51018","51019","51020","51021","51022","51023","51024","51025","51026","51027","51028","51029","51030","51031","51032","51033","51034","51035","51036","51037","51038","51039","51040","51041","51042","51043","51044","51045","51046","51047","51048","51049","51050","51051","51052","51053","51054","51055","51056","51057","51058","51059","51060","51061","51062","51063","51064","51065","51066","51067","51068","51069","51070","51071","51072","51073","51074","51075","51076","51077","51078","51079","51080","51081","51082","51083","51084","51085","51086","51087","51088","51089","51090","51091","51092","51093","51094","51095","51096","51097","51098","51099","51100","51101","51102","51103","51104","51105","51106","51107","51108","51109","51110","51111","51112","51113","51114","51115","51116","51117","51118","51119","51120","51121","51122","51123","51124","51125","51126","51127","51128","51129","51130","51131","51132","51133","51134","51135","51136","51137","51138","51139","51140","51141","51142","51143","51144","51145","51146","51147","51148","51149","51150","51151","51152","51153","51154","51155","51156","51157","51158","51159","51160","51161","51162","51163","51164","51165","51166","51167","51168","51169","51170","51171","51172","51173","51174","51175","51176","51177","51178","51179","51180","51181","51182","51183","51184","51185","51186","51187","51188","51189","51190","51191","51192","51193","51194","51195","51196","51197","51198","51199","51200","51201","51202","51203","51204","51205","51206","51207","51208","51209","51210","51211","51212","51213","51214","51215","51216","51217","51218","51219","51220","51221","51222","51223","51224","51225","51226","51227","51228","51229","51230","51231","51232","51233","51234","51235","51236","51237","51238","51239","51240","51241","51242","51243","51244","51245","51246","51247","51248","51249","51250","51251","51252","51253","51254","51255","51256","51257","51258","51259","51260","51261","51262","51263","51264","51265","51266","51267","51268","51269","51270","51271","51272","51273","51274","51275","51276","51277","51278","51279","51280","51281","51282","51283","51284","51285","51286","51287","51288","51289","51290","51291","51292","51293","51294","51295","51296","51297","51298","51299","51300","51301","51302","51303","51304","51305","51306","51307","51308","51309","51310","51311","51312","51313","51314","51315","51316","51317","51318","51319","51320","51321","51322","51323","51324","51325","51326","51327","51328","51329","51330","51331","51332","51333","51334","51335","51336","51337","51338","51339","51340","51341","51342","51343","51344","51345","51346","51347","51348","51349","51350","51351","51352","51353","51354","51355","51356","51357","51358","51359","51360","51361","51362","51363","51364","51365","51366","51367","51368","51369","51370","51371","51372","51373","51374","51375","51376","51377","51378","51379","51380","51381","51382","51383","51384","51385","51386","51387","51388","51389","51390","51391","51392","51393","51394","51395","51396","51397","51398","51399","51400","51401","51402","51403","51404","51405","51406","51407","51408","51409","51410","51411","51412","51413","51414","51415","51416","51417","51418","51419","51420","51421","51422","51423","51424","51425","51426","51427","51428","51429","51430","51431","51432","51433","51434","51435","51436","51437","51438","51439","51440","51441","51442","51443","51444","51445","51446","51447","51448","51449","51450","51451","51452","51453","51454","51455","51456","51457","51458","51459","51460","51461","51462","51463","51464","51465","51466","51467","51468","51469","51470","51471","51472","51473","51474","51475","51476","51477","51478","51479","51480","51481","51482","51483","51484","51485","51486","51487","51488","51489","51490","51491","51492","51493","51494","51495","51496","51497","51498","51499","51500","51501","51502","51503","51504","51505","51506","51507","51508","51509","51510","51511","51512","51513","51514","51515","51516","51517","51518","51519","51520","51521","51522","51523","51524","51525","51526","51527","51528","51529","51530","51531","51532","51533","51534","51535","51536","51537","51538","51539","51540","51541","51542","51543","51544","51545","51546","51547","51548","51549","51550","51551","51552","51553","51554","51555","51556","51557","51558","51559","51560","51561","51562","51563","51564","51565","51566","51567","51568","51569","51570","51571","51572","51573","51574","51575","51576","51577","51578","51579","51580","51581","51582","51583","51584","51585","51586","51587","51588","51589","51590","51591","51592","51593","51594","51595","51596","51597","51598","51599","51600","51601","51602","51603","51604","51605","51606","51607","51608","51609","51610","51611","51612","51613","51614","51615","51616","51617","51618","51619","51620","51621","51622","51623","51624","51625","51626","51627","51628","51629","51630","51631","51632","51633","51634","51635","51636","51637","51638","51639","51640","51641","51642","51643","51644","51645","51646","51647","51648","51649","51650","51651","51652","51653","51654","51655","51656","51657","51658","51659","51660","51661","51662","51663","51664","51665","51666","51667","51668","51669","51670","51671","51672","51673","51674","51675","51676","51677","51678","51679","51680","51681","51682","51683","51684","51685","51686","51687","51688","51689","51690","51691","51692","51693","51694","51695","51696","51697","51698","51699","51700","51701","51702","51703","51704","51705","51706","51707","51708","51709","51710","51711","51712","51713","51714","51715","51716","51717","51718","51719","51720","51721","51722","51723","51724","51725","51726","51727","51728","51729","51730","51731","51732","51733","51734","51735","51736","51737","51738","51739","51740","51741","51742","51743","51744","51745","51746","51747","51748","51749","51750","51751","51752","51753","51754","51755","51756","51757","51758","51759","51760","51761","51762","51763","51764","51765","51766","51767","51768","51769","51770","51771","51772","51773","51774","51775","51776","51777","51778","51779","51780","51781","51782","51783","51784","51785","51786","51787","51788","51789","51790","51791","51792","51793","51794","51795","51796","51797","51798","51799","51800","51801","51802","51803","51804","51805","51806","51807","51808","51809","51810","51811","51812","51813","51814","51815","51816","51817","51818","51819","51820","51821","51822","51823","51824","51825","51826","51827","51828","51829","51830","51831","51832","51833","51834","51835","51836","51837","51838","51839","51840","51841","51842","51843","51844","51845","51846","51847","51848","51849","51850","51851","51852","51853","51854","51855","51856","51857","51858","51859","51860","51861","51862","51863","51864","51865","51866","51867","51868","51869","51870","51871","51872","51873","51874","51875","51876","51877","51878","51879","51880","51881","51882","51883","51884","51885","51886","51887","51888","51889","51890","51891","51892","51893","51894","51895","51896","51897","51898","51899","51900","51901","51902","51903","51904","51905","51906","51907","51908","51909","51910","51911","51912","51913","51914","51915","51916","51917","51918","51919","51920","51921","51922","51923","51924","51925","51926","51927","51928","51929","51930","51931","51932","51933","51934","51935","51936","51937","51938","51939","51940","51941","51942","51943","51944","51945","51946","51947","51948","51949","51950","51951","51952","51953","51954","51955","51956","51957","51958","51959","51960","51961","51962","51963","51964","51965","51966","51967","51968","51969","51970","51971","51972","51973","51974","51975","51976","51977","51978","51979","51980","51981","51982","51983","51984","51985","51986","51987","51988","51989","51990","51991","51992","51993","51994","51995","51996","51997","51998","51999","52000","52001","52002","52003","52004","52005","52006","52007","52008","52009","52010","52011","52012","52013","52014","52015","52016","52017","52018","52019","52020","52021","52022","52023","52024","52025","52026","52027","52028","52029","52030","52031","52032","52033","52034","52035","52036","52037","52038","52039","52040","52041","52042","52043","52044","52045","52046","52047","52048","52049","52050","52051","52052","52053","52054","52055","52056","52057","52058","52059","52060","52061","52062","52063","52064","52065","52066","52067","52068","52069","52070","52071","52072","52073","52074","52075","52076","52077","52078","52079","52080","52081","52082","52083","52084","52085","52086","52087","52088","52089","52090","52091","52092","52093","52094","52095","52096","52097","52098","52099","52100","52101","52102","52103","52104","52105","52106","52107","52108","52109","52110","52111","52112","52113","52114","52115","52116","52117","52118","52119","52120","52121","52122","52123","52124","52125","52126","52127","52128","52129","52130","52131","52132","52133","52134","52135","52136","52137","52138","52139","52140","52141","52142","52143","52144","52145","52146","52147","52148","52149","52150","52151","52152","52153","52154","52155","52156","52157","52158","52159","52160","52161","52162","52163","52164","52165","52166","52167","52168","52169","52170","52171","52172","52173","52174","52175","52176","52177","52178","52179","52180","52181","52182","52183","52184","52185","52186","52187","52188","52189","52190","52191","52192","52193","52194","52195","52196","52197","52198","52199","52200","52201","52202","52203","52204","52205","52206","52207","52208","52209","52210","52211","52212","52213","52214","52215","52216","52217","52218","52219","52220","52221","52222","52223","52224","52225","52226","52227","52228","52229","52230","52231","52232","52233","52234","52235","52236","52237","52238","52239","52240","52241","52242","52243","52244","52245","52246","52247","52248","52249","52250","52251","52252","52253","52254","52255","52256","52257","52258","52259","52260","52261","52262","52263","52264","52265","52266","52267","52268","52269","52270","52271","52272","52273","52274","52275","52276","52277","52278","52279","52280","52281","52282","52283","52284","52285","52286","52287","52288","52289","52290","52291","52292","52293","52294","52295","52296","52297","52298","52299","52300","52301","52302","52303","52304","52305","52306","52307","52308","52309","52310","52311","52312","52313","52314","52315","52316","52317","52318","52319","52320","52321","52322","52323","52324","52325","52326","52327","52328","52329","52330","52331","52332","52333","52334","52335","52336","52337","52338","52339","52340","52341","52342","52343","52344","52345","52346","52347","52348","52349","52350","52351","52352","52353","52354","52355","52356","52357","52358","52359","52360","52361","52362","52363","52364","52365","52366","52367","52368","52369","52370","52371","52372","52373","52374","52375","52376","52377","52378","52379","52380","52381","52382","52383","52384","52385","52386","52387","52388","52389","52390","52391","52392","52393","52394","52395","52396","52397","52398","52399","52400","52401","52402","52403","52404","52405","52406","52407","52408","52409","52410","52411","52412","52413","52414","52415","52416","52417","52418","52419","52420","52421","52422","52423","52424","52425","52426","52427","52428","52429","52430","52431","52432","52433","52434","52435","52436","52437","52438","52439","52440","52441","52442","52443","52444","52445","52446","52447","52448","52449","52450","52451","52452","52453","52454","52455","52456","52457","52458","52459","52460","52461","52462","52463","52464","52465","52466","52467","52468","52469","52470","52471","52472","52473","52474","52475","52476","52477","52478","52479","52480","52481","52482","52483","52484","52485","52486","52487","52488","52489","52490","52491","52492","52493","52494","52495","52496","52497","52498","52499","52500","52501","52502","52503","52504","52505","52506","52507","52508","52509","52510","52511","52512","52513","52514","52515","52516","52517","52518","52519","52520","52521","52522","52523","52524","52525","52526","52527","52528","52529","52530","52531","52532","52533","52534","52535","52536","52537","52538","52539","52540","52541","52542","52543","52544","52545","52546","52547","52548","52549","52550","52551","52552","52553","52554","52555","52556","52557","52558","52559","52560","52561","52562","52563","52564","52565","52566","52567","52568","52569","52570","52571","52572","52573","52574","52575","52576","52577","52578","52579","52580","52581","52582","52583","52584","52585","52586","52587","52588","52589","52590","52591","52592","52593","52594","52595","52596","52597","52598","52599","52600","52601","52602","52603","52604","52605","52606","52607","52608","52609","52610","52611","52612","52613","52614","52615","52616","52617","52618","52619","52620","52621","52622","52623","52624","52625","52626","52627","52628","52629","52630","52631","52632","52633","52634","52635","52636","52637","52638","52639","52640","52641","52642","52643","52644","52645","52646","52647","52648","52649","52650","52651","52652","52653","52654","52655","52656","52657","52658","52659","52660","52661","52662","52663","52664","52665","52666","52667","52668","52669","52670","52671","52672","52673","52674","52675","52676","52677","52678","52679","52680","52681","52682","52683","52684","52685","52686","52687","52688","52689","52690","52691","52692","52693","52694","52695","52696","52697","52698","52699","52700","52701","52702","52703","52704","52705","52706","52707","52708","52709","52710","52711","52712","52713","52714","52715","52716","52717","52718","52719","52720","52721","52722","52723","52724","52725","52726","52727","52728","52729","52730","52731","52732","52733","52734","52735","52736","52737","52738","52739","52740","52741","52742","52743","52744","52745","52746","52747","52748","52749","52750","52751","52752","52753","52754","52755","52756","52757","52758","52759","52760","52761","52762","52763","52764","52765","52766","52767","52768","52769","52770","52771","52772","52773","52774","52775","52776","52777","52778","52779","52780","52781","52782","52783","52784","52785","52786","52787","52788","52789","52790","52791","52792","52793","52794","52795","52796","52797","52798","52799","52800","52801","52802","52803","52804","52805","52806","52807","52808","52809","52810","52811","52812","52813","52814","52815","52816","52817","52818","52819","52820","52821","52822","52823","52824","52825","52826","52827","52828","52829","52830","52831","52832","52833","52834","52835","52836","52837","52838","52839","52840","52841","52842","52843","52844","52845","52846","52847","52848","52849","52850","52851","52852","52853","52854","52855","52856","52857","52858","52859","52860","52861","52862","52863","52864","52865","52866","52867","52868","52869","52870","52871","52872","52873","52874","52875","52876","52877","52878","52879","52880","52881","52882","52883","52884","52885","52886","52887","52888","52889","52890","52891","52892","52893","52894","52895","52896","52897","52898","52899","52900","52901","52902","52903","52904","52905","52906","52907","52908","52909","52910","52911","52912","52913","52914","52915","52916","52917","52918","52919","52920","52921","52922","52923","52924","52925","52926","52927","52928","52929","52930","52931","52932","52933","52934","52935","52936","52937","52938","52939","52940","52941","52942","52943","52944","52945","52946","52947","52948","52949","52950","52951","52952","52953","52954","52955","52956","52957","52958","52959","52960","52961","52962","52963","52964","52965","52966","52967","52968","52969","52970","52971","52972","52973","52974","52975","52976","52977","52978","52979","52980","52981","52982","52983","52984","52985","52986","52987","52988","52989","52990","52991","52992","52993","52994","52995","52996","52997","52998","52999","53000","53001","53002","53003","53004","53005","53006","53007","53008","53009","53010","53011","53012","53013","53014","53015","53016","53017","53018","53019","53020","53021","53022","53023","53024","53025","53026","53027","53028","53029","53030","53031","53032","53033","53034","53035","53036","53037","53038","53039","53040","53041","53042","53043","53044","53045","53046","53047","53048","53049","53050","53051","53052","53053","53054","53055","53056","53057","53058","53059","53060","53061","53062","53063","53064","53065","53066","53067","53068","53069","53070","53071","53072","53073","53074","53075","53076","53077","53078","53079","53080","53081","53082","53083","53084","53085","53086","53087","53088","53089","53090","53091","53092","53093","53094","53095","53096","53097","53098","53099","53100","53101","53102","53103","53104","53105","53106","53107","53108","53109","53110","53111","53112","53113","53114","53115","53116","53117","53118","53119","53120","53121","53122","53123","53124","53125","53126","53127","53128","53129","53130","53131","53132","53133","53134","53135","53136","53137","53138","53139","53140","53141","53142","53143","53144","53145","53146","53147","53148","53149","53150","53151","53152","53153","53154","53155","53156","53157","53158","53159","53160","53161","53162","53163","53164","53165","53166","53167","53168","53169","53170","53171","53172","53173","53174","53175","53176","53177","53178","53179","53180","53181","53182","53183","53184","53185","53186","53187","53188","53189","53190","53191","53192","53193","53194","53195","53196","53197","53198","53199","53200","53201","53202","53203","53204","53205","53206","53207","53208","53209","53210","53211","53212","53213","53214","53215","53216","53217","53218","53219","53220","53221","53222","53223","53224","53225","53226","53227","53228","53229","53230","53231","53232","53233","53234","53235","53236","53237","53238","53239","53240","53241","53242","53243","53244","53245","53246","53247","53248","53249","53250","53251","53252","53253","53254","53255","53256","53257","53258","53259","53260","53261","53262","53263","53264","53265","53266","53267","53268","53269","53270","53271","53272","53273","53274","53275","53276","53277","53278","53279","53280","53281","53282","53283","53284","53285","53286","53287","53288","53289","53290","53291","53292","53293","53294","53295","53296","53297","53298","53299","53300","53301","53302","53303","53304","53305","53306","53307","53308","53309","53310","53311","53312","53313","53314","53315","53316","53317","53318","53319","53320","53321","53322","53323","53324","53325","53326","53327","53328","53329","53330","53331","53332","53333","53334","53335","53336","53337","53338","53339","53340","53341","53342","53343","53344","53345","53346","53347","53348","53349","53350","53351","53352","53353","53354","53355","53356","53357","53358","53359","53360","53361","53362","53363","53364","53365","53366","53367","53368","53369","53370","53371","53372","53373","53374","53375","53376","53377","53378","53379","53380","53381","53382","53383","53384","53385","53386","53387","53388","53389","53390","53391","53392","53393","53394","53395","53396","53397","53398","53399","53400","53401","53402","53403","53404","53405","53406","53407","53408","53409","53410","53411","53412","53413","53414","53415","53416","53417","53418","53419","53420","53421","53422","53423","53424","53425","53426","53427","53428","53429","53430","53431","53432","53433","53434","53435","53436","53437","53438","53439","53440","53441","53442","53443","53444","53445","53446","53447","53448","53449","53450","53451","53452","53453","53454","53455","53456","53457","53458","53459","53460","53461","53462","53463","53464","53465","53466","53467","53468","53469","53470","53471","53472","53473","53474","53475","53476","53477","53478","53479","53480","53481","53482","53483","53484","53485","53486","53487","53488","53489","53490","53491","53492","53493","53494","53495","53496","53497","53498","53499","53500","53501","53502","53503","53504","53505","53506","53507","53508","53509","53510","53511","53512","53513","53514","53515","53516","53517","53518","53519","53520","53521","53522","53523","53524","53525","53526","53527","53528","53529","53530","53531","53532","53533","53534","53535","53536","53537","53538","53539","53540","53541","53542","53543","53544","53545","53546","53547","53548","53549","53550","53551","53552","53553","53554","53555","53556","53557","53558","53559","53560","53561","53562","53563","53564","53565","53566","53567","53568","53569","53570","53571","53572","53573","53574","53575","53576","53577","53578","53579","53580","53581","53582","53583","53584","53585","53586","53587","53588","53589","53590","53591","53592","53593","53594","53595","53596","53597","53598","53599","53600","53601","53602","53603","53604","53605","53606","53607","53608","53609","53610","53611","53612","53613","53614","53615","53616","53617","53618","53619","53620","53621","53622","53623","53624","53625","53626","53627","53628","53629","53630","53631","53632","53633","53634","53635","53636","53637","53638","53639","53640","53641","53642","53643","53644","53645","53646","53647","53648","53649","53650","53651","53652","53653","53654","53655","53656","53657","53658","53659","53660","53661","53662","53663","53664","53665","53666","53667","53668","53669","53670","53671","53672","53673","53674","53675","53676","53677","53678","53679","53680","53681","53682","53683","53684","53685","53686","53687","53688","53689","53690","53691","53692","53693","53694","53695","53696","53697","53698","53699","53700","53701","53702","53703","53704","53705","53706","53707","53708","53709","53710","53711","53712","53713","53714","53715","53716","53717","53718","53719","53720","53721","53722","53723","53724","53725","53726","53727","53728","53729","53730","53731","53732","53733","53734","53735","53736","53737","53738","53739","53740","53741","53742","53743","53744","53745","53746","53747","53748","53749","53750","53751","53752","53753","53754","53755","53756","53757","53758","53759","53760","53761","53762","53763","53764","53765","53766","53767","53768","53769","53770","53771","53772","53773","53774","53775","53776","53777","53778","53779","53780","53781","53782","53783","53784","53785","53786","53787","53788","53789","53790","53791","53792","53793","53794","53795","53796","53797","53798","53799","53800","53801","53802","53803","53804","53805","53806","53807","53808","53809","53810","53811","53812","53813","53814","53815","53816","53817","53818","53819","53820","53821","53822","53823","53824","53825","53826","53827","53828","53829","53830","53831","53832","53833","53834","53835","53836","53837","53838","53839","53840","53841","53842","53843","53844","53845","53846","53847","53848","53849","53850","53851","53852","53853","53854","53855","53856","53857","53858","53859","53860","53861","53862","53863","53864","53865","53866","53867","53868","53869","53870","53871","53872","53873","53874","53875","53876","53877","53878","53879","53880","53881","53882","53883","53884","53885","53886","53887","53888","53889","53890","53891","53892","53893","53894","53895","53896","53897","53898","53899","53900","53901","53902","53903","53904","53905","53906","53907","53908","53909","53910","53911","53912","53913","53914","53915","53916","53917","53918","53919","53920","53921","53922","53923","53924","53925","53926","53927","53928","53929","53930","53931","53932","53933","53934","53935","53936","53937","53938","53939","53940","53941","53942","53943","53944","53945","53946","53947","53948","53949","53950","53951","53952","53953","53954","53955","53956","53957","53958","53959","53960","53961","53962","53963","53964","53965","53966","53967","53968","53969","53970","53971","53972","53973","53974","53975","53976","53977","53978","53979","53980","53981","53982","53983","53984","53985","53986","53987","53988","53989","53990","53991","53992","53993","53994","53995","53996","53997","53998","53999","54000","54001","54002","54003","54004","54005","54006","54007","54008","54009","54010","54011","54012","54013","54014","54015","54016","54017","54018","54019","54020","54021","54022","54023","54024","54025","54026","54027","54028","54029","54030","54031","54032","54033","54034","54035","54036","54037","54038","54039","54040","54041","54042","54043","54044","54045","54046","54047","54048","54049","54050","54051","54052","54053","54054","54055","54056","54057","54058","54059","54060","54061","54062","54063","54064","54065","54066","54067","54068","54069","54070","54071","54072","54073","54074","54075","54076","54077","54078","54079","54080","54081","54082","54083","54084","54085","54086","54087","54088","54089","54090","54091","54092","54093","54094","54095","54096","54097","54098","54099","54100","54101","54102","54103","54104","54105","54106","54107","54108","54109","54110","54111","54112","54113","54114","54115","54116","54117","54118","54119","54120","54121","54122","54123","54124","54125","54126","54127","54128","54129","54130","54131","54132","54133","54134","54135","54136","54137","54138","54139","54140","54141","54142","54143","54144","54145","54146","54147","54148","54149","54150","54151","54152","54153","54154","54155","54156","54157","54158","54159","54160","54161","54162","54163","54164","54165","54166","54167","54168","54169","54170","54171","54172","54173","54174","54175","54176","54177","54178","54179","54180","54181","54182","54183","54184","54185","54186","54187","54188","54189","54190","54191","54192","54193","54194","54195","54196","54197","54198","54199","54200","54201","54202","54203","54204","54205","54206","54207","54208","54209","54210","54211","54212","54213","54214","54215","54216","54217","54218","54219","54220","54221","54222","54223","54224","54225","54226","54227","54228","54229","54230","54231","54232","54233","54234","54235","54236","54237","54238","54239","54240","54241","54242","54243","54244","54245","54246","54247","54248","54249","54250","54251","54252","54253","54254","54255","54256","54257","54258","54259","54260","54261","54262","54263","54264","54265","54266","54267","54268","54269","54270","54271","54272","54273","54274","54275","54276","54277","54278","54279","54280","54281","54282","54283","54284","54285","54286","54287","54288","54289","54290","54291","54292","54293","54294","54295","54296","54297","54298","54299","54300","54301","54302","54303","54304","54305","54306","54307","54308","54309","54310","54311","54312","54313","54314","54315","54316","54317","54318","54319","54320","54321","54322","54323","54324","54325","54326","54327","54328","54329","54330","54331","54332","54333","54334","54335","54336","54337","54338","54339","54340","54341","54342","54343","54344","54345","54346","54347","54348","54349","54350","54351","54352","54353","54354","54355","54356","54357","54358","54359","54360","54361","54362","54363","54364","54365","54366","54367","54368","54369","54370","54371","54372","54373","54374","54375","54376","54377","54378","54379","54380","54381","54382","54383","54384","54385","54386","54387","54388","54389","54390","54391","54392","54393","54394","54395","54396","54397","54398","54399","54400","54401","54402","54403","54404","54405","54406","54407","54408","54409","54410","54411","54412","54413","54414","54415","54416","54417","54418","54419","54420","54421","54422","54423","54424","54425","54426","54427","54428","54429","54430","54431","54432","54433","54434","54435","54436","54437","54438","54439","54440","54441","54442","54443","54444","54445","54446","54447","54448","54449","54450","54451","54452","54453","54454","54455","54456","54457","54458","54459","54460","54461","54462","54463","54464","54465","54466","54467","54468","54469","54470","54471","54472","54473","54474","54475","54476","54477","54478","54479","54480","54481","54482","54483","54484","54485","54486","54487","54488","54489","54490","54491","54492","54493","54494","54495","54496","54497","54498","54499","54500","54501","54502","54503","54504","54505","54506","54507","54508","54509","54510","54511","54512","54513","54514","54515","54516","54517","54518","54519","54520","54521","54522","54523","54524","54525","54526","54527","54528","54529","54530","54531","54532","54533","54534","54535","54536","54537","54538","54539","54540","54541","54542","54543","54544","54545","54546","54547","54548","54549","54550","54551","54552","54553","54554","54555","54556","54557","54558","54559","54560","54561","54562","54563","54564","54565","54566","54567","54568","54569","54570","54571","54572","54573","54574","54575","54576","54577","54578","54579","54580","54581","54582","54583","54584","54585","54586","54587","54588","54589","54590","54591","54592","54593","54594","54595","54596","54597","54598","54599","54600","54601","54602","54603","54604","54605","54606","54607","54608","54609","54610","54611","54612","54613","54614","54615","54616","54617","54618","54619","54620","54621","54622","54623","54624","54625","54626","54627","54628","54629","54630","54631","54632","54633","54634","54635","54636","54637","54638","54639","54640","54641","54642","54643","54644","54645","54646","54647","54648","54649","54650","54651","54652","54653","54654","54655","54656","54657","54658","54659","54660","54661","54662","54663","54664","54665","54666","54667","54668","54669","54670","54671","54672","54673","54674","54675","54676","54677","54678","54679","54680","54681","54682","54683","54684","54685","54686","54687","54688","54689","54690","54691","54692","54693","54694","54695","54696","54697","54698","54699","54700","54701","54702","54703","54704","54705","54706","54707","54708","54709","54710","54711","54712","54713","54714","54715","54716","54717","54718","54719","54720","54721","54722","54723","54724","54725","54726","54727","54728","54729","54730","54731","54732","54733","54734","54735","54736","54737","54738","54739","54740","54741","54742","54743","54744","54745","54746","54747","54748","54749","54750","54751","54752","54753","54754","54755","54756","54757","54758","54759","54760","54761","54762","54763","54764","54765","54766","54767","54768","54769","54770","54771","54772","54773","54774","54775","54776","54777","54778","54779","54780","54781","54782","54783","54784","54785","54786","54787","54788","54789","54790","54791","54792","54793","54794","54795","54796","54797","54798","54799","54800","54801","54802","54803","54804","54805","54806","54807","54808","54809","54810","54811","54812","54813","54814","54815","54816","54817","54818","54819","54820","54821","54822","54823","54824","54825","54826","54827","54828","54829","54830","54831","54832","54833","54834","54835","54836","54837","54838","54839","54840","54841","54842","54843","54844","54845","54846","54847","54848","54849","54850","54851","54852","54853","54854","54855","54856","54857","54858","54859","54860","54861","54862","54863","54864","54865","54866","54867","54868","54869","54870","54871","54872","54873","54874","54875","54876","54877","54878","54879","54880","54881","54882","54883","54884","54885","54886","54887","54888","54889","54890","54891","54892","54893","54894","54895","54896","54897","54898","54899","54900","54901","54902","54903","54904","54905","54906","54907","54908","54909","54910","54911","54912","54913","54914","54915","54916","54917","54918","54919","54920","54921","54922","54923","54924","54925","54926","54927","54928","54929","54930","54931","54932","54933","54934","54935","54936","54937","54938","54939","54940","54941","54942","54943","54944","54945","54946","54947","54948","54949","54950","54951","54952","54953","54954","54955","54956","54957","54958","54959","54960","54961","54962","54963","54964","54965","54966","54967","54968","54969","54970","54971","54972","54973","54974","54975","54976","54977","54978","54979","54980","54981","54982","54983","54984","54985","54986","54987","54988","54989","54990","54991","54992","54993","54994","54995","54996","54997","54998","54999","55000","55001","55002","55003","55004","55005","55006","55007","55008","55009","55010","55011","55012","55013","55014","55015","55016","55017","55018","55019","55020","55021","55022","55023","55024","55025","55026","55027","55028","55029","55030","55031","55032","55033","55034","55035","55036","55037","55038","55039","55040","55041","55042","55043","55044","55045","55046","55047","55048","55049","55050","55051","55052","55053","55054","55055","55056","55057","55058","55059","55060","55061","55062","55063","55064","55065","55066","55067","55068","55069","55070","55071","55072","55073","55074","55075","55076","55077","55078","55079","55080","55081","55082","55083","55084","55085","55086","55087","55088","55089","55090","55091","55092","55093","55094","55095","55096","55097","55098","55099","55100","55101","55102","55103","55104","55105","55106","55107","55108","55109","55110","55111","55112","55113","55114","55115","55116","55117","55118","55119","55120","55121","55122","55123","55124","55125","55126","55127","55128","55129","55130","55131","55132","55133","55134","55135","55136","55137","55138","55139","55140","55141","55142","55143","55144","55145","55146","55147","55148","55149","55150","55151","55152","55153","55154","55155","55156","55157","55158","55159","55160","55161","55162","55163","55164","55165","55166","55167","55168","55169","55170","55171","55172","55173","55174","55175","55176","55177","55178","55179","55180","55181","55182","55183","55184","55185","55186","55187","55188","55189","55190","55191","55192","55193","55194","55195","55196","55197","55198","55199","55200","55201","55202","55203","55204","55205","55206","55207","55208","55209","55210","55211","55212","55213","55214","55215","55216","55217","55218","55219","55220","55221","55222","55223","55224","55225","55226","55227","55228","55229","55230","55231","55232","55233","55234","55235","55236","55237","55238","55239","55240","55241","55242","55243","55244","55245","55246","55247","55248","55249","55250","55251","55252","55253","55254","55255","55256","55257","55258","55259","55260","55261","55262","55263","55264","55265","55266","55267","55268","55269","55270","55271","55272","55273","55274","55275","55276","55277","55278","55279","55280","55281","55282","55283","55284","55285","55286","55287","55288","55289","55290","55291","55292","55293","55294","55295","55296","55297","55298","55299","55300","55301","55302","55303","55304","55305","55306","55307","55308","55309","55310","55311","55312","55313","55314","55315","55316","55317","55318","55319","55320","55321","55322","55323","55324","55325","55326","55327","55328","55329","55330","55331","55332","55333","55334","55335","55336","55337","55338","55339","55340","55341","55342","55343","55344","55345","55346","55347","55348","55349","55350","55351","55352","55353","55354","55355","55356","55357","55358","55359","55360","55361","55362","55363","55364","55365","55366","55367","55368","55369","55370","55371","55372","55373","55374","55375","55376","55377","55378","55379","55380","55381","55382","55383","55384","55385","55386","55387","55388","55389","55390","55391","55392","55393","55394","55395","55396","55397","55398","55399","55400","55401","55402","55403","55404","55405","55406","55407","55408","55409","55410","55411","55412","55413","55414","55415","55416","55417","55418","55419","55420","55421","55422","55423","55424","55425","55426","55427","55428","55429","55430","55431","55432","55433","55434","55435","55436","55437","55438","55439","55440","55441","55442","55443","55444","55445","55446","55447","55448","55449","55450","55451","55452","55453","55454","55455","55456","55457","55458","55459","55460","55461","55462","55463","55464","55465","55466","55467","55468","55469","55470","55471","55472","55473","55474","55475","55476","55477","55478","55479","55480","55481","55482","55483","55484","55485","55486","55487","55488","55489","55490","55491","55492","55493","55494","55495","55496","55497","55498","55499","55500","55501","55502","55503","55504","55505","55506","55507","55508","55509","55510","55511","55512","55513","55514","55515","55516","55517","55518","55519","55520","55521","55522","55523","55524","55525","55526","55527","55528","55529","55530","55531","55532","55533","55534","55535","55536","55537","55538","55539","55540","55541","55542","55543","55544","55545","55546","55547","55548","55549","55550","55551","55552","55553","55554","55555","55556","55557","55558","55559","55560","55561","55562","55563","55564","55565","55566","55567","55568","55569","55570","55571","55572","55573","55574","55575","55576","55577","55578","55579","55580","55581","55582","55583","55584","55585","55586","55587","55588","55589","55590","55591","55592","55593","55594","55595","55596","55597","55598","55599","55600","55601","55602","55603","55604","55605","55606","55607","55608","55609","55610","55611","55612","55613","55614","55615","55616","55617","55618","55619","55620","55621","55622","55623","55624","55625","55626","55627","55628","55629","55630","55631","55632","55633","55634","55635","55636","55637","55638","55639","55640","55641","55642","55643","55644","55645","55646","55647","55648","55649","55650","55651","55652","55653","55654","55655","55656","55657","55658","55659","55660","55661","55662","55663","55664","55665","55666","55667","55668","55669","55670","55671","55672","55673","55674","55675","55676","55677","55678","55679","55680","55681","55682","55683","55684","55685","55686","55687","55688","55689","55690","55691","55692","55693","55694","55695","55696","55697","55698","55699","55700","55701","55702","55703","55704","55705","55706","55707","55708","55709","55710","55711","55712","55713","55714","55715","55716","55717","55718","55719","55720","55721","55722","55723","55724","55725","55726","55727","55728","55729","55730","55731","55732","55733","55734","55735","55736","55737","55738","55739","55740","55741","55742","55743","55744","55745","55746","55747","55748","55749","55750","55751","55752","55753","55754","55755","55756","55757","55758","55759","55760","55761","55762","55763","55764","55765","55766","55767","55768","55769","55770","55771","55772","55773","55774","55775","55776","55777","55778","55779","55780","55781","55782","55783","55784","55785","55786","55787","55788","55789","55790","55791","55792","55793","55794","55795","55796","55797","55798","55799","55800","55801","55802","55803","55804","55805","55806","55807","55808","55809","55810","55811","55812","55813","55814","55815","55816","55817","55818","55819","55820","55821","55822","55823","55824","55825","55826","55827","55828","55829","55830","55831","55832","55833","55834","55835","55836","55837","55838","55839","55840","55841","55842","55843","55844","55845","55846","55847","55848","55849","55850","55851","55852","55853","55854","55855","55856","55857","55858","55859","55860","55861","55862","55863","55864","55865","55866","55867","55868","55869","55870","55871","55872","55873","55874","55875","55876","55877","55878","55879","55880","55881","55882","55883","55884","55885","55886","55887","55888","55889","55890","55891","55892","55893","55894","55895","55896","55897","55898","55899","55900","55901","55902","55903","55904","55905","55906","55907","55908","55909","55910","55911","55912","55913","55914","55915","55916","55917","55918","55919","55920","55921","55922","55923","55924","55925","55926","55927","55928","55929","55930","55931","55932","55933","55934","55935","55936","55937","55938","55939","55940","55941","55942","55943","55944","55945","55946","55947","55948","55949","55950","55951","55952","55953","55954","55955","55956","55957","55958","55959","55960","55961","55962","55963","55964","55965","55966","55967","55968","55969","55970","55971","55972","55973","55974","55975","55976","55977","55978","55979","55980","55981","55982","55983","55984","55985","55986","55987","55988","55989","55990","55991","55992","55993","55994","55995","55996","55997","55998","55999","56000","56001","56002","56003","56004","56005","56006","56007","56008","56009","56010","56011","56012","56013","56014","56015","56016","56017","56018","56019","56020","56021","56022","56023","56024","56025","56026","56027","56028","56029","56030","56031","56032","56033","56034","56035","56036","56037","56038","56039","56040","56041","56042","56043","56044","56045","56046","56047","56048","56049","56050","56051","56052","56053","56054","56055","56056","56057","56058","56059","56060","56061","56062","56063","56064","56065","56066","56067","56068","56069","56070","56071","56072","56073","56074","56075","56076","56077","56078","56079","56080","56081","56082","56083","56084","56085","56086","56087","56088","56089","56090","56091","56092","56093","56094","56095","56096","56097","56098","56099","56100","56101","56102","56103","56104","56105","56106","56107","56108","56109","56110","56111","56112","56113","56114","56115","56116","56117","56118","56119","56120","56121","56122","56123","56124","56125","56126","56127","56128","56129","56130","56131","56132","56133","56134","56135","56136","56137","56138","56139","56140","56141","56142","56143","56144","56145","56146","56147","56148","56149","56150","56151","56152","56153","56154","56155","56156","56157","56158","56159","56160","56161","56162","56163","56164","56165","56166","56167","56168","56169","56170","56171","56172","56173","56174","56175","56176","56177","56178","56179","56180","56181","56182","56183","56184","56185","56186","56187","56188","56189","56190","56191","56192","56193","56194","56195","56196","56197","56198","56199","56200","56201","56202","56203","56204","56205","56206","56207","56208","56209","56210","56211","56212","56213","56214","56215","56216","56217","56218","56219","56220","56221","56222","56223","56224","56225","56226","56227","56228","56229","56230","56231","56232","56233","56234","56235","56236","56237","56238","56239","56240","56241","56242","56243","56244","56245","56246","56247","56248","56249","56250","56251","56252","56253","56254","56255","56256","56257","56258","56259","56260","56261","56262","56263","56264","56265","56266","56267","56268","56269","56270","56271","56272","56273","56274","56275","56276","56277","56278","56279","56280","56281","56282","56283","56284","56285","56286","56287","56288","56289","56290","56291","56292","56293","56294","56295","56296","56297","56298","56299","56300","56301","56302","56303","56304","56305","56306","56307","56308","56309","56310","56311","56312","56313","56314","56315","56316","56317","56318","56319","56320","56321","56322","56323","56324","56325","56326","56327","56328","56329","56330","56331","56332","56333","56334","56335","56336","56337","56338","56339","56340","56341","56342","56343","56344","56345","56346","56347","56348","56349","56350","56351","56352","56353","56354","56355","56356","56357","56358","56359","56360","56361","56362","56363","56364","56365","56366","56367","56368","56369","56370","56371","56372","56373","56374","56375","56376","56377","56378","56379","56380","56381","56382","56383","56384","56385","56386","56387","56388","56389","56390","56391","56392","56393","56394","56395","56396","56397","56398","56399","56400","56401","56402","56403","56404","56405","56406","56407","56408","56409","56410","56411","56412","56413","56414","56415","56416","56417","56418","56419","56420","56421","56422","56423","56424","56425","56426","56427","56428","56429","56430","56431","56432","56433","56434","56435","56436","56437","56438","56439","56440","56441","56442","56443","56444","56445","56446","56447","56448","56449","56450","56451","56452","56453","56454","56455","56456","56457","56458","56459","56460","56461","56462","56463","56464","56465","56466","56467","56468","56469","56470","56471","56472","56473","56474","56475","56476","56477","56478","56479","56480","56481","56482","56483","56484","56485","56486","56487","56488","56489","56490","56491","56492","56493","56494","56495","56496","56497","56498","56499","56500","56501","56502","56503","56504","56505","56506","56507","56508","56509","56510","56511","56512","56513","56514","56515","56516","56517","56518","56519","56520","56521","56522","56523","56524","56525","56526","56527","56528","56529","56530","56531","56532","56533","56534","56535","56536","56537","56538","56539","56540","56541","56542","56543","56544","56545","56546","56547","56548","56549","56550","56551","56552","56553","56554","56555","56556","56557","56558","56559","56560","56561","56562","56563","56564","56565","56566","56567","56568","56569","56570","56571","56572","56573","56574","56575","56576","56577","56578","56579","56580","56581","56582","56583","56584","56585","56586","56587","56588","56589","56590","56591","56592","56593","56594","56595","56596","56597","56598","56599","56600","56601","56602","56603","56604","56605","56606","56607","56608","56609","56610","56611","56612","56613","56614","56615","56616","56617","56618","56619","56620","56621","56622","56623","56624","56625","56626","56627","56628","56629","56630","56631","56632","56633","56634","56635","56636","56637","56638","56639","56640","56641","56642","56643","56644","56645","56646","56647","56648","56649","56650","56651","56652","56653","56654","56655","56656","56657","56658","56659","56660","56661","56662","56663","56664","56665","56666","56667","56668","56669","56670","56671","56672","56673","56674","56675","56676","56677","56678","56679","56680","56681","56682","56683","56684","56685","56686","56687","56688","56689","56690","56691","56692","56693","56694","56695","56696","56697","56698","56699","56700","56701","56702","56703","56704","56705","56706","56707","56708","56709","56710","56711","56712","56713","56714","56715","56716","56717","56718","56719","56720","56721","56722","56723","56724","56725","56726","56727","56728","56729","56730","56731","56732","56733","56734","56735","56736","56737","56738","56739","56740","56741","56742","56743","56744","56745","56746","56747","56748","56749","56750","56751","56752","56753","56754","56755","56756","56757","56758","56759","56760","56761","56762","56763","56764","56765","56766","56767","56768","56769","56770","56771","56772","56773","56774","56775","56776","56777","56778","56779","56780","56781","56782","56783","56784","56785","56786","56787","56788","56789","56790","56791","56792","56793","56794","56795","56796","56797","56798","56799","56800","56801","56802","56803","56804","56805","56806","56807","56808","56809","56810","56811","56812","56813","56814","56815","56816","56817","56818","56819","56820","56821","56822","56823","56824","56825","56826","56827","56828","56829","56830","56831","56832","56833","56834","56835","56836","56837","56838","56839","56840","56841","56842","56843","56844","56845","56846","56847","56848","56849","56850","56851","56852","56853","56854","56855","56856","56857","56858","56859","56860","56861","56862","56863","56864","56865","56866","56867","56868","56869","56870","56871","56872","56873","56874","56875","56876","56877","56878","56879","56880","56881","56882","56883","56884","56885","56886","56887","56888","56889","56890","56891","56892","56893","56894","56895","56896","56897","56898","56899","56900","56901","56902","56903","56904","56905","56906","56907","56908","56909","56910","56911","56912","56913","56914","56915","56916","56917","56918","56919","56920","56921","56922","56923","56924","56925","56926","56927","56928","56929","56930","56931","56932","56933","56934","56935","56936","56937","56938","56939","56940","56941","56942","56943","56944","56945","56946","56947","56948","56949","56950","56951","56952","56953","56954","56955","56956","56957","56958","56959","56960","56961","56962","56963","56964","56965","56966","56967","56968","56969","56970","56971","56972","56973","56974","56975","56976","56977","56978","56979","56980","56981","56982","56983","56984","56985","56986","56987","56988","56989","56990","56991","56992","56993","56994","56995","56996","56997","56998","56999","57000","57001","57002","57003","57004","57005","57006","57007","57008","57009","57010","57011","57012","57013","57014","57015","57016","57017","57018","57019","57020","57021","57022","57023","57024","57025","57026","57027","57028","57029","57030","57031","57032","57033","57034","57035","57036","57037","57038","57039","57040","57041","57042","57043","57044","57045","57046","57047","57048","57049","57050","57051","57052","57053","57054","57055","57056","57057","57058","57059","57060","57061","57062","57063","57064","57065","57066","57067","57068","57069","57070","57071","57072","57073","57074","57075","57076","57077","57078","57079","57080","57081","57082","57083","57084","57085","57086","57087","57088","57089","57090","57091","57092","57093","57094","57095","57096","57097","57098","57099","57100","57101","57102","57103","57104","57105","57106","57107","57108","57109","57110","57111","57112","57113","57114","57115","57116","57117","57118","57119","57120","57121","57122","57123","57124","57125","57126","57127","57128","57129","57130","57131","57132","57133","57134","57135","57136","57137","57138","57139","57140","57141","57142","57143","57144","57145","57146","57147","57148","57149","57150","57151","57152","57153","57154","57155","57156","57157","57158","57159","57160","57161","57162","57163","57164","57165","57166","57167","57168","57169","57170","57171","57172","57173","57174","57175","57176","57177","57178","57179","57180","57181","57182","57183","57184","57185","57186","57187","57188","57189","57190","57191","57192","57193","57194","57195","57196","57197","57198","57199","57200","57201","57202","57203","57204","57205","57206","57207","57208","57209","57210","57211","57212","57213","57214","57215","57216","57217","57218","57219","57220","57221","57222","57223","57224","57225","57226","57227","57228","57229","57230","57231","57232","57233","57234","57235","57236","57237","57238","57239","57240","57241","57242","57243","57244","57245","57246","57247","57248","57249","57250","57251","57252","57253","57254","57255","57256","57257","57258","57259","57260","57261","57262","57263","57264","57265","57266","57267","57268","57269","57270","57271","57272","57273","57274","57275","57276","57277","57278","57279","57280","57281","57282","57283","57284","57285","57286","57287","57288","57289","57290","57291","57292","57293","57294","57295","57296","57297","57298","57299","57300","57301","57302","57303","57304","57305","57306","57307","57308","57309","57310","57311","57312","57313","57314","57315","57316","57317","57318","57319","57320","57321","57322","57323","57324","57325","57326","57327","57328","57329","57330","57331","57332","57333","57334","57335","57336","57337","57338","57339","57340","57341","57342","57343","57344","57345","57346","57347","57348","57349","57350","57351","57352","57353","57354","57355","57356","57357","57358","57359","57360","57361","57362","57363","57364","57365","57366","57367","57368","57369","57370","57371","57372","57373","57374","57375","57376","57377","57378","57379","57380","57381","57382","57383","57384","57385","57386","57387","57388","57389","57390","57391","57392","57393","57394","57395","57396","57397","57398","57399","57400","57401","57402","57403","57404","57405","57406","57407","57408","57409","57410","57411","57412","57413","57414","57415","57416","57417","57418","57419","57420","57421","57422","57423","57424","57425","57426","57427","57428","57429","57430","57431","57432","57433","57434","57435","57436","57437","57438","57439","57440","57441","57442","57443","57444","57445","57446","57447","57448","57449","57450","57451","57452","57453","57454","57455","57456","57457","57458","57459","57460","57461","57462","57463","57464","57465","57466","57467","57468","57469","57470","57471","57472","57473","57474","57475","57476","57477","57478","57479","57480","57481","57482","57483","57484","57485","57486","57487","57488","57489","57490","57491","57492","57493","57494","57495","57496","57497","57498","57499","57500","57501","57502","57503","57504","57505","57506","57507","57508","57509","57510","57511","57512","57513","57514","57515","57516","57517","57518","57519","57520","57521","57522","57523","57524","57525","57526","57527","57528","57529","57530","57531","57532","57533","57534","57535","57536","57537","57538","57539","57540","57541","57542","57543","57544","57545","57546","57547","57548","57549","57550","57551","57552","57553","57554","57555","57556","57557","57558","57559","57560","57561","57562","57563","57564","57565","57566","57567","57568","57569","57570","57571","57572","57573","57574","57575","57576","57577","57578","57579","57580","57581","57582","57583","57584","57585","57586","57587","57588","57589","57590","57591","57592","57593","57594","57595","57596","57597","57598","57599","57600","57601","57602","57603","57604","57605","57606","57607","57608","57609","57610","57611","57612","57613","57614","57615","57616","57617","57618","57619","57620","57621","57622","57623","57624","57625","57626","57627","57628","57629","57630","57631","57632","57633","57634","57635","57636","57637","57638","57639","57640","57641","57642","57643","57644","57645","57646","57647","57648","57649","57650","57651","57652","57653","57654","57655","57656","57657","57658","57659","57660","57661","57662","57663","57664","57665","57666","57667","57668","57669","57670","57671","57672","57673","57674","57675","57676","57677","57678","57679","57680","57681","57682","57683","57684","57685","57686","57687","57688","57689","57690","57691","57692","57693","57694","57695","57696","57697","57698","57699","57700","57701","57702","57703","57704","57705","57706","57707","57708","57709","57710","57711","57712","57713","57714","57715","57716","57717","57718","57719","57720","57721","57722","57723","57724","57725","57726","57727","57728","57729","57730","57731","57732","57733","57734","57735","57736","57737","57738","57739","57740","57741","57742","57743","57744","57745","57746","57747","57748","57749","57750","57751","57752","57753","57754","57755","57756","57757","57758","57759","57760","57761","57762","57763","57764","57765","57766","57767","57768","57769","57770","57771","57772","57773","57774","57775","57776","57777","57778","57779","57780","57781","57782","57783","57784","57785","57786","57787","57788","57789","57790","57791","57792","57793","57794","57795","57796","57797","57798","57799","57800","57801","57802","57803","57804","57805","57806","57807","57808","57809","57810","57811","57812","57813","57814","57815","57816","57817","57818","57819","57820","57821","57822","57823","57824","57825","57826","57827","57828","57829","57830","57831","57832","57833","57834","57835","57836","57837","57838","57839","57840","57841","57842","57843","57844","57845","57846","57847","57848","57849","57850","57851","57852","57853","57854","57855","57856","57857","57858","57859","57860","57861","57862","57863","57864","57865","57866","57867","57868","57869","57870","57871","57872","57873","57874","57875","57876","57877","57878","57879","57880","57881","57882","57883","57884","57885","57886","57887","57888","57889","57890","57891","57892","57893","57894","57895","57896","57897","57898","57899","57900","57901","57902","57903","57904","57905","57906","57907","57908","57909","57910","57911","57912","57913","57914","57915","57916","57917","57918","57919","57920","57921","57922","57923","57924","57925","57926","57927","57928","57929","57930","57931","57932","57933","57934","57935","57936","57937","57938","57939","57940","57941","57942","57943","57944","57945","57946","57947","57948","57949","57950","57951","57952","57953","57954","57955","57956","57957","57958","57959","57960","57961","57962","57963","57964","57965","57966","57967","57968","57969","57970","57971","57972","57973","57974","57975","57976","57977","57978","57979","57980","57981","57982","57983","57984","57985","57986","57987","57988","57989","57990","57991","57992","57993","57994","57995","57996","57997","57998","57999","58000","58001","58002","58003","58004","58005","58006","58007","58008","58009","58010","58011","58012","58013","58014","58015","58016","58017","58018","58019","58020","58021","58022","58023","58024","58025","58026","58027","58028","58029","58030","58031","58032","58033","58034","58035","58036","58037","58038","58039","58040","58041","58042","58043","58044","58045","58046","58047","58048","58049","58050","58051","58052","58053","58054","58055","58056","58057","58058","58059","58060","58061","58062","58063","58064","58065","58066","58067","58068","58069","58070","58071","58072","58073","58074","58075","58076","58077","58078","58079","58080","58081","58082","58083","58084","58085","58086","58087","58088","58089","58090","58091","58092","58093","58094","58095","58096","58097","58098","58099","58100","58101","58102","58103","58104","58105","58106","58107","58108","58109","58110","58111","58112","58113","58114","58115","58116","58117","58118","58119","58120","58121","58122","58123","58124","58125","58126","58127","58128","58129","58130","58131","58132","58133","58134","58135","58136","58137","58138","58139","58140","58141","58142","58143","58144","58145","58146","58147","58148","58149","58150","58151","58152","58153","58154","58155","58156","58157","58158","58159","58160","58161","58162","58163","58164","58165","58166","58167","58168","58169","58170","58171","58172","58173","58174","58175","58176","58177","58178","58179","58180","58181","58182","58183","58184","58185","58186","58187","58188","58189","58190","58191","58192","58193","58194","58195","58196","58197","58198","58199","58200","58201","58202","58203","58204","58205","58206","58207","58208","58209","58210","58211","58212","58213","58214","58215","58216","58217","58218","58219","58220","58221","58222","58223","58224","58225","58226","58227","58228","58229","58230","58231","58232","58233","58234","58235","58236","58237","58238","58239","58240","58241","58242","58243","58244","58245","58246","58247","58248","58249","58250","58251","58252","58253","58254","58255","58256","58257","58258","58259","58260","58261","58262","58263","58264","58265","58266","58267","58268","58269","58270","58271","58272","58273","58274","58275","58276","58277","58278","58279","58280","58281","58282","58283","58284","58285","58286","58287","58288","58289","58290","58291","58292","58293","58294","58295","58296","58297","58298","58299","58300","58301","58302","58303","58304","58305","58306","58307","58308","58309","58310","58311","58312","58313","58314","58315","58316","58317","58318","58319","58320","58321","58322","58323","58324","58325","58326","58327","58328","58329","58330","58331","58332","58333","58334","58335","58336","58337","58338","58339","58340","58341","58342","58343","58344","58345","58346","58347","58348","58349","58350","58351","58352","58353","58354","58355","58356","58357","58358","58359","58360","58361","58362","58363","58364","58365","58366","58367","58368","58369","58370","58371","58372","58373","58374","58375","58376","58377","58378","58379","58380","58381","58382","58383","58384","58385","58386","58387","58388","58389","58390","58391","58392","58393","58394","58395","58396","58397","58398","58399","58400","58401","58402","58403","58404","58405","58406","58407","58408","58409","58410","58411","58412","58413","58414","58415","58416","58417","58418","58419","58420","58421","58422","58423","58424","58425","58426","58427","58428","58429","58430","58431","58432","58433","58434","58435","58436","58437","58438","58439","58440","58441","58442","58443","58444","58445","58446","58447","58448","58449","58450","58451","58452","58453","58454","58455","58456","58457","58458","58459","58460","58461","58462","58463","58464","58465","58466","58467","58468","58469","58470","58471","58472","58473","58474","58475","58476","58477","58478","58479","58480","58481","58482","58483","58484","58485","58486","58487","58488","58489","58490","58491","58492","58493","58494","58495","58496","58497","58498","58499","58500","58501","58502","58503","58504","58505","58506","58507","58508","58509","58510","58511","58512","58513","58514","58515","58516","58517","58518","58519","58520","58521","58522","58523","58524","58525","58526","58527","58528","58529","58530","58531","58532","58533","58534","58535","58536","58537","58538","58539","58540","58541","58542","58543","58544","58545","58546","58547","58548","58549","58550","58551","58552","58553","58554","58555","58556","58557","58558","58559","58560","58561","58562","58563","58564","58565","58566","58567","58568","58569","58570","58571","58572","58573","58574","58575","58576","58577","58578","58579","58580","58581","58582","58583","58584","58585","58586","58587","58588","58589","58590","58591","58592","58593","58594","58595","58596","58597","58598","58599","58600","58601","58602","58603","58604","58605","58606","58607","58608","58609","58610","58611","58612","58613","58614","58615","58616","58617","58618","58619","58620","58621","58622","58623","58624","58625","58626","58627","58628","58629","58630","58631","58632","58633","58634","58635","58636","58637","58638","58639","58640","58641","58642","58643","58644","58645","58646","58647","58648","58649","58650","58651","58652","58653","58654","58655","58656","58657","58658","58659","58660","58661","58662","58663","58664","58665","58666","58667","58668","58669","58670","58671","58672","58673","58674","58675","58676","58677","58678","58679","58680","58681","58682","58683","58684","58685","58686","58687","58688","58689","58690","58691","58692","58693","58694","58695","58696","58697","58698","58699","58700","58701","58702","58703","58704","58705","58706","58707","58708","58709","58710","58711","58712","58713","58714","58715","58716","58717","58718","58719","58720","58721","58722","58723","58724","58725","58726","58727","58728","58729","58730","58731","58732","58733","58734","58735","58736","58737","58738","58739","58740","58741","58742","58743","58744","58745","58746","58747","58748","58749","58750","58751","58752","58753","58754","58755","58756","58757","58758","58759","58760","58761","58762","58763","58764","58765","58766","58767","58768","58769","58770","58771","58772","58773","58774","58775","58776","58777","58778","58779","58780","58781","58782","58783","58784","58785","58786","58787","58788","58789","58790","58791","58792","58793","58794","58795","58796","58797","58798","58799","58800","58801","58802","58803","58804","58805","58806","58807","58808","58809","58810","58811","58812","58813","58814","58815","58816","58817","58818","58819","58820","58821","58822","58823","58824","58825","58826","58827","58828","58829","58830","58831","58832","58833","58834","58835","58836","58837","58838","58839","58840","58841","58842","58843","58844","58845","58846","58847","58848","58849","58850","58851","58852","58853","58854","58855","58856","58857","58858","58859","58860","58861","58862","58863","58864","58865","58866","58867","58868","58869","58870","58871","58872","58873","58874","58875","58876","58877","58878","58879","58880","58881","58882","58883","58884","58885","58886","58887","58888","58889","58890","58891","58892","58893","58894","58895","58896","58897","58898","58899","58900","58901","58902","58903","58904","58905","58906","58907","58908","58909","58910","58911","58912","58913","58914","58915","58916","58917","58918","58919","58920","58921","58922","58923","58924","58925","58926","58927","58928","58929","58930","58931","58932","58933","58934","58935","58936","58937","58938","58939","58940","58941","58942","58943","58944","58945","58946","58947","58948","58949","58950","58951","58952","58953","58954","58955","58956","58957","58958","58959","58960","58961","58962","58963","58964","58965","58966","58967","58968","58969","58970","58971","58972","58973","58974","58975","58976","58977","58978","58979","58980","58981","58982","58983","58984","58985","58986","58987","58988","58989","58990","58991","58992","58993","58994","58995","58996","58997","58998","58999","59000","59001","59002","59003","59004","59005","59006","59007","59008","59009","59010","59011","59012","59013","59014","59015","59016","59017","59018","59019","59020","59021","59022","59023","59024","59025","59026","59027","59028","59029","59030","59031","59032","59033","59034","59035","59036","59037","59038","59039","59040","59041","59042","59043","59044","59045","59046","59047","59048","59049","59050","59051","59052","59053","59054","59055","59056","59057","59058","59059","59060","59061","59062","59063","59064","59065","59066","59067","59068","59069","59070","59071","59072","59073","59074","59075","59076","59077","59078","59079","59080","59081","59082","59083","59084","59085","59086","59087","59088","59089","59090","59091","59092","59093","59094","59095","59096","59097","59098","59099","59100","59101","59102","59103","59104","59105","59106","59107","59108","59109","59110","59111","59112","59113","59114","59115","59116","59117","59118","59119","59120","59121","59122","59123","59124","59125","59126","59127","59128","59129","59130","59131","59132","59133","59134","59135","59136","59137","59138","59139","59140","59141","59142","59143","59144","59145","59146","59147","59148","59149","59150","59151","59152","59153","59154","59155","59156","59157","59158","59159","59160","59161","59162","59163","59164","59165","59166","59167","59168","59169","59170","59171","59172","59173","59174","59175","59176","59177","59178","59179","59180","59181","59182","59183","59184","59185","59186","59187","59188","59189","59190","59191","59192","59193","59194","59195","59196","59197","59198","59199","59200","59201","59202","59203","59204","59205","59206","59207","59208","59209","59210","59211","59212","59213","59214","59215","59216","59217","59218","59219","59220","59221","59222","59223","59224","59225","59226","59227","59228","59229","59230","59231","59232","59233","59234","59235","59236","59237","59238","59239","59240","59241","59242","59243","59244","59245","59246","59247","59248","59249","59250","59251","59252","59253","59254","59255","59256","59257","59258","59259","59260","59261","59262","59263","59264","59265","59266","59267","59268","59269","59270","59271","59272","59273","59274","59275","59276","59277","59278","59279","59280","59281","59282","59283","59284","59285","59286","59287","59288","59289","59290","59291","59292","59293","59294","59295","59296","59297","59298","59299","59300","59301","59302","59303","59304","59305","59306","59307","59308","59309","59310","59311","59312","59313","59314","59315","59316","59317","59318","59319","59320","59321","59322","59323","59324","59325","59326","59327","59328","59329","59330","59331","59332","59333","59334","59335","59336","59337","59338","59339","59340","59341","59342","59343","59344","59345","59346","59347","59348","59349","59350","59351","59352","59353","59354","59355","59356","59357","59358","59359","59360","59361","59362","59363","59364","59365","59366","59367","59368","59369","59370","59371","59372","59373","59374","59375","59376","59377","59378","59379","59380","59381","59382","59383","59384","59385","59386","59387","59388","59389","59390","59391","59392","59393","59394","59395","59396","59397","59398","59399","59400","59401","59402","59403","59404","59405","59406","59407","59408","59409","59410","59411","59412","59413","59414","59415","59416","59417","59418","59419","59420","59421","59422","59423","59424","59425","59426","59427","59428","59429","59430","59431","59432","59433","59434","59435","59436","59437","59438","59439","59440","59441","59442","59443","59444","59445","59446","59447","59448","59449","59450","59451","59452","59453","59454","59455","59456","59457","59458","59459","59460","59461","59462","59463","59464","59465","59466","59467","59468","59469","59470","59471","59472","59473","59474","59475","59476","59477","59478","59479","59480","59481","59482","59483","59484","59485","59486","59487","59488","59489","59490","59491","59492","59493","59494","59495","59496","59497","59498","59499","59500","59501","59502","59503","59504","59505","59506","59507","59508","59509","59510","59511","59512","59513","59514","59515","59516","59517","59518","59519","59520","59521","59522","59523","59524","59525","59526","59527","59528","59529","59530","59531","59532","59533","59534","59535","59536","59537","59538","59539","59540","59541","59542","59543","59544","59545","59546","59547","59548","59549","59550","59551","59552","59553","59554","59555","59556","59557","59558","59559","59560","59561","59562","59563","59564","59565","59566","59567","59568","59569","59570","59571","59572","59573","59574","59575","59576","59577","59578","59579","59580","59581","59582","59583","59584","59585","59586","59587","59588","59589","59590","59591","59592","59593","59594","59595","59596","59597","59598","59599","59600","59601","59602","59603","59604","59605","59606","59607","59608","59609","59610","59611","59612","59613","59614","59615","59616","59617","59618","59619","59620","59621","59622","59623","59624","59625","59626","59627","59628","59629","59630","59631","59632","59633","59634","59635","59636","59637","59638","59639","59640","59641","59642","59643","59644","59645","59646","59647","59648","59649","59650","59651","59652","59653","59654","59655","59656","59657","59658","59659","59660","59661","59662","59663","59664","59665","59666","59667","59668","59669","59670","59671","59672","59673","59674","59675","59676","59677","59678","59679","59680","59681","59682","59683","59684","59685","59686","59687","59688","59689","59690","59691","59692","59693","59694","59695","59696","59697","59698","59699","59700","59701","59702","59703","59704","59705","59706","59707","59708","59709","59710","59711","59712","59713","59714","59715","59716","59717","59718","59719","59720","59721","59722","59723","59724","59725","59726","59727","59728","59729","59730","59731","59732","59733","59734","59735","59736","59737","59738","59739","59740","59741","59742","59743","59744","59745","59746","59747","59748","59749","59750","59751","59752","59753","59754","59755","59756","59757","59758","59759","59760","59761","59762","59763","59764","59765","59766","59767","59768","59769","59770","59771","59772","59773","59774","59775","59776","59777","59778","59779","59780","59781","59782","59783","59784","59785","59786","59787","59788","59789","59790","59791","59792","59793","59794","59795","59796","59797","59798","59799","59800","59801","59802","59803","59804","59805","59806","59807","59808","59809","59810","59811","59812","59813","59814","59815","59816","59817","59818","59819","59820","59821","59822","59823","59824","59825","59826","59827","59828","59829","59830","59831","59832","59833","59834","59835","59836","59837","59838","59839","59840","59841","59842","59843","59844","59845","59846","59847","59848","59849","59850","59851","59852","59853","59854","59855","59856","59857","59858","59859","59860","59861","59862","59863","59864","59865","59866","59867","59868","59869","59870","59871","59872","59873","59874","59875","59876","59877","59878","59879","59880","59881","59882","59883","59884","59885","59886","59887","59888","59889","59890","59891","59892","59893","59894","59895","59896","59897","59898","59899","59900","59901","59902","59903","59904","59905","59906","59907","59908","59909","59910","59911","59912","59913","59914","59915","59916","59917","59918","59919","59920","59921","59922","59923","59924","59925","59926","59927","59928","59929","59930","59931","59932","59933","59934","59935","59936","59937","59938","59939","59940","59941","59942","59943","59944","59945","59946","59947","59948","59949","59950","59951","59952","59953","59954","59955","59956","59957","59958","59959","59960","59961","59962","59963","59964","59965","59966","59967","59968","59969","59970","59971","59972","59973","59974","59975","59976","59977","59978","59979","59980","59981","59982","59983","59984","59985","59986","59987","59988","59989","59990","59991","59992","59993","59994","59995","59996","59997","59998","59999","60000","60001","60002","60003","60004","60005","60006","60007","60008","60009","60010","60011","60012","60013","60014","60015","60016","60017","60018","60019","60020","60021","60022","60023","60024","60025","60026","60027","60028","60029","60030","60031","60032","60033","60034","60035","60036","60037","60038","60039","60040","60041","60042","60043","60044","60045","60046","60047","60048","60049","60050","60051","60052","60053","60054","60055","60056","60057","60058","60059","60060","60061","60062","60063","60064","60065","60066","60067","60068","60069","60070","60071","60072","60073","60074","60075","60076","60077","60078","60079","60080","60081","60082","60083","60084","60085","60086","60087","60088","60089","60090","60091","60092","60093","60094","60095","60096","60097","60098","60099","60100","60101","60102","60103","60104","60105","60106","60107","60108","60109","60110","60111","60112","60113","60114","60115","60116","60117","60118","60119","60120","60121","60122","60123","60124","60125","60126","60127","60128","60129","60130","60131","60132","60133","60134","60135","60136","60137","60138","60139","60140","60141","60142","60143","60144","60145","60146","60147","60148","60149","60150","60151","60152","60153","60154","60155","60156","60157","60158","60159","60160","60161","60162","60163","60164","60165","60166","60167","60168","60169","60170","60171","60172","60173","60174","60175","60176","60177","60178","60179","60180","60181","60182","60183","60184","60185","60186","60187","60188","60189","60190","60191","60192","60193","60194","60195","60196","60197","60198","60199","60200","60201","60202","60203","60204","60205","60206","60207","60208","60209","60210","60211","60212","60213","60214","60215","60216","60217","60218","60219","60220","60221","60222","60223","60224","60225","60226","60227","60228","60229","60230","60231","60232","60233","60234","60235","60236","60237","60238","60239","60240","60241","60242","60243","60244","60245","60246","60247","60248","60249","60250","60251","60252","60253","60254","60255","60256","60257","60258","60259","60260","60261","60262","60263","60264","60265","60266","60267","60268","60269","60270","60271","60272","60273","60274","60275","60276","60277","60278","60279","60280","60281","60282","60283","60284","60285","60286","60287","60288","60289","60290","60291","60292","60293","60294","60295","60296","60297","60298","60299","60300","60301","60302","60303","60304","60305","60306","60307","60308","60309","60310","60311","60312","60313","60314","60315","60316","60317","60318","60319","60320","60321","60322","60323","60324","60325","60326","60327","60328","60329","60330","60331","60332","60333","60334","60335","60336","60337","60338","60339","60340","60341","60342","60343","60344","60345","60346","60347","60348","60349","60350","60351","60352","60353","60354","60355","60356","60357","60358","60359","60360","60361","60362","60363","60364","60365","60366","60367","60368","60369","60370","60371","60372","60373","60374","60375","60376","60377","60378","60379","60380","60381","60382","60383","60384","60385","60386","60387","60388","60389","60390","60391","60392","60393","60394","60395","60396","60397","60398","60399","60400","60401","60402","60403","60404","60405","60406","60407","60408","60409","60410","60411","60412","60413","60414","60415","60416","60417","60418","60419","60420","60421","60422","60423","60424","60425","60426","60427","60428","60429","60430","60431","60432","60433","60434","60435","60436","60437","60438","60439","60440","60441","60442","60443","60444","60445","60446","60447","60448","60449","60450","60451","60452","60453","60454","60455","60456","60457","60458","60459","60460","60461","60462","60463","60464","60465","60466","60467","60468","60469","60470","60471","60472","60473","60474","60475","60476","60477","60478","60479","60480","60481","60482","60483","60484","60485","60486","60487","60488","60489","60490","60491","60492","60493","60494","60495","60496","60497","60498","60499","60500","60501","60502","60503","60504","60505","60506","60507","60508","60509","60510","60511","60512","60513","60514","60515","60516","60517","60518","60519","60520","60521","60522","60523","60524","60525","60526","60527","60528","60529","60530","60531","60532","60533","60534","60535","60536","60537","60538","60539","60540","60541","60542","60543","60544","60545","60546","60547","60548","60549","60550","60551","60552","60553","60554","60555","60556","60557","60558","60559","60560","60561","60562","60563","60564","60565","60566","60567","60568","60569","60570","60571","60572","60573","60574","60575","60576","60577","60578","60579","60580","60581","60582","60583","60584","60585","60586","60587","60588","60589","60590","60591","60592","60593","60594","60595","60596","60597","60598","60599","60600","60601","60602","60603","60604","60605","60606","60607","60608","60609","60610","60611","60612","60613","60614","60615","60616","60617","60618","60619","60620","60621","60622","60623","60624","60625","60626","60627","60628","60629","60630","60631","60632","60633","60634","60635","60636","60637","60638","60639","60640","60641","60642","60643","60644","60645","60646","60647","60648","60649","60650","60651","60652","60653","60654","60655","60656","60657","60658","60659","60660","60661","60662","60663","60664","60665","60666","60667","60668","60669","60670","60671","60672","60673","60674","60675","60676","60677","60678","60679","60680","60681","60682","60683","60684","60685","60686","60687","60688","60689","60690","60691","60692","60693","60694","60695","60696","60697","60698","60699","60700","60701","60702","60703","60704","60705","60706","60707","60708","60709","60710","60711","60712","60713","60714","60715","60716","60717","60718","60719","60720","60721","60722","60723","60724","60725","60726","60727","60728","60729","60730","60731","60732","60733","60734","60735","60736","60737","60738","60739","60740","60741","60742","60743","60744","60745","60746","60747","60748","60749","60750","60751","60752","60753","60754","60755","60756","60757","60758","60759","60760","60761","60762","60763","60764","60765","60766","60767","60768","60769","60770","60771","60772","60773","60774","60775","60776","60777","60778","60779","60780","60781","60782","60783","60784","60785","60786","60787","60788","60789","60790","60791","60792","60793","60794","60795","60796","60797","60798","60799","60800","60801","60802","60803","60804","60805","60806","60807","60808","60809","60810","60811","60812","60813","60814","60815","60816","60817","60818","60819","60820","60821","60822","60823","60824","60825","60826","60827","60828","60829","60830","60831","60832","60833","60834","60835","60836","60837","60838","60839","60840","60841","60842","60843","60844","60845","60846","60847","60848","60849","60850","60851","60852","60853","60854","60855","60856","60857","60858","60859","60860","60861","60862","60863","60864","60865","60866","60867","60868","60869","60870","60871","60872","60873","60874","60875","60876","60877","60878","60879","60880","60881","60882","60883","60884","60885","60886","60887","60888","60889","60890","60891","60892","60893","60894","60895","60896","60897","60898","60899","60900","60901","60902","60903","60904","60905","60906","60907","60908","60909","60910","60911","60912","60913","60914","60915","60916","60917","60918","60919","60920","60921","60922","60923","60924","60925","60926","60927","60928","60929","60930","60931","60932","60933","60934","60935","60936","60937","60938","60939","60940","60941","60942","60943","60944","60945","60946","60947","60948","60949","60950","60951","60952","60953","60954","60955","60956","60957","60958","60959","60960","60961","60962","60963","60964","60965","60966","60967","60968","60969","60970","60971","60972","60973","60974","60975","60976","60977","60978","60979","60980","60981","60982","60983","60984","60985","60986","60987","60988","60989","60990","60991","60992","60993","60994","60995","60996","60997","60998","60999","61000","61001","61002","61003","61004","61005","61006","61007","61008","61009","61010","61011","61012","61013","61014","61015","61016","61017","61018","61019","61020","61021","61022","61023","61024","61025","61026","61027","61028","61029","61030","61031","61032","61033","61034","61035","61036","61037","61038","61039","61040","61041","61042","61043","61044","61045","61046","61047","61048","61049","61050","61051","61052","61053","61054","61055","61056","61057","61058","61059","61060","61061","61062","61063","61064","61065","61066","61067","61068","61069","61070","61071","61072","61073","61074","61075","61076","61077","61078","61079","61080","61081","61082","61083","61084","61085","61086","61087","61088","61089","61090","61091","61092","61093","61094","61095","61096","61097","61098","61099","61100","61101","61102","61103","61104","61105","61106","61107","61108","61109","61110","61111","61112","61113","61114","61115","61116","61117","61118","61119","61120","61121","61122","61123","61124","61125","61126","61127","61128","61129","61130","61131","61132","61133","61134","61135","61136","61137","61138","61139","61140","61141","61142","61143","61144","61145","61146","61147","61148","61149","61150","61151","61152","61153","61154","61155","61156","61157","61158","61159","61160","61161","61162","61163","61164","61165","61166","61167","61168","61169","61170","61171","61172","61173","61174","61175","61176","61177","61178","61179","61180","61181","61182","61183","61184","61185","61186","61187","61188","61189","61190","61191","61192","61193","61194","61195","61196","61197","61198","61199","61200","61201","61202","61203","61204","61205","61206","61207","61208","61209","61210","61211","61212","61213","61214","61215","61216","61217","61218","61219","61220","61221","61222","61223","61224","61225","61226","61227","61228","61229","61230","61231","61232","61233","61234","61235","61236","61237","61238","61239","61240","61241","61242","61243","61244","61245","61246","61247","61248","61249","61250","61251","61252","61253","61254","61255","61256","61257","61258","61259","61260","61261","61262","61263","61264","61265","61266","61267","61268","61269","61270","61271","61272","61273","61274","61275","61276","61277","61278","61279","61280","61281","61282","61283","61284","61285","61286","61287","61288","61289","61290","61291","61292","61293","61294","61295","61296","61297","61298","61299","61300","61301","61302","61303","61304","61305","61306","61307","61308","61309","61310","61311","61312","61313","61314","61315","61316","61317","61318","61319","61320","61321","61322","61323","61324","61325","61326","61327","61328","61329","61330","61331","61332","61333","61334","61335","61336","61337","61338","61339","61340","61341","61342","61343","61344","61345","61346","61347","61348","61349","61350","61351","61352","61353","61354","61355","61356","61357","61358","61359","61360","61361","61362","61363","61364","61365","61366","61367","61368","61369","61370","61371","61372","61373","61374","61375","61376","61377","61378","61379","61380","61381","61382","61383","61384","61385","61386","61387","61388","61389","61390","61391","61392","61393","61394","61395","61396","61397","61398","61399","61400","61401","61402","61403","61404","61405","61406","61407","61408","61409","61410","61411","61412","61413","61414","61415","61416","61417","61418","61419","61420","61421","61422","61423","61424","61425","61426","61427","61428","61429","61430","61431","61432","61433","61434","61435","61436","61437","61438","61439","61440","61441","61442","61443","61444","61445","61446","61447","61448","61449","61450","61451","61452","61453","61454","61455","61456","61457","61458","61459","61460","61461","61462","61463","61464","61465","61466","61467","61468","61469","61470","61471","61472","61473","61474","61475","61476","61477","61478","61479","61480","61481","61482","61483","61484","61485","61486","61487","61488","61489","61490","61491","61492","61493","61494","61495","61496","61497","61498","61499","61500","61501","61502","61503","61504","61505","61506","61507","61508","61509","61510","61511","61512","61513","61514","61515","61516","61517","61518","61519","61520","61521","61522","61523","61524","61525","61526","61527","61528","61529","61530","61531","61532","61533","61534","61535","61536","61537","61538","61539","61540","61541","61542","61543","61544","61545","61546","61547","61548","61549","61550","61551","61552","61553","61554","61555","61556","61557","61558","61559","61560","61561","61562","61563","61564","61565","61566","61567","61568","61569","61570","61571","61572","61573","61574","61575","61576","61577","61578","61579","61580","61581","61582","61583","61584","61585","61586","61587","61588","61589","61590","61591","61592","61593","61594","61595","61596","61597","61598","61599","61600","61601","61602","61603","61604","61605","61606","61607","61608","61609","61610","61611","61612","61613","61614","61615","61616","61617","61618","61619","61620","61621","61622","61623","61624","61625","61626","61627","61628","61629","61630","61631","61632","61633","61634","61635","61636","61637","61638","61639","61640","61641","61642","61643","61644","61645","61646","61647","61648","61649","61650","61651","61652","61653","61654","61655","61656","61657","61658","61659","61660","61661","61662","61663","61664","61665","61666","61667","61668","61669","61670","61671","61672","61673","61674","61675","61676","61677","61678","61679","61680","61681","61682","61683","61684","61685","61686","61687","61688","61689","61690","61691","61692","61693","61694","61695","61696","61697","61698","61699","61700","61701","61702","61703","61704","61705","61706","61707","61708","61709","61710","61711","61712","61713","61714","61715","61716","61717","61718","61719","61720","61721","61722","61723","61724","61725","61726","61727","61728","61729","61730","61731","61732","61733","61734","61735","61736","61737","61738","61739","61740","61741","61742","61743","61744","61745","61746","61747","61748","61749","61750","61751","61752","61753","61754","61755","61756","61757","61758","61759","61760","61761","61762","61763","61764","61765","61766","61767","61768","61769","61770","61771","61772","61773","61774","61775","61776","61777","61778","61779","61780","61781","61782","61783","61784","61785","61786","61787","61788","61789","61790","61791","61792","61793","61794","61795","61796","61797","61798","61799","61800","61801","61802","61803","61804","61805","61806","61807","61808","61809","61810","61811","61812","61813","61814","61815","61816","61817","61818","61819","61820","61821","61822","61823","61824","61825","61826","61827","61828","61829","61830","61831","61832","61833","61834","61835","61836","61837","61838","61839","61840","61841","61842","61843","61844","61845","61846","61847","61848","61849","61850","61851","61852","61853","61854","61855","61856","61857","61858","61859","61860","61861","61862","61863","61864","61865","61866","61867","61868","61869","61870","61871","61872","61873","61874","61875","61876","61877","61878","61879","61880","61881","61882","61883","61884","61885","61886","61887","61888","61889","61890","61891","61892","61893","61894","61895","61896","61897","61898","61899","61900","61901","61902","61903","61904","61905","61906","61907","61908","61909","61910","61911","61912","61913","61914","61915","61916","61917","61918","61919","61920","61921","61922","61923","61924","61925","61926","61927","61928","61929","61930","61931","61932","61933","61934","61935","61936","61937","61938","61939","61940","61941","61942","61943","61944","61945","61946","61947","61948","61949","61950","61951","61952","61953","61954","61955","61956","61957","61958","61959","61960","61961","61962","61963","61964","61965","61966","61967","61968","61969","61970","61971","61972","61973","61974","61975","61976","61977","61978","61979","61980","61981","61982","61983","61984","61985","61986","61987","61988","61989","61990","61991","61992","61993","61994","61995","61996","61997","61998","61999","62000","62001","62002","62003","62004","62005","62006","62007","62008","62009","62010","62011","62012","62013","62014","62015","62016","62017","62018","62019","62020","62021","62022","62023","62024","62025","62026","62027","62028","62029","62030","62031","62032","62033","62034","62035","62036","62037","62038","62039","62040","62041","62042","62043","62044","62045","62046","62047","62048","62049","62050","62051","62052","62053","62054","62055","62056","62057","62058","62059","62060","62061","62062","62063","62064","62065","62066","62067","62068","62069","62070","62071","62072","62073","62074","62075","62076","62077","62078","62079","62080","62081","62082","62083","62084","62085","62086","62087","62088","62089","62090","62091","62092","62093","62094","62095","62096","62097","62098","62099","62100","62101","62102","62103","62104","62105","62106","62107","62108","62109","62110","62111","62112","62113","62114","62115","62116","62117","62118","62119","62120","62121","62122","62123","62124","62125","62126","62127","62128","62129","62130","62131","62132","62133","62134","62135","62136","62137","62138","62139","62140","62141","62142","62143","62144","62145","62146","62147","62148","62149","62150","62151","62152","62153","62154","62155","62156","62157","62158","62159","62160","62161","62162","62163","62164","62165","62166","62167","62168","62169","62170","62171","62172","62173","62174","62175","62176","62177","62178","62179","62180","62181","62182","62183","62184","62185","62186","62187","62188","62189","62190","62191","62192","62193","62194","62195","62196","62197","62198","62199","62200","62201","62202","62203","62204","62205","62206","62207","62208","62209","62210","62211","62212","62213","62214","62215","62216","62217","62218","62219","62220","62221","62222","62223","62224","62225","62226","62227","62228","62229","62230","62231","62232","62233","62234","62235","62236","62237","62238","62239","62240","62241","62242","62243","62244","62245","62246","62247","62248","62249","62250","62251","62252","62253","62254","62255","62256","62257","62258","62259","62260","62261","62262","62263","62264","62265","62266","62267","62268","62269","62270","62271","62272","62273","62274","62275","62276","62277","62278","62279","62280","62281","62282","62283","62284","62285","62286","62287","62288","62289","62290","62291","62292","62293","62294","62295","62296","62297","62298","62299","62300","62301","62302","62303","62304","62305","62306","62307","62308","62309","62310","62311","62312","62313","62314","62315","62316","62317","62318","62319","62320","62321","62322","62323","62324","62325","62326","62327","62328","62329","62330","62331","62332","62333","62334","62335","62336","62337","62338","62339","62340","62341","62342","62343","62344","62345","62346","62347","62348","62349","62350","62351","62352","62353","62354","62355","62356","62357","62358","62359","62360","62361","62362","62363","62364","62365","62366","62367","62368","62369","62370","62371","62372","62373","62374","62375","62376","62377","62378","62379","62380","62381","62382","62383","62384","62385","62386","62387","62388","62389","62390","62391","62392","62393","62394","62395","62396","62397","62398","62399","62400","62401","62402","62403","62404","62405","62406","62407","62408","62409","62410","62411","62412","62413","62414","62415","62416","62417","62418","62419","62420","62421","62422","62423","62424","62425","62426","62427","62428","62429","62430","62431","62432","62433","62434","62435","62436","62437","62438","62439","62440","62441","62442","62443","62444","62445","62446","62447","62448","62449","62450","62451","62452","62453","62454","62455","62456","62457","62458","62459","62460","62461","62462","62463","62464","62465","62466","62467","62468","62469","62470","62471","62472","62473","62474","62475","62476","62477","62478","62479","62480","62481","62482","62483","62484","62485","62486","62487","62488","62489","62490","62491","62492","62493","62494","62495","62496","62497","62498","62499","62500","62501","62502","62503","62504","62505","62506","62507","62508","62509","62510","62511","62512","62513","62514","62515","62516","62517","62518","62519","62520","62521","62522","62523","62524","62525","62526","62527","62528","62529","62530","62531","62532","62533","62534","62535","62536","62537","62538","62539","62540","62541","62542","62543","62544","62545","62546","62547","62548","62549","62550","62551","62552","62553","62554","62555","62556","62557","62558","62559","62560","62561","62562","62563","62564","62565","62566","62567","62568","62569","62570","62571","62572","62573","62574","62575","62576","62577","62578","62579","62580","62581","62582","62583","62584","62585","62586","62587","62588","62589","62590","62591","62592","62593","62594","62595","62596","62597","62598","62599","62600","62601","62602","62603","62604","62605","62606","62607","62608","62609","62610","62611","62612","62613","62614","62615","62616","62617","62618","62619","62620","62621","62622","62623","62624","62625","62626","62627","62628","62629","62630","62631","62632","62633","62634","62635","62636","62637","62638","62639","62640","62641","62642","62643","62644","62645","62646","62647","62648","62649","62650","62651","62652","62653","62654","62655","62656","62657","62658","62659","62660","62661","62662","62663","62664","62665","62666","62667","62668","62669","62670","62671","62672","62673","62674","62675","62676","62677","62678","62679","62680","62681","62682","62683","62684","62685","62686","62687","62688","62689","62690","62691","62692","62693","62694","62695","62696","62697","62698","62699","62700","62701","62702","62703","62704","62705","62706","62707","62708","62709","62710","62711","62712","62713","62714","62715","62716","62717","62718","62719","62720","62721","62722","62723","62724","62725","62726","62727","62728","62729","62730","62731","62732","62733","62734","62735","62736","62737","62738","62739","62740","62741","62742","62743","62744","62745","62746","62747","62748","62749","62750","62751","62752","62753","62754","62755","62756","62757","62758","62759","62760","62761","62762","62763","62764","62765","62766","62767","62768","62769","62770","62771","62772","62773","62774","62775","62776","62777","62778","62779","62780","62781","62782","62783","62784","62785","62786","62787","62788","62789","62790","62791","62792","62793","62794","62795","62796","62797","62798","62799","62800","62801","62802","62803","62804","62805","62806","62807","62808","62809","62810","62811","62812","62813","62814","62815","62816","62817","62818","62819","62820","62821","62822","62823","62824","62825","62826","62827","62828","62829","62830","62831","62832","62833","62834","62835","62836","62837","62838","62839","62840","62841","62842","62843","62844","62845","62846","62847","62848","62849","62850","62851","62852","62853","62854","62855","62856","62857","62858","62859","62860","62861","62862","62863","62864","62865","62866","62867","62868","62869","62870","62871","62872","62873","62874","62875","62876","62877","62878","62879","62880","62881","62882","62883","62884","62885","62886","62887","62888","62889","62890","62891","62892","62893","62894","62895","62896","62897","62898","62899","62900","62901","62902","62903","62904","62905","62906","62907","62908","62909","62910","62911","62912","62913","62914","62915","62916","62917","62918","62919","62920","62921","62922","62923","62924","62925","62926","62927","62928","62929","62930","62931","62932","62933","62934","62935","62936","62937","62938","62939","62940","62941","62942","62943","62944","62945","62946","62947","62948","62949","62950","62951","62952","62953","62954","62955","62956","62957","62958","62959","62960","62961","62962","62963","62964","62965","62966","62967","62968","62969","62970","62971","62972","62973","62974","62975","62976","62977","62978","62979","62980","62981","62982","62983","62984","62985","62986","62987","62988","62989","62990","62991","62992","62993","62994","62995","62996","62997","62998","62999","63000","63001","63002","63003","63004","63005","63006","63007","63008","63009","63010","63011","63012","63013","63014","63015","63016","63017","63018","63019","63020","63021","63022","63023","63024","63025","63026","63027","63028","63029","63030","63031","63032","63033","63034","63035","63036","63037","63038","63039","63040","63041","63042","63043","63044","63045","63046","63047","63048","63049","63050","63051","63052","63053","63054","63055","63056","63057","63058","63059","63060","63061","63062","63063","63064","63065","63066","63067","63068","63069","63070","63071","63072","63073","63074","63075","63076","63077","63078","63079","63080","63081","63082","63083","63084","63085","63086","63087","63088","63089","63090","63091","63092","63093","63094","63095","63096","63097","63098","63099","63100","63101","63102","63103","63104","63105","63106","63107","63108","63109","63110","63111","63112","63113","63114","63115","63116","63117","63118","63119","63120","63121","63122","63123","63124","63125","63126","63127","63128","63129","63130","63131","63132","63133","63134","63135","63136","63137","63138","63139","63140","63141","63142","63143","63144","63145","63146","63147","63148","63149","63150","63151","63152","63153","63154","63155","63156","63157","63158","63159","63160","63161","63162","63163","63164","63165","63166","63167","63168","63169","63170","63171","63172","63173","63174","63175","63176","63177","63178","63179","63180","63181","63182","63183","63184","63185","63186","63187","63188","63189","63190","63191","63192","63193","63194","63195","63196","63197","63198","63199","63200","63201","63202","63203","63204","63205","63206","63207","63208","63209","63210","63211","63212","63213","63214","63215","63216","63217","63218","63219","63220","63221","63222","63223","63224","63225","63226","63227","63228","63229","63230","63231","63232","63233","63234","63235","63236","63237","63238","63239","63240","63241","63242","63243","63244","63245","63246","63247","63248","63249","63250","63251","63252","63253","63254","63255","63256","63257","63258","63259","63260","63261","63262","63263","63264","63265","63266","63267","63268","63269","63270","63271","63272","63273","63274","63275","63276","63277","63278","63279","63280","63281","63282","63283","63284","63285","63286","63287","63288","63289","63290","63291","63292","63293","63294","63295","63296","63297","63298","63299","63300","63301","63302","63303","63304","63305","63306","63307","63308","63309","63310","63311","63312","63313","63314","63315","63316","63317","63318","63319","63320","63321","63322","63323","63324","63325","63326","63327","63328","63329","63330","63331","63332","63333","63334","63335","63336","63337","63338","63339","63340","63341","63342","63343","63344","63345","63346","63347","63348","63349","63350","63351","63352","63353","63354","63355","63356","63357","63358","63359","63360","63361","63362","63363","63364","63365","63366","63367","63368","63369","63370","63371","63372","63373","63374","63375","63376","63377","63378","63379","63380","63381","63382","63383","63384","63385","63386","63387","63388","63389","63390","63391","63392","63393","63394","63395","63396","63397","63398","63399","63400","63401","63402","63403","63404","63405","63406","63407","63408","63409","63410","63411","63412","63413","63414","63415","63416","63417","63418","63419","63420","63421","63422","63423","63424","63425","63426","63427","63428","63429","63430","63431","63432","63433","63434","63435","63436","63437","63438","63439","63440","63441","63442","63443","63444","63445","63446","63447","63448","63449","63450","63451","63452","63453","63454","63455","63456","63457","63458","63459","63460","63461","63462","63463","63464","63465","63466","63467","63468","63469","63470","63471","63472","63473","63474","63475","63476","63477","63478","63479","63480","63481","63482","63483","63484","63485","63486","63487","63488","63489","63490","63491","63492","63493","63494","63495","63496","63497","63498","63499","63500","63501","63502","63503","63504","63505","63506","63507","63508","63509","63510","63511","63512","63513","63514","63515","63516","63517","63518","63519","63520","63521","63522","63523","63524","63525","63526","63527","63528","63529","63530","63531","63532","63533","63534","63535","63536","63537","63538","63539","63540","63541","63542","63543","63544","63545","63546","63547","63548","63549","63550","63551","63552","63553","63554","63555","63556","63557","63558","63559","63560","63561","63562","63563","63564","63565","63566","63567","63568","63569","63570","63571","63572","63573","63574","63575","63576","63577","63578","63579","63580","63581","63582","63583","63584","63585","63586","63587","63588","63589","63590","63591","63592","63593","63594","63595","63596","63597","63598","63599","63600","63601","63602","63603","63604","63605","63606","63607","63608","63609","63610","63611","63612","63613","63614","63615","63616","63617","63618","63619","63620","63621","63622","63623","63624","63625","63626","63627","63628","63629","63630","63631","63632","63633","63634","63635","63636","63637","63638","63639","63640","63641","63642","63643","63644","63645","63646","63647","63648","63649","63650","63651","63652","63653","63654","63655","63656","63657","63658","63659","63660","63661","63662","63663","63664","63665","63666","63667","63668","63669","63670","63671","63672","63673","63674","63675","63676","63677","63678","63679","63680","63681","63682","63683","63684","63685","63686","63687","63688","63689","63690","63691","63692","63693","63694","63695","63696","63697","63698","63699","63700","63701","63702","63703","63704","63705","63706","63707","63708","63709","63710","63711","63712","63713","63714","63715","63716","63717","63718","63719","63720","63721","63722","63723","63724","63725","63726","63727","63728","63729","63730","63731","63732","63733","63734","63735","63736","63737","63738","63739","63740","63741","63742","63743","63744","63745","63746","63747","63748","63749","63750","63751","63752","63753","63754","63755","63756","63757","63758","63759","63760","63761","63762","63763","63764","63765","63766","63767","63768","63769","63770","63771","63772","63773","63774","63775","63776","63777","63778","63779","63780","63781","63782","63783","63784","63785","63786","63787","63788","63789","63790","63791","63792","63793","63794","63795","63796","63797","63798","63799","63800","63801","63802","63803","63804","63805","63806","63807","63808","63809","63810","63811","63812","63813","63814","63815","63816","63817","63818","63819","63820","63821","63822","63823","63824","63825","63826","63827","63828","63829","63830","63831","63832","63833","63834","63835","63836","63837","63838","63839","63840","63841","63842","63843","63844","63845","63846","63847","63848","63849","63850","63851","63852","63853","63854","63855","63856","63857","63858","63859","63860","63861","63862","63863","63864","63865","63866","63867","63868","63869","63870","63871","63872","63873","63874","63875","63876","63877","63878","63879","63880","63881","63882","63883","63884","63885","63886","63887","63888","63889","63890","63891","63892","63893","63894","63895","63896","63897","63898","63899","63900","63901","63902","63903","63904","63905","63906","63907","63908","63909","63910","63911","63912","63913","63914","63915","63916","63917","63918","63919","63920","63921","63922","63923","63924","63925","63926","63927","63928","63929","63930","63931","63932","63933","63934","63935","63936","63937","63938","63939","63940","63941","63942","63943","63944","63945","63946","63947","63948","63949","63950","63951","63952","63953","63954","63955","63956","63957","63958","63959","63960","63961","63962","63963","63964","63965","63966","63967","63968","63969","63970","63971","63972","63973","63974","63975","63976","63977","63978","63979","63980","63981","63982","63983","63984","63985","63986","63987","63988","63989","63990","63991","63992","63993","63994","63995","63996","63997","63998","63999","64000","64001","64002","64003","64004","64005","64006","64007","64008","64009","64010","64011","64012","64013","64014","64015","64016","64017","64018","64019","64020","64021","64022","64023","64024","64025","64026","64027","64028","64029","64030","64031","64032","64033","64034","64035","64036","64037","64038","64039","64040","64041","64042","64043","64044","64045","64046","64047","64048","64049","64050","64051","64052","64053","64054","64055","64056","64057","64058","64059","64060","64061","64062","64063","64064","64065","64066","64067","64068","64069","64070","64071","64072","64073","64074","64075","64076","64077","64078","64079","64080","64081","64082","64083","64084","64085","64086","64087","64088","64089","64090","64091","64092","64093","64094","64095","64096","64097","64098","64099","64100","64101","64102","64103","64104","64105","64106","64107","64108","64109","64110","64111","64112","64113","64114","64115","64116","64117","64118","64119","64120","64121","64122","64123","64124","64125","64126","64127","64128","64129","64130","64131","64132","64133","64134","64135","64136","64137","64138","64139","64140","64141","64142","64143","64144","64145","64146","64147","64148","64149","64150","64151","64152","64153","64154","64155","64156","64157","64158","64159","64160","64161","64162","64163","64164","64165","64166","64167","64168","64169","64170","64171","64172","64173","64174","64175","64176","64177","64178","64179","64180","64181","64182","64183","64184","64185","64186","64187","64188","64189","64190","64191","64192","64193","64194","64195","64196","64197","64198","64199","64200","64201","64202","64203","64204","64205","64206","64207","64208","64209","64210","64211","64212","64213","64214","64215","64216","64217","64218","64219","64220","64221","64222","64223","64224","64225","64226","64227","64228","64229","64230","64231","64232","64233","64234","64235","64236","64237","64238","64239","64240","64241","64242","64243","64244","64245","64246","64247","64248","64249","64250","64251","64252","64253","64254","64255","64256","64257","64258","64259","64260","64261","64262","64263","64264","64265","64266","64267","64268","64269","64270","64271","64272","64273","64274","64275","64276","64277","64278","64279","64280","64281","64282","64283","64284","64285","64286","64287","64288","64289","64290","64291","64292","64293","64294","64295","64296","64297","64298","64299","64300","64301","64302","64303","64304","64305","64306","64307","64308","64309","64310","64311","64312","64313","64314","64315","64316","64317","64318","64319","64320","64321","64322","64323","64324","64325","64326","64327","64328","64329","64330","64331","64332","64333","64334","64335","64336","64337","64338","64339","64340","64341","64342","64343","64344","64345","64346","64347","64348","64349","64350","64351","64352","64353","64354","64355","64356","64357","64358","64359","64360","64361","64362","64363","64364","64365","64366","64367","64368","64369","64370","64371","64372","64373","64374","64375","64376","64377","64378","64379","64380","64381","64382","64383","64384","64385","64386","64387","64388","64389","64390","64391","64392","64393","64394","64395","64396","64397","64398","64399","64400","64401","64402","64403","64404","64405","64406","64407","64408","64409","64410","64411","64412","64413","64414","64415","64416","64417","64418","64419","64420","64421","64422","64423","64424","64425","64426","64427","64428","64429","64430","64431","64432","64433","64434","64435","64436","64437","64438","64439","64440","64441","64442","64443","64444","64445","64446","64447","64448","64449","64450","64451","64452","64453","64454","64455","64456","64457","64458","64459","64460","64461","64462","64463","64464","64465","64466","64467","64468","64469","64470","64471","64472","64473","64474","64475","64476","64477","64478","64479","64480","64481","64482","64483","64484","64485","64486","64487","64488","64489","64490","64491","64492","64493","64494","64495","64496","64497","64498","64499","64500","64501","64502","64503","64504","64505","64506","64507","64508","64509","64510","64511","64512","64513","64514","64515","64516","64517","64518","64519","64520","64521","64522","64523","64524","64525","64526","64527","64528","64529","64530","64531","64532","64533","64534","64535","64536","64537","64538","64539","64540","64541","64542","64543","64544","64545","64546","64547","64548","64549","64550","64551","64552","64553","64554","64555","64556","64557","64558","64559","64560","64561","64562","64563","64564","64565","64566","64567","64568","64569","64570","64571","64572","64573","64574","64575","64576","64577","64578","64579","64580","64581","64582","64583","64584","64585","64586","64587","64588","64589","64590","64591","64592","64593","64594","64595","64596","64597","64598","64599","64600","64601","64602","64603","64604","64605","64606","64607","64608","64609","64610","64611","64612","64613","64614","64615","64616","64617","64618","64619","64620","64621","64622","64623","64624","64625","64626","64627","64628","64629","64630","64631","64632","64633","64634","64635","64636","64637","64638","64639","64640","64641","64642","64643","64644","64645","64646","64647","64648","64649","64650","64651","64652","64653","64654","64655","64656","64657","64658","64659","64660","64661","64662","64663","64664","64665","64666","64667","64668","64669","64670","64671","64672","64673","64674","64675","64676","64677","64678","64679","64680","64681","64682","64683","64684","64685","64686","64687","64688","64689","64690","64691","64692","64693","64694","64695","64696","64697","64698","64699","64700","64701","64702","64703","64704","64705","64706","64707","64708","64709","64710","64711","64712","64713","64714","64715","64716","64717","64718","64719","64720","64721","64722","64723","64724","64725","64726","64727","64728","64729","64730","64731","64732","64733","64734","64735","64736","64737","64738","64739","64740","64741","64742","64743","64744","64745","64746","64747","64748","64749","64750","64751","64752","64753","64754","64755","64756","64757","64758","64759","64760","64761","64762","64763","64764","64765","64766","64767","64768","64769","64770","64771","64772","64773","64774","64775","64776","64777","64778","64779","64780","64781","64782","64783","64784","64785","64786","64787","64788","64789","64790","64791","64792","64793","64794","64795","64796","64797","64798","64799","64800","64801","64802","64803","64804","64805","64806","64807","64808","64809","64810","64811","64812","64813","64814","64815","64816","64817","64818","64819","64820","64821","64822","64823","64824","64825","64826","64827","64828","64829","64830","64831","64832","64833","64834","64835","64836","64837","64838","64839","64840","64841","64842","64843","64844","64845","64846","64847","64848","64849","64850","64851","64852","64853","64854","64855","64856","64857","64858","64859","64860","64861","64862","64863","64864","64865","64866","64867","64868","64869","64870","64871","64872","64873","64874","64875","64876","64877","64878","64879","64880","64881","64882","64883","64884","64885","64886","64887","64888","64889","64890","64891","64892","64893","64894","64895","64896","64897","64898","64899","64900","64901","64902","64903","64904","64905","64906","64907","64908","64909","64910","64911","64912","64913","64914","64915","64916","64917","64918","64919","64920","64921","64922","64923","64924","64925","64926","64927","64928","64929","64930","64931","64932","64933","64934","64935","64936","64937","64938","64939","64940","64941","64942","64943","64944","64945","64946","64947","64948","64949","64950","64951","64952","64953","64954","64955","64956","64957","64958","64959","64960","64961","64962","64963","64964","64965","64966","64967","64968","64969","64970","64971","64972","64973","64974","64975","64976","64977","64978","64979","64980","64981","64982","64983","64984","64985","64986","64987","64988","64989","64990","64991","64992","64993","64994","64995","64996","64997","64998","64999","65000","65001","65002","65003","65004","65005","65006","65007","65008","65009","65010","65011","65012","65013","65014","65015","65016","65017","65018","65019","65020","65021","65022","65023","65024","65025","65026","65027","65028","65029","65030","65031","65032","65033","65034","65035","65036","65037","65038","65039","65040","65041","65042","65043","65044","65045","65046","65047","65048","65049","65050","65051","65052","65053","65054","65055","65056","65057","65058","65059","65060","65061","65062","65063","65064","65065","65066","65067","65068","65069","65070","65071","65072","65073","65074","65075","65076","65077","65078","65079","65080","65081","65082","65083","65084","65085","65086","65087","65088","65089","65090","65091","65092","65093","65094","65095","65096","65097","65098","65099","65100","65101","65102","65103","65104","65105","65106","65107","65108","65109","65110","65111","65112","65113","65114","65115","65116","65117","65118","65119","65120","65121","65122","65123","65124","65125","65126","65127","65128","65129","65130","65131","65132","65133","65134","65135","65136","65137","65138","65139","65140","65141","65142","65143","65144","65145","65146","65147","65148","65149","65150","65151","65152","65153","65154","65155","65156","65157","65158","65159","65160","65161","65162","65163","65164","65165","65166","65167","65168","65169","65170","65171","65172","65173","65174","65175","65176","65177","65178","65179","65180","65181","65182","65183","65184","65185","65186","65187","65188","65189","65190","65191","65192","65193","65194","65195","65196","65197","65198","65199","65200","65201","65202","65203","65204","65205","65206","65207","65208","65209","65210","65211","65212","65213","65214","65215","65216","65217","65218","65219","65220","65221","65222","65223","65224","65225","65226","65227","65228","65229","65230","65231","65232","65233","65234","65235","65236","65237","65238","65239","65240","65241","65242","65243","65244","65245","65246","65247","65248","65249","65250","65251","65252","65253","65254","65255","65256","65257","65258","65259","65260","65261","65262","65263","65264","65265","65266","65267","65268","65269","65270","65271","65272","65273","65274","65275","65276","65277","65278","65279","65280","65281","65282","65283","65284","65285","65286","65287","65288","65289","65290","65291","65292","65293","65294","65295","65296","65297","65298","65299","65300","65301","65302","65303","65304","65305","65306","65307","65308","65309","65310","65311","65312","65313","65314","65315","65316","65317","65318","65319","65320","65321","65322","65323","65324","65325","65326","65327","65328","65329","65330","65331","65332","65333","65334","65335","65336","65337","65338","65339","65340","65341","65342","65343","65344","65345","65346","65347","65348","65349","65350","65351","65352","65353","65354","65355","65356","65357","65358","65359","65360","65361","65362","65363","65364","65365","65366","65367","65368","65369","65370","65371","65372","65373","65374","65375","65376","65377","65378","65379","65380","65381","65382","65383","65384","65385","65386","65387","65388","65389","65390","65391","65392","65393","65394","65395","65396","65397","65398","65399","65400","65401","65402","65403","65404","65405","65406","65407","65408","65409","65410","65411","65412","65413","65414","65415","65416","65417","65418","65419","65420","65421","65422","65423","65424","65425","65426","65427","65428","65429","65430","65431","65432","65433","65434","65435","65436","65437","65438","65439","65440","65441","65442","65443","65444","65445","65446","65447","65448","65449","65450","65451","65452","65453","65454","65455","65456","65457","65458","65459","65460","65461","65462","65463","65464","65465","65466","65467","65468","65469","65470","65471","65472","65473","65474","65475","65476","65477","65478","65479","65480","65481","65482","65483","65484","65485","65486","65487","65488","65489","65490","65491","65492","65493","65494","65495","65496","65497","65498","65499","65500","65501"]} diff --git a/PhpOffice/Common/Adapter/Zip/PclZipAdapter.php b/PhpOffice/Common/Adapter/Zip/PclZipAdapter.php index 9d31f1a..8e54441 100755 --- a/PhpOffice/Common/Adapter/Zip/PclZipAdapter.php +++ b/PhpOffice/Common/Adapter/Zip/PclZipAdapter.php @@ -7,7 +7,7 @@ use PclZip; class PclZipAdapter implements ZipInterface { /** - * @var PclZip + * @var \PclZip */ protected $oPclZip; @@ -18,8 +18,8 @@ class PclZipAdapter implements ZipInterface public function open($filename) { - $this->oPclZip = new PclZip($filename); - $this->tmpDir = sys_get_temp_dir(); + $this->oPclZip = new \PclZip($filename); + $this->tmpDir = \sys_get_temp_dir(); return $this; } @@ -31,17 +31,17 @@ class PclZipAdapter implements ZipInterface public function addFromString($localname, $contents) { - $pathData = pathinfo($localname); + $pathData = \pathinfo($localname); - $hFile = fopen($this->tmpDir . '/' . $pathData['basename'], 'wb'); - fwrite($hFile, $contents); - fclose($hFile); + $hFile = \fopen($this->tmpDir . '/' . $pathData['basename'], 'wb'); + \fwrite($hFile, $contents); + \fclose($hFile); $res = $this->oPclZip->add($this->tmpDir . '/' . $pathData['basename'], PCLZIP_OPT_REMOVE_PATH, $this->tmpDir, PCLZIP_OPT_ADD_PATH, $pathData['dirname']); if ($res == 0) { throw new \Exception('Error zipping files : ' . $this->oPclZip->errorInfo(true)); } - unlink($this->tmpDir . '/' . $pathData['basename']); + \unlink($this->tmpDir . '/' . $pathData['basename']); return $this; } diff --git a/PhpOffice/Common/Adapter/Zip/ZipArchiveAdapter.php b/PhpOffice/Common/Adapter/Zip/ZipArchiveAdapter.php index a8728eb..e536c56 100755 --- a/PhpOffice/Common/Adapter/Zip/ZipArchiveAdapter.php +++ b/PhpOffice/Common/Adapter/Zip/ZipArchiveAdapter.php @@ -7,7 +7,7 @@ use ZipArchive; class ZipArchiveAdapter implements ZipInterface { /** - * @var ZipArchive + * @var \ZipArchive */ protected $oZipArchive; @@ -19,12 +19,12 @@ class ZipArchiveAdapter implements ZipInterface public function open($filename) { $this->filename = $filename; - $this->oZipArchive = new ZipArchive(); + $this->oZipArchive = new \ZipArchive(); - if ($this->oZipArchive->open($this->filename, ZipArchive::OVERWRITE) === true) { + if ($this->oZipArchive->open($this->filename, \ZipArchive::OVERWRITE) === true) { return $this; } - if ($this->oZipArchive->open($this->filename, ZipArchive::CREATE) === true) { + if ($this->oZipArchive->open($this->filename, \ZipArchive::CREATE) === true) { return $this; } throw new \Exception("Could not open $this->filename for writing."); diff --git a/PhpOffice/Common/Autoloader.php b/PhpOffice/Common/Autoloader.php index 9269232..94402b5 100755 --- a/PhpOffice/Common/Autoloader.php +++ b/PhpOffice/Common/Autoloader.php @@ -32,7 +32,7 @@ class Autoloader */ public static function register(): void { - spl_autoload_register([new self(), 'autoload']); + \spl_autoload_register([new self(), 'autoload']); } /** @@ -42,11 +42,11 @@ class Autoloader */ public static function autoload(string $class): void { - $prefixLength = strlen(self::NAMESPACE_PREFIX); - if (0 === strncmp(self::NAMESPACE_PREFIX, $class, $prefixLength)) { - $file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength)); - $file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php'); - if (file_exists($file)) { + $prefixLength = \strlen(self::NAMESPACE_PREFIX); + if (0 === \strncmp(self::NAMESPACE_PREFIX, $class, $prefixLength)) { + $file = \str_replace('\\', DIRECTORY_SEPARATOR, \substr($class, $prefixLength)); + $file = \realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php'); + if (\file_exists($file)) { /** @noinspection PhpIncludeInspection Dynamic includes */ require_once $file; } diff --git a/PhpOffice/Common/Drawing.php b/PhpOffice/Common/Drawing.php index 2f71865..3ecb077 100755 --- a/PhpOffice/Common/Drawing.php +++ b/PhpOffice/Common/Drawing.php @@ -30,7 +30,7 @@ class Drawing */ public static function pixelsToEmu(float $pValue = 0): float { - return round($pValue * 9525); + return \round($pValue * 9525); } /** @@ -46,7 +46,7 @@ class Drawing return 0; } - return (int) round($pValue / 9525); + return (int) \round($pValue / 9525); } /** @@ -135,7 +135,7 @@ class Drawing return 0; } - return (int) round((($pValue / 2.54) * self::DPI_96)); + return (int) \round((($pValue / 2.54) * self::DPI_96)); } /** @@ -147,7 +147,7 @@ class Drawing */ public static function degreesToAngle(int $pValue = 0): int { - return (int) round($pValue * 60000); + return (int) \round($pValue * 60000); } /** @@ -163,7 +163,7 @@ class Drawing return 0; } - return round($pValue / 60000); + return \round($pValue / 60000); } /** @@ -243,7 +243,7 @@ class Drawing return 0; } - return round($pValue / 15); + return \round($pValue / 15); } /** @@ -259,7 +259,7 @@ class Drawing return 0; } - return (int) round(($pValue / 0.75) / 9525); + return (int) \round(($pValue / 0.75) / 9525); } /** @@ -272,20 +272,20 @@ class Drawing public static function htmlToRGB(string $pValue): ?array { if ($pValue[0] == '#') { - $pValue = substr($pValue, 1); + $pValue = \substr($pValue, 1); } - if (strlen($pValue) == 6) { + if (\strlen($pValue) == 6) { list($colorR, $colorG, $colorB) = [$pValue[0] . $pValue[1], $pValue[2] . $pValue[3], $pValue[4] . $pValue[5]]; - } elseif (strlen($pValue) == 3) { + } elseif (\strlen($pValue) == 3) { list($colorR, $colorG, $colorB) = [$pValue[0] . $pValue[0], $pValue[1] . $pValue[1], $pValue[2] . $pValue[2]]; } else { return null; } - $colorR = hexdec($colorR); - $colorG = hexdec($colorG); - $colorB = hexdec($colorB); + $colorR = \hexdec($colorR); + $colorG = \hexdec($colorG); + $colorB = \hexdec($colorB); return [$colorR, $colorG, $colorB]; } diff --git a/PhpOffice/Common/File.php b/PhpOffice/Common/File.php index 8ab931d..30a6be9 100755 --- a/PhpOffice/Common/File.php +++ b/PhpOffice/Common/File.php @@ -33,12 +33,12 @@ class File // Sick construction, but it seems that // file_exists returns strange values when // doing the original file_exists on ZIP archives... - if (strtolower(substr($pFilename, 0, 3)) == 'zip') { + if (\strtolower(\substr($pFilename, 0, 3)) == 'zip') { // Open ZIP file and verify if the file exists - $zipFile = substr($pFilename, 6, strpos($pFilename, '#') - 6); - $archiveFile = substr($pFilename, strpos($pFilename, '#') + 1); + $zipFile = \substr($pFilename, 6, \strpos($pFilename, '#') - 6); + $archiveFile = \substr($pFilename, \strpos($pFilename, '#') + 1); - $zip = new ZipArchive(); + $zip = new \ZipArchive(); if ($zip->open($zipFile) === true) { $returnValue = ($zip->getFromName($archiveFile) !== false); $zip->close(); @@ -50,7 +50,7 @@ class File } // Regular file_exists - return file_exists($pFilename); + return \file_exists($pFilename); } /** @@ -65,12 +65,12 @@ class File if (!self::fileExists($pFilename)) { return null; } - if (strtolower(substr($pFilename, 0, 3)) == 'zip') { + if (\strtolower(\substr($pFilename, 0, 3)) == 'zip') { // Open ZIP file and verify if the file exists - $zipFile = substr($pFilename, 6, strpos($pFilename, '#') - 6); - $archiveFile = substr($pFilename, strpos($pFilename, '#') + 1); + $zipFile = \substr($pFilename, 6, \strpos($pFilename, '#') - 6); + $archiveFile = \substr($pFilename, \strpos($pFilename, '#') + 1); - $zip = new ZipArchive(); + $zip = new \ZipArchive(); if ($zip->open($zipFile) === true) { $returnValue = $zip->getFromName($archiveFile); $zip->close(); @@ -81,7 +81,7 @@ class File return null; } // Regular file contents - return file_get_contents($pFilename); + return \file_get_contents($pFilename); } /** @@ -94,13 +94,13 @@ class File public static function realpath(string $pFilename): string { // Try using realpath() - $returnValue = realpath($pFilename); + $returnValue = \realpath($pFilename); // Found something? if (empty($returnValue)) { - $pathArray = explode('/', $pFilename); - while (in_array('..', $pathArray) && $pathArray[0] != '..') { - $numPathArray = count($pathArray); + $pathArray = \explode('/', $pFilename); + while (\in_array('..', $pathArray) && $pathArray[0] != '..') { + $numPathArray = \count($pathArray); for ($i = 0; $i < $numPathArray; ++$i) { if ($pathArray[$i] == '..' && $i > 0) { unset($pathArray[$i]); @@ -109,7 +109,7 @@ class File } } } - $returnValue = implode('/', $pathArray); + $returnValue = \implode('/', $pathArray); } // Return diff --git a/PhpOffice/Common/Microsoft/OLERead.php b/PhpOffice/Common/Microsoft/OLERead.php index 0bdf7f0..07c73ef 100755 --- a/PhpOffice/Common/Microsoft/OLERead.php +++ b/PhpOffice/Common/Microsoft/OLERead.php @@ -17,9 +17,11 @@ namespace PhpOffice\Common\Microsoft; +/* if (!defined('IDENTIFIER_OLE')) { define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1)); } +*/ class OLERead { @@ -29,7 +31,7 @@ class OLERead private $data = ''; // OLE identifier - public const IDENTIFIER_OLE = IDENTIFIER_OLE; + public const IDENTIFIER_OLE = "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1"; // Size of a sector = 512 bytes public const BIG_BLOCK_SIZE = 0x200; @@ -105,24 +107,26 @@ class OLERead * * @throws \Exception */ - public function read(string $sFileName): void + public function read(string $sFileName): bool { // Check if file exists and is readable - if (!is_readable($sFileName)) { - throw new \Exception('Could not open ' . $sFileName . ' for reading! File does not exist, or it is not readable.'); + if (!\is_readable($sFileName)) { + return false; + //throw new \Exception('Could not open ' . $sFileName . ' for reading! File does not exist, or it is not readable.'); } // Get the file identifier // Don't bother reading the whole file until we know it's a valid OLE file - $this->data = file_get_contents($sFileName, false, null, 0, 8); + $this->data = \file_get_contents($sFileName, false, null, 0, 8); // Check OLE identifier if ($this->data != self::IDENTIFIER_OLE) { - throw new \Exception('The filename ' . $sFileName . ' is not recognised as an OLE file'); + return false; + //throw new \Exception('The filename ' . $sFileName . ' is not recognized as an OLE file'); } // Get the file data - $this->data = file_get_contents($sFileName); + $this->data = \file_get_contents($sFileName); // Total number of sectors used for the SAT $numBigBlkDepotBlks = self::getInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); @@ -155,7 +159,7 @@ class OLERead for ($j = 0; $j < $numExtensionBlocks; ++$j) { $pos = ($extensionBlock + 1) * self::BIG_BLOCK_SIZE; - $blocksToRead = min($numBigBlkDepotBlks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); + $blocksToRead = \min($numBigBlkDepotBlks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); @@ -173,7 +177,7 @@ class OLERead for ($i = 0; $i < $numBigBlkDepotBlks; ++$i) { $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; - $this->bigBlockChain .= substr($this->data, $pos, 4 * $bbs); + $this->bigBlockChain .= \substr($this->data, $pos, 4 * $bbs); $pos += 4 * $bbs; } @@ -182,7 +186,7 @@ class OLERead while ($sbdBlock != -2) { $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; - $this->smallBlockChain .= substr($this->data, $pos, 4 * $bbs); + $this->smallBlockChain .= \substr($this->data, $pos, 4 * $bbs); $pos += 4 * $bbs; $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock * 4); @@ -193,6 +197,8 @@ class OLERead $this->entry = $this->readData($block); $this->readPropertySets(); + + return true; } /** @@ -211,7 +217,7 @@ class OLERead while ($block != -2) { $pos = $block * self::SMALL_BLOCK_SIZE; - $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); + $streamData .= \substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); $block = self::getInt4d($this->smallBlockChain, $block * 4); } @@ -232,7 +238,7 @@ class OLERead while ($block != -2) { $pos = ($block + 1) * self::BIG_BLOCK_SIZE; - $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $streamData .= \substr($this->data, $pos, self::BIG_BLOCK_SIZE); $block = self::getInt4d($this->bigBlockChain, $block * 4); } @@ -253,7 +259,7 @@ class OLERead while ($block != -2) { $pos = ($block + 1) * self::BIG_BLOCK_SIZE; - $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $data .= \substr($this->data, $pos, self::BIG_BLOCK_SIZE); $block = self::getInt4d($this->bigBlockChain, $block * 4); } @@ -268,16 +274,16 @@ class OLERead $offset = 0; // loop through entires, each entry is 128 bytes - $entryLen = strlen($this->entry); + $entryLen = \strlen($this->entry); while ($offset < $entryLen) { // entry data (128 bytes) - $data = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + $data = \substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); // size in bytes of name - $nameSize = ord($data[self::SIZE_OF_NAME_POS]) | (ord($data[self::SIZE_OF_NAME_POS + 1]) << 8); + $nameSize = \ord($data[self::SIZE_OF_NAME_POS]) | (\ord($data[self::SIZE_OF_NAME_POS + 1]) << 8); // type of entry - $type = ord($data[self::TYPE_POS]); + $type = \ord($data[self::TYPE_POS]); // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) // sectorID of first sector of the short-stream container stream, if this entry is root entry @@ -285,7 +291,7 @@ class OLERead $size = self::getInt4d($data, self::SIZE_POS); - $name = str_replace("\x00", '', substr($data, 0, $nameSize)); + $name = \str_replace("\x00", '', \substr($data, 0, $nameSize)); if ($size > 0) { $this->props[] = [ 'name' => $name, @@ -295,34 +301,35 @@ class OLERead ]; // tmp helper to simplify checks - $upName = strtoupper($name); + $upName = \strtoupper($name); switch ($upName) { case 'ROOT ENTRY': case 'R': - $this->rootEntry = count($this->props) - 1; + $this->rootEntry = \count($this->props) - 1; break; - case chr(1) . 'COMPOBJ': + case \chr(1) . 'COMPOBJ': break; - case chr(1) . 'OLE': + case \chr(1) . 'OLE': break; - case chr(5) . 'SUMMARYINFORMATION': - $this->summaryInformation = count($this->props) - 1; + case \chr(5) . 'SUMMARYINFORMATION': + $this->summaryInformation = \count($this->props) - 1; break; - case chr(5) . 'DOCUMENTSUMMARYINFORMATION': - $this->docSummaryInfos = count($this->props) - 1; + case \chr(5) . 'DOCUMENTSUMMARYINFORMATION': + $this->docSummaryInfos = \count($this->props) - 1; break; case 'CURRENT USER': - $this->currentUser = count($this->props) - 1; + $this->currentUser = \count($this->props) - 1; break; case 'PICTURES': - $this->pictures = count($this->props) - 1; + $this->pictures = \count($this->props) - 1; break; case 'POWERPOINT DOCUMENT': - $this->powerpointDocument = count($this->props) - 1; + $this->powerpointDocument = \count($this->props) - 1; break; default: - throw new \Exception('OLE Block Not defined: $upName : ' . $upName . ' - $name : "' . $name . '"'); + return; + //throw new \Exception('OLE Block Not defined: $upName : ' . $upName . ' - $name : "' . $name . '"'); } } @@ -343,14 +350,14 @@ class OLERead // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $or24 = ord($data[$pos + 3]); + $or24 = \ord($data[$pos + 3]); if ($or24 >= 128) { // negative number - $ord24 = -abs((256 - $or24) << 24); + $ord24 = -\abs((256 - $or24) << 24); } else { $ord24 = ($or24 & 127) << 24; } - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $ord24; + return \ord($data[$pos]) | (\ord($data[$pos + 1]) << 8) | (\ord($data[$pos + 2]) << 16) | $ord24; } } diff --git a/PhpOffice/Common/Microsoft/PasswordEncoder.php b/PhpOffice/Common/Microsoft/PasswordEncoder.php index 097060b..d4040a7 100755 --- a/PhpOffice/Common/Microsoft/PasswordEncoder.php +++ b/PhpOffice/Common/Microsoft/PasswordEncoder.php @@ -116,44 +116,44 @@ class PasswordEncoder */ public static function hashPassword(string $password, string $algorithmName = self::ALGORITHM_SHA_1, string $salt = null, int $spinCount = 10000) { - $origEncoding = mb_internal_encoding(); - mb_internal_encoding('UTF-8'); + $origEncoding = \mb_internal_encoding(); + \mb_internal_encoding('UTF-8'); - $password = mb_substr($password, 0, min(self::$passwordMaxLength, mb_strlen($password))); + $password = \mb_substr($password, 0, \min(self::$passwordMaxLength, \mb_strlen($password))); // Get the single-byte values by iterating through the Unicode characters of the truncated password. // For each character, if the low byte is not equal to 0, take it. Otherwise, take the high byte. - $passUtf8 = mb_convert_encoding($password, 'UCS-2LE', 'UTF-8'); + $passUtf8 = \mb_convert_encoding($password, 'UCS-2LE', 'UTF-8'); $byteChars = []; - for ($i = 0; $i < mb_strlen($password); ++$i) { - $byteChars[$i] = ord(substr($passUtf8, $i * 2, 1)); + for ($i = 0; $i < \mb_strlen($password); ++$i) { + $byteChars[$i] = \ord(\substr($passUtf8, $i * 2, 1)); if ($byteChars[$i] == 0) { - $byteChars[$i] = ord(substr($passUtf8, $i * 2 + 1, 1)); + $byteChars[$i] = \ord(\substr($passUtf8, $i * 2 + 1, 1)); } } // build low-order word and hig-order word and combine them $combinedKey = self::buildCombinedKey($byteChars); // build reversed hexadecimal string - $hex = str_pad(strtoupper(dechex($combinedKey & 0xFFFFFFFF)), 8, '0', \STR_PAD_LEFT); + $hex = \str_pad(\strtoupper(\dechex($combinedKey & 0xFFFFFFFF)), 8, '0', \STR_PAD_LEFT); $reversedHex = $hex[6] . $hex[7] . $hex[4] . $hex[5] . $hex[2] . $hex[3] . $hex[0] . $hex[1]; - $generatedKey = mb_convert_encoding($reversedHex, 'UCS-2LE', 'UTF-8'); + $generatedKey = \mb_convert_encoding($reversedHex, 'UCS-2LE', 'UTF-8'); // Implementation Notes List: // Word requires that the initial hash of the password with the salt not be considered in the count. // The initial hash of salt + key is not included in the iteration count. $algorithm = self::getAlgorithm($algorithmName); - $generatedKey = hash($algorithm, $salt . $generatedKey, true); + $generatedKey = \hash($algorithm, $salt . $generatedKey, true); for ($i = 0; $i < $spinCount; ++$i) { - $generatedKey = hash($algorithm, $generatedKey . pack('CCCC', $i, $i >> 8, $i >> 16, $i >> 24), true); + $generatedKey = \hash($algorithm, $generatedKey . \pack('CCCC', $i, $i >> 8, $i >> 16, $i >> 24), true); } - $generatedKey = base64_encode($generatedKey); + $generatedKey = \base64_encode($generatedKey); - mb_internal_encoding($origEncoding); + \mb_internal_encoding($origEncoding); return $generatedKey; } @@ -196,7 +196,7 @@ class PasswordEncoder */ private static function buildCombinedKey(array $byteChars): int { - $byteCharsLength = count($byteChars); + $byteCharsLength = \count($byteChars); // Compute the high-order word // Initialize from the initial code array (see above), depending on the passwords length. $highOrderWord = self::$initialCodeArray[$byteCharsLength - 1]; @@ -231,7 +231,7 @@ class PasswordEncoder } /** - * Simulate behaviour of (signed) int32 + * Simulate behavior of (signed) int32 * * @codeCoverageIgnore * diff --git a/PhpOffice/Common/Text.php b/PhpOffice/Common/Text.php index 1410f79..b01e045 100755 --- a/PhpOffice/Common/Text.php +++ b/PhpOffice/Common/Text.php @@ -36,8 +36,8 @@ class Text { for ($i = 0; $i <= 19; ++$i) { if ($i != 9 && $i != 10 && $i != 13) { - $find = '_x' . sprintf('%04s', strtoupper(dechex($i))) . '_'; - $replace = chr($i); + $find = '_x' . \sprintf('%04s', \strtoupper(\dechex($i))) . '_'; + $replace = \chr($i); self::$controlCharacters[$find] = $replace; } } @@ -64,7 +64,7 @@ class Text self::buildControlCharacters(); } - return str_replace(array_values(self::$controlCharacters), array_keys(self::$controlCharacters), $value); + return \str_replace(\array_values(self::$controlCharacters), \array_keys(self::$controlCharacters), $value); } /** @@ -77,7 +77,7 @@ class Text */ public static function numberFormat(float $number, int $decimals): string { - return number_format($number, $decimals, '.', ''); + return \number_format($number, $decimals, '.', ''); } /** @@ -92,16 +92,16 @@ class Text public static function chr(int $dec): string { if ($dec <= 0x7F) { - return chr($dec); + return \chr($dec); } if ($dec <= 0x7FF) { - return chr(($dec >> 6) + 192) . chr(($dec & 63) + 128); + return \chr(($dec >> 6) + 192) . \chr(($dec & 63) + 128); } if ($dec <= 0xFFFF) { - return chr(($dec >> 12) + 224) . chr((($dec >> 6) & 63) + 128) . chr(($dec & 63) + 128); + return \chr(($dec >> 12) + 224) . \chr((($dec >> 6) & 63) + 128) . \chr(($dec & 63) + 128); } if ($dec <= 0x1FFFFF) { - return chr(($dec >> 18) + 240) . chr((($dec >> 12) & 63) + 128) . chr((($dec >> 6) & 63) + 128) . chr(($dec & 63) + 128); + return \chr(($dec >> 18) + 240) . \chr((($dec >> 12) & 63) + 128) . \chr((($dec >> 6) & 63) + 128) . \chr(($dec & 63) + 128); } return ''; @@ -120,7 +120,7 @@ class Text self::buildControlCharacters(); } - return str_replace(array_keys(self::$controlCharacters), array_values(self::$controlCharacters), $value); + return \str_replace(\array_keys(self::$controlCharacters), \array_values(self::$controlCharacters), $value); } /** @@ -132,7 +132,7 @@ class Text */ public static function isUTF8(string $value = ''): bool { - return is_string($value) && ($value === '' || preg_match('/^./su', $value) == 1); + return \is_string($value) && ($value === '' || \preg_match('/^./su', $value) == 1); } /** @@ -144,8 +144,8 @@ class Text */ public static function toUTF8(?string $value = ''): ?string { - if (!is_null($value) && !self::isUTF8($value)) { - $value = utf8_encode($value); + if (!\is_null($value) && !self::isUTF8($value)) { + $value = \utf8_encode($value); } return $value; @@ -184,16 +184,16 @@ class Text $lookingFor = 1; // Gets unicode for each character - for ($i = 0; $i < strlen($text); ++$i) { - $thisValue = ord($text[$i]); + for ($i = 0; $i < \strlen($text); ++$i) { + $thisValue = \ord($text[$i]); if ($thisValue < 128) { $unicode[] = $thisValue; } else { - if (count($values) == 0) { + if (\count($values) == 0) { $lookingFor = $thisValue < 224 ? 2 : 3; } $values[] = $thisValue; - if (count($values) == $lookingFor) { + if (\count($values) == $lookingFor) { if ($lookingFor == 3) { $number = (($values[0] % 16) * 4096) + (($values[1] % 64) * 64) + ($values[2] % 64); } else { @@ -225,7 +225,7 @@ class Text foreach ($unicode as $value) { if ($value != 65279) { - $entities .= $value > 127 ? '\uc0{\u' . $value . '}' : chr($value); + $entities .= $value > 127 ? '\uc0{\u' . $value . '}' : \chr($value); } } @@ -241,9 +241,9 @@ class Text */ public static function removeUnderscorePrefix(?string $value): string { - if (!is_null($value)) { - if (substr($value, 0, 1) == '_') { - $value = substr($value, 1); + if (!\is_null($value)) { + if (\substr($value, 0, 1) == '_') { + $value = \substr($value, 1); } } diff --git a/PhpOffice/Common/XMLReader.php b/PhpOffice/Common/XMLReader.php index 5d9fe81..e55f451 100755 --- a/PhpOffice/Common/XMLReader.php +++ b/PhpOffice/Common/XMLReader.php @@ -33,14 +33,14 @@ class XMLReader /** * DOMDocument object * - * @var DOMDocument + * @var \DOMDocument */ private $dom = null; /** * DOMXpath object * - * @var DOMXpath + * @var \DOMXpath */ private $xpath = null; @@ -50,17 +50,17 @@ class XMLReader * @param string $zipFile * @param string $xmlFile * - * @return DOMDocument|false + * @return \DOMDocument|false * * @throws \Exception */ public function getDomFromZip(string $zipFile, string $xmlFile) { - if (file_exists($zipFile) === false) { + if (\file_exists($zipFile) === false) { throw new \Exception('Cannot find archive file.'); } - $zip = new ZipArchive(); + $zip = new \ZipArchive(); $zip->open($zipFile); $content = $zip->getFromName($xmlFile); $zip->close(); @@ -77,20 +77,20 @@ class XMLReader * * @param string $content * - * @return DOMDocument + * @return \DOMDocument */ public function getDomFromString(string $content) { $originalLibXMLEntityValue = false; if (\PHP_VERSION_ID < 80000) { - $originalLibXMLEntityValue = libxml_disable_entity_loader(true); + $originalLibXMLEntityValue = \libxml_disable_entity_loader(true); } - $this->dom = new DOMDocument(); + $this->dom = new \DOMDocument(); $this->dom->loadXML($content); if (\PHP_VERSION_ID < 80000) { - libxml_disable_entity_loader($originalLibXMLEntityValue); + \libxml_disable_entity_loader($originalLibXMLEntityValue); } return $this->dom; @@ -100,20 +100,20 @@ class XMLReader * Get elements * * @param string $path - * @param DOMElement $contextNode + * @param \DOMElement $contextNode * - * @return DOMNodeList + * @return \DOMNodeList<\DOMElement> */ - public function getElements(string $path, DOMElement $contextNode = null) + public function getElements(string $path, \DOMElement $contextNode = null) { if ($this->dom === null) { - return new DOMNodeList(); + return new \DOMNodeList(); } if ($this->xpath === null) { - $this->xpath = new DOMXpath($this->dom); + $this->xpath = new \DOMXpath($this->dom); } - if (is_null($contextNode)) { + if (\is_null($contextNode)) { return $this->xpath->query($path); } @@ -136,7 +136,7 @@ class XMLReader throw new \InvalidArgumentException('Dom needs to be loaded before registering a namespace'); } if ($this->xpath === null) { - $this->xpath = new DOMXpath($this->dom); + $this->xpath = new \DOMXpath($this->dom); } return $this->xpath->registerNamespace($prefix, $namespaceURI); @@ -146,15 +146,15 @@ class XMLReader * Get element * * @param string $path - * @param DOMElement $contextNode + * @param \DOMElement $contextNode * - * @return DOMElement|null + * @return \DOMElement|null */ - public function getElement($path, DOMElement $contextNode = null): ?DOMElement + public function getElement($path, \DOMElement $contextNode = null): ?\DOMElement { $elements = $this->getElements($path, $contextNode); if ($elements->length > 0) { - return $elements->item(0) instanceof DOMElement ? $elements->item(0) : null; + return $elements->item(0) instanceof \DOMElement ? $elements->item(0) : null; } return null; @@ -164,18 +164,18 @@ class XMLReader * Get element attribute * * @param string $attribute - * @param DOMElement $contextNode + * @param \DOMElement $contextNode * @param string $path * * @return string|null */ - public function getAttribute($attribute, DOMElement $contextNode = null, $path = null) + public function getAttribute($attribute, \DOMElement $contextNode = null, $path = null) { $return = null; if ($path !== null) { $elements = $this->getElements($path, $contextNode); if ($elements->length > 0) { - /** @var DOMElement $node Type hint */ + /** @var \DOMElement $node Type hint */ $node = $elements->item(0); $return = $node->getAttribute($attribute); } @@ -192,11 +192,11 @@ class XMLReader * Get element value * * @param string $path - * @param DOMElement $contextNode + * @param \DOMElement $contextNode * * @return string|null */ - public function getValue($path, DOMElement $contextNode = null) + public function getValue($path, \DOMElement $contextNode = null) { $elements = $this->getElements($path, $contextNode); if ($elements->length > 0) { @@ -210,11 +210,11 @@ class XMLReader * Count elements * * @param string $path - * @param DOMElement $contextNode + * @param \DOMElement $contextNode * * @return int */ - public function countElements($path, DOMElement $contextNode = null) + public function countElements($path, \DOMElement $contextNode = null) { $elements = $this->getElements($path, $contextNode); @@ -225,11 +225,11 @@ class XMLReader * Element exists * * @param string $path - * @param DOMElement $contextNode + * @param \DOMElement $contextNode * * @return bool */ - public function elementExists($path, DOMElement $contextNode = null) + public function elementExists($path, \DOMElement $contextNode = null) { return $this->getElements($path, $contextNode)->length > 0; } diff --git a/PhpOffice/Common/XMLWriter.php b/PhpOffice/Common/XMLWriter.php index 4c886d6..848bf7f 100755 --- a/PhpOffice/Common/XMLWriter.php +++ b/PhpOffice/Common/XMLWriter.php @@ -59,11 +59,11 @@ class XMLWriter extends \XMLWriter if ($pTemporaryStorage == self::STORAGE_MEMORY) { $this->openMemory(); } else { - if ($pTemporaryStorageDir && !is_dir($pTemporaryStorageDir)) { - $pTemporaryStorageDir = sys_get_temp_dir(); + if ($pTemporaryStorageDir && !\is_dir($pTemporaryStorageDir)) { + $pTemporaryStorageDir = \sys_get_temp_dir(); } // Create temporary filename - $this->tempFileName = @tempnam($pTemporaryStorageDir, 'xml'); + $this->tempFileName = @\tempnam($pTemporaryStorageDir, 'xml'); // Open storage $this->openUri($this->tempFileName); @@ -87,7 +87,7 @@ class XMLWriter extends \XMLWriter if (empty($this->tempFileName)) { return; } - if (PHP_OS != 'WINNT' && @unlink($this->tempFileName) === false) { + if (PHP_OS != 'WINNT' && @\unlink($this->tempFileName) === false) { throw new \Exception('The file ' . $this->tempFileName . ' could not be deleted.'); } } @@ -105,7 +105,7 @@ class XMLWriter extends \XMLWriter $this->flush(); - return file_get_contents($this->tempFileName); + return \file_get_contents($this->tempFileName); } /** @@ -124,7 +124,7 @@ class XMLWriter extends \XMLWriter public function writeElementBlock(string $element, $attributes, string $value = null) { $this->startElement($element); - if (!is_array($attributes)) { + if (!\is_array($attributes)) { $attributes = [$attributes => $value]; } foreach ($attributes as $attribute => $value) { @@ -146,7 +146,7 @@ class XMLWriter extends \XMLWriter public function writeElementIf(bool $condition, string $element, ?string $attribute = null, $value = null) { if ($condition) { - if (is_null($attribute)) { + if (\is_null($attribute)) { $this->writeElement($element, $value); } else { $this->startElement($element); @@ -180,8 +180,8 @@ class XMLWriter extends \XMLWriter */ public function writeAttribute($name, $value): bool { - if (is_float($value)) { - $value = json_encode($value); + if (\is_float($value)) { + $value = \json_encode($value); } return parent::writeAttribute($name, $value ?? ''); diff --git a/PhpOffice/PhpPresentation/AbstractShape.php b/PhpOffice/PhpPresentation/AbstractShape.php index c8d3df0..238fa0b 100755 --- a/PhpOffice/PhpPresentation/AbstractShape.php +++ b/PhpOffice/PhpPresentation/AbstractShape.php @@ -153,10 +153,10 @@ abstract class AbstractShape implements ComparableInterface */ public function setContainer(ShapeContainerInterface $pValue = null, $pOverrideOld = false) { - if (is_null($this->container)) { + if (\is_null($this->container)) { // Add drawing to ShapeContainerInterface $this->container = $pValue; - if (!is_null($this->container)) { + if (!\is_null($this->container)) { $this->container->getShapeCollection()->append($this); } } else { @@ -345,7 +345,7 @@ abstract class AbstractShape implements ComparableInterface */ public function hasHyperlink() { - return !is_null($this->hyperlink); + return !\is_null($this->hyperlink); } /** @@ -353,7 +353,7 @@ abstract class AbstractShape implements ComparableInterface */ public function getHyperlink(): Hyperlink { - if (is_null($this->hyperlink)) { + if (\is_null($this->hyperlink)) { $this->hyperlink = new Hyperlink(); } @@ -377,7 +377,7 @@ abstract class AbstractShape implements ComparableInterface */ public function getHashCode(): string { - return md5((is_object($this->container) ? $this->container->getHashCode() : '') . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->rotation . (is_null($this->getFill()) ? '' : $this->getFill()->getHashCode()) . (is_null($this->shadow) ? '' : $this->shadow->getHashCode()) . (is_null($this->hyperlink) ? '' : $this->hyperlink->getHashCode()) . __CLASS__); + return \md5((\is_object($this->container) ? $this->container->getHashCode() : '') . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->rotation . (\is_null($this->getFill()) ? '' : $this->getFill()->getHashCode()) . (\is_null($this->shadow) ? '' : $this->shadow->getHashCode()) . (\is_null($this->hyperlink) ? '' : $this->hyperlink->getHashCode()) . __CLASS__); } /** @@ -412,7 +412,7 @@ abstract class AbstractShape implements ComparableInterface public function isPlaceholder(): bool { - return !is_null($this->placeholder); + return !\is_null($this->placeholder); } public function getPlaceholder(): ?Placeholder diff --git a/PhpOffice/PhpPresentation/Autoloader.php b/PhpOffice/PhpPresentation/Autoloader.php index 6c7211f..33c8d50 100755 --- a/PhpOffice/PhpPresentation/Autoloader.php +++ b/PhpOffice/PhpPresentation/Autoloader.php @@ -33,7 +33,7 @@ class Autoloader */ public static function register(): void { - spl_autoload_register([new self(), 'autoload']); + \spl_autoload_register([new self(), 'autoload']); } /** @@ -41,14 +41,14 @@ class Autoloader */ public static function autoload(string $class): void { - $prefixLength = strlen(self::NAMESPACE_PREFIX); - if (0 === strncmp(self::NAMESPACE_PREFIX, $class, $prefixLength)) { - $file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength)); - $file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php'); + $prefixLength = \strlen(self::NAMESPACE_PREFIX); + if (0 === \strncmp(self::NAMESPACE_PREFIX, $class, $prefixLength)) { + $file = \str_replace('\\', DIRECTORY_SEPARATOR, \substr($class, $prefixLength)); + $file = \realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php'); if (!$file) { return; } - if (file_exists($file)) { + if (\file_exists($file)) { /** @noinspection PhpIncludeInspection Dynamic includes */ require_once $file; } diff --git a/PhpOffice/PhpPresentation/DocumentProperties.php b/PhpOffice/PhpPresentation/DocumentProperties.php index ab45420..72da79f 100755 --- a/PhpOffice/PhpPresentation/DocumentProperties.php +++ b/PhpOffice/PhpPresentation/DocumentProperties.php @@ -117,8 +117,8 @@ class DocumentProperties // Initialise values $this->creator = 'Unknown Creator'; $this->lastModifiedBy = $this->creator; - $this->created = time(); - $this->modified = time(); + $this->created = \time(); + $this->modified = \time(); $this->title = 'Untitled Presentation'; $this->subject = ''; $this->description = ''; @@ -194,8 +194,8 @@ class DocumentProperties */ public function setCreated($pValue = null) { - if (is_null($pValue)) { - $pValue = time(); + if (\is_null($pValue)) { + $pValue = \time(); } $this->created = $pValue; @@ -221,8 +221,8 @@ class DocumentProperties */ public function setModified($pValue = null) { - if (is_null($pValue)) { - $pValue = time(); + if (\is_null($pValue)) { + $pValue = \time(); } $this->modified = $pValue; @@ -380,7 +380,7 @@ class DocumentProperties */ public function getCustomProperties(): array { - return array_keys($this->customProperties); + return \array_keys($this->customProperties); } /** @@ -443,18 +443,18 @@ class DocumentProperties */ public function setCustomProperty(string $propertyName, $propertyValue = '', ?string $propertyType = null): self { - if (!in_array($propertyType, [ + if (!\in_array($propertyType, [ self::PROPERTY_TYPE_INTEGER, self::PROPERTY_TYPE_FLOAT, self::PROPERTY_TYPE_STRING, self::PROPERTY_TYPE_DATE, self::PROPERTY_TYPE_BOOLEAN, ])) { - if (is_float($propertyValue)) { + if (\is_float($propertyValue)) { $propertyType = self::PROPERTY_TYPE_FLOAT; - } elseif (is_int($propertyValue)) { + } elseif (\is_int($propertyValue)) { $propertyType = self::PROPERTY_TYPE_INTEGER; - } elseif (is_bool($propertyValue)) { + } elseif (\is_bool($propertyValue)) { $propertyType = self::PROPERTY_TYPE_BOOLEAN; } else { $propertyType = self::PROPERTY_TYPE_STRING; diff --git a/PhpOffice/PhpPresentation/Exception/DirectoryNotFoundException.php b/PhpOffice/PhpPresentation/Exception/DirectoryNotFoundException.php index bfd444c..8f186f0 100755 --- a/PhpOffice/PhpPresentation/Exception/DirectoryNotFoundException.php +++ b/PhpOffice/PhpPresentation/Exception/DirectoryNotFoundException.php @@ -24,7 +24,7 @@ class DirectoryNotFoundException extends PhpPresentationException { public function __construct(string $path) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The directory %s doesn\'t exist', $path )); diff --git a/PhpOffice/PhpPresentation/Exception/FileCopyException.php b/PhpOffice/PhpPresentation/Exception/FileCopyException.php index a6574bc..80b115a 100755 --- a/PhpOffice/PhpPresentation/Exception/FileCopyException.php +++ b/PhpOffice/PhpPresentation/Exception/FileCopyException.php @@ -24,7 +24,7 @@ class FileCopyException extends PhpPresentationException { public function __construct(string $source, string $destination) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The file %s can\'t be copied to %s', $source, $destination diff --git a/PhpOffice/PhpPresentation/Exception/FileNotFoundException.php b/PhpOffice/PhpPresentation/Exception/FileNotFoundException.php index 368a32b..796ba2b 100755 --- a/PhpOffice/PhpPresentation/Exception/FileNotFoundException.php +++ b/PhpOffice/PhpPresentation/Exception/FileNotFoundException.php @@ -24,7 +24,7 @@ class FileNotFoundException extends PhpPresentationException { public function __construct(string $path) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The file "%s" doesn\'t exist', $path )); diff --git a/PhpOffice/PhpPresentation/Exception/FileRemoveException.php b/PhpOffice/PhpPresentation/Exception/FileRemoveException.php index e9b4e30..5a9e0f5 100755 --- a/PhpOffice/PhpPresentation/Exception/FileRemoveException.php +++ b/PhpOffice/PhpPresentation/Exception/FileRemoveException.php @@ -24,7 +24,7 @@ class FileRemoveException extends PhpPresentationException { public function __construct(string $path) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The file %s can\'t be removed', $path )); diff --git a/PhpOffice/PhpPresentation/Exception/InvalidClassException.php b/PhpOffice/PhpPresentation/Exception/InvalidClassException.php index 06642d5..510d1e0 100755 --- a/PhpOffice/PhpPresentation/Exception/InvalidClassException.php +++ b/PhpOffice/PhpPresentation/Exception/InvalidClassException.php @@ -24,7 +24,7 @@ class InvalidClassException extends PhpPresentationException { public function __construct(string $class, string $error) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The class %s is invalid (%s)', $class, $error diff --git a/PhpOffice/PhpPresentation/Exception/InvalidFileFormatException.php b/PhpOffice/PhpPresentation/Exception/InvalidFileFormatException.php index 4dcbff7..3fa223f 100755 --- a/PhpOffice/PhpPresentation/Exception/InvalidFileFormatException.php +++ b/PhpOffice/PhpPresentation/Exception/InvalidFileFormatException.php @@ -31,7 +31,7 @@ class InvalidFileFormatException extends PhpPresentationException $error = '(' . $error . ')'; } - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The file %s is not in the format supported by %s%s%s', $path, $class, diff --git a/PhpOffice/PhpPresentation/Exception/InvalidParameterException.php b/PhpOffice/PhpPresentation/Exception/InvalidParameterException.php index a6a97cf..993ea4c 100755 --- a/PhpOffice/PhpPresentation/Exception/InvalidParameterException.php +++ b/PhpOffice/PhpPresentation/Exception/InvalidParameterException.php @@ -24,7 +24,7 @@ class InvalidParameterException extends PhpPresentationException { public function __construct(string $parameter, string $value) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The parameter %s can\'t have the value "%s"', $parameter, $value diff --git a/PhpOffice/PhpPresentation/Exception/OutOfBoundsException.php b/PhpOffice/PhpPresentation/Exception/OutOfBoundsException.php index 7946c60..f415888 100755 --- a/PhpOffice/PhpPresentation/Exception/OutOfBoundsException.php +++ b/PhpOffice/PhpPresentation/Exception/OutOfBoundsException.php @@ -24,7 +24,7 @@ class OutOfBoundsException extends PhpPresentationException { public function __construct(int $minBounds, ?int $maxBounds, int $expectedBounds) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The expected value (%d) is out of bounds (%d, %s)', $expectedBounds, $minBounds, diff --git a/PhpOffice/PhpPresentation/Exception/PhpPresentationException.php b/PhpOffice/PhpPresentation/Exception/PhpPresentationException.php index 5239289..082e7c4 100755 --- a/PhpOffice/PhpPresentation/Exception/PhpPresentationException.php +++ b/PhpOffice/PhpPresentation/Exception/PhpPresentationException.php @@ -22,6 +22,6 @@ namespace PhpOffice\PhpPresentation\Exception; use Exception; -class PhpPresentationException extends Exception +class PhpPresentationException extends \Exception { } diff --git a/PhpOffice/PhpPresentation/Exception/ShapeContainerAlreadyAssignedException.php b/PhpOffice/PhpPresentation/Exception/ShapeContainerAlreadyAssignedException.php index cd39cb0..9bd6b2b 100755 --- a/PhpOffice/PhpPresentation/Exception/ShapeContainerAlreadyAssignedException.php +++ b/PhpOffice/PhpPresentation/Exception/ShapeContainerAlreadyAssignedException.php @@ -24,7 +24,7 @@ class ShapeContainerAlreadyAssignedException extends PhpPresentationException { public function __construct(string $class) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The shape %s has already a container assigned', $class )); diff --git a/PhpOffice/PhpPresentation/Exception/UnauthorizedMimetypeException.php b/PhpOffice/PhpPresentation/Exception/UnauthorizedMimetypeException.php index 01a8b5b..e008d8b 100755 --- a/PhpOffice/PhpPresentation/Exception/UnauthorizedMimetypeException.php +++ b/PhpOffice/PhpPresentation/Exception/UnauthorizedMimetypeException.php @@ -28,10 +28,10 @@ class UnauthorizedMimetypeException extends PhpPresentationException */ public function __construct(string $expectedMimetype, array $authorizedMimetypes) { - parent::__construct(sprintf( + parent::__construct(\sprintf( 'The mime type %s is not found in autorized values (%s)', $expectedMimetype, - implode(', ', $authorizedMimetypes) + \implode(', ', $authorizedMimetypes) )); } } diff --git a/PhpOffice/PhpPresentation/GeometryCalculator.php b/PhpOffice/PhpPresentation/GeometryCalculator.php index 7eccbf8..7f95c6a 100755 --- a/PhpOffice/PhpPresentation/GeometryCalculator.php +++ b/PhpOffice/PhpPresentation/GeometryCalculator.php @@ -37,7 +37,7 @@ class GeometryCalculator { $offsets = [self::X => 0, self::Y => 0]; - if (null !== $container && 0 != count($container->getShapeCollection())) { + if (null !== $container && 0 != \count($container->getShapeCollection())) { $shapes = $container->getShapeCollection(); if (null !== $shapes[0]) { $offsets[self::X] = $shapes[0]->getOffsetX(); @@ -70,7 +70,7 @@ class GeometryCalculator /** @var array $extents */ $extents = [self::X => 0, self::Y => 0]; - if (null !== $container && 0 != count($container->getShapeCollection())) { + if (null !== $container && 0 != \count($container->getShapeCollection())) { $shapes = $container->getShapeCollection(); if (null !== $shapes[0]) { $extents[self::X] = (int) ($shapes[0]->getOffsetX() + $shapes[0]->getWidth()); diff --git a/PhpOffice/PhpPresentation/HashTable.php b/PhpOffice/PhpPresentation/HashTable.php index df5e5a2..7ae43ef 100755 --- a/PhpOffice/PhpPresentation/HashTable.php +++ b/PhpOffice/PhpPresentation/HashTable.php @@ -78,7 +78,7 @@ class HashTable // Add value if (!isset($this->items[$hashCode])) { $this->items[$hashCode] = $pSource; - $index = count($this->items) - 1; + $index = \count($this->items) - 1; $this->keyMap[$index] = $hashCode; $pSource->setHashIndex($index); } else { @@ -106,7 +106,7 @@ class HashTable $deleteKey = $key; } } - unset($this->keyMap[count($this->keyMap) - 1]); + unset($this->keyMap[\count($this->keyMap) - 1]); } } @@ -124,7 +124,7 @@ class HashTable */ public function count(): int { - return count($this->items); + return \count($this->items); } /** @@ -134,7 +134,7 @@ class HashTable */ public function getIndexForHashCode(string $pHashCode = ''): int { - $index = array_search($pHashCode, $this->keyMap); + $index = \array_search($pHashCode, $this->keyMap); return false === $index ? -1 : $index; } diff --git a/PhpOffice/PhpPresentation/IOFactory.php b/PhpOffice/PhpPresentation/IOFactory.php index 0d7f90b..77aa332 100755 --- a/PhpOffice/PhpPresentation/IOFactory.php +++ b/PhpOffice/PhpPresentation/IOFactory.php @@ -94,13 +94,13 @@ class IOFactory */ private static function loadClass(string $class, string $type, PhpPresentation $phpPresentation = null) { - if (!class_exists($class)) { + if (!\class_exists($class)) { throw new InvalidClassException($class, $type . ': The class doesn\'t exist'); } if (!self::isConcreteClass($class)) { throw new InvalidClassException($class, $type . ': The class is an abstract class or an interface'); } - if (is_null($phpPresentation)) { + if (\is_null($phpPresentation)) { return new $class(); } @@ -112,7 +112,7 @@ class IOFactory */ private static function isConcreteClass(string $class): bool { - $reflection = new ReflectionClass($class); + $reflection = new \ReflectionClass($class); return !$reflection->isAbstract() && !$reflection->isInterface(); } diff --git a/PhpOffice/PhpPresentation/PhpPresentation.php b/PhpOffice/PhpPresentation/PhpPresentation.php index e2db811..39f18d3 100755 --- a/PhpOffice/PhpPresentation/PhpPresentation.php +++ b/PhpOffice/PhpPresentation/PhpPresentation.php @@ -68,7 +68,7 @@ class PhpPresentation /** * Collection of Master Slides. * - * @var array|ArrayObject + * @var array|\ArrayObject */ protected $slideMasters; @@ -184,10 +184,10 @@ class PhpPresentation */ public function removeSlideByIndex(int $index = 0): self { - if ($index > count($this->slideCollection) - 1) { - throw new OutOfBoundsException(0, count($this->slideCollection) - 1, $index); + if ($index > \count($this->slideCollection) - 1) { + throw new OutOfBoundsException(0, \count($this->slideCollection) - 1, $index); } - array_splice($this->slideCollection, $index, 1); + \array_splice($this->slideCollection, $index, 1); return $this; } @@ -201,8 +201,8 @@ class PhpPresentation */ public function getSlide(int $index = 0): Slide { - if ($index > count($this->slideCollection) - 1) { - throw new OutOfBoundsException(0, count($this->slideCollection) - 1, $index); + if ($index > \count($this->slideCollection) - 1) { + throw new OutOfBoundsException(0, \count($this->slideCollection) - 1, $index); } return $this->slideCollection[$index]; @@ -240,7 +240,7 @@ class PhpPresentation */ public function getSlideCount(): int { - return count($this->slideCollection); + return \count($this->slideCollection); } /** @@ -262,8 +262,8 @@ class PhpPresentation */ public function setActiveSlideIndex(int $index = 0): Slide { - if ($index > count($this->slideCollection) - 1) { - throw new OutOfBoundsException(0, count($this->slideCollection) - 1, $index); + if ($index > \count($this->slideCollection) - 1) { + throw new OutOfBoundsException(0, \count($this->slideCollection) - 1, $index); } $this->activeSlideIndex = $index; @@ -320,7 +320,7 @@ class PhpPresentation { $copied = clone $this; - $slideCount = count($this->slideCollection); + $slideCount = \count($this->slideCollection); for ($i = 0; $i < $slideCount; ++$i) { $this->slideCollection[$i] = $this->slideCollection[$i]->copy(); $this->slideCollection[$i]->rebindParent($this); @@ -330,7 +330,7 @@ class PhpPresentation } /** - * @return array|ArrayObject + * @return array|\ArrayObject */ public function getAllMasterSlides() { @@ -338,11 +338,11 @@ class PhpPresentation } /** - * @param array|ArrayObject $slideMasters + * @param array|\ArrayObject $slideMasters */ public function setAllMasterSlides($slideMasters = []): self { - if ($slideMasters instanceof ArrayObject || is_array($slideMasters)) { + if ($slideMasters instanceof \ArrayObject || \is_array($slideMasters)) { $this->slideMasters = $slideMasters; } diff --git a/PhpOffice/PhpPresentation/PresentationProperties.php b/PhpOffice/PhpPresentation/PresentationProperties.php index a8ee8ef..4bc86d4 100755 --- a/PhpOffice/PhpPresentation/PresentationProperties.php +++ b/PhpOffice/PhpPresentation/PresentationProperties.php @@ -128,7 +128,7 @@ class PresentationProperties */ public function setThumbnailPath(string $path = ''): self { - if (file_exists($path)) { + if (\file_exists($path)) { $this->thumbnail = $path; } @@ -180,7 +180,7 @@ class PresentationProperties */ public function setLastView(string $value = self::VIEW_SLIDE): self { - if (in_array($value, $this->arrayView)) { + if (\in_array($value, $this->arrayView)) { $this->lastView = $value; } @@ -222,7 +222,7 @@ class PresentationProperties */ public function setSlideshowType(string $value = self::SLIDESHOW_TYPE_PRESENT): self { - if (in_array($value, $this->arraySlideshowTypes)) { + if (\in_array($value, $this->arraySlideshowTypes)) { $this->slideshowType = $value; } diff --git a/PhpOffice/PhpPresentation/Reader/ODPresentation.php b/PhpOffice/PhpPresentation/Reader/ODPresentation.php index d4fd67c..d3d4ad0 100755 --- a/PhpOffice/PhpPresentation/Reader/ODPresentation.php +++ b/PhpOffice/PhpPresentation/Reader/ODPresentation.php @@ -92,16 +92,16 @@ class ODPresentation implements ReaderInterface public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists - if (!file_exists($pFilename)) { + if (!\file_exists($pFilename)) { throw new FileNotFoundException($pFilename); } - $oZip = new ZipArchive(); + $oZip = new \ZipArchive(); // Is it a zip ? if (true === $oZip->open($pFilename)) { // Is it an OpenXML Document ? // Is it a Presentation ? - if (is_array($oZip->statName('META-INF/manifest.xml')) && is_array($oZip->statName('mimetype')) && 'application/vnd.oasis.opendocument.presentation' == $oZip->getFromName('mimetype')) { + if (\is_array($oZip->statName('META-INF/manifest.xml')) && \is_array($oZip->statName('mimetype')) && 'application/vnd.oasis.opendocument.presentation' == $oZip->getFromName('mimetype')) { return true; } } @@ -136,7 +136,7 @@ class ODPresentation implements ReaderInterface $this->oPhpPresentation = new PhpPresentation(); $this->oPhpPresentation->removeSlideByIndex(); - $this->oZip = new ZipArchive(); + $this->oZip = new \ZipArchive(); $this->oZip->open($pFilename); $this->oXMLReader = new XMLReader(); @@ -174,12 +174,12 @@ class ODPresentation implements ReaderInterface $properties = $this->oPhpPresentation->getDocumentProperties(); foreach ($arrayProperties as $path => $property) { $oElement = $this->oXMLReader->getElement($path); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $value = $oElement->nodeValue; - if (in_array($property, ['setCreated', 'setModified'])) { - $dateTime = DateTime::createFromFormat(DateTime::W3C, $value); + if (\in_array($property, ['setCreated', 'setModified'])) { + $dateTime = \DateTime::createFromFormat(\DateTime::W3C, $value); if (!$dateTime) { - $dateTime = new DateTime(); + $dateTime = new \DateTime(); } $value = $dateTime->getTimestamp(); } @@ -188,7 +188,7 @@ class ODPresentation implements ReaderInterface } foreach ($this->oXMLReader->getElements('/office:document-meta/office:meta/meta:user-defined') as $element) { - if (!($element instanceof DOMElement) + if (!($element instanceof \DOMElement) || !$element->hasAttribute('meta:name')) { continue; } @@ -200,7 +200,7 @@ class ODPresentation implements ReaderInterface $propertyType = DocumentProperties::PROPERTY_TYPE_BOOLEAN; break; case 'float': - $propertyType = filter_var($propertyValue, FILTER_VALIDATE_INT) === false + $propertyType = \filter_var($propertyValue, FILTER_VALIDATE_INT) === false ? DocumentProperties::PROPERTY_TYPE_FLOAT : DocumentProperties::PROPERTY_TYPE_INTEGER; break; @@ -222,12 +222,12 @@ class ODPresentation implements ReaderInterface protected function loadSlides(): void { foreach ($this->oXMLReader->getElements('/office:document-content/office:automatic-styles/*') as $oElement) { - if ($oElement instanceof DOMElement && $oElement->hasAttribute('style:name')) { + if ($oElement instanceof \DOMElement && $oElement->hasAttribute('style:name')) { $this->loadStyle($oElement); } } foreach ($this->oXMLReader->getElements('/office:document-content/office:body/office:presentation/draw:page') as $oElement) { - if ($oElement instanceof DOMElement && 'draw:page' == $oElement->nodeName) { + if ($oElement instanceof \DOMElement && 'draw:page' == $oElement->nodeName) { $this->loadSlide($oElement); } } @@ -236,7 +236,7 @@ class ODPresentation implements ReaderInterface protected function loadPresentationProperties(): void { $element = $this->oXMLReader->getElement('/office:document-content/office:body/office:presentation/presentation:settings'); - if ($element instanceof DOMElement) { + if ($element instanceof \DOMElement) { if ($element->getAttribute('presentation:full-screen') === 'false') { $this->oPhpPresentation->getPresentationProperties()->setSlideshowType(PresentationProperties::SLIDESHOW_TYPE_BROWSE); } @@ -246,26 +246,26 @@ class ODPresentation implements ReaderInterface /** * Extract style */ - protected function loadStyle(DOMElement $nodeStyle): bool + protected function loadStyle(\DOMElement $nodeStyle): bool { $keyStyle = $nodeStyle->getAttribute('style:name'); $nodeDrawingPageProps = $this->oXMLReader->getElement('style:drawing-page-properties', $nodeStyle); - if ($nodeDrawingPageProps instanceof DOMElement) { + if ($nodeDrawingPageProps instanceof \DOMElement) { // Read Background Color if ($nodeDrawingPageProps->hasAttribute('draw:fill-color') && 'solid' == $nodeDrawingPageProps->getAttribute('draw:fill')) { $oBackground = new \PhpOffice\PhpPresentation\Slide\Background\Color(); $oColor = new Color(); - $oColor->setRGB(substr($nodeDrawingPageProps->getAttribute('draw:fill-color'), -6)); + $oColor->setRGB(\substr($nodeDrawingPageProps->getAttribute('draw:fill-color'), -6)); $oBackground->setColor($oColor); } // Read Background Image if ('bitmap' == $nodeDrawingPageProps->getAttribute('draw:fill') && $nodeDrawingPageProps->hasAttribute('draw:fill-image-name')) { $nameStyle = $nodeDrawingPageProps->getAttribute('draw:fill-image-name'); if (!empty($this->arrayCommonStyles[$nameStyle]) && 'image' == $this->arrayCommonStyles[$nameStyle]['type'] && !empty($this->arrayCommonStyles[$nameStyle]['path'])) { - $tmpBkgImg = tempnam(sys_get_temp_dir(), 'PhpPresentationReaderODPBkg'); + $tmpBkgImg = \tempnam(\sys_get_temp_dir(), 'PhpPresentationReaderODPBkg'); $contentImg = $this->oZip->getFromName($this->arrayCommonStyles[$nameStyle]['path']); - file_put_contents($tmpBkgImg, $contentImg); + \file_put_contents($tmpBkgImg, $contentImg); $oBackground = new Image(); $oBackground->setPath($tmpBkgImg); @@ -274,27 +274,27 @@ class ODPresentation implements ReaderInterface } $nodeGraphicProps = $this->oXMLReader->getElement('style:graphic-properties', $nodeStyle); - if ($nodeGraphicProps instanceof DOMElement) { + if ($nodeGraphicProps instanceof \DOMElement) { // Read Shadow if ($nodeGraphicProps->hasAttribute('draw:shadow') && 'visible' == $nodeGraphicProps->getAttribute('draw:shadow')) { $oShadow = new Shadow(); $oShadow->setVisible(true); if ($nodeGraphicProps->hasAttribute('draw:shadow-color')) { - $oShadow->getColor()->setRGB(substr($nodeGraphicProps->getAttribute('draw:shadow-color'), -6)); + $oShadow->getColor()->setRGB(\substr($nodeGraphicProps->getAttribute('draw:shadow-color'), -6)); } if ($nodeGraphicProps->hasAttribute('draw:shadow-opacity')) { - $oShadow->setAlpha(100 - (int) substr($nodeGraphicProps->getAttribute('draw:shadow-opacity'), 0, -1)); + $oShadow->setAlpha(100 - (int) \substr($nodeGraphicProps->getAttribute('draw:shadow-opacity'), 0, -1)); } if ($nodeGraphicProps->hasAttribute('draw:shadow-offset-x') && $nodeGraphicProps->hasAttribute('draw:shadow-offset-y')) { - $offsetX = (float) substr($nodeGraphicProps->getAttribute('draw:shadow-offset-x'), 0, -2); - $offsetY = (float) substr($nodeGraphicProps->getAttribute('draw:shadow-offset-y'), 0, -2); + $offsetX = (float) \substr($nodeGraphicProps->getAttribute('draw:shadow-offset-x'), 0, -2); + $offsetY = (float) \substr($nodeGraphicProps->getAttribute('draw:shadow-offset-y'), 0, -2); $distance = 0; if (0 != $offsetX) { $distance = ($offsetX < 0 ? $offsetX * -1 : $offsetX); } elseif (0 != $offsetY) { $distance = ($offsetY < 0 ? $offsetY * -1 : $offsetY); } - $oShadow->setDirection((int) rad2deg(atan2($offsetY, $offsetX))); + $oShadow->setDirection((int) \rad2deg(\atan2($offsetY, $offsetX))); $oShadow->setDistance(CommonDrawing::centimetersToPixels($distance)); } } @@ -312,7 +312,7 @@ class ODPresentation implements ReaderInterface $oFill->setFillType(Fill::FILL_SOLID); if ($nodeGraphicProps->hasAttribute('draw:fill-color')) { $oColor = new Color(); - $oColor->setRGB(substr($nodeGraphicProps->getAttribute('draw:fill-color'), 1)); + $oColor->setRGB(\substr($nodeGraphicProps->getAttribute('draw:fill-color'), 1)); $oFill->setStartColor($oColor); } break; @@ -321,10 +321,10 @@ class ODPresentation implements ReaderInterface } $nodeTextProperties = $this->oXMLReader->getElement('style:text-properties', $nodeStyle); - if ($nodeTextProperties instanceof DOMElement) { + if ($nodeTextProperties instanceof \DOMElement) { $oFont = new Font(); if ($nodeTextProperties->hasAttribute('fo:color')) { - $oFont->getColor()->setRGB(substr($nodeTextProperties->getAttribute('fo:color'), -6)); + $oFont->getColor()->setRGB(\substr($nodeTextProperties->getAttribute('fo:color'), -6)); } // Font Latin if ($nodeTextProperties->hasAttribute('fo:font-family')) { @@ -339,7 +339,7 @@ class ODPresentation implements ReaderInterface } if ($nodeTextProperties->hasAttribute('fo:font-size')) { $oFont - ->setSize((int) substr($nodeTextProperties->getAttribute('fo:font-size'), 0, -2)) + ->setSize((int) \substr($nodeTextProperties->getAttribute('fo:font-size'), 0, -2)) ->setFormat(Font::FORMAT_LATIN); } // Font East Asian @@ -355,7 +355,7 @@ class ODPresentation implements ReaderInterface } if ($nodeTextProperties->hasAttribute('style:font-size-asian')) { $oFont - ->setSize((int) substr($nodeTextProperties->getAttribute('style:font-size-asian'), 0, -2)) + ->setSize((int) \substr($nodeTextProperties->getAttribute('style:font-size-asian'), 0, -2)) ->setFormat(Font::FORMAT_EAST_ASIAN); } // Font Complex Script @@ -371,7 +371,7 @@ class ODPresentation implements ReaderInterface } if ($nodeTextProperties->hasAttribute('style:font-size-complex')) { $oFont - ->setSize((int) substr($nodeTextProperties->getAttribute('style:font-size-complex'), 0, -2)) + ->setSize((int) \substr($nodeTextProperties->getAttribute('style:font-size-complex'), 0, -2)) ->setFormat(Font::FORMAT_COMPLEX_SCRIPT); } if ($nodeTextProperties->hasAttribute('style:script-type')) { @@ -390,18 +390,18 @@ class ODPresentation implements ReaderInterface } $nodeParagraphProps = $this->oXMLReader->getElement('style:paragraph-properties', $nodeStyle); - if ($nodeParagraphProps instanceof DOMElement) { + if ($nodeParagraphProps instanceof \DOMElement) { if ($nodeParagraphProps->hasAttribute('fo:line-height')) { $lineHeightUnit = $this->getExpressionUnit($nodeParagraphProps->getAttribute('fo:margin-bottom')); $lineSpacingMode = $lineHeightUnit == '%' ? Paragraph::LINE_SPACING_MODE_PERCENT : Paragraph::LINE_SPACING_MODE_POINT; $lineSpacing = $this->getExpressionValue($nodeParagraphProps->getAttribute('fo:margin-bottom')); } if ($nodeParagraphProps->hasAttribute('fo:margin-bottom')) { - $spacingAfter = (float) substr($nodeParagraphProps->getAttribute('fo:margin-bottom'), 0, -2); + $spacingAfter = (float) \substr($nodeParagraphProps->getAttribute('fo:margin-bottom'), 0, -2); $spacingAfter = CommonDrawing::centimetersToPoints($spacingAfter); } if ($nodeParagraphProps->hasAttribute('fo:margin-top')) { - $spacingBefore = (float) substr($nodeParagraphProps->getAttribute('fo:margin-top'), 0, -2); + $spacingBefore = (float) \substr($nodeParagraphProps->getAttribute('fo:margin-top'), 0, -2); $spacingBefore = CommonDrawing::centimetersToPoints($spacingBefore); } $oAlignment = new Alignment(); @@ -434,7 +434,7 @@ class ODPresentation implements ReaderInterface $oAlignment = new Alignment(); $oBullet = new Bullet(); $oBullet->setBulletType(Bullet::TYPE_NONE); - if ($oNodeListLevel instanceof DOMElement) { + if ($oNodeListLevel instanceof \DOMElement) { if ($oNodeListLevel->hasAttribute('text:level')) { $oAlignment->setLevel((int) $oNodeListLevel->getAttribute('text:level') - 1); } @@ -444,19 +444,19 @@ class ODPresentation implements ReaderInterface } $oNodeListProperties = $this->oXMLReader->getElement('style:list-level-properties', $oNodeListLevel); - if ($oNodeListProperties instanceof DOMElement) { + if ($oNodeListProperties instanceof \DOMElement) { if ($oNodeListProperties->hasAttribute('text:min-label-width')) { - $oAlignment->setIndent(CommonDrawing::centimetersToPixels((float) substr($oNodeListProperties->getAttribute('text:min-label-width'), 0, -2))); + $oAlignment->setIndent(CommonDrawing::centimetersToPixels((float) \substr($oNodeListProperties->getAttribute('text:min-label-width'), 0, -2))); } if ($oNodeListProperties->hasAttribute('text:space-before')) { - $iSpaceBefore = CommonDrawing::centimetersToPixels((float) substr($oNodeListProperties->getAttribute('text:space-before'), 0, -2)); + $iSpaceBefore = CommonDrawing::centimetersToPixels((float) \substr($oNodeListProperties->getAttribute('text:space-before'), 0, -2)); $iMarginLeft = $iSpaceBefore + $oAlignment->getIndent(); $oAlignment->setMarginLeft($iMarginLeft); } } $oNodeTextProperties = $this->oXMLReader->getElement('style:text-properties', $oNodeListLevel); - if ($oNodeTextProperties instanceof DOMElement) { + if ($oNodeTextProperties instanceof \DOMElement) { if ($oNodeTextProperties->hasAttribute('fo:font-family')) { $oBullet->setBulletFont($oNodeTextProperties->getAttribute('fo:font-family')); } @@ -489,7 +489,7 @@ class ODPresentation implements ReaderInterface /** * Read Slide */ - protected function loadSlide(DOMElement $nodeSlide): bool + protected function loadSlide(\DOMElement $nodeSlide): bool { // Core $this->oPhpPresentation->createSlide(); @@ -504,7 +504,7 @@ class ODPresentation implements ReaderInterface } } foreach ($this->oXMLReader->getElements('draw:frame', $nodeSlide) as $oNodeFrame) { - if ($oNodeFrame instanceof DOMElement) { + if ($oNodeFrame instanceof \DOMElement) { if ($this->oXMLReader->getElement('draw:image', $oNodeFrame)) { $this->loadShapeDrawing($oNodeFrame); continue; @@ -522,20 +522,20 @@ class ODPresentation implements ReaderInterface /** * Read Shape Drawing */ - protected function loadShapeDrawing(DOMElement $oNodeFrame): void + protected function loadShapeDrawing(\DOMElement $oNodeFrame): void { // Core $mimetype = ''; $oNodeImage = $this->oXMLReader->getElement('draw:image', $oNodeFrame); - if ($oNodeImage instanceof DOMElement) { + if ($oNodeImage instanceof \DOMElement) { if ($oNodeImage->hasAttribute('loext:mime-type')) { $mimetype = $oNodeImage->getAttribute('loext:mime-type'); } if ($oNodeImage->hasAttribute('xlink:href')) { $sFilename = $oNodeImage->getAttribute('xlink:href'); // svm = StarView Metafile - if ('svm' == pathinfo($sFilename, PATHINFO_EXTENSION)) { + if ('svm' == \pathinfo($sFilename, PATHINFO_EXTENSION)) { return; } $imageFile = $this->oZip->getFromName($sFilename); @@ -549,21 +549,21 @@ class ODPresentation implements ReaderInterface // Contents of file if (empty($mimetype)) { $shape = new Gd(); - $shape->setImageResource(imagecreatefromstring($imageFile)); + $shape->setImageResource(\imagecreatefromstring($imageFile)); } else { $shape = new Base64(); - $shape->setData('data:' . $mimetype . ';base64,' . base64_encode($imageFile)); + $shape->setData('data:' . $mimetype . ';base64,' . \base64_encode($imageFile)); } $shape->getShadow()->setVisible(false); $shape->setName($oNodeFrame->hasAttribute('draw:name') ? $oNodeFrame->getAttribute('draw:name') : ''); $shape->setDescription($oNodeFrame->hasAttribute('draw:name') ? $oNodeFrame->getAttribute('draw:name') : ''); $shape->setResizeProportional(false); - $shape->setWidth($oNodeFrame->hasAttribute('svg:width') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:width'), 0, -2)) : 0); - $shape->setHeight($oNodeFrame->hasAttribute('svg:height') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:height'), 0, -2)) : 0); + $shape->setWidth($oNodeFrame->hasAttribute('svg:width') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:width'), 0, -2)) : 0); + $shape->setHeight($oNodeFrame->hasAttribute('svg:height') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:height'), 0, -2)) : 0); $shape->setResizeProportional(true); - $shape->setOffsetX($oNodeFrame->hasAttribute('svg:x') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:x'), 0, -2)) : 0); - $shape->setOffsetY($oNodeFrame->hasAttribute('svg:y') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:y'), 0, -2)) : 0); + $shape->setOffsetX($oNodeFrame->hasAttribute('svg:x') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:x'), 0, -2)) : 0); + $shape->setOffsetY($oNodeFrame->hasAttribute('svg:y') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:y'), 0, -2)) : 0); if ($oNodeFrame->hasAttribute('draw:style-name')) { $keyStyle = $oNodeFrame->getAttribute('draw:style-name'); @@ -579,20 +579,20 @@ class ODPresentation implements ReaderInterface /** * Read Shape RichText */ - protected function loadShapeRichText(DOMElement $oNodeFrame): void + protected function loadShapeRichText(\DOMElement $oNodeFrame): void { // Core $oShape = $this->oPhpPresentation->getActiveSlide()->createRichTextShape(); $oShape->setParagraphs([]); - $oShape->setWidth($oNodeFrame->hasAttribute('svg:width') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:width'), 0, -2)) : 0); - $oShape->setHeight($oNodeFrame->hasAttribute('svg:height') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:height'), 0, -2)) : 0); - $oShape->setOffsetX($oNodeFrame->hasAttribute('svg:x') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:x'), 0, -2)) : 0); - $oShape->setOffsetY($oNodeFrame->hasAttribute('svg:y') ? CommonDrawing::centimetersToPixels((float) substr($oNodeFrame->getAttribute('svg:y'), 0, -2)) : 0); + $oShape->setWidth($oNodeFrame->hasAttribute('svg:width') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:width'), 0, -2)) : 0); + $oShape->setHeight($oNodeFrame->hasAttribute('svg:height') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:height'), 0, -2)) : 0); + $oShape->setOffsetX($oNodeFrame->hasAttribute('svg:x') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:x'), 0, -2)) : 0); + $oShape->setOffsetY($oNodeFrame->hasAttribute('svg:y') ? CommonDrawing::centimetersToPixels((float) \substr($oNodeFrame->getAttribute('svg:y'), 0, -2)) : 0); foreach ($this->oXMLReader->getElements('draw:text-box/*', $oNodeFrame) as $oNodeParagraph) { $this->levelParagraph = 0; - if ($oNodeParagraph instanceof DOMElement) { + if ($oNodeParagraph instanceof \DOMElement) { if ('text:p' == $oNodeParagraph->nodeName) { $this->readParagraph($oShape, $oNodeParagraph); } @@ -602,7 +602,7 @@ class ODPresentation implements ReaderInterface } } - if (count($oShape->getParagraphs()) > 0) { + if (\count($oShape->getParagraphs()) > 0) { $oShape->setActiveParagraph(0); } } @@ -610,7 +610,7 @@ class ODPresentation implements ReaderInterface /** * Read Paragraph */ - protected function readParagraph(RichText $oShape, DOMElement $oNodeParent): void + protected function readParagraph(RichText $oShape, \DOMElement $oNodeParent): void { $oParagraph = $oShape->createParagraph(); if ($oNodeParent->hasAttribute('text:style-name')) { @@ -633,13 +633,13 @@ class ODPresentation implements ReaderInterface $oDomList = $this->oXMLReader->getElements('text:span', $oNodeParent); $oDomTextNodes = $this->oXMLReader->getElements('text()', $oNodeParent); foreach ($oDomTextNodes as $oDomTextNode) { - if ('' != trim($oDomTextNode->nodeValue)) { + if ('' != \trim($oDomTextNode->nodeValue)) { $oTextRun = $oParagraph->createTextRun(); - $oTextRun->setText(trim($oDomTextNode->nodeValue)); + $oTextRun->setText(\trim($oDomTextNode->nodeValue)); } } foreach ($oDomList as $oNodeRichTextElement) { - if ($oNodeRichTextElement instanceof DOMElement) { + if ($oNodeRichTextElement instanceof \DOMElement) { $this->readParagraphItem($oParagraph, $oNodeRichTextElement); } } @@ -648,7 +648,7 @@ class ODPresentation implements ReaderInterface /** * Read Paragraph Item */ - protected function readParagraphItem(Paragraph $oParagraph, DOMElement $oNodeParent): void + protected function readParagraphItem(Paragraph $oParagraph, \DOMElement $oNodeParent): void { if ($this->oXMLReader->elementExists('text:line-break', $oNodeParent)) { $oParagraph->createBreak(); @@ -661,7 +661,7 @@ class ODPresentation implements ReaderInterface } } $oTextRunLink = $this->oXMLReader->getElement('text:a', $oNodeParent); - if ($oTextRunLink instanceof DOMElement) { + if ($oTextRunLink instanceof \DOMElement) { $oTextRun->setText($oTextRunLink->nodeValue); if ($oTextRunLink->hasAttribute('xlink:href')) { $oTextRun->getHyperlink()->setUrl($oTextRunLink->getAttribute('xlink:href')); @@ -675,10 +675,10 @@ class ODPresentation implements ReaderInterface /** * Read List */ - protected function readList(RichText $oShape, DOMElement $oNodeParent): void + protected function readList(RichText $oShape, \DOMElement $oNodeParent): void { foreach ($this->oXMLReader->getElements('text:list-item/*', $oNodeParent) as $oNodeListItem) { - if ($oNodeListItem instanceof DOMElement) { + if ($oNodeListItem instanceof \DOMElement) { if ('text:p' == $oNodeListItem->nodeName) { $this->readListItem($oShape, $oNodeListItem, $oNodeParent); } @@ -694,7 +694,7 @@ class ODPresentation implements ReaderInterface /** * Read List Item */ - protected function readListItem(RichText $oShape, DOMElement $oNodeParent, DOMElement $oNodeParagraph): void + protected function readListItem(RichText $oShape, \DOMElement $oNodeParent, \DOMElement $oNodeParagraph): void { $oParagraph = $oShape->createParagraph(); if ($oNodeParagraph->hasAttribute('text:style-name')) { @@ -705,7 +705,7 @@ class ODPresentation implements ReaderInterface } } foreach ($this->oXMLReader->getElements('text:span', $oNodeParent) as $oNodeRichTextElement) { - if ($oNodeRichTextElement instanceof DOMElement) { + if ($oNodeRichTextElement instanceof \DOMElement) { $this->readParagraphItem($oParagraph, $oNodeRichTextElement); } } @@ -717,7 +717,7 @@ class ODPresentation implements ReaderInterface protected function loadStylesFile(): void { foreach ($this->oXMLReader->getElements('/office:document-styles/office:styles/*') as $oElement) { - if ($oElement instanceof DOMElement && 'draw:fill-image' == $oElement->nodeName) { + if ($oElement instanceof \DOMElement && 'draw:fill-image' == $oElement->nodeName) { $this->arrayCommonStyles[$oElement->getAttribute('draw:name')] = [ 'type' => 'image', 'path' => $oElement->hasAttribute('xlink:href') ? $oElement->getAttribute('xlink:href') : null, @@ -733,11 +733,11 @@ class ODPresentation implements ReaderInterface */ private function getExpressionUnit(string $expr): string { - if (substr($expr, -1) == '%') { + if (\substr($expr, -1) == '%') { return '%'; } - return substr($expr, -2); + return \substr($expr, -2); } /** @@ -747,10 +747,10 @@ class ODPresentation implements ReaderInterface */ private function getExpressionValue(string $expr): string { - if (substr($expr, -1) == '%') { - return substr($expr, 0, -1); + if (\substr($expr, -1) == '%') { + return \substr($expr, 0, -1); } - return substr($expr, 0, -2); + return \substr($expr, 0, -2); } } diff --git a/PhpOffice/PhpPresentation/Reader/PowerPoint2007.php b/PhpOffice/PhpPresentation/Reader/PowerPoint2007.php index a0a8957..4d040f3 100755 --- a/PhpOffice/PhpPresentation/Reader/PowerPoint2007.php +++ b/PhpOffice/PhpPresentation/Reader/PowerPoint2007.php @@ -105,16 +105,16 @@ class PowerPoint2007 implements ReaderInterface public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists - if (!file_exists($pFilename)) { + if (!\file_exists($pFilename)) { throw new FileNotFoundException($pFilename); } - $oZip = new ZipArchive(); + $oZip = new \ZipArchive(); // Is it a zip ? if (true === $oZip->open($pFilename)) { // Is it an OpenXML Document ? // Is it a Presentation ? - if (is_array($oZip->statName('[Content_Types].xml')) && is_array($oZip->statName('ppt/presentation.xml'))) { + if (\is_array($oZip->statName('[Content_Types].xml')) && \is_array($oZip->statName('ppt/presentation.xml'))) { return true; } } @@ -147,7 +147,7 @@ class PowerPoint2007 implements ReaderInterface $this->oPhpPresentation->setAllMasterSlides([]); $this->filename = $pFilename; - $this->oZip = new ZipArchive(); + $this->oZip = new \ZipArchive(); $this->oZip->open($this->filename); $docPropsCore = $this->oZip->getFromName('docProps/core.xml'); if (false !== $docPropsCore) { @@ -187,7 +187,7 @@ class PowerPoint2007 implements ReaderInterface /* @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { foreach ($xmlReader->getElements('/p:presentation/p:sldSz') as $oElement) { - if (!($oElement instanceof DOMElement)) { + if (!($oElement instanceof \DOMElement)) { continue; } $type = $oElement->getAttribute('type'); @@ -227,9 +227,9 @@ class PowerPoint2007 implements ReaderInterface $oProperties = $this->oPhpPresentation->getDocumentProperties(); foreach ($arrayProperties as $path => $property) { $oElement = $xmlReader->getElement($path); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('xsi:type') && 'dcterms:W3CDTF' == $oElement->getAttribute('xsi:type')) { - $dateTime = DateTime::createFromFormat(DateTime::W3C, $oElement->nodeValue); + $dateTime = \DateTime::createFromFormat(\DateTime::W3C, $oElement->nodeValue); $oProperties->{$property}($dateTime->getTimestamp()); } else { $oProperties->{$property}($oElement->nodeValue); @@ -245,7 +245,7 @@ class PowerPoint2007 implements ReaderInterface protected function loadCustomProperties(string $sPart): void { $xmlReader = new XMLReader(); - $sPart = str_replace(' xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"', '', $sPart); + $sPart = \str_replace(' xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"', '', $sPart); /* @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { foreach ($xmlReader->getElements('/Properties/property[@fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"]') as $element) { @@ -276,7 +276,7 @@ class PowerPoint2007 implements ReaderInterface $propertyValue = $attributeTypeBoolean->nodeValue == 'true' ? true : false; } elseif ($attributeTypeDate) { $propertyType = DocumentProperties::PROPERTY_TYPE_DATE; - $propertyValue = strtotime($attributeTypeDate->nodeValue); + $propertyValue = \strtotime($attributeTypeDate->nodeValue); } else { $propertyType = DocumentProperties::PROPERTY_TYPE_STRING; $propertyValue = $attributeTypeString->nodeValue; @@ -297,7 +297,7 @@ class PowerPoint2007 implements ReaderInterface /* @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $element = $xmlReader->getElement('/p:presentationPr/p:showPr'); - if ($element instanceof DOMElement) { + if ($element instanceof \DOMElement) { if ($element->hasAttribute('loop')) { $this->oPhpPresentation->getPresentationProperties()->setLoopContinuouslyUntilEsc( (bool) $element->getAttribute('loop') @@ -332,7 +332,7 @@ class PowerPoint2007 implements ReaderInterface if ($xmlReader->getDomFromString($sPart)) { $pathZoom = '/p:viewPr/p:slideViewPr/p:cSldViewPr/p:cViewPr/p:scale/a:sx'; $oElement = $xmlReader->getElement($pathZoom); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('d') && $oElement->hasAttribute('n')) { $this->oPhpPresentation->getPresentationProperties()->setZoom($oElement->getAttribute('n') / $oElement->getAttribute('d')); } @@ -354,7 +354,7 @@ class PowerPoint2007 implements ReaderInterface $this->loadMasterSlides($xmlReader, $fileRels); // Continue with loading the slides foreach ($xmlReader->getElements('/p:presentation/p:sldIdLst/p:sldId') as $oElement) { - if (!($oElement instanceof DOMElement)) { + if (!($oElement instanceof \DOMElement)) { continue; } $rId = $oElement->getAttribute('r:id'); @@ -362,12 +362,12 @@ class PowerPoint2007 implements ReaderInterface if (!empty($pathSlide)) { $pptSlide = $this->oZip->getFromName('ppt/' . $pathSlide); if (false !== $pptSlide) { - $slideRels = 'ppt/slides/_rels/' . basename($pathSlide) . '.rels'; + $slideRels = 'ppt/slides/_rels/' . \basename($pathSlide) . '.rels'; $this->loadRels($slideRels); - $this->loadSlide($pptSlide, basename($pathSlide)); + $this->loadSlide($pptSlide, \basename($pathSlide)); foreach ($this->arrayRels[$slideRels] as $rel) { if ('http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide' == $rel['Type']) { - $this->loadSlideNote(basename($rel['Target']), $this->oPhpPresentation->getActiveSlide()); + $this->loadSlideNote(\basename($rel['Target']), $this->oPhpPresentation->getActiveSlide()); } } } @@ -383,7 +383,7 @@ class PowerPoint2007 implements ReaderInterface { // Get all the MasterSlide Id's from the presentation.xml file foreach ($xmlReader->getElements('/p:presentation/p:sldMasterIdLst/p:sldMasterId') as $oElement) { - if (!($oElement instanceof DOMElement)) { + if (!($oElement instanceof \DOMElement)) { continue; } $rId = $oElement->getAttribute('r:id'); @@ -393,8 +393,8 @@ class PowerPoint2007 implements ReaderInterface if (!empty($pathMasterSlide)) { $pptMasterSlide = $this->oZip->getFromName('ppt/' . $pathMasterSlide); if (false !== $pptMasterSlide) { - $this->loadRels('ppt/slideMasters/_rels/' . basename($pathMasterSlide) . '.rels'); - $this->loadMasterSlide($pptMasterSlide, basename($pathMasterSlide)); + $this->loadRels('ppt/slideMasters/_rels/' . \basename($pathMasterSlide) . '.rels'); + $this->loadMasterSlide($pptMasterSlide, \basename($pathMasterSlide)); } } } @@ -415,9 +415,9 @@ class PowerPoint2007 implements ReaderInterface // Background $oElement = $xmlReader->getElement('/p:sld/p:cSld/p:bg/p:bgPr'); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $oElementColor = $xmlReader->getElement('a:solidFill/a:srgbClr', $oElement); - if ($oElementColor instanceof DOMElement) { + if ($oElementColor instanceof \DOMElement) { // Color $oColor = new Color(); $oColor->setRGB($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); @@ -429,7 +429,7 @@ class PowerPoint2007 implements ReaderInterface $oSlide->setBackground($oBackground); } $oElementColor = $xmlReader->getElement('a:solidFill/a:schemeClr', $oElement); - if ($oElementColor instanceof DOMElement) { + if ($oElementColor instanceof \DOMElement) { // Color $oColor = new SchemeColor(); $oColor->setValue($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); @@ -441,23 +441,23 @@ class PowerPoint2007 implements ReaderInterface $oSlide->setBackground($oBackground); } $oElementImage = $xmlReader->getElement('a:blipFill/a:blip', $oElement); - if ($oElementImage instanceof DOMElement) { + if ($oElementImage instanceof \DOMElement) { $relImg = $this->arrayRels['ppt/slides/_rels/' . $baseFile . '.rels'][$oElementImage->getAttribute('r:embed')]; - if (is_array($relImg)) { + if (\is_array($relImg)) { // File $pathImage = 'ppt/slides/' . $relImg['Target']; - $pathImage = explode('/', $pathImage); + $pathImage = \explode('/', $pathImage); foreach ($pathImage as $key => $partPath) { if ('..' == $partPath) { unset($pathImage[$key - 1]); unset($pathImage[$key]); } } - $pathImage = implode('/', $pathImage); + $pathImage = \implode('/', $pathImage); $contentImg = $this->oZip->getFromName($pathImage); - $tmpBkgImg = tempnam(sys_get_temp_dir(), 'PhpPresentationReaderPpt2007Bkg'); - file_put_contents($tmpBkgImg, $contentImg); + $tmpBkgImg = \tempnam(\sys_get_temp_dir(), 'PhpPresentationReaderPpt2007Bkg'); + \file_put_contents($tmpBkgImg, $contentImg); // Background $oBackground = new Slide\Background\Image(); $oBackground->setPath($tmpBkgImg); @@ -476,8 +476,8 @@ class PowerPoint2007 implements ReaderInterface $oSlide = $this->oPhpPresentation->getActiveSlide(); foreach ($this->arrayRels['ppt/slides/_rels/' . $baseFile . '.rels'] as $valueRel) { if ('http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout' == $valueRel['Type']) { - $layoutBasename = basename($valueRel['Target']); - if (array_key_exists($layoutBasename, $this->arraySlideLayouts)) { + $layoutBasename = \basename($valueRel['Target']); + if (\array_key_exists($layoutBasename, $this->arraySlideLayouts)) { $oSlide->setSlideLayout($this->arraySlideLayouts[$layoutBasename]); } break; @@ -498,7 +498,7 @@ class PowerPoint2007 implements ReaderInterface // Background $oElement = $xmlReader->getElement('/p:sldMaster/p:cSld/p:bg'); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $this->loadSlideBackground($xmlReader, $oElement, $oSlideMaster); } @@ -523,7 +523,7 @@ class PowerPoint2007 implements ReaderInterface foreach ($arrayElementTxStyles as $oElementTxStyle) { $arrayElementsLvl = $xmlReader->getElements('/p:sldMaster/p:txStyles/' . $oElementTxStyle->nodeName . '/*'); foreach ($arrayElementsLvl as $oElementLvl) { - if (!($oElementLvl instanceof DOMElement) || 'a:extLst' == $oElementLvl->nodeName) { + if (!($oElementLvl instanceof \DOMElement) || 'a:extLst' == $oElementLvl->nodeName) { continue; } $oRTParagraph = new Paragraph(); @@ -531,9 +531,9 @@ class PowerPoint2007 implements ReaderInterface if ('a:defPPr' == $oElementLvl->nodeName) { $level = 0; } else { - $level = str_replace('a:lvl', '', $oElementLvl->nodeName); - $level = str_replace('pPr', '', $level); - $level = intval($level); + $level = \str_replace('a:lvl', '', $oElementLvl->nodeName); + $level = \str_replace('pPr', '', $level); + $level = \intval($level); } if ($oElementLvl->hasAttribute('algn')) { @@ -555,7 +555,7 @@ class PowerPoint2007 implements ReaderInterface $oRTParagraph->getAlignment()->setIndent($val); } $oElementLvlDefRPR = $xmlReader->getElement('a:defRPr', $oElementLvl); - if ($oElementLvlDefRPR instanceof DOMElement) { + if ($oElementLvlDefRPR instanceof \DOMElement) { if ($oElementLvlDefRPR->hasAttribute('sz')) { $oRTParagraph->getFont()->setSize($oElementLvlDefRPR->getAttribute('sz') / 100); } @@ -567,7 +567,7 @@ class PowerPoint2007 implements ReaderInterface } } $oElementSchemeColor = $xmlReader->getElement('a:defRPr/a:solidFill/a:schemeClr', $oElementLvl); - if ($oElementSchemeColor instanceof DOMElement) { + if ($oElementSchemeColor instanceof \DOMElement) { if ($oElementSchemeColor->hasAttribute('val')) { $oSchemeColor = new SchemeColor(); $oSchemeColor->setValue($oElementSchemeColor->getAttribute('val')); @@ -592,7 +592,7 @@ class PowerPoint2007 implements ReaderInterface // Load the theme foreach ($this->arrayRels[$oSlideMaster->getRelsIndex()] as $arrayRel) { if ('http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme' == $arrayRel['Type']) { - $pptTheme = $this->oZip->getFromName('ppt/' . substr($arrayRel['Target'], strrpos($arrayRel['Target'], '../') + 3)); + $pptTheme = $this->oZip->getFromName('ppt/' . \substr($arrayRel['Target'], \strrpos($arrayRel['Target'], '../') + 3)); if (false !== $pptTheme) { $this->loadTheme($pptTheme, $oSlideMaster); } @@ -602,7 +602,7 @@ class PowerPoint2007 implements ReaderInterface // Load the Layoutslide foreach ($xmlReader->getElements('/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId') as $oElement) { - if (!($oElement instanceof DOMElement)) { + if (!($oElement instanceof \DOMElement)) { continue; } $rId = $oElement->getAttribute('r:id'); @@ -610,11 +610,11 @@ class PowerPoint2007 implements ReaderInterface $pathLayoutSlide = isset($this->arrayRels[$oSlideMaster->getRelsIndex()][$rId]) ? $this->arrayRels[$oSlideMaster->getRelsIndex()][$rId]['Target'] : ''; if (!empty($pathLayoutSlide)) { - $pptLayoutSlide = $this->oZip->getFromName('ppt/' . substr($pathLayoutSlide, strrpos($pathLayoutSlide, '../') + 3)); + $pptLayoutSlide = $this->oZip->getFromName('ppt/' . \substr($pathLayoutSlide, \strrpos($pathLayoutSlide, '../') + 3)); if (false !== $pptLayoutSlide) { - $this->loadRels('ppt/slideLayouts/_rels/' . basename($pathLayoutSlide) . '.rels'); + $this->loadRels('ppt/slideLayouts/_rels/' . \basename($pathLayoutSlide) . '.rels'); $oSlideMaster->addSlideLayout( - $this->loadLayoutSlide($pptLayoutSlide, basename($pathLayoutSlide), $oSlideMaster) + $this->loadLayoutSlide($pptLayoutSlide, \basename($pathLayoutSlide), $oSlideMaster) ); } } @@ -633,19 +633,19 @@ class PowerPoint2007 implements ReaderInterface // Name $oElement = $xmlReader->getElement('/p:sldLayout/p:cSld'); - if ($oElement instanceof DOMElement && $oElement->hasAttribute('name')) { + if ($oElement instanceof \DOMElement && $oElement->hasAttribute('name')) { $oSlideLayout->setLayoutName($oElement->getAttribute('name')); } // Background $oElement = $xmlReader->getElement('/p:sldLayout/p:cSld/p:bg'); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $this->loadSlideBackground($xmlReader, $oElement, $oSlideLayout); } // ColorMapping $oElement = $xmlReader->getElement('/p:sldLayout/p:clrMapOvr/a:overrideClrMapping'); - if ($oElement instanceof DOMElement && $oElement->hasAttributes()) { + if ($oElement instanceof \DOMElement && $oElement->hasAttributes()) { $colorMap = []; foreach ($oElement->attributes as $attr) { $colorMap[$attr->nodeName] = $attr->nodeValue; @@ -671,11 +671,11 @@ class PowerPoint2007 implements ReaderInterface if ($xmlReader->getDomFromString($sPart)) { $oElements = $xmlReader->getElements('/a:theme/a:themeElements/a:clrScheme/*'); foreach ($oElements as $oElement) { - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $oSchemeColor = new SchemeColor(); - $oSchemeColor->setValue(str_replace('a:', '', $oElement->tagName)); + $oSchemeColor->setValue(\str_replace('a:', '', $oElement->tagName)); $colorElement = $xmlReader->getElement('*', $oElement); - if ($colorElement instanceof DOMElement) { + if ($colorElement instanceof \DOMElement) { if ($colorElement->hasAttribute('lastClr')) { $oSchemeColor->setRGB($colorElement->getAttribute('lastClr')); } elseif ($colorElement->hasAttribute('val')) { @@ -688,11 +688,11 @@ class PowerPoint2007 implements ReaderInterface } } - protected function loadSlideBackground(XMLReader $xmlReader, DOMElement $oElement, AbstractSlide $oSlide): void + protected function loadSlideBackground(XMLReader $xmlReader, \DOMElement $oElement, AbstractSlide $oSlide): void { // Background color $oElementColor = $xmlReader->getElement('p:bgPr/a:solidFill/a:srgbClr', $oElement); - if ($oElementColor instanceof DOMElement) { + if ($oElementColor instanceof \DOMElement) { // Color $oColor = new Color(); $oColor->setRGB($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); @@ -705,7 +705,7 @@ class PowerPoint2007 implements ReaderInterface // Background scheme color $oElementSchemeColor = $xmlReader->getElement('p:bgRef/a:schemeClr', $oElement); - if ($oElementSchemeColor instanceof DOMElement) { + if ($oElementSchemeColor instanceof \DOMElement) { // Color $oColor = new SchemeColor(); $oColor->setValue($oElementSchemeColor->hasAttribute('val') ? $oElementSchemeColor->getAttribute('val') : null); @@ -718,23 +718,23 @@ class PowerPoint2007 implements ReaderInterface // Background image $oElementImage = $xmlReader->getElement('p:bgPr/a:blipFill/a:blip', $oElement); - if ($oElementImage instanceof DOMElement) { + if ($oElementImage instanceof \DOMElement) { $relImg = $this->arrayRels[$oSlide->getRelsIndex()][$oElementImage->getAttribute('r:embed')]; - if (is_array($relImg)) { + if (\is_array($relImg)) { // File $pathImage = 'ppt/slides/' . $relImg['Target']; - $pathImage = explode('/', $pathImage); + $pathImage = \explode('/', $pathImage); foreach ($pathImage as $key => $partPath) { if ('..' == $partPath) { unset($pathImage[$key - 1]); unset($pathImage[$key]); } } - $pathImage = implode('/', $pathImage); + $pathImage = \implode('/', $pathImage); $contentImg = $this->oZip->getFromName($pathImage); - $tmpBkgImg = tempnam(sys_get_temp_dir(), 'PhpPresentationReaderPpt2007Bkg'); - file_put_contents($tmpBkgImg, $contentImg); + $tmpBkgImg = \tempnam(\sys_get_temp_dir(), 'PhpPresentationReaderPpt2007Bkg'); + \file_put_contents($tmpBkgImg, $contentImg); // Background $oBackground = new Slide\Background\Image(); $oBackground->setPath($tmpBkgImg); @@ -757,7 +757,7 @@ class PowerPoint2007 implements ReaderInterface } } - protected function loadShapeDrawing(XMLReader $document, DOMElement $node, AbstractSlide $oSlide): void + protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, AbstractSlide $oSlide): void { // Core $document->registerNamespace('asvg', 'http://schemas.microsoft.com/office/drawing/2016/SVG/main'); @@ -771,13 +771,13 @@ class PowerPoint2007 implements ReaderInterface $fileRels = $oSlide->getRelsIndex(); $oElement = $document->getElement('p:nvPicPr/p:cNvPr', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $oShape->setName($oElement->hasAttribute('name') ? $oElement->getAttribute('name') : ''); $oShape->setDescription($oElement->hasAttribute('descr') ? $oElement->getAttribute('descr') : ''); // Hyperlink $oElementHlinkClick = $document->getElement('a:hlinkClick', $oElement); - if (is_object($oElementHlinkClick)) { + if (\is_object($oElementHlinkClick)) { $oShape->setHyperlink( $this->loadHyperlink($document, $oElementHlinkClick, $oShape->getHyperlink()) ); @@ -785,46 +785,46 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:blipFill/a:blip', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('r:embed') && isset($this->arrayRels[$fileRels][$oElement->getAttribute('r:embed')]['Target'])) { $pathImage = 'ppt/slides/' . $this->arrayRels[$fileRels][$oElement->getAttribute('r:embed')]['Target']; - $pathImage = explode('/', $pathImage); + $pathImage = \explode('/', $pathImage); foreach ($pathImage as $key => $partPath) { if ('..' == $partPath) { unset($pathImage[$key - 1]); unset($pathImage[$key]); } } - $pathImage = implode('/', $pathImage); + $pathImage = \implode('/', $pathImage); $imageFile = $this->oZip->getFromName($pathImage); if (!empty($imageFile)) { if ($oShape instanceof Gd) { - $info = getimagesizefromstring($imageFile); + $info = \getimagesizefromstring($imageFile); $oShape->setMimeType($info['mime']); - $oShape->setRenderingFunction(str_replace('/', '', $info['mime'])); - $oShape->setImageResource(imagecreatefromstring($imageFile)); + $oShape->setRenderingFunction(\str_replace('/', '', $info['mime'])); + $oShape->setImageResource(\imagecreatefromstring($imageFile)); } elseif ($oShape instanceof Base64) { - $oShape->setData('data:image/svg+xml;base64,' . base64_encode($imageFile)); + $oShape->setData('data:image/svg+xml;base64,' . \base64_encode($imageFile)); } } } } $oElement = $document->getElement('p:spPr', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $oFill = $this->loadStyleFill($document, $oElement); $oShape->setFill($oFill); } $oElement = $document->getElement('p:spPr/a:xfrm', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('rot')) { $oShape->setRotation((int) CommonDrawing::angleToDegrees((int) $oElement->getAttribute('rot'))); } } $oElement = $document->getElement('p:spPr/a:xfrm/a:off', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('x')) { $oShape->setOffsetX(CommonDrawing::emuToPixels((int) $oElement->getAttribute('x'))); } @@ -834,7 +834,7 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:spPr/a:xfrm/a:ext', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('cx')) { $oShape->setWidth(CommonDrawing::emuToPixels((int) $oElement->getAttribute('cx'))); } @@ -844,11 +844,11 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:spPr/a:effectLst', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $oShape->getShadow()->setVisible(true); $oSubElement = $document->getElement('a:outerShdw', $oElement); - if ($oSubElement instanceof DOMElement) { + if ($oSubElement instanceof \DOMElement) { if ($oSubElement->hasAttribute('blurRad')) { $oShape->getShadow()->setBlurRadius(CommonDrawing::emuToPixels((int) $oSubElement->getAttribute('blurRad'))); } @@ -864,7 +864,7 @@ class PowerPoint2007 implements ReaderInterface } $oSubElement = $document->getElement('a:outerShdw/a:srgbClr', $oElement); - if ($oSubElement instanceof DOMElement) { + if ($oSubElement instanceof \DOMElement) { if ($oSubElement->hasAttribute('val')) { $oColor = new Color(); $oColor->setRGB($oSubElement->getAttribute('val')); @@ -873,7 +873,7 @@ class PowerPoint2007 implements ReaderInterface } $oSubElement = $document->getElement('a:outerShdw/a:srgbClr/a:alpha', $oElement); - if ($oSubElement instanceof DOMElement) { + if ($oSubElement instanceof \DOMElement) { if ($oSubElement->hasAttribute('val')) { $oShape->getShadow()->setAlpha((int) $oSubElement->getAttribute('val') / 1000); } @@ -883,7 +883,7 @@ class PowerPoint2007 implements ReaderInterface $oSlide->addShape($oShape); } - protected function loadShapeRichText(XMLReader $document, DOMElement $node, $oSlide): void + protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oSlide): void { if (!$document->elementExists('p:txBody/a:p/a:r', $node) || !$oSlide instanceof AbstractSlide) { return; @@ -897,12 +897,12 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:spPr/a:xfrm', $node); - if ($oElement instanceof DOMElement && $oElement->hasAttribute('rot')) { + if ($oElement instanceof \DOMElement && $oElement->hasAttribute('rot')) { $oShape->setRotation((int) CommonDrawing::angleToDegrees((int) $oElement->getAttribute('rot'))); } $oElement = $document->getElement('p:spPr/a:xfrm/a:off', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('x')) { $oShape->setOffsetX(CommonDrawing::emuToPixels((int) $oElement->getAttribute('x'))); } @@ -912,7 +912,7 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:spPr/a:xfrm/a:ext', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('cx')) { $oShape->setWidth(CommonDrawing::emuToPixels((int) $oElement->getAttribute('cx'))); } @@ -922,7 +922,7 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:nvSpPr/p:nvPr/p:ph', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('type')) { $placeholder = new Placeholder($oElement->getAttribute('type')); $oShape->setPlaceHolder($placeholder); @@ -931,24 +931,24 @@ class PowerPoint2007 implements ReaderInterface $arrayElements = $document->getElements('p:txBody/a:p', $node); foreach ($arrayElements as $oElement) { - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { $this->loadParagraph($document, $oElement, $oShape); } } - if (count($oShape->getParagraphs()) > 0) { + if (\count($oShape->getParagraphs()) > 0) { $oShape->setActiveParagraph(0); } } - protected function loadShapeTable(XMLReader $document, DOMElement $node, AbstractSlide $oSlide): void + protected function loadShapeTable(XMLReader $document, \DOMElement $node, AbstractSlide $oSlide): void { $this->fileRels = $oSlide->getRelsIndex(); $oShape = $oSlide->createTableShape(); $oElement = $document->getElement('p:cNvPr', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('name')) { $oShape->setName($oElement->getAttribute('name')); } @@ -958,7 +958,7 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:xfrm/a:off', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('x')) { $oShape->setOffsetX(CommonDrawing::emuToPixels((int) $oElement->getAttribute('x'))); } @@ -968,7 +968,7 @@ class PowerPoint2007 implements ReaderInterface } $oElement = $document->getElement('p:xfrm/a:ext', $node); - if ($oElement instanceof DOMElement) { + if ($oElement instanceof \DOMElement) { if ($oElement->hasAttribute('cx')) { $oShape->setWidth(CommonDrawing::emuToPixels((int) $oElement->getAttribute('cx'))); } @@ -981,14 +981,14 @@ class PowerPoint2007 implements ReaderInterface $oShape->setNumColumns($arrayElements->length); $oShape->createRow(); foreach ($arrayElements as $key => $oElement) { - if ($oElement instanceof DOMElement && $oElement->getAttribute('w')) { + if ($oElement instanceof \DOMElement && $oElement->getAttribute('w')) { $oShape->getRow(0)->getCell($key)->setWidth(CommonDrawing::emuToPixels((int) $oElement->getAttribute('w'))); } } $arrayElements = $document->getElements('a:graphic/a:graphicData/a:tbl/a:tr', $node); foreach ($arrayElements as $keyRow => $oElementRow) { - if (!($oElementRow instanceof DOMElement)) { + if (!($oElementRow instanceof \DOMElement)) { continue; } if ($oShape->hasRow($keyRow)) { @@ -1001,7 +1001,7 @@ class PowerPoint2007 implements ReaderInterface } $arrayElementsCell = $document->getElements('a:tc', $oElementRow); foreach ($arrayElementsCell as $keyCell => $oElementCell) { - if (!($oElementCell instanceof DOMElement)) { + if (!($oElementCell instanceof \DOMElement)) { continue; } $oCell = $oRow->getCell($keyCell); @@ -1014,14 +1014,14 @@ class PowerPoint2007 implements ReaderInterface } foreach ($document->getElements('a:txBody/a:p', $oElementCell) as $oElementPara) { - if ($oElementPara instanceof DOMElement) { + if ($oElementPara instanceof \DOMElement) { $this->loadParagraph($document, $oElementPara, $oCell); } } $oElementTcPr = $document->getElement('a:tcPr', $oElementCell); - if ($oElementTcPr instanceof DOMElement) { - $numParagraphs = count($oCell->getParagraphs()); + if ($oElementTcPr instanceof \DOMElement) { + $numParagraphs = \count($oCell->getParagraphs()); if ($numParagraphs > 0) { if ($oElementTcPr->hasAttribute('vert')) { $oCell->getParagraph(0)->getAlignment()->setTextDirection($oElementTcPr->getAttribute('vert')); @@ -1050,27 +1050,27 @@ class PowerPoint2007 implements ReaderInterface $oBorders = new Borders(); $oElementBorderL = $document->getElement('a:lnL', $oElementTcPr); - if ($oElementBorderL instanceof DOMElement) { + if ($oElementBorderL instanceof \DOMElement) { $this->loadStyleBorder($document, $oElementBorderL, $oBorders->getLeft()); } $oElementBorderR = $document->getElement('a:lnR', $oElementTcPr); - if ($oElementBorderR instanceof DOMElement) { + if ($oElementBorderR instanceof \DOMElement) { $this->loadStyleBorder($document, $oElementBorderR, $oBorders->getRight()); } $oElementBorderT = $document->getElement('a:lnT', $oElementTcPr); - if ($oElementBorderT instanceof DOMElement) { + if ($oElementBorderT instanceof \DOMElement) { $this->loadStyleBorder($document, $oElementBorderT, $oBorders->getTop()); } $oElementBorderB = $document->getElement('a:lnB', $oElementTcPr); - if ($oElementBorderB instanceof DOMElement) { + if ($oElementBorderB instanceof \DOMElement) { $this->loadStyleBorder($document, $oElementBorderB, $oBorders->getBottom()); } $oElementBorderDiagDown = $document->getElement('a:lnTlToBr', $oElementTcPr); - if ($oElementBorderDiagDown instanceof DOMElement) { + if ($oElementBorderDiagDown instanceof \DOMElement) { $this->loadStyleBorder($document, $oElementBorderDiagDown, $oBorders->getDiagonalDown()); } $oElementBorderDiagUp = $document->getElement('a:lnBlToTr', $oElementTcPr); - if ($oElementBorderDiagUp instanceof DOMElement) { + if ($oElementBorderDiagUp instanceof \DOMElement) { $this->loadStyleBorder($document, $oElementBorderDiagUp, $oBorders->getDiagonalUp()); } $oCell->setBorders($oBorders); @@ -1082,14 +1082,14 @@ class PowerPoint2007 implements ReaderInterface /** * @param Cell|RichText $oShape */ - protected function loadParagraph(XMLReader $document, DOMElement $oElement, $oShape): void + protected function loadParagraph(XMLReader $document, \DOMElement $oElement, $oShape): void { // Core $oParagraph = $oShape->createParagraph(); $oParagraph->setRichTextElements([]); $oSubElement = $document->getElement('a:pPr', $oElement); - if ($oSubElement instanceof DOMElement) { + if ($oSubElement instanceof \DOMElement) { if ($oSubElement->hasAttribute('algn')) { $oParagraph->getAlignment()->setHorizontal($oSubElement->getAttribute('algn')); } @@ -1113,41 +1113,41 @@ class PowerPoint2007 implements ReaderInterface } $oElementLineSpacingPoints = $document->getElement('a:lnSpc/a:spcPts', $oSubElement); - if ($oElementLineSpacingPoints instanceof DOMElement) { + if ($oElementLineSpacingPoints instanceof \DOMElement) { $oParagraph->setLineSpacingMode(Paragraph::LINE_SPACING_MODE_POINT); $oParagraph->setLineSpacing($oElementLineSpacingPoints->getAttribute('val') / 100); } $oElementLineSpacingPercent = $document->getElement('a:lnSpc/a:spcPct', $oSubElement); - if ($oElementLineSpacingPercent instanceof DOMElement) { + if ($oElementLineSpacingPercent instanceof \DOMElement) { $oParagraph->setLineSpacingMode(Paragraph::LINE_SPACING_MODE_PERCENT); $oParagraph->setLineSpacing($oElementLineSpacingPercent->getAttribute('val') / 1000); } $oElementSpacingBefore = $document->getElement('a:spcBef/a:spcPts', $oSubElement); - if ($oElementSpacingBefore instanceof DOMElement) { + if ($oElementSpacingBefore instanceof \DOMElement) { $oParagraph->setSpacingBefore($oElementSpacingBefore->getAttribute('val') / 100); } $oElementSpacingAfter = $document->getElement('a:spcAft/a:spcPts', $oSubElement); - if ($oElementSpacingAfter instanceof DOMElement) { + if ($oElementSpacingAfter instanceof \DOMElement) { $oParagraph->setSpacingAfter($oElementSpacingAfter->getAttribute('val') / 100); } $oParagraph->getBulletStyle()->setBulletType(Bullet::TYPE_NONE); $oElementBuFont = $document->getElement('a:buFont', $oSubElement); - if ($oElementBuFont instanceof DOMElement) { + if ($oElementBuFont instanceof \DOMElement) { if ($oElementBuFont->hasAttribute('typeface')) { $oParagraph->getBulletStyle()->setBulletFont($oElementBuFont->getAttribute('typeface')); } } $oElementBuChar = $document->getElement('a:buChar', $oSubElement); - if ($oElementBuChar instanceof DOMElement) { + if ($oElementBuChar instanceof \DOMElement) { $oParagraph->getBulletStyle()->setBulletType(Bullet::TYPE_BULLET); if ($oElementBuChar->hasAttribute('char')) { $oParagraph->getBulletStyle()->setBulletChar($oElementBuChar->getAttribute('char')); } } $oElementBuAutoNum = $document->getElement('a:buAutoNum', $oSubElement); - if ($oElementBuAutoNum instanceof DOMElement) { + if ($oElementBuAutoNum instanceof \DOMElement) { $oParagraph->getBulletStyle()->setBulletType(Bullet::TYPE_NUMERIC); if ($oElementBuAutoNum->hasAttribute('type')) { $oParagraph->getBulletStyle()->setBulletNumericStyle($oElementBuAutoNum->getAttribute('type')); @@ -1157,13 +1157,13 @@ class PowerPoint2007 implements ReaderInterface } } $oElementBuClr = $document->getElement('a:buClr', $oSubElement); - if ($oElementBuClr instanceof DOMElement) { + if ($oElementBuClr instanceof \DOMElement) { $oColor = new Color(); /** * @todo Create protected for reading Color */ $oElementColor = $document->getElement('a:srgbClr', $oElementBuClr); - if ($oElementColor instanceof DOMElement) { + if ($oElementColor instanceof \DOMElement) { $oColor->setRGB($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); } $oParagraph->getBulletStyle()->setBulletColor($oColor); @@ -1171,7 +1171,7 @@ class PowerPoint2007 implements ReaderInterface } $arraySubElements = $document->getElements('(a:r|a:br)', $oElement); foreach ($arraySubElements as $oSubElement) { - if (!($oSubElement instanceof DOMElement)) { + if (!($oSubElement instanceof \DOMElement)) { continue; } if ('a:br' == $oSubElement->tagName) { @@ -1179,7 +1179,7 @@ class PowerPoint2007 implements ReaderInterface } if ('a:r' == $oSubElement->tagName) { $oElementrPr = $document->getElement('a:rPr', $oSubElement); - if (is_object($oElementrPr)) { + if (\is_object($oElementrPr)) { $oText = $oParagraph->createTextRun(); if ($oElementrPr->hasAttribute('b')) { @@ -1201,14 +1201,14 @@ class PowerPoint2007 implements ReaderInterface } // Color $oElementSrgbClr = $document->getElement('a:solidFill/a:srgbClr', $oElementrPr); - if (is_object($oElementSrgbClr) && $oElementSrgbClr->hasAttribute('val')) { + if (\is_object($oElementSrgbClr) && $oElementSrgbClr->hasAttribute('val')) { $oColor = new Color(); $oColor->setRGB($oElementSrgbClr->getAttribute('val')); $oText->getFont()->setColor($oColor); } // Hyperlink $oElementHlinkClick = $document->getElement('a:hlinkClick', $oElementrPr); - if (is_object($oElementHlinkClick)) { + if (\is_object($oElementHlinkClick)) { $oText->setHyperlink( $this->loadHyperlink($document, $oElementHlinkClick, $oText->getHyperlink()) ); @@ -1216,21 +1216,21 @@ class PowerPoint2007 implements ReaderInterface // Font $oElementFontFormat = null; $oElementFontFormatLatin = $document->getElement('a:latin', $oElementrPr); - if (is_object($oElementFontFormatLatin)) { + if (\is_object($oElementFontFormatLatin)) { $oText->getFont()->setFormat(Font::FORMAT_LATIN); $oElementFontFormat = $oElementFontFormatLatin; } $oElementFontFormatEastAsian = $document->getElement('a:ea', $oElementrPr); - if (is_object($oElementFontFormatEastAsian)) { + if (\is_object($oElementFontFormatEastAsian)) { $oText->getFont()->setFormat(Font::FORMAT_EAST_ASIAN); $oElementFontFormat = $oElementFontFormatEastAsian; } $oElementFontFormatComplexScript = $document->getElement('a:cs', $oElementrPr); - if (is_object($oElementFontFormatComplexScript)) { + if (\is_object($oElementFontFormatComplexScript)) { $oText->getFont()->setFormat(Font::FORMAT_COMPLEX_SCRIPT); $oElementFontFormat = $oElementFontFormatComplexScript; } - if (is_object($oElementFontFormat) && $oElementFontFormat->hasAttribute('typeface')) { + if (\is_object($oElementFontFormat) && $oElementFontFormat->hasAttribute('typeface')) { $oText->getFont()->setName($oElementFontFormat->getAttribute('typeface')); } @@ -1244,7 +1244,7 @@ class PowerPoint2007 implements ReaderInterface } } - protected function loadHyperlink(XMLReader $xmlReader, DOMElement $element, Hyperlink $hyperlink): Hyperlink + protected function loadHyperlink(XMLReader $xmlReader, \DOMElement $element, Hyperlink $hyperlink): Hyperlink { if ($element->hasAttribute('tooltip')) { $hyperlink->setTooltip($element->getAttribute('tooltip')); @@ -1261,7 +1261,7 @@ class PowerPoint2007 implements ReaderInterface return $hyperlink; } - protected function loadStyleBorder(XMLReader $xmlReader, DOMElement $oElement, Border $oBorder): void + protected function loadStyleBorder(XMLReader $xmlReader, \DOMElement $oElement, Border $oBorder): void { if ($oElement->hasAttribute('w')) { $oBorder->setLineWidth($oElement->getAttribute('w') / 12700); @@ -1271,54 +1271,54 @@ class PowerPoint2007 implements ReaderInterface } $oElementNoFill = $xmlReader->getElement('a:noFill', $oElement); - if ($oElementNoFill instanceof DOMElement && Border::LINE_SINGLE == $oBorder->getLineStyle()) { + if ($oElementNoFill instanceof \DOMElement && Border::LINE_SINGLE == $oBorder->getLineStyle()) { $oBorder->setLineStyle(Border::LINE_NONE); } $oElementColor = $xmlReader->getElement('a:solidFill/a:srgbClr', $oElement); - if ($oElementColor instanceof DOMElement) { + if ($oElementColor instanceof \DOMElement) { $oBorder->setColor($this->loadStyleColor($xmlReader, $oElementColor)); } $oElementDashStyle = $xmlReader->getElement('a:prstDash', $oElement); - if ($oElementDashStyle instanceof DOMElement && $oElementDashStyle->hasAttribute('val')) { + if ($oElementDashStyle instanceof \DOMElement && $oElementDashStyle->hasAttribute('val')) { $oBorder->setDashStyle($oElementDashStyle->getAttribute('val')); } } - protected function loadStyleColor(XMLReader $xmlReader, DOMElement $oElement): Color + protected function loadStyleColor(XMLReader $xmlReader, \DOMElement $oElement): Color { $oColor = new Color(); $oColor->setRGB($oElement->getAttribute('val')); $oElementAlpha = $xmlReader->getElement('a:alpha', $oElement); - if ($oElementAlpha instanceof DOMElement && $oElementAlpha->hasAttribute('val')) { - $alpha = strtoupper(dechex((($oElementAlpha->getAttribute('val') / 1000) / 100) * 255)); + if ($oElementAlpha instanceof \DOMElement && $oElementAlpha->hasAttribute('val')) { + $alpha = \strtoupper(\dechex((($oElementAlpha->getAttribute('val') / 1000) / 100) * 255)); $oColor->setRGB($oElement->getAttribute('val'), $alpha); } return $oColor; } - protected function loadStyleFill(XMLReader $xmlReader, DOMElement $oElement): ?Fill + protected function loadStyleFill(XMLReader $xmlReader, \DOMElement $oElement): ?Fill { // Gradient fill $oElementFill = $xmlReader->getElement('a:gradFill', $oElement); - if ($oElementFill instanceof DOMElement) { + if ($oElementFill instanceof \DOMElement) { $oFill = new Fill(); $oFill->setFillType(Fill::FILL_GRADIENT_LINEAR); $oElementColor = $xmlReader->getElement('a:gsLst/a:gs[@pos="0"]/a:srgbClr', $oElementFill); - if ($oElementColor instanceof DOMElement && $oElementColor->hasAttribute('val')) { + if ($oElementColor instanceof \DOMElement && $oElementColor->hasAttribute('val')) { $oFill->setStartColor($this->loadStyleColor($xmlReader, $oElementColor)); } $oElementColor = $xmlReader->getElement('a:gsLst/a:gs[@pos="100000"]/a:srgbClr', $oElementFill); - if ($oElementColor instanceof DOMElement && $oElementColor->hasAttribute('val')) { + if ($oElementColor instanceof \DOMElement && $oElementColor->hasAttribute('val')) { $oFill->setEndColor($this->loadStyleColor($xmlReader, $oElementColor)); } $oRotation = $xmlReader->getElement('a:lin', $oElementFill); - if ($oRotation instanceof DOMElement && $oRotation->hasAttribute('ang')) { + if ($oRotation instanceof \DOMElement && $oRotation->hasAttribute('ang')) { $oFill->setRotation(CommonDrawing::angleToDegrees((int) $oRotation->getAttribute('ang'))); } @@ -1327,12 +1327,12 @@ class PowerPoint2007 implements ReaderInterface // Solid fill $oElementFill = $xmlReader->getElement('a:solidFill', $oElement); - if ($oElementFill instanceof DOMElement) { + if ($oElementFill instanceof \DOMElement) { $oFill = new Fill(); $oFill->setFillType(Fill::FILL_SOLID); $oElementColor = $xmlReader->getElement('a:srgbClr', $oElementFill); - if ($oElementColor instanceof DOMElement) { + if ($oElementColor instanceof \DOMElement) { $oFill->setStartColor($this->loadStyleColor($xmlReader, $oElementColor)); } @@ -1350,7 +1350,7 @@ class PowerPoint2007 implements ReaderInterface /* @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { foreach ($xmlReader->getElements('*') as $oNode) { - if (!($oNode instanceof DOMElement)) { + if (!($oNode instanceof \DOMElement)) { continue; } $this->arrayRels[$fileRels][$oNode->getAttribute('Id')] = [ @@ -1364,16 +1364,16 @@ class PowerPoint2007 implements ReaderInterface /** * @param AbstractSlide|Note $oSlide - * @param DOMNodeList $oElements + * @param \DOMNodeList<\DOMNode> $oElements * * @throws FeatureNotImplementedException * * @internal param $baseFile */ - protected function loadSlideShapes($oSlide, DOMNodeList $oElements, XMLReader $xmlReader): void + protected function loadSlideShapes($oSlide, \DOMNodeList $oElements, XMLReader $xmlReader): void { foreach ($oElements as $oNode) { - if (!($oNode instanceof DOMElement)) { + if (!($oNode instanceof \DOMElement)) { continue; } switch ($oNode->tagName) { diff --git a/PhpOffice/PhpPresentation/Reader/PowerPoint97.php b/PhpOffice/PhpPresentation/Reader/PowerPoint97.php index b28b9fa..477ae4a 100755 --- a/PhpOffice/PhpPresentation/Reader/PowerPoint97.php +++ b/PhpOffice/PhpPresentation/Reader/PowerPoint97.php @@ -397,7 +397,7 @@ class PowerPoint97 implements ReaderInterface public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists - if (!file_exists($pFilename)) { + if (!\file_exists($pFilename)) { throw new FileNotFoundException($pFilename); } @@ -408,7 +408,7 @@ class PowerPoint97 implements ReaderInterface $ole->read($pFilename); return true; - } catch (Exception $e) { + } catch (\Exception $e) { return false; } } @@ -652,8 +652,8 @@ class PowerPoint97 implements ReaderInterface $recLen = self::getInt4d($stream, $pos + 4); return [ - 'recVer' => ($rec >> 0) & bindec('1111'), - 'recInstance' => ($rec >> 4) & bindec('111111111111'), + 'recVer' => ($rec >> 0) & \bindec('1111'), + 'recInstance' => ($rec >> 4) & \bindec('111111111111'), 'recType' => $recType, 'recLen' => $recLen, ]; @@ -664,7 +664,7 @@ class PowerPoint97 implements ReaderInterface */ public static function getInt1d(string $data, int $pos): int { - return ord($data[$pos]); + return \ord($data[$pos]); } /** @@ -672,7 +672,7 @@ class PowerPoint97 implements ReaderInterface */ public static function getInt2d(string $data, int $pos): int { - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8); + return \ord($data[$pos]) | (\ord($data[$pos + 1]) << 8); } /** @@ -683,15 +683,15 @@ class PowerPoint97 implements ReaderInterface // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $or24 = ord($data[$pos + 3]); + $or24 = \ord($data[$pos + 3]); $ord24 = ($or24 & 127) << 24; if ($or24 >= 128) { // negative number - $ord24 = -abs((256 - $or24) << 24); + $ord24 = -\abs((256 - $or24) << 24); } - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $ord24; + return \ord($data[$pos]) | (\ord($data[$pos + 1]) << 8) | (\ord($data[$pos + 2]) << 16) | $ord24; } /** @@ -781,7 +781,7 @@ class PowerPoint97 implements ReaderInterface $char = self::getInt2d($stream, $pos); $pos += 2; $exObjList['recLen'] -= 2; - $this->arrayHyperlinks[$exHyperlinkId]['text'] .= chr($char); + $this->arrayHyperlinks[$exHyperlinkId]['text'] .= \chr($char); } } // targetAtom @@ -794,7 +794,7 @@ class PowerPoint97 implements ReaderInterface $char = self::getInt2d($stream, $pos); $pos += 2; $exObjList['recLen'] -= 2; - $this->arrayHyperlinks[$exHyperlinkId]['url'] .= chr($char); + $this->arrayHyperlinks[$exHyperlinkId]['url'] .= \chr($char); } } // locationAtom @@ -807,7 +807,7 @@ class PowerPoint97 implements ReaderInterface $char = self::getInt2d($stream, $pos); $pos += 2; $exObjList['recLen'] -= 2; - $string .= chr($char); + $string .= \chr($char); } } break; @@ -845,7 +845,7 @@ class PowerPoint97 implements ReaderInterface $char = self::getInt2d($stream, $pos); $pos += 2; $fontCollection['recLen'] -= 2; - $string .= chr($char); + $string .= \chr($char); } $this->arrayFonts[] = $string; @@ -1238,7 +1238,7 @@ class PowerPoint97 implements ReaderInterface ++$arrayReturn['length']; --$data['recLen']; // BLIPFileData - $arrayReturn['picture'] = substr($this->streamPictures, $pos + $arrayReturn['length'], $data['recLen']); + $arrayReturn['picture'] = \substr($this->streamPictures, $pos + $arrayReturn['length'], $data['recLen']); $arrayReturn['length'] += $data['recLen']; break; default: @@ -1431,10 +1431,10 @@ class PowerPoint97 implements ReaderInterface //@link : http://msdn.microsoft.com/en-us/library/dd947973(v=office.12).aspx if (0x0000 == $rhChild['recInstance']) { //@todo : MouseClickTextInteractiveInfoAtom - $arrayReturn['hyperlink'][count($arrayReturn['hyperlink']) - 1]['start'] = self::getInt4d($stream, $pos + +$arrayReturn['length']); + $arrayReturn['hyperlink'][\count($arrayReturn['hyperlink']) - 1]['start'] = self::getInt4d($stream, $pos + +$arrayReturn['length']); $arrayReturn['length'] += 4; - $arrayReturn['hyperlink'][count($arrayReturn['hyperlink']) - 1]['end'] = self::getInt4d($stream, $pos + +$arrayReturn['length']); + $arrayReturn['hyperlink'][\count($arrayReturn['hyperlink']) - 1]['end'] = self::getInt4d($stream, $pos + +$arrayReturn['length']); $arrayReturn['length'] += 4; } if (0x0001 == $rhChild['recInstance']) { @@ -1552,7 +1552,7 @@ class PowerPoint97 implements ReaderInterface // Informations about group are not defined $arrayDimensions = []; $bIsGroup = false; - if (is_object($this->oCurrentGroup)) { + if (\is_object($this->oCurrentGroup)) { if (!$this->bFirstShapeGroup) { if ($clientAnchor['length'] > 0) { // $this->oCurrentGroup->setOffsetX($clientAnchor['left']); @@ -1578,7 +1578,7 @@ class PowerPoint97 implements ReaderInterface // isDrawing $drawingPib = $shpPrimaryOptions['pib']; if (isset($this->arrayPictures[$drawingPib - 1])) { - $gdImage = imagecreatefromstring($this->arrayPictures[$drawingPib - 1]); + $gdImage = \imagecreatefromstring($this->arrayPictures[$drawingPib - 1]); $arrayReturn['shape'] = new Drawing\Gd(); $arrayReturn['shape']->setImageResource($gdImage); } @@ -1621,7 +1621,7 @@ class PowerPoint97 implements ReaderInterface } } // Texte - $sText = substr(isset($clientTextbox['text']) ? $clientTextbox['text'] : '', $start, $clientTextbox['part' . $inc]['partLength']); + $sText = \substr(isset($clientTextbox['text']) ? $clientTextbox['text'] : '', $start, $clientTextbox['part' . $inc]['partLength']); $sHyperlinkURL = ''; if (empty($sText)) { // Is there a hyperlink ? @@ -1637,9 +1637,9 @@ class PowerPoint97 implements ReaderInterface } // New paragraph $bCreateParagraph = false; - if (false !== strpos($sText, "\r")) { + if (false !== \strpos($sText, "\r")) { $bCreateParagraph = true; - $sText = str_replace("\r", '', $sText); + $sText = \str_replace("\r", '', $sText); } // TextRun $txtRun = $arrayReturn['shape']->createTextRun($sText); @@ -1787,10 +1787,10 @@ class PowerPoint97 implements ReaderInterface $data['recLen'] -= $fileBlock['length']; // Core //@todo - if (!is_null($fileBlock['shape'])) { + if (!\is_null($fileBlock['shape'])) { switch ($this->inMainType) { case self::RT_NOTES: - $arrayIdxSlide = array_flip($this->arrayNotes); + $arrayIdxSlide = \array_flip($this->arrayNotes); if ($this->currentNote > 0 && isset($arrayIdxSlide[$this->currentNote])) { $oSlide = $this->oPhpPresentation->getSlide($arrayIdxSlide[$this->currentNote]); if (0 == $oSlide->getNote()->getShapeCollection()->count()) { @@ -1843,9 +1843,9 @@ class PowerPoint97 implements ReaderInterface $optOp = self::getInt4d($this->streamPowerpointDocument, $pos + $arrayReturn['length']); $arrayReturn['length'] += 4; $officeArtFOPTE[] = [ - 'opid' => ($opid >> 0) & bindec('11111111111111'), - 'fBid' => ($opid >> 14) & bindec('1'), - 'fComplex' => ($opid >> 15) & bindec('1'), + 'opid' => ($opid >> 0) & \bindec('11111111111111'), + 'fBid' => ($opid >> 14) & \bindec('1'), + 'fComplex' => ($opid >> 15) & \bindec('1'), 'op' => $optOp, ]; } @@ -1975,9 +1975,9 @@ class PowerPoint97 implements ReaderInterface $arrayReturn['length'] += 4; $data['recLen'] -= 4; $officeArtFOPTE[] = [ - 'opid' => ($opid >> 0) & bindec('11111111111111'), - 'fBid' => ($opid >> 14) & bindec('1'), - 'fComplex' => ($opid >> 15) & bindec('1'), + 'opid' => ($opid >> 0) & \bindec('11111111111111'), + 'fBid' => ($opid >> 14) & \bindec('1'), + 'fComplex' => ($opid >> 15) & \bindec('1'), 'op' => $optOp, ]; } @@ -2120,17 +2120,17 @@ class PowerPoint97 implements ReaderInterface case 0x0181: // Fill : fillColor //@link : http://msdn.microsoft.com/en-us/library/dd921332(v=office.12).aspx - $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor = \str_pad(\dechex(($opt['op'] >> 0) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex(($opt['op'] >> 8) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex(($opt['op'] >> 16) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); // echo 'fillColor : '.$strColor.EOL; break; case 0x0183: // Fill : fillBackColor //@link : http://msdn.microsoft.com/en-us/library/dd950634(v=office.12).aspx - $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor = \str_pad(\dechex(($opt['op'] >> 0) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex(($opt['op'] >> 8) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex(($opt['op'] >> 16) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); // echo 'fillBackColor : '.$strColor.EOL; break; case 0x0193: @@ -2150,9 +2150,9 @@ class PowerPoint97 implements ReaderInterface case 0x01C0: // Line Style : lineColor //@link : http://msdn.microsoft.com/en-us/library/dd920397(v=office.12).aspx - $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor = \str_pad(\dechex(($opt['op'] >> 0) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex(($opt['op'] >> 8) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex(($opt['op'] >> 16) & \bindec('11111111')), 2, '0', STR_PAD_LEFT); $arrayReturn['lineColor'] = $strColor; break; case 0x01C1: @@ -2277,10 +2277,10 @@ class PowerPoint97 implements ReaderInterface // data $data = self::getInt4d($this->streamPowerpointDocument, $pos + $arrayReturn['length']); $arrayReturn['length'] += 4; - $arrayReturn['fGroup'] = ($data >> 0) & bindec('1'); - $arrayReturn['fChild'] = ($data >> 1) & bindec('1'); - $arrayReturn['fPatriarch'] = ($data >> 2) & bindec('1'); - $arrayReturn['fDeleted'] = ($data >> 3) & bindec('1'); + $arrayReturn['fGroup'] = ($data >> 0) & \bindec('1'); + $arrayReturn['fChild'] = ($data >> 1) & \bindec('1'); + $arrayReturn['fPatriarch'] = ($data >> 2) & \bindec('1'); + $arrayReturn['fDeleted'] = ($data >> 3) & \bindec('1'); } return $arrayReturn; @@ -2399,7 +2399,7 @@ class PowerPoint97 implements ReaderInterface ]; do { $dataHeaderRG = $this->loadRecordHeader($stream, $pos + $arrayReturn['length']); - if (in_array($dataHeaderRG['recType'], $array)) { + if (\in_array($dataHeaderRG['recType'], $array)) { switch ($dataHeaderRG['recType']) { case self::RT_PROGTAGS: $dataRG = $this->readRecordShapeProgTagsContainer($stream, $pos + $arrayReturn['length']); @@ -2418,7 +2418,7 @@ class PowerPoint97 implements ReaderInterface throw new FeatureNotImplementedException(); } } - } while (in_array($dataHeaderRG['recType'], $array)); + } while (\in_array($dataHeaderRG['recType'], $array)); } return $arrayReturn; @@ -2445,7 +2445,7 @@ class PowerPoint97 implements ReaderInterface $pos += 4; $rHeader['recLen'] -= 4; //$persistId = ($data >> 0) & bindec('11111111111111111111'); - $cPersist = ($data >> 20) & bindec('111111111111'); + $cPersist = ($data >> 20) & \bindec('111111111111'); $rgPersistOffset = []; for ($inc = 0; $inc < $cPersist; ++$inc) { @@ -3023,46 +3023,46 @@ class PowerPoint97 implements ReaderInterface $arrayReturn['length'] += 4; $masksData = []; - $masksData['bold'] = ($masks >> 0) & bindec('1'); - $masksData['italic'] = ($masks >> 1) & bindec('1'); - $masksData['underline'] = ($masks >> 2) & bindec('1'); - $masksData['unused1'] = ($masks >> 3) & bindec('1'); - $masksData['shadow'] = ($masks >> 4) & bindec('1'); - $masksData['fehint'] = ($masks >> 5) & bindec('1'); - $masksData['unused2'] = ($masks >> 6) & bindec('1'); - $masksData['kumi'] = ($masks >> 7) & bindec('1'); - $masksData['unused3'] = ($masks >> 8) & bindec('1'); - $masksData['emboss'] = ($masks >> 9) & bindec('1'); - $masksData['fHasStyle'] = ($masks >> 10) & bindec('1111'); - $masksData['unused4'] = ($masks >> 14) & bindec('11'); - $masksData['typeface'] = ($masks >> 16) & bindec('1'); - $masksData['size'] = ($masks >> 17) & bindec('1'); - $masksData['color'] = ($masks >> 18) & bindec('1'); - $masksData['position'] = ($masks >> 19) & bindec('1'); - $masksData['pp10ext'] = ($masks >> 20) & bindec('1'); - $masksData['oldEATypeface'] = ($masks >> 21) & bindec('1'); - $masksData['ansiTypeface'] = ($masks >> 22) & bindec('1'); - $masksData['symbolTypeface'] = ($masks >> 23) & bindec('1'); - $masksData['newEATypeface'] = ($masks >> 24) & bindec('1'); - $masksData['csTypeface'] = ($masks >> 25) & bindec('1'); - $masksData['pp11ext'] = ($masks >> 26) & bindec('1'); + $masksData['bold'] = ($masks >> 0) & \bindec('1'); + $masksData['italic'] = ($masks >> 1) & \bindec('1'); + $masksData['underline'] = ($masks >> 2) & \bindec('1'); + $masksData['unused1'] = ($masks >> 3) & \bindec('1'); + $masksData['shadow'] = ($masks >> 4) & \bindec('1'); + $masksData['fehint'] = ($masks >> 5) & \bindec('1'); + $masksData['unused2'] = ($masks >> 6) & \bindec('1'); + $masksData['kumi'] = ($masks >> 7) & \bindec('1'); + $masksData['unused3'] = ($masks >> 8) & \bindec('1'); + $masksData['emboss'] = ($masks >> 9) & \bindec('1'); + $masksData['fHasStyle'] = ($masks >> 10) & \bindec('1111'); + $masksData['unused4'] = ($masks >> 14) & \bindec('11'); + $masksData['typeface'] = ($masks >> 16) & \bindec('1'); + $masksData['size'] = ($masks >> 17) & \bindec('1'); + $masksData['color'] = ($masks >> 18) & \bindec('1'); + $masksData['position'] = ($masks >> 19) & \bindec('1'); + $masksData['pp10ext'] = ($masks >> 20) & \bindec('1'); + $masksData['oldEATypeface'] = ($masks >> 21) & \bindec('1'); + $masksData['ansiTypeface'] = ($masks >> 22) & \bindec('1'); + $masksData['symbolTypeface'] = ($masks >> 23) & \bindec('1'); + $masksData['newEATypeface'] = ($masks >> 24) & \bindec('1'); + $masksData['csTypeface'] = ($masks >> 25) & \bindec('1'); + $masksData['pp11ext'] = ($masks >> 26) & \bindec('1'); if (1 == $masksData['bold'] || 1 == $masksData['italic'] || 1 == $masksData['underline'] || 1 == $masksData['shadow'] || 1 == $masksData['fehint'] || 1 == $masksData['kumi'] || 1 == $masksData['emboss'] || 1 == $masksData['fHasStyle']) { $data = self::getInt2d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 2; $fontStyleFlags = []; - $fontStyleFlags['bold'] = ($data >> 0) & bindec('1'); - $fontStyleFlags['italic'] = ($data >> 1) & bindec('1'); - $fontStyleFlags['underline'] = ($data >> 2) & bindec('1'); - $fontStyleFlags['unused1'] = ($data >> 3) & bindec('1'); - $fontStyleFlags['shadow'] = ($data >> 4) & bindec('1'); - $fontStyleFlags['fehint'] = ($data >> 5) & bindec('1'); - $fontStyleFlags['unused2'] = ($data >> 6) & bindec('1'); - $fontStyleFlags['kumi'] = ($data >> 7) & bindec('1'); - $fontStyleFlags['unused3'] = ($data >> 8) & bindec('1'); - $fontStyleFlags['emboss'] = ($data >> 9) & bindec('1'); - $fontStyleFlags['pp9rt'] = ($data >> 10) & bindec('1111'); - $fontStyleFlags['unused4'] = ($data >> 14) & bindec('11'); + $fontStyleFlags['bold'] = ($data >> 0) & \bindec('1'); + $fontStyleFlags['italic'] = ($data >> 1) & \bindec('1'); + $fontStyleFlags['underline'] = ($data >> 2) & \bindec('1'); + $fontStyleFlags['unused1'] = ($data >> 3) & \bindec('1'); + $fontStyleFlags['shadow'] = ($data >> 4) & \bindec('1'); + $fontStyleFlags['fehint'] = ($data >> 5) & \bindec('1'); + $fontStyleFlags['unused2'] = ($data >> 6) & \bindec('1'); + $fontStyleFlags['kumi'] = ($data >> 7) & \bindec('1'); + $fontStyleFlags['unused3'] = ($data >> 8) & \bindec('1'); + $fontStyleFlags['emboss'] = ($data >> 9) & \bindec('1'); + $fontStyleFlags['pp9rt'] = ($data >> 10) & \bindec('1111'); + $fontStyleFlags['unused4'] = ($data >> 14) & \bindec('11'); $arrayReturn['bold'] = (1 == $fontStyleFlags['bold']) ? true : false; $arrayReturn['italic'] = (1 == $fontStyleFlags['italic']) ? true : false; @@ -3100,9 +3100,9 @@ class PowerPoint97 implements ReaderInterface ++$arrayReturn['length']; if (0xFE == $index) { - $strColor = str_pad(dechex($red), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex($green), 2, '0', STR_PAD_LEFT); - $strColor .= str_pad(dechex($blue), 2, '0', STR_PAD_LEFT); + $strColor = \str_pad(\dechex($red), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex($green), 2, '0', STR_PAD_LEFT); + $strColor .= \str_pad(\dechex($blue), 2, '0', STR_PAD_LEFT); $arrayReturn['color'] = new Color('FF' . $strColor); } @@ -3142,47 +3142,47 @@ class PowerPoint97 implements ReaderInterface $arrayReturn['length'] += 4; $masksData = []; - $masksData['hasBullet'] = ($masks >> 0) & bindec('1'); - $masksData['bulletHasFont'] = ($masks >> 1) & bindec('1'); - $masksData['bulletHasColor'] = ($masks >> 2) & bindec('1'); - $masksData['bulletHasSize'] = ($masks >> 3) & bindec('1'); - $masksData['bulletFont'] = ($masks >> 4) & bindec('1'); - $masksData['bulletColor'] = ($masks >> 5) & bindec('1'); - $masksData['bulletSize'] = ($masks >> 6) & bindec('1'); - $masksData['bulletChar'] = ($masks >> 7) & bindec('1'); - $masksData['leftMargin'] = ($masks >> 8) & bindec('1'); - $masksData['unused'] = ($masks >> 9) & bindec('1'); - $masksData['indent'] = ($masks >> 10) & bindec('1'); - $masksData['align'] = ($masks >> 11) & bindec('1'); - $masksData['lineSpacing'] = ($masks >> 12) & bindec('1'); - $masksData['spaceBefore'] = ($masks >> 13) & bindec('1'); - $masksData['spaceAfter'] = ($masks >> 14) & bindec('1'); - $masksData['defaultTabSize'] = ($masks >> 15) & bindec('1'); - $masksData['fontAlign'] = ($masks >> 16) & bindec('1'); - $masksData['charWrap'] = ($masks >> 17) & bindec('1'); - $masksData['wordWrap'] = ($masks >> 18) & bindec('1'); - $masksData['overflow'] = ($masks >> 19) & bindec('1'); - $masksData['tabStops'] = ($masks >> 20) & bindec('1'); - $masksData['textDirection'] = ($masks >> 21) & bindec('1'); - $masksData['reserved1'] = ($masks >> 22) & bindec('1'); - $masksData['bulletBlip'] = ($masks >> 23) & bindec('1'); - $masksData['bulletScheme'] = ($masks >> 24) & bindec('1'); - $masksData['bulletHasScheme'] = ($masks >> 25) & bindec('1'); + $masksData['hasBullet'] = ($masks >> 0) & \bindec('1'); + $masksData['bulletHasFont'] = ($masks >> 1) & \bindec('1'); + $masksData['bulletHasColor'] = ($masks >> 2) & \bindec('1'); + $masksData['bulletHasSize'] = ($masks >> 3) & \bindec('1'); + $masksData['bulletFont'] = ($masks >> 4) & \bindec('1'); + $masksData['bulletColor'] = ($masks >> 5) & \bindec('1'); + $masksData['bulletSize'] = ($masks >> 6) & \bindec('1'); + $masksData['bulletChar'] = ($masks >> 7) & \bindec('1'); + $masksData['leftMargin'] = ($masks >> 8) & \bindec('1'); + $masksData['unused'] = ($masks >> 9) & \bindec('1'); + $masksData['indent'] = ($masks >> 10) & \bindec('1'); + $masksData['align'] = ($masks >> 11) & \bindec('1'); + $masksData['lineSpacing'] = ($masks >> 12) & \bindec('1'); + $masksData['spaceBefore'] = ($masks >> 13) & \bindec('1'); + $masksData['spaceAfter'] = ($masks >> 14) & \bindec('1'); + $masksData['defaultTabSize'] = ($masks >> 15) & \bindec('1'); + $masksData['fontAlign'] = ($masks >> 16) & \bindec('1'); + $masksData['charWrap'] = ($masks >> 17) & \bindec('1'); + $masksData['wordWrap'] = ($masks >> 18) & \bindec('1'); + $masksData['overflow'] = ($masks >> 19) & \bindec('1'); + $masksData['tabStops'] = ($masks >> 20) & \bindec('1'); + $masksData['textDirection'] = ($masks >> 21) & \bindec('1'); + $masksData['reserved1'] = ($masks >> 22) & \bindec('1'); + $masksData['bulletBlip'] = ($masks >> 23) & \bindec('1'); + $masksData['bulletScheme'] = ($masks >> 24) & \bindec('1'); + $masksData['bulletHasScheme'] = ($masks >> 25) & \bindec('1'); $bulletFlags = []; if (1 == $masksData['hasBullet'] || 1 == $masksData['bulletHasFont'] || 1 == $masksData['bulletHasColor'] || 1 == $masksData['bulletHasSize']) { $data = self::getInt2d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 2; - $bulletFlags['fHasBullet'] = ($data >> 0) & bindec('1'); - $bulletFlags['fBulletHasFont'] = ($data >> 1) & bindec('1'); - $bulletFlags['fBulletHasColor'] = ($data >> 2) & bindec('1'); - $bulletFlags['fBulletHasSize'] = ($data >> 3) & bindec('1'); + $bulletFlags['fHasBullet'] = ($data >> 0) & \bindec('1'); + $bulletFlags['fBulletHasFont'] = ($data >> 1) & \bindec('1'); + $bulletFlags['fBulletHasColor'] = ($data >> 2) & \bindec('1'); + $bulletFlags['fBulletHasSize'] = ($data >> 3) & \bindec('1'); } if (1 == $masksData['bulletChar']) { $data = self::getInt2d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 2; - $arrayReturn['bulletChar'] = chr($data); + $arrayReturn['bulletChar'] = \chr($data); } if (1 == $masksData['bulletFont']) { // $data = self::getInt2d($stream, $pos); @@ -3252,12 +3252,12 @@ class PowerPoint97 implements ReaderInterface if (1 == $masksData['leftMargin']) { $data = self::getInt2d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 2; - $arrayReturn['leftMargin'] = (int) round($data / 6); + $arrayReturn['leftMargin'] = (int) \round($data / 6); } if (1 == $masksData['indent']) { $data = self::getInt2d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 2; - $arrayReturn['indent'] = (int) round($data / 6); + $arrayReturn['indent'] = (int) \round($data / 6); } if (1 == $masksData['defaultTabSize']) { // $data = self::getInt2d($stream, $pos + $arrayReturn['length']); @@ -3303,24 +3303,24 @@ class PowerPoint97 implements ReaderInterface $data = self::getInt4d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 4; $masksData = []; - $masksData['spell'] = ($data >> 0) & bindec('1'); - $masksData['lang'] = ($data >> 1) & bindec('1'); - $masksData['altLang'] = ($data >> 2) & bindec('1'); - $masksData['unused1'] = ($data >> 3) & bindec('1'); - $masksData['unused2'] = ($data >> 4) & bindec('1'); - $masksData['fPp10ext'] = ($data >> 5) & bindec('1'); - $masksData['fBidi'] = ($data >> 6) & bindec('1'); - $masksData['unused3'] = ($data >> 7) & bindec('1'); - $masksData['reserved1'] = ($data >> 8) & bindec('1'); - $masksData['smartTag'] = ($data >> 9) & bindec('1'); + $masksData['spell'] = ($data >> 0) & \bindec('1'); + $masksData['lang'] = ($data >> 1) & \bindec('1'); + $masksData['altLang'] = ($data >> 2) & \bindec('1'); + $masksData['unused1'] = ($data >> 3) & \bindec('1'); + $masksData['unused2'] = ($data >> 4) & \bindec('1'); + $masksData['fPp10ext'] = ($data >> 5) & \bindec('1'); + $masksData['fBidi'] = ($data >> 6) & \bindec('1'); + $masksData['unused3'] = ($data >> 7) & \bindec('1'); + $masksData['reserved1'] = ($data >> 8) & \bindec('1'); + $masksData['smartTag'] = ($data >> 9) & \bindec('1'); if (1 == $masksData['spell']) { $data = self::getInt2d($stream, $pos + $arrayReturn['length']); $arrayReturn['length'] += 2; $masksSpell = []; - $masksSpell['error'] = ($data >> 0) & bindec('1'); - $masksSpell['clean'] = ($data >> 1) & bindec('1'); - $masksSpell['grammar'] = ($data >> 2) & bindec('1'); + $masksSpell['error'] = ($data >> 0) & \bindec('1'); + $masksSpell['clean'] = ($data >> 1) & \bindec('1'); + $masksSpell['grammar'] = ($data >> 2) & \bindec('1'); } if (1 == $masksData['lang']) { // $data = self::getInt2d($stream, $pos); @@ -3362,19 +3362,19 @@ class PowerPoint97 implements ReaderInterface $arrayReturn['length'] += 4; $masksData = []; - $masksData['fDefaultTabSize'] = ($data >> 0) & bindec('1'); - $masksData['fCLevels'] = ($data >> 1) & bindec('1'); - $masksData['fTabStops'] = ($data >> 2) & bindec('1'); - $masksData['fLeftMargin1'] = ($data >> 3) & bindec('1'); - $masksData['fLeftMargin2'] = ($data >> 4) & bindec('1'); - $masksData['fLeftMargin3'] = ($data >> 5) & bindec('1'); - $masksData['fLeftMargin4'] = ($data >> 6) & bindec('1'); - $masksData['fLeftMargin5'] = ($data >> 7) & bindec('1'); - $masksData['fIndent1'] = ($data >> 8) & bindec('1'); - $masksData['fIndent2'] = ($data >> 9) & bindec('1'); - $masksData['fIndent3'] = ($data >> 10) & bindec('1'); - $masksData['fIndent4'] = ($data >> 11) & bindec('1'); - $masksData['fIndent5'] = ($data >> 12) & bindec('1'); + $masksData['fDefaultTabSize'] = ($data >> 0) & \bindec('1'); + $masksData['fCLevels'] = ($data >> 1) & \bindec('1'); + $masksData['fTabStops'] = ($data >> 2) & \bindec('1'); + $masksData['fLeftMargin1'] = ($data >> 3) & \bindec('1'); + $masksData['fLeftMargin2'] = ($data >> 4) & \bindec('1'); + $masksData['fLeftMargin3'] = ($data >> 5) & \bindec('1'); + $masksData['fLeftMargin4'] = ($data >> 6) & \bindec('1'); + $masksData['fLeftMargin5'] = ($data >> 7) & \bindec('1'); + $masksData['fIndent1'] = ($data >> 8) & \bindec('1'); + $masksData['fIndent2'] = ($data >> 9) & \bindec('1'); + $masksData['fIndent3'] = ($data >> 10) & \bindec('1'); + $masksData['fIndent4'] = ($data >> 11) & \bindec('1'); + $masksData['fIndent5'] = ($data >> 12) & \bindec('1'); if (1 == $masksData['fCLevels']) { throw new FeatureNotImplementedException(); diff --git a/PhpOffice/PhpPresentation/Reader/Serialized.php b/PhpOffice/PhpPresentation/Reader/Serialized.php index 33de31b..173c7cc 100755 --- a/PhpOffice/PhpPresentation/Reader/Serialized.php +++ b/PhpOffice/PhpPresentation/Reader/Serialized.php @@ -49,7 +49,7 @@ class Serialized implements ReaderInterface public function fileSupportsUnserializePhpPresentation(string $pFilename): bool { // Check if file exists - if (!file_exists($pFilename)) { + if (!\file_exists($pFilename)) { throw new FileNotFoundException($pFilename); } @@ -66,7 +66,7 @@ class Serialized implements ReaderInterface public function load(string $pFilename): PhpPresentation { // Check if file exists - if (!file_exists($pFilename)) { + if (!\file_exists($pFilename)) { throw new FileNotFoundException($pFilename); } @@ -85,7 +85,7 @@ class Serialized implements ReaderInterface */ private function loadSerialized(string $pFilename): PhpPresentation { - $oArchive = new ZipArchive(); + $oArchive = new \ZipArchive(); if (true !== $oArchive->open($pFilename)) { throw new InvalidFileFormatException($pFilename, Serialized::class); } @@ -95,15 +95,15 @@ class Serialized implements ReaderInterface throw new InvalidFileFormatException($pFilename, Serialized::class, 'The file PhpPresentation.xml is malformed'); } - $xmlData = simplexml_load_string($xmlContent); - $file = unserialize(base64_decode((string) $xmlData->data)); + $xmlData = \simplexml_load_string($xmlContent); + $file = \unserialize(\base64_decode((string) $xmlData->data)); // Update media links for ($i = 0; $i < $file->getSlideCount(); ++$i) { for ($j = 0; $j < $file->getSlide($i)->getShapeCollection()->count(); ++$j) { if ($file->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { $imgTemp = $file->getSlide($i)->getShapeCollection()->offsetGet($j); - $imgPath = 'zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME); + $imgPath = 'zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . \pathinfo($imgTemp->getPath(), PATHINFO_BASENAME); if ($imgTemp instanceof DrawingFile) { $imgTemp->setPath($imgPath, false); } else { diff --git a/PhpOffice/PhpPresentation/Shape/AbstractGraphic.php b/PhpOffice/PhpPresentation/Shape/AbstractGraphic.php index e7a4e73..86ef329 100755 --- a/PhpOffice/PhpPresentation/Shape/AbstractGraphic.php +++ b/PhpOffice/PhpPresentation/Shape/AbstractGraphic.php @@ -164,7 +164,7 @@ abstract class AbstractGraphic extends AbstractShape implements ComparableInterf // Resize proportional? if ($this->resizeProportional && 0 != $pValue && 0 != $this->width) { $ratio = $this->height / $this->width; - $this->height = (int) round($ratio * $pValue); + $this->height = (int) \round($ratio * $pValue); } // Set width @@ -183,7 +183,7 @@ abstract class AbstractGraphic extends AbstractShape implements ComparableInterf // Resize proportional? if ($this->resizeProportional && 0 != $pValue && 0 != $this->height) { $ratio = $this->width / $this->height; - $this->width = (int) round($ratio * $pValue); + $this->width = (int) \round($ratio * $pValue); } // Set height @@ -205,10 +205,10 @@ abstract class AbstractGraphic extends AbstractShape implements ComparableInterf $yratio = $height / $this->height; if ($this->resizeProportional && !(0 == $width || 0 == $height)) { if (($xratio * $this->height) < $height) { - $this->height = (int) ceil($xratio * $this->height); + $this->height = (int) \ceil($xratio * $this->height); $this->width = $width; } else { - $this->width = (int) ceil($yratio * $this->width); + $this->width = (int) \ceil($yratio * $this->width); $this->height = $height; } } @@ -245,6 +245,6 @@ abstract class AbstractGraphic extends AbstractShape implements ComparableInterf */ public function getHashCode(): string { - return md5($this->name . $this->description . parent::getHashCode() . __CLASS__); + return \md5($this->name . $this->description . parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart.php b/PhpOffice/PhpPresentation/Shape/Chart.php index 3d56b73..2854a9f 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart.php +++ b/PhpOffice/PhpPresentation/Shape/Chart.php @@ -171,7 +171,7 @@ class Chart extends AbstractGraphic implements ComparableInterface */ public function setDisplayBlankAs(string $value): self { - if (in_array($value, [self::BLANKAS_GAP, self::BLANKAS_SPAN, self::BLANKAS_ZERO])) { + if (\in_array($value, [self::BLANKAS_GAP, self::BLANKAS_SPAN, self::BLANKAS_ZERO])) { $this->displayBlankAs = $value; } @@ -209,6 +209,6 @@ class Chart extends AbstractGraphic implements ComparableInterface */ public function getHashCode(): string { - return md5(parent::getHashCode() . $this->title->getHashCode() . $this->legend->getHashCode() . $this->plotArea->getHashCode() . $this->view3D->getHashCode() . ($this->includeSpreadsheet ? 1 : 0) . __CLASS__); + return \md5(parent::getHashCode() . $this->title->getHashCode() . $this->legend->getHashCode() . $this->plotArea->getHashCode() . $this->view3D->getHashCode() . ($this->includeSpreadsheet ? 1 : 0) . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Axis.php b/PhpOffice/PhpPresentation/Shape/Chart/Axis.php index 86e1878..2a6c71c 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Axis.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Axis.php @@ -232,7 +232,7 @@ class Axis implements ComparableInterface */ public function setMinBounds(int $minBounds = null): self { - $this->minBounds = is_null($minBounds) ? null : $minBounds; + $this->minBounds = \is_null($minBounds) ? null : $minBounds; return $this; } @@ -252,7 +252,7 @@ class Axis implements ComparableInterface */ public function setMaxBounds(int $maxBounds = null): self { - $this->maxBounds = is_null($maxBounds) ? null : $maxBounds; + $this->maxBounds = \is_null($maxBounds) ? null : $maxBounds; return $this; } @@ -454,7 +454,7 @@ class Axis implements ComparableInterface */ public function getHashCode(): string { - return md5($this->title . $this->formatCode . __CLASS__); + return \md5($this->title . $this->formatCode . __CLASS__); } /** @@ -533,7 +533,7 @@ class Axis implements ComparableInterface */ public function setTickLabelPosition(string $value = self::TICK_LABEL_POSITION_NEXT_TO): self { - if (in_array($value, [ + if (\in_array($value, [ self::TICK_LABEL_POSITION_HIGH, self::TICK_LABEL_POSITION_LOW, self::TICK_LABEL_POSITION_NEXT_TO, diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Legend.php b/PhpOffice/PhpPresentation/Shape/Chart/Legend.php index 6878f62..878adfe 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Legend.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Legend.php @@ -332,7 +332,7 @@ class Legend implements ComparableInterface */ public function getHashCode(): string { - return md5($this->position . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->font->getHashCode() . $this->border->getHashCode() . $this->fill->getHashCode() . $this->alignment->getHashCode() . ($this->visible ? 't' : 'f') . __CLASS__); + return \md5($this->position . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->font->getHashCode() . $this->border->getHashCode() . $this->fill->getHashCode() . $this->alignment->getHashCode() . ($this->visible ? 't' : 'f') . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Chart/PlotArea.php b/PhpOffice/PhpPresentation/Shape/Chart/PlotArea.php index 2eb9717..c0fd35d 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/PlotArea.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/PlotArea.php @@ -95,7 +95,7 @@ class PlotArea implements ComparableInterface */ public function getType(): AbstractType { - if (is_null($this->type)) { + if (\is_null($this->type)) { throw new UndefinedChartTypeException(); } @@ -208,7 +208,7 @@ class PlotArea implements ComparableInterface */ public function getHashCode(): string { - return md5((is_null($this->type) ? 'null' : $this->type->getHashCode()) . $this->axisX->getHashCode() . $this->axisY->getHashCode() . $this->offsetX . $this->offsetY . $this->width . $this->height . __CLASS__); + return \md5((\is_null($this->type) ? 'null' : $this->type->getHashCode()) . $this->axisX->getHashCode() . $this->axisY->getHashCode() . $this->offsetX . $this->offsetY . $this->width . $this->height . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Series.php b/PhpOffice/PhpPresentation/Shape/Chart/Series.php index ea1bf49..021236d 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Series.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Series.php @@ -369,7 +369,7 @@ class Series implements ComparableInterface public function hasShowSeparator(): bool { - return !is_null($this->separator); + return !\is_null($this->separator); } public function setSeparator(?string $pValue): self @@ -477,7 +477,7 @@ class Series implements ComparableInterface */ public function getHashCode(): string { - return md5((is_null($this->fill) ? 'null' : $this->fill->getHashCode()) . (is_null($this->font) ? 'null' : $this->font->getHashCode()) . var_export($this->values, true) . var_export($this, true) . __CLASS__); + return \md5((\is_null($this->fill) ? 'null' : $this->fill->getHashCode()) . (\is_null($this->font) ? 'null' : $this->font->getHashCode()) . \var_export($this->values, true) . \var_export($this, true) . __CLASS__); } /** @@ -515,7 +515,7 @@ class Series implements ComparableInterface { $this->font = clone $this->font; $this->marker = clone $this->marker; - if (is_object($this->outline)) { + if (\is_object($this->outline)) { $this->outline = clone $this->outline; } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Title.php b/PhpOffice/PhpPresentation/Shape/Chart/Title.php index a031657..8d5c4ee 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Title.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Title.php @@ -272,7 +272,7 @@ class Title implements ComparableInterface */ public function getHashCode(): string { - return md5($this->text . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->font->getHashCode() . $this->alignment->getHashCode() . ($this->visible ? 't' : 'f') . __CLASS__); + return \md5($this->text . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->font->getHashCode() . $this->alignment->getHashCode() . ($this->visible ? 't' : 'f') . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/AbstractTypeLine.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/AbstractTypeLine.php index 3040f0b..a740eeb 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/AbstractTypeLine.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/AbstractTypeLine.php @@ -60,6 +60,6 @@ class AbstractTypeLine extends AbstractType */ public function getHashCode(): string { - return md5($this->isSmooth() ? '1' : '0'); + return \md5($this->isSmooth() ? '1' : '0'); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Area.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Area.php index 49fc9bd..37400ef 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Area.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Area.php @@ -39,6 +39,6 @@ class Area extends AbstractType implements ComparableInterface $hash .= $series->getHashCode(); } - return md5($hash . __CLASS__); + return \md5($hash . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar.php index 9ea5b3d..ac48a02 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar.php @@ -34,6 +34,6 @@ class Bar extends AbstractTypeBar implements ComparableInterface */ public function getHashCode(): string { - return md5(parent::getHashCode() . __CLASS__); + return \md5(parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar3D.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar3D.php index 1011ad0..dfe3a5e 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar3D.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Bar3D.php @@ -34,6 +34,6 @@ class Bar3D extends AbstractTypeBar implements ComparableInterface */ public function getHashCode(): string { - return md5(parent::getHashCode() . __CLASS__); + return \md5(parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Doughnut.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Doughnut.php index 292c823..53c8698 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Doughnut.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Doughnut.php @@ -69,6 +69,6 @@ class Doughnut extends AbstractTypePie implements ComparableInterface */ public function getHashCode(): string { - return md5(parent::getHashCode() . __CLASS__); + return \md5(parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Line.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Line.php index cefca9d..708bb7c 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Line.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Line.php @@ -36,6 +36,6 @@ class Line extends AbstractTypeLine implements ComparableInterface $hash .= $series->getHashCode(); } - return md5(parent::getHashCode() . $hash . __CLASS__); + return \md5(parent::getHashCode() . $hash . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie.php index 53cb6b1..8091f3b 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie.php @@ -34,6 +34,6 @@ class Pie extends AbstractTypePie implements ComparableInterface */ public function getHashCode(): string { - return md5(parent::getHashCode() . __CLASS__); + return \md5(parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie3D.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie3D.php index 05689c6..36cb2fc 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie3D.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Pie3D.php @@ -34,6 +34,6 @@ class Pie3D extends AbstractTypePie implements ComparableInterface */ public function getHashCode(): string { - return md5(parent::getHashCode() . __CLASS__); + return \md5(parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Radar.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Radar.php index 9f45b5d..24fc6ea 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Radar.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Radar.php @@ -36,6 +36,6 @@ class Radar extends AbstractType implements ComparableInterface $hash .= $series->getHashCode(); } - return md5($hash . __CLASS__); + return \md5($hash . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/Type/Scatter.php b/PhpOffice/PhpPresentation/Shape/Chart/Type/Scatter.php index 58f2576..f830768 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/Type/Scatter.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/Type/Scatter.php @@ -36,6 +36,6 @@ class Scatter extends AbstractTypeLine implements ComparableInterface $hash .= $series->getHashCode(); } - return md5(parent::getHashCode() . $hash . __CLASS__); + return \md5(parent::getHashCode() . $hash . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Chart/View3D.php b/PhpOffice/PhpPresentation/Shape/Chart/View3D.php index 21bbaee..b9cfe85 100755 --- a/PhpOffice/PhpPresentation/Shape/Chart/View3D.php +++ b/PhpOffice/PhpPresentation/Shape/Chart/View3D.php @@ -228,7 +228,7 @@ class View3D implements ComparableInterface */ public function getHashCode(): string { - return md5($this->rotationX . $this->rotationY . ($this->rightAngleAxes ? 't' : 'f') . $this->perspective . $this->heightPercent . $this->depthPercent . __CLASS__); + return \md5($this->rotationX . $this->rotationY . ($this->rightAngleAxes ? 't' : 'f') . $this->perspective . $this->heightPercent . $this->depthPercent . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Comment.php b/PhpOffice/PhpPresentation/Shape/Comment.php index d909e05..a74109e 100755 --- a/PhpOffice/PhpPresentation/Shape/Comment.php +++ b/PhpOffice/PhpPresentation/Shape/Comment.php @@ -47,7 +47,7 @@ class Comment extends AbstractShape implements ComparableInterface public function __construct() { parent::__construct(); - $this->setDate(time()); + $this->setDate(\time()); } public function getAuthor(): ?Author diff --git a/PhpOffice/PhpPresentation/Shape/Comment/Author.php b/PhpOffice/PhpPresentation/Shape/Comment/Author.php index 59784f3..e30caf5 100755 --- a/PhpOffice/PhpPresentation/Shape/Comment/Author.php +++ b/PhpOffice/PhpPresentation/Shape/Comment/Author.php @@ -104,6 +104,6 @@ class Author */ public function getHashCode(): string { - return md5($this->getInitials() . $this->getName() . __CLASS__); + return \md5($this->getInitials() . $this->getName() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Drawing/Base64.php b/PhpOffice/PhpPresentation/Shape/Drawing/Base64.php index 9d4dfbc..3f1cc77 100755 --- a/PhpOffice/PhpPresentation/Shape/Drawing/Base64.php +++ b/PhpOffice/PhpPresentation/Shape/Drawing/Base64.php @@ -57,7 +57,7 @@ class Base64 extends AbstractDrawingAdapter public function __construct() { parent::__construct(); - $this->uniqueName = md5(rand(0, 9999) . time() . rand(0, 9999)); + $this->uniqueName = \md5(\rand(0, 9999) . \time() . \rand(0, 9999)); $this->data = ''; } @@ -75,10 +75,10 @@ class Base64 extends AbstractDrawingAdapter public function getContents(): string { - list(, $imageContents) = explode(';', $this->getData()); - list(, $imageContents) = explode(',', $imageContents); + list(, $imageContents) = \explode(';', $this->getData()); + list(, $imageContents) = \explode(',', $imageContents); - return base64_decode($imageContents); + return \base64_decode($imageContents); } /** @@ -86,10 +86,10 @@ class Base64 extends AbstractDrawingAdapter */ public function getExtension(): string { - list($data) = explode(';', $this->getData()); - list(, $mime) = explode(':', $data); + list($data) = \explode(';', $this->getData()); + list(, $mime) = \explode(':', $data); - if (!array_key_exists($mime, $this->arrayMimeExtension)) { + if (!\array_key_exists($mime, $this->arrayMimeExtension)) { throw new UnauthorizedMimetypeException($mime, $this->arrayMimeExtension); } @@ -103,22 +103,22 @@ class Base64 extends AbstractDrawingAdapter public function getMimeType(): string { - list($data) = explode(';', $this->getData()); - list(, $mime) = explode(':', $data); + list($data) = \explode(';', $this->getData()); + list(, $mime) = \explode(':', $data); if (!empty($mime)) { return $mime; } $sImage = $this->getContents(); - if (!function_exists('getimagesizefromstring')) { - $uri = 'data://application/octet-stream;base64,' . base64_encode($sImage); - $image = getimagesize($uri); + if (!\function_exists('getimagesizefromstring')) { + $uri = 'data://application/octet-stream;base64,' . \base64_encode($sImage); + $image = \getimagesize($uri); } else { - $image = getimagesizefromstring($sImage); + $image = \getimagesizefromstring($sImage); } - return image_type_to_mime_type($image[2]); + return \image_type_to_mime_type($image[2]); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Drawing/File.php b/PhpOffice/PhpPresentation/Shape/Drawing/File.php index 754985a..d4fb3d5 100755 --- a/PhpOffice/PhpPresentation/Shape/Drawing/File.php +++ b/PhpOffice/PhpPresentation/Shape/Drawing/File.php @@ -51,7 +51,7 @@ class File extends AbstractDrawingAdapter public function setPath(string $pValue = '', bool $pVerifyFile = true): self { if ($pVerifyFile) { - if (!file_exists($pValue)) { + if (!\file_exists($pValue)) { throw new FileNotFoundException($pValue); } } @@ -59,7 +59,7 @@ class File extends AbstractDrawingAdapter if ($pVerifyFile) { if (0 == $this->width && 0 == $this->height) { - list($this->width, $this->height) = getimagesize($this->getPath()); + list($this->width, $this->height) = \getimagesize($this->getPath()); } } @@ -73,7 +73,7 @@ class File extends AbstractDrawingAdapter public function getExtension(): string { - return pathinfo($this->getPath(), PATHINFO_EXTENSION); + return \pathinfo($this->getPath(), PATHINFO_EXTENSION); } /** @@ -84,21 +84,21 @@ class File extends AbstractDrawingAdapter if (!CommonFile::fileExists($this->getPath())) { throw new FileNotFoundException($this->getPath()); } - $image = getimagesizefromstring(CommonFile::fileGetContents($this->getPath())); + $image = \getimagesizefromstring(CommonFile::fileGetContents($this->getPath())); - if (is_array($image)) { - return image_type_to_mime_type($image[2]); + if (\is_array($image)) { + return \image_type_to_mime_type($image[2]); } - return mime_content_type($this->getPath()); + return \mime_content_type($this->getPath()); } public function getIndexedFilename(): string { - $output = str_replace('.' . $this->getExtension(), '', pathinfo($this->getPath(), PATHINFO_FILENAME)); + $output = \str_replace('.' . $this->getExtension(), '', \pathinfo($this->getPath(), PATHINFO_FILENAME)); $output .= $this->getImageIndex(); $output .= '.' . $this->getExtension(); - $output = str_replace(' ', '_', $output); + $output = \str_replace(' ', '_', $output); return $output; } diff --git a/PhpOffice/PhpPresentation/Shape/Drawing/Gd.php b/PhpOffice/PhpPresentation/Shape/Drawing/Gd.php index 59bcf8d..c660fe0 100755 --- a/PhpOffice/PhpPresentation/Shape/Drawing/Gd.php +++ b/PhpOffice/PhpPresentation/Shape/Drawing/Gd.php @@ -68,7 +68,7 @@ class Gd extends AbstractDrawingAdapter public function __construct() { parent::__construct(); - $this->uniqueName = md5(rand(0, 9999) . time() . rand(0, 9999)); + $this->uniqueName = \md5(\rand(0, 9999) . \time() . \rand(0, 9999)); } /** @@ -92,10 +92,10 @@ class Gd extends AbstractDrawingAdapter { $this->imageResource = $value; - if (!is_null($this->imageResource)) { + if (!\is_null($this->imageResource)) { // Get width/height - $this->width = imagesx($this->imageResource); - $this->height = imagesy($this->imageResource); + $this->width = \imagesx($this->imageResource); + $this->height = \imagesy($this->imageResource); } return $this; @@ -149,22 +149,22 @@ class Gd extends AbstractDrawingAdapter public function getContents(): string { - ob_start(); + \ob_start(); if (self::MIMETYPE_DEFAULT === $this->getMimeType()) { - imagealphablending($this->getImageResource(), false); - imagesavealpha($this->getImageResource(), true); + \imagealphablending($this->getImageResource(), false); + \imagesavealpha($this->getImageResource(), true); } - call_user_func($this->getRenderingFunction(), $this->getImageResource()); - $imageContents = ob_get_contents(); - ob_end_clean(); + \call_user_func($this->getRenderingFunction(), $this->getImageResource()); + $imageContents = \ob_get_contents(); + \ob_end_clean(); return $imageContents; } public function getExtension(): string { - $extension = strtolower($this->getMimeType()); - $extension = explode('/', $extension); + $extension = \strtolower($this->getMimeType()); + $extension = \explode('/', $extension); $extension = $extension[1]; return $extension; diff --git a/PhpOffice/PhpPresentation/Shape/Drawing/ZipFile.php b/PhpOffice/PhpPresentation/Shape/Drawing/ZipFile.php index 2a921e9..bbea89a 100755 --- a/PhpOffice/PhpPresentation/Shape/Drawing/ZipFile.php +++ b/PhpOffice/PhpPresentation/Shape/Drawing/ZipFile.php @@ -72,7 +72,7 @@ class ZipFile extends AbstractDrawingAdapter public function getExtension(): string { - return pathinfo($this->getZipFileIn(), PATHINFO_EXTENSION); + return \pathinfo($this->getZipFileIn(), PATHINFO_EXTENSION); } /** @@ -85,39 +85,39 @@ class ZipFile extends AbstractDrawingAdapter } $oArchive = new \ZipArchive(); $oArchive->open($this->getZipFileOut()); - if (!function_exists('getimagesizefromstring')) { - $uri = 'data://application/octet-stream;base64,' . base64_encode($oArchive->getFromName($this->getZipFileIn())); - $image = getimagesize($uri); + if (!\function_exists('getimagesizefromstring')) { + $uri = 'data://application/octet-stream;base64,' . \base64_encode($oArchive->getFromName($this->getZipFileIn())); + $image = \getimagesize($uri); } else { - $image = getimagesizefromstring($oArchive->getFromName($this->getZipFileIn())); + $image = \getimagesizefromstring($oArchive->getFromName($this->getZipFileIn())); } - return image_type_to_mime_type($image[2]); + return \image_type_to_mime_type($image[2]); } public function getIndexedFilename(): string { - $output = pathinfo($this->getZipFileIn(), PATHINFO_FILENAME); - $output = str_replace('.' . $this->getExtension(), '', $output); + $output = \pathinfo($this->getZipFileIn(), PATHINFO_FILENAME); + $output = \str_replace('.' . $this->getExtension(), '', $output); $output .= $this->getImageIndex(); $output .= '.' . $this->getExtension(); - $output = str_replace(' ', '_', $output); + $output = \str_replace(' ', '_', $output); return $output; } protected function getZipFileOut(): string { - $path = str_replace('zip://', '', $this->getPath()); - $path = explode('#', $path); + $path = \str_replace('zip://', '', $this->getPath()); + $path = \explode('#', $path); return empty($path[0]) ? '' : $path[0]; } protected function getZipFileIn(): string { - $path = str_replace('zip://', '', $this->getPath()); - $path = explode('#', $path); + $path = \str_replace('zip://', '', $this->getPath()); + $path = \explode('#', $path); return empty($path[1]) ? '' : $path[1]; } diff --git a/PhpOffice/PhpPresentation/Shape/Group.php b/PhpOffice/PhpPresentation/Shape/Group.php index dcb29ac..ffe0689 100755 --- a/PhpOffice/PhpPresentation/Shape/Group.php +++ b/PhpOffice/PhpPresentation/Shape/Group.php @@ -30,7 +30,7 @@ class Group extends AbstractShape implements ShapeContainerInterface /** * Collection of shapes. * - * @var array|ArrayObject + * @var array|\ArrayObject */ private $shapeCollection; @@ -53,13 +53,13 @@ class Group extends AbstractShape implements ShapeContainerInterface parent::__construct(); // Shape collection - $this->shapeCollection = new ArrayObject(); + $this->shapeCollection = new \ArrayObject(); } /** * Get collection of shapes. * - * @return array|ArrayObject + * @return array|\ArrayObject */ public function getShapeCollection() { diff --git a/PhpOffice/PhpPresentation/Shape/Hyperlink.php b/PhpOffice/PhpPresentation/Shape/Hyperlink.php index 06e0be9..5661893 100755 --- a/PhpOffice/PhpPresentation/Shape/Hyperlink.php +++ b/PhpOffice/PhpPresentation/Shape/Hyperlink.php @@ -159,7 +159,7 @@ class Hyperlink */ public function isInternal(): bool { - return false !== strpos($this->url, 'ppaction://'); + return false !== \strpos($this->url, 'ppaction://'); } /** @@ -169,7 +169,7 @@ class Hyperlink */ public function getHashCode(): string { - return md5($this->url . $this->tooltip . __CLASS__); + return \md5($this->url . $this->tooltip . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Line.php b/PhpOffice/PhpPresentation/Shape/Line.php index be7574d..758f270 100755 --- a/PhpOffice/PhpPresentation/Shape/Line.php +++ b/PhpOffice/PhpPresentation/Shape/Line.php @@ -55,6 +55,6 @@ class Line extends AbstractShape implements ComparableInterface */ public function getHashCode(): string { - return md5($this->getBorder()->getLineStyle() . parent::getHashCode() . __CLASS__); + return \md5($this->getBorder()->getLineStyle() . parent::getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Media.php b/PhpOffice/PhpPresentation/Shape/Media.php index 1207195..04587de 100755 --- a/PhpOffice/PhpPresentation/Shape/Media.php +++ b/PhpOffice/PhpPresentation/Shape/Media.php @@ -30,7 +30,7 @@ class Media extends File implements ComparableInterface { public function getMimeType(): string { - switch (strtolower($this->getExtension())) { + switch (\strtolower($this->getExtension())) { case 'mp4': $mimetype = 'video/mp4'; break; diff --git a/PhpOffice/PhpPresentation/Shape/RichText.php b/PhpOffice/PhpPresentation/Shape/RichText.php index b908277..957dcb6 100755 --- a/PhpOffice/PhpPresentation/Shape/RichText.php +++ b/PhpOffice/PhpPresentation/Shape/RichText.php @@ -207,8 +207,8 @@ class RichText extends AbstractShape implements ComparableInterface */ public function setActiveParagraph(int $index = 0): Paragraph { - if ($index >= count($this->richTextParagraphs)) { - throw new OutOfBoundsException(0, count($this->richTextParagraphs), $index); + if ($index >= \count($this->richTextParagraphs)) { + throw new OutOfBoundsException(0, \count($this->richTextParagraphs), $index); } $this->activeParagraph = $index; @@ -223,8 +223,8 @@ class RichText extends AbstractShape implements ComparableInterface */ public function getParagraph(int $index = 0): Paragraph { - if ($index >= count($this->richTextParagraphs)) { - throw new OutOfBoundsException(0, count($this->richTextParagraphs), $index); + if ($index >= \count($this->richTextParagraphs)) { + throw new OutOfBoundsException(0, \count($this->richTextParagraphs), $index); } return $this->richTextParagraphs[$index]; @@ -235,7 +235,7 @@ class RichText extends AbstractShape implements ComparableInterface */ public function createParagraph(): Paragraph { - $numParagraphs = count($this->richTextParagraphs); + $numParagraphs = \count($this->richTextParagraphs); if ($numParagraphs > 0) { $alignment = clone $this->getActiveParagraph()->getAlignment(); $font = clone $this->getActiveParagraph()->getFont(); @@ -243,7 +243,7 @@ class RichText extends AbstractShape implements ComparableInterface } $this->richTextParagraphs[] = new Paragraph(); - $this->activeParagraph = count($this->richTextParagraphs) - 1; + $this->activeParagraph = \count($this->richTextParagraphs) - 1; if (isset($alignment)) { $this->getActiveParagraph()->setAlignment($alignment); @@ -351,7 +351,7 @@ class RichText extends AbstractShape implements ComparableInterface public function setParagraphs(array $paragraphs = []): self { $this->richTextParagraphs = $paragraphs; - $this->activeParagraph = count($this->richTextParagraphs) - 1; + $this->activeParagraph = \count($this->richTextParagraphs) - 1; return $this; } @@ -419,11 +419,11 @@ class RichText extends AbstractShape implements ComparableInterface { $this->autoFit = $value; - if (!is_null($fontScale)) { + if (!\is_null($fontScale)) { $this->fontScale = $fontScale; } - if (!is_null($lnSpcReduction)) { + if (!\is_null($lnSpcReduction)) { $this->lnSpcReduction = $lnSpcReduction; } @@ -722,7 +722,7 @@ class RichText extends AbstractShape implements ComparableInterface $hashElements .= $element->getHashCode(); } - return md5( + return \md5( $hashElements . $this->wrap . $this->autoFit diff --git a/PhpOffice/PhpPresentation/Shape/RichText/BreakElement.php b/PhpOffice/PhpPresentation/Shape/RichText/BreakElement.php index 5df5f06..0d75173 100755 --- a/PhpOffice/PhpPresentation/Shape/RichText/BreakElement.php +++ b/PhpOffice/PhpPresentation/Shape/RichText/BreakElement.php @@ -87,6 +87,6 @@ class BreakElement implements TextElementInterface */ public function getHashCode(): string { - return md5(__CLASS__); + return \md5(__CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/RichText/Paragraph.php b/PhpOffice/PhpPresentation/Shape/RichText/Paragraph.php index 5fa2692..c166d95 100755 --- a/PhpOffice/PhpPresentation/Shape/RichText/Paragraph.php +++ b/PhpOffice/PhpPresentation/Shape/RichText/Paragraph.php @@ -267,7 +267,7 @@ class Paragraph implements ComparableInterface $hashElements .= $element->getHashCode(); } - return md5($hashElements . $this->font->getHashCode() . __CLASS__); + return \md5($hashElements . $this->font->getHashCode() . __CLASS__); } /** @@ -337,7 +337,7 @@ class Paragraph implements ComparableInterface */ public function setLineSpacingMode(string $lineSpacingMode): self { - if (in_array($lineSpacingMode, [ + if (\in_array($lineSpacingMode, [ self::LINE_SPACING_MODE_PERCENT, self::LINE_SPACING_MODE_POINT, ])) { diff --git a/PhpOffice/PhpPresentation/Shape/RichText/Run.php b/PhpOffice/PhpPresentation/Shape/RichText/Run.php index ba4f532..36daedc 100755 --- a/PhpOffice/PhpPresentation/Shape/RichText/Run.php +++ b/PhpOffice/PhpPresentation/Shape/RichText/Run.php @@ -75,6 +75,6 @@ class Run extends TextElement implements TextElementInterface */ public function getHashCode(): string { - return md5($this->getText() . $this->font->getHashCode() . __CLASS__); + return \md5($this->getText() . $this->font->getHashCode() . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/RichText/TextElement.php b/PhpOffice/PhpPresentation/Shape/RichText/TextElement.php index 3c74d02..86955e7 100755 --- a/PhpOffice/PhpPresentation/Shape/RichText/TextElement.php +++ b/PhpOffice/PhpPresentation/Shape/RichText/TextElement.php @@ -92,12 +92,12 @@ class TextElement implements TextElementInterface public function hasHyperlink(): bool { - return !is_null($this->hyperlink); + return !\is_null($this->hyperlink); } public function getHyperlink(): Hyperlink { - if (is_null($this->hyperlink)) { + if (\is_null($this->hyperlink)) { $this->hyperlink = new Hyperlink(); } @@ -147,6 +147,6 @@ class TextElement implements TextElementInterface */ public function getHashCode(): string { - return md5($this->text . (is_null($this->hyperlink) ? '' : $this->hyperlink->getHashCode()) . __CLASS__); + return \md5($this->text . (\is_null($this->hyperlink) ? '' : $this->hyperlink->getHashCode()) . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Table.php b/PhpOffice/PhpPresentation/Shape/Table.php index d6313be..f9a8e6e 100755 --- a/PhpOffice/PhpPresentation/Shape/Table.php +++ b/PhpOffice/PhpPresentation/Shape/Table.php @@ -71,7 +71,7 @@ class Table extends AbstractGraphic implements ComparableInterface if (!isset($this->rows[$row])) { throw new OutOfBoundsException( 0, - (count($this->rows) - 1) < 0 ? 0 : count($this->rows) - 1, + (\count($this->rows) - 1) < 0 ? 0 : \count($this->rows) - 1, $row ); } @@ -144,6 +144,6 @@ class Table extends AbstractGraphic implements ComparableInterface $hashElements .= $row->getHashCode(); } - return md5($hashElements . __CLASS__); + return \md5($hashElements . __CLASS__); } } diff --git a/PhpOffice/PhpPresentation/Shape/Table/Cell.php b/PhpOffice/PhpPresentation/Shape/Table/Cell.php index c8e8a94..f5b0bed 100755 --- a/PhpOffice/PhpPresentation/Shape/Table/Cell.php +++ b/PhpOffice/PhpPresentation/Shape/Table/Cell.php @@ -133,8 +133,8 @@ class Cell implements ComparableInterface */ public function setActiveParagraph($index = 0): Paragraph { - if ($index >= count($this->richTextParagraphs)) { - throw new OutOfBoundsException(0, count($this->richTextParagraphs), $index); + if ($index >= \count($this->richTextParagraphs)) { + throw new OutOfBoundsException(0, \count($this->richTextParagraphs), $index); } $this->activeParagraph = $index; @@ -151,8 +151,8 @@ class Cell implements ComparableInterface */ public function getParagraph(int $index = 0): Paragraph { - if ($index >= count($this->richTextParagraphs)) { - throw new OutOfBoundsException(0, count($this->richTextParagraphs), $index); + if ($index >= \count($this->richTextParagraphs)) { + throw new OutOfBoundsException(0, \count($this->richTextParagraphs), $index); } return $this->richTextParagraphs[$index]; @@ -164,7 +164,7 @@ class Cell implements ComparableInterface public function createParagraph(): Paragraph { $this->richTextParagraphs[] = new Paragraph(); - $totalRichTextParagraphs = count($this->richTextParagraphs); + $totalRichTextParagraphs = \count($this->richTextParagraphs); $this->activeParagraph = $totalRichTextParagraphs - 1; if ($totalRichTextParagraphs > 1) { @@ -277,7 +277,7 @@ class Cell implements ComparableInterface public function setParagraphs(array $paragraphs = []): self { $this->richTextParagraphs = $paragraphs; - $this->activeParagraph = count($this->richTextParagraphs) - 1; + $this->activeParagraph = \count($this->richTextParagraphs) - 1; return $this; } @@ -384,7 +384,7 @@ class Cell implements ComparableInterface $hashElements .= $element->getHashCode(); } - return md5($hashElements . $this->fill->getHashCode() . $this->borders->getHashCode() . $this->width . __CLASS__); + return \md5($hashElements . $this->fill->getHashCode() . $this->borders->getHashCode() . $this->width . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Shape/Table/Row.php b/PhpOffice/PhpPresentation/Shape/Table/Row.php index 039bbf1..9950b66 100755 --- a/PhpOffice/PhpPresentation/Shape/Table/Row.php +++ b/PhpOffice/PhpPresentation/Shape/Table/Row.php @@ -89,7 +89,7 @@ class Row implements ComparableInterface if (!isset($this->cells[$cell])) { throw new OutOfBoundsException( 0, - (count($this->cells) - 1) < 0 ? count($this->cells) - 1 : 0, + (\count($this->cells) - 1) < 0 ? \count($this->cells) - 1 : 0, $cell ); } @@ -137,7 +137,7 @@ class Row implements ComparableInterface throw new OutOfBoundsException( 0, - (count($this->cells) - 1) < 0 ? count($this->cells) - 1 : 0, + (\count($this->cells) - 1) < 0 ? \count($this->cells) - 1 : 0, $this->activeCellIndex ); } @@ -200,7 +200,7 @@ class Row implements ComparableInterface $hashElements .= $cell->getHashCode(); } - return md5($hashElements . $this->fill->getHashCode() . $this->height . __CLASS__); + return \md5($hashElements . $this->fill->getHashCode() . $this->height . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/ShapeContainerInterface.php b/PhpOffice/PhpPresentation/ShapeContainerInterface.php index 48e24f1..39bc6ea 100755 --- a/PhpOffice/PhpPresentation/ShapeContainerInterface.php +++ b/PhpOffice/PhpPresentation/ShapeContainerInterface.php @@ -30,7 +30,7 @@ interface ShapeContainerInterface /** * Get collection of shapes. * - * @return array|ArrayObject + * @return array|\ArrayObject */ public function getShapeCollection(); diff --git a/PhpOffice/PhpPresentation/Slide.php b/PhpOffice/PhpPresentation/Slide.php index 61c0d57..33ee72e 100755 --- a/PhpOffice/PhpPresentation/Slide.php +++ b/PhpOffice/PhpPresentation/Slide.php @@ -79,13 +79,13 @@ class Slide extends AbstractSlide implements ComparableInterface, ShapeContainer // Shape collection $this->shapeCollection = new \ArrayObject(); // Set identifier - $this->identifier = md5(rand(0, 9999) . time()); + $this->identifier = \md5(\rand(0, 9999) . \time()); // Set Slide Layout if ($this->parent instanceof PhpPresentation) { $arrayMasterSlides = $this->parent->getAllMasterSlides(); - $oMasterSlide = reset($arrayMasterSlides); + $oMasterSlide = \reset($arrayMasterSlides); $arraySlideLayouts = $oMasterSlide->getAllSlideLayouts(); - $oSlideLayout = reset($arraySlideLayouts); + $oSlideLayout = \reset($arraySlideLayouts); $this->setSlideLayout($oSlideLayout); } // Set note @@ -153,7 +153,7 @@ class Slide extends AbstractSlide implements ComparableInterface, ShapeContainer public function setNote(Note $note = null): self { - $this->slideNote = (is_null($note) ? new Note() : $note); + $this->slideNote = (\is_null($note) ? new Note() : $note); $this->slideNote->setParent($this); return $this; diff --git a/PhpOffice/PhpPresentation/Slide/AbstractSlide.php b/PhpOffice/PhpPresentation/Slide/AbstractSlide.php index ad5acd1..1f75a08 100755 --- a/PhpOffice/PhpPresentation/Slide/AbstractSlide.php +++ b/PhpOffice/PhpPresentation/Slide/AbstractSlide.php @@ -47,7 +47,7 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter /** * Collection of shapes. * - * @var array|ArrayObject + * @var array|\ArrayObject */ protected $shapeCollection = []; /** @@ -102,7 +102,7 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter /** * Get collection of shapes. * - * @return array|ArrayObject + * @return array|\ArrayObject */ public function getShapeCollection() { @@ -112,7 +112,7 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter /** * Get collection of shapes. * - * @param array|ArrayObject $shapeCollection + * @param array|\ArrayObject $shapeCollection * * @return AbstractSlide */ @@ -198,7 +198,7 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter */ public function getHashCode(): string { - return md5($this->identifier . __CLASS__); + return \md5($this->identifier . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Slide/Background/Image.php b/PhpOffice/PhpPresentation/Slide/Background/Image.php index 39c998e..33f365a 100755 --- a/PhpOffice/PhpPresentation/Slide/Background/Image.php +++ b/PhpOffice/PhpPresentation/Slide/Background/Image.php @@ -70,13 +70,13 @@ class Image extends AbstractBackground public function setPath(string $pValue = '', bool $pVerifyFile = true) { if ($pVerifyFile) { - if (!file_exists($pValue)) { + if (!\file_exists($pValue)) { throw new FileNotFoundException($pValue); } if (0 == $this->width && 0 == $this->height) { // Get width/height - list($this->width, $this->height) = getimagesize($pValue); + list($this->width, $this->height) = \getimagesize($pValue); } } $this->path = $pValue; @@ -91,7 +91,7 @@ class Image extends AbstractBackground */ public function getFilename(): string { - return $this->path ? basename($this->path) : ''; + return $this->path ? \basename($this->path) : ''; } /** @@ -101,9 +101,9 @@ class Image extends AbstractBackground */ public function getExtension(): string { - $exploded = explode('.', $this->getFilename()); + $exploded = \explode('.', $this->getFilename()); - return $exploded[count($exploded) - 1]; + return $exploded[\count($exploded) - 1]; } /** diff --git a/PhpOffice/PhpPresentation/Slide/Iterator.php b/PhpOffice/PhpPresentation/Slide/Iterator.php index d761be9..fa892bf 100755 --- a/PhpOffice/PhpPresentation/Slide/Iterator.php +++ b/PhpOffice/PhpPresentation/Slide/Iterator.php @@ -24,7 +24,7 @@ use IteratorIterator; use PhpOffice\PhpPresentation\PhpPresentation; // @phpstan-ignore-next-line -class Iterator extends IteratorIterator +class Iterator extends \IteratorIterator { /** * Presentation to iterate. diff --git a/PhpOffice/PhpPresentation/Slide/Note.php b/PhpOffice/PhpPresentation/Slide/Note.php index d1423a0..982bb34 100755 --- a/PhpOffice/PhpPresentation/Slide/Note.php +++ b/PhpOffice/PhpPresentation/Slide/Note.php @@ -40,7 +40,7 @@ class Note implements ComparableInterface, ShapeContainerInterface /** * Collection of shapes. * - * @var array|ArrayObject + * @var array|\ArrayObject */ private $shapeCollection; @@ -97,16 +97,16 @@ class Note implements ComparableInterface, ShapeContainerInterface $this->parent = $pParent; // Shape collection - $this->shapeCollection = new ArrayObject(); + $this->shapeCollection = new \ArrayObject(); // Set identifier - $this->identifier = md5(rand(0, 9999) . time()); + $this->identifier = \md5(\rand(0, 9999) . \time()); } /** * Get collection of shapes. * - * @return array|ArrayObject + * @return array|\ArrayObject */ public function getShapeCollection() { @@ -221,7 +221,7 @@ class Note implements ComparableInterface, ShapeContainerInterface */ public function getHashCode(): string { - return md5($this->identifier . __CLASS__); + return \md5($this->identifier . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Slide/SlideLayout.php b/PhpOffice/PhpPresentation/Slide/SlideLayout.php index 9c30db2..1fa0b79 100755 --- a/PhpOffice/PhpPresentation/Slide/SlideLayout.php +++ b/PhpOffice/PhpPresentation/Slide/SlideLayout.php @@ -71,7 +71,7 @@ class SlideLayout extends AbstractSlide implements ComparableInterface, ShapeCon // Shape collection $this->shapeCollection = new \ArrayObject(); // Set identifier - $this->identifier = md5(rand(0, 9999) . time()); + $this->identifier = \md5(\rand(0, 9999) . \time()); // Set a basic colorMap $this->colorMap = new ColorMap(); } diff --git a/PhpOffice/PhpPresentation/Slide/SlideMaster.php b/PhpOffice/PhpPresentation/Slide/SlideMaster.php index 3966f00..f8c8552 100755 --- a/PhpOffice/PhpPresentation/Slide/SlideMaster.php +++ b/PhpOffice/PhpPresentation/Slide/SlideMaster.php @@ -79,7 +79,7 @@ class SlideMaster extends AbstractSlide implements ComparableInterface, ShapeCon // Shape collection $this->shapeCollection = new \ArrayObject(); // Set identifier - $this->identifier = md5(rand(0, 9999) . time()); + $this->identifier = \md5(\rand(0, 9999) . \time()); // Set a basic colorMap $this->colorMap = new ColorMap(); // Set a white background diff --git a/PhpOffice/PhpPresentation/Slide/Transition.php b/PhpOffice/PhpPresentation/Slide/Transition.php index 9836f7c..94b1393 100755 --- a/PhpOffice/PhpPresentation/Slide/Transition.php +++ b/PhpOffice/PhpPresentation/Slide/Transition.php @@ -100,7 +100,7 @@ class Transition public function setSpeed(?string $speed = self::SPEED_MEDIUM): self { - if (in_array($speed, [self::SPEED_FAST, self::SPEED_MEDIUM, self::SPEED_SLOW])) { + if (\in_array($speed, [self::SPEED_FAST, self::SPEED_MEDIUM, self::SPEED_SLOW])) { $this->speed = $speed; } else { $this->speed = null; diff --git a/PhpOffice/PhpPresentation/Style/Alignment.php b/PhpOffice/PhpPresentation/Style/Alignment.php index fae963e..ba34b06 100755 --- a/PhpOffice/PhpPresentation/Style/Alignment.php +++ b/PhpOffice/PhpPresentation/Style/Alignment.php @@ -212,7 +212,7 @@ class Alignment implements ComparableInterface */ public function setIndent(float $pValue = 0): self { - if ($pValue > 0 && !in_array($this->getHorizontal(), $this->supportedStyles)) { + if ($pValue > 0 && !\in_array($this->getHorizontal(), $this->supportedStyles)) { $pValue = 0; // indent not supported } @@ -234,7 +234,7 @@ class Alignment implements ComparableInterface */ public function setMarginLeft(float $pValue = 0): self { - if ($pValue > 0 && !in_array($this->getHorizontal(), $this->supportedStyles)) { + if ($pValue > 0 && !\in_array($this->getHorizontal(), $this->supportedStyles)) { $pValue = 0; // margin left not supported } @@ -256,7 +256,7 @@ class Alignment implements ComparableInterface */ public function setMarginRight(float $pValue = 0): self { - if ($pValue > 0 && !in_array($this->getHorizontal(), $this->supportedStyles)) { + if ($pValue > 0 && !\in_array($this->getHorizontal(), $this->supportedStyles)) { $pValue = 0; // margin right not supported } @@ -343,7 +343,7 @@ class Alignment implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->horizontal . $this->vertical . $this->level diff --git a/PhpOffice/PhpPresentation/Style/Border.php b/PhpOffice/PhpPresentation/Style/Border.php index 9842432..5a89a75 100755 --- a/PhpOffice/PhpPresentation/Style/Border.php +++ b/PhpOffice/PhpPresentation/Style/Border.php @@ -194,7 +194,7 @@ class Border implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->lineStyle . $this->lineWidth . $this->dashStyle diff --git a/PhpOffice/PhpPresentation/Style/Borders.php b/PhpOffice/PhpPresentation/Style/Borders.php index 01fa011..5d7bd98 100755 --- a/PhpOffice/PhpPresentation/Style/Borders.php +++ b/PhpOffice/PhpPresentation/Style/Borders.php @@ -159,7 +159,7 @@ class Borders implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->getLeft()->getHashCode() . $this->getRight()->getHashCode() . $this->getTop()->getHashCode() diff --git a/PhpOffice/PhpPresentation/Style/Bullet.php b/PhpOffice/PhpPresentation/Style/Bullet.php index dd3729d..37bde96 100755 --- a/PhpOffice/PhpPresentation/Style/Bullet.php +++ b/PhpOffice/PhpPresentation/Style/Bullet.php @@ -265,7 +265,7 @@ class Bullet implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->bulletType . $this->bulletFont . $this->bulletChar diff --git a/PhpOffice/PhpPresentation/Style/Color.php b/PhpOffice/PhpPresentation/Style/Color.php index 56e5102..842b46d 100755 --- a/PhpOffice/PhpPresentation/Style/Color.php +++ b/PhpOffice/PhpPresentation/Style/Color.php @@ -100,9 +100,9 @@ class Color implements ComparableInterface public function getAlpha(): int { $alpha = 100; - if (strlen($this->argb) >= 6) { - $dec = hexdec(substr($this->argb, 0, 2)); - $alpha = (int) number_format(($dec / 255) * 100, 0); + if (\strlen($this->argb) >= 6) { + $dec = \hexdec(\substr($this->argb, 0, 2)); + $alpha = (int) \number_format(($dec / 255) * 100, 0); } return $alpha; @@ -123,10 +123,10 @@ class Color implements ComparableInterface if ($alpha > 100) { $alpha = 100; } - $alpha = round(($alpha / 100) * 255); - $alpha = dechex((int) $alpha); - $alpha = str_pad($alpha, 2, '0', STR_PAD_LEFT); - $this->argb = $alpha . substr($this->argb, 2); + $alpha = \round(($alpha / 100) * 255); + $alpha = \dechex((int) $alpha); + $alpha = \str_pad($alpha, 2, '0', STR_PAD_LEFT); + $this->argb = $alpha . \substr($this->argb, 2); return $this; } @@ -138,10 +138,10 @@ class Color implements ComparableInterface */ public function getRGB() { - if (6 == strlen($this->argb)) { + if (6 == \strlen($this->argb)) { return $this->argb; } else { - return substr($this->argb, 2); + return \substr($this->argb, 2); } } @@ -173,7 +173,7 @@ class Color implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->argb . __CLASS__ ); diff --git a/PhpOffice/PhpPresentation/Style/Fill.php b/PhpOffice/PhpPresentation/Style/Fill.php index 19b92db..24e94f2 100755 --- a/PhpOffice/PhpPresentation/Style/Fill.php +++ b/PhpOffice/PhpPresentation/Style/Fill.php @@ -198,7 +198,7 @@ class Fill implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->getFillType() . $this->getRotation() . $this->getStartColor()->getHashCode() diff --git a/PhpOffice/PhpPresentation/Style/Font.php b/PhpOffice/PhpPresentation/Style/Font.php index 2e25b25..21eb829 100755 --- a/PhpOffice/PhpPresentation/Style/Font.php +++ b/PhpOffice/PhpPresentation/Style/Font.php @@ -376,7 +376,7 @@ class Font implements ComparableInterface */ public function setFormat(string $value = self::FORMAT_LATIN): self { - if (in_array($value, [ + if (\in_array($value, [ self::FORMAT_COMPLEX_SCRIPT, self::FORMAT_EAST_ASIAN, self::FORMAT_LATIN, @@ -394,7 +394,7 @@ class Font implements ComparableInterface */ public function getHashCode(): string { - return md5( + return \md5( $this->name . $this->size . ($this->bold ? 't' : 'f') diff --git a/PhpOffice/PhpPresentation/Style/Shadow.php b/PhpOffice/PhpPresentation/Style/Shadow.php index 826dd47..bab7bca 100755 --- a/PhpOffice/PhpPresentation/Style/Shadow.php +++ b/PhpOffice/PhpPresentation/Style/Shadow.php @@ -232,7 +232,7 @@ class Shadow implements ComparableInterface */ public function getHashCode(): string { - return md5(($this->visible ? 't' : 'f') . $this->blurRadius . $this->distance . $this->direction . $this->alignment . $this->color->getHashCode() . $this->alpha . __CLASS__); + return \md5(($this->visible ? 't' : 'f') . $this->blurRadius . $this->distance . $this->direction . $this->alignment . $this->color->getHashCode() . $this->alpha . __CLASS__); } /** diff --git a/PhpOffice/PhpPresentation/Style/TextStyle.php b/PhpOffice/PhpPresentation/Style/TextStyle.php index 64d7c5a..bfbda88 100755 --- a/PhpOffice/PhpPresentation/Style/TextStyle.php +++ b/PhpOffice/PhpPresentation/Style/TextStyle.php @@ -72,7 +72,7 @@ class TextStyle private function checkLvl(?int $lvl): bool { - if (is_null($lvl) || $lvl > 9) { + if (\is_null($lvl) || $lvl > 9) { return false; } diff --git a/PhpOffice/PhpPresentation/Writer/AbstractWriter.php b/PhpOffice/PhpPresentation/Writer/AbstractWriter.php index 14179ef..dc81a5c 100755 --- a/PhpOffice/PhpPresentation/Writer/AbstractWriter.php +++ b/PhpOffice/PhpPresentation/Writer/AbstractWriter.php @@ -105,31 +105,31 @@ abstract class AbstractWriter // Get an array of all master slides $aSlideMasters = $this->getPhpPresentation()->getAllMasterSlides(); - $aSlideMasterLayouts = array_map(function ($oSlideMaster) { + $aSlideMasterLayouts = \array_map(function ($oSlideMaster) { return $oSlideMaster->getAllSlideLayouts(); }, $aSlideMasters); // Get an array of all slide layouts $aSlideLayouts = []; - array_walk_recursive($aSlideMasterLayouts, function ($oSlideLayout) use (&$aSlideLayouts) { + \array_walk_recursive($aSlideMasterLayouts, function ($oSlideLayout) use (&$aSlideLayouts) { $aSlideLayouts[] = $oSlideLayout; }); // Loop through PhpPresentation - foreach (array_merge($this->getPhpPresentation()->getAllSlides(), $aSlideMasters, $aSlideLayouts) as $oSlide) { + foreach (\array_merge($this->getPhpPresentation()->getAllSlides(), $aSlideMasters, $aSlideLayouts) as $oSlide) { $arrayReturn = $this->iterateCollection($oSlide->getShapeCollection()->getIterator()); - $aDrawings = array_merge($aDrawings, $arrayReturn); + $aDrawings = \array_merge($aDrawings, $arrayReturn); } return $aDrawings; } /** - * @param ArrayIterator $oIterator + * @param \ArrayIterator $oIterator * * @return array */ - private function iterateCollection(ArrayIterator $oIterator): array + private function iterateCollection(\ArrayIterator $oIterator): array { $arrayReturn = []; if ($oIterator->count() <= 0) { @@ -144,7 +144,7 @@ abstract class AbstractWriter $arrayReturn[] = $oShape; } elseif ($oShape instanceof Group) { $arrayGroup = $this->iterateCollection($oShape->getShapeCollection()->getIterator()); - $arrayReturn = array_merge($arrayReturn, $arrayGroup); + $arrayReturn = \array_merge($arrayReturn, $arrayGroup); } $oIterator->next(); } diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation.php b/PhpOffice/PhpPresentation/Writer/ODPresentation.php index a963259..ab462a7 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation.php @@ -86,8 +86,8 @@ class ODPresentation extends AbstractWriter implements WriterInterface } // If $pFilename is php://output or php://stdout, make it a temporary file... $originalFilename = $pFilename; - if ('php://output' == strtolower($pFilename) || 'php://stdout' == strtolower($pFilename)) { - $pFilename = @tempnam('./', 'phppttmp'); + if ('php://output' == \strtolower($pFilename) || 'php://stdout' == \strtolower($pFilename)) { + $pFilename = @\tempnam('./', 'phppttmp'); if ('' == $pFilename) { $pFilename = $originalFilename; } @@ -105,7 +105,7 @@ class ODPresentation extends AbstractWriter implements WriterInterface $arrayChart = []; $arrayFiles = []; - $oDir = new DirectoryIterator(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ODPresentation'); + $oDir = new \DirectoryIterator(\dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ODPresentation'); foreach ($oDir as $oFile) { if (!$oFile->isFile()) { continue; @@ -120,7 +120,7 @@ class ODPresentation extends AbstractWriter implements WriterInterface $arrayFiles[$oFile->getBasename('.php')] = $class; } - ksort($arrayFiles); + \ksort($arrayFiles); foreach ($arrayFiles as $o) { $oService = $o->newInstance(); @@ -138,10 +138,10 @@ class ODPresentation extends AbstractWriter implements WriterInterface // If a temporary file was used, copy it to the correct file stream if ($originalFilename != $pFilename) { - if (false === copy($pFilename, $originalFilename)) { + if (false === \copy($pFilename, $originalFilename)) { throw new FileCopyException($pFilename, $originalFilename); } - if (false === @unlink($pFilename)) { + if (false === @\unlink($pFilename)) { throw new FileRemoveException($pFilename); } } @@ -171,8 +171,8 @@ class ODPresentation extends AbstractWriter implements WriterInterface { $this->useDiskCaching = $pValue; - if (!is_null($directory)) { - if (!is_dir($directory)) { + if (!\is_null($directory)) { + if (!\is_dir($directory)) { throw new DirectoryNotFoundException($directory); } $this->diskCachingDirectory = $directory; diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/Content.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/Content.php index bf9fc5b..32efc71 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/Content.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/Content.php @@ -170,7 +170,7 @@ class Content extends AbstractDecoratorWriter if (!empty($this->arrStyleBullet)) { foreach ($this->arrStyleBullet as $key => $item) { $oStyle = $item['oStyle']; - $arrLevel = explode(';', $item['level']); + $arrLevel = \explode(';', $item['level']); // style:style $objWriter->startElement('text:list-style'); $objWriter->writeAttribute('style:name', 'L_' . $key); @@ -179,7 +179,7 @@ class Content extends AbstractDecoratorWriter $oAlign = $item['oAlign_' . $level]; // text:list-level-style-bullet $objWriter->startElement('text:list-level-style-bullet'); - $objWriter->writeAttribute('text:level', intval($level) + 1); + $objWriter->writeAttribute('text:level', \intval($level) + 1); $objWriter->writeAttribute('text:bullet-char', $oStyle->getBulletChar()); // style:list-level-properties $objWriter->startElement('style:list-level-properties'); @@ -318,7 +318,7 @@ class Content extends AbstractDecoratorWriter $pSlide = $this->getPresentation()->getSlide($i); $objWriter->startElement('draw:page'); $name = $pSlide->getName(); - if (!is_null($name)) { + if (!\is_null($name)) { $objWriter->writeAttribute('draw:name', $name); } $objWriter->writeAttribute('draw:master-page-name', 'Standard'); @@ -638,13 +638,13 @@ class Content extends AbstractDecoratorWriter */ // officeooo:annotation $objWriter->startElement('officeooo:annotation'); - $objWriter->writeAttribute('svg:x', number_format(CommonDrawing::pixelsToCentimeters((int) $oShape->getOffsetX()), 2, '.', '') . 'cm'); - $objWriter->writeAttribute('svg:y', number_format(CommonDrawing::pixelsToCentimeters((int) $oShape->getOffsetY()), 2, '.', '') . 'cm'); + $objWriter->writeAttribute('svg:x', \number_format(CommonDrawing::pixelsToCentimeters((int) $oShape->getOffsetX()), 2, '.', '') . 'cm'); + $objWriter->writeAttribute('svg:y', \number_format(CommonDrawing::pixelsToCentimeters((int) $oShape->getOffsetY()), 2, '.', '') . 'cm'); if ($oShape->getAuthor() instanceof Comment\Author) { $objWriter->writeElement('dc:creator', $oShape->getAuthor()->getName()); } - $objWriter->writeElement('dc:date', date('Y-m-d\TH:i:s', $oShape->getDate())); + $objWriter->writeElement('dc:date', \date('Y-m-d\TH:i:s', $oShape->getDate())); $objWriter->writeElement('text:p', $oShape->getText()); // ## officeooo:annotation @@ -681,7 +681,7 @@ class Content extends AbstractDecoratorWriter $arrayRows = $shape->getRows(); if (!empty($arrayRows)) { - $firstRow = reset($arrayRows); + $firstRow = \reset($arrayRows); $arrayCells = $firstRow->getCells(); // table:table $objWriter->startElement('table:table'); @@ -862,11 +862,11 @@ class Content extends AbstractDecoratorWriter $objWriter->startElement('style:graphic-properties'); $objWriter->writeAttribute('style:mirror', 'none'); $this->writeStylePartShadow($objWriter, $shape->getShadow()); - if (is_bool($shape->hasAutoShrinkVertical())) { - $objWriter->writeAttribute('draw:auto-grow-height', var_export($shape->hasAutoShrinkVertical(), true)); + if (\is_bool($shape->hasAutoShrinkVertical())) { + $objWriter->writeAttribute('draw:auto-grow-height', \var_export($shape->hasAutoShrinkVertical(), true)); } - if (is_bool($shape->hasAutoShrinkHorizontal())) { - $objWriter->writeAttribute('draw:auto-grow-width', var_export($shape->hasAutoShrinkHorizontal(), true)); + if (\is_bool($shape->hasAutoShrinkHorizontal())) { + $objWriter->writeAttribute('draw:auto-grow-width', \var_export($shape->hasAutoShrinkHorizontal(), true)); } // Fill switch ($shape->getFill()->getFillType()) { @@ -890,7 +890,7 @@ class Content extends AbstractDecoratorWriter $objWriter->writeAttribute('draw:stroke', 'none'); } else { $objWriter->writeAttribute('svg:stroke-color', '#' . $shape->getBorder()->getColor()->getRGB()); - $objWriter->writeAttribute('svg:stroke-width', number_format(CommonDrawing::pointsToCentimeters($shape->getBorder()->getLineWidth()), 3, '.', '') . 'cm'); + $objWriter->writeAttribute('svg:stroke-width', \number_format(CommonDrawing::pointsToCentimeters($shape->getBorder()->getLineWidth()), 3, '.', '') . 'cm'); switch ($shape->getBorder()->getDashStyle()) { case Border::DASH_SOLID: $objWriter->writeAttribute('draw:stroke', 'solid'); @@ -936,7 +936,7 @@ class Content extends AbstractDecoratorWriter $this->arrStyleBullet[$bulletStyleHashCode]['oStyle'] = $paragraph->getBulletStyle(); $this->arrStyleBullet[$bulletStyleHashCode]['level'] = ''; } - if (false === strpos($this->arrStyleBullet[$bulletStyleHashCode]['level'], ';' . $paragraph->getAlignment()->getLevel())) { + if (false === \strpos($this->arrStyleBullet[$bulletStyleHashCode]['level'], ';' . $paragraph->getAlignment()->getLevel())) { $this->arrStyleBullet[$bulletStyleHashCode]['level'] .= ';' . $paragraph->getAlignment()->getLevel(); $this->arrStyleBullet[$bulletStyleHashCode]['oAlign_' . $paragraph->getAlignment()->getLevel()] = $paragraph->getAlignment(); } @@ -1129,7 +1129,7 @@ class Content extends AbstractDecoratorWriter protected function writeSlideNote(XMLWriter $objWriter, Note $note): void { $shapesNote = $note->getShapeCollection(); - if (count($shapesNote) > 0) { + if (\count($shapesNote) > 0) { $objWriter->startElement('presentation:notes'); foreach ($shapesNote as $shape) { @@ -1157,8 +1157,8 @@ class Content extends AbstractDecoratorWriter // style:style/style:drawing-page-properties $objWriter->startElement('style:drawing-page-properties'); $objWriter->writeAttributeIf(!$slide->isVisible(), 'presentation:visibility', 'hidden'); - if (!is_null($oTransition = $slide->getTransition())) { - $objWriter->writeAttribute('presentation:duration', 'PT' . number_format($oTransition->getAdvanceTimeTrigger() / 1000, 6, '.', '') . 'S'); + if (!\is_null($oTransition = $slide->getTransition())) { + $objWriter->writeAttribute('presentation:duration', 'PT' . \number_format($oTransition->getAdvanceTimeTrigger() / 1000, 6, '.', '') . 'S'); $objWriter->writeAttributeIf($oTransition->hasManualTrigger(), 'presentation:transition-type', 'manual'); $objWriter->writeAttributeIf($oTransition->hasTimeTrigger(), 'presentation:transition-type', 'automatic'); switch ($oTransition->getSpeed()) { diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/Meta.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/Meta.php index d976503..9d57264 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/Meta.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/Meta.php @@ -56,7 +56,7 @@ class Meta extends AbstractDecoratorWriter // dc:creator $objWriter->writeElement('dc:creator', $this->getPresentation()->getDocumentProperties()->getLastModifiedBy()); // dc:date - $objWriter->writeElement('dc:date', gmdate('Y-m-d\TH:i:s.000', $this->getPresentation()->getDocumentProperties()->getModified())); + $objWriter->writeElement('dc:date', \gmdate('Y-m-d\TH:i:s.000', $this->getPresentation()->getDocumentProperties()->getModified())); // dc:description $objWriter->writeElement('dc:description', $this->getPresentation()->getDocumentProperties()->getDescription()); // dc:subject @@ -64,7 +64,7 @@ class Meta extends AbstractDecoratorWriter // dc:title $objWriter->writeElement('dc:title', $this->getPresentation()->getDocumentProperties()->getTitle()); // meta:creation-date - $objWriter->writeElement('meta:creation-date', gmdate('Y-m-d\TH:i:s.000', $this->getPresentation()->getDocumentProperties()->getCreated())); + $objWriter->writeElement('meta:creation-date', \gmdate('Y-m-d\TH:i:s.000', $this->getPresentation()->getDocumentProperties()->getCreated())); // meta:initial-creator $objWriter->writeElement('meta:initial-creator', $this->getPresentation()->getDocumentProperties()->getCreator()); // meta:keyword @@ -90,7 +90,7 @@ class Meta extends AbstractDecoratorWriter break; case DocumentProperties::PROPERTY_TYPE_DATE: $objWriter->writeAttribute('meta:value-type', 'date'); - $objWriter->writeRaw(date(DATE_W3C, (int) $propertyValue)); + $objWriter->writeRaw(\date(DATE_W3C, (int) $propertyValue)); break; case DocumentProperties::PROPERTY_TYPE_STRING: case DocumentProperties::PROPERTY_TYPE_UNKNOWN: diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php index 49f023e..a62d98d 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php @@ -93,12 +93,12 @@ class MetaInfManifest extends AbstractDecoratorWriter foreach ($this->getPresentation()->getAllSlides() as $numSlide => $oSlide) { $oBkgImage = $oSlide->getBackground(); if ($oBkgImage instanceof Image) { - $arrayImage = getimagesize($oBkgImage->getPath()); - $mimeType = image_type_to_mime_type($arrayImage[2]); + $arrayImage = \getimagesize($oBkgImage->getPath()); + $mimeType = \image_type_to_mime_type($arrayImage[2]); $objWriter->startElement('manifest:file-entry'); $objWriter->writeAttribute('manifest:media-type', $mimeType); - $objWriter->writeAttribute('manifest:full-path', 'Pictures/' . str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) $numSlide))); + $objWriter->writeAttribute('manifest:full-path', 'Pictures/' . \str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) $numSlide))); $objWriter->endElement(); } } @@ -107,9 +107,9 @@ class MetaInfManifest extends AbstractDecoratorWriter $pathThumbnail = $this->getPresentation()->getPresentationProperties()->getThumbnailPath(); // Size : 128x128 pixel // PNG : 8bit, non-interlaced with full alpha transparency - $gdImage = imagecreatefromstring(file_get_contents($pathThumbnail)); + $gdImage = \imagecreatefromstring(\file_get_contents($pathThumbnail)); if ($gdImage) { - imagedestroy($gdImage); + \imagedestroy($gdImage); $objWriter->startElement('manifest:file-entry'); $objWriter->writeAttribute('manifest:media-type', 'image/png'); $objWriter->writeAttribute('manifest:full-path', 'Thumbnails/thumbnail.png'); diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/ObjectsChart.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/ObjectsChart.php index 12ded07..ba879d7 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/ObjectsChart.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/ObjectsChart.php @@ -342,7 +342,7 @@ class ObjectsChart extends AbstractDecoratorWriter // style:graphic-properties $this->xmlContent->startElement('style:graphic-properties'); $this->xmlContent->writeAttribute('draw:stroke', $axis->getOutline()->getFill()->getFillType()); - $this->xmlContent->writeAttribute('svg:stroke-width', number_format(CommonDrawing::pointsToCentimeters($axis->getOutline()->getWidth()), 3, '.', '') . 'cm'); + $this->xmlContent->writeAttribute('svg:stroke-width', \number_format(CommonDrawing::pointsToCentimeters($axis->getOutline()->getWidth()), 3, '.', '') . 'cm'); $this->xmlContent->writeAttribute('svg:stroke-color', '#' . $axis->getOutline()->getFill()->getStartColor()->getRGB()); $this->xmlContent->endElement(); // style:style > style:text-properties @@ -391,7 +391,7 @@ class ObjectsChart extends AbstractDecoratorWriter $this->xmlContent->writeAttribute('style:family', 'chart'); // style:style > style:graphic-properties $this->xmlContent->startElement('style:graphic-properties'); - $this->xmlContent->writeAttribute('svg:stroke-width', number_format(CommonDrawing::pointsToCentimeters($oGridlines->getOutline()->getWidth()), 2, '.', '') . 'cm'); + $this->xmlContent->writeAttribute('svg:stroke-width', \number_format(CommonDrawing::pointsToCentimeters($oGridlines->getOutline()->getWidth()), 2, '.', '') . 'cm'); $this->xmlContent->writeAttribute('svg:stroke-color', '#' . $oGridlines->getOutline()->getFill()->getStartColor()->getRGB()); $this->xmlContent->endElement(); // ##style:style @@ -617,7 +617,7 @@ class ObjectsChart extends AbstractDecoratorWriter { $chartType = $chart->getPlotArea()->getType(); - $numRange = count($series->getValues()); + $numRange = \count($series->getValues()); // chart:series $this->xmlContent->startElement('chart:series'); $this->xmlContent->writeAttribute('chart:values-cell-range-address', 'table-local.$' . $this->rangeCol . '$2:.$' . $this->rangeCol . '$' . ($numRange + 1)); @@ -662,7 +662,7 @@ class ObjectsChart extends AbstractDecoratorWriter // > chart:data-point $this->xmlContent->endElement(); } elseif ($chartType instanceof AbstractTypePie) { - $count = count($series->getDataPointFills()); + $count = \count($series->getDataPointFills()); for ($inc = 0; $inc < $count; ++$inc) { // chart:data-point $this->xmlContent->startElement('chart:data-point'); @@ -730,7 +730,7 @@ class ObjectsChart extends AbstractDecoratorWriter break; } $this->xmlContent->writeAttribute('chart:symbol-name', $symbolName); - $symbolSize = number_format(CommonDrawing::pointsToCentimeters($oMarker->getSize()), 2, '.', ''); + $symbolSize = \number_format(CommonDrawing::pointsToCentimeters($oMarker->getSize()), 2, '.', ''); $this->xmlContent->writeAttribute('chart:symbol-width', $symbolSize . 'cm'); $this->xmlContent->writeAttribute('chart:symbol-height', $symbolSize . 'cm'); } @@ -760,7 +760,7 @@ class ObjectsChart extends AbstractDecoratorWriter if ($oOutline instanceof Outline) { $outlineWidth = $oOutline->getWidth(); if (!empty($outlineWidth)) { - $outlineWidth = number_format(CommonDrawing::pointsToCentimeters($outlineWidth), 3, '.', ''); + $outlineWidth = \number_format(CommonDrawing::pointsToCentimeters($outlineWidth), 3, '.', ''); } $outlineColor = $oOutline->getFill()->getStartColor()->getRGB(); } @@ -819,8 +819,8 @@ class ObjectsChart extends AbstractDecoratorWriter // table:table-column $this->xmlContent->startElement('table:table-column'); if (!empty($this->arrayData)) { - $rowFirst = reset($this->arrayData); - $this->xmlContent->writeAttribute('table:number-columns-repeated', count($rowFirst) - 1); + $rowFirst = \reset($this->arrayData); + $this->xmlContent->writeAttribute('table:number-columns-repeated', \count($rowFirst) - 1); } // > table:table-column $this->xmlContent->endElement(); @@ -842,7 +842,7 @@ class ObjectsChart extends AbstractDecoratorWriter $this->xmlContent->startElement('table:table-cell'); $this->xmlContent->endElement(); } else { - $rowFirst = reset($this->arrayData); + $rowFirst = \reset($this->arrayData); foreach ($rowFirst as $key => $cell) { // table:table-cell $this->xmlContent->startElement('table:table-cell'); @@ -880,13 +880,13 @@ class ObjectsChart extends AbstractDecoratorWriter // table:table-cell $this->xmlContent->startElement('table:table-cell'); - $cellValueTypeFloat = is_null($cell) ? true : is_numeric($cell); + $cellValueTypeFloat = \is_null($cell) ? true : \is_numeric($cell); $this->xmlContent->writeAttributeIf(!$cellValueTypeFloat, 'office:value-type', 'string'); $this->xmlContent->writeAttributeIf($cellValueTypeFloat, 'office:value-type', 'float'); - $this->xmlContent->writeAttributeIf($cellValueTypeFloat, 'office:value', is_null($cell) ? 'NaN' : $cell); + $this->xmlContent->writeAttributeIf($cellValueTypeFloat, 'office:value', \is_null($cell) ? 'NaN' : $cell); // text:p $this->xmlContent->startElement('text:p'); - $this->xmlContent->text(is_null($cell) ? 'NaN' : (string) $cell); + $this->xmlContent->text(\is_null($cell) ? 'NaN' : (string) $cell); $this->xmlContent->endElement(); // > table:table-cell $this->xmlContent->endElement(); diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/Pictures.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/Pictures.php index ac8cfa9..506ccbb 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/Pictures.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/Pictures.php @@ -45,7 +45,7 @@ class Pictures extends AbstractDecoratorWriter // Add background image slide $oBkgImage = $oSlide->getBackground(); if ($oBkgImage instanceof Image) { - $this->getZip()->addFromString('Pictures/' . $oBkgImage->getIndexedFilename((string) $keySlide), file_get_contents($oBkgImage->getPath())); + $this->getZip()->addFromString('Pictures/' . $oBkgImage->getIndexedFilename((string) $keySlide), \file_get_contents($oBkgImage->getPath())); } } diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/Styles.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/Styles.php index 6bc8cbf..f9156a8 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/Styles.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/Styles.php @@ -184,13 +184,13 @@ class Styles extends AbstractDecoratorWriter { $oFill = $shape->getFill(); if (Fill::FILL_GRADIENT_LINEAR == $oFill->getFillType() || Fill::FILL_GRADIENT_PATH == $oFill->getFillType()) { - if (!in_array($oFill->getHashCode(), $this->arrayGradient)) { + if (!\in_array($oFill->getHashCode(), $this->arrayGradient)) { $this->writeGradientFill($objWriter, $oFill); } } $oBorder = $shape->getBorder(); if (Border::DASH_SOLID != $oBorder->getDashStyle()) { - if (!in_array($oBorder->getDashStyle(), $this->arrayStrokeDash)) { + if (!\in_array($oBorder->getDashStyle(), $this->arrayStrokeDash)) { $objWriter->startElement('draw:stroke-dash'); $objWriter->writeAttribute('draw:name', 'strokeDash_' . $oBorder->getDashStyle()); $objWriter->writeAttribute('draw:style', 'rect'); @@ -270,7 +270,7 @@ class Styles extends AbstractDecoratorWriter foreach ($shape->getRows() as $row) { foreach ($row->getCells() as $cell) { if (Fill::FILL_GRADIENT_LINEAR == $cell->getFill()->getFillType()) { - if (!in_array($cell->getFill()->getHashCode(), $this->arrayGradient)) { + if (!\in_array($cell->getFill()->getHashCode(), $this->arrayGradient)) { $this->writeGradientFill($objWriter, $cell->getFill()); } } @@ -319,7 +319,7 @@ class Styles extends AbstractDecoratorWriter { $objWriter->startElement('draw:fill-image'); $objWriter->writeAttribute('draw:name', 'background_' . (string) $numSlide); - $objWriter->writeAttribute('xlink:href', 'Pictures/' . str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) $numSlide))); + $objWriter->writeAttribute('xlink:href', 'Pictures/' . \str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) $numSlide))); $objWriter->writeAttribute('xlink:type', 'simple'); $objWriter->writeAttribute('xlink:show', 'embed'); $objWriter->writeAttribute('xlink:actuate', 'onLoad'); diff --git a/PhpOffice/PhpPresentation/Writer/ODPresentation/ThumbnailsThumbnail.php b/PhpOffice/PhpPresentation/Writer/ODPresentation/ThumbnailsThumbnail.php index 1d75433..41e6695 100755 --- a/PhpOffice/PhpPresentation/Writer/ODPresentation/ThumbnailsThumbnail.php +++ b/PhpOffice/PhpPresentation/Writer/ODPresentation/ThumbnailsThumbnail.php @@ -30,25 +30,25 @@ class ThumbnailsThumbnail extends AbstractDecoratorWriter if ($pathThumbnail) { // Size : 128x128 pixel // PNG : 8bit, non-interlaced with full alpha transparency - $gdImage = imagecreatefromstring(file_get_contents($pathThumbnail)); + $gdImage = \imagecreatefromstring(\file_get_contents($pathThumbnail)); if ($gdImage) { - list($width, $height) = getimagesize($pathThumbnail); + list($width, $height) = \getimagesize($pathThumbnail); - $gdRender = imagecreatetruecolor(128, 128); - $colorBgAlpha = imagecolorallocatealpha($gdRender, 0, 0, 0, 127); - imagecolortransparent($gdRender, $colorBgAlpha); - imagefill($gdRender, 0, 0, $colorBgAlpha); - imagecopyresampled($gdRender, $gdImage, 0, 0, 0, 0, 128, 128, $width, $height); - imagetruecolortopalette($gdRender, false, 255); - imagesavealpha($gdRender, true); + $gdRender = \imagecreatetruecolor(128, 128); + $colorBgAlpha = \imagecolorallocatealpha($gdRender, 0, 0, 0, 127); + \imagecolortransparent($gdRender, $colorBgAlpha); + \imagefill($gdRender, 0, 0, $colorBgAlpha); + \imagecopyresampled($gdRender, $gdImage, 0, 0, 0, 0, 128, 128, $width, $height); + \imagetruecolortopalette($gdRender, false, 255); + \imagesavealpha($gdRender, true); - ob_start(); - imagepng($gdRender); - $imageContents = ob_get_contents(); - ob_end_clean(); + \ob_start(); + \imagepng($gdRender); + $imageContents = \ob_get_contents(); + \ob_end_clean(); - imagedestroy($gdRender); - imagedestroy($gdImage); + \imagedestroy($gdRender); + \imagedestroy($gdImage); $this->getZip()->addFromString('Thumbnails/thumbnail.png', $imageContents); } diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007.php index e98a618..49043f4 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007.php @@ -85,8 +85,8 @@ class PowerPoint2007 extends AbstractWriter implements WriterInterface // If $pFilename is php://output or php://stdout, make it a temporary file... $originalFilename = $pFilename; - if ('php://output' == strtolower($pFilename) || 'php://stdout' == strtolower($pFilename)) { - $pFilename = @tempnam('./', 'phppttmp'); + if ('php://output' == \strtolower($pFilename) || 'php://stdout' == \strtolower($pFilename)) { + $pFilename = @\tempnam('./', 'phppttmp'); if ('' == $pFilename) { $pFilename = $originalFilename; } @@ -98,7 +98,7 @@ class PowerPoint2007 extends AbstractWriter implements WriterInterface $oZip = $this->getZipAdapter(); $oZip->open($pFilename); - $oDir = new DirectoryIterator(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'PowerPoint2007'); + $oDir = new \DirectoryIterator(\dirname(__FILE__) . DIRECTORY_SEPARATOR . 'PowerPoint2007'); $arrayFiles = []; foreach ($oDir as $oFile) { if (!$oFile->isFile()) { @@ -106,7 +106,7 @@ class PowerPoint2007 extends AbstractWriter implements WriterInterface } $class = __NAMESPACE__ . '\\PowerPoint2007\\' . $oFile->getBasename('.php'); - $class = new ReflectionClass($class); + $class = new \ReflectionClass($class); if ($class->isAbstract() || !$class->isSubclassOf(AbstractDecoratorWriter::class)) { continue; @@ -114,7 +114,7 @@ class PowerPoint2007 extends AbstractWriter implements WriterInterface $arrayFiles[$oFile->getBasename('.php')] = $class; } - ksort($arrayFiles); + \ksort($arrayFiles); foreach ($arrayFiles as $o) { $oService = $o->newInstance(); @@ -130,10 +130,10 @@ class PowerPoint2007 extends AbstractWriter implements WriterInterface // If a temporary file was used, copy it to the correct file stream if ($originalFilename != $pFilename) { - if (false === copy($pFilename, $originalFilename)) { + if (false === \copy($pFilename, $originalFilename)) { throw new FileCopyException($pFilename, $originalFilename); } - if (false === @unlink($pFilename)) { + if (false === @\unlink($pFilename)) { throw new FileRemoveException($pFilename); } } @@ -163,8 +163,8 @@ class PowerPoint2007 extends AbstractWriter implements WriterInterface { $this->useDiskCaching = $useDiskCaching; - if (!is_null($directory)) { - if (!is_dir($directory)) { + if (!\is_null($directory)) { + if (!\is_dir($directory)) { throw new DirectoryNotFoundException($directory); } $this->diskCachingDir = $directory; diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php index 362d941..098d953 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php @@ -125,7 +125,7 @@ abstract class AbstractDecoratorWriter extends \PhpOffice\PhpPresentation\Writer protected function writeColor(XMLWriter $objWriter, Color $color, ?int $alpha = null): void { - if (is_null($alpha)) { + if (\is_null($alpha)) { $alpha = $color->getAlpha(); } @@ -283,12 +283,12 @@ abstract class AbstractDecoratorWriter extends \PhpOffice\PhpPresentation\Writer */ protected function absoluteZipPath(string $path): string { - $path = str_replace([ + $path = \str_replace([ '/', '\\', ], DIRECTORY_SEPARATOR, $path); - $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), function (string $var) { - return (bool) strlen($var); + $parts = \array_filter(\explode(DIRECTORY_SEPARATOR, $path), function (string $var) { + return (bool) \strlen($var); }); $absolutes = []; foreach ($parts as $part) { @@ -296,12 +296,12 @@ abstract class AbstractDecoratorWriter extends \PhpOffice\PhpPresentation\Writer continue; } if ('..' == $part) { - array_pop($absolutes); + \array_pop($absolutes); } else { $absolutes[] = $part; } } - return implode('/', $absolutes); + return \implode('/', $absolutes); } } diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php index c310379..ffaf6c7 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php @@ -69,7 +69,7 @@ abstract class AbstractSlide extends AbstractDecoratorWriter $objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', - '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename()) + '../media/' . \str_replace(' ', '_', $iterator->current()->getIndexedFilename()) ); $iterator->current()->relationId = 'rId' . $relId; ++$relId; @@ -94,7 +94,7 @@ abstract class AbstractSlide extends AbstractDecoratorWriter $objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', - '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename()) + '../media/' . \str_replace(' ', '_', $iterator2->current()->getIndexedFilename()) ); $iterator2->current()->relationId = 'rId' . $relId; ++$relId; @@ -120,14 +120,14 @@ abstract class AbstractSlide extends AbstractDecoratorWriter } /** - * @param array|ArrayObject $shapes + * @param array|\ArrayObject $shapes * @param int $shapeId * * @throws UndefinedChartTypeException */ protected function writeShapeCollection(XMLWriter $objWriter, $shapes = [], &$shapeId = 0): void { - if (0 == count($shapes)) { + if (0 == \count($shapes)) { return; } foreach ($shapes as $shape) { @@ -191,7 +191,7 @@ abstract class AbstractSlide extends AbstractDecoratorWriter $objWriter->startElement('p:nvPr'); $objWriter->startElement('p:ph'); $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType()); - if (!is_null($shape->getPlaceholder()->getIdx())) { + if (!\is_null($shape->getPlaceholder()->getIdx())) { $objWriter->writeAttribute('idx', $shape->getPlaceholder()->getIdx()); } $objWriter->endElement(); @@ -272,10 +272,10 @@ abstract class AbstractSlide extends AbstractDecoratorWriter // a:spAutoFit $objWriter->startElement('a:' . $shape->getAutoFit()); if (RichText::AUTOFIT_NORMAL == $shape->getAutoFit()) { - if (!is_null($shape->getFontScale())) { + if (!\is_null($shape->getFontScale())) { $objWriter->writeAttribute('fontScale', $shape->getFontScale() * 1000); } - if (!is_null($shape->getLineSpaceReduction())) { + if (!\is_null($shape->getLineSpaceReduction())) { $objWriter->writeAttribute('lnSpcReduction', $shape->getLineSpaceReduction() * 1000); } } @@ -373,14 +373,14 @@ abstract class AbstractSlide extends AbstractDecoratorWriter // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid $objWriter->startElement('a:tblGrid'); // Write cell widths - $countCells = count($shape->getRow(0)->getCells()); + $countCells = \count($shape->getRow(0)->getCells()); for ($cell = 0; $cell < $countCells; ++$cell) { // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/a:gridCol $objWriter->startElement('a:gridCol'); // Calculate column width $width = $shape->getRow(0)->getCell($cell)->getWidth(); if (0 == $width) { - $colCount = count($shape->getRow(0)->getCells()); + $colCount = \count($shape->getRow(0)->getCells()); $totalWidth = $shape->getWidth(); $width = $totalWidth / $colCount; } @@ -394,13 +394,13 @@ abstract class AbstractSlide extends AbstractDecoratorWriter // Default border style $defaultBorder = new Border(); // Write rows - $countRows = count($shape->getRows()); + $countRows = \count($shape->getRows()); for ($row = 0; $row < $countRows; ++$row) { // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr $objWriter->startElement('a:tr'); $objWriter->writeAttribute('h', CommonDrawing::pixelsToEmu($shape->getRow($row)->getHeight())); // Write cells - $countCells = count($shape->getRow($row)->getCells()); + $countCells = \count($shape->getRow($row)->getCells()); for ($cell = 0; $cell < $countCells; ++$cell) { // Current cell $currentCell = $shape->getRow($row)->getCell($cell); @@ -934,8 +934,8 @@ abstract class AbstractSlide extends AbstractDecoratorWriter // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:ext $objWriter->startElement('a:ext'); - $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(round($pNote->getExtentX() / 2))); - $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2))); + $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(\round($pNote->getExtentX() / 2))); + $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(\round($pNote->getExtentY() / 2))); $objWriter->endElement(); // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm @@ -1026,7 +1026,7 @@ abstract class AbstractSlide extends AbstractDecoratorWriter // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off $objWriter->startElement('a:off'); $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX())); - $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2) + $pNote->getOffsetY())); + $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu(\round($pNote->getExtentY() / 2) + $pNote->getOffsetY())); $objWriter->endElement(); // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:ext @@ -1543,7 +1543,7 @@ abstract class AbstractSlide extends AbstractDecoratorWriter return; } $objWriter->startElement('p:transition'); - if (!is_null($transition->getSpeed())) { + if (!\is_null($transition->getSpeed())) { $objWriter->writeAttribute('spd', $transition->getSpeed()); } $objWriter->writeAttribute('advClick', $transition->hasManualTrigger() ? '1' : '0'); @@ -1780,19 +1780,19 @@ abstract class AbstractSlide extends AbstractDecoratorWriter private function getGUID(): string { - if (function_exists('com_create_guid')) { - return com_create_guid(); + if (\function_exists('com_create_guid')) { + return \com_create_guid(); } else { - mt_srand(intval(microtime(true) * 10000)); - $charid = strtoupper(md5(uniqid((string) rand(), true))); - $hyphen = chr(45); // "-" - $uuid = chr(123)// "{" - . substr($charid, 0, 8) . $hyphen - . substr($charid, 8, 4) . $hyphen - . substr($charid, 12, 4) . $hyphen - . substr($charid, 16, 4) . $hyphen - . substr($charid, 20, 12) - . chr(125); // "}" + \mt_srand(\intval(\microtime(true) * 10000)); + $charid = \strtoupper(\md5(\uniqid((string) \rand(), true))); + $hyphen = \chr(45); // "-" + $uuid = \chr(123)// "{" + . \substr($charid, 0, 8) . $hyphen + . \substr($charid, 8, 4) . $hyphen + . \substr($charid, 12, 4) . $hyphen + . \substr($charid, 16, 4) . $hyphen + . \substr($charid, 20, 12) + . \chr(125); // "}" return $uuid; } diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/CommentAuthors.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/CommentAuthors.php index 35b90e1..6ef99a2 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/CommentAuthors.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/CommentAuthors.php @@ -42,7 +42,7 @@ class CommentAuthors extends AbstractDecoratorWriter if (!($oAuthor instanceof Author)) { continue; } - if (array_key_exists($oAuthor->getHashCode(), $arrayAuthors)) { + if (\array_key_exists($oAuthor->getHashCode(), $arrayAuthors)) { continue; } $arrayAuthors[$oAuthor->getHashCode()] = $oAuthor; diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php index 6d0a6d7..b13bea1 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php @@ -67,7 +67,7 @@ class ContentTypes extends AbstractDecoratorWriter // Slide masters $sldLayoutNr = 0; - $sldLayoutId = time() + 689016272; // requires minimum value of 2 147 483 648 + $sldLayoutId = \time() + 689016272; // requires minimum value of 2 147 483 648 foreach ($this->oPresentation->getAllMasterSlides() as $idx => $oSlideMaster) { $oSlideMaster->setRelsIndex((string) ($idx + 1)); $this->writeOverrideContentType($objWriter, '/ppt/slideMasters/slideMaster' . $oSlideMaster->getRelsIndex() . '.xml', 'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml'); @@ -129,7 +129,7 @@ class ContentTypes extends AbstractDecoratorWriter 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml' ); } elseif ($shapeIndex instanceof AbstractDrawingAdapter) { - $extension = strtolower($shapeIndex->getExtension()); + $extension = \strtolower($shapeIndex->getExtension()); $mimeType = $shapeIndex->getMimeType(); if (!isset($aMediaContentTypes[$extension])) { diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCore.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCore.php index f1afb28..c3a7078 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCore.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCore.php @@ -50,13 +50,13 @@ class DocPropsCore extends AbstractDecoratorWriter // dcterms:created $objWriter->startElement('dcterms:created'); $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); - $objWriter->writeRaw(gmdate("Y-m-d\TH:i:s\Z", $this->oPresentation->getDocumentProperties()->getCreated())); + $objWriter->writeRaw(\gmdate("Y-m-d\TH:i:s\Z", $this->oPresentation->getDocumentProperties()->getCreated())); $objWriter->endElement(); // dcterms:modified $objWriter->startElement('dcterms:modified'); $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); - $objWriter->writeRaw(gmdate("Y-m-d\TH:i:s\Z", $this->oPresentation->getDocumentProperties()->getModified())); + $objWriter->writeRaw(\gmdate("Y-m-d\TH:i:s\Z", $this->oPresentation->getDocumentProperties()->getModified())); $objWriter->endElement(); // dc:title diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCustom.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCustom.php index ea651ac..010dafa 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCustom.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsCustom.php @@ -77,7 +77,7 @@ class DocPropsCustom extends AbstractDecoratorWriter break; case DocumentProperties::PROPERTY_TYPE_DATE: $objWriter->startElement('vt:filetime'); - $objWriter->writeRaw(date(DATE_W3C, (int) $propertyValue)); + $objWriter->writeRaw(\date(DATE_W3C, (int) $propertyValue)); $objWriter->endElement(); break; default: diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsThumbnail.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsThumbnail.php index 6c54be1..dcbbf89 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsThumbnail.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/DocPropsThumbnail.php @@ -29,14 +29,14 @@ class DocPropsThumbnail extends AbstractDecoratorWriter $pathThumbnail = $this->getPresentation()->getPresentationProperties()->getThumbnailPath(); if ($pathThumbnail) { - $fileThumbnail = file_get_contents($pathThumbnail); - $gdImage = imagecreatefromstring($fileThumbnail); + $fileThumbnail = \file_get_contents($pathThumbnail); + $gdImage = \imagecreatefromstring($fileThumbnail); if ($gdImage) { - ob_start(); - imagejpeg($gdImage); - $imageContents = ob_get_contents(); - ob_end_clean(); - imagedestroy($gdImage); + \ob_start(); + \imagejpeg($gdImage); + $imageContents = \ob_get_contents(); + \ob_end_clean(); + \imagedestroy($gdImage); $this->getZip()->addFromString('docProps/thumbnail.jpeg', $imageContents); } diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptCharts.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptCharts.php index 4d03776..19d5c04 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptCharts.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptCharts.php @@ -60,11 +60,11 @@ class PptCharts extends AbstractDecoratorWriter if ($shape->hasIncludedSpreadsheet()) { $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape)); - $pFilename = tempnam(sys_get_temp_dir(), 'PhpSpreadsheet'); + $pFilename = \tempnam(\sys_get_temp_dir(), 'PhpSpreadsheet'); $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx')); // remove temp file - if (false === @unlink($pFilename)) { + if (false === @\unlink($pFilename)) { throw new FileRemoveException($pFilename); } } @@ -239,7 +239,7 @@ class PptCharts extends AbstractDecoratorWriter // Set properties $title = $chart->getTitle()->getText(); - if (0 == strlen($title)) { + if (0 == \strlen($title)) { $title = 'Chart'; } $spreadsheet->getProperties() @@ -260,15 +260,15 @@ class PptCharts extends AbstractDecoratorWriter $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, 1, $series->getTitle()); // X-axis - $axisXData = array_keys($series->getValues()); - $numAxisXData = count($axisXData); + $axisXData = \array_keys($series->getValues()); + $numAxisXData = \count($axisXData); for ($i = 0; $i < $numAxisXData; ++$i) { $sheet->setCellValueByColumnAndRow(0, $i + 2, $axisXData[$i]); } // Y-axis - $axisYData = array_values($series->getValues()); - $numAxisYData = count($axisYData); + $axisYData = \array_values($series->getValues()); + $numAxisYData = \count($axisYData); for ($i = 0; $i < $numAxisYData; ++$i) { $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, $i + 2, $axisYData[$i]); } @@ -281,8 +281,8 @@ class PptCharts extends AbstractDecoratorWriter $writer->save($tempName); // Load file in memory - $returnValue = file_get_contents($tempName); - if (false === @unlink($tempName)) { + $returnValue = \file_get_contents($tempName); + if (false === @\unlink($tempName)) { throw new FileRemoveException($tempName); } @@ -351,16 +351,16 @@ class PptCharts extends AbstractDecoratorWriter // c:strLit / c:numLit // c:strRef / c:numRef $referenceType = ($isReference ? 'Ref' : 'Lit'); - $dataType = is_numeric($values[0]) ? 'num' : 'str'; + $dataType = \is_numeric($values[0]) ? 'num' : 'str'; $objWriter->startElement('c:' . $dataType . $referenceType); - $numValues = count($values); + $numValues = \count($values); if (!$isReference) { // Value // c:ptCount $objWriter->startElement('c:ptCount'); - $objWriter->writeAttribute('val', count($values)); + $objWriter->writeAttribute('val', \count($values)); $objWriter->endElement(); // Add points @@ -368,7 +368,7 @@ class PptCharts extends AbstractDecoratorWriter // c:pt $objWriter->startElement('c:pt'); $objWriter->writeAttribute('idx', $i); - $objWriter->writeElement('c:v', strval($values[$i])); + $objWriter->writeElement('c:v', \strval($values[$i])); $objWriter->endElement(); } } else { @@ -378,7 +378,7 @@ class PptCharts extends AbstractDecoratorWriter // c:ptCount $objWriter->startElement('c:ptCount'); - $objWriter->writeAttribute('val', count($values)); + $objWriter->writeAttribute('val', \count($values)); $objWriter->endElement(); // Add points @@ -386,7 +386,7 @@ class PptCharts extends AbstractDecoratorWriter // c:pt $objWriter->startElement('c:pt'); $objWriter->writeAttribute('idx', $i); - $objWriter->writeElement('c:v', strval($values[$i])); + $objWriter->writeElement('c:v', \strval($values[$i])); $objWriter->endElement(); } @@ -763,19 +763,19 @@ class PptCharts extends AbstractDecoratorWriter } // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -961,19 +961,19 @@ class PptCharts extends AbstractDecoratorWriter } // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -1158,19 +1158,19 @@ class PptCharts extends AbstractDecoratorWriter } // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -1257,19 +1257,19 @@ class PptCharts extends AbstractDecoratorWriter } // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -1278,7 +1278,7 @@ class PptCharts extends AbstractDecoratorWriter ++$seriesIndex; } - if (isset($series) && is_object($series) && $series instanceof Chart\Series) { + if (isset($series) && \is_object($series) && $series instanceof Chart\Series) { // c:dLbls $objWriter->startElement('c:dLbls'); @@ -1502,19 +1502,19 @@ class PptCharts extends AbstractDecoratorWriter $objWriter->endElement(); // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -1661,19 +1661,19 @@ class PptCharts extends AbstractDecoratorWriter $objWriter->endElement(); // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -1810,19 +1810,19 @@ class PptCharts extends AbstractDecoratorWriter $objWriter->endElement(); // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -1986,19 +1986,19 @@ class PptCharts extends AbstractDecoratorWriter $objWriter->endElement(); // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:cat $objWriter->startElement('c:cat'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:val $objWriter->startElement('c:val'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -2164,19 +2164,19 @@ class PptCharts extends AbstractDecoratorWriter $objWriter->endElement(); // Write X axis data - $axisXData = array_keys($series->getValues()); + $axisXData = \array_keys($series->getValues()); // c:xVal $objWriter->startElement('c:xVal'); - $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData))); + $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + \count($axisXData))); $objWriter->endElement(); // Write Y axis data - $axisYData = array_values($series->getValues()); + $axisYData = \array_values($series->getValues()); // c:yVal $objWriter->startElement('c:yVal'); - $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : ''); + $coords = ($includeSheet ? 'Sheet1!$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . Coordinate::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + \count($axisYData)) : ''); $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords); $objWriter->endElement(); @@ -2480,7 +2480,7 @@ class PptCharts extends AbstractDecoratorWriter $objWriter->endElement(); // c:crosses "autoZero" | "min" | "max" | custom string value - if (in_array($crossesAt, ['autoZero', 'min', 'max'])) { + if (\in_array($crossesAt, ['autoZero', 'min', 'max'])) { $objWriter->startElement('c:crosses'); $objWriter->writeAttribute('val', $crossesAt); $objWriter->endElement(); diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptComments.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptComments.php index 5a30c08..12ffc9d 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptComments.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptComments.php @@ -76,7 +76,7 @@ class PptComments extends AbstractDecoratorWriter // p:cmLst > p:cm $objWriter->startElement('p:cm'); $objWriter->writeAttribute('authorId', $oAuthor instanceof Comment\Author ? $oAuthor->getIndex() : 0); - $objWriter->writeAttribute('dt', date('Y-m-d\TH:i:s.000000000', $oComment->getDate())); + $objWriter->writeAttribute('dt', \date('Y-m-d\TH:i:s.000000000', $oComment->getDate())); $objWriter->writeAttribute('idx', $idxComment); // p:cmLst > p:cm > p:pos diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptPresentation.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptPresentation.php index a6aa3c1..fa13c57 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptPresentation.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptPresentation.php @@ -50,7 +50,7 @@ class PptPresentation extends AbstractDecoratorWriter $relationId = 1; $slideMasterId = 2147483648; - $countMasterSlides = count($this->oPresentation->getAllMasterSlides()); + $countMasterSlides = \count($this->oPresentation->getAllMasterSlides()); for ($inc = 1; $inc <= $countMasterSlides; ++$inc) { // p:sldMasterId $objWriter->startElement('p:sldMasterId'); diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php index b482579..61113b8 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php @@ -43,7 +43,7 @@ class PptSlideLayouts extends AbstractSlide // Add background image slide $oBkgImage = $oSlideLayout->getBackground(); if ($oBkgImage instanceof Image) { - $this->oZip->addFromString('ppt/media/' . $oBkgImage->getIndexedFilename($oSlideLayout->getRelsIndex()), file_get_contents($oBkgImage->getPath())); + $this->oZip->addFromString('ppt/media/' . $oBkgImage->getIndexedFilename($oSlideLayout->getRelsIndex()), \file_get_contents($oBkgImage->getPath())); } } } @@ -166,7 +166,7 @@ class PptSlideLayouts extends AbstractSlide // p:sldLayout\p:clrMapOvr $objWriter->startElement('p:clrMapOvr'); - $arrayDiff = array_diff_assoc(ColorMap::$mappingDefault, $pSlideLayout->colorMap->getMapping()); + $arrayDiff = \array_diff_assoc(ColorMap::$mappingDefault, $pSlideLayout->colorMap->getMapping()); if (!empty($arrayDiff)) { // p:sldLayout\p:clrMapOvr\a:overrideClrMapping $objWriter->startElement('a:overrideClrMapping'); @@ -181,7 +181,7 @@ class PptSlideLayouts extends AbstractSlide // p:sldLayout\p:clrMapOvr\ $objWriter->endElement(); - if (!is_null($pSlideLayout->getTransition())) { + if (!\is_null($pSlideLayout->getTransition())) { $this->writeSlideTransition($objWriter, $pSlideLayout->getTransition()); } diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php index a7758a8..5e1e7e5 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php @@ -44,7 +44,7 @@ class PptSlideMasters extends AbstractSlide // Add background image slide $oBkgImage = $oMasterSlide->getBackground(); if ($oBkgImage instanceof Image) { - $this->oZip->addFromString('ppt/media/' . $oBkgImage->getIndexedFilename($oMasterSlide->getRelsIndex()), file_get_contents($oBkgImage->getPath())); + $this->oZip->addFromString('ppt/media/' . $oBkgImage->getIndexedFilename($oMasterSlide->getRelsIndex()), \file_get_contents($oBkgImage->getPath())); } } @@ -237,7 +237,7 @@ class PptSlideMasters extends AbstractSlide $objWriter->endElement(); // p:sldMaster\p:txStyles\ - if (!is_null($pSlide->getTransition())) { + if (!\is_null($pSlide->getTransition())) { $this->writeSlideTransition($objWriter, $pSlide->getTransition()); } diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlides.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlides.php index 8c2999d..1ee4c73 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlides.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptSlides.php @@ -59,7 +59,7 @@ class PptSlides extends AbstractSlide // Add background image slide $oBkgImage = $oSlide->getBackground(); if ($oBkgImage instanceof Image) { - $this->oZip->addFromString('ppt/media/' . $oBkgImage->getIndexedFilename((string) $idx), file_get_contents($oBkgImage->getPath())); + $this->oZip->addFromString('ppt/media/' . $oBkgImage->getIndexedFilename((string) $idx), \file_get_contents($oBkgImage->getPath())); } } @@ -206,10 +206,10 @@ class PptSlides extends AbstractSlide // Hyperlink in table if ($iterator->current() instanceof ShapeTable) { // Rows - $countRows = count($iterator->current()->getRows()); + $countRows = \count($iterator->current()->getRows()); for ($row = 0; $row < $countRows; ++$row) { // Cells in rows - $countCells = count($iterator->current()->getRow($row)->getCells()); + $countCells = \count($iterator->current()->getRow($row)->getCells()); for ($cell = 0; $cell < $countCells; ++$cell) { $currentCell = $iterator->current()->getRow($row)->getCell($cell); // Paragraphs in cell @@ -282,10 +282,10 @@ class PptSlides extends AbstractSlide // Hyperlink in table if ($iterator2->current() instanceof ShapeTable) { // Rows - $countRows = count($iterator2->current()->getRows()); + $countRows = \count($iterator2->current()->getRows()); for ($row = 0; $row < $countRows; ++$row) { // Cells in rows - $countCells = count($iterator2->current()->getRow($row)->getCells()); + $countCells = \count($iterator2->current()->getRow($row)->getCells()); for ($cell = 0; $cell < $countCells; ++$cell) { $currentCell = $iterator2->current()->getRow($row)->getCell($cell); // Paragraphs in cell diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptTheme.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptTheme.php index c2c9e8e..2774419 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptTheme.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/PptTheme.php @@ -80,7 +80,7 @@ class PptTheme extends AbstractDecoratorWriter // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - $name = 'Theme' . rand(1, 100); + $name = 'Theme' . \rand(1, 100); // XML header $objWriter->startDocument('1.0', 'UTF-8', 'yes'); @@ -101,7 +101,7 @@ class PptTheme extends AbstractDecoratorWriter // a:theme/a:themeElements/a:clrScheme/a:* $objWriter->startElement('a:' . $oSchemeColor->getValue()); - if (in_array($oSchemeColor->getValue(), [ + if (\in_array($oSchemeColor->getValue(), [ 'dk1', 'lt1', ])) { $objWriter->startElement('a:sysClr'); diff --git a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/Relationships.php b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/Relationships.php index 9069ed4..774603a 100755 --- a/PhpOffice/PhpPresentation/Writer/PowerPoint2007/Relationships.php +++ b/PhpOffice/PhpPresentation/Writer/PowerPoint2007/Relationships.php @@ -68,10 +68,10 @@ class Relationships extends AbstractDecoratorWriter $idxRelation = 5; // Thumbnail if ($this->getPresentation()->getPresentationProperties()->getThumbnailPath()) { - $pathThumbnail = file_get_contents($this->getPresentation()->getPresentationProperties()->getThumbnailPath()); - $gdImage = imagecreatefromstring($pathThumbnail); + $pathThumbnail = \file_get_contents($this->getPresentation()->getPresentationProperties()->getThumbnailPath()); + $gdImage = \imagecreatefromstring($pathThumbnail); if ($gdImage) { - imagedestroy($gdImage); + \imagedestroy($gdImage); // Relationship docProps/thumbnail.jpeg $this->writeRelationship($objWriter, $idxRelation, 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail', 'docProps/thumbnail.jpeg'); } diff --git a/PhpOffice/PhpPresentation/Writer/Serialized.php b/PhpOffice/PhpPresentation/Writer/Serialized.php index 5482c1e..97c3b01 100755 --- a/PhpOffice/PhpPresentation/Writer/Serialized.php +++ b/PhpOffice/PhpPresentation/Writer/Serialized.php @@ -58,8 +58,8 @@ class Serialized extends AbstractWriter implements WriterInterface if (empty($pFilename)) { throw new InvalidParameterException('pFilename', ''); } - if (!is_dir(dirname($pFilename))) { - throw new DirectoryNotFoundException(dirname($pFilename)); + if (!\is_dir(\dirname($pFilename))) { + throw new DirectoryNotFoundException(\dirname($pFilename)); } $oPresentation = $this->getPhpPresentation(); @@ -76,8 +76,8 @@ class Serialized extends AbstractWriter implements WriterInterface if ($oPresentation->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { $imgTemp = $oPresentation->getSlide($i)->getShapeCollection()->offsetGet($j); $objZip->addFromString( - 'media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME), - file_get_contents($imgTemp->getPath()) + 'media/' . $imgTemp->getImageIndex() . '/' . \pathinfo($imgTemp->getPath(), PATHINFO_BASENAME), + \file_get_contents($imgTemp->getPath()) ); } } @@ -109,7 +109,7 @@ class Serialized extends AbstractWriter implements WriterInterface for ($j = 0; $j < $pPhpPresentation->getSlide($i)->getShapeCollection()->count(); ++$j) { if ($pPhpPresentation->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { $imgTemp = $pPhpPresentation->getSlide($i)->getShapeCollection()->offsetGet($j); - $imgPath = 'zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME); + $imgPath = 'zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . \pathinfo($imgTemp->getPath(), PATHINFO_BASENAME); if ($imgTemp instanceof File) { $imgTemp->setPath($imgPath, false); } else { @@ -136,7 +136,7 @@ class Serialized extends AbstractWriter implements WriterInterface // Data $objWriter->startElement('data'); - $objWriter->writeCData(base64_encode(serialize($pPhpPresentation))); + $objWriter->writeCData(\base64_encode(\serialize($pPhpPresentation))); $objWriter->endElement(); $objWriter->endElement(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/ArrayEnabled.php b/PhpOffice/PhpSpreadsheet/Calculation/ArrayEnabled.php index 1e3f697..bca4c95 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/ArrayEnabled.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/ArrayEnabled.php @@ -65,10 +65,10 @@ trait ArrayEnabled */ protected static function evaluateArrayArgumentsSubset(callable $method, int $limit, ...$arguments): array { - self::initialiseHelper(array_slice($arguments, 0, $limit)); - $trailingArguments = array_slice($arguments, $limit); + self::initialiseHelper(\array_slice($arguments, 0, $limit)); + $trailingArguments = \array_slice($arguments, $limit); $arguments = self::$arrayArgumentHelper->arguments(); - $arguments = array_merge($arguments, $trailingArguments); + $arguments = \array_merge($arguments, $trailingArguments); return ArrayArgumentProcessor::processArguments(self::$arrayArgumentHelper, $method, ...$arguments); } @@ -92,18 +92,18 @@ trait ArrayEnabled */ protected static function evaluateArrayArgumentsSubsetFrom(callable $method, int $start, ...$arguments): array { - $arrayArgumentsSubset = array_combine( - range($start, count($arguments) - $start), - array_slice($arguments, $start) + $arrayArgumentsSubset = \array_combine( + \range($start, \count($arguments) - $start), + \array_slice($arguments, $start) ); if (self::testFalse($arrayArgumentsSubset)) { return ['#VALUE!']; } self::initialiseHelper($arrayArgumentsSubset); - $leadingArguments = array_slice($arguments, 0, $start); + $leadingArguments = \array_slice($arguments, 0, $start); $arguments = self::$arrayArgumentHelper->arguments(); - $arguments = array_merge($leadingArguments, $arguments); + $arguments = \array_merge($leadingArguments, $arguments); return ArrayArgumentProcessor::processArguments(self::$arrayArgumentHelper, $method, ...$arguments); } @@ -119,14 +119,14 @@ trait ArrayEnabled */ protected static function evaluateArrayArgumentsIgnore(callable $method, int $ignore, ...$arguments): array { - $leadingArguments = array_slice($arguments, 0, $ignore); - $ignoreArgument = array_slice($arguments, $ignore, 1); - $trailingArguments = array_slice($arguments, $ignore + 1); + $leadingArguments = \array_slice($arguments, 0, $ignore); + $ignoreArgument = \array_slice($arguments, $ignore, 1); + $trailingArguments = \array_slice($arguments, $ignore + 1); - self::initialiseHelper(array_merge($leadingArguments, [[null]], $trailingArguments)); + self::initialiseHelper(\array_merge($leadingArguments, [[null]], $trailingArguments)); $arguments = self::$arrayArgumentHelper->arguments(); - array_splice($arguments, $ignore, 1, $ignoreArgument); + \array_splice($arguments, $ignore, 1, $ignoreArgument); return ArrayArgumentProcessor::processArguments(self::$arrayArgumentHelper, $method, ...$arguments); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/BinaryComparison.php b/PhpOffice/PhpSpreadsheet/Calculation/BinaryComparison.php index 5d4f261..9fd681b 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/BinaryComparison.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/BinaryComparison.php @@ -22,7 +22,7 @@ class BinaryComparison $inversedStr1 = StringHelper::strCaseReverse($str1 ?? ''); $inversedStr2 = StringHelper::strCaseReverse($str2 ?? ''); - return strcmp($inversedStr1, $inversedStr2); + return \strcmp($inversedStr1, $inversedStr2); } /** @@ -33,7 +33,7 @@ class BinaryComparison */ private static function strcmpAllowNull($str1, $str2): int { - return strcmp($str1 ?? '', $str2 ?? ''); + return \strcmp($str1 ?? '', $str2 ?? ''); } /** @@ -43,25 +43,25 @@ class BinaryComparison public static function compare($operand1, $operand2, string $operator): bool { // Simple validate the two operands if they are string values - if (is_string($operand1) && $operand1 > '' && $operand1[0] == Calculation::FORMULA_STRING_QUOTE) { + if (\is_string($operand1) && $operand1 > '' && $operand1[0] == Calculation::FORMULA_STRING_QUOTE) { $operand1 = Calculation::unwrapResult($operand1); } - if (is_string($operand2) && $operand2 > '' && $operand2[0] == Calculation::FORMULA_STRING_QUOTE) { + if (\is_string($operand2) && $operand2 > '' && $operand2[0] == Calculation::FORMULA_STRING_QUOTE) { $operand2 = Calculation::unwrapResult($operand2); } // Use case insensitive comparaison if not OpenOffice mode if (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) { - if (is_string($operand1)) { + if (\is_string($operand1)) { $operand1 = StringHelper::strToUpper($operand1); } - if (is_string($operand2)) { + if (\is_string($operand2)) { $operand2 = StringHelper::strToUpper($operand2); } } - $useLowercaseFirstComparison = is_string($operand1) && - is_string($operand2) && + $useLowercaseFirstComparison = \is_string($operand1) && + \is_string($operand2) && Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE; return self::evaluateComparison($operand1, $operand2, $operator, $useLowercaseFirstComparison); @@ -103,9 +103,9 @@ class BinaryComparison */ private static function equal($operand1, $operand2): bool { - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = (abs($operand1 - $operand2) < self::DELTA); - } elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) { + if (\is_numeric($operand1) && \is_numeric($operand2)) { + $result = (\abs($operand1 - $operand2) < self::DELTA); + } elseif (($operand1 === null && \is_numeric($operand2)) || ($operand2 === null && \is_numeric($operand1))) { $result = $operand1 == $operand2; } else { $result = self::strcmpAllowNull($operand1, $operand2) == 0; @@ -120,9 +120,9 @@ class BinaryComparison */ private static function greaterThanOrEqual($operand1, $operand2, bool $useLowercaseFirstComparison): bool { - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = ((abs($operand1 - $operand2) < self::DELTA) || ($operand1 > $operand2)); - } elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) { + if (\is_numeric($operand1) && \is_numeric($operand2)) { + $result = ((\abs($operand1 - $operand2) < self::DELTA) || ($operand1 > $operand2)); + } elseif (($operand1 === null && \is_numeric($operand2)) || ($operand2 === null && \is_numeric($operand1))) { $result = $operand1 >= $operand2; } elseif ($useLowercaseFirstComparison) { $result = self::strcmpLowercaseFirst($operand1, $operand2) >= 0; @@ -139,9 +139,9 @@ class BinaryComparison */ private static function lessThanOrEqual($operand1, $operand2, bool $useLowercaseFirstComparison): bool { - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = ((abs($operand1 - $operand2) < self::DELTA) || ($operand1 < $operand2)); - } elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) { + if (\is_numeric($operand1) && \is_numeric($operand2)) { + $result = ((\abs($operand1 - $operand2) < self::DELTA) || ($operand1 < $operand2)); + } elseif (($operand1 === null && \is_numeric($operand2)) || ($operand2 === null && \is_numeric($operand1))) { $result = $operand1 <= $operand2; } elseif ($useLowercaseFirstComparison) { $result = self::strcmpLowercaseFirst($operand1, $operand2) <= 0; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Calculation.php b/PhpOffice/PhpSpreadsheet/Calculation/Calculation.php index 616784d..96c9698 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Calculation.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Calculation.php @@ -244,7 +244,7 @@ class Calculation public static function keyInExcelConstants(string $key): bool { - return array_key_exists($key, self::$excelConstants); + return \array_key_exists($key, self::$excelConstants); } /** @return mixed */ @@ -2930,9 +2930,9 @@ class Calculation private static function loadLocales(): void { $localeFileDirectory = __DIR__ . '/locale/'; - $localeFileNames = glob($localeFileDirectory . '*', GLOB_ONLYDIR) ?: []; + $localeFileNames = \glob($localeFileDirectory . '*', GLOB_ONLYDIR) ?: []; foreach ($localeFileNames as $filename) { - $filename = substr($filename, strlen($localeFileDirectory)); + $filename = \substr($filename, \strlen($localeFileDirectory)); if ($filename != 'en') { self::$validLocaleLanguages[] = $filename; } @@ -3145,12 +3145,12 @@ class Calculation private function getLocaleFile(string $localeDir, string $locale, string $language, string $file): string { - $localeFileName = $localeDir . str_replace('_', DIRECTORY_SEPARATOR, $locale) . + $localeFileName = $localeDir . \str_replace('_', DIRECTORY_SEPARATOR, $locale) . DIRECTORY_SEPARATOR . $file; - if (!file_exists($localeFileName)) { + if (!\file_exists($localeFileName)) { // If there isn't a locale specific file, look for a language specific file $localeFileName = $localeDir . $language . DIRECTORY_SEPARATOR . $file; - if (!file_exists($localeFileName)) { + if (!\file_exists($localeFileName)) { throw new Exception('Locale file not found'); } } @@ -3168,16 +3168,16 @@ class Calculation public function setLocale(string $locale) { // Identify our locale and language - $language = $locale = strtolower($locale); - if (strpos($locale, '_') !== false) { - [$language] = explode('_', $locale); + $language = $locale = \strtolower($locale); + if (\strpos($locale, '_') !== false) { + [$language] = \explode('_', $locale); } - if (count(self::$validLocaleLanguages) == 1) { + if (\count(self::$validLocaleLanguages) == 1) { self::loadLocales(); } // Test whether we have any language data for this language (any locale) - if (in_array($language, self::$validLocaleLanguages, true)) { + if (\in_array($language, self::$validLocaleLanguages, true)) { // initialise language/locale settings self::$localeFunctions = []; self::$localeArgumentSeparator = ','; @@ -3185,7 +3185,7 @@ class Calculation // Default is US English, if user isn't requesting US english, then read the necessary data from the locale files if ($locale !== 'en_us') { - $localeDir = implode(DIRECTORY_SEPARATOR, [__DIR__, 'locale', null]); + $localeDir = \implode(DIRECTORY_SEPARATOR, [__DIR__, 'locale', null]); // Search for a file with a list of function names for locale try { $functionNamesFile = $this->getLocaleFile($localeDir, $locale, $language, 'functions'); @@ -3194,12 +3194,12 @@ class Calculation } // Retrieve the list of locale or language specific function names - $localeFunctions = file($functionNamesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: []; + $localeFunctions = \file($functionNamesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: []; foreach ($localeFunctions as $localeFunction) { - [$localeFunction] = explode('##', $localeFunction); // Strip out comments - if (strpos($localeFunction, '=') !== false) { - [$fName, $lfName] = array_map('trim', explode('=', $localeFunction)); - if ((substr($fName, 0, 1) === '*' || isset(self::$phpSpreadsheetFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) { + [$localeFunction] = \explode('##', $localeFunction); // Strip out comments + if (\strpos($localeFunction, '=') !== false) { + [$fName, $lfName] = \array_map('trim', \explode('=', $localeFunction)); + if ((\substr($fName, 0, 1) === '*' || isset(self::$phpSpreadsheetFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) { self::$localeFunctions[$fName] = $lfName; } } @@ -3218,12 +3218,12 @@ class Calculation return false; } - $localeSettings = file($configFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: []; + $localeSettings = \file($configFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: []; foreach ($localeSettings as $localeSetting) { - [$localeSetting] = explode('##', $localeSetting); // Strip out comments - if (strpos($localeSetting, '=') !== false) { - [$settingName, $settingValue] = array_map('trim', explode('=', $localeSetting)); - $settingName = strtoupper($settingName); + [$localeSetting] = \explode('##', $localeSetting); // Strip out comments + if (\strpos($localeSetting, '=') !== false) { + [$settingName, $settingValue] = \array_map('trim', \explode('=', $localeSetting)); + $settingName = \strtoupper($settingName); if ($settingValue !== '') { switch ($settingName) { case 'ARGUMENTSEPARATOR': @@ -3254,9 +3254,9 @@ class Calculation string $openBrace = self::FORMULA_OPEN_FUNCTION_BRACE, string $closeBrace = self::FORMULA_CLOSE_FUNCTION_BRACE ): string { - $strlen = mb_strlen($formula); + $strlen = \mb_strlen($formula); for ($i = 0; $i < $strlen; ++$i) { - $chr = mb_substr($formula, $i, 1); + $chr = \mb_substr($formula, $i, 1); switch ($chr) { case $openBrace: ++$inBracesLevel; @@ -3268,7 +3268,7 @@ class Calculation break; case $fromSeparator: if ($inBracesLevel > 0) { - $formula = mb_substr($formula, 0, $i) . $toSeparator . mb_substr($formula, $i + 1); + $formula = \mb_substr($formula, 0, $i) . $toSeparator . \mb_substr($formula, $i + 1); } } } @@ -3286,7 +3286,7 @@ class Calculation string $toSeparator ): string { // Function Names - $formula = (string) preg_replace($from, $to, $formula); + $formula = (string) \preg_replace($from, $to, $formula); // Temporarily adjust matrix separators so that they won't be confused with function arguments $formula = self::translateSeparator(';', '|', $formula, $inMatrixBracesLevel, self::FORMULA_OPEN_MATRIX_BRACE, self::FORMULA_CLOSE_MATRIX_BRACE); @@ -3308,10 +3308,10 @@ class Calculation $inFunctionBracesLevel = 0; $inMatrixBracesLevel = 0; // If there is the possibility of separators within a quoted string, then we treat them as literals - if (strpos($formula, self::FORMULA_STRING_QUOTE) !== false) { + if (\strpos($formula, self::FORMULA_STRING_QUOTE) !== false) { // So instead we skip replacing in any quoted strings by only replacing in every other array element // after we've exploded the formula - $temp = explode(self::FORMULA_STRING_QUOTE, $formula); + $temp = \explode(self::FORMULA_STRING_QUOTE, $formula); $notWithinQuotes = false; foreach ($temp as &$value) { // Only adjust in alternating array entries @@ -3322,7 +3322,7 @@ class Calculation } unset($value); // Then rebuild the formula string - $formula = implode(self::FORMULA_STRING_QUOTE, $temp); + $formula = \implode(self::FORMULA_STRING_QUOTE, $temp); } else { // If there's no quoted strings, then we do a simple count/replace $formula = self::translateFormulaBlock($from, $to, $formula, $inFunctionBracesLevel, $inMatrixBracesLevel, $fromSeparator, $toSeparator); @@ -3348,21 +3348,21 @@ class Calculation // Build list of function names and constants for translation if (self::$functionReplaceFromExcel === null) { self::$functionReplaceFromExcel = []; - foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { - self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelFunctionName, '/') . '([\s]*\()/ui'; + foreach (\array_keys(self::$localeFunctions) as $excelFunctionName) { + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . \preg_quote($excelFunctionName, '/') . '([\s]*\()/ui'; } - foreach (array_keys(self::$localeBoolean) as $excelBoolean) { - self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/ui'; + foreach (\array_keys(self::$localeBoolean) as $excelBoolean) { + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . \preg_quote($excelBoolean, '/') . '([^\w\.])/ui'; } } if (self::$functionReplaceToLocale === null) { self::$functionReplaceToLocale = []; foreach (self::$localeFunctions as $localeFunctionName) { - self::$functionReplaceToLocale[] = '$1' . trim($localeFunctionName) . '$2'; + self::$functionReplaceToLocale[] = '$1' . \trim($localeFunctionName) . '$2'; } foreach (self::$localeBoolean as $localeBoolean) { - self::$functionReplaceToLocale[] = '$1' . trim($localeBoolean) . '$2'; + self::$functionReplaceToLocale[] = '$1' . \trim($localeBoolean) . '$2'; } } @@ -3391,20 +3391,20 @@ class Calculation if (self::$functionReplaceFromLocale === null) { self::$functionReplaceFromLocale = []; foreach (self::$localeFunctions as $localeFunctionName) { - self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($localeFunctionName, '/') . '([\s]*\()/ui'; + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . \preg_quote($localeFunctionName, '/') . '([\s]*\()/ui'; } foreach (self::$localeBoolean as $excelBoolean) { - self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/ui'; + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . \preg_quote($excelBoolean, '/') . '([^\w\.])/ui'; } } if (self::$functionReplaceToExcel === null) { self::$functionReplaceToExcel = []; - foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { - self::$functionReplaceToExcel[] = '$1' . trim($excelFunctionName) . '$2'; + foreach (\array_keys(self::$localeFunctions) as $excelFunctionName) { + self::$functionReplaceToExcel[] = '$1' . \trim($excelFunctionName) . '$2'; } - foreach (array_keys(self::$localeBoolean) as $excelBoolean) { - self::$functionReplaceToExcel[] = '$1' . trim($excelBoolean) . '$2'; + foreach (\array_keys(self::$localeBoolean) as $excelBoolean) { + self::$functionReplaceToExcel[] = '$1' . \trim($excelBoolean) . '$2'; } } @@ -3419,7 +3419,7 @@ class Calculation public static function localeFunc($function) { if (self::$localeLanguage !== 'en_us') { - $functionName = trim($function, '('); + $functionName = \trim($function, '('); if (isset(self::$localeFunctions[$functionName])) { $brace = ($functionName != $function); $function = self::$localeFunctions[$functionName]; @@ -3441,16 +3441,16 @@ class Calculation */ public static function wrapResult($value) { - if (is_string($value)) { + if (\is_string($value)) { // Error values cannot be "wrapped" - if (preg_match('/^' . self::CALCULATION_REGEXP_ERROR . '$/i', $value, $match)) { + if (\preg_match('/^' . self::CALCULATION_REGEXP_ERROR . '$/i', $value, $match)) { // Return Excel errors "as is" return $value; } // Return strings wrapped in quotes return self::FORMULA_STRING_QUOTE . $value . self::FORMULA_STRING_QUOTE; - } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { + } elseif ((\is_float($value)) && ((\is_nan($value)) || (\is_infinite($value)))) { // Convert numeric errors to NaN error return Information\ExcelError::NAN(); } @@ -3467,12 +3467,12 @@ class Calculation */ public static function unwrapResult($value) { - if (is_string($value)) { - if ((isset($value[0])) && ($value[0] == self::FORMULA_STRING_QUOTE) && (substr($value, -1) == self::FORMULA_STRING_QUOTE)) { - return substr($value, 1, -1); + if (\is_string($value)) { + if ((isset($value[0])) && ($value[0] == self::FORMULA_STRING_QUOTE) && (\substr($value, -1) == self::FORMULA_STRING_QUOTE)) { + return \substr($value, 1, -1); } // Convert numeric errors to NAN error - } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { + } elseif ((\is_float($value)) && ((\is_nan($value)) || (\is_infinite($value)))) { return Information\ExcelError::NAN(); } @@ -3536,7 +3536,7 @@ class Calculation throw new Exception('null spreadsheet in calculateCellValue'); } $cellAddressAttempted = true; - $cellAddress = array_pop($this->cellStack); + $cellAddress = \array_pop($this->cellStack); if ($cellAddress === null) { throw new Exception('null cellAddress in calculateCellValue'); } @@ -3547,11 +3547,11 @@ class Calculation $testSheet->getCell($cellAddress['cell']); } catch (\Exception $e) { if (!$cellAddressAttempted) { - $cellAddress = array_pop($this->cellStack); + $cellAddress = \array_pop($this->cellStack); } - if ($this->spreadsheet !== null && is_array($cellAddress) && array_key_exists('sheet', $cellAddress)) { + if ($this->spreadsheet !== null && \is_array($cellAddress) && \array_key_exists('sheet', $cellAddress)) { $testSheet = $this->spreadsheet->getSheetByName($cellAddress['sheet']); - if ($testSheet !== null && array_key_exists('cell', $cellAddress)) { + if ($testSheet !== null && \array_key_exists('cell', $cellAddress)) { $testSheet->getCell($cellAddress['cell']); } } @@ -3559,35 +3559,35 @@ class Calculation throw new Exception($e->getMessage()); } - if ((is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { + if ((\is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { self::$returnArrayAsType = $returnArrayAsType; $testResult = Functions::flattenArray($result); if (self::$returnArrayAsType == self::RETURN_ARRAY_AS_ERROR) { return Information\ExcelError::VALUE(); } // If there's only a single cell in the array, then we allow it - if (count($testResult) != 1) { + if (\count($testResult) != 1) { // If keys are numeric, then it's a matrix result rather than a cell range result, so we permit it - $r = array_keys($result); - $r = array_shift($r); - if (!is_numeric($r)) { + $r = \array_keys($result); + $r = \array_shift($r); + if (!\is_numeric($r)) { return Information\ExcelError::VALUE(); } - if (is_array($result[$r])) { - $c = array_keys($result[$r]); - $c = array_shift($c); - if (!is_numeric($c)) { + if (\is_array($result[$r])) { + $c = \array_keys($result[$r]); + $c = \array_shift($c); + if (!\is_numeric($c)) { return Information\ExcelError::VALUE(); } } } - $result = array_shift($testResult); + $result = \array_shift($testResult); } self::$returnArrayAsType = $returnArrayAsType; if ($result === null && $cell->getWorksheet()->getSheetView()->getShowZeros()) { return 0; - } elseif ((is_float($result)) && ((is_nan($result)) || (is_infinite($result)))) { + } elseif ((\is_float($result)) && ((\is_nan($result)) || (\is_infinite($result)))) { return Information\ExcelError::NAN(); } @@ -3605,11 +3605,11 @@ class Calculation { // Basic validation that this is indeed a formula // We return an empty array if not - $formula = trim($formula); + $formula = \trim($formula); if ((!isset($formula[0])) || ($formula[0] != '=')) { return []; } - $formula = ltrim(substr($formula, 1)); + $formula = \ltrim(\substr($formula, 1)); if (!isset($formula[0])) { return []; } @@ -3708,17 +3708,17 @@ class Calculation return self::wrapResult((string) $formula); } - if (preg_match('/^=\s*cmd\s*\|/miu', $formula) !== 0) { + if (\preg_match('/^=\s*cmd\s*\|/miu', $formula) !== 0) { return self::wrapResult($formula); } // Basic validation that this is indeed a formula // We simply return the cell value if not - $formula = trim($formula); + $formula = \trim($formula); if ($formula[0] != '=') { return self::wrapResult($formula); } - $formula = ltrim(substr($formula, 1)); + $formula = \ltrim(\substr($formula, 1)); if (!isset($formula[0])) { return self::wrapResult($formula); } @@ -3786,13 +3786,13 @@ class Calculation { // Examine each of the two operands, and turn them into an array if they aren't one already // Note that this function should only be called if one or both of the operand is already an array - if (!is_array($operand1)) { + if (!\is_array($operand1)) { [$matrixRows, $matrixColumns] = self::getMatrixDimensions($operand2); - $operand1 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand1)); + $operand1 = \array_fill(0, $matrixRows, \array_fill(0, $matrixColumns, $operand1)); $resize = 0; - } elseif (!is_array($operand2)) { + } elseif (!\is_array($operand2)) { [$matrixRows, $matrixColumns] = self::getMatrixDimensions($operand1); - $operand2 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand2)); + $operand2 = \array_fill(0, $matrixRows, \array_fill(0, $matrixColumns, $operand2)); $resize = 0; } @@ -3822,18 +3822,18 @@ class Calculation */ public static function getMatrixDimensions(array &$matrix) { - $matrixRows = count($matrix); + $matrixRows = \count($matrix); $matrixColumns = 0; foreach ($matrix as $rowKey => $rowValue) { - if (!is_array($rowValue)) { + if (!\is_array($rowValue)) { $matrix[$rowKey] = [$rowValue]; - $matrixColumns = max(1, $matrixColumns); + $matrixColumns = \max(1, $matrixColumns); } else { - $matrix[$rowKey] = array_values($rowValue); - $matrixColumns = max(count($rowValue), $matrixColumns); + $matrix[$rowKey] = \array_values($rowValue); + $matrixColumns = \max(\count($rowValue), $matrixColumns); } } - $matrix = array_values($matrix); + $matrix = \array_values($matrix); return [$matrixRows, $matrixColumns]; } @@ -3939,26 +3939,26 @@ class Calculation { if ($this->debugLog->getWriteDebugLog()) { $testArray = Functions::flattenArray($value); - if (count($testArray) == 1) { - $value = array_pop($testArray); + if (\count($testArray) == 1) { + $value = \array_pop($testArray); } - if (is_array($value)) { + if (\is_array($value)) { $returnMatrix = []; $pad = $rpad = ', '; foreach ($value as $row) { - if (is_array($row)) { - $returnMatrix[] = implode($pad, array_map([$this, 'showValue'], $row)); + if (\is_array($row)) { + $returnMatrix[] = \implode($pad, \array_map([$this, 'showValue'], $row)); $rpad = '; '; } else { $returnMatrix[] = $this->showValue($row); } } - return '{ ' . implode($rpad, $returnMatrix) . ' }'; - } elseif (is_string($value) && (trim($value, self::FORMULA_STRING_QUOTE) == $value)) { + return '{ ' . \implode($rpad, $returnMatrix) . ' }'; + } elseif (\is_string($value) && (\trim($value, self::FORMULA_STRING_QUOTE) == $value)) { return self::FORMULA_STRING_QUOTE . $value . self::FORMULA_STRING_QUOTE; - } elseif (is_bool($value)) { + } elseif (\is_bool($value)) { return ($value) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; } elseif ($value === null) { return self::$localeBoolean['NULL']; @@ -3979,19 +3979,19 @@ class Calculation { if ($this->debugLog->getWriteDebugLog()) { $testArray = Functions::flattenArray($value); - if (count($testArray) == 1) { - $value = array_pop($testArray); + if (\count($testArray) == 1) { + $value = \array_pop($testArray); } if ($value === null) { return 'a NULL value'; - } elseif (is_float($value)) { + } elseif (\is_float($value)) { $typeString = 'a floating point number'; - } elseif (is_int($value)) { + } elseif (\is_int($value)) { $typeString = 'an integer number'; - } elseif (is_bool($value)) { + } elseif (\is_bool($value)) { $typeString = 'a boolean'; - } elseif (is_array($value)) { + } elseif (\is_array($value)) { $typeString = 'a matrix'; } else { if ($value == '') { @@ -4019,12 +4019,12 @@ class Calculation static $matrixReplaceTo = ['MKMATRIX(MKMATRIX(', '),MKMATRIX(', '))']; // Convert any Excel matrix references to the MKMATRIX() function - if (strpos($formula, self::FORMULA_OPEN_MATRIX_BRACE) !== false) { + if (\strpos($formula, self::FORMULA_OPEN_MATRIX_BRACE) !== false) { // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators - if (strpos($formula, self::FORMULA_STRING_QUOTE) !== false) { + if (\strpos($formula, self::FORMULA_STRING_QUOTE) !== false) { // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded // the formula - $temp = explode(self::FORMULA_STRING_QUOTE, $formula); + $temp = \explode(self::FORMULA_STRING_QUOTE, $formula); // Open and Closed counts used for trapping mismatched braces in the formula $openCount = $closeCount = 0; $notWithinQuotes = false; @@ -4032,19 +4032,19 @@ class Calculation // Only count/replace in alternating array entries $notWithinQuotes = $notWithinQuotes === false; if ($notWithinQuotes === true) { - $openCount += substr_count($value, self::FORMULA_OPEN_MATRIX_BRACE); - $closeCount += substr_count($value, self::FORMULA_CLOSE_MATRIX_BRACE); - $value = str_replace($matrixReplaceFrom, $matrixReplaceTo, $value); + $openCount += \substr_count($value, self::FORMULA_OPEN_MATRIX_BRACE); + $closeCount += \substr_count($value, self::FORMULA_CLOSE_MATRIX_BRACE); + $value = \str_replace($matrixReplaceFrom, $matrixReplaceTo, $value); } } unset($value); // Then rebuild the formula string - $formula = implode(self::FORMULA_STRING_QUOTE, $temp); + $formula = \implode(self::FORMULA_STRING_QUOTE, $temp); } else { // If there's no quoted strings, then we do a simple count/replace - $openCount = substr_count($formula, self::FORMULA_OPEN_MATRIX_BRACE); - $closeCount = substr_count($formula, self::FORMULA_CLOSE_MATRIX_BRACE); - $formula = str_replace($matrixReplaceFrom, $matrixReplaceTo, $formula); + $openCount = \substr_count($formula, self::FORMULA_OPEN_MATRIX_BRACE); + $closeCount = \substr_count($formula, self::FORMULA_CLOSE_MATRIX_BRACE); + $formula = \str_replace($matrixReplaceFrom, $matrixReplaceTo, $formula); } // Trap for mismatched braces and trigger an appropriate error if ($openCount < $closeCount) { @@ -4118,7 +4118,7 @@ class Calculation */ private function internalParseFormula($formula, ?Cell $cell = null) { - if (($formula = $this->convertMatrixReferences(trim($formula))) === false) { + if (($formula = $this->convertMatrixReferences(\trim($formula))) === false) { return false; } @@ -4157,12 +4157,12 @@ class Calculation $opCharacter = $formula[$index]; // Get the first character of the value at the current index position // Check for two-character operators (e.g. >=, <=, <>) - if ((isset(self::$comparisonOperators[$opCharacter])) && (strlen($formula) > $index) && (isset(self::$comparisonOperators[$formula[$index + 1]]))) { + if ((isset(self::$comparisonOperators[$opCharacter])) && (\strlen($formula) > $index) && (isset(self::$comparisonOperators[$formula[$index + 1]]))) { $opCharacter .= $formula[++$index]; } // Find out if we're currently at the beginning of a number, variable, cell/row/column reference, // function, defined name, structured reference, parenthesis, error or operand - $isOperandOrFunction = (bool) preg_match($regexpMatchString, substr($formula, $index), $match); + $isOperandOrFunction = (bool) \preg_match($regexpMatchString, \substr($formula, $index), $match); $expectingOperatorCopy = $expectingOperator; if ($opCharacter === '-' && !$expectingOperator) { // Is it a negation instead of a minus? @@ -4204,7 +4204,7 @@ class Calculation // call or a parenthesis $this->branchPruner->decrementDepth(); - if (is_array($d) && preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $d['value'], $matches)) { + if (\is_array($d) && \preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $d['value'], $matches)) { // Did this parenthesis just close a function? try { $this->branchPruner->closingBrace($d['value']); @@ -4233,11 +4233,11 @@ class Calculation // Check the argument count $argumentCountError = false; $expectedArgumentCountString = null; - if (is_numeric($expectedArgumentCount)) { + if (\is_numeric($expectedArgumentCount)) { if ($expectedArgumentCount < 0) { - if ($argumentCount > abs($expectedArgumentCount)) { + if ($argumentCount > \abs($expectedArgumentCount)) { $argumentCountError = true; - $expectedArgumentCountString = 'no more than ' . abs($expectedArgumentCount); + $expectedArgumentCountString = 'no more than ' . \abs($expectedArgumentCount); } } else { if ($argumentCount != $expectedArgumentCount) { @@ -4246,7 +4246,7 @@ class Calculation } } } elseif ($expectedArgumentCount != '*') { - $isOperandOrFunction = preg_match('/(\d*)([-+,])(\d*)/', $expectedArgumentCount, $argMatch); + $isOperandOrFunction = \preg_match('/(\d*)([-+,])(\d*)/', $expectedArgumentCount, $argMatch); self::doNothing($isOperandOrFunction); switch ($argMatch[2]) { case '+': @@ -4294,7 +4294,7 @@ class Calculation } // make sure there was a function $d = $stack->last(2); - if (!preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $d['value'] ?? '', $matches)) { + if (!\preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $d['value'] ?? '', $matches)) { // Can we inject a dummy function at this point so that the braces at least have some context // because at least the braces are paired up (at this stage in the formula) // MS Excel allows this if the content is cell references; but doesn't allow actual values, @@ -4322,12 +4322,12 @@ class Calculation $expectingOperator = true; $expectingOperand = false; $val = $match[1]; - $length = strlen($val); + $length = \strlen($val); - if (preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $val, $matches)) { - $val = (string) preg_replace('/\s/u', '', $val); - if (isset(self::$phpSpreadsheetFunctions[strtoupper($matches[1])]) || isset(self::$controlFunctions[strtoupper($matches[1])])) { // it's a function - $valToUpper = strtoupper($val); + if (\preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $val, $matches)) { + $val = (string) \preg_replace('/\s/u', '', $val); + if (isset(self::$phpSpreadsheetFunctions[\strtoupper($matches[1])]) || isset(self::$controlFunctions[\strtoupper($matches[1])])) { // it's a function + $valToUpper = \strtoupper($val); } else { $valToUpper = 'NAME.ERROR('; } @@ -4338,7 +4338,7 @@ class Calculation $stack->push('Function', $valToUpper); // tests if the function is closed right after opening - $ax = preg_match('/^\s*\)/u', substr($formula, $index + $length)); + $ax = \preg_match('/^\s*\)/u', \substr($formula, $index + $length)); if ($ax) { $stack->push('Operand Count for Function ' . $valToUpper . ')', 0); $expectingOperator = true; @@ -4347,7 +4347,7 @@ class Calculation $expectingOperator = false; } $stack->push('Brace', '('); - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $val, $matches)) { + } elseif (\preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $val, $matches)) { // Watch for this case-change when modifying to allow cell references in different worksheets... // Should only be applied to the actual cell column, not the worksheet name // If the last entry on the stack was a : operator, then we have a cell range reference @@ -4357,36 +4357,36 @@ class Calculation if ($matches[2] === '') { // Otherwise, we 'inherit' the worksheet reference from the start cell reference // The start of the cell range reference should be the last entry in $output - $rangeStartCellRef = $output[count($output) - 1]['value'] ?? ''; + $rangeStartCellRef = $output[\count($output) - 1]['value'] ?? ''; if ($rangeStartCellRef === ':') { // Do we have chained range operators? - $rangeStartCellRef = $output[count($output) - 2]['value'] ?? ''; + $rangeStartCellRef = $output[\count($output) - 2]['value'] ?? ''; } - preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $rangeStartCellRef, $rangeStartMatches); + \preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $rangeStartCellRef, $rangeStartMatches); if ($rangeStartMatches[2] > '') { $val = $rangeStartMatches[2] . '!' . $val; } } else { - $rangeStartCellRef = $output[count($output) - 1]['value'] ?? ''; + $rangeStartCellRef = $output[\count($output) - 1]['value'] ?? ''; if ($rangeStartCellRef === ':') { // Do we have chained range operators? - $rangeStartCellRef = $output[count($output) - 2]['value'] ?? ''; + $rangeStartCellRef = $output[\count($output) - 2]['value'] ?? ''; } - preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $rangeStartCellRef, $rangeStartMatches); + \preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $rangeStartCellRef, $rangeStartMatches); if ($rangeStartMatches[2] !== $matches[2]) { return $this->raiseFormulaError('3D Range references are not yet supported'); } } - } elseif (strpos($val, '!') === false && $pCellParent !== null) { + } elseif (\strpos($val, '!') === false && $pCellParent !== null) { $worksheet = $pCellParent->getTitle(); $val = "'{$worksheet}'!{$val}"; } // unescape any apostrophes or double quotes in worksheet name - $val = str_replace(["''", '""'], ["'", '"'], $val); + $val = \str_replace(["''", '""'], ["'", '"'], $val); $outputItem = $stack->getStackItem('Cell Reference', $val, $val); $output[] = $outputItem; - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_STRUCTURED_REFERENCE . '$/miu', $val, $matches)) { + } elseif (\preg_match('/^' . self::CALCULATION_REGEXP_STRUCTURED_REFERENCE . '$/miu', $val, $matches)) { try { $structuredReference = Operands\StructuredReference::fromParser($formula, $index, $matches); } catch (Exception $e) { @@ -4394,7 +4394,7 @@ class Calculation } $val = $structuredReference->value(); - $length = strlen($val); + $length = \strlen($val); $outputItem = $stack->getStackItem(Operands\StructuredReference::NAME, $structuredReference, null); $output[] = $outputItem; @@ -4411,20 +4411,20 @@ class Calculation $stackItemType = 'Cell Reference'; if ( - !is_numeric($val) && - ((ctype_alpha($val) === false || strlen($val) > 3)) && - (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $val) !== false) && + !\is_numeric($val) && + ((\ctype_alpha($val) === false || \strlen($val) > 3)) && + (\preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $val) !== false) && ($this->spreadsheet === null || $this->spreadsheet->getNamedRange($val) !== null) ) { $namedRange = ($this->spreadsheet === null) ? null : $this->spreadsheet->getNamedRange($val); if ($namedRange !== null) { $stackItemType = 'Defined Name'; - $address = str_replace('$', '', $namedRange->getValue()); + $address = \str_replace('$', '', $namedRange->getValue()); $stackItemReference = $val; - if (strpos($address, ':') !== false) { + if (\strpos($address, ':') !== false) { // We'll need to manipulate the stack for an actual named range rather than a named cell - $fromTo = explode(':', $address); - $to = array_pop($fromTo); + $fromTo = \explode(':', $address); + $to = \array_pop($fromTo); foreach ($fromTo as $from) { $output[] = $stack->getStackItem($stackItemType, $from, $stackItemReference); $output[] = $stack->getStackItem('Binary Operator', ':'); @@ -4434,13 +4434,13 @@ class Calculation $val = $address; } } else { - $startRowColRef = $output[count($output) - 1]['value'] ?? ''; + $startRowColRef = $output[\count($output) - 1]['value'] ?? ''; [$rangeWS1, $startRowColRef] = Worksheet::extractSheetTitle($startRowColRef, true); $rangeSheetRef = $rangeWS1; if ($rangeWS1 !== '') { $rangeWS1 .= '!'; } - $rangeSheetRef = trim($rangeSheetRef, "'"); + $rangeSheetRef = \trim($rangeSheetRef, "'"); [$rangeWS2, $val] = Worksheet::extractSheetTitle($val, true); if ($rangeWS2 !== '') { $rangeWS2 .= '!'; @@ -4453,14 +4453,14 @@ class Calculation $refSheet = $pCellParent->getParent()->getSheetByName($rangeSheetRef); } - if (ctype_digit($val) && $val <= 1048576) { + if (\ctype_digit($val) && $val <= 1048576) { // Row range $stackItemType = 'Row Reference'; /** @var int $valx */ $valx = $val; $endRowColRef = ($refSheet !== null) ? $refSheet->getHighestDataColumn($valx) : AddressRange::MAX_COLUMN; // Max 16,384 columns for Excel2007 $val = "{$rangeWS2}{$endRowColRef}{$val}"; - } elseif (ctype_alpha($val) && strlen($val) <= 3) { + } elseif (\ctype_alpha($val) && \strlen($val) <= 3) { // Column range $stackItemType = 'Column Reference'; $endRowColRef = ($refSheet !== null) ? $refSheet->getHighestDataRow($val) : AddressRange::MAX_ROW; // Max 1,048,576 rows for Excel2007 @@ -4470,24 +4470,24 @@ class Calculation } } elseif ($opCharacter === self::FORMULA_STRING_QUOTE) { // UnEscape any quotes within the string - $val = self::wrapResult(str_replace('""', self::FORMULA_STRING_QUOTE, self::unwrapResult($val))); - } elseif (isset(self::$excelConstants[trim(strtoupper($val))])) { + $val = self::wrapResult(\str_replace('""', self::FORMULA_STRING_QUOTE, self::unwrapResult($val))); + } elseif (isset(self::$excelConstants[\trim(\strtoupper($val))])) { $stackItemType = 'Constant'; - $excelConstant = trim(strtoupper($val)); + $excelConstant = \trim(\strtoupper($val)); $val = self::$excelConstants[$excelConstant]; $stackItemReference = $excelConstant; - } elseif (($localeConstant = array_search(trim(strtoupper($val)), self::$localeBoolean)) !== false) { + } elseif (($localeConstant = \array_search(\trim(\strtoupper($val)), self::$localeBoolean)) !== false) { $stackItemType = 'Constant'; $val = self::$excelConstants[$localeConstant]; $stackItemReference = $localeConstant; } elseif ( - preg_match('/^' . self::CALCULATION_REGEXP_ROW_RANGE . '/miu', substr($formula, $index), $rowRangeReference) + \preg_match('/^' . self::CALCULATION_REGEXP_ROW_RANGE . '/miu', \substr($formula, $index), $rowRangeReference) ) { $val = $rowRangeReference[1]; - $length = strlen($rowRangeReference[1]); + $length = \strlen($rowRangeReference[1]); $stackItemType = 'Row Reference'; // unescape any apostrophes or double quotes in worksheet name - $val = str_replace(["''", '""'], ["'", '"'], $val); + $val = \str_replace(["''", '""'], ["'", '"'], $val); $column = 'A'; if (($testPrevOp !== null && $testPrevOp['value'] === ':') && $pCellParent !== null) { $column = $pCellParent->getHighestDataColumn($val); @@ -4495,24 +4495,24 @@ class Calculation $val = "{$rowRangeReference[2]}{$column}{$rowRangeReference[7]}"; $stackItemReference = $val; } elseif ( - preg_match('/^' . self::CALCULATION_REGEXP_COLUMN_RANGE . '/miu', substr($formula, $index), $columnRangeReference) + \preg_match('/^' . self::CALCULATION_REGEXP_COLUMN_RANGE . '/miu', \substr($formula, $index), $columnRangeReference) ) { $val = $columnRangeReference[1]; - $length = strlen($val); + $length = \strlen($val); $stackItemType = 'Column Reference'; // unescape any apostrophes or double quotes in worksheet name - $val = str_replace(["''", '""'], ["'", '"'], $val); + $val = \str_replace(["''", '""'], ["'", '"'], $val); $row = '1'; if (($testPrevOp !== null && $testPrevOp['value'] === ':') && $pCellParent !== null) { $row = $pCellParent->getHighestDataRow($val); } $val = "{$val}{$row}"; $stackItemReference = $val; - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '.*/miu', $val, $match)) { + } elseif (\preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '.*/miu', $val, $match)) { $stackItemType = 'Defined Name'; $stackItemReference = $val; - } elseif (is_numeric($val)) { - if ((strpos((string) $val, '.') !== false) || (stripos((string) $val, 'e') !== false) || ($val > PHP_INT_MAX) || ($val < -PHP_INT_MAX)) { + } elseif (\is_numeric($val)) { + if ((\strpos((string) $val, '.') !== false) || (\stripos((string) $val, 'e') !== false) || ($val > PHP_INT_MAX) || ($val < -PHP_INT_MAX)) { $val = (float) $val; } else { $val = (int) $val; @@ -4542,7 +4542,7 @@ class Calculation return $this->raiseFormulaError('Formula Error: An unexpected error occurred'); } // Test for end of formula string - if ($index == strlen($formula)) { + if ($index == \strlen($formula)) { // Did we end with an operator?. // Only valid for the % unary operator if ((isset(self::CALCULATION_OPERATORS[$opCharacter])) && ($opCharacter != '%')) { @@ -4563,18 +4563,18 @@ class Calculation // If we're expecting an operator, but only have a space between the previous and next operands (and both are // Cell References, Defined Names or Structured References) then we have an INTERSECTION operator - $countOutputMinus1 = count($output) - 1; + $countOutputMinus1 = \count($output) - 1; if ( ($expectingOperator) && - array_key_exists($countOutputMinus1, $output) && - is_array($output[$countOutputMinus1]) && - array_key_exists('type', $output[$countOutputMinus1]) && + \array_key_exists($countOutputMinus1, $output) && + \is_array($output[$countOutputMinus1]) && + \array_key_exists('type', $output[$countOutputMinus1]) && ( - (preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '.*/miu', substr($formula, $index), $match)) && + (\preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '.*/miu', \substr($formula, $index), $match)) && ($output[$countOutputMinus1]['type'] === 'Cell Reference') || - (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '.*/miu', substr($formula, $index), $match)) && + (\preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '.*/miu', \substr($formula, $index), $match)) && ($output[$countOutputMinus1]['type'] === 'Defined Name' || $output[$countOutputMinus1]['type'] === 'Value') || - (preg_match('/^' . self::CALCULATION_REGEXP_STRUCTURED_REFERENCE . '.*/miu', substr($formula, $index), $match)) && + (\preg_match('/^' . self::CALCULATION_REGEXP_STRUCTURED_REFERENCE . '.*/miu', \substr($formula, $index), $match)) && ($output[$countOutputMinus1]['type'] === Operands\StructuredReference::NAME || $output[$countOutputMinus1]['type'] === 'Value') ) ) { @@ -4594,7 +4594,7 @@ class Calculation while (($op = $stack->pop()) !== null) { // pop everything off the stack and push onto output - if ((is_array($op) && $op['value'] == '(')) { + if ((\is_array($op) && $op['value'] == '(')) { return $this->raiseFormulaError("Formula Error: Expecting ')'"); // if there are any opening braces on the stack, then braces were unbalanced } $output[] = $op; @@ -4611,18 +4611,18 @@ class Calculation private static function dataTestReference(&$operandData) { $operand = $operandData['value']; - if (($operandData['reference'] === null) && (is_array($operand))) { - $rKeys = array_keys($operand); - $rowKey = array_shift($rKeys); - if (is_array($operand[$rowKey]) === false) { + if (($operandData['reference'] === null) && (\is_array($operand))) { + $rKeys = \array_keys($operand); + $rowKey = \array_shift($rKeys); + if (\is_array($operand[$rowKey]) === false) { $operandData['value'] = $operand[$rowKey]; return $operand[$rowKey]; } - $cKeys = array_keys(array_keys($operand[$rowKey])); - $colKey = array_shift($cKeys); - if (ctype_upper("$colKey")) { + $cKeys = \array_keys(\array_keys($operand[$rowKey])); + $colKey = \array_shift($cKeys); + if (\ctype_upper("$colKey")) { $operandData['reference'] = $colKey . $rowKey; } } @@ -4662,9 +4662,9 @@ class Calculation $storeValue = $branchStore[$onlyIfStoreKey] ?? null; $storeValueAsBool = ($storeValue === null) ? true : (bool) Functions::flattenSingleValue($storeValue); - if (is_array($storeValue)) { - $wrappedItem = end($storeValue); - $storeValue = is_array($wrappedItem) ? end($wrappedItem) : $wrappedItem; + if (\is_array($storeValue)) { + $wrappedItem = \end($storeValue); + $storeValue = \is_array($wrappedItem) ? \end($wrappedItem) : $wrappedItem; } if ( @@ -4694,9 +4694,9 @@ class Calculation $storeValue = $branchStore[$onlyIfNotStoreKey] ?? null; $storeValueAsBool = ($storeValue === null) ? true : (bool) Functions::flattenSingleValue($storeValue); - if (is_array($storeValue)) { - $wrappedItem = end($storeValue); - $storeValue = is_array($wrappedItem) ? end($wrappedItem) : $wrappedItem; + if (\is_array($storeValue)) { + $wrappedItem = \end($storeValue); + $storeValue = \is_array($wrappedItem) ? \end($wrappedItem) : $wrappedItem; } if ( @@ -4728,7 +4728,7 @@ class Calculation try { $cellRange = $token->parse($cell); - if (strpos($cellRange, ':') !== false) { + if (\strpos($cellRange, ':') !== false) { $this->debugLog->writeDebugLog('Evaluating Structured Reference %s as Cell Range %s', $token->value(), $cellRange); $rangeValue = self::getInstance($cell->getWorksheet()->getParent())->_calculateFormulaValue("={$cellRange}", $token->value(), $cell); $stack->push('Value', $rangeValue); @@ -4747,7 +4747,7 @@ class Calculation return $this->raiseFormulaError($e->getMessage()); } } - } elseif (!is_numeric($token) && !is_object($token) && isset(self::BINARY_OPERATORS[$token])) { + } elseif (!\is_numeric($token) && !\is_object($token) && isset(self::BINARY_OPERATORS[$token])) { // if the token is a binary operator, pop the top two values off the stack, do the operation, and push the result back on the stack // We must have two operands, error if we don't if (($operand2Data = $stack->pop()) === null) { @@ -4785,14 +4785,14 @@ class Calculation // Binary Operators case ':': // Range if ($operand1Data['type'] === 'Defined Name') { - if (preg_match('/$' . self::CALCULATION_REGEXP_DEFINEDNAME . '^/mui', $operand1Data['reference']) !== false && $this->spreadsheet !== null) { + if (\preg_match('/$' . self::CALCULATION_REGEXP_DEFINEDNAME . '^/mui', $operand1Data['reference']) !== false && $this->spreadsheet !== null) { $definedName = $this->spreadsheet->getNamedRange($operand1Data['reference']); if ($definedName !== null) { - $operand1Data['reference'] = $operand1Data['value'] = str_replace('$', '', $definedName->getValue()); + $operand1Data['reference'] = $operand1Data['value'] = \str_replace('$', '', $definedName->getValue()); } } } - if (strpos($operand1Data['reference'], '!') !== false) { + if (\strpos($operand1Data['reference'], '!') !== false) { [$sheet1, $operand1Data['reference']] = Worksheet::extractSheetTitle($operand1Data['reference'], true); } else { $sheet1 = ($pCellWorksheet !== null) ? $pCellWorksheet->getTitle() : ''; @@ -4803,38 +4803,38 @@ class Calculation $sheet2 = $sheet1; } - if (trim($sheet1, "'") === trim($sheet2, "'")) { + if (\trim($sheet1, "'") === \trim($sheet2, "'")) { if ($operand1Data['reference'] === null && $cell !== null) { - if (is_array($operand1Data['value'])) { + if (\is_array($operand1Data['value'])) { $operand1Data['reference'] = $cell->getCoordinate(); - } elseif ((trim($operand1Data['value']) != '') && (is_numeric($operand1Data['value']))) { + } elseif ((\trim($operand1Data['value']) != '') && (\is_numeric($operand1Data['value']))) { $operand1Data['reference'] = $cell->getColumn() . $operand1Data['value']; - } elseif (trim($operand1Data['value']) == '') { + } elseif (\trim($operand1Data['value']) == '') { $operand1Data['reference'] = $cell->getCoordinate(); } else { $operand1Data['reference'] = $operand1Data['value'] . $cell->getRow(); } } if ($operand2Data['reference'] === null && $cell !== null) { - if (is_array($operand2Data['value'])) { + if (\is_array($operand2Data['value'])) { $operand2Data['reference'] = $cell->getCoordinate(); - } elseif ((trim($operand2Data['value']) != '') && (is_numeric($operand2Data['value']))) { + } elseif ((\trim($operand2Data['value']) != '') && (\is_numeric($operand2Data['value']))) { $operand2Data['reference'] = $cell->getColumn() . $operand2Data['value']; - } elseif (trim($operand2Data['value']) == '') { + } elseif (\trim($operand2Data['value']) == '') { $operand2Data['reference'] = $cell->getCoordinate(); } else { $operand2Data['reference'] = $operand2Data['value'] . $cell->getRow(); } } - $oData = array_merge(explode(':', $operand1Data['reference']), explode(':', $operand2Data['reference'])); + $oData = \array_merge(\explode(':', $operand1Data['reference']), \explode(':', $operand2Data['reference'])); $oCol = $oRow = []; foreach ($oData as $oDatum) { $oCR = Coordinate::coordinateFromString($oDatum); $oCol[] = Coordinate::columnIndexFromString($oCR[0]) - 1; $oRow[] = $oCR[1]; } - $cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow); + $cellRef = Coordinate::stringFromColumnIndex(\min($oCol) + 1) . \min($oRow) . ':' . Coordinate::stringFromColumnIndex(\max($oCol) + 1) . \max($oRow); if ($pCellParent !== null && $this->spreadsheet !== null) { $cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($sheet1), false); } else { @@ -4864,11 +4864,11 @@ class Calculation // matrix operation $operand1 = self::boolToString($operand1); $operand2 = self::boolToString($operand2); - if (is_array($operand1) || is_array($operand2)) { - if (is_string($operand1)) { + if (\is_array($operand1) || \is_array($operand2)) { + if (\is_string($operand1)) { $operand1 = self::unwrapResult($operand1); } - if (is_string($operand2)) { + if (\is_string($operand2)) { $operand2 = self::unwrapResult($operand2); } // Ensure that both operands are arrays/matrices @@ -4892,7 +4892,7 @@ class Calculation // using the concatenation operator // with literals that fits in 32K, // so I don't think we can overflow here. - $result = self::FORMULA_STRING_QUOTE . str_replace('""', self::FORMULA_STRING_QUOTE, self::unwrapResult($operand1) . self::unwrapResult($operand2)) . self::FORMULA_STRING_QUOTE; + $result = self::FORMULA_STRING_QUOTE . \str_replace('""', self::FORMULA_STRING_QUOTE, self::unwrapResult($operand1) . self::unwrapResult($operand2)) . self::FORMULA_STRING_QUOTE; } $this->debugLog->writeDebugLog('Evaluation Result is %s', $this->showTypeDetails($result)); $stack->push('Value', $result); @@ -4903,21 +4903,21 @@ class Calculation break; case '∩': // Intersect - $rowIntersect = array_intersect_key($operand1, $operand2); + $rowIntersect = \array_intersect_key($operand1, $operand2); $cellIntersect = $oCol = $oRow = []; - foreach (array_keys($rowIntersect) as $row) { + foreach (\array_keys($rowIntersect) as $row) { $oRow[] = $row; foreach ($rowIntersect[$row] as $col => $data) { $oCol[] = Coordinate::columnIndexFromString($col) - 1; - $cellIntersect[$row] = array_intersect_key($operand1[$row], $operand2[$row]); + $cellIntersect[$row] = \array_intersect_key($operand1[$row], $operand2[$row]); } } - if (count(Functions::flattenArray($cellIntersect)) === 0) { + if (\count(Functions::flattenArray($cellIntersect)) === 0) { $this->debugLog->writeDebugLog('Evaluation Result is %s', $this->showTypeDetails($cellIntersect)); $stack->push('Error', Information\ExcelError::null(), null); } else { - $cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . - Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow); + $cellRef = Coordinate::stringFromColumnIndex(\min($oCol) + 1) . \min($oRow) . ':' . + Coordinate::stringFromColumnIndex(\max($oCol) + 1) . \max($oRow); $this->debugLog->writeDebugLog('Evaluation Result is %s', $this->showTypeDetails($cellIntersect)); $stack->push('Value', $cellIntersect, $cellRef); } @@ -4937,13 +4937,13 @@ class Calculation $this->debugLog->writeDebugLog('Evaluating Percentile of %s', $this->showValue($arg)); $multiplier = 0.01; } - if (is_array($arg)) { + if (\is_array($arg)) { $operand2 = $multiplier; $result = $arg; [$rows, $columns] = self::checkMatrixOperands($result, $operand2, 0); for ($row = 0; $row < $rows; ++$row) { for ($column = 0; $column < $columns; ++$column) { - if (is_numeric($result[$row][$column])) { + if (\is_numeric($result[$row][$column])) { $result[$row][$column] *= $multiplier; } else { $result[$row][$column] = Information\ExcelError::VALUE(); @@ -4959,7 +4959,7 @@ class Calculation } else { $this->executeNumericBinaryOperation($multiplier, $arg, '*', $stack); } - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/i', $token ?? '', $matches)) { + } elseif (\preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/i', $token ?? '', $matches)) { $cellRef = null; if (isset($matches[8])) { @@ -4969,12 +4969,12 @@ class Calculation } else { $cellRef = $matches[6] . $matches[7] . ':' . $matches[9] . $matches[10]; if ($matches[2] > '') { - $matches[2] = trim($matches[2], "\"'"); - if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) { + $matches[2] = \trim($matches[2], "\"'"); + if ((\strpos($matches[2], '[') !== false) || (\strpos($matches[2], ']') !== false)) { // It's a Reference to an external spreadsheet (not currently supported) return $this->raiseFormulaError('Unable to access External Workbook'); } - $matches[2] = trim($matches[2], "\"'"); + $matches[2] = \trim($matches[2], "\"'"); $this->debugLog->writeDebugLog('Evaluating Cell Range %s in worksheet %s', $cellRef, $matches[2]); if ($pCellParent !== null && $this->spreadsheet !== null) { $cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($matches[2]), false); @@ -4999,8 +4999,8 @@ class Calculation } else { $cellRef = $matches[6] . $matches[7]; if ($matches[2] > '') { - $matches[2] = trim($matches[2], "\"'"); - if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) { + $matches[2] = \trim($matches[2], "\"'"); + if ((\strpos($matches[2], '[') !== false) || (\strpos($matches[2], ']') !== false)) { // It's a Reference to an external spreadsheet (not currently supported) return $this->raiseFormulaError('Unable to access External Workbook'); } @@ -5035,7 +5035,7 @@ class Calculation if (isset($storeKey)) { $branchStore[$storeKey] = $cellValue; } - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $token ?? '', $matches)) { + } elseif (\preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $token ?? '', $matches)) { // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on if ($cell !== null && $pCellParent !== null) { $cell->attach($pCellParent); @@ -5093,8 +5093,8 @@ class Calculation } // Reverse the order of the arguments - krsort($args); - krsort($emptyArguments); + \krsort($args); + \krsort($emptyArguments); if ($argCount > 0) { $args = $this->addDefaultArgumentValues($functionCall, $args, $emptyArguments); @@ -5107,22 +5107,22 @@ class Calculation if ($functionName !== 'MKMATRIX') { if ($this->debugLog->getWriteDebugLog()) { - krsort($argArrayVals); - $this->debugLog->writeDebugLog('Evaluating %s ( %s )', self::localeFunc($functionName), implode(self::$localeArgumentSeparator . ' ', Functions::flattenArray($argArrayVals))); + \krsort($argArrayVals); + $this->debugLog->writeDebugLog('Evaluating %s ( %s )', self::localeFunc($functionName), \implode(self::$localeArgumentSeparator . ' ', Functions::flattenArray($argArrayVals))); } } // Process the argument with the appropriate function call $args = $this->addCellReference($args, $passCellReference, $functionCall, $cell); - if (!is_array($functionCall)) { + if (!\is_array($functionCall)) { foreach ($args as &$arg) { $arg = Functions::flattenSingleValue($arg); } unset($arg); } - $result = call_user_func_array($functionCall, $args); + $result = \call_user_func_array($functionCall, $args); if ($functionName !== 'MKMATRIX') { $this->debugLog->writeDebugLog('Evaluation Result for %s() function call is %s', self::localeFunc($functionName), $this->showTypeDetails($result)); @@ -5134,19 +5134,19 @@ class Calculation } } else { // if the token is a number, boolean, string or an Excel error, push it onto the stack - if (isset(self::$excelConstants[strtoupper($token ?? '')])) { - $excelConstant = strtoupper($token); + if (isset(self::$excelConstants[\strtoupper($token ?? '')])) { + $excelConstant = \strtoupper($token); $stack->push('Constant Value', self::$excelConstants[$excelConstant]); if (isset($storeKey)) { $branchStore[$storeKey] = self::$excelConstants[$excelConstant]; } $this->debugLog->writeDebugLog('Evaluating Constant %s as %s', $excelConstant, $this->showTypeDetails(self::$excelConstants[$excelConstant])); - } elseif ((is_numeric($token)) || ($token === null) || (is_bool($token)) || ($token == '') || ($token[0] == self::FORMULA_STRING_QUOTE) || ($token[0] == '#')) { + } elseif ((\is_numeric($token)) || ($token === null) || (\is_bool($token)) || ($token == '') || ($token[0] == self::FORMULA_STRING_QUOTE) || ($token[0] == '#')) { $stack->push($tokenData['type'], $token, $tokenData['reference']); if (isset($storeKey)) { $branchStore[$storeKey] = $token; } - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '$/miu', $token, $matches)) { + } elseif (\preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '$/miu', $token, $matches)) { // if the token is a named range or formula, evaluate it and push the result onto the stack $definedName = $matches[6]; if ($cell === null || $pCellWorksheet === null) { @@ -5186,22 +5186,22 @@ class Calculation */ private function validateBinaryOperand(&$operand, &$stack) { - if (is_array($operand)) { - if ((count($operand, COUNT_RECURSIVE) - count($operand)) == 1) { + if (\is_array($operand)) { + if ((\count($operand, COUNT_RECURSIVE) - \count($operand)) == 1) { do { - $operand = array_pop($operand); - } while (is_array($operand)); + $operand = \array_pop($operand); + } while (\is_array($operand)); } } // Numbers, matrices and booleans can pass straight through, as they're already valid - if (is_string($operand)) { + if (\is_string($operand)) { // We only need special validations for the operand if it is a string // Start by stripping off the quotation marks we use to identify true excel string values internally if ($operand > '' && $operand[0] == self::FORMULA_STRING_QUOTE) { $operand = self::unwrapResult($operand); } // If the string is a numeric value, we treat it as a numeric, so no further testing - if (!is_numeric($operand)) { + if (!\is_numeric($operand)) { // If not a numeric, test to see if the value is an Excel error, and so can't be used in normal binary operations if ($operand > '' && $operand[0] == '#') { $stack->push('Value', $operand); @@ -5232,7 +5232,7 @@ class Calculation private function executeArrayComparison($operand1, $operand2, $operation, Stack &$stack, bool $recursingArrays) { $result = []; - if (!is_array($operand2)) { + if (!\is_array($operand2)) { // Operand 1 is an array, Operand 2 is a scalar foreach ($operand1 as $x => $operandData) { $this->debugLog->writeDebugLog('Evaluating Comparison %s %s %s', $this->showValue($operandData), $operation, $this->showValue($operand2)); @@ -5240,7 +5240,7 @@ class Calculation $r = $stack->pop(); $result[$x] = $r['value']; } - } elseif (!is_array($operand1)) { + } elseif (!\is_array($operand1)) { // Operand 1 is a scalar, Operand 2 is an array foreach ($operand2 as $x => $operandData) { $this->debugLog->writeDebugLog('Evaluating Comparison %s %s %s', $this->showValue($operand1), $operation, $this->showValue($operandData)); @@ -5279,7 +5279,7 @@ class Calculation private function executeBinaryComparisonOperation($operand1, $operand2, $operation, Stack &$stack, $recursingArrays = false) { // If we're dealing with matrix operations, we want a matrix result - if ((is_array($operand1)) || (is_array($operand2))) { + if ((\is_array($operand1)) || (\is_array($operand2))) { return $this->executeArrayComparison($operand1, $operand2, $operation, $stack, $recursingArrays); } @@ -5313,18 +5313,18 @@ class Calculation if ( (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) && - ((is_string($operand1) && !is_numeric($operand1) && strlen($operand1) > 0) || - (is_string($operand2) && !is_numeric($operand2) && strlen($operand2) > 0)) + ((\is_string($operand1) && !\is_numeric($operand1) && \strlen($operand1) > 0) || + (\is_string($operand2) && !\is_numeric($operand2) && \strlen($operand2) > 0)) ) { $result = Information\ExcelError::VALUE(); - } elseif (is_array($operand1) || is_array($operand2)) { + } elseif (\is_array($operand1) || \is_array($operand2)) { // Ensure that both operands are arrays/matrices - if (is_array($operand1)) { + if (\is_array($operand1)) { foreach ($operand1 as $key => $value) { $operand1[$key] = Functions::flattenArray($value); } } - if (is_array($operand2)) { + if (\is_array($operand2)) { foreach ($operand2 as $key => $value) { $operand2[$key] = Functions::flattenArray($value); } @@ -5335,14 +5335,14 @@ class Calculation for ($column = 0; $column < $columns; ++$column) { if ($operand1[$row][$column] === null) { $operand1[$row][$column] = 0; - } elseif (!is_numeric($operand1[$row][$column])) { + } elseif (!\is_numeric($operand1[$row][$column])) { $operand1[$row][$column] = Information\ExcelError::VALUE(); continue; } if ($operand2[$row][$column] === null) { $operand2[$row][$column] = 0; - } elseif (!is_numeric($operand2[$row][$column])) { + } elseif (!\is_numeric($operand2[$row][$column])) { $operand1[$row][$column] = Information\ExcelError::VALUE(); continue; @@ -5462,7 +5462,7 @@ class Calculation if ($worksheet !== null) { $worksheetName = $worksheet->getTitle(); - if (strpos($range, '!') !== false) { + if (\strpos($range, '!') !== false) { [$worksheetName, $range] = Worksheet::extractSheetTitle($range, true); $worksheet = ($this->spreadsheet === null) ? null : $this->spreadsheet->getSheetByName($worksheetName); } @@ -5474,7 +5474,7 @@ class Calculation $currentRow = 0; if (!isset($aReferences[1])) { // Single cell in range - sscanf($aReferences[0], '%[A-Z]%d', $currentCol, $currentRow); + \sscanf($aReferences[0], '%[A-Z]%d', $currentCol, $currentRow); if ($worksheet !== null && $worksheet->cellExists($aReferences[0])) { $returnValue[$currentRow][$currentCol] = $worksheet->getCell($aReferences[0])->getCalculatedValue($resetLog); } else { @@ -5484,7 +5484,7 @@ class Calculation // Extract cell data for all cells in the range foreach ($aReferences as $reference) { // Extract range - sscanf($reference, '%[A-Z]%d', $currentCol, $currentRow); + \sscanf($reference, '%[A-Z]%d', $currentCol, $currentRow); if ($worksheet !== null && $worksheet->cellExists($reference)) { $returnValue[$currentRow][$currentCol] = $worksheet->getCell($reference)->getCalculatedValue($resetLog); } else { @@ -5512,7 +5512,7 @@ class Calculation $returnValue = []; if ($worksheet !== null) { - if (strpos($range, '!') !== false) { + if (\strpos($range, '!') !== false) { [$worksheetName, $range] = Worksheet::extractSheetTitle($range, true); $worksheet = ($this->spreadsheet === null) ? null : $this->spreadsheet->getSheetByName($worksheetName); } @@ -5527,9 +5527,9 @@ class Calculation $range = $namedRange->getValue(); $splitRange = Coordinate::splitRange($range); // Convert row and column references - if ($worksheet !== null && ctype_alpha($splitRange[0][0])) { + if ($worksheet !== null && \ctype_alpha($splitRange[0][0])) { $range = $splitRange[0][0] . '1:' . $splitRange[0][1] . $worksheet->getHighestRow(); - } elseif ($worksheet !== null && ctype_digit($splitRange[0][0])) { + } elseif ($worksheet !== null && \ctype_digit($splitRange[0][0])) { $range = 'A' . $splitRange[0][0] . ':' . $worksheet->getHighestColumn() . $splitRange[0][1]; } @@ -5569,8 +5569,8 @@ class Calculation */ public function isImplemented($function) { - $function = strtoupper($function); - $notImplemented = !isset(self::$phpSpreadsheetFunctions[$function]) || (is_array(self::$phpSpreadsheetFunctions[$function]['functionCall']) && self::$phpSpreadsheetFunctions[$function]['functionCall'][1] === 'DUMMY'); + $function = \strtoupper($function); + $notImplemented = !isset(self::$phpSpreadsheetFunctions[$function]) || (\is_array(self::$phpSpreadsheetFunctions[$function]['functionCall']) && self::$phpSpreadsheetFunctions[$function]['functionCall'][1] === 'DUMMY'); return !$notImplemented; } @@ -5602,16 +5602,16 @@ class Calculation private function addDefaultArgumentValues(array $functionCall, array $args, array $emptyArguments): array { - $reflector = new ReflectionMethod(implode('::', $functionCall)); + $reflector = new \ReflectionMethod(\implode('::', $functionCall)); $methodArguments = $reflector->getParameters(); - if (count($methodArguments) > 0) { + if (\count($methodArguments) > 0) { // Apply any defaults for empty argument values foreach ($emptyArguments as $argumentId => $isArgumentEmpty) { if ($isArgumentEmpty === true) { - $reflectedArgumentId = count($args) - (int) $argumentId - 1; + $reflectedArgumentId = \count($args) - (int) $argumentId - 1; if ( - !array_key_exists($reflectedArgumentId, $methodArguments) || + !\array_key_exists($reflectedArgumentId, $methodArguments) || $methodArguments[$reflectedArgumentId]->isVariadic() ) { break; @@ -5628,7 +5628,7 @@ class Calculation /** * @return null|mixed */ - private function getArgumentDefaultValue(ReflectionParameter $methodArgument) + private function getArgumentDefaultValue(\ReflectionParameter $methodArgument) { $defaultValue = null; @@ -5637,14 +5637,14 @@ class Calculation if ($methodArgument->isDefaultValueConstant()) { $constantName = $methodArgument->getDefaultValueConstantName() ?? ''; // read constant value - if (strpos($constantName, '::') !== false) { - [$className, $constantName] = explode('::', $constantName); - $constantReflector = new ReflectionClassConstant($className, $constantName); + if (\strpos($constantName, '::') !== false) { + [$className, $constantName] = \explode('::', $constantName); + $constantReflector = new \ReflectionClassConstant($className, $constantName); return $constantReflector->getValue(); } - return constant($constantName); + return \constant($constantName); } } @@ -5662,13 +5662,13 @@ class Calculation private function addCellReference(array $args, $passCellReference, $functionCall, ?Cell $cell = null) { if ($passCellReference) { - if (is_array($functionCall)) { + if (\is_array($functionCall)) { $className = $functionCall[0]; $methodName = $functionCall[1]; - $reflectionMethod = new ReflectionMethod($className, $methodName); - $argumentCount = count($reflectionMethod->getParameters()); - while (count($args) < $argumentCount - 1) { + $reflectionMethod = new \ReflectionMethod($className, $methodName); + $argumentCount = \count($reflectionMethod->getParameters()); + while (\count($args) < $argumentCount - 1) { $args[] = null; } } @@ -5723,7 +5723,7 @@ class Calculation $result = $recursiveCalculator->_calculateFormulaValue($definedNameValue, $recursiveCalculationCellAddress, $recursiveCalculationCell); if ($this->getDebugLog()->getWriteDebugLog()) { - $this->debugLog->mergeDebugLog(array_slice($recursiveCalculator->getDebugLog()->getLog(), 3)); + $this->debugLog->mergeDebugLog(\array_slice($recursiveCalculator->getDebugLog()->getLog(), 3)); $this->debugLog->writeDebugLog('Evaluation Result for Named %s %s is %s', $definedNameType, $namedRange->getName(), $this->showTypeDetails($result)); } @@ -5755,7 +5755,7 @@ class Calculation */ private static function boolToString($operand1) { - if (is_bool($operand1)) { + if (\is_bool($operand1)) { $operand1 = ($operand1) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; } elseif ($operand1 === null) { $operand1 = ''; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Database/DGet.php b/PhpOffice/PhpSpreadsheet/Calculation/Database/DGet.php index 5647cba..03bf35a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Database/DGet.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Database/DGet.php @@ -40,12 +40,12 @@ class DGet extends DatabaseAbstract } $columnData = self::getFilteredColumn($database, $field, $criteria); - if (count($columnData) > 1) { + if (\count($columnData) > 1) { return ExcelError::NAN(); } - $row = array_pop($columnData); + $row = \array_pop($columnData); - return array_pop($row); + return \array_pop($row); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php b/PhpOffice/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php index 0b8c36d..2d1b231 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php @@ -34,21 +34,21 @@ abstract class DatabaseAbstract */ protected static function fieldExtract(array $database, $field): ?int { - $field = strtoupper(Functions::flattenSingleValue($field) ?? ''); + $field = \strtoupper(Functions::flattenSingleValue($field) ?? ''); if ($field === '') { return null; } - $fieldNames = array_map('strtoupper', array_shift($database)); - if (is_numeric($field)) { + $fieldNames = \array_map('strtoupper', \array_shift($database)); + if (\is_numeric($field)) { $field = (int) $field - 1; - if ($field < 0 || $field >= count($fieldNames)) { + if ($field < 0 || $field >= \count($fieldNames)) { return null; } return $field; } - $key = array_search($field, array_values($fieldNames), true); + $key = \array_search($field, \array_values($fieldNames), true); return ($key !== false) ? (int) $key : null; } @@ -73,8 +73,8 @@ abstract class DatabaseAbstract */ protected static function filter(array $database, array $criteria): array { - $fieldNames = array_shift($database); - $criteriaNames = array_shift($criteria); + $fieldNames = \array_shift($database); + $criteriaNames = \array_shift($criteria); // Convert the criteria into a set of AND/OR conditions with [:placeholders] $query = self::buildQuery($criteriaNames, $criteria); @@ -92,7 +92,7 @@ abstract class DatabaseAbstract // extract an array of values for the requested column $columnData = []; foreach ($database as $rowKey => $row) { - $keys = array_keys($row); + $keys = \array_keys($row); $key = $keys[$field] ?? null; $columnKey = $key ?? 'A'; $columnData[$rowKey][$columnKey] = $row[$key] ?? $defaultReturnColumnValue; @@ -114,14 +114,14 @@ abstract class DatabaseAbstract } } - $rowQuery = array_map( + $rowQuery = \array_map( function ($rowValue) { - return (count($rowValue) > 1) ? 'AND(' . implode(',', $rowValue) . ')' : ($rowValue[0] ?? ''); + return (\count($rowValue) > 1) ? 'AND(' . \implode(',', $rowValue) . ')' : ($rowValue[0] ?? ''); }, $baseQuery ); - return (count($rowQuery) > 1) ? 'OR(' . implode(',', $rowQuery) . ')' : ($rowQuery[0] ?? ''); + return (\count($rowQuery) > 1) ? 'OR(' . \implode(',', $rowQuery) . ')' : ($rowQuery[0] ?? ''); } /** @@ -132,7 +132,7 @@ abstract class DatabaseAbstract $ifCondition = Functions::ifCondition($criterion); // Check for wildcard characters used in the condition - $result = preg_match('/(?[^"]*)(?".*[*?].*")/ui', $ifCondition, $matches); + $result = \preg_match('/(?[^"]*)(?".*[*?].*")/ui', $ifCondition, $matches); if ($result !== 1) { return "[:{$criterionName}]{$ifCondition}"; } @@ -173,20 +173,20 @@ abstract class DatabaseAbstract */ private static function processCondition(string $criterion, array $fields, array $dataValues, string $conditions) { - $key = array_search($criterion, $fields, true); + $key = \array_search($criterion, $fields, true); $dataValue = 'NULL'; - if (is_bool($dataValues[$key])) { + if (\is_bool($dataValues[$key])) { $dataValue = ($dataValues[$key]) ? 'TRUE' : 'FALSE'; } elseif ($dataValues[$key] !== null) { $dataValue = $dataValues[$key]; // escape quotes if we have a string containing quotes - if (is_string($dataValue) && strpos($dataValue, '"') !== false) { - $dataValue = str_replace('"', '""', $dataValue); + if (\is_string($dataValue) && \strpos($dataValue, '"') !== false) { + $dataValue = \str_replace('"', '""', $dataValue); } - $dataValue = (is_string($dataValue)) ? Calculation::wrapResult(strtoupper($dataValue)) : $dataValue; + $dataValue = (\is_string($dataValue)) ? Calculation::wrapResult(\strtoupper($dataValue)) : $dataValue; } - return str_replace('[:' . $criterion . ']', $dataValue, $conditions); + return \str_replace('[:' . $criterion . ']', $dataValue, $conditions); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTime.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTime.php index 26b667c..9fc8fef 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTime.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTime.php @@ -290,9 +290,9 @@ class DateTime * Use the between method in the DateTimeExcel\Days class instead * @see DateTimeExcel\Days::between() * - * @param array|DateTimeInterface|float|int|string $endDate Excel date serial value (float), + * @param array|\DateTimeInterface|float|int|string $endDate Excel date serial value (float), * PHP date timestamp (integer), PHP DateTime object, or a standard date string - * @param array|DateTimeInterface|float|int|string $startDate Excel date serial value (float), + * @param array|\DateTimeInterface|float|int|string $startDate Excel date serial value (float), * PHP date timestamp (integer), PHP DateTime object, or a standard date string * * @return array|int|string Number of days between start date and end date or an error diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Current.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Current.php index 5de671d..cb2e906 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Current.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Current.php @@ -26,7 +26,7 @@ class Current */ public static function today() { - $dti = new DateTimeImmutable(); + $dti = new \DateTimeImmutable(); $dateArray = Helpers::dateParse($dti->format('c')); return Helpers::dateParseSucceeded($dateArray) ? Helpers::returnIn3FormatsArray($dateArray, true) : ExcelError::VALUE(); @@ -51,7 +51,7 @@ class Current */ public static function now() { - $dti = new DateTimeImmutable(); + $dti = new \DateTimeImmutable(); $dateArray = Helpers::dateParse($dti->format('c')); return Helpers::dateParseSucceeded($dateArray) ? Helpers::returnIn3FormatsArray($dateArray) : ExcelError::VALUE(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php index 6b55e79..eb9c3a1 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php @@ -65,7 +65,7 @@ class Date */ public static function fromYMD($year, $month, $day) { - if (is_array($year) || is_array($month) || is_array($day)) { + if (\is_array($year) || \is_array($month) || \is_array($day)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $year, $month, $day); } @@ -94,7 +94,7 @@ class Date private static function getYear($year, int $baseYear): int { $year = ($year !== null) ? StringHelper::testStringAsNumeric((string) $year) : 0; - if (!is_numeric($year)) { + if (!\is_numeric($year)) { throw new Exception(ExcelError::VALUE()); } $year = (int) $year; @@ -120,12 +120,12 @@ class Date */ private static function getMonth($month): int { - if (($month !== null) && (!is_numeric($month))) { + if (($month !== null) && (!\is_numeric($month))) { $month = SharedDateHelper::monthStringToNumber($month); } $month = ($month !== null) ? StringHelper::testStringAsNumeric((string) $month) : 0; - if (!is_numeric($month)) { + if (!\is_numeric($month)) { throw new Exception(ExcelError::VALUE()); } @@ -139,12 +139,12 @@ class Date */ private static function getDay($day): int { - if (($day !== null) && (!is_numeric($day))) { + if (($day !== null) && (!\is_numeric($day))) { $day = SharedDateHelper::dayStringToNumber($day); } $day = ($day !== null) ? StringHelper::testStringAsNumeric((string) $day) : 0; - if (!is_numeric($day)) { + if (!\is_numeric($day)) { throw new Exception(ExcelError::VALUE()); } @@ -156,11 +156,11 @@ class Date if ($month < 1) { // Handle year/month adjustment if month < 1 --$month; - $year += ceil($month / 12) - 1; - $month = 13 - abs($month % 12); + $year += \ceil($month / 12) - 1; + $month = 13 - \abs($month % 12); } elseif ($month > 12) { // Handle year/month adjustment if month > 12 - $year += floor($month / 12); + $year += \floor($month / 12); $month = ($month % 12); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php index b669eb0..e2189ad 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php @@ -30,7 +30,7 @@ class DateParts */ public static function day($dateValue) { - if (is_array($dateValue)) { + if (\is_array($dateValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); } @@ -70,7 +70,7 @@ class DateParts */ public static function month($dateValue) { - if (is_array($dateValue)) { + if (\is_array($dateValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); } @@ -108,7 +108,7 @@ class DateParts */ public static function year($dateValue) { - if (is_array($dateValue)) { + if (\is_array($dateValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); } @@ -135,13 +135,13 @@ class DateParts { // Excel does not treat 0 consistently for DAY vs. (MONTH or YEAR) if (SharedDateHelper::getExcelCalendar() === SharedDateHelper::CALENDAR_WINDOWS_1900 && Functions::getCompatibilityMode() == Functions::COMPATIBILITY_EXCEL) { - if (is_bool($dateValue)) { + if (\is_bool($dateValue)) { return (int) $dateValue; } if ($dateValue === null) { return 0; } - if (is_numeric($dateValue) && $dateValue < 1 && $dateValue >= 0) { + if (\is_numeric($dateValue) && $dateValue < 1 && $dateValue >= 0) { return 0; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php index 52543a7..6a31a1d 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php @@ -41,23 +41,23 @@ class DateValue */ public static function fromString($dateValue) { - if (is_array($dateValue)) { + if (\is_array($dateValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); } - $dti = new DateTimeImmutable(); + $dti = new \DateTimeImmutable(); $baseYear = SharedDateHelper::getExcelCalendar(); - $dateValue = trim($dateValue ?? '', '"'); + $dateValue = \trim($dateValue ?? '', '"'); // Strip any ordinals because they're allowed in Excel (English only) - $dateValue = (string) preg_replace('/(\d)(st|nd|rd|th)([ -\/])/Ui', '$1$3', $dateValue); + $dateValue = (string) \preg_replace('/(\d)(st|nd|rd|th)([ -\/])/Ui', '$1$3', $dateValue); // Convert separators (/ . or space) to hyphens (should also handle dot used for ordinals in some countries, e.g. Denmark, Germany) - $dateValue = str_replace(['/', '.', '-', ' '], ' ', $dateValue); + $dateValue = \str_replace(['/', '.', '-', ' '], ' ', $dateValue); $yearFound = false; - $t1 = explode(' ', $dateValue); + $t1 = \explode(' ', $dateValue); $t = ''; foreach ($t1 as &$t) { - if ((is_numeric($t)) && ($t > 31)) { + if ((\is_numeric($t)) && ($t > 31)) { if ($yearFound) { return ExcelError::VALUE(); } @@ -67,9 +67,9 @@ class DateValue $yearFound = true; } } - if (count($t1) === 1) { + if (\count($t1) === 1) { // We've been fed a time value without any date - return ((strpos((string) $t, ':') === false)) ? ExcelError::Value() : 0.0; + return ((\strpos((string) $t, ':') === false)) ? ExcelError::Value() : 0.0; } unset($t); @@ -80,22 +80,22 @@ class DateValue return self::finalResults($PHPDateArray, $dti, $baseYear); } - private static function t1ToString(array $t1, DateTimeImmutable $dti, bool $yearFound): string + private static function t1ToString(array $t1, \DateTimeImmutable $dti, bool $yearFound): string { - if (count($t1) == 2) { + if (\count($t1) == 2) { // We only have two parts of the date: either day/month or month/year if ($yearFound) { - array_unshift($t1, 1); + \array_unshift($t1, 1); } else { - if (is_numeric($t1[1]) && $t1[1] > 29) { + if (\is_numeric($t1[1]) && $t1[1] > 29) { $t1[1] += 1900; - array_unshift($t1, 1); + \array_unshift($t1, 1); } else { $t1[] = $dti->format('Y'); } } } - $dateValue = implode(' ', $t1); + $dateValue = \implode(' ', $t1); return $dateValue; } @@ -103,16 +103,16 @@ class DateValue /** * Parse date. */ - private static function setUpArray(string $dateValue, DateTimeImmutable $dti): array + private static function setUpArray(string $dateValue, \DateTimeImmutable $dti): array { $PHPDateArray = Helpers::dateParse($dateValue); if (!Helpers::dateParseSucceeded($PHPDateArray)) { // If original count was 1, we've already returned. // If it was 2, we added another. // Therefore, neither of the first 2 stroks below can fail. - $testVal1 = strtok($dateValue, '- '); - $testVal2 = strtok('- '); - $testVal3 = strtok('- ') ?: $dti->format('Y'); + $testVal1 = \strtok($dateValue, '- '); + $testVal2 = \strtok('- '); + $testVal3 = \strtok('- ') ?: $dti->format('Y'); Helpers::adjustYear((string) $testVal1, (string) $testVal2, $testVal3); $PHPDateArray = Helpers::dateParse($testVal1 . '-' . $testVal2 . '-' . $testVal3); if (!Helpers::dateParseSucceeded($PHPDateArray)) { @@ -129,7 +129,7 @@ class DateValue * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, * depending on the value of the ReturnDateType flag */ - private static function finalResults(array $PHPDateArray, DateTimeImmutable $dti, int $baseYear) + private static function finalResults(array $PHPDateArray, \DateTimeImmutable $dti, int $baseYear) { $retValue = ExcelError::Value(); if (Helpers::dateParseSucceeded($PHPDateArray)) { @@ -146,7 +146,7 @@ class DateValue $month = (int) $PHPDateArray['month']; $day = (int) $PHPDateArray['day']; $year = (int) $PHPDateArray['year']; - if (!checkdate($month, $day, $year)) { + if (!\checkdate($month, $day, $year)) { return ($year === 1900 && $month === 2 && $day === 29) ? Helpers::returnIn3FormatsFloat(60.0) : ExcelError::VALUE(); } $retValue = Helpers::returnIn3FormatsArray($PHPDateArray, true); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php index a3b9745..1b7fd87 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php @@ -20,10 +20,10 @@ class Days * Excel Function: * DAYS(endDate, startDate) * - * @param array|DateTimeInterface|float|int|string $endDate Excel date serial value (float), + * @param array|\DateTimeInterface|float|int|string $endDate Excel date serial value (float), * PHP date timestamp (integer), PHP DateTime object, or a standard date string * Or can be an array of date values - * @param array|DateTimeInterface|float|int|string $startDate Excel date serial value (float), + * @param array|\DateTimeInterface|float|int|string $startDate Excel date serial value (float), * PHP date timestamp (integer), PHP DateTime object, or a standard date string * Or can be an array of date values * @@ -33,7 +33,7 @@ class Days */ public static function between($endDate, $startDate) { - if (is_array($endDate) || is_array($startDate)) { + if (\is_array($endDate) || \is_array($startDate)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $endDate, $startDate); } @@ -50,7 +50,7 @@ class Days $days = ExcelError::VALUE(); $diff = $PHPStartDateObject->diff($PHPEndDateObject); - if ($diff !== false && !is_bool($diff->days)) { + if ($diff !== false && !\is_bool($diff->days)) { $days = $diff->days; if ($diff->invert) { $days = -$days; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php index 6f71621..4fe1bc2 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php @@ -46,7 +46,7 @@ class Days360 */ public static function between($startDate = 0, $endDate = 0, $method = false) { - if (is_array($startDate) || is_array($endDate) || is_array($method)) { + if (\is_array($startDate) || \is_array($endDate) || \is_array($method)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $method); } @@ -57,7 +57,7 @@ class Days360 return $e->getMessage(); } - if (!is_bool($method)) { + if (!\is_bool($method)) { return ExcelError::VALUE(); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php index fd71c9b..b5a71a0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php @@ -31,7 +31,7 @@ class Difference */ public static function interval($startDate, $endDate, $unit = 'D') { - if (is_array($startDate) || is_array($endDate) || is_array($unit)) { + if (\is_array($startDate) || \is_array($endDate) || \is_array($unit)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $unit); } @@ -39,7 +39,7 @@ class Difference $startDate = Helpers::getDateValue($startDate); $endDate = Helpers::getDateValue($endDate); $difference = self::initialDiff($startDate, $endDate); - $unit = strtoupper($unit); + $unit = \strtoupper($unit); } catch (Exception $e) { return $e->getMessage(); } @@ -65,7 +65,7 @@ class Difference $retVal = self::replaceRetValue($retVal, $unit, 'YD') ?? self::datedifYD($difference, $startYears, $endYears, $PHPStartDateObject, $PHPEndDateObject); $retVal = self::replaceRetValue($retVal, $unit, 'YM') ?? self::datedifYM($PHPDiffDateObject); - return is_bool($retVal) ? ExcelError::VALUE() : $retVal; + return \is_bool($retVal) ? ExcelError::VALUE() : $retVal; } private static function initialDiff(float $startDate, float $endDate): float @@ -99,12 +99,12 @@ class Difference return (int) $difference; } - private static function datedifM(DateInterval $PHPDiffDateObject): int + private static function datedifM(\DateInterval $PHPDiffDateObject): int { return 12 * (int) $PHPDiffDateObject->format('%y') + (int) $PHPDiffDateObject->format('%m'); } - private static function datedifMD(int $startDays, int $endDays, DateTime $PHPEndDateObject, DateInterval $PHPDiffDateObject): int + private static function datedifMD(int $startDays, int $endDays, \DateTime $PHPEndDateObject, \DateInterval $PHPDiffDateObject): int { if ($endDays < $startDays) { $retVal = $endDays; @@ -118,12 +118,12 @@ class Difference return $retVal; } - private static function datedifY(DateInterval $PHPDiffDateObject): int + private static function datedifY(\DateInterval $PHPDiffDateObject): int { return (int) $PHPDiffDateObject->format('%y'); } - private static function datedifYD(float $difference, int $startYears, int $endYears, DateTime $PHPStartDateObject, DateTime $PHPEndDateObject): int + private static function datedifYD(float $difference, int $startYears, int $endYears, \DateTime $PHPStartDateObject, \DateTime $PHPEndDateObject): int { $retVal = (int) $difference; if ($endYears > $startYears) { @@ -142,7 +142,7 @@ class Difference // Adjust for leap years cases $isLeapEndYear = $PHPEndDateObject->format('L'); - $limit = new DateTime($PHPEndDateObject->format('Y-02-29')); + $limit = new \DateTime($PHPEndDateObject->format('Y-02-29')); if (!$isLeapStartYear && !$wasLeapEndYear && $isLeapEndYear && $PHPEndDateObject >= $limit) { --$retVal; } @@ -151,7 +151,7 @@ class Difference return (int) $retVal; } - private static function datedifYM(DateInterval $PHPDiffDateObject): int + private static function datedifYM(\DateInterval $PHPDiffDateObject): int { return (int) $PHPDiffDateObject->format('%m'); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Helpers.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Helpers.php index 2384515..8571609 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Helpers.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Helpers.php @@ -31,9 +31,9 @@ class Helpers */ public static function getDateValue($dateValue, bool $allowBool = true): float { - if (is_object($dateValue)) { + if (\is_object($dateValue)) { $retval = SharedDateHelper::PHPToExcel($dateValue); - if (is_bool($retval)) { + if (\is_bool($retval)) { throw new Exception(ExcelError::VALUE()); } @@ -41,12 +41,12 @@ class Helpers } self::nullFalseTrueToNumber($dateValue, $allowBool); - if (!is_numeric($dateValue)) { + if (!\is_numeric($dateValue)) { $saveReturnDateType = Functions::getReturnDateType(); Functions::setReturnDateType(Functions::RETURNDATE_EXCEL); $dateValue = DateValue::fromString($dateValue); Functions::setReturnDateType($saveReturnDateType); - if (!is_numeric($dateValue)) { + if (!\is_numeric($dateValue)) { throw new Exception(ExcelError::VALUE()); } } @@ -79,7 +79,7 @@ class Helpers * * @param mixed $dateValue */ - public static function adjustDateByMonths($dateValue = 0, float $adjustmentMonths = 0): DateTime + public static function adjustDateByMonths($dateValue = 0, float $adjustmentMonths = 0): \DateTime { // Execute function $PHPDateObject = SharedDateHelper::excelToDateTimeObject($dateValue); @@ -122,9 +122,9 @@ class Helpers */ public static function adjustYear(string $testVal1, string $testVal2, string &$testVal3): void { - if (!is_numeric($testVal1) || $testVal1 < 31) { - if (!is_numeric($testVal2) || $testVal2 < 12) { - if (is_numeric($testVal3) && $testVal3 < 12) { + if (!\is_numeric($testVal1) || $testVal1 < 31) { + if (!\is_numeric($testVal2) || $testVal2 < 12) { + if (\is_numeric($testVal3) && $testVal3 < 12) { $testVal3 += 2000; } } @@ -140,7 +140,7 @@ class Helpers { $retType = Functions::getReturnDateType(); if ($retType === Functions::RETURNDATE_PHP_DATETIME_OBJECT) { - return new DateTime( + return new \DateTime( $dateArray['year'] . '-' . $dateArray['month'] . '-' . $dateArray['day'] @@ -159,7 +159,7 @@ class Helpers $dateArray['second'] ); if ($retType === Functions::RETURNDATE_EXCEL) { - return $noFrac ? floor($excelDateValue) : (float) $excelDateValue; + return $noFrac ? \floor($excelDateValue) : (float) $excelDateValue; } // RETURNDATE_UNIX_TIMESTAMP) @@ -190,7 +190,7 @@ class Helpers * * @return mixed */ - public static function returnIn3FormatsObject(DateTime $PHPDateObject) + public static function returnIn3FormatsObject(\DateTime $PHPDateObject) { $retType = Functions::getReturnDateType(); if ($retType === Functions::RETURNDATE_PHP_DATETIME_OBJECT) { @@ -201,7 +201,7 @@ class Helpers } // RETURNDATE_UNIX_TIMESTAMP $stamp = SharedDateHelper::PHPToExcel($PHPDateObject); - $stamp = is_bool($stamp) ? ((int) $stamp) : $stamp; + $stamp = \is_bool($stamp) ? ((int) $stamp) : $stamp; return (int) SharedDateHelper::excelToTimestamp($stamp); } @@ -229,7 +229,7 @@ class Helpers $nullVal = self::baseDate(); if ($number === null) { $number = $nullVal; - } elseif ($allowBool && is_bool($number)) { + } elseif ($allowBool && \is_bool($number)) { $number = $nullVal + (int) $number; } } @@ -247,10 +247,10 @@ class Helpers if ($number === null) { return 0; } - if (is_int($number)) { + if (\is_int($number)) { return $number; } - if (is_numeric($number)) { + if (\is_numeric($number)) { return (float) $number; } @@ -266,7 +266,7 @@ class Helpers */ public static function validateNotNegative($number) { - if (!is_numeric($number)) { + if (!\is_numeric($number)) { throw new Exception(ExcelError::VALUE()); } if ($number >= 0) { @@ -276,7 +276,7 @@ class Helpers throw new Exception(ExcelError::NAN()); } - public static function silly1900(DateTime $PHPDateObject, string $mod = '-1 day'): void + public static function silly1900(\DateTime $PHPDateObject, string $mod = '-1 day'): void { $isoDate = $PHPDateObject->format('c'); if ($isoDate < '1900-03-01') { @@ -286,7 +286,7 @@ class Helpers public static function dateParse(string $string): array { - return self::forceArray(date_parse($string)); + return self::forceArray(\date_parse($string)); } public static function dateParseSucceeded(array $dateArray): bool @@ -302,6 +302,6 @@ class Helpers */ private static function forceArray($dateArray): array { - return is_array($dateArray) ? $dateArray : ['error_count' => 1]; + return \is_array($dateArray) ? $dateArray : ['error_count' => 1]; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php index c72d006..73e5ee6 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php @@ -35,7 +35,7 @@ class Month */ public static function adjust($dateValue, $adjustmentMonths) { - if (is_array($dateValue) || is_array($adjustmentMonths)) { + if (\is_array($dateValue) || \is_array($adjustmentMonths)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $adjustmentMonths); } @@ -45,7 +45,7 @@ class Month } catch (Exception $e) { return $e->getMessage(); } - $adjustmentMonths = floor($adjustmentMonths); + $adjustmentMonths = \floor($adjustmentMonths); // Execute function $PHPDateObject = Helpers::adjustDateByMonths($dateValue, $adjustmentMonths); @@ -78,7 +78,7 @@ class Month */ public static function lastDay($dateValue, $adjustmentMonths) { - if (is_array($dateValue) || is_array($adjustmentMonths)) { + if (\is_array($dateValue) || \is_array($adjustmentMonths)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $adjustmentMonths); } @@ -88,7 +88,7 @@ class Month } catch (Exception $e) { return $e->getMessage(); } - $adjustmentMonths = floor($adjustmentMonths); + $adjustmentMonths = \floor($adjustmentMonths); // Execute function $PHPDateObject = Helpers::adjustDateByMonths($dateValue, $adjustmentMonths + 1); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php index 3b8942b..685343c 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php @@ -35,7 +35,7 @@ class NetworkDays */ public static function count($startDate, $endDate, ...$dateArgs) { - if (is_array($startDate) || is_array($endDate)) { + if (\is_array($startDate) || \is_array($endDate)) { return self::evaluateArrayArgumentsSubset( [self::class, __FUNCTION__], 2, @@ -49,8 +49,8 @@ class NetworkDays // Retrieve the mandatory start and end date that are referenced in the function definition $sDate = Helpers::getDateValue($startDate); $eDate = Helpers::getDateValue($endDate); - $startDate = min($sDate, $eDate); - $endDate = max($sDate, $eDate); + $startDate = \min($sDate, $eDate); + $endDate = \max($sDate, $eDate); // Get the optional days $dateArgs = Functions::flattenArray($dateArgs); // Test any extra holiday parameters @@ -65,14 +65,14 @@ class NetworkDays // Execute function $startDow = self::calcStartDow($startDate); $endDow = self::calcEndDow($endDate); - $wholeWeekDays = (int) floor(($endDate - $startDate) / 7) * 5; + $wholeWeekDays = (int) \floor(($endDate - $startDate) / 7) * 5; $partWeekDays = self::calcPartWeekDays($startDow, $endDow); // Test any extra holiday parameters $holidayCountedArray = []; foreach ($holidayArray as $holidayDate) { if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { - if ((Week::day($holidayDate, 2) < 6) && (!in_array($holidayDate, $holidayCountedArray))) { + if ((Week::day($holidayDate, 2) < 6) && (!\in_array($holidayDate, $holidayCountedArray))) { --$partWeekDays; $holidayCountedArray[] = $holidayDate; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php index 4ff7198..cbb4a80 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php @@ -45,7 +45,7 @@ class Time */ public static function fromHMS($hour, $minute, $second) { - if (is_array($hour) || is_array($minute) || is_array($second)) { + if (\is_array($hour) || \is_array($minute) || \is_array($second)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $hour, $minute, $second); } @@ -79,7 +79,7 @@ class Time } // RETURNDATE_PHP_DATETIME_OBJECT // Hour has already been normalized (0-23) above - $phpDateObject = new DateTime('1900-01-01 ' . $hour . ':' . $minute . ':' . $second); + $phpDateObject = new \DateTime('1900-01-01 ' . $hour . ':' . $minute . ':' . $second); return $phpDateObject; } @@ -87,13 +87,13 @@ class Time private static function adjustSecond(int &$second, int &$minute): void { if ($second < 0) { - $minute += floor($second / 60); - $second = 60 - abs($second % 60); + $minute += \floor($second / 60); + $second = 60 - \abs($second % 60); if ($second == 60) { $second = 0; } } elseif ($second >= 60) { - $minute += floor($second / 60); + $minute += \floor($second / 60); $second = $second % 60; } } @@ -101,13 +101,13 @@ class Time private static function adjustMinute(int &$minute, int &$hour): void { if ($minute < 0) { - $hour += floor($minute / 60); - $minute = 60 - abs($minute % 60); + $hour += \floor($minute / 60); + $minute = 60 - \abs($minute % 60); if ($minute == 60) { $minute = 0; } } elseif ($minute >= 60) { - $hour += floor($minute / 60); + $hour += \floor($minute / 60); $minute = $minute % 60; } } @@ -118,10 +118,10 @@ class Time private static function toIntWithNullBool($value): int { $value = $value ?? 0; - if (is_bool($value)) { + if (\is_bool($value)) { $value = (int) $value; } - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php index d9b99f3..e70fb5a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php @@ -29,13 +29,13 @@ class TimeParts */ public static function hour($timeValue) { - if (is_array($timeValue)) { + if (\is_array($timeValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); } try { Helpers::nullFalseTrueToNumber($timeValue); - if (!is_numeric($timeValue)) { + if (!\is_numeric($timeValue)) { $timeValue = Helpers::getTimeValue($timeValue); } Helpers::validateNotNegative($timeValue); @@ -44,7 +44,7 @@ class TimeParts } // Execute function - $timeValue = fmod($timeValue, 1); + $timeValue = \fmod($timeValue, 1); $timeValue = SharedDateHelper::excelToDateTimeObject($timeValue); return (int) $timeValue->format('H'); @@ -69,13 +69,13 @@ class TimeParts */ public static function minute($timeValue) { - if (is_array($timeValue)) { + if (\is_array($timeValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); } try { Helpers::nullFalseTrueToNumber($timeValue); - if (!is_numeric($timeValue)) { + if (!\is_numeric($timeValue)) { $timeValue = Helpers::getTimeValue($timeValue); } Helpers::validateNotNegative($timeValue); @@ -84,7 +84,7 @@ class TimeParts } // Execute function - $timeValue = fmod($timeValue, 1); + $timeValue = \fmod($timeValue, 1); $timeValue = SharedDateHelper::excelToDateTimeObject($timeValue); return (int) $timeValue->format('i'); @@ -109,13 +109,13 @@ class TimeParts */ public static function second($timeValue) { - if (is_array($timeValue)) { + if (\is_array($timeValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); } try { Helpers::nullFalseTrueToNumber($timeValue); - if (!is_numeric($timeValue)) { + if (!\is_numeric($timeValue)) { $timeValue = Helpers::getTimeValue($timeValue); } Helpers::validateNotNegative($timeValue); @@ -124,7 +124,7 @@ class TimeParts } // Execute function - $timeValue = fmod($timeValue, 1); + $timeValue = \fmod($timeValue, 1); $timeValue = SharedDateHelper::excelToDateTimeObject($timeValue); return (int) $timeValue->format('s'); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php index 4abdd75..df91917 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php @@ -38,17 +38,17 @@ class TimeValue */ public static function fromString($timeValue) { - if (is_array($timeValue)) { + if (\is_array($timeValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $timeValue); } - $timeValue = trim($timeValue ?? '', '"'); - $timeValue = str_replace(['/', '.'], '-', $timeValue); + $timeValue = \trim($timeValue ?? '', '"'); + $timeValue = \str_replace(['/', '.'], '-', $timeValue); - $arraySplit = preg_split('/[\/:\-\s]/', $timeValue) ?: []; - if ((count($arraySplit) == 2 || count($arraySplit) == 3) && $arraySplit[0] > 24) { + $arraySplit = \preg_split('/[\/:\-\s]/', $timeValue) ?: []; + if ((\count($arraySplit) == 2 || \count($arraySplit) == 3) && $arraySplit[0] > 24) { $arraySplit[0] = ($arraySplit[0] % 24); - $timeValue = implode(':', $arraySplit); + $timeValue = \implode(':', $arraySplit); } $PHPDateArray = Helpers::dateParse($timeValue); @@ -69,7 +69,7 @@ class TimeValue } elseif ($retType === Functions::RETURNDATE_UNIX_TIMESTAMP) { $retValue = (int) SharedDateHelper::excelToTimestamp($excelDateValue + 25569) - 3600; } else { - $retValue = new DateTime('1900-01-01 ' . $PHPDateArray['hour'] . ':' . $PHPDateArray['minute'] . ':' . $PHPDateArray['second']); + $retValue = new \DateTime('1900-01-01 ' . $PHPDateArray['hour'] . ':' . $PHPDateArray['minute'] . ':' . $PHPDateArray['second']); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php index 2f69007..a7c340d 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php @@ -47,7 +47,7 @@ class Week */ public static function number($dateValue, $method = Constants::STARTWEEK_SUNDAY) { - if (is_array($dateValue) || is_array($method)) { + if (\is_array($dateValue) || \is_array($method)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $method); } @@ -84,7 +84,7 @@ class Week $daysInFirstWeek = (6 - $firstDayOfFirstWeek + $method) % 7; $daysInFirstWeek += 7 * !$daysInFirstWeek; $endFirstWeek = $daysInFirstWeek - 1; - $weekOfYear = floor(($dayOfYear - $endFirstWeek + 13) / 7); + $weekOfYear = \floor(($dayOfYear - $endFirstWeek + 13) / 7); return (int) $weekOfYear; } @@ -107,7 +107,7 @@ class Week */ public static function isoWeekNumber($dateValue) { - if (is_array($dateValue)) { + if (\is_array($dateValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $dateValue); } @@ -152,7 +152,7 @@ class Week */ public static function day($dateValue, $style = 1) { - if (is_array($dateValue) || is_array($style)) { + if (\is_array($dateValue) || \is_array($style)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $dateValue, $style); } @@ -191,7 +191,7 @@ class Week */ private static function validateStyle($style): int { - if (!is_numeric($style)) { + if (!\is_numeric($style)) { throw new Exception(ExcelError::VALUE()); } $style = (int) $style; @@ -214,10 +214,10 @@ class Week private static function apparentBug($dateValue): bool { if (SharedDateHelper::getExcelCalendar() !== SharedDateHelper::CALENDAR_MAC_1904) { - if (is_bool($dateValue)) { + if (\is_bool($dateValue)) { return true; } - if (is_numeric($dateValue) && !((int) $dateValue)) { + if (\is_numeric($dateValue) && !((int) $dateValue)) { return true; } } @@ -232,7 +232,7 @@ class Week */ private static function validateDateValue($dateValue): float { - if (is_bool($dateValue)) { + if (\is_bool($dateValue)) { throw new Exception(ExcelError::VALUE()); } @@ -250,12 +250,12 @@ class Week $method = Constants::STARTWEEK_SUNDAY; } - if (!is_numeric($method)) { + if (!\is_numeric($method)) { throw new Exception(ExcelError::VALUE()); } $method = (int) $method; - if (!array_key_exists($method, Constants::METHODARR)) { + if (!\array_key_exists($method, Constants::METHODARR)) { throw new Exception(ExcelError::NAN()); } $method = Constants::METHODARR[$method]; @@ -268,7 +268,7 @@ class Week return $method === Constants::DOW_SUNDAY && SharedDateHelper::getExcelCalendar() === SharedDateHelper::CALENDAR_WINDOWS_1900; } - private static function buggyWeekNum1904(int $method, bool $origNull, DateTime $dateObject): bool + private static function buggyWeekNum1904(int $method, bool $origNull, \DateTime $dateObject): bool { // This appears to be another Excel bug. diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php index 1f5735e..99f9822 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php @@ -37,7 +37,7 @@ class WorkDay */ public static function date($startDate, $endDays, ...$dateArgs) { - if (is_array($startDate) || is_array($endDays)) { + if (\is_array($startDate) || \is_array($endDays)) { return self::evaluateArrayArgumentsSubset( [self::class, __FUNCTION__], 2, @@ -51,13 +51,13 @@ class WorkDay try { $startDate = Helpers::getDateValue($startDate); $endDays = Helpers::validateNumericNull($endDays); - $holidayArray = array_map([Helpers::class, 'getDateValue'], Functions::flattenArray($dateArgs)); + $holidayArray = \array_map([Helpers::class, 'getDateValue'], Functions::flattenArray($dateArgs)); } catch (Exception $e) { return $e->getMessage(); } - $startDate = (float) floor($startDate); - $endDays = (int) floor($endDays); + $startDate = (float) \floor($startDate); + $endDays = (int) \floor($endDays); // If endDays is 0, we always return startDate if ($endDays == 0) { return $startDate; @@ -112,10 +112,10 @@ class WorkDay $holidayDates[] = $holidayDate; } } - sort($holidayDates, SORT_NUMERIC); + \sort($holidayDates, SORT_NUMERIC); foreach ($holidayDates as $holidayDate) { if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { - if (!in_array($holidayDate, $holidayCountedArray)) { + if (!\in_array($holidayDate, $holidayCountedArray)) { ++$endDate; $holidayCountedArray[] = $holidayDate; } @@ -173,10 +173,10 @@ class WorkDay $holidayDates[] = $holidayDate; } } - rsort($holidayDates, SORT_NUMERIC); + \rsort($holidayDates, SORT_NUMERIC); foreach ($holidayDates as $holidayDate) { if (($holidayDate <= $startDate) && ($holidayDate >= $endDate)) { - if (!in_array($holidayDate, $holidayCountedArray)) { + if (!\in_array($holidayDate, $holidayCountedArray)) { --$endDate; $holidayCountedArray[] = $holidayDate; } @@ -196,6 +196,6 @@ class WorkDay { $result = Functions::scalar(Week::day($date, $wd)); - return is_int($result) ? $result : -1; + return \is_int($result) ? $result : -1; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php index 394c6b7..5caa35a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php @@ -45,7 +45,7 @@ class YearFrac */ public static function fraction($startDate, $endDate, $method = 0) { - if (is_array($startDate) || is_array($endDate) || is_array($method)) { + if (\is_array($startDate) || \is_array($endDate) || \is_array($method)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $startDate, $endDate, $method); } @@ -55,8 +55,8 @@ class YearFrac $eDate = Helpers::getDateValue($endDate); $sDate = self::excelBug($sDate, $startDate, $endDate, $method); $eDate = self::excelBug($eDate, $endDate, $startDate, $method); - $startDate = min($sDate, $eDate); - $endDate = max($sDate, $eDate); + $startDate = \min($sDate, $eDate); + $endDate = \max($sDate, $eDate); } catch (Exception $e) { return $e->getMessage(); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php index fae9d90..e4d715c 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php @@ -33,12 +33,12 @@ class ArrayArgumentHelper public function initialise(array $arguments): void { - $keys = array_keys($arguments); - $this->indexStart = (int) array_shift($keys); + $keys = \array_keys($arguments); + $this->indexStart = (int) \array_shift($keys); $this->rows = $this->rows($arguments); $this->columns = $this->columns($arguments); - $this->argumentCount = count($arguments); + $this->argumentCount = \count($arguments); $this->arguments = $this->flattenSingleCellArrays($arguments, $this->rows, $this->columns); $this->rows = $this->rows($arguments); @@ -77,7 +77,7 @@ class ArrayArgumentHelper { $rowVectors = $this->getRowVectors(); - return count($rowVectors) === 1 ? array_pop($rowVectors) : null; + return \count($rowVectors) === 1 ? \array_pop($rowVectors) : null; } private function getRowVectors(): array @@ -96,7 +96,7 @@ class ArrayArgumentHelper { $columnVectors = $this->getColumnVectors(); - return count($columnVectors) === 1 ? array_pop($columnVectors) : null; + return \count($columnVectors) === 1 ? \array_pop($columnVectors) : null; } private function getColumnVectors(): array @@ -151,9 +151,9 @@ class ArrayArgumentHelper private function rows(array $arguments): array { - return array_map( + return \array_map( function ($argument) { - return is_countable($argument) ? count($argument) : 1; + return \is_countable($argument) ? \count($argument) : 1; }, $arguments ); @@ -161,10 +161,10 @@ class ArrayArgumentHelper private function columns(array $arguments): array { - return array_map( + return \array_map( function ($argument) { - return is_array($argument) && is_array($argument[array_keys($argument)[0]]) - ? count($argument[array_keys($argument)[0]]) + return \is_array($argument) && \is_array($argument[\array_keys($argument)[0]]) + ? \count($argument[\array_keys($argument)[0]]) : 1; }, $arguments @@ -174,7 +174,7 @@ class ArrayArgumentHelper public function arrayArguments(): int { $count = 0; - foreach (array_keys($this->arguments) as $argument) { + foreach (\array_keys($this->arguments) as $argument) { if ($this->rows[$argument] > 1 || $this->columns[$argument] > 1) { ++$count; } @@ -187,8 +187,8 @@ class ArrayArgumentHelper { foreach ($arguments as $index => $argument) { if ($rows[$index] === 1 && $columns[$index] === 1) { - while (is_array($argument)) { - $argument = array_pop($argument); + while (\is_array($argument)) { + $argument = \array_pop($argument); } $arguments[$index] = $argument; } @@ -199,7 +199,7 @@ class ArrayArgumentHelper private function filterArray(array $array): array { - return array_filter( + return \array_filter( $array, function ($value) { return $value > 1; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php index 3e69d77..3e6ea19 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php @@ -64,21 +64,21 @@ class ArrayArgumentProcessor */ private static function evaluateVectorMatrixPair(callable $method, array $matrixIndexes, ...$arguments): array { - $matrix2 = array_pop($matrixIndexes); + $matrix2 = \array_pop($matrixIndexes); /** @var array $matrixValues2 */ $matrixValues2 = $arguments[$matrix2]; - $matrix1 = array_pop($matrixIndexes); + $matrix1 = \array_pop($matrixIndexes); /** @var array $matrixValues1 */ $matrixValues1 = $arguments[$matrix1]; - $rows = min(array_map([self::$arrayArgumentHelper, 'rowCount'], [$matrix1, $matrix2])); - $columns = min(array_map([self::$arrayArgumentHelper, 'columnCount'], [$matrix1, $matrix2])); + $rows = \min(\array_map([self::$arrayArgumentHelper, 'rowCount'], [$matrix1, $matrix2])); + $columns = \min(\array_map([self::$arrayArgumentHelper, 'columnCount'], [$matrix1, $matrix2])); if ($rows === 1) { - $rows = max(array_map([self::$arrayArgumentHelper, 'rowCount'], [$matrix1, $matrix2])); + $rows = \max(\array_map([self::$arrayArgumentHelper, 'rowCount'], [$matrix1, $matrix2])); } if ($columns === 1) { - $columns = max(array_map([self::$arrayArgumentHelper, 'columnCount'], [$matrix1, $matrix2])); + $columns = \max(\array_map([self::$arrayArgumentHelper, 'columnCount'], [$matrix1, $matrix2])); } $result = []; @@ -105,10 +105,10 @@ class ArrayArgumentProcessor */ private static function evaluateMatrixPair(callable $method, array $matrixIndexes, ...$arguments): array { - $matrix2 = array_pop($matrixIndexes); + $matrix2 = \array_pop($matrixIndexes); /** @var array $matrixValues2 */ $matrixValues2 = $arguments[$matrix2]; - $matrix1 = array_pop($matrixIndexes); + $matrix1 = \array_pop($matrixIndexes); /** @var array $matrixValues1 */ $matrixValues1 = $arguments[$matrix1]; @@ -160,9 +160,9 @@ class ArrayArgumentProcessor */ private static function evaluateNthArgumentAsArray(callable $method, int $nthArgument, ...$arguments): array { - $values = array_slice($arguments, $nthArgument - 1, 1); + $values = \array_slice($arguments, $nthArgument - 1, 1); /** @var array $values */ - $values = array_pop($values); + $values = \array_pop($values); $result = []; foreach ($values as $value) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/BranchPruner.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/BranchPruner.php index 9cd767e..c5c1865 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/BranchPruner.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/BranchPruner.php @@ -86,7 +86,7 @@ class BranchPruner $this->currentOnlyIf = null; $this->currentOnlyIfNot = null; $this->previousStoreKey = null; - $this->pendingStoreKey = empty($this->storeKeysStack) ? null : end($this->storeKeysStack); + $this->pendingStoreKey = empty($this->storeKeysStack) ? null : \end($this->storeKeysStack); if ($this->branchPruningEnabled) { $this->initialiseCondition(); @@ -99,7 +99,7 @@ class BranchPruner { if (isset($this->conditionMap[$this->pendingStoreKey]) && $this->conditionMap[$this->pendingStoreKey]) { $this->currentCondition = $this->pendingStoreKey; - $stackDepth = count($this->storeKeysStack); + $stackDepth = \count($this->storeKeysStack); if ($stackDepth > 1) { // nested if $this->previousStoreKey = $this->storeKeysStack[$stackDepth - 2]; @@ -153,7 +153,7 @@ class BranchPruner $this->storeKeysStack[] = $this->pendingStoreKey; $this->conditionMap[$this->pendingStoreKey] = true; $this->braceDepthMap[$this->pendingStoreKey] = 0; - } elseif (!empty($this->pendingStoreKey) && array_key_exists($this->pendingStoreKey, $this->braceDepthMap)) { + } elseif (!empty($this->pendingStoreKey) && \array_key_exists($this->pendingStoreKey, $this->braceDepthMap)) { // this is not an if but we go deeper ++$this->braceDepthMap[$this->pendingStoreKey]; } @@ -193,7 +193,7 @@ class BranchPruner $this->thenMap[$this->pendingStoreKey] = false; $this->elseMap[$this->pendingStoreKey] = false; --$this->braceDepthMap[$this->pendingStoreKey]; - array_pop($this->storeKeysStack); + \array_pop($this->storeKeysStack); $this->pendingStoreKey = null; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php index b688e05..eb5a6e7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php @@ -18,7 +18,7 @@ class CyclicReferenceStack */ public function count() { - return count($this->stack); + return \count($this->stack); } /** @@ -38,7 +38,7 @@ class CyclicReferenceStack */ public function pop() { - return array_pop($this->stack); + return \array_pop($this->stack); } /** diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/FormattedNumber.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/FormattedNumber.php index 8fe7aa4..507a2d9 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/FormattedNumber.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/FormattedNumber.php @@ -45,9 +45,9 @@ class FormattedNumber */ public static function convertToNumberIfNumeric(string &$operand): bool { - $value = preg_replace(['/(\d),(\d)/u', '/([+-])\s+(\d)/u'], ['$1$2', '$1$2'], trim($operand)); + $value = \preg_replace(['/(\d),(\d)/u', '/([+-])\s+(\d)/u'], ['$1$2', '$1$2'], \trim($operand)); - if (is_numeric($value)) { + if (\is_numeric($value)) { $operand = (float) $value; return true; @@ -64,7 +64,7 @@ class FormattedNumber */ public static function convertToNumberIfFraction(string &$operand): bool { - if (preg_match(self::STRING_REGEXP_FRACTION, $operand, $match)) { + if (\preg_match(self::STRING_REGEXP_FRACTION, $operand, $match)) { $sign = ($match[1] === '-') ? '-' : '+'; $wholePart = ($match[3] === '') ? '' : ($sign . $match[3]); $fractionFormula = '=' . $wholePart . $sign . $match[4]; @@ -84,10 +84,10 @@ class FormattedNumber */ public static function convertToNumberIfPercent(string &$operand): bool { - $value = preg_replace('/(\d),(\d)/u', '$1$2', $operand); + $value = \preg_replace('/(\d),(\d)/u', '$1$2', $operand); $match = []; - if ($value !== null && preg_match(self::STRING_REGEXP_PERCENT, $value, $match, PREG_UNMATCHED_AS_NULL)) { + if ($value !== null && \preg_match(self::STRING_REGEXP_PERCENT, $value, $match, PREG_UNMATCHED_AS_NULL)) { //Calculate the percentage $sign = ($match['PrefixedSign'] ?? $match['PrefixedSign2'] ?? $match['PostfixedSign']) ?? ''; $operand = (float) ($sign . ($match['PostfixedValue'] ?? $match['PrefixedValue'])) / 100; @@ -106,13 +106,13 @@ class FormattedNumber */ public static function convertToNumberIfCurrency(string &$operand): bool { - $quotedCurrencyCode = preg_quote(StringHelper::getCurrencyCode()); + $quotedCurrencyCode = \preg_quote(StringHelper::getCurrencyCode()); - $value = preg_replace('/(\d),(\d)/u', '$1$2', $operand); + $value = \preg_replace('/(\d),(\d)/u', '$1$2', $operand); $regExp = '~^(?:(?: *(?[-+])? *' . $quotedCurrencyCode . ' *(?[-+])? *(?[0-9]+\.?[0-9*]*(?:E[-+]?[0-9]*)?) *)|(?: *(?[-+])? *(?[0-9]+\.?[0-9]*(?:E[-+]?[0-9]*)?) *' . $quotedCurrencyCode . ' *))$~ui'; $match = []; - if ($value !== null && preg_match($regExp, $value, $match, PREG_UNMATCHED_AS_NULL)) { + if ($value !== null && \preg_match($regExp, $value, $match, PREG_UNMATCHED_AS_NULL)) { //Determine the sign $sign = ($match['PrefixedSign'] ?? $match['PrefixedSign2'] ?? $match['PostfixedSign']) ?? ''; //Cast to a float diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/Logger.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/Logger.php index 256c3ef..014d168 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/Logger.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/Logger.php @@ -94,8 +94,8 @@ class Logger { // Only write the debug log if logging is enabled if ($this->writeDebugLog) { - $message = sprintf($message, ...$args); - $cellReference = implode(' -> ', $this->cellStack->showStack()); + $message = \sprintf($message, ...$args); + $cellReference = \implode(' -> ', $this->cellStack->showStack()); if ($this->echoDebugLog) { echo $cellReference, ($this->cellStack->count() > 0 ? ' => ' : ''), diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php b/PhpOffice/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php index d07df80..9d60170 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php @@ -57,18 +57,18 @@ final class StructuredReference implements Operand { $val = $matches[0]; - $srCount = substr_count($val, self::OPEN_BRACE) - - substr_count($val, self::CLOSE_BRACE); + $srCount = \substr_count($val, self::OPEN_BRACE) + - \substr_count($val, self::CLOSE_BRACE); while ($srCount > 0) { - $srIndex = strlen($val); - $srStringRemainder = substr($formula, $index + $srIndex); - $closingPos = strpos($srStringRemainder, self::CLOSE_BRACE); + $srIndex = \strlen($val); + $srStringRemainder = \substr($formula, $index + $srIndex); + $closingPos = \strpos($srStringRemainder, self::CLOSE_BRACE); if ($closingPos === false) { throw new Exception("Formula Error: No closing ']' to match opening '['"); } - $srStringRemainder = substr($srStringRemainder, 0, $closingPos + 1); + $srStringRemainder = \substr($srStringRemainder, 0, $closingPos + 1); --$srCount; - if (strpos($srStringRemainder, self::OPEN_BRACE) !== false) { + if (\strpos($srStringRemainder, self::OPEN_BRACE) !== false) { ++$srCount; } $val .= $srStringRemainder; @@ -91,8 +91,8 @@ final class StructuredReference implements Operand private function isRowReference(): bool { - return strpos($this->value, '[@') !== false - || strpos($this->value, '[' . self::ITEM_SPECIFIER_THIS_ROW . ']') !== false; + return \strpos($this->value, '[@') !== false + || \strpos($this->value, '[' . self::ITEM_SPECIFIER_THIS_ROW . ']') !== false; } /** @@ -101,7 +101,7 @@ final class StructuredReference implements Operand */ private function getTableStructure(Cell $cell): void { - preg_match(self::TABLE_REFERENCE, $this->value, $matches); + \preg_match(self::TABLE_REFERENCE, $this->value, $matches); $this->tableName = $matches[1]; $this->table = ($this->tableName === '') @@ -173,25 +173,25 @@ final class StructuredReference implements Operand private function getRowReference(Cell $cell): string { - $reference = str_replace("\u{a0}", ' ', $this->reference); + $reference = \str_replace("\u{a0}", ' ', $this->reference); /** @var string $reference */ - $reference = str_replace('[' . self::ITEM_SPECIFIER_THIS_ROW . '],', '', $reference); + $reference = \str_replace('[' . self::ITEM_SPECIFIER_THIS_ROW . '],', '', $reference); foreach ($this->columns as $columnId => $columnName) { - $columnName = str_replace("\u{a0}", ' ', $columnName); + $columnName = \str_replace("\u{a0}", ' ', $columnName); $cellReference = $columnId . $cell->getRow(); - $pattern1 = '/\[' . preg_quote($columnName) . '\]/miu'; - $pattern2 = '/@' . preg_quote($columnName) . '/miu'; + $pattern1 = '/\[' . \preg_quote($columnName) . '\]/miu'; + $pattern2 = '/@' . \preg_quote($columnName) . '/miu'; /** @var string $reference */ - if (preg_match($pattern1, $reference) === 1) { - $reference = preg_replace($pattern1, $cellReference, $reference); - } elseif (preg_match($pattern2, $reference) === 1) { - $reference = preg_replace($pattern2, $cellReference, $reference); + if (\preg_match($pattern1, $reference) === 1) { + $reference = \preg_replace($pattern1, $cellReference, $reference); + } elseif (\preg_match($pattern2, $reference) === 1) { + $reference = \preg_replace($pattern2, $cellReference, $reference); } } /** @var string $reference */ - return $this->validateParsedReference(trim($reference, '[]@, ')); + return $this->validateParsedReference(\trim($reference, '[]@, ')); } /** @@ -200,18 +200,18 @@ final class StructuredReference implements Operand */ private function getColumnReference(): string { - $reference = str_replace("\u{a0}", ' ', $this->reference); + $reference = \str_replace("\u{a0}", ' ', $this->reference); $startRow = ($this->totalsRow === null) ? $this->lastDataRow : $this->totalsRow; $endRow = ($this->headersRow === null) ? $this->firstDataRow : $this->headersRow; [$startRow, $endRow] = $this->getRowsForColumnReference($reference, $startRow, $endRow); $reference = $this->getColumnsForColumnReference($reference, $startRow, $endRow); - $reference = trim($reference, '[]@, '); - if (substr_count($reference, ':') > 1) { - $cells = explode(':', $reference); - $firstCell = array_shift($cells); - $lastCell = array_pop($cells); + $reference = \trim($reference, '[]@, '); + if (\substr_count($reference, ':') > 1) { + $cells = \explode(':', $reference); + $firstCell = \array_shift($cells); + $lastCell = \array_pop($cells); $reference = "{$firstCell}:{$lastCell}"; } @@ -224,8 +224,8 @@ final class StructuredReference implements Operand */ private function validateParsedReference(string $reference): string { - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . ':' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $reference) !== 1) { - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $reference) !== 1) { + if (\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . ':' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $reference) !== 1) { + if (\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $reference) !== 1) { throw new Exception("Invalid Structured Reference {$this->reference} {$reference}"); } } @@ -235,9 +235,9 @@ final class StructuredReference implements Operand private function fullData(int $startRow, int $endRow): string { - $columns = array_keys($this->columns); - $firstColumn = array_shift($columns); - $lastColumn = (empty($columns)) ? $firstColumn : array_pop($columns); + $columns = \array_keys($this->columns); + $firstColumn = \array_shift($columns); + $lastColumn = (empty($columns)) ? $firstColumn : \array_pop($columns); return "{$firstColumn}{$startRow}:{$lastColumn}{$endRow}"; } @@ -286,7 +286,7 @@ final class StructuredReference implements Operand foreach (self::ITEM_SPECIFIER_ROWS_SET as $rowReference) { $pattern = '/\[' . $rowReference . '\]/mui'; /** @var string $reference */ - if (preg_match($pattern, $reference) === 1) { + if (\preg_match($pattern, $reference) === 1) { if (($rowReference === self::ITEM_SPECIFIER_HEADERS) && ($this->table->getShowHeaderRow() === false)) { throw new Exception( 'Table Headers are Hidden, and should not be Referenced', @@ -294,9 +294,9 @@ final class StructuredReference implements Operand ); } $rowsSelected = true; - $startRow = min($startRow, $this->getMinimumRow($rowReference)); - $endRow = max($endRow, $this->getMaximumRow($rowReference)); - $reference = preg_replace($pattern, '', $reference); + $startRow = \min($startRow, $this->getMinimumRow($rowReference)); + $endRow = \max($endRow, $this->getMaximumRow($rowReference)); + $reference = \preg_replace($pattern, '', $reference); } } if ($rowsSelected === false) { @@ -312,14 +312,14 @@ final class StructuredReference implements Operand { $columnsSelected = false; foreach ($this->columns as $columnId => $columnName) { - $columnName = str_replace("\u{a0}", ' ', $columnName); + $columnName = \str_replace("\u{a0}", ' ', $columnName); $cellFrom = "{$columnId}{$startRow}"; $cellTo = "{$columnId}{$endRow}"; $cellReference = ($cellFrom === $cellTo) ? $cellFrom : "{$cellFrom}:{$cellTo}"; - $pattern = '/\[' . preg_quote($columnName) . '\]/mui'; - if (preg_match($pattern, $reference) === 1) { + $pattern = '/\[' . \preg_quote($columnName) . '\]/mui'; + if (\preg_match($pattern, $reference) === 1) { $columnsSelected = true; - $reference = preg_replace($pattern, $cellReference, $reference); + $reference = \preg_replace($pattern, $cellReference, $reference); } /** @var string $reference */ } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering.php index e3a2bd6..06d385c 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering.php @@ -1273,7 +1273,7 @@ class Engineering * Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments, * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was * improved, so that it can now calculate the function for both positive and negative ranges. - * PhpSpreadsheet follows Excel 2010 behaviour, and accepts negative arguments. + * PhpSpreadsheet follows Excel 2010 behavior, and accepts negative arguments. * * Excel Function: * ERF(lower[,upper]) @@ -1322,7 +1322,7 @@ class Engineering * Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument, * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was * improved, so that it can now calculate the function for both positive and negative x values. - * PhpSpreadsheet follows Excel 2010 behaviour, and accepts nagative arguments. + * PhpSpreadsheet follows Excel 2010 behavior, and accepts nagative arguments. * * Excel Function: * ERFC(x) diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselI.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselI.php index 1134574..47a421c 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselI.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselI.php @@ -37,7 +37,7 @@ class BesselI */ public static function BESSELI($x, $ord) { - if (is_array($x) || is_array($ord)) { + if (\is_array($x) || \is_array($ord)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); } @@ -54,7 +54,7 @@ class BesselI $fResult = self::calculate($x, $ord); - return (is_nan($fResult)) ? ExcelError::NAN() : $fResult; + return (\is_nan($fResult)) ? ExcelError::NAN() : $fResult; } private static function calculate(float $x, int $ord): float @@ -72,7 +72,7 @@ class BesselI private static function besselI0(float $x): float { - $ax = abs($x); + $ax = \abs($x); if ($ax < 3.75) { $y = $x / 3.75; @@ -84,14 +84,14 @@ class BesselI $y = 3.75 / $ax; - return (exp($ax) / sqrt($ax)) * (0.39894228 + $y * (0.1328592e-1 + $y * (0.225319e-2 + $y * (-0.157565e-2 + return (\exp($ax) / \sqrt($ax)) * (0.39894228 + $y * (0.1328592e-1 + $y * (0.225319e-2 + $y * (-0.157565e-2 + $y * (0.916281e-2 + $y * (-0.2057706e-1 + $y * (0.2635537e-1 + $y * (-0.1647633e-1 + $y * 0.392377e-2)))))))); } private static function besselI1(float $x): float { - $ax = abs($x); + $ax = \abs($x); if ($ax < 3.75) { $y = $x / 3.75; @@ -106,7 +106,7 @@ class BesselI $ans = 0.2282967e-1 + $y * (-0.2895312e-1 + $y * (0.1787654e-1 - $y * 0.420059e-2)); $ans = 0.39894228 + $y * (-0.3988024e-1 + $y * (-0.362018e-2 + $y * (0.163801e-2 + $y * (-0.1031555e-1 + $y * $ans)))); - $ans *= exp($ax) / sqrt($ax); + $ans *= \exp($ax) / \sqrt($ax); return ($x < 0.0) ? -$ans : $ans; } @@ -124,17 +124,17 @@ class BesselI return 0.0; } - $tox = 2.0 / abs($x); + $tox = 2.0 / \abs($x); $bip = 0; $ans = 0.0; $bi = 1.0; - for ($j = 2 * ($ord + (int) sqrt(40.0 * $ord)); $j > 0; --$j) { + for ($j = 2 * ($ord + (int) \sqrt(40.0 * $ord)); $j > 0; --$j) { $bim = $bip + $j * $tox * $bi; $bip = $bi; $bi = $bim; - if (abs($bi) > 1.0e+12) { + if (\abs($bi) > 1.0e+12) { $ans *= 1.0e-12; $bi *= 1.0e-12; $bip *= 1.0e-12; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselJ.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselJ.php index 800a8a1..4d93d86 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselJ.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselJ.php @@ -36,7 +36,7 @@ class BesselJ */ public static function BESSELJ($x, $ord) { - if (is_array($x) || is_array($ord)) { + if (\is_array($x) || \is_array($ord)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); } @@ -53,7 +53,7 @@ class BesselJ $fResult = self::calculate($x, $ord); - return (is_nan($fResult)) ? ExcelError::NAN() : $fResult; + return (\is_nan($fResult)) ? ExcelError::NAN() : $fResult; } private static function calculate(float $x, int $ord): float @@ -71,7 +71,7 @@ class BesselJ private static function besselJ0(float $x): float { - $ax = abs($x); + $ax = \abs($x); if ($ax < 8.0) { $y = $x * $x; @@ -90,12 +90,12 @@ class BesselJ $ans2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 - $y * 0.934935152e-7))); - return sqrt(0.636619772 / $ax) * (cos($xx) * $ans1 - $z * sin($xx) * $ans2); + return \sqrt(0.636619772 / $ax) * (\cos($xx) * $ans1 - $z * \sin($xx) * $ans2); } private static function besselJ1(float $x): float { - $ax = abs($x); + $ax = \abs($x); if ($ax < 8.0) { $y = $x * $x; @@ -114,14 +114,14 @@ class BesselJ $ans1 = 1.0 + $y * (0.183105e-2 + $y * (-0.3516396496e-4 + $y * (0.2457520174e-5 + $y * (-0.240337019e-6)))); $ans2 = 0.04687499995 + $y * (-0.2002690873e-3 + $y * (0.8449199096e-5 + $y * (-0.88228987e-6 + $y * 0.105787412e-6))); - $ans = sqrt(0.636619772 / $ax) * (cos($xx) * $ans1 - $z * sin($xx) * $ans2); + $ans = \sqrt(0.636619772 / $ax) * (\cos($xx) * $ans1 - $z * \sin($xx) * $ans2); return ($x < 0.0) ? -$ans : $ans; } private static function besselJ2(float $x, int $ord): float { - $ax = abs($x); + $ax = \abs($x); if ($ax === 0.0) { return 0.0; } @@ -154,11 +154,11 @@ class BesselJ $jsum = false; $bjp = $ans = $sum = 0.0; $bj = 1.0; - for ($j = 2 * ($ord + (int) sqrt(40.0 * $ord)); $j > 0; --$j) { + for ($j = 2 * ($ord + (int) \sqrt(40.0 * $ord)); $j > 0; --$j) { $bjm = $j * $tox * $bj - $bjp; $bjp = $bj; $bj = $bjm; - if (abs($bj) > 1.0e+10) { + if (\abs($bj) > 1.0e+10) { $bj *= 1.0e-10; $bjp *= 1.0e-10; $ans *= 1.0e-10; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselK.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselK.php index 2d21e75..098d0a7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselK.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselK.php @@ -35,7 +35,7 @@ class BesselK */ public static function BESSELK($x, $ord) { - if (is_array($x) || is_array($ord)) { + if (\is_array($x) || \is_array($ord)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); } @@ -52,7 +52,7 @@ class BesselK $fBk = self::calculate($x, $ord); - return (is_nan($fBk)) ? ExcelError::NAN() : $fBk; + return (\is_nan($fBk)) ? ExcelError::NAN() : $fBk; } private static function calculate(float $x, int $ord): float @@ -76,7 +76,7 @@ class BesselK private static function callBesselI(float $x, int $ord): float { $rslt = BesselI::BESSELI($x, $ord); - if (!is_float($rslt)) { + if (!\is_float($rslt)) { throw new Exception('Unexpected array or string'); } @@ -89,14 +89,14 @@ class BesselK $fNum2 = $x * 0.5; $y = ($fNum2 * $fNum2); - return -log($fNum2) * self::callBesselI($x, 0) + + return -\log($fNum2) * self::callBesselI($x, 0) + (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y * (0.10750e-3 + $y * 0.74e-5)))))); } $y = 2 / $x; - return exp(-$x) / sqrt($x) * + return \exp(-$x) / \sqrt($x) * (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y * (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3)))))); } @@ -107,14 +107,14 @@ class BesselK $fNum2 = $x * 0.5; $y = ($fNum2 * $fNum2); - return log($fNum2) * self::callBesselI($x, 1) + + return \log($fNum2) * self::callBesselI($x, 1) + (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y * (-0.110404e-2 + $y * (-0.4686e-4))))))) / $x; } $y = 2 / $x; - return exp(-$x) / sqrt($x) * + return \exp(-$x) / \sqrt($x) * (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y * (0.325614e-2 + $y * (-0.68245e-3))))))); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselY.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselY.php index 31d9694..7955d30 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselY.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BesselY.php @@ -33,7 +33,7 @@ class BesselY */ public static function BESSELY($x, $ord) { - if (is_array($x) || is_array($ord)) { + if (\is_array($x) || \is_array($ord)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $ord); } @@ -50,7 +50,7 @@ class BesselY $fBy = self::calculate($x, $ord); - return (is_nan($fBy)) ? ExcelError::NAN() : $fBy; + return (\is_nan($fBy)) ? ExcelError::NAN() : $fBy; } private static function calculate(float $x, int $ord): float @@ -74,7 +74,7 @@ class BesselY private static function callBesselJ(float $x, int $ord): float { $rslt = BesselJ::BESSELJ($x, $ord); - if (!is_float($rslt)) { + if (!\is_float($rslt)) { throw new Exception('Unexpected array or string'); } @@ -90,7 +90,7 @@ class BesselY $ans2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y)))); - return $ans1 / $ans2 + 0.636619772 * self::callBesselJ($x, 0) * log($x); + return $ans1 / $ans2 + 0.636619772 * self::callBesselJ($x, 0) * \log($x); } $z = 8.0 / $x; @@ -100,7 +100,7 @@ class BesselY $ans2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7)))); - return sqrt(0.636619772 / $x) * (sin($xx) * $ans1 + $z * cos($xx) * $ans2); + return \sqrt(0.636619772 / $x) * (\sin($xx) * $ans1 + $z * \cos($xx) * $ans2); } private static function besselY1(float $x): float @@ -112,7 +112,7 @@ class BesselY $ans2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y * (0.1020426050e6 + $y * (0.3549632885e3 + $y))))); - return ($ans1 / $ans2) + 0.636619772 * (self::callBesselJ($x, 1) * log($x) - 1 / $x); + return ($ans1 / $ans2) + 0.636619772 * (self::callBesselJ($x, 1) * \log($x) - 1 / $x); } $z = 8.0 / $x; @@ -122,7 +122,7 @@ class BesselY $ans2 = 0.04687499995 + $y * (-0.2002690873e-3 + $y * (0.8449199096e-5 + $y * (-0.88228987e-6 + $y * 0.105787412e-6))); - return sqrt(0.636619772 / $x) * (sin($xx) * $ans1 + $z * cos($xx) * $ans2); + return \sqrt(0.636619772 / $x) * (\sin($xx) * $ans1 + $z * \cos($xx) * $ans2); } private static function besselY2(float $x, int $ord): float diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BitWise.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BitWise.php index 0362649..45cccfb 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BitWise.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/BitWise.php @@ -22,7 +22,7 @@ class BitWise */ private static function splitNumber($number): array { - return [(int) floor($number / self::SPLIT_DIVISOR), (int) fmod($number, self::SPLIT_DIVISOR)]; + return [(int) \floor($number / self::SPLIT_DIVISOR), (int) \fmod($number, self::SPLIT_DIVISOR)]; } /** @@ -44,7 +44,7 @@ class BitWise */ public static function BITAND($number1, $number2) { - if (is_array($number1) || is_array($number2)) { + if (\is_array($number1) || \is_array($number2)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number1, $number2); } @@ -79,7 +79,7 @@ class BitWise */ public static function BITOR($number1, $number2) { - if (is_array($number1) || is_array($number2)) { + if (\is_array($number1) || \is_array($number2)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number1, $number2); } @@ -115,7 +115,7 @@ class BitWise */ public static function BITXOR($number1, $number2) { - if (is_array($number1) || is_array($number2)) { + if (\is_array($number1) || \is_array($number2)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number1, $number2); } @@ -151,7 +151,7 @@ class BitWise */ public static function BITLSHIFT($number, $shiftAmount) { - if (is_array($number) || is_array($shiftAmount)) { + if (\is_array($number) || \is_array($shiftAmount)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $shiftAmount); } @@ -162,7 +162,7 @@ class BitWise return $e->getMessage(); } - $result = floor($number * (2 ** $shiftAmount)); + $result = \floor($number * (2 ** $shiftAmount)); if ($result > 2 ** 48 - 1) { return ExcelError::NAN(); } @@ -189,7 +189,7 @@ class BitWise */ public static function BITRSHIFT($number, $shiftAmount) { - if (is_array($number) || is_array($shiftAmount)) { + if (\is_array($number) || \is_array($shiftAmount)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $shiftAmount); } @@ -200,7 +200,7 @@ class BitWise return $e->getMessage(); } - $result = floor($number / (2 ** $shiftAmount)); + $result = \floor($number / (2 ** $shiftAmount)); if ($result > 2 ** 48 - 1) { // possible because shiftAmount can be negative return ExcelError::NAN(); } @@ -219,14 +219,14 @@ class BitWise { $value = self::nullFalseTrueToNumber($value); - if (is_numeric($value)) { + if (\is_numeric($value)) { $value = (float) $value; - if ($value == floor($value)) { + if ($value == \floor($value)) { if (($value > 2 ** 48 - 1) || ($value < 0)) { throw new Exception(ExcelError::NAN()); } - return floor($value); + return \floor($value); } throw new Exception(ExcelError::NAN()); @@ -246,8 +246,8 @@ class BitWise { $value = self::nullFalseTrueToNumber($value); - if (is_numeric($value)) { - if (abs($value) > 53) { + if (\is_numeric($value)) { + if (\abs($value) > 53) { throw new Exception(ExcelError::NAN()); } @@ -268,7 +268,7 @@ class BitWise { if ($number === null) { $number = 0; - } elseif (is_bool($number)) { + } elseif (\is_bool($number)) { $number = (int) $number; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Compare.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Compare.php index 6aaf1fa..0f3b1d0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Compare.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Compare.php @@ -31,7 +31,7 @@ class Compare */ public static function DELTA($a, $b = 0.0) { - if (is_array($a) || is_array($b)) { + if (\is_array($a) || \is_array($b)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $a, $b); } @@ -42,7 +42,7 @@ class Compare return $e->getMessage(); } - return (int) (abs($a - $b) < 1.0e-15); + return (int) (\abs($a - $b) < 1.0e-15); } /** @@ -66,7 +66,7 @@ class Compare */ public static function GESTEP($number, $step = 0.0) { - if (is_array($number) || is_array($step)) { + if (\is_array($number) || \is_array($step)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $step); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Complex.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Complex.php index 691de8b..30a4f0e 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Complex.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Complex.php @@ -34,7 +34,7 @@ class Complex */ public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i') { - if (is_array($realNumber) || is_array($imaginary) || is_array($suffix)) { + if (\is_array($realNumber) || \is_array($imaginary) || \is_array($suffix)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $realNumber, $imaginary, $suffix); } @@ -76,7 +76,7 @@ class Complex */ public static function IMAGINARY($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -106,7 +106,7 @@ class Complex */ public static function IMREAL($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php index 28a27a0..ce42a07 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php @@ -28,7 +28,7 @@ class ComplexFunctions */ public static function IMABS($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -59,7 +59,7 @@ class ComplexFunctions */ public static function IMARGUMENT($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -93,7 +93,7 @@ class ComplexFunctions */ public static function IMCONJUGATE($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -123,7 +123,7 @@ class ComplexFunctions */ public static function IMCOS($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -153,7 +153,7 @@ class ComplexFunctions */ public static function IMCOSH($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -183,7 +183,7 @@ class ComplexFunctions */ public static function IMCOT($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -213,7 +213,7 @@ class ComplexFunctions */ public static function IMCSC($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -243,7 +243,7 @@ class ComplexFunctions */ public static function IMCSCH($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -273,7 +273,7 @@ class ComplexFunctions */ public static function IMSIN($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -303,7 +303,7 @@ class ComplexFunctions */ public static function IMSINH($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -333,7 +333,7 @@ class ComplexFunctions */ public static function IMSEC($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -363,7 +363,7 @@ class ComplexFunctions */ public static function IMSECH($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -393,7 +393,7 @@ class ComplexFunctions */ public static function IMTAN($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -423,7 +423,7 @@ class ComplexFunctions */ public static function IMSQRT($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -458,7 +458,7 @@ class ComplexFunctions */ public static function IMLN($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -492,7 +492,7 @@ class ComplexFunctions */ public static function IMLOG10($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -526,7 +526,7 @@ class ComplexFunctions */ public static function IMLOG2($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -560,7 +560,7 @@ class ComplexFunctions */ public static function IMEXP($complexNumber) { - if (is_array($complexNumber)) { + if (\is_array($complexNumber)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $complexNumber); } @@ -592,7 +592,7 @@ class ComplexFunctions */ public static function IMPOWER($complexNumber, $realNumber) { - if (is_array($complexNumber) || is_array($realNumber)) { + if (\is_array($complexNumber) || \is_array($realNumber)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $complexNumber, $realNumber); } @@ -602,7 +602,7 @@ class ComplexFunctions return ExcelError::NAN(); } - if (!is_numeric($realNumber)) { + if (!\is_numeric($realNumber)) { return ExcelError::VALUE(); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php index e525b4b..bfdf54e 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php @@ -31,7 +31,7 @@ class ComplexOperations */ public static function IMDIV($complexDividend, $complexDivisor) { - if (is_array($complexDividend) || is_array($complexDivisor)) { + if (\is_array($complexDividend) || \is_array($complexDivisor)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $complexDividend, $complexDivisor); } @@ -61,7 +61,7 @@ class ComplexOperations */ public static function IMSUB($complexNumber1, $complexNumber2) { - if (is_array($complexNumber1) || is_array($complexNumber2)) { + if (\is_array($complexNumber1) || \is_array($complexNumber2)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $complexNumber1, $complexNumber2); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php index e80490b..b9ad6bc 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php @@ -13,20 +13,20 @@ abstract class ConvertBase protected static function validateValue($value): string { - if (is_bool($value)) { + if (\is_bool($value)) { if (Functions::getCompatibilityMode() !== Functions::COMPATIBILITY_OPENOFFICE) { throw new Exception(ExcelError::VALUE()); } $value = (int) $value; } - if (is_numeric($value)) { + if (\is_numeric($value)) { if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $value = floor((float) $value); + $value = \floor((float) $value); } } - return strtoupper((string) $value); + return \strtoupper((string) $value); } protected static function validatePlaces($places = null): ?int @@ -35,7 +35,7 @@ abstract class ConvertBase return $places; } - if (is_numeric($places)) { + if (\is_numeric($places)) { if ($places < 0 || $places > 10) { throw new Exception(ExcelError::NAN()); } @@ -57,13 +57,13 @@ abstract class ConvertBase protected static function nbrConversionFormat(string $value, ?int $places): string { if ($places !== null) { - if (strlen($value) <= $places) { - return substr(str_pad($value, $places, '0', STR_PAD_LEFT), -10); + if (\strlen($value) <= $places) { + return \substr(\str_pad($value, $places, '0', STR_PAD_LEFT), -10); } return ExcelError::NAN(); } - return substr($value, -10); + return \substr($value, -10); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php index 4741f30..aa9f709 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php @@ -29,7 +29,7 @@ class ConvertBinary extends ConvertBase */ public static function toDecimal($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -40,14 +40,14 @@ class ConvertBinary extends ConvertBase return $e->getMessage(); } - if (strlen($value) == 10) { + if (\strlen($value) == 10) { // Two's Complement - $value = substr($value, -9); + $value = \substr($value, -9); - return '-' . (512 - bindec($value)); + return '-' . (512 - \bindec($value)); } - return (string) bindec($value); + return (string) \bindec($value); } /** @@ -79,7 +79,7 @@ class ConvertBinary extends ConvertBase */ public static function toHex($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -91,14 +91,14 @@ class ConvertBinary extends ConvertBase return $e->getMessage(); } - if (strlen($value) == 10) { - $high2 = substr($value, 0, 2); - $low8 = substr($value, 2); + if (\strlen($value) == 10) { + $high2 = \substr($value, 0, 2); + $low8 = \substr($value, 2); $xarr = ['00' => '00000000', '01' => '00000001', '10' => 'FFFFFFFE', '11' => 'FFFFFFFF']; - return $xarr[$high2] . strtoupper(substr('0' . dechex((int) bindec($low8)), -2)); + return $xarr[$high2] . \strtoupper(\substr('0' . \dechex((int) \bindec($low8)), -2)); } - $hexVal = (string) strtoupper(dechex((int) bindec($value))); + $hexVal = (string) \strtoupper(\dechex((int) \bindec($value))); return self::nbrConversionFormat($hexVal, $places); } @@ -132,7 +132,7 @@ class ConvertBinary extends ConvertBase */ public static function toOctal($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -144,17 +144,17 @@ class ConvertBinary extends ConvertBase return $e->getMessage(); } - if (strlen($value) == 10 && substr($value, 0, 1) === '1') { // Two's Complement - return str_repeat('7', 6) . strtoupper(decoct((int) bindec("11$value"))); + if (\strlen($value) == 10 && \substr($value, 0, 1) === '1') { // Two's Complement + return \str_repeat('7', 6) . \strtoupper(\decoct((int) \bindec("11$value"))); } - $octVal = (string) decoct((int) bindec($value)); + $octVal = (string) \decoct((int) \bindec($value)); return self::nbrConversionFormat($octVal, $places); } protected static function validateBinary(string $value): string { - if ((strlen($value) > preg_match_all('/[01]/', $value)) || (strlen($value) > 10)) { + if ((\strlen($value) > \preg_match_all('/[01]/', $value)) || (\strlen($value) > 10)) { throw new Exception(ExcelError::NAN()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php index 9b59d39..ef39b44 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php @@ -47,7 +47,7 @@ class ConvertDecimal extends ConvertBase */ public static function toBinary($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -59,14 +59,14 @@ class ConvertDecimal extends ConvertBase return $e->getMessage(); } - $value = (int) floor((float) $value); + $value = (int) \floor((float) $value); if ($value > self::LARGEST_BINARY_IN_DECIMAL || $value < self::SMALLEST_BINARY_IN_DECIMAL) { return ExcelError::NAN(); } - $r = decbin($value); + $r = \decbin($value); // Two's Complement - $r = substr($r, -10); + $r = \substr($r, -10); return self::nbrConversionFormat($r, $places); } @@ -104,7 +104,7 @@ class ConvertDecimal extends ConvertBase */ public static function toHex($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -116,11 +116,11 @@ class ConvertDecimal extends ConvertBase return $e->getMessage(); } - $value = floor((float) $value); + $value = \floor((float) $value); if ($value > self::LARGEST_HEX_IN_DECIMAL || $value < self::SMALLEST_HEX_IN_DECIMAL) { return ExcelError::NAN(); } - $r = strtoupper(dechex((int) $value)); + $r = \strtoupper(\dechex((int) $value)); $r = self::hex32bit($value, $r); return self::nbrConversionFormat($r, $places); @@ -132,12 +132,12 @@ class ConvertDecimal extends ConvertBase if ($value >= 2 ** 32) { $quotient = (int) ($value / (2 ** 32)); - return strtoupper(substr('0' . dechex($quotient), -2) . $hexstr); + return \strtoupper(\substr('0' . \dechex($quotient), -2) . $hexstr); } if ($value < -(2 ** 32)) { - $quotient = 256 - (int) ceil((-$value) / (2 ** 32)); + $quotient = 256 - (int) \ceil((-$value) / (2 ** 32)); - return strtoupper(substr('0' . dechex($quotient), -2) . substr("00000000$hexstr", -8)); + return \strtoupper(\substr('0' . \dechex($quotient), -2) . \substr("00000000$hexstr", -8)); } if ($value < 0) { return "FF$hexstr"; @@ -180,7 +180,7 @@ class ConvertDecimal extends ConvertBase */ public static function toOctal($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -192,19 +192,19 @@ class ConvertDecimal extends ConvertBase return $e->getMessage(); } - $value = (int) floor((float) $value); + $value = (int) \floor((float) $value); if ($value > self::LARGEST_OCTAL_IN_DECIMAL || $value < self::SMALLEST_OCTAL_IN_DECIMAL) { return ExcelError::NAN(); } - $r = decoct($value); - $r = substr($r, -10); + $r = \decoct($value); + $r = \substr($r, -10); return self::nbrConversionFormat($r, $places); } protected static function validateDecimal(string $value): string { - if (strlen($value) > preg_match_all('/[-0123456789.]/', $value)) { + if (\strlen($value) > \preg_match_all('/[-0123456789.]/', $value)) { throw new Exception(ExcelError::VALUE()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php index 55ce209..d0b5b5b 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php @@ -40,7 +40,7 @@ class ConvertHex extends ConvertBase */ public static function toBinary($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -80,7 +80,7 @@ class ConvertHex extends ConvertBase */ public static function toDecimal($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -91,23 +91,23 @@ class ConvertHex extends ConvertBase return $e->getMessage(); } - if (strlen($value) > 10) { + if (\strlen($value) > 10) { return ExcelError::NAN(); } $binX = ''; - foreach (str_split($value) as $char) { - $binX .= str_pad(base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT); + foreach (\str_split($value) as $char) { + $binX .= \str_pad(\base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT); } - if (strlen($binX) == 40 && $binX[0] == '1') { + if (\strlen($binX) == 40 && $binX[0] == '1') { for ($i = 0; $i < 40; ++$i) { $binX[$i] = ($binX[$i] == '1' ? '0' : '1'); } - return (string) ((bindec($binX) + 1) * -1); + return (string) ((\bindec($binX) + 1) * -1); } - return (string) bindec($binX); + return (string) \bindec($binX); } /** @@ -147,7 +147,7 @@ class ConvertHex extends ConvertBase */ public static function toOctal($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -166,7 +166,7 @@ class ConvertHex extends ConvertBase protected static function validateHex(string $value): string { - if (strlen($value) > preg_match_all('/[0123456789ABCDEF]/', $value)) { + if (\strlen($value) > \preg_match_all('/[0123456789ABCDEF]/', $value)) { throw new Exception(ExcelError::NAN()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php index add7aba..e901765 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php @@ -46,7 +46,7 @@ class ConvertOctal extends ConvertBase */ public static function toBinary($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -84,7 +84,7 @@ class ConvertOctal extends ConvertBase */ public static function toDecimal($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -96,18 +96,18 @@ class ConvertOctal extends ConvertBase } $binX = ''; - foreach (str_split($value) as $char) { - $binX .= str_pad(decbin((int) $char), 3, '0', STR_PAD_LEFT); + foreach (\str_split($value) as $char) { + $binX .= \str_pad(\decbin((int) $char), 3, '0', STR_PAD_LEFT); } - if (strlen($binX) == 30 && $binX[0] == '1') { + if (\strlen($binX) == 30 && $binX[0] == '1') { for ($i = 0; $i < 30; ++$i) { $binX[$i] = ($binX[$i] == '1' ? '0' : '1'); } - return (string) ((bindec($binX) + 1) * -1); + return (string) ((\bindec($binX) + 1) * -1); } - return (string) bindec($binX); + return (string) \bindec($binX); } /** @@ -144,7 +144,7 @@ class ConvertOctal extends ConvertBase */ public static function toHex($value, $places = null) { - if (is_array($value) || is_array($places)) { + if (\is_array($value) || \is_array($places)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $places); } @@ -156,16 +156,16 @@ class ConvertOctal extends ConvertBase return $e->getMessage(); } - $hexVal = strtoupper(dechex((int) self::toDecimal($value))); - $hexVal = (PHP_INT_SIZE === 4 && strlen($value) === 10 && $value[0] >= '4') ? "FF{$hexVal}" : $hexVal; + $hexVal = \strtoupper(\dechex((int) self::toDecimal($value))); + $hexVal = (PHP_INT_SIZE === 4 && \strlen($value) === 10 && $value[0] >= '4') ? "FF{$hexVal}" : $hexVal; return self::nbrConversionFormat($hexVal, $places); } protected static function validateOctal(string $value): string { - $numDigits = (int) preg_match_all('/[01234567]/', $value); - if (strlen($value) > $numDigits || $numDigits > 10) { + $numDigits = (int) \preg_match_all('/[01234567]/', $value); + if (\strlen($value) > $numDigits || $numDigits > 10) { throw new Exception(ExcelError::NAN()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php index 8541a6c..03254c9 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php @@ -445,7 +445,7 @@ class ConvertUOM $conversionGroups[] = $conversionUnit['Group']; } - return array_merge(array_unique($conversionGroups)); + return \array_merge(\array_unique($conversionGroups)); } /** @@ -535,11 +535,11 @@ class ConvertUOM */ public static function CONVERT($value, $fromUOM, $toUOM) { - if (is_array($value) || is_array($fromUOM) || is_array($toUOM)) { + if (\is_array($value) || \is_array($fromUOM) || \is_array($toUOM)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $fromUOM, $toUOM); } - if (!is_numeric($value)) { + if (!\is_numeric($value)) { return ExcelError::VALUE(); } @@ -581,8 +581,8 @@ class ConvertUOM } // Check 1-character standard metric multiplier prefixes - $multiplierType = substr($uom, 0, 1); - $uom = substr($uom, 1); + $multiplierType = \substr($uom, 0, 1); + $uom = \substr($uom, 1); if (isset(self::$conversionUnits[$uom], self::$conversionMultipliers[$multiplierType])) { if (self::$conversionUnits[$uom]['AllowPrefix'] === false) { throw new Exception('Prefix not allowed for UoM'); @@ -592,8 +592,8 @@ class ConvertUOM return [$uom, $unitCategory, self::$conversionMultipliers[$multiplierType]['multiplier']]; } - $multiplierType .= substr($uom, 0, 1); - $uom = substr($uom, 1); + $multiplierType .= \substr($uom, 0, 1); + $uom = \substr($uom, 1); // Check 2-character standard metric multiplier prefixes if (isset(self::$conversionUnits[$uom], self::$conversionMultipliers[$multiplierType])) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/EngineeringValidations.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/EngineeringValidations.php index c0202ea..7a4d4f0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/EngineeringValidations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/EngineeringValidations.php @@ -12,7 +12,7 @@ class EngineeringValidations */ public static function validateFloat($value): float { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } @@ -24,10 +24,10 @@ class EngineeringValidations */ public static function validateInt($value): int { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } - return (int) floor((float) $value); + return (int) \floor((float) $value); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Erf.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Erf.php index 6254d47..2847a29 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Erf.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/Erf.php @@ -20,7 +20,7 @@ class Erf * Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments, * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was * improved, so that it can now calculate the function for both positive and negative ranges. - * PhpSpreadsheet follows Excel 2010 behaviour, and accepts negative arguments. + * PhpSpreadsheet follows Excel 2010 behavior, and accepts negative arguments. * * Excel Function: * ERF(lower[,upper]) @@ -37,15 +37,15 @@ class Erf */ public static function ERF($lower, $upper = null) { - if (is_array($lower) || is_array($upper)) { + if (\is_array($lower) || \is_array($upper)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $lower, $upper); } - if (is_numeric($lower)) { + if (\is_numeric($lower)) { if ($upper === null) { return self::erfValue($lower); } - if (is_numeric($upper)) { + if (\is_numeric($upper)) { return self::erfValue($upper) - self::erfValue($lower); } } @@ -70,7 +70,7 @@ class Erf */ public static function ERFPRECISE($limit) { - if (is_array($limit)) { + if (\is_array($limit)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $limit); } @@ -82,7 +82,7 @@ class Erf // public static function erfValue($value) { - if (abs($value) > 2.2) { + if (\abs($value) > 2.2) { return 1 - ErfC::ERFC($value); } $sum = $term = $value; @@ -98,7 +98,7 @@ class Erf if ($sum == 0.0) { break; } - } while (abs($term / $sum) > Functions::PRECISION); + } while (\abs($term / $sum) > Functions::PRECISION); return self::$twoSqrtPi * $sum; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ErfC.php b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ErfC.php index eb834b7..05c7bc0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ErfC.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Engineering/ErfC.php @@ -18,7 +18,7 @@ class ErfC * Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument, * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was * improved, so that it can now calculate the function for both positive and negative x values. - * PhpSpreadsheet follows Excel 2010 behaviour, and accepts nagative arguments. + * PhpSpreadsheet follows Excel 2010 behavior, and accepts nagative arguments. * * Excel Function: * ERFC(x) @@ -32,11 +32,11 @@ class ErfC */ public static function ERFC($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } - if (is_numeric($value)) { + if (\is_numeric($value)) { return self::erfcValue($value); } @@ -50,7 +50,7 @@ class ErfC private static function erfcValue($value) { - if (abs($value) < 2.2) { + if (\abs($value) < 2.2) { return 1 - Erf::erfValue($value); } if ($value < 0) { @@ -70,8 +70,8 @@ class ErfC $n += 0.5; $q1 = $q2; $q2 = $b / $d; - } while ((abs($q1 - $q2) / $q2) > Functions::PRECISION); + } while ((\abs($q1 - $q2) / $q2) > Functions::PRECISION); - return self::$oneSqrtPi * exp(-$value * $value) * $q2; + return self::$oneSqrtPi * \exp(-$value * $value) * $q2; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/ExceptionHandler.php b/PhpOffice/PhpSpreadsheet/Calculation/ExceptionHandler.php index 6461961..df54104 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/ExceptionHandler.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/ExceptionHandler.php @@ -11,7 +11,7 @@ class ExceptionHandler { /** @var callable */ $callable = [Exception::class, 'errorHandlerCallback']; - set_error_handler($callable, E_ALL); + \set_error_handler($callable, E_ALL); } /** @@ -19,6 +19,6 @@ class ExceptionHandler */ public function __destruct() { - restore_error_handler(); + \restore_error_handler(); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Amortization.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Amortization.php index 691ba40..b0cc729 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Amortization.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Amortization.php @@ -71,7 +71,7 @@ class Amortization } $yearFracx = DateTimeExcel\YearFrac::fraction($purchased, $firstPeriod, $basis); - if (is_string($yearFracx)) { + if (\is_string($yearFracx)) { return $yearFracx; } /** @var float */ @@ -80,19 +80,19 @@ class Amortization $amortiseCoeff = self::getAmortizationCoefficient($rate); $rate *= $amortiseCoeff; - $fNRate = round($yearFrac * $rate * $cost, 0); + $fNRate = \round($yearFrac * $rate * $cost, 0); $cost -= $fNRate; $fRest = $cost - $salvage; for ($n = 0; $n < $period; ++$n) { - $fNRate = round($rate * $cost, 0); + $fNRate = \round($rate * $cost, 0); $fRest -= $fNRate; if ($fRest < 0.0) { switch ($period - $n) { case 0: case 1: - return round($cost * 0.5, 0); + return \round($cost * 0.5, 0); default: return 0.0; } @@ -164,7 +164,7 @@ class Amortization // Note, quirky variation for leap years on the YEARFRAC for this function $purchasedYear = DateTimeExcel\DateParts::year($purchased); $yearFracx = DateTimeExcel\YearFrac::fraction($purchased, $firstPeriod, $basis); - if (is_string($yearFracx)) { + if (\is_string($yearFracx)) { return $yearFracx; } /** @var float */ diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic.php index a19c37f..1bc74e0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic.php @@ -191,8 +191,8 @@ class Periodic return ExcelError::NAN(); } - return log(($payment * (1 + $rate * $type) / $rate - $futureValue) / - ($presentValue + $payment * (1 + $rate * $type) / $rate)) / log(1 + $rate); + return \log(($payment * (1 + $rate * $type) / $rate - $futureValue) / + ($presentValue + $payment * (1 + $rate * $type) / $rate)) / \log(1 + $rate); } return (-$presentValue - $futureValue) / $payment; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Cumulative.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Cumulative.php index b7aaffd..d12abcc 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Cumulative.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Cumulative.php @@ -65,7 +65,7 @@ class Cumulative $interest = 0; for ($per = $start; $per <= $end; ++$per) { $ipmt = Interest::payment($rate, $per, $periods, $presentValue, 0, $type); - if (is_string($ipmt)) { + if (\is_string($ipmt)) { return $ipmt; } @@ -130,7 +130,7 @@ class Cumulative $principal = 0; for ($per = $start; $per <= $end; ++$per) { $ppmt = Payments::interestPayment($rate, $per, $periods, $presentValue, 0, $type); - if (is_string($ppmt)) { + if (\is_string($ppmt)) { return $ppmt; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Interest.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Interest.php index 4a82514..660ff9a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Interest.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Interest.php @@ -187,11 +187,11 @@ class Interest $iter = 0; while (!$close && $iter < self::FINANCIAL_MAX_ITERATIONS) { $nextdiff = self::rateNextGuess($rate, $numberOfPeriods, $payment, $presentValue, $futureValue, $type); - if (!is_numeric($nextdiff)) { + if (!\is_numeric($nextdiff)) { break; } $rate1 = $rate - $nextdiff; - $close = abs($rate1 - $rate) < self::FINANCIAL_PRECISION; + $close = \abs($rate1 - $rate) < self::FINANCIAL_PRECISION; ++$iter; $rate = $rate1; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Single.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Single.php index 058e89c..4aed32d 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Single.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Single.php @@ -71,7 +71,7 @@ class Single return ExcelError::NAN(); } - return (log($futureValue) - log($presentValue)) / log(1 + $rate); + return (\log($futureValue) - \log($presentValue)) / \log(1 + $rate); } /** diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php index 4441356..cc52e28 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php @@ -41,7 +41,7 @@ class NonPeriodic // create an initial range, with a root somewhere between 0 and guess $guess = Functions::flattenSingleValue($guess) ?? self::DEFAULT_GUESS; - if (!is_numeric($guess)) { + if (!\is_numeric($guess)) { return ExcelError::VALUE(); } $guess = ($guess + 0.0) ?: self::DEFAULT_GUESS; @@ -51,10 +51,10 @@ class NonPeriodic $f2 = self::xnpvOrdered($x2, $values, $dates, false); $found = false; for ($i = 0; $i < self::FINANCIAL_MAX_ITERATIONS; ++$i) { - if (!is_numeric($f1)) { + if (!\is_numeric($f1)) { return $f1; } - if (!is_numeric($f2)) { + if (!\is_numeric($f2)) { return $f2; } $f1 = (float) $f1; @@ -63,7 +63,7 @@ class NonPeriodic $found = true; break; - } elseif (abs($f1) < abs($f2)) { + } elseif (\abs($f1) < \abs($f2)) { $x1 += 1.6 * ($x1 - $x2); $f1 = self::xnpvOrdered($x1, $values, $dates, false); } else { @@ -81,7 +81,7 @@ class NonPeriodic for ($i = 0; $i < self::FINANCIAL_MAX_ITERATIONS; ++$i) { $f1 = self::xnpvOrdered($x1, $values, $dates, false, true); $f2 = self::xnpvOrdered($x2, $values, $dates, false, true); - if (!is_numeric($f1) || !is_numeric($f2)) { + if (!\is_numeric($f1) || !\is_numeric($f2)) { break; } if ($f1 * $f2 <= 0) { @@ -139,16 +139,16 @@ class NonPeriodic { $values = Functions::flattenArray($values); $dates = Functions::flattenArray($dates); - $valuesIsArray = count($values) > 1; - $datesIsArray = count($dates) > 1; + $valuesIsArray = \count($values) > 1; + $datesIsArray = \count($dates) > 1; if (!$valuesIsArray && !$datesIsArray) { return ExcelError::NA(); } - if (count($values) != count($dates)) { + if (\count($values) != \count($dates)) { return ExcelError::NAN(); } - $datesCount = count($dates); + $datesCount = \count($dates); for ($i = 0; $i < $datesCount; ++$i) { try { $dates[$i] = DateTimeExcel\Helpers::getDateValue($dates[$i]); @@ -162,12 +162,12 @@ class NonPeriodic private static function xirrPart2(array &$values): string { - $valCount = count($values); + $valCount = \count($values); $foundpos = false; $foundneg = false; for ($i = 0; $i < $valCount; ++$i) { $fld = $values[$i]; - if (!is_numeric($fld)) { + if (!\is_numeric($fld)) { return ExcelError::VALUE(); } elseif ($fld > 0) { $foundpos = true; @@ -204,7 +204,7 @@ class NonPeriodic if ($f_mid <= 0.0) { $rtb = $x_mid; } - if ((abs($f_mid) < self::FINANCIAL_PRECISION) || (abs($dx) < self::FINANCIAL_PRECISION)) { + if ((\abs($f_mid) < self::FINANCIAL_PRECISION) || (\abs($dx) < self::FINANCIAL_PRECISION)) { $rslt = $x_mid; break; @@ -224,12 +224,12 @@ class NonPeriodic $rslt = ExcelError::NAN(); $f1 = self::xnpvOrdered($x1, $values, $dates, false, true); $f2 = self::xnpvOrdered($x2, $values, $dates, false, true); - if (!is_numeric($f1) || !is_numeric($f2)) { + if (!\is_numeric($f1) || !\is_numeric($f2)) { break; } $f1 = (float) $f1; $f2 = (float) $f2; - if (abs($f1) < self::FINANCIAL_PRECISION && abs($f2) < self::FINANCIAL_PRECISION) { + if (\abs($f1) < self::FINANCIAL_PRECISION && \abs($f2) < self::FINANCIAL_PRECISION) { break; } if ($f1 * $f2 > 0) { @@ -237,7 +237,7 @@ class NonPeriodic } $rslt = ($x1 + $x2) / 2; $f3 = self::xnpvOrdered($rslt, $values, $dates, false, true); - if (!is_float($f3)) { + if (!\is_float($f3)) { break; } if ($f3 * $f1 < 0) { @@ -245,7 +245,7 @@ class NonPeriodic } else { $x1 = $rslt; } - if (abs($f3) < self::FINANCIAL_PRECISION) { + if (\abs($f3) < self::FINANCIAL_PRECISION) { break; } } @@ -265,7 +265,7 @@ class NonPeriodic $rate = Functions::flattenSingleValue($rate); $values = Functions::flattenArray($values); $dates = Functions::flattenArray($dates); - $valCount = count($values); + $valCount = \count($values); try { self::validateXnpv($rate, $values, $dates); @@ -279,7 +279,7 @@ class NonPeriodic $xnpv = 0.0; for ($i = 0; $i < $valCount; ++$i) { - if (!is_numeric($values[$i])) { + if (!\is_numeric($values[$i])) { return ExcelError::VALUE(); } @@ -293,17 +293,17 @@ class NonPeriodic } else { $dif = DateTimeExcel\Difference::interval($date0, $datei, 'd'); } - if (!is_numeric($dif)) { + if (!\is_numeric($dif)) { return $dif; } if ($rate <= -1.0) { - $xnpv += -abs($values[$i]) / (-1 - $rate) ** ($dif / 365); + $xnpv += -\abs($values[$i]) / (-1 - $rate) ** ($dif / 365); } else { $xnpv += $values[$i] / (1 + $rate) ** ($dif / 365); } } - return is_finite($xnpv) ? $xnpv : ExcelError::VALUE(); + return \is_finite($xnpv) ? $xnpv : ExcelError::VALUE(); } /** @@ -311,14 +311,14 @@ class NonPeriodic */ private static function validateXnpv($rate, array $values, array $dates): void { - if (!is_numeric($rate)) { + if (!\is_numeric($rate)) { throw new Exception(ExcelError::VALUE()); } - $valCount = count($values); - if ($valCount != count($dates)) { + $valCount = \count($values); + if ($valCount != \count($dates)) { throw new Exception(ExcelError::NAN()); } - if ($valCount > 1 && ((min($values) > 0) || (max($values) < 0))) { + if ($valCount > 1 && ((\min($values) > 0) || (\max($values) < 0))) { throw new Exception(ExcelError::NAN()); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/Periodic.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/Periodic.php index 545102f..546a6a0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/Periodic.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/Periodic.php @@ -33,7 +33,7 @@ class Periodic */ public static function rate($values, $guess = 0.1) { - if (!is_array($values)) { + if (!\is_array($values)) { return ExcelError::VALUE(); } $values = Functions::flattenArray($values); @@ -48,7 +48,7 @@ class Periodic if (($f1 * $f2) < 0.0) { break; } - if (abs($f1) < abs($f2)) { + if (\abs($f1) < \abs($f2)) { $f1 = self::presentValue($x1 += 1.6 * ($x1 - $x2), $values); } else { $f2 = self::presentValue($x2 += 1.6 * ($x2 - $x1), $values); @@ -74,7 +74,7 @@ class Periodic if ($f_mid <= 0.0) { $rtb = $x_mid; } - if ((abs($f_mid) < self::FINANCIAL_PRECISION) || (abs($dx) < self::FINANCIAL_PRECISION)) { + if ((\abs($f_mid) < self::FINANCIAL_PRECISION) || (\abs($dx) < self::FINANCIAL_PRECISION)) { return $x_mid; } } @@ -101,13 +101,13 @@ class Periodic */ public static function modifiedRate($values, $financeRate, $reinvestmentRate) { - if (!is_array($values)) { + if (!\is_array($values)) { return ExcelError::DIV0(); } $values = Functions::flattenArray($values); $financeRate = Functions::flattenSingleValue($financeRate); $reinvestmentRate = Functions::flattenSingleValue($reinvestmentRate); - $n = count($values); + $n = \count($values); $rr = 1.0 + $reinvestmentRate; $fr = 1.0 + $financeRate; @@ -128,7 +128,7 @@ class Periodic $mirr = ((-$npvPos * $rr ** $n) / ($npvNeg * ($rr))) ** (1.0 / ($n - 1)) - 1.0; - return is_finite($mirr) ? $mirr : ExcelError::NAN(); + return \is_finite($mirr) ? $mirr : ExcelError::NAN(); } /** @@ -155,10 +155,10 @@ class Periodic $aArgs = Functions::flattenArray($args); // Calculate - $countArgs = count($aArgs); + $countArgs = \count($aArgs); for ($i = 1; $i <= $countArgs; ++$i) { // Is it a numeric value? - if (is_numeric($aArgs[$i - 1])) { + if (\is_numeric($aArgs[$i - 1])) { $returnValue += $aArgs[$i - 1] / (1 + $rate) ** $i; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Coupons.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Coupons.php index 14c2d01..af7dcd9 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Coupons.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Coupons.php @@ -66,13 +66,13 @@ class Coupons } $daysPerYear = Helpers::daysPerYear(Functions::scalar(DateTimeExcel\DateParts::year($settlement)), $basis); - if (is_string($daysPerYear)) { + if (\is_string($daysPerYear)) { return ExcelError::VALUE(); } $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, self::PERIOD_DATE_PREVIOUS); if ($basis === FinancialConstants::BASIS_DAYS_PER_YEAR_ACTUAL) { - return abs((float) DateTimeExcel\Days::between($prev, $settlement)); + return \abs((float) DateTimeExcel\Days::between($prev, $settlement)); } return (float) DateTimeExcel\YearFrac::fraction($prev, $settlement, $basis) * $daysPerYear; @@ -327,7 +327,7 @@ class Coupons FinancialConstants::BASIS_DAYS_PER_YEAR_NASD ); - return (int) ceil((float) $yearsBetweenSettlementAndMaturity * $frequency); + return (int) \ceil((float) $yearsBetweenSettlementAndMaturity * $frequency); } /** @@ -385,12 +385,12 @@ class Coupons return self::couponFirstPeriodDate($settlement, $maturity, $frequency, self::PERIOD_DATE_PREVIOUS); } - private static function monthsDiff(DateTime $result, int $months, string $plusOrMinus, int $day, bool $lastDayFlag): void + private static function monthsDiff(\DateTime $result, int $months, string $plusOrMinus, int $day, bool $lastDayFlag): void { $result->setDate((int) $result->format('Y'), (int) $result->format('m'), 1); $result->modify("$plusOrMinus $months months"); $daysInMonth = (int) $result->format('t'); - $result->setDate((int) $result->format('Y'), (int) $result->format('m'), $lastDayFlag ? $daysInMonth : min($day, $daysInMonth)); + $result->setDate((int) $result->format('Y'), (int) $result->format('m'), $lastDayFlag ? $daysInMonth : \min($day, $daysInMonth)); } private static function couponFirstPeriodDate(float $settlement, float $maturity, int $frequency, bool $next): float diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Depreciation.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Depreciation.php index 8e1a2fc..a3cdd36 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Depreciation.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Depreciation.php @@ -60,7 +60,7 @@ class Depreciation // Set Fixed Depreciation Rate $fixedDepreciationRate = 1 - ($salvage / $cost) ** (1 / $life); - $fixedDepreciationRate = round($fixedDepreciationRate, 3); + $fixedDepreciationRate = \round($fixedDepreciationRate, 3); // Loop through each period calculating the depreciation // TODO Handle period value between 0 and 1 (e.g. 0.5) @@ -129,7 +129,7 @@ class Depreciation $previousDepreciation = 0; $depreciation = 0; for ($per = 1; $per <= $period; ++$per) { - $depreciation = min( + $depreciation = \min( ($cost - $previousDepreciation) * ($factor / $life), ($cost - $salvage - $previousDepreciation) ); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Dollar.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Dollar.php index b1f0d25..4ee7cd4 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Dollar.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Dollar.php @@ -53,7 +53,7 @@ class Dollar */ public static function decimal($fractionalDollar = null, $fraction = 0) { - if (is_array($fractionalDollar) || is_array($fraction)) { + if (\is_array($fractionalDollar) || \is_array($fraction)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $fractionalDollar, $fraction); } @@ -74,10 +74,10 @@ class Dollar return ExcelError::DIV0(); } - $dollars = ($fractionalDollar < 0) ? ceil($fractionalDollar) : floor($fractionalDollar); - $cents = fmod($fractionalDollar, 1.0); + $dollars = ($fractionalDollar < 0) ? \ceil($fractionalDollar) : \floor($fractionalDollar); + $cents = \fmod($fractionalDollar, 1.0); $cents /= $fraction; - $cents *= 10 ** ceil(log10($fraction)); + $cents *= 10 ** \ceil(\log10($fraction)); return $dollars + $cents; } @@ -101,7 +101,7 @@ class Dollar */ public static function fractional($decimalDollar = null, $fraction = 0) { - if (is_array($decimalDollar) || is_array($fraction)) { + if (\is_array($decimalDollar) || \is_array($fraction)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $decimalDollar, $fraction); } @@ -122,10 +122,10 @@ class Dollar return ExcelError::DIV0(); } - $dollars = ($decimalDollar < 0.0) ? ceil($decimalDollar) : floor($decimalDollar); - $cents = fmod($decimalDollar, 1); + $dollars = ($decimalDollar < 0.0) ? \ceil($decimalDollar) : \floor($decimalDollar); + $cents = \fmod($decimalDollar, 1); $cents *= $fraction; - $cents *= 10 ** (-ceil(log10($fraction))); + $cents *= 10 ** (-\ceil(\log10($fraction))); return $dollars + $cents; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/FinancialValidations.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/FinancialValidations.php index 1b04419..f39afcd 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/FinancialValidations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/FinancialValidations.php @@ -38,7 +38,7 @@ class FinancialValidations */ public static function validateFloat($value): float { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } @@ -50,11 +50,11 @@ class FinancialValidations */ public static function validateInt($value): int { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } - return (int) floor((float) $value); + return (int) \floor((float) $value); } /** @@ -92,7 +92,7 @@ class FinancialValidations */ public static function validateBasis($basis): int { - if (!is_numeric($basis)) { + if (!\is_numeric($basis)) { throw new Exception(ExcelError::VALUE()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Helpers.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Helpers.php index c7f1f46..2ae6911 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Helpers.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Helpers.php @@ -26,7 +26,7 @@ class Helpers */ public static function daysPerYear($year, $basis = 0) { - if (!is_numeric($basis)) { + if (!\is_numeric($basis)) { return ExcelError::NAN(); } @@ -49,9 +49,9 @@ class Helpers * * Returns a boolean TRUE/FALSE indicating if this date is the last date of the month * - * @param DateTimeInterface $date The date for testing + * @param \DateTimeInterface $date The date for testing */ - public static function isLastDayOfMonth(DateTimeInterface $date): bool + public static function isLastDayOfMonth(\DateTimeInterface $date): bool { return $date->format('d') === $date->format('t'); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php index e1bf04b..edd1a76 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php @@ -81,12 +81,12 @@ class AccruedInterest } $daysBetweenIssueAndSettlement = Functions::scalar(YearFrac::fraction($issue, $settlement, $basis)); - if (!is_numeric($daysBetweenIssueAndSettlement)) { + if (!\is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } $daysBetweenFirstInterestAndSettlement = Functions::scalar(YearFrac::fraction($firstInterest, $settlement, $basis)); - if (!is_numeric($daysBetweenFirstInterestAndSettlement)) { + if (!\is_numeric($daysBetweenFirstInterestAndSettlement)) { // return date error return $daysBetweenFirstInterestAndSettlement; } @@ -143,7 +143,7 @@ class AccruedInterest } $daysBetweenIssueAndSettlement = Functions::scalar(YearFrac::fraction($issue, $settlement, $basis)); - if (!is_numeric($daysBetweenIssueAndSettlement)) { + if (!\is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Price.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Price.php index de1748a..4b90bb7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Price.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Price.php @@ -136,7 +136,7 @@ class Price } $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } @@ -196,23 +196,23 @@ class Price } $daysPerYear = Functions::scalar(Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis)); - if (!is_numeric($daysPerYear)) { + if (!\is_numeric($daysPerYear)) { return $daysPerYear; } $daysBetweenIssueAndSettlement = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis)); - if (!is_numeric($daysBetweenIssueAndSettlement)) { + if (!\is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } $daysBetweenIssueAndSettlement *= $daysPerYear; $daysBetweenIssueAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis)); - if (!is_numeric($daysBetweenIssueAndMaturity)) { + if (!\is_numeric($daysBetweenIssueAndMaturity)) { // return date error return $daysBetweenIssueAndMaturity; } $daysBetweenIssueAndMaturity *= $daysPerYear; $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } @@ -274,7 +274,7 @@ class Price return ExcelError::NAN(); } $daysBetweenSettlementAndMaturity = DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php index f8d8673..18f51cf 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php @@ -65,7 +65,7 @@ class Rates } $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } @@ -128,7 +128,7 @@ class Rates } $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php index bb2e8ae..321be7c 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php @@ -58,11 +58,11 @@ class Yields } $daysPerYear = Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis); - if (!is_numeric($daysPerYear)) { + if (!\is_numeric($daysPerYear)) { return $daysPerYear; } $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } @@ -123,23 +123,23 @@ class Yields } $daysPerYear = Helpers::daysPerYear(DateTimeExcel\DateParts::year($settlement), $basis); - if (!is_numeric($daysPerYear)) { + if (!\is_numeric($daysPerYear)) { return $daysPerYear; } $daysBetweenIssueAndSettlement = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $settlement, $basis)); - if (!is_numeric($daysBetweenIssueAndSettlement)) { + if (!\is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } $daysBetweenIssueAndSettlement *= $daysPerYear; $daysBetweenIssueAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($issue, $maturity, $basis)); - if (!is_numeric($daysBetweenIssueAndMaturity)) { + if (!\is_numeric($daysBetweenIssueAndMaturity)) { // return date error return $daysBetweenIssueAndMaturity; } $daysBetweenIssueAndMaturity *= $daysPerYear; $daysBetweenSettlementAndMaturity = Functions::scalar(DateTimeExcel\YearFrac::fraction($settlement, $maturity, $basis)); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { + if (!\is_numeric($daysBetweenSettlementAndMaturity)) { // return date error return $daysBetweenSettlementAndMaturity; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/FormulaParser.php b/PhpOffice/PhpSpreadsheet/Calculation/FormulaParser.php index 14c5ae5..276acca 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/FormulaParser.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/FormulaParser.php @@ -71,7 +71,7 @@ class FormulaParser } // Initialise values - $this->formula = trim($formula); + $this->formula = \trim($formula); // Parse! $this->parseToTokens(); } @@ -107,7 +107,7 @@ class FormulaParser */ public function getTokenCount() { - return count($this->tokens); + return \count($this->tokens); } /** @@ -129,7 +129,7 @@ class FormulaParser // they can only exist if valid; stack overflows/underflows sunk as nulls without exceptions. // Check if the formula has a valid starting = - $formulaLength = strlen($this->formula); + $formulaLength = \strlen($this->formula); if ($formulaLength < 2 || $this->formula[0] != '=') { return; } @@ -207,7 +207,7 @@ class FormulaParser if ($inError) { $value .= $this->formula[$index]; ++$index; - if (in_array($value, $ERRORS)) { + if (\in_array($value, $ERRORS)) { $inError = false; $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND, FormulaToken::TOKEN_SUBTYPE_ERROR); $value = ''; @@ -217,9 +217,9 @@ class FormulaParser } // scientific notation check - if (strpos(self::OPERATORS_SN, $this->formula[$index]) !== false) { - if (strlen($value) > 1) { - if (preg_match('/^[1-9]{1}(\\.\\d+)?E{1}$/', $this->formula[$index]) != 0) { + if (\strpos(self::OPERATORS_SN, $this->formula[$index]) !== false) { + if (\strlen($value) > 1) { + if (\preg_match('/^[1-9]{1}(\\.\\d+)?E{1}$/', $this->formula[$index]) != 0) { $value .= $this->formula[$index]; ++$index; @@ -232,7 +232,7 @@ class FormulaParser // establish state-dependent character evaluations if ($this->formula[$index] == self::QUOTE_DOUBLE) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { // unexpected $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); $value = ''; @@ -244,7 +244,7 @@ class FormulaParser } if ($this->formula[$index] == self::QUOTE_SINGLE) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { // unexpected $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); $value = ''; @@ -264,7 +264,7 @@ class FormulaParser } if ($this->formula[$index] == self::ERROR_START) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { // unexpected $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); $value = ''; @@ -278,7 +278,7 @@ class FormulaParser // mark start and end of arrays and array rows if ($this->formula[$index] == self::BRACE_OPEN) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { // unexpected $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); $value = ''; @@ -298,12 +298,12 @@ class FormulaParser } if ($this->formula[$index] == self::SEMICOLON) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } - $tmp = array_pop($stack); + $tmp = \array_pop($stack); $tmp->setValue(''); $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); $tokens1[] = $tmp; @@ -321,17 +321,17 @@ class FormulaParser } if ($this->formula[$index] == self::BRACE_CLOSE) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } - $tmp = array_pop($stack); + $tmp = \array_pop($stack); $tmp->setValue(''); $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); $tokens1[] = $tmp; - $tmp = array_pop($stack); + $tmp = \array_pop($stack); $tmp->setValue(''); $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); $tokens1[] = $tmp; @@ -343,7 +343,7 @@ class FormulaParser // trim white-space if ($this->formula[$index] == self::WHITESPACE) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } @@ -358,12 +358,12 @@ class FormulaParser // multi-character comparators if (($index + 2) <= $formulaLength) { - if (in_array(substr($this->formula, $index, 2), $COMPARATORS_MULTI)) { - if (strlen($value) > 0) { + if (\in_array(\substr($this->formula, $index, 2), $COMPARATORS_MULTI)) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } - $tokens1[] = new FormulaToken(substr($this->formula, $index, 2), FormulaToken::TOKEN_TYPE_OPERATORINFIX, FormulaToken::TOKEN_SUBTYPE_LOGICAL); + $tokens1[] = new FormulaToken(\substr($this->formula, $index, 2), FormulaToken::TOKEN_TYPE_OPERATORINFIX, FormulaToken::TOKEN_SUBTYPE_LOGICAL); $index += 2; continue; @@ -371,8 +371,8 @@ class FormulaParser } // standard infix operators - if (strpos(self::OPERATORS_INFIX, $this->formula[$index]) !== false) { - if (strlen($value) > 0) { + if (\strpos(self::OPERATORS_INFIX, $this->formula[$index]) !== false) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } @@ -383,8 +383,8 @@ class FormulaParser } // standard postfix operators (only one) - if (strpos(self::OPERATORS_POSTFIX, $this->formula[$index]) !== false) { - if (strlen($value) > 0) { + if (\strpos(self::OPERATORS_POSTFIX, $this->formula[$index]) !== false) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } @@ -396,7 +396,7 @@ class FormulaParser // start subexpression or function if ($this->formula[$index] == self::PAREN_OPEN) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tmp = new FormulaToken($value, FormulaToken::TOKEN_TYPE_FUNCTION, FormulaToken::TOKEN_SUBTYPE_START); $tokens1[] = $tmp; $stack[] = clone $tmp; @@ -413,12 +413,12 @@ class FormulaParser // function, subexpression, or array parameters, or operand unions if ($this->formula[$index] == self::COMMA) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } - $tmp = array_pop($stack); + $tmp = \array_pop($stack); $tmp->setValue(''); $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); $stack[] = $tmp; @@ -435,12 +435,12 @@ class FormulaParser // stop subexpression if ($this->formula[$index] == self::PAREN_CLOSE) { - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); $value = ''; } - $tmp = array_pop($stack); + $tmp = \array_pop($stack); $tmp->setValue(''); $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); $tokens1[] = $tmp; @@ -456,12 +456,12 @@ class FormulaParser } // dump remaining accumulation - if (strlen($value) > 0) { + if (\strlen($value) > 0) { $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); } // move tokenList to new set, excluding unnecessary white-space tokens and converting necessary ones to intersections - $tokenCount = count($tokens1); + $tokenCount = \count($tokens1); for ($i = 0; $i < $tokenCount; ++$i) { $token = $tokens1[$i]; if (isset($tokens1[$i - 1])) { @@ -520,7 +520,7 @@ class FormulaParser // to noop when appropriate, identifying operand and infix-operator subtypes, and pulling "@" from function names $this->tokens = []; - $tokenCount = count($tokens2); + $tokenCount = \count($tokens2); for ($i = 0; $i < $tokenCount; ++$i) { $token = $tokens2[$i]; if (isset($tokens2[$i - 1])) { @@ -584,7 +584,7 @@ class FormulaParser $token->getTokenType() == FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_NOTHING ) { - if (strpos('<>=', substr($token->getValue(), 0, 1)) !== false) { + if (\strpos('<>=', \substr($token->getValue(), 0, 1)) !== false) { $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_LOGICAL); } elseif ($token->getValue() == '&') { $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_CONCATENATION); @@ -601,8 +601,8 @@ class FormulaParser $token->getTokenType() == FormulaToken::TOKEN_TYPE_OPERAND && $token->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_NOTHING ) { - if (!is_numeric($token->getValue())) { - if (strtoupper($token->getValue()) == 'TRUE' || strtoupper($token->getValue()) == 'FALSE') { + if (!\is_numeric($token->getValue())) { + if (\strtoupper($token->getValue()) == 'TRUE' || \strtoupper($token->getValue()) == 'FALSE') { $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_LOGICAL); } else { $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_RANGE); @@ -617,9 +617,9 @@ class FormulaParser } if ($token->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) { - if (strlen($token->getValue()) > 0) { - if (substr($token->getValue(), 0, 1) == '@') { - $token->setValue(substr($token->getValue(), 1)); + if (\strlen($token->getValue()) > 0) { + if (\substr($token->getValue(), 0, 1) == '@') { + $token->setValue(\substr($token->getValue(), 1)); } } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Functions.php b/PhpOffice/PhpSpreadsheet/Calculation/Functions.php index 747a1f4..5452632 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Functions.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Functions.php @@ -132,17 +132,17 @@ class Functions public static function isMatrixValue($idx) { - return (substr_count($idx, '.') <= 1) || (preg_match('/\.[A-Z]/', $idx) > 0); + return (\substr_count($idx, '.') <= 1) || (\preg_match('/\.[A-Z]/', $idx) > 0); } public static function isValue($idx) { - return substr_count($idx, '.') === 0; + return \substr_count($idx, '.') === 0; } public static function isCellValue($idx) { - return substr_count($idx, '.') > 1; + return \substr_count($idx, '.') > 1; } public static function ifCondition($condition) @@ -152,45 +152,45 @@ class Functions if ($condition === '') { return '=""'; } - if (!is_string($condition) || !in_array($condition[0], ['>', '<', '='], true)) { + if (!\is_string($condition) || !\in_array($condition[0], ['>', '<', '='], true)) { $condition = self::operandSpecialHandling($condition); - if (is_bool($condition)) { + if (\is_bool($condition)) { return '=' . ($condition ? 'TRUE' : 'FALSE'); - } elseif (!is_numeric($condition)) { + } elseif (!\is_numeric($condition)) { if ($condition !== '""') { // Not an empty string // Escape any quotes in the string value - $condition = (string) preg_replace('/"/ui', '""', $condition); + $condition = (string) \preg_replace('/"/ui', '""', $condition); } - $condition = Calculation::wrapResult(strtoupper($condition)); + $condition = Calculation::wrapResult(\strtoupper($condition)); } - return str_replace('""""', '""', '=' . $condition); + return \str_replace('""""', '""', '=' . $condition); } - preg_match('/(=|<[>=]?|>=?)(.*)/', $condition, $matches); + \preg_match('/(=|<[>=]?|>=?)(.*)/', $condition, $matches); [, $operator, $operand] = $matches; $operand = self::operandSpecialHandling($operand); - if (is_numeric(trim($operand, '"'))) { - $operand = trim($operand, '"'); - } elseif (!is_numeric($operand) && $operand !== 'FALSE' && $operand !== 'TRUE') { - $operand = str_replace('"', '""', $operand); - $operand = Calculation::wrapResult(strtoupper($operand)); + if (\is_numeric(\trim($operand, '"'))) { + $operand = \trim($operand, '"'); + } elseif (!\is_numeric($operand) && $operand !== 'FALSE' && $operand !== 'TRUE') { + $operand = \str_replace('"', '""', $operand); + $operand = Calculation::wrapResult(\strtoupper($operand)); } - return str_replace('""""', '""', $operator . $operand); + return \str_replace('""""', '""', $operator . $operand); } private static function operandSpecialHandling($operand) { - if (is_numeric($operand) || is_bool($operand)) { + if (\is_numeric($operand) || \is_bool($operand)) { return $operand; - } elseif (strtoupper($operand) === Calculation::getTRUE() || strtoupper($operand) === Calculation::getFALSE()) { - return strtoupper($operand); + } elseif (\strtoupper($operand) === Calculation::getTRUE() || \strtoupper($operand) === Calculation::getFALSE()) { + return \strtoupper($operand); } // Check for percentage - if (preg_match('/^\-?\d*\.?\d*\s?\%$/', $operand)) { - return ((float) rtrim($operand, '%')) / 100; + if (\preg_match('/^\-?\d*\.?\d*\s?\%$/', $operand)) { + return ((float) \rtrim($operand, '%')) / 100; } // Check for dates @@ -529,18 +529,18 @@ class Functions */ public static function flattenArray($array) { - if (!is_array($array)) { + if (!\is_array($array)) { return (array) $array; } $flattened = []; - $stack = array_values($array); + $stack = \array_values($array); while (!empty($stack)) { - $value = array_shift($stack); + $value = \array_shift($stack); - if (is_array($value)) { - array_unshift($stack, ...array_values($value)); + if (\is_array($value)) { + \array_unshift($stack, ...\array_values($value)); } else { $flattened[] = $value; } @@ -556,13 +556,13 @@ class Functions */ public static function scalar($value) { - if (!is_array($value)) { + if (!\is_array($value)) { return $value; } do { - $value = array_pop($value); - } while (is_array($value)); + $value = \array_pop($value); + } while (\is_array($value)); return $value; } @@ -576,15 +576,15 @@ class Functions */ public static function flattenArrayIndexed($array) { - if (!is_array($array)) { + if (!\is_array($array)) { return (array) $array; } $arrayValues = []; foreach ($array as $k1 => $value) { - if (is_array($value)) { + if (\is_array($value)) { foreach ($value as $k2 => $val) { - if (is_array($val)) { + if (\is_array($val)) { foreach ($val as $k3 => $v) { $arrayValues[$k1 . '.' . $k2 . '.' . $k3] = $v; } @@ -609,8 +609,8 @@ class Functions */ public static function flattenSingleValue($value = '') { - while (is_array($value)) { - $value = array_shift($value); + while (\is_array($value)) { + $value = \array_shift($value); } return $value; @@ -637,15 +637,15 @@ class Functions $worksheet = $cell->getWorksheet(); $spreadsheet = $worksheet->getParent(); // Uppercase coordinate - $pCoordinatex = strtoupper($coordinate); + $pCoordinatex = \strtoupper($coordinate); // Eliminate leading equal sign - $pCoordinatex = (string) preg_replace('/^=/', '', $pCoordinatex); + $pCoordinatex = (string) \preg_replace('/^=/', '', $pCoordinatex); $defined = $spreadsheet->getDefinedName($pCoordinatex, $worksheet); if ($defined !== null) { $worksheet2 = $defined->getWorkSheet(); if (!$defined->isFormula() && $worksheet2 !== null) { $coordinate = "'" . $worksheet2->getTitle() . "'!" . - (string) preg_replace('/^=/', '', str_replace('$', '', $defined->getValue())); + (string) \preg_replace('/^=/', '', \str_replace('$', '', $defined->getValue())); } } @@ -654,13 +654,13 @@ class Functions public static function trimTrailingRange(string $coordinate): string { - return (string) preg_replace('/:[\\w\$]+$/', '', $coordinate); + return (string) \preg_replace('/:[\\w\$]+$/', '', $coordinate); } public static function trimSheetFromCellReference(string $coordinate): string { - if (strpos($coordinate, '!') !== false) { - $coordinate = substr($coordinate, strrpos($coordinate, '!') + 1); + if (\strpos($coordinate, '!') !== false) { + $coordinate = \substr($coordinate, \strrpos($coordinate, '!') + 1); } return $coordinate; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Information/ErrorValue.php b/PhpOffice/PhpSpreadsheet/Calculation/Information/ErrorValue.php index 4b9f818..900ae4f 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Information/ErrorValue.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Information/ErrorValue.php @@ -20,7 +20,7 @@ class ErrorValue */ public static function isErr($value = '') { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -39,15 +39,15 @@ class ErrorValue */ public static function isError($value = '') { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } - if (!is_string($value)) { + if (!\is_string($value)) { return false; } - return in_array($value, ExcelError::ERROR_CODES, true); + return \in_array($value, ExcelError::ERROR_CODES, true); } /** @@ -62,7 +62,7 @@ class ErrorValue */ public static function isNa($value = '') { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Information/ExcelError.php b/PhpOffice/PhpSpreadsheet/Calculation/Information/ExcelError.php index 06f3866..d59dfbe 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Information/ExcelError.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Information/ExcelError.php @@ -46,7 +46,7 @@ class ExcelError */ public static function throwError($value): string { - return in_array($value, self::ERROR_CODES, true) ? $value : self::ERROR_CODES['value']; + return \in_array($value, self::ERROR_CODES, true) ? $value : self::ERROR_CODES['value']; } /** @@ -58,7 +58,7 @@ class ExcelError */ public static function type($value = '') { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Information/Value.php b/PhpOffice/PhpSpreadsheet/Calculation/Information/Value.php index 2e524db..29809b3 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Information/Value.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Information/Value.php @@ -26,7 +26,7 @@ class Value */ public static function isBlank($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -47,7 +47,7 @@ class Value } $cellValue = Functions::trimTrailingRange($value); - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/ui', $cellValue) === 1) { + if (\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/ui', $cellValue) === 1) { [$worksheet, $cellValue] = Worksheet::extractSheetTitle($cellValue, true); if (!empty($worksheet) && $cell->getWorksheet()->getParent()->getSheetByName($worksheet) === null) { return false; @@ -77,17 +77,17 @@ class Value */ public static function isEven($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } if ($value === null) { return ExcelError::NAME(); - } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) { + } elseif ((\is_bool($value)) || ((\is_string($value)) && (!\is_numeric($value)))) { return ExcelError::VALUE(); } - return ((int) fmod($value, 2)) === 0; + return ((int) \fmod($value, 2)) === 0; } /** @@ -102,17 +102,17 @@ class Value */ public static function isOdd($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } if ($value === null) { return ExcelError::NAME(); - } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) { + } elseif ((\is_bool($value)) || ((\is_string($value)) && (!\is_numeric($value)))) { return ExcelError::VALUE(); } - return ((int) fmod($value, 2)) !== 0; + return ((int) \fmod($value, 2)) !== 0; } /** @@ -127,15 +127,15 @@ class Value */ public static function isNumber($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } - if (is_string($value)) { + if (\is_string($value)) { return false; } - return is_numeric($value); + return \is_numeric($value); } /** @@ -150,11 +150,11 @@ class Value */ public static function isLogical($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } - return is_bool($value); + return \is_bool($value); } /** @@ -169,11 +169,11 @@ class Value */ public static function isText($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } - return is_string($value) && !ErrorValue::isError($value); + return \is_string($value) && !ErrorValue::isError($value); } /** @@ -188,7 +188,7 @@ class Value */ public static function isNonText($value = null) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -211,20 +211,20 @@ class Value $fullCellReference = Functions::expandDefinedName((string) $cellReference, $cell); - if (strpos($cellReference, '!') !== false) { + if (\strpos($cellReference, '!') !== false) { $cellReference = Functions::trimSheetFromCellReference($cellReference); $cellReferences = Coordinate::extractAllCellReferencesInRange($cellReference); - if (count($cellReferences) > 1) { + if (\count($cellReferences) > 1) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $cellReferences, $cell); } } $fullCellReference = Functions::trimTrailingRange($fullCellReference); - preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $fullCellReference, $matches); + \preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $fullCellReference, $matches); $fullCellReference = $matches[6] . $matches[7]; - $worksheetName = str_replace("''", "'", trim($matches[2], "'")); + $worksheetName = \str_replace("''", "'", \trim($matches[2], "'")); $worksheet = (!empty($worksheetName)) ? $cell->getWorksheet()->getParent()->getSheetByName($worksheetName) @@ -251,11 +251,11 @@ class Value */ public static function asNumber($value = null) { - while (is_array($value)) { - $value = array_shift($value); + while (\is_array($value)) { + $value = \array_shift($value); } - switch (gettype($value)) { + switch (\gettype($value)) { case 'double': case 'float': case 'integer': @@ -264,7 +264,7 @@ class Value return (int) $value; case 'string': // Errors - if ((strlen($value) > 0) && ($value[0] == '#')) { + if ((\strlen($value) > 0) && ($value[0] == '#')) { return $value; } @@ -292,9 +292,9 @@ class Value public static function type($value = null) { $value = Functions::flattenArrayIndexed($value); - if (is_array($value) && (count($value) > 1)) { - end($value); - $a = key($value); + if (\is_array($value) && (\count($value) > 1)) { + \end($value); + $a = \key($value); // Range of cells is an error if (Functions::isCellValue($a)) { return 16; @@ -308,15 +308,15 @@ class Value } $value = Functions::flattenSingleValue($value); - if (($value === null) || (is_float($value)) || (is_int($value))) { + if (($value === null) || (\is_float($value)) || (\is_int($value))) { return 1; - } elseif (is_bool($value)) { + } elseif (\is_bool($value)) { return 4; - } elseif (is_array($value)) { + } elseif (\is_array($value)) { return 64; - } elseif (is_string($value)) { + } elseif (\is_string($value)) { // Errors - if ((strlen($value) > 0) && ($value[0] == '#')) { + if ((\strlen($value) > 0) && ($value[0] == '#')) { return 16; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php b/PhpOffice/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php index 371ad8b..cc6ee67 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php @@ -25,7 +25,7 @@ class WildcardMatch public static function wildcard(string $wildcard): string { // Preg Escape the wildcard, but protecting the Excel * and ? search characters - return str_replace(self::SEARCH_SET, self::REPLACEMENT_SET, preg_quote($wildcard, '/')); + return \str_replace(self::SEARCH_SET, self::REPLACEMENT_SET, \preg_quote($wildcard, '/')); } public static function compare(?string $value, string $wildcard): bool @@ -34,6 +34,6 @@ class WildcardMatch return false; } - return (bool) preg_match("/^{$wildcard}\$/mui", $value); + return (bool) \preg_match("/^{$wildcard}\$/mui", $value); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Logical/Conditional.php b/PhpOffice/PhpSpreadsheet/Calculation/Logical/Conditional.php index 55d5f32..e6cefbe 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Logical/Conditional.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Logical/Conditional.php @@ -90,10 +90,10 @@ class Conditional { $result = ExcelError::VALUE(); - if (count($arguments) > 0) { + if (\count($arguments) > 0) { $targetValue = Functions::flattenSingleValue($arguments[0]); - $argc = count($arguments) - 1; - $switchCount = floor($argc / 2); + $argc = \count($arguments) - 1; + $switchCount = \floor($argc / 2); $hasDefaultClause = $argc % 2 !== 0; $defaultClause = $argc % 2 === 0 ? null : $arguments[$argc]; @@ -134,7 +134,7 @@ class Conditional */ public static function IFERROR($testValue = '', $errorpart = '') { - if (is_array($testValue)) { + if (\is_array($testValue)) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $testValue, $errorpart); } @@ -161,7 +161,7 @@ class Conditional */ public static function IFNA($testValue = '', $napart = '') { - if (is_array($testValue)) { + if (\is_array($testValue)) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $testValue, $napart); } @@ -189,7 +189,7 @@ class Conditional */ public static function IFS(...$arguments) { - $argumentCount = count($arguments); + $argumentCount = \count($arguments); if ($argumentCount % 2 != 0) { return ExcelError::NA(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Logical/Operations.php b/PhpOffice/PhpSpreadsheet/Calculation/Logical/Operations.php index 2e2faa1..39e264a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Logical/Operations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Logical/Operations.php @@ -35,19 +35,19 @@ class Operations { $args = Functions::flattenArray($args); - if (count($args) == 0) { + if (\count($args) == 0) { return ExcelError::VALUE(); } - $args = array_filter($args, function ($value) { - return $value !== null || (is_string($value) && trim($value) == ''); + $args = \array_filter($args, function ($value) { + return $value !== null || (\is_string($value) && \trim($value) == ''); }); $returnValue = self::countTrueValues($args); - if (is_string($returnValue)) { + if (\is_string($returnValue)) { return $returnValue; } - $argCount = count($args); + $argCount = \count($args); return ($returnValue > 0) && ($returnValue == $argCount); } @@ -76,16 +76,16 @@ class Operations { $args = Functions::flattenArray($args); - if (count($args) == 0) { + if (\count($args) == 0) { return ExcelError::VALUE(); } - $args = array_filter($args, function ($value) { - return $value !== null || (is_string($value) && trim($value) == ''); + $args = \array_filter($args, function ($value) { + return $value !== null || (\is_string($value) && \trim($value) == ''); }); $returnValue = self::countTrueValues($args); - if (is_string($returnValue)) { + if (\is_string($returnValue)) { return $returnValue; } @@ -118,16 +118,16 @@ class Operations { $args = Functions::flattenArray($args); - if (count($args) == 0) { + if (\count($args) == 0) { return ExcelError::VALUE(); } - $args = array_filter($args, function ($value) { - return $value !== null || (is_string($value) && trim($value) == ''); + $args = \array_filter($args, function ($value) { + return $value !== null || (\is_string($value) && \trim($value) == ''); }); $returnValue = self::countTrueValues($args); - if (is_string($returnValue)) { + if (\is_string($returnValue)) { return $returnValue; } @@ -158,12 +158,12 @@ class Operations */ public static function NOT($logical = false) { - if (is_array($logical)) { + if (\is_array($logical)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $logical); } - if (is_string($logical)) { - $logical = mb_strtoupper($logical, 'UTF-8'); + if (\is_string($logical)) { + $logical = \mb_strtoupper($logical, 'UTF-8'); if (($logical == 'TRUE') || ($logical == Calculation::getTRUE())) { return false; } elseif (($logical == 'FALSE') || ($logical == Calculation::getFALSE())) { @@ -185,12 +185,12 @@ class Operations foreach ($args as $arg) { // Is it a boolean value? - if (is_bool($arg)) { + if (\is_bool($arg)) { $trueValueCount += $arg; - } elseif ((is_numeric($arg)) && (!is_string($arg))) { + } elseif ((\is_numeric($arg)) && (!\is_string($arg))) { $trueValueCount += ((int) $arg != 0); - } elseif (is_string($arg)) { - $arg = mb_strtoupper($arg, 'UTF-8'); + } elseif (\is_string($arg)) { + $arg = \mb_strtoupper($arg, 'UTF-8'); if (($arg == 'TRUE') || ($arg == Calculation::getTRUE())) { $arg = true; } elseif (($arg == 'FALSE') || ($arg == Calculation::getFALSE())) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Address.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Address.php index 0d2db8b..49bfde1 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Address.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Address.php @@ -51,8 +51,8 @@ class Address public static function cell($row, $column, $relativity = 1, $referenceStyle = true, $sheetName = '') { if ( - is_array($row) || is_array($column) || - is_array($relativity) || is_array($referenceStyle) || is_array($sheetName) + \is_array($row) || \is_array($column) || + \is_array($relativity) || \is_array($referenceStyle) || \is_array($sheetName) ) { return self::evaluateArrayArguments( [self::class, __FUNCTION__], @@ -73,10 +73,10 @@ class Address $sheetName = self::sheetName($sheetName); - if (is_int($referenceStyle)) { + if (\is_int($referenceStyle)) { $referenceStyle = (bool) $referenceStyle; } - if ((!is_bool($referenceStyle)) || $referenceStyle === self::REFERENCE_STYLE_A1) { + if ((!\is_bool($referenceStyle)) || $referenceStyle === self::REFERENCE_STYLE_A1) { return self::formatAsA1($row, $column, $relativity, $sheetName); } @@ -86,7 +86,7 @@ class Address private static function sheetName(string $sheetName) { if ($sheetName > '') { - if (strpos($sheetName, ' ') !== false || strpos($sheetName, '[') !== false) { + if (\strpos($sheetName, ' ') !== false || \strpos($sheetName, '[') !== false) { $sheetName = "'{$sheetName}'"; } $sheetName .= '!'; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php index e09477c..cc284d1 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php @@ -34,7 +34,7 @@ class ExcelMatch */ public static function MATCH($lookupValue, $lookupArray, $matchType = self::MATCHTYPE_LARGEST_VALUE) { - if (is_array($lookupValue)) { + if (\is_array($lookupValue)) { return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $lookupValue, $lookupArray, $matchType); } @@ -46,11 +46,11 @@ class ExcelMatch $matchType = self::validateMatchType($matchType); self::validateLookupArray($lookupArray); - $keySet = array_keys($lookupArray); + $keySet = \array_keys($lookupArray); if ($matchType == self::MATCHTYPE_LARGEST_VALUE) { // If match_type is 1 the list has to be processed from last to first - $lookupArray = array_reverse($lookupArray); - $keySet = array_reverse($keySet); + $lookupArray = \array_reverse($lookupArray); + $keySet = \array_reverse($keySet); } $lookupArray = self::prepareLookupArray($lookupArray, $matchType); @@ -59,7 +59,7 @@ class ExcelMatch } // MATCH() is not case sensitive, so we convert lookup value to be lower cased if it's a string type. - if (is_string($lookupValue)) { + if (\is_string($lookupValue)) { $lookupValue = StringHelper::strToLower($lookupValue); } @@ -93,7 +93,7 @@ class ExcelMatch */ private static function matchFirstValue(array $lookupArray, $lookupValue) { - if (is_string($lookupValue)) { + if (\is_string($lookupValue)) { $valueIsString = true; $wildcard = WildcardMatch::wildcard($lookupValue); } else { @@ -101,11 +101,11 @@ class ExcelMatch $wildcard = ''; } - $valueIsNumeric = is_int($lookupValue) || is_float($lookupValue); + $valueIsNumeric = \is_int($lookupValue) || \is_float($lookupValue); foreach ($lookupArray as $i => $lookupArrayValue) { if ( $valueIsString - && is_string($lookupArrayValue) + && \is_string($lookupArrayValue) ) { if (WildcardMatch::compare($lookupArrayValue, $wildcard)) { return $i; // wildcard match @@ -116,7 +116,7 @@ class ExcelMatch } if ( $valueIsNumeric - && (is_float($lookupArrayValue) || is_int($lookupArrayValue)) + && (\is_float($lookupArrayValue) || \is_int($lookupArrayValue)) && $lookupArrayValue == $lookupValue ) { return $i; // exact match @@ -134,11 +134,11 @@ class ExcelMatch */ private static function matchLargestValue(array $lookupArray, $lookupValue, array $keySet) { - if (is_string($lookupValue)) { + if (\is_string($lookupValue)) { if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE) { $wildcard = WildcardMatch::wildcard($lookupValue); - foreach (array_reverse($lookupArray) as $i => $lookupArrayValue) { - if (is_string($lookupArrayValue) && WildcardMatch::compare($lookupArrayValue, $wildcard)) { + foreach (\array_reverse($lookupArray) as $i => $lookupArrayValue) { + if (\is_string($lookupArrayValue) && WildcardMatch::compare($lookupArrayValue, $wildcard)) { return $i; } } @@ -150,16 +150,16 @@ class ExcelMatch } } } - $valueIsNumeric = is_int($lookupValue) || is_float($lookupValue); + $valueIsNumeric = \is_int($lookupValue) || \is_float($lookupValue); foreach ($lookupArray as $i => $lookupArrayValue) { - if ($valueIsNumeric && (is_int($lookupArrayValue) || is_float($lookupArrayValue))) { + if ($valueIsNumeric && (\is_int($lookupArrayValue) || \is_float($lookupArrayValue))) { if ($lookupArrayValue <= $lookupValue) { - return array_search($i, $keySet); + return \array_search($i, $keySet); } } - $typeMatch = gettype($lookupValue) === gettype($lookupArrayValue); + $typeMatch = \gettype($lookupValue) === \gettype($lookupArrayValue); if ($typeMatch && ($lookupArrayValue <= $lookupValue)) { - return array_search($i, $keySet); + return \array_search($i, $keySet); } } @@ -174,24 +174,24 @@ class ExcelMatch private static function matchSmallestValue(array $lookupArray, $lookupValue) { $valueKey = null; - if (is_string($lookupValue)) { + if (\is_string($lookupValue)) { if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE) { $wildcard = WildcardMatch::wildcard($lookupValue); foreach ($lookupArray as $i => $lookupArrayValue) { - if (is_string($lookupArrayValue) && WildcardMatch::compare($lookupArrayValue, $wildcard)) { + if (\is_string($lookupArrayValue) && WildcardMatch::compare($lookupArrayValue, $wildcard)) { return $i; } } } } - $valueIsNumeric = is_int($lookupValue) || is_float($lookupValue); + $valueIsNumeric = \is_int($lookupValue) || \is_float($lookupValue); // The basic algorithm is: // Iterate and keep the highest match until the next element is smaller than the searched value. // Return immediately if perfect match is found foreach ($lookupArray as $i => $lookupArrayValue) { - $typeMatch = gettype($lookupValue) === gettype($lookupArrayValue); - $bothNumeric = $valueIsNumeric && (is_int($lookupArrayValue) || is_float($lookupArrayValue)); + $typeMatch = \gettype($lookupValue) === \gettype($lookupArrayValue); + $bothNumeric = $valueIsNumeric && (\is_int($lookupArrayValue) || \is_float($lookupArrayValue)); if ($lookupArrayValue === $lookupValue) { // Another "special" case. If a perfect match is found, @@ -218,7 +218,7 @@ class ExcelMatch private static function validateLookupValue($lookupValue): void { // Lookup_value type has to be number, text, or logical values - if ((!is_numeric($lookupValue)) && (!is_string($lookupValue)) && (!is_bool($lookupValue))) { + if ((!\is_numeric($lookupValue)) && (!\is_string($lookupValue)) && (!\is_bool($lookupValue))) { throw new Exception(ExcelError::NA()); } } @@ -232,7 +232,7 @@ class ExcelMatch // However Excel accepts other numeric values, // including numeric strings and floats. // It seems to just be interested in the sign. - if (!is_numeric($matchType)) { + if (!\is_numeric($matchType)) { throw new Exception(ExcelError::Value()); } if ($matchType > 0) { @@ -248,7 +248,7 @@ class ExcelMatch private static function validateLookupArray(array $lookupArray): void { // Lookup_array should not be empty - $lookupArraySize = count($lookupArray); + $lookupArraySize = \count($lookupArray); if ($lookupArraySize <= 0) { throw new Exception(ExcelError::NA()); } @@ -262,11 +262,11 @@ class ExcelMatch // Lookup_array should contain only number, text, or logical values, or empty (null) cells foreach ($lookupArray as $i => $value) { // check the type of the value - if ((!is_numeric($value)) && (!is_string($value)) && (!is_bool($value)) && ($value !== null)) { + if ((!\is_numeric($value)) && (!\is_string($value)) && (!\is_bool($value)) && ($value !== null)) { throw new Exception(ExcelError::NA()); } // Convert strings to lowercase for case-insensitive testing - if (is_string($value)) { + if (\is_string($value)) { $lookupArray[$i] = StringHelper::strToLower($value); } if ( diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Filter.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Filter.php index 74fa832..4c94032 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Filter.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Filter.php @@ -15,7 +15,7 @@ class Filter */ public static function filter($lookupArray, $matchArray, $ifEmpty = null) { - if (!is_array($matchArray)) { + if (!\is_array($matchArray)) { return ExcelError::VALUE(); } @@ -29,29 +29,29 @@ class Filter return $ifEmpty ?? ExcelError::CALC(); } - return array_values(array_map('array_values', $result)); + return \array_values(\array_map('array_values', $result)); } private static function enumerateArrayKeys(array $sortArray): array { - array_walk( + \array_walk( $sortArray, function (&$columns): void { - if (is_array($columns)) { - $columns = array_values($columns); + if (\is_array($columns)) { + $columns = \array_values($columns); } } ); - return array_values($sortArray); + return \array_values($sortArray); } private static function filterByRow(array $lookupArray, array $matchArray): array { - $matchArray = array_values(array_column($matchArray, 0)); + $matchArray = \array_values(\array_column($matchArray, 0)); - return array_filter( - array_values($lookupArray), + return \array_filter( + \array_values($lookupArray), function ($index) use ($matchArray): bool { return (bool) $matchArray[$index]; }, @@ -63,11 +63,11 @@ class Filter { $lookupArray = Matrix::transpose($lookupArray); - if (count($matchArray) === 1) { - $matchArray = array_pop($matchArray); + if (\count($matchArray) === 1) { + $matchArray = \array_pop($matchArray); } - array_walk( + \array_walk( $matchArray, function (&$value): void { $value = [$value]; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Formula.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Formula.php index 834fe52..dcc9952 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Formula.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Formula.php @@ -22,10 +22,10 @@ class Formula return ExcelError::REF(); } - preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $cellReference, $matches); + \preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $cellReference, $matches); $cellReference = $matches[6] . $matches[7]; - $worksheetName = trim($matches[3], "'"); + $worksheetName = \trim($matches[3], "'"); $worksheet = (!empty($worksheetName)) ? $cell->getWorksheet()->getParent()->getSheetByName($worksheetName) : $cell->getWorksheet(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/HLookup.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/HLookup.php index e2d27bd..80ed5da 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/HLookup.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/HLookup.php @@ -27,7 +27,7 @@ class HLookup extends LookupBase */ public static function lookup($lookupValue, $lookupArray, $indexNumber, $notExactMatch = true) { - if (is_array($lookupValue)) { + if (\is_array($lookupValue)) { return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $lookupValue, $lookupArray, $indexNumber, $notExactMatch); } @@ -41,15 +41,15 @@ class HLookup extends LookupBase return $e->getMessage(); } - $f = array_keys($lookupArray); - $firstRow = reset($f); - if ((!is_array($lookupArray[$firstRow])) || ($indexNumber > count($lookupArray))) { + $f = \array_keys($lookupArray); + $firstRow = \reset($f); + if ((!\is_array($lookupArray[$firstRow])) || ($indexNumber > \count($lookupArray))) { return ExcelError::REF(); } $firstkey = $f[0] - 1; $returnColumn = $firstkey + $indexNumber; - $firstColumn = array_shift($f) ?? 1; + $firstColumn = \array_shift($f) ?? 1; $rowNumber = self::hLookupSearch($lookupValue, $lookupArray, $firstColumn, $notExactMatch); if ($rowNumber !== null) { @@ -71,8 +71,8 @@ class HLookup extends LookupBase $rowNumber = null; foreach ($lookupArray[$column] as $rowKey => $rowData) { // break if we have passed possible keys - $bothNumeric = is_numeric($lookupValue) && is_numeric($rowData); - $bothNotNumeric = !is_numeric($lookupValue) && !is_numeric($rowData); + $bothNumeric = \is_numeric($lookupValue) && \is_numeric($rowData); + $bothNotNumeric = !\is_numeric($lookupValue) && !\is_numeric($rowData); $cellDataLower = StringHelper::strToLower((string) $rowData); if ( @@ -98,12 +98,12 @@ class HLookup extends LookupBase private static function convertLiteralArray(array $lookupArray): array { - if (array_key_exists(0, $lookupArray)) { + if (\array_key_exists(0, $lookupArray)) { $lookupArray2 = []; $row = 0; foreach ($lookupArray as $arrayVal) { ++$row; - if (!is_array($arrayVal)) { + if (!\is_array($arrayVal)) { $arrayVal = [$arrayVal]; } $arrayVal2 = []; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Helpers.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Helpers.php index 76a194b..b21d210 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Helpers.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Helpers.php @@ -29,7 +29,7 @@ class Helpers { if ($sheetTitle) { $sheetTitle .= '!'; - if (stripos($value ?? '', $sheetTitle) === 0) { + if (\stripos($value ?? '', $sheetTitle) === 0) { $sheetTitle = ''; } } @@ -43,14 +43,14 @@ class Helpers if ($namedRange !== null) { $workSheet = $namedRange->getWorkSheet(); $sheetTitle = ($workSheet === null) ? '' : $workSheet->getTitle(); - $value = (string) preg_replace('/^=/', '', $namedRange->getValue()); + $value = (string) \preg_replace('/^=/', '', $namedRange->getValue()); self::adjustSheetTitle($sheetTitle, $value); $cellAddress1 = $sheetTitle . $value; $cellAddress = $cellAddress1; $a1 = self::CELLADDRESS_USE_A1; } - if (strpos($cellAddress, ':') !== false) { - [$cellAddress1, $cellAddress2] = explode(':', $cellAddress); + if (\strpos($cellAddress, ':') !== false) { + [$cellAddress1, $cellAddress2] = \explode(':', $cellAddress); } $cellAddress = self::convertR1C1($cellAddress1, $cellAddress2, $a1, $baseRow, $baseCol); @@ -60,9 +60,9 @@ class Helpers public static function extractWorksheet(string $cellAddress, Cell $cell): array { $sheetName = ''; - if (strpos($cellAddress, '!') !== false) { + if (\strpos($cellAddress, '!') !== false) { [$sheetName, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - $sheetName = trim($sheetName, "'"); + $sheetName = \trim($sheetName, "'"); } $worksheet = ($sheetName !== '') diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php index 5387833..2ac4f82 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php @@ -25,11 +25,11 @@ class Hyperlink $linkURL = ($linkURL === null) ? '' : Functions::flattenSingleValue($linkURL); $displayName = ($displayName === null) ? '' : Functions::flattenSingleValue($displayName); - if ((!is_object($cell)) || (trim($linkURL) == '')) { + if ((!\is_object($cell)) || (\trim($linkURL) == '')) { return ExcelError::REF(); } - if ((is_object($displayName)) || trim($displayName) == '') { + if ((\is_object($displayName)) || \trim($displayName) == '') { $displayName = $linkURL; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Indirect.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Indirect.php index bd76ce9..9217451 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Indirect.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Indirect.php @@ -25,8 +25,8 @@ class Indirect if ($a1fmt === null) { return Helpers::CELLADDRESS_USE_A1; } - if (is_string($a1fmt)) { - throw new Exception(ExcelError::VALUE()); + if (\is_string($a1fmt)) { + throw new \Exception(ExcelError::VALUE()); } return (bool) $a1fmt; @@ -40,8 +40,8 @@ class Indirect private static function validateAddress($cellAddress): string { $cellAddress = Functions::flattenSingleValue($cellAddress); - if (!is_string($cellAddress) || !$cellAddress) { - throw new Exception(ExcelError::REF()); + if (!\is_string($cellAddress) || !$cellAddress) { + throw new \Exception(ExcelError::REF()); } return $cellAddress; @@ -70,27 +70,27 @@ class Indirect try { $a1 = self::a1Format($a1fmt); $cellAddress = self::validateAddress($cellAddress); - } catch (Exception $e) { + } catch (\Exception $e) { return $e->getMessage(); } [$cellAddress, $worksheet, $sheetName] = Helpers::extractWorksheet($cellAddress, $cell); - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_COLUMNRANGE_RELATIVE . '$/miu', $cellAddress, $matches)) { - $cellAddress = self::handleRowColumnRanges($worksheet, ...explode(':', $cellAddress)); - } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_ROWRANGE_RELATIVE . '$/miu', $cellAddress, $matches)) { - $cellAddress = self::handleRowColumnRanges($worksheet, ...explode(':', $cellAddress)); + if (\preg_match('/^' . Calculation::CALCULATION_REGEXP_COLUMNRANGE_RELATIVE . '$/miu', $cellAddress, $matches)) { + $cellAddress = self::handleRowColumnRanges($worksheet, ...\explode(':', $cellAddress)); + } elseif (\preg_match('/^' . Calculation::CALCULATION_REGEXP_ROWRANGE_RELATIVE . '$/miu', $cellAddress, $matches)) { + $cellAddress = self::handleRowColumnRanges($worksheet, ...\explode(':', $cellAddress)); } try { [$cellAddress1, $cellAddress2, $cellAddress] = Helpers::extractCellAddresses($cellAddress, $a1, $cell->getWorkSheet(), $sheetName, $baseRow, $baseCol); - } catch (Exception $e) { + } catch (\Exception $e) { return ExcelError::REF(); } if ( - (!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $cellAddress1, $matches)) || - (($cellAddress2 !== null) && (!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $cellAddress2, $matches))) + (!\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $cellAddress1, $matches)) || + (($cellAddress2 !== null) && (!\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $cellAddress2, $matches))) ) { return ExcelError::REF(); } @@ -113,12 +113,12 @@ class Indirect private static function handleRowColumnRanges(?Worksheet $worksheet, string $start, string $end): string { // Being lazy, we're only checking a single row/column to get the max - if (ctype_digit($start) && $start <= 1048576) { + if (\ctype_digit($start) && $start <= 1048576) { // Max 16,384 columns for Excel2007 $endColRef = ($worksheet !== null) ? $worksheet->getHighestDataColumn((int) $start) : AddressRange::MAX_COLUMN; return "A{$start}:{$endColRef}{$end}"; - } elseif (ctype_alpha($start) && strlen($start) <= 3) { + } elseif (\ctype_alpha($start) && \strlen($start) <= 3) { // Max 1,048,576 rows for Excel2007 $endRowRef = ($worksheet !== null) ? $worksheet->getHighestDataRow($start) : AddressRange::MAX_ROW; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Lookup.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Lookup.php index 76a360b..3859fa3 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Lookup.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Lookup.php @@ -22,11 +22,11 @@ class Lookup */ public static function lookup($lookupValue, $lookupVector, $resultVector = null) { - if (is_array($lookupValue)) { + if (\is_array($lookupValue)) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $lookupValue, $lookupVector, $resultVector); } - if (!is_array($lookupVector)) { + if (!\is_array($lookupVector)) { return ExcelError::NA(); } $hasResultVector = isset($resultVector); @@ -42,8 +42,8 @@ class Lookup $resultVector = self::verifyResultVector($lookupVector, $resultVector); if ($lookupRows === 2 && !$hasResultVector) { - $resultVector = array_pop($lookupVector); - $lookupVector = array_shift($lookupVector); + $resultVector = \array_pop($lookupVector); + $lookupVector = \array_shift($lookupVector); } if ($lookupColumns !== 2) { @@ -56,9 +56,9 @@ class Lookup private static function verifyLookupValues(array $lookupVector, array $resultVector): array { foreach ($lookupVector as &$value) { - if (is_array($value)) { - $k = array_keys($value); - $key1 = $key2 = array_shift($k); + if (\is_array($value)) { + $k = \array_keys($value); + $key1 = $key2 = \array_shift($k); ++$key2; $dataValue1 = $value[$key1]; } else { @@ -67,9 +67,9 @@ class Lookup $dataValue1 = $value; } - $dataValue2 = array_shift($resultVector); - if (is_array($dataValue2)) { - $dataValue2 = array_shift($dataValue2); + $dataValue2 = \array_shift($resultVector); + if (\is_array($dataValue2)) { + $dataValue2 = \array_shift($dataValue2); } $value = [$key1 => $dataValue1, $key2 => $dataValue2]; } @@ -97,14 +97,14 @@ class Lookup private static function rowCount(array $dataArray): int { - return count($dataArray); + return \count($dataArray); } private static function columnCount(array $dataArray): int { - $rowKeys = array_keys($dataArray); - $row = array_shift($rowKeys); + $rowKeys = \array_keys($dataArray); + $row = \array_shift($rowKeys); - return count($dataArray[$row]); + return \count($dataArray[$row]); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php index 5fe1676..50d8a05 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php @@ -12,7 +12,7 @@ abstract class LookupBase */ protected static function validateLookupArray($lookup_array): void { - if (!is_array($lookup_array)) { + if (!\is_array($lookup_array)) { throw new Exception(ExcelError::REF()); } } @@ -25,7 +25,7 @@ abstract class LookupBase // VLOOKUP(whatever, whatever, cellref) yields REF error // when cellref is '=SQRT(-1)'. So just try our best here. // Similar results if string (literal yields VALUE, cellRef REF). - if (!is_numeric($index_number)) { + if (!\is_numeric($index_number)) { throw new Exception(ExcelError::throwError($index_number)); } if ($index_number < 1) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupRefValidations.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupRefValidations.php index 2282bf4..cf5db12 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupRefValidations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/LookupRefValidations.php @@ -13,7 +13,7 @@ class LookupRefValidations */ public static function validateInt($value): int { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { if (ErrorValue::isError($value)) { throw new Exception($value); } @@ -21,7 +21,7 @@ class LookupRefValidations throw new Exception(ExcelError::VALUE()); } - return (int) floor((float) $value); + return (int) \floor((float) $value); } /** diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Matrix.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Matrix.php index d7d15d4..08a95f7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Matrix.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Matrix.php @@ -15,7 +15,7 @@ class Matrix */ public static function isColumnVector(array $values): bool { - return count($values, COUNT_RECURSIVE) === (count($values, COUNT_NORMAL) * 2); + return \count($values, COUNT_RECURSIVE) === (\count($values, COUNT_NORMAL) * 2); } /** @@ -23,8 +23,8 @@ class Matrix */ public static function isRowVector(array $values): bool { - return count($values, COUNT_RECURSIVE) > 1 && - (count($values, COUNT_NORMAL) === 1 || count($values, COUNT_RECURSIVE) === count($values, COUNT_NORMAL)); + return \count($values, COUNT_RECURSIVE) > 1 && + (\count($values, COUNT_NORMAL) === 1 || \count($values, COUNT_RECURSIVE) === \count($values, COUNT_NORMAL)); } /** @@ -37,7 +37,7 @@ class Matrix public static function transpose($matrixData) { $returnMatrix = []; - if (!is_array($matrixData)) { + if (!\is_array($matrixData)) { $matrixData = [[$matrixData]]; } @@ -78,7 +78,7 @@ class Matrix */ public static function index($matrix, $rowNum = 0, $columnNum = null) { - if (is_array($rowNum) || is_array($columnNum)) { + if (\is_array($rowNum) || \is_array($columnNum)) { return self::evaluateArrayArgumentsSubsetFrom([self::class, __FUNCTION__], 1, $matrix, $rowNum, $columnNum); } @@ -93,17 +93,17 @@ class Matrix return $e->getMessage(); } - if (!is_array($matrix) || ($rowNum > count($matrix))) { + if (!\is_array($matrix) || ($rowNum > \count($matrix))) { return ExcelError::REF(); } - $rowKeys = array_keys($matrix); - $columnKeys = @array_keys($matrix[$rowKeys[0]]); + $rowKeys = \array_keys($matrix); + $columnKeys = @\array_keys($matrix[$rowKeys[0]]); - if ($columnNum > count($columnKeys)) { + if ($columnNum > \count($columnKeys)) { return ExcelError::REF(); } - if ($originalColumnNum === null && 1 < count($columnKeys)) { + if ($originalColumnNum === null && 1 < \count($columnKeys)) { return ExcelError::REF(); } @@ -113,11 +113,11 @@ class Matrix $columnNum = $columnKeys[--$columnNum]; if ($rowNum === 0) { - return array_map( + return \array_map( function ($value) { return [$value]; }, - array_column($matrix, $columnNum) + \array_column($matrix, $columnNum) ); } $rowNum = $rowKeys[--$rowNum]; @@ -133,7 +133,7 @@ class Matrix $rowNum = $rowKeys[--$rowNum]; $row = $matrix[$rowNum]; - if (is_array($row)) { + if (\is_array($row)) { return [$rowNum => $row]; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Offset.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Offset.php index 02a2558..3e5d2b0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Offset.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Offset.php @@ -52,15 +52,15 @@ class Offset return ExcelError::VALUE(); } - if (!is_object($cell)) { + if (!\is_object($cell)) { return ExcelError::REF(); } [$cellAddress, $worksheet] = self::extractWorksheet($cellAddress, $cell); $startCell = $endCell = $cellAddress; - if (strpos($cellAddress, ':')) { - [$startCell, $endCell] = explode(':', $cellAddress); + if (\strpos($cellAddress, ':')) { + [$startCell, $endCell] = \explode(':', $cellAddress); } [$startCellColumn, $startCellRow] = Coordinate::coordinateFromString($startCell); [$endCellColumn, $endCellRow] = Coordinate::coordinateFromString($endCell); @@ -102,9 +102,9 @@ class Offset $cellAddress = self::assessCellAddress($cellAddress, $cell); $sheetName = ''; - if (strpos($cellAddress, '!') !== false) { + if (\strpos($cellAddress, '!') !== false) { [$sheetName, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - $sheetName = trim($sheetName, "'"); + $sheetName = \trim($sheetName, "'"); } $worksheet = ($sheetName !== '') @@ -116,7 +116,7 @@ class Offset private static function assessCellAddress(string $cellAddress, Cell $cell): string { - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $cellAddress) !== false) { + if (\preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $cellAddress) !== false) { $cellAddress = Functions::expandDefinedName($cellAddress, $cell); } @@ -126,7 +126,7 @@ class Offset private static function adjustEndCellColumnForWidth(string $endCellColumn, $width, int $startCellColumn, $columns) { $endCellColumn = Coordinate::columnIndexFromString($endCellColumn) - 1; - if (($width !== null) && (!is_object($width))) { + if (($width !== null) && (!\is_object($width))) { $endCellColumn = $startCellColumn + (int) $width - 1; } else { $endCellColumn += (int) $columns; @@ -137,7 +137,7 @@ class Offset private static function adustEndCellRowForHeight($height, int $startCellRow, $rows, $endCellRow): int { - if (($height !== null) && (!is_object($height))) { + if (($height !== null) && (!\is_object($height))) { $endCellRow = $startCellRow + (int) $height - 1; } else { $endCellRow += (int) $rows; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php index 8bce07e..7f295f3 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php @@ -17,7 +17,7 @@ class RowColumnInformation */ private static function cellAddressNullOrWhitespace($cellAddress): bool { - return $cellAddress === null || (!is_array($cellAddress) && trim($cellAddress) === ''); + return $cellAddress === null || (!\is_array($cellAddress) && \trim($cellAddress) === ''); } private static function cellColumn(?Cell $cell): int @@ -48,9 +48,9 @@ class RowColumnInformation return self::cellColumn($cell); } - if (is_array($cellAddress)) { + if (\is_array($cellAddress)) { foreach ($cellAddress as $columnKey => $value) { - $columnKey = (string) preg_replace('/[^a-z]/i', '', $columnKey); + $columnKey = (string) \preg_replace('/[^a-z]/i', '', $columnKey); return (int) Coordinate::columnIndexFromString($columnKey); } @@ -64,18 +64,18 @@ class RowColumnInformation [,, $cellAddress] = Helpers::extractCellAddresses($cellAddress, true, $cell->getWorksheet(), $sheetName); } [, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - if (strpos($cellAddress, ':') !== false) { - [$startAddress, $endAddress] = explode(':', $cellAddress); - $startAddress = (string) preg_replace('/[^a-z]/i', '', $startAddress); - $endAddress = (string) preg_replace('/[^a-z]/i', '', $endAddress); + if (\strpos($cellAddress, ':') !== false) { + [$startAddress, $endAddress] = \explode(':', $cellAddress); + $startAddress = (string) \preg_replace('/[^a-z]/i', '', $startAddress); + $endAddress = (string) \preg_replace('/[^a-z]/i', '', $endAddress); - return range( + return \range( (int) Coordinate::columnIndexFromString($startAddress), (int) Coordinate::columnIndexFromString($endAddress) ); } - $cellAddress = (string) preg_replace('/[^a-z]/i', '', $cellAddress); + $cellAddress = (string) \preg_replace('/[^a-z]/i', '', $cellAddress); return (int) Coordinate::columnIndexFromString($cellAddress); } @@ -98,12 +98,12 @@ class RowColumnInformation if (self::cellAddressNullOrWhitespace($cellAddress)) { return 1; } - if (!is_array($cellAddress)) { + if (!\is_array($cellAddress)) { return ExcelError::VALUE(); } - reset($cellAddress); - $isMatrix = (is_numeric(key($cellAddress))); + \reset($cellAddress); + $isMatrix = (\is_numeric(\key($cellAddress))); [$columns, $rows] = Calculation::getMatrixDimensions($cellAddress); if ($isMatrix) { @@ -141,10 +141,10 @@ class RowColumnInformation return self::cellRow($cell); } - if (is_array($cellAddress)) { + if (\is_array($cellAddress)) { foreach ($cellAddress as $rowKey => $rowValue) { foreach ($rowValue as $columnKey => $cellValue) { - return (int) preg_replace('/\D/', '', $rowKey); + return (int) \preg_replace('/\D/', '', $rowKey); } } @@ -157,21 +157,21 @@ class RowColumnInformation [,, $cellAddress] = Helpers::extractCellAddresses($cellAddress, true, $cell->getWorksheet(), $sheetName); } [, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - if (strpos($cellAddress, ':') !== false) { - [$startAddress, $endAddress] = explode(':', $cellAddress); - $startAddress = (string) preg_replace('/\D/', '', $startAddress); - $endAddress = (string) preg_replace('/\D/', '', $endAddress); + if (\strpos($cellAddress, ':') !== false) { + [$startAddress, $endAddress] = \explode(':', $cellAddress); + $startAddress = (string) \preg_replace('/\D/', '', $startAddress); + $endAddress = (string) \preg_replace('/\D/', '', $endAddress); - return array_map( + return \array_map( function ($value) { return [$value]; }, - range($startAddress, $endAddress) + \range($startAddress, $endAddress) ); } - [$cellAddress] = explode(':', $cellAddress); + [$cellAddress] = \explode(':', $cellAddress); - return (int) preg_replace('/\D/', '', $cellAddress); + return (int) \preg_replace('/\D/', '', $cellAddress); } /** @@ -192,12 +192,12 @@ class RowColumnInformation if (self::cellAddressNullOrWhitespace($cellAddress)) { return 1; } - if (!is_array($cellAddress)) { + if (!\is_array($cellAddress)) { return ExcelError::VALUE(); } - reset($cellAddress); - $isMatrix = (is_numeric(key($cellAddress))); + \reset($cellAddress); + $isMatrix = (\is_numeric(\key($cellAddress))); [$columns, $rows] = Calculation::getMatrixDimensions($cellAddress); if ($isMatrix) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Selection.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Selection.php index 0ac9177..3e0e206 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Selection.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Selection.php @@ -26,23 +26,23 @@ class Selection */ public static function choose($chosenEntry, ...$chooseArgs) { - if (is_array($chosenEntry)) { + if (\is_array($chosenEntry)) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $chosenEntry, ...$chooseArgs); } - $entryCount = count($chooseArgs) - 1; + $entryCount = \count($chooseArgs) - 1; - if (is_numeric($chosenEntry)) { + if (\is_numeric($chosenEntry)) { --$chosenEntry; } else { return ExcelError::VALUE(); } - $chosenEntry = floor($chosenEntry); + $chosenEntry = \floor($chosenEntry); if (($chosenEntry < 0) || ($chosenEntry > $entryCount)) { return ExcelError::VALUE(); } - if (is_array($chooseArgs[$chosenEntry])) { + if (\is_array($chooseArgs[$chosenEntry])) { return Functions::flattenArray($chooseArgs[$chosenEntry]); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Sort.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Sort.php index ff78fbe..f4cc7d4 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Sort.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Sort.php @@ -31,7 +31,7 @@ class Sort extends LookupRefValidations */ public static function sort($sortArray, $sortIndex = 1, $sortOrder = self::ORDER_ASCENDING, $byColumn = false) { - if (!is_array($sortArray)) { + if (!\is_array($sortArray)) { // Scalars are always returned "as is" return $sortArray; } @@ -39,13 +39,13 @@ class Sort extends LookupRefValidations $sortArray = self::enumerateArrayKeys($sortArray); $byColumn = (bool) $byColumn; - $lookupIndexSize = $byColumn ? count($sortArray) : count($sortArray[0]); + $lookupIndexSize = $byColumn ? \count($sortArray) : \count($sortArray[0]); try { // If $sortIndex and $sortOrder are scalars, then convert them into arrays - if (is_scalar($sortIndex)) { + if (\is_scalar($sortIndex)) { $sortIndex = [$sortIndex]; - $sortOrder = is_scalar($sortOrder) ? [$sortOrder] : $sortOrder; + $sortOrder = \is_scalar($sortOrder) ? [$sortOrder] : $sortOrder; } // but the values of those array arguments still need validation $sortOrder = (empty($sortOrder) ? [self::ORDER_ASCENDING] : $sortOrder); @@ -55,7 +55,7 @@ class Sort extends LookupRefValidations } // We want a simple, enumrated array of arrays where we can reference column by its index number. - $sortArray = array_values(array_map('array_values', $sortArray)); + $sortArray = \array_values(\array_map('array_values', $sortArray)); return ($byColumn === true) ? self::sortByColumn($sortArray, $sortIndex, $sortOrder) @@ -81,15 +81,15 @@ class Sort extends LookupRefValidations */ public static function sortBy($sortArray, ...$args) { - if (!is_array($sortArray)) { + if (!\is_array($sortArray)) { // Scalars are always returned "as is" return $sortArray; } $sortArray = self::enumerateArrayKeys($sortArray); - $lookupArraySize = count($sortArray); - $argumentCount = count($args); + $lookupArraySize = \count($sortArray); + $argumentCount = \count($args); try { $sortBy = $sortOrder = []; @@ -106,16 +106,16 @@ class Sort extends LookupRefValidations private static function enumerateArrayKeys(array $sortArray): array { - array_walk( + \array_walk( $sortArray, function (&$columns): void { - if (is_array($columns)) { - $columns = array_values($columns); + if (\is_array($columns)) { + $columns = \array_values($columns); } } ); - return array_values($sortArray); + return \array_values($sortArray); } /** @@ -124,7 +124,7 @@ class Sort extends LookupRefValidations */ private static function validateScalarArgumentsForSort(&$sortIndex, &$sortOrder, int $sortArraySize): void { - if (is_array($sortIndex) || is_array($sortOrder)) { + if (\is_array($sortIndex) || \is_array($sortOrder)) { throw new Exception(ExcelError::VALUE()); } @@ -142,13 +142,13 @@ class Sort extends LookupRefValidations */ private static function validateSortVector($sortVector, int $sortArraySize): array { - if (!is_array($sortVector)) { + if (!\is_array($sortVector)) { throw new Exception(ExcelError::VALUE()); } // It doesn't matter if it's a row or a column vectors, it works either way $sortVector = Functions::flattenArray($sortVector); - if (count($sortVector) !== $sortArraySize) { + if (\count($sortVector) !== $sortArraySize) { throw new Exception(ExcelError::VALUE()); } @@ -179,17 +179,17 @@ class Sort extends LookupRefValidations $sortOrder = Functions::flattenArray($sortOrder); if ( - count($sortOrder) === 0 || count($sortOrder) > $sortArraySize || - (count($sortOrder) > count($sortIndex)) + \count($sortOrder) === 0 || \count($sortOrder) > $sortArraySize || + (\count($sortOrder) > \count($sortIndex)) ) { throw new Exception(ExcelError::VALUE()); } - if (count($sortIndex) > count($sortOrder)) { + if (\count($sortIndex) > \count($sortOrder)) { // If $sortOrder has fewer elements than $sortIndex, then the last order element is repeated. - $sortOrder = array_merge( + $sortOrder = \array_merge( $sortOrder, - array_fill(0, count($sortIndex) - count($sortOrder), array_pop($sortOrder)) + \array_fill(0, \count($sortIndex) - \count($sortOrder), \array_pop($sortOrder)) ); } @@ -201,11 +201,11 @@ class Sort extends LookupRefValidations private static function prepareSortVectorValues(array $sortVector): array { // Strings should be sorted case-insensitive; with booleans converted to locale-strings - return array_map( + return \array_map( function ($value) { - if (is_bool($value)) { + if (\is_bool($value)) { return ($value) ? Calculation::getTRUE() : Calculation::getFALSE(); - } elseif (is_string($value)) { + } elseif (\is_string($value)) { return StringHelper::strToLower($value); } @@ -267,7 +267,7 @@ class Sort extends LookupRefValidations $sortArguments = []; $sortData = []; foreach ($sortIndex as $index => $sortIndexValue) { - $sortValues = array_column($sortArray, $sortIndexValue - 1); + $sortValues = \array_column($sortArray, $sortIndexValue - 1); $sortData[] = $sortValues; $sortArguments[] = self::prepareSortVectorValues($sortValues); $sortArguments[] = $sortOrder[$index] === self::ORDER_ASCENDING ? SORT_ASC : SORT_DESC; @@ -292,11 +292,11 @@ class Sort extends LookupRefValidations $sortArguments[] = &$sortDataIndexed; - array_multisort(...$sortArguments); + \array_multisort(...$sortArguments); // After the sort, we restore the numeric keys that will now be in the correct, sorted order $sortedData = []; - foreach (array_keys($sortDataIndexed) as $key) { + foreach (\array_keys($sortDataIndexed) as $key) { $sortedData[] = Coordinate::columnIndexFromString($key) - 1; } @@ -327,13 +327,13 @@ class Sort extends LookupRefValidations * Hack to handle PHP 7: * From PHP 8.0.0, If two members compare as equal in a sort, they retain their original order; * but prior to PHP 8.0.0, their relative order in the sorted array was undefined. - * MS Excel replicates the PHP 8.0.0 behaviour, retaining the original order of matching elements. - * To replicate that behaviour with PHP 7, we add an extra sort based on the row index. + * MS Excel replicates the PHP 8.0.0 behavior, retaining the original order of matching elements. + * To replicate that behavior with PHP 7, we add an extra sort based on the row index. */ private static function applyPHP7Patch(array $sortArray, array $sortArguments): array { if (PHP_VERSION_ID < 80000) { - $sortArguments[] = range(1, count($sortArray)); + $sortArguments[] = \range(1, \count($sortArray)); $sortArguments[] = SORT_ASC; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Unique.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Unique.php index 2ba5128..fb690f5 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Unique.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/Unique.php @@ -20,7 +20,7 @@ class Unique */ public static function unique($lookupVector, $byColumn = false, $exactlyOnce = false) { - if (!is_array($lookupVector)) { + if (!\is_array($lookupVector)) { // Scalars are always returned "as is" return $lookupVector; } @@ -40,10 +40,10 @@ class Unique { // When not $byColumn, we count whole rows or values, not individual values // so implode each row into a single string value - array_walk( + \array_walk( $lookupVector, function (array &$value): void { - $value = implode(chr(0x00), $value); + $value = \implode(\chr(0x00), $value); } ); @@ -53,21 +53,21 @@ class Unique $result = self::exactlyOnceFilter($result); } - if (count($result) === 0) { + if (\count($result) === 0) { return ExcelError::CALC(); } - $result = array_keys($result); + $result = \array_keys($result); // restore rows from their strings - array_walk( + \array_walk( $result, function (string &$value): void { - $value = explode(chr(0x00), $value); + $value = \explode(\chr(0x00), $value); } ); - return (count($result) === 1) ? array_pop($result) : $result; + return (\count($result) === 1) ? \array_pop($result) : $result; } /** @@ -77,12 +77,12 @@ class Unique { $flattenedLookupVector = Functions::flattenArray($lookupVector); - if (count($lookupVector, COUNT_RECURSIVE) > count($flattenedLookupVector, COUNT_RECURSIVE) + 1) { + if (\count($lookupVector, COUNT_RECURSIVE) > \count($flattenedLookupVector, COUNT_RECURSIVE) + 1) { // We're looking at a full column check (multiple rows) $transpose = Matrix::transpose($lookupVector); $result = self::uniqueByRow($transpose, $exactlyOnce); - return (is_array($result)) ? Matrix::transpose($result) : $result; + return (\is_array($result)) ? Matrix::transpose($result) : $result; } $result = self::countValuesCaseInsensitive($flattenedLookupVector); @@ -91,19 +91,19 @@ class Unique $result = self::exactlyOnceFilter($result); } - if (count($result) === 0) { + if (\count($result) === 0) { return ExcelError::CALC(); } - $result = array_keys($result); + $result = \array_keys($result); return $result; } private static function countValuesCaseInsensitive(array $caseSensitiveLookupValues): array { - $caseInsensitiveCounts = array_count_values( - array_map( + $caseInsensitiveCounts = \array_count_values( + \array_map( function (string $value) { return StringHelper::strToUpper($value); }, @@ -113,7 +113,7 @@ class Unique $caseSensitiveCounts = []; foreach ($caseInsensitiveCounts as $caseInsensitiveKey => $count) { - if (is_numeric($caseInsensitiveKey)) { + if (\is_numeric($caseInsensitiveKey)) { $caseSensitiveCounts[$caseInsensitiveKey] = $count; } else { foreach ($caseSensitiveLookupValues as $caseSensitiveValue) { @@ -131,7 +131,7 @@ class Unique private static function exactlyOnceFilter(array $values): array { - return array_filter( + return \array_filter( $values, function ($value) { return $value === 1; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/VLookup.php b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/VLookup.php index edeb1aa..5e12fbb 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/VLookup.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/LookupRef/VLookup.php @@ -26,7 +26,7 @@ class VLookup extends LookupBase */ public static function lookup($lookupValue, $lookupArray, $indexNumber, $notExactMatch = true) { - if (is_array($lookupValue)) { + if (\is_array($lookupValue)) { return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $lookupValue, $lookupArray, $indexNumber, $notExactMatch); } @@ -39,19 +39,19 @@ class VLookup extends LookupBase return $e->getMessage(); } - $f = array_keys($lookupArray); - $firstRow = array_pop($f); - if ((!is_array($lookupArray[$firstRow])) || ($indexNumber > count($lookupArray[$firstRow]))) { + $f = \array_keys($lookupArray); + $firstRow = \array_pop($f); + if ((!\is_array($lookupArray[$firstRow])) || ($indexNumber > \count($lookupArray[$firstRow]))) { return ExcelError::REF(); } - $columnKeys = array_keys($lookupArray[$firstRow]); + $columnKeys = \array_keys($lookupArray[$firstRow]); $returnColumn = $columnKeys[--$indexNumber]; - $firstColumn = array_shift($columnKeys) ?? 1; + $firstColumn = \array_shift($columnKeys) ?? 1; if (!$notExactMatch) { /** @var callable */ $callable = [self::class, 'vlookupSort']; - uasort($lookupArray, $callable); + \uasort($lookupArray, $callable); } $rowNumber = self::vLookupSearch($lookupValue, $lookupArray, $firstColumn, $notExactMatch); @@ -66,8 +66,8 @@ class VLookup extends LookupBase private static function vlookupSort(array $a, array $b): int { - reset($a); - $firstColumn = key($a); + \reset($a); + $firstColumn = \key($a); $aLower = StringHelper::strToLower((string) $a[$firstColumn]); $bLower = StringHelper::strToLower((string) $b[$firstColumn]); @@ -88,8 +88,8 @@ class VLookup extends LookupBase $rowNumber = null; foreach ($lookupArray as $rowKey => $rowData) { - $bothNumeric = is_numeric($lookupValue) && is_numeric($rowData[$column]); - $bothNotNumeric = !is_numeric($lookupValue) && !is_numeric($rowData[$column]); + $bothNumeric = \is_numeric($lookupValue) && \is_numeric($rowData[$column]); + $bothNotNumeric = !\is_numeric($lookupValue) && !\is_numeric($rowData[$column]); $cellDataLower = StringHelper::strToLower((string) $rowData[$column]); // break if we have passed possible keys diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig.php index 1790b21..e34f5ac 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig.php @@ -1439,7 +1439,7 @@ class MathTrig $number = Functions::flattenSingleValue($number); if ($number === null) { $number = 0; - } elseif (is_bool($number)) { + } elseif (\is_bool($number)) { $number = (int) $number; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Absolute.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Absolute.php index f21c6b7..098aa2a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Absolute.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Absolute.php @@ -22,7 +22,7 @@ class Absolute */ public static function evaluate($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -32,6 +32,6 @@ class Absolute return $e->getMessage(); } - return abs($number); + return \abs($number); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Angle.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Angle.php index cbeec6f..b83f5d1 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Angle.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Angle.php @@ -22,7 +22,7 @@ class Angle */ public static function toDegrees($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -32,7 +32,7 @@ class Angle return $e->getMessage(); } - return rad2deg($number); + return \rad2deg($number); } /** @@ -48,7 +48,7 @@ class Angle */ public static function toRadians($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -58,6 +58,6 @@ class Angle return $e->getMessage(); } - return deg2rad($number); + return \deg2rad($number); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Arabic.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Arabic.php index ee48850..4c9c7b7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Arabic.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Arabic.php @@ -30,20 +30,20 @@ class Arabic */ private static function calculateArabic(array $roman, &$sum = 0, $subtract = 0) { - $numeral = array_shift($roman); + $numeral = \array_shift($roman); if (!isset(self::ROMAN_LOOKUP[$numeral])) { throw new Exception('Invalid character detected'); } $arabic = self::ROMAN_LOOKUP[$numeral]; - if (count($roman) > 0 && isset(self::ROMAN_LOOKUP[$roman[0]]) && $arabic < self::ROMAN_LOOKUP[$roman[0]]) { + if (\count($roman) > 0 && isset(self::ROMAN_LOOKUP[$roman[0]]) && $arabic < self::ROMAN_LOOKUP[$roman[0]]) { $subtract += $arabic; } else { $sum += ($arabic - $subtract); $subtract = 0; } - if (count($roman) > 0) { + if (\count($roman) > 0) { self::calculateArabic($roman, $sum, $subtract); } @@ -55,12 +55,12 @@ class Arabic */ private static function mollifyScrutinizer($value): array { - return is_array($value) ? $value : []; + return \is_array($value) ? $value : []; } private static function strSplit(string $roman): array { - $rslt = str_split($roman); + $rslt = \str_split($roman); return self::mollifyScrutinizer($rslt); } @@ -81,12 +81,12 @@ class Arabic */ public static function evaluate($roman) { - if (is_array($roman)) { + if (\is_array($roman)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $roman); } // An empty string should return 0 - $roman = substr(trim(strtoupper((string) $roman)), 0, 255); + $roman = \substr(\trim(\strtoupper((string) $roman)), 0, 255); if ($roman === '') { return 0; } @@ -94,7 +94,7 @@ class Arabic // Convert the roman numeral to an arabic number $negativeNumber = $roman[0] === '-'; if ($negativeNumber) { - $roman = substr($roman, 1); + $roman = \substr($roman, 1); } try { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Base.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Base.php index 2fec947..04adc77 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Base.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Base.php @@ -31,12 +31,12 @@ class Base */ public static function evaluate($number, $radix, $minLength = null) { - if (is_array($number) || is_array($radix) || is_array($minLength)) { + if (\is_array($number) || \is_array($radix) || \is_array($minLength)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $radix, $minLength); } try { - $number = (float) floor(Helpers::validateNumericNullBool($number)); + $number = (float) \floor(Helpers::validateNumericNullBool($number)); $radix = (int) Helpers::validateNumericNullBool($radix); } catch (Exception $e) { return $e->getMessage(); @@ -50,14 +50,14 @@ class Base */ private static function calculate(float $number, int $radix, $minLength): string { - if ($minLength === null || is_numeric($minLength)) { + if ($minLength === null || \is_numeric($minLength)) { if ($number < 0 || $number >= 2 ** 53 || $radix < 2 || $radix > 36) { return ExcelError::NAN(); // Numeric range constraints } - $outcome = strtoupper((string) base_convert("$number", 10, $radix)); + $outcome = \strtoupper((string) \base_convert("$number", 10, $radix)); if ($minLength !== null) { - $outcome = str_pad($outcome, (int) $minLength, '0', STR_PAD_LEFT); // String padding + $outcome = \str_pad($outcome, (int) $minLength, '0', STR_PAD_LEFT); // String padding } return $outcome; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php index 635f1bb..7f33f17 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php @@ -33,7 +33,7 @@ class Ceiling */ public static function ceiling($number, $significance = null) { - if (is_array($number) || is_array($significance)) { + if (\is_array($number) || \is_array($significance)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); } @@ -72,7 +72,7 @@ class Ceiling */ public static function math($number, $significance = null, $mode = 0) { - if (is_array($number) || is_array($significance) || is_array($mode)) { + if (\is_array($number) || \is_array($significance) || \is_array($mode)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance, $mode); } @@ -88,10 +88,10 @@ class Ceiling return 0.0; } if (self::ceilingMathTest((float) $significance, (float) $number, (int) $mode)) { - return floor($number / $significance) * $significance; + return \floor($number / $significance) * $significance; } - return ceil($number / $significance) * $significance; + return \ceil($number / $significance) * $significance; } /** @@ -113,7 +113,7 @@ class Ceiling */ public static function precise($number, $significance = 1) { - if (is_array($number) || is_array($significance)) { + if (\is_array($number) || \is_array($significance)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); } @@ -127,9 +127,9 @@ class Ceiling if (!$significance) { return 0.0; } - $result = $number / abs($significance); + $result = $number / \abs($significance); - return ceil($result) * $significance * (($significance < 0) ? -1 : 1); + return \ceil($result) * $significance * (($significance < 0) ? -1 : 1); } /** @@ -151,7 +151,7 @@ class Ceiling return 0.0; } if (Helpers::returnSign($number) == Helpers::returnSign($significance)) { - return ceil($number / $significance) * $significance; + return \ceil($number / $significance) * $significance; } return ExcelError::NAN(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Combinations.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Combinations.php index 5a652da..116a226 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Combinations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Combinations.php @@ -27,7 +27,7 @@ class Combinations */ public static function withoutRepetition($numObjs, $numInSet) { - if (is_array($numObjs) || is_array($numInSet)) { + if (\is_array($numObjs) || \is_array($numInSet)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); } @@ -40,7 +40,7 @@ class Combinations return $e->getMessage(); } - return round(Factorial::fact($numObjs) / Factorial::fact($numObjs - $numInSet)) / Factorial::fact($numInSet); + return \round(Factorial::fact($numObjs) / Factorial::fact($numObjs - $numInSet)) / Factorial::fact($numInSet); } /** @@ -61,7 +61,7 @@ class Combinations */ public static function withRepetition($numObjs, $numInSet) { - if (is_array($numObjs) || is_array($numInSet)) { + if (\is_array($numObjs) || \is_array($numInSet)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); } @@ -84,7 +84,7 @@ class Combinations return $e->getMessage(); } - return round( + return \round( Factorial::fact($numObjs + $numInSet - 1) / Factorial::fact($numObjs - 1) ) / Factorial::fact($numInSet); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Exp.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Exp.php index f65c2c1..565bff0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Exp.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Exp.php @@ -22,7 +22,7 @@ class Exp */ public static function evaluate($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -32,6 +32,6 @@ class Exp return $e->getMessage(); } - return exp($number); + return \exp($number); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Factorial.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Factorial.php index b6883e2..157093a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Factorial.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Factorial.php @@ -28,7 +28,7 @@ class Factorial */ public static function fact($factVal) { - if (is_array($factVal)) { + if (\is_array($factVal)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $factVal); } @@ -39,7 +39,7 @@ class Factorial return $e->getMessage(); } - $factLoop = floor($factVal); + $factLoop = \floor($factVal); if ($factVal > $factLoop) { if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { return Statistical\Distributions\Gamma::gammaValue($factVal + 1); @@ -70,7 +70,7 @@ class Factorial */ public static function factDouble($factVal) { - if (is_array($factVal)) { + if (\is_array($factVal)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $factVal); } @@ -81,7 +81,7 @@ class Factorial return $e->getMessage(); } - $factLoop = floor($factVal); + $factLoop = \floor($factVal); $factorial = 1; while ($factLoop > 1) { $factorial *= $factLoop; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Floor.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Floor.php index 2199dda..a07d3ff 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Floor.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Floor.php @@ -38,7 +38,7 @@ class Floor */ public static function floor($number, $significance = null) { - if (is_array($number) || is_array($significance)) { + if (\is_array($number) || \is_array($significance)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); } @@ -77,7 +77,7 @@ class Floor */ public static function math($number, $significance = null, $mode = 0) { - if (is_array($number) || is_array($significance) || is_array($mode)) { + if (\is_array($number) || \is_array($significance) || \is_array($mode)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance, $mode); } @@ -111,7 +111,7 @@ class Floor */ public static function precise($number, $significance = 1) { - if (is_array($number) || is_array($significance)) { + if (\is_array($number) || \is_array($significance)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $significance); } @@ -139,7 +139,7 @@ class Floor return 0.0; } - return floor($number / abs($significance)) * abs($significance); + return \floor($number / \abs($significance)) * \abs($significance); } /** @@ -156,10 +156,10 @@ class Floor return 0.0; } if (self::floorMathTest($number, $significance, $mode)) { - return ceil($number / $significance) * $significance; + return \ceil($number / $significance) * $significance; } - return floor($number / $significance) * $significance; + return \floor($number / $significance) * $significance; } /** @@ -184,10 +184,10 @@ class Floor return 0.0; } if (Helpers::returnSign($significance) == 1) { - return floor($number / $significance) * $significance; + return \floor($number / $significance) * $significance; } if (Helpers::returnSign($number) == -1 && Helpers::returnSign($significance) == -1) { - return floor($number / $significance) * $significance; + return \floor($number / $significance) * $significance; } return ExcelError::NAN(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Gcd.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Gcd.php index f703599..138495d 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Gcd.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Gcd.php @@ -57,12 +57,12 @@ class Gcd return $e->getMessage(); } - if (count($arrayArgs) <= 0) { + if (\count($arrayArgs) <= 0) { return ExcelError::VALUE(); } - $gcd = (int) array_pop($arrayArgs); + $gcd = (int) \array_pop($arrayArgs); do { - $gcd = self::evaluateGCD($gcd, (int) array_pop($arrayArgs)); + $gcd = self::evaluateGCD($gcd, (int) \array_pop($arrayArgs)); } while (!empty($arrayArgs)); return $gcd; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Helpers.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Helpers.php index f34f159..b66e892 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Helpers.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Helpers.php @@ -15,7 +15,7 @@ class Helpers */ public static function verySmallDenominator(float $numerator, float $denominator) { - return (abs($denominator) < 1.0E-12) ? ExcelError::DIV0() : ($numerator / $denominator); + return (\abs($denominator) < 1.0E-12) ? ExcelError::DIV0() : ($numerator / $denominator); } /** @@ -31,10 +31,10 @@ class Helpers if ($number === null) { return 0; } - if (is_bool($number)) { + if (\is_bool($number)) { return (int) $number; } - if (is_numeric($number)) { + if (\is_numeric($number)) { return 0 + $number; } @@ -55,7 +55,7 @@ class Helpers if ($number === null && $substitute !== null) { return $substitute; } - if (is_numeric($number)) { + if (\is_numeric($number)) { return 0 + $number; } @@ -113,7 +113,7 @@ class Helpers { $significance = 2 * self::returnSign($number); - return $significance ? (ceil($number / $significance) * $significance) : 0; + return $significance ? (\ceil($number / $significance) * $significance) : 0; } /** @@ -125,6 +125,6 @@ class Helpers */ public static function numberOrNan($result) { - return is_nan($result) ? ExcelError::NAN() : $result; + return \is_nan($result) ? ExcelError::NAN() : $result; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/IntClass.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/IntClass.php index f7f7764..381b5e0 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/IntClass.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/IntClass.php @@ -25,7 +25,7 @@ class IntClass */ public static function evaluate($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -35,6 +35,6 @@ class IntClass return $e->getMessage(); } - return (int) floor($number); + return (int) \floor($number); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Lcm.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Lcm.php index 3b23c1d..9e6b4fa 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Lcm.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Lcm.php @@ -13,20 +13,20 @@ class Lcm // private static function factors(float $value): array { - $startVal = floor(sqrt($value)); + $startVal = \floor(\sqrt($value)); $factorArray = []; for ($i = $startVal; $i > 1; --$i) { if (($value % $i) == 0) { - $factorArray = array_merge($factorArray, self::factors($value / $i)); - $factorArray = array_merge($factorArray, self::factors($i)); - if ($i <= sqrt($value)) { + $factorArray = \array_merge($factorArray, self::factors($value / $i)); + $factorArray = \array_merge($factorArray, self::factors($i)); + if ($i <= \sqrt($value)) { break; } } } if (!empty($factorArray)) { - rsort($factorArray); + \rsort($factorArray); return $factorArray; } @@ -74,8 +74,8 @@ class Lcm $allPoweredFactors = []; // Loop through arguments foreach ($arrayArgs as $value) { - $myFactors = self::factors(floor($value)); - $myCountedFactors = array_count_values($myFactors); + $myFactors = self::factors(\floor($value)); + $myCountedFactors = \array_count_values($myFactors); $myPoweredFactors = []; foreach ($myCountedFactors as $myCountedFactor => $myCountedPower) { $myPoweredFactors[$myCountedFactor] = $myCountedFactor ** $myCountedPower; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php index 7b07f09..4dc20de 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php @@ -28,7 +28,7 @@ class Logarithms */ public static function withBase($number, $base = 10) { - if (is_array($number) || is_array($base)) { + if (\is_array($number) || \is_array($base)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $base); } @@ -41,7 +41,7 @@ class Logarithms return $e->getMessage(); } - return log($number, $base); + return \log($number, $base); } /** @@ -58,7 +58,7 @@ class Logarithms */ public static function base10($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -69,7 +69,7 @@ class Logarithms return $e->getMessage(); } - return log10($number); + return \log10($number); } /** @@ -86,7 +86,7 @@ class Logarithms */ public static function natural($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -97,6 +97,6 @@ class Logarithms return $e->getMessage(); } - return log($number); + return \log($number); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php index 5a5125a..8b804bf 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php @@ -19,18 +19,18 @@ class MatrixFunctions private static function getMatrix($matrixValues): Matrix { $matrixData = []; - if (!is_array($matrixValues)) { + if (!\is_array($matrixValues)) { $matrixValues = [[$matrixValues]]; } $row = 0; foreach ($matrixValues as $matrixRow) { - if (!is_array($matrixRow)) { + if (!\is_array($matrixRow)) { $matrixRow = [$matrixRow]; } $column = 0; foreach ($matrixRow as $matrixCell) { - if ((is_string($matrixCell)) || ($matrixCell === null)) { + if ((\is_string($matrixCell)) || ($matrixCell === null)) { throw new Exception(ExcelError::VALUE()); } $matrixData[$row][$column] = $matrixCell; @@ -71,15 +71,15 @@ class MatrixFunctions } if ($step === 0) { - return array_chunk( - array_fill(0, $rows * $columns, $start), - max($columns, 1) + return \array_chunk( + \array_fill(0, $rows * $columns, $start), + \max($columns, 1) ); } - return array_chunk( - range($start, $start + (($rows * $columns - 1) * $step), $step), - max($columns, 1) + return \array_chunk( + \range($start, $start + (($rows * $columns - 1) * $step), $step), + \max($columns, 1) ); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Operations.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Operations.php index 0625845..b525e74 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Operations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Operations.php @@ -25,7 +25,7 @@ class Operations */ public static function mod($dividend, $divisor) { - if (is_array($dividend) || is_array($divisor)) { + if (\is_array($dividend) || \is_array($divisor)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $dividend, $divisor); } @@ -38,13 +38,13 @@ class Operations } if (($dividend < 0.0) && ($divisor > 0.0)) { - return $divisor - fmod(abs($dividend), $divisor); + return $divisor - \fmod(\abs($dividend), $divisor); } if (($dividend > 0.0) && ($divisor < 0.0)) { - return $divisor + fmod($dividend, abs($divisor)); + return $divisor + \fmod($dividend, \abs($divisor)); } - return fmod($dividend, $divisor); + return \fmod($dividend, $divisor); } /** @@ -63,7 +63,7 @@ class Operations */ public static function power($x, $y) { - if (is_array($x) || is_array($y)) { + if (\is_array($x) || \is_array($y)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $x, $y); } @@ -102,7 +102,7 @@ class Operations */ public static function product(...$args) { - $args = array_filter( + $args = \array_filter( Functions::flattenArray($args), function ($value) { return $value !== null; @@ -110,12 +110,12 @@ class Operations ); // Return value - $returnValue = (count($args) === 0) ? 0.0 : 1.0; + $returnValue = (\count($args) === 0) ? 0.0 : 1.0; // Loop through arguments foreach ($args as $arg) { // Is it a numeric value? - if (is_numeric($arg)) { + if (\is_numeric($arg)) { $returnValue *= $arg; } else { return ExcelError::throwError($arg); @@ -145,7 +145,7 @@ class Operations */ public static function quotient($numerator, $denominator) { - if (is_array($numerator) || is_array($denominator)) { + if (\is_array($numerator) || \is_array($denominator)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $numerator, $denominator); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Random.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Random.php index 22cad2c..ea6cf40 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Random.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Random.php @@ -17,7 +17,7 @@ class Random */ public static function rand() { - return mt_rand(0, 10000000) / 10000000; + return \mt_rand(0, 10000000) / 10000000; } /** @@ -34,7 +34,7 @@ class Random */ public static function randBetween($min, $max) { - if (is_array($min) || is_array($max)) { + if (\is_array($min) || \is_array($max)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $min, $max); } @@ -46,7 +46,7 @@ class Random return $e->getMessage(); } - return mt_rand($min, $max); + return \mt_rand($min, $max); } /** @@ -84,16 +84,16 @@ class Random return $e->getMessage(); } - return array_chunk( - array_map( + return \array_chunk( + \array_map( function () use ($min, $max, $wholeNumber) { return $wholeNumber - ? mt_rand((int) $min, (int) $max) - : (mt_rand() / mt_getrandmax()) * ($max - $min) + $min; + ? \mt_rand((int) $min, (int) $max) + : (\mt_rand() / \mt_getrandmax()) * ($max - $min) + $min; }, - array_fill(0, $rows * $columns, $min) + \array_fill(0, $rows * $columns, $min) ), - max($columns, 1) + \max($columns, 1) ); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Roman.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Roman.php index 0541548..7565aa4 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Roman.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Roman.php @@ -791,9 +791,9 @@ class Roman $aValue %= 10; $result = self::THOUSANDS[$m] . self::HUNDREDS[$c] . self::TENS[$t] . self::ONES[$aValue]; if ($style > 0) { - if (array_key_exists($origValue, self::VALUES)) { + if (\array_key_exists($origValue, self::VALUES)) { $arr = self::VALUES[$origValue]; - $idx = min($style, count($arr)) - 1; + $idx = \min($style, \count($arr)) - 1; $result = $arr[$idx]; } } @@ -827,13 +827,13 @@ class Roman */ public static function evaluate($aValue, $style = 0) { - if (is_array($aValue) || is_array($style)) { + if (\is_array($aValue) || \is_array($style)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $aValue, $style); } try { $aValue = Helpers::validateNumericNullBool($aValue); - if (is_bool($style)) { + if (\is_bool($style)) { $style = $style ? 0 : 4; } $style = Helpers::validateNumericNullSubstitution($style, null); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Round.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Round.php index 776f7eb..8b8f4c6 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Round.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Round.php @@ -24,7 +24,7 @@ class Round */ public static function round($number, $precision) { - if (is_array($number) || is_array($precision)) { + if (\is_array($number) || \is_array($precision)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $precision); } @@ -35,7 +35,7 @@ class Round return $e->getMessage(); } - return round($number, (int) $precision); + return \round($number, (int) $precision); } /** @@ -52,7 +52,7 @@ class Round */ public static function up($number, $digits) { - if (is_array($number) || is_array($digits)) { + if (\is_array($number) || \is_array($digits)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $digits); } @@ -68,10 +68,10 @@ class Round } if ($number < 0.0) { - return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); + return \round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); } - return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); + return \round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); } /** @@ -88,7 +88,7 @@ class Round */ public static function down($number, $digits) { - if (is_array($number) || is_array($digits)) { + if (\is_array($number) || \is_array($digits)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $digits); } @@ -104,10 +104,10 @@ class Round } if ($number < 0.0) { - return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); + return \round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); } - return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); + return \round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); } /** @@ -124,7 +124,7 @@ class Round */ public static function multiple($number, $multiple) { - if (is_array($number) || is_array($multiple)) { + if (\is_array($number) || \is_array($multiple)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $number, $multiple); } @@ -141,7 +141,7 @@ class Round if ((Helpers::returnSign($number)) == (Helpers::returnSign($multiple))) { $multiplier = 1 / $multiple; - return round($number * $multiplier) / $multiplier; + return \round($number * $multiplier) / $multiplier; } return ExcelError::NAN(); @@ -167,7 +167,7 @@ class Round */ public static function even($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -193,7 +193,7 @@ class Round */ public static function odd($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -208,7 +208,7 @@ class Round return 1; } - $result = ceil($number / $significance) * $significance; + $result = \ceil($number / $significance) * $significance; if ($result == Helpers::getEven($result)) { $result += $significance; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php index ecce359..cb07947 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php @@ -24,7 +24,7 @@ class SeriesSum */ public static function evaluate($x, $n, $m, ...$args) { - if (is_array($x) || is_array($n) || is_array($m)) { + if (\is_array($x) || \is_array($n) || \is_array($m)) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 3, $x, $n, $m, ...$args); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sign.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sign.php index e40e1f6..a80e530 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sign.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sign.php @@ -23,7 +23,7 @@ class Sign */ public static function evaluate($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php index bb9f15f..a9611f1 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php @@ -22,7 +22,7 @@ class Sqrt */ public static function sqrt($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -32,7 +32,7 @@ class Sqrt return $e->getMessage(); } - return Helpers::numberOrNan(sqrt($number)); + return Helpers::numberOrNan(\sqrt($number)); } /** @@ -48,7 +48,7 @@ class Sqrt */ public static function pi($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -59,6 +59,6 @@ class Sqrt return $e->getMessage(); } - return sqrt($number * M_PI); + return \sqrt($number * M_PI); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php index 6d8f472..5091607 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php @@ -15,12 +15,12 @@ class Subtotal */ protected static function filterHiddenArgs($cellReference, $args): array { - return array_filter( + return \array_filter( $args, function ($index) use ($cellReference) { - $explodeArray = explode('.', $index); + $explodeArray = \explode('.', $index); $row = $explodeArray[1] ?? ''; - if (!is_numeric($row)) { + if (!\is_numeric($row)) { return true; } @@ -36,17 +36,17 @@ class Subtotal */ protected static function filterFormulaArgs($cellReference, $args): array { - return array_filter( + return \array_filter( $args, function ($index) use ($cellReference) { - $explodeArray = explode('.', $index); + $explodeArray = \explode('.', $index); $row = $explodeArray[1] ?? ''; $column = $explodeArray[2] ?? ''; $retVal = true; if ($cellReference->getWorksheet()->cellExists($column . $row)) { //take this cell out if it contains the SUBTOTAL or AGGREGATE functions in a formula $isFormula = $cellReference->getWorksheet()->getCell($column . $row)->isFormula(); - $cellFormula = !preg_match( + $cellFormula = !\preg_match( '/^=.*\b(SUBTOTAL|AGGREGATE)\s*\(/i', $cellReference->getWorksheet()->getCell($column . $row)->getValue() ?? '' ); @@ -92,7 +92,7 @@ class Subtotal */ public static function evaluate($functionType, ...$args) { - $cellReference = array_pop($args); + $cellReference = \array_pop($args); $bArgs = Functions::flattenArrayIndexed($args); $aArgs = []; // int keys must come before string keys for PHP 8.0+ @@ -100,12 +100,12 @@ class Subtotal // in the subsequent call to call_user_func_array. // Fortunately, order of args is unimportant to Subtotal. foreach ($bArgs as $key => $value) { - if (is_int($key)) { + if (\is_int($key)) { $aArgs[$key] = $value; } } foreach ($bArgs as $key => $value) { - if (!is_int($key)) { + if (!\is_int($key)) { $aArgs[$key] = $value; } } @@ -123,11 +123,11 @@ class Subtotal } $aArgs = self::filterFormulaArgs($cellReference, $aArgs); - if (array_key_exists($subtotal, self::CALL_FUNCTIONS)) { + if (\array_key_exists($subtotal, self::CALL_FUNCTIONS)) { /** @var callable */ $call = self::CALL_FUNCTIONS[$subtotal]; - return call_user_func_array($call, $aArgs); + return \call_user_func_array($call, $aArgs); } return ExcelError::VALUE(); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sum.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sum.php index 1a797c8..98eac59 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sum.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Sum.php @@ -28,7 +28,7 @@ class Sum // Loop through the arguments foreach (Functions::flattenArray($args) as $arg) { // Is it a numeric value? - if (is_numeric($arg)) { + if (\is_numeric($arg)) { $returnValue += $arg; } elseif (ErrorValue::isError($arg)) { return $arg; @@ -57,12 +57,12 @@ class Sum $aArgs = Functions::flattenArrayIndexed($args); foreach ($aArgs as $k => $arg) { // Is it a numeric value? - if (is_numeric($arg) || empty($arg)) { - if (is_string($arg)) { + if (\is_numeric($arg) || empty($arg)) { + if (\is_string($arg)) { $arg = (int) $arg; } $returnValue += $arg; - } elseif (is_bool($arg)) { + } elseif (\is_bool($arg)) { $returnValue += (int) $arg; } elseif (ErrorValue::isError($arg)) { return $arg; @@ -89,30 +89,30 @@ class Sum { $arrayList = $args; - $wrkArray = Functions::flattenArray(array_shift($arrayList)); - $wrkCellCount = count($wrkArray); + $wrkArray = Functions::flattenArray(\array_shift($arrayList)); + $wrkCellCount = \count($wrkArray); for ($i = 0; $i < $wrkCellCount; ++$i) { - if ((!is_numeric($wrkArray[$i])) || (is_string($wrkArray[$i]))) { + if ((!\is_numeric($wrkArray[$i])) || (\is_string($wrkArray[$i]))) { $wrkArray[$i] = 0; } } foreach ($arrayList as $matrixData) { $array2 = Functions::flattenArray($matrixData); - $count = count($array2); + $count = \count($array2); if ($wrkCellCount != $count) { return ExcelError::VALUE(); } foreach ($array2 as $i => $val) { - if ((!is_numeric($val)) || (is_string($val))) { + if ((!\is_numeric($val)) || (\is_string($val))) { $val = 0; } $wrkArray[$i] *= $val; } } - return array_sum($wrkArray); + return \array_sum($wrkArray); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SumSquares.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SumSquares.php index 34b397c..82cd379 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SumSquares.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/SumSquares.php @@ -39,8 +39,8 @@ class SumSquares private static function getCount(array $array1, array $array2): int { - $count = count($array1); - if ($count !== count($array2)) { + $count = \count($array1); + if ($count !== \count($array2)) { throw new Exception(ExcelError::NA()); } @@ -54,7 +54,7 @@ class SumSquares */ private static function numericNotString($item): bool { - return is_numeric($item) && !is_string($item); + return \is_numeric($item) && !\is_string($item); } /** diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php index 845b6c1..d49f896 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php @@ -23,7 +23,7 @@ class Cosecant */ public static function csc($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -33,7 +33,7 @@ class Cosecant return $e->getMessage(); } - return Helpers::verySmallDenominator(1.0, sin($angle)); + return Helpers::verySmallDenominator(1.0, \sin($angle)); } /** @@ -49,7 +49,7 @@ class Cosecant */ public static function csch($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -59,6 +59,6 @@ class Cosecant return $e->getMessage(); } - return Helpers::verySmallDenominator(1.0, sinh($angle)); + return Helpers::verySmallDenominator(1.0, \sinh($angle)); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php index c06f04d..2e8f093 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php @@ -23,7 +23,7 @@ class Cosine */ public static function cos($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -33,7 +33,7 @@ class Cosine return $e->getMessage(); } - return cos($number); + return \cos($number); } /** @@ -49,7 +49,7 @@ class Cosine */ public static function cosh($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -59,7 +59,7 @@ class Cosine return $e->getMessage(); } - return cosh($number); + return \cosh($number); } /** @@ -75,7 +75,7 @@ class Cosine */ public static function acos($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -85,7 +85,7 @@ class Cosine return $e->getMessage(); } - return Helpers::numberOrNan(acos($number)); + return Helpers::numberOrNan(\acos($number)); } /** @@ -101,7 +101,7 @@ class Cosine */ public static function acosh($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -111,6 +111,6 @@ class Cosine return $e->getMessage(); } - return Helpers::numberOrNan(acosh($number)); + return Helpers::numberOrNan(\acosh($number)); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php index eeedef9..ca4a24f 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php @@ -23,7 +23,7 @@ class Cotangent */ public static function cot($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -33,7 +33,7 @@ class Cotangent return $e->getMessage(); } - return Helpers::verySmallDenominator(cos($angle), sin($angle)); + return Helpers::verySmallDenominator(\cos($angle), \sin($angle)); } /** @@ -49,7 +49,7 @@ class Cotangent */ public static function coth($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -59,7 +59,7 @@ class Cotangent return $e->getMessage(); } - return Helpers::verySmallDenominator(1.0, tanh($angle)); + return Helpers::verySmallDenominator(1.0, \tanh($angle)); } /** @@ -75,7 +75,7 @@ class Cotangent */ public static function acot($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -85,7 +85,7 @@ class Cotangent return $e->getMessage(); } - return (M_PI / 2) - atan($number); + return (M_PI / 2) - \atan($number); } /** @@ -101,7 +101,7 @@ class Cotangent */ public static function acoth($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -111,7 +111,7 @@ class Cotangent return $e->getMessage(); } - $result = ($number === 1) ? NAN : (log(($number + 1) / ($number - 1)) / 2); + $result = ($number === 1) ? NAN : (\log(($number + 1) / ($number - 1)) / 2); return Helpers::numberOrNan($result); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php index 2d26e5d..a0048bf 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php @@ -23,7 +23,7 @@ class Secant */ public static function sec($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -33,7 +33,7 @@ class Secant return $e->getMessage(); } - return Helpers::verySmallDenominator(1.0, cos($angle)); + return Helpers::verySmallDenominator(1.0, \cos($angle)); } /** @@ -49,7 +49,7 @@ class Secant */ public static function sech($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -59,6 +59,6 @@ class Secant return $e->getMessage(); } - return Helpers::verySmallDenominator(1.0, cosh($angle)); + return Helpers::verySmallDenominator(1.0, \cosh($angle)); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php index 6af568c..a727521 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php @@ -23,7 +23,7 @@ class Sine */ public static function sin($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -33,7 +33,7 @@ class Sine return $e->getMessage(); } - return sin($angle); + return \sin($angle); } /** @@ -49,7 +49,7 @@ class Sine */ public static function sinh($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -59,7 +59,7 @@ class Sine return $e->getMessage(); } - return sinh($angle); + return \sinh($angle); } /** @@ -75,7 +75,7 @@ class Sine */ public static function asin($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -85,7 +85,7 @@ class Sine return $e->getMessage(); } - return Helpers::numberOrNan(asin($number)); + return Helpers::numberOrNan(\asin($number)); } /** @@ -101,7 +101,7 @@ class Sine */ public static function asinh($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -111,6 +111,6 @@ class Sine return $e->getMessage(); } - return Helpers::numberOrNan(asinh($number)); + return Helpers::numberOrNan(\asinh($number)); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php index 9e77021..8a59358 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php @@ -24,7 +24,7 @@ class Tangent */ public static function tan($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -34,7 +34,7 @@ class Tangent return $e->getMessage(); } - return Helpers::verySmallDenominator(sin($angle), cos($angle)); + return Helpers::verySmallDenominator(\sin($angle), \cos($angle)); } /** @@ -50,7 +50,7 @@ class Tangent */ public static function tanh($angle) { - if (is_array($angle)) { + if (\is_array($angle)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $angle); } @@ -60,7 +60,7 @@ class Tangent return $e->getMessage(); } - return tanh($angle); + return \tanh($angle); } /** @@ -76,7 +76,7 @@ class Tangent */ public static function atan($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -86,7 +86,7 @@ class Tangent return $e->getMessage(); } - return Helpers::numberOrNan(atan($number)); + return Helpers::numberOrNan(\atan($number)); } /** @@ -102,7 +102,7 @@ class Tangent */ public static function atanh($number) { - if (is_array($number)) { + if (\is_array($number)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $number); } @@ -112,7 +112,7 @@ class Tangent return $e->getMessage(); } - return Helpers::numberOrNan(atanh($number)); + return Helpers::numberOrNan(\atanh($number)); } /** @@ -141,7 +141,7 @@ class Tangent */ public static function atan2($xCoordinate, $yCoordinate) { - if (is_array($xCoordinate) || is_array($yCoordinate)) { + if (\is_array($xCoordinate) || \is_array($yCoordinate)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $xCoordinate, $yCoordinate); } @@ -156,6 +156,6 @@ class Tangent return ExcelError::DIV0(); } - return atan2($yCoordinate, $xCoordinate); + return \atan2($yCoordinate, $xCoordinate); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trunc.php b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trunc.php index 943e209..794acf4 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trunc.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/MathTrig/Trunc.php @@ -25,7 +25,7 @@ class Trunc */ public static function evaluate($value = 0, $digits = 0) { - if (is_array($value) || is_array($digits)) { + if (\is_array($value) || \is_array($digits)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $digits); } @@ -36,12 +36,12 @@ class Trunc return $e->getMessage(); } - $digits = floor($digits); + $digits = \floor($digits); // Truncate $adjust = 10 ** $digits; - if (($digits > 0) && (rtrim((string) (int) ((abs($value) - abs((int) $value)) * $adjust), '0') < $adjust / 10)) { + if (($digits > 0) && (\rtrim((string) (int) ((\abs($value) - \abs((int) $value)) * $adjust), '0') < $adjust / 10)) { return $value; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/AggregateBase.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/AggregateBase.php index 10933f4..bef9ab7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/AggregateBase.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/AggregateBase.php @@ -18,7 +18,7 @@ abstract class AggregateBase */ protected static function testAcceptedBoolean($arg, $k) { - if (!is_bool($arg)) { + if (!\is_bool($arg)) { return $arg; } if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_GNUMERIC) { @@ -52,10 +52,10 @@ abstract class AggregateBase if ($countNull && $arg === null && !Functions::isCellValue($k) && Functions::getCompatibilityMode() !== Functions::COMPATIBILITY_GNUMERIC) { return true; } - if (!is_numeric($arg)) { + if (!\is_numeric($arg)) { return false; } - if (!is_string($arg)) { + if (!\is_string($arg)) { return true; } if (!Functions::isCellValue($k) && Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages.php index f2b5b2a..8338201 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages.php @@ -40,11 +40,11 @@ class Averages extends AggregateBase // Is it a numeric value? // Strings containing numeric values are only counted if they are string literals (not cell values) // and then only in MS Excel and in Open Office, not in Gnumeric - if ((is_string($arg)) && (!is_numeric($arg)) && (!Functions::isCellValue($k))) { + if ((\is_string($arg)) && (!\is_numeric($arg)) && (!Functions::isCellValue($k))) { return ExcelError::VALUE(); } if (self::isAcceptedCountable($arg, $k)) { - $returnValue += abs($arg - $aMean); + $returnValue += \abs($arg - $aMean); ++$aCount; } } @@ -79,7 +79,7 @@ class Averages extends AggregateBase // Is it a numeric value? // Strings containing numeric values are only counted if they are string literals (not cell values) // and then only in MS Excel and in Open Office, not in Gnumeric - if ((is_string($arg)) && (!is_numeric($arg)) && (!Functions::isCellValue($k))) { + if ((\is_string($arg)) && (!\is_numeric($arg)) && (!Functions::isCellValue($k))) { return ExcelError::VALUE(); } if (self::isAcceptedCountable($arg, $k)) { @@ -115,9 +115,9 @@ class Averages extends AggregateBase $aCount = 0; // Loop through arguments foreach (Functions::flattenArrayIndexed($args) as $k => $arg) { - if (is_numeric($arg)) { + if (\is_numeric($arg)) { // do nothing - } elseif (is_bool($arg)) { + } elseif (\is_bool($arg)) { $arg = (int) $arg; } elseif (!Functions::isMatrixValue($k)) { $arg = 0; @@ -154,14 +154,14 @@ class Averages extends AggregateBase $returnValue = ExcelError::NAN(); $aArgs = self::filterArguments($aArgs); - $valueCount = count($aArgs); + $valueCount = \count($aArgs); if ($valueCount > 0) { - sort($aArgs, SORT_NUMERIC); + \sort($aArgs, SORT_NUMERIC); $valueCount = $valueCount / 2; - if ($valueCount == floor($valueCount)) { + if ($valueCount == \floor($valueCount)) { $returnValue = ($aArgs[$valueCount--] + $aArgs[$valueCount]) / 2; } else { - $valueCount = floor($valueCount); + $valueCount = \floor($valueCount); $returnValue = $aArgs[$valueCount]; } } @@ -198,11 +198,11 @@ class Averages extends AggregateBase protected static function filterArguments($args) { - return array_filter( + return \array_filter( $args, function ($value) { // Is it a numeric value? - return is_numeric($value) && (!is_string($value)); + return \is_numeric($value) && (!\is_string($value)); } ); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages/Mean.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages/Mean.php index 001c91e..aa9e891 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages/Mean.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Averages/Mean.php @@ -30,7 +30,7 @@ class Mean $aArgs = Functions::flattenArray($args); $aMean = MathTrig\Operations::product($aArgs); - if (is_numeric($aMean) && ($aMean > 0)) { + if (\is_numeric($aMean) && ($aMean > 0)) { $aCount = Counts::COUNT($aArgs); if (Minimum::min($aArgs) > 0) { return $aMean ** (1 / $aCount); @@ -65,7 +65,7 @@ class Mean $aCount = 0; foreach ($aArgs as $arg) { // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { if ($arg <= 0) { return ExcelError::NAN(); } @@ -101,9 +101,9 @@ class Mean $aArgs = Functions::flattenArray($args); // Calculate - $percent = array_pop($aArgs); + $percent = \array_pop($aArgs); - if ((is_numeric($percent)) && (!is_string($percent))) { + if ((\is_numeric($percent)) && (!\is_string($percent))) { if (($percent < 0) || ($percent > 1)) { return ExcelError::NAN(); } @@ -111,17 +111,17 @@ class Mean $mArgs = []; foreach ($aArgs as $arg) { // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $mArgs[] = $arg; } } - $discard = floor(Counts::COUNT($mArgs) * $percent / 2); - sort($mArgs); + $discard = \floor(Counts::COUNT($mArgs) * $percent / 2); + \sort($mArgs); for ($i = 0; $i < $discard; ++$i) { - array_pop($mArgs); - array_shift($mArgs); + \array_pop($mArgs); + \array_shift($mArgs); } return Averages::average($mArgs); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Conditional.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Conditional.php index 5d40943..ef4f514 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Conditional.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Conditional.php @@ -32,7 +32,7 @@ class Conditional */ public static function AVERAGEIF($range, $condition, $averageRange = []) { - if (!is_array($range) || !is_array($averageRange) || array_key_exists(0, $range) || array_key_exists(0, $averageRange)) { + if (!\is_array($range) || !\is_array($averageRange) || \array_key_exists(0, $range) || \array_key_exists(0, $averageRange)) { throw new CalcException('Must specify range of cells, not any kind of literal'); } $database = self::databaseFromRangeAndValue($range, $averageRange); @@ -57,11 +57,11 @@ class Conditional { if (empty($args)) { return 0.0; - } elseif (count($args) === 3) { + } elseif (\count($args) === 3) { return self::AVERAGEIF($args[1], $args[2], $args[0]); } foreach ($args as $arg) { - if (is_array($arg) && array_key_exists(0, $arg)) { + if (\is_array($arg) && \array_key_exists(0, $arg)) { throw new CalcException('Must specify range of cells, not any kind of literal'); } } @@ -88,15 +88,15 @@ class Conditional public static function COUNTIF($range, $condition) { // Filter out any empty values that shouldn't be included in a COUNT - $range = array_filter( + $range = \array_filter( Functions::flattenArray($range), function ($value) { return $value !== null && $value !== ''; } ); - $range = array_merge([[self::CONDITION_COLUMN_NAME]], array_chunk($range, 1)); - $condition = array_merge([[self::CONDITION_COLUMN_NAME]], [[$condition]]); + $range = \array_merge([[self::CONDITION_COLUMN_NAME]], \array_chunk($range, 1)); + $condition = \array_merge([[self::CONDITION_COLUMN_NAME]], [[$condition]]); return DCount::evaluate($range, null, $condition, false); } @@ -117,7 +117,7 @@ class Conditional { if (empty($args)) { return 0; - } elseif (count($args) === 2) { + } elseif (\count($args) === 2) { return self::COUNTIF(...$args); } @@ -213,7 +213,7 @@ class Conditional { if (empty($args)) { return 0.0; - } elseif (count($args) === 3) { + } elseif (\count($args) === 3) { return self::SUMIF($args[1], $args[2], $args[0]); } @@ -228,15 +228,15 @@ class Conditional $conditions = self::buildConditions(1, ...$args); // Scrutinizer thinks first parameter of array_map can't be null. It is wrong. - return array_map(/** @scrutinizer ignore-type */ null, ...$conditions); + return \array_map(/** @scrutinizer ignore-type */ null, ...$conditions); } private static function buildConditionSetForValueRange(...$args): array { $conditions = self::buildConditions(2, ...$args); - if (count($conditions) === 1) { - return array_map( + if (\count($conditions) === 1) { + return \array_map( function ($value) { return [$value]; }, @@ -244,7 +244,7 @@ class Conditional ); } - return array_map(/** @scrutinizer ignore-type */ null, ...$conditions); + return \array_map(/** @scrutinizer ignore-type */ null, ...$conditions); } private static function buildConditions(int $startOffset, ...$args): array @@ -252,9 +252,9 @@ class Conditional $conditions = []; $pairCount = 1; - $argumentCount = count($args); + $argumentCount = \count($args); for ($argument = $startOffset; $argument < $argumentCount; $argument += 2) { - $conditions[] = array_merge([sprintf(self::CONDITIONAL_COLUMN_NAME, $pairCount)], [$args[$argument]]); + $conditions[] = \array_merge([\sprintf(self::CONDITIONAL_COLUMN_NAME, $pairCount)], [$args[$argument]]); ++$pairCount; } @@ -271,7 +271,7 @@ class Conditional private static function buildDatabaseWithValueRange(...$args): array { $database = []; - $database[] = array_merge( + $database[] = \array_merge( [self::VALUE_COLUMN_NAME], Functions::flattenArray($args[0]) ); @@ -282,16 +282,16 @@ class Conditional private static function buildDataSet(int $startOffset, array $database, ...$args): array { $pairCount = 1; - $argumentCount = count($args); + $argumentCount = \count($args); for ($argument = $startOffset; $argument < $argumentCount; $argument += 2) { - $database[] = array_merge( - [sprintf(self::CONDITIONAL_COLUMN_NAME, $pairCount)], + $database[] = \array_merge( + [\sprintf(self::CONDITIONAL_COLUMN_NAME, $pairCount)], Functions::flattenArray($args[$argument]) ); ++$pairCount; } - return array_map(/** @scrutinizer ignore-type */ null, ...$database); + return \array_map(/** @scrutinizer ignore-type */ null, ...$database); } private static function databaseFromRangeAndValue(array $range, array $valueRange = []): array @@ -303,7 +303,7 @@ class Conditional $valueRange = $range; } - $database = array_map(/** @scrutinizer ignore-type */ null, array_merge([self::CONDITION_COLUMN_NAME], $range), array_merge([self::VALUE_COLUMN_NAME], $valueRange)); + $database = \array_map(/** @scrutinizer ignore-type */ null, \array_merge([self::CONDITION_COLUMN_NAME], $range), \array_merge([self::VALUE_COLUMN_NAME], $valueRange)); return $database; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Confidence.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Confidence.php index ec2ce34..6b2452f 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Confidence.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Confidence.php @@ -29,7 +29,7 @@ class Confidence */ public static function CONFIDENCE($alpha, $stdDev, $size) { - if (is_array($alpha) || is_array($stdDev) || is_array($size)) { + if (\is_array($alpha) || \is_array($stdDev) || \is_array($size)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $alpha, $stdDev, $size); } @@ -47,6 +47,6 @@ class Confidence /** @var float */ $temp = Distributions\StandardNormal::inverse(1 - $alpha / 2); - return Functions::scalar($temp * $stdDev / sqrt($size)); + return Functions::scalar($temp * $stdDev / \sqrt($size)); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Counts.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Counts.php index 6792730..1ec564b 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Counts.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Counts.php @@ -83,7 +83,7 @@ class Counts extends AggregateBase if ($range === null) { return 1; } - if (!is_array($range) || array_key_exists(0, $range)) { + if (!\is_array($range) || \array_key_exists(0, $range)) { throw new CalcException('Must specify range of cells, not any kind of literal'); } $returnValue = 0; @@ -92,7 +92,7 @@ class Counts extends AggregateBase $aArgs = Functions::flattenArray($range); foreach ($aArgs as $arg) { // Is it a blank cell? - if (($arg === null) || ((is_string($arg)) && ($arg == ''))) { + if (($arg === null) || ((\is_string($arg)) && ($arg == ''))) { ++$returnValue; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Deviations.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Deviations.php index 6b1db3a..4d83a64 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Deviations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Deviations.php @@ -24,7 +24,7 @@ class Deviations $aArgs = Functions::flattenArrayIndexed($args); $aMean = Averages::average($aArgs); - if (!is_numeric($aMean)) { + if (!\is_numeric($aMean)) { return ExcelError::NAN(); } @@ -34,13 +34,13 @@ class Deviations foreach ($aArgs as $k => $arg) { // Is it a numeric value? if ( - (is_bool($arg)) && + (\is_bool($arg)) && ((!Functions::isCellValue($k)) || (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE)) ) { $arg = (int) $arg; } - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $returnValue += ($arg - $aMean) ** 2; ++$aCount; } @@ -65,7 +65,7 @@ class Deviations { $aArgs = Functions::flattenArrayIndexed($args); $mean = Averages::average($aArgs); - if (!is_numeric($mean)) { + if (!\is_numeric($mean)) { return ExcelError::DIV0(); } $stdDev = StandardDeviations::STDEV($aArgs); @@ -74,10 +74,10 @@ class Deviations $count = $summer = 0; foreach ($aArgs as $k => $arg) { - if ((is_bool($arg)) && (!Functions::isMatrixValue($k))) { + if ((\is_bool($arg)) && (!Functions::isMatrixValue($k))) { } else { // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $summer += (($arg - $mean) / $stdDev) ** 4; ++$count; } @@ -110,23 +110,23 @@ class Deviations { $aArgs = Functions::flattenArrayIndexed($args); $mean = Averages::average($aArgs); - if (!is_numeric($mean)) { + if (!\is_numeric($mean)) { return ExcelError::DIV0(); } $stdDev = StandardDeviations::STDEV($aArgs); - if ($stdDev === 0.0 || is_string($stdDev)) { + if ($stdDev === 0.0 || \is_string($stdDev)) { return ExcelError::DIV0(); } $count = $summer = 0; // Loop through arguments foreach ($aArgs as $k => $arg) { - if ((is_bool($arg)) && (!Functions::isMatrixValue($k))) { - } elseif (!is_numeric($arg)) { + if ((\is_bool($arg)) && (!Functions::isMatrixValue($k))) { + } elseif (!\is_numeric($arg)) { return ExcelError::VALUE(); } else { // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $summer += (($arg - $mean) / $stdDev) ** 3; ++$count; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php index 8b41ac8..517b537 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php @@ -39,7 +39,7 @@ class Beta */ public static function distribution($value, $alpha, $beta, $rMin = 0.0, $rMax = 1.0) { - if (is_array($value) || is_array($alpha) || is_array($beta) || is_array($rMin) || is_array($rMax)) { + if (\is_array($value) || \is_array($alpha) || \is_array($beta) || \is_array($rMin) || \is_array($rMax)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $alpha, $beta, $rMin, $rMax); } @@ -93,7 +93,7 @@ class Beta */ public static function inverse($probability, $alpha, $beta, $rMin = 0.0, $rMax = 1.0) { - if (is_array($probability) || is_array($alpha) || is_array($beta) || is_array($rMin) || is_array($rMax)) { + if (\is_array($probability) || \is_array($alpha) || \is_array($beta) || \is_array($rMin) || \is_array($rMax)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $alpha, $beta, $rMin, $rMax); } @@ -148,7 +148,7 @@ class Beta return ExcelError::NA(); } - return round($rMin + $guess * ($rMax - $rMin), 12); + return \round($rMin + $guess * ($rMax - $rMin), 12); } /** @@ -175,7 +175,7 @@ class Beta return 0.0; } - $beta_gam = exp((0 - self::logBeta($p, $q)) + $p * log($x) + $q * log(1.0 - $x)); + $beta_gam = \exp((0 - self::logBeta($p, $q)) + $p * \log($x) + $q * \log(1.0 - $x)); if ($x < ($p + 1.0) / ($p + $q + 2.0)) { return $beta_gam * self::betaFraction($x, $p, $q) / $p; } @@ -228,36 +228,36 @@ class Beta $p_plus = $p + 1.0; $p_minus = $p - 1.0; $h = 1.0 - $sum_pq * $x / $p_plus; - if (abs($h) < self::XMININ) { + if (\abs($h) < self::XMININ) { $h = self::XMININ; } $h = 1.0 / $h; $frac = $h; $m = 1; $delta = 0.0; - while ($m <= self::MAX_ITERATIONS && abs($delta - 1.0) > Functions::PRECISION) { + while ($m <= self::MAX_ITERATIONS && \abs($delta - 1.0) > Functions::PRECISION) { $m2 = 2 * $m; // even index for d $d = $m * ($q - $m) * $x / (($p_minus + $m2) * ($p + $m2)); $h = 1.0 + $d * $h; - if (abs($h) < self::XMININ) { + if (\abs($h) < self::XMININ) { $h = self::XMININ; } $h = 1.0 / $h; $c = 1.0 + $d / $c; - if (abs($c) < self::XMININ) { + if (\abs($c) < self::XMININ) { $c = self::XMININ; } $frac *= $h * $c; // odd index for d $d = -($p + $m) * ($sum_pq + $m) * $x / (($p + $m2) * ($p_plus + $m2)); $h = 1.0 + $d * $h; - if (abs($h) < self::XMININ) { + if (\abs($h) < self::XMININ) { $h = self::XMININ; } $h = 1.0 / $h; $c = 1.0 + $d / $c; - if (abs($c) < self::XMININ) { + if (\abs($c) < self::XMININ) { $c = self::XMININ; } $delta = $h * $c; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php index 02b53e8..1f959b4 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php @@ -36,7 +36,7 @@ class Binomial */ public static function distribution($value, $trials, $probability, $cumulative) { - if (is_array($value) || is_array($trials) || is_array($probability) || is_array($cumulative)) { + if (\is_array($value) || \is_array($trials) || \is_array($probability) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $trials, $probability, $cumulative); } @@ -85,7 +85,7 @@ class Binomial */ public static function range($trials, $probability, $successes, $limit = null) { - if (is_array($trials) || is_array($probability) || is_array($successes) || is_array($limit)) { + if (\is_array($trials) || \is_array($probability) || \is_array($successes) || \is_array($limit)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $trials, $probability, $successes, $limit); } @@ -139,11 +139,11 @@ class Binomial * with the same dimensions * * TODO Add support for the cumulative flag not present for NEGBINOMDIST, but introduced for NEGBINOM.DIST - * The cumulative default should be false to reflect the behaviour of NEGBINOMDIST + * The cumulative default should be false to reflect the behavior of NEGBINOMDIST */ public static function negative($failures, $successes, $probability) { - if (is_array($failures) || is_array($successes) || is_array($probability)) { + if (\is_array($failures) || \is_array($successes) || \is_array($probability)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $failures, $successes, $probability); } @@ -189,7 +189,7 @@ class Binomial */ public static function inverse($trials, $probability, $alpha) { - if (is_array($trials) || is_array($probability) || is_array($alpha)) { + if (\is_array($trials) || \is_array($probability) || \is_array($alpha)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $trials, $probability, $alpha); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php index c874336..9f40274 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php @@ -31,7 +31,7 @@ class ChiSquared */ public static function distributionRightTail($value, $degrees) { - if (is_array($value) || is_array($degrees)) { + if (\is_array($value) || \is_array($degrees)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $degrees); } @@ -74,7 +74,7 @@ class ChiSquared */ public static function distributionLeftTail($value, $degrees, $cumulative) { - if (is_array($value) || is_array($degrees) || is_array($cumulative)) { + if (\is_array($value) || \is_array($degrees) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $degrees, $cumulative); } @@ -101,7 +101,7 @@ class ChiSquared return 1 - self::distributionRightTail($value, $degrees); } - return ($value ** (($degrees / 2) - 1) * exp(-$value / 2)) / + return ($value ** (($degrees / 2) - 1) * \exp(-$value / 2)) / ((2 ** ($degrees / 2)) * Gamma::gammaValue($degrees / 2)); } @@ -121,7 +121,7 @@ class ChiSquared */ public static function inverseRightTail($probability, $degrees) { - if (is_array($probability) || is_array($degrees)) { + if (\is_array($probability) || \is_array($degrees)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $degrees); } @@ -162,7 +162,7 @@ class ChiSquared */ public static function inverseLeftTail($probability, $degrees) { - if (is_array($probability) || is_array($degrees)) { + if (\is_array($probability) || \is_array($degrees)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $degrees); } @@ -194,13 +194,13 @@ class ChiSquared */ public static function test($actual, $expected) { - $rows = count($actual); + $rows = \count($actual); $actual = Functions::flattenArray($actual); $expected = Functions::flattenArray($expected); - $columns = count($actual) / $rows; + $columns = \count($actual) / $rows; - $countActuals = count($actual); - $countExpected = count($expected); + $countActuals = \count($actual); + $countExpected = \count($expected); if ($countActuals !== $countExpected || $countActuals === 1) { return ExcelError::NAN(); } @@ -237,7 +237,7 @@ class ChiSquared { // bracket the root $min = 0; - $sd = sqrt(2.0 * $degrees); + $sd = \sqrt(2.0 * $degrees); $max = 2 * $sd; $s = -1; @@ -296,7 +296,7 @@ class ChiSquared } } - return $sum * exp(-$x + $a * log($x) - $gln); + return $sum * \exp(-$x + $a * \log($x) - $gln); } // Return the incomplete gamma function Q(n/2,x) evaluated by @@ -317,21 +317,21 @@ class ChiSquared $an = -$i * ($i - $a); $b += 2; $d = $an * $d + $b; - if (abs($d) < $fpmin) { + if (\abs($d) < $fpmin) { $d = $fpmin; } $c = $b + $an / $c; - if (abs($c) < $fpmin) { + if (\abs($c) < $fpmin) { $c = $fpmin; } $d = 1 / $d; $del = $d * $c; $h = $h * $del; - if (abs($del - 1) < self::EPS) { + if (\abs($del - 1) < self::EPS) { break; } } - return $h * exp(-$x + $a * log($x) - $gln); + return $h * \exp(-$x + $a * \log($x) - $gln); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php index a03671c..8f40821 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php @@ -30,7 +30,7 @@ class Exponential */ public static function distribution($value, $lambda, $cumulative) { - if (is_array($value) || is_array($lambda) || is_array($cumulative)) { + if (\is_array($value) || \is_array($lambda) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $lambda, $cumulative); } @@ -47,9 +47,9 @@ class Exponential } if ($cumulative === true) { - return 1 - exp(0 - $value * $lambda); + return 1 - \exp(0 - $value * $lambda); } - return $lambda * exp(0 - $value * $lambda); + return $lambda * \exp(0 - $value * $lambda); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php index ff413b6..c8f9469 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php @@ -33,7 +33,7 @@ class F */ public static function distribution($value, $u, $v, $cumulative) { - if (is_array($value) || is_array($u) || is_array($v) || is_array($cumulative)) { + if (\is_array($value) || \is_array($u) || \is_array($v) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $u, $v, $cumulative); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php index df9906e..42cc53a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php @@ -26,7 +26,7 @@ class Fisher */ public static function distribution($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -40,7 +40,7 @@ class Fisher return ExcelError::NAN(); } - return 0.5 * log((1 + $value) / (1 - $value)); + return 0.5 * \log((1 + $value) / (1 - $value)); } /** @@ -59,7 +59,7 @@ class Fisher */ public static function inverse($probability) { - if (is_array($probability)) { + if (\is_array($probability)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $probability); } @@ -69,6 +69,6 @@ class Fisher return $e->getMessage(); } - return (exp(2 * $probability) - 1) / (exp(2 * $probability) + 1); + return (\exp(2 * $probability) - 1) / (\exp(2 * $probability) + 1); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php index 216f234..f4abf38 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php @@ -24,7 +24,7 @@ class Gamma extends GammaBase */ public static function gamma($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -61,7 +61,7 @@ class Gamma extends GammaBase */ public static function distribution($value, $a, $b, $cumulative) { - if (is_array($value) || is_array($a) || is_array($b) || is_array($cumulative)) { + if (\is_array($value) || \is_array($a) || \is_array($b) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $a, $b, $cumulative); } @@ -99,7 +99,7 @@ class Gamma extends GammaBase */ public static function inverse($probability, $alpha, $beta) { - if (is_array($probability) || is_array($alpha) || is_array($beta)) { + if (\is_array($probability) || \is_array($alpha) || \is_array($beta)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $alpha, $beta); } @@ -132,7 +132,7 @@ class Gamma extends GammaBase */ public static function ln($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -146,6 +146,6 @@ class Gamma extends GammaBase return ExcelError::NAN(); } - return log(self::gammaValue($value)); + return \log(self::gammaValue($value)); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/GammaBase.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/GammaBase.php index 8e6386e..844391b 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/GammaBase.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/GammaBase.php @@ -23,7 +23,7 @@ abstract class GammaBase return self::incompleteGamma($a, $value / $b) / self::gammaValue($a); } - return (1 / ($b ** $a * self::gammaValue($a))) * $value ** ($a - 1) * exp(0 - ($value / $b)); + return (1 / ($b ** $a * self::gammaValue($a))) * $value ** ($a - 1) * \exp(0 - ($value / $b)); } protected static function calculateInverse(float $probability, float $alpha, float $beta) @@ -35,7 +35,7 @@ abstract class GammaBase $x = $xNew = 1; $i = 0; - while ((abs($dx) > Functions::PRECISION) && (++$i <= self::MAX_ITERATIONS)) { + while ((\abs($dx) > Functions::PRECISION) && (++$i <= self::MAX_ITERATIONS)) { // Apply Newton-Raphson step $result = self::calculateDistribution($x, $alpha, $beta, true); $error = $result - $probability; @@ -87,7 +87,7 @@ abstract class GammaBase $summer += ($x ** $n / $divisor); } - return $x ** $a * exp(0 - $x) * $summer; + return $x ** $a * \exp(0 - $x) * $summer; } // @@ -111,14 +111,14 @@ abstract class GammaBase $y = $x = $value; $tmp = $x + 5.5; - $tmp -= ($x + 0.5) * log($tmp); + $tmp -= ($x + 0.5) * \log($tmp); $summer = $p0; for ($j = 1; $j <= 6; ++$j) { $summer += ($p[$j] / ++$y); } - return exp(0 - $tmp + log(self::SQRT2PI * $summer / $x)); + return \exp(0 - $tmp + \log(self::SQRT2PI * $summer / $x)); } private const LG_D1 = -0.5772156649015328605195174; @@ -266,7 +266,7 @@ abstract class GammaBase $y = $x; if ($y > 0.0 && $y <= self::LOG_GAMMA_X_MAX_VALUE) { if ($y <= self::EPS) { - $res = -log($y); + $res = -\log($y); } elseif ($y <= 1.5) { $res = self::logGamma1($y); } elseif ($y <= 4.0) { @@ -298,7 +298,7 @@ abstract class GammaBase // EPS .LT. X .LE. 1.5 // --------------------- if ($y < self::PNT68) { - $corr = -log($y); + $corr = -\log($y); $xm1 = $y; } else { $corr = 0.0; @@ -370,8 +370,8 @@ abstract class GammaBase $res = $res / $ysq + self::LG_C[$i]; } $res /= $y; - $corr = log($y); - $res = $res + log(self::SQRT2PI) - 0.5 * $corr; + $corr = \log($y); + $res = $res + \log(self::SQRT2PI) - 0.5 * $corr; $res += $y * ($corr - 1.0); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php index b3ad69d..98aa83d 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php @@ -33,8 +33,8 @@ class HyperGeometric public static function distribution($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber) { if ( - is_array($sampleSuccesses) || is_array($sampleNumber) || - is_array($populationSuccesses) || is_array($populationNumber) + \is_array($sampleSuccesses) || \is_array($sampleNumber) || + \is_array($populationSuccesses) || \is_array($populationNumber) ) { return self::evaluateArrayArguments( [self::class, __FUNCTION__], diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php index d572d23..23fd7ba 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php @@ -29,7 +29,7 @@ class LogNormal */ public static function cumulative($value, $mean, $stdDev) { - if (is_array($value) || is_array($mean) || is_array($stdDev)) { + if (\is_array($value) || \is_array($mean) || \is_array($stdDev)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev); } @@ -45,7 +45,7 @@ class LogNormal return ExcelError::NAN(); } - return StandardNormal::cumulative((log($value) - $mean) / $stdDev); + return StandardNormal::cumulative((\log($value) - $mean) / $stdDev); } /** @@ -69,7 +69,7 @@ class LogNormal */ public static function distribution($value, $mean, $stdDev, $cumulative = false) { - if (is_array($value) || is_array($mean) || is_array($stdDev) || is_array($cumulative)) { + if (\is_array($value) || \is_array($mean) || \is_array($stdDev) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev, $cumulative); } @@ -87,11 +87,11 @@ class LogNormal } if ($cumulative === true) { - return StandardNormal::distribution((log($value) - $mean) / $stdDev, true); + return StandardNormal::distribution((\log($value) - $mean) / $stdDev, true); } - return (1 / (sqrt(2 * M_PI) * $stdDev * $value)) * - exp(0 - ((log($value) - $mean) ** 2 / (2 * $stdDev ** 2))); + return (1 / (\sqrt(2 * M_PI) * $stdDev * $value)) * + \exp(0 - ((\log($value) - $mean) ** 2 / (2 * $stdDev ** 2))); } /** @@ -116,7 +116,7 @@ class LogNormal */ public static function inverse($probability, $mean, $stdDev) { - if (is_array($probability) || is_array($mean) || is_array($stdDev)) { + if (\is_array($probability) || \is_array($mean) || \is_array($stdDev)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $mean, $stdDev); } @@ -134,6 +134,6 @@ class LogNormal /** @var float */ $inverse = StandardNormal::inverse($probability); - return exp($mean + $stdDev * $inverse); + return \exp($mean + $stdDev * $inverse); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/NewtonRaphson.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/NewtonRaphson.php index b994864..eedb9e8 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/NewtonRaphson.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/NewtonRaphson.php @@ -25,9 +25,9 @@ class NewtonRaphson $x = $xNew = 1; $i = 0; - while ((abs($dx) > Functions::PRECISION) && ($i++ < self::MAX_ITERATIONS)) { + while ((\abs($dx) > Functions::PRECISION) && ($i++ < self::MAX_ITERATIONS)) { // Apply Newton-Raphson step - $result = call_user_func($this->callback, $x); + $result = \call_user_func($this->callback, $x); $error = $result - $probability; if ($error == 0.0) { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php index 67533c4..1d4646b 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php @@ -35,7 +35,7 @@ class Normal */ public static function distribution($value, $mean, $stdDev, $cumulative) { - if (is_array($value) || is_array($mean) || is_array($stdDev) || is_array($cumulative)) { + if (\is_array($value) || \is_array($mean) || \is_array($stdDev) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev, $cumulative); } @@ -53,10 +53,10 @@ class Normal } if ($cumulative) { - return 0.5 * (1 + Engineering\Erf::erfValue(($value - $mean) / ($stdDev * sqrt(2)))); + return 0.5 * (1 + Engineering\Erf::erfValue(($value - $mean) / ($stdDev * \sqrt(2)))); } - return (1 / (self::SQRT2PI * $stdDev)) * exp(0 - (($value - $mean) ** 2 / (2 * ($stdDev * $stdDev)))); + return (1 / (self::SQRT2PI * $stdDev)) * \exp(0 - (($value - $mean) ** 2 / (2 * ($stdDev * $stdDev)))); } /** @@ -77,7 +77,7 @@ class Normal */ public static function inverse($probability, $mean, $stdDev) { - if (is_array($probability) || is_array($mean) || is_array($stdDev)) { + if (\is_array($probability) || \is_array($mean) || \is_array($stdDev)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $mean, $stdDev); } @@ -158,13 +158,13 @@ class Normal if (0 < $p && $p < $p_low) { // Rational approximation for lower region. - $q = sqrt(-2 * log($p)); + $q = \sqrt(-2 * \log($p)); return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); } elseif ($p_high < $p && $p < 1) { // Rational approximation for upper region. - $q = sqrt(-2 * log(1 - $p)); + $q = \sqrt(-2 * \log(1 - $p)); return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php index 041c34a..70d7b9c 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php @@ -31,7 +31,7 @@ class Poisson */ public static function distribution($value, $mean, $cumulative) { - if (is_array($value) || is_array($mean) || is_array($cumulative)) { + if (\is_array($value) || \is_array($mean) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $cumulative); } @@ -49,18 +49,18 @@ class Poisson if ($cumulative) { $summer = 0; - $floor = floor($value); + $floor = \floor($value); for ($i = 0; $i <= $floor; ++$i) { /** @var float */ $fact = MathTrig\Factorial::fact($i); $summer += $mean ** $i / $fact; } - return exp(0 - $mean) * $summer; + return \exp(0 - $mean) * $summer; } /** @var float */ $fact = MathTrig\Factorial::fact($value); - return (exp(0 - $mean) * $mean ** $value) / $fact; + return (\exp(0 - $mean) * $mean ** $value) / $fact; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php index a655fa7..cdd6c0a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php @@ -96,11 +96,11 @@ class StandardNormal */ public static function gauss($value) { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } - if (!is_numeric($value)) { + if (!\is_numeric($value)) { return ExcelError::VALUE(); } /** @var float */ @@ -130,13 +130,13 @@ class StandardNormal */ public static function zTest($dataSet, $m0, $sigma = null) { - if (is_array($m0) || is_array($sigma)) { + if (\is_array($m0) || \is_array($sigma)) { return self::evaluateArrayArgumentsSubsetFrom([self::class, __FUNCTION__], 1, $dataSet, $m0, $sigma); } $dataSet = Functions::flattenArrayIndexed($dataSet); - if (!is_numeric($m0) || ($sigma !== null && !is_numeric($sigma))) { + if (!\is_numeric($m0) || ($sigma !== null && !\is_numeric($sigma))) { return ExcelError::VALUE(); } @@ -144,8 +144,8 @@ class StandardNormal /** @var float */ $sigma = StandardDeviations::STDEV($dataSet); } - $n = count($dataSet); + $n = \count($dataSet); - return 1 - self::cumulative((Averages::average($dataSet) - $m0) / ($sigma / sqrt($n))); + return 1 - self::cumulative((Averages::average($dataSet) - $m0) / ($sigma / \sqrt($n))); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php index 8afc5c4..2788d2f 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php @@ -31,7 +31,7 @@ class StudentT */ public static function distribution($value, $degrees, $tails) { - if (is_array($value) || is_array($degrees) || is_array($tails)) { + if (\is_array($value) || \is_array($degrees) || \is_array($tails)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $degrees, $tails); } @@ -66,7 +66,7 @@ class StudentT */ public static function inverse($probability, $degrees) { - if (is_array($probability) || is_array($degrees)) { + if (\is_array($probability) || \is_array($degrees)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $probability, $degrees); } @@ -105,9 +105,9 @@ class StudentT // Algorithms", editied by P Griffiths and I D Hill (1985; Ellis // Horwood Ltd.; W. Sussex, England). $tterm = $degrees; - $ttheta = atan2($value, sqrt($tterm)); - $tc = cos($ttheta); - $ts = sin($ttheta); + $ttheta = \atan2($value, \sqrt($tterm)); + $tc = \cos($ttheta); + $ts = \sin($ttheta); if (($degrees % 2) === 1) { $ti = 3; @@ -131,9 +131,9 @@ class StudentT $tValue = 0.5 * (1 + $tsum); if ($tails == 1) { - return 1 - abs($tValue); + return 1 - \abs($tValue); } - return 1 - abs((1 - $tValue) - $tValue); + return 1 - \abs((1 - $tValue) - $tValue); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php index 51392c4..b845ac2 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php @@ -31,7 +31,7 @@ class Weibull */ public static function distribution($value, $alpha, $beta, $cumulative) { - if (is_array($value) || is_array($alpha) || is_array($beta) || is_array($cumulative)) { + if (\is_array($value) || \is_array($alpha) || \is_array($beta) || \is_array($cumulative)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $alpha, $beta, $cumulative); } @@ -49,9 +49,9 @@ class Weibull } if ($cumulative) { - return 1 - exp(0 - ($value / $beta) ** $alpha); + return 1 - \exp(0 - ($value / $beta) ** $alpha); } - return ($alpha / $beta ** $alpha) * $value ** ($alpha - 1) * exp(0 - ($value / $beta) ** $alpha); + return ($alpha / $beta ** $alpha) * $value ** ($alpha - 1) * \exp(0 - ($value / $beta) ** $alpha); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/MaxMinBase.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/MaxMinBase.php index bd17b06..1e21a51 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/MaxMinBase.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/MaxMinBase.php @@ -6,9 +6,9 @@ abstract class MaxMinBase { protected static function datatypeAdjustmentAllowStrings($value) { - if (is_bool($value)) { + if (\is_bool($value)) { return (int) $value; - } elseif (is_string($value)) { + } elseif (\is_string($value)) { return 0; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Maximum.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Maximum.php index 304b44b..9236095 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Maximum.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Maximum.php @@ -33,7 +33,7 @@ class Maximum extends MaxMinBase break; } // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { if (($returnValue === null) || ($arg > $returnValue)) { $returnValue = $arg; } @@ -72,7 +72,7 @@ class Maximum extends MaxMinBase break; } // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if ((\is_numeric($arg)) || (\is_bool($arg)) || ((\is_string($arg) && ($arg != '')))) { $arg = self::datatypeAdjustmentAllowStrings($arg); if (($returnValue === null) || ($arg > $returnValue)) { $returnValue = $arg; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Minimum.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Minimum.php index 0dbbf3a..822a6ac 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Minimum.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Minimum.php @@ -33,7 +33,7 @@ class Minimum extends MaxMinBase break; } // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { if (($returnValue === null) || ($arg < $returnValue)) { $returnValue = $arg; } @@ -72,7 +72,7 @@ class Minimum extends MaxMinBase break; } // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if ((\is_numeric($arg)) || (\is_bool($arg)) || ((\is_string($arg) && ($arg != '')))) { $arg = self::datatypeAdjustmentAllowStrings($arg); if (($returnValue === null) || ($arg < $returnValue)) { $returnValue = $arg; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Percentiles.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Percentiles.php index 9973823..70ac877 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Percentiles.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Percentiles.php @@ -29,7 +29,7 @@ class Percentiles $aArgs = Functions::flattenArray($args); // Calculate - $entry = array_pop($aArgs); + $entry = \array_pop($aArgs); try { $entry = StatisticalValidations::validateFloat($entry); @@ -42,12 +42,12 @@ class Percentiles } $mArgs = self::percentileFilterValues($aArgs); - $mValueCount = count($mArgs); + $mValueCount = \count($mArgs); if ($mValueCount > 0) { - sort($mArgs); + \sort($mArgs); $count = Counts::COUNT($mArgs); $index = $entry * ($count - 1); - $iBase = floor($index); + $iBase = \floor($index); if ($index == $iBase) { return $mArgs[$index]; } @@ -88,18 +88,18 @@ class Percentiles } $valueSet = self::rankFilterValues($valueSet); - $valueCount = count($valueSet); + $valueCount = \count($valueSet); if ($valueCount == 0) { return ExcelError::NA(); } - sort($valueSet, SORT_NUMERIC); + \sort($valueSet, SORT_NUMERIC); $valueAdjustor = $valueCount - 1; if (($value < $valueSet[0]) || ($value > $valueSet[$valueAdjustor])) { return ExcelError::NA(); } - $pos = array_search($value, $valueSet); + $pos = \array_search($value, $valueSet); if ($pos === false) { $pos = 0; $testValue = $valueSet[0]; @@ -110,7 +110,7 @@ class Percentiles $pos += (($value - $valueSet[$pos]) / ($testValue - $valueSet[$pos])); } - return round($pos / $valueAdjustor, $significance); + return \round($pos / $valueAdjustor, $significance); } /** @@ -128,7 +128,7 @@ class Percentiles public static function QUARTILE(...$args) { $aArgs = Functions::flattenArray($args); - $entry = array_pop($aArgs); + $entry = \array_pop($aArgs); try { $entry = StatisticalValidations::validateFloat($entry); @@ -136,7 +136,7 @@ class Percentiles return $e->getMessage(); } - $entry = floor($entry); + $entry = \floor($entry); $entry /= 4; if (($entry < 0) || ($entry > 1)) { return ExcelError::NAN(); @@ -171,12 +171,12 @@ class Percentiles $valueSet = self::rankFilterValues($valueSet); if ($order === self::RANK_SORT_DESCENDING) { - rsort($valueSet, SORT_NUMERIC); + \rsort($valueSet, SORT_NUMERIC); } else { - sort($valueSet, SORT_NUMERIC); + \sort($valueSet, SORT_NUMERIC); } - $pos = array_search($value, $valueSet); + $pos = \array_search($value, $valueSet); if ($pos === false) { return ExcelError::NA(); } @@ -186,20 +186,20 @@ class Percentiles protected static function percentileFilterValues(array $dataSet) { - return array_filter( + return \array_filter( $dataSet, function ($value): bool { - return is_numeric($value) && !is_string($value); + return \is_numeric($value) && !\is_string($value); } ); } protected static function rankFilterValues(array $dataSet) { - return array_filter( + return \array_filter( $dataSet, function ($value): bool { - return is_numeric($value); + return \is_numeric($value); } ); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Permutations.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Permutations.php index 5d9d304..b9765e5 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Permutations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Permutations.php @@ -32,7 +32,7 @@ class Permutations */ public static function PERMUT($numObjs, $numInSet) { - if (is_array($numObjs) || is_array($numInSet)) { + if (\is_array($numObjs) || \is_array($numInSet)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); } @@ -46,7 +46,7 @@ class Permutations if ($numObjs < $numInSet) { return ExcelError::NAN(); } - $result = round(MathTrig\Factorial::fact($numObjs) / MathTrig\Factorial::fact($numObjs - $numInSet)); + $result = \round(MathTrig\Factorial::fact($numObjs) / MathTrig\Factorial::fact($numObjs - $numInSet)); return IntOrFloat::evaluate($result); } @@ -68,7 +68,7 @@ class Permutations */ public static function PERMUTATIONA($numObjs, $numInSet) { - if (is_array($numObjs) || is_array($numInSet)) { + if (\is_array($numObjs) || \is_array($numInSet)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $numObjs, $numInSet); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Size.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Size.php index 2eef5fc..eaf7785 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Size.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Size.php @@ -23,10 +23,10 @@ class Size public static function large(...$args) { $aArgs = Functions::flattenArray($args); - $entry = array_pop($aArgs); + $entry = \array_pop($aArgs); - if ((is_numeric($entry)) && (!is_string($entry))) { - $entry = (int) floor($entry); + if ((\is_numeric($entry)) && (!\is_string($entry))) { + $entry = (int) \floor($entry); $mArgs = self::filter($aArgs); $count = Counts::COUNT($mArgs); @@ -34,7 +34,7 @@ class Size if ($count === 0 || $entry < 0 || $entry >= $count) { return ExcelError::NAN(); } - rsort($mArgs); + \rsort($mArgs); return $mArgs[$entry]; } @@ -59,10 +59,10 @@ class Size { $aArgs = Functions::flattenArray($args); - $entry = array_pop($aArgs); + $entry = \array_pop($aArgs); - if ((is_numeric($entry)) && (!is_string($entry))) { - $entry = (int) floor($entry); + if ((\is_numeric($entry)) && (!\is_string($entry))) { + $entry = (int) \floor($entry); $mArgs = self::filter($aArgs); $count = Counts::COUNT($mArgs); @@ -70,7 +70,7 @@ class Size if ($count === 0 || $entry < 0 || $entry >= $count) { return ExcelError::NAN(); } - sort($mArgs); + \sort($mArgs); return $mArgs[$entry]; } @@ -87,7 +87,7 @@ class Size foreach ($args as $arg) { // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $mArgs[] = $arg; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StandardDeviations.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StandardDeviations.php index af27120..36584d7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StandardDeviations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StandardDeviations.php @@ -20,11 +20,11 @@ class StandardDeviations public static function STDEV(...$args) { $result = Variances::VAR(...$args); - if (!is_numeric($result)) { + if (!\is_numeric($result)) { return $result; } - return sqrt((float) $result); + return \sqrt((float) $result); } /** @@ -42,11 +42,11 @@ class StandardDeviations public static function STDEVA(...$args) { $result = Variances::VARA(...$args); - if (!is_numeric($result)) { + if (!\is_numeric($result)) { return $result; } - return sqrt((float) $result); + return \sqrt((float) $result); } /** @@ -64,11 +64,11 @@ class StandardDeviations public static function STDEVP(...$args) { $result = Variances::VARP(...$args); - if (!is_numeric($result)) { + if (!\is_numeric($result)) { return $result; } - return sqrt((float) $result); + return \sqrt((float) $result); } /** @@ -86,10 +86,10 @@ class StandardDeviations public static function STDEVPA(...$args) { $result = Variances::VARPA(...$args); - if (!is_numeric($result)) { + if (!\is_numeric($result)) { return $result; } - return sqrt((float) $result); + return \sqrt((float) $result); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Standardize.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Standardize.php index 51b0a51..8cb5707 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Standardize.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Standardize.php @@ -28,7 +28,7 @@ class Standardize extends StatisticalValidations */ public static function execute($value, $mean, $stdDev) { - if (is_array($value) || is_array($mean) || is_array($stdDev)) { + if (\is_array($value) || \is_array($mean) || \is_array($stdDev)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $mean, $stdDev); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StatisticalValidations.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StatisticalValidations.php index e23a52c..0132cdd 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StatisticalValidations.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/StatisticalValidations.php @@ -12,7 +12,7 @@ class StatisticalValidations */ public static function validateFloat($value): float { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } @@ -24,11 +24,11 @@ class StatisticalValidations */ public static function validateInt($value): int { - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } - return (int) floor((float) $value); + return (int) \floor((float) $value); } /** @@ -36,7 +36,7 @@ class StatisticalValidations */ public static function validateBool($value): bool { - if (!is_bool($value) && !is_numeric($value)) { + if (!\is_bool($value) && !\is_numeric($value)) { throw new Exception(ExcelError::VALUE()); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Trends.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Trends.php index af73519..89788a8 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Trends.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Trends.php @@ -15,7 +15,7 @@ class Trends private static function filterTrendValues(array &$array1, array &$array2): void { foreach ($array1 as $key => $value) { - if ((is_bool($value)) || (is_string($value)) || ($value === null)) { + if ((\is_bool($value)) || (\is_string($value)) || ($value === null)) { unset($array1[$key], $array2[$key]); } } @@ -23,10 +23,10 @@ class Trends private static function checkTrendArrays(&$array1, &$array2): void { - if (!is_array($array1)) { + if (!\is_array($array1)) { $array1 = [$array1]; } - if (!is_array($array2)) { + if (!\is_array($array2)) { $array2 = [$array2]; } @@ -37,14 +37,14 @@ class Trends self::filterTrendValues($array2, $array1); // Reset the array indexes - $array1 = array_merge($array1); - $array2 = array_merge($array2); + $array1 = \array_merge($array1); + $array2 = \array_merge($array2); } protected static function validateTrendArrays(array $yValues, array $xValues): void { - $yValueCount = count($yValues); - $xValueCount = count($xValues); + $yValueCount = \count($yValues); + $xValueCount = \count($xValues); if (($yValueCount === 0) || ($yValueCount !== $xValueCount)) { throw new Exception(ExcelError::NA()); @@ -65,7 +65,7 @@ class Trends */ public static function CORREL($yValues, $xValues = null) { - if (($xValues === null) || (!is_array($yValues)) || (!is_array($xValues))) { + if (($xValues === null) || (!\is_array($yValues)) || (!\is_array($xValues))) { return ExcelError::VALUE(); } @@ -122,7 +122,7 @@ class Trends */ public static function FORECAST($xValue, $yValues, $xValues) { - if (is_array($xValue)) { + if (\is_array($xValue)) { return self::evaluateArrayArgumentsSubset([self::class, __FUNCTION__], 1, $xValue, $yValues, $xValues); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/VarianceBase.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/VarianceBase.php index e533467..f9f7297 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/VarianceBase.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/VarianceBase.php @@ -8,9 +8,9 @@ abstract class VarianceBase { protected static function datatypeAdjustmentAllowStrings($value) { - if (is_bool($value)) { + if (\is_bool($value)) { return (int) $value; - } elseif (is_string($value)) { + } elseif (\is_string($value)) { return 0; } @@ -19,7 +19,7 @@ abstract class VarianceBase protected static function datatypeAdjustmentBooleans($value) { - if (is_bool($value) && (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE)) { + if (\is_bool($value) && (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE)) { return (int) $value; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Variances.php b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Variances.php index 938e671..e3ac0c2 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Variances.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Statistical/Variances.php @@ -32,7 +32,7 @@ class Variances extends VarianceBase $arg = self::datatypeAdjustmentBooleans($arg); // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $summerA += ($arg * $arg); $summerB += $arg; ++$aCount; @@ -71,12 +71,12 @@ class Variances extends VarianceBase $aArgs = Functions::flattenArrayIndexed($args); $aCount = 0; foreach ($aArgs as $k => $arg) { - if ((is_string($arg)) && (Functions::isValue($k))) { + if ((\is_string($arg)) && (Functions::isValue($k))) { return ExcelError::VALUE(); - } elseif ((is_string($arg)) && (!Functions::isMatrixValue($k))) { + } elseif ((\is_string($arg)) && (!Functions::isMatrixValue($k))) { } else { // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if ((\is_numeric($arg)) || (\is_bool($arg)) || ((\is_string($arg) && ($arg != '')))) { $arg = self::datatypeAdjustmentAllowStrings($arg); $summerA += ($arg * $arg); $summerB += $arg; @@ -121,7 +121,7 @@ class Variances extends VarianceBase $arg = self::datatypeAdjustmentBooleans($arg); // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { + if ((\is_numeric($arg)) && (!\is_string($arg))) { $summerA += ($arg * $arg); $summerB += $arg; ++$aCount; @@ -160,12 +160,12 @@ class Variances extends VarianceBase $aArgs = Functions::flattenArrayIndexed($args); $aCount = 0; foreach ($aArgs as $k => $arg) { - if ((is_string($arg)) && (Functions::isValue($k))) { + if ((\is_string($arg)) && (Functions::isValue($k))) { return ExcelError::VALUE(); - } elseif ((is_string($arg)) && (!Functions::isMatrixValue($k))) { + } elseif ((\is_string($arg)) && (!Functions::isMatrixValue($k))) { } else { // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if ((\is_numeric($arg)) || (\is_bool($arg)) || ((\is_string($arg) && ($arg != '')))) { $arg = self::datatypeAdjustmentAllowStrings($arg); $summerA += ($arg * $arg); $summerB += $arg; diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData.php index 97f4629..20d5667 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData.php @@ -365,7 +365,7 @@ class TextData * * @param mixed $value Value to check * - * @return array|DateTimeInterface|float|int|string A string if arguments are invalid + * @return array|\DateTimeInterface|float|int|string A string if arguments are invalid */ public static function VALUE($value = '') { diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/CaseConvert.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/CaseConvert.php index f1aea16..17982aa 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/CaseConvert.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/CaseConvert.php @@ -23,7 +23,7 @@ class CaseConvert */ public static function lower($mixedCaseValue) { - if (is_array($mixedCaseValue)) { + if (\is_array($mixedCaseValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $mixedCaseValue); } @@ -46,7 +46,7 @@ class CaseConvert */ public static function upper($mixedCaseValue) { - if (is_array($mixedCaseValue)) { + if (\is_array($mixedCaseValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $mixedCaseValue); } @@ -69,7 +69,7 @@ class CaseConvert */ public static function proper($mixedCaseValue) { - if (is_array($mixedCaseValue)) { + if (\is_array($mixedCaseValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $mixedCaseValue); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php index 83af499..54ee619 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php @@ -22,7 +22,7 @@ class CharacterConvert */ public static function character($character) { - if (is_array($character)) { + if (\is_array($character)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $character); } @@ -31,7 +31,7 @@ class CharacterConvert if ($character < $min || $character > 255) { return ExcelError::VALUE(); } - $result = iconv('UCS-4LE', 'UTF-8', pack('V', $character)); + $result = \iconv('UCS-4LE', 'UTF-8', \pack('V', $character)); return ($result === false) ? '' : $result; } @@ -48,7 +48,7 @@ class CharacterConvert */ public static function code($characters) { - if (is_array($characters)) { + if (\is_array($characters)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $characters); } @@ -58,8 +58,8 @@ class CharacterConvert } $character = $characters; - if (mb_strlen($characters, 'UTF-8') > 1) { - $character = mb_substr($characters, 0, 1, 'UTF-8'); + if (\mb_strlen($characters, 'UTF-8') > 1) { + $character = \mb_substr($characters, 0, 1, 'UTF-8'); } return self::unicodeToOrd($character); @@ -68,10 +68,10 @@ class CharacterConvert private static function unicodeToOrd(string $character): int { $retVal = 0; - $iconv = iconv('UTF-8', 'UCS-4LE', $character); + $iconv = \iconv('UTF-8', 'UCS-4LE', $character); if ($iconv !== false) { - $result = unpack('V', $iconv); - if (is_array($result) && isset($result[1])) { + $result = \unpack('V', $iconv); + if (\is_array($result) && isset($result[1])) { $retVal = $result[1]; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Concatenate.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Concatenate.php index 37c135d..c5f9a15 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Concatenate.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Concatenate.php @@ -58,7 +58,7 @@ class Concatenate */ public static function TEXTJOIN($delimiter = '', $ignoreEmpty = true, ...$args) { - if (is_array($delimiter) || is_array($ignoreEmpty)) { + if (\is_array($delimiter) || \is_array($ignoreEmpty)) { return self::evaluateArrayArgumentsSubset( [self::class, __FUNCTION__], 2, @@ -73,7 +73,7 @@ class Concatenate $aArgs = Functions::flattenArray($args); $returnValue = self::evaluateTextJoinArray($ignoreEmpty, $aArgs); - $returnValue ??= implode($delimiter, $aArgs); + $returnValue ??= \implode($delimiter, $aArgs); if (StringHelper::countCharacters($returnValue) > DataType::MAX_STRING_LENGTH) { $returnValue = ExcelError::CALC(); } @@ -89,9 +89,9 @@ class Concatenate return $value; } - if ($ignoreEmpty === true && ((is_string($arg) && trim($arg) === '') || $arg === null)) { + if ($ignoreEmpty === true && ((\is_string($arg) && \trim($arg) === '') || $arg === null)) { unset($aArgs[$key]); - } elseif (is_bool($arg)) { + } elseif (\is_bool($arg)) { $arg = Helpers::convertBooleanValue($arg); } } @@ -115,18 +115,18 @@ class Concatenate */ public static function builtinREPT($stringValue, $repeatCount) { - if (is_array($stringValue) || is_array($repeatCount)) { + if (\is_array($stringValue) || \is_array($repeatCount)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $stringValue, $repeatCount); } $stringValue = Helpers::extractString($stringValue); - if (!is_numeric($repeatCount) || $repeatCount < 0) { + if (!\is_numeric($repeatCount) || $repeatCount < 0) { $returnValue = ExcelError::VALUE(); } elseif (ErrorValue::isError($stringValue)) { $returnValue = $stringValue; } else { - $returnValue = str_repeat($stringValue, (int) $repeatCount); + $returnValue = \str_repeat($stringValue, (int) $repeatCount); if (StringHelper::countCharacters($returnValue) > DataType::MAX_STRING_LENGTH) { $returnValue = ExcelError::VALUE(); // note VALUE not CALC } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Extract.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Extract.php index d3668f8..2db378a 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Extract.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Extract.php @@ -26,7 +26,7 @@ class Extract */ public static function left($value, $chars = 1) { - if (is_array($value) || is_array($chars)) { + if (\is_array($value) || \is_array($chars)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $chars); } @@ -37,7 +37,7 @@ class Extract return $e->getMessage(); } - return mb_substr($value ?? '', 0, $chars, 'UTF-8'); + return \mb_substr($value ?? '', 0, $chars, 'UTF-8'); } /** @@ -56,7 +56,7 @@ class Extract */ public static function mid($value, $start, $chars) { - if (is_array($value) || is_array($start) || is_array($chars)) { + if (\is_array($value) || \is_array($start) || \is_array($chars)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $start, $chars); } @@ -68,7 +68,7 @@ class Extract return $e->getMessage(); } - return mb_substr($value ?? '', --$start, $chars, 'UTF-8'); + return \mb_substr($value ?? '', --$start, $chars, 'UTF-8'); } /** @@ -85,7 +85,7 @@ class Extract */ public static function right($value, $chars = 1) { - if (is_array($value) || is_array($chars)) { + if (\is_array($value) || \is_array($chars)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $chars); } @@ -96,7 +96,7 @@ class Extract return $e->getMessage(); } - return mb_substr($value ?? '', mb_strlen($value ?? '', 'UTF-8') - $chars, $chars, 'UTF-8'); + return \mb_substr($value ?? '', \mb_strlen($value ?? '', 'UTF-8') - $chars, $chars, 'UTF-8'); } /** @@ -128,7 +128,7 @@ class Extract */ public static function before($text, $delimiter, $instance = 1, $matchMode = 0, $matchEnd = 0, $ifNotFound = '#N/A') { - if (is_array($text) || is_array($instance) || is_array($matchMode) || is_array($matchEnd) || is_array($ifNotFound)) { + if (\is_array($text) || \is_array($instance) || \is_array($matchMode) || \is_array($matchEnd) || \is_array($ifNotFound)) { return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound); } @@ -138,7 +138,7 @@ class Extract $matchEnd = (int) $matchEnd; $split = self::validateTextBeforeAfter($text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound); - if (is_string($split)) { + if (\is_string($split)) { return $split; } if (Helpers::extractString(Functions::flattenSingleValue($delimiter ?? '')) === '') { @@ -148,14 +148,14 @@ class Extract // Adjustment for a match as the first element of the split $flags = self::matchFlags($matchMode); $delimiter = self::buildDelimiter($delimiter); - $adjust = preg_match('/^' . $delimiter . "\$/{$flags}", $split[0]); - $oddReverseAdjustment = count($split) % 2; + $adjust = \preg_match('/^' . $delimiter . "\$/{$flags}", $split[0]); + $oddReverseAdjustment = \count($split) % 2; $split = ($instance < 0) - ? array_slice($split, 0, max(count($split) - (abs($instance) * 2 - 1) - $adjust - $oddReverseAdjustment, 0)) - : array_slice($split, 0, $instance * 2 - 1 - $adjust); + ? \array_slice($split, 0, \max(\count($split) - (\abs($instance) * 2 - 1) - $adjust - $oddReverseAdjustment, 0)) + : \array_slice($split, 0, $instance * 2 - 1 - $adjust); - return implode('', $split); + return \implode('', $split); } /** @@ -186,7 +186,7 @@ class Extract */ public static function after($text, $delimiter, $instance = 1, $matchMode = 0, $matchEnd = 0, $ifNotFound = '#N/A') { - if (is_array($text) || is_array($instance) || is_array($matchMode) || is_array($matchEnd) || is_array($ifNotFound)) { + if (\is_array($text) || \is_array($instance) || \is_array($matchMode) || \is_array($matchEnd) || \is_array($ifNotFound)) { return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound); } @@ -196,7 +196,7 @@ class Extract $matchEnd = (int) $matchEnd; $split = self::validateTextBeforeAfter($text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound); - if (is_string($split)) { + if (\is_string($split)) { return $split; } if (Helpers::extractString(Functions::flattenSingleValue($delimiter ?? '')) === '') { @@ -206,14 +206,14 @@ class Extract // Adjustment for a match as the first element of the split $flags = self::matchFlags($matchMode); $delimiter = self::buildDelimiter($delimiter); - $adjust = preg_match('/^' . $delimiter . "\$/{$flags}", $split[0]); - $oddReverseAdjustment = count($split) % 2; + $adjust = \preg_match('/^' . $delimiter . "\$/{$flags}", $split[0]); + $oddReverseAdjustment = \count($split) % 2; $split = ($instance < 0) - ? array_slice($split, count($split) - ((int) abs($instance + 1) * 2) - $adjust - $oddReverseAdjustment) - : array_slice($split, $instance * 2 - $adjust); + ? \array_slice($split, \count($split) - ((int) \abs($instance + 1) * 2) - $adjust - $oddReverseAdjustment) + : \array_slice($split, $instance * 2 - $adjust); - return implode('', $split); + return \implode('', $split); } /** @@ -229,22 +229,22 @@ class Extract $flags = self::matchFlags($matchMode); $delimiter = self::buildDelimiter($delimiter); - if (preg_match('/' . $delimiter . "/{$flags}", $text) === 0 && $matchEnd === 0) { + if (\preg_match('/' . $delimiter . "/{$flags}", $text) === 0 && $matchEnd === 0) { return $ifNotFound; } - $split = preg_split('/' . $delimiter . "/{$flags}", $text, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + $split = \preg_split('/' . $delimiter . "/{$flags}", $text, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); if ($split === false) { return ExcelError::NA(); } - if ($instance === 0 || abs($instance) > StringHelper::countCharacters($text)) { + if ($instance === 0 || \abs($instance) > StringHelper::countCharacters($text)) { return ExcelError::VALUE(); } - if ($matchEnd === 0 && (abs($instance) > floor(count($split) / 2))) { + if ($matchEnd === 0 && (\abs($instance) > \floor(\count($split) / 2))) { return ExcelError::NA(); - } elseif ($matchEnd !== 0 && (abs($instance) - 1 > ceil(count($split) / 2))) { + } elseif ($matchEnd !== 0 && (\abs($instance) - 1 > \ceil(\count($split) / 2))) { return ExcelError::NA(); } @@ -257,20 +257,20 @@ class Extract */ private static function buildDelimiter($delimiter): string { - if (is_array($delimiter)) { + if (\is_array($delimiter)) { $delimiter = Functions::flattenArray($delimiter); - $quotedDelimiters = array_map( + $quotedDelimiters = \array_map( function ($delimiter) { - return preg_quote($delimiter ?? ''); + return \preg_quote($delimiter ?? ''); }, $delimiter ); - $delimiters = implode('|', $quotedDelimiters); + $delimiters = \implode('|', $quotedDelimiters); return '(' . $delimiters . ')'; } - return '(' . preg_quote($delimiter ?? '') . ')'; + return '(' . \preg_quote($delimiter ?? '') . ')'; } private static function matchFlags(int $matchMode): string diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Format.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Format.php index 93e7282..b363d1e 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Format.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Format.php @@ -38,7 +38,7 @@ class Format */ public static function DOLLAR($value = 0, $decimals = 2) { - if (is_array($value) || is_array($decimals)) { + if (\is_array($value) || \is_array($decimals)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $decimals); } @@ -51,9 +51,9 @@ class Format $mask = '$#,##0'; if ($decimals > 0) { - $mask .= '.' . str_repeat('0', $decimals); + $mask .= '.' . \str_repeat('0', $decimals); } else { - $round = 10 ** abs($decimals); + $round = 10 ** \abs($decimals); if ($value < 0) { $round = 0 - $round; } @@ -80,7 +80,7 @@ class Format */ public static function FIXEDFORMAT($value, $decimals = 2, $noCommas = false) { - if (is_array($value) || is_array($decimals) || is_array($noCommas)) { + if (\is_array($value) || \is_array($decimals) || \is_array($noCommas)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $decimals, $noCommas); } @@ -91,12 +91,12 @@ class Format return $e->getMessage(); } - $valueResult = round($value, $decimals); + $valueResult = \round($value, $decimals); if ($decimals < 0) { $decimals = 0; } if ($noCommas === false) { - $valueResult = number_format( + $valueResult = \number_format( $valueResult, $decimals, StringHelper::getDecimalSeparator(), @@ -121,14 +121,14 @@ class Format */ public static function TEXTFORMAT($value, $format) { - if (is_array($value) || is_array($format)) { + if (\is_array($value) || \is_array($format)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $format); } $value = Helpers::extractString($value); $format = Helpers::extractString($format); - if (!is_numeric($value) && Date::isDateTimeFormatCode($format)) { + if (!\is_numeric($value) && Date::isDateTimeFormatCode($format)) { $value = DateTimeExcel\DateValue::fromString($value); } @@ -143,7 +143,7 @@ class Format private static function convertValue($value) { $value = $value ?? 0; - if (is_bool($value)) { + if (\is_bool($value)) { if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE) { $value = (int) $value; } else { @@ -160,13 +160,13 @@ class Format * @param mixed $value Value to check * Or can be an array of values * - * @return array|DateTimeInterface|float|int|string A string if arguments are invalid + * @return array|\DateTimeInterface|float|int|string A string if arguments are invalid * If an array of values is passed for the argument, then the returned result * will also be an array with matching dimensions */ public static function VALUE($value = '') { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } @@ -175,20 +175,20 @@ class Format } catch (CalcExp $e) { return $e->getMessage(); } - if (!is_numeric($value)) { - $numberValue = str_replace( + if (!\is_numeric($value)) { + $numberValue = \str_replace( StringHelper::getThousandsSeparator(), '', - trim($value, " \t\n\r\0\x0B" . StringHelper::getCurrencyCode()) + \trim($value, " \t\n\r\0\x0B" . StringHelper::getCurrencyCode()) ); - if (is_numeric($numberValue)) { + if (\is_numeric($numberValue)) { return (float) $numberValue; } $dateSetting = Functions::getReturnDateType(); Functions::setReturnDateType(Functions::RETURNDATE_EXCEL); - if (strpos($value, ':') !== false) { + if (\strpos($value, ':') !== false) { $timeValue = Functions::scalar(DateTimeExcel\TimeValue::fromString($value)); if ($timeValue !== ExcelError::VALUE()) { Functions::setReturnDateType($dateSetting); @@ -223,19 +223,19 @@ class Format */ public static function valueToText($value, $format = false) { - if (is_array($value) || is_array($format)) { + if (\is_array($value) || \is_array($format)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $format); } $format = (bool) $format; - if (is_object($value) && $value instanceof RichText) { + if (\is_object($value) && $value instanceof RichText) { $value = $value->getPlainText(); } - if (is_string($value)) { + if (\is_string($value)) { $value = ($format === true) ? Calculation::wrapResult($value) : $value; - $value = str_replace("\n", '', $value); - } elseif (is_bool($value)) { + $value = \str_replace("\n", '', $value); + } elseif (\is_bool($value)) { $value = Calculation::getLocaleBoolean($value ? 'TRUE' : 'FALSE'); } @@ -272,7 +272,7 @@ class Format */ public static function NUMBERVALUE($value = '', $decimalSeparator = null, $groupSeparator = null) { - if (is_array($value) || is_array($decimalSeparator) || is_array($groupSeparator)) { + if (\is_array($value) || \is_array($decimalSeparator) || \is_array($groupSeparator)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $decimalSeparator, $groupSeparator); } @@ -284,31 +284,31 @@ class Format return $e->getMessage(); } - if (!is_numeric($value)) { - $decimalPositions = preg_match_all('/' . preg_quote($decimalSeparator) . '/', $value, $matches, PREG_OFFSET_CAPTURE); + if (!\is_numeric($value)) { + $decimalPositions = \preg_match_all('/' . \preg_quote($decimalSeparator) . '/', $value, $matches, PREG_OFFSET_CAPTURE); if ($decimalPositions > 1) { return ExcelError::VALUE(); } - $decimalOffset = array_pop($matches[0])[1]; // @phpstan-ignore-line - if (strpos($value, $groupSeparator, $decimalOffset) !== false) { + $decimalOffset = \array_pop($matches[0])[1]; // @phpstan-ignore-line + if (\strpos($value, $groupSeparator, $decimalOffset) !== false) { return ExcelError::VALUE(); } - $value = str_replace([$groupSeparator, $decimalSeparator], ['', '.'], $value); + $value = \str_replace([$groupSeparator, $decimalSeparator], ['', '.'], $value); // Handle the special case of trailing % signs - $percentageString = rtrim($value, '%'); - if (!is_numeric($percentageString)) { + $percentageString = \rtrim($value, '%'); + if (!\is_numeric($percentageString)) { return ExcelError::VALUE(); } - $percentageAdjustment = strlen($value) - strlen($percentageString); + $percentageAdjustment = \strlen($value) - \strlen($percentageString); if ($percentageAdjustment) { $value = (float) $percentageString; $value /= 10 ** ($percentageAdjustment * 2); } } - return is_array($value) ? ExcelError::VALUE() : (float) $value; + return \is_array($value) ? ExcelError::VALUE() : (float) $value; } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Helpers.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Helpers.php index e7b67a3..d244208 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Helpers.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Helpers.php @@ -24,10 +24,10 @@ class Helpers */ public static function extractString($value, bool $throwIfError = false): string { - if (is_bool($value)) { + if (\is_bool($value)) { return self::convertBooleanValue($value); } - if ($throwIfError && is_string($value) && ErrorValue::isError($value)) { + if ($throwIfError && \is_string($value) && ErrorValue::isError($value)) { throw new CalcExp($value); } @@ -43,10 +43,10 @@ class Helpers // usually 0, but sometimes 1 for Gnumeric $value = (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_GNUMERIC) ? $gnumericNull : 0; } - if (is_bool($value) && ($ooBoolOk || Functions::getCompatibilityMode() !== Functions::COMPATIBILITY_OPENOFFICE)) { + if (\is_bool($value) && ($ooBoolOk || Functions::getCompatibilityMode() !== Functions::COMPATIBILITY_OPENOFFICE)) { $value = (int) $value; } - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new CalcExp(ExcelError::VALUE()); } $value = (int) $value; @@ -65,10 +65,10 @@ class Helpers if ($value === null) { $value = 0.0; } - if (is_bool($value)) { + if (\is_bool($value)) { $value = (float) $value; } - if (!is_numeric($value)) { + if (!\is_numeric($value)) { throw new CalcExp(ExcelError::VALUE()); } @@ -82,7 +82,7 @@ class Helpers { if ($value === null) { $value = 0; - } elseif (is_bool($value)) { + } elseif (\is_bool($value)) { $value = (int) $value; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Replace.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Replace.php index 124f001..2e50919 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Replace.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Replace.php @@ -31,7 +31,7 @@ class Replace */ public static function replace($oldText, $start, $chars, $newText) { - if (is_array($oldText) || is_array($start) || is_array($chars) || is_array($newText)) { + if (\is_array($oldText) || \is_array($start) || \is_array($chars) || \is_array($newText)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $oldText, $start, $chars, $newText); } @@ -72,7 +72,7 @@ class Replace */ public static function substitute($text = '', $fromText = '', $toText = '', $instance = null) { - if (is_array($text) || is_array($fromText) || is_array($toText) || is_array($instance)) { + if (\is_array($text) || \is_array($fromText) || \is_array($toText) || \is_array($instance)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $text, $fromText, $toText, $instance); } @@ -81,9 +81,9 @@ class Replace $fromText = Helpers::extractString($fromText, true); $toText = Helpers::extractString($toText, true); if ($instance === null) { - $returnValue = str_replace($fromText, $toText, $text); + $returnValue = \str_replace($fromText, $toText, $text); } else { - if (is_bool($instance)) { + if (\is_bool($instance)) { if ($instance === false || Functions::getCompatibilityMode() !== Functions::COMPATIBILITY_OPENOFFICE) { return ExcelError::Value(); } @@ -106,7 +106,7 @@ class Replace { $pos = -1; while ($instance > 0) { - $pos = mb_strpos($text, $fromText, $pos + 1, 'UTF-8'); + $pos = \mb_strpos($text, $fromText, $pos + 1, 'UTF-8'); if ($pos === false) { return $text; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Search.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Search.php index 10b6a1a..8b0edcc 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Search.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Search.php @@ -27,7 +27,7 @@ class Search */ public static function sensitive($needle, $haystack, $offset = 1) { - if (is_array($needle) || is_array($haystack) || is_array($offset)) { + if (\is_array($needle) || \is_array($haystack) || \is_array($offset)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $needle, $haystack, $offset); } @@ -44,7 +44,7 @@ class Search return $offset; } - $pos = mb_strpos($haystack, $needle, --$offset, 'UTF-8'); + $pos = \mb_strpos($haystack, $needle, --$offset, 'UTF-8'); if ($pos !== false) { return ++$pos; } @@ -69,7 +69,7 @@ class Search */ public static function insensitive($needle, $haystack, $offset = 1) { - if (is_array($needle) || is_array($haystack) || is_array($offset)) { + if (\is_array($needle) || \is_array($haystack) || \is_array($offset)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $needle, $haystack, $offset); } @@ -86,7 +86,7 @@ class Search return $offset; } - $pos = mb_stripos($haystack, $needle, --$offset, 'UTF-8'); + $pos = \mb_stripos($haystack, $needle, --$offset, 'UTF-8'); if ($pos !== false) { return ++$pos; } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Text.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Text.php index 7b97f91..d9f5c45 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Text.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Text.php @@ -23,13 +23,13 @@ class Text */ public static function length($value = '') { - if (is_array($value)) { + if (\is_array($value)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $value); } $value = Helpers::extractString($value); - return mb_strlen($value ?? '', 'UTF-8'); + return \mb_strlen($value ?? '', 'UTF-8'); } /** @@ -48,7 +48,7 @@ class Text */ public static function exact($value1, $value2) { - if (is_array($value1) || is_array($value2)) { + if (\is_array($value1) || \is_array($value2)) { return self::evaluateArrayArguments([self::class, __FUNCTION__], $value1, $value2); } @@ -70,11 +70,11 @@ class Text */ public static function test($testValue = '') { - if (is_array($testValue)) { + if (\is_array($testValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $testValue); } - if (is_string($testValue)) { + if (\is_string($testValue)) { return $testValue; } @@ -112,14 +112,14 @@ class Text $delimiter = self::buildDelimiter($rowDelimiter); $rows = ($delimiter === '()') ? [$text] - : preg_split("/{$delimiter}/{$flags}", $text); + : \preg_split("/{$delimiter}/{$flags}", $text); } else { $rows = [$text]; } /** @var array $rows */ if ($ignoreEmpty === true) { - $rows = array_values(array_filter( + $rows = \array_values(\array_filter( $rows, function ($row) { return $row !== ''; @@ -129,15 +129,15 @@ class Text if ($columnDelimiter !== null) { $delimiter = self::buildDelimiter($columnDelimiter); - array_walk( + \array_walk( $rows, function (&$row) use ($delimiter, $flags, $ignoreEmpty): void { $row = ($delimiter === '()') ? [$row] - : preg_split("/{$delimiter}/{$flags}", $row); + : \preg_split("/{$delimiter}/{$flags}", $row); /** @var array $row */ if ($ignoreEmpty === true) { - $row = array_values(array_filter( + $row = \array_values(\array_filter( $row, function ($value) { return $value !== ''; @@ -147,7 +147,7 @@ class Text } ); if ($ignoreEmpty === true) { - $rows = array_values(array_filter( + $rows = \array_values(\array_filter( $rows, function ($row) { return $row !== [] && $row !== ['']; @@ -164,18 +164,18 @@ class Text */ private static function applyPadding(array $rows, $padding): array { - $columnCount = array_reduce( + $columnCount = \array_reduce( $rows, function (int $counter, array $row): int { - return max($counter, count($row)); + return \max($counter, \count($row)); }, 0 ); - return array_map( + return \array_map( function (array $row) use ($columnCount, $padding): array { - return (count($row) < $columnCount) - ? array_merge($row, array_fill(0, $columnCount - count($row), $padding)) + return (\count($row) < $columnCount) + ? \array_merge($row, \array_fill(0, $columnCount - \count($row), $padding)) : $row; }, $rows @@ -190,19 +190,19 @@ class Text { $valueSet = Functions::flattenArray($delimiter); - if (is_array($delimiter) && count($valueSet) > 1) { - $quotedDelimiters = array_map( + if (\is_array($delimiter) && \count($valueSet) > 1) { + $quotedDelimiters = \array_map( function ($delimiter) { - return preg_quote($delimiter ?? ''); + return \preg_quote($delimiter ?? ''); }, $valueSet ); - $delimiters = implode('|', $quotedDelimiters); + $delimiters = \implode('|', $quotedDelimiters); return '(' . $delimiters . ')'; } - return '(' . preg_quote(/** @scrutinizer ignore-type */ Functions::flattenSingleValue($delimiter)) . ')'; + return '(' . \preg_quote(/** @scrutinizer ignore-type */ Functions::flattenSingleValue($delimiter)) . ')'; } private static function matchFlags(bool $matchMode): string @@ -219,10 +219,10 @@ class Text $value = ($format === 1) ? self::formatValueMode1($cellValue) : self::formatValueMode0($cellValue); $cells[] = $value; } - $result[] = implode(($format === 1) ? ',' : ', ', $cells); + $result[] = \implode(($format === 1) ? ',' : ', ', $cells); } - $result = implode(($format === 1) ? ';' : ', ', $result); + $result = \implode(($format === 1) ? ';' : ', ', $result); return ($format === 1) ? '{' . $result . '}' : $result; } @@ -232,7 +232,7 @@ class Text */ private static function formatValueMode0($cellValue): string { - if (is_bool($cellValue)) { + if (\is_bool($cellValue)) { return Calculation::getLocaleBoolean($cellValue ? 'TRUE' : 'FALSE'); } @@ -244,9 +244,9 @@ class Text */ private static function formatValueMode1($cellValue): string { - if (is_string($cellValue) && ErrorValue::isError($cellValue) === false) { + if (\is_string($cellValue) && ErrorValue::isError($cellValue) === false) { return Calculation::FORMULA_STRING_QUOTE . $cellValue . Calculation::FORMULA_STRING_QUOTE; - } elseif (is_bool($cellValue)) { + } elseif (\is_bool($cellValue)) { return Calculation::getLocaleBoolean($cellValue ? 'TRUE' : 'FALSE'); } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Trim.php b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Trim.php index 27eceb9..823abe7 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/TextData/Trim.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/TextData/Trim.php @@ -20,13 +20,13 @@ class Trim */ public static function nonPrintable($stringValue = '') { - if (is_array($stringValue)) { + if (\is_array($stringValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $stringValue); } $stringValue = Helpers::extractString($stringValue); - return (string) preg_replace('/[\\x00-\\x1f]/', '', "$stringValue"); + return (string) \preg_replace('/[\\x00-\\x1f]/', '', "$stringValue"); } /** @@ -41,12 +41,12 @@ class Trim */ public static function spaces($stringValue = '') { - if (is_array($stringValue)) { + if (\is_array($stringValue)) { return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $stringValue); } $stringValue = Helpers::extractString($stringValue); - return trim(preg_replace('/ +/', ' ', trim("$stringValue", ' ')) ?? '', ' '); + return \trim(\preg_replace('/ +/', ' ', \trim("$stringValue", ' ')) ?? '', ' '); } } diff --git a/PhpOffice/PhpSpreadsheet/Calculation/Web/Service.php b/PhpOffice/PhpSpreadsheet/Calculation/Web/Service.php index 697d3a6..beaf8a5 100755 --- a/PhpOffice/PhpSpreadsheet/Calculation/Web/Service.php +++ b/PhpOffice/PhpSpreadsheet/Calculation/Web/Service.php @@ -20,12 +20,12 @@ class Service */ public static function webService(string $url) { - $url = trim($url); - if (strlen($url) > 2048) { + $url = \trim($url); + if (\strlen($url) > 2048) { return ExcelError::VALUE(); // Invalid URL length } - if (!preg_match('/^http[s]?:\/\//', $url)) { + if (!\preg_match('/^http[s]?:\/\//', $url)) { return ExcelError::VALUE(); // Invalid protocol } @@ -45,7 +45,7 @@ class Service } $output = $response->getBody()->getContents(); - if (strlen($output) > 32767) { + if (\strlen($output) > 32767) { return ExcelError::VALUE(); // Output not a string or too long } @@ -66,10 +66,10 @@ class Service */ public static function urlEncode($text) { - if (!is_string($text)) { + if (!\is_string($text)) { return ExcelError::VALUE(); } - return str_replace('+', '%20', urlencode($text)); + return \str_replace('+', '%20', \urlencode($text)); } } diff --git a/PhpOffice/PhpSpreadsheet/Cell/AddressHelper.php b/PhpOffice/PhpSpreadsheet/Cell/AddressHelper.php index ed765aa..df8445a 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/AddressHelper.php +++ b/PhpOffice/PhpSpreadsheet/Cell/AddressHelper.php @@ -17,9 +17,9 @@ class AddressHelper $colChar = 'C'; if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_EXCEL) { $rowColChars = Calculation::localeFunc('*RC'); - if (mb_strlen($rowColChars) === 2) { - $rowChar = mb_substr($rowColChars, 0, 1); - $colChar = mb_substr($rowColChars, 1, 1); + if (\mb_strlen($rowColChars) === 2) { + $rowChar = \mb_substr($rowColChars, 0, 1); + $colChar = \mb_substr($rowColChars, 1, 1); } } @@ -37,7 +37,7 @@ class AddressHelper ): string { [$rowChar, $colChar] = $useLocale ? self::getRowAndColumnChars() : ['R', 'C']; $regex = '/^(' . $rowChar . '(\[?[-+]?\d*\]?))(' . $colChar . '(\[?[-+]?\d*\]?))$/i'; - $validityCheck = preg_match($regex, $address, $cellReference); + $validityCheck = \preg_match($regex, $address, $cellReference); if (empty($validityCheck)) { throw new Exception('Invalid R1C1-format Cell Reference'); @@ -50,7 +50,7 @@ class AddressHelper } // Bracketed R references are relative to the current row if ($rowReference[0] === '[') { - $rowReference = $currentRowNumber + (int) trim($rowReference, '[]'); + $rowReference = $currentRowNumber + (int) \trim($rowReference, '[]'); } $columnReference = $cellReference[4]; // Empty C reference is the current column @@ -58,8 +58,8 @@ class AddressHelper $columnReference = (string) $currentColumnNumber; } // Bracketed C references are relative to the current column - if (is_string($columnReference) && $columnReference[0] === '[') { - $columnReference = $currentColumnNumber + (int) trim($columnReference, '[]'); + if (\is_string($columnReference) && $columnReference[0] === '[') { + $columnReference = $currentColumnNumber + (int) \trim($columnReference, '[]'); } $columnReference = (int) $columnReference; @@ -73,19 +73,19 @@ class AddressHelper protected static function convertSpreadsheetMLFormula(string $formula): string { - $formula = substr($formula, 3); - $temp = explode('"', $formula); + $formula = \substr($formula, 3); + $temp = \explode('"', $formula); $key = false; foreach ($temp as &$value) { // Only replace in alternate array entries (i.e. non-quoted blocks) $key = $key === false; if ($key) { - $value = str_replace(['[.', ':.', ']'], ['', ':', ''], $value); + $value = \str_replace(['[.', ':.', ']'], ['', ':', ''], $value); } } unset($value); - return implode('"', $temp); + return \implode('"', $temp); } /** @@ -96,35 +96,35 @@ class AddressHelper int $currentRowNumber = 1, int $currentColumnNumber = 1 ): string { - if (substr($formula, 0, 3) == 'of:') { + if (\substr($formula, 0, 3) == 'of:') { // We have an old-style SpreadsheetML Formula return self::convertSpreadsheetMLFormula($formula); } // Convert R1C1 style references to A1 style references (but only when not quoted) - $temp = explode('"', $formula); + $temp = \explode('"', $formula); $key = false; foreach ($temp as &$value) { // Only replace in alternate array entries (i.e. non-quoted blocks) $key = $key === false; if ($key) { - preg_match_all(self::R1C1_COORDINATE_REGEX, $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); + \preg_match_all(self::R1C1_COORDINATE_REGEX, $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way // through the formula from left to right. Reversing means that we work right to left.through // the formula - $cellReferences = array_reverse($cellReferences); + $cellReferences = \array_reverse($cellReferences); // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, // then modify the formula to use that new reference foreach ($cellReferences as $cellReference) { $A1CellReference = self::convertToA1($cellReference[0][0], $currentRowNumber, $currentColumnNumber, false); - $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0])); + $value = \substr_replace($value, $A1CellReference, $cellReference[0][1], \strlen($cellReference[0][0])); } } } unset($value); // Then rebuild the formula string - return implode('"', $temp); + return \implode('"', $temp); } /** @@ -136,7 +136,7 @@ class AddressHelper ?int $currentRowNumber = null, ?int $currentColumnNumber = null ): string { - $validityCheck = preg_match(Coordinate::A1_COORDINATE_REGEX, $address, $cellReference); + $validityCheck = \preg_match(Coordinate::A1_COORDINATE_REGEX, $address, $cellReference); if ($validityCheck === 0) { throw new Exception('Invalid A1-format Cell Reference'); @@ -146,13 +146,13 @@ class AddressHelper // Column must be absolute address $currentColumnNumber = null; } - $columnId = Coordinate::columnIndexFromString(ltrim($cellReference['col'], '$')); + $columnId = Coordinate::columnIndexFromString(\ltrim($cellReference['col'], '$')); if ($cellReference['row'][0] === '$') { // Row must be absolute address $currentRowNumber = null; } - $rowId = (int) ltrim($cellReference['row'], '$'); + $rowId = (int) \ltrim($cellReference['row'], '$'); if ($currentRowNumber !== null) { if ($rowId === $currentRowNumber) { diff --git a/PhpOffice/PhpSpreadsheet/Cell/AdvancedValueBinder.php b/PhpOffice/PhpSpreadsheet/Cell/AdvancedValueBinder.php index 49631f7..00d96b3 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/AdvancedValueBinder.php +++ b/PhpOffice/PhpSpreadsheet/Cell/AdvancedValueBinder.php @@ -22,7 +22,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder { if ($value === null) { return parent::bindValue($cell, $value); - } elseif (is_string($value)) { + } elseif (\is_string($value)) { // sanitize UTF-8 strings $value = StringHelper::sanitizeUTF8($value); } @@ -44,14 +44,14 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder } // Check for fractions - if (preg_match('/^([+-]?)\s*(\d+)\s?\/\s*(\d+)$/', $value, $matches)) { + if (\preg_match('/^([+-]?)\s*(\d+)\s?\/\s*(\d+)$/', $value, $matches)) { return $this->setProperFraction($matches, $cell); - } elseif (preg_match('/^([+-]?)(\d*) +(\d*)\s?\/\s*(\d*)$/', $value, $matches)) { + } elseif (\preg_match('/^([+-]?)(\d*) +(\d*)\s?\/\s*(\d*)$/', $value, $matches)) { return $this->setImproperFraction($matches, $cell); } // Check for percentage - if (preg_match('/^\-?\d*\.?\d*\s?\%$/', $value)) { + if (\preg_match('/^\-?\d*\.?\d*\s?\%$/', $value)) { return $this->setPercentage($value, $cell); } @@ -59,20 +59,20 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder $currencyCode = StringHelper::getCurrencyCode(); $decimalSeparator = StringHelper::getDecimalSeparator(); $thousandsSeparator = StringHelper::getThousandsSeparator(); - if (preg_match('/^' . preg_quote($currencyCode, '/') . ' *(\d{1,3}(' . preg_quote($thousandsSeparator, '/') . '\d{3})*|(\d+))(' . preg_quote($decimalSeparator, '/') . '\d{2})?$/', $value)) { + if (\preg_match('/^' . \preg_quote($currencyCode, '/') . ' *(\d{1,3}(' . \preg_quote($thousandsSeparator, '/') . '\d{3})*|(\d+))(' . \preg_quote($decimalSeparator, '/') . '\d{2})?$/', $value)) { // Convert value to number - $value = (float) trim(str_replace([$currencyCode, $thousandsSeparator, $decimalSeparator], ['', '', '.'], $value)); + $value = (float) \trim(\str_replace([$currencyCode, $thousandsSeparator, $decimalSeparator], ['', '', '.'], $value)); $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); // Set style $cell->getWorksheet()->getStyle($cell->getCoordinate()) ->getNumberFormat()->setFormatCode( - str_replace('$', $currencyCode, NumberFormat::FORMAT_CURRENCY_USD_SIMPLE) + \str_replace('$', $currencyCode, NumberFormat::FORMAT_CURRENCY_USD_SIMPLE) ); return true; - } elseif (preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { + } elseif (\preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { // Convert value to number - $value = (float) trim(str_replace(['$', ','], '', $value)); + $value = (float) \trim(\str_replace(['$', ','], '', $value)); $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); // Set style $cell->getWorksheet()->getStyle($cell->getCoordinate()) @@ -82,12 +82,12 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder } // Check for time without seconds e.g. '9:45', '09:45' - if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) { + if (\preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) { return $this->setTimeHoursMinutes($value, $cell); } // Check for time with seconds '9:45:59', '09:45:59' - if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) { + if (\preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) { return $this->setTimeHoursMinutesSeconds($value, $cell); } @@ -96,7 +96,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder // Convert value to number $cell->setValueExplicit($d, DataType::TYPE_NUMERIC); // Determine style. Either there is a time part or not. Look for ':' - if (strpos($value, ':') !== false) { + if (\strpos($value, ':') !== false) { $formatCode = 'yyyy-mm-dd h:mm'; } else { $formatCode = 'yyyy-mm-dd'; @@ -108,7 +108,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder } // Check for newline character "\n" - if (strpos($value, "\n") !== false) { + if (\strpos($value, "\n") !== false) { $cell->setValueExplicit($value, DataType::TYPE_STRING); // Set style $cell->getWorksheet()->getStyle($cell->getCoordinate()) @@ -132,8 +132,8 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder $cell->setValueExplicit((float) $value, DataType::TYPE_NUMERIC); // Build the number format mask based on the size of the matched values - $dividend = str_repeat('?', strlen($matches[3])); - $divisor = str_repeat('?', strlen($matches[4])); + $dividend = \str_repeat('?', \strlen($matches[3])); + $divisor = \str_repeat('?', \strlen($matches[4])); $fractionMask = "# {$dividend}/{$divisor}"; // Set style $cell->getWorksheet()->getStyle($cell->getCoordinate()) @@ -152,8 +152,8 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder $cell->setValueExplicit((float) $value, DataType::TYPE_NUMERIC); // Build the number format mask based on the size of the matched values - $dividend = str_repeat('?', strlen($matches[2])); - $divisor = str_repeat('?', strlen($matches[3])); + $dividend = \str_repeat('?', \strlen($matches[2])); + $divisor = \str_repeat('?', \strlen($matches[3])); $fractionMask = "{$dividend}/{$divisor}"; // Set style $cell->getWorksheet()->getStyle($cell->getCoordinate()) @@ -165,7 +165,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder protected function setPercentage(string $value, Cell $cell): bool { // Convert value to number - $value = ((float) str_replace('%', '', $value)) / 100; + $value = ((float) \str_replace('%', '', $value)) / 100; $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); // Set style @@ -178,7 +178,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder protected function setTimeHoursMinutes(string $value, Cell $cell): bool { // Convert value to number - [$hours, $minutes] = explode(':', $value); + [$hours, $minutes] = \explode(':', $value); $hours = (int) $hours; $minutes = (int) $minutes; $days = ($hours / 24) + ($minutes / 1440); @@ -194,7 +194,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder protected function setTimeHoursMinutesSeconds(string $value, Cell $cell): bool { // Convert value to number - [$hours, $minutes, $seconds] = explode(':', $value); + [$hours, $minutes, $seconds] = \explode(':', $value); $hours = (int) $hours; $minutes = (int) $minutes; $seconds = (int) $seconds; diff --git a/PhpOffice/PhpSpreadsheet/Cell/Cell.php b/PhpOffice/PhpSpreadsheet/Cell/Cell.php index 58a39af..92b3ddc 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/Cell.php +++ b/PhpOffice/PhpSpreadsheet/Cell/Cell.php @@ -267,7 +267,7 @@ class Cell break; case DataType::TYPE_NUMERIC: - if (is_string($value) && !is_numeric($value)) { + if (\is_string($value) && !\is_numeric($value)) { throw new Exception('Invalid numeric value for datatype Numeric'); } $this->value = 0 + $value; @@ -339,7 +339,7 @@ class Cell */ private function convertDateTimeInt($result) { - if (is_int($result)) { + if (\is_int($result)) { if (self::$calculateDateTimeType === self::CALCULATE_TIME_FLOAT) { if (SharedDate::isDateTime($this, $result, false)) { $result = (float) $result; @@ -374,15 +374,15 @@ class Cell $this->getWorksheet()->setSelectedCells($selected); $this->getWorksheet()->getParent()->setActiveSheetIndex($index); // We don't yet handle array returns - if (is_array($result)) { - while (is_array($result)) { - $result = array_shift($result); + if (\is_array($result)) { + while (\is_array($result)) { + $result = \array_shift($result); } } } catch (Exception $ex) { if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->calculatedValue !== null)) { return $this->calculatedValue; // Fallback for calculations referencing external files. - } elseif (preg_match('/[Uu]ndefined (name|offset: 2|array key 2)/', $ex->getMessage()) === 1) { + } elseif (\preg_match('/[Uu]ndefined (name|offset: 2|array key 2)/', $ex->getMessage()) === 1) { return ExcelError::NAME(); } @@ -411,7 +411,7 @@ class Cell public function setCalculatedValue($originalValue): self { if ($originalValue !== null) { - $this->calculatedValue = (is_numeric($originalValue)) ? (float) $originalValue : $originalValue; + $this->calculatedValue = (\is_numeric($originalValue)) ? (float) $originalValue : $originalValue; } return $this->updateInCollection(); @@ -729,9 +729,9 @@ class Cell */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $propertyName => $propertyValue) { - if ((is_object($propertyValue)) && ($propertyName !== 'parent')) { + if ((\is_object($propertyValue)) && ($propertyName !== 'parent')) { $this->$propertyName = clone $propertyValue; } else { $this->$propertyName = $propertyValue; diff --git a/PhpOffice/PhpSpreadsheet/Cell/CellAddress.php b/PhpOffice/PhpSpreadsheet/Cell/CellAddress.php index a0c544f..8890ef3 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/CellAddress.php +++ b/PhpOffice/PhpSpreadsheet/Cell/CellAddress.php @@ -34,7 +34,7 @@ class CellAddress public function __construct(string $cellAddress, ?Worksheet $worksheet = null) { - $this->cellAddress = str_replace('$', '', $cellAddress); + $this->cellAddress = \str_replace('$', '', $cellAddress); [$this->columnId, $this->rowId, $this->columnName] = Coordinate::indexesFromString($this->cellAddress); $this->worksheet = $worksheet; } @@ -45,7 +45,7 @@ class CellAddress */ private static function validateColumnAndRow($columnId, $rowId): void { - if (!is_numeric($columnId) || $columnId <= 0 || !is_numeric($rowId) || $rowId <= 0) { + if (!\is_numeric($columnId) || $columnId <= 0 || !\is_numeric($rowId) || $rowId <= 0) { throw new Exception('Row and Column Ids must be positive integer values'); } } @@ -86,7 +86,7 @@ class CellAddress public function fullCellAddress(): string { if ($this->worksheet !== null) { - $title = str_replace("'", "''", $this->worksheet->getTitle()); + $title = \str_replace("'", "''", $this->worksheet->getTitle()); return "'{$title}'!{$this->cellAddress}"; } diff --git a/PhpOffice/PhpSpreadsheet/Cell/CellRange.php b/PhpOffice/PhpSpreadsheet/Cell/CellRange.php index 908a0d0..781583f 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/CellRange.php +++ b/PhpOffice/PhpSpreadsheet/Cell/CellRange.php @@ -25,10 +25,10 @@ class CellRange implements AddressRange private function validateFromTo(CellAddress $from, CellAddress $to): void { // Identify actual top-left and bottom-right values (in case we've been given top-right and bottom-left) - $firstColumn = min($from->columnId(), $to->columnId()); - $firstRow = min($from->rowId(), $to->rowId()); - $lastColumn = max($from->columnId(), $to->columnId()); - $lastRow = max($from->rowId(), $to->rowId()); + $firstColumn = \min($from->columnId(), $to->columnId()); + $firstRow = \min($from->rowId(), $to->rowId()); + $lastColumn = \max($from->columnId(), $to->columnId()); + $lastRow = \max($from->rowId(), $to->rowId()); $fromWorksheet = $from->worksheet(); $toWorksheet = $to->worksheet(); diff --git a/PhpOffice/PhpSpreadsheet/Cell/ColumnRange.php b/PhpOffice/PhpSpreadsheet/Cell/ColumnRange.php index 1e521a1..6bff8f6 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/ColumnRange.php +++ b/PhpOffice/PhpSpreadsheet/Cell/ColumnRange.php @@ -40,10 +40,10 @@ class ColumnRange implements AddressRange */ public static function fromArray(array $array, ?Worksheet $worksheet = null): self { - array_walk( + \array_walk( $array, function (&$column): void { - $column = is_numeric($column) ? Coordinate::stringFromColumnIndex((int) $column) : $column; + $column = \is_numeric($column) ? Coordinate::stringFromColumnIndex((int) $column) : $column; } ); /** @var string $from */ @@ -56,8 +56,8 @@ class ColumnRange implements AddressRange private function validateFromTo(int $from, int $to): void { // Identify actual top and bottom values (in case we've been given bottom and top) - $this->from = min($from, $to); - $this->to = max($from, $to); + $this->from = \min($from, $to); + $this->to = \max($from, $to); } public function columnCount(): int @@ -115,7 +115,7 @@ class ColumnRange implements AddressRange $to = $this->to(); if ($this->worksheet !== null) { - $title = str_replace("'", "''", $this->worksheet->getTitle()); + $title = \str_replace("'", "''", $this->worksheet->getTitle()); return "'{$title}'!{$from}:{$to}"; } diff --git a/PhpOffice/PhpSpreadsheet/Cell/Coordinate.php b/PhpOffice/PhpSpreadsheet/Cell/Coordinate.php index 89b4768..6ee0001 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/Coordinate.php +++ b/PhpOffice/PhpSpreadsheet/Cell/Coordinate.php @@ -32,7 +32,7 @@ abstract class Coordinate */ public static function coordinateFromString($cellAddress): array { - if (preg_match(self::A1_COORDINATE_REGEX, $cellAddress, $matches)) { + if (\preg_match(self::A1_COORDINATE_REGEX, $cellAddress, $matches)) { return [$matches['col'], $matches['row']]; } elseif (self::coordinateIsRange($cellAddress)) { throw new Exception('Cell coordinate string can not be a range of cells'); @@ -53,11 +53,11 @@ abstract class Coordinate public static function indexesFromString(string $coordinates): array { [$column, $row] = self::coordinateFromString($coordinates); - $column = ltrim($column, '$'); + $column = \ltrim($column, '$'); return [ self::columnIndexFromString($column), - (int) ltrim($row, '$'), + (int) \ltrim($row, '$'), $column, ]; } @@ -71,7 +71,7 @@ abstract class Coordinate */ public static function coordinateIsRange($cellAddress) { - return (strpos($cellAddress, ':') !== false) || (strpos($cellAddress, ',') !== false); + return (\strpos($cellAddress, ':') !== false) || (\strpos($cellAddress, ',') !== false); } /** @@ -96,10 +96,10 @@ abstract class Coordinate // Create absolute coordinate $cellAddress = "$cellAddress"; - if (ctype_digit($cellAddress)) { + if (\ctype_digit($cellAddress)) { return $worksheet . '$' . $cellAddress; - } elseif (ctype_alpha($cellAddress)) { - return $worksheet . '$' . strtoupper($cellAddress); + } elseif (\ctype_alpha($cellAddress)) { + return $worksheet . '$' . \strtoupper($cellAddress); } return $worksheet . self::absoluteCoordinate($cellAddress); @@ -126,8 +126,8 @@ abstract class Coordinate // Create absolute coordinate [$column, $row] = self::coordinateFromString($cellAddress); - $column = ltrim($column, '$'); - $row = ltrim($row, '$'); + $column = \ltrim($column, '$'); + $row = \ltrim($row, '$'); return $worksheet . '$' . $column . '$' . $row; } @@ -148,11 +148,11 @@ abstract class Coordinate $range = self::DEFAULT_RANGE; } - $exploded = explode(',', $range); - $counter = count($exploded); + $exploded = \explode(',', $range); + $counter = \count($exploded); for ($i = 0; $i < $counter; ++$i) { // @phpstan-ignore-next-line - $exploded[$i] = explode(':', $exploded[$i]); + $exploded[$i] = \explode(':', $exploded[$i]); } return $exploded; @@ -168,17 +168,17 @@ abstract class Coordinate public static function buildRange(array $range) { // Verify range - if (empty($range) || !is_array($range[0])) { + if (empty($range) || !\is_array($range[0])) { throw new Exception('Range does not contain any information'); } // Build range - $counter = count($range); + $counter = \count($range); for ($i = 0; $i < $counter; ++$i) { - $range[$i] = implode(':', $range[$i]); + $range[$i] = \implode(':', $range[$i]); } - return implode(',', $range); + return \implode(',', $range); } /** @@ -197,21 +197,21 @@ abstract class Coordinate } // Uppercase coordinate - $range = strtoupper($range); + $range = \strtoupper($range); // Extract range - if (strpos($range, ':') === false) { + if (\strpos($range, ':') === false) { $rangeA = $rangeB = $range; } else { - [$rangeA, $rangeB] = explode(':', $range); + [$rangeA, $rangeB] = \explode(':', $range); } - if (is_numeric($rangeA) && is_numeric($rangeB)) { + if (\is_numeric($rangeA) && \is_numeric($rangeB)) { $rangeA = 'A' . $rangeA; $rangeB = AddressRange::MAX_COLUMN . $rangeB; } - if (ctype_alpha($rangeA) && ctype_alpha($rangeB)) { + if (\ctype_alpha($rangeA) && \ctype_alpha($rangeB)) { $rangeA = $rangeA . '1'; $rangeB = $rangeB . AddressRange::MAX_ROW; } @@ -350,7 +350,7 @@ abstract class Coordinate */ public static function extractAllCellReferencesInRange($cellRange): array { - if (substr_count($cellRange, '!') > 1) { + if (\substr_count($cellRange, '!') > 1) { throw new Exception('3-D Range References are not supported'); } @@ -358,10 +358,10 @@ abstract class Coordinate $quoted = ''; if ($worksheet > '') { $quoted = Worksheet::nameRequiresQuotes($worksheet) ? "'" : ''; - if (substr($worksheet, 0, 1) === "'" && substr($worksheet, -1, 1) === "'") { - $worksheet = substr($worksheet, 1, -1); + if (\substr($worksheet, 0, 1) === "'" && \substr($worksheet, -1, 1) === "'") { + $worksheet = \substr($worksheet, 1, -1); } - $worksheet = str_replace("'", "''", $worksheet); + $worksheet = \str_replace("'", "''", $worksheet); } [$ranges, $operators] = self::getCellBlocksFromRangeString($cellRange); @@ -376,9 +376,9 @@ abstract class Coordinate return []; } - $cellList = array_merge(...$cells); + $cellList = \array_merge(...$cells); - return array_map( + return \array_map( function ($cellAddress) use ($worksheet, $quoted) { return ($worksheet !== '') ? "{$quoted}{$worksheet}{$quoted}!{$cellAddress}" : $cellAddress; }, @@ -388,17 +388,17 @@ abstract class Coordinate private static function processRangeSetOperators(array $operators, array $cells): array { - $operatorCount = count($operators); + $operatorCount = \count($operators); for ($offset = 0; $offset < $operatorCount; ++$offset) { $operator = $operators[$offset]; if ($operator !== ' ') { continue; } - $cells[$offset] = array_intersect($cells[$offset], $cells[$offset + 1]); + $cells[$offset] = \array_intersect($cells[$offset], $cells[$offset + 1]); unset($operators[$offset], $cells[$offset + 1]); - $operators = array_values($operators); - $cells = array_values($cells); + $operators = \array_values($operators); + $cells = \array_values($cells); --$offset; --$operatorCount; } @@ -413,13 +413,13 @@ abstract class Coordinate foreach ($cellList as $coordinate) { $column = ''; $row = 0; - sscanf($coordinate, '%[A-Z]%d', $column, $row); + \sscanf($coordinate, '%[A-Z]%d', $column, $row); $key = (--$row * 16384) + self::columnIndexFromString((string) $column); $sortKeys[$key] = $coordinate; } - ksort($sortKeys); + \ksort($sortKeys); - return array_values($sortKeys); + return \array_values($sortKeys); } /** @@ -506,8 +506,8 @@ abstract class Coordinate } [$column, $row] = self::coordinateFromString($coord); - $row = (int) (ltrim($row, '$')); - $hashCode = $column . '-' . (is_object($value) ? $value->getHashCode() : $value); + $row = (int) (\ltrim($row, '$')); + $hashCode = $column . '-' . (\is_object($value) ? $value->getHashCode() : $value); if (!isset($hashedValues[$hashCode])) { $hashedValues[$hashCode] = (object) [ @@ -520,10 +520,10 @@ abstract class Coordinate } } - ksort($hashedValues); + \ksort($hashedValues); foreach ($hashedValues as $hashedValue) { - sort($hashedValue->rows); + \sort($hashedValue->rows); $rowStart = null; $rowEnd = null; $ranges = []; @@ -572,14 +572,14 @@ abstract class Coordinate */ private static function getCellBlocksFromRangeString($rangeString) { - $rangeString = str_replace('$', '', strtoupper($rangeString)); + $rangeString = \str_replace('$', '', \strtoupper($rangeString)); // split range sets on intersection (space) or union (,) operators - $tokens = preg_split('/([ ,])/', $rangeString, -1, PREG_SPLIT_DELIM_CAPTURE); + $tokens = \preg_split('/([ ,])/', $rangeString, -1, PREG_SPLIT_DELIM_CAPTURE); /** @phpstan-ignore-next-line */ - $split = array_chunk($tokens, 2); - $ranges = array_column($split, 0); - $operators = array_column($split, 1); + $split = \array_chunk($tokens, 2); + $ranges = \array_column($split, 0); + $operators = \array_column($split, 1); return [$ranges, $operators]; } diff --git a/PhpOffice/PhpSpreadsheet/Cell/DataType.php b/PhpOffice/PhpSpreadsheet/Cell/DataType.php index f19984d..6e9cf41 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/DataType.php +++ b/PhpOffice/PhpSpreadsheet/Cell/DataType.php @@ -64,7 +64,7 @@ class DataType $textValue = StringHelper::substring((string) $textValue, 0, self::MAX_STRING_LENGTH); // we require that newline is represented as "\n" in core, not as "\r\n" or "\r" - $textValue = str_replace(["\r\n", "\r"], "\n", $textValue); + $textValue = \str_replace(["\r\n", "\r"], "\n", $textValue); return $textValue; } diff --git a/PhpOffice/PhpSpreadsheet/Cell/DataValidation.php b/PhpOffice/PhpSpreadsheet/Cell/DataValidation.php index 7ee53ea..2802cf6 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/DataValidation.php +++ b/PhpOffice/PhpSpreadsheet/Cell/DataValidation.php @@ -446,7 +446,7 @@ class DataValidation */ public function getHashCode() { - return md5( + return \md5( $this->formula1 . $this->formula2 . $this->type . @@ -470,9 +470,9 @@ class DataValidation */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Cell/DataValidator.php b/PhpOffice/PhpSpreadsheet/Cell/DataValidator.php index 0e395a7..5dbac6f 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/DataValidator.php +++ b/PhpOffice/PhpSpreadsheet/Cell/DataValidator.php @@ -56,16 +56,16 @@ class DataValidator if (!empty($formula1)) { // inline values list if ($formula1[0] === '"') { - return in_array(strtolower($cellValue), explode(',', strtolower(trim($formula1, '"'))), true); - } elseif (strpos($formula1, ':') > 0) { + return \in_array(\strtolower($cellValue), \explode(',', \strtolower(\trim($formula1, '"'))), true); + } elseif (\strpos($formula1, ':') > 0) { // values list cells $matchFormula = '=MATCH(' . $cell->getCoordinate() . ', ' . $formula1 . ', 0)'; $calculation = Calculation::getInstance($cell->getWorksheet()->getParent()); try { $result = $calculation->calculateFormula($matchFormula, $cell->getCoordinate(), $cell); - while (is_array($result)) { - $result = array_pop($result); + while (\is_array($result)) { + $result = \array_pop($result); } return $result !== ExcelError::NA(); diff --git a/PhpOffice/PhpSpreadsheet/Cell/DefaultValueBinder.php b/PhpOffice/PhpSpreadsheet/Cell/DefaultValueBinder.php index 92e1d25..7cfb043 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/DefaultValueBinder.php +++ b/PhpOffice/PhpSpreadsheet/Cell/DefaultValueBinder.php @@ -19,11 +19,11 @@ class DefaultValueBinder implements IValueBinder public function bindValue(Cell $cell, $value) { // sanitize UTF-8 strings - if (is_string($value)) { + if (\is_string($value)) { $value = StringHelper::sanitizeUTF8($value); - } elseif (is_object($value)) { + } elseif (\is_object($value)) { // Handle any objects that might be injected - if ($value instanceof DateTimeInterface) { + if ($value instanceof \DateTimeInterface) { $value = $value->format('Y-m-d H:i:s'); } elseif (!($value instanceof RichText)) { // Attempt to cast any unexpected objects to string @@ -50,28 +50,28 @@ class DefaultValueBinder implements IValueBinder // Match the value against a few data types if ($value === null) { return DataType::TYPE_NULL; - } elseif (is_float($value) || is_int($value)) { + } elseif (\is_float($value) || \is_int($value)) { return DataType::TYPE_NUMERIC; - } elseif (is_bool($value)) { + } elseif (\is_bool($value)) { return DataType::TYPE_BOOL; } elseif ($value === '') { return DataType::TYPE_STRING; } elseif ($value instanceof RichText) { return DataType::TYPE_INLINE; - } elseif (is_string($value) && strlen($value) > 1 && $value[0] === '=') { + } elseif (\is_string($value) && \strlen($value) > 1 && $value[0] === '=') { return DataType::TYPE_FORMULA; - } elseif (preg_match('/^[\+\-]?(\d+\\.?\d*|\d*\\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $value)) { - $tValue = ltrim($value, '+-'); - if (is_string($value) && strlen($tValue) > 1 && $tValue[0] === '0' && $tValue[1] !== '.') { + } elseif (\preg_match('/^[\+\-]?(\d+\\.?\d*|\d*\\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $value)) { + $tValue = \ltrim($value, '+-'); + if (\is_string($value) && \strlen($tValue) > 1 && $tValue[0] === '0' && $tValue[1] !== '.') { return DataType::TYPE_STRING; - } elseif ((strpos($value, '.') === false) && ($value > PHP_INT_MAX)) { + } elseif ((\strpos($value, '.') === false) && ($value > PHP_INT_MAX)) { return DataType::TYPE_STRING; - } elseif (!is_numeric($value)) { + } elseif (!\is_numeric($value)) { return DataType::TYPE_STRING; } return DataType::TYPE_NUMERIC; - } elseif (is_string($value)) { + } elseif (\is_string($value)) { $errorCodes = DataType::getErrorCodes(); if (isset($errorCodes[$value])) { return DataType::TYPE_ERROR; diff --git a/PhpOffice/PhpSpreadsheet/Cell/Hyperlink.php b/PhpOffice/PhpSpreadsheet/Cell/Hyperlink.php index ffdcbac..5984af1 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/Hyperlink.php +++ b/PhpOffice/PhpSpreadsheet/Cell/Hyperlink.php @@ -86,7 +86,7 @@ class Hyperlink */ public function isInternal() { - return strpos($this->url, 'sheet://') !== false; + return \strpos($this->url, 'sheet://') !== false; } /** @@ -104,7 +104,7 @@ class Hyperlink */ public function getHashCode() { - return md5( + return \md5( $this->url . $this->tooltip . __CLASS__ diff --git a/PhpOffice/PhpSpreadsheet/Cell/RowRange.php b/PhpOffice/PhpSpreadsheet/Cell/RowRange.php index 38e6c14..4af288a 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/RowRange.php +++ b/PhpOffice/PhpSpreadsheet/Cell/RowRange.php @@ -37,8 +37,8 @@ class RowRange implements AddressRange private function validateFromTo(int $from, int $to): void { // Identify actual top and bottom values (in case we've been given bottom and top) - $this->from = min($from, $to); - $this->to = max($from, $to); + $this->from = \min($from, $to); + $this->to = \max($from, $to); } public function from(): int @@ -83,7 +83,7 @@ class RowRange implements AddressRange public function __toString(): string { if ($this->worksheet !== null) { - $title = str_replace("'", "''", $this->worksheet->getTitle()); + $title = \str_replace("'", "''", $this->worksheet->getTitle()); return "'{$title}'!{$this->from}:{$this->to}"; } diff --git a/PhpOffice/PhpSpreadsheet/Cell/StringValueBinder.php b/PhpOffice/PhpSpreadsheet/Cell/StringValueBinder.php index 1dcb612..049aa19 100755 --- a/PhpOffice/PhpSpreadsheet/Cell/StringValueBinder.php +++ b/PhpOffice/PhpSpreadsheet/Cell/StringValueBinder.php @@ -79,25 +79,25 @@ class StringValueBinder implements IValueBinder */ public function bindValue(Cell $cell, $value) { - if (is_object($value)) { + if (\is_object($value)) { return $this->bindObjectValue($cell, $value); } // sanitize UTF-8 strings - if (is_string($value)) { + if (\is_string($value)) { $value = StringHelper::sanitizeUTF8($value); } if ($value === null && $this->convertNull === false) { $cell->setValueExplicit($value, DataType::TYPE_NULL); - } elseif (is_bool($value) && $this->convertBoolean === false) { + } elseif (\is_bool($value) && $this->convertBoolean === false) { $cell->setValueExplicit($value, DataType::TYPE_BOOL); - } elseif ((is_int($value) || is_float($value)) && $this->convertNumeric === false) { + } elseif ((\is_int($value) || \is_float($value)) && $this->convertNumeric === false) { $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); - } elseif (is_string($value) && strlen($value) > 1 && $value[0] === '=' && $this->convertFormula === false) { + } elseif (\is_string($value) && \strlen($value) > 1 && $value[0] === '=' && $this->convertFormula === false) { $cell->setValueExplicit($value, DataType::TYPE_FORMULA); } else { - if (is_string($value) && strlen($value) > 1 && $value[0] === '=') { + if (\is_string($value) && \strlen($value) > 1 && $value[0] === '=') { $cell->getStyle()->setQuotePrefix(true); } $cell->setValueExplicit((string) $value, DataType::TYPE_STRING); @@ -109,7 +109,7 @@ class StringValueBinder implements IValueBinder protected function bindObjectValue(Cell $cell, object $value): bool { // Handle any objects that might be injected - if ($value instanceof DateTimeInterface) { + if ($value instanceof \DateTimeInterface) { $value = $value->format('Y-m-d H:i:s'); } elseif ($value instanceof RichText) { $cell->setValueExplicit($value, DataType::TYPE_INLINE); diff --git a/PhpOffice/PhpSpreadsheet/CellReferenceHelper.php b/PhpOffice/PhpSpreadsheet/CellReferenceHelper.php index 24694d5..e883260 100755 --- a/PhpOffice/PhpSpreadsheet/CellReferenceHelper.php +++ b/PhpOffice/PhpSpreadsheet/CellReferenceHelper.php @@ -34,7 +34,7 @@ class CellReferenceHelper public function __construct(string $beforeCellAddress = 'A1', int $numberOfColumns = 0, int $numberOfRows = 0) { - $this->beforeCellAddress = str_replace('$', '', $beforeCellAddress); + $this->beforeCellAddress = \str_replace('$', '', $beforeCellAddress); $this->numberOfColumns = $numberOfColumns; $this->numberOfRows = $numberOfRows; @@ -64,8 +64,8 @@ class CellReferenceHelper // Get coordinate of $cellReference [$newColumn, $newRow] = Coordinate::coordinateFromString($cellReference); - $newColumnIndex = (int) Coordinate::columnIndexFromString(str_replace('$', '', $newColumn)); - $newRowIndex = (int) str_replace('$', '', $newRow); + $newColumnIndex = (int) Coordinate::columnIndexFromString(\str_replace('$', '', $newColumn)); + $newRowIndex = (int) \str_replace('$', '', $newRow); $absoluteColumn = $newColumn[0] === '$' ? '$' : ''; $absoluteRow = $newRow[0] === '$' ? '$' : ''; @@ -116,7 +116,7 @@ class CellReferenceHelper protected function updateColumnReference(int $newColumnIndex, string $absoluteColumn): string { - $newColumn = Coordinate::stringFromColumnIndex(min($newColumnIndex + $this->numberOfColumns, AddressRange::MAX_COLUMN_INT)); + $newColumn = Coordinate::stringFromColumnIndex(\min($newColumnIndex + $this->numberOfColumns, AddressRange::MAX_COLUMN_INT)); return $absoluteColumn . $newColumn; } diff --git a/PhpOffice/PhpSpreadsheet/Chart/Axis.php b/PhpOffice/PhpSpreadsheet/Chart/Axis.php index ade7b99..3387706 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/Axis.php +++ b/PhpOffice/PhpSpreadsheet/Chart/Axis.php @@ -98,9 +98,9 @@ class Axis extends Properties $format = (string) $format_code; $this->axisNumber['format'] = $format; $this->axisNumber['source_linked'] = $sourceLinked; - if (is_bool($numeric)) { + if (\is_bool($numeric)) { $this->axisNumber['numeric'] = $numeric; - } elseif (in_array($format, self::NUMERIC_FORMAT, true)) { + } elseif (\in_array($format, self::NUMERIC_FORMAT, true)) { $this->axisNumber['numeric'] = true; } } diff --git a/PhpOffice/PhpSpreadsheet/Chart/ChartColor.php b/PhpOffice/PhpSpreadsheet/Chart/ChartColor.php index 87f3102..c45dcbc 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/ChartColor.php +++ b/PhpOffice/PhpSpreadsheet/Chart/ChartColor.php @@ -32,7 +32,7 @@ class ChartColor */ public function __construct($value = '', ?int $alpha = null, ?string $type = null, ?int $brightness = null) { - if (is_array($value)) { + if (\is_array($value)) { $this->setColorPropertiesArray($value); } else { $this->setColorProperties($value, $alpha, $type, $brightness); @@ -94,13 +94,13 @@ class ChartColor public function setColorProperties(?string $color, $alpha = null, ?string $type = null, $brightness = null): self { if (empty($type) && !empty($color)) { - if (substr($color, 0, 1) === '*') { + if (\substr($color, 0, 1) === '*') { $type = 'schemeClr'; - $color = substr($color, 1); - } elseif (substr($color, 0, 1) === '/') { + $color = \substr($color, 1); + } elseif (\substr($color, 0, 1) === '/') { $type = 'prstClr'; - $color = substr($color, 1); - } elseif (preg_match('/^[0-9A-Fa-f]{6}$/', $color) === 1) { + $color = \substr($color, 1); + } elseif (\preg_match('/^[0-9A-Fa-f]{6}$/', $color) === 1) { $type = 'srgbClr'; } } @@ -112,12 +112,12 @@ class ChartColor } if ($alpha === null) { $this->setAlpha(null); - } elseif (is_numeric($alpha)) { + } elseif (\is_numeric($alpha)) { $this->setAlpha((int) $alpha); } if ($brightness === null) { $this->setBrightness(null); - } elseif (is_numeric($brightness)) { + } elseif (\is_numeric($brightness)) { $this->setBrightness((int) $brightness); } diff --git a/PhpOffice/PhpSpreadsheet/Chart/DataSeries.php b/PhpOffice/PhpSpreadsheet/Chart/DataSeries.php index 5d33e96..2c5657c 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/DataSeries.php +++ b/PhpOffice/PhpSpreadsheet/Chart/DataSeries.php @@ -132,7 +132,7 @@ class DataSeries $this->plotType = $plotType; $this->plotGrouping = $plotGrouping; $this->plotOrder = $plotOrder; - $keys = array_keys($plotValues); + $keys = \array_keys($plotValues); $this->plotValues = $plotValues; if (!isset($plotLabel[$keys[0]])) { $plotLabel[$keys[0]] = new DataSeriesValues(); @@ -254,8 +254,8 @@ class DataSeries */ public function getPlotLabelByIndex($index) { - $keys = array_keys($this->plotLabel); - if (in_array($index, $keys)) { + $keys = \array_keys($this->plotLabel); + if (\in_array($index, $keys)) { return $this->plotLabel[$index]; } @@ -281,8 +281,8 @@ class DataSeries */ public function getPlotCategoryByIndex($index) { - $keys = array_keys($this->plotCategory); - if (in_array($index, $keys)) { + $keys = \array_keys($this->plotCategory); + if (\in_array($index, $keys)) { return $this->plotCategory[$index]; } elseif (isset($keys[$index])) { return $this->plotCategory[$keys[$index]]; @@ -334,8 +334,8 @@ class DataSeries */ public function getPlotValuesByIndex($index) { - $keys = array_keys($this->plotValues); - if (in_array($index, $keys)) { + $keys = \array_keys($this->plotValues); + if (\in_array($index, $keys)) { return $this->plotValues[$index]; } @@ -371,7 +371,7 @@ class DataSeries */ public function getPlotSeriesCount() { - return count($this->plotValues); + return \count($this->plotValues); } /** diff --git a/PhpOffice/PhpSpreadsheet/Chart/DataSeriesValues.php b/PhpOffice/PhpSpreadsheet/Chart/DataSeriesValues.php index c86f556..39b294f 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/DataSeriesValues.php +++ b/PhpOffice/PhpSpreadsheet/Chart/DataSeriesValues.php @@ -117,7 +117,7 @@ class DataSeriesValues extends Properties if ($fillColor !== null) { $this->setFillColor($fillColor); } - if (is_numeric($pointSize)) { + if (\is_numeric($pointSize)) { $this->pointSize = (int) $pointSize; } } @@ -146,7 +146,7 @@ class DataSeriesValues extends Properties */ public function setDataType($dataType) { - if (!in_array($dataType, self::DATA_TYPE_VALUES)) { + if (!\in_array($dataType, self::DATA_TYPE_VALUES)) { throw new Exception('Invalid datatype for chart data series values'); } $this->dataType = $dataType; @@ -279,12 +279,12 @@ class DataSeriesValues extends Properties private function stringToChartColor(string $fillString): ChartColor { $value = $type = ''; - if (substr($fillString, 0, 1) === '*') { + if (\substr($fillString, 0, 1) === '*') { $type = 'schemeClr'; - $value = substr($fillString, 1); - } elseif (substr($fillString, 0, 1) === '/') { + $value = \substr($fillString, 1); + } elseif (\substr($fillString, 0, 1) === '/') { $type = 'prstClr'; - $value = substr($fillString, 1); + $value = \substr($fillString, 1); } elseif ($fillString !== '') { $type = 'srgbClr'; $value = $fillString; @@ -321,7 +321,7 @@ class DataSeriesValues extends Properties if ($this->fillColor === null) { return ''; } - if (is_array($this->fillColor)) { + if (\is_array($this->fillColor)) { $array = []; foreach ($this->fillColor as $chartColor) { $array[] = $this->chartColorToString($chartColor); @@ -342,7 +342,7 @@ class DataSeriesValues extends Properties */ public function setFillColor($color) { - if (is_array($color)) { + if (\is_array($color)) { $this->fillColor = []; foreach ($color as $fillString) { if ($fillString instanceof ChartColor) { @@ -369,8 +369,8 @@ class DataSeriesValues extends Properties */ private function validateColor($color) { - if (!preg_match('/^[a-f0-9]{6}$/i', $color)) { - throw new Exception(sprintf('Invalid hex color for chart series (color: "%s")', $color)); + if (!\preg_match('/^[a-f0-9]{6}$/i', $color)) { + throw new Exception(\sprintf('Invalid hex color for chart series (color: "%s")', $color)); } return true; @@ -408,7 +408,7 @@ class DataSeriesValues extends Properties public function isMultiLevelSeries() { if (!empty($this->dataValues)) { - return is_array(array_values($this->dataValues)[0]); + return \is_array(\array_values($this->dataValues)[0]); } return null; @@ -423,7 +423,7 @@ class DataSeriesValues extends Properties { $levelCount = 0; foreach ($this->dataValues as $dataValueSet) { - $levelCount = max($levelCount, count($dataValueSet)); + $levelCount = \max($levelCount, \count($dataValueSet)); } return $levelCount; @@ -446,7 +446,7 @@ class DataSeriesValues extends Properties */ public function getDataValue() { - $count = count($this->dataValues); + $count = \count($this->dataValues); if ($count == 0) { return null; } elseif ($count == 1) { @@ -466,7 +466,7 @@ class DataSeriesValues extends Properties public function setDataValues($dataValues) { $this->dataValues = Functions::flattenArray($dataValues); - $this->pointCount = count($dataValues); + $this->pointCount = \count($dataValues); return $this; } @@ -485,18 +485,18 @@ class DataSeriesValues extends Properties if ($flatten) { $this->dataValues = Functions::flattenArray($newDataValues); foreach ($this->dataValues as &$dataValue) { - if (is_string($dataValue) && !empty($dataValue) && $dataValue[0] == '#') { + if (\is_string($dataValue) && !empty($dataValue) && $dataValue[0] == '#') { $dataValue = 0.0; } } unset($dataValue); } else { [$worksheet, $cellRange] = Worksheet::extractSheetTitle($this->dataSource, true); - $dimensions = Coordinate::rangeDimension(str_replace('$', '', $cellRange)); + $dimensions = Coordinate::rangeDimension(\str_replace('$', '', $cellRange)); if (($dimensions[0] == 1) || ($dimensions[1] == 1)) { $this->dataValues = Functions::flattenArray($newDataValues); } else { - $newArray = array_values(array_shift(/** @scrutinizer ignore-type */ $newDataValues)); + $newArray = \array_values(\array_shift(/** @scrutinizer ignore-type */ $newDataValues)); foreach ($newArray as $i => $newDataSet) { $newArray[$i] = [$newDataSet]; } @@ -504,13 +504,13 @@ class DataSeriesValues extends Properties foreach ($newDataValues as $newDataSet) { $i = 0; foreach ($newDataSet as $newDataVal) { - array_unshift($newArray[$i++], $newDataVal); + \array_unshift($newArray[$i++], $newDataVal); } } $this->dataValues = $newArray; } } - $this->pointCount = count($this->dataValues); + $this->pointCount = \count($this->dataValues); } } diff --git a/PhpOffice/PhpSpreadsheet/Chart/Legend.php b/PhpOffice/PhpSpreadsheet/Chart/Legend.php index e499e77..694310f 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/Legend.php +++ b/PhpOffice/PhpSpreadsheet/Chart/Legend.php @@ -80,7 +80,7 @@ class Legend */ public function setPosition($position) { - if (!in_array($position, self::POSITION_XLREF)) { + if (!\in_array($position, self::POSITION_XLREF)) { return false; } @@ -97,7 +97,7 @@ class Legend public function getPositionXL() { // Scrutinizer thinks the following could return string. It is wrong. - return array_search($this->position, self::POSITION_XLREF); + return \array_search($this->position, self::POSITION_XLREF); } /** diff --git a/PhpOffice/PhpSpreadsheet/Chart/PlotArea.php b/PhpOffice/PhpSpreadsheet/Chart/PlotArea.php index ccde4bb..2278971 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/PlotArea.php +++ b/PhpOffice/PhpSpreadsheet/Chart/PlotArea.php @@ -65,7 +65,7 @@ class PlotArea */ public function getPlotGroupCount(): int { - return count($this->plotSeries); + return \count($this->plotSeries); } /** diff --git a/PhpOffice/PhpSpreadsheet/Chart/Properties.php b/PhpOffice/PhpSpreadsheet/Chart/Properties.php index edb7754..df761d2 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/Properties.php +++ b/PhpOffice/PhpSpreadsheet/Chart/Properties.php @@ -437,7 +437,7 @@ abstract class Properties protected function getArrayElementsValue($properties, $elements) { $reference = &$properties; - if (!is_array($elements)) { + if (!\is_array($elements)) { return $reference[$elements]; } @@ -488,7 +488,7 @@ abstract class Properties 'type' => $this->glowColor->getColorProperty('type'), 'alpha' => $this->glowColor->getColorProperty('alpha'), ]; - } elseif (is_array($property) && count($property) >= 2 && $property[0] === 'color') { + } elseif (\is_array($property) && \count($property) >= 2 && $property[0] === 'color') { $retVal = $this->glowColor->getColorProperty($property[1]); } @@ -565,7 +565,7 @@ abstract class Properties public function setShadowProperty(string $propertyName, $value): self { $this->activateObject(); - if ($propertyName === 'color' && is_array($value)) { + if ($propertyName === 'color' && \is_array($value)) { $this->shadowColor->setColorPropertiesArray($value); } else { $this->shadowProperties[$propertyName] = $value; @@ -599,7 +599,7 @@ abstract class Properties if ($colorType !== null) { $this->shadowColor->setType($colorType); } - if (is_numeric($colorAlpha)) { + if (\is_numeric($colorAlpha)) { $this->shadowColor->setAlpha((int) $colorAlpha); } $this @@ -636,8 +636,8 @@ abstract class Properties { $base_reference = $reference; foreach ($propertiesMap as $property_key => $property_val) { - if (is_array($property_val)) { - if (in_array($property_key, self::SHADOW_ARRAY_KEYS, true)) { + if (\is_array($property_val)) { + if (\in_array($property_key, self::SHADOW_ARRAY_KEYS, true)) { $reference = &$this->shadowProperties[$property_key]; $this->setShadowPropertiesMapValues($property_val, $reference); } @@ -678,7 +678,7 @@ abstract class Properties */ protected function setShadowAngle($angle) { - if (is_numeric($angle)) { + if (\is_numeric($angle)) { $this->shadowProperties['direction'] = $angle; } @@ -828,7 +828,7 @@ abstract class Properties public function setLineStyleProperties($lineWidth = null, $compoundType = '', $dashType = '', $capType = '', $joinType = '', $headArrowType = '', $headArrowSize = '', $endArrowType = '', $endArrowSize = '', $headArrowWidth = '', $headArrowLength = '', $endArrowWidth = '', $endArrowLength = ''): void { $this->activateObject(); - if (is_numeric($lineWidth)) { + if (\is_numeric($lineWidth)) { $this->lineStyleProperties['width'] = $lineWidth; } if ($compoundType !== '') { @@ -846,7 +846,7 @@ abstract class Properties if ($headArrowType !== '') { $this->lineStyleProperties['arrow']['head']['type'] = $headArrowType; } - if (array_key_exists($headArrowSize, self::ARROW_SIZES)) { + if (\array_key_exists($headArrowSize, self::ARROW_SIZES)) { $this->lineStyleProperties['arrow']['head']['size'] = $headArrowSize; $this->lineStyleProperties['arrow']['head']['w'] = self::ARROW_SIZES[$headArrowSize]['w']; $this->lineStyleProperties['arrow']['head']['len'] = self::ARROW_SIZES[$headArrowSize]['len']; @@ -854,7 +854,7 @@ abstract class Properties if ($endArrowType !== '') { $this->lineStyleProperties['arrow']['end']['type'] = $endArrowType; } - if (array_key_exists($endArrowSize, self::ARROW_SIZES)) { + if (\array_key_exists($endArrowSize, self::ARROW_SIZES)) { $this->lineStyleProperties['arrow']['end']['size'] = $endArrowSize; $this->lineStyleProperties['arrow']['end']['w'] = self::ARROW_SIZES[$endArrowSize]['w']; $this->lineStyleProperties['arrow']['end']['len'] = self::ARROW_SIZES[$endArrowSize]['len']; diff --git a/PhpOffice/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/PhpOffice/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index cb9b544..3e5ebdd 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/PhpOffice/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -77,10 +77,10 @@ abstract class JpGraphRendererBase implements IRenderer private function formatPointMarker($seriesPlot, $markerID) { - $plotMarkKeys = array_keys(self::$markSet); + $plotMarkKeys = \array_keys(self::$markSet); if ($markerID === null) { // Use default plot marker (next marker in the series) - self::$plotMark %= count(self::$markSet); + self::$plotMark %= \count(self::$markSet); $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]); } elseif ($markerID !== 'none') { // Use specified plot marker (if it exists) @@ -88,7 +88,7 @@ abstract class JpGraphRendererBase implements IRenderer $seriesPlot->mark->SetType(self::$markSet[$markerID]); } else { // If the specified plot marker doesn't exist, use default plot marker (next marker in the series) - self::$plotMark %= count(self::$markSet); + self::$plotMark %= \count(self::$markSet); $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]); } } else { @@ -106,16 +106,16 @@ abstract class JpGraphRendererBase implements IRenderer { $datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode() ?? ''; // Retrieve any label formatting code - $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode); + $datasetLabelFormatCode = \stripslashes($datasetLabelFormatCode); $testCurrentIndex = 0; foreach ($datasetLabels as $i => $datasetLabel) { - if (is_array($datasetLabel)) { + if (\is_array($datasetLabel)) { if ($rotation == 'bar') { - $datasetLabels[$i] = implode(' ', $datasetLabel); + $datasetLabels[$i] = \implode(' ', $datasetLabel); } else { - $datasetLabel = array_reverse($datasetLabel); - $datasetLabels[$i] = implode("\n", $datasetLabel); + $datasetLabel = \array_reverse($datasetLabel); + $datasetLabels[$i] = \implode("\n", $datasetLabel); } } else { // Format labels according to any formatting code @@ -167,9 +167,9 @@ abstract class JpGraphRendererBase implements IRenderer // Test if we have a title caption to display if ($caption !== null) { // If we do, it could be a plain string or an array - if (is_array($caption)) { + if (\is_array($caption)) { // Implode an array to a plain string - $caption = implode('', $caption); + $caption = \implode('', $caption); } } @@ -221,7 +221,7 @@ abstract class JpGraphRendererBase implements IRenderer private function renderCartesianPlotArea($type = 'textlin'): void { - $this->graph = new Graph(self::$width, self::$height); + $this->graph = new \Graph(self::$width, self::$height); $this->graph->SetScale($type); $this->renderTitle(); @@ -258,14 +258,14 @@ abstract class JpGraphRendererBase implements IRenderer private function renderPiePlotArea(): void { - $this->graph = new PieGraph(self::$width, self::$height); + $this->graph = new \PieGraph(self::$width, self::$height); $this->renderTitle(); } private function renderRadarPlotArea(): void { - $this->graph = new RadarGraph(self::$width, self::$height); + $this->graph = new \RadarGraph(self::$width, self::$height); $this->graph->SetScale('lin'); $this->renderTitle(); @@ -275,7 +275,7 @@ abstract class JpGraphRendererBase implements IRenderer { $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); - $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[0]; + $index = \array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[0]; $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getPointCount(); if ($labelCount > 0) { $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); @@ -293,7 +293,7 @@ abstract class JpGraphRendererBase implements IRenderer // Loop through each data series in turn for ($i = 0; $i < $seriesCount; ++$i) { - $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[$i]; + $index = \array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[$i]; $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getDataValues(); $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getPointMarker(); @@ -311,7 +311,7 @@ abstract class JpGraphRendererBase implements IRenderer ++$testCurrentIndex; } - $seriesPlot = new LinePlot($dataValues); + $seriesPlot = new \LinePlot($dataValues); if ($combination) { $seriesPlot->SetBarCenter(); } @@ -333,7 +333,7 @@ abstract class JpGraphRendererBase implements IRenderer if ($grouping == 'standard') { $groupPlot = $seriesPlots; } else { - $groupPlot = new AccLinePlot($seriesPlots); + $groupPlot = new \AccLinePlot($seriesPlots); } $this->graph->Add($groupPlot); } @@ -347,14 +347,14 @@ abstract class JpGraphRendererBase implements IRenderer } $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); - $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[0]; + $index = \array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[0]; $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getPointCount(); if ($labelCount > 0) { $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $rotation); // Rotate for bar rather than column chart if ($rotation == 'bar') { - $datasetLabels = array_reverse($datasetLabels); + $datasetLabels = \array_reverse($datasetLabels); $this->graph->yaxis->SetPos('max'); $this->graph->yaxis->SetLabelAlign('center', 'top'); $this->graph->yaxis->SetLabelSide(SIDE_RIGHT); @@ -372,7 +372,7 @@ abstract class JpGraphRendererBase implements IRenderer // Loop through each data series in turn for ($j = 0; $j < $seriesCount; ++$j) { - $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[$j]; + $index = \array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[$j]; $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getDataValues(); if ($grouping == 'percentStacked') { $dataValues = $this->percentageAdjustValues($dataValues, $sumValues); @@ -390,9 +390,9 @@ abstract class JpGraphRendererBase implements IRenderer // Reverse the $dataValues order for bar rather than column chart if ($rotation == 'bar') { - $dataValues = array_reverse($dataValues); + $dataValues = \array_reverse($dataValues); } - $seriesPlot = new BarPlot($dataValues); + $seriesPlot = new \BarPlot($dataValues); $seriesPlot->SetColor('black'); $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]); if ($dimensions == '3d') { @@ -409,15 +409,15 @@ abstract class JpGraphRendererBase implements IRenderer } // Reverse the plot order for bar rather than column chart if (($rotation == 'bar') && ($grouping != 'percentStacked')) { - $seriesPlots = array_reverse($seriesPlots); + $seriesPlots = \array_reverse($seriesPlots); } if ($grouping == 'clustered') { - $groupPlot = new GroupBarPlot($seriesPlots); + $groupPlot = new \GroupBarPlot($seriesPlots); } elseif ($grouping == 'standard') { - $groupPlot = new GroupBarPlot($seriesPlots); + $groupPlot = new \GroupBarPlot($seriesPlots); } else { - $groupPlot = new AccBarPlot($seriesPlots); + $groupPlot = new \AccBarPlot($seriesPlots); if ($dimensions == '3d') { $groupPlot->SetShadow(); } @@ -441,14 +441,14 @@ abstract class JpGraphRendererBase implements IRenderer $dataValuesY[$k] = $k; } - $seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY); + $seriesPlot = new \ScatterPlot($dataValuesX, $dataValuesY); if ($scatterStyle == 'lineMarker') { $seriesPlot->SetLinkPoints(); $seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]); } elseif ($scatterStyle == 'smoothMarker') { - $spline = new Spline($dataValuesY, $dataValuesX); - [$splineDataY, $splineDataX] = $spline->Get(count($dataValuesX) * self::$width / 20); - $lplot = new LinePlot($splineDataX, $splineDataY); + $spline = new \Spline($dataValuesY, $dataValuesX); + [$splineDataY, $splineDataX] = $spline->Get(\count($dataValuesX) * self::$width / 20); + $lplot = new \LinePlot($splineDataX, $splineDataY); $lplot->SetColor(self::$colourSet[self::$plotColour]); $this->graph->Add($lplot); @@ -483,16 +483,16 @@ abstract class JpGraphRendererBase implements IRenderer $dataValues = []; foreach ($dataValuesY as $k => $dataValueY) { - $dataValues[$k] = implode(' ', array_reverse($dataValueY)); + $dataValues[$k] = \implode(' ', \array_reverse($dataValueY)); } - $tmp = array_shift($dataValues); + $tmp = \array_shift($dataValues); $dataValues[] = $tmp; - $tmp = array_shift($dataValuesX); + $tmp = \array_shift($dataValuesX); $dataValuesX[] = $tmp; - $this->graph->SetTitles(array_reverse($dataValues)); + $this->graph->SetTitles(\array_reverse($dataValues)); - $seriesPlot = new RadarPlot(array_reverse($dataValuesX)); + $seriesPlot = new \RadarPlot(\array_reverse($dataValuesX)); $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); @@ -517,7 +517,7 @@ abstract class JpGraphRendererBase implements IRenderer $dataValues[$i] = $dataValuesX; } - $seriesPlot = new ContourPlot($dataValues); + $seriesPlot = new \ContourPlot($dataValues); $this->graph->Add($seriesPlot); } @@ -545,7 +545,7 @@ abstract class JpGraphRendererBase implements IRenderer $dataValuesPlot = []; // Flatten the plot arrays to a single dimensional array to work with jpgraph - $jMax = count($dataValues[0]); + $jMax = \count($dataValues[0]); for ($j = 0; $j < $jMax; ++$j) { for ($i = 0; $i < $seriesCount; ++$i) { $dataValuesPlot[] = $dataValues[$i][$j] ?? null; @@ -560,7 +560,7 @@ abstract class JpGraphRendererBase implements IRenderer $this->graph->xaxis->SetTickLabels($datasetLabels); } - $seriesPlot = new StockPlot($dataValuesPlot); + $seriesPlot = new \StockPlot($dataValuesPlot); $seriesPlot->SetWidth(20); $this->graph->Add($seriesPlot); @@ -645,12 +645,12 @@ abstract class JpGraphRendererBase implements IRenderer } if ($dimensions == '3d') { - $seriesPlot = new PiePlot3D($dataValues); + $seriesPlot = new \PiePlot3D($dataValues); } else { if ($doughnut) { - $seriesPlot = new PiePlotC($dataValues); + $seriesPlot = new \PiePlotC($dataValues); } else { - $seriesPlot = new PiePlot($dataValues); + $seriesPlot = new \PiePlot($dataValues); } } @@ -658,13 +658,13 @@ abstract class JpGraphRendererBase implements IRenderer $seriesPlot->SetSize(($jLimit - $j) / ($jLimit * 4)); } - if ($doughnut && method_exists($seriesPlot, 'SetMidColor')) { + if ($doughnut && \method_exists($seriesPlot, 'SetMidColor')) { $seriesPlot->SetMidColor('white'); } $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); - if (count($datasetLabels) > 0) { - $seriesPlot->SetLabels(array_fill(0, count($datasetLabels), '')); + if (\count($datasetLabels) > 0) { + $seriesPlot->SetLabels(\array_fill(0, \count($datasetLabels), '')); } if ($dimensions != '3d') { $seriesPlot->SetGuideLines(false); @@ -769,10 +769,10 @@ abstract class JpGraphRendererBase implements IRenderer for ($i = 0; $i < $groupCount; ++$i) { $chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); } - $chartTypes = array_unique($chartTypes); - if (count($chartTypes) == 1) { - $chartType = array_pop($chartTypes); - } elseif (count($chartTypes) == 0) { + $chartTypes = \array_unique($chartTypes); + if (\count($chartTypes) == 1) { + $chartType = \array_pop($chartTypes); + } elseif (\count($chartTypes) == 0) { echo 'Chart is not yet implemented
'; return false; diff --git a/PhpOffice/PhpSpreadsheet/Chart/Title.php b/PhpOffice/PhpSpreadsheet/Chart/Title.php index 9b0540d..f332902 100755 --- a/PhpOffice/PhpSpreadsheet/Chart/Title.php +++ b/PhpOffice/PhpSpreadsheet/Chart/Title.php @@ -44,7 +44,7 @@ class Title public function getCaptionText(): string { $caption = $this->caption; - if (is_string($caption)) { + if (\is_string($caption)) { return $caption; } if ($caption instanceof RichText) { diff --git a/PhpOffice/PhpSpreadsheet/Collection/Cells.php b/PhpOffice/PhpSpreadsheet/Collection/Cells.php index 9a9df22..a67c2e5 100755 --- a/PhpOffice/PhpSpreadsheet/Collection/Cells.php +++ b/PhpOffice/PhpSpreadsheet/Collection/Cells.php @@ -134,7 +134,7 @@ class Cells */ public function getCoordinates() { - return array_keys($this->index); + return \array_keys($this->index); } /** @@ -144,9 +144,9 @@ class Cells */ public function getSortedCoordinates() { - asort($this->index); + \asort($this->index); - return array_keys($this->index); + return \array_keys($this->index); } /** @@ -166,7 +166,7 @@ class Cells { $column = 0; $row = ''; - sscanf($this->currentCoordinate ?? '', '%[A-Z]%d', $column, $row); + \sscanf($this->currentCoordinate ?? '', '%[A-Z]%d', $column, $row); return (string) $column; } @@ -178,7 +178,7 @@ class Cells { $column = 0; $row = ''; - sscanf($this->currentCoordinate ?? '', '%[A-Z]%d', $column, $row); + \sscanf($this->currentCoordinate ?? '', '%[A-Z]%d', $column, $row); return (int) $row; } @@ -193,7 +193,7 @@ class Cells // Lookup highest column and highest row $maxRow = $maxColumn = 1; foreach ($this->index as $coordinate) { - $row = (int) floor($coordinate / self::MAX_COLUMN_ID) + 1; + $row = (int) \floor($coordinate / self::MAX_COLUMN_ID) + 1; $maxRow = ($maxRow > $row) ? $maxRow : $row; $column = $coordinate % self::MAX_COLUMN_ID; $maxColumn = ($maxColumn > $column) ? $maxColumn : $column; @@ -258,7 +258,7 @@ class Cells if ($coordinate % self::MAX_COLUMN_ID !== $columnIndex) { continue; } - $row = (int) floor($coordinate / self::MAX_COLUMN_ID) + 1; + $row = (int) \floor($coordinate / self::MAX_COLUMN_ID) + 1; $maxRow = ($maxRow > $row) ? $maxRow : $row; } @@ -275,8 +275,8 @@ class Cells $cacheType = Settings::getCache(); return ($cacheType instanceof Memory\SimpleCache1 || $cacheType instanceof Memory\SimpleCache3) - ? random_bytes(7) . ':' - : uniqid('phpspreadsheet.', true) . '.'; + ? \random_bytes(7) . ':' + : \uniqid('phpspreadsheet.', true) . '.'; } /** @@ -323,7 +323,7 @@ class Cells $fromRow = --$row * self::MAX_COLUMN_ID; foreach ($this->index as $coordinate) { if ($coordinate >= $fromRow && $coordinate < $toRow) { - $row = (int) floor($coordinate / self::MAX_COLUMN_ID) + 1; + $row = (int) \floor($coordinate / self::MAX_COLUMN_ID) + 1; $column = Coordinate::stringFromColumnIndex($coordinate % self::MAX_COLUMN_ID); $this->delete("{$column}{$row}"); } @@ -342,7 +342,7 @@ class Cells $columnIndex = Coordinate::columnIndexFromString($column); foreach ($this->index as $coordinate) { if ($coordinate % self::MAX_COLUMN_ID === $columnIndex) { - $row = (int) floor($coordinate / self::MAX_COLUMN_ID) + 1; + $row = (int) \floor($coordinate / self::MAX_COLUMN_ID) + 1; $column = Coordinate::stringFromColumnIndex($coordinate % self::MAX_COLUMN_ID); $this->delete("{$column}{$row}"); } @@ -391,7 +391,7 @@ class Cells } $column = 0; $row = ''; - sscanf($cellCoordinate, '%[A-Z]%d', $column, $row); + \sscanf($cellCoordinate, '%[A-Z]%d', $column, $row); $this->index[$cellCoordinate] = (--$row * self::MAX_COLUMN_ID) + Coordinate::columnIndexFromString((string) $column); $this->currentCoordinate = $cellCoordinate; @@ -467,7 +467,7 @@ class Cells /** * Returns all known cache keys. * - * @return Generator|string[] + * @return \Generator|string[] */ private function getAllCacheKeys() { diff --git a/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache1.php b/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache1.php index a0eb6ec..2798a26 100755 --- a/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache1.php +++ b/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache1.php @@ -92,13 +92,13 @@ class SimpleCache1 implements CacheInterface */ public function has($key) { - return array_key_exists($key, $this->cache); + return \array_key_exists($key, $this->cache); } /** * @param string $key * @param mixed $value - * @param null|DateInterval|int $ttl + * @param null|\DateInterval|int $ttl * * @return bool */ @@ -111,7 +111,7 @@ class SimpleCache1 implements CacheInterface /** * @param iterable $values - * @param null|DateInterval|int $ttl + * @param null|\DateInterval|int $ttl * * @return bool */ diff --git a/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache3.php b/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache3.php index 34f6447..50d2b6b 100755 --- a/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache3.php +++ b/PhpOffice/PhpSpreadsheet/Collection/Memory/SimpleCache3.php @@ -79,13 +79,13 @@ class SimpleCache3 implements CacheInterface */ public function has($key): bool { - return array_key_exists($key, $this->cache); + return \array_key_exists($key, $this->cache); } /** * @param string $key * @param mixed $value - * @param null|DateInterval|int $ttl + * @param null|\DateInterval|int $ttl */ public function set($key, $value, $ttl = null): bool { @@ -96,7 +96,7 @@ class SimpleCache3 implements CacheInterface /** * @param iterable $values - * @param null|DateInterval|int $ttl + * @param null|\DateInterval|int $ttl */ public function setMultiple($values, $ttl = null): bool { diff --git a/PhpOffice/PhpSpreadsheet/Comment.php b/PhpOffice/PhpSpreadsheet/Comment.php index abadc7d..c6863a4 100755 --- a/PhpOffice/PhpSpreadsheet/Comment.php +++ b/PhpOffice/PhpSpreadsheet/Comment.php @@ -274,7 +274,7 @@ class Comment implements IComparable */ public function getHashCode(): string { - return md5( + return \md5( $this->author . $this->text->getHashCode() . $this->width . @@ -294,9 +294,9 @@ class Comment implements IComparable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; @@ -323,7 +323,7 @@ class Comment implements IComparable return false; } - return getimagesize($path) !== false; + return \getimagesize($path) !== false; } /** @@ -339,7 +339,7 @@ class Comment implements IComparable */ public function setBackgroundImage(Drawing $objDrawing): self { - if (!array_key_exists($objDrawing->getType(), Drawing::IMAGE_TYPES_CONVERTION_MAP)) { + if (!\array_key_exists($objDrawing->getType(), Drawing::IMAGE_TYPES_CONVERTION_MAP)) { throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.'); } $this->backgroundImage = $objDrawing; diff --git a/PhpOffice/PhpSpreadsheet/DefinedName.php b/PhpOffice/PhpSpreadsheet/DefinedName.php index 0f4df26..64b3240 100755 --- a/PhpOffice/PhpSpreadsheet/DefinedName.php +++ b/PhpOffice/PhpSpreadsheet/DefinedName.php @@ -99,21 +99,21 @@ abstract class DefinedName public static function testIfFormula(string $value): bool { - if (substr($value, 0, 1) === '=') { - $value = substr($value, 1); + if (\substr($value, 0, 1) === '=') { + $value = \substr($value, 1); } - if (is_numeric($value)) { + if (\is_numeric($value)) { return true; } $segMatcher = false; - foreach (explode("'", $value) as $subVal) { + foreach (\explode("'", $value) as $subVal) { // Only test in alternate array entries (the non-quoted blocks) $segMatcher = $segMatcher === false; if ( $segMatcher && - (preg_match('/' . self::REGEXP_IDENTIFY_FORMULA . '/miu', $subVal)) + (\preg_match('/' . self::REGEXP_IDENTIFY_FORMULA . '/miu', $subVal)) ) { return true; } @@ -261,9 +261,9 @@ abstract class DefinedName */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Document/Properties.php b/PhpOffice/PhpSpreadsheet/Document/Properties.php index afdeea9..9a304dc 100755 --- a/PhpOffice/PhpSpreadsheet/Document/Properties.php +++ b/PhpOffice/PhpSpreadsheet/Document/Properties.php @@ -166,15 +166,15 @@ class Properties private static function intOrFloatTimestamp($timestamp) { if ($timestamp === null) { - $timestamp = (float) (new DateTime())->format('U'); - } elseif (is_string($timestamp)) { - if (is_numeric($timestamp)) { + $timestamp = (float) (new \DateTime())->format('U'); + } elseif (\is_string($timestamp)) { + if (\is_numeric($timestamp)) { $timestamp = (float) $timestamp; } else { - $timestamp = (string) preg_replace('/[.][0-9]*$/', '', $timestamp); - $timestamp = (string) preg_replace('/^(\\d{4})- (\\d)/', '$1-0$2', $timestamp); - $timestamp = (string) preg_replace('/^(\\d{4}-\\d{2})- (\\d)/', '$1-0$2', $timestamp); - $timestamp = (float) (new DateTime($timestamp))->format('U'); + $timestamp = (string) \preg_replace('/[.][0-9]*$/', '', $timestamp); + $timestamp = (string) \preg_replace('/^(\\d{4})- (\\d)/', '$1-0$2', $timestamp); + $timestamp = (string) \preg_replace('/^(\\d{4}-\\d{2})- (\\d)/', '$1-0$2', $timestamp); + $timestamp = (float) (new \DateTime($timestamp))->format('U'); } } @@ -376,7 +376,7 @@ class Properties */ public function getCustomProperties(): array { - return array_keys($this->customProperties); + return \array_keys($this->customProperties); } /** @@ -384,7 +384,7 @@ class Properties */ public function isCustomPropertySet(string $propertyName): bool { - return array_key_exists($propertyName, $this->customProperties); + return \array_key_exists($propertyName, $this->customProperties); } /** @@ -416,13 +416,13 @@ class Properties */ private function identifyPropertyType($propertyValue): string { - if (is_float($propertyValue)) { + if (\is_float($propertyValue)) { return self::PROPERTY_TYPE_FLOAT; } - if (is_int($propertyValue)) { + if (\is_int($propertyValue)) { return self::PROPERTY_TYPE_INTEGER; } - if (is_bool($propertyValue)) { + if (\is_bool($propertyValue)) { return self::PROPERTY_TYPE_BOOLEAN; } @@ -444,11 +444,11 @@ class Properties */ public function setCustomProperty(string $propertyName, $propertyValue = '', $propertyType = null): self { - if (($propertyType === null) || (!in_array($propertyType, self::VALID_PROPERTY_TYPE_LIST))) { + if (($propertyType === null) || (!\in_array($propertyType, self::VALID_PROPERTY_TYPE_LIST))) { $propertyType = $this->identifyPropertyType($propertyValue); } - if (!is_object($propertyValue)) { + if (!\is_object($propertyValue)) { $this->customProperties[$propertyName] = [ 'value' => self::convertProperty($propertyValue, $propertyType), 'type' => $propertyType, @@ -518,13 +518,13 @@ class Properties case self::PROPERTY_TYPE_INTEGER: $intValue = (int) $propertyValue; - return ($type[0] === 'u') ? abs($intValue) : $intValue; + return ($type[0] === 'u') ? \abs($intValue) : $intValue; case self::PROPERTY_TYPE_FLOAT: return (float) $propertyValue; case self::PROPERTY_TYPE_DATE: return self::intOrFloatTimestamp($propertyValue); case self::PROPERTY_TYPE_BOOLEAN: - return is_bool($propertyValue) ? $propertyValue : ($propertyValue === 'true'); + return \is_bool($propertyValue) ? $propertyValue : ($propertyValue === 'true'); default: // includes string return $propertyValue; } diff --git a/PhpOffice/PhpSpreadsheet/HashTable.php b/PhpOffice/PhpSpreadsheet/HashTable.php index 6de7d03..7696c43 100755 --- a/PhpOffice/PhpSpreadsheet/HashTable.php +++ b/PhpOffice/PhpSpreadsheet/HashTable.php @@ -61,7 +61,7 @@ class HashTable $hash = $source->getHashCode(); if (!isset($this->items[$hash])) { $this->items[$hash] = $source; - $this->keyMap[count($this->items) - 1] = $hash; + $this->keyMap[\count($this->items) - 1] = $hash; } } @@ -86,7 +86,7 @@ class HashTable $deleteKey = $key; } } - unset($this->keyMap[count($this->keyMap) - 1]); + unset($this->keyMap[\count($this->keyMap) - 1]); } } @@ -106,7 +106,7 @@ class HashTable */ public function count() { - return count($this->items); + return \count($this->items); } /** @@ -117,7 +117,7 @@ class HashTable public function getIndexForHashCode(string $hashCode) { // Scrutinizer thinks the following could return string. It is wrong. - return array_search($hashCode, $this->keyMap, true); + return \array_search($hashCode, $this->keyMap, true); } /** @@ -163,13 +163,13 @@ class HashTable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { // each member of this class is an array - if (is_array($value)) { + if (\is_array($value)) { $array1 = $value; foreach ($array1 as $key1 => $value1) { - if (is_object($value1)) { + if (\is_object($value1)) { $array1[$key1] = clone $value1; } } diff --git a/PhpOffice/PhpSpreadsheet/Helper/Dimension.php b/PhpOffice/PhpSpreadsheet/Helper/Dimension.php index ff07ce5..34f0f98 100755 --- a/PhpOffice/PhpSpreadsheet/Helper/Dimension.php +++ b/PhpOffice/PhpSpreadsheet/Helper/Dimension.php @@ -63,13 +63,13 @@ class Dimension */ private static function stanBugFixed($value): array { - return is_array($value) ? $value : [null, null]; + return \is_array($value) ? $value : [null, null]; } public function __construct(string $dimension) { - [$size, $unit] = self::stanBugFixed(sscanf($dimension, '%[1234567890.]%s')); - $unit = strtolower(trim($unit ?? '')); + [$size, $unit] = self::stanBugFixed(\sscanf($dimension, '%[1234567890.]%s')); + $unit = \strtolower(\trim($unit ?? '')); $size = (float) $size; // If a UoM is specified, then convert the size to pixels for internal storage @@ -78,7 +78,7 @@ class Dimension $this->unit = self::UOM_PIXELS; } elseif (isset(self::RELATIVE_UNITS[$unit])) { $size *= self::RELATIVE_UNITS[$unit]; - $size = round($size, 4); + $size = \round($size, 4); } $this->size = $size; @@ -88,7 +88,7 @@ class Dimension { return (float) ($this->unit === null) ? $this->size - : round(Drawing::pixelsToCellDimension((int) $this->size, new Font(false)), 4); + : \round(Drawing::pixelsToCellDimension((int) $this->size, new Font(false)), 4); } public function height(): float @@ -100,8 +100,8 @@ class Dimension public function toUnit(string $unitOfMeasure): float { - $unitOfMeasure = strtolower($unitOfMeasure); - if (!array_key_exists($unitOfMeasure, self::ABSOLUTE_UNITS)) { + $unitOfMeasure = \strtolower($unitOfMeasure); + if (!\array_key_exists($unitOfMeasure, self::ABSOLUTE_UNITS)) { throw new Exception("{$unitOfMeasure} is not a vaid unit of measure"); } diff --git a/PhpOffice/PhpSpreadsheet/Helper/Html.php b/PhpOffice/PhpSpreadsheet/Helper/Html.php index b8ed386..5ae3b1c 100755 --- a/PhpOffice/PhpSpreadsheet/Helper/Html.php +++ b/PhpOffice/PhpSpreadsheet/Helper/Html.php @@ -626,7 +626,7 @@ class Html $this->initialise(); // Create a new DOM object - $dom = new DOMDocument(); + $dom = new \DOMDocument(); // Load the HTML file into the DOM object // Note the use of error suppression, because typically this will be an html fragment, so not fully valid markup $prefix = ''; @@ -650,10 +650,10 @@ class Html $text = $element->getText(); // Trim any leading spaces on the first run if ($key == 0) { - $text = ltrim($text); + $text = \ltrim($text); } // Trim any spaces immediately after a line break - $text = (string) preg_replace('/\n */mu', "\n", $text); + $text = (string) \preg_replace('/\n */mu', "\n", $text); $element->setText($text); } } @@ -661,7 +661,7 @@ class Html private function buildTextRun(): void { $text = $this->stringData; - if (trim($text) === '') { + if (\trim($text) === '') { return; } @@ -701,12 +701,12 @@ class Html private function rgbToColour(string $rgbValue): string { - preg_match_all('/\d+/', $rgbValue, $values); + \preg_match_all('/\d+/', $rgbValue, $values); foreach ($values[0] as &$value) { - $value = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); + $value = \str_pad(\dechex($value), 2, '0', STR_PAD_LEFT); } - return implode('', $values[0]); + return \implode('', $values[0]); } public static function colourNameLookup(string $colorName): string @@ -714,19 +714,19 @@ class Html return self::COLOUR_MAP[$colorName] ?? ''; } - private function startFontTag(DOMElement $tag): void + private function startFontTag(\DOMElement $tag): void { $attrs = $tag->attributes; if ($attrs !== null) { foreach ($attrs as $attribute) { - $attributeName = strtolower($attribute->name); + $attributeName = \strtolower($attribute->name); $attributeValue = $attribute->value; if ($attributeName == 'color') { - if (preg_match('/rgb\s*\(/', $attributeValue)) { + if (\preg_match('/rgb\s*\(/', $attributeValue)) { $this->$attributeName = $this->rgbToColour($attributeValue); - } elseif (strpos(trim($attributeValue), '#') === 0) { - $this->$attributeName = ltrim($attributeValue, '#'); + } elseif (\strpos(\trim($attributeValue), '#') === 0) { + $this->$attributeName = \ltrim($attributeValue, '#'); } else { $this->$attributeName = static::colourNameLookup($attributeValue); } @@ -807,12 +807,12 @@ class Html $this->stringData .= "\n"; } - private function parseTextNode(DOMText $textNode): void + private function parseTextNode(\DOMText $textNode): void { - $domText = (string) preg_replace( + $domText = (string) \preg_replace( '/\s+/u', ' ', - str_replace(["\r", "\n"], ' ', $textNode->nodeValue ?? '') + \str_replace(["\r", "\n"], ' ', $textNode->nodeValue ?? '') ); $this->stringData .= $domText; $this->buildTextRun(); @@ -821,36 +821,36 @@ class Html /** * @param string $callbackTag */ - private function handleCallback(DOMElement $element, $callbackTag, array $callbacks): void + private function handleCallback(\DOMElement $element, $callbackTag, array $callbacks): void { if (isset($callbacks[$callbackTag])) { $elementHandler = $callbacks[$callbackTag]; - if (method_exists($this, $elementHandler)) { + if (\method_exists($this, $elementHandler)) { /** @phpstan-ignore-next-line */ - call_user_func([$this, $elementHandler], $element); + \call_user_func([$this, $elementHandler], $element); } } } - private function parseElementNode(DOMElement $element): void + private function parseElementNode(\DOMElement $element): void { - $callbackTag = strtolower($element->nodeName); + $callbackTag = \strtolower($element->nodeName); $this->stack[] = $callbackTag; $this->handleCallback($element, $callbackTag, self::START_TAG_CALLBACKS); $this->parseElements($element); - array_pop($this->stack); + \array_pop($this->stack); $this->handleCallback($element, $callbackTag, self::END_TAG_CALLBACKS); } - private function parseElements(DOMNode $element): void + private function parseElements(\DOMNode $element): void { foreach ($element->childNodes as $child) { - if ($child instanceof DOMText) { + if ($child instanceof \DOMText) { $this->parseTextNode($child); - } elseif ($child instanceof DOMElement) { + } elseif ($child instanceof \DOMElement) { $this->parseElementNode($child); } } diff --git a/PhpOffice/PhpSpreadsheet/Helper/Sample.php b/PhpOffice/PhpSpreadsheet/Helper/Sample.php index 5ca546e..8b185ad 100755 --- a/PhpOffice/PhpSpreadsheet/Helper/Sample.php +++ b/PhpOffice/PhpSpreadsheet/Helper/Sample.php @@ -35,7 +35,7 @@ class Sample */ public function getScriptFilename() { - return basename($_SERVER['SCRIPT_FILENAME'], '.php'); + return \basename($_SERVER['SCRIPT_FILENAME'], '.php'); } /** @@ -65,7 +65,7 @@ class Sample */ public function getPageHeading() { - return $this->isIndex() ? '' : '

' . str_replace('_', ' ', $this->getScriptFilename()) . '

'; + return $this->isIndex() ? '' : '

' . \str_replace('_', ' ', $this->getScriptFilename()) . '

'; } /** @@ -76,28 +76,28 @@ class Sample public function getSamples() { // Populate samples - $baseDir = realpath(__DIR__ . '/../../../samples'); + $baseDir = \realpath(__DIR__ . '/../../../samples'); if ($baseDir === false) { // @codeCoverageIgnoreStart - throw new RuntimeException('realpath returned false'); + throw new \RuntimeException('realpath returned false'); // @codeCoverageIgnoreEnd } - $directory = new RecursiveDirectoryIterator($baseDir); - $iterator = new RecursiveIteratorIterator($directory); - $regex = new RegexIterator($iterator, '/^.+\.php$/', RecursiveRegexIterator::GET_MATCH); + $directory = new \RecursiveDirectoryIterator($baseDir); + $iterator = new \RecursiveIteratorIterator($directory); + $regex = new \RegexIterator($iterator, '/^.+\.php$/', \RecursiveRegexIterator::GET_MATCH); $files = []; foreach ($regex as $file) { - $file = str_replace(str_replace('\\', '/', $baseDir) . '/', '', str_replace('\\', '/', $file[0])); - if (is_array($file)) { + $file = \str_replace(\str_replace('\\', '/', $baseDir) . '/', '', \str_replace('\\', '/', $file[0])); + if (\is_array($file)) { // @codeCoverageIgnoreStart - throw new RuntimeException('str_replace returned array'); + throw new \RuntimeException('str_replace returned array'); // @codeCoverageIgnoreEnd } - $info = pathinfo($file); - $category = str_replace('_', ' ', $info['dirname'] ?? ''); - $name = str_replace('_', ' ', (string) preg_replace('/(|\.php)/', '', $info['filename'])); - if (!in_array($category, ['.', 'boostrap', 'templates'])) { + $info = \pathinfo($file); + $category = \str_replace('_', ' ', $info['dirname'] ?? ''); + $name = \str_replace('_', ' ', (string) \preg_replace('/(|\.php)/', '', $info['filename'])); + if (!\in_array($category, ['.', 'boostrap', 'templates'])) { if (!isset($files[$category])) { $files[$category] = []; } @@ -106,9 +106,9 @@ class Sample } // Sort everything - ksort($files); + \ksort($files); foreach ($files as &$f) { - asort($f); + \asort($f); } return $files; @@ -127,9 +127,9 @@ class Sample // Write documents foreach ($writers as $writerType) { - $path = $this->getFilename($filename, mb_strtolower($writerType)); + $path = $this->getFilename($filename, \mb_strtolower($writerType)); $writer = IOFactory::createWriter($spreadsheet, $writerType); - $callStartTime = microtime(true); + $callStartTime = \microtime(true); $writer->save($path); $this->logWrite($writer, $path, /** @scrutinizer ignore-type */ $callStartTime); } @@ -149,9 +149,9 @@ class Sample */ private function getTemporaryFolder() { - $tempFolder = sys_get_temp_dir() . '/phpspreadsheet'; + $tempFolder = \sys_get_temp_dir() . '/phpspreadsheet'; if (!$this->isDirOrMkdir($tempFolder)) { - throw new RuntimeException(sprintf('Directory "%s" was not created', $tempFolder)); + throw new \RuntimeException(\sprintf('Directory "%s" was not created', $tempFolder)); } return $tempFolder; @@ -167,9 +167,9 @@ class Sample */ public function getFilename($filename, $extension = 'xlsx') { - $originalExtension = pathinfo($filename, PATHINFO_EXTENSION); + $originalExtension = \pathinfo($filename, PATHINFO_EXTENSION); - return $this->getTemporaryFolder() . '/' . str_replace('.' . /** @scrutinizer ignore-type */ $originalExtension, '.' . $extension, basename($filename)); + return $this->getTemporaryFolder() . '/' . \str_replace('.' . /** @scrutinizer ignore-type */ $originalExtension, '.' . $extension, \basename($filename)); } /** @@ -181,13 +181,13 @@ class Sample */ public function getTemporaryFilename($extension = 'xlsx') { - $temporaryFilename = tempnam($this->getTemporaryFolder(), 'phpspreadsheet-'); + $temporaryFilename = \tempnam($this->getTemporaryFolder(), 'phpspreadsheet-'); if ($temporaryFilename === false) { // @codeCoverageIgnoreStart - throw new RuntimeException('tempnam returned false'); + throw new \RuntimeException('tempnam returned false'); // @codeCoverageIgnoreEnd } - unlink($temporaryFilename); + \unlink($temporaryFilename); return $temporaryFilename . '.' . $extension; } @@ -195,15 +195,15 @@ class Sample public function log(string $message): void { $eol = $this->isCli() ? PHP_EOL : '
'; - echo date('H:i:s ') . $message . $eol; + echo \date('H:i:s ') . $message . $eol; } public function titles(string $category, string $functionName, ?string $description = null): void { - $this->log(sprintf('%s Functions:', $category)); + $this->log(\sprintf('%s Functions:', $category)); $description === null - ? $this->log(sprintf('Function: %s()', rtrim($functionName, '()'))) - : $this->log(sprintf('Function: %s() - %s.', rtrim($functionName, '()'), rtrim($description, '.'))); + ? $this->log(\sprintf('Function: %s()', \rtrim($functionName, '()'))) + : $this->log(\sprintf('Function: %s() - %s.', \rtrim($functionName, '()'), \rtrim($description, '.'))); } public function displayGrid(array $matrix): void @@ -222,7 +222,7 @@ class Sample $this->log($worksheet->getCell($descriptionCell)->getValue()); } $this->log($worksheet->getCell($formulaCell)->getValue()); - $this->log(sprintf('%s() Result is ', $functionName) . $worksheet->getCell($formulaCell)->getCalculatedValue()); + $this->log(\sprintf('%s() Result is ', $functionName) . $worksheet->getCell($formulaCell)->getCalculatedValue()); } /** @@ -231,7 +231,7 @@ class Sample public function logEndingNotes(): void { // Do not show execution time for index - $this->log('Peak memory usage: ' . (memory_get_peak_usage(true) / 1024 / 1024) . 'MB'); + $this->log('Peak memory usage: ' . (\memory_get_peak_usage(true) / 1024 / 1024) . 'MB'); } /** @@ -242,11 +242,11 @@ class Sample */ public function logWrite(IWriter $writer, $path, $callStartTime): void { - $callEndTime = microtime(true); + $callEndTime = \microtime(true); $callTime = $callEndTime - $callStartTime; - $reflection = new ReflectionClass($writer); + $reflection = new \ReflectionClass($writer); $format = $reflection->getShortName(); - $message = "Write {$format} format to {$path} in " . sprintf('%.4f', $callTime) . ' seconds'; + $message = "Write {$format} format to {$path} in " . \sprintf('%.4f', $callTime) . ' seconds'; $this->log($message); } @@ -260,9 +260,9 @@ class Sample */ public function logRead($format, $path, $callStartTime): void { - $callEndTime = microtime(true); + $callEndTime = \microtime(true); $callTime = $callEndTime - $callStartTime; - $message = "Read {$format} format from {$path} in " . sprintf('%.4f', $callTime) . ' seconds'; + $message = "Read {$format} format from {$path} in " . \sprintf('%.4f', $callTime) . ' seconds'; $this->log($message); } diff --git a/PhpOffice/PhpSpreadsheet/Helper/Size.php b/PhpOffice/PhpSpreadsheet/Helper/Size.php index 12ba4ef..f472bb6 100755 --- a/PhpOffice/PhpSpreadsheet/Helper/Size.php +++ b/PhpOffice/PhpSpreadsheet/Helper/Size.php @@ -23,7 +23,7 @@ class Size public function __construct(string $size) { - $this->valid = (bool) preg_match(self::REGEXP_SIZE_VALIDATION, $size, $matches); + $this->valid = (bool) \preg_match(self::REGEXP_SIZE_VALIDATION, $size, $matches); if ($this->valid) { $this->size = $matches['size']; $this->unit = $matches['unit'] ?? 'pt'; diff --git a/PhpOffice/PhpSpreadsheet/Helper/TextGrid.php b/PhpOffice/PhpSpreadsheet/Helper/TextGrid.php index ed146a5..07049d4 100755 --- a/PhpOffice/PhpSpreadsheet/Helper/TextGrid.php +++ b/PhpOffice/PhpSpreadsheet/Helper/TextGrid.php @@ -31,14 +31,14 @@ class TextGrid public function __construct(array $matrix, bool $isCli = true) { - $this->rows = array_keys($matrix); - $this->columns = array_keys($matrix[$this->rows[0]]); + $this->rows = \array_keys($matrix); + $this->columns = \array_keys($matrix[$this->rows[0]]); - $matrix = array_values($matrix); - array_walk( + $matrix = \array_values($matrix); + \array_walk( $matrix, function (&$row): void { - $row = array_values($row); + $row = \array_values($row); } ); @@ -50,8 +50,8 @@ class TextGrid { $this->gridDisplay = $this->isCli ? '' : ''; - $maxRow = max($this->rows); - $maxRowLength = strlen((string) $maxRow) + 1; + $maxRow = \max($this->rows); + $maxRowLength = \strlen((string) $maxRow) + 1; $columnWidths = $this->getColumnWidths(); $this->renderColumnHeader($maxRowLength, $columnWidths); @@ -66,7 +66,7 @@ class TextGrid private function renderRows(int $maxRowLength, array $columnWidths): void { foreach ($this->matrix as $row => $rowData) { - $this->gridDisplay .= '|' . str_pad((string) $this->rows[$row], $maxRowLength, ' ', STR_PAD_LEFT) . ' '; + $this->gridDisplay .= '|' . \str_pad((string) $this->rows[$row], $maxRowLength, ' ', STR_PAD_LEFT) . ' '; $this->renderCells($rowData, $columnWidths); $this->gridDisplay .= '|' . PHP_EOL; } @@ -75,23 +75,23 @@ class TextGrid private function renderCells(array $rowData, array $columnWidths): void { foreach ($rowData as $column => $cell) { - $cell = ($this->isCli) ? (string) $cell : htmlentities((string) $cell); + $cell = ($this->isCli) ? (string) $cell : \htmlentities((string) $cell); $this->gridDisplay .= '| '; - $this->gridDisplay .= str_pad($cell, $columnWidths[$column] + 1, ' '); + $this->gridDisplay .= \str_pad($cell, $columnWidths[$column] + 1, ' '); } } private function renderColumnHeader(int $maxRowLength, array $columnWidths): void { - $this->gridDisplay .= str_repeat(' ', $maxRowLength + 2); + $this->gridDisplay .= \str_repeat(' ', $maxRowLength + 2); foreach ($this->columns as $column => $reference) { - $this->gridDisplay .= '+-' . str_repeat('-', $columnWidths[$column] + 1); + $this->gridDisplay .= '+-' . \str_repeat('-', $columnWidths[$column] + 1); } $this->gridDisplay .= '+' . PHP_EOL; - $this->gridDisplay .= str_repeat(' ', $maxRowLength + 2); + $this->gridDisplay .= \str_repeat(' ', $maxRowLength + 2); foreach ($this->columns as $column => $reference) { - $this->gridDisplay .= '| ' . str_pad((string) $reference, $columnWidths[$column] + 1, ' '); + $this->gridDisplay .= '| ' . \str_pad((string) $reference, $columnWidths[$column] + 1, ' '); } $this->gridDisplay .= '|' . PHP_EOL; @@ -100,20 +100,20 @@ class TextGrid private function renderFooter(int $maxRowLength, array $columnWidths): void { - $this->gridDisplay .= '+' . str_repeat('-', $maxRowLength + 1); + $this->gridDisplay .= '+' . \str_repeat('-', $maxRowLength + 1); foreach ($this->columns as $column => $reference) { $this->gridDisplay .= '+-'; - $this->gridDisplay .= str_pad((string) '', $columnWidths[$column] + 1, '-'); + $this->gridDisplay .= \str_pad((string) '', $columnWidths[$column] + 1, '-'); } $this->gridDisplay .= '+' . PHP_EOL; } private function getColumnWidths(): array { - $columnCount = count($this->matrix, COUNT_RECURSIVE) / count($this->matrix); + $columnCount = \count($this->matrix, COUNT_RECURSIVE) / \count($this->matrix); $columnWidths = []; for ($column = 0; $column < $columnCount; ++$column) { - $columnWidths[] = $this->getColumnWidth(array_column($this->matrix, $column)); + $columnWidths[] = $this->getColumnWidth(\array_column($this->matrix, $column)); } return $columnWidths; @@ -122,16 +122,16 @@ class TextGrid private function getColumnWidth(array $columnData): int { $columnWidth = 0; - $columnData = array_values($columnData); + $columnData = \array_values($columnData); foreach ($columnData as $columnValue) { - if (is_string($columnValue)) { - $columnWidth = max($columnWidth, strlen($columnValue)); - } elseif (is_bool($columnValue)) { - $columnWidth = max($columnWidth, strlen($columnValue ? 'TRUE' : 'FALSE')); + if (\is_string($columnValue)) { + $columnWidth = \max($columnWidth, \strlen($columnValue)); + } elseif (\is_bool($columnValue)) { + $columnWidth = \max($columnWidth, \strlen($columnValue ? 'TRUE' : 'FALSE')); } - $columnWidth = max($columnWidth, strlen((string) $columnWidth)); + $columnWidth = \max($columnWidth, \strlen((string) $columnWidth)); } return $columnWidth; diff --git a/PhpOffice/PhpSpreadsheet/IOFactory.php b/PhpOffice/PhpSpreadsheet/IOFactory.php index e437a22..1222352 100755 --- a/PhpOffice/PhpSpreadsheet/IOFactory.php +++ b/PhpOffice/PhpSpreadsheet/IOFactory.php @@ -108,11 +108,11 @@ abstract class IOFactory public static function identify(string $filename, ?array $readers = null): string { $reader = self::createReaderForFile($filename, $readers); - $className = get_class($reader); - $classType = explode('\\', $className); + $className = \get_class($reader); + $classType = \explode('\\', $className); unset($reader); - return array_pop($classType); + return \array_pop($classType); } /** @@ -130,11 +130,11 @@ abstract class IOFactory $testReaders = self::$readers; if ($readers !== null) { - $readers = array_map('strtoupper', $readers); - $testReaders = array_filter( + $readers = \array_map('strtoupper', $readers); + $testReaders = \array_filter( self::$readers, function (string $readerType) use ($readers) { - return in_array(strtoupper($readerType), $readers, true); + return \in_array(\strtoupper($readerType), $readers, true); }, ARRAY_FILTER_USE_KEY ); @@ -142,7 +142,7 @@ abstract class IOFactory // First, lucky guess by inspecting file extension $guessedReader = self::getReaderTypeFromExtension($filename); - if (($guessedReader !== null) && array_key_exists($guessedReader, $testReaders)) { + if (($guessedReader !== null) && \array_key_exists($guessedReader, $testReaders)) { $reader = self::createReader($guessedReader); // Let's see if we are lucky @@ -171,12 +171,12 @@ abstract class IOFactory */ private static function getReaderTypeFromExtension(string $filename): ?string { - $pathinfo = pathinfo($filename); + $pathinfo = \pathinfo($filename); if (!isset($pathinfo['extension'])) { return null; } - switch (strtolower($pathinfo['extension'])) { + switch (\strtolower($pathinfo['extension'])) { case 'xlsx': // Excel (OfficeOpenXML) Spreadsheet case 'xlsm': // Excel (OfficeOpenXML) Macro Spreadsheet (macros will be discarded) case 'xltx': // Excel (OfficeOpenXML) Template @@ -212,7 +212,7 @@ abstract class IOFactory */ public static function registerWriter(string $writerType, string $writerClass): void { - if (!is_a($writerClass, IWriter::class, true)) { + if (!\is_a($writerClass, IWriter::class, true)) { throw new Writer\Exception('Registered writers must implement ' . IWriter::class); } @@ -224,7 +224,7 @@ abstract class IOFactory */ public static function registerReader(string $readerType, string $readerClass): void { - if (!is_a($readerClass, IReader::class, true)) { + if (!\is_a($readerClass, IReader::class, true)) { throw new Reader\Exception('Registered readers must implement ' . IReader::class); } diff --git a/PhpOffice/PhpSpreadsheet/NamedRange.php b/PhpOffice/PhpSpreadsheet/NamedRange.php index db9c5f1..aed139a 100755 --- a/PhpOffice/PhpSpreadsheet/NamedRange.php +++ b/PhpOffice/PhpSpreadsheet/NamedRange.php @@ -46,8 +46,8 @@ class NamedRange extends DefinedName public function getCellsInRange(): array { $range = $this->value; - if (substr($range, 0, 1) === '=') { - $range = substr($range, 1); + if (\substr($range, 0, 1) === '=') { + $range = \substr($range, 1); } return Coordinate::extractAllCellReferencesInRange($range); diff --git a/PhpOffice/PhpSpreadsheet/Reader/BaseReader.php b/PhpOffice/PhpSpreadsheet/Reader/BaseReader.php index 42268d6..fd039c3 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/BaseReader.php +++ b/PhpOffice/PhpSpreadsheet/Reader/BaseReader.php @@ -110,7 +110,7 @@ abstract class BaseReader implements IReader return $this->setLoadAllSheets(); } - $this->loadSheetsOnly = is_array($sheetList) ? $sheetList : [$sheetList]; + $this->loadSheetsOnly = \is_array($sheetList) ? $sheetList : [$sheetList]; return $this; } @@ -185,7 +185,7 @@ abstract class BaseReader implements IReader File::assertFile($filename); // Open file - $fileHandle = fopen($filename, 'rb'); + $fileHandle = \fopen($filename, 'rb'); } if ($fileHandle === false) { throw new ReaderException('Could not open file ' . $filename . ' for reading.'); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Csv.php b/PhpOffice/PhpSpreadsheet/Reader/Csv.php index 4f128d6..8a1b187 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Csv.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Csv.php @@ -163,10 +163,10 @@ class Csv extends BaseReader */ protected function skipBOM(): void { - rewind($this->fileHandle); + \rewind($this->fileHandle); - if (fgets($this->fileHandle, self::UTF8_BOM_LEN + 1) !== self::UTF8_BOM) { - rewind($this->fileHandle); + if (\fgets($this->fileHandle, self::UTF8_BOM_LEN + 1) !== self::UTF8_BOM) { + \rewind($this->fileHandle); } } @@ -175,13 +175,13 @@ class Csv extends BaseReader */ protected function checkSeparator(): void { - $line = fgets($this->fileHandle); + $line = \fgets($this->fileHandle); if ($line === false) { return; } - if ((strlen(trim($line, "\r\n")) == 5) && (stripos($line, 'sep=') === 0)) { - $this->delimiter = substr($line, 4, 1); + if ((\strlen(\trim($line, "\r\n")) == 5) && (\stripos($line, 'sep=') === 0)) { + $this->delimiter = \substr($line, 4, 1); return; } @@ -240,18 +240,18 @@ class Csv extends BaseReader $worksheetInfo[0]['totalColumns'] = 0; // Loop through each line of the file in turn - $rowData = fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); - while (is_array($rowData)) { + $rowData = \fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); + while (\is_array($rowData)) { ++$worksheetInfo[0]['totalRows']; - $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1); - $rowData = fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); + $worksheetInfo[0]['lastColumnIndex'] = \max($worksheetInfo[0]['lastColumnIndex'], \count($rowData) - 1); + $rowData = \fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); } $worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex'] + 1); $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; // Close file - fclose($fileHandle); + \fclose($fileHandle); return $worksheetInfo; } @@ -277,7 +277,7 @@ class Csv extends BaseReader $spreadsheet = new Spreadsheet(); // Load into this instance - return $this->loadStringOrFile('data://text/plain,' . urlencode($contents), $spreadsheet, true); + return $this->loadStringOrFile('data://text/plain,' . \urlencode($contents), $spreadsheet, true); } private function openFileOrMemory(string $filename): void @@ -292,12 +292,12 @@ class Csv extends BaseReader } $this->openFile($filename); if ($this->inputEncoding !== 'UTF-8') { - fclose($this->fileHandle); - $entireFile = file_get_contents($filename); - $this->fileHandle = fopen('php://memory', 'r+b'); + \fclose($this->fileHandle); + $entireFile = \file_get_contents($filename); + $this->fileHandle = \fopen('php://memory', 'r+b'); if ($this->fileHandle !== false && $entireFile !== false) { $data = StringHelper::convertEncoding($entireFile, 'UTF-8', $this->inputEncoding); - fwrite($this->fileHandle, $data); + \fwrite($this->fileHandle, $data); $this->skipBOM(); } } @@ -314,8 +314,8 @@ class Csv extends BaseReader { $retVal = null; if ($value !== null && $this->testAutodetect) { - $retVal2 = @ini_set('auto_detect_line_endings', $value); - if (is_string($retVal2)) { + $retVal2 = @\ini_set('auto_detect_line_endings', $value); + if (\is_string($retVal2)) { $retVal = $retVal2; } } @@ -336,7 +336,7 @@ class Csv extends BaseReader */ private function openDataUri(string $filename): void { - $fileHandle = fopen($filename, 'rb'); + $fileHandle = \fopen($filename, 'rb'); if ($fileHandle === false) { // @codeCoverageIgnoreStart throw new ReaderException('Could not open file ' . $filename . ' for reading.'); @@ -386,10 +386,10 @@ class Csv extends BaseReader $outRow = 0; // Loop through each line of the file in turn - $rowData = fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); + $rowData = \fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); $valueBinder = Cell::getValueBinder(); - $preserveBooleanString = method_exists($valueBinder, 'getBooleanConversion') && $valueBinder->getBooleanConversion(); - while (is_array($rowData)) { + $preserveBooleanString = \method_exists($valueBinder, 'getBooleanConversion') && $valueBinder->getBooleanConversion(); + while (\is_array($rowData)) { $noOutputYet = true; $columnLetter = 'A'; foreach ($rowData as $rowDatum) { @@ -413,12 +413,12 @@ class Csv extends BaseReader } ++$columnLetter; } - $rowData = fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); + $rowData = \fgetcsv($fileHandle, 0, $this->delimiter ?? '', $this->enclosure, $this->escapeCharacter); ++$currentRow; } // Close file - fclose($fileHandle); + \fclose($fileHandle); $this->setAutoDetect($iniset); @@ -433,10 +433,10 @@ class Csv extends BaseReader */ private function convertBoolean(&$rowDatum, bool $preserveBooleanString): void { - if (is_string($rowDatum) && !$preserveBooleanString) { - if (strcasecmp(Calculation::getTRUE(), $rowDatum) === 0 || strcasecmp('true', $rowDatum) === 0) { + if (\is_string($rowDatum) && !$preserveBooleanString) { + if (\strcasecmp(Calculation::getTRUE(), $rowDatum) === 0 || \strcasecmp('true', $rowDatum) === 0) { $rowDatum = true; - } elseif (strcasecmp(Calculation::getFALSE(), $rowDatum) === 0 || strcasecmp('false', $rowDatum) === 0) { + } elseif (\strcasecmp(Calculation::getFALSE(), $rowDatum) === 0 || \strcasecmp('false', $rowDatum) === 0) { $rowDatum = false; } } else { @@ -452,21 +452,21 @@ class Csv extends BaseReader private function convertFormattedNumber(&$rowDatum): string { $numberFormatMask = NumberFormat::FORMAT_GENERAL; - if ($this->castFormattedNumberToNumeric === true && is_string($rowDatum)) { - $numeric = str_replace( + if ($this->castFormattedNumberToNumeric === true && \is_string($rowDatum)) { + $numeric = \str_replace( [StringHelper::getThousandsSeparator(), StringHelper::getDecimalSeparator()], ['', '.'], $rowDatum ); - if (is_numeric($numeric)) { - $decimalPos = strpos($rowDatum, StringHelper::getDecimalSeparator()); + if (\is_numeric($numeric)) { + $decimalPos = \strpos($rowDatum, StringHelper::getDecimalSeparator()); if ($this->preserveNumericFormatting === true) { - $numberFormatMask = (strpos($rowDatum, StringHelper::getThousandsSeparator()) !== false) + $numberFormatMask = (\strpos($rowDatum, StringHelper::getThousandsSeparator()) !== false) ? '#,##0' : '0'; if ($decimalPos !== false) { - $decimals = strlen($rowDatum) - $decimalPos - 1; - $numberFormatMask .= '.' . str_repeat('0', min($decimals, 6)); + $decimals = \strlen($rowDatum) - $decimalPos - 1; + $numberFormatMask .= '.' . \str_repeat('0', \min($decimals, 6)); } } @@ -552,16 +552,16 @@ class Csv extends BaseReader return false; } - fclose($this->fileHandle); + \fclose($this->fileHandle); // Trust file extension if any - $extension = strtolower(/** @scrutinizer ignore-type */ pathinfo($filename, PATHINFO_EXTENSION)); - if (in_array($extension, ['csv', 'tsv'])) { + $extension = \strtolower(/** @scrutinizer ignore-type */ \pathinfo($filename, PATHINFO_EXTENSION)); + if (\in_array($extension, ['csv', 'tsv'])) { return true; } // Attempt to guess mimetype - $type = mime_content_type($filename); + $type = \mime_content_type($filename); $supportedTypes = [ 'application/csv', 'text/csv', @@ -569,14 +569,14 @@ class Csv extends BaseReader 'inode/x-empty', ]; - return in_array($type, $supportedTypes, true); + return \in_array($type, $supportedTypes, true); } private static function guessEncodingTestNoBom(string &$encoding, string &$contents, string $compare, string $setEncoding): void { if ($encoding === '') { - $pos = strpos($contents, $compare); - if ($pos !== false && $pos % strlen($compare) === 0) { + $pos = \strpos($contents, $compare); + if ($pos !== false && $pos % \strlen($compare) === 0) { $encoding = $setEncoding; } } @@ -585,12 +585,12 @@ class Csv extends BaseReader private static function guessEncodingNoBom(string $filename): string { $encoding = ''; - $contents = file_get_contents($filename); + $contents = \file_get_contents($filename); self::guessEncodingTestNoBom($encoding, $contents, self::UTF32BE_LF, 'UTF-32BE'); self::guessEncodingTestNoBom($encoding, $contents, self::UTF32LE_LF, 'UTF-32LE'); self::guessEncodingTestNoBom($encoding, $contents, self::UTF16BE_LF, 'UTF-16BE'); self::guessEncodingTestNoBom($encoding, $contents, self::UTF16LE_LF, 'UTF-16LE'); - if ($encoding === '' && preg_match('//u', $contents) === 1) { + if ($encoding === '' && \preg_match('//u', $contents) === 1) { $encoding = 'UTF-8'; } @@ -600,7 +600,7 @@ class Csv extends BaseReader private static function guessEncodingTestBom(string &$encoding, string $first4, string $compare, string $setEncoding): void { if ($encoding === '') { - if ($compare === substr($first4, 0, strlen($compare))) { + if ($compare === \substr($first4, 0, \strlen($compare))) { $encoding = $setEncoding; } } @@ -609,7 +609,7 @@ class Csv extends BaseReader private static function guessEncodingBom(string $filename): string { $encoding = ''; - $first4 = file_get_contents($filename, false, null, 0, 4); + $first4 = \file_get_contents($filename, false, null, 0, 4); if ($first4 !== false) { self::guessEncodingTestBom($encoding, $first4, self::UTF8_BOM, 'UTF-8'); self::guessEncodingTestBom($encoding, $first4, self::UTF16BE_BOM, 'UTF-16BE'); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Csv/Delimiter.php b/PhpOffice/PhpSpreadsheet/Reader/Csv/Delimiter.php index 029d4a1..2f02449 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Csv/Delimiter.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Csv/Delimiter.php @@ -48,8 +48,8 @@ class Delimiter protected function countPotentialDelimiters(): void { - $this->counts = array_fill_keys(self::POTENTIAL_DELIMETERS, []); - $delimiterKeys = array_flip(self::POTENTIAL_DELIMETERS); + $this->counts = \array_fill_keys(self::POTENTIAL_DELIMETERS, []); + $delimiterKeys = \array_flip(self::POTENTIAL_DELIMETERS); // Count how many times each of the potential delimiters appears in each line $this->numberLines = 0; @@ -60,10 +60,10 @@ class Delimiter protected function countDelimiterValues(string $line, array $delimiterKeys): void { - $splitString = str_split($line, 1); - if (is_array($splitString)) { - $distribution = array_count_values($splitString); - $countLine = array_intersect_key($distribution, $delimiterKeys); + $splitString = \str_split($line, 1); + if (\is_array($splitString)) { + $distribution = \array_count_values($splitString); + $countLine = \array_intersect_key($distribution, $delimiterKeys); foreach (self::POTENTIAL_DELIMETERS as $delimiter) { $this->counts[$delimiter][] = $countLine[$delimiter] ?? 0; @@ -76,11 +76,11 @@ class Delimiter // Calculate the mean square deviations for each delimiter // (ignoring delimiters that haven't been found consistently) $meanSquareDeviations = []; - $middleIdx = floor(($this->numberLines - 1) / 2); + $middleIdx = \floor(($this->numberLines - 1) / 2); foreach (self::POTENTIAL_DELIMETERS as $delimiter) { $series = $this->counts[$delimiter]; - sort($series); + \sort($series); $median = ($this->numberLines % 2) ? $series[$middleIdx] @@ -90,12 +90,12 @@ class Delimiter continue; } - $meanSquareDeviations[$delimiter] = array_reduce( + $meanSquareDeviations[$delimiter] = \array_reduce( $series, function ($sum, $value) use ($median) { return $sum + ($value - $median) ** 2; } - ) / count($series); + ) / \count($series); } // ... and pick the delimiter with the smallest mean square deviation @@ -124,12 +124,12 @@ class Delimiter { $line = ''; $enclosure = ($this->escapeCharacter === '' ? '' - : ('(?escapeCharacter, '/') . ')')) - . preg_quote($this->enclosure, '/'); + : ('(?escapeCharacter, '/') . ')')) + . \preg_quote($this->enclosure, '/'); do { // Get the next line in the file - $newLine = fgets($this->fileHandle); + $newLine = \fgets($this->fileHandle); // Return false if there is no next line if ($newLine === false) { @@ -140,11 +140,11 @@ class Delimiter $line = $line . $newLine; // Drop everything that is enclosed to avoid counting false positives in enclosures - $line = (string) preg_replace('/(' . $enclosure . '.*' . $enclosure . ')/Us', '', $line); + $line = (string) \preg_replace('/(' . $enclosure . '.*' . $enclosure . ')/Us', '', $line); // See if we have any enclosures left in the line // if we still have an enclosure then we need to read the next line as well - } while (preg_match('/(' . $enclosure . ')/', $line) > 0); + } while (\preg_match('/(' . $enclosure . ')/', $line) > 0); return ($line !== '') ? $line : false; } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric.php b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric.php index b33af24..2c54e2e 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric.php @@ -81,23 +81,23 @@ class Gnumeric extends BaseReader public function canRead(string $filename): bool { // Check if gzlib functions are available - if (File::testFileNoThrow($filename) && function_exists('gzread')) { + if (File::testFileNoThrow($filename) && \function_exists('gzread')) { // Read signature data (first 3 bytes) - $fh = fopen($filename, 'rb'); + $fh = \fopen($filename, 'rb'); if ($fh !== false) { - $data = fread($fh, 2); - fclose($fh); + $data = \fread($fh, 2); + \fclose($fh); } } - return isset($data) && $data === chr(0x1F) . chr(0x8B); + return isset($data) && $data === \chr(0x1F) . \chr(0x8B); } - private static function matchXml(XMLReader $xml, string $expectedLocalName): bool + private static function matchXml(\XMLReader $xml, string $expectedLocalName): bool { return $xml->namespaceURI === self::NAMESPACE_GNM && $xml->localName === $expectedLocalName - && $xml->nodeType === XMLReader::ELEMENT; + && $xml->nodeType === \XMLReader::ELEMENT; } /** @@ -111,8 +111,8 @@ class Gnumeric extends BaseReader { File::assertFile($filename); - $xml = new XMLReader(); - $xml->xml($this->securityScanner->scanFile('compress.zlib://' . realpath($filename)), null, Settings::getLibXmlLoaderOptions()); + $xml = new \XMLReader(); + $xml->xml($this->securityScanner->scanFile('compress.zlib://' . \realpath($filename)), null, Settings::getLibXmlLoaderOptions()); $xml->setParserProperty(2, true); $worksheetNames = []; @@ -140,8 +140,8 @@ class Gnumeric extends BaseReader { File::assertFile($filename); - $xml = new XMLReader(); - $xml->xml($this->securityScanner->scanFile('compress.zlib://' . realpath($filename)), null, Settings::getLibXmlLoaderOptions()); + $xml = new \XMLReader(); + $xml->xml($this->securityScanner->scanFile('compress.zlib://' . \realpath($filename)), null, Settings::getLibXmlLoaderOptions()); $xml->setParserProperty(2, true); $worksheetInfo = []; @@ -185,13 +185,13 @@ class Gnumeric extends BaseReader */ private function gzfileGetContents($filename) { - $file = @gzopen($filename, 'rb'); + $file = @\gzopen($filename, 'rb'); $data = ''; if ($file !== false) { - while (!gzeof($file)) { - $data .= gzread($file, 1024); + while (!\gzeof($file)) { + $data .= \gzread($file, 1024); } - gzclose($file); + \gzclose($file); } return $data; @@ -199,10 +199,10 @@ class Gnumeric extends BaseReader public static function gnumericMappings(): array { - return array_merge(self::$mappings, Styles::$mappings); + return \array_merge(self::$mappings, Styles::$mappings); } - private function processComments(SimpleXMLElement $sheet): void + private function processComments(\SimpleXMLElement $sheet): void { if ((!$this->readDataOnly) && (isset($sheet->Objects))) { foreach ($sheet->Objects->children(self::NAMESPACE_GNM) as $key => $comment) { @@ -220,9 +220,9 @@ class Gnumeric extends BaseReader /** * @param mixed $value */ - private static function testSimpleXml($value): SimpleXMLElement + private static function testSimpleXml($value): \SimpleXMLElement { - return ($value instanceof SimpleXMLElement) ? $value : new SimpleXMLElement(''); + return ($value instanceof \SimpleXMLElement) ? $value : new \SimpleXMLElement(''); } /** @@ -248,7 +248,7 @@ class Gnumeric extends BaseReader $gFileData = $this->gzfileGetContents($filename); - $xml2 = simplexml_load_string($this->securityScanner->scan($gFileData), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions()); + $xml2 = \simplexml_load_string($this->securityScanner->scan($gFileData), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions()); $xml = self::testSimpleXml($xml2); $gnmXML = $xml->children(self::NAMESPACE_GNM); @@ -258,7 +258,7 @@ class Gnumeric extends BaseReader foreach ($gnmXML->Sheets->Sheet as $sheetOrNull) { $sheet = self::testSimpleXml($sheetOrNull); $worksheetName = (string) $sheet->Name; - if (is_array($this->loadSheetsOnly) && !in_array($worksheetName, $this->loadSheetsOnly, true)) { + if (\is_array($this->loadSheetsOnly) && !\in_array($worksheetName, $this->loadSheetsOnly, true)) { continue; } @@ -289,8 +289,8 @@ class Gnumeric extends BaseReader $row = (int) $cellAttributes->Row + 1; $column = (int) $cellAttributes->Col; - $maxRow = max($maxRow, $row); - $maxCol = max($maxCol, $column); + $maxRow = \max($maxRow, $row); + $maxCol = \max($maxCol, $column); $column = Coordinate::stringFromColumnIndex($column + 1); @@ -326,7 +326,7 @@ class Gnumeric extends BaseReader return $this->spreadsheet; } - private function setSelectedSheet(SimpleXMLElement $gnmXML): void + private function setSelectedSheet(\SimpleXMLElement $gnmXML): void { if (isset($gnmXML->UIData)) { $attributes = self::testSimpleXml($gnmXML->UIData->attributes()); @@ -335,7 +335,7 @@ class Gnumeric extends BaseReader } } - private function setSelectedCells(?SimpleXMLElement $sheet): void + private function setSelectedCells(?\SimpleXMLElement $sheet): void { if ($sheet !== null && isset($sheet->Selections)) { foreach ($sheet->Selections as $selection) { @@ -357,19 +357,19 @@ class Gnumeric extends BaseReader } } - private function processMergedCells(?SimpleXMLElement $sheet): void + private function processMergedCells(?\SimpleXMLElement $sheet): void { // Handle Merged Cells in this worksheet if ($sheet !== null && isset($sheet->MergedRegions)) { foreach ($sheet->MergedRegions->Merge as $mergeCells) { - if (strpos((string) $mergeCells, ':') !== false) { + if (\strpos((string) $mergeCells, ':') !== false) { $this->spreadsheet->getActiveSheet()->mergeCells($mergeCells, Worksheet::MERGE_CELL_CONTENT_HIDE); } } } } - private function processAutofilter(?SimpleXMLElement $sheet): void + private function processAutofilter(?\SimpleXMLElement $sheet): void { if ($sheet !== null && isset($sheet->Filters)) { foreach ($sheet->Filters->Filter as $autofilter) { @@ -401,7 +401,7 @@ class Gnumeric extends BaseReader } } - private function processColumnLoop(int $whichColumn, int $maxCol, ?SimpleXMLElement $columnOverride, float $defaultWidth): int + private function processColumnLoop(int $whichColumn, int $maxCol, ?\SimpleXMLElement $columnOverride, float $defaultWidth): int { $columnOverride = self::testSimpleXml($columnOverride); $columnAttributes = self::testSimpleXml($columnOverride->attributes()); @@ -424,7 +424,7 @@ class Gnumeric extends BaseReader return $whichColumn; } - private function processColumnWidths(?SimpleXMLElement $sheet, int $maxCol): void + private function processColumnWidths(?\SimpleXMLElement $sheet, int $maxCol): void { if ((!$this->readDataOnly) && $sheet !== null && (isset($sheet->Cols))) { // Column Widths @@ -460,7 +460,7 @@ class Gnumeric extends BaseReader } } - private function processRowLoop(int $whichRow, int $maxRow, ?SimpleXMLElement $rowOverride, float $defaultHeight): int + private function processRowLoop(int $whichRow, int $maxRow, ?\SimpleXMLElement $rowOverride, float $defaultHeight): int { $rowOverride = self::testSimpleXml($rowOverride); $rowAttributes = self::testSimpleXml($rowOverride->attributes()); @@ -483,7 +483,7 @@ class Gnumeric extends BaseReader return $whichRow; } - private function processRowHeights(?SimpleXMLElement $sheet, int $maxRow): void + private function processRowHeights(?\SimpleXMLElement $sheet, int $maxRow): void { if ((!$this->readDataOnly) && $sheet !== null && (isset($sheet->Rows))) { // Row Heights @@ -507,19 +507,19 @@ class Gnumeric extends BaseReader } } - private function processDefinedNames(?SimpleXMLElement $gnmXML): void + private function processDefinedNames(?\SimpleXMLElement $gnmXML): void { // Loop through definedNames (global named ranges) if ($gnmXML !== null && isset($gnmXML->Names)) { foreach ($gnmXML->Names->Name as $definedName) { $name = (string) $definedName->name; $value = (string) $definedName->value; - if (stripos($value, '#REF!') !== false) { + if (\stripos($value, '#REF!') !== false) { continue; } [$worksheetName] = Worksheet::extractSheetTitle($value, true); - $worksheetName = trim($worksheetName, "'"); + $worksheetName = \trim($worksheetName, "'"); $worksheet = $this->spreadsheet->getSheetByName($worksheetName); // Worksheet might still be null if we're only loading selected sheets rather than the full spreadsheet if ($worksheet !== null) { @@ -538,9 +538,9 @@ class Gnumeric extends BaseReader } private function loadCell( - SimpleXMLElement $cell, + \SimpleXMLElement $cell, string $worksheetName, - SimpleXMLElement $cellAttributes, + \SimpleXMLElement $cellAttributes, string $column, int $row ): void { @@ -568,7 +568,7 @@ class Gnumeric extends BaseReader $type = DataType::TYPE_FORMULA; } else { $vtype = (string) $ValueType; - if (array_key_exists($vtype, self::$mappings['dataType'])) { + if (\array_key_exists($vtype, self::$mappings['dataType'])) { $type = self::$mappings['dataType'][$vtype]; } if ($vtype === '20') { // Boolean diff --git a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php index 204c730..7d458a2 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php @@ -20,7 +20,7 @@ class PageSetup $this->spreadsheet = $spreadsheet; } - public function printInformation(SimpleXMLElement $sheet): self + public function printInformation(\SimpleXMLElement $sheet): self { if (isset($sheet->PrintInformation, $sheet->PrintInformation[0])) { $printInformation = $sheet->PrintInformation[0]; @@ -42,7 +42,7 @@ class PageSetup return $this; } - public function sheetMargins(SimpleXMLElement $sheet): self + public function sheetMargins(\SimpleXMLElement $sheet): self { if (isset($sheet->PrintInformation, $sheet->PrintInformation->Margins)) { $marginSet = [ @@ -62,7 +62,7 @@ class PageSetup return $this; } - private function buildMarginSet(SimpleXMLElement $sheet, array $marginSet): array + private function buildMarginSet(\SimpleXMLElement $sheet, array $marginSet): array { foreach ($sheet->PrintInformation->Margins->children(Gnumeric::NAMESPACE_GNM) as $key => $margin) { $marginAttributes = $margin->attributes(); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Properties.php b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Properties.php index 23d4067..8dc72b3 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Properties.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Properties.php @@ -18,7 +18,7 @@ class Properties $this->spreadsheet = $spreadsheet; } - private function docPropertiesOld(SimpleXMLElement $gnmXML): void + private function docPropertiesOld(\SimpleXMLElement $gnmXML): void { $docProps = $this->spreadsheet->getProperties(); foreach ($gnmXML->Summary->Item as $summaryItem) { @@ -26,43 +26,43 @@ class Properties $propertyValue = $summaryItem->{'val-string'}; switch ($propertyName) { case 'title': - $docProps->setTitle(trim($propertyValue)); + $docProps->setTitle(\trim($propertyValue)); break; case 'comments': - $docProps->setDescription(trim($propertyValue)); + $docProps->setDescription(\trim($propertyValue)); break; case 'keywords': - $docProps->setKeywords(trim($propertyValue)); + $docProps->setKeywords(\trim($propertyValue)); break; case 'category': - $docProps->setCategory(trim($propertyValue)); + $docProps->setCategory(\trim($propertyValue)); break; case 'manager': - $docProps->setManager(trim($propertyValue)); + $docProps->setManager(\trim($propertyValue)); break; case 'author': - $docProps->setCreator(trim($propertyValue)); - $docProps->setLastModifiedBy(trim($propertyValue)); + $docProps->setCreator(\trim($propertyValue)); + $docProps->setLastModifiedBy(\trim($propertyValue)); break; case 'company': - $docProps->setCompany(trim($propertyValue)); + $docProps->setCompany(\trim($propertyValue)); break; } } } - private function docPropertiesDC(SimpleXMLElement $officePropertyDC): void + private function docPropertiesDC(\SimpleXMLElement $officePropertyDC): void { $docProps = $this->spreadsheet->getProperties(); foreach ($officePropertyDC as $propertyName => $propertyValue) { - $propertyValue = trim((string) $propertyValue); + $propertyValue = \trim((string) $propertyValue); switch ($propertyName) { case 'title': $docProps->setTitle($propertyValue); @@ -90,13 +90,13 @@ class Properties } } - private function docPropertiesMeta(SimpleXMLElement $officePropertyMeta): void + private function docPropertiesMeta(\SimpleXMLElement $officePropertyMeta): void { $docProps = $this->spreadsheet->getProperties(); foreach ($officePropertyMeta as $propertyName => $propertyValue) { if ($propertyValue !== null) { $attributes = $propertyValue->attributes(Gnumeric::NAMESPACE_META); - $propertyValue = trim((string) $propertyValue); + $propertyValue = \trim((string) $propertyValue); switch ($propertyName) { case 'keyword': $docProps->setKeywords($propertyValue); @@ -114,7 +114,7 @@ class Properties break; case 'user-defined': if ($attributes) { - [, $attrName] = explode(':', (string) $attributes['name']); + [, $attrName] = \explode(':', (string) $attributes['name']); $this->userDefinedProperties($attrName, $propertyValue); } @@ -143,7 +143,7 @@ class Properties } } - public function readProperties(SimpleXMLElement $xml, SimpleXMLElement $gnmXML): void + public function readProperties(\SimpleXMLElement $xml, \SimpleXMLElement $gnmXML): void { $officeXML = $xml->children(Gnumeric::NAMESPACE_OFFICE); if (!empty($officeXML)) { diff --git a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Styles.php b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Styles.php index dc44dcc..30b2253 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Styles.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Gnumeric/Styles.php @@ -91,14 +91,14 @@ class Styles $this->readDataOnly = $readDataOnly; } - public function read(SimpleXMLElement $sheet, int $maxRow, int $maxCol): void + public function read(\SimpleXMLElement $sheet, int $maxRow, int $maxCol): void { if ($sheet->Styles->StyleRegion !== null) { $this->readStyles($sheet->Styles->StyleRegion, $maxRow, $maxCol); } } - private function readStyles(SimpleXMLElement $styleRegion, int $maxRow, int $maxCol): void + private function readStyles(\SimpleXMLElement $styleRegion, int $maxRow, int $maxCol): void { foreach ($styleRegion as $style) { /** @scrutinizer ignore-call */ @@ -125,7 +125,7 @@ class Styles } } - private function addBorderDiagonal(SimpleXMLElement $srssb, array &$styleArray): void + private function addBorderDiagonal(\SimpleXMLElement $srssb, array &$styleArray): void { if (isset($srssb->Diagonal, $srssb->{'Rev-Diagonal'})) { $styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->Diagonal->attributes()); @@ -139,40 +139,40 @@ class Styles } } - private function addBorderStyle(SimpleXMLElement $srssb, array &$styleArray, string $direction): void + private function addBorderStyle(\SimpleXMLElement $srssb, array &$styleArray, string $direction): void { - $ucDirection = ucfirst($direction); + $ucDirection = \ucfirst($direction); if (isset($srssb->$ucDirection)) { $styleArray['borders'][$direction] = self::parseBorderAttributes($srssb->$ucDirection->attributes()); } } - private function calcRotation(SimpleXMLElement $styleAttributes): int + private function calcRotation(\SimpleXMLElement $styleAttributes): int { $rotation = (int) $styleAttributes->Rotation; if ($rotation >= 270 && $rotation <= 360) { $rotation -= 360; } - $rotation = (abs($rotation) > 90) ? 0 : $rotation; + $rotation = (\abs($rotation) > 90) ? 0 : $rotation; return $rotation; } private static function addStyle(array &$styleArray, string $key, string $value): void { - if (array_key_exists($value, self::$mappings[$key])) { + if (\array_key_exists($value, self::$mappings[$key])) { $styleArray[$key] = self::$mappings[$key][$value]; } } private static function addStyle2(array &$styleArray, string $key1, string $key, string $value): void { - if (array_key_exists($value, self::$mappings[$key])) { + if (\array_key_exists($value, self::$mappings[$key])) { $styleArray[$key1][$key] = self::$mappings[$key][$value]; } } - private static function parseBorderAttributes(?SimpleXMLElement $borderAttributes): array + private static function parseBorderAttributes(?\SimpleXMLElement $borderAttributes): array { $styleArray = []; if ($borderAttributes !== null) { @@ -188,15 +188,15 @@ class Styles private static function parseGnumericColour(string $gnmColour): string { - [$gnmR, $gnmG, $gnmB] = explode(':', $gnmColour); - $gnmR = substr(str_pad($gnmR, 4, '0', STR_PAD_RIGHT), 0, 2); - $gnmG = substr(str_pad($gnmG, 4, '0', STR_PAD_RIGHT), 0, 2); - $gnmB = substr(str_pad($gnmB, 4, '0', STR_PAD_RIGHT), 0, 2); + [$gnmR, $gnmG, $gnmB] = \explode(':', $gnmColour); + $gnmR = \substr(\str_pad($gnmR, 4, '0', STR_PAD_RIGHT), 0, 2); + $gnmG = \substr(\str_pad($gnmG, 4, '0', STR_PAD_RIGHT), 0, 2); + $gnmB = \substr(\str_pad($gnmB, 4, '0', STR_PAD_RIGHT), 0, 2); return $gnmR . $gnmG . $gnmB; } - private function addColors(array &$styleArray, SimpleXMLElement $styleAttributes): void + private function addColors(array &$styleArray, \SimpleXMLElement $styleAttributes): void { $RGB = self::parseGnumericColour((string) $styleAttributes['Fore']); $styleArray['font']['color']['rgb'] = $RGB; @@ -215,7 +215,7 @@ class Styles } } - private function readStyleRange(SimpleXMLElement $styleAttributes, int $maxCol, int $maxRow): string + private function readStyleRange(\SimpleXMLElement $styleAttributes, int $maxCol, int $maxRow): string { $startColumn = Coordinate::stringFromColumnIndex((int) $styleAttributes['startCol'] + 1); $startRow = $styleAttributes['startRow'] + 1; @@ -229,7 +229,7 @@ class Styles return $cellRange; } - private function readStyle(array $styleArray, SimpleXMLElement $styleAttributes, SimpleXMLElement $style): array + private function readStyle(array $styleArray, \SimpleXMLElement $styleAttributes, \SimpleXMLElement $style): array { self::addStyle2($styleArray, 'alignment', 'horizontal', (string) $styleAttributes['HAlign']); self::addStyle2($styleArray, 'alignment', 'vertical', (string) $styleAttributes['VAlign']); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Html.php b/PhpOffice/PhpSpreadsheet/Reader/Html.php index 76f128e..5e367f9 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Html.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Html.php @@ -151,24 +151,24 @@ class Html extends BaseReader $containsTags = self::containsTags($beginning); $endsWithTag = self::endsWithTag($this->readEnding()); - fclose($this->fileHandle); + \fclose($this->fileHandle); return $startWithTag && $containsTags && $endsWithTag; } private function readBeginning(): string { - fseek($this->fileHandle, 0); + \fseek($this->fileHandle, 0); - return (string) fread($this->fileHandle, self::TEST_SAMPLE_SIZE); + return (string) \fread($this->fileHandle, self::TEST_SAMPLE_SIZE); } private function readEnding(): string { - $meta = stream_get_meta_data($this->fileHandle); + $meta = \stream_get_meta_data($this->fileHandle); $filename = $meta['uri']; - $size = (int) filesize($filename); + $size = (int) \filesize($filename); if ($size === 0) { return ''; } @@ -178,24 +178,24 @@ class Html extends BaseReader $blockSize = $size; } - fseek($this->fileHandle, $size - $blockSize); + \fseek($this->fileHandle, $size - $blockSize); - return (string) fread($this->fileHandle, $blockSize); + return (string) \fread($this->fileHandle, $blockSize); } private static function startsWithTag(string $data): bool { - return '<' === substr(trim($data), 0, 1); + return '<' === \substr(\trim($data), 0, 1); } private static function endsWithTag(string $data): bool { - return '>' === substr(trim($data), -1, 1); + return '>' === \substr(\trim($data), -1, 1); } private static function containsTags(string $data): bool { - return strlen($data) !== strlen(strip_tags($data)); + return \strlen($data) !== \strlen(\strip_tags($data)); } /** @@ -273,7 +273,7 @@ class Html extends BaseReader { --$this->tableLevel; - return array_pop($this->nestedColumn); + return \array_pop($this->nestedColumn); } /** @@ -285,9 +285,9 @@ class Html extends BaseReader */ protected function flushCell(Worksheet $sheet, $column, $row, &$cellContent): void { - if (is_string($cellContent)) { + if (\is_string($cellContent)) { // Simple String content - if (trim($cellContent) > '') { + if (\trim($cellContent) > '') { // Only actually write it if there's content in the string // Write to worksheet to be done here... // ... we return the cell so we can mess about with styles more easily @@ -302,7 +302,7 @@ class Html extends BaseReader $cellContent = (string) ''; } - private function processDomElementBody(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child): void + private function processDomElementBody(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child): void { $attributeArray = []; foreach (($child->attributes ?? []) as $attribute) { @@ -320,7 +320,7 @@ class Html extends BaseReader } } - private function processDomElementTitle(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementTitle(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'title') { $this->processDomElement($child, $sheet, $row, $column, $cellContent); @@ -333,9 +333,9 @@ class Html extends BaseReader private const SPAN_ETC = ['span', 'div', 'font', 'i', 'em', 'strong', 'b']; - private function processDomElementSpanEtc(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementSpanEtc(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { - if (in_array((string) $child->nodeName, self::SPAN_ETC, true)) { + if (\in_array((string) $child->nodeName, self::SPAN_ETC, true)) { if (isset($attributeArray['class']) && $attributeArray['class'] === 'comment') { $sheet->getComment($column . $row) ->getText() @@ -352,7 +352,7 @@ class Html extends BaseReader } } - private function processDomElementHr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementHr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'hr') { $this->flushCell($sheet, $column, $row, $cellContent); @@ -366,7 +366,7 @@ class Html extends BaseReader $this->processDomElementBr($sheet, $row, $column, $cellContent, $child, $attributeArray); } - private function processDomElementBr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementBr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'br' || $child->nodeName === 'hr') { if ($this->tableLevel > 0) { @@ -383,7 +383,7 @@ class Html extends BaseReader } } - private function processDomElementA(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementA(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'a') { foreach ($attributeArray as $attributeName => $attributeValue) { @@ -411,9 +411,9 @@ class Html extends BaseReader private const H1_ETC = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'p']; - private function processDomElementH1Etc(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementH1Etc(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { - if (in_array((string) $child->nodeName, self::H1_ETC, true)) { + if (\in_array((string) $child->nodeName, self::H1_ETC, true)) { if ($this->tableLevel > 0) { // If we're inside a table, replace with a \n $cellContent .= $cellContent ? "\n" : ''; @@ -439,7 +439,7 @@ class Html extends BaseReader } } - private function processDomElementLi(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementLi(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'li') { if ($this->tableLevel > 0) { @@ -460,7 +460,7 @@ class Html extends BaseReader } } - private function processDomElementImg(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementImg(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'img') { $this->insertImage($sheet, $column, $row, $attributeArray); @@ -469,7 +469,7 @@ class Html extends BaseReader } } - private function processDomElementTable(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementTable(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'table') { $this->flushCell($sheet, $column, $row, $cellContent); @@ -489,7 +489,7 @@ class Html extends BaseReader } } - private function processDomElementTr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementTr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName === 'tr') { $column = $this->getTableStartColumn(); @@ -506,7 +506,7 @@ class Html extends BaseReader } } - private function processDomElementThTdOther(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementThTdOther(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { if ($child->nodeName !== 'td' && $child->nodeName !== 'th') { $this->processDomElement($child, $sheet, $row, $column, $cellContent); @@ -564,7 +564,7 @@ class Html extends BaseReader } } - private function processDomElementThTd(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void + private function processDomElementThTd(Worksheet $sheet, int &$row, string &$column, string &$cellContent, \DOMElement $child, array &$attributeArray): void { while (isset($this->rowspan[$column . $row])) { ++$column; @@ -615,18 +615,18 @@ class Html extends BaseReader ++$column; } - protected function processDomElement(DOMNode $element, Worksheet $sheet, int &$row, string &$column, string &$cellContent): void + protected function processDomElement(\DOMNode $element, Worksheet $sheet, int &$row, string &$column, string &$cellContent): void { foreach ($element->childNodes as $child) { - if ($child instanceof DOMText) { - $domText = (string) preg_replace('/\s+/u', ' ', trim($child->nodeValue ?? '')); - if (is_string($cellContent)) { + if ($child instanceof \DOMText) { + $domText = (string) \preg_replace('/\s+/u', ' ', \trim($child->nodeValue ?? '')); + if (\is_string($cellContent)) { // simply append the text if the cell content is a plain text string $cellContent .= $domText; } // but if we have a rich text run instead, we need to append it correctly // TODO - } elseif ($child instanceof DOMElement) { + } elseif ($child instanceof \DOMElement) { $this->processDomElementBody($sheet, $row, $column, $cellContent, $child); } } @@ -647,7 +647,7 @@ class Html extends BaseReader } // Create a new DOM object - $dom = new DOMDocument(); + $dom = new \DOMDocument(); // Reload the HTML file into the DOM object try { $convert = $this->securityScanner->scanFile($filename); @@ -656,9 +656,9 @@ class Html extends BaseReader $regexp = "/[$lowend-$highend]/u"; /** @var callable */ $callback = [self::class, 'replaceNonAscii']; - $convert = preg_replace_callback($regexp, $callback, $convert); + $convert = \preg_replace_callback($regexp, $callback, $convert); $loaded = ($convert === null) ? false : $dom->loadHTML($convert); - } catch (Throwable $e) { + } catch (\Throwable $e) { $loaded = false; } if ($loaded === false) { @@ -670,7 +670,7 @@ class Html extends BaseReader private static function replaceNonAscii(array $matches): string { - return '&#' . mb_ord($matches[0], 'UTF-8') . ';'; + return '&#' . \mb_ord($matches[0], 'UTF-8') . ';'; } /** @@ -681,7 +681,7 @@ class Html extends BaseReader public function loadFromString($content, ?Spreadsheet $spreadsheet = null): Spreadsheet { // Create a new DOM object - $dom = new DOMDocument(); + $dom = new \DOMDocument(); // Reload the HTML file into the DOM object try { $convert = $this->securityScanner->scan($content); @@ -690,9 +690,9 @@ class Html extends BaseReader $regexp = "/[$lowend-$highend]/u"; /** @var callable */ $callback = [self::class, 'replaceNonAscii']; - $convert = preg_replace_callback($regexp, $callback, $convert); + $convert = \preg_replace_callback($regexp, $callback, $convert); $loaded = ($convert === null) ? false : $dom->loadHTML($convert); - } catch (Throwable $e) { + } catch (\Throwable $e) { $loaded = false; } if ($loaded === false) { @@ -705,7 +705,7 @@ class Html extends BaseReader /** * Loads PhpSpreadsheet from DOMDocument into PhpSpreadsheet instance. */ - private function loadDocument(DOMDocument $document, Spreadsheet $spreadsheet): Spreadsheet + private function loadDocument(\DOMDocument $document, Spreadsheet $spreadsheet): Spreadsheet { while ($spreadsheet->getSheetCount() <= $this->sheetIndex) { $spreadsheet->createSheet(); @@ -791,11 +791,11 @@ class Html extends BaseReader } // add color styles (background & text) from dom element,currently support : td & th, using ONLY inline css style with RGB color - $styles = explode(';', $attributeArray['style']); + $styles = \explode(';', $attributeArray['style']); foreach ($styles as $st) { - $value = explode(':', $st); - $styleName = isset($value[0]) ? trim($value[0]) : null; - $styleValue = isset($value[1]) ? trim($value[1]) : null; + $value = \explode(':', $st); + $styleName = isset($value[0]) ? \trim($value[0]) : null; + $styleValue = isset($value[1]) ? \trim($value[1]) : null; $styleValueString = (string) $styleValue; if (!$styleName) { @@ -872,7 +872,7 @@ class Html extends BaseReader break; case 'font-family': - $cellStyle->getFont()->setName(str_replace('\'', '', $styleValueString)); + $cellStyle->getFont()->setName(\str_replace('\'', '', $styleValueString)); break; @@ -923,7 +923,7 @@ class Html extends BaseReader case 'text-indent': $cellStyle->getAlignment()->setIndent( - (int) str_replace(['px'], '', $styleValueString) + (int) \str_replace(['px'], '', $styleValueString) ); break; @@ -941,8 +941,8 @@ class Html extends BaseReader public function getStyleColor($value) { $value = (string) $value; - if (strpos($value ?? '', '#') === 0) { - return substr($value, 1); + if (\strpos($value ?? '', '#') === 0) { + return \substr($value, 1); } return \PhpOffice\PhpSpreadsheet\Helper\Html::colourNameLookup($value); @@ -958,7 +958,7 @@ class Html extends BaseReader return; } - $src = urldecode($attributes['src']); + $src = \urldecode($attributes['src']); $width = isset($attributes['width']) ? (float) $attributes['width'] : null; $height = isset($attributes['height']) ? (float) $attributes['height'] : null; $name = $attributes['alt'] ?? null; @@ -1032,12 +1032,12 @@ class Html extends BaseReader */ private function setBorderStyle(Style $cellStyle, $styleValue, $type): void { - if (trim($styleValue) === Border::BORDER_NONE) { + if (\trim($styleValue) === Border::BORDER_NONE) { $borderStyle = Border::BORDER_NONE; $color = null; } else { - $borderArray = explode(' ', $styleValue); - $borderCount = count($borderArray); + $borderArray = \explode(' ', $styleValue); + $borderCount = \count($borderArray); if ($borderCount >= 3) { $borderStyle = $borderArray[1]; $color = $borderArray[2]; diff --git a/PhpOffice/PhpSpreadsheet/Reader/IReader.php b/PhpOffice/PhpSpreadsheet/Reader/IReader.php index d4a997b..00cdb72 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/IReader.php +++ b/PhpOffice/PhpSpreadsheet/Reader/IReader.php @@ -128,7 +128,7 @@ interface IReader * Loads PhpSpreadsheet from file. * * @param string $filename The name of the file to load - * @param int $flags Flags that can change the behaviour of the Writer: + * @param int $flags Flags that can change the behavior of the Writer: * self::LOAD_WITH_CHARTS Load any charts that are defined (if the Reader supports Charts) * self::READ_DATA_ONLY Read only data, not style or structure information, from the file * self::SKIP_EMPTY_CELLS Don't read empty cells (cells that contain a null value, diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods.php b/PhpOffice/PhpSpreadsheet/Reader/Ods.php index 3e0d803..d5aa79e 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods.php @@ -48,14 +48,14 @@ class Ods extends BaseReader // Load file if (File::testFileNoThrow($filename, '')) { - $zip = new ZipArchive(); + $zip = new \ZipArchive(); if ($zip->open($filename) === true) { // check if it is an OOXML archive $stat = $zip->statName('mimetype'); if (!empty($stat) && ($stat['size'] <= 255)) { $mimeType = $zip->getFromName($stat['name']); } elseif ($zip->statName('META-INF/manifest.xml')) { - $xml = simplexml_load_string( + $xml = \simplexml_load_string( $this->securityScanner->scan($zip->getFromName('META-INF/manifest.xml')), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions() @@ -95,9 +95,9 @@ class Ods extends BaseReader $worksheetNames = []; - $xml = new XMLReader(); + $xml = new \XMLReader(); $xml->xml( - $this->securityScanner->scanFile('zip://' . realpath($filename) . '#' . self::INITIAL_FILE), + $this->securityScanner->scanFile('zip://' . \realpath($filename) . '#' . self::INITIAL_FILE), null, Settings::getLibXmlLoaderOptions() ); @@ -117,12 +117,12 @@ class Ods extends BaseReader // Now read each node until we find our first table:table node while ($xml->read()) { $xmlName = self::getXmlName($xml); - if ($xmlName == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) { + if ($xmlName == 'table:table' && $xml->nodeType == \XMLReader::ELEMENT) { // Loop through each table:table node reading the table:name attribute for each worksheet name do { $worksheetNames[] = $xml->getAttribute('table:name'); $xml->next(); - } while (self::getXmlName($xml) == 'table:table' && $xml->nodeType == XMLReader::ELEMENT); + } while (self::getXmlName($xml) == 'table:table' && $xml->nodeType == \XMLReader::ELEMENT); } } } @@ -143,9 +143,9 @@ class Ods extends BaseReader $worksheetInfo = []; - $xml = new XMLReader(); + $xml = new \XMLReader(); $xml->xml( - $this->securityScanner->scanFile('zip://' . realpath($filename) . '#' . self::INITIAL_FILE), + $this->securityScanner->scanFile('zip://' . \realpath($filename) . '#' . self::INITIAL_FILE), null, Settings::getLibXmlLoaderOptions() ); @@ -164,7 +164,7 @@ class Ods extends BaseReader } // Now read each node until we find our first table:table node while ($xml->read()) { - if (self::getXmlName($xml) == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) { + if (self::getXmlName($xml) == 'table:table' && $xml->nodeType == \XMLReader::ELEMENT) { $worksheetNames[] = $xml->getAttribute('table:name'); $tmpInfo = [ @@ -179,23 +179,23 @@ class Ods extends BaseReader $currCells = 0; do { $xml->read(); - if (self::getXmlName($xml) == 'table:table-row' && $xml->nodeType == XMLReader::ELEMENT) { + if (self::getXmlName($xml) == 'table:table-row' && $xml->nodeType == \XMLReader::ELEMENT) { $rowspan = $xml->getAttribute('table:number-rows-repeated'); $rowspan = empty($rowspan) ? 1 : $rowspan; $tmpInfo['totalRows'] += $rowspan; - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $tmpInfo['totalColumns'] = \max($tmpInfo['totalColumns'], $currCells); $currCells = 0; // Step into the row $xml->read(); do { $doread = true; - if (self::getXmlName($xml) == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) { + if (self::getXmlName($xml) == 'table:table-cell' && $xml->nodeType == \XMLReader::ELEMENT) { if (!$xml->isEmptyElement) { ++$currCells; $xml->next(); $doread = false; } - } elseif (self::getXmlName($xml) == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) { + } elseif (self::getXmlName($xml) == 'table:covered-table-cell' && $xml->nodeType == \XMLReader::ELEMENT) { $mergeSize = $xml->getAttribute('table:number-columns-repeated'); $currCells += (int) $mergeSize; } @@ -206,7 +206,7 @@ class Ods extends BaseReader } } while (self::getXmlName($xml) != 'table:table'); - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $tmpInfo['totalColumns'] = \max($tmpInfo['totalColumns'], $currCells); $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1; $tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1); $worksheetInfo[] = $tmpInfo; @@ -222,7 +222,7 @@ class Ods extends BaseReader * * @phpstan-impure */ - private static function getXmlName(XMLReader $xml): string + private static function getXmlName(\XMLReader $xml): string { return $xml->name; } @@ -250,12 +250,12 @@ class Ods extends BaseReader { File::assertFile($filename, self::INITIAL_FILE); - $zip = new ZipArchive(); + $zip = new \ZipArchive(); $zip->open($filename); // Meta - $xml = @simplexml_load_string( + $xml = @\simplexml_load_string( $this->securityScanner->scan($zip->getFromName('meta.xml')), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions() @@ -270,7 +270,7 @@ class Ods extends BaseReader // Styles - $dom = new DOMDocument('1.01', 'UTF-8'); + $dom = new \DOMDocument('1.01', 'UTF-8'); $dom->loadXML( $this->securityScanner->scan($zip->getFromName('styles.xml')), Settings::getLibXmlLoaderOptions() @@ -280,7 +280,7 @@ class Ods extends BaseReader // Main Content - $dom = new DOMDocument('1.01', 'UTF-8'); + $dom = new \DOMDocument('1.01', 'UTF-8'); $dom->loadXML( $this->securityScanner->scan($zip->getFromName(self::INITIAL_FILE)), Settings::getLibXmlLoaderOptions() @@ -302,19 +302,19 @@ class Ods extends BaseReader ->getElementsByTagNameNS($officeNs, 'spreadsheet'); foreach ($spreadsheets as $workbookData) { - /** @var DOMElement $workbookData */ + /** @var \DOMElement $workbookData */ $tables = $workbookData->getElementsByTagNameNS($tableNs, 'table'); $worksheetID = 0; foreach ($tables as $worksheetDataSet) { - /** @var DOMElement $worksheetDataSet */ + /** @var \DOMElement $worksheetDataSet */ $worksheetName = $worksheetDataSet->getAttributeNS($tableNs, 'name'); // Check loadSheetsOnly if ( $this->loadSheetsOnly !== null && $worksheetName - && !in_array($worksheetName, $this->loadSheetsOnly) + && !\in_array($worksheetName, $this->loadSheetsOnly) ) { continue; } @@ -327,7 +327,7 @@ class Ods extends BaseReader } $spreadsheet->setActiveSheetIndex($worksheetID); - if ($worksheetName || is_numeric($worksheetName)) { + if ($worksheetName || \is_numeric($worksheetName)) { // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in // formula cells... during the load, all formulae should be correct, and we're simply // bringing the worksheet name in line with the formula, not the reverse @@ -337,7 +337,7 @@ class Ods extends BaseReader // Go through every child of table element $rowID = 1; foreach ($worksheetDataSet->childNodes as $childNode) { - /** @var DOMElement $childNode */ + /** @var \DOMElement $childNode */ // Filter elements which are not under the "table" ns if ($childNode->namespaceURI != $tableNs) { @@ -347,9 +347,9 @@ class Ods extends BaseReader $key = $childNode->nodeName; // Remove ns from node name - if (strpos($key, ':') !== false) { - $keyChunks = explode(':', $key); - $key = array_pop($keyChunks); + if (\strpos($key, ':') !== false) { + $keyChunks = \explode(':', $key); + $key = \array_pop($keyChunks); } switch ($key) { @@ -371,7 +371,7 @@ class Ods extends BaseReader } $columnID = 'A'; - /** @var DOMElement $cellData */ + /** @var \DOMElement $cellData */ foreach ($childNode->childNodes as $cellData) { if ($this->getReadFilter() !== null) { if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { @@ -417,11 +417,11 @@ class Ods extends BaseReader // Content - /** @var DOMElement[] $paragraphs */ + /** @var \DOMElement[] $paragraphs */ $paragraphs = []; foreach ($cellData->childNodes as $item) { - /** @var DOMElement $item */ + /** @var \DOMElement $item */ // Filter text:p elements if ($item->nodeName == 'text:p') { @@ -429,7 +429,7 @@ class Ods extends BaseReader } } - if (count($paragraphs) > 0) { + if (\count($paragraphs) > 0) { // Consolidate if there are multiple p records (maybe with spans as well) $dataArray = []; @@ -441,7 +441,7 @@ class Ods extends BaseReader foreach ($paragraphs as $pData) { $dataArray[] = $this->scanElementForText($pData); } - $allCellDataText = implode("\n", $dataArray); + $allCellDataText = \implode("\n", $dataArray); $type = $cellData->getAttributeNS($officeNs, 'value-type'); @@ -478,7 +478,7 @@ class Ods extends BaseReader $type = DataType::TYPE_NUMERIC; $dataValue = (float) $cellData->getAttributeNS($officeNs, 'value'); - if (floor($dataValue) == $dataValue) { + if (\floor($dataValue) == $dataValue) { $dataValue = (int) $dataValue; } $formatting = NumberFormat::FORMAT_CURRENCY_USD_SIMPLE; @@ -488,7 +488,7 @@ class Ods extends BaseReader $type = DataType::TYPE_NUMERIC; $dataValue = (float) $cellData->getAttributeNS($officeNs, 'value'); - if (floor($dataValue) == $dataValue) { + if (\floor($dataValue) == $dataValue) { if ($dataValue == (int) $dataValue) { $dataValue = (int) $dataValue; } @@ -500,7 +500,7 @@ class Ods extends BaseReader $value = $cellData->getAttributeNS($officeNs, 'date-value'); $dataValue = Date::convertIsoDate($value); - if ($dataValue != floor($dataValue)) { + if ($dataValue != \floor($dataValue)) { $formatting = NumberFormat::FORMAT_DATE_XLSX15 . ' ' . NumberFormat::FORMAT_DATE_TIME4; @@ -515,8 +515,8 @@ class Ods extends BaseReader $timeValue = $cellData->getAttributeNS($officeNs, 'time-value'); $dataValue = Date::PHPToExcel( - strtotime( - '01-01-1970 ' . implode(':', /** @scrutinizer ignore-type */ sscanf($timeValue, 'PT%dH%dM%dS') ?? []) + \strtotime( + '01-01-1970 ' . \implode(':', /** @scrutinizer ignore-type */ \sscanf($timeValue, 'PT%dH%dM%dS') ?? []) ) ); $formatting = NumberFormat::FORMAT_DATE_TIME4; @@ -532,7 +532,7 @@ class Ods extends BaseReader if ($hasCalculatedValue) { $type = DataType::TYPE_FORMULA; - $cellDataFormula = substr($cellDataFormula, strpos($cellDataFormula, ':=') + 1); + $cellDataFormula = \substr($cellDataFormula, \strpos($cellDataFormula, ':=') + 1); $cellDataFormula = FormulaTranslator::convertToExcelFormulaValue($cellDataFormula); } @@ -616,9 +616,9 @@ class Ods extends BaseReader return $spreadsheet; } - private function processSettings(ZipArchive $zip, Spreadsheet $spreadsheet): void + private function processSettings(\ZipArchive $zip, Spreadsheet $spreadsheet): void { - $dom = new DOMDocument('1.01', 'UTF-8'); + $dom = new \DOMDocument('1.01', 'UTF-8'); $dom->loadXML( $this->securityScanner->scan($zip->getFromName('settings.xml')), Settings::getLibXmlLoaderOptions() @@ -633,14 +633,14 @@ class Ods extends BaseReader $this->lookForSelectedCells($settings, $spreadsheet, $configNs); } - private function lookForActiveSheet(DOMElement $settings, Spreadsheet $spreadsheet, string $configNs): void + private function lookForActiveSheet(\DOMElement $settings, Spreadsheet $spreadsheet, string $configNs): void { - /** @var DOMElement $t */ + /** @var \DOMElement $t */ foreach ($settings->getElementsByTagNameNS($configNs, 'config-item') as $t) { if ($t->getAttributeNs($configNs, 'name') === 'ActiveTable') { try { $spreadsheet->setActiveSheetIndexByName($t->nodeValue ?? ''); - } catch (Throwable $e) { + } catch (\Throwable $e) { // do nothing } @@ -649,9 +649,9 @@ class Ods extends BaseReader } } - private function lookForSelectedCells(DOMElement $settings, Spreadsheet $spreadsheet, string $configNs): void + private function lookForSelectedCells(\DOMElement $settings, Spreadsheet $spreadsheet, string $configNs): void { - /** @var DOMElement $t */ + /** @var \DOMElement $t */ foreach ($settings->getElementsByTagNameNS($configNs, 'config-item-map-named') as $t) { if ($t->getAttributeNs($configNs, 'name') === 'Tables') { foreach ($t->getElementsByTagNameNS($configNs, 'config-item-map-entry') as $ws) { @@ -676,7 +676,7 @@ class Ods extends BaseReader private function setSelected(Spreadsheet $spreadsheet, string $wsname, string $setCol, string $setRow): void { - if (is_numeric($setCol) && is_numeric($setRow)) { + if (\is_numeric($setCol) && \is_numeric($setRow)) { $sheet = $spreadsheet->getSheetByName($wsname); if ($sheet !== null) { $sheet->setSelectedCells([(int) $setCol + 1, (int) $setRow + 1]); @@ -689,22 +689,22 @@ class Ods extends BaseReader * * @return string */ - protected function scanElementForText(DOMNode $element) + protected function scanElementForText(\DOMNode $element) { $str = ''; foreach ($element->childNodes as $child) { - /** @var DOMNode $child */ + /** @var \DOMNode $child */ if ($child->nodeType == XML_TEXT_NODE) { $str .= $child->nodeValue; } elseif ($child->nodeType == XML_ELEMENT_NODE && $child->nodeName == 'text:s') { // It's a space // Multiple spaces? - /** @var DOMAttr $cAttr */ + /** @var \DOMAttr $cAttr */ /** @scrutinizer ignore-call */ $cAttr = $child->attributes->getNamedItem('c'); $multiplier = self::getMultiplier($cAttr); - $str .= str_repeat(' ', $multiplier); + $str .= \str_repeat(' ', $multiplier); } if ($child->hasChildNodes()) { @@ -715,7 +715,7 @@ class Ods extends BaseReader return $str; } - private static function getMultiplier(?DOMAttr $cAttr): int + private static function getMultiplier(?\DOMAttr $cAttr): int { if ($cAttr) { $multiplier = (int) $cAttr->nodeValue; @@ -740,7 +740,7 @@ class Ods extends BaseReader } private function processMergedCells( - DOMElement $cellData, + \DOMElement $cellData, string $tableNs, string $type, string $columnID, diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods/AutoFilter.php b/PhpOffice/PhpSpreadsheet/Reader/Ods/AutoFilter.php index 1f5f975..e27c04b 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods/AutoFilter.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods/AutoFilter.php @@ -7,12 +7,12 @@ use DOMNode; class AutoFilter extends BaseLoader { - public function read(DOMElement $workbookData): void + public function read(\DOMElement $workbookData): void { $this->readAutoFilters($workbookData); } - protected function readAutoFilters(DOMElement $workbookData): void + protected function readAutoFilters(\DOMElement $workbookData): void { $databases = $workbookData->getElementsByTagNameNS($this->tableNs, 'database-ranges'); @@ -27,7 +27,7 @@ class AutoFilter extends BaseLoader } } - protected function getAttributeValue(?DOMNode $node, string $attributeName): ?string + protected function getAttributeValue(?\DOMNode $node, string $attributeName): ?string { if ($node !== null && $node->attributes !== null) { $attribute = $node->attributes->getNamedItemNS( diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods/BaseLoader.php b/PhpOffice/PhpSpreadsheet/Reader/Ods/BaseLoader.php index b06691f..9534e96 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods/BaseLoader.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods/BaseLoader.php @@ -23,5 +23,5 @@ abstract class BaseLoader $this->tableNs = $tableNs; } - abstract public function read(DOMElement $workbookData): void; + abstract public function read(\DOMElement $workbookData): void; } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods/DefinedNames.php b/PhpOffice/PhpSpreadsheet/Reader/Ods/DefinedNames.php index e0ab890..77f6eb0 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods/DefinedNames.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods/DefinedNames.php @@ -8,7 +8,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; class DefinedNames extends BaseLoader { - public function read(DOMElement $workbookData): void + public function read(\DOMElement $workbookData): void { $this->readDefinedRanges($workbookData); $this->readDefinedExpressions($workbookData); @@ -17,7 +17,7 @@ class DefinedNames extends BaseLoader /** * Read any Named Ranges that are defined in this spreadsheet. */ - protected function readDefinedRanges(DOMElement $workbookData): void + protected function readDefinedRanges(\DOMElement $workbookData): void { $namedRanges = $workbookData->getElementsByTagNameNS($this->tableNs, 'named-range'); foreach ($namedRanges as $definedNameElement) { @@ -35,7 +35,7 @@ class DefinedNames extends BaseLoader /** * Read any Named Formulae that are defined in this spreadsheet. */ - protected function readDefinedExpressions(DOMElement $workbookData): void + protected function readDefinedExpressions(\DOMElement $workbookData): void { $namedExpressions = $workbookData->getElementsByTagNameNS($this->tableNs, 'named-expression'); foreach ($namedExpressions as $definedNameElement) { @@ -44,7 +44,7 @@ class DefinedNames extends BaseLoader $expression = $definedNameElement->getAttributeNS($this->tableNs, 'expression'); $baseAddress = FormulaTranslator::convertToExcelAddressValue($baseAddress); - $expression = substr($expression, strpos($expression, ':=') + 1); + $expression = \substr($expression, \strpos($expression, ':=') + 1); $expression = FormulaTranslator::convertToExcelFormulaValue($expression); $this->addDefinedName($baseAddress, $definedName, $expression); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php b/PhpOffice/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php index 27862d7..2e5d547 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php @@ -13,7 +13,7 @@ class FormulaTranslator // Cell range 3-d reference // As we don't support 3-d ranges, we're just going to take a quick and dirty approach // and assume that the second worksheet reference is the same as the first - $excelAddress = (string) preg_replace( + $excelAddress = (string) \preg_replace( [ '/\$?([^\.]+)\.([^\.]+):\$?([^\.]+)\.([^\.]+)/miu', '/\$?([^\.]+)\.([^\.]+):\.([^\.]+)/miu', // Cell range reference in another sheet @@ -36,7 +36,7 @@ class FormulaTranslator public static function convertToExcelFormulaValue(string $openOfficeFormula): string { - $temp = explode(Calculation::FORMULA_STRING_QUOTE, $openOfficeFormula); + $temp = \explode(Calculation::FORMULA_STRING_QUOTE, $openOfficeFormula); $tKey = false; $inMatrixBracesLevel = 0; $inFunctionBracesLevel = 0; @@ -46,7 +46,7 @@ class FormulaTranslator // so that conversion isn't done in string values $tKey = $tKey === false; if ($tKey) { - $value = (string) preg_replace( + $value = (string) \preg_replace( [ '/\[\$?([^\.]+)\.([^\.]+):\.([^\.]+)\]/miu', // Cell range reference in another sheet '/\[\$?([^\.]+)\.([^\.]+)\]/miu', // Cell reference in another sheet @@ -62,7 +62,7 @@ class FormulaTranslator $value ); // Convert references to defined names/formulae - $value = str_replace('$$', '', $value); + $value = \str_replace('$$', '', $value); // Convert ODS function argument separators to Excel function argument separators $value = Calculation::translateSeparator(';', ',', $value, $inFunctionBracesLevel); @@ -85,12 +85,12 @@ class FormulaTranslator Calculation::FORMULA_CLOSE_MATRIX_BRACE ); - $value = (string) preg_replace('/COM\.MICROSOFT\./ui', '', $value); + $value = (string) \preg_replace('/COM\.MICROSOFT\./ui', '', $value); } } // Then rebuild the formula string - $excelFormula = implode('"', $temp); + $excelFormula = \implode('"', $temp); return $excelFormula; } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods/PageSettings.php b/PhpOffice/PhpSpreadsheet/Reader/Ods/PageSettings.php index 4d2fd99..cfdb94f 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods/PageSettings.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods/PageSettings.php @@ -45,14 +45,14 @@ class PageSettings */ private $masterPrintStylesCrossReference = []; - public function __construct(DOMDocument $styleDom) + public function __construct(\DOMDocument $styleDom) { $this->setDomNameSpaces($styleDom); $this->readPageSettingStyles($styleDom); $this->readStyleMasterLookup($styleDom); } - private function setDomNameSpaces(DOMDocument $styleDom): void + private function setDomNameSpaces(\DOMDocument $styleDom): void { $this->officeNs = $styleDom->lookupNamespaceUri('office'); $this->stylesNs = $styleDom->lookupNamespaceUri('style'); @@ -60,7 +60,7 @@ class PageSettings $this->tableNs = $styleDom->lookupNamespaceUri('table'); } - private function readPageSettingStyles(DOMDocument $styleDom): void + private function readPageSettingStyles(\DOMDocument $styleDom): void { $styles = $styleDom->getElementsByTagNameNS($this->officeNs, 'automatic-styles') ->item(0) @@ -102,7 +102,7 @@ class PageSettings } } - private function readStyleMasterLookup(DOMDocument $styleDom): void + private function readStyleMasterLookup(\DOMDocument $styleDom): void { $styleMasterLookup = $styleDom->getElementsByTagNameNS($this->officeNs, 'master-styles') ->item(0) @@ -115,7 +115,7 @@ class PageSettings } } - public function readStyleCrossReferences(DOMDocument $contentDom): void + public function readStyleCrossReferences(\DOMDocument $contentDom): void { $styleXReferences = $contentDom->getElementsByTagNameNS($this->officeNs, 'automatic-styles') ->item(0) @@ -140,7 +140,7 @@ class PageSettings public function setVisibilityForWorksheet(Worksheet $worksheet, string $styleName): void { - if (!array_key_exists($styleName, $this->tableStylesCrossReference)) { + if (!\array_key_exists($styleName, $this->tableStylesCrossReference)) { return; } @@ -153,17 +153,17 @@ class PageSettings public function setPrintSettingsForWorksheet(Worksheet $worksheet, string $styleName): void { - if (!array_key_exists($styleName, $this->masterStylesCrossReference)) { + if (!\array_key_exists($styleName, $this->masterStylesCrossReference)) { return; } $masterStyleName = $this->masterStylesCrossReference[$styleName]; - if (!array_key_exists($masterStyleName, $this->masterPrintStylesCrossReference)) { + if (!\array_key_exists($masterStyleName, $this->masterPrintStylesCrossReference)) { return; } $printSettingsIndex = $this->masterPrintStylesCrossReference[$masterStyleName]; - if (!array_key_exists($printSettingsIndex, $this->pageLayoutStyles)) { + if (!\array_key_exists($printSettingsIndex, $this->pageLayoutStyles)) { return; } $printSettings = $this->pageLayoutStyles[$printSettingsIndex]; @@ -171,7 +171,7 @@ class PageSettings $worksheet->getPageSetup() ->setOrientation($printSettings->orientation ?? PageSetup::ORIENTATION_DEFAULT) ->setPageOrder($printSettings->printOrder === 'ltr' ? PageSetup::PAGEORDER_OVER_THEN_DOWN : PageSetup::PAGEORDER_DOWN_THEN_OVER) - ->setScale((int) trim($printSettings->scale, '%')) + ->setScale((int) \trim($printSettings->scale, '%')) ->setHorizontalCentered($printSettings->horizontalCentered) ->setVerticalCentered($printSettings->verticalCentered); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Ods/Properties.php b/PhpOffice/PhpSpreadsheet/Reader/Ods/Properties.php index 1547a6b..d7d801c 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Ods/Properties.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Ods/Properties.php @@ -15,7 +15,7 @@ class Properties $this->spreadsheet = $spreadsheet; } - public function load(SimpleXMLElement $xml, $namespacesMeta): void + public function load(\SimpleXMLElement $xml, $namespacesMeta): void { $docProps = $this->spreadsheet->getProperties(); $officeProperty = $xml->children($namespacesMeta['office']); @@ -38,7 +38,7 @@ class Properties } } - private function setCoreProperties(DocumentProperties $docProps, SimpleXMLElement $officePropertyDC): void + private function setCoreProperties(DocumentProperties $docProps, \SimpleXMLElement $officePropertyDC): void { foreach ($officePropertyDC as $propertyName => $propertyValue) { $propertyValue = (string) $propertyValue; @@ -70,7 +70,7 @@ class Properties private function setMetaProperties( $namespacesMeta, - SimpleXMLElement $propertyValue, + \SimpleXMLElement $propertyValue, $propertyName, DocumentProperties $docProps ): void { diff --git a/PhpOffice/PhpSpreadsheet/Reader/Security/XmlScanner.php b/PhpOffice/PhpSpreadsheet/Reader/Security/XmlScanner.php index f4cf2db..f242f4a 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Security/XmlScanner.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Security/XmlScanner.php @@ -31,7 +31,7 @@ class XmlScanner // A fatal error will bypass the destructor, so we register a shutdown here if (!self::$shutdownRegistered) { self::$shutdownRegistered = true; - register_shutdown_function([__CLASS__, 'shutdown']); + \register_shutdown_function([__CLASS__, 'shutdown']); } } @@ -71,7 +71,7 @@ class XmlScanner private function disableEntityLoaderCheck(): void { if (\PHP_VERSION_ID < 80000) { - $libxmlDisableEntityLoaderValue = libxml_disable_entity_loader(true); + $libxmlDisableEntityLoaderValue = \libxml_disable_entity_loader(true); if (self::$libxmlDisableEntityLoaderValue === null) { self::$libxmlDisableEntityLoaderValue = $libxmlDisableEntityLoaderValue; @@ -82,7 +82,7 @@ class XmlScanner public static function shutdown(): void { if (self::$libxmlDisableEntityLoaderValue !== null && \PHP_VERSION_ID < 80000) { - libxml_disable_entity_loader(self::$libxmlDisableEntityLoaderValue); + \libxml_disable_entity_loader(self::$libxmlDisableEntityLoaderValue); self::$libxmlDisableEntityLoaderValue = null; } } @@ -100,7 +100,7 @@ class XmlScanner /** @param mixed $arg */ private static function forceString($arg): string { - return is_string($arg) ? $arg : ''; + return \is_string($arg) ? $arg : ''; } /** @@ -111,14 +111,14 @@ class XmlScanner private function toUtf8($xml) { $pattern = '/encoding="(.*?)"/'; - $result = preg_match($pattern, $xml, $matches); - $charset = strtoupper($result ? $matches[1] : 'UTF-8'); + $result = \preg_match($pattern, $xml, $matches); + $charset = \strtoupper($result ? $matches[1] : 'UTF-8'); if ($charset !== 'UTF-8') { - $xml = self::forceString(mb_convert_encoding($xml, 'UTF-8', $charset)); + $xml = self::forceString(\mb_convert_encoding($xml, 'UTF-8', $charset)); - $result = preg_match($pattern, $xml, $matches); - $charset = strtoupper($result ? $matches[1] : 'UTF-8'); + $result = \preg_match($pattern, $xml, $matches); + $charset = \strtoupper($result ? $matches[1] : 'UTF-8'); if ($charset !== 'UTF-8') { throw new Reader\Exception('Suspicious Double-encoded XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); } @@ -136,7 +136,7 @@ class XmlScanner */ public function scan($xml) { - if (!is_string($xml)) { + if (!\is_string($xml)) { $xml = ''; } $this->disableEntityLoaderCheck(); @@ -144,14 +144,14 @@ class XmlScanner $xml = $this->toUtf8($xml); // Don't rely purely on libxml_disable_entity_loader() - $pattern = '/\\0?' . implode('\\0?', /** @scrutinizer ignore-type */ str_split($this->pattern)) . '\\0?/'; + $pattern = '/\\0?' . \implode('\\0?', /** @scrutinizer ignore-type */ \str_split($this->pattern)) . '\\0?/'; - if (preg_match($pattern, $xml)) { + if (\preg_match($pattern, $xml)) { throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); } - if ($this->callback !== null && is_callable($this->callback)) { - $xml = call_user_func($this->callback, $xml); + if ($this->callback !== null && \is_callable($this->callback)) { + $xml = \call_user_func($this->callback, $xml); } return $xml; @@ -166,6 +166,6 @@ class XmlScanner */ public function scanFile($filestream) { - return $this->scan(file_get_contents($filestream)); + return $this->scan(\file_get_contents($filestream)); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Slk.php b/PhpOffice/PhpSpreadsheet/Reader/Slk.php index 38eddbc..ef64674 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Slk.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Slk.php @@ -74,17 +74,17 @@ class Slk extends BaseReader } // Read sample data (first 2 KB will do) - $data = (string) fread($this->fileHandle, 2048); + $data = (string) \fread($this->fileHandle, 2048); // Count delimiters in file - $delimiterCount = substr_count($data, ';'); + $delimiterCount = \substr_count($data, ';'); $hasDelimiter = $delimiterCount > 0; // Analyze first line looking for ID; signature - $lines = explode("\n", $data); - $hasId = substr($lines[0], 0, 4) === 'ID;P'; + $lines = \explode("\n", $data); + $hasId = \substr($lines[0], 0, 4) === 'ID;P'; - fclose($this->fileHandle); + \fclose($this->fileHandle); return $hasDelimiter && $hasId; } @@ -141,15 +141,15 @@ class Slk extends BaseReader // Open file $this->canReadOrBust($filename); $fileHandle = $this->fileHandle; - rewind($fileHandle); + \rewind($fileHandle); $worksheetInfo = []; - $worksheetInfo[0]['worksheetName'] = basename($filename, '.slk'); + $worksheetInfo[0]['worksheetName'] = \basename($filename, '.slk'); // loop through one row (line) at a time in the file $rowIndex = 0; $columnIndex = 0; - while (($rowData = fgets($fileHandle)) !== false) { + while (($rowData = \fgets($fileHandle)) !== false) { $columnIndex = 0; // convert SYLK encoded $rowData to UTF-8 @@ -157,18 +157,18 @@ class Slk extends BaseReader // explode each row at semicolons while taking into account that literal semicolon (;) // is escaped like this (;;) - $rowData = explode("\t", str_replace('¤', ';', str_replace(';', "\t", str_replace(';;', '¤', rtrim($rowData))))); + $rowData = \explode("\t", \str_replace('¤', ';', \str_replace(';', "\t", \str_replace(';;', '¤', \rtrim($rowData))))); - $dataType = array_shift($rowData); + $dataType = \array_shift($rowData); if ($dataType == 'B') { foreach ($rowData as $rowDatum) { switch ($rowDatum[0]) { case 'X': - $columnIndex = (int) substr($rowDatum, 1) - 1; + $columnIndex = (int) \substr($rowDatum, 1) - 1; break; case 'Y': - $rowIndex = substr($rowDatum, 1); + $rowIndex = \substr($rowDatum, 1); break; } @@ -184,7 +184,7 @@ class Slk extends BaseReader $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; // Close file - fclose($fileHandle); + \fclose($fileHandle); return $worksheetInfo; } @@ -220,19 +220,19 @@ class Slk extends BaseReader private function processFormula(string $rowDatum, bool &$hasCalculatedValue, string &$cellDataFormula, string $row, string $column): void { - $cellDataFormula = '=' . substr($rowDatum, 1); + $cellDataFormula = '=' . \substr($rowDatum, 1); // Convert R1C1 style references to A1 style references (but only when not quoted) - $temp = explode('"', $cellDataFormula); + $temp = \explode('"', $cellDataFormula); $key = false; foreach ($temp as &$value) { // Only count/replace in alternate array entries $key = $key === false; if ($key) { - preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/', $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); + \preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/', $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way // through the formula from left to right. Reversing means that we work right to left.through // the formula - $cellReferences = array_reverse($cellReferences); + $cellReferences = \array_reverse($cellReferences); // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, // then modify the formula to use that new reference foreach ($cellReferences as $cellReference) { @@ -243,7 +243,7 @@ class Slk extends BaseReader } // Bracketed R references are relative to the current row if ($rowReference[0] == '[') { - $rowReference = (int) $row + (int) trim($rowReference, '[]'); + $rowReference = (int) $row + (int) \trim($rowReference, '[]'); } $columnReference = $cellReference[4][0]; // Empty C reference is the current column @@ -252,17 +252,17 @@ class Slk extends BaseReader } // Bracketed C references are relative to the current column if ($columnReference[0] == '[') { - $columnReference = (int) $column + (int) trim($columnReference, '[]'); + $columnReference = (int) $column + (int) \trim($columnReference, '[]'); } $A1CellReference = Coordinate::stringFromColumnIndex((int) $columnReference) . $rowReference; - $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0])); + $value = \substr_replace($value, $A1CellReference, $cellReference[0][1], \strlen($cellReference[0][0])); } } } unset($value); // Then rebuild the formula string - $cellDataFormula = implode('"', $temp); + $cellDataFormula = \implode('"', $temp); $hasCalculatedValue = true; } @@ -275,16 +275,16 @@ class Slk extends BaseReader switch ($rowDatum[0]) { case 'C': case 'X': - $column = substr($rowDatum, 1); + $column = \substr($rowDatum, 1); break; case 'R': case 'Y': - $row = substr($rowDatum, 1); + $row = \substr($rowDatum, 1); break; case 'K': - $cellData = substr($rowDatum, 1); + $cellData = \substr($rowDatum, 1); break; case 'E': @@ -292,7 +292,7 @@ class Slk extends BaseReader break; case 'A': - $comment = substr($rowDatum, 1); + $comment = \substr($rowDatum, 1); $columnLetter = Coordinate::stringFromColumnIndex((int) $column); $spreadsheet->getActiveSheet() ->getComment("$columnLetter$row") @@ -330,12 +330,12 @@ class Slk extends BaseReader switch ($rowDatum[0]) { case 'C': case 'X': - $column = substr($rowDatum, 1); + $column = \substr($rowDatum, 1); break; case 'R': case 'Y': - $row = substr($rowDatum, 1); + $row = \substr($rowDatum, 1); break; case 'P': @@ -343,7 +343,7 @@ class Slk extends BaseReader break; case 'W': - [$startCol, $endCol, $columnWidth] = explode(' ', substr($rowDatum, 1)); + [$startCol, $endCol, $columnWidth] = \explode(' ', \substr($rowDatum, 1)); break; case 'S': @@ -369,18 +369,18 @@ class Slk extends BaseReader private function styleSettings(string $rowDatum, array &$styleData, string &$fontStyle): void { - $styleSettings = substr($rowDatum, 1); - $iMax = strlen($styleSettings); + $styleSettings = \substr($rowDatum, 1); + $iMax = \strlen($styleSettings); for ($i = 0; $i < $iMax; ++$i) { $char = $styleSettings[$i]; - if (array_key_exists($char, self::STYLE_SETTINGS_FONT)) { + if (\array_key_exists($char, self::STYLE_SETTINGS_FONT)) { $styleData['font'][self::STYLE_SETTINGS_FONT[$char]] = true; - } elseif (array_key_exists($char, self::STYLE_SETTINGS_BORDER)) { + } elseif (\array_key_exists($char, self::STYLE_SETTINGS_BORDER)) { $styleData['borders'][self::STYLE_SETTINGS_BORDER[$char]]['borderStyle'] = Border::BORDER_THIN; } elseif ($char == 'S') { $styleData['fill']['fillType'] = \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_PATTERN_GRAY125; } elseif ($char == 'M') { - if (preg_match('/M([1-9]\\d*)/', $styleSettings, $matches)) { + if (\preg_match('/M([1-9]\\d*)/', $styleSettings, $matches)) { $fontStyle = $matches[1]; } } @@ -441,16 +441,16 @@ class Slk extends BaseReader foreach ($rowData as $rowDatum) { switch ($rowDatum[0]) { case 'P': - $formatArray['numberFormat']['formatCode'] = str_replace($fromFormats, $toFormats, substr($rowDatum, 1)); + $formatArray['numberFormat']['formatCode'] = \str_replace($fromFormats, $toFormats, \substr($rowDatum, 1)); break; case 'E': case 'F': - $formatArray['font']['name'] = substr($rowDatum, 1); + $formatArray['font']['name'] = \substr($rowDatum, 1); break; case 'M': - $formatArray['font']['size'] = ((float) substr($rowDatum, 1)) / 20; + $formatArray['font']['size'] = ((float) \substr($rowDatum, 1)) / 20; break; case 'L': @@ -468,7 +468,7 @@ class Slk extends BaseReader private function processPColors(string $rowDatum, array &$formatArray): void { - if (preg_match('/L([1-9]\\d*)/', $rowDatum, $matches)) { + if (\preg_match('/L([1-9]\\d*)/', $rowDatum, $matches)) { $fontColor = $matches[1] % 8; $formatArray['font']['color']['argb'] = self::COLOR_ARRAY[$fontColor]; } @@ -476,10 +476,10 @@ class Slk extends BaseReader private function processPFontStyles(string $rowDatum, array &$formatArray): void { - $styleSettings = substr($rowDatum, 1); - $iMax = strlen($styleSettings); + $styleSettings = \substr($rowDatum, 1); + $iMax = \strlen($styleSettings); for ($i = 0; $i < $iMax; ++$i) { - if (array_key_exists($styleSettings[$i], self::FONT_STYLE_MAPPINGS)) { + if (\array_key_exists($styleSettings[$i], self::FONT_STYLE_MAPPINGS)) { $formatArray['font'][self::FONT_STYLE_MAPPINGS[$styleSettings[$i]]] = true; } } @@ -487,10 +487,10 @@ class Slk extends BaseReader private function processPFinal(Spreadsheet &$spreadsheet, array $formatArray): void { - if (array_key_exists('numberFormat', $formatArray)) { + if (\array_key_exists('numberFormat', $formatArray)) { $this->formats['P' . $this->format] = $formatArray; ++$this->format; - } elseif (array_key_exists('font', $formatArray)) { + } elseif (\array_key_exists('font', $formatArray)) { ++$this->fontcount; $this->fonts[$this->fontcount] = $formatArray; if ($this->fontcount === 1) { @@ -511,28 +511,28 @@ class Slk extends BaseReader // Open file $this->canReadOrBust($filename); $fileHandle = $this->fileHandle; - rewind($fileHandle); + \rewind($fileHandle); // Create new Worksheets while ($spreadsheet->getSheetCount() <= $this->sheetIndex) { $spreadsheet->createSheet(); } $spreadsheet->setActiveSheetIndex($this->sheetIndex); - $spreadsheet->getActiveSheet()->setTitle(substr(basename($filename, '.slk'), 0, Worksheet::SHEET_TITLE_MAXIMUM_LENGTH)); + $spreadsheet->getActiveSheet()->setTitle(\substr(\basename($filename, '.slk'), 0, Worksheet::SHEET_TITLE_MAXIMUM_LENGTH)); // Loop through file $column = $row = ''; // loop through one row (line) at a time in the file - while (($rowDataTxt = fgets($fileHandle)) !== false) { + while (($rowDataTxt = \fgets($fileHandle)) !== false) { // convert SYLK encoded $rowData to UTF-8 $rowDataTxt = StringHelper::SYLKtoUTF8($rowDataTxt); // explode each row at semicolons while taking into account that literal semicolon (;) // is escaped like this (;;) - $rowData = explode("\t", str_replace('¤', ';', str_replace(';', "\t", str_replace(';;', '¤', rtrim($rowDataTxt))))); + $rowData = \explode("\t", \str_replace('¤', ';', \str_replace(';', "\t", \str_replace(';;', '¤', \rtrim($rowDataTxt))))); - $dataType = array_shift($rowData); + $dataType = \array_shift($rowData); if ($dataType == 'P') { // Read shared styles $this->processPRecord($rowData, $spreadsheet); @@ -548,7 +548,7 @@ class Slk extends BaseReader } // Close file - fclose($fileHandle); + \fclose($fileHandle); // Return return $spreadsheet; @@ -559,9 +559,9 @@ class Slk extends BaseReader foreach ($rowData as $rowDatum) { $char0 = $rowDatum[0]; if ($char0 === 'X' || $char0 == 'C') { - $column = substr($rowDatum, 1); + $column = \substr($rowDatum, 1); } elseif ($char0 === 'Y' || $char0 == 'R') { - $row = substr($rowDatum, 1); + $row = \substr($rowDatum, 1); } } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xls.php b/PhpOffice/PhpSpreadsheet/Reader/Xls.php index 5367eff..f7d0da4 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xls.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xls.php @@ -471,7 +471,7 @@ class Xls extends BaseReader $this->loadOLE($filename); // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); + $this->dataSize = \strlen($this->data); $this->pos = 0; $this->sheets = []; @@ -529,7 +529,7 @@ class Xls extends BaseReader $this->loadOLE($filename); // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); + $this->dataSize = \strlen($this->data); // initialize $this->pos = 0; @@ -596,8 +596,8 @@ class Xls extends BaseReader $rowIndex = self::getUInt2d($recordData, 0) + 1; $columnIndex = self::getUInt2d($recordData, 2); - $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); - $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + $tmpInfo['totalRows'] = \max($tmpInfo['totalRows'], $rowIndex); + $tmpInfo['lastColumnIndex'] = \max($tmpInfo['lastColumnIndex'], $columnIndex); break; case self::XLS_TYPE_BOF: @@ -647,7 +647,7 @@ class Xls extends BaseReader $this->readDocumentSummaryInformation(); // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); + $this->dataSize = \strlen($this->data); // initialize $this->pos = 0; @@ -818,7 +818,7 @@ class Xls extends BaseReader } // check if sheet should be skipped - if (isset($this->loadSheetsOnly) && !in_array($sheet['name'], $this->loadSheetsOnly)) { + if (isset($this->loadSheetsOnly) && !\in_array($sheet['name'], $this->loadSheetsOnly)) { continue; } @@ -1094,7 +1094,7 @@ class Xls extends BaseReader // treat OBJ records foreach ($this->objs as $n => $obj) { // the first shape container never has a corresponding OBJ record, hence $n + 1 - if (isset($allSpContainers[$n + 1]) && is_object($allSpContainers[$n + 1])) { + if (isset($allSpContainers[$n + 1]) && \is_object($allSpContainers[$n + 1])) { $spContainer = $allSpContainers[$n + 1]; // we skip all spContainers that are a part of a group shape since we cannot yet handle those @@ -1151,7 +1151,7 @@ class Xls extends BaseReader // need check because some blip types are not supported by Escher reader such as EMF if ($blip = $BSE->getBlip()) { - $ih = imagecreatefromstring($blip->getData()); + $ih = \imagecreatefromstring($blip->getData()); if ($ih !== false) { $drawing = new MemoryDrawing(); $drawing->setImageResource($ih); @@ -1170,8 +1170,8 @@ class Xls extends BaseReader break; case BSE::BLIPTYPE_PNG: - imagealphablending($ih, false); - imagesavealpha($ih, true); + \imagealphablending($ih, false); + \imagesavealpha($ih, true); $drawing->setRenderingFunction(MemoryDrawing::RENDERING_PNG); $drawing->setMimeType(MemoryDrawing::MIMETYPE_PNG); @@ -1213,7 +1213,7 @@ class Xls extends BaseReader $noteDetails['objTextData']['text'] = ''; } } - $cellAddress = str_replace('$', '', $noteDetails['cellRef']); + $cellAddress = \str_replace('$', '', $noteDetails['cellRef']); $this->phpSheet->getComment($cellAddress)->setAuthor($noteDetails['author'])->setText($this->parseRichText($noteDetails['objTextData']['text'])); } } @@ -1223,10 +1223,10 @@ class Xls extends BaseReader foreach ($this->definedname as $definedName) { if ($definedName['isBuiltInName']) { switch ($definedName['name']) { - case pack('C', 0x06): + case \pack('C', 0x06): // print area // in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2 - $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? + $ranges = \explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? $extractedRanges = []; foreach ($ranges as $range) { @@ -1234,20 +1234,20 @@ class Xls extends BaseReader // Foo!$C$7:$J$66 // Bar!$A$1:$IV$2 $explodes = Worksheet::extractSheetTitle($range, true); - $sheetName = trim($explodes[0], "'"); - if (count($explodes) == 2) { - if (strpos($explodes[1], ':') === false) { + $sheetName = \trim($explodes[0], "'"); + if (\count($explodes) == 2) { + if (\strpos($explodes[1], ':') === false) { $explodes[1] = $explodes[1] . ':' . $explodes[1]; } - $extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66 + $extractedRanges[] = \str_replace('$', '', $explodes[1]); // C7:J66 } } if ($docSheet = $this->spreadsheet->getSheetByName($sheetName)) { - $docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2 + $docSheet->getPageSetup()->setPrintArea(\implode(',', $extractedRanges)); // C7:J66,A1:IV2 } break; - case pack('C', 0x07): + case \pack('C', 0x07): // print titles (repeating rows) // Assuming BIFF8, there are 3 cases // 1. repeating rows @@ -1258,19 +1258,19 @@ class Xls extends BaseReader // columns A-B repeat // 3. both repeating rows and repeating columns // formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2 - $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? + $ranges = \explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? foreach ($ranges as $range) { // $range should look like this one of these // Sheet!$A$1:$B$65536 // Sheet!$A$1:$IV$2 - if (strpos($range, '!') !== false) { + if (\strpos($range, '!') !== false) { $explodes = Worksheet::extractSheetTitle($range, true); if ($docSheet = $this->spreadsheet->getSheetByName($explodes[0])) { $extractedRange = $explodes[1]; - $extractedRange = str_replace('$', '', $extractedRange); + $extractedRange = \str_replace('$', '', $extractedRange); - $coordinateStrings = explode(':', $extractedRange); - if (count($coordinateStrings) == 2) { + $coordinateStrings = \explode(':', $extractedRange); + if (\count($coordinateStrings) == 2) { [$firstColumn, $firstRow] = Coordinate::coordinateFromString($coordinateStrings[0]); [$lastColumn, $lastRow] = Coordinate::coordinateFromString($coordinateStrings[1]); @@ -1290,11 +1290,11 @@ class Xls extends BaseReader } } else { // Extract range - if (strpos($definedName['formula'], '!') !== false) { + if (\strpos($definedName['formula'], '!') !== false) { $explodes = Worksheet::extractSheetTitle($definedName['formula'], true); if ( ($docSheet = $this->spreadsheet->getSheetByName($explodes[0])) || - ($docSheet = $this->spreadsheet->getSheetByName(trim($explodes[0], "'"))) + ($docSheet = $this->spreadsheet->getSheetByName(\trim($explodes[0], "'"))) ) { $extractedRange = $explodes[1]; @@ -1325,7 +1325,7 @@ class Xls extends BaseReader */ private function readRecordData($data, $pos, $len) { - $data = substr($data, $pos, $len); + $data = \substr($data, $pos, $len); // File not encrypted, or record before encryption start point if ($this->encryption == self::MS_BIFF_CRYPTO_NONE || $pos < $this->encryptionStartPos) { @@ -1334,9 +1334,9 @@ class Xls extends BaseReader $recordData = ''; if ($this->encryption == self::MS_BIFF_CRYPTO_RC4) { - $oldBlock = floor($this->rc4Pos / self::REKEY_BLOCK); - $block = floor($pos / self::REKEY_BLOCK); - $endBlock = floor(($pos + $len) / self::REKEY_BLOCK); + $oldBlock = \floor($this->rc4Pos / self::REKEY_BLOCK); + $block = \floor($pos / self::REKEY_BLOCK); + $endBlock = \floor(($pos + $len) / self::REKEY_BLOCK); // Spin an RC4 decryptor to the right spot. If we have a decryptor sitting // at a point earlier in the current block, re-use it as we can save some time. @@ -1346,19 +1346,19 @@ class Xls extends BaseReader } else { $step = $pos - $this->rc4Pos; } - $this->rc4Key->RC4(str_repeat("\0", $step)); + $this->rc4Key->RC4(\str_repeat("\0", $step)); // Decrypt record data (re-keying at the end of every block) while ($block != $endBlock) { $step = self::REKEY_BLOCK - ($pos % self::REKEY_BLOCK); - $recordData .= $this->rc4Key->RC4(substr($data, 0, $step)); - $data = substr($data, $step); + $recordData .= $this->rc4Key->RC4(\substr($data, 0, $step)); + $data = \substr($data, $step); $pos += $step; $len -= $step; ++$block; $this->rc4Key = $this->makeKey($block, $this->md5Ctxt); } - $recordData .= $this->rc4Key->RC4(substr($data, 0, $len)); + $recordData .= $this->rc4Key->RC4(\substr($data, 0, $len)); // Keep track of the position of this decryptor. // We'll try and re-use it later if we can to speed things up @@ -1450,14 +1450,14 @@ class Xls extends BaseReader break; case 0x1E: // null-terminated string prepended by dword string length $byteLength = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset); - $value = substr($this->summaryInformation, $secOffset + 8 + $offset, $byteLength); + $value = \substr($this->summaryInformation, $secOffset + 8 + $offset, $byteLength); $value = StringHelper::convertEncoding($value, 'UTF-8', $codePage); - $value = rtrim($value); + $value = \rtrim($value); break; case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) // PHP-time - $value = OLE::OLE2LocalDate(substr($this->summaryInformation, $secOffset + 4 + $offset, 8)); + $value = OLE::OLE2LocalDate(\substr($this->summaryInformation, $secOffset + 4 + $offset, 8)); break; case 0x47: // Clipboard format @@ -1602,14 +1602,14 @@ class Xls extends BaseReader break; case 0x1E: // null-terminated string prepended by dword string length $byteLength = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset); - $value = substr($this->documentSummaryInformation, $secOffset + 8 + $offset, $byteLength); + $value = \substr($this->documentSummaryInformation, $secOffset + 8 + $offset, $byteLength); $value = StringHelper::convertEncoding($value, 'UTF-8', $codePage); - $value = rtrim($value); + $value = \rtrim($value); break; case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) // PHP-Time - $value = OLE::OLE2LocalDate(substr($this->documentSummaryInformation, $secOffset + 4 + $offset, 8)); + $value = OLE::OLE2LocalDate(\substr($this->documentSummaryInformation, $secOffset + 4 + $offset, 8)); break; case 0x47: // Clipboard format @@ -1701,10 +1701,10 @@ class Xls extends BaseReader return; } - $cellAddress = $this->readBIFF8CellAddress(substr($recordData, 0, 4)); + $cellAddress = $this->readBIFF8CellAddress(\substr($recordData, 0, 4)); if ($this->version == self::XLS_BIFF8) { $noteObjID = self::getUInt2d($recordData, 6); - $noteAuthor = self::readUnicodeStringLong(substr($recordData, 8)); + $noteAuthor = self::readUnicodeStringLong(\substr($recordData, 8)); $noteAuthor = $noteAuthor['value']; $this->cellNotes[$noteObjID] = [ 'cellRef' => $cellAddress, @@ -1719,13 +1719,13 @@ class Xls extends BaseReader // max 2048 bytes will probably throw a wobbly. $row = self::getUInt2d($recordData, 0); $extension = true; - $arrayKeys = array_keys($this->phpSheet->getComments()); - $cellAddress = array_pop($arrayKeys); + $arrayKeys = \array_keys($this->phpSheet->getComments()); + $cellAddress = \array_pop($arrayKeys); } - $cellAddress = str_replace('$', '', $cellAddress); + $cellAddress = \str_replace('$', '', $cellAddress); $noteLength = self::getUInt2d($recordData, 4); - $noteText = trim(substr($recordData, 6)); + $noteText = \trim(\substr($recordData, 6)); if ($extension) { // Concatenate this extension with the currently set comment for the cell @@ -1768,9 +1768,9 @@ class Xls extends BaseReader $text = $this->getSplicedRecordData(); $textByte = $text['spliceOffsets'][1] - $text['spliceOffsets'][0] - 1; - $textStr = substr($text['recordData'], $text['spliceOffsets'][0] + 1, $textByte); + $textStr = \substr($text['recordData'], $text['spliceOffsets'][0] + 1, $textByte); // get 1 byte - $is16Bit = ord($text['recordData'][0]); + $is16Bit = \ord($text['recordData'][0]); // it is possible to use a compressed format, // which omits the high bytes of all characters, if they are all zero if (($is16Bit & 0x01) === 0) { @@ -1781,7 +1781,7 @@ class Xls extends BaseReader $this->textObjects[$this->textObjRef] = [ 'text' => $textStr, - 'format' => substr($text['recordData'], $text['spliceOffsets'][1], $cbRuns), + 'format' => \substr($text['recordData'], $text['spliceOffsets'][1], $cbRuns), 'alignment' => $grbitOpts, 'rotation' => $rot, ]; @@ -1793,7 +1793,7 @@ class Xls extends BaseReader private function readBof(): void { $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = substr($this->data, $this->pos + 4, $length); + $recordData = \substr($this->data, $this->pos + 4, $length); // move stream pointer to next record $this->pos += 4 + $length; @@ -1854,7 +1854,7 @@ class Xls extends BaseReader // move stream pointer to next record $this->pos += 4 + $length; - if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) { + if (!$this->verifyPassword('VelvetSweatshop', \substr($recordData, 6, 16), \substr($recordData, 22, 16), \substr($recordData, 38, 16), $this->md5Ctxt)) { throw new Exception('Decryption password incorrect'); } @@ -1874,16 +1874,16 @@ class Xls extends BaseReader */ private function makeKey($block, $valContext) { - $pwarray = str_repeat("\0", 64); + $pwarray = \str_repeat("\0", 64); for ($i = 0; $i < 5; ++$i) { $pwarray[$i] = $valContext[$i]; } - $pwarray[5] = chr($block & 0xff); - $pwarray[6] = chr(($block >> 8) & 0xff); - $pwarray[7] = chr(($block >> 16) & 0xff); - $pwarray[8] = chr(($block >> 24) & 0xff); + $pwarray[5] = \chr($block & 0xff); + $pwarray[6] = \chr(($block >> 8) & 0xff); + $pwarray[7] = \chr(($block >> 16) & 0xff); + $pwarray[8] = \chr(($block >> 24) & 0xff); $pwarray[9] = "\x80"; $pwarray[56] = "\x48"; @@ -1909,16 +1909,16 @@ class Xls extends BaseReader */ private function verifyPassword($password, $docid, $salt_data, $hashedsalt_data, &$valContext) { - $pwarray = str_repeat("\0", 64); + $pwarray = \str_repeat("\0", 64); - $iMax = strlen($password); + $iMax = \strlen($password); for ($i = 0; $i < $iMax; ++$i) { - $o = ord(substr($password, $i, 1)); - $pwarray[2 * $i] = chr($o & 0xff); - $pwarray[2 * $i + 1] = chr(($o >> 8) & 0xff); + $o = \ord(\substr($password, $i, 1)); + $pwarray[2 * $i] = \chr($o & 0xff); + $pwarray[2 * $i + 1] = \chr(($o >> 8) & 0xff); } - $pwarray[2 * $i] = chr(0x80); - $pwarray[56] = chr(($i << 4) & 0xff); + $pwarray[2 * $i] = \chr(0x80); + $pwarray[56] = \chr(($i << 4) & 0xff); $md5 = new Xls\MD5(); $md5->add($pwarray); @@ -1972,7 +1972,7 @@ class Xls extends BaseReader $salt = $key->RC4($salt_data); $hashedsalt = $key->RC4($hashedsalt_data); - $salt .= "\x80" . str_repeat("\0", 47); + $salt .= "\x80" . \str_repeat("\0", 47); $salt[56] = "\x80"; $md5->reset(); @@ -2027,7 +2027,7 @@ class Xls extends BaseReader // offset: 0; size: 2; 0 = base 1900, 1 = base 1904 Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900); - if (ord($recordData[0]) == 1) { + if (\ord($recordData[0]) == 1) { Date::setExcelCalendar(Date::CALENDAR_MAC_1904); } } @@ -2083,7 +2083,7 @@ class Xls extends BaseReader CellFont::escapement($objFont, $escapement); // offset: 10; size: 1; underline type - $underlineType = ord($recordData[10]); + $underlineType = \ord($recordData[10]); CellFont::underline($objFont, $underlineType); // offset: 11; size: 1; font family @@ -2091,9 +2091,9 @@ class Xls extends BaseReader // offset: 13; size: 1; not used // offset: 14; size: var; font name if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringShort(substr($recordData, 14)); + $string = self::readUnicodeStringShort(\substr($recordData, 14)); } else { - $string = $this->readByteStringShort(substr($recordData, 14)); + $string = $this->readByteStringShort(\substr($recordData, 14)); } $objFont->setName($string['value']); @@ -2127,10 +2127,10 @@ class Xls extends BaseReader $indexCode = self::getUInt2d($recordData, 0); if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong(substr($recordData, 2)); + $string = self::readUnicodeStringLong(\substr($recordData, 2)); } else { // BIFF7 - $string = $this->readByteStringShort(substr($recordData, 2)); + $string = $this->readByteStringShort(\substr($recordData, 2)); } $formatString = $string['value']; @@ -2207,20 +2207,20 @@ class Xls extends BaseReader // offset: 6; size: 1; Alignment and text break // bit 2-0, mask 0x07; horizontal alignment - $horAlign = (0x07 & ord($recordData[6])) >> 0; + $horAlign = (0x07 & \ord($recordData[6])) >> 0; Xls\Style\CellAlignment::horizontal($objStyle->getAlignment(), $horAlign); // bit 3, mask 0x08; wrap text - $wrapText = (0x08 & ord($recordData[6])) >> 3; + $wrapText = (0x08 & \ord($recordData[6])) >> 3; Xls\Style\CellAlignment::wrap($objStyle->getAlignment(), $wrapText); // bit 6-4, mask 0x70; vertical alignment - $vertAlign = (0x70 & ord($recordData[6])) >> 4; + $vertAlign = (0x70 & \ord($recordData[6])) >> 4; Xls\Style\CellAlignment::vertical($objStyle->getAlignment(), $vertAlign); if ($this->version == self::XLS_BIFF8) { // offset: 7; size: 1; XF_ROTATION: Text rotation angle - $angle = ord($recordData[7]); + $angle = \ord($recordData[7]); $rotation = 0; if ($angle <= 90) { $rotation = $angle; @@ -2233,11 +2233,11 @@ class Xls extends BaseReader // offset: 8; size: 1; Indentation, shrink to cell size, and text direction // bit: 3-0; mask: 0x0F; indent level - $indent = (0x0F & ord($recordData[8])) >> 0; + $indent = (0x0F & \ord($recordData[8])) >> 0; $objStyle->getAlignment()->setIndent($indent); // bit: 4; mask: 0x10; 1 = shrink content to fit into cell - $shrinkToFit = (0x10 & ord($recordData[8])) >> 4; + $shrinkToFit = (0x10 & \ord($recordData[8])) >> 4; switch ($shrinkToFit) { case 0: $objStyle->getAlignment()->setShrinkToFit(false); @@ -2321,7 +2321,7 @@ class Xls extends BaseReader // BIFF5 // offset: 7; size: 1; Text orientation and flags - $orientationAndFlags = ord($recordData[7]); + $orientationAndFlags = \ord($recordData[7]); // bit: 1-0; mask: 0x03; XF_ORIENTATION: Text orientation $xfOrientation = (0x03 & $orientationAndFlags) >> 0; @@ -2394,7 +2394,7 @@ class Xls extends BaseReader } else { // we read all cell XF records $this->spreadsheet->addCellXf($objStyle); - $this->mapCellXfIndex[$this->xfIndex] = count($this->spreadsheet->getCellXfCollection()) - 1; + $this->mapCellXfIndex[$this->xfIndex] = \count($this->spreadsheet->getCellXfCollection()) - 1; } // update XF index for when we read next record @@ -2437,15 +2437,15 @@ class Xls extends BaseReader $cb = self::getUInt2d($recordData, $offset + 2); // extension data - $extData = substr($recordData, $offset + 4, $cb); + $extData = \substr($recordData, $offset + 4, $cb); switch ($extType) { case 4: // fill start color $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2458,10 +2458,10 @@ class Xls extends BaseReader break; case 5: // fill end color $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2474,10 +2474,10 @@ class Xls extends BaseReader break; case 7: // border color top $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2490,10 +2490,10 @@ class Xls extends BaseReader break; case 8: // border color bottom $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2506,10 +2506,10 @@ class Xls extends BaseReader break; case 9: // border color left $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2522,10 +2522,10 @@ class Xls extends BaseReader break; case 10: // border color right $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2538,10 +2538,10 @@ class Xls extends BaseReader break; case 11: // border color diagonal $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2554,10 +2554,10 @@ class Xls extends BaseReader break; case 13: // font color $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + $xclrValue = \substr($extData, 4, 4); // color value (value based on color type) if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); + $rgb = \sprintf('%02X%02X%02X', \ord($xclrValue[0]), \ord($xclrValue[1]), \ord($xclrValue[2])); // modify the relevant style property if (isset($this->mapCellXfIndex[$ixfe])) { @@ -2598,7 +2598,7 @@ class Xls extends BaseReader if ($isBuiltIn) { // offset: 2; size: 1; identifier for built-in style - $builtInId = ord($recordData[2]); + $builtInId = \ord($recordData[2]); switch ($builtInId) { case 0x00: @@ -2629,7 +2629,7 @@ class Xls extends BaseReader // list of RGB colors for ($i = 0; $i < $nm; ++$i) { - $rgb = substr($recordData, 2 + 4 * $i, 4); + $rgb = \substr($recordData, 2 + 4 * $i, 4); $this->palette[] = self::readRGB($rgb); } } @@ -2660,7 +2660,7 @@ class Xls extends BaseReader $this->pos += 4 + $length; // offset: 4; size: 1; sheet state - switch (ord($recordData[4])) { + switch (\ord($recordData[4])) { case 0x00: $sheetState = Worksheet::SHEETSTATE_VISIBLE; @@ -2680,15 +2680,15 @@ class Xls extends BaseReader } // offset: 5; size: 1; sheet type - $sheetType = ord($recordData[5]); + $sheetType = \ord($recordData[5]); // offset: 6; size: var; sheet name $rec_name = null; if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringShort(substr($recordData, 6)); + $string = self::readUnicodeStringShort(\substr($recordData, 6)); $rec_name = $string['value']; } elseif ($this->version == self::XLS_BIFF7) { - $string = $this->readByteStringShort(substr($recordData, 6)); + $string = $this->readByteStringShort(\substr($recordData, 6)); $rec_name = $string['value']; } @@ -2715,20 +2715,20 @@ class Xls extends BaseReader $offset = 0; // there are 4 types of records - if (strlen($recordData) > 4) { + if (\strlen($recordData) > 4) { // external reference // offset: 0; size: 2; number of sheet names ($nm) $nm = self::getUInt2d($recordData, 0); $offset += 2; // offset: 2; size: var; encoded URL without sheet name (Unicode string, 16-bit length) - $encodedUrlString = self::readUnicodeStringLong(substr($recordData, 2)); + $encodedUrlString = self::readUnicodeStringLong(\substr($recordData, 2)); $offset += $encodedUrlString['size']; // offset: var; size: var; list of $nm sheet names (Unicode strings, 16-bit length) $externalSheetNames = []; for ($i = 0; $i < $nm; ++$i) { - $externalSheetNameString = self::readUnicodeStringLong(substr($recordData, $offset)); + $externalSheetNameString = self::readUnicodeStringLong(\substr($recordData, $offset)); $externalSheetNames[] = $externalSheetNameString['value']; $offset += $externalSheetNameString['size']; } @@ -2739,20 +2739,20 @@ class Xls extends BaseReader 'encodedUrl' => $encodedUrlString['value'], 'externalSheetNames' => $externalSheetNames, ]; - } elseif (substr($recordData, 2, 2) == pack('CC', 0x01, 0x04)) { + } elseif (\substr($recordData, 2, 2) == \pack('CC', 0x01, 0x04)) { // internal reference // offset: 0; size: 2; number of sheet in this document // offset: 2; size: 2; 0x01 0x04 $this->externalBooks[] = [ 'type' => 'internal', ]; - } elseif (substr($recordData, 0, 4) == pack('vCC', 0x0001, 0x01, 0x3A)) { + } elseif (\substr($recordData, 0, 4) == \pack('vCC', 0x0001, 0x01, 0x3A)) { // add-in function // offset: 0; size: 2; 0x0001 $this->externalBooks[] = [ 'type' => 'addInFunction', ]; - } elseif (substr($recordData, 0, 2) == pack('v', 0x0000)) { + } elseif (\substr($recordData, 0, 2) == \pack('v', 0x0000)) { // DDE links, OLE links // offset: 0; size: 2; 0x0000 // offset: 2; size: var; encoded source document name @@ -2783,11 +2783,11 @@ class Xls extends BaseReader // offset: 4; size: 2; not used // offset: 6; size: var - $nameString = self::readUnicodeStringShort(substr($recordData, 6)); + $nameString = self::readUnicodeStringShort(\substr($recordData, 6)); // offset: var; size: var; formula data $offset = 6 + $nameString['size']; - $formula = $this->getFormulaFromStructure(substr($recordData, $offset)); + $formula = $this->getFormulaFromStructure(\substr($recordData, $offset)); $this->externalNames[] = [ 'name' => $nameString['value'], @@ -2855,7 +2855,7 @@ class Xls extends BaseReader // offset: 2; size: 1; keyboard shortcut // offset: 3; size: 1; length of the name (character count) - $nlen = ord($recordData[3]); + $nlen = \ord($recordData[3]); // offset: 4; size: 2; size of the formula data (it can happen that this is zero) // note: there can also be additional data, this is not included in $flen @@ -2865,11 +2865,11 @@ class Xls extends BaseReader $scope = self::getUInt2d($recordData, 8); // offset: 14; size: var; Name (Unicode string without length field) - $string = self::readUnicodeString(substr($recordData, 14), $nlen); + $string = self::readUnicodeString(\substr($recordData, 14), $nlen); // offset: var; size: $flen; formula data $offset = 14 + $string['size']; - $formulaStructure = pack('v', $flen) . substr($recordData, $offset); + $formulaStructure = \pack('v', $flen) . \substr($recordData, $offset); try { $formula = $this->getFormulaFromStructure($formulaStructure); @@ -2948,7 +2948,7 @@ class Xls extends BaseReader $pos += 2; // option flags - $optionFlags = ord($recordData[$pos]); + $optionFlags = \ord($recordData[$pos]); ++$pos; // bit: 0; mask: 0x01; 0 = compressed; 1 = uncompressed @@ -2992,13 +2992,13 @@ class Xls extends BaseReader if ($pos + $len <= $limitpos) { // character array is not split between records - $retstr = substr($recordData, $pos, $len); + $retstr = \substr($recordData, $pos, $len); $pos += $len; } else { // character array is split between records // first part of character array - $retstr = substr($recordData, $pos, $limitpos - $pos); + $retstr = \substr($recordData, $pos, $limitpos - $pos); $bytesRead = $limitpos - $pos; @@ -3020,30 +3020,30 @@ class Xls extends BaseReader // repeated option flags // OpenOffice.org documentation 5.21 - $option = ord($recordData[$pos]); + $option = \ord($recordData[$pos]); ++$pos; if ($isCompressed && ($option == 0)) { // 1st fragment compressed // this fragment compressed - $len = min($charsLeft, $limitpos - $pos); - $retstr .= substr($recordData, $pos, $len); + $len = \min($charsLeft, $limitpos - $pos); + $retstr .= \substr($recordData, $pos, $len); $charsLeft -= $len; $isCompressed = true; } elseif (!$isCompressed && ($option != 0)) { // 1st fragment uncompressed // this fragment uncompressed - $len = min($charsLeft * 2, $limitpos - $pos); - $retstr .= substr($recordData, $pos, $len); + $len = \min($charsLeft * 2, $limitpos - $pos); + $retstr .= \substr($recordData, $pos, $len); $charsLeft -= $len / 2; $isCompressed = false; } elseif (!$isCompressed && ($option == 0)) { // 1st fragment uncompressed // this fragment compressed - $len = min($charsLeft, $limitpos - $pos); + $len = \min($charsLeft, $limitpos - $pos); for ($j = 0; $j < $len; ++$j) { $retstr .= $recordData[$pos + $j] - . chr(0); + . \chr(0); } $charsLeft -= $len; $isCompressed = false; @@ -3051,13 +3051,13 @@ class Xls extends BaseReader // 1st fragment compressed // this fragment uncompressed $newstr = ''; - $jMax = strlen($retstr); + $jMax = \strlen($retstr); for ($j = 0; $j < $jMax; ++$j) { - $newstr .= $retstr[$j] . chr(0); + $newstr .= $retstr[$j] . \chr(0); } $retstr = $newstr; - $len = min($charsLeft * 2, $limitpos - $pos); - $retstr .= substr($recordData, $pos, $len); + $len = \min($charsLeft * 2, $limitpos - $pos); + $retstr .= \substr($recordData, $pos, $len); $charsLeft -= $len / 2; $isCompressed = false; } @@ -3426,11 +3426,11 @@ class Xls extends BaseReader } // offset: 16; size: 8; header margin (IEEE 754 floating-point value) - $marginHeader = self::extractNumber(substr($recordData, 16, 8)); + $marginHeader = self::extractNumber(\substr($recordData, 16, 8)); $this->phpSheet->getPageMargins()->setHeader($marginHeader); // offset: 24; size: 8; footer margin (IEEE 754 floating-point value) - $marginFooter = self::extractNumber(substr($recordData, 24, 8)); + $marginFooter = self::extractNumber(\substr($recordData, 24, 8)); $this->phpSheet->getPageMargins()->setFooter($marginFooter); } } @@ -3517,7 +3517,7 @@ class Xls extends BaseReader if (!$this->readDataOnly) { // offset: 0; size: 2; 16-bit hash value of password - $password = strtoupper(dechex(self::getUInt2d($recordData, 0))); // the hashed password + $password = \strtoupper(\dechex(self::getUInt2d($recordData, 0))); // the hashed password $this->phpSheet->getProtection()->setPassword($password, true); } } @@ -3745,7 +3745,7 @@ class Xls extends BaseReader // then we should treat as rich text $richText = new RichText(); $charPos = 0; - $sstCount = count($this->sst[$index]['fmtRuns']); + $sstCount = \count($this->sst[$index]['fmtRuns']); for ($i = 0; $i <= $sstCount; ++$i) { if (isset($fmtRuns[$i])) { $text = StringHelper::substring($this->sst[$index]['value'], $charPos, $fmtRuns[$i]['charPos'] - $charPos); @@ -3767,21 +3767,21 @@ class Xls extends BaseReader // check the OpenOffice documentation of the FONT record $fontIndex = $fmtRuns[$i - 1]['fontIndex'] - 1; } - if (array_key_exists($fontIndex, $this->objFonts) === false) { - $fontIndex = count($this->objFonts) - 1; + if (\array_key_exists($fontIndex, $this->objFonts) === false) { + $fontIndex = \count($this->objFonts) - 1; } $textRun->setFont(clone $this->objFonts[$fontIndex]); } } } } - if ($this->readEmptyCells || trim($richText->getPlainText()) !== '') { + if ($this->readEmptyCells || \trim($richText->getPlainText()) !== '') { $cell = $this->phpSheet->getCell($columnString . ($row + 1)); $cell->setValueExplicit($richText, DataType::TYPE_STRING); $emptyCell = false; } } else { - if ($this->readEmptyCells || trim($this->sst[$index]['value']) !== '') { + if ($this->readEmptyCells || \trim($this->sst[$index]['value']) !== '') { $cell = $this->phpSheet->getCell($columnString . ($row + 1)); $cell->setValueExplicit($this->sst[$index]['value'], DataType::TYPE_STRING); $emptyCell = false; @@ -3876,7 +3876,7 @@ class Xls extends BaseReader // offset 4; size: 2; index to XF record $xfIndex = self::getUInt2d($recordData, 4); - $numValue = self::extractNumber(substr($recordData, 6, 8)); + $numValue = self::extractNumber(\substr($recordData, 6, 8)); $cell = $this->phpSheet->getCell($columnString . ($row + 1)); if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { @@ -3913,7 +3913,7 @@ class Xls extends BaseReader $columnString = Coordinate::stringFromColumnIndex($column + 1); // offset: 20: size: variable; formula structure - $formulaStructure = substr($recordData, 20); + $formulaStructure = \substr($recordData, 20); // offset: 14: size: 2; option flags, recalculate always, recalculate on open etc. $options = self::getUInt2d($recordData, 14); @@ -3927,7 +3927,7 @@ class Xls extends BaseReader // We can apparently not rely on $isPartOfSharedFormula. Even when $isPartOfSharedFormula = true // the formula data may be ordinary formula data, therefore we need to check // explicitly for the tExp token (0x01) - $isPartOfSharedFormula = $isPartOfSharedFormula && ord($formulaStructure[2]) == 0x01; + $isPartOfSharedFormula = $isPartOfSharedFormula && \ord($formulaStructure[2]) == 0x01; if ($isPartOfSharedFormula) { // part of shared formula which means there will be a formula with a tExp token and nothing else @@ -3950,7 +3950,7 @@ class Xls extends BaseReader $xfIndex = self::getUInt2d($recordData, 4); // offset: 6; size: 8; result of the formula - if ((ord($recordData[6]) == 0) && (ord($recordData[12]) == 255) && (ord($recordData[13]) == 255)) { + if ((\ord($recordData[6]) == 0) && (\ord($recordData[12]) == 255) && (\ord($recordData[13]) == 255)) { // String formula. Result follows in appended STRING record $dataType = DataType::TYPE_STRING; @@ -3963,25 +3963,25 @@ class Xls extends BaseReader // read STRING record $value = $this->readString(); } elseif ( - (ord($recordData[6]) == 1) - && (ord($recordData[12]) == 255) - && (ord($recordData[13]) == 255) + (\ord($recordData[6]) == 1) + && (\ord($recordData[12]) == 255) + && (\ord($recordData[13]) == 255) ) { // Boolean formula. Result is in +2; 0=false, 1=true $dataType = DataType::TYPE_BOOL; - $value = (bool) ord($recordData[8]); + $value = (bool) \ord($recordData[8]); } elseif ( - (ord($recordData[6]) == 2) - && (ord($recordData[12]) == 255) - && (ord($recordData[13]) == 255) + (\ord($recordData[6]) == 2) + && (\ord($recordData[12]) == 255) + && (\ord($recordData[13]) == 255) ) { // Error formula. Error code is in +2 $dataType = DataType::TYPE_ERROR; - $value = Xls\ErrorCode::lookup(ord($recordData[8])); + $value = Xls\ErrorCode::lookup(\ord($recordData[8])); } elseif ( - (ord($recordData[6]) == 3) - && (ord($recordData[12]) == 255) - && (ord($recordData[13]) == 255) + (\ord($recordData[6]) == 3) + && (\ord($recordData[12]) == 255) + && (\ord($recordData[13]) == 255) ) { // Formula result is a null string $dataType = DataType::TYPE_NULL; @@ -3989,7 +3989,7 @@ class Xls extends BaseReader } else { // forumla result is a number, first 14 bytes like _NUMBER record $dataType = DataType::TYPE_NUMERIC; - $value = self::extractNumber(substr($recordData, 6, 8)); + $value = self::extractNumber(\substr($recordData, 6, 8)); } $cell = $this->phpSheet->getCell($columnString . ($row + 1)); @@ -4038,16 +4038,16 @@ class Xls extends BaseReader $this->pos += 4 + $length; // offset: 0, size: 6; cell range address of the area used by the shared formula, not used for anything - $cellRange = substr($recordData, 0, 6); + $cellRange = \substr($recordData, 0, 6); $cellRange = $this->readBIFF5CellRangeAddressFixed($cellRange); // note: even BIFF8 uses BIFF5 syntax // offset: 6, size: 1; not used // offset: 7, size: 1; number of existing FORMULA records for this shared formula - $no = ord($recordData[7]); + $no = \ord($recordData[7]); // offset: 8, size: var; Binary token array of the shared formula - $formula = substr($recordData, 8); + $formula = \substr($recordData, 8); // at this point we only store the shared formula for later use $this->sharedFormulas[$this->baseCell] = $formula; @@ -4108,10 +4108,10 @@ class Xls extends BaseReader $xfIndex = self::getUInt2d($recordData, 4); // offset: 6; size: 1; the boolean value or error value - $boolErr = ord($recordData[6]); + $boolErr = \ord($recordData[6]); // offset: 7; size: 1; 0=boolean; 1=error - $isError = ord($recordData[7]); + $isError = \ord($recordData[7]); $cell = $this->phpSheet->getCell($columnString . ($row + 1)); switch ($isError) { @@ -4212,13 +4212,13 @@ class Xls extends BaseReader // add cell value // todo: what if string is very long? continue record if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong(substr($recordData, 6)); + $string = self::readUnicodeStringLong(\substr($recordData, 6)); $value = $string['value']; } else { - $string = $this->readByteStringLong(substr($recordData, 6)); + $string = $this->readByteStringLong(\substr($recordData, 6)); $value = $string['value']; } - if ($this->readEmptyCells || trim($value) !== '') { + if ($this->readEmptyCells || \trim($value) !== '') { $cell = $this->phpSheet->getCell($columnString . ($row + 1)); $cell->setValueExplicit($value, DataType::TYPE_STRING); @@ -4503,7 +4503,7 @@ class Xls extends BaseReader if (!$this->readDataOnly) { // offset: 0; size: 1; pane identifier - $paneId = ord($recordData[0]); + $paneId = \ord($recordData[0]); // offset: 1; size: 2; index to row of the active cell $r = self::getUInt2d($recordData, 1); @@ -4516,24 +4516,24 @@ class Xls extends BaseReader $index = self::getUInt2d($recordData, 5); // offset: 7; size: var; cell range address list containing all selected cell ranges - $data = substr($recordData, 7); + $data = \substr($recordData, 7); $cellRangeAddressList = $this->readBIFF5CellRangeAddressList($data); // note: also BIFF8 uses BIFF5 syntax $selectedCells = $cellRangeAddressList['cellRangeAddresses'][0]; // first row '1' + last row '16384' indicates that full column is selected (apparently also in BIFF8!) - if (preg_match('/^([A-Z]+1\:[A-Z]+)16384$/', $selectedCells)) { - $selectedCells = (string) preg_replace('/^([A-Z]+1\:[A-Z]+)16384$/', '${1}1048576', $selectedCells); + if (\preg_match('/^([A-Z]+1\:[A-Z]+)16384$/', $selectedCells)) { + $selectedCells = (string) \preg_replace('/^([A-Z]+1\:[A-Z]+)16384$/', '${1}1048576', $selectedCells); } // first row '1' + last row '65536' indicates that full column is selected - if (preg_match('/^([A-Z]+1\:[A-Z]+)65536$/', $selectedCells)) { - $selectedCells = (string) preg_replace('/^([A-Z]+1\:[A-Z]+)65536$/', '${1}1048576', $selectedCells); + if (\preg_match('/^([A-Z]+1\:[A-Z]+)65536$/', $selectedCells)) { + $selectedCells = (string) \preg_replace('/^([A-Z]+1\:[A-Z]+)65536$/', '${1}1048576', $selectedCells); } // first column 'A' + last column 'IV' indicates that full row is selected - if (preg_match('/^(A\d+\:)IV(\d+)$/', $selectedCells)) { - $selectedCells = (string) preg_replace('/^(A\d+\:)IV(\d+)$/', '${1}XFD${2}', $selectedCells); + if (\preg_match('/^(A\d+\:)IV(\d+)$/', $selectedCells)) { + $selectedCells = (string) \preg_replace('/^(A\d+\:)IV(\d+)$/', '${1}XFD${2}', $selectedCells); } $this->phpSheet->setSelectedCells($selectedCells); @@ -4582,7 +4582,7 @@ class Xls extends BaseReader $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($recordData); foreach ($cellRangeAddressList['cellRangeAddresses'] as $cellRangeAddress) { if ( - (strpos($cellRangeAddress, ':') !== false) && + (\strpos($cellRangeAddress, ':') !== false) && ($this->includeCellRangeFiltered($cellRangeAddress)) ) { $this->phpSheet->mergeCells($cellRangeAddress, Worksheet::MERGE_CELL_CONTENT_HIDE); @@ -4640,7 +4640,7 @@ class Xls extends BaseReader // offset: 32; size: var; character count of description text $dl = self::getInt4d($recordData, 32); // offset: 36; size: var; character array of description text, no Unicode string header, always 16-bit characters, zero terminated - $desc = self::encodeUTF16(substr($recordData, 36, 2 * ($dl - 1)), false); + $desc = self::encodeUTF16(\substr($recordData, 36, 2 * ($dl - 1)), false); $offset += 4 + 2 * $dl; } if ($hasFrame) { @@ -4655,9 +4655,9 @@ class Xls extends BaseReader $hyperlinkType = 'UNC'; } elseif (!$isFileLinkOrUrl) { $hyperlinkType = 'workbook'; - } elseif (ord($recordData[$offset]) == 0x03) { + } elseif (\ord($recordData[$offset]) == 0x03) { $hyperlinkType = 'local'; - } elseif (ord($recordData[$offset]) == 0xE0) { + } elseif (\ord($recordData[$offset]) == 0xE0) { $hyperlinkType = 'URL'; } @@ -4672,10 +4672,10 @@ class Xls extends BaseReader $us = self::getInt4d($recordData, $offset); $offset += 4; // offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated - $url = self::encodeUTF16(substr($recordData, $offset, $us - 2), false); - $nullOffset = strpos($url, chr(0x00)); + $url = self::encodeUTF16(\substr($recordData, $offset, $us - 2), false); + $nullOffset = \strpos($url, \chr(0x00)); if ($nullOffset) { - $url = substr($url, 0, $nullOffset); + $url = \substr($url, 0, $nullOffset); } $url .= $hasText ? '#' : ''; $offset += $us; @@ -4699,9 +4699,9 @@ class Xls extends BaseReader $offset += 4; // offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string) - $shortenedFilePath = substr($recordData, $offset, $sl); + $shortenedFilePath = \substr($recordData, $offset, $sl); $shortenedFilePath = self::encodeUTF16($shortenedFilePath, true); - $shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero + $shortenedFilePath = \substr($shortenedFilePath, 0, -1); // remove trailing zero $offset += $sl; @@ -4723,13 +4723,13 @@ class Xls extends BaseReader $offset += 2; // offset: var; size $xl; character array of the extended file path and name. - $extendedFilePath = substr($recordData, $offset, $xl); + $extendedFilePath = \substr($recordData, $offset, $xl); $extendedFilePath = self::encodeUTF16($extendedFilePath, false); $offset += $xl; } // construct the path - $url = str_repeat('..\\', $upLevelCount); + $url = \str_repeat('..\\', $upLevelCount); $url .= ($sz > 0) ? $extendedFilePath : $shortenedFilePath; // use extended path if available $url .= $hasText ? '#' : ''; @@ -4753,7 +4753,7 @@ class Xls extends BaseReader $tl = self::getInt4d($recordData, $offset); $offset += 4; // offset: var; size: var; character array of the text mark without the # sign, no Unicode header, always 16-bit characters, zero-terminated - $text = self::encodeUTF16(substr($recordData, $offset, 2 * ($tl - 1)), false); + $text = self::encodeUTF16(\substr($recordData, $offset, 2 * ($tl - 1)), false); $url .= $text; } @@ -4828,23 +4828,23 @@ class Xls extends BaseReader // offset: 4; size: var; title of the prompt box $offset = 4; - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $promptTitle = $string['value'] !== chr(0) ? $string['value'] : ''; + $string = self::readUnicodeStringLong(\substr($recordData, $offset)); + $promptTitle = $string['value'] !== \chr(0) ? $string['value'] : ''; $offset += $string['size']; // offset: var; size: var; title of the error box - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $errorTitle = $string['value'] !== chr(0) ? $string['value'] : ''; + $string = self::readUnicodeStringLong(\substr($recordData, $offset)); + $errorTitle = $string['value'] !== \chr(0) ? $string['value'] : ''; $offset += $string['size']; // offset: var; size: var; text of the prompt box - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $prompt = $string['value'] !== chr(0) ? $string['value'] : ''; + $string = self::readUnicodeStringLong(\substr($recordData, $offset)); + $prompt = $string['value'] !== \chr(0) ? $string['value'] : ''; $offset += $string['size']; // offset: var; size: var; text of the error box - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $error = $string['value'] !== chr(0) ? $string['value'] : ''; + $string = self::readUnicodeStringLong(\substr($recordData, $offset)); + $error = $string['value'] !== \chr(0) ? $string['value'] : ''; $offset += $string['size']; // offset: var; size: 2; size of the formula data for the first condition @@ -4855,15 +4855,15 @@ class Xls extends BaseReader $offset += 2; // offset: var; size: $sz1; formula data for first condition (without size field) - $formula1 = substr($recordData, $offset, $sz1); - $formula1 = pack('v', $sz1) . $formula1; // prepend the length + $formula1 = \substr($recordData, $offset, $sz1); + $formula1 = \pack('v', $sz1) . $formula1; // prepend the length try { $formula1 = $this->getFormulaFromStructure($formula1); // in list type validity, null characters are used as item separators if ($type == DataValidation::TYPE_LIST) { - $formula1 = str_replace(chr(0), ',', $formula1); + $formula1 = \str_replace(\chr(0), ',', $formula1); } } catch (PhpSpreadsheetException $e) { return; @@ -4878,8 +4878,8 @@ class Xls extends BaseReader $offset += 2; // offset: var; size: $sz2; formula data for second condition (without size field) - $formula2 = substr($recordData, $offset, $sz2); - $formula2 = pack('v', $sz2) . $formula2; // prepend the length + $formula2 = \substr($recordData, $offset, $sz2); + $formula2 = \pack('v', $sz2) . $formula2; // prepend the length try { $formula2 = $this->getFormulaFromStructure($formula2); @@ -4889,7 +4889,7 @@ class Xls extends BaseReader $offset += $sz2; // offset: var; size: var; cell range address list with - $cellRangeAddressList = $this->readBIFF8CellRangeAddressList(substr($recordData, $offset)); + $cellRangeAddressList = $this->readBIFF8CellRangeAddressList(\substr($recordData, $offset)); $cellRangeAddresses = $cellRangeAddressList['cellRangeAddresses']; foreach ($cellRangeAddresses as $cellRange) { @@ -5092,7 +5092,7 @@ class Xls extends BaseReader $cellRanges = []; for ($i = 0; $i < $cref; ++$i) { try { - $cellRange = $this->readBIFF8CellRangeAddressFixed(substr($recordData, 27 + 8 * $i, 8)); + $cellRange = $this->readBIFF8CellRangeAddressFixed(\substr($recordData, 27 + 8 * $i, 8)); } catch (PhpSpreadsheetException $e) { return; } @@ -5101,7 +5101,7 @@ class Xls extends BaseReader } // offset: var; size: var; variable length of feature specific data - $rgbFeat = substr($recordData, $offset); + $rgbFeat = \substr($recordData, $offset); $offset += 4; // offset: var; size: 4; the encrypted password (only 16-bit although field is 32-bit) @@ -5110,7 +5110,7 @@ class Xls extends BaseReader // Apply range protection to sheet if ($cellRanges) { - $this->phpSheet->protectCells(implode(' ', $cellRanges), strtoupper(dechex($wPassword)), true); + $this->phpSheet->protectCells(\implode(' ', $cellRanges), \strtoupper(\dechex($wPassword)), true); } } } @@ -5151,7 +5151,7 @@ class Xls extends BaseReader $validSplitPoints = [0xF003, 0xF004, 0xF00D]; // add identifiers if we find more $splitPoint = self::getUInt2d($recordData, 2); - if (in_array($splitPoint, $validSplitPoints)) { + if (\in_array($splitPoint, $validSplitPoints)) { // get spliced record data (and move pointer to next record) $splicedRecordData = $this->getSplicedRecordData(); $this->drawingData .= $splicedRecordData['recordData']; @@ -5214,11 +5214,11 @@ class Xls extends BaseReader $sz = self::getUInt2d($formulaStructure, 0); // offset: 2; size: sz - $formulaData = substr($formulaStructure, 2, $sz); + $formulaData = \substr($formulaStructure, 2, $sz); // offset: 2 + sz; size: variable (optional) - if (strlen($formulaStructure) > 2 + $sz) { - $additionalData = substr($formulaStructure, 2 + $sz); + if (\strlen($formulaStructure) > 2 + $sz) { + $additionalData = \substr($formulaStructure, 2 + $sz); } else { $additionalData = ''; } @@ -5240,9 +5240,9 @@ class Xls extends BaseReader // start parsing the formula data $tokens = []; - while (strlen($formulaData) > 0 && $token = $this->getNextToken($formulaData, $baseCell)) { + while (\strlen($formulaData) > 0 && $token = $this->getNextToken($formulaData, $baseCell)) { $tokens[] = $token; - $formulaData = substr($formulaData, $token['size']); + $formulaData = \substr($formulaData, $token['size']); } $formulaString = $this->createFormulaFromTokens($tokens, $additionalData); @@ -5291,21 +5291,21 @@ class Xls extends BaseReader case 'tPower': // power case 'tRange': // range case 'tSub': // subtraction - $op2 = array_pop($formulaStrings); - $op1 = array_pop($formulaStrings); + $op2 = \array_pop($formulaStrings); + $op1 = \array_pop($formulaStrings); $formulaStrings[] = "$op1$space1$space0{$token['data']}$op2"; unset($space0, $space1); break; case 'tUplus': // unary plus case 'tUminus': // unary minus - $op = array_pop($formulaStrings); + $op = \array_pop($formulaStrings); $formulaStrings[] = "$space1$space0{$token['data']}$op"; unset($space0, $space1); break; case 'tPercent': // percent sign - $op = array_pop($formulaStrings); + $op = \array_pop($formulaStrings); $formulaStrings[] = "$op$space1$space0{$token['data']}"; unset($space0, $space1); @@ -5321,34 +5321,34 @@ class Xls extends BaseReader // space will be used when next token arrives, do not alter formulaString stack switch ($token['data']['spacetype']) { case 'type0': - $space0 = str_repeat(' ', $token['data']['spacecount']); + $space0 = \str_repeat(' ', $token['data']['spacecount']); break; case 'type1': - $space1 = str_repeat("\n", $token['data']['spacecount']); + $space1 = \str_repeat("\n", $token['data']['spacecount']); break; case 'type2': - $space2 = str_repeat(' ', $token['data']['spacecount']); + $space2 = \str_repeat(' ', $token['data']['spacecount']); break; case 'type3': - $space3 = str_repeat("\n", $token['data']['spacecount']); + $space3 = \str_repeat("\n", $token['data']['spacecount']); break; case 'type4': - $space4 = str_repeat(' ', $token['data']['spacecount']); + $space4 = \str_repeat(' ', $token['data']['spacecount']); break; case 'type5': - $space5 = str_repeat("\n", $token['data']['spacecount']); + $space5 = \str_repeat("\n", $token['data']['spacecount']); break; } break; case 'tAttrSum': // SUM function with one parameter - $op = array_pop($formulaStrings); + $op = \array_pop($formulaStrings); $formulaStrings[] = "{$space1}{$space0}SUM($op)"; unset($space0, $space1); @@ -5359,26 +5359,26 @@ class Xls extends BaseReader // normal function $ops = []; // array of operators for ($i = 0; $i < $token['data']['args']; ++$i) { - $ops[] = array_pop($formulaStrings); + $ops[] = \array_pop($formulaStrings); } - $ops = array_reverse($ops); - $formulaStrings[] = "$space1$space0{$token['data']['function']}(" . implode(',', $ops) . ')'; + $ops = \array_reverse($ops); + $formulaStrings[] = "$space1$space0{$token['data']['function']}(" . \implode(',', $ops) . ')'; unset($space0, $space1); } else { // add-in function $ops = []; // array of operators for ($i = 0; $i < $token['data']['args'] - 1; ++$i) { - $ops[] = array_pop($formulaStrings); + $ops[] = \array_pop($formulaStrings); } - $ops = array_reverse($ops); - $function = array_pop($formulaStrings); - $formulaStrings[] = "$space1$space0$function(" . implode(',', $ops) . ')'; + $ops = \array_reverse($ops); + $function = \array_pop($formulaStrings); + $formulaStrings[] = "$space1$space0$function(" . \implode(',', $ops) . ')'; unset($space0, $space1); } break; case 'tParen': // parenthesis - $expression = array_pop($formulaStrings); + $expression = \array_pop($formulaStrings); $formulaStrings[] = "$space3$space2($expression$space5$space4)"; unset($space2, $space3, $space4, $space5); @@ -5386,14 +5386,14 @@ class Xls extends BaseReader case 'tArray': // array constant $constantArray = self::readBIFF8ConstantArray($additionalData); $formulaStrings[] = $space1 . $space0 . $constantArray['value']; - $additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data + $additionalData = \substr($additionalData, $constantArray['size']); // bite of chunk of additional data unset($space0, $space1); break; case 'tMemArea': // bite off chunk of additional data $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($additionalData); - $additionalData = substr($additionalData, $cellRangeAddressList['size']); + $additionalData = \substr($additionalData, $cellRangeAddressList['size']); $formulaStrings[] = "$space1$space0{$token['data']}"; unset($space0, $space1); @@ -5436,7 +5436,7 @@ class Xls extends BaseReader private function getNextToken($formulaData, $baseCell = 'A1') { // offset: 0; size: 1; token id - $id = ord($formulaData[0]); // token id + $id = \ord($formulaData[0]); // token id $name = false; // initialize token name switch ($id) { @@ -5563,14 +5563,14 @@ class Xls extends BaseReader case 0x17: // string $name = 'tStr'; // offset: 1; size: var; Unicode string, 8-bit string length - $string = self::readUnicodeStringShort(substr($formulaData, 1)); + $string = self::readUnicodeStringShort(\substr($formulaData, 1)); $size = 1 + $string['size']; $data = self::UTF8toExcelDoubleQuoted($string['value']); break; case 0x19: // Special attribute // offset: 1; size: 1; attribute type flags: - switch (ord($formulaData[1])) { + switch (\ord($formulaData[1])) { case 0x01: $name = 'tAttrVolatile'; $size = 4; @@ -5610,7 +5610,7 @@ class Xls extends BaseReader $name = 'tAttrSpace'; $size = 4; // offset: 2; size: 2; space type and position - switch (ord($formulaData[2])) { + switch (\ord($formulaData[2])) { case 0x00: $spacetype = 'type0'; @@ -5641,7 +5641,7 @@ class Xls extends BaseReader break; } // offset: 3; size: 1; number of inserted spaces/carriage returns - $spacecount = ord($formulaData[3]); + $spacecount = \ord($formulaData[3]); $data = ['spacetype' => $spacetype, 'spacecount' => $spacecount]; @@ -5657,14 +5657,14 @@ class Xls extends BaseReader // offset: 1; size: 1; error code $name = 'tErr'; $size = 2; - $data = Xls\ErrorCode::lookup(ord($formulaData[1])); + $data = Xls\ErrorCode::lookup(\ord($formulaData[1])); break; case 0x1D: // boolean // offset: 1; size: 1; 0 = false, 1 = true; $name = 'tBool'; $size = 2; - $data = ord($formulaData[1]) ? 'TRUE' : 'FALSE'; + $data = \ord($formulaData[1]) ? 'TRUE' : 'FALSE'; break; case 0x1E: // integer @@ -5678,8 +5678,8 @@ class Xls extends BaseReader // offset: 1; size: 8; $name = 'tNum'; $size = 9; - $data = self::extractNumber(substr($formulaData, 1)); - $data = str_replace(',', '.', (string) $data); // in case non-English locale + $data = self::extractNumber(\substr($formulaData, 1)); + $data = \str_replace(',', '.', (string) $data); // in case non-English locale break; case 0x20: // array constant @@ -6512,7 +6512,7 @@ class Xls extends BaseReader $name = 'tFuncV'; $size = 4; // offset: 1; size: 1; number of arguments - $args = ord($formulaData[1]); + $args = \ord($formulaData[1]); // offset: 2: size: 2; index to built-in sheet function $index = self::getUInt2d($formulaData, 2); switch ($index) { @@ -6892,7 +6892,7 @@ class Xls extends BaseReader case 0x64: $name = 'tRef'; $size = 5; - $data = $this->readBIFF8CellAddress(substr($formulaData, 1, 4)); + $data = $this->readBIFF8CellAddress(\substr($formulaData, 1, 4)); break; case 0x25: // cell range reference to cells in the same sheet (2d) @@ -6900,7 +6900,7 @@ class Xls extends BaseReader case 0x65: $name = 'tArea'; $size = 9; - $data = $this->readBIFF8CellRangeAddress(substr($formulaData, 1, 8)); + $data = $this->readBIFF8CellRangeAddress(\substr($formulaData, 1, 8)); break; case 0x26: // Constant reference sub-expression @@ -6911,7 +6911,7 @@ class Xls extends BaseReader // offset: 5; size: 2; size of the following subexpression $subSize = self::getUInt2d($formulaData, 5); $size = 7 + $subSize; - $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize)); + $data = $this->getFormulaFromData(\substr($formulaData, 7, $subSize)); break; case 0x27: // Deleted constant reference sub-expression @@ -6922,7 +6922,7 @@ class Xls extends BaseReader // offset: 5; size: 2; size of the following subexpression $subSize = self::getUInt2d($formulaData, 5); $size = 7 + $subSize; - $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize)); + $data = $this->getFormulaFromData(\substr($formulaData, 7, $subSize)); break; case 0x29: // Variable reference sub-expression @@ -6932,7 +6932,7 @@ class Xls extends BaseReader // offset: 1; size: 2; size of the following sub-expression $subSize = self::getUInt2d($formulaData, 1); $size = 3 + $subSize; - $data = $this->getFormulaFromData(substr($formulaData, 3, $subSize)); + $data = $this->getFormulaFromData(\substr($formulaData, 3, $subSize)); break; case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places @@ -6940,7 +6940,7 @@ class Xls extends BaseReader case 0x6C: $name = 'tRefN'; $size = 5; - $data = $this->readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell); + $data = $this->readBIFF8CellAddressB(\substr($formulaData, 1, 4), $baseCell); break; case 0x2D: // Relative 2d range reference @@ -6948,7 +6948,7 @@ class Xls extends BaseReader case 0x6D: $name = 'tAreaN'; $size = 9; - $data = $this->readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell); + $data = $this->readBIFF8CellRangeAddressB(\substr($formulaData, 1, 8), $baseCell); break; case 0x39: // External name @@ -6973,7 +6973,7 @@ class Xls extends BaseReader // offset: 1; size: 2; index to REF entry $sheetRange = $this->readSheetRangeByRefIndex(self::getUInt2d($formulaData, 1)); // offset: 3; size: 4; cell address - $cellAddress = $this->readBIFF8CellAddress(substr($formulaData, 3, 4)); + $cellAddress = $this->readBIFF8CellAddress(\substr($formulaData, 3, 4)); $data = "$sheetRange!$cellAddress"; } catch (PhpSpreadsheetException $e) { @@ -6992,7 +6992,7 @@ class Xls extends BaseReader // offset: 1; size: 2; index to REF entry $sheetRange = $this->readSheetRangeByRefIndex(self::getUInt2d($formulaData, 1)); // offset: 3; size: 8; cell address - $cellRangeAddress = $this->readBIFF8CellRangeAddress(substr($formulaData, 3, 8)); + $cellRangeAddress = $this->readBIFF8CellRangeAddress(\substr($formulaData, 3, 8)); $data = "$sheetRange!$cellRangeAddress"; } catch (PhpSpreadsheetException $e) { @@ -7003,7 +7003,7 @@ class Xls extends BaseReader break; // Unknown cases // don't know how to deal with default: - throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula'); + throw new Exception('Unrecognized token ' . \sprintf('%02X', $id) . ' in formula'); break; } @@ -7112,10 +7112,10 @@ class Xls extends BaseReader $lr = self::getUInt2d($subData, 2) + 1; // offset: 4; size: 1; index to first column - $fc = ord($subData[4]); + $fc = \ord($subData[4]); // offset: 5; size: 1; index to last column - $lc = ord($subData[5]); + $lc = \ord($subData[5]); // check values if ($fr > $lr || $fc > $lc) { @@ -7330,7 +7330,7 @@ class Xls extends BaseReader $offset = 2; // offset: 2; size: 8 * $nm; list of $nm (fixed) cell range addresses for ($i = 0; $i < $nm; ++$i) { - $cellRangeAddresses[] = $this->readBIFF8CellRangeAddressFixed(substr($subData, $offset, 8)); + $cellRangeAddresses[] = $this->readBIFF8CellRangeAddressFixed(\substr($subData, $offset, 8)); $offset += 8; } @@ -7358,7 +7358,7 @@ class Xls extends BaseReader $offset = 2; // offset: 2; size: 6 * $nm; list of $nm (fixed) cell range addresses for ($i = 0; $i < $nm; ++$i) { - $cellRangeAddresses[] = $this->readBIFF5CellRangeAddressFixed(substr($subData, $offset, 6)); + $cellRangeAddresses[] = $this->readBIFF5CellRangeAddressFixed(\substr($subData, $offset, 6)); $offset += 6; } @@ -7402,13 +7402,13 @@ class Xls extends BaseReader } // escape the single-quotes - $sheetRange = str_replace("'", "''", $sheetRange); + $sheetRange = \str_replace("'", "''", $sheetRange); // if there are special characters, we need to enclose the range in single-quotes // todo: check if we have identified the whole set of special characters // it seems that the following characters are not accepted for sheet names // and we may assume that they are not present: []*/:\? - if (preg_match("/[ !\"@#£$%&{()}<>=+'|^,;-]/u", $sheetRange)) { + if (\preg_match("/[ !\"@#£$%&{()}<>=+'|^,;-]/u", $sheetRange)) { $sheetRange = "'$sheetRange'"; } @@ -7438,12 +7438,12 @@ class Xls extends BaseReader private static function readBIFF8ConstantArray($arrayData) { // offset: 0; size: 1; number of columns decreased by 1 - $nc = ord($arrayData[0]); + $nc = \ord($arrayData[0]); // offset: 1; size: 2; number of rows decreased by 1 $nr = self::getUInt2d($arrayData, 1); $size = 3; // initialize - $arrayData = substr($arrayData, 3); + $arrayData = \substr($arrayData, 3); // offset: 3; size: var; list of ($nc + 1) * ($nr + 1) constant values $matrixChunks = []; @@ -7452,12 +7452,12 @@ class Xls extends BaseReader for ($c = 1; $c <= $nc + 1; ++$c) { $constant = self::readBIFF8Constant($arrayData); $items[] = $constant['value']; - $arrayData = substr($arrayData, $constant['size']); + $arrayData = \substr($arrayData, $constant['size']); $size += $constant['size']; } - $matrixChunks[] = implode(',', $items); // looks like e.g. '1,"hello"' + $matrixChunks[] = \implode(',', $items); // looks like e.g. '1,"hello"' } - $matrix = '{' . implode(';', $matrixChunks) . '}'; + $matrix = '{' . \implode(';', $matrixChunks) . '}'; return [ 'value' => $matrix, @@ -7477,7 +7477,7 @@ class Xls extends BaseReader private static function readBIFF8Constant($valueData) { // offset: 0; size: 1; identifier for type of constant - $identifier = ord($valueData[0]); + $identifier = \ord($valueData[0]); switch ($identifier) { case 0x00: // empty constant (what is this?) @@ -7487,20 +7487,20 @@ class Xls extends BaseReader break; case 0x01: // number // offset: 1; size: 8; IEEE 754 floating-point value - $value = self::extractNumber(substr($valueData, 1, 8)); + $value = self::extractNumber(\substr($valueData, 1, 8)); $size = 9; break; case 0x02: // string value // offset: 1; size: var; Unicode string, 16-bit string length - $string = self::readUnicodeStringLong(substr($valueData, 1)); + $string = self::readUnicodeStringLong(\substr($valueData, 1)); $value = '"' . $string['value'] . '"'; $size = 1 + $string['size']; break; case 0x04: // boolean // offset: 1; size: 1; 0 = FALSE, 1 = TRUE - if (ord($valueData[1])) { + if (\ord($valueData[1])) { $value = 'TRUE'; } else { $value = 'FALSE'; @@ -7510,7 +7510,7 @@ class Xls extends BaseReader break; case 0x10: // error code // offset: 1; size: 1; error code - $value = Xls\ErrorCode::lookup(ord($valueData[1])); + $value = Xls\ErrorCode::lookup(\ord($valueData[1])); $size = 9; break; @@ -7535,16 +7535,16 @@ class Xls extends BaseReader private static function readRGB($rgb) { // offset: 0; size 1; Red component - $r = ord($rgb[0]); + $r = \ord($rgb[0]); // offset: 1; size: 1; Green component - $g = ord($rgb[1]); + $g = \ord($rgb[1]); // offset: 2; size: 1; Blue component - $b = ord($rgb[2]); + $b = \ord($rgb[2]); // HEX notation, e.g. 'FF00FC' - $rgb = sprintf('%02X%02X%02X', $r, $g, $b); + $rgb = \sprintf('%02X%02X%02X', $r, $g, $b); return ['rgb' => $rgb]; } @@ -7560,10 +7560,10 @@ class Xls extends BaseReader private function readByteStringShort($subData) { // offset: 0; size: 1; length of the string (character count) - $ln = ord($subData[0]); + $ln = \ord($subData[0]); // offset: 1: size: var; character array (8-bit characters) - $value = $this->decodeCodepage(substr($subData, 1, $ln)); + $value = $this->decodeCodepage(\substr($subData, 1, $ln)); return [ 'value' => $value, @@ -7585,7 +7585,7 @@ class Xls extends BaseReader $ln = self::getUInt2d($subData, 0); // offset: 2: size: var; character array (8-bit characters) - $value = $this->decodeCodepage(substr($subData, 2)); + $value = $this->decodeCodepage(\substr($subData, 2)); //return $string; return [ @@ -7608,9 +7608,9 @@ class Xls extends BaseReader $value = ''; // offset: 0: size: 1; length of the string (character count) - $characterCount = ord($subData[0]); + $characterCount = \ord($subData[0]); - $string = self::readUnicodeString(substr($subData, 1), $characterCount); + $string = self::readUnicodeString(\substr($subData, 1), $characterCount); // add 1 for the string length ++$string['size']; @@ -7634,7 +7634,7 @@ class Xls extends BaseReader // offset: 0: size: 2; length of the string (character count) $characterCount = self::getUInt2d($subData, 0); - $string = self::readUnicodeString(substr($subData, 2), $characterCount); + $string = self::readUnicodeString(\substr($subData, 2), $characterCount); // add 2 for the string length $string['size'] += 2; @@ -7658,18 +7658,18 @@ class Xls extends BaseReader // offset: 0: size: 1; option flags // bit: 0; mask: 0x01; character compression (0 = compressed 8-bit, 1 = uncompressed 16-bit) - $isCompressed = !((0x01 & ord($subData[0])) >> 0); + $isCompressed = !((0x01 & \ord($subData[0])) >> 0); // bit: 2; mask: 0x04; Asian phonetic settings - $hasAsian = (0x04) & ord($subData[0]) >> 2; + $hasAsian = (0x04) & \ord($subData[0]) >> 2; // bit: 3; mask: 0x08; Rich-Text settings - $hasRichText = (0x08) & ord($subData[0]) >> 3; + $hasRichText = (0x08) & \ord($subData[0]) >> 3; // offset: 1: size: var; character array // this offset assumes richtext and Asian phonetic settings are off which is generally wrong // needs to be fixed - $value = self::encodeUTF16(substr($subData, 1, $isCompressed ? $characterCount : 2 * $characterCount), $isCompressed); + $value = self::encodeUTF16(\substr($subData, 1, $isCompressed ? $characterCount : 2 * $characterCount), $isCompressed); return [ 'value' => $value, @@ -7687,7 +7687,7 @@ class Xls extends BaseReader */ private static function UTF8toExcelDoubleQuoted($value) { - return '"' . str_replace('"', '""', $value) . '"'; + return '"' . \str_replace('"', '""', $value) . '"'; } /** @@ -7778,7 +7778,7 @@ class Xls extends BaseReader private static function uncompressByteString($string) { $uncompressedString = ''; - $strLen = strlen($string); + $strLen = \strlen($string); for ($i = 0; $i < $strLen; ++$i) { $uncompressedString .= $string[$i] . "\0"; } @@ -7808,7 +7808,7 @@ class Xls extends BaseReader */ public static function getUInt2d($data, $pos) { - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8); + return \ord($data[$pos]) | (\ord($data[$pos + 1]) << 8); } /** @@ -7821,7 +7821,7 @@ class Xls extends BaseReader */ public static function getInt2d($data, $pos) { - return unpack('s', $data[$pos] . $data[$pos + 1])[1]; + return \unpack('s', $data[$pos] . $data[$pos + 1])[1]; } /** @@ -7837,15 +7837,15 @@ class Xls extends BaseReader // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 // Changed by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $_or_24 = ord($data[$pos + 3]); + $_or_24 = \ord($data[$pos + 3]); if ($_or_24 >= 128) { // negative number - $_ord_24 = -abs((256 - $_or_24) << 24); + $_ord_24 = -\abs((256 - $_or_24) << 24); } else { $_ord_24 = ($_or_24 & 127) << 24; } - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + return \ord($data[$pos]) | (\ord($data[$pos + 1]) << 8) | (\ord($data[$pos + 2]) << 16) | $_ord_24; } private function parseRichText($is) @@ -7886,8 +7886,8 @@ class Xls extends BaseReader // offset: var; size: var; cell range address list with $cellRangeAddressList = ($this->version == self::XLS_BIFF8) - ? $this->readBIFF8CellRangeAddressList(substr($recordData, 12)) - : $this->readBIFF5CellRangeAddressList(substr($recordData, 12)); + ? $this->readBIFF8CellRangeAddressList(\substr($recordData, 12)) + : $this->readBIFF5CellRangeAddressList(\substr($recordData, 12)); $cellRangeAddresses = $cellRangeAddressList['cellRangeAddresses']; return $cellRangeAddresses; @@ -7941,31 +7941,31 @@ class Xls extends BaseReader $offset = 12; if ($hasFontRecord === true) { - $fontStyle = substr($recordData, $offset, 118); + $fontStyle = \substr($recordData, $offset, 118); $this->getCFFontStyle($fontStyle, $style); $offset += 118; } if ($hasAlignmentRecord === true) { - $alignmentStyle = substr($recordData, $offset, 8); + $alignmentStyle = \substr($recordData, $offset, 8); $this->getCFAlignmentStyle($alignmentStyle, $style); $offset += 8; } if ($hasBorderRecord === true) { - $borderStyle = substr($recordData, $offset, 8); + $borderStyle = \substr($recordData, $offset, 8); $this->getCFBorderStyle($borderStyle, $style); $offset += 8; } if ($hasFillRecord === true) { - $fillStyle = substr($recordData, $offset, 4); + $fillStyle = \substr($recordData, $offset, 4); $this->getCFFillStyle($fillStyle, $style); $offset += 4; } if ($hasProtectionRecord === true) { - $protectionStyle = substr($recordData, $offset, 4); + $protectionStyle = \substr($recordData, $offset, 4); $this->getCFProtectionStyle($protectionStyle, $style); $offset += 2; } @@ -8054,12 +8054,12 @@ class Xls extends BaseReader private function readCFFormula(string $recordData, int $offset, int $size) { try { - $formula = substr($recordData, $offset, $size); - $formula = pack('v', $size) . $formula; // prepend the length + $formula = \substr($recordData, $offset, $size); + $formula = \pack('v', $size) . $formula; // prepend the length $formula = $this->getFormulaFromStructure($formula); - if (is_numeric($formula)) { - return (strpos($formula, '.') !== false) ? (float) $formula : (int) $formula; + if (\is_numeric($formula)) { + return (\strpos($formula, '.') !== false) ? (float) $formula : (int) $formula; } return $formula; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xls/Escher.php b/PhpOffice/PhpSpreadsheet/Reader/Xls/Escher.php index e9c95c8..0befe58 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xls/Escher.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xls/Escher.php @@ -104,7 +104,7 @@ class Escher $this->data = $data; // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); + $this->dataSize = \strlen($this->data); $this->pos = 0; @@ -113,7 +113,7 @@ class Escher // offset: 2; size: 2: Record Type $fbt = Xls::getUInt2d($this->data, $this->pos + 2); $routine = self::WHICH_ROUTINE[$fbt] ?? 'readDefault'; - if (method_exists($this, $routine)) { + if (\method_exists($this, $routine)) { $this->$routine(); } } @@ -148,7 +148,7 @@ class Escher private function readDggContainer(): void { $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -178,7 +178,7 @@ class Escher private function readBstoreContainer(): void { $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -201,7 +201,7 @@ class Escher $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -237,7 +237,7 @@ class Escher //$unused1 = ord($recordData[32]); // offset: 33; size: 1; size of nameData in bytes (including null terminator) - $cbName = ord($recordData[33]); + $cbName = \ord($recordData[33]); // offset: 34; size: 1; unused2 //$unused2 = ord($recordData[34]); @@ -249,7 +249,7 @@ class Escher //$nameData = substr($recordData, 36, $cbName); // offset: 36 + $cbName, size: var; the BLIP data - $blipData = substr($recordData, 36 + $cbName); + $blipData = \substr($recordData, 36 + $cbName); // record is a container, read contents $reader = new self($BSE); @@ -267,7 +267,7 @@ class Escher $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -279,7 +279,7 @@ class Escher $pos += 16; // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 - if (in_array($recInstance, [0x046B, 0x06E3])) { + if (\in_array($recInstance, [0x046B, 0x06E3])) { //$rgbUid2 = substr($recordData, 16, 16); $pos += 16; } @@ -289,7 +289,7 @@ class Escher ++$pos; // offset: var; size: var; the raw image data - $data = substr($recordData, $pos); + $data = \substr($recordData, $pos); $blip = new Blip(); $blip->setData($data); @@ -308,7 +308,7 @@ class Escher $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -330,7 +330,7 @@ class Escher ++$pos; // offset: var; size: var; the raw image data - $data = substr($recordData, $pos); + $data = \substr($recordData, $pos); $blip = new Blip(); $blip->setData($data); @@ -349,7 +349,7 @@ class Escher $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -392,7 +392,7 @@ class Escher private function readDgContainer(): void { $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -424,7 +424,7 @@ class Escher // context is either context DgContainer or SpgrContainer $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -450,7 +450,7 @@ class Escher private function readSpContainer(): void { $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // add spContainer to spgrContainer $spContainer = new SpContainer(); @@ -516,7 +516,7 @@ class Escher private function readClientAnchor(): void { $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); + $recordData = \substr($this->data, $this->pos + 8, $length); // move stream pointer to next record $this->pos += 8 + $length; @@ -558,7 +558,7 @@ class Escher */ private function applyAttribute(string $name, $value): void { - if (method_exists($this->object, $name)) { + if (\method_exists($this->object, $name)) { $this->object->$name($value); } } @@ -583,12 +583,12 @@ class Escher */ private function readOfficeArtRGFOPTE($data, $n): void { - $splicedComplexData = substr($data, 6 * $n); + $splicedComplexData = \substr($data, 6 * $n); // loop through property-value pairs for ($i = 0; $i < $n; ++$i) { // read 6 bytes at a time - $fopte = substr($data, 6 * $i, 6); + $fopte = \substr($data, 6 * $i, 6); // offset: 0; size: 2; opid $opid = Xls::getUInt2d($fopte, 0); @@ -606,8 +606,8 @@ class Escher $op = Xls::getInt4d($fopte, 2); if ($opidFComplex) { - $complexData = substr($splicedComplexData, 0, $op); - $splicedComplexData = substr($splicedComplexData, $op); + $complexData = \substr($splicedComplexData, 0, $op); + $splicedComplexData = \substr($splicedComplexData, $op); // we store string value with complex data $value = $complexData; @@ -616,7 +616,7 @@ class Escher $value = $op; } - if (method_exists($this->object, 'setOPT')) { + if (\method_exists($this->object, 'setOPT')) { $this->object->setOPT($opidOpid, $value); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xls/MD5.php b/PhpOffice/PhpSpreadsheet/Reader/Xls/MD5.php index d376c45..ea61021 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xls/MD5.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xls/MD5.php @@ -59,10 +59,10 @@ class MD5 $s = ''; foreach (['a', 'b', 'c', 'd'] as $i) { $v = $this->{$i}; - $s .= chr($v & 0xff); - $s .= chr(($v >> 8) & 0xff); - $s .= chr(($v >> 16) & 0xff); - $s .= chr(($v >> 24) & 0xff); + $s .= \chr($v & 0xff); + $s .= \chr(($v >> 8) & 0xff); + $s .= \chr(($v >> 16) & 0xff); + $s .= \chr(($v >> 24) & 0xff); } return $s; @@ -76,7 +76,7 @@ class MD5 public function add(string $data): void { // @phpstan-ignore-next-line - $words = array_values(unpack('V16', $data)); + $words = \array_values(\unpack('V16', $data)); $A = $this->a; $B = $this->b; @@ -190,7 +190,7 @@ class MD5 private static function step(callable $func, int &$A, int $B, int $C, int $D, int $M, int $s, $t): void { $t = self::signedInt($t); - $A = (int) ($A + call_user_func($func, $B, $C, $D) + $M + $t) & self::$allOneBits; + $A = (int) ($A + \call_user_func($func, $B, $C, $D) + $M + $t) & self::$allOneBits; $A = self::rotate($A, $s); $A = (int) ($B + $A) & self::$allOneBits; } @@ -198,13 +198,13 @@ class MD5 /** @param float|int $result may be float on 32-bit system */ private static function signedInt($result): int { - return is_int($result) ? $result : (int) (PHP_INT_MIN + $result - 1 - PHP_INT_MAX); + return \is_int($result) ? $result : (int) (PHP_INT_MIN + $result - 1 - PHP_INT_MAX); } private static function rotate(int $decimal, int $bits): int { - $binary = str_pad(decbin($decimal), 32, '0', STR_PAD_LEFT); + $binary = \str_pad(\decbin($decimal), 32, '0', STR_PAD_LEFT); - return self::signedInt(bindec(substr($binary, $bits) . substr($binary, 0, $bits))); + return self::signedInt(\bindec(\substr($binary, $bits) . \substr($binary, 0, $bits))); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xls/RC4.php b/PhpOffice/PhpSpreadsheet/Reader/Xls/RC4.php index b7c7c90..647d3dd 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xls/RC4.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xls/RC4.php @@ -20,7 +20,7 @@ class RC4 */ public function __construct($key) { - $len = strlen($key); + $len = \strlen($key); for ($this->i = 0; $this->i < 256; ++$this->i) { $this->s[$this->i] = $this->i; @@ -28,7 +28,7 @@ class RC4 $this->j = 0; for ($this->i = 0; $this->i < 256; ++$this->i) { - $this->j = ($this->j + $this->s[$this->i] + ord($key[$this->i % $len])) % 256; + $this->j = ($this->j + $this->s[$this->i] + \ord($key[$this->i % $len])) % 256; $t = $this->s[$this->i]; $this->s[$this->i] = $this->s[$this->j]; $this->s[$this->j] = $t; @@ -45,7 +45,7 @@ class RC4 */ public function RC4($data) { - $len = strlen($data); + $len = \strlen($data); for ($c = 0; $c < $len; ++$c) { $this->i = ($this->i + 1) % 256; $this->j = ($this->j + $this->s[$this->i]) % 256; @@ -55,7 +55,7 @@ class RC4 $t = ($this->s[$this->i] + $this->s[$this->j]) % 256; - $data[$c] = chr(ord($data[$c]) ^ $this->s[$t]); + $data[$c] = \chr(\ord($data[$c]) ^ $this->s[$t]); } return $data; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellAlignment.php b/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellAlignment.php index f03d47f..c710d6a 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellAlignment.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellAlignment.php @@ -31,14 +31,14 @@ class CellAlignment public static function horizontal(Alignment $alignment, int $horizontal): void { - if (array_key_exists($horizontal, self::$horizontalAlignmentMap)) { + if (\array_key_exists($horizontal, self::$horizontalAlignmentMap)) { $alignment->setHorizontal(self::$horizontalAlignmentMap[$horizontal]); } } public static function vertical(Alignment $alignment, int $vertical): void { - if (array_key_exists($vertical, self::$verticalAlignmentMap)) { + if (\array_key_exists($vertical, self::$verticalAlignmentMap)) { $alignment->setVertical(self::$verticalAlignmentMap[$vertical]); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellFont.php b/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellFont.php index e975be4..e8182a7 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellFont.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xls/Style/CellFont.php @@ -32,7 +32,7 @@ class CellFont public static function underline(Font $font, int $underline): void { - if (array_key_exists($underline, self::$underlineMap)) { + if (\array_key_exists($underline, self::$underlineMap)) { $font->setUnderline(self::$underlineMap[$underline]); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx.php index 0d769ea..dd5784f 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx.php @@ -54,7 +54,7 @@ class Xlsx extends BaseReader private $referenceHelper; /** - * @var ZipArchive + * @var \ZipArchive */ private $zip; @@ -81,7 +81,7 @@ class Xlsx extends BaseReader } $result = false; - $this->zip = $zip = new ZipArchive(); + $this->zip = $zip = new \ZipArchive(); if ($zip->open($filename) === true) { [$workbookBasename] = $this->getWorkbookBaseName(); @@ -96,12 +96,12 @@ class Xlsx extends BaseReader /** * @param mixed $value */ - public static function testSimpleXml($value): SimpleXMLElement + public static function testSimpleXml($value): \SimpleXMLElement { - return ($value instanceof SimpleXMLElement) ? $value : new SimpleXMLElement(''); + return ($value instanceof \SimpleXMLElement) ? $value : new \SimpleXMLElement(''); } - public static function getAttributes(?SimpleXMLElement $value, string $ns = ''): SimpleXMLElement + public static function getAttributes(?\SimpleXMLElement $value, string $ns = ''): \SimpleXMLElement { return self::testSimpleXml($value === null ? $value : $value->attributes($ns)); } @@ -109,7 +109,7 @@ class Xlsx extends BaseReader // Phpstan thinks, correctly, that xpath can return false. // Scrutinizer thinks it can't. // Sigh. - private static function xpathNoFalse(SimpleXmlElement $sxml, string $path): array + private static function xpathNoFalse(\SimpleXmlElement $sxml, string $path): array { return self::falseToArray($sxml->xpath($path)); } @@ -119,16 +119,16 @@ class Xlsx extends BaseReader */ public static function falseToArray($value): array { - return is_array($value) ? $value : []; + return \is_array($value) ? $value : []; } - private function loadZip(string $filename, string $ns = '', bool $replaceUnclosedBr = false): SimpleXMLElement + private function loadZip(string $filename, string $ns = '', bool $replaceUnclosedBr = false): \SimpleXMLElement { $contents = $this->getFromZipArchive($this->zip, $filename); if ($replaceUnclosedBr) { - $contents = str_replace('
', '
', $contents); + $contents = \str_replace('
', '
', $contents); } - $rels = simplexml_load_string( + $rels = \simplexml_load_string( $this->securityScanner->scan($contents), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions(), @@ -140,10 +140,10 @@ class Xlsx extends BaseReader // This function is just to identify cases where I'm not sure // why empty namespace is required. - private function loadZipNonamespace(string $filename, string $ns): SimpleXMLElement + private function loadZipNonamespace(string $filename, string $ns): \SimpleXMLElement { $contents = $this->getFromZipArchive($this->zip, $filename); - $rels = simplexml_load_string( + $rels = \simplexml_load_string( $this->securityScanner->scan($contents), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions(), @@ -179,7 +179,7 @@ class Xlsx extends BaseReader $worksheetNames = []; - $this->zip = $zip = new ZipArchive(); + $this->zip = $zip = new \ZipArchive(); $zip->open($filename); // The files we're looking at here are small enough that simpleXML is more efficient than XMLReader @@ -218,7 +218,7 @@ class Xlsx extends BaseReader $worksheetInfo = []; - $this->zip = $zip = new ZipArchive(); + $this->zip = $zip = new \ZipArchive(); $zip->open($filename); $rels = $this->loadZip(self::INITIAL_FILE, Namespaces::RELATIONSHIPS); @@ -228,9 +228,9 @@ class Xlsx extends BaseReader $mainNS = self::REL_TO_MAIN[$relType] ?? Namespaces::MAIN; if ($mainNS !== '') { $relTarget = (string) $rel['Target']; - $dir = dirname($relTarget); - $namespace = dirname($relType); - $relsWorkbook = $this->loadZip("$dir/_rels/" . basename($relTarget) . '.rels', ''); + $dir = \dirname($relTarget); + $namespace = \dirname($relType); + $relsWorkbook = $this->loadZip("$dir/_rels/" . \basename($relTarget) . '.rels', ''); $worksheets = []; foreach ($relsWorkbook->Relationship as $elex) { @@ -245,8 +245,8 @@ class Xlsx extends BaseReader $xmlWorkbook = $this->loadZip($relTarget, $mainNS); if ($xmlWorkbook->sheets) { - $dir = dirname($relTarget); - /** @var SimpleXMLElement $eleSheet */ + $dir = \dirname($relTarget); + /** @var \SimpleXMLElement $eleSheet */ foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { $tmpInfo = [ 'worksheetName' => (string) self::getAttributes($eleSheet)['name'], @@ -257,9 +257,9 @@ class Xlsx extends BaseReader ]; $fileWorksheet = (string) $worksheets[(string) self::getArrayItem(self::getAttributes($eleSheet, $namespace), 'id')]; - $fileWorksheetPath = strpos($fileWorksheet, '/') === 0 ? substr($fileWorksheet, 1) : "$dir/$fileWorksheet"; + $fileWorksheetPath = \strpos($fileWorksheet, '/') === 0 ? \substr($fileWorksheet, 1) : "$dir/$fileWorksheet"; - $xml = new XMLReader(); + $xml = new \XMLReader(); $xml->xml( $this->securityScanner->scanFile( 'zip://' . File::realpath($filename) . '#' . $fileWorksheetPath @@ -271,17 +271,17 @@ class Xlsx extends BaseReader $currCells = 0; while ($xml->read()) { - if ($xml->localName == 'row' && $xml->nodeType == XMLReader::ELEMENT && $xml->namespaceURI === $mainNS) { + if ($xml->localName == 'row' && $xml->nodeType == \XMLReader::ELEMENT && $xml->namespaceURI === $mainNS) { $row = $xml->getAttribute('r'); $tmpInfo['totalRows'] = $row; - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $tmpInfo['totalColumns'] = \max($tmpInfo['totalColumns'], $currCells); $currCells = 0; - } elseif ($xml->localName == 'c' && $xml->nodeType == XMLReader::ELEMENT && $xml->namespaceURI === $mainNS) { + } elseif ($xml->localName == 'c' && $xml->nodeType == \XMLReader::ELEMENT && $xml->namespaceURI === $mainNS) { $cell = $xml->getAttribute('r'); - $currCells = $cell ? max($currCells, Coordinate::indexesFromString($cell)[0]) : ($currCells + 1); + $currCells = $cell ? \max($currCells, Coordinate::indexesFromString($cell)[0]) : ($currCells + 1); } } - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $tmpInfo['totalColumns'] = \max($tmpInfo['totalColumns'], $currCells); $xml->close(); $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1; @@ -298,7 +298,7 @@ class Xlsx extends BaseReader return $worksheetInfo; } - private static function castToBoolean(SimpleXMLElement $c): bool + private static function castToBoolean(\SimpleXMLElement $c): bool { $value = isset($c->v) ? (string) $c->v : null; if ($value == '0') { @@ -310,12 +310,12 @@ class Xlsx extends BaseReader return (bool) $c->v; } - private static function castToError(?SimpleXMLElement $c): ?string + private static function castToError(?\SimpleXMLElement $c): ?string { return isset($c, $c->v) ? (string) $c->v : null; } - private static function castToString(?SimpleXMLElement $c): ?string + private static function castToString(?\SimpleXMLElement $c): ?string { return isset($c, $c->v) ? (string) $c->v : null; } @@ -324,7 +324,7 @@ class Xlsx extends BaseReader * @param mixed $value * @param mixed $calculatedValue */ - private function castToFormula(?SimpleXMLElement $c, string $r, string &$cellDataType, &$value, &$calculatedValue, array &$sharedFormulas, string $castBaseType): void + private function castToFormula(?\SimpleXMLElement $c, string $r, string &$cellDataType, &$value, &$calculatedValue, array &$sharedFormulas, string $castBaseType): void { if ($c === null) { return; @@ -335,7 +335,7 @@ class Xlsx extends BaseReader $calculatedValue = self::$castBaseType($c); // Shared formula? - if (isset($attr['t']) && strtolower((string) $attr['t']) == 'shared') { + if (isset($attr['t']) && \strtolower((string) $attr['t']) == 'shared') { $instance = (string) $attr['si']; if (!isset($sharedFormulas[(string) $attr['si']])) { @@ -356,11 +356,11 @@ class Xlsx extends BaseReader /** * @param string $fileName */ - private function fileExistsInArchive(ZipArchive $archive, $fileName = ''): bool + private function fileExistsInArchive(\ZipArchive $archive, $fileName = ''): bool { // Root-relative paths - if (strpos($fileName, '//') !== false) { - $fileName = substr($fileName, strpos($fileName, '//') + 1); + if (\strpos($fileName, '//') !== false) { + $fileName = \substr($fileName, \strpos($fileName, '//') + 1); } $fileName = File::realpath($fileName); @@ -368,9 +368,9 @@ class Xlsx extends BaseReader // so we need to load case-insensitively from the zip file // Apache POI fixes - $contents = $archive->locateName($fileName, ZipArchive::FL_NOCASE); + $contents = $archive->locateName($fileName, \ZipArchive::FL_NOCASE); if ($contents === false) { - $contents = $archive->locateName(substr($fileName, 1), ZipArchive::FL_NOCASE); + $contents = $archive->locateName(\substr($fileName, 1), \ZipArchive::FL_NOCASE); } return $contents !== false; @@ -381,24 +381,24 @@ class Xlsx extends BaseReader * * @return string */ - private function getFromZipArchive(ZipArchive $archive, $fileName = '') + private function getFromZipArchive(\ZipArchive $archive, $fileName = '') { // Root-relative paths - if (strpos($fileName, '//') !== false) { - $fileName = substr($fileName, strpos($fileName, '//') + 1); + if (\strpos($fileName, '//') !== false) { + $fileName = \substr($fileName, \strpos($fileName, '//') + 1); } // Relative paths generated by dirname($filename) when $filename // has no path (i.e.files in root of the zip archive) - $fileName = (string) preg_replace('/^\.\//', '', $fileName); + $fileName = (string) \preg_replace('/^\.\//', '', $fileName); $fileName = File::realpath($fileName); // Sadly, some 3rd party xlsx generators don't use consistent case for filenaming // so we need to load case-insensitively from the zip file // Apache POI fixes - $contents = $archive->getFromName($fileName, 0, ZipArchive::FL_NOCASE); + $contents = $archive->getFromName($fileName, 0, \ZipArchive::FL_NOCASE); if ($contents === false) { - $contents = $archive->getFromName(substr($fileName, 1), 0, ZipArchive::FL_NOCASE); + $contents = $archive->getFromName(\substr($fileName, 1), 0, \ZipArchive::FL_NOCASE); } return ($contents === false) ? '' : $contents; @@ -419,7 +419,7 @@ class Xlsx extends BaseReader $unparsedLoadedData = []; - $this->zip = $zip = new ZipArchive(); + $this->zip = $zip = new \ZipArchive(); $zip->open($filename); // Read the theme first, because we need the colour scheme when reading the styles @@ -432,13 +432,13 @@ class Xlsx extends BaseReader foreach ($wbRels->Relationship as $relx) { $rel = self::getAttributes($relx); $relTarget = (string) $rel['Target']; - if (substr($relTarget, 0, 4) === '/xl/') { - $relTarget = substr($relTarget, 4); + if (\substr($relTarget, 0, 4) === '/xl/') { + $relTarget = \substr($relTarget, 4); } switch ($rel['Type']) { case "$xmlNamespaceBase/theme": $themeOrderArray = ['lt1', 'dk1', 'lt2', 'dk2']; - $themeOrderAdditional = count($themeOrderArray); + $themeOrderAdditional = \count($themeOrderArray); $xmlTheme = $this->loadZip("xl/{$relTarget}", $drawingNS); $xmlThemeName = self::getAttributes($xmlTheme); @@ -451,7 +451,7 @@ class Xlsx extends BaseReader $themeColours = []; foreach ($colourScheme as $k => $xmlColour) { - $themePos = array_search($k, $themeOrderArray); + $themePos = \array_search($k, $themeOrderArray); if ($themePos === false) { $themePos = $themeOrderAdditional++; } @@ -501,10 +501,10 @@ class Xlsx extends BaseReader break; case "$xmlNamespaceBase/officeDocument": - $dir = dirname($relTarget); + $dir = \dirname($relTarget); // Do not specify namespace in next stmt - do it in Xpath - $relsWorkbook = $this->loadZip("$dir/_rels/" . basename($relTarget) . '.rels', ''); + $relsWorkbook = $this->loadZip("$dir/_rels/" . \basename($relTarget) . '.rels', ''); $relsWorkbook->registerXPathNamespace('rel', Namespaces::RELATIONSHIPS); $sharedStrings = []; @@ -707,13 +707,13 @@ class Xlsx extends BaseReader $charts = $chartDetails = []; if ($xmlWorkbookNS->sheets) { - /** @var SimpleXMLElement $eleSheet */ + /** @var \SimpleXMLElement $eleSheet */ foreach ($xmlWorkbookNS->sheets->sheet as $eleSheet) { $eleSheetAttr = self::getAttributes($eleSheet); ++$oldSheetId; // Check if sheet should be skipped - if (is_array($this->loadSheetsOnly) && !in_array((string) $eleSheetAttr['name'], $this->loadSheetsOnly)) { + if (\is_array($this->loadSheetsOnly) && !\in_array((string) $eleSheetAttr['name'], $this->loadSheetsOnly)) { ++$countSkippedSheets; $mapSheetId[$oldSheetId] = null; @@ -902,7 +902,7 @@ class Xlsx extends BaseReader if (!$this->readDataOnly && $xmlSheetNS && $xmlSheetNS->sheetProtection) { $protAttr = $xmlSheetNS->sheetProtection->attributes() ?? []; foreach ($protAttr as $key => $value) { - $method = 'set' . ucfirst($key); + $method = 'set' . \ucfirst($key); $docSheet->getProtection()->$method(self::boolean((string) $value)); } } @@ -921,7 +921,7 @@ class Xlsx extends BaseReader /** @scrutinizer ignore-call */ $mergeCell = $mergeCellx->attributes(); $mergeRef = (string) ($mergeCell['ref'] ?? ''); - if (strpos($mergeRef, ':') !== false) { + if (\strpos($mergeRef, ':') !== false) { $docSheet->mergeCells($mergeRef, Worksheet::MERGE_CELL_CONTENT_HIDE); } } @@ -972,7 +972,7 @@ class Xlsx extends BaseReader if (!$this->readDataOnly) { $hyperlinkReader = new Hyperlinks($docSheet); // Locate hyperlink relations - $relationsFileName = dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels'; + $relationsFileName = \dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels'; if ($zip->locateName($relationsFileName)) { $relsWorksheet = $this->loadZip($relationsFileName, Namespaces::RELATIONSHIPS); $hyperlinkReader->readHyperlinks($relsWorksheet); @@ -989,7 +989,7 @@ class Xlsx extends BaseReader $vmlComments = []; if (!$this->readDataOnly) { // Locate comment relations - $commentRelations = dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels'; + $commentRelations = \dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels'; if ($zip->locateName($commentRelations)) { $relsWorksheet = $this->loadZip($commentRelations, Namespaces::RELATIONSHIPS); foreach ($relsWorksheet->Relationship as $elex) { @@ -1006,7 +1006,7 @@ class Xlsx extends BaseReader // Loop through comments foreach ($comments as $relName => $relPath) { // Load comments file - $relPath = File::realpath(dirname("$dir/$fileWorksheet") . '/' . $relPath); + $relPath = File::realpath(\dirname("$dir/$fileWorksheet") . '/' . $relPath); // okay to ignore namespace - using xpath $commentsFile = $this->loadZip($relPath, ''); @@ -1037,20 +1037,20 @@ class Xlsx extends BaseReader // Loop through VML comments foreach ($vmlComments as $relName => $relPath) { // Load VML comments file - $relPath = File::realpath(dirname("$dir/$fileWorksheet") . '/' . $relPath); + $relPath = File::realpath(\dirname("$dir/$fileWorksheet") . '/' . $relPath); try { // no namespace okay - processed with Xpath $vmlCommentsFile = $this->loadZip($relPath, '', true); $vmlCommentsFile->registerXPathNamespace('v', Namespaces::URN_VML); - } catch (Throwable $ex) { + } catch (\Throwable $ex) { //Ignore unparsable vmlDrawings. Later they will be moved from $unparsedVmlDrawings to $unparsedLoadedData continue; } // Locate VML drawings image relations $drowingImages = []; - $VMLDrawingsRelations = dirname($relPath) . '/_rels/' . basename($relPath) . '.rels'; + $VMLDrawingsRelations = \dirname($relPath) . '/_rels/' . \basename($relPath) . '.rels'; $vmlDrawingContents[$relName] = $this->securityScanner->scan($this->getFromZipArchive($zip, $relPath)); if ($zip->locateName($VMLDrawingsRelations)) { $relsVMLDrawing = $this->loadZip($VMLDrawingsRelations, Namespaces::RELATIONSHIPS); @@ -1068,31 +1068,31 @@ class Xlsx extends BaseReader if (isset($shape['style'])) { $style = (string) $shape['style']; - $fillColor = strtoupper(substr((string) $shape['fillcolor'], 1)); + $fillColor = \strtoupper(\substr((string) $shape['fillcolor'], 1)); $column = null; $row = null; $fillImageRelId = null; $fillImageTitle = ''; $clientData = $shape->xpath('.//x:ClientData'); - if (is_array($clientData) && !empty($clientData)) { + if (\is_array($clientData) && !empty($clientData)) { $clientData = $clientData[0]; if (isset($clientData['ObjectType']) && (string) $clientData['ObjectType'] == 'Note') { $temp = $clientData->xpath('.//x:Row'); - if (is_array($temp)) { + if (\is_array($temp)) { $row = $temp[0]; } $temp = $clientData->xpath('.//x:Column'); - if (is_array($temp)) { + if (\is_array($temp)) { $column = $temp[0]; } } } $fillImageRelNode = $shape->xpath('.//v:fill/@o:relid'); - if (is_array($fillImageRelNode) && !empty($fillImageRelNode)) { + if (\is_array($fillImageRelNode) && !empty($fillImageRelNode)) { $fillImageRelNode = $fillImageRelNode[0]; if (isset($fillImageRelNode['relid'])) { @@ -1101,7 +1101,7 @@ class Xlsx extends BaseReader } $fillImageTitleNode = $shape->xpath('.//v:fill/@o:title'); - if (is_array($fillImageTitleNode) && !empty($fillImageTitleNode)) { + if (\is_array($fillImageTitleNode) && !empty($fillImageTitleNode)) { $fillImageTitleNode = $fillImageTitleNode[0]; if (isset($fillImageTitleNode['title'])) { @@ -1116,7 +1116,7 @@ class Xlsx extends BaseReader if (isset($drowingImages[$fillImageRelId])) { $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); $objDrawing->setName($fillImageTitle); - $imagePath = str_replace('../', 'xl/', $drowingImages[$fillImageRelId]); + $imagePath = \str_replace('../', 'xl/', $drowingImages[$fillImageRelId]); $objDrawing->setPath( 'zip://' . File::realpath($filename) . '#' . $imagePath, true, @@ -1126,9 +1126,9 @@ class Xlsx extends BaseReader } // Parse style - $styleArray = explode(';', str_replace(' ', '', $style)); + $styleArray = \explode(';', \str_replace(' ', '', $style)); foreach ($styleArray as $stylePair) { - $stylePair = explode(':', $stylePair); + $stylePair = \explode(':', $stylePair); if ($stylePair[0] == 'margin-left') { $comment->setMarginLeft($stylePair[1]); @@ -1156,7 +1156,7 @@ class Xlsx extends BaseReader // unparsed vmlDrawing if ($unparsedVmlDrawings) { foreach ($unparsedVmlDrawings as $rId => $relPath) { - $rId = substr($rId, 3); // rIdXXX + $rId = \substr($rId, 3); // rIdXXX $unparsedVmlDrawing = &$unparsedLoadedData['sheets'][$docSheet->getCodeName()]['vmlDrawings']; $unparsedVmlDrawing[$rId] = []; $unparsedVmlDrawing[$rId]['filePath'] = self::dirAdd("$dir/$fileWorksheet", $relPath); @@ -1173,8 +1173,8 @@ class Xlsx extends BaseReader if ($vmlHfRidAttr !== null && isset($vmlHfRidAttr['id'])) { $vmlHfRid = (string) $vmlHfRidAttr['id'][0]; } - if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { - $relsWorksheet = $this->loadZipNoNamespace(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels', Namespaces::RELATIONSHIPS); + if ($zip->locateName(\dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels')) { + $relsWorksheet = $this->loadZipNoNamespace(\dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels', Namespaces::RELATIONSHIPS); $vmlRelationship = ''; foreach ($relsWorksheet->Relationship as $ele) { @@ -1187,7 +1187,7 @@ class Xlsx extends BaseReader if ($vmlRelationship != '') { // Fetch linked images - $relsVML = $this->loadZipNoNamespace(dirname($vmlRelationship) . '/_rels/' . basename($vmlRelationship) . '.rels', Namespaces::RELATIONSHIPS); + $relsVML = $this->loadZipNoNamespace(\dirname($vmlRelationship) . '/_rels/' . \basename($vmlRelationship) . '.rels', Namespaces::RELATIONSHIPS); $drawings = []; if (isset($relsVML->Relationship)) { foreach ($relsVML->Relationship as $ele) { @@ -1216,7 +1216,7 @@ class Xlsx extends BaseReader $imageData = self::getAttributes($imageData, Namespaces::URN_MSOFFICE); $style = self::toCSSArray((string) $shape['style']); - if (array_key_exists((string) $imageData['relid'], $drawings)) { + if (\array_key_exists((string) $imageData['relid'], $drawings)) { $shapeId = (string) $shape['id']; $hfImages[$shapeId] = new HeaderFooterDrawing(); if (isset($imageData['title'])) { @@ -1242,15 +1242,15 @@ class Xlsx extends BaseReader } // TODO: Autoshapes from twoCellAnchors! - $drawingFilename = dirname("$dir/$fileWorksheet") + $drawingFilename = \dirname("$dir/$fileWorksheet") . '/_rels/' - . basename($fileWorksheet) + . \basename($fileWorksheet) . '.rels'; - if (substr($drawingFilename, 0, 7) === 'xl//xl/') { - $drawingFilename = substr($drawingFilename, 4); + if (\substr($drawingFilename, 0, 7) === 'xl//xl/') { + $drawingFilename = \substr($drawingFilename, 4); } - if (substr($drawingFilename, 0, 8) === '/xl//xl/') { - $drawingFilename = substr($drawingFilename, 5); + if (\substr($drawingFilename, 0, 8) === '/xl//xl/') { + $drawingFilename = \substr($drawingFilename, 5); } if ($zip->locateName($drawingFilename)) { $relsWorksheet = $this->loadZipNoNamespace($drawingFilename, Namespaces::RELATIONSHIPS); @@ -1258,8 +1258,8 @@ class Xlsx extends BaseReader foreach ($relsWorksheet->Relationship as $ele) { if ((string) $ele['Type'] === "$xmlNamespaceBase/drawing") { $eleTarget = (string) $ele['Target']; - if (substr($eleTarget, 0, 4) === '/xl/') { - $drawings[(string) $ele['Id']] = substr($eleTarget, 1); + if (\substr($eleTarget, 0, 4) === '/xl/') { + $drawings[(string) $ele['Id']] = \substr($eleTarget, 1); } else { $drawings[(string) $ele['Id']] = self::dirAdd("$dir/$fileWorksheet", $ele['Target']); } @@ -1272,7 +1272,7 @@ class Xlsx extends BaseReader foreach ($xmlSheetNS->drawing as $drawing) { $drawingRelId = (string) self::getArrayItem(self::getAttributes($drawing, $xmlNamespaceBase), 'id'); $fileDrawing = $drawings[$drawingRelId]; - $drawingFilename = dirname($fileDrawing) . '/_rels/' . basename($fileDrawing) . '.rels'; + $drawingFilename = \dirname($fileDrawing) . '/_rels/' . \basename($fileDrawing) . '.rels'; $relsDrawing = $this->loadZipNoNamespace($drawingFilename, $xmlNamespaceBase); $images = []; @@ -1285,8 +1285,8 @@ class Xlsx extends BaseReader } if ($eleType === "$xmlNamespaceBase/image") { $eleTarget = (string) $ele['Target']; - if (substr($eleTarget, 0, 4) === '/xl/') { - $eleTarget = substr($eleTarget, 1); + if (\substr($eleTarget, 0, 4) === '/xl/') { + $eleTarget = \substr($eleTarget, 1); $images[(string) $ele['Id']] = $eleTarget; } else { $images[(string) $ele['Id']] = self::dirAdd($fileDrawing, $eleTarget); @@ -1294,8 +1294,8 @@ class Xlsx extends BaseReader } elseif ($eleType === "$xmlNamespaceBase/chart") { if ($this->includeCharts) { $eleTarget = (string) $ele['Target']; - if (substr($eleTarget, 0, 4) === '/xl/') { - $index = substr($eleTarget, 1); + if (\substr($eleTarget, 0, 4) === '/xl/') { + $index = \substr($eleTarget, 1); } else { $index = self::dirAdd($fileDrawing, $eleTarget); } @@ -1315,11 +1315,11 @@ class Xlsx extends BaseReader foreach ($xmlDrawingChildren->oneCellAnchor as $oneCellAnchor) { $oneCellAnchor = self::testSimpleXml($oneCellAnchor); if ($oneCellAnchor->pic->blipFill) { - /** @var SimpleXMLElement $blip */ + /** @var \SimpleXMLElement $blip */ $blip = $oneCellAnchor->pic->blipFill->children(Namespaces::DRAWINGML)->blip; - /** @var SimpleXMLElement $xfrm */ + /** @var \SimpleXMLElement $xfrm */ $xfrm = $oneCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->xfrm; - /** @var SimpleXMLElement $outerShdw */ + /** @var \SimpleXMLElement $outerShdw */ $outerShdw = $oneCellAnchor->pic->spPr->children(Namespaces::DRAWINGML)->effectLst->outerShdw; $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); @@ -1341,7 +1341,7 @@ class Xlsx extends BaseReader 'link' ); if (isset($images[$linkImageKey])) { - $url = str_replace('xl/drawings/', '', $images[$linkImageKey]); + $url = \str_replace('xl/drawings/', '', $images[$linkImageKey]); $objDrawing->setPath($url); } } @@ -1379,7 +1379,7 @@ class Xlsx extends BaseReader $height = Drawing::EMUToPixels(self::getArrayItem(self::getAttributes($oneCellAnchor->ext), 'cy')); $graphic = $oneCellAnchor->graphicFrame->children(Namespaces::DRAWINGML)->graphic; - /** @var SimpleXMLElement $chartRef */ + /** @var \SimpleXMLElement $chartRef */ $chartRef = $graphic->graphicData->children(Namespaces::CHART)->chart; $thisChart = (string) self::getAttributes($chartRef, $xmlNamespaceBase); @@ -1426,7 +1426,7 @@ class Xlsx extends BaseReader 'link' ); if (isset($images[$linkImageKey])) { - $url = str_replace('xl/drawings/', '', $images[$linkImageKey]); + $url = \str_replace('xl/drawings/', '', $images[$linkImageKey]); $objDrawing->setPath($url); } } @@ -1470,7 +1470,7 @@ class Xlsx extends BaseReader $toOffsetX = Drawing::EMUToPixels($twoCellAnchor->to->colOff); $toOffsetY = Drawing::EMUToPixels($twoCellAnchor->to->rowOff); $graphic = $twoCellAnchor->graphicFrame->children(Namespaces::DRAWINGML)->graphic; - /** @var SimpleXMLElement $chartRef */ + /** @var \SimpleXMLElement $chartRef */ $chartRef = $graphic->graphicData->children(Namespaces::CHART)->chart; $thisChart = (string) self::getAttributes($chartRef, $xmlNamespaceBase); @@ -1490,7 +1490,7 @@ class Xlsx extends BaseReader foreach ($xmlDrawingChildren->absoluteAnchor as $absoluteAnchor) { if (($this->includeCharts) && ($absoluteAnchor->graphicFrame)) { $graphic = $absoluteAnchor->graphicFrame->children(Namespaces::DRAWINGML)->graphic; - /** @var SimpleXMLElement $chartRef */ + /** @var \SimpleXMLElement $chartRef */ $chartRef = $graphic->graphicData->children(Namespaces::CHART)->chart; $thisChart = (string) self::getAttributes($chartRef, $xmlNamespaceBase); $width = Drawing::EMUToPixels((int) self::getArrayItem(self::getAttributes($absoluteAnchor->ext), 'cx')[0]); @@ -1553,10 +1553,10 @@ class Xlsx extends BaseReader foreach ($xmlWorkbook->definedNames->definedName as $definedName) { // Extract range $extractedRange = (string) $definedName; - if (($spos = strpos($extractedRange, '!')) !== false) { - $extractedRange = substr($extractedRange, 0, $spos) . str_replace('$', '', substr($extractedRange, $spos)); + if (($spos = \strpos($extractedRange, '!')) !== false) { + $extractedRange = \substr($extractedRange, 0, $spos) . \str_replace('$', '', \substr($extractedRange, $spos)); } else { - $extractedRange = str_replace('$', '', $extractedRange); + $extractedRange = \str_replace('$', '', $extractedRange); } // Valid range? @@ -1570,10 +1570,10 @@ class Xlsx extends BaseReader switch ((string) $definedName['name']) { case '_xlnm._FilterDatabase': if ((string) $definedName['hidden'] !== '1') { - $extractedRange = explode(',', $extractedRange); + $extractedRange = \explode(',', $extractedRange); foreach ($extractedRange as $range) { $autoFilterRange = $range; - if (strpos($autoFilterRange, ':') !== false) { + if (\strpos($autoFilterRange, ':') !== false) { $docSheet->getAutoFilter()->setRange($autoFilterRange); } } @@ -1582,17 +1582,17 @@ class Xlsx extends BaseReader break; case '_xlnm.Print_Titles': // Split $extractedRange - $extractedRange = explode(',', $extractedRange); + $extractedRange = \explode(',', $extractedRange); // Set print titles foreach ($extractedRange as $range) { $matches = []; - $range = str_replace('$', '', $range); + $range = \str_replace('$', '', $range); // check for repeating columns, e g. 'A:A' or 'A:D' - if (preg_match('/!?([A-Z]+)\:([A-Z]+)$/', $range, $matches)) { + if (\preg_match('/!?([A-Z]+)\:([A-Z]+)$/', $range, $matches)) { $docSheet->getPageSetup()->setColumnsToRepeatAtLeft([$matches[1], $matches[2]]); - } elseif (preg_match('/!?(\d+)\:(\d+)$/', $range, $matches)) { + } elseif (\preg_match('/!?(\d+)\:(\d+)$/', $range, $matches)) { // check for repeating rows, e.g. '1:1' or '1:5' $docSheet->getPageSetup()->setRowsToRepeatAtTop([$matches[1], $matches[2]]); } @@ -1600,20 +1600,20 @@ class Xlsx extends BaseReader break; case '_xlnm.Print_Area': - $rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) ?: []; + $rangeSets = \preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) ?: []; $newRangeSets = []; foreach ($rangeSets as $rangeSet) { [, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true); if (empty($rangeSet)) { continue; } - if (strpos($rangeSet, ':') === false) { + if (\strpos($rangeSet, ':') === false) { $rangeSet = $rangeSet . ':' . $rangeSet; } - $newRangeSets[] = str_replace('$', '', $rangeSet); + $newRangeSets[] = \str_replace('$', '', $rangeSet); } - if (count($newRangeSets) > 0) { - $docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets)); + if (\count($newRangeSets) > 0) { + $docSheet->getPageSetup()->setPrintArea(\implode(',', $newRangeSets)); } break; @@ -1652,9 +1652,9 @@ class Xlsx extends BaseReader if ($mapSheetId[(int) $definedName['localSheetId']] !== null) { $range = Worksheet::extractSheetTitle((string) $definedName, true); $scope = $excel->getSheet($mapSheetId[(int) $definedName['localSheetId']]); - if (strpos((string) $definedName, '!') !== false) { - $range[0] = str_replace("''", "'", $range[0]); - $range[0] = str_replace("'", '', $range[0]); + if (\strpos((string) $definedName, '!') !== false) { + $range[0] = \str_replace("''", "'", $range[0]); + $range[0] = \str_replace("'", '', $range[0]); if ($worksheet = $excel->getSheetByName($range[0])) { // @phpstan-ignore-line $excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $worksheet, $extractedRange, true, $scope)); } else { @@ -1671,13 +1671,13 @@ class Xlsx extends BaseReader $definedRange = (string) $definedName; // "Global" definedNames $locatedSheet = null; - if (strpos((string) $definedName, '!') !== false) { + if (\strpos((string) $definedName, '!') !== false) { // Modify range, and extract the first worksheet reference // Need to split on a comma or a space if not in quotes, and extract the first part. - $definedNameValueParts = preg_split("/[ ,](?=([^']*'[^']*')*[^']*$)/miuU", $definedRange); + $definedNameValueParts = \preg_split("/[ ,](?=([^']*'[^']*')*[^']*$)/miuU", $definedRange); // Extract sheet name [$extractedSheetName] = Worksheet::extractSheetTitle((string) $definedNameValueParts[0], true); // @phpstan-ignore-line - $extractedSheetName = trim($extractedSheetName, "'"); + $extractedSheetName = \trim($extractedSheetName, "'"); // Locate sheet $locatedSheet = $excel->getSheetByName($extractedSheetName); @@ -1716,10 +1716,10 @@ class Xlsx extends BaseReader switch ($contentType['ContentType']) { case 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml': if ($this->includeCharts) { - $chartEntryRef = ltrim((string) $contentType['PartName'], '/'); + $chartEntryRef = \ltrim((string) $contentType['PartName'], '/'); $chartElements = $this->loadZip($chartEntryRef); $chartReader = new Chart($chartNS, $drawingNS); - $objChart = $chartReader->readChart($chartElements, basename($chartEntryRef, '.xml')); + $objChart = $chartReader->readChart($chartElements, \basename($chartEntryRef, '.xml')); if (isset($charts[$chartEntryRef])) { $chartPositionRef = $charts[$chartEntryRef]['sheet'] . '!' . $charts[$chartEntryRef]['id']; if (isset($chartDetails[$chartPositionRef])) { @@ -1727,7 +1727,7 @@ class Xlsx extends BaseReader $objChart->setWorksheet($excel->getSheetByName($charts[$chartEntryRef]['sheet'])); // For oneCellAnchor or absoluteAnchor positioned charts, // toCoordinate is not in the data. Does it need to be calculated? - if (array_key_exists('toCoordinate', $chartDetails[$chartPositionRef])) { + if (\array_key_exists('toCoordinate', $chartDetails[$chartPositionRef])) { // twoCellAnchor $objChart->setTopLeftPosition($chartDetails[$chartPositionRef]['fromCoordinate'], $chartDetails[$chartPositionRef]['fromOffsetX'], $chartDetails[$chartPositionRef]['fromOffsetY']); $objChart->setBottomRightPosition($chartDetails[$chartPositionRef]['toCoordinate'], $chartDetails[$chartPositionRef]['toOffsetX'], $chartDetails[$chartPositionRef]['toOffsetY']); @@ -1735,7 +1735,7 @@ class Xlsx extends BaseReader // oneCellAnchor or absoluteAnchor (e.g. Chart sheet) $objChart->setTopLeftPosition($chartDetails[$chartPositionRef]['fromCoordinate'], $chartDetails[$chartPositionRef]['fromOffsetX'], $chartDetails[$chartPositionRef]['fromOffsetY']); $objChart->setBottomRightPosition('', $chartDetails[$chartPositionRef]['width'], $chartDetails[$chartPositionRef]['height']); - if (array_key_exists('oneCellAnchor', $chartDetails[$chartPositionRef])) { + if (\array_key_exists('oneCellAnchor', $chartDetails[$chartPositionRef])) { $objChart->setOneCellAnchor($chartDetails[$chartPositionRef]['oneCellAnchor']); } } @@ -1764,15 +1764,15 @@ class Xlsx extends BaseReader /** * @return RichText */ - private function parseRichText(?SimpleXMLElement $is) + private function parseRichText(?\SimpleXMLElement $is) { $value = new RichText(); if (isset($is->t)) { $value->createText(StringHelper::controlCharacterOOXML2PHP((string) $is->t)); } elseif ($is !== null) { - if (is_object($is->r)) { - /** @var SimpleXMLElement $run */ + if (\is_object($is->r)) { + /** @var \SimpleXMLElement $run */ foreach ($is->r as $run) { if (!isset($run->rPr)) { $value->createText(StringHelper::controlCharacterOOXML2PHP((string) $run->t)); @@ -1816,7 +1816,7 @@ class Xlsx extends BaseReader if (isset($run->rPr->vertAlign)) { $attr = $run->rPr->vertAlign->attributes(); if (isset($attr['val'])) { - $vertAlign = strtolower((string) $attr['val']); + $vertAlign = \strtolower((string) $attr['val']); if ($vertAlign == 'superscript') { $objFont->setSuperscript(true); } @@ -1850,10 +1850,10 @@ class Xlsx extends BaseReader return $value; } - private function readRibbon(Spreadsheet $excel, string $customUITarget, ZipArchive $zip): void + private function readRibbon(Spreadsheet $excel, string $customUITarget, \ZipArchive $zip): void { - $baseDir = dirname($customUITarget); - $nameCustomUI = basename($customUITarget); + $baseDir = \dirname($customUITarget); + $nameCustomUI = \basename($customUITarget); // get the xml file (ribbon) $localRibbon = $this->getFromZipArchive($zip, $customUITarget); $customUIImagesNames = []; @@ -1863,7 +1863,7 @@ class Xlsx extends BaseReader $dataRels = $this->getFromZipArchive($zip, $pathRels); if ($dataRels) { // exists and not empty if the ribbon have some pictures (other than internal MSO) - $UIRels = simplexml_load_string( + $UIRels = \simplexml_load_string( $this->securityScanner->scan($dataRels), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions() @@ -1881,7 +1881,7 @@ class Xlsx extends BaseReader } if ($localRibbon) { $excel->setRibbonXMLData($customUITarget, $localRibbon); - if (count($customUIImagesNames) > 0 && count($customUIImagesBinaries) > 0) { + if (\count($customUIImagesNames) > 0 && \count($customUIImagesBinaries) > 0) { $excel->setRibbonBinObjects($customUIImagesNames, $customUIImagesBinaries); } else { $excel->setRibbonBinObjects(null, null); @@ -1893,50 +1893,50 @@ class Xlsx extends BaseReader } /** - * @param null|array|bool|SimpleXMLElement $array + * @param null|array|bool|\SimpleXMLElement $array * @param int|string $key * * @return mixed */ private static function getArrayItem($array, $key = 0) { - return ($array === null || is_bool($array)) ? null : ($array[$key] ?? null); + return ($array === null || \is_bool($array)) ? null : ($array[$key] ?? null); } /** - * @param null|SimpleXMLElement|string $base - * @param null|SimpleXMLElement|string $add + * @param null|\SimpleXMLElement|string $base + * @param null|\SimpleXMLElement|string $add */ private static function dirAdd($base, $add): string { $base = (string) $base; $add = (string) $add; - return (string) preg_replace('~[^/]+/\.\./~', '', dirname($base) . "/$add"); + return (string) \preg_replace('~[^/]+/\.\./~', '', \dirname($base) . "/$add"); } private static function toCSSArray(string $style): array { $style = self::stripWhiteSpaceFromStyleString($style); - $temp = explode(';', $style); + $temp = \explode(';', $style); $style = []; foreach ($temp as $item) { - $item = explode(':', $item); + $item = \explode(':', $item); - if (strpos($item[1], 'px') !== false) { - $item[1] = str_replace('px', '', $item[1]); + if (\strpos($item[1], 'px') !== false) { + $item[1] = \str_replace('px', '', $item[1]); } - if (strpos($item[1], 'pt') !== false) { - $item[1] = str_replace('pt', '', $item[1]); + if (\strpos($item[1], 'pt') !== false) { + $item[1] = \str_replace('pt', '', $item[1]); $item[1] = (string) Font::fontSizeToPixels((int) $item[1]); } - if (strpos($item[1], 'in') !== false) { - $item[1] = str_replace('in', '', $item[1]); + if (\strpos($item[1], 'in') !== false) { + $item[1] = \str_replace('in', '', $item[1]); $item[1] = (string) Font::inchSizeToPixels((int) $item[1]); } - if (strpos($item[1], 'cm') !== false) { - $item[1] = str_replace('cm', '', $item[1]); + if (\strpos($item[1], 'cm') !== false) { + $item[1] = \str_replace('cm', '', $item[1]); $item[1] = (string) Font::centimeterSizeToPixels((int) $item[1]); } @@ -1948,12 +1948,12 @@ class Xlsx extends BaseReader public static function stripWhiteSpaceFromStyleString(string $string): string { - return trim(str_replace(["\r", "\n", ' '], '', $string), ';'); + return \trim(\str_replace(["\r", "\n", ' '], '', $string), ';'); } private static function boolean(string $value): bool { - if (is_numeric($value)) { + if (\is_numeric($value)) { return (bool) $value; } @@ -1963,7 +1963,7 @@ class Xlsx extends BaseReader /** * @param array $hyperlinks */ - private function readHyperLinkDrawing(\PhpOffice\PhpSpreadsheet\Worksheet\Drawing $objDrawing, SimpleXMLElement $cellAnchor, $hyperlinks): void + private function readHyperLinkDrawing(\PhpOffice\PhpSpreadsheet\Worksheet\Drawing $objDrawing, \SimpleXMLElement $cellAnchor, $hyperlinks): void { $hlinkClick = $cellAnchor->pic->nvPicPr->cNvPr->children(Namespaces::DRAWINGML)->hlinkClick; @@ -1979,7 +1979,7 @@ class Xlsx extends BaseReader $objDrawing->setHyperlink($hyperlink); } - private function readProtection(Spreadsheet $excel, SimpleXMLElement $xmlWorkbook): void + private function readProtection(Spreadsheet $excel, \SimpleXMLElement $xmlWorkbook): void { if (!$xmlWorkbook->workbookProtection) { return; @@ -2004,7 +2004,7 @@ class Xlsx extends BaseReader } } - private static function getLockValue(SimpleXmlElement $protection, string $key): ?bool + private static function getLockValue(\SimpleXmlElement $protection, string $key): ?bool { $returnValue = null; $protectKey = $protection[$key]; @@ -2019,11 +2019,11 @@ class Xlsx extends BaseReader private function readFormControlProperties(Spreadsheet $excel, string $dir, string $fileWorksheet, Worksheet $docSheet, array &$unparsedLoadedData): void { $zip = $this->zip; - if (!$zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { + if (!$zip->locateName(\dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels')) { return; } - $filename = dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels'; + $filename = \dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels'; $relsWorksheet = $this->loadZipNoNamespace($filename, Namespaces::RELATIONSHIPS); $ctrlProps = []; foreach ($relsWorksheet->Relationship as $ele) { @@ -2034,7 +2034,7 @@ class Xlsx extends BaseReader $unparsedCtrlProps = &$unparsedLoadedData['sheets'][$docSheet->getCodeName()]['ctrlProps']; foreach ($ctrlProps as $rId => $ctrlProp) { - $rId = substr($rId, 3); // rIdXXX + $rId = \substr($rId, 3); // rIdXXX $unparsedCtrlProps[$rId] = []; $unparsedCtrlProps[$rId]['filePath'] = self::dirAdd("$dir/$fileWorksheet", $ctrlProp['Target']); $unparsedCtrlProps[$rId]['relFilePath'] = (string) $ctrlProp['Target']; @@ -2046,11 +2046,11 @@ class Xlsx extends BaseReader private function readPrinterSettings(Spreadsheet $excel, string $dir, string $fileWorksheet, Worksheet $docSheet, array &$unparsedLoadedData): void { $zip = $this->zip; - if (!$zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { + if (!$zip->locateName(\dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels')) { return; } - $filename = dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels'; + $filename = \dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels'; $relsWorksheet = $this->loadZipNoNamespace($filename, Namespaces::RELATIONSHIPS); $sheetPrinterSettings = []; foreach ($relsWorksheet->Relationship as $ele) { @@ -2061,8 +2061,8 @@ class Xlsx extends BaseReader $unparsedPrinterSettings = &$unparsedLoadedData['sheets'][$docSheet->getCodeName()]['printerSettings']; foreach ($sheetPrinterSettings as $rId => $printerSettings) { - $rId = substr($rId, 3); // rIdXXX - if (substr($rId, -2) !== 'ps') { + $rId = \substr($rId, 3); // rIdXXX + if (\substr($rId, -2) !== 'ps') { $rId = $rId . 'ps'; // rIdXXX, add 'ps' suffix to avoid identical resource identifier collision with unparsed vmlDrawing } $unparsedPrinterSettings[$rId] = []; @@ -2086,9 +2086,9 @@ class Xlsx extends BaseReader switch ($type) { case Namespaces::OFFICE_DOCUMENT: case Namespaces::PURL_OFFICE_DOCUMENT: - $basename = basename((string) $rel['Target']); - $xmlNamespaceBase = dirname($type); - if (preg_match('/workbook.*\.xml/', $basename)) { + $basename = \basename((string) $rel['Target']); + $xmlNamespaceBase = \dirname($type); + if (\preg_match('/workbook.*\.xml/', $basename)) { $workbookBasename = $basename; } @@ -2099,7 +2099,7 @@ class Xlsx extends BaseReader return [$workbookBasename, $xmlNamespaceBase]; } - private function readSheetProtection(Worksheet $docSheet, SimpleXMLElement $xmlSheet): void + private function readSheetProtection(Worksheet $docSheet, \SimpleXMLElement $xmlSheet): void { if ($this->readDataOnly || !$xmlSheet->sheetProtection) { return; @@ -2125,7 +2125,7 @@ class Xlsx extends BaseReader } private function readAutoFilter( - SimpleXMLElement $xmlSheet, + \SimpleXMLElement $xmlSheet, Worksheet $docSheet ): void { if ($xmlSheet && $xmlSheet->autoFilter) { @@ -2134,11 +2134,11 @@ class Xlsx extends BaseReader } private function readTables( - SimpleXMLElement $xmlSheet, + \SimpleXMLElement $xmlSheet, Worksheet $docSheet, string $dir, string $fileWorksheet, - ZipArchive $zip + \ZipArchive $zip ): void { if ($xmlSheet && $xmlSheet->tableParts && (int) $xmlSheet->tableParts['count'] > 0) { $this->readTablesInTablesFile($xmlSheet, $dir, $fileWorksheet, $zip, $docSheet); @@ -2146,16 +2146,16 @@ class Xlsx extends BaseReader } private function readTablesInTablesFile( - SimpleXMLElement $xmlSheet, + \SimpleXMLElement $xmlSheet, string $dir, string $fileWorksheet, - ZipArchive $zip, + \ZipArchive $zip, Worksheet $docSheet ): void { foreach ($xmlSheet->tableParts->tablePart as $tablePart) { $relation = self::getAttributes($tablePart, Namespaces::SCHEMA_OFFICE_DOCUMENT); $tablePartRel = (string) $relation['id']; - $relationsFileName = dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels'; + $relationsFileName = \dirname("$dir/$fileWorksheet") . '/_rels/' . \basename($fileWorksheet) . '.rels'; if ($zip->locateName($relationsFileName)) { $relsTableReferences = $this->loadZip($relationsFileName, Namespaces::RELATIONSHIPS); @@ -2164,7 +2164,7 @@ class Xlsx extends BaseReader if ((string) $relationshipAttributes['Id'] === $tablePartRel) { $relationshipFileName = (string) $relationshipAttributes['Target']; - $relationshipFilePath = dirname("$dir/$fileWorksheet") . '/' . $relationshipFileName; + $relationshipFilePath = \dirname("$dir/$fileWorksheet") . '/' . $relationshipFileName; $relationshipFilePath = File::realpath($relationshipFilePath); if ($this->fileExistsInArchive($this->zip, $relationshipFilePath)) { @@ -2177,7 +2177,7 @@ class Xlsx extends BaseReader } } - private static function extractStyles(?SimpleXMLElement $sxml, string $node1, string $node2): array + private static function extractStyles(?\SimpleXMLElement $sxml, string $node1, string $node2): array { $array = []; if ($sxml && $sxml->{$node1}->{$node2}) { @@ -2189,7 +2189,7 @@ class Xlsx extends BaseReader return $array; } - private static function extractPalette(?SimpleXMLElement $sxml): array + private static function extractPalette(?\SimpleXMLElement $sxml): array { $array = []; if ($sxml && $sxml->colors->indexedColors) { diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php index a6ab4d8..69b9fa2 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php @@ -16,14 +16,14 @@ class AutoFilter private $parent; /** - * @var SimpleXMLElement + * @var \SimpleXMLElement */ private $worksheetXml; /** * @param Table|Worksheet $parent */ - public function __construct($parent, SimpleXMLElement $worksheetXml) + public function __construct($parent, \SimpleXMLElement $worksheetXml) { $this->parent = $parent; $this->worksheetXml = $worksheetXml; @@ -32,13 +32,13 @@ class AutoFilter public function load(): void { // Remove all "$" in the auto filter range - $autoFilterRange = (string) preg_replace('/\$/', '', $this->worksheetXml->autoFilter['ref'] ?? ''); - if (strpos($autoFilterRange, ':') !== false) { + $autoFilterRange = (string) \preg_replace('/\$/', '', $this->worksheetXml->autoFilter['ref'] ?? ''); + if (\strpos($autoFilterRange, ':') !== false) { $this->readAutoFilter($autoFilterRange, $this->worksheetXml); } } - private function readAutoFilter(string $autoFilterRange, SimpleXMLElement $xmlSheet): void + private function readAutoFilter(string $autoFilterRange, \SimpleXMLElement $xmlSheet): void { $autoFilter = $this->parent->getAutoFilter(); $autoFilter->setRange($autoFilterRange); @@ -74,7 +74,7 @@ class AutoFilter $autoFilter->setEvaluated(true); } - private function readDateRangeAutoFilter(SimpleXMLElement $filters, Column $column): void + private function readDateRangeAutoFilter(\SimpleXMLElement $filters, Column $column): void { foreach ($filters->dateGroupItem as $dateGroupItem) { // Operator is undefined, but always treated as EQUAL @@ -93,7 +93,7 @@ class AutoFilter } } - private function readCustomAutoFilter(?SimpleXMLElement $filterColumn, Column $column): void + private function readCustomAutoFilter(?\SimpleXMLElement $filterColumn, Column $column): void { if (isset($filterColumn, $filterColumn->customFilters)) { $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER); @@ -112,7 +112,7 @@ class AutoFilter } } - private function readDynamicAutoFilter(?SimpleXMLElement $filterColumn, Column $column): void + private function readDynamicAutoFilter(?\SimpleXMLElement $filterColumn, Column $column): void { if (isset($filterColumn, $filterColumn->dynamicFilter)) { $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER); @@ -134,7 +134,7 @@ class AutoFilter } } - private function readTopTenAutoFilter(?SimpleXMLElement $filterColumn, Column $column): void + private function readTopTenAutoFilter(?\SimpleXMLElement $filterColumn, Column $column): void { if (isset($filterColumn, $filterColumn->top10)) { $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php index 6b99877..ec2c79b 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php @@ -9,11 +9,11 @@ class BaseParserClass */ protected static function boolean($value): bool { - if (is_object($value)) { + if (\is_object($value)) { $value = (string) $value; // @phpstan-ignore-line } - if (is_numeric($value)) { + if (\is_numeric($value)) { return (bool) $value; } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Chart.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Chart.php index d42df9a..180f704 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Chart.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Chart.php @@ -39,7 +39,7 @@ class Chart * * @return null|bool|float|int|string */ - private static function getAttribute(SimpleXMLElement $component, $name, $format) + private static function getAttribute(\SimpleXMLElement $component, $name, $format) { $attributes = $component->attributes(); if (@isset($attributes[$name])) { @@ -64,7 +64,7 @@ class Chart * * @return \PhpOffice\PhpSpreadsheet\Chart\Chart */ - public function readChart(SimpleXMLElement $chartElements, $chartName) + public function readChart(\SimpleXMLElement $chartElements, $chartName) { $chartElementsC = $chartElements->children($this->cNamespace); @@ -379,26 +379,26 @@ class Chart $chart->setNoFill(true); } $chart->setRoundedCorners($roundedCorners); - if (is_bool($autoTitleDeleted)) { + if (\is_bool($autoTitleDeleted)) { $chart->setAutoTitleDeleted($autoTitleDeleted); } - if (is_int($rotX)) { + if (\is_int($rotX)) { $chart->setRotX($rotX); } - if (is_int($rotY)) { + if (\is_int($rotY)) { $chart->setRotY($rotY); } - if (is_int($rAngAx)) { + if (\is_int($rAngAx)) { $chart->setRAngAx($rAngAx); } - if (is_int($perspective)) { + if (\is_int($perspective)) { $chart->setPerspective($perspective); } return $chart; } - private function chartTitle(SimpleXMLElement $titleDetails): Title + private function chartTitle(\SimpleXMLElement $titleDetails): Title { $caption = []; $titleLayout = null; @@ -435,7 +435,7 @@ class Chart return new Title($caption, $titleLayout); } - private function chartLayoutDetails(SimpleXMLElement $chartDetail): ?Layout + private function chartLayoutDetails(\SimpleXMLElement $chartDetail): ?Layout { if (!isset($chartDetail->manualLayout)) { return null; @@ -453,7 +453,7 @@ class Chart return new Layout($layout); } - private function chartDataSeries(SimpleXMLElement $chartDetail, string $plotType): DataSeries + private function chartDataSeries(\SimpleXMLElement $chartDetail, string $plotType): DataSeries { $multiSeriesType = null; $smoothLine = false; @@ -499,7 +499,7 @@ class Chart $children = $seriesDetail->children($this->aNamespace); if (isset($children->ln)) { $ln = $children->ln; - if (is_countable($ln->noFill) && count($ln->noFill) === 1) { + if (\is_countable($ln->noFill) && \count($ln->noFill) === 1) { $noFill = true; } $lineStyle = new GridLines(); @@ -565,7 +565,7 @@ class Chart case 'marker': $marker = self::getAttribute($seriesDetail->symbol, 'val', 'string'); $pointSize = self::getAttribute($seriesDetail->size, 'val', 'string'); - $pointSize = is_numeric($pointSize) ? ((int) $pointSize) : null; + $pointSize = \is_numeric($pointSize) ? ((int) $pointSize) : null; if (isset($seriesDetail->spPr)) { $children = $seriesDetail->spPr->children($this->aNamespace); if (isset($children->solidFill)) { @@ -722,7 +722,7 @@ class Chart /** * @return mixed */ - private function chartDataSeriesValueSet(SimpleXMLElement $seriesDetail, ?string $marker = null, ?ChartColor $fillColor = null, ?string $pointSize = null) + private function chartDataSeriesValueSet(\SimpleXMLElement $seriesDetail, ?string $marker = null, ?ChartColor $fillColor = null, ?string $pointSize = null) { if (isset($seriesDetail->strRef)) { $seriesSource = (string) $seriesDetail->strRef->f; @@ -786,7 +786,7 @@ class Chart return null; } - private function chartDataSeriesValues(SimpleXMLElement $seriesValueSet, string $dataType = 'n'): array + private function chartDataSeriesValues(\SimpleXMLElement $seriesValueSet, string $dataType = 'n'): array { $seriesVal = []; $formatCode = ''; @@ -824,7 +824,7 @@ class Chart ]; } - private function chartDataSeriesValuesMultiLevel(SimpleXMLElement $seriesValueSet, string $dataType = 'n'): array + private function chartDataSeriesValuesMultiLevel(\SimpleXMLElement $seriesValueSet, string $dataType = 'n'): array { $seriesVal = []; $formatCode = ''; @@ -864,7 +864,7 @@ class Chart ]; } - private function parseRichText(SimpleXMLElement $titleDetailPart): RichText + private function parseRichText(\SimpleXMLElement $titleDetailPart): RichText { $value = new RichText(); $defaultFontSize = null; @@ -1006,8 +1006,8 @@ class Chart } $fontSize = $fontSize ?? $defaultFontSize; - if (is_int($fontSize)) { - $objText->getFont()->setSize(floor($fontSize / 100)); + if (\is_int($fontSize)) { + $objText->getFont()->setSize(\floor($fontSize / 100)); $fontFound = true; } else { $objText->getFont()->setSize(null, true); @@ -1078,7 +1078,7 @@ class Chart } /** - * @param ?SimpleXMLElement $chartDetail + * @param ?\SimpleXMLElement $chartDetail */ private function readChartAttributes($chartDetail): array { @@ -1171,7 +1171,7 @@ class Chart } } - private function readEffects(SimpleXMLElement $chartDetail, ?ChartProperties $chartObject): void + private function readEffects(\SimpleXMLElement $chartDetail, ?ChartProperties $chartObject): void { if (!isset($chartObject, $chartDetail->spPr)) { return; @@ -1189,7 +1189,7 @@ class Chart if (isset($sppr->effectLst->softEdge)) { /** @var string */ $softEdgeSize = self::getAttribute($sppr->effectLst->softEdge, 'rad', 'string'); - if (is_numeric($softEdgeSize)) { + if (\is_numeric($softEdgeSize)) { $chartObject->setSoftEdges((float) ChartProperties::xmlToPoints($softEdgeSize)); } } @@ -1205,19 +1205,19 @@ class Chart if ($type !== '') { /** @var string */ $blur = self::getAttribute($sppr->effectLst->$type, 'blurRad', 'string'); - $blur = is_numeric($blur) ? ChartProperties::xmlToPoints($blur) : null; + $blur = \is_numeric($blur) ? ChartProperties::xmlToPoints($blur) : null; /** @var string */ $dist = self::getAttribute($sppr->effectLst->$type, 'dist', 'string'); - $dist = is_numeric($dist) ? ChartProperties::xmlToPoints($dist) : null; + $dist = \is_numeric($dist) ? ChartProperties::xmlToPoints($dist) : null; /** @var string */ $direction = self::getAttribute($sppr->effectLst->$type, 'dir', 'string'); - $direction = is_numeric($direction) ? ChartProperties::xmlToAngle($direction) : null; + $direction = \is_numeric($direction) ? ChartProperties::xmlToAngle($direction) : null; $algn = self::getAttribute($sppr->effectLst->$type, 'algn', 'string'); $rot = self::getAttribute($sppr->effectLst->$type, 'rotWithShape', 'string'); $size = []; foreach (['sx', 'sy'] as $sizeType) { $sizeValue = self::getAttribute($sppr->effectLst->$type, $sizeType, 'string'); - if (is_numeric($sizeValue)) { + if (\is_numeric($sizeValue)) { $size[$sizeType] = ChartProperties::xmlToTenthOfPercent((string) $sizeValue); } else { $size[$sizeType] = null; @@ -1225,7 +1225,7 @@ class Chart } foreach (['kx', 'ky'] as $sizeType) { $sizeValue = self::getAttribute($sppr->effectLst->$type, $sizeType, 'string'); - if (is_numeric($sizeValue)) { + if (\is_numeric($sizeValue)) { $size[$sizeType] = ChartProperties::xmlToAngle((string) $sizeValue); } else { $size[$sizeType] = null; @@ -1249,7 +1249,7 @@ class Chart 'innerShdw', ]; - private function readColor(SimpleXMLElement $colorXml): array + private function readColor(\SimpleXMLElement $colorXml): array { $result = [ 'type' => null, @@ -1264,14 +1264,14 @@ class Chart if (isset($colorXml->$type->alpha)) { /** @var string */ $alpha = self::getAttribute($colorXml->$type->alpha, 'val', 'string'); - if (is_numeric($alpha)) { + if (\is_numeric($alpha)) { $result['alpha'] = ChartColor::alphaFromXml($alpha); } } if (isset($colorXml->$type->lumMod)) { /** @var string */ $brightness = self::getAttribute($colorXml->$type->lumMod, 'val', 'string'); - if (is_numeric($brightness)) { + if (\is_numeric($brightness)) { $result['brightness'] = ChartColor::alphaFromXml($brightness); } } @@ -1283,7 +1283,7 @@ class Chart return $result; } - private function readLineStyle(SimpleXMLElement $chartDetail, ?ChartProperties $chartObject): void + private function readLineStyle(\SimpleXMLElement $chartDetail, ?ChartProperties $chartObject): void { if (!isset($chartObject, $chartDetail->spPr)) { return; @@ -1296,7 +1296,7 @@ class Chart $lineWidth = null; /** @var string */ $lineWidthTemp = self::getAttribute($sppr->ln, 'w', 'string'); - if (is_numeric($lineWidthTemp)) { + if (\is_numeric($lineWidthTemp)) { $lineWidth = ChartProperties::xmlToPoints($lineWidthTemp); } /** @var string */ @@ -1345,7 +1345,7 @@ class Chart $chartObject->getLineColor()->setColorPropertiesArray($colorArray); } - private function setAxisProperties(SimpleXMLElement $chartDetail, ?Axis $whichAxis): void + private function setAxisProperties(\SimpleXMLElement $chartDetail, ?Axis $whichAxis): void { if (!isset($whichAxis)) { return; @@ -1410,7 +1410,7 @@ class Chart if (isset($children->bodyPr)) { /** @var string */ $textRotation = self::getAttribute($children->bodyPr, 'rot', 'string'); - if (is_numeric($textRotation)) { + if (\is_numeric($textRotation)) { $whichAxis->setAxisOption('textRotation', (string) ChartProperties::xmlToAngle($textRotation)); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php index 2b14eab..125bf3e 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php @@ -13,10 +13,10 @@ class ColumnAndRowAttributes extends BaseParserClass /** @var Worksheet */ private $worksheet; - /** @var ?SimpleXMLElement */ + /** @var ?\SimpleXMLElement */ private $worksheetXml; - public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null) + public function __construct(Worksheet $workSheet, ?\SimpleXMLElement $worksheetXml = null) { $this->worksheet = $workSheet; $this->worksheetXml = $worksheetXml; @@ -90,7 +90,7 @@ class ColumnAndRowAttributes extends BaseParserClass $rowsAttributes = $this->readRowAttributes($this->worksheetXml->sheetData->row, $readDataOnly); } - if ($readFilter !== null && get_class($readFilter) === DefaultReadFilter::class) { + if ($readFilter !== null && \get_class($readFilter) === DefaultReadFilter::class) { $readFilter = null; } @@ -133,7 +133,7 @@ class ColumnAndRowAttributes extends BaseParserClass return false; } - private function readColumnAttributes(SimpleXMLElement $worksheetCols, bool $readDataOnly): array + private function readColumnAttributes(\SimpleXMLElement $worksheetCols, bool $readDataOnly): array { $columnAttributes = []; @@ -157,7 +157,7 @@ class ColumnAndRowAttributes extends BaseParserClass return $columnAttributes; } - private function readColumnRangeAttributes(?SimpleXMLElement $column, bool $readDataOnly): array + private function readColumnRangeAttributes(?\SimpleXMLElement $column, bool $readDataOnly): array { $columnAttributes = []; if ($column !== null) { @@ -192,7 +192,7 @@ class ColumnAndRowAttributes extends BaseParserClass return false; } - private function readRowAttributes(SimpleXMLElement $worksheetRow, bool $readDataOnly): array + private function readRowAttributes(\SimpleXMLElement $worksheetRow, bool $readDataOnly): array { $rowAttributes = []; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php index aa6b62b..07a2e5d 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php @@ -17,7 +17,7 @@ class ConditionalStyles /** @var Worksheet */ private $worksheet; - /** @var SimpleXMLElement */ + /** @var \SimpleXMLElement */ private $worksheetXml; /** @@ -28,7 +28,7 @@ class ConditionalStyles /** @var array */ private $dxfs; - public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml, array $dxfs = []) + public function __construct(Worksheet $workSheet, \SimpleXMLElement $worksheetXml, array $dxfs = []) { $this->worksheet = $workSheet; $this->worksheetXml = $worksheetXml; @@ -63,15 +63,15 @@ class ConditionalStyles private function setConditionalsFromExt(array $conditionals): void { foreach ($conditionals as $conditionalRange => $cfRules) { - ksort($cfRules); + \ksort($cfRules); // Priority is used as the key for sorting; but may not start at 0, // so we use array_values to reset the index after sorting. $this->worksheet->getStyle($conditionalRange) - ->setConditionalStyles(array_values($cfRules)); + ->setConditionalStyles(\array_values($cfRules)); } } - private function readConditionalsFromExt(SimpleXMLElement $extLst, StyleReader $styleReader): array + private function readConditionalsFromExt(\SimpleXMLElement $extLst, StyleReader $styleReader): array { $conditionals = []; @@ -114,7 +114,7 @@ class ConditionalStyles return $conditionals; } - private function readConditionalRuleFromExt(SimpleXMLElement $cfRuleXml, SimpleXMLElement $attributes): Conditional + private function readConditionalRuleFromExt(\SimpleXMLElement $cfRuleXml, \SimpleXMLElement $attributes): Conditional { $conditionType = (string) $attributes->type; $operatorType = (string) $attributes->operator; @@ -134,14 +134,14 @@ class ConditionalStyles $conditionType === Conditional::CONDITION_ENDSWITH || $conditionType === Conditional::CONDITION_TIMEPERIOD ) { - $conditional->setText(array_pop($operands) ?? ''); + $conditional->setText(\array_pop($operands) ?? ''); } $conditional->setConditions($operands); return $conditional; } - private function readStyleFromExt(SimpleXMLElement $extCfRuleXml, StyleReader $styleReader): Style + private function readStyleFromExt(\SimpleXMLElement $extCfRuleXml, StyleReader $styleReader): Style { $cfStyle = new Style(false, true); if ($extCfRuleXml->dxf) { @@ -158,7 +158,7 @@ class ConditionalStyles return $cfStyle; } - private function readConditionalStyles(SimpleXMLElement $xmlSheet): array + private function readConditionalStyles(\SimpleXMLElement $xmlSheet): array { $conditionals = []; foreach ($xmlSheet->conditionalFormatting as $conditional) { @@ -174,21 +174,21 @@ class ConditionalStyles return $conditionals; } - private function setConditionalStyles(Worksheet $worksheet, array $conditionals, SimpleXMLElement $xmlExtLst): void + private function setConditionalStyles(Worksheet $worksheet, array $conditionals, \SimpleXMLElement $xmlExtLst): void { foreach ($conditionals as $cellRangeReference => $cfRules) { - ksort($cfRules); + \ksort($cfRules); $conditionalStyles = $this->readStyleRules($cfRules, $xmlExtLst); // Extract all cell references in $cellRangeReference - $cellBlocks = explode(' ', str_replace('$', '', strtoupper($cellRangeReference))); + $cellBlocks = \explode(' ', \str_replace('$', '', \strtoupper($cellRangeReference))); foreach ($cellBlocks as $cellBlock) { $worksheet->getStyle($cellBlock)->setConditionalStyles($conditionalStyles); } } } - private function readStyleRules(array $cfRules, SimpleXMLElement $extLst): array + private function readStyleRules(array $cfRules, \SimpleXMLElement $extLst): array { $conditionalFormattingRuleExtensions = ConditionalFormattingRuleExtension::parseExtLstXml($extLst); $conditionalStyles = []; @@ -208,7 +208,7 @@ class ConditionalStyles $objConditional->setStopIfTrue(true); } - if (count($cfRule->formula) >= 1) { + if (\count($cfRule->formula) >= 1) { foreach ($cfRule->formula as $formulax) { $formula = (string) $formulax; if ($formula === 'TRUE') { @@ -238,7 +238,7 @@ class ConditionalStyles } /** - * @param SimpleXMLElement|stdClass $cfRule + * @param \SimpleXMLElement|\stdClass $cfRule */ private function readDataBarOfConditionalRule($cfRule, array $conditionalFormattingRuleExtensions): ConditionalDataBar { @@ -252,7 +252,7 @@ class ConditionalStyles //conditionalFormatValueObjects $cfvoXml = $cfRule->dataBar->cfvo; $cfvoIndex = 0; - foreach ((count($cfvoXml) > 1 ? $cfvoXml : [$cfvoXml]) as $cfvo) { + foreach ((\count($cfvoXml) > 1 ? $cfvoXml : [$cfvoXml]) as $cfvo) { if ($cfvoIndex === 0) { $dataBar->setMinimumConditionalFormatValueObject(new ConditionalFormatValueObject((string) $cfvo['type'], (string) $cfvo['val'])); } @@ -273,13 +273,13 @@ class ConditionalStyles } /** - * @param SimpleXMLElement|stdClass $cfRule + * @param \SimpleXMLElement|\stdClass $cfRule */ private function readDataBarExtLstOfConditionalRule(ConditionalDataBar $dataBar, $cfRule, array $conditionalFormattingRuleExtensions): void { if (isset($cfRule->extLst)) { $ns = $cfRule->extLst->getNamespaces(true); - foreach ((count($cfRule->extLst) > 0 ? $cfRule->extLst->ext : [$cfRule->extLst->ext]) as $ext) { + foreach ((\count($cfRule->extLst) > 0 ? $cfRule->extLst->ext : [$cfRule->extLst->ext]) as $ext) { $extId = (string) $ext->children($ns['x14'])->id; if (isset($conditionalFormattingRuleExtensions[$extId]) && (string) $ext['uri'] === '{B025F937-C7B1-47D3-B67F-A62EFF666E3E}') { $dataBar->setConditionalFormattingRuleExt($conditionalFormattingRuleExtensions[$extId]); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/DataValidations.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/DataValidations.php index dac7623..2f61d3e 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/DataValidations.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/DataValidations.php @@ -11,10 +11,10 @@ class DataValidations /** @var Worksheet */ private $worksheet; - /** @var SimpleXMLElement */ + /** @var \SimpleXMLElement */ private $worksheetXml; - public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml) + public function __construct(Worksheet $workSheet, \SimpleXMLElement $worksheetXml) { $this->worksheet = $workSheet; $this->worksheetXml = $worksheetXml; @@ -24,8 +24,8 @@ class DataValidations { foreach ($this->worksheetXml->dataValidations->dataValidation as $dataValidation) { // Uppercase coordinate - $range = strtoupper((string) $dataValidation['sqref']); - $rangeSet = explode(' ', $range); + $range = \strtoupper((string) $dataValidation['sqref']); + $rangeSet = \explode(' ', $range); foreach ($rangeSet as $range) { $stRange = $this->worksheet->shrinkRangeToFit($range); @@ -36,11 +36,11 @@ class DataValidations $docValidation->setType((string) $dataValidation['type']); $docValidation->setErrorStyle((string) $dataValidation['errorStyle']); $docValidation->setOperator((string) $dataValidation['operator']); - $docValidation->setAllowBlank(filter_var($dataValidation['allowBlank'], FILTER_VALIDATE_BOOLEAN)); + $docValidation->setAllowBlank(\filter_var($dataValidation['allowBlank'], FILTER_VALIDATE_BOOLEAN)); // showDropDown is inverted (works as hideDropDown if true) - $docValidation->setShowDropDown(!filter_var($dataValidation['showDropDown'], FILTER_VALIDATE_BOOLEAN)); - $docValidation->setShowInputMessage(filter_var($dataValidation['showInputMessage'], FILTER_VALIDATE_BOOLEAN)); - $docValidation->setShowErrorMessage(filter_var($dataValidation['showErrorMessage'], FILTER_VALIDATE_BOOLEAN)); + $docValidation->setShowDropDown(!\filter_var($dataValidation['showDropDown'], FILTER_VALIDATE_BOOLEAN)); + $docValidation->setShowInputMessage(\filter_var($dataValidation['showInputMessage'], FILTER_VALIDATE_BOOLEAN)); + $docValidation->setShowErrorMessage(\filter_var($dataValidation['showErrorMessage'], FILTER_VALIDATE_BOOLEAN)); $docValidation->setErrorTitle((string) $dataValidation['errorTitle']); $docValidation->setError((string) $dataValidation['error']); $docValidation->setPromptTitle((string) $dataValidation['promptTitle']); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php index 7d48c79..3f0e65b 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php @@ -20,7 +20,7 @@ class Hyperlinks $this->worksheet = $workSheet; } - public function readHyperlinks(SimpleXMLElement $relsWorksheet): void + public function readHyperlinks(\SimpleXMLElement $relsWorksheet): void { foreach ($relsWorksheet->children(Namespaces::RELATIONSHIPS)->Relationship as $elementx) { $element = Xlsx::getAttributes($elementx); @@ -30,7 +30,7 @@ class Hyperlinks } } - public function setHyperlinks(SimpleXMLElement $worksheetXml): void + public function setHyperlinks(\SimpleXMLElement $worksheetXml): void { foreach ($worksheetXml->children(Namespaces::MAIN)->hyperlink as $hyperlink) { if ($hyperlink !== null) { @@ -39,7 +39,7 @@ class Hyperlinks } } - private function setHyperlink(SimpleXMLElement $hyperlink, Worksheet $worksheet): void + private function setHyperlink(\SimpleXMLElement $hyperlink, Worksheet $worksheet): void { // Link url $linkRel = Xlsx::getAttributes($hyperlink, Namespaces::SCHEMA_OFFICE_DOCUMENT); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/PageSetup.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/PageSetup.php index fb55cb2..53e63f4 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/PageSetup.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/PageSetup.php @@ -11,10 +11,10 @@ class PageSetup extends BaseParserClass /** @var Worksheet */ private $worksheet; - /** @var ?SimpleXMLElement */ + /** @var ?\SimpleXMLElement */ private $worksheetXml; - public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null) + public function __construct(Worksheet $workSheet, ?\SimpleXMLElement $worksheetXml = null) { $this->worksheet = $workSheet; $this->worksheetXml = $worksheetXml; @@ -35,7 +35,7 @@ class PageSetup extends BaseParserClass return $unparsedLoadedData; } - private function margins(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void + private function margins(\SimpleXMLElement $xmlSheet, Worksheet $worksheet): void { if ($xmlSheet->pageMargins) { $docPageMargins = $worksheet->getPageMargins(); @@ -48,7 +48,7 @@ class PageSetup extends BaseParserClass } } - private function pageSetup(SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData): array + private function pageSetup(\SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData): array { if ($xmlSheet->pageSetup) { $docPageSetup = $worksheet->getPageSetup(); @@ -81,7 +81,7 @@ class PageSetup extends BaseParserClass $relAttributes = $xmlSheet->pageSetup->attributes(Namespaces::SCHEMA_OFFICE_DOCUMENT); if (isset($relAttributes['id'])) { $relid = (string) $relAttributes['id']; - if (substr($relid, -2) !== 'ps') { + if (\substr($relid, -2) !== 'ps') { $relid .= 'ps'; } $unparsedLoadedData['sheets'][$worksheet->getCodeName()]['pageSetupRelId'] = $relid; @@ -91,7 +91,7 @@ class PageSetup extends BaseParserClass return $unparsedLoadedData; } - private function headerFooter(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void + private function headerFooter(\SimpleXMLElement $xmlSheet, Worksheet $worksheet): void { if ($xmlSheet->headerFooter) { $docHeaderFooter = $worksheet->getHeaderFooter(); @@ -138,7 +138,7 @@ class PageSetup extends BaseParserClass } } - private function pageBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void + private function pageBreaks(\SimpleXMLElement $xmlSheet, Worksheet $worksheet): void { if ($xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk) { $this->rowBreaks($xmlSheet, $worksheet); @@ -148,7 +148,7 @@ class PageSetup extends BaseParserClass } } - private function rowBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void + private function rowBreaks(\SimpleXMLElement $xmlSheet, Worksheet $worksheet): void { foreach ($xmlSheet->rowBreaks->brk as $brk) { if ($brk['man']) { @@ -157,7 +157,7 @@ class PageSetup extends BaseParserClass } } - private function columnBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void + private function columnBreaks(\SimpleXMLElement $xmlSheet, Worksheet $worksheet): void { foreach ($xmlSheet->colBreaks->brk as $brk) { if ($brk['man']) { diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Properties.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Properties.php index 72addff..ef0d680 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Properties.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Properties.php @@ -24,15 +24,15 @@ class Properties /** * @param mixed $obj */ - private static function nullOrSimple($obj): ?SimpleXMLElement + private static function nullOrSimple($obj): ?\SimpleXMLElement { - return ($obj instanceof SimpleXMLElement) ? $obj : null; + return ($obj instanceof \SimpleXMLElement) ? $obj : null; } - private function extractPropertyData(string $propertyData): ?SimpleXMLElement + private function extractPropertyData(string $propertyData): ?\SimpleXMLElement { // okay to omit namespace because everything will be processed by xpath - $obj = simplexml_load_string( + $obj = \simplexml_load_string( $this->securityScanner->scan($propertyData), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions() @@ -45,7 +45,7 @@ class Properties { $xmlCore = $this->extractPropertyData($propertyData); - if (is_object($xmlCore)) { + if (\is_object($xmlCore)) { $xmlCore->registerXPathNamespace('dc', Namespaces::DC_ELEMENTS); $xmlCore->registerXPathNamespace('dcterms', Namespaces::DC_TERMS); $xmlCore->registerXPathNamespace('cp', Namespaces::CORE_PROPERTIES2); @@ -66,7 +66,7 @@ class Properties { $xmlCore = $this->extractPropertyData($propertyData); - if (is_object($xmlCore)) { + if (\is_object($xmlCore)) { if (isset($xmlCore->Company)) { $this->docProps->setCompany((string) $xmlCore->Company); } @@ -80,9 +80,9 @@ class Properties { $xmlCore = $this->extractPropertyData($propertyData); - if (is_object($xmlCore)) { + if (\is_object($xmlCore)) { foreach ($xmlCore as $xmlProperty) { - /** @var SimpleXMLElement $xmlProperty */ + /** @var \SimpleXMLElement $xmlProperty */ $cellDataOfficeAttributes = $xmlProperty->attributes(); if (isset($cellDataOfficeAttributes['name'])) { $propertyName = (string) $cellDataOfficeAttributes['name']; @@ -102,8 +102,8 @@ class Properties * @param null|array|false $array * @param mixed $key */ - private static function getArrayItem($array, $key = 0): ?SimpleXMLElement + private static function getArrayItem($array, $key = 0): ?\SimpleXMLElement { - return is_array($array) ? ($array[$key] ?? null) : null; + return \is_array($array) ? ($array[$key] ?? null) : null; } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php index 5a49644..543daa7 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php @@ -10,10 +10,10 @@ class SheetViewOptions extends BaseParserClass /** @var Worksheet */ private $worksheet; - /** @var ?SimpleXMLElement */ + /** @var ?\SimpleXMLElement */ private $worksheetXml; - public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null) + public function __construct(Worksheet $workSheet, ?\SimpleXMLElement $worksheetXml = null) { $this->worksheet = $workSheet; $this->worksheetXml = $worksheetXml; @@ -42,14 +42,14 @@ class SheetViewOptions extends BaseParserClass } } - private function tabColor(SimpleXMLElement $sheetPr, Styles $styleReader): void + private function tabColor(\SimpleXMLElement $sheetPr, Styles $styleReader): void { if (isset($sheetPr->tabColor)) { $this->worksheet->getTabColor()->setARGB($styleReader->readColor($sheetPr->tabColor)); } } - private function codeName(SimpleXMLElement $sheetPrx): void + private function codeName(\SimpleXMLElement $sheetPrx): void { $sheetPr = $sheetPrx->attributes() ?? []; if (isset($sheetPr['codeName'])) { @@ -57,7 +57,7 @@ class SheetViewOptions extends BaseParserClass } } - private function outlines(SimpleXMLElement $sheetPr): void + private function outlines(\SimpleXMLElement $sheetPr): void { if (isset($sheetPr->outlinePr)) { $attr = $sheetPr->outlinePr->attributes() ?? []; @@ -81,7 +81,7 @@ class SheetViewOptions extends BaseParserClass } } - private function pageSetup(SimpleXMLElement $sheetPr): void + private function pageSetup(\SimpleXMLElement $sheetPr): void { if (isset($sheetPr->pageSetUpPr)) { $attr = $sheetPr->pageSetUpPr->attributes() ?? []; @@ -96,7 +96,7 @@ class SheetViewOptions extends BaseParserClass } } - private function sheetFormat(SimpleXMLElement $sheetFormatPrx): void + private function sheetFormat(\SimpleXMLElement $sheetFormatPrx): void { $sheetFormatPr = $sheetFormatPrx->attributes() ?? []; if ( @@ -121,7 +121,7 @@ class SheetViewOptions extends BaseParserClass } } - private function printOptions(SimpleXMLElement $printOptionsx): void + private function printOptions(\SimpleXMLElement $printOptionsx): void { $printOptions = $printOptionsx->attributes() ?? []; if (isset($printOptions['gridLinesSet']) && self::boolean((string) $printOptions['gridLinesSet'])) { diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViews.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViews.php index b2bc99f..9d572fa 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViews.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/SheetViews.php @@ -9,16 +9,16 @@ use SimpleXMLElement; class SheetViews extends BaseParserClass { - /** @var SimpleXMLElement */ + /** @var \SimpleXMLElement */ private $sheetViewXml; - /** @var SimpleXMLElement */ + /** @var \SimpleXMLElement */ private $sheetViewAttributes; /** @var Worksheet */ private $worksheet; - public function __construct(SimpleXMLElement $sheetViewXml, Worksheet $workSheet) + public function __construct(\SimpleXMLElement $sheetViewXml, Worksheet $workSheet) { $this->sheetViewXml = $sheetViewXml; $this->sheetViewAttributes = Xlsx::testSimpleXml($sheetViewXml->attributes()); @@ -148,7 +148,7 @@ class SheetViews extends BaseParserClass $attributes = $this->sheetViewXml->selection->attributes(); if ($attributes !== null) { $sqref = (string) $attributes->sqref; - $sqref = explode(' ', $sqref); + $sqref = \explode(' ', $sqref); $sqref = $sqref[0]; $this->worksheet->setSelectedCells($sqref); } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Styles.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Styles.php index 5b089fa..978468e 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Styles.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/Styles.php @@ -33,7 +33,7 @@ class Styles extends BaseParserClass /** @var array */ private $cellStyles = []; - /** @var SimpleXMLElement */ + /** @var \SimpleXMLElement */ private $styleXml; /** @var string */ @@ -59,12 +59,12 @@ class Styles extends BaseParserClass return (bool) $value; } - private function getStyleAttributes(SimpleXMLElement $value): SimpleXMLElement + private function getStyleAttributes(\SimpleXMLElement $value): \SimpleXMLElement { $attr = null; if (self::castBool($value)) { $attr = $value->attributes(''); - if ($attr === null || count($attr) === 0) { + if ($attr === null || \count($attr) === 0) { $attr = $value->attributes($this->namespace); } } @@ -72,7 +72,7 @@ class Styles extends BaseParserClass return Xlsx::testSimpleXml($attr); } - public function setStyleXml(SimpleXmlElement $styleXml): void + public function setStyleXml(\SimpleXmlElement $styleXml): void { $this->styleXml = $styleXml; } @@ -89,7 +89,7 @@ class Styles extends BaseParserClass $this->cellStyles = $cellStyles; } - public function readFontStyle(Font $fontStyle, SimpleXMLElement $fontStyleXml): void + public function readFontStyle(Font $fontStyle, \SimpleXMLElement $fontStyleXml): void { if (isset($fontStyleXml->name)) { $attr = $this->getStyleAttributes($fontStyleXml->name); @@ -128,7 +128,7 @@ class Styles extends BaseParserClass if (isset($fontStyleXml->vertAlign)) { $attr = $this->getStyleAttributes($fontStyleXml->vertAlign); if (isset($attr['val'])) { - $verticalAlign = strtolower((string) $attr['val']); + $verticalAlign = \strtolower((string) $attr['val']); if ($verticalAlign === 'superscript') { $fontStyle->setSuperscript(true); } elseif ($verticalAlign === 'subscript') { @@ -138,7 +138,7 @@ class Styles extends BaseParserClass } } - private function readNumberFormat(NumberFormat $numfmtStyle, SimpleXMLElement $numfmtStyleXml): void + private function readNumberFormat(NumberFormat $numfmtStyle, \SimpleXMLElement $numfmtStyleXml): void { if ((string) $numfmtStyleXml['formatCode'] !== '') { $numfmtStyle->setFormatCode(self::formatGeneral((string) $numfmtStyleXml['formatCode'])); @@ -151,10 +151,10 @@ class Styles extends BaseParserClass } } - public function readFillStyle(Fill $fillStyle, SimpleXMLElement $fillStyleXml): void + public function readFillStyle(Fill $fillStyle, \SimpleXMLElement $fillStyleXml): void { if ($fillStyleXml->gradientFill) { - /** @var SimpleXMLElement $gradientFill */ + /** @var \SimpleXMLElement $gradientFill */ $gradientFill = $fillStyleXml->gradientFill[0]; $attr = $this->getStyleAttributes($gradientFill); if (!empty($attr['type'])) { @@ -188,7 +188,7 @@ class Styles extends BaseParserClass } } - public function readBorderStyle(Borders $borderStyle, SimpleXMLElement $borderStyleXml): void + public function readBorderStyle(Borders $borderStyle, \SimpleXMLElement $borderStyleXml): void { $diagonalUp = $this->getAttribute($borderStyleXml, 'diagonalUp'); $diagonalUp = self::boolean($diagonalUp); @@ -213,7 +213,7 @@ class Styles extends BaseParserClass $this->readBorder($borderStyle->getDiagonal(), $borderStyleXml->diagonal); } - private function getAttribute(SimpleXMLElement $xml, string $attribute): string + private function getAttribute(\SimpleXMLElement $xml, string $attribute): string { $style = ''; if ((string) $xml[$attribute] !== '') { @@ -228,7 +228,7 @@ class Styles extends BaseParserClass return $style; } - private function readBorder(Border $border, SimpleXMLElement $borderXml): void + private function readBorder(Border $border, \SimpleXMLElement $borderXml): void { $style = $this->getAttribute($borderXml, 'style'); if ($style !== '') { @@ -239,7 +239,7 @@ class Styles extends BaseParserClass } } - public function readAlignmentStyle(Alignment $alignment, SimpleXMLElement $alignmentXml): void + public function readAlignmentStyle(Alignment $alignment, \SimpleXMLElement $alignmentXml): void { $horizontal = $this->getAttribute($alignmentXml, 'horizontal'); $alignment->setHorizontal($horizontal); @@ -257,9 +257,9 @@ class Styles extends BaseParserClass $shrinkToFit = $this->getAttribute($alignmentXml, 'shrinkToFit'); $alignment->setShrinkToFit(self::boolean((string) $shrinkToFit)); $indent = (int) $this->getAttribute($alignmentXml, 'indent'); - $alignment->setIndent(max($indent, 0)); + $alignment->setIndent(\max($indent, 0)); $readingOrder = (int) $this->getAttribute($alignmentXml, 'readingOrder'); - $alignment->setReadOrder(max($readingOrder, 0)); + $alignment->setReadOrder(\max($readingOrder, 0)); } private static function formatGeneral(string $formatString): string @@ -274,11 +274,11 @@ class Styles extends BaseParserClass /** * Read style. * - * @param SimpleXMLElement|stdClass $style + * @param \SimpleXMLElement|\stdClass $style */ public function readStyle(Style $docStyle, $style): void { - if ($style instanceof SimpleXMLElement) { + if ($style instanceof \SimpleXMLElement) { $this->readNumberFormat($docStyle->getNumberFormat(), $style->numFmt); } else { $docStyle->getNumberFormat()->setFormatCode(self::formatGeneral((string) $style->numFmt)); @@ -315,7 +315,7 @@ class Styles extends BaseParserClass /** * Read protection locked attribute. */ - public function readProtectionLocked(Style $docStyle, SimpleXMLElement $style): void + public function readProtectionLocked(Style $docStyle, \SimpleXMLElement $style): void { $locked = ''; if ((string) $style['locked'] !== '') { @@ -338,7 +338,7 @@ class Styles extends BaseParserClass /** * Read protection hidden attribute. */ - public function readProtectionHidden(Style $docStyle, SimpleXMLElement $style): void + public function readProtectionHidden(Style $docStyle, \SimpleXMLElement $style): void { $hidden = ''; if ((string) $style['hidden'] !== '') { @@ -358,7 +358,7 @@ class Styles extends BaseParserClass } } - public function readColor(SimpleXMLElement $color, bool $background = false): string + public function readColor(\SimpleXMLElement $color, bool $background = false): string { $attr = $this->getStyleAttributes($color); if (isset($attr['rgb'])) { @@ -366,7 +366,7 @@ class Styles extends BaseParserClass } if (isset($attr['indexed'])) { $indexedColor = (int) $attr['indexed']; - if ($indexedColor >= count($this->workbookPalette)) { + if ($indexedColor >= \count($this->workbookPalette)) { return Color::indexedColor($indexedColor - 7, $background)->getARGB() ?? ''; } @@ -429,10 +429,10 @@ class Styles extends BaseParserClass * * @param mixed $array (usually array, in theory can be false) * - * @return stdClass + * @return \stdClass */ private static function getArrayItem($array, int $key = 0) { - return is_array($array) ? ($array[$key] ?? null) : null; + return \is_array($array) ? ($array[$key] ?? null) : null; } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/TableReader.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/TableReader.php index cf89e99..1d50cf9 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/TableReader.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/TableReader.php @@ -15,11 +15,11 @@ class TableReader private $worksheet; /** - * @var SimpleXMLElement + * @var \SimpleXMLElement */ private $tableXml; - public function __construct(Worksheet $workSheet, SimpleXMLElement $tableXml) + public function __construct(Worksheet $workSheet, \SimpleXMLElement $tableXml) { $this->worksheet = $workSheet; $this->tableXml = $tableXml; @@ -31,8 +31,8 @@ class TableReader public function load(): void { // Remove all "$" in the table range - $tableRange = (string) preg_replace('/\$/', '', $this->tableXml['ref'] ?? ''); - if (strpos($tableRange, ':') !== false) { + $tableRange = (string) \preg_replace('/\$/', '', $this->tableXml['ref'] ?? ''); + if (\strpos($tableRange, ':') !== false) { $this->readTable($tableRange, $this->tableXml); } } @@ -40,7 +40,7 @@ class TableReader /** * Read Table from xml. */ - private function readTable(string $tableRange, SimpleXMLElement $tableXml): void + private function readTable(string $tableRange, \SimpleXMLElement $tableXml): void { $table = new Table($tableRange); $table->setName((string) $tableXml['displayName']); @@ -58,7 +58,7 @@ class TableReader /** * Reads TableAutoFilter from xml. */ - private function readTableAutoFilter(Table $table, SimpleXMLElement $autoFilterXml): void + private function readTableAutoFilter(Table $table, \SimpleXMLElement $autoFilterXml): void { if ($autoFilterXml->filterColumn === null) { $table->setAllowFilter(false); @@ -75,7 +75,7 @@ class TableReader /** * Reads TableColumns from xml. */ - private function readTableColumns(Table $table, SimpleXMLElement $tableColumnsXml): void + private function readTableColumns(Table $table, \SimpleXMLElement $tableColumnsXml): void { $offset = 0; foreach ($tableColumnsXml->tableColumn as $tableColumn) { @@ -100,7 +100,7 @@ class TableReader /** * Reads TableStyle from xml. */ - private function readTableStyle(Table $table, SimpleXMLElement $tableStyleInfoXml): void + private function readTableStyle(Table $table, \SimpleXMLElement $tableStyleInfoXml): void { $tableStyle = new TableStyle(); $tableStyle->setTheme((string) $tableStyleInfoXml['name']); diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php index 4743afb..c77658f 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php @@ -20,7 +20,7 @@ class WorkbookView /** * @param mixed $mainNS */ - public function viewSettings(SimpleXMLElement $xmlWorkbook, $mainNS, array $mapSheetId, bool $readDataOnly): void + public function viewSettings(\SimpleXMLElement $xmlWorkbook, $mainNS, array $mapSheetId, bool $readDataOnly): void { if ($this->spreadsheet->getSheetCount() == 0) { $this->spreadsheet->createSheet(); @@ -52,14 +52,14 @@ class WorkbookView /** * @param mixed $value */ - public static function testSimpleXml($value): SimpleXMLElement + public static function testSimpleXml($value): \SimpleXMLElement { - return ($value instanceof SimpleXMLElement) + return ($value instanceof \SimpleXMLElement) ? $value - : new SimpleXMLElement(''); + : new \SimpleXMLElement(''); } - public static function getAttributes(?SimpleXMLElement $value, string $ns = ''): SimpleXMLElement + public static function getAttributes(?\SimpleXMLElement $value, string $ns = ''): \SimpleXMLElement { return self::testSimpleXml($value === null ? $value : $value->attributes($ns)); } @@ -87,7 +87,7 @@ class WorkbookView return (bool) $xsdBoolean; } - private function horizontalScroll(SimpleXMLElement $workbookViewAttributes): void + private function horizontalScroll(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->showHorizontalScroll)) { $showHorizontalScroll = (string) $workbookViewAttributes->showHorizontalScroll; @@ -95,7 +95,7 @@ class WorkbookView } } - private function verticalScroll(SimpleXMLElement $workbookViewAttributes): void + private function verticalScroll(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->showVerticalScroll)) { $showVerticalScroll = (string) $workbookViewAttributes->showVerticalScroll; @@ -103,7 +103,7 @@ class WorkbookView } } - private function sheetTabs(SimpleXMLElement $workbookViewAttributes): void + private function sheetTabs(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->showSheetTabs)) { $showSheetTabs = (string) $workbookViewAttributes->showSheetTabs; @@ -111,7 +111,7 @@ class WorkbookView } } - private function minimized(SimpleXMLElement $workbookViewAttributes): void + private function minimized(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->minimized)) { $minimized = (string) $workbookViewAttributes->minimized; @@ -119,7 +119,7 @@ class WorkbookView } } - private function autoFilterDateGrouping(SimpleXMLElement $workbookViewAttributes): void + private function autoFilterDateGrouping(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->autoFilterDateGrouping)) { $autoFilterDateGrouping = (string) $workbookViewAttributes->autoFilterDateGrouping; @@ -127,7 +127,7 @@ class WorkbookView } } - private function firstSheet(SimpleXMLElement $workbookViewAttributes): void + private function firstSheet(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->firstSheet)) { $firstSheet = (string) $workbookViewAttributes->firstSheet; @@ -135,7 +135,7 @@ class WorkbookView } } - private function visibility(SimpleXMLElement $workbookViewAttributes): void + private function visibility(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->visibility)) { $visibility = (string) $workbookViewAttributes->visibility; @@ -143,7 +143,7 @@ class WorkbookView } } - private function tabRatio(SimpleXMLElement $workbookViewAttributes): void + private function tabRatio(\SimpleXMLElement $workbookViewAttributes): void { if (isset($workbookViewAttributes->tabRatio)) { $tabRatio = (string) $workbookViewAttributes->tabRatio; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml.php b/PhpOffice/PhpSpreadsheet/Reader/Xml.php index 565a5af..358344c 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml.php @@ -46,7 +46,7 @@ class Xml extends BaseReader public static function xmlMappings(): array { - return array_merge( + return \array_merge( Style\Fill::FILL_MAPPINGS, Style\Border::BORDER_MAPPINGS ); @@ -73,7 +73,7 @@ class Xml extends BaseReader ]; // Open file - $data = file_get_contents($filename); + $data = \file_get_contents($filename); // Why? //$data = str_replace("'", '"', $data); // fix headers with single quote @@ -81,7 +81,7 @@ class Xml extends BaseReader $valid = true; foreach ($signature as $match) { // every part of the signature must be present - if (strpos($data, $match) === false) { + if (\strpos($data, $match) === false) { $valid = false; break; @@ -89,11 +89,11 @@ class Xml extends BaseReader } // Retrieve charset encoding - if (preg_match('//m', $data, $matches)) { - $charSet = strtoupper($matches[1]); - if (preg_match('/^ISO-8859-\d[\dL]?$/i', $charSet) === 1) { + if (\preg_match('//m', $data, $matches)) { + $charSet = \strtoupper($matches[1]); + if (\preg_match('/^ISO-8859-\d[\dL]?$/i', $charSet) === 1) { $data = StringHelper::convertEncoding($data, 'UTF-8', $charSet); - $data = (string) preg_replace('/()/um', '$1' . 'UTF-8' . '$2', $data, 1); + $data = (string) \preg_replace('/()/um', '$1' . 'UTF-8' . '$2', $data, 1); } } $this->fileContents = $data; @@ -106,13 +106,13 @@ class Xml extends BaseReader * * @param string $filename * - * @return false|SimpleXMLElement + * @return false|\SimpleXMLElement */ public function trySimpleXMLLoadString($filename) { try { - $xml = simplexml_load_string( - $this->securityScanner->scan($this->fileContents ?: file_get_contents($filename)), + $xml = \simplexml_load_string( + $this->securityScanner->scan($this->fileContents ?: \file_get_contents($filename)), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions() ); @@ -205,7 +205,7 @@ class Xml extends BaseReader foreach ($rowData->Cell as $cell) { if (isset($cell->Data)) { - $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + $tmpInfo['lastColumnIndex'] = \max($tmpInfo['lastColumnIndex'], $columnIndex); $rowHasData = true; } @@ -215,7 +215,7 @@ class Xml extends BaseReader ++$rowIndex; if ($rowHasData) { - $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + $tmpInfo['totalRows'] = \max($tmpInfo['totalRows'], $rowIndex); } } } @@ -271,14 +271,14 @@ class Xml extends BaseReader $worksheetID = 0; $xml_ss = $xml->children($namespaces['ss']); - /** @var null|SimpleXMLElement $worksheetx */ + /** @var null|\SimpleXMLElement $worksheetx */ foreach ($xml_ss->Worksheet as $worksheetx) { - $worksheet = $worksheetx ?? new SimpleXMLElement(''); + $worksheet = $worksheetx ?? new \SimpleXMLElement(''); $worksheet_ss = self::getAttributes($worksheet, $namespaces['ss']); if ( isset($this->loadSheetsOnly, $worksheet_ss['Name']) && - (!in_array($worksheet_ss['Name'], /** @scrutinizer ignore-type */ $this->loadSheetsOnly)) + (!\in_array($worksheet_ss['Name'], /** @scrutinizer ignore-type */ $this->loadSheetsOnly)) ) { continue; } @@ -303,7 +303,7 @@ class Xml extends BaseReader $definedValue = (string) $definedName_ss['RefersTo']; $convertedValue = AddressHelper::convertFormulaToA1($definedValue); if ($convertedValue[0] === '=') { - $convertedValue = substr($convertedValue, 1); + $convertedValue = \substr($convertedValue, 1); } $spreadsheet->addDefinedName(DefinedName::createInstance($name, $spreadsheet->getActiveSheet(), $convertedValue, true)); } @@ -398,7 +398,7 @@ class Xml extends BaseReader case 'Number': $type = DataType::TYPE_NUMERIC; $cellValue = (float) $cellValue; - if (floor($cellValue) == $cellValue) { + if (\floor($cellValue) == $cellValue) { $cellValue = (int) $cellValue; } @@ -410,7 +410,7 @@ class Xml extends BaseReader break; case 'DateTime': $type = DataType::TYPE_NUMERIC; - $dateTime = new DateTime($cellValue, new DateTimeZone('UTC')); + $dateTime = new \DateTime($cellValue, new \DateTimeZone('UTC')); $cellValue = Date::PHPToExcel($dateTime); break; @@ -485,7 +485,7 @@ class Xml extends BaseReader $definedValue = (string) $definedName_ss['RefersTo']; $convertedValue = AddressHelper::convertFormulaToA1($definedValue); if ($convertedValue[0] === '=') { - $convertedValue = substr($convertedValue, 1); + $convertedValue = \substr($convertedValue, 1); } $spreadsheet->addDefinedName(DefinedName::createInstance($name, $activeWorksheet, $convertedValue)); } @@ -496,7 +496,7 @@ class Xml extends BaseReader } protected function parseCellComment( - SimpleXMLElement $comment, + \SimpleXMLElement $comment, array $namespaces, Spreadsheet $spreadsheet, string $columnID, @@ -509,7 +509,7 @@ class Xml extends BaseReader } $node = $comment->Data->asXML(); - $annotation = strip_tags((string) $node); + $annotation = \strip_tags((string) $node); $spreadsheet->getActiveSheet()->getComment($columnID . $rowID) ->setAuthor($author) ->setText($this->parseRichText($annotation)); @@ -524,10 +524,10 @@ class Xml extends BaseReader return $value; } - private static function getAttributes(?SimpleXMLElement $simple, string $node): SimpleXMLElement + private static function getAttributes(?\SimpleXMLElement $simple, string $node): \SimpleXMLElement { return ($simple === null) - ? new SimpleXMLElement('') - : ($simple->attributes($node) ?? new SimpleXMLElement('')); + ? new \SimpleXMLElement('') + : ($simple->attributes($node) ?? new \SimpleXMLElement('')); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/PageSettings.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/PageSettings.php index a12986c..04581af 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/PageSettings.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/PageSettings.php @@ -10,11 +10,11 @@ use stdClass; class PageSettings { /** - * @var stdClass + * @var \stdClass */ private $printSettings; - public function __construct(SimpleXMLElement $xmlX, array $namespaces) + public function __construct(\SimpleXMLElement $xmlX, array $namespaces) { $printSettings = $this->pageSetup($xmlX, $namespaces, $this->getPrintDefaults()); $this->printSettings = $this->printSetup($xmlX, $printSettings); @@ -38,7 +38,7 @@ class PageSettings ->setFooter($this->printSettings->footerMargin); } - private function getPrintDefaults(): stdClass + private function getPrintDefaults(): \stdClass { return (object) [ 'paperSize' => 9, @@ -56,7 +56,7 @@ class PageSettings ]; } - private function pageSetup(SimpleXMLElement $xmlX, array $namespaces, stdClass $printDefaults): stdClass + private function pageSetup(\SimpleXMLElement $xmlX, array $namespaces, \stdClass $printDefaults): \stdClass { if (isset($xmlX->WorksheetOptions->PageSetup)) { foreach ($xmlX->WorksheetOptions->PageSetup as $pageSetupData) { @@ -92,7 +92,7 @@ class PageSettings return $printDefaults; } - private function printSetup(SimpleXMLElement $xmlX, stdClass $printDefaults): stdClass + private function printSetup(\SimpleXMLElement $xmlX, \stdClass $printDefaults): \stdClass { if (isset($xmlX->WorksheetOptions->Print)) { foreach ($xmlX->WorksheetOptions->Print as $printData) { @@ -118,14 +118,14 @@ class PageSettings return $printDefaults; } - private function setLayout(stdClass $printDefaults, SimpleXMLElement $pageSetupAttributes): void + private function setLayout(\stdClass $printDefaults, \SimpleXMLElement $pageSetupAttributes): void { - $printDefaults->orientation = (string) strtolower($pageSetupAttributes->Orientation ?? '') ?: PageSetup::ORIENTATION_PORTRAIT; + $printDefaults->orientation = (string) \strtolower($pageSetupAttributes->Orientation ?? '') ?: PageSetup::ORIENTATION_PORTRAIT; $printDefaults->horizontalCentered = (bool) $pageSetupAttributes->CenterHorizontal ?: false; $printDefaults->verticalCentered = (bool) $pageSetupAttributes->CenterVertical ?: false; } - private function setMargins(stdClass $printDefaults, SimpleXMLElement $pageSetupAttributes): void + private function setMargins(\stdClass $printDefaults, \SimpleXMLElement $pageSetupAttributes): void { $printDefaults->leftMargin = (float) $pageSetupAttributes->Left ?: 1.0; $printDefaults->rightMargin = (float) $pageSetupAttributes->Right ?: 1.0; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Properties.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Properties.php index 9e10526..ff6edd4 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Properties.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Properties.php @@ -18,13 +18,13 @@ class Properties $this->spreadsheet = $spreadsheet; } - public function readProperties(SimpleXMLElement $xml, array $namespaces): void + public function readProperties(\SimpleXMLElement $xml, array $namespaces): void { $this->readStandardProperties($xml); $this->readCustomProperties($xml, $namespaces); } - protected function readStandardProperties(SimpleXMLElement $xml): void + protected function readStandardProperties(\SimpleXMLElement $xml): void { if (isset($xml->DocumentProperties[0])) { $docProps = $this->spreadsheet->getProperties(); @@ -37,14 +37,14 @@ class Properties } } - protected function readCustomProperties(SimpleXMLElement $xml, array $namespaces): void + protected function readCustomProperties(\SimpleXMLElement $xml, array $namespaces): void { if (isset($xml->CustomDocumentProperties)) { $docProps = $this->spreadsheet->getProperties(); foreach ($xml->CustomDocumentProperties[0] as $propertyName => $propertyValue) { $propertyAttributes = self::getAttributes($propertyValue, $namespaces['dt']); - $propertyName = (string) preg_replace_callback('/_x([0-9a-f]{4})_/i', [$this, 'hex2str'], $propertyName); + $propertyName = (string) \preg_replace_callback('/_x([0-9a-f]{4})_/i', [$this, 'hex2str'], $propertyName); $this->processCustomProperty($docProps, $propertyName, $propertyValue, $propertyAttributes); } @@ -107,15 +107,15 @@ class Properties protected function processCustomProperty( DocumentProperties $docProps, string $propertyName, - ?SimpleXMLElement $propertyValue, - SimpleXMLElement $propertyAttributes + ?\SimpleXMLElement $propertyValue, + \SimpleXMLElement $propertyAttributes ): void { $propertyType = DocumentProperties::PROPERTY_TYPE_UNKNOWN; switch ((string) $propertyAttributes) { case 'string': $propertyType = DocumentProperties::PROPERTY_TYPE_STRING; - $propertyValue = trim((string) $propertyValue); + $propertyValue = \trim((string) $propertyValue); break; case 'boolean': @@ -135,7 +135,7 @@ class Properties break; case 'dateTime.tz': $propertyType = DocumentProperties::PROPERTY_TYPE_DATE; - $propertyValue = trim((string) $propertyValue); + $propertyValue = \trim((string) $propertyValue); break; } @@ -145,13 +145,13 @@ class Properties protected function hex2str(array $hex): string { - return mb_chr((int) hexdec($hex[1]), 'UTF-8'); + return \mb_chr((int) \hexdec($hex[1]), 'UTF-8'); } - private static function getAttributes(?SimpleXMLElement $simple, string $node): SimpleXMLElement + private static function getAttributes(?\SimpleXMLElement $simple, string $node): \SimpleXMLElement { return ($simple === null) - ? new SimpleXMLElement('') - : ($simple->attributes($node) ?? new SimpleXMLElement('')); + ? new \SimpleXMLElement('') + : ($simple->attributes($node) ?? new \SimpleXMLElement('')); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style.php index 0e3cd16..3fb5b9c 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style.php @@ -13,7 +13,7 @@ class Style */ protected $styles = []; - public function parseStyles(SimpleXMLElement $xml, array $namespaces): array + public function parseStyles(\SimpleXMLElement $xml, array $namespaces): array { if (!isset($xml->Styles)) { return []; @@ -33,7 +33,7 @@ class Style $alignment = $border = $font = $fill = $numberFormat = []; foreach ($style as $styleType => $styleDatax) { - $styleData = $styleDatax ?? new SimpleXMLElement(''); + $styleData = $styleDatax ?? new \SimpleXMLElement(''); $styleAttributes = $styleData->attributes($namespaces['ss']); switch ($styleType) { @@ -68,16 +68,16 @@ class Style } } - $this->styles[$styleID] = array_merge($alignment, $border, $font, $fill, $numberFormat); + $this->styles[$styleID] = \array_merge($alignment, $border, $font, $fill, $numberFormat); } return $this->styles; } - protected static function getAttributes(?SimpleXMLElement $simple, string $node): SimpleXMLElement + protected static function getAttributes(?\SimpleXMLElement $simple, string $node): \SimpleXMLElement { return ($simple === null) - ? new SimpleXMLElement('') - : ($simple->attributes($node) ?? new SimpleXMLElement('')); + ? new \SimpleXMLElement('') + : ($simple->attributes($node) ?? new \SimpleXMLElement('')); } } diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Alignment.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Alignment.php index d136354..3feecdf 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Alignment.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Alignment.php @@ -23,7 +23,7 @@ class Alignment extends StyleBase AlignmentStyles::HORIZONTAL_JUSTIFY, ]; - public function parseStyle(SimpleXMLElement $styleAttributes): array + public function parseStyle(\SimpleXMLElement $styleAttributes): array { $style = []; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Border.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Border.php index 8aefd9c..21365b5 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Border.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Border.php @@ -41,7 +41,7 @@ class Border extends StyleBase ], ]; - public function parseStyle(SimpleXMLElement $styleData, array $namespaces): array + public function parseStyle(\SimpleXMLElement $styleData, array $namespaces): array { $style = []; @@ -51,7 +51,7 @@ class Border extends StyleBase $borderAttributes = self::getAttributes($borderStyle, $namespaces['ss']); $thisBorder = []; $styleType = (string) $borderAttributes->Weight; - $styleType .= strtolower((string) $borderAttributes->LineStyle); + $styleType .= \strtolower((string) $borderAttributes->LineStyle); $thisBorder['borderStyle'] = self::BORDER_MAPPINGS['borderStyle'][$styleType] ?? BorderStyle::BORDER_NONE; foreach ($borderAttributes as $borderStyleKey => $borderStyleValuex) { @@ -63,7 +63,7 @@ class Border extends StyleBase break; case 'Color': - $borderColour = substr($borderStyleValue, 1); + $borderColour = \substr($borderStyleValue, 1); $thisBorder['color']['rgb'] = $borderColour; break; @@ -83,9 +83,9 @@ class Border extends StyleBase protected function parsePosition(string $borderStyleValue, string $diagonalDirection): array { - $borderStyleValue = strtolower($borderStyleValue); + $borderStyleValue = \strtolower($borderStyleValue); - if (in_array($borderStyleValue, self::BORDER_POSITIONS)) { + if (\in_array($borderStyleValue, self::BORDER_POSITIONS)) { $borderPosition = $borderStyleValue; } elseif ($borderStyleValue === 'diagonalleft') { $diagonalDirection = $diagonalDirection ? Borders::DIAGONAL_BOTH : Borders::DIAGONAL_DOWN; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Fill.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Fill.php index 9a61215..41fb563 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Fill.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Fill.php @@ -33,7 +33,7 @@ class Fill extends StyleBase ], ]; - public function parseStyle(SimpleXMLElement $styleAttributes): array + public function parseStyle(\SimpleXMLElement $styleAttributes): array { $style = []; @@ -41,16 +41,16 @@ class Fill extends StyleBase $styleAttributeValue = (string) $styleAttributeValuex; switch ($styleAttributeKey) { case 'Color': - $style['fill']['endColor']['rgb'] = substr($styleAttributeValue, 1); - $style['fill']['startColor']['rgb'] = substr($styleAttributeValue, 1); + $style['fill']['endColor']['rgb'] = \substr($styleAttributeValue, 1); + $style['fill']['startColor']['rgb'] = \substr($styleAttributeValue, 1); break; case 'PatternColor': - $style['fill']['startColor']['rgb'] = substr($styleAttributeValue, 1); + $style['fill']['startColor']['rgb'] = \substr($styleAttributeValue, 1); break; case 'Pattern': - $lcStyleAttributeValue = strtolower((string) $styleAttributeValue); + $lcStyleAttributeValue = \strtolower((string) $styleAttributeValue); $style['fill']['fillType'] = self::FILL_MAPPINGS['fillType'][$lcStyleAttributeValue] ?? FillStyles::FILL_NONE; diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Font.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Font.php index 16ab44d..5f6ecb6 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Font.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/Font.php @@ -36,7 +36,7 @@ class Font extends StyleBase return $style; } - public function parseStyle(SimpleXMLElement $styleAttributes): array + public function parseStyle(\SimpleXMLElement $styleAttributes): array { $style = []; @@ -52,7 +52,7 @@ class Font extends StyleBase break; case 'Color': - $style['font']['color']['rgb'] = substr($styleAttributeValue, 1); + $style['font']['color']['rgb'] = \substr($styleAttributeValue, 1); break; case 'Bold': diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php index a31aa9e..e107b2e 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php @@ -6,7 +6,7 @@ use SimpleXMLElement; class NumberFormat extends StyleBase { - public function parseStyle(SimpleXMLElement $styleAttributes): array + public function parseStyle(\SimpleXMLElement $styleAttributes): array { $style = []; @@ -14,7 +14,7 @@ class NumberFormat extends StyleBase $toFormats = ['-', ' ']; foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { - $styleAttributeValue = str_replace($fromFormats, $toFormats, $styleAttributeValue); + $styleAttributeValue = \str_replace($fromFormats, $toFormats, $styleAttributeValue); switch ($styleAttributeValue) { case 'Short Date': diff --git a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php index fc9ace8..c61e143 100755 --- a/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php +++ b/PhpOffice/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php @@ -10,9 +10,9 @@ abstract class StyleBase { $returnValue = false; - $styleAttributeValue = strtolower($styleAttributeValue); + $styleAttributeValue = \strtolower($styleAttributeValue); foreach ($styleList as $style) { - if ($styleAttributeValue == strtolower($style)) { + if ($styleAttributeValue == \strtolower($style)) { $styleAttributeValue = $style; $returnValue = true; @@ -23,10 +23,10 @@ abstract class StyleBase return $returnValue; } - protected static function getAttributes(?SimpleXMLElement $simple, string $node): SimpleXMLElement + protected static function getAttributes(?\SimpleXMLElement $simple, string $node): \SimpleXMLElement { return ($simple === null) - ? new SimpleXMLElement('') - : ($simple->attributes($node) ?? new SimpleXMLElement('')); + ? new \SimpleXMLElement('') + : ($simple->attributes($node) ?? new \SimpleXMLElement('')); } } diff --git a/PhpOffice/PhpSpreadsheet/ReferenceHelper.php b/PhpOffice/PhpSpreadsheet/ReferenceHelper.php index b88199f..45f5b64 100755 --- a/PhpOffice/PhpSpreadsheet/ReferenceHelper.php +++ b/PhpOffice/PhpSpreadsheet/ReferenceHelper.php @@ -63,7 +63,7 @@ class ReferenceHelper */ public static function columnSort($a, $b) { - return strcasecmp(strlen($a) . $a, strlen($b) . $b); + return \strcasecmp(\strlen($a) . $a, \strlen($b) . $b); } /** @@ -77,7 +77,7 @@ class ReferenceHelper */ public static function columnReverseSort($a, $b) { - return -strcasecmp(strlen($a) . $a, strlen($b) . $b); + return -\strcasecmp(\strlen($a) . $a, \strlen($b) . $b); } /** @var int */ @@ -97,13 +97,13 @@ class ReferenceHelper $ac = $bc = ''; $ar = self::$scrutinizer0; $br = 0; - sscanf($a, '%[A-Z]%d', $ac, $ar); - sscanf($b, '%[A-Z]%d', $bc, $br); + \sscanf($a, '%[A-Z]%d', $ac, $ar); + \sscanf($b, '%[A-Z]%d', $bc, $br); $ac = (string) $ac; $bc = (string) $bc; if ($ar === $br) { - return strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc); + return \strcasecmp(\strlen($ac) . $ac, \strlen($bc) . $bc); } return ($ar < $br) ? -1 : 1; @@ -123,13 +123,13 @@ class ReferenceHelper $ac = $bc = ''; $ar = self::$scrutinizer0; $br = 0; - sscanf($a, '%[A-Z]%d', $ac, $ar); - sscanf($b, '%[A-Z]%d', $bc, $br); + \sscanf($a, '%[A-Z]%d', $ac, $ar); + \sscanf($b, '%[A-Z]%d', $bc, $br); $ac = (string) $ac; $bc = (string) $bc; if ($ar === $br) { - return -strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc); + return -\strcasecmp(\strlen($ac) . $ac, \strlen($bc) . $bc); } return ($ar < $br) ? 1 : -1; @@ -146,8 +146,8 @@ class ReferenceHelper { $aBreaks = $worksheet->getBreaks(); ($numberOfColumns > 0 || $numberOfRows > 0) - ? uksort($aBreaks, [self::class, 'cellReverseSort']) - : uksort($aBreaks, [self::class, 'cellSort']); + ? \uksort($aBreaks, [self::class, 'cellReverseSort']) + : \uksort($aBreaks, [self::class, 'cellSort']); foreach ($aBreaks as $cellAddress => $value) { if ($this->cellReferenceHelper->cellAddressInDeleteRange($cellAddress) === true) { @@ -199,8 +199,8 @@ class ReferenceHelper { $aHyperlinkCollection = $worksheet->getHyperlinkCollection(); ($numberOfColumns > 0 || $numberOfRows > 0) - ? uksort($aHyperlinkCollection, [self::class, 'cellReverseSort']) - : uksort($aHyperlinkCollection, [self::class, 'cellSort']); + ? \uksort($aHyperlinkCollection, [self::class, 'cellReverseSort']) + : \uksort($aHyperlinkCollection, [self::class, 'cellSort']); foreach ($aHyperlinkCollection as $cellAddress => $value) { $newReference = $this->updateCellReference($cellAddress); @@ -224,8 +224,8 @@ class ReferenceHelper { $aStyles = $worksheet->getConditionalStylesCollection(); ($numberOfColumns > 0 || $numberOfRows > 0) - ? uksort($aStyles, [self::class, 'cellReverseSort']) - : uksort($aStyles, [self::class, 'cellSort']); + ? \uksort($aStyles, [self::class, 'cellReverseSort']) + : \uksort($aStyles, [self::class, 'cellSort']); foreach ($aStyles as $cellAddress => $cfRules) { $worksheet->removeConditionalStyles($cellAddress); @@ -235,7 +235,7 @@ class ReferenceHelper /** @var Conditional $cfRule */ $conditions = $cfRule->getConditions(); foreach ($conditions as &$condition) { - if (is_string($condition)) { + if (\is_string($condition)) { $condition = $this->updateFormulaReferences( $condition, $this->cellReferenceHelper->beforeCellAddress(), @@ -263,8 +263,8 @@ class ReferenceHelper { $aDataValidationCollection = $worksheet->getDataValidationCollection(); ($numberOfColumns > 0 || $numberOfRows > 0) - ? uksort($aDataValidationCollection, [self::class, 'cellReverseSort']) - : uksort($aDataValidationCollection, [self::class, 'cellSort']); + ? \uksort($aDataValidationCollection, [self::class, 'cellReverseSort']) + : \uksort($aDataValidationCollection, [self::class, 'cellSort']); foreach ($aDataValidationCollection as $cellAddress => $dataValidation) { $newReference = $this->updateCellReference($cellAddress); @@ -303,8 +303,8 @@ class ReferenceHelper { $aProtectedCells = $worksheet->getProtectedCells(); ($numberOfColumns > 0 || $numberOfRows > 0) - ? uksort($aProtectedCells, [self::class, 'cellReverseSort']) - : uksort($aProtectedCells, [self::class, 'cellSort']); + ? \uksort($aProtectedCells, [self::class, 'cellReverseSort']) + : \uksort($aProtectedCells, [self::class, 'cellSort']); foreach ($aProtectedCells as $cellAddress => $value) { $newReference = $this->updateCellReference($cellAddress); if ($cellAddress !== $newReference) { @@ -321,7 +321,7 @@ class ReferenceHelper */ protected function adjustColumnDimensions(Worksheet $worksheet): void { - $aColumnDimensions = array_reverse($worksheet->getColumnDimensions(), true); + $aColumnDimensions = \array_reverse($worksheet->getColumnDimensions(), true); if (!empty($aColumnDimensions)) { foreach ($aColumnDimensions as $objColumnDimension) { $newReference = $this->updateCellReference($objColumnDimension->getColumnIndex() . '1'); @@ -344,7 +344,7 @@ class ReferenceHelper */ protected function adjustRowDimensions(Worksheet $worksheet, $beforeRow, $numberOfRows): void { - $aRowDimensions = array_reverse($worksheet->getRowDimensions(), true); + $aRowDimensions = \array_reverse($worksheet->getRowDimensions(), true); if (!empty($aRowDimensions)) { foreach ($aRowDimensions as $objRowDimension) { $newReference = $this->updateCellReference('A' . $objRowDimension->getRowIndex()); @@ -410,10 +410,10 @@ class ReferenceHelper // Find missing coordinates. This is important when inserting column before the last column $cellCollection = $worksheet->getCellCollection(); - $missingCoordinates = array_filter( - array_map(function ($row) use ($highestColumn) { + $missingCoordinates = \array_filter( + \array_map(function ($row) use ($highestColumn) { return $highestColumn . $row; - }, range(1, $highestRow)), + }, \range(1, $highestRow)), function ($coordinate) use ($cellCollection) { return $cellCollection->has($coordinate) === false; } @@ -429,11 +429,11 @@ class ReferenceHelper $allCoordinates = $worksheet->getCoordinates(); if ($remove) { // It's faster to reverse and pop than to use unshift, especially with large cell collections - $allCoordinates = array_reverse($allCoordinates); + $allCoordinates = \array_reverse($allCoordinates); } // Loop through cells, bottom-up, and change cell coordinate - while ($coordinate = array_pop($allCoordinates)) { + while ($coordinate = \array_pop($allCoordinates)) { $cell = $worksheet->getCell($coordinate); $cellIndex = Coordinate::columnIndexFromString($cell->getColumn()); @@ -550,7 +550,7 @@ class ReferenceHelper } // Update workbook: define names - if (count($worksheet->getParent()->getDefinedNames()) > 0) { + if (\count($worksheet->getParent()->getDefinedNames()) > 0) { $this->updateDefinedNames($worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows); } @@ -585,7 +585,7 @@ class ReferenceHelper } // Update cell references in the formula - $formulaBlocks = explode('"', $formula); + $formulaBlocks = \explode('"', $formula); $i = false; foreach ($formulaBlocks as &$formulaBlock) { // Ignore blocks that were enclosed in quotes (alternating entries in the $formulaBlocks array after the explode) @@ -594,57 +594,57 @@ class ReferenceHelper $adjustCount = 0; $newCellTokens = $cellTokens = []; // Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5) - $matchCount = preg_match_all('/' . self::REFHELPER_REGEXP_ROWRANGE . '/mui', ' ' . $formulaBlock . ' ', $matches, PREG_SET_ORDER); + $matchCount = \preg_match_all('/' . self::REFHELPER_REGEXP_ROWRANGE . '/mui', ' ' . $formulaBlock . ' ', $matches, PREG_SET_ORDER); if ($matchCount > 0) { foreach ($matches as $match) { $fromString = ($match[2] > '') ? $match[2] . '!' : ''; $fromString .= $match[3] . ':' . $match[4]; - $modified3 = substr($this->updateCellReference('$A' . $match[3], $includeAbsoluteReferences), 2); - $modified4 = substr($this->updateCellReference('$A' . $match[4], $includeAbsoluteReferences), 2); + $modified3 = \substr($this->updateCellReference('$A' . $match[3], $includeAbsoluteReferences), 2); + $modified4 = \substr($this->updateCellReference('$A' . $match[4], $includeAbsoluteReferences), 2); if ($match[3] . ':' . $match[4] !== $modified3 . ':' . $modified4) { - if (($match[2] == '') || (trim($match[2], "'") == $worksheetName)) { + if (($match[2] == '') || (\trim($match[2], "'") == $worksheetName)) { $toString = ($match[2] > '') ? $match[2] . '!' : ''; $toString .= $modified3 . ':' . $modified4; // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more $column = 100000; - $row = 10000000 + (int) trim($match[3], '$'); + $row = 10000000 + (int) \trim($match[3], '$'); $cellIndex = $column . $row; - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { foreach ($matches as $match) { $fromString = ($match[2] > '') ? $match[2] . '!' : ''; $fromString .= $match[3] . ':' . $match[4]; - $modified3 = substr($this->updateCellReference($match[3] . '$1', $includeAbsoluteReferences), 0, -2); - $modified4 = substr($this->updateCellReference($match[4] . '$1', $includeAbsoluteReferences), 0, -2); + $modified3 = \substr($this->updateCellReference($match[3] . '$1', $includeAbsoluteReferences), 0, -2); + $modified4 = \substr($this->updateCellReference($match[4] . '$1', $includeAbsoluteReferences), 0, -2); if ($match[3] . ':' . $match[4] !== $modified3 . ':' . $modified4) { - if (($match[2] == '') || (trim($match[2], "'") == $worksheetName)) { + if (($match[2] == '') || (\trim($match[2], "'") == $worksheetName)) { $toString = ($match[2] > '') ? $match[2] . '!' : ''; $toString .= $modified3 . ':' . $modified4; // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = Coordinate::columnIndexFromString(trim($match[3], '$')) + 100000; + $column = Coordinate::columnIndexFromString(\trim($match[3], '$')) + 100000; $row = 10000000; $cellIndex = $column . $row; - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { foreach ($matches as $match) { $fromString = ($match[2] > '') ? $match[2] . '!' : ''; @@ -653,24 +653,24 @@ class ReferenceHelper $modified4 = $this->updateCellReference($match[4], $includeAbsoluteReferences); if ($match[3] . $match[4] !== $modified3 . $modified4) { - if (($match[2] == '') || (trim($match[2], "'") == $worksheetName)) { + if (($match[2] == '') || (\trim($match[2], "'") == $worksheetName)) { $toString = ($match[2] > '') ? $match[2] . '!' : ''; $toString .= $modified3 . ':' . $modified4; [$column, $row] = Coordinate::coordinateFromString($match[3]); // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = Coordinate::columnIndexFromString(trim($column, '$')) + 100000; - $row = (int) trim($row, '$') + 10000000; + $column = Coordinate::columnIndexFromString(\trim($column, '$')) + 100000; + $row = (int) \trim($row, '$') + 10000000; $cellIndex = $column . $row; - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { foreach ($matches as $match) { @@ -679,19 +679,19 @@ class ReferenceHelper $modified3 = $this->updateCellReference($match[3], $includeAbsoluteReferences); if ($match[3] !== $modified3) { - if (($match[2] == '') || (trim($match[2], "'") == $worksheetName)) { + if (($match[2] == '') || (\trim($match[2], "'") == $worksheetName)) { $toString = ($match[2] > '') ? $match[2] . '!' : ''; $toString .= $modified3; [$column, $row] = Coordinate::coordinateFromString($match[3]); $columnAdditionalIndex = $column[0] === '$' ? 1 : 0; $rowAdditionalIndex = $row[0] === '$' ? 1 : 0; // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = Coordinate::columnIndexFromString(trim($column, '$')) + 100000; - $row = (int) trim($row, '$') + 10000000; + $column = Coordinate::columnIndexFromString(\trim($column, '$')) + 100000; + $row = (int) \trim($row, '$') + 10000000; $cellIndex = $row . $rowAdditionalIndex . $column . $columnAdditionalIndex; - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { if ($numberOfColumns > 0 || $numberOfRows > 0) { - krsort($cellTokens); - krsort($newCellTokens); + \krsort($cellTokens); + \krsort($newCellTokens); } else { - ksort($cellTokens); - ksort($newCellTokens); + \ksort($cellTokens); + \ksort($newCellTokens); } // Update cell references in the formula - $formulaBlock = str_replace('\\', '', (string) preg_replace($cellTokens, $newCellTokens, $formulaBlock)); + $formulaBlock = \str_replace('\\', '', (string) \preg_replace($cellTokens, $newCellTokens, $formulaBlock)); } } } unset($formulaBlock); // Then rebuild the formula string - return implode('"', $formulaBlocks); + return \implode('"', $formulaBlocks); } /** @@ -735,17 +735,17 @@ class ReferenceHelper private function updateCellReferencesAllWorksheets(string $formula, int $numberOfColumns, int $numberOfRows): string { - $splitCount = preg_match_all( + $splitCount = \preg_match_all( '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/mui', $formula, $splitRanges, PREG_OFFSET_CAPTURE ); - $columnLengths = array_map('strlen', array_column($splitRanges[6], 0)); - $rowLengths = array_map('strlen', array_column($splitRanges[7], 0)); - $columnOffsets = array_column($splitRanges[6], 1); - $rowOffsets = array_column($splitRanges[7], 1); + $columnLengths = \array_map('strlen', \array_column($splitRanges[6], 0)); + $rowLengths = \array_map('strlen', \array_column($splitRanges[7], 0)); + $columnOffsets = \array_column($splitRanges[6], 1); + $rowOffsets = \array_column($splitRanges[7], 1); $columns = $splitRanges[6]; $rows = $splitRanges[7]; @@ -761,11 +761,11 @@ class ReferenceHelper if (!empty($column) && $column[0] !== '$') { $column = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($column) + $numberOfColumns); - $formula = substr($formula, 0, $columnOffset) . $column . substr($formula, $columnOffset + $columnLength); + $formula = \substr($formula, 0, $columnOffset) . $column . \substr($formula, $columnOffset + $columnLength); } if (!empty($row) && $row[0] !== '$') { $row = (int) $row + $numberOfRows; - $formula = substr($formula, 0, $rowOffset) . $row . substr($formula, $rowOffset + $rowLength); + $formula = \substr($formula, 0, $rowOffset) . $row . \substr($formula, $rowOffset + $rowLength); } } @@ -774,17 +774,17 @@ class ReferenceHelper private function updateColumnRangesAllWorksheets(string $formula, int $numberOfColumns): string { - $splitCount = preg_match_all( + $splitCount = \preg_match_all( '/' . Calculation::CALCULATION_REGEXP_COLUMNRANGE_RELATIVE . '/mui', $formula, $splitRanges, PREG_OFFSET_CAPTURE ); - $fromColumnLengths = array_map('strlen', array_column($splitRanges[1], 0)); - $fromColumnOffsets = array_column($splitRanges[1], 1); - $toColumnLengths = array_map('strlen', array_column($splitRanges[2], 0)); - $toColumnOffsets = array_column($splitRanges[2], 1); + $fromColumnLengths = \array_map('strlen', \array_column($splitRanges[1], 0)); + $fromColumnOffsets = \array_column($splitRanges[1], 1); + $toColumnLengths = \array_map('strlen', \array_column($splitRanges[2], 0)); + $toColumnOffsets = \array_column($splitRanges[2], 1); $fromColumns = $splitRanges[1]; $toColumns = $splitRanges[2]; @@ -800,11 +800,11 @@ class ReferenceHelper if (!empty($fromColumn) && $fromColumn[0] !== '$') { $fromColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($fromColumn) + $numberOfColumns); - $formula = substr($formula, 0, $fromColumnOffset) . $fromColumn . substr($formula, $fromColumnOffset + $fromColumnLength); + $formula = \substr($formula, 0, $fromColumnOffset) . $fromColumn . \substr($formula, $fromColumnOffset + $fromColumnLength); } if (!empty($toColumn) && $toColumn[0] !== '$') { $toColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($toColumn) + $numberOfColumns); - $formula = substr($formula, 0, $toColumnOffset) . $toColumn . substr($formula, $toColumnOffset + $toColumnLength); + $formula = \substr($formula, 0, $toColumnOffset) . $toColumn . \substr($formula, $toColumnOffset + $toColumnLength); } } @@ -813,17 +813,17 @@ class ReferenceHelper private function updateRowRangesAllWorksheets(string $formula, int $numberOfRows): string { - $splitCount = preg_match_all( + $splitCount = \preg_match_all( '/' . Calculation::CALCULATION_REGEXP_ROWRANGE_RELATIVE . '/mui', $formula, $splitRanges, PREG_OFFSET_CAPTURE ); - $fromRowLengths = array_map('strlen', array_column($splitRanges[1], 0)); - $fromRowOffsets = array_column($splitRanges[1], 1); - $toRowLengths = array_map('strlen', array_column($splitRanges[2], 0)); - $toRowOffsets = array_column($splitRanges[2], 1); + $fromRowLengths = \array_map('strlen', \array_column($splitRanges[1], 0)); + $fromRowOffsets = \array_column($splitRanges[1], 1); + $toRowLengths = \array_map('strlen', \array_column($splitRanges[2], 0)); + $toRowOffsets = \array_column($splitRanges[2], 1); $fromRows = $splitRanges[1]; $toRows = $splitRanges[2]; @@ -839,11 +839,11 @@ class ReferenceHelper if (!empty($fromRow) && $fromRow[0] !== '$') { $fromRow = (int) $fromRow + $numberOfRows; - $formula = substr($formula, 0, $fromRowOffset) . $fromRow . substr($formula, $fromRowOffset + $fromRowLength); + $formula = \substr($formula, 0, $fromRowOffset) . $fromRow . \substr($formula, $fromRowOffset + $fromRowLength); } if (!empty($toRow) && $toRow[0] !== '$') { $toRow = (int) $toRow + $numberOfRows; - $formula = substr($formula, 0, $toRowOffset) . $toRow . substr($formula, $toRowOffset + $toRowLength); + $formula = \substr($formula, 0, $toRowOffset) . $toRow . \substr($formula, $toRowOffset + $toRowLength); } } @@ -860,7 +860,7 @@ class ReferenceHelper private function updateCellReference($cellReference = 'A1', bool $includeAbsoluteReferences = false) { // Is it in another worksheet? Will not have to update anything. - if (strpos($cellReference, '!') !== false) { + if (\strpos($cellReference, '!') !== false) { return $cellReference; // Is it a range or a single cell? } elseif (!Coordinate::coordinateIsRange($cellReference)) { @@ -893,9 +893,9 @@ class ReferenceHelper $cell = $sheet->getCell($coordinate); if ($cell->getDataType() === DataType::TYPE_FORMULA) { $formula = $cell->getValue(); - if (strpos($formula, $oldName) !== false) { - $formula = str_replace("'" . $oldName . "'!", "'" . $newName . "'!", $formula); - $formula = str_replace($oldName . '!', $newName . '!', $formula); + if (\strpos($formula, $oldName) !== false) { + $formula = \str_replace("'" . $oldName . "'!", "'" . $newName . "'!", $formula); + $formula = \str_replace($oldName . '!', $newName . '!', $formula); $cell->setValueExplicit($formula, DataType::TYPE_FORMULA); } } @@ -923,7 +923,7 @@ class ReferenceHelper $formula = $this->updateFormulaReferences($cellAddress, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle()); $definedName->setValue($formula); } else { - $definedName->setValue($this->updateCellReference(ltrim($cellAddress, '='))); + $definedName->setValue($this->updateCellReference(\ltrim($cellAddress, '='))); } } } @@ -952,15 +952,15 @@ class ReferenceHelper // Update range $range = Coordinate::splitRange($cellRange); - $ic = count($range); + $ic = \count($range); for ($i = 0; $i < $ic; ++$i) { - $jc = count($range[$i]); + $jc = \count($range[$i]); for ($j = 0; $j < $jc; ++$j) { - if (ctype_alpha($range[$i][$j])) { + if (\ctype_alpha($range[$i][$j])) { $range[$i][$j] = Coordinate::coordinateFromString( $this->cellReferenceHelper->updateCellReference($range[$i][$j] . '1', $includeAbsoluteReferences) )[0]; - } elseif (ctype_digit($range[$i][$j])) { + } elseif (\ctype_digit($range[$i][$j])) { $range[$i][$j] = Coordinate::coordinateFromString( $this->cellReferenceHelper->updateCellReference('A' . $range[$i][$j], $includeAbsoluteReferences) )[1]; @@ -1020,10 +1020,10 @@ class ReferenceHelper if (!empty($autoFilterRange)) { if ($numberOfColumns !== 0) { $autoFilterColumns = $autoFilter->getColumns(); - if (count($autoFilterColumns) > 0) { + if (\count($autoFilterColumns) > 0) { $column = ''; $row = 0; - sscanf($beforeCellAddress, '%[A-Z]%d', $column, $row); + \sscanf($beforeCellAddress, '%[A-Z]%d', $column, $row); $columnIndex = Coordinate::columnIndexFromString((string) $column); [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($autoFilterRange); if ($columnIndex <= $rangeEnd[0]) { @@ -1053,7 +1053,7 @@ class ReferenceHelper // If we're actually deleting any columns that fall within the autofilter range, // then we delete any rules for those columns $deleteColumn = $columnIndex + $numberOfColumns - 1; - $deleteCount = abs($numberOfColumns); + $deleteCount = \abs($numberOfColumns); for ($i = 1; $i <= $deleteCount; ++$i) { $columnName = Coordinate::stringFromColumnIndex($deleteColumn + 1); @@ -1100,10 +1100,10 @@ class ReferenceHelper if (!empty($tableRange)) { if ($numberOfColumns !== 0) { $tableColumns = $table->getColumns(); - if (count($tableColumns) > 0) { + if (\count($tableColumns) > 0) { $column = ''; $row = 0; - sscanf($beforeCellAddress, '%[A-Z]%d', $column, $row); + \sscanf($beforeCellAddress, '%[A-Z]%d', $column, $row); $columnIndex = Coordinate::columnIndexFromString((string) $column); [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($tableRange); if ($columnIndex <= $rangeEnd[0]) { @@ -1132,7 +1132,7 @@ class ReferenceHelper // If we're actually deleting any columns that fall within the table range, // then we delete any rules for those columns $deleteColumn = $columnIndex + $numberOfColumns - 1; - $deleteCount = abs($numberOfColumns); + $deleteCount = \abs($numberOfColumns); for ($i = 1; $i <= $deleteCount; ++$i) { $columnName = Coordinate::stringFromColumnIndex($deleteColumn + 1); diff --git a/PhpOffice/PhpSpreadsheet/RichText/RichText.php b/PhpOffice/PhpSpreadsheet/RichText/RichText.php index 88e7c79..d4ccb0f 100755 --- a/PhpOffice/PhpSpreadsheet/RichText/RichText.php +++ b/PhpOffice/PhpSpreadsheet/RichText/RichText.php @@ -145,7 +145,7 @@ class RichText implements IComparable $hashElements .= $element->getHashCode(); } - return md5( + return \md5( $hashElements . __CLASS__ ); @@ -156,13 +156,13 @@ class RichText implements IComparable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - $newValue = is_object($value) ? (clone $value) : $value; - if (is_array($value)) { + $newValue = \is_object($value) ? (clone $value) : $value; + if (\is_array($value)) { $newValue = []; foreach ($value as $key2 => $value2) { - $newValue[$key2] = is_object($value2) ? (clone $value2) : $value2; + $newValue[$key2] = \is_object($value2) ? (clone $value2) : $value2; } } $this->$key = $newValue; diff --git a/PhpOffice/PhpSpreadsheet/RichText/Run.php b/PhpOffice/PhpSpreadsheet/RichText/Run.php index 9c9f807..cd19b2f 100755 --- a/PhpOffice/PhpSpreadsheet/RichText/Run.php +++ b/PhpOffice/PhpSpreadsheet/RichText/Run.php @@ -56,7 +56,7 @@ class Run extends TextElement implements ITextElement */ public function getHashCode() { - return md5( + return \md5( $this->getText() . $this->font->getHashCode() . __CLASS__ diff --git a/PhpOffice/PhpSpreadsheet/RichText/TextElement.php b/PhpOffice/PhpSpreadsheet/RichText/TextElement.php index 2373343..1e344c2 100755 --- a/PhpOffice/PhpSpreadsheet/RichText/TextElement.php +++ b/PhpOffice/PhpSpreadsheet/RichText/TextElement.php @@ -63,7 +63,7 @@ class TextElement implements ITextElement */ public function getHashCode() { - return md5( + return \md5( $this->text . __CLASS__ ); diff --git a/PhpOffice/PhpSpreadsheet/Settings.php b/PhpOffice/PhpSpreadsheet/Settings.php index 0baf446..007e9e6 100755 --- a/PhpOffice/PhpSpreadsheet/Settings.php +++ b/PhpOffice/PhpSpreadsheet/Settings.php @@ -71,7 +71,7 @@ class Settings */ public static function setChartRenderer(string $rendererClassName): void { - if (!is_a($rendererClassName, IRenderer::class, true)) { + if (!\is_a($rendererClassName, IRenderer::class, true)) { throw new Exception('Chart renderer must implement ' . IRenderer::class); } @@ -102,7 +102,7 @@ class Settings public static function setLibXmlLoaderOptions($options): int { if ($options === null) { - $options = defined('LIBXML_DTDLOAD') ? (LIBXML_DTDLOAD | LIBXML_DTDATTR) : 0; + $options = \defined('LIBXML_DTDLOAD') ? (LIBXML_DTDLOAD | LIBXML_DTDATTR) : 0; } self::$libXmlLoaderOptions = $options; @@ -176,7 +176,7 @@ class Settings { return PHP_MAJOR_VERSION === 8 && - (new ReflectionClass(CacheInterface::class))->getMethod('get')->getReturnType() !== null; + (new \ReflectionClass(CacheInterface::class))->getMethod('get')->getReturnType() !== null; } /** diff --git a/PhpOffice/PhpSpreadsheet/Shared/CodePage.php b/PhpOffice/PhpSpreadsheet/Shared/CodePage.php index 8718a61..1767807 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/CodePage.php +++ b/PhpOffice/PhpSpreadsheet/Shared/CodePage.php @@ -71,7 +71,7 @@ class CodePage public static function validate(string $codePage): bool { - return in_array($codePage, self::$pageArray, true); + return \in_array($codePage, self::$pageArray, true); } /** @@ -84,11 +84,11 @@ class CodePage */ public static function numberToName(int $codePage): string { - if (array_key_exists($codePage, self::$pageArray)) { + if (\array_key_exists($codePage, self::$pageArray)) { $value = self::$pageArray[$codePage]; - if (is_array($value)) { + if (\is_array($value)) { foreach ($value as $encoding) { - if (@iconv('UTF-8', $encoding, ' ') !== false) { + if (@\iconv('UTF-8', $encoding, ' ') !== false) { self::$pageArray[$codePage] = $encoding; return $encoding; diff --git a/PhpOffice/PhpSpreadsheet/Shared/Date.php b/PhpOffice/PhpSpreadsheet/Shared/Date.php index 0ae5f1e..081a705 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Date.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Date.php @@ -61,7 +61,7 @@ class Date /** * Default timezone to use for DateTime objects. * - * @var null|DateTimeZone + * @var null|\DateTimeZone */ protected static $defaultTimeZone; @@ -99,7 +99,7 @@ class Date /** * Set the Default timezone to use for dates. * - * @param null|DateTimeZone|string $timeZone The timezone to set for all Excel datetimestamp to PHP DateTime Object conversions + * @param null|\DateTimeZone|string $timeZone The timezone to set for all Excel datetimestamp to PHP DateTime Object conversions * * @return bool Success or failure */ @@ -119,23 +119,23 @@ class Date /** * Return the Default timezone, or UTC if default not set. */ - public static function getDefaultTimezone(): DateTimeZone + public static function getDefaultTimezone(): \DateTimeZone { - return self::$defaultTimeZone ?? new DateTimeZone('UTC'); + return self::$defaultTimeZone ?? new \DateTimeZone('UTC'); } /** * Return the Default timezone, or local timezone if default is not set. */ - public static function getDefaultOrLocalTimezone(): DateTimeZone + public static function getDefaultOrLocalTimezone(): \DateTimeZone { - return self::$defaultTimeZone ?? new DateTimeZone(date_default_timezone_get()); + return self::$defaultTimeZone ?? new \DateTimeZone(\date_default_timezone_get()); } /** * Return the Default timezone even if null. */ - public static function getDefaultTimezoneOrNull(): ?DateTimeZone + public static function getDefaultTimezoneOrNull(): ?\DateTimeZone { return self::$defaultTimeZone; } @@ -143,17 +143,17 @@ class Date /** * Validate a timezone. * - * @param null|DateTimeZone|string $timeZone The timezone to validate, either as a timezone string or object + * @param null|\DateTimeZone|string $timeZone The timezone to validate, either as a timezone string or object * - * @return ?DateTimeZone The timezone as a timezone object + * @return ?\DateTimeZone The timezone as a timezone object */ private static function validateTimeZone($timeZone) { - if ($timeZone instanceof DateTimeZone || $timeZone === null) { + if ($timeZone instanceof \DateTimeZone || $timeZone === null) { return $timeZone; } - if (in_array($timeZone, DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC))) { - return new DateTimeZone($timeZone); + if (\in_array($timeZone, \DateTimeZone::listIdentifiers(\DateTimeZone::ALL_WITH_BC))) { + return new \DateTimeZone($timeZone); } throw new PhpSpreadsheetException('Invalid timezone'); @@ -166,14 +166,14 @@ class Date */ public static function convertIsoDate($value) { - if (!is_string($value)) { + if (!\is_string($value)) { throw new Exception('Non-string value supplied for Iso Date conversion'); } - $date = new DateTime($value); - $dateErrors = DateTime::getLastErrors(); + $date = new \DateTime($value); + $dateErrors = \DateTime::getLastErrors(); - if (is_array($dateErrors) && ($dateErrors['warning_count'] > 0 || $dateErrors['error_count'] > 0)) { + if (\is_array($dateErrors) && ($dateErrors['warning_count'] > 0 || $dateErrors['error_count'] > 0)) { throw new Exception("Invalid string $value supplied for datatype Date"); } @@ -182,8 +182,8 @@ class Date throw new Exception("Invalid string $value supplied for datatype Date"); } - if (preg_match('/^\\d\\d:\\d\\d:\\d\\d/', $value) == 1) { - $newValue = fmod($newValue, 1.0); + if (\preg_match('/^\\d\\d:\\d\\d:\\d\\d/', $value) == 1) { + $newValue = \fmod($newValue, 1.0); } return $newValue; @@ -193,11 +193,11 @@ class Date * Convert a MS serialized datetime value from Excel to a PHP Date/Time object. * * @param float|int $excelTimestamp MS Excel serialized date/time value - * @param null|DateTimeZone|string $timeZone The timezone to assume for the Excel timestamp, + * @param null|\DateTimeZone|string $timeZone The timezone to assume for the Excel timestamp, * if you don't want to treat it as a UTC value * Use the default (UTC) unless you absolutely need a conversion * - * @return DateTime PHP date/time object + * @return \DateTime PHP date/time object */ public static function excelToDateTimeObject($excelTimestamp, $timeZone = null) { @@ -205,27 +205,27 @@ class Date if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_EXCEL) { if ($excelTimestamp < 1 && self::$excelCalendar === self::CALENDAR_WINDOWS_1900) { // Unix timestamp base date - $baseDate = new DateTime('1970-01-01', $timeZone); + $baseDate = new \DateTime('1970-01-01', $timeZone); } else { // MS Excel calendar base dates if (self::$excelCalendar == self::CALENDAR_WINDOWS_1900) { // Allow adjustment for 1900 Leap Year in MS Excel - $baseDate = ($excelTimestamp < 60) ? new DateTime('1899-12-31', $timeZone) : new DateTime('1899-12-30', $timeZone); + $baseDate = ($excelTimestamp < 60) ? new \DateTime('1899-12-31', $timeZone) : new \DateTime('1899-12-30', $timeZone); } else { - $baseDate = new DateTime('1904-01-01', $timeZone); + $baseDate = new \DateTime('1904-01-01', $timeZone); } } } else { - $baseDate = new DateTime('1899-12-30', $timeZone); + $baseDate = new \DateTime('1899-12-30', $timeZone); } - $days = floor($excelTimestamp); + $days = \floor($excelTimestamp); $partDay = $excelTimestamp - $days; - $hours = floor($partDay * 24); + $hours = \floor($partDay * 24); $partDay = $partDay * 24 - $hours; - $minutes = floor($partDay * 60); + $minutes = \floor($partDay * 60); $partDay = $partDay * 60 - $minutes; - $seconds = round($partDay * 60); + $seconds = \round($partDay * 60); if ($days >= 0) { $days = '+' . $days; @@ -242,7 +242,7 @@ class Date * They are not Y2038-safe on a 32-bit system, and have no timezone info. * * @param float|int $excelTimestamp MS Excel serialized date/time value - * @param null|DateTimeZone|string $timeZone The timezone to assume for the Excel timestamp, + * @param null|\DateTimeZone|string $timeZone The timezone to assume for the Excel timestamp, * if you don't want to treat it as a UTC value * Use the default (UTC) unless you absolutely need a conversion * @@ -265,11 +265,11 @@ class Date */ public static function PHPToExcel($dateValue) { - if ((is_object($dateValue)) && ($dateValue instanceof DateTimeInterface)) { + if ((\is_object($dateValue)) && ($dateValue instanceof \DateTimeInterface)) { return self::dateTimeToExcel($dateValue); - } elseif (is_numeric($dateValue)) { + } elseif (\is_numeric($dateValue)) { return self::timestampToExcel($dateValue); - } elseif (is_string($dateValue)) { + } elseif (\is_string($dateValue)) { return self::stringToExcel($dateValue); } @@ -279,11 +279,11 @@ class Date /** * Convert a PHP DateTime object to an MS Excel serialized date/time value. * - * @param DateTimeInterface $dateValue PHP DateTime object + * @param \DateTimeInterface $dateValue PHP DateTime object * * @return float MS Excel serialized date/time value */ - public static function dateTimeToExcel(DateTimeInterface $dateValue) + public static function dateTimeToExcel(\DateTimeInterface $dateValue) { return self::formattedPHPToExcel( (int) $dateValue->format('Y'), @@ -306,11 +306,11 @@ class Date */ public static function timestampToExcel($unixTimestamp) { - if (!is_numeric($unixTimestamp)) { + if (!\is_numeric($unixTimestamp)) { return false; } - return self::dateTimeToExcel(new DateTime('@' . $unixTimestamp)); + return self::dateTimeToExcel(new \DateTime('@' . $unixTimestamp)); } /** @@ -351,9 +351,9 @@ class Date } // Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0) - $century = (int) substr((string) $year, 0, 2); - $decade = (int) substr((string) $year, 2, 2); - $excelDate = floor((146097 * $century) / 4) + floor((1461 * $decade) / 4) + floor((153 * $month + 2) / 5) + $day + 1721119 - $myexcelBaseDate + $excel1900isLeapYear; + $century = (int) \substr((string) $year, 0, 2); + $decade = (int) \substr((string) $year, 2, 2); + $excelDate = \floor((146097 * $century) / 4) + \floor((1461 * $decade) / 4) + \floor((153 * $month + 2) / 5) + $day + 1721119 - $myexcelBaseDate + $excel1900isLeapYear; $excelTime = (($hours * 3600) + ($minutes * 60) + $seconds) / 86400; @@ -375,7 +375,7 @@ class Date if ($worksheet !== null && $spreadsheet !== null) { $index = $spreadsheet->getActiveSheetIndex(); $selected = $worksheet->getSelectedCells(); - $result = is_numeric($value ?? $cell->getCalculatedValue()) && + $result = \is_numeric($value ?? $cell->getCalculatedValue()) && self::isDateTimeFormat( $worksheet->getStyle( $cell->getCoordinate() @@ -411,22 +411,22 @@ class Date */ public static function isDateTimeFormatCode($excelFormatCode, bool $dateWithoutTimeOkay = true) { - if (strtolower($excelFormatCode) === strtolower(NumberFormat::FORMAT_GENERAL)) { + if (\strtolower($excelFormatCode) === \strtolower(NumberFormat::FORMAT_GENERAL)) { // "General" contains an epoch letter 'e', so we trap for it explicitly here (case-insensitive check) return false; } - if (preg_match('/[0#]E[+-]0/i', $excelFormatCode)) { + if (\preg_match('/[0#]E[+-]0/i', $excelFormatCode)) { // Scientific format return false; } // Switch on formatcode - if (in_array($excelFormatCode, NumberFormat::DATE_TIME_OR_DATETIME_ARRAY, true)) { - return $dateWithoutTimeOkay || in_array($excelFormatCode, NumberFormat::TIME_OR_DATETIME_ARRAY); + if (\in_array($excelFormatCode, NumberFormat::DATE_TIME_OR_DATETIME_ARRAY, true)) { + return $dateWithoutTimeOkay || \in_array($excelFormatCode, NumberFormat::TIME_OR_DATETIME_ARRAY); } // Typically number, currency or accounting (or occasionally fraction) formats - if ((substr($excelFormatCode, 0, 1) == '_') || (substr($excelFormatCode, 0, 2) == '0 ')) { + if ((\substr($excelFormatCode, 0, 1) == '_') || (\substr($excelFormatCode, 0, 2) == '0 ')) { return false; } // Some "special formats" provided in German Excel versions were detected as date time value, @@ -436,17 +436,17 @@ class Date } $possibleFormatCharacters = $dateWithoutTimeOkay ? self::POSSIBLE_DATETIME_FORMAT_CHARACTERS : self::POSSIBLE_TIME_FORMAT_CHARACTERS; // Try checking for any of the date formatting characters that don't appear within square braces - if (preg_match('/(^|\])[^\[]*[' . $possibleFormatCharacters . ']/i', $excelFormatCode)) { + if (\preg_match('/(^|\])[^\[]*[' . $possibleFormatCharacters . ']/i', $excelFormatCode)) { // We might also have a format mask containing quoted strings... // we don't want to test for any of our characters within the quoted blocks - if (strpos($excelFormatCode, '"') !== false) { + if (\strpos($excelFormatCode, '"') !== false) { $segMatcher = false; - foreach (explode('"', $excelFormatCode) as $subVal) { + foreach (\explode('"', $excelFormatCode) as $subVal) { // Only test in alternate array entries (the non-quoted blocks) $segMatcher = $segMatcher === false; if ( $segMatcher && - (preg_match('/(^|\])[^\[]*[' . $possibleFormatCharacters . ']/i', $subVal)) + (\preg_match('/(^|\])[^\[]*[' . $possibleFormatCharacters . ']/i', $subVal)) ) { return true; } @@ -471,22 +471,22 @@ class Date */ public static function stringToExcel($dateValue) { - if (strlen($dateValue) < 2) { + if (\strlen($dateValue) < 2) { return false; } - if (!preg_match('/^(\d{1,4}[ \.\/\-][A-Z]{3,9}([ \.\/\-]\d{1,4})?|[A-Z]{3,9}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?|\d{1,4}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?)( \d{1,2}:\d{1,2}(:\d{1,2})?)?$/iu', $dateValue)) { + if (!\preg_match('/^(\d{1,4}[ \.\/\-][A-Z]{3,9}([ \.\/\-]\d{1,4})?|[A-Z]{3,9}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?|\d{1,4}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?)( \d{1,2}:\d{1,2}(:\d{1,2})?)?$/iu', $dateValue)) { return false; } $dateValueNew = DateTimeExcel\DateValue::fromString($dateValue); - if (!is_float($dateValueNew)) { + if (!\is_float($dateValueNew)) { return false; } - if (strpos($dateValue, ':') !== false) { + if (\strpos($dateValue, ':') !== false) { $timeValue = DateTimeExcel\TimeValue::fromString($dateValue); - if (!is_float($timeValue)) { + if (!\is_float($timeValue)) { return false; } $dateValueNew += $timeValue; @@ -524,23 +524,23 @@ class Date */ public static function dayStringToNumber($day) { - $strippedDayValue = (str_replace(self::$numberSuffixes, '', $day)); - if (is_numeric($strippedDayValue)) { + $strippedDayValue = (\str_replace(self::$numberSuffixes, '', $day)); + if (\is_numeric($strippedDayValue)) { return (int) $strippedDayValue; } return $day; } - public static function dateTimeFromTimestamp(string $date, ?DateTimeZone $timeZone = null): DateTime + public static function dateTimeFromTimestamp(string $date, ?\DateTimeZone $timeZone = null): \DateTime { - $dtobj = DateTime::createFromFormat('U', $date) ?: new DateTime(); + $dtobj = \DateTime::createFromFormat('U', $date) ?: new \DateTime(); $dtobj->setTimeZone($timeZone ?? self::getDefaultOrLocalTimezone()); return $dtobj; } - public static function formattedDateTimeFromTimestamp(string $date, string $format, ?DateTimeZone $timeZone = null): string + public static function formattedDateTimeFromTimestamp(string $date, string $format, ?\DateTimeZone $timeZone = null): string { $dtobj = self::dateTimeFromTimestamp($date, $timeZone); diff --git a/PhpOffice/PhpSpreadsheet/Shared/Drawing.php b/PhpOffice/PhpSpreadsheet/Shared/Drawing.php index f69310f..3d36f98 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Drawing.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Drawing.php @@ -23,7 +23,7 @@ class Drawing /** * Convert EMU to pixels. * - * @param int|SimpleXMLElement $emuValue Value in EMU + * @param int|\SimpleXMLElement $emuValue Value in EMU * * @return int Value in pixels */ @@ -31,7 +31,7 @@ class Drawing { $emuValue = (int) $emuValue; if ($emuValue != 0) { - return (int) round($emuValue / 9525); + return (int) \round($emuValue / 9525); } return 0; @@ -90,7 +90,7 @@ class Drawing } // Round pixels to closest integer - $colWidth = (int) round($colWidth); + $colWidth = (int) \round($colWidth); return $colWidth; } @@ -117,7 +117,7 @@ class Drawing public static function pointsToPixels($pointValue) { if ($pointValue != 0) { - return (int) ceil($pointValue / 0.75); + return (int) \ceil($pointValue / 0.75); } return 0; @@ -132,13 +132,13 @@ class Drawing */ public static function degreesToAngle($degrees) { - return (int) round($degrees * 60000); + return (int) \round($degrees * 60000); } /** * Convert angle to degrees. * - * @param int|SimpleXMLElement $angle Angle + * @param int|\SimpleXMLElement $angle Angle * * @return int Degrees */ @@ -146,7 +146,7 @@ class Drawing { $angle = (int) $angle; if ($angle != 0) { - return (int) round($angle / 60000); + return (int) \round($angle / 60000); } return 0; @@ -159,7 +159,7 @@ class Drawing * * @param string $bmpFilename Path to Windows DIB (BMP) image * - * @return GdImage|resource + * @return \GdImage|resource * * @deprecated 1.26 use Php function imagecreatefrombmp instead * @@ -167,7 +167,7 @@ class Drawing */ public static function imagecreatefrombmp($bmpFilename) { - $retVal = @imagecreatefrombmp($bmpFilename); + $retVal = @\imagecreatefrombmp($bmpFilename); if ($retVal === false) { throw new ReaderException("Unable to create image from $bmpFilename"); } diff --git a/PhpOffice/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php b/PhpOffice/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php index 6bdc8f7..94b7ce0 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php @@ -64,7 +64,7 @@ class SpgrContainer foreach ($this->children as $child) { if ($child instanceof self) { - $allSpContainers = array_merge($allSpContainers, $child->getAllSpContainers()); + $allSpContainers = \array_merge($allSpContainers, $child->getAllSpContainers()); } else { $allSpContainers[] = $child; } diff --git a/PhpOffice/PhpSpreadsheet/Shared/File.php b/PhpOffice/PhpSpreadsheet/Shared/File.php index f2fe8ca..1038faf 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/File.php +++ b/PhpOffice/PhpSpreadsheet/Shared/File.php @@ -41,9 +41,9 @@ class File private static function validateZipFirst4(string $zipFile): bool { - $contents = @file_get_contents($zipFile, false, null, 0, 4); + $contents = @\file_get_contents($zipFile, false, null, 0, 4); - return in_array($contents, self::ZIP_FIRST_4, true); + return \in_array($contents, self::ZIP_FIRST_4, true); } /** @@ -54,13 +54,13 @@ class File // Sick construction, but it seems that // file_exists returns strange values when // doing the original file_exists on ZIP archives... - if (strtolower(substr($filename, 0, 6)) == 'zip://') { + if (\strtolower(\substr($filename, 0, 6)) == 'zip://') { // Open ZIP file and verify if the file exists - $zipFile = substr($filename, 6, strrpos($filename, '#') - 6); - $archiveFile = substr($filename, strrpos($filename, '#') + 1); + $zipFile = \substr($filename, 6, \strrpos($filename, '#') - 6); + $archiveFile = \substr($filename, \strrpos($filename, '#') + 1); if (self::validateZipFirst4($zipFile)) { - $zip = new ZipArchive(); + $zip = new \ZipArchive(); $res = $zip->open($zipFile); if ($res === true) { $returnValue = ($zip->getFromName($archiveFile) !== false); @@ -73,7 +73,7 @@ class File return false; } - return file_exists($filename); + return \file_exists($filename); } /** @@ -85,15 +85,15 @@ class File $returnValue = ''; // Try using realpath() - if (file_exists($filename)) { - $returnValue = realpath($filename) ?: ''; + if (\file_exists($filename)) { + $returnValue = \realpath($filename) ?: ''; } // Found something? if ($returnValue === '') { - $pathArray = explode('/', $filename); - while (in_array('..', $pathArray) && $pathArray[0] != '..') { - $iMax = count($pathArray); + $pathArray = \explode('/', $filename); + while (\in_array('..', $pathArray) && $pathArray[0] != '..') { + $iMax = \count($pathArray); for ($i = 0; $i < $iMax; ++$i) { if ($pathArray[$i] == '..' && $i > 0) { unset($pathArray[$i], $pathArray[$i - 1]); @@ -102,7 +102,7 @@ class File } } } - $returnValue = implode('/', $pathArray); + $returnValue = \implode('/', $pathArray); } // Return @@ -114,25 +114,25 @@ class File */ public static function sysGetTempDir(): string { - $path = sys_get_temp_dir(); + $path = \sys_get_temp_dir(); if (self::$useUploadTempDirectory) { // use upload-directory when defined to allow running on environments having very restricted // open_basedir configs - if (ini_get('upload_tmp_dir') !== false) { - if ($temp = ini_get('upload_tmp_dir')) { - if (file_exists($temp)) { + if (\ini_get('upload_tmp_dir') !== false) { + if ($temp = \ini_get('upload_tmp_dir')) { + if (\file_exists($temp)) { $path = $temp; } } } } - return realpath($path) ?: ''; + return \realpath($path) ?: ''; } public static function temporaryFilename(): string { - $filename = tempnam(self::sysGetTempDir(), 'phpspreadsheet'); + $filename = \tempnam(self::sysGetTempDir(), 'phpspreadsheet'); if ($filename === false) { throw new Exception('Could not create temporary file'); } @@ -145,11 +145,11 @@ class File */ public static function assertFile(string $filename, string $zipMember = ''): void { - if (!is_file($filename)) { + if (!\is_file($filename)) { throw new ReaderException('File "' . $filename . '" does not exist.'); } - if (!is_readable($filename)) { + if (!\is_readable($filename)) { throw new ReaderException('Could not open "' . $filename . '" for reading.'); } @@ -166,10 +166,10 @@ class File */ public static function testFileNoThrow(string $filename, ?string $zipMember = null): bool { - if (!is_file($filename)) { + if (!\is_file($filename)) { return false; } - if (!is_readable($filename)) { + if (!\is_readable($filename)) { return false; } if ($zipMember === null) { diff --git a/PhpOffice/PhpSpreadsheet/Shared/Font.php b/PhpOffice/PhpSpreadsheet/Shared/Font.php index dfe9f77..6ef6d74 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Font.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Font.php @@ -281,7 +281,7 @@ class Font */ public static function setAutoSizeMethod($method) { - if (!in_array($method, self::AUTOSIZE_METHODS)) { + if (!\in_array($method, self::AUTOSIZE_METHODS)) { return false; } self::$autoSizeMethod = $method; @@ -349,23 +349,23 @@ class Font // Special case if there are one or more newline characters ("\n") $cellText = (string) $cellText; - if (strpos($cellText, "\n") !== false) { - $lineTexts = explode("\n", $cellText); + if (\strpos($cellText, "\n") !== false) { + $lineTexts = \explode("\n", $cellText); $lineWidths = []; foreach ($lineTexts as $lineText) { $lineWidths[] = self::calculateColumnWidth($font, $lineText, $rotation = 0, $defaultFont, $filterAdjustment); } - return max($lineWidths); // width of longest line in cell + return \max($lineWidths); // width of longest line in cell } // Try to get the exact text width in pixels $approximate = self::$autoSizeMethod === self::AUTOSIZE_METHOD_APPROX; $columnWidth = 0; if (!$approximate) { - $columnWidthAdjust = ceil( + $columnWidthAdjust = \ceil( self::getTextWidthPixelsExact( - str_repeat('n', 1 * (($filterAdjustment ? 3 : 1) + ($indentAdjustment * 2))), + \str_repeat('n', 1 * (($filterAdjustment ? 3 : 1) + ($indentAdjustment * 2))), $font, 0 ) * 1.07 @@ -382,7 +382,7 @@ class Font if ($approximate) { $columnWidthAdjust = self::getTextWidthPixelsApprox( - str_repeat('n', 1 * (($filterAdjustment ? 3 : 1) + ($indentAdjustment * 2))), + \str_repeat('n', 1 * (($filterAdjustment ? 3 : 1) + ($indentAdjustment * 2))), $font, 0 ); @@ -395,7 +395,7 @@ class Font $columnWidth = Drawing::pixelsToCellDimension((int) $columnWidth, $defaultFont ?? new FontStyle()); // Return - return (int) round($columnWidth, 6); + return (int) \round($columnWidth, 6); } /** @@ -403,14 +403,14 @@ class Font */ public static function getTextWidthPixelsExact(string $text, FontStyle $font, int $rotation = 0): int { - if (!function_exists('imagettfbbox')) { + if (!\function_exists('imagettfbbox')) { throw new PhpSpreadsheetException('GD library needs to be enabled'); } // font size should really be supplied in pixels in GD2, // but since GD2 seems to assume 72dpi, pixels and points are the same $fontFile = self::getTrueTypeFontFileFromFont($font); - $textBox = imagettfbbox($font->getSize() ?? 10.0, $rotation, $fontFile, $text); + $textBox = \imagettfbbox($font->getSize() ?? 10.0, $rotation, $fontFile, $text); if ($textBox === false) { // @codeCoverageIgnoreStart throw new PhpSpreadsheetException('imagettfbbox failed'); @@ -424,7 +424,7 @@ class Font $upperLeftCornerX = $textBox[6]; // Consider the rotation when calculating the width - return max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX); + return \max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX); } /** @@ -475,8 +475,8 @@ class Font $columnWidth = 4; // approximation } else { // rotated text - $columnWidth = $columnWidth * cos(deg2rad($rotation)) - + $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation + $columnWidth = $columnWidth * \cos(\deg2rad($rotation)) + + $fontSize * \abs(\sin(\deg2rad($rotation))) / 5; // approximation } } @@ -527,7 +527,7 @@ class Font */ public static function getTrueTypeFontFileFromFont(FontStyle $font, bool $checkPath = true) { - if ($checkPath && (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath))) { + if ($checkPath && (!\file_exists(self::$trueTypeFontPath) || !\is_dir(self::$trueTypeFontPath))) { throw new PhpSpreadsheetException('Valid directory to TrueType Font files not specified'); } @@ -547,13 +547,13 @@ class Font $fontFile = self::FONT_FILE_NAMES[$name][$index]; $separator = ''; - if (mb_strlen(self::$trueTypeFontPath) > 1 && mb_substr(self::$trueTypeFontPath, -1) !== '/' && mb_substr(self::$trueTypeFontPath, -1) !== '\\') { + if (\mb_strlen(self::$trueTypeFontPath) > 1 && \mb_substr(self::$trueTypeFontPath, -1) !== '/' && \mb_substr(self::$trueTypeFontPath, -1) !== '\\') { $separator = DIRECTORY_SEPARATOR; } $fontFile = self::$trueTypeFontPath . $separator . $fontFile; // Check if file actually exists - if ($checkPath && !file_exists($fontFile)) { + if ($checkPath && !\file_exists($fontFile)) { throw new PhpSpreadsheetException('TrueType Font file not found'); } @@ -605,7 +605,7 @@ class Font // Round pixels to closest integer if ($returnAsPixels) { - $columnWidth = (int) round($columnWidth); + $columnWidth = (int) \round($columnWidth); } } diff --git a/PhpOffice/PhpSpreadsheet/Shared/OLE.php b/PhpOffice/PhpSpreadsheet/Shared/OLE.php index 815b1c1..95a569e 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/OLE.php +++ b/PhpOffice/PhpSpreadsheet/Shared/OLE.php @@ -116,18 +116,18 @@ class OLE */ public function read($filename) { - $fh = fopen($filename, 'rb'); + $fh = \fopen($filename, 'rb'); if ($fh === false) { throw new ReaderException("Can't open file $filename"); } $this->_file_handle = $fh; - $signature = fread($fh, 8); + $signature = \fread($fh, 8); if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { throw new ReaderException("File doesn't seem to be an OLE container."); } - fseek($fh, 28); - if (fread($fh, 2) != "\xFE\xFF") { + \fseek($fh, 28); + if (\fread($fh, 2) != "\xFE\xFF") { // This shouldn't be a problem in practice throw new ReaderException('Only Little-Endian encoding is supported.'); } @@ -136,7 +136,7 @@ class OLE $this->smallBlockSize = 2 ** self::readInt2($fh); // Skip UID, revision number and version number - fseek($fh, 44); + \fseek($fh, 44); // Number of blocks in Big Block Allocation Table $bbatBlockCount = self::readInt4($fh); @@ -144,7 +144,7 @@ class OLE $directoryFirstBlockId = self::readInt4($fh); // Skip unused bytes - fseek($fh, 56); + \fseek($fh, 56); // Streams shorter than this are stored using small blocks $this->bigBlockThreshold = self::readInt4($fh); // Block id of first sector in Short Block Allocation Table @@ -167,7 +167,7 @@ class OLE // Read rest of Master Block Allocation Table (if any is left) $pos = $this->getBlockOffset($mbatFirstBlockId); for ($i = 0; $i < $mbbatBlockCount; ++$i) { - fseek($fh, $pos); + \fseek($fh, $pos); for ($j = 0; $j < $this->bigBlockSize / 4 - 1; ++$j) { $mbatBlocks[] = self::readInt4($fh); } @@ -178,7 +178,7 @@ class OLE // Read Big Block Allocation Table according to chain specified by $mbatBlocks for ($i = 0; $i < $bbatBlockCount; ++$i) { $pos = $this->getBlockOffset($mbatBlocks[$i]); - fseek($fh, $pos); + \fseek($fh, $pos); for ($j = 0; $j < $this->bigBlockSize / 4; ++$j) { $this->bbat[] = self::readInt4($fh); } @@ -191,7 +191,7 @@ class OLE for ($blockId = 0; $blockId < $shortBlockCount; ++$blockId) { $this->sbat[$blockId] = self::readInt4($sbatFh); } - fclose($sbatFh); + \fclose($sbatFh); $this->readPpsWks($directoryFirstBlockId); @@ -220,7 +220,7 @@ class OLE { static $isRegistered = false; if (!$isRegistered) { - stream_wrapper_register('ole-chainedblockstream', ChainedBlockStream::class); + \stream_wrapper_register('ole-chainedblockstream', ChainedBlockStream::class); $isRegistered = true; } @@ -228,8 +228,8 @@ class OLE // in OLE_ChainedBlockStream::stream_open(). // Object is removed from self::$instances in OLE_Stream::close(). $GLOBALS['_OLE_INSTANCES'][] = $this; - $keys = array_keys($GLOBALS['_OLE_INSTANCES']); - $instanceId = end($keys); + $keys = \array_keys($GLOBALS['_OLE_INSTANCES']); + $instanceId = \end($keys); $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId; if ($blockIdOrPps instanceof OLE\PPS) { @@ -239,7 +239,7 @@ class OLE $path .= '&blockId=' . $blockIdOrPps; } - return fopen($path, 'rb'); + return \fopen($path, 'rb'); } /** @@ -252,7 +252,7 @@ class OLE private static function readInt1($fileHandle) { // @phpstan-ignore-next-line - [, $tmp] = unpack('c', fread($fileHandle, 1)); + [, $tmp] = \unpack('c', \fread($fileHandle, 1)); return $tmp; } @@ -267,7 +267,7 @@ class OLE private static function readInt2($fileHandle) { // @phpstan-ignore-next-line - [, $tmp] = unpack('v', fread($fileHandle, 2)); + [, $tmp] = \unpack('v', \fread($fileHandle, 2)); return $tmp; } @@ -282,7 +282,7 @@ class OLE private static function readInt4($fileHandle) { // @phpstan-ignore-next-line - [, $tmp] = unpack('V', fread($fileHandle, 4)); + [, $tmp] = \unpack('V', \fread($fileHandle, 4)); return $tmp; } @@ -299,12 +299,12 @@ class OLE { $fh = $this->getStream($blockId); for ($pos = 0; true; $pos += 128) { - fseek($fh, $pos, SEEK_SET); - $nameUtf16 = fread($fh, 64); + \fseek($fh, $pos, SEEK_SET); + $nameUtf16 = \fread($fh, 64); $nameLength = self::readInt2($fh); - $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2); + $nameUtf16 = \substr($nameUtf16, 0, $nameLength - 2); // Simple conversion from UTF-16LE to ISO-8859-1 - $name = str_replace("\x00", '', $nameUtf16); + $name = \str_replace("\x00", '', $nameUtf16); $type = self::readInt1($fh); switch ($type) { case self::OLE_PPS_TYPE_ROOT: @@ -323,18 +323,18 @@ class OLE default: throw new Exception('Unsupported PPS type'); } - fseek($fh, 1, SEEK_CUR); + \fseek($fh, 1, SEEK_CUR); $pps->Type = $type; $pps->Name = $name; $pps->PrevPps = self::readInt4($fh); $pps->NextPps = self::readInt4($fh); $pps->DirPps = self::readInt4($fh); - fseek($fh, 20, SEEK_CUR); - $pps->Time1st = self::OLE2LocalDate(fread($fh, 8)); - $pps->Time2nd = self::OLE2LocalDate(fread($fh, 8)); + \fseek($fh, 20, SEEK_CUR); + $pps->Time1st = self::OLE2LocalDate(\fread($fh, 8)); + $pps->Time2nd = self::OLE2LocalDate(\fread($fh, 8)); $pps->startBlock = self::readInt4($fh); $pps->Size = self::readInt4($fh); - $pps->No = count($this->_list); + $pps->No = \count($this->_list); $this->_list[] = $pps; // check if the PPS tree (starting from root) is complete @@ -342,7 +342,7 @@ class OLE break; } } - fclose($fh); + \fclose($fh); // Initialize $pps->children on directories foreach ($this->_list as $pps) { @@ -350,7 +350,7 @@ class OLE $nos = [$pps->DirPps]; $pps->children = []; while (!empty($nos)) { - $no = array_pop($nos); + $no = \array_pop($nos); if ($no != -1) { $childPps = $this->_list[$no]; $nos[] = $childPps->PrevPps; @@ -425,7 +425,7 @@ class OLE */ public function ppsTotal() { - return count($this->_list); + return \count($this->_list); } /** @@ -448,8 +448,8 @@ class OLE return ''; } $fh = $this->getStream($this->_list[$index]); - $data = stream_get_contents($fh, $length, $position); - fclose($fh); + $data = \stream_get_contents($fh, $length, $position); + \fclose($fh); return $data; } @@ -481,7 +481,7 @@ class OLE public static function ascToUcs($ascii) { $rawname = ''; - $iMax = strlen($ascii); + $iMax = \strlen($ascii); for ($i = 0; $i < $iMax; ++$i) { $rawname .= $ascii[$i] . "\x00"; @@ -517,9 +517,9 @@ class OLE $factor = 2 ** 56; while ($factor >= 1) { - $hex = (int) floor($big_date / $factor); - $res = pack('c', $hex) . $res; - $big_date = fmod($big_date, $factor); + $hex = (int) \floor($big_date / $factor); + $res = \pack('c', $hex) . $res; + $big_date = \fmod($big_date, $factor); $factor /= 256; } @@ -535,12 +535,12 @@ class OLE */ public static function OLE2LocalDate($oleTimestamp) { - if (strlen($oleTimestamp) != 8) { + if (\strlen($oleTimestamp) != 8) { throw new ReaderException('Expecting 8 byte string'); } // convert to units of 100 ns since 1601: - $unpackedTimestamp = unpack('v4', $oleTimestamp); + $unpackedTimestamp = \unpack('v4', $oleTimestamp); $timestampHigh = (float) $unpackedTimestamp[4] * 65536 + (float) $unpackedTimestamp[3]; $timestampLow = (float) $unpackedTimestamp[2] * 65536 + (float) $unpackedTimestamp[1]; @@ -552,7 +552,7 @@ class OLE $days = 134774; // translate to seconds since 1970: - $unixTimestamp = floor(65536.0 * 65536.0 * $timestampHigh + $timestampLow - $days * 24 * 3600 + 0.5); + $unixTimestamp = \floor(65536.0 * 65536.0 * $timestampHigh + $timestampLow - $days * 24 * 3600 + 0.5); return IntOrFloat::evaluate($unixTimestamp); } diff --git a/PhpOffice/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php b/PhpOffice/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php index ee93c05..df46341 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php +++ b/PhpOffice/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php @@ -50,17 +50,17 @@ class ChainedBlockStream { if ($mode != 'r') { if ($options & STREAM_REPORT_ERRORS) { - trigger_error('Only reading is supported', E_USER_WARNING); + \trigger_error('Only reading is supported', E_USER_WARNING); } return false; } // 25 is length of "ole-chainedblockstream://" - parse_str(substr($path, 25), $this->params); + \parse_str(\substr($path, 25), $this->params); if (!isset($this->params['oleInstanceId'], $this->params['blockId'], $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) { if ($options & STREAM_REPORT_ERRORS) { - trigger_error('OLE stream not found', E_USER_WARNING); + \trigger_error('OLE stream not found', E_USER_WARNING); } return false; @@ -75,20 +75,20 @@ class ChainedBlockStream while ($blockId != -2) { $pos = $rootPos + $blockId * $this->ole->bigBlockSize; $blockId = $this->ole->sbat[$blockId]; - fseek($this->ole->_file_handle, $pos); - $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + \fseek($this->ole->_file_handle, $pos); + $this->data .= \fread($this->ole->_file_handle, $this->ole->bigBlockSize); } } else { // Block id refers to big blocks while ($blockId != -2) { $pos = $this->ole->getBlockOffset($blockId); - fseek($this->ole->_file_handle, $pos); - $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + \fseek($this->ole->_file_handle, $pos); + $this->data .= \fread($this->ole->_file_handle, $this->ole->bigBlockSize); $blockId = $this->ole->bbat[$blockId]; } } if (isset($this->params['size'])) { - $this->data = substr($this->data, 0, $this->params['size']); + $this->data = \substr($this->data, 0, $this->params['size']); } if ($options & STREAM_USE_PATH) { @@ -119,7 +119,7 @@ class ChainedBlockStream if ($this->stream_eof()) { return false; } - $s = substr($this->data, $this->pos, $count); + $s = \substr($this->data, $this->pos, $count); $this->pos += $count; return $s; @@ -132,7 +132,7 @@ class ChainedBlockStream */ public function stream_eof() // @codingStandardsIgnoreLine { - return $this->pos >= strlen($this->data); + return $this->pos >= \strlen($this->data); } /** @@ -161,8 +161,8 @@ class ChainedBlockStream } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) { $this->pos += $offset; // @phpstan-ignore-next-line - } elseif ($whence == SEEK_END && -$offset <= count(/** @scrutinizer ignore-type */ $this->data)) { - $this->pos = strlen($this->data) + $offset; + } elseif ($whence == SEEK_END && -$offset <= \count(/** @scrutinizer ignore-type */ $this->data)) { + $this->pos = \strlen($this->data) + $offset; } else { return false; } @@ -179,7 +179,7 @@ class ChainedBlockStream public function stream_stat() // @codingStandardsIgnoreLine { return [ - 'size' => strlen($this->data), + 'size' => \strlen($this->data), ]; } diff --git a/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS.php b/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS.php index d3d86f5..a986688 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS.php +++ b/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS.php @@ -147,7 +147,7 @@ class PPS $this->_data = $data; $this->children = $children; if ($data != '') { - $this->Size = strlen($data); + $this->Size = \strlen($data); } else { $this->Size = 0; } @@ -164,7 +164,7 @@ class PPS return 0; } - return strlen($this->_data); + return \strlen($this->_data); } /** @@ -174,14 +174,14 @@ class PPS */ public function getPpsWk() { - $ret = str_pad($this->Name, 64, "\x00"); + $ret = \str_pad($this->Name, 64, "\x00"); - $ret .= pack('v', strlen($this->Name) + 2) // 66 - . pack('c', $this->Type) // 67 - . pack('c', 0x00) //UK // 68 - . pack('V', $this->PrevPps) //Prev // 72 - . pack('V', $this->NextPps) //Next // 76 - . pack('V', $this->DirPps) //Dir // 80 + $ret .= \pack('v', \strlen($this->Name) + 2) // 66 + . \pack('c', $this->Type) // 67 + . \pack('c', 0x00) //UK // 68 + . \pack('V', $this->PrevPps) //Prev // 72 + . \pack('V', $this->NextPps) //Next // 76 + . \pack('V', $this->DirPps) //Dir // 80 . "\x00\x09\x02\x00" // 84 . "\x00\x00\x00\x00" // 88 . "\xc0\x00\x00\x00" // 92 @@ -189,9 +189,9 @@ class PPS . "\x00\x00\x00\x00" // 100 . OLE::localDateToOLE($this->Time1st) // 108 . OLE::localDateToOLE($this->Time2nd) // 116 - . pack('V', $this->startBlock ?? 0) // 120 - . pack('V', $this->Size) // 124 - . pack('V', 0); // 128 + . \pack('V', $this->startBlock ?? 0) // 120 + . \pack('V', $this->Size) // 124 + . \pack('V', 0); // 128 return $ret; } @@ -209,10 +209,10 @@ class PPS */ public static function savePpsSetPnt(&$raList, $to_save, $depth = 0) { - if (!is_array($to_save) || (empty($to_save))) { + if (!\is_array($to_save) || (empty($to_save))) { return 0xFFFFFFFF; - } elseif (count($to_save) == 1) { - $cnt = count($raList); + } elseif (\count($to_save) == 1) { + $cnt = \count($raList); // If the first entry, it's the root... Don't clone it! $raList[$cnt] = ($depth == 0) ? $to_save[0] : clone $to_save[0]; $raList[$cnt]->No = $cnt; @@ -220,10 +220,10 @@ class PPS $raList[$cnt]->NextPps = 0xFFFFFFFF; $raList[$cnt]->DirPps = self::savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); } else { - $iPos = (int) floor(count($to_save) / 2); - $aPrev = array_slice($to_save, 0, $iPos); - $aNext = array_slice($to_save, $iPos + 1); - $cnt = count($raList); + $iPos = (int) \floor(\count($to_save) / 2); + $aPrev = \array_slice($to_save, 0, $iPos); + $aNext = \array_slice($to_save, $iPos + 1); + $cnt = \count($raList); // If the first entry, it's the root... Don't clone it! $raList[$cnt] = ($depth == 0) ? $to_save[$iPos] : clone $to_save[$iPos]; $raList[$cnt]->No = $cnt; diff --git a/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS/Root.php b/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS/Root.php index 3fe8af2..d9f303c 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS/Root.php +++ b/PhpOffice/PhpSpreadsheet/Shared/OLE/PPS/Root.php @@ -111,27 +111,27 @@ class Root extends PPS // Calculate Basic Setting [$iSBDcnt, $iBBcnt, $iPPScnt] = [0, 0, 0]; $iSBcnt = 0; - $iCount = count($raList); + $iCount = \count($raList); for ($i = 0; $i < $iCount; ++$i) { if ($raList[$i]->Type == OLE::OLE_PPS_TYPE_FILE) { $raList[$i]->Size = $raList[$i]->getDataLen(); if ($raList[$i]->Size < OLE::OLE_DATA_SIZE_SMALL) { - $iSBcnt += floor($raList[$i]->Size / $this->smallBlockSize) + $iSBcnt += \floor($raList[$i]->Size / $this->smallBlockSize) + (($raList[$i]->Size % $this->smallBlockSize) ? 1 : 0); } else { - $iBBcnt += (floor($raList[$i]->Size / $this->bigBlockSize) + + $iBBcnt += (\floor($raList[$i]->Size / $this->bigBlockSize) + (($raList[$i]->Size % $this->bigBlockSize) ? 1 : 0)); } } } $iSmallLen = $iSBcnt * $this->smallBlockSize; - $iSlCnt = floor($this->bigBlockSize / OLE::OLE_LONG_INT_SIZE); - $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt) ? 1 : 0); - $iBBcnt += (floor($iSmallLen / $this->bigBlockSize) + + $iSlCnt = \floor($this->bigBlockSize / OLE::OLE_LONG_INT_SIZE); + $iSBDcnt = \floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt) ? 1 : 0); + $iBBcnt += (\floor($iSmallLen / $this->bigBlockSize) + (($iSmallLen % $this->bigBlockSize) ? 1 : 0)); - $iCnt = count($raList); + $iCnt = \count($raList); $iBdCnt = $this->bigBlockSize / OLE::OLE_PPS_SIZE; - $iPPScnt = (floor($iCnt / $iBdCnt) + (($iCnt % $iBdCnt) ? 1 : 0)); + $iPPScnt = (\floor($iCnt / $iBdCnt) + (($iCnt % $iBdCnt) ? 1 : 0)); return [$iSBDcnt, $iBBcnt, $iPPScnt]; } @@ -147,9 +147,9 @@ class Root extends PPS */ private static function adjust2($i2) { - $iWk = log($i2) / log(2); + $iWk = \log($i2) / \log(2); - return ($iWk > floor($iWk)) ? floor($iWk) + 1 : $iWk; + return ($iWk > \floor($iWk)) ? \floor($iWk) + 1 : $iWk; } /** @@ -170,16 +170,16 @@ class Root extends PPS $iBdExL = 0; $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; $iAllW = $iAll; - $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0); - $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW + $iBdCntW) % $iBlCnt) ? 1 : 0); + $iBdCntW = \floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0); + $iBdCnt = \floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW + $iBdCntW) % $iBlCnt) ? 1 : 0); // Calculate BD count if ($iBdCnt > $i1stBdL) { while (1) { ++$iBdExL; ++$iAllW; - $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0); - $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW + $iBdCntW) % $iBlCnt) ? 1 : 0); + $iBdCntW = \floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0); + $iBdCnt = \floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW + $iBdCntW) % $iBlCnt) ? 1 : 0); if ($iBdCnt <= ($iBdExL * $iBlCnt + $i1stBdL)) { break; } @@ -187,47 +187,47 @@ class Root extends PPS } // Save Header - fwrite( + \fwrite( $FILE, "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" . "\x00\x00\x00\x00" . "\x00\x00\x00\x00" . "\x00\x00\x00\x00" . "\x00\x00\x00\x00" - . pack('v', 0x3b) - . pack('v', 0x03) - . pack('v', -2) - . pack('v', 9) - . pack('v', 6) - . pack('v', 0) + . \pack('v', 0x3b) + . \pack('v', 0x03) + . \pack('v', -2) + . \pack('v', 9) + . \pack('v', 6) + . \pack('v', 0) . "\x00\x00\x00\x00" . "\x00\x00\x00\x00" - . pack('V', $iBdCnt) - . pack('V', $iBBcnt + $iSBDcnt) //ROOT START - . pack('V', 0) - . pack('V', 0x1000) - . pack('V', $iSBDcnt ? 0 : -2) //Small Block Depot - . pack('V', $iSBDcnt) + . \pack('V', $iBdCnt) + . \pack('V', $iBBcnt + $iSBDcnt) //ROOT START + . \pack('V', 0) + . \pack('V', 0x1000) + . \pack('V', $iSBDcnt ? 0 : -2) //Small Block Depot + . \pack('V', $iSBDcnt) ); // Extra BDList Start, Count if ($iBdCnt < $i1stBdL) { - fwrite( + \fwrite( $FILE, - pack('V', -2) // Extra BDList Start - . pack('V', 0)// Extra BDList Count + \pack('V', -2) // Extra BDList Start + . \pack('V', 0)// Extra BDList Count ); } else { - fwrite($FILE, pack('V', $iAll + $iBdCnt) . pack('V', $iBdExL)); + \fwrite($FILE, \pack('V', $iAll + $iBdCnt) . \pack('V', $iBdExL)); } // BDList for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; ++$i) { - fwrite($FILE, pack('V', $iAll + $i)); + \fwrite($FILE, \pack('V', $iAll + $i)); } if ($i < $i1stBdL) { $jB = $i1stBdL - $i; for ($j = 0; $j < $jB; ++$j) { - fwrite($FILE, (pack('V', -1))); + \fwrite($FILE, (\pack('V', -1))); } } } @@ -243,20 +243,20 @@ class Root extends PPS $FILE = $this->fileHandle; // cycle through PPS's - $iCount = count($raList); + $iCount = \count($raList); for ($i = 0; $i < $iCount; ++$i) { if ($raList[$i]->Type != OLE::OLE_PPS_TYPE_DIR) { $raList[$i]->Size = $raList[$i]->getDataLen(); if (($raList[$i]->Size >= OLE::OLE_DATA_SIZE_SMALL) || (($raList[$i]->Type == OLE::OLE_PPS_TYPE_ROOT) && isset($raList[$i]->_data))) { - fwrite($FILE, $raList[$i]->_data); + \fwrite($FILE, $raList[$i]->_data); if ($raList[$i]->Size % $this->bigBlockSize) { - fwrite($FILE, str_repeat("\x00", $this->bigBlockSize - ($raList[$i]->Size % $this->bigBlockSize))); + \fwrite($FILE, \str_repeat("\x00", $this->bigBlockSize - ($raList[$i]->Size % $this->bigBlockSize))); } // Set For PPS $raList[$i]->startBlock = $iStBlk; $iStBlk += - (floor($raList[$i]->Size / $this->bigBlockSize) + + (\floor($raList[$i]->Size / $this->bigBlockSize) + (($raList[$i]->Size % $this->bigBlockSize) ? 1 : 0)); } } @@ -276,7 +276,7 @@ class Root extends PPS $FILE = $this->fileHandle; $iSmBlk = 0; - $iCount = count($raList); + $iCount = \count($raList); for ($i = 0; $i < $iCount; ++$i) { // Make SBD, small data string if ($raList[$i]->Type == OLE::OLE_PPS_TYPE_FILE) { @@ -284,19 +284,19 @@ class Root extends PPS continue; } if ($raList[$i]->Size < OLE::OLE_DATA_SIZE_SMALL) { - $iSmbCnt = floor($raList[$i]->Size / $this->smallBlockSize) + $iSmbCnt = \floor($raList[$i]->Size / $this->smallBlockSize) + (($raList[$i]->Size % $this->smallBlockSize) ? 1 : 0); // Add to SBD $jB = $iSmbCnt - 1; for ($j = 0; $j < $jB; ++$j) { - fwrite($FILE, pack('V', $j + $iSmBlk + 1)); + \fwrite($FILE, \pack('V', $j + $iSmBlk + 1)); } - fwrite($FILE, pack('V', -2)); + \fwrite($FILE, \pack('V', -2)); // Add to Data String(this will be written for RootEntry) $sRes .= $raList[$i]->_data; if ($raList[$i]->Size % $this->smallBlockSize) { - $sRes .= str_repeat("\x00", $this->smallBlockSize - ($raList[$i]->Size % $this->smallBlockSize)); + $sRes .= \str_repeat("\x00", $this->smallBlockSize - ($raList[$i]->Size % $this->smallBlockSize)); } // Set for PPS $raList[$i]->startBlock = $iSmBlk; @@ -304,11 +304,11 @@ class Root extends PPS } } } - $iSbCnt = floor($this->bigBlockSize / OLE::OLE_LONG_INT_SIZE); + $iSbCnt = \floor($this->bigBlockSize / OLE::OLE_LONG_INT_SIZE); if ($iSmBlk % $iSbCnt) { $iB = $iSbCnt - ($iSmBlk % $iSbCnt); for ($i = 0; $i < $iB; ++$i) { - fwrite($FILE, pack('V', -1)); + \fwrite($FILE, \pack('V', -1)); } } @@ -323,15 +323,15 @@ class Root extends PPS private function savePps(&$raList): void { // Save each PPS WK - $iC = count($raList); + $iC = \count($raList); for ($i = 0; $i < $iC; ++$i) { - fwrite($this->fileHandle, $raList[$i]->getPpsWk()); + \fwrite($this->fileHandle, $raList[$i]->getPpsWk()); } // Adjust for Block - $iCnt = count($raList); + $iCnt = \count($raList); $iBCnt = $this->bigBlockSize / OLE::OLE_PPS_SIZE; if ($iCnt % $iBCnt) { - fwrite($this->fileHandle, str_repeat("\x00", ($iBCnt - ($iCnt % $iBCnt)) * OLE::OLE_PPS_SIZE)); + \fwrite($this->fileHandle, \str_repeat("\x00", ($iBCnt - ($iCnt % $iBCnt)) * OLE::OLE_PPS_SIZE)); } } @@ -352,15 +352,15 @@ class Root extends PPS $iBdExL = 0; $iAll = $iBsize + $iPpsCnt + $iSbdSize; $iAllW = $iAll; - $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0); - $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW + $iBdCntW) % $iBbCnt) ? 1 : 0); + $iBdCntW = \floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0); + $iBdCnt = \floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW + $iBdCntW) % $iBbCnt) ? 1 : 0); // Calculate BD count if ($iBdCnt > $i1stBdL) { while (1) { ++$iBdExL; ++$iAllW; - $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0); - $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW + $iBdCntW) % $iBbCnt) ? 1 : 0); + $iBdCntW = \floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0); + $iBdCnt = \floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW + $iBdCntW) % $iBbCnt) ? 1 : 0); if ($iBdCnt <= ($iBdExL * $iBbCnt + $i1stBdL)) { break; } @@ -371,34 +371,34 @@ class Root extends PPS // Set for SBD if ($iSbdSize > 0) { for ($i = 0; $i < ($iSbdSize - 1); ++$i) { - fwrite($FILE, pack('V', $i + 1)); + \fwrite($FILE, \pack('V', $i + 1)); } - fwrite($FILE, pack('V', -2)); + \fwrite($FILE, \pack('V', -2)); } // Set for B for ($i = 0; $i < ($iBsize - 1); ++$i) { - fwrite($FILE, pack('V', $i + $iSbdSize + 1)); + \fwrite($FILE, \pack('V', $i + $iSbdSize + 1)); } - fwrite($FILE, pack('V', -2)); + \fwrite($FILE, \pack('V', -2)); // Set for PPS for ($i = 0; $i < ($iPpsCnt - 1); ++$i) { - fwrite($FILE, pack('V', $i + $iSbdSize + $iBsize + 1)); + \fwrite($FILE, \pack('V', $i + $iSbdSize + $iBsize + 1)); } - fwrite($FILE, pack('V', -2)); + \fwrite($FILE, \pack('V', -2)); // Set for BBD itself ( 0xFFFFFFFD : BBD) for ($i = 0; $i < $iBdCnt; ++$i) { - fwrite($FILE, pack('V', 0xFFFFFFFD)); + \fwrite($FILE, \pack('V', 0xFFFFFFFD)); } // Set for ExtraBDList for ($i = 0; $i < $iBdExL; ++$i) { - fwrite($FILE, pack('V', 0xFFFFFFFC)); + \fwrite($FILE, \pack('V', 0xFFFFFFFC)); } // Adjust for Block if (($iAllW + $iBdCnt) % $iBbCnt) { $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); for ($i = 0; $i < $iBlock; ++$i) { - fwrite($FILE, pack('V', -1)); + \fwrite($FILE, \pack('V', -1)); } } // Extra BDList @@ -409,17 +409,17 @@ class Root extends PPS if ($iN >= ($iBbCnt - 1)) { $iN = 0; ++$iNb; - fwrite($FILE, pack('V', $iAll + $iBdCnt + $iNb)); + \fwrite($FILE, \pack('V', $iAll + $iBdCnt + $iNb)); } - fwrite($FILE, pack('V', $iBsize + $iSbdSize + $iPpsCnt + $i)); + \fwrite($FILE, \pack('V', $iBsize + $iSbdSize + $iPpsCnt + $i)); } if (($iBdCnt - $i1stBdL) % ($iBbCnt - 1)) { $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1)); for ($i = 0; $i < $iB; ++$i) { - fwrite($FILE, pack('V', -1)); + \fwrite($FILE, \pack('V', -1)); } } - fwrite($FILE, pack('V', -2)); + \fwrite($FILE, \pack('V', -2)); } } } diff --git a/PhpOffice/PhpSpreadsheet/Shared/OLERead.php b/PhpOffice/PhpSpreadsheet/Shared/OLERead.php index b3e35c5..3e316c5 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/OLERead.php +++ b/PhpOffice/PhpSpreadsheet/Shared/OLERead.php @@ -99,16 +99,16 @@ class OLERead // Get the file identifier // Don't bother reading the whole file until we know it's a valid OLE file - $this->data = file_get_contents($filename, false, null, 0, 8); + $this->data = \file_get_contents($filename, false, null, 0, 8); // Check OLE identifier - $identifierOle = pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1); + $identifierOle = \pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1); if ($this->data != $identifierOle) { throw new ReaderException('The filename ' . $filename . ' is not recognised as an OLE file'); } // Get the file data - $this->data = file_get_contents($filename); + $this->data = \file_get_contents($filename); // Total number of sectors used for the SAT $this->numBigBlockDepotBlocks = self::getInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); @@ -141,7 +141,7 @@ class OLERead for ($j = 0; $j < $this->numExtensionBlocks; ++$j) { $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE; - $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); + $blocksToRead = \min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); @@ -160,7 +160,7 @@ class OLERead for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) { $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; - $this->bigBlockChain .= substr($this->data, $pos, 4 * $bbs); + $this->bigBlockChain .= \substr($this->data, $pos, 4 * $bbs); $pos += 4 * $bbs; } @@ -169,7 +169,7 @@ class OLERead while ($sbdBlock != -2) { $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; - $this->smallBlockChain .= substr($this->data, $pos, 4 * $bbs); + $this->smallBlockChain .= \substr($this->data, $pos, 4 * $bbs); $pos += 4 * $bbs; $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock * 4); @@ -204,7 +204,7 @@ class OLERead while ($block != -2) { $pos = $block * self::SMALL_BLOCK_SIZE; - $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); + $streamData .= \substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); $block = self::getInt4d($this->smallBlockChain, $block * 4); } @@ -224,7 +224,7 @@ class OLERead while ($block != -2) { $pos = ($block + 1) * self::BIG_BLOCK_SIZE; - $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $streamData .= \substr($this->data, $pos, self::BIG_BLOCK_SIZE); $block = self::getInt4d($this->bigBlockChain, $block * 4); } @@ -244,7 +244,7 @@ class OLERead while ($block != -2) { $pos = ($block + 1) * self::BIG_BLOCK_SIZE; - $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $data .= \substr($this->data, $pos, self::BIG_BLOCK_SIZE); $block = self::getInt4d($this->bigBlockChain, $block * 4); } @@ -259,16 +259,16 @@ class OLERead $offset = 0; // loop through entires, each entry is 128 bytes - $entryLen = strlen($this->entry); + $entryLen = \strlen($this->entry); while ($offset < $entryLen) { // entry data (128 bytes) - $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + $d = \substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); // size in bytes of name - $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS + 1]) << 8); + $nameSize = \ord($d[self::SIZE_OF_NAME_POS]) | (\ord($d[self::SIZE_OF_NAME_POS + 1]) << 8); // type of entry - $type = ord($d[self::TYPE_POS]); + $type = \ord($d[self::TYPE_POS]); // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) // sectorID of first sector of the short-stream container stream, if this entry is root entry @@ -276,7 +276,7 @@ class OLERead $size = self::getInt4d($d, self::SIZE_POS); - $name = str_replace("\x00", '', substr($d, 0, $nameSize)); + $name = \str_replace("\x00", '', \substr($d, 0, $nameSize)); $this->props[] = [ 'name' => $name, @@ -286,24 +286,24 @@ class OLERead ]; // tmp helper to simplify checks - $upName = strtoupper($name); + $upName = \strtoupper($name); // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook) if (($upName === 'WORKBOOK') || ($upName === 'BOOK')) { - $this->wrkbook = count($this->props) - 1; + $this->wrkbook = \count($this->props) - 1; } elseif ($upName === 'ROOT ENTRY' || $upName === 'R') { // Root entry - $this->rootentry = count($this->props) - 1; + $this->rootentry = \count($this->props) - 1; } // Summary information - if ($name == chr(5) . 'SummaryInformation') { - $this->summaryInformation = count($this->props) - 1; + if ($name == \chr(5) . 'SummaryInformation') { + $this->summaryInformation = \count($this->props) - 1; } // Additional Document Summary information - if ($name == chr(5) . 'DocumentSummaryInformation') { - $this->documentSummaryInformation = count($this->props) - 1; + if ($name == \chr(5) . 'DocumentSummaryInformation') { + $this->documentSummaryInformation = \count($this->props) - 1; } $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; @@ -325,22 +325,22 @@ class OLERead throw new ReaderException('Parameter pos=' . $pos . ' is invalid.'); } - $len = strlen($data); + $len = \strlen($data); if ($len < $pos + 4) { - $data .= str_repeat("\0", $pos + 4 - $len); + $data .= \str_repeat("\0", $pos + 4 - $len); } // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 // Changed by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $_or_24 = ord($data[$pos + 3]); + $_or_24 = \ord($data[$pos + 3]); if ($_or_24 >= 128) { // negative number - $_ord_24 = -abs((256 - $_or_24) << 24); + $_ord_24 = -\abs((256 - $_or_24) << 24); } else { $_ord_24 = ($_or_24 & 127) << 24; } - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + return \ord($data[$pos]) | (\ord($data[$pos + 1]) << 8) | (\ord($data[$pos + 2]) << 16) | $_ord_24; } } diff --git a/PhpOffice/PhpSpreadsheet/Shared/PasswordHasher.php b/PhpOffice/PhpSpreadsheet/Shared/PasswordHasher.php index e9414f9..9f4c799 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/PasswordHasher.php +++ b/PhpOffice/PhpSpreadsheet/Shared/PasswordHasher.php @@ -32,7 +32,7 @@ class PasswordHasher Protection::ALGORITHM_WHIRLPOOL => 'whirlpool', ]; - if (array_key_exists($algorithmName, $mapping)) { + if (\array_key_exists($algorithmName, $mapping)) { return $mapping[$algorithmName]; } @@ -58,18 +58,18 @@ class PasswordHasher private static function defaultHashPassword(string $password): string { $verifier = 0; - $pwlen = strlen($password); - $passwordArray = pack('c', $pwlen) . $password; + $pwlen = \strlen($password); + $passwordArray = \pack('c', $pwlen) . $password; for ($i = $pwlen; $i >= 0; --$i) { $intermediate1 = (($verifier & 0x4000) === 0) ? 0 : 1; $intermediate2 = 2 * $verifier; $intermediate2 = $intermediate2 & 0x7fff; $intermediate3 = $intermediate1 | $intermediate2; - $verifier = $intermediate3 ^ ord($passwordArray[$i]); + $verifier = $intermediate3 ^ \ord($passwordArray[$i]); } $verifier ^= 0xCE4B; - return strtoupper(dechex($verifier)); + return \strtoupper(\dechex($verifier)); } /** @@ -88,7 +88,7 @@ class PasswordHasher */ public static function hashPassword(string $password, string $algorithm = '', string $salt = '', int $spinCount = 10000): string { - if (strlen($password) > self::MAX_PASSWORD_LENGTH) { + if (\strlen($password) > self::MAX_PASSWORD_LENGTH) { throw new SpException('Password exceeds ' . self::MAX_PASSWORD_LENGTH . ' characters'); } $phpAlgorithm = self::getAlgorithm($algorithm); @@ -96,14 +96,14 @@ class PasswordHasher return self::defaultHashPassword($password); } - $saltValue = base64_decode($salt); - $encodedPassword = mb_convert_encoding($password, 'UCS-2LE', 'UTF-8'); + $saltValue = \base64_decode($salt); + $encodedPassword = \mb_convert_encoding($password, 'UCS-2LE', 'UTF-8'); - $hashValue = hash($phpAlgorithm, $saltValue . /** @scrutinizer ignore-type */ $encodedPassword, true); + $hashValue = \hash($phpAlgorithm, $saltValue . /** @scrutinizer ignore-type */ $encodedPassword, true); for ($i = 0; $i < $spinCount; ++$i) { - $hashValue = hash($phpAlgorithm, $hashValue . pack('L', $i), true); + $hashValue = \hash($phpAlgorithm, $hashValue . \pack('L', $i), true); } - return base64_encode($hashValue); + return \base64_encode($hashValue); } } diff --git a/PhpOffice/PhpSpreadsheet/Shared/StringHelper.php b/PhpOffice/PhpSpreadsheet/Shared/StringHelper.php index 30bd8c5..979c6c5 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/StringHelper.php +++ b/PhpOffice/PhpSpreadsheet/Shared/StringHelper.php @@ -60,8 +60,8 @@ class StringHelper { for ($i = 0; $i <= 31; ++$i) { if ($i != 9 && $i != 10 && $i != 13) { - $find = '_x' . sprintf('%04s', strtoupper(dechex($i))) . '_'; - $replace = chr($i); + $find = '_x' . \sprintf('%04s', \strtoupper(\dechex($i))) . '_'; + $replace = \chr($i); self::$controlCharacters[$find] = $replace; } } @@ -73,39 +73,39 @@ class StringHelper private static function buildSYLKCharacters(): void { self::$SYLKCharacters = [ - "\x1B 0" => chr(0), - "\x1B 1" => chr(1), - "\x1B 2" => chr(2), - "\x1B 3" => chr(3), - "\x1B 4" => chr(4), - "\x1B 5" => chr(5), - "\x1B 6" => chr(6), - "\x1B 7" => chr(7), - "\x1B 8" => chr(8), - "\x1B 9" => chr(9), - "\x1B :" => chr(10), - "\x1B ;" => chr(11), - "\x1B <" => chr(12), - "\x1B =" => chr(13), - "\x1B >" => chr(14), - "\x1B ?" => chr(15), - "\x1B!0" => chr(16), - "\x1B!1" => chr(17), - "\x1B!2" => chr(18), - "\x1B!3" => chr(19), - "\x1B!4" => chr(20), - "\x1B!5" => chr(21), - "\x1B!6" => chr(22), - "\x1B!7" => chr(23), - "\x1B!8" => chr(24), - "\x1B!9" => chr(25), - "\x1B!:" => chr(26), - "\x1B!;" => chr(27), - "\x1B!<" => chr(28), - "\x1B!=" => chr(29), - "\x1B!>" => chr(30), - "\x1B!?" => chr(31), - "\x1B'?" => chr(127), + "\x1B 0" => \chr(0), + "\x1B 1" => \chr(1), + "\x1B 2" => \chr(2), + "\x1B 3" => \chr(3), + "\x1B 4" => \chr(4), + "\x1B 5" => \chr(5), + "\x1B 6" => \chr(6), + "\x1B 7" => \chr(7), + "\x1B 8" => \chr(8), + "\x1B 9" => \chr(9), + "\x1B :" => \chr(10), + "\x1B ;" => \chr(11), + "\x1B <" => \chr(12), + "\x1B =" => \chr(13), + "\x1B >" => \chr(14), + "\x1B ?" => \chr(15), + "\x1B!0" => \chr(16), + "\x1B!1" => \chr(17), + "\x1B!2" => \chr(18), + "\x1B!3" => \chr(19), + "\x1B!4" => \chr(20), + "\x1B!5" => \chr(21), + "\x1B!6" => \chr(22), + "\x1B!7" => \chr(23), + "\x1B!8" => \chr(24), + "\x1B!9" => \chr(25), + "\x1B!:" => \chr(26), + "\x1B!;" => \chr(27), + "\x1B!<" => \chr(28), + "\x1B!=" => \chr(29), + "\x1B!>" => \chr(30), + "\x1B!?" => \chr(31), + "\x1B'?" => \chr(127), "\x1B(0" => '€', // 128 in CP1252 "\x1B(2" => '‚', // 130 in CP1252 "\x1B(3" => 'ƒ', // 131 in CP1252 @@ -247,18 +247,18 @@ class StringHelper self::$isIconvEnabled = true; // Fail if iconv doesn't exist - if (!function_exists('iconv')) { + if (!\function_exists('iconv')) { self::$isIconvEnabled = false; - } elseif (!@iconv('UTF-8', 'UTF-16LE', 'x')) { + } elseif (!@\iconv('UTF-8', 'UTF-16LE', 'x')) { // Sometimes iconv is not working, and e.g. iconv('UTF-8', 'UTF-16LE', 'x') just returns false, self::$isIconvEnabled = false; - } elseif (defined('PHP_OS') && @stristr(PHP_OS, 'AIX') && defined('ICONV_IMPL') && (@strcasecmp(ICONV_IMPL, 'unknown') == 0) && defined('ICONV_VERSION') && (@strcasecmp(ICONV_VERSION, 'unknown') == 0)) { + } elseif (\defined('PHP_OS') && @\stristr(PHP_OS, 'AIX') && \defined('ICONV_IMPL') && (@\strcasecmp(ICONV_IMPL, 'unknown') == 0) && \defined('ICONV_VERSION') && (@\strcasecmp(ICONV_VERSION, 'unknown') == 0)) { // CUSTOM: IBM AIX iconv() does not work self::$isIconvEnabled = false; } // Deactivate iconv default options if they fail (as seen on IMB i) - if (self::$isIconvEnabled && !@iconv('UTF-8', 'UTF-16LE' . self::$iconvOptions, 'x')) { + if (self::$isIconvEnabled && !@\iconv('UTF-8', 'UTF-16LE' . self::$iconvOptions, 'x')) { self::$iconvOptions = ''; } @@ -295,7 +295,7 @@ class StringHelper { self::buildCharacterSets(); - return str_replace(array_keys(self::$controlCharacters), array_values(self::$controlCharacters), $textValue); + return \str_replace(\array_keys(self::$controlCharacters), \array_values(self::$controlCharacters), $textValue); } /** @@ -317,7 +317,7 @@ class StringHelper { self::buildCharacterSets(); - return str_replace(array_values(self::$controlCharacters), array_keys(self::$controlCharacters), $textValue); + return \str_replace(\array_values(self::$controlCharacters), \array_keys(self::$controlCharacters), $textValue); } /** @@ -325,12 +325,12 @@ class StringHelper */ public static function sanitizeUTF8(string $textValue): string { - $textValue = str_replace(["\xef\xbf\xbe", "\xef\xbf\xbf"], "\xef\xbf\xbd", $textValue); - $subst = mb_substitute_character(); // default is question mark - mb_substitute_character(65533); // Unicode substitution character + $textValue = \str_replace(["\xef\xbf\xbe", "\xef\xbf\xbf"], "\xef\xbf\xbd", $textValue); + $subst = \mb_substitute_character(); // default is question mark + \mb_substitute_character(65533); // Unicode substitution character // Phpstan does not think this can return false. - $returnValue = mb_convert_encoding($textValue, 'UTF-8', 'UTF-8'); - mb_substitute_character(/** @scrutinizer ignore-type */ $subst); + $returnValue = \mb_convert_encoding($textValue, 'UTF-8', 'UTF-8'); + \mb_substitute_character(/** @scrutinizer ignore-type */ $subst); return self::returnString($returnValue); } @@ -342,7 +342,7 @@ class StringHelper */ private static function returnString($value): string { - return is_string($value) ? $value : ''; + return \is_string($value) ? $value : ''; } /** @@ -361,8 +361,8 @@ class StringHelper */ public static function formatNumber($numericValue): string { - if (is_float($numericValue)) { - return str_replace(',', '.', (string) $numericValue); + if (\is_float($numericValue)) { + return \str_replace(',', '.', (string) $numericValue); } return (string) $numericValue; @@ -384,17 +384,17 @@ class StringHelper $ln = self::countCharacters($textValue, 'UTF-8'); // option flags if (empty($arrcRuns)) { - $data = pack('CC', $ln, 0x0001); + $data = \pack('CC', $ln, 0x0001); // characters $data .= self::convertEncoding($textValue, 'UTF-16LE', 'UTF-8'); } else { - $data = pack('vC', $ln, 0x09); - $data .= pack('v', count($arrcRuns)); + $data = \pack('vC', $ln, 0x09); + $data .= \pack('v', \count($arrcRuns)); // characters $data .= self::convertEncoding($textValue, 'UTF-16LE', 'UTF-8'); foreach ($arrcRuns as $cRun) { - $data .= pack('v', $cRun['strlen']); - $data .= pack('v', $cRun['fontidx']); + $data .= \pack('v', $cRun['strlen']); + $data .= \pack('v', $cRun['fontidx']); } } @@ -418,7 +418,7 @@ class StringHelper // characters $chars = self::convertEncoding($textValue, 'UTF-16LE', 'UTF-8'); - return pack('vC', $ln, 0x0001) . $chars; + return \pack('vC', $ln, 0x0001) . $chars; } /** @@ -430,13 +430,13 @@ class StringHelper public static function convertEncoding(string $textValue, string $to, string $from): string { if (self::getIsIconvEnabled()) { - $result = iconv($from, $to . self::$iconvOptions, $textValue); + $result = \iconv($from, $to . self::$iconvOptions, $textValue); if (false !== $result) { return $result; } } - return self::returnString(mb_convert_encoding($textValue, $to, $from)); + return self::returnString(\mb_convert_encoding($textValue, $to, $from)); } /** @@ -448,7 +448,7 @@ class StringHelper */ public static function countCharacters(string $textValue, string $encoding = 'UTF-8'): int { - return mb_strlen($textValue, $encoding); + return \mb_strlen($textValue, $encoding); } /** @@ -460,7 +460,7 @@ class StringHelper */ public static function substring(string $textValue, int $offset, ?int $length = 0): string { - return mb_substr($textValue, $offset, $length, 'UTF-8'); + return \mb_substr($textValue, $offset, $length, 'UTF-8'); } /** @@ -470,7 +470,7 @@ class StringHelper */ public static function strToUpper(string $textValue): string { - return mb_convert_case($textValue, MB_CASE_UPPER, 'UTF-8'); + return \mb_convert_case($textValue, MB_CASE_UPPER, 'UTF-8'); } /** @@ -480,7 +480,7 @@ class StringHelper */ public static function strToLower(string $textValue): string { - return mb_convert_case($textValue, MB_CASE_LOWER, 'UTF-8'); + return \mb_convert_case($textValue, MB_CASE_LOWER, 'UTF-8'); } /** @@ -491,12 +491,12 @@ class StringHelper */ public static function strToTitle(string $textValue): string { - return mb_convert_case($textValue, MB_CASE_TITLE, 'UTF-8'); + return \mb_convert_case($textValue, MB_CASE_TITLE, 'UTF-8'); } public static function mbIsUpper(string $character): bool { - return mb_strtolower($character, 'UTF-8') !== $character; + return \mb_strtolower($character, 'UTF-8') !== $character; } /** @@ -506,7 +506,7 @@ class StringHelper { // Split at all position not after the start: ^ // and not before the end: $ - $split = preg_split('/(? $v) { - $textValue = str_replace($k, $v, $textValue); + $textValue = \str_replace($k, $v, $textValue); } return $textValue; @@ -662,11 +662,11 @@ class StringHelper */ public static function testStringAsNumeric($textValue) { - if (is_numeric($textValue)) { + if (\is_numeric($textValue)) { return $textValue; } $v = (float) $textValue; - return (is_numeric(substr($textValue, 0, strlen((string) $v)))) ? $v : $textValue; + return (\is_numeric(\substr($textValue, 0, \strlen((string) $v)))) ? $v : $textValue; } } diff --git a/PhpOffice/PhpSpreadsheet/Shared/TimeZone.php b/PhpOffice/PhpSpreadsheet/Shared/TimeZone.php index 324e342..cbe0edc 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/TimeZone.php +++ b/PhpOffice/PhpSpreadsheet/Shared/TimeZone.php @@ -23,7 +23,7 @@ class TimeZone */ private static function validateTimeZone(string $timezoneName): bool { - return in_array($timezoneName, DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC), true); + return \in_array($timezoneName, \DateTimeZone::listIdentifiers(\DateTimeZone::ALL_WITH_BC), true); } /** @@ -70,7 +70,7 @@ class TimeZone if (!self::validateTimeZone($timezoneName)) { throw new PhpSpreadsheetException("Invalid timezone $timezoneName"); } - $dtobj->setTimeZone(new DateTimeZone($timezoneName)); + $dtobj->setTimeZone(new \DateTimeZone($timezoneName)); return $dtobj->getOffset(); } diff --git a/PhpOffice/PhpSpreadsheet/Shared/Trend/BestFit.php b/PhpOffice/PhpSpreadsheet/Shared/Trend/BestFit.php index b2b0d94..ec352d7 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Trend/BestFit.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Trend/BestFit.php @@ -138,7 +138,7 @@ abstract class BestFit public function getSlope($dp = 0) { if ($dp != 0) { - return round($this->slope, $dp); + return \round($this->slope, $dp); } return $this->slope; @@ -154,7 +154,7 @@ abstract class BestFit public function getSlopeSE($dp = 0) { if ($dp != 0) { - return round($this->slopeSE, $dp); + return \round($this->slopeSE, $dp); } return $this->slopeSE; @@ -170,7 +170,7 @@ abstract class BestFit public function getIntersect($dp = 0) { if ($dp != 0) { - return round($this->intersect, $dp); + return \round($this->intersect, $dp); } return $this->intersect; @@ -186,7 +186,7 @@ abstract class BestFit public function getIntersectSE($dp = 0) { if ($dp != 0) { - return round($this->intersectSE, $dp); + return \round($this->intersectSE, $dp); } return $this->intersectSE; @@ -202,7 +202,7 @@ abstract class BestFit public function getGoodnessOfFit($dp = 0) { if ($dp != 0) { - return round($this->goodnessOfFit, $dp); + return \round($this->goodnessOfFit, $dp); } return $this->goodnessOfFit; @@ -218,7 +218,7 @@ abstract class BestFit public function getGoodnessOfFitPercent($dp = 0) { if ($dp != 0) { - return round($this->goodnessOfFit * 100, $dp); + return \round($this->goodnessOfFit * 100, $dp); } return $this->goodnessOfFit * 100; @@ -234,7 +234,7 @@ abstract class BestFit public function getStdevOfResiduals($dp = 0) { if ($dp != 0) { - return round($this->stdevOfResiduals, $dp); + return \round($this->stdevOfResiduals, $dp); } return $this->stdevOfResiduals; @@ -248,7 +248,7 @@ abstract class BestFit public function getSSRegression($dp = 0) { if ($dp != 0) { - return round($this->SSRegression, $dp); + return \round($this->SSRegression, $dp); } return $this->SSRegression; @@ -262,7 +262,7 @@ abstract class BestFit public function getSSResiduals($dp = 0) { if ($dp != 0) { - return round($this->SSResiduals, $dp); + return \round($this->SSResiduals, $dp); } return $this->SSResiduals; @@ -276,7 +276,7 @@ abstract class BestFit public function getDFResiduals($dp = 0) { if ($dp != 0) { - return round($this->DFResiduals, $dp); + return \round($this->DFResiduals, $dp); } return $this->DFResiduals; @@ -290,7 +290,7 @@ abstract class BestFit public function getF($dp = 0) { if ($dp != 0) { - return round($this->f, $dp); + return \round($this->f, $dp); } return $this->f; @@ -304,7 +304,7 @@ abstract class BestFit public function getCovariance($dp = 0) { if ($dp != 0) { - return round($this->covariance, $dp); + return \round($this->covariance, $dp); } return $this->covariance; @@ -318,7 +318,7 @@ abstract class BestFit public function getCorrelation($dp = 0) { if ($dp != 0) { - return round($this->correlation, $dp); + return \round($this->correlation, $dp); } return $this->correlation; @@ -370,7 +370,7 @@ abstract class BestFit if ($this->DFResiduals == 0.0) { $this->stdevOfResiduals = 0.0; } else { - $this->stdevOfResiduals = sqrt($SSres / $this->DFResiduals); + $this->stdevOfResiduals = \sqrt($SSres / $this->DFResiduals); } // Scrutinizer thinks $SSres == $SStot is always true. It is wrong. if ($SStot == self::$scrutinizerZeroPointZero || self::scrutinizerLooseCompare($SSres, $SStot)) { @@ -381,9 +381,9 @@ abstract class BestFit $this->SSRegression = $this->goodnessOfFit * $SStot; $this->covariance = $SScov / $this->valueCount; - $this->correlation = ($this->valueCount * $sumXY - $sumX * $sumY) / sqrt(($this->valueCount * $sumX2 - $sumX ** 2) * ($this->valueCount * $sumY2 - $sumY ** 2)); - $this->slopeSE = $this->stdevOfResiduals / sqrt($SSsex); - $this->intersectSE = $this->stdevOfResiduals * sqrt(1 / ($this->valueCount - ($sumX * $sumX) / $sumX2)); + $this->correlation = ($this->valueCount * $sumXY - $sumX * $sumY) / \sqrt(($this->valueCount * $sumX2 - $sumX ** 2) * ($this->valueCount * $sumY2 - $sumY ** 2)); + $this->slopeSE = $this->stdevOfResiduals / \sqrt($SSsex); + $this->intersectSE = $this->stdevOfResiduals * \sqrt(1 / ($this->valueCount - ($sumX * $sumX) / $sumX2)); if ($this->SSResiduals != 0.0) { if ($this->DFResiduals == 0.0) { $this->f = 0.0; @@ -401,8 +401,8 @@ abstract class BestFit private function sumSquares(array $values) { - return array_sum( - array_map( + return \array_sum( + \array_map( function ($value) { return $value ** 2; }, @@ -418,8 +418,8 @@ abstract class BestFit protected function leastSquareFit(array $yValues, array $xValues, bool $const): void { // calculate sums - $sumValuesX = array_sum($xValues); - $sumValuesY = array_sum($yValues); + $sumValuesX = \array_sum($xValues); + $sumValuesY = \array_sum($yValues); $meanValueX = $sumValuesX / $this->valueCount; $meanValueY = $sumValuesY / $this->valueCount; $sumSquaresX = $this->sumSquares($xValues); @@ -456,12 +456,12 @@ abstract class BestFit public function __construct($yValues, $xValues = []) { // Calculate number of points - $yValueCount = count($yValues); - $xValueCount = count($xValues); + $yValueCount = \count($yValues); + $xValueCount = \count($xValues); // Define X Values if necessary if ($xValueCount === 0) { - $xValues = range(1, $yValueCount); + $xValues = \range(1, $yValueCount); } elseif ($yValueCount !== $xValueCount) { // Ensure both arrays of points are the same size $this->error = true; diff --git a/PhpOffice/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php b/PhpOffice/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php index eb8cd74..9851cc5 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php @@ -33,7 +33,7 @@ class ExponentialBestFit extends BestFit */ public function getValueOfXForY($yValue) { - return log(($yValue + $this->yOffset) / $this->getIntersect()) / log($this->getSlope()); + return \log(($yValue + $this->yOffset) / $this->getIntersect()) / \log($this->getSlope()); } /** @@ -61,10 +61,10 @@ class ExponentialBestFit extends BestFit public function getSlope($dp = 0) { if ($dp != 0) { - return round(exp($this->slope), $dp); + return \round(\exp($this->slope), $dp); } - return exp($this->slope); + return \exp($this->slope); } /** @@ -77,10 +77,10 @@ class ExponentialBestFit extends BestFit public function getIntersect($dp = 0) { if ($dp != 0) { - return round(exp($this->intersect), $dp); + return \round(\exp($this->intersect), $dp); } - return exp($this->intersect); + return \exp($this->intersect); } /** @@ -91,9 +91,9 @@ class ExponentialBestFit extends BestFit */ private function exponentialRegression(array $yValues, array $xValues, bool $const): void { - $adjustedYValues = array_map( + $adjustedYValues = \array_map( function ($value) { - return ($value < 0.0) ? 0 - log(abs($value)) : log($value); + return ($value < 0.0) ? 0 - \log(\abs($value)) : \log($value); }, $yValues ); diff --git a/PhpOffice/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php b/PhpOffice/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php index 2366dc6..bd8b672 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php @@ -21,7 +21,7 @@ class LogarithmicBestFit extends BestFit */ public function getValueOfYForX($xValue) { - return $this->getIntersect() + $this->getSlope() * log($xValue - $this->xOffset); + return $this->getIntersect() + $this->getSlope() * \log($xValue - $this->xOffset); } /** @@ -33,7 +33,7 @@ class LogarithmicBestFit extends BestFit */ public function getValueOfXForY($yValue) { - return exp(($yValue - $this->getIntersect()) / $this->getSlope()); + return \exp(($yValue - $this->getIntersect()) / $this->getSlope()); } /** @@ -59,9 +59,9 @@ class LogarithmicBestFit extends BestFit */ private function logarithmicRegression(array $yValues, array $xValues, bool $const): void { - $adjustedYValues = array_map( + $adjustedYValues = \array_map( function ($value) { - return ($value < 0.0) ? 0 - log(abs($value)) : log($value); + return ($value < 0.0) ? 0 - \log(\abs($value)) : \log($value); }, $yValues ); diff --git a/PhpOffice/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php b/PhpOffice/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php index a216359..5fe84b9 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php @@ -109,7 +109,7 @@ class PolynomialBestFit extends BestFit $coefficients = []; // Scrutinizer is correct - $this->slope is float, not array. foreach ($this->slope as $coefficient) { - $coefficients[] = round($coefficient, $dp); + $coefficients[] = \round($coefficient, $dp); } // @phpstan-ignore-next-line @@ -123,7 +123,7 @@ class PolynomialBestFit extends BestFit { // Phpstan and Scrutinizer are both correct - getSlope returns float, not array. // @phpstan-ignore-next-line - return array_merge([$this->getIntersect($dp)], $this->getSlope($dp)); + return \array_merge([$this->getIntersect($dp)], $this->getSlope($dp)); } /** @@ -136,8 +136,8 @@ class PolynomialBestFit extends BestFit private function polynomialRegression($order, $yValues, $xValues): void { // calculate sums - $x_sum = array_sum($xValues); - $y_sum = array_sum($yValues); + $x_sum = \array_sum($xValues); + $y_sum = \array_sum($yValues); $xx_sum = $xy_sum = $yy_sum = 0; for ($i = 0; $i < $this->valueCount; ++$i) { $xy_sum += $xValues[$i] * $yValues[$i]; @@ -169,13 +169,13 @@ class PolynomialBestFit extends BestFit $coefficients = []; for ($i = 0; $i < $C->rows; ++$i) { $r = $C->getValue($i + 1, 1); // row and column are origin-1 - if (abs($r) <= 10 ** (-9)) { + if (\abs($r) <= 10 ** (-9)) { $r = 0; } $coefficients[] = $r; } - $this->intersect = array_shift($coefficients); + $this->intersect = \array_shift($coefficients); $this->slope = $coefficients; $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum, 0, 0, 0); diff --git a/PhpOffice/PhpSpreadsheet/Shared/Trend/PowerBestFit.php b/PhpOffice/PhpSpreadsheet/Shared/Trend/PowerBestFit.php index cafd011..9af0fb3 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Trend/PowerBestFit.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Trend/PowerBestFit.php @@ -61,10 +61,10 @@ class PowerBestFit extends BestFit public function getIntersect($dp = 0) { if ($dp != 0) { - return round(exp($this->intersect), $dp); + return \round(\exp($this->intersect), $dp); } - return exp($this->intersect); + return \exp($this->intersect); } /** @@ -75,15 +75,15 @@ class PowerBestFit extends BestFit */ private function powerRegression(array $yValues, array $xValues, bool $const): void { - $adjustedYValues = array_map( + $adjustedYValues = \array_map( function ($value) { - return ($value < 0.0) ? 0 - log(abs($value)) : log($value); + return ($value < 0.0) ? 0 - \log(\abs($value)) : \log($value); }, $yValues ); - $adjustedXValues = array_map( + $adjustedXValues = \array_map( function ($value) { - return ($value < 0.0) ? 0 - log(abs($value)) : log($value); + return ($value < 0.0) ? 0 - \log(\abs($value)) : \log($value); }, $xValues ); diff --git a/PhpOffice/PhpSpreadsheet/Shared/Trend/Trend.php b/PhpOffice/PhpSpreadsheet/Shared/Trend/Trend.php index 929f59b..22af66c 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Trend/Trend.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Trend/Trend.php @@ -51,18 +51,18 @@ class Trend public static function calculate($trendType = self::TREND_BEST_FIT, $yValues = [], $xValues = [], $const = true) { // Calculate number of points in each dataset - $nY = count($yValues); - $nX = count($xValues); + $nY = \count($yValues); + $nX = \count($xValues); // Define X Values if necessary if ($nX === 0) { - $xValues = range(1, $nY); + $xValues = \range(1, $nY); } elseif ($nY !== $nX) { // Ensure both arrays of points are the same size - trigger_error('Trend(): Number of elements in coordinate arrays do not match.', E_USER_ERROR); + \trigger_error('Trend(): Number of elements in coordinate arrays do not match.', E_USER_ERROR); } - $key = md5($trendType . $const . serialize($yValues) . serialize($xValues)); + $key = \md5($trendType . $const . \serialize($yValues) . \serialize($xValues)); // Determine which Trend method has been requested switch ($trendType) { // Instantiate and return the class for the requested Trend method @@ -83,7 +83,7 @@ class Trend case self::TREND_POLYNOMIAL_5: case self::TREND_POLYNOMIAL_6: if (!isset(self::$trendCache[$key])) { - $order = (int) substr($trendType, -1); + $order = (int) \substr($trendType, -1); self::$trendCache[$key] = new PolynomialBestFit($order, $yValues, $xValues); } @@ -101,7 +101,7 @@ class Trend } if ($trendType != self::TREND_BEST_FIT_NO_POLY) { foreach (self::$trendTypePolynomialOrders as $trendMethod) { - $order = (int) substr($trendMethod, -1); + $order = (int) \substr($trendMethod, -1); $bestFit[$trendMethod] = new PolynomialBestFit($order, $yValues, $xValues); if ($bestFit[$trendMethod]->getError()) { unset($bestFit[$trendMethod]); @@ -111,8 +111,8 @@ class Trend } } // Determine which of our Trend lines is the best fit, and then we return the instance of that Trend class - arsort($bestFitValue); - $bestFitType = key($bestFitValue); + \arsort($bestFitValue); + $bestFitType = \key($bestFitValue); return $bestFit[$bestFitType]; default: diff --git a/PhpOffice/PhpSpreadsheet/Shared/XMLWriter.php b/PhpOffice/PhpSpreadsheet/Shared/XMLWriter.php index 65bd7ec..807cf04 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/XMLWriter.php +++ b/PhpOffice/PhpSpreadsheet/Shared/XMLWriter.php @@ -34,7 +34,7 @@ class XMLWriter extends \XMLWriter if ($temporaryStorageFolder === null) { $temporaryStorageFolder = File::sysGetTempDir(); } - $this->tempFileName = (string) @tempnam($temporaryStorageFolder, 'xml'); + $this->tempFileName = (string) @\tempnam($temporaryStorageFolder, 'xml'); // Open storage if (empty($this->tempFileName) || $this->openUri($this->tempFileName) === false) { @@ -58,7 +58,7 @@ class XMLWriter extends \XMLWriter // There is nothing reasonable to do if unlink fails. if ($this->tempFileName != '') { /** @scrutinizer ignore-unhandled */ - @unlink($this->tempFileName); + @\unlink($this->tempFileName); } } @@ -74,7 +74,7 @@ class XMLWriter extends \XMLWriter } $this->flush(); - return file_get_contents($this->tempFileName) ?: ''; + return \file_get_contents($this->tempFileName) ?: ''; } /** @@ -86,10 +86,10 @@ class XMLWriter extends \XMLWriter */ public function writeRawData($rawTextData) { - if (is_array($rawTextData)) { - $rawTextData = implode("\n", $rawTextData); + if (\is_array($rawTextData)) { + $rawTextData = \implode("\n", $rawTextData); } - return $this->writeRaw(htmlspecialchars($rawTextData ?? '')); + return $this->writeRaw(\htmlspecialchars($rawTextData ?? '')); } } diff --git a/PhpOffice/PhpSpreadsheet/Shared/Xls.php b/PhpOffice/PhpSpreadsheet/Shared/Xls.php index 2c3198b..6052562 100755 --- a/PhpOffice/PhpSpreadsheet/Shared/Xls.php +++ b/PhpOffice/PhpSpreadsheet/Shared/Xls.php @@ -73,7 +73,7 @@ class Xls // then we have a row dimension $rowDimension = $rowDimensions[$row]; $rowHeight = $rowDimension->getRowHeight(); - $pixelRowHeight = (int) ceil(4 * $rowHeight / 3); // here we assume Arial 10 + $pixelRowHeight = (int) \ceil(4 * $rowHeight / 3); // here we assume Arial 10 } elseif ($worksheet->getDefaultRowDimension()->getRowHeight() != -1) { // then we have a default row dimension with explicit height $defaultRowDimension = $worksheet->getDefaultRowDimension(); @@ -117,10 +117,10 @@ class Xls } // correct for offsetX in startcell - $distanceX -= (int) floor(self::sizeCol($worksheet, $startColumn) * $startOffsetX / 1024); + $distanceX -= (int) \floor(self::sizeCol($worksheet, $startColumn) * $startOffsetX / 1024); // correct for offsetX in endcell - $distanceX -= (int) floor(self::sizeCol($worksheet, $endColumn) * (1 - $endOffsetX / 1024)); + $distanceX -= (int) \floor(self::sizeCol($worksheet, $endColumn) * (1 - $endOffsetX / 1024)); return $distanceX; } @@ -146,10 +146,10 @@ class Xls } // correct for offsetX in startcell - $distanceY -= (int) floor(self::sizeRow($worksheet, $startRow) * $startOffsetY / 256); + $distanceY -= (int) \floor(self::sizeRow($worksheet, $startRow) * $startOffsetY / 256); // correct for offsetX in endcell - $distanceY -= (int) floor(self::sizeRow($worksheet, $endRow) * (1 - $endOffsetY / 256)); + $distanceY -= (int) \floor(self::sizeRow($worksheet, $endRow) * (1 - $endOffsetY / 256)); return $distanceY; } diff --git a/PhpOffice/PhpSpreadsheet/Spreadsheet.php b/PhpOffice/PhpSpreadsheet/Spreadsheet.php index 1432ba4..cf9f4d8 100755 --- a/PhpOffice/PhpSpreadsheet/Spreadsheet.php +++ b/PhpOffice/PhpSpreadsheet/Spreadsheet.php @@ -12,7 +12,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Iterator; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter; -class Spreadsheet implements JsonSerializable +class Spreadsheet implements \JsonSerializable { // Allowable values for workbook window visilbity const VISIBILITY_VISIBLE = 'visible'; @@ -309,7 +309,7 @@ class Spreadsheet implements JsonSerializable public function getRibbonXMLData($what = 'all') //we need some constants here... { $returnData = null; - $what = strtolower($what); + $what = \strtolower($what); switch ($what) { case 'all': $returnData = $this->ribbonXMLData; @@ -317,7 +317,7 @@ class Spreadsheet implements JsonSerializable break; case 'target': case 'data': - if (is_array($this->ribbonXMLData)) { + if (\is_array($this->ribbonXMLData)) { $returnData = $this->ribbonXMLData[$what]; } @@ -375,9 +375,9 @@ class Spreadsheet implements JsonSerializable */ private function getExtensionOnly($path) { - $extension = pathinfo($path, PATHINFO_EXTENSION); + $extension = \pathinfo($path, PATHINFO_EXTENSION); - return substr(/** @scrutinizer ignore-type */$extension, 0); + return \substr(/** @scrutinizer ignore-type */$extension, 0); } /** @@ -390,24 +390,24 @@ class Spreadsheet implements JsonSerializable public function getRibbonBinObjects($what = 'all') { $ReturnData = null; - $what = strtolower($what); + $what = \strtolower($what); switch ($what) { case 'all': return $this->ribbonBinObjects; case 'names': case 'data': - if (is_array($this->ribbonBinObjects) && isset($this->ribbonBinObjects[$what])) { + if (\is_array($this->ribbonBinObjects) && isset($this->ribbonBinObjects[$what])) { $ReturnData = $this->ribbonBinObjects[$what]; } break; case 'types': if ( - is_array($this->ribbonBinObjects) && - isset($this->ribbonBinObjects['data']) && is_array($this->ribbonBinObjects['data']) + \is_array($this->ribbonBinObjects) && + isset($this->ribbonBinObjects['data']) && \is_array($this->ribbonBinObjects['data']) ) { - $tmpTypes = array_keys($this->ribbonBinObjects['data']); - $ReturnData = array_unique(array_map([$this, 'getExtensionOnly'], $tmpTypes)); + $tmpTypes = \array_keys($this->ribbonBinObjects['data']); + $ReturnData = \array_unique(\array_map([$this, 'getExtensionOnly'], $tmpTypes)); } else { $ReturnData = []; // the caller want an array... not null if empty } @@ -459,7 +459,7 @@ class Spreadsheet implements JsonSerializable */ public function getSheetByCodeName($codeName) { - $worksheetCount = count($this->workSheetCollection); + $worksheetCount = \count($this->workSheetCollection); for ($i = 0; $i < $worksheetCount; ++$i) { if ($this->workSheetCollection[$i]->getCodeName() == $codeName) { return $this->workSheetCollection[$i]; @@ -474,7 +474,7 @@ class Spreadsheet implements JsonSerializable */ public function __construct() { - $this->uniqueID = uniqid('', true); + $this->uniqueID = \uniqid('', true); $this->calculationEngine = new Calculation($this); // Initialise worksheet collection and add one worksheet @@ -630,7 +630,7 @@ class Spreadsheet implements JsonSerializable $this->workSheetCollection[] = $worksheet; } else { // Insert the sheet at the requested index - array_splice( + \array_splice( $this->workSheetCollection, $sheetIndex, 0, @@ -657,13 +657,13 @@ class Spreadsheet implements JsonSerializable */ public function removeSheetByIndex($sheetIndex): void { - $numSheets = count($this->workSheetCollection); + $numSheets = \count($this->workSheetCollection); if ($sheetIndex > $numSheets - 1) { throw new Exception( "You tried to remove a sheet by the out of bounds index: {$sheetIndex}. The actual number of sheets is {$numSheets}." ); } - array_splice($this->workSheetCollection, $sheetIndex, 1); + \array_splice($this->workSheetCollection, $sheetIndex, 1); // Adjust active sheet index if necessary if ( @@ -713,9 +713,9 @@ class Spreadsheet implements JsonSerializable */ public function getSheetByName($worksheetName) { - $worksheetCount = count($this->workSheetCollection); + $worksheetCount = \count($this->workSheetCollection); for ($i = 0; $i < $worksheetCount; ++$i) { - if ($this->workSheetCollection[$i]->getTitle() === trim($worksheetName, "'")) { + if ($this->workSheetCollection[$i]->getTitle() === \trim($worksheetName, "'")) { return $this->workSheetCollection[$i]; } } @@ -763,12 +763,12 @@ class Spreadsheet implements JsonSerializable public function setIndexByName($worksheetName, $newIndexPosition) { $oldIndex = $this->getIndex($this->getSheetByNameOrThrow($worksheetName)); - $worksheet = array_splice( + $worksheet = \array_splice( $this->workSheetCollection, $oldIndex, 1 ); - array_splice( + \array_splice( $this->workSheetCollection, $newIndexPosition, 0, @@ -785,7 +785,7 @@ class Spreadsheet implements JsonSerializable */ public function getSheetCount() { - return count($this->workSheetCollection); + return \count($this->workSheetCollection); } /** @@ -807,7 +807,7 @@ class Spreadsheet implements JsonSerializable */ public function setActiveSheetIndex($worksheetIndex) { - $numSheets = count($this->workSheetCollection); + $numSheets = \count($this->workSheetCollection); if ($worksheetIndex > $numSheets - 1) { throw new Exception( @@ -868,7 +868,7 @@ class Spreadsheet implements JsonSerializable } // count how many cellXfs there are in this workbook currently, we will need this below - $countCellXfs = count($this->cellXfCollection); + $countCellXfs = \count($this->cellXfCollection); // copy all the shared cellXfs from the external workbook and append them to the current foreach ($worksheet->getParent()->getCellXfCollection() as $cellXf) { @@ -907,7 +907,7 @@ class Spreadsheet implements JsonSerializable */ public function getNamedRanges(): array { - return array_filter( + return \array_filter( $this->definedNames, function (DefinedName $definedName) { return $definedName->isFormula() === self::DEFINED_NAME_IS_RANGE; @@ -922,7 +922,7 @@ class Spreadsheet implements JsonSerializable */ public function getNamedFormulae(): array { - return array_filter( + return \array_filter( $this->definedNames, function (DefinedName $definedName) { return $definedName->isFormula() === self::DEFINED_NAME_IS_FORMULA; @@ -1143,7 +1143,7 @@ class Spreadsheet implements JsonSerializable $reader = new XlsxReader(); $reader->setIncludeCharts(true); $reloadedSpreadsheet = $reader->load($filename); - unlink($filename); + \unlink($filename); return $reloadedSpreadsheet; } @@ -1202,7 +1202,7 @@ class Spreadsheet implements JsonSerializable */ public function cellXfExists(Style $cellStyleIndex) { - return in_array($cellStyleIndex, $this->cellXfCollection, true); + return \in_array($cellStyleIndex, $this->cellXfCollection, true); } /** @@ -1225,7 +1225,7 @@ class Spreadsheet implements JsonSerializable public function addCellXf(Style $style): void { $this->cellXfCollection[] = $style; - $style->setIndex(count($this->cellXfCollection) - 1); + $style->setIndex(\count($this->cellXfCollection) - 1); } /** @@ -1235,12 +1235,12 @@ class Spreadsheet implements JsonSerializable */ public function removeCellXfByIndex($cellStyleIndex): void { - if ($cellStyleIndex > count($this->cellXfCollection) - 1) { + if ($cellStyleIndex > \count($this->cellXfCollection) - 1) { throw new Exception('CellXf index is out of bounds.'); } // first remove the cellXf - array_splice($this->cellXfCollection, $cellStyleIndex, 1); + \array_splice($this->cellXfCollection, $cellStyleIndex, 1); // then update cellXf indexes for cells foreach ($this->workSheetCollection as $worksheet) { @@ -1314,7 +1314,7 @@ class Spreadsheet implements JsonSerializable public function addCellStyleXf(Style $style): void { $this->cellStyleXfCollection[] = $style; - $style->setIndex(count($this->cellStyleXfCollection) - 1); + $style->setIndex(\count($this->cellStyleXfCollection) - 1); } /** @@ -1324,10 +1324,10 @@ class Spreadsheet implements JsonSerializable */ public function removeCellStyleXfByIndex($cellStyleIndex): void { - if ($cellStyleIndex > count($this->cellStyleXfCollection) - 1) { + if ($cellStyleIndex > \count($this->cellStyleXfCollection) - 1) { throw new Exception('CellStyleXf index is out of bounds.'); } - array_splice($this->cellStyleXfCollection, $cellStyleIndex, 1); + \array_splice($this->cellStyleXfCollection, $cellStyleIndex, 1); } /** @@ -1374,7 +1374,7 @@ class Spreadsheet implements JsonSerializable } $map[$index] = $countNeededCellXfs - 1; } - $this->cellXfCollection = array_values($this->cellXfCollection); + $this->cellXfCollection = \array_values($this->cellXfCollection); // update the index for all cellXfs foreach ($this->cellXfCollection as $i => $cellXf) { @@ -1581,7 +1581,7 @@ class Spreadsheet implements JsonSerializable $visibility = self::VISIBILITY_VISIBLE; } - if (in_array($visibility, self::WORKBOOK_VIEW_VISIBILITY_VALUES)) { + if (\in_array($visibility, self::WORKBOOK_VIEW_VISIBILITY_VALUES)) { $this->visibility = $visibility; } else { throw new Exception('Invalid visibility value.'); diff --git a/PhpOffice/PhpSpreadsheet/Style/Alignment.php b/PhpOffice/PhpSpreadsheet/Style/Alignment.php index 68edfac..00075ce 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Alignment.php +++ b/PhpOffice/PhpSpreadsheet/Style/Alignment.php @@ -262,7 +262,7 @@ class Alignment extends Supervisor */ public function setHorizontal(string $horizontalAlignment) { - $horizontalAlignment = strtolower($horizontalAlignment); + $horizontalAlignment = \strtolower($horizontalAlignment); if ($horizontalAlignment === self::HORIZONTAL_CENTER_CONTINUOUS_LC) { $horizontalAlignment = self::HORIZONTAL_CENTER_CONTINUOUS; } @@ -300,7 +300,7 @@ class Alignment extends Supervisor */ public function setVertical($verticalAlignment) { - $verticalAlignment = strtolower($verticalAlignment); + $verticalAlignment = \strtolower($verticalAlignment); if ($this->isSupervisor) { $styleArray = $this->getStyleArray(['vertical' => $verticalAlignment]); @@ -517,7 +517,7 @@ class Alignment extends Supervisor return $this->getSharedComponent()->getHashCode(); } - return md5( + return \md5( $this->horizontal . $this->vertical . $this->textRotation . diff --git a/PhpOffice/PhpSpreadsheet/Style/Border.php b/PhpOffice/PhpSpreadsheet/Style/Border.php index c6fb51f..d58f9bf 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Border.php +++ b/PhpOffice/PhpSpreadsheet/Style/Border.php @@ -167,7 +167,7 @@ class Border extends Supervisor { if (empty($style)) { $style = self::BORDER_NONE; - } elseif (is_bool($style)) { + } elseif (\is_bool($style)) { $style = self::BORDER_MEDIUM; } @@ -222,7 +222,7 @@ class Border extends Supervisor return $this->getSharedComponent()->getHashCode(); } - return md5( + return \md5( $this->borderStyle . $this->color->getHashCode() . __CLASS__ diff --git a/PhpOffice/PhpSpreadsheet/Style/Borders.php b/PhpOffice/PhpSpreadsheet/Style/Borders.php index 56a5270..1223184 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Borders.php +++ b/PhpOffice/PhpSpreadsheet/Style/Borders.php @@ -398,7 +398,7 @@ class Borders extends Supervisor return $this->getSharedComponent()->getHashcode(); } - return md5( + return \md5( $this->getLeft()->getHashCode() . $this->getRight()->getHashCode() . $this->getTop()->getHashCode() . diff --git a/PhpOffice/PhpSpreadsheet/Style/Color.php b/PhpOffice/PhpSpreadsheet/Style/Color.php index 3c002b2..9effcd4 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Color.php +++ b/PhpOffice/PhpSpreadsheet/Style/Color.php @@ -206,14 +206,14 @@ class Color extends Supervisor if ($colorValue === null || $colorValue === '') { return self::COLOR_BLACK; } - $named = ucfirst(strtolower($colorValue)); - if (array_key_exists($named, self::NAMED_COLOR_TRANSLATIONS)) { + $named = \ucfirst(\strtolower($colorValue)); + if (\array_key_exists($named, self::NAMED_COLOR_TRANSLATIONS)) { return self::NAMED_COLOR_TRANSLATIONS[$named]; } - if (preg_match(self::VALIDATE_COLOR_8, $colorValue) === 1) { + if (\preg_match(self::VALIDATE_COLOR_8, $colorValue) === 1) { return $colorValue; } - if (preg_match(self::VALIDATE_COLOR_6, $colorValue) === 1) { + if (\preg_match(self::VALIDATE_COLOR_6, $colorValue) === 1) { return 'FF' . $colorValue; } @@ -266,7 +266,7 @@ class Color extends Supervisor return $this->getSharedComponent()->getRGB(); } - return substr($this->argb ?? '', 2); + return \substr($this->argb ?? '', 2); } /** @@ -293,12 +293,12 @@ class Color extends Supervisor */ private static function getColourComponent($rgbValue, $offset, $hex = true) { - $colour = substr($rgbValue, $offset, 2) ?: ''; - if (preg_match('/^[0-9a-f]{2}$/i', $colour) !== 1) { + $colour = \substr($rgbValue, $offset, 2) ?: ''; + if (\preg_match('/^[0-9a-f]{2}$/i', $colour) !== 1) { $colour = '00'; } - return ($hex) ? $colour : (int) hexdec($colour); + return ($hex) ? $colour : (int) \hexdec($colour); } /** @@ -312,7 +312,7 @@ class Color extends Supervisor */ public static function getRed($rgbValue, $hex = true) { - return self::getColourComponent($rgbValue, strlen($rgbValue) - 6, $hex); + return self::getColourComponent($rgbValue, \strlen($rgbValue) - 6, $hex); } /** @@ -326,7 +326,7 @@ class Color extends Supervisor */ public static function getGreen($rgbValue, $hex = true) { - return self::getColourComponent($rgbValue, strlen($rgbValue) - 4, $hex); + return self::getColourComponent($rgbValue, \strlen($rgbValue) - 4, $hex); } /** @@ -340,7 +340,7 @@ class Color extends Supervisor */ public static function getBlue($rgbValue, $hex = true) { - return self::getColourComponent($rgbValue, strlen($rgbValue) - 2, $hex); + return self::getColourComponent($rgbValue, \strlen($rgbValue) - 2, $hex); } /** @@ -353,8 +353,8 @@ class Color extends Supervisor */ public static function changeBrightness($hexColourValue, $adjustPercentage) { - $rgba = (strlen($hexColourValue) === 8); - $adjustPercentage = max(-1.0, min(1.0, $adjustPercentage)); + $rgba = (\strlen($hexColourValue) === 8); + $adjustPercentage = \max(-1.0, \min(1.0, $adjustPercentage)); /** @var int $red */ $red = self::getRed($hexColourValue, false); @@ -372,10 +372,10 @@ class Color extends Supervisor $blue += $blue * $adjustPercentage; } - $rgb = strtoupper( - str_pad(dechex((int) $red), 2, '0', 0) . - str_pad(dechex((int) $green), 2, '0', 0) . - str_pad(dechex((int) $blue), 2, '0', 0) + $rgb = \strtoupper( + \str_pad(\dechex((int) $red), 2, '0', 0) . + \str_pad(\dechex((int) $green), 2, '0', 0) . + \str_pad(\dechex((int) $blue), 2, '0', 0) ); return (($rgba) ? 'FF' : '') . $rgb; @@ -417,7 +417,7 @@ class Color extends Supervisor return $this->getSharedComponent()->getHashCode(); } - return md5( + return \md5( $this->argb . __CLASS__ ); diff --git a/PhpOffice/PhpSpreadsheet/Style/Conditional.php b/PhpOffice/PhpSpreadsheet/Style/Conditional.php index 019c064..f6fda9c 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Conditional.php +++ b/PhpOffice/PhpSpreadsheet/Style/Conditional.php @@ -239,7 +239,7 @@ class Conditional implements IComparable */ public function setConditions($conditions) { - if (!is_array($conditions)) { + if (!\is_array($conditions)) { $conditions = [$conditions]; } $this->condition = $conditions; @@ -312,10 +312,10 @@ class Conditional implements IComparable */ public function getHashCode() { - return md5( + return \md5( $this->conditionType . $this->operatorType . - implode(';', $this->condition) . + \implode(';', $this->condition) . $this->style->getHashCode() . __CLASS__ ); @@ -326,9 +326,9 @@ class Conditional implements IComparable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; @@ -341,6 +341,6 @@ class Conditional implements IComparable */ public static function isValidConditionType(string $type): bool { - return in_array($type, self::CONDITION_TYPES); + return \in_array($type, self::CONDITION_TYPES); } } diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php index 0f6f523..0858581 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php @@ -87,7 +87,7 @@ class CellMatcher protected function setReferenceCellForExpressions(string $conditionalRange): void { - $conditionalRange = Coordinate::splitRange(str_replace('$', '', strtoupper($conditionalRange))); + $conditionalRange = Coordinate::splitRange(\str_replace('$', '', \strtoupper($conditionalRange))); [$this->referenceCell] = $conditionalRange[0]; [$this->referenceColumn, $this->referenceRow] = Coordinate::indexesFromString($this->referenceCell); @@ -95,13 +95,13 @@ class CellMatcher // Convert our conditional range to an absolute conditional range, so it can be used "pinned" in formulae $rangeSets = []; foreach ($conditionalRange as $rangeSet) { - $absoluteRangeSet = array_map( + $absoluteRangeSet = \array_map( [Coordinate::class, 'absoluteCoordinate'], $rangeSet ); - $rangeSets[] = implode(':', $absoluteRangeSet); + $rangeSets[] = \implode(':', $absoluteRangeSet); } - $this->conditionalRange = implode(',', $rangeSets); + $this->conditionalRange = \implode(',', $rangeSets); } public function evaluateConditional(Conditional $conditional): bool @@ -153,8 +153,8 @@ class CellMatcher */ protected function wrapValue($value) { - if (!is_numeric($value)) { - if (is_bool($value)) { + if (!\is_numeric($value)) { + if (\is_bool($value)) { return $value ? 'TRUE' : 'FALSE'; } elseif ($value === null) { return 'NULL'; @@ -182,45 +182,45 @@ class CellMatcher $column = $matches[6]; $row = $matches[7]; - if (strpos($column, '$') === false) { + if (\strpos($column, '$') === false) { $column = Coordinate::columnIndexFromString($column); $column += $this->cellColumn - $this->referenceColumn; $column = Coordinate::stringFromColumnIndex($column); } - if (strpos($row, '$') === false) { + if (\strpos($row, '$') === false) { $row += $this->cellRow - $this->referenceRow; } if (!empty($matches[4])) { - $worksheet = $this->worksheet->getParent()->getSheetByName(trim($matches[4], "'")); + $worksheet = $this->worksheet->getParent()->getSheetByName(\trim($matches[4], "'")); if ($worksheet === null) { return $this->wrapValue(null); } return $this->wrapValue( $worksheet - ->getCell(str_replace('$', '', "{$column}{$row}")) + ->getCell(\str_replace('$', '', "{$column}{$row}")) ->getCalculatedValue() ); } return $this->wrapValue( $this->worksheet - ->getCell(str_replace('$', '', "{$column}{$row}")) + ->getCell(\str_replace('$', '', "{$column}{$row}")) ->getCalculatedValue() ); } protected function cellConditionCheck(string $condition): string { - $splitCondition = explode(Calculation::FORMULA_STRING_QUOTE, $condition); + $splitCondition = \explode(Calculation::FORMULA_STRING_QUOTE, $condition); $i = false; foreach ($splitCondition as &$value) { // Only count/replace in alternating array entries (ie. not in quoted strings) $i = $i === false; if ($i) { - $value = (string) preg_replace_callback( + $value = (string) \preg_replace_callback( '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', [$this, 'conditionCellAdjustment'], $value @@ -229,12 +229,12 @@ class CellMatcher } unset($value); // Then rebuild the condition string to return it - return implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); + return \implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); } protected function adjustConditionsForCellReferences(array $conditions): array { - return array_map( + return \array_map( [$this, 'cellConditionCheck'], $conditions ); @@ -242,13 +242,13 @@ class CellMatcher protected function processOperatorComparison(Conditional $conditional): bool { - if (array_key_exists($conditional->getOperatorType(), self::COMPARISON_RANGE_OPERATORS)) { + if (\array_key_exists($conditional->getOperatorType(), self::COMPARISON_RANGE_OPERATORS)) { return $this->processRangeOperator($conditional); } $operator = self::COMPARISON_OPERATORS[$conditional->getOperatorType()]; $conditions = $this->adjustConditionsForCellReferences($conditional->getConditions()); - $expression = sprintf('%s%s%s', (string) $this->wrapCellValue(), $operator, (string) array_pop($conditions)); + $expression = \sprintf('%s%s%s', (string) $this->wrapCellValue(), $operator, (string) \array_pop($conditions)); return $this->evaluateExpression($expression); } @@ -256,9 +256,9 @@ class CellMatcher protected function processRangeOperator(Conditional $conditional): bool { $conditions = $this->adjustConditionsForCellReferences($conditional->getConditions()); - sort($conditions); - $expression = sprintf( - (string) preg_replace( + \sort($conditions); + $expression = \sprintf( + (string) \preg_replace( '/\bA1\b/i', (string) $this->wrapCellValue(), self::COMPARISON_RANGE_OPERATORS[$conditional->getOperatorType()] @@ -273,7 +273,7 @@ class CellMatcher { $worksheetName = $this->cell->getWorksheet()->getTitle(); - $expression = sprintf( + $expression = \sprintf( self::COMPARISON_DUPLICATES_OPERATORS[$conditional->getConditionType()], $worksheetName, $this->conditionalRange, @@ -286,9 +286,9 @@ class CellMatcher protected function processExpression(Conditional $conditional): bool { $conditions = $this->adjustConditionsForCellReferences($conditional->getConditions()); - $expression = array_pop($conditions); + $expression = \array_pop($conditions); - $expression = (string) preg_replace( + $expression = (string) \preg_replace( '/\b' . $this->referenceCell . '\b/i', (string) $this->wrapCellValue(), $expression diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBarExtension.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBarExtension.php index c709cf3..3a33527 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBarExtension.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBarExtension.php @@ -77,7 +77,7 @@ class ConditionalDataBarExtension $ret[$elmKey] = ['rgb' => $this->{$elmKey}]; } } - foreach (array_filter($this->axisColor) as $attrKey => $axisColorAttr) { + foreach (\array_filter($this->axisColor) as $attrKey => $axisColorAttr) { if (!isset($ret['axisColor'])) { $ret['axisColor'] = []; } diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormattingRuleExtension.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormattingRuleExtension.php index 34c9cbc..9249dab 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormattingRuleExtension.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormattingRuleExtension.php @@ -38,25 +38,25 @@ class ConditionalFormattingRuleExtension private function generateUuid() { - $chars = str_split('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'); + $chars = \str_split('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'); foreach ($chars as $i => $char) { if ($char === 'x') { - $chars[$i] = dechex(random_int(0, 15)); + $chars[$i] = \dechex(\random_int(0, 15)); } elseif ($char === 'y') { - $chars[$i] = dechex(random_int(8, 11)); + $chars[$i] = \dechex(\random_int(8, 11)); } } - return implode('', /** @scrutinizer ignore-type */ $chars); + return \implode('', /** @scrutinizer ignore-type */ $chars); } public static function parseExtLstXml($extLstXml) { $conditionalFormattingRuleExtensions = []; $conditionalFormattingRuleExtensionXml = null; - if ($extLstXml instanceof SimpleXMLElement) { - foreach ((count($extLstXml) > 0 ? $extLstXml : [$extLstXml]) as $extLst) { + if ($extLstXml instanceof \SimpleXMLElement) { + foreach ((\count($extLstXml) > 0 ? $extLstXml : [$extLstXml]) as $extLst) { //this uri is conditionalFormattings //https://docs.microsoft.com/en-us/openspecs/office_standards/ms-xlsx/07d607af-5618-4ca2-b683-6a78dc0d9627 if (isset($extLst->ext['uri']) && (string) $extLst->ext['uri'] === '{78C0D931-6437-407d-A8EE-F0AAD7539E65}') { @@ -93,7 +93,7 @@ class ConditionalFormattingRuleExtension private static function parseExtDataBarAttributesFromXml( ConditionalDataBarExtension $extDataBarObj, - SimpleXMLElement $dataBarXml + \SimpleXMLElement $dataBarXml ): void { $dataBarAttribute = $dataBarXml->attributes(); if ($dataBarAttribute->minLength) { @@ -119,7 +119,7 @@ class ConditionalFormattingRuleExtension } } - private static function parseExtDataBarElementChildrenFromXml(ConditionalDataBarExtension $extDataBarObj, SimpleXMLElement $dataBarXml, $ns): void + private static function parseExtDataBarElementChildrenFromXml(ConditionalDataBarExtension $extDataBarObj, \SimpleXMLElement $dataBarXml, $ns): void { if ($dataBarXml->borderColor) { $extDataBarObj->setBorderColor((string) $dataBarXml->borderColor->attributes()['rgb']); diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php index 14f30d3..a9f3674 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php @@ -44,7 +44,7 @@ class Blanks extends WizardAbstract implements WizardInterface protected function getExpression(): void { - $this->expression = sprintf( + $this->expression = \sprintf( self::EXPRESSIONS[$this->inverse ? Wizard::BLANKS : Wizard::NOT_BLANKS], $this->referenceCell ); @@ -88,7 +88,7 @@ class Blanks extends WizardAbstract implements WizardInterface */ public function __call($methodName, $arguments): self { - if (!array_key_exists($methodName, self::OPERATORS)) { + if (!\array_key_exists($methodName, self::OPERATORS)) { throw new Exception('Invalid Operation for Blanks CF Rule Wizard'); } diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php index 265b241..6d5f864 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php @@ -66,7 +66,7 @@ class CellValue extends WizardAbstract implements WizardInterface */ protected function operand(int $index, $operand, string $operandValueType = Wizard::VALUE_TYPE_LITERAL): void { - if (is_string($operand)) { + if (\is_string($operand)) { $operand = $this->validateOperand($operand, $operandValueType); } @@ -81,9 +81,9 @@ class CellValue extends WizardAbstract implements WizardInterface */ protected function wrapValue($value, string $operandValueType) { - if (!is_numeric($value) && !is_bool($value) && null !== $value) { + if (!\is_numeric($value) && !\is_bool($value) && null !== $value) { if ($operandValueType === Wizard::VALUE_TYPE_LITERAL) { - return '"' . str_replace('"', '""', $value) . '"'; + return '"' . \str_replace('"', '""', $value) . '"'; } return $this->cellConditionCheck($value); @@ -91,7 +91,7 @@ class CellValue extends WizardAbstract implements WizardInterface if (null === $value) { $value = 'NULL'; - } elseif (is_bool($value)) { + } elseif (\is_bool($value)) { $value = $value ? 'TRUE' : 'FALSE'; } @@ -103,7 +103,7 @@ class CellValue extends WizardAbstract implements WizardInterface if (!isset(self::RANGE_OPERATORS[$this->operator])) { unset($this->operand[1], $this->operandValueType[1]); } - $values = array_map([$this, 'wrapValue'], $this->operand, $this->operandValueType); + $values = \array_map([$this, 'wrapValue'], $this->operand, $this->operandValueType); $conditional = new Conditional(); $conditional->setConditionType(Conditional::CONDITION_CELLIS); @@ -117,11 +117,11 @@ class CellValue extends WizardAbstract implements WizardInterface protected static function unwrapString(string $condition): string { - if ((strpos($condition, '"') === 0) && (strpos(strrev($condition), '"') === 0)) { - $condition = substr($condition, 1, -1); + if ((\strpos($condition, '"') === 0) && (\strpos(\strrev($condition), '"') === 0)) { + $condition = \substr($condition, 1, -1); } - return str_replace('""', '"', $condition); + return \str_replace('""', '"', $condition); } public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface @@ -139,15 +139,15 @@ class CellValue extends WizardAbstract implements WizardInterface foreach ($conditions as $index => $condition) { // Best-guess to try and identify if the text is a string literal, a cell reference or a formula? $operandValueType = Wizard::VALUE_TYPE_LITERAL; - if (is_string($condition)) { + if (\is_string($condition)) { if (Calculation::keyInExcelConstants($condition)) { $condition = Calculation::getExcelConstants($condition); - } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '$/i', $condition)) { + } elseif (\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '$/i', $condition)) { $operandValueType = Wizard::VALUE_TYPE_CELL; $condition = self::reverseAdjustCellRef($condition, $cellRange); } elseif ( - preg_match('/\(\)/', $condition) || - preg_match('/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', $condition) + \preg_match('/\(\)/', $condition) || + \preg_match('/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', $condition) ) { $operandValueType = Wizard::VALUE_TYPE_FORMULA; $condition = self::reverseAdjustCellRef($condition, $cellRange); @@ -178,7 +178,7 @@ class CellValue extends WizardAbstract implements WizardInterface // Scrutinizer ignores its own suggested workaround. //$this->operand(1, /** @scrutinizer ignore-type */ ...$arguments); - if (count($arguments) < 2) { + if (\count($arguments) < 2) { $this->operand(1, $arguments[0]); } else { $this->operand(1, $arguments[0], $arguments[1]); @@ -189,7 +189,7 @@ class CellValue extends WizardAbstract implements WizardInterface $this->operator(self::MAGIC_OPERATIONS[$methodName]); //$this->operand(0, ...$arguments); - if (count($arguments) < 2) { + if (\count($arguments) < 2) { $this->operand(0, $arguments[0]); } else { $this->operand(0, $arguments[0], $arguments[1]); diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php index 453dcdf..a361fe6 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php @@ -61,9 +61,9 @@ class DateValue extends WizardAbstract implements WizardInterface protected function setExpression(): void { - $referenceCount = substr_count(self::EXPRESSIONS[$this->operator], '%s'); - $references = array_fill(0, $referenceCount, $this->referenceCell); - $this->expression = sprintf(self::EXPRESSIONS[$this->operator], ...$references); + $referenceCount = \substr_count(self::EXPRESSIONS[$this->operator], '%s'); + $references = \array_fill(0, $referenceCount, $this->referenceCell); + $this->expression = \sprintf(self::EXPRESSIONS[$this->operator], ...$references); } public function getConditional(): Conditional diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php index 3f063fe..7ddeac1 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php @@ -67,7 +67,7 @@ class Duplicates extends WizardAbstract implements WizardInterface */ public function __call($methodName, $arguments): self { - if (!array_key_exists($methodName, self::OPERATORS)) { + if (!\array_key_exists($methodName, self::OPERATORS)) { throw new Exception('Invalid Operation for Errors CF Rule Wizard'); } diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php index 56b9086..f459f1e 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php @@ -40,7 +40,7 @@ class Errors extends WizardAbstract implements WizardInterface protected function getExpression(): void { - $this->expression = sprintf( + $this->expression = \sprintf( self::EXPRESSIONS[$this->inverse ? Wizard::ERRORS : Wizard::NOT_ERRORS], $this->referenceCell ); @@ -84,7 +84,7 @@ class Errors extends WizardAbstract implements WizardInterface */ public function __call($methodName, $arguments): self { - if (!array_key_exists($methodName, self::OPERATORS)) { + if (!\array_key_exists($methodName, self::OPERATORS)) { throw new Exception('Invalid Operation for Errors CF Rule Wizard'); } diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php index 987cfbf..7c948b5 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php @@ -81,16 +81,16 @@ class TextValue extends WizardAbstract implements WizardInterface protected function setExpression(): void { $operand = $this->operandValueType === Wizard::VALUE_TYPE_LITERAL - ? $this->wrapValue(str_replace('"', '""', $this->operand)) + ? $this->wrapValue(\str_replace('"', '""', $this->operand)) : $this->cellConditionCheck($this->operand); if ( $this->operator === Conditional::OPERATOR_CONTAINSTEXT || $this->operator === Conditional::OPERATOR_NOTCONTAINS ) { - $this->expression = sprintf(self::EXPRESSIONS[$this->operator], $operand, $this->referenceCell); + $this->expression = \sprintf(self::EXPRESSIONS[$this->operator], $operand, $this->referenceCell); } else { - $this->expression = sprintf(self::EXPRESSIONS[$this->operator], $this->referenceCell, $operand, $operand); + $this->expression = \sprintf(self::EXPRESSIONS[$this->operator], $this->referenceCell, $operand, $operand); } } @@ -115,24 +115,24 @@ class TextValue extends WizardAbstract implements WizardInterface public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface { - if (!in_array($conditional->getConditionType(), self::OPERATORS, true)) { + if (!\in_array($conditional->getConditionType(), self::OPERATORS, true)) { throw new Exception('Conditional is not a Text Value CF Rule conditional'); } $wizard = new self($cellRange); - $wizard->operator = (string) array_search($conditional->getConditionType(), self::OPERATORS, true); + $wizard->operator = (string) \array_search($conditional->getConditionType(), self::OPERATORS, true); $wizard->style = $conditional->getStyle(); $wizard->stopIfTrue = $conditional->getStopIfTrue(); // Best-guess to try and identify if the text is a string literal, a cell reference or a formula? $wizard->operandValueType = Wizard::VALUE_TYPE_LITERAL; $condition = $conditional->getText(); - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '$/i', $condition)) { + if (\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '$/i', $condition)) { $wizard->operandValueType = Wizard::VALUE_TYPE_CELL; $condition = self::reverseAdjustCellRef($condition, $cellRange); } elseif ( - preg_match('/\(\)/', $condition) || - preg_match('/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', $condition) + \preg_match('/\(\)/', $condition) || + \preg_match('/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', $condition) ) { $wizard->operandValueType = Wizard::VALUE_TYPE_FORMULA; } @@ -153,7 +153,7 @@ class TextValue extends WizardAbstract implements WizardInterface $this->operator(self::MAGIC_OPERATIONS[$methodName]); //$this->operand(...$arguments); - if (count($arguments) < 2) { + if (\count($arguments) < 2) { $this->operand($arguments[0]); } else { $this->operand($arguments[0], $arguments[1]); diff --git a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php index 5644aab..1764d65 100755 --- a/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php +++ b/PhpOffice/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php @@ -62,7 +62,7 @@ abstract class WizardAbstract protected function setReferenceCellForExpressions(string $conditionalRange): void { - $conditionalRange = Coordinate::splitRange(str_replace('$', '', strtoupper($conditionalRange))); + $conditionalRange = Coordinate::splitRange(\str_replace('$', '', \strtoupper($conditionalRange))); [$this->referenceCell] = $conditionalRange[0]; [$this->referenceColumn, $this->referenceRow] = Coordinate::indexesFromString($this->referenceCell); @@ -92,12 +92,12 @@ abstract class WizardAbstract { if ( $operandValueType === Wizard::VALUE_TYPE_LITERAL && - substr($operand, 0, 1) === '"' && - substr($operand, -1) === '"' + \substr($operand, 0, 1) === '"' && + \substr($operand, -1) === '"' ) { - $operand = str_replace('""', '"', substr($operand, 1, -1)); - } elseif ($operandValueType === Wizard::VALUE_TYPE_FORMULA && substr($operand, 0, 1) === '=') { - $operand = substr($operand, 1); + $operand = \str_replace('""', '"', \substr($operand, 1, -1)); + } elseif ($operandValueType === Wizard::VALUE_TYPE_FORMULA && \substr($operand, 0, 1) === '=') { + $operand = \substr($operand, 1); } return $operand; @@ -109,13 +109,13 @@ abstract class WizardAbstract $column = $matches[6]; $row = $matches[7]; - if (strpos($column, '$') === false) { + if (\strpos($column, '$') === false) { $column = Coordinate::columnIndexFromString($column); $column -= $referenceColumn - 1; $column = Coordinate::stringFromColumnIndex($column); } - if (strpos($row, '$') === false) { + if (\strpos($row, '$') === false) { $row -= $referenceRow - 1; } @@ -124,17 +124,17 @@ abstract class WizardAbstract public static function reverseAdjustCellRef(string $condition, string $cellRange): string { - $conditionalRange = Coordinate::splitRange(str_replace('$', '', strtoupper($cellRange))); + $conditionalRange = Coordinate::splitRange(\str_replace('$', '', \strtoupper($cellRange))); [$referenceCell] = $conditionalRange[0]; [$referenceColumnIndex, $referenceRow] = Coordinate::indexesFromString($referenceCell); - $splitCondition = explode(Calculation::FORMULA_STRING_QUOTE, $condition); + $splitCondition = \explode(Calculation::FORMULA_STRING_QUOTE, $condition); $i = false; foreach ($splitCondition as &$value) { // Only count/replace in alternating array entries (ie. not in quoted strings) $i = $i === false; if ($i) { - $value = (string) preg_replace_callback( + $value = (string) \preg_replace_callback( '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', function ($matches) use ($referenceColumnIndex, $referenceRow) { return self::reverseCellAdjustment($matches, $referenceColumnIndex, $referenceRow); @@ -146,7 +146,7 @@ abstract class WizardAbstract unset($value); // Then rebuild the condition string to return it - return implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); + return \implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); } protected function conditionCellAdjustment(array $matches): string @@ -155,13 +155,13 @@ abstract class WizardAbstract $column = $matches[6]; $row = $matches[7]; - if (strpos($column, '$') === false) { + if (\strpos($column, '$') === false) { $column = Coordinate::columnIndexFromString($column); $column += $this->referenceColumn - 1; $column = Coordinate::stringFromColumnIndex($column); } - if (strpos($row, '$') === false) { + if (\strpos($row, '$') === false) { $row += $this->referenceRow - 1; } @@ -170,13 +170,13 @@ abstract class WizardAbstract protected function cellConditionCheck(string $condition): string { - $splitCondition = explode(Calculation::FORMULA_STRING_QUOTE, $condition); + $splitCondition = \explode(Calculation::FORMULA_STRING_QUOTE, $condition); $i = false; foreach ($splitCondition as &$value) { // Only count/replace in alternating array entries (ie. not in quoted strings) $i = $i === false; if ($i) { - $value = (string) preg_replace_callback( + $value = (string) \preg_replace_callback( '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/i', [$this, 'conditionCellAdjustment'], $value @@ -186,12 +186,12 @@ abstract class WizardAbstract unset($value); // Then rebuild the condition string to return it - return implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); + return \implode(Calculation::FORMULA_STRING_QUOTE, $splitCondition); } protected function adjustConditionsForCellReferences(array $conditions): array { - return array_map( + return \array_map( [$this, 'cellConditionCheck'], $conditions ); diff --git a/PhpOffice/PhpSpreadsheet/Style/Fill.php b/PhpOffice/PhpSpreadsheet/Style/Fill.php index bd87a79..07b1950 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Fill.php +++ b/PhpOffice/PhpSpreadsheet/Style/Fill.php @@ -322,7 +322,7 @@ class Fill extends Supervisor } // Note that we don't care about colours for fill type NONE, but could have duplicate NONEs with // different hashes if we don't explicitly prevent this - return md5( + return \md5( $this->getFillType() . $this->getRotation() . ($this->getFillType() !== self::FILL_NONE ? $this->getStartColor()->getHashCode() : '') . diff --git a/PhpOffice/PhpSpreadsheet/Style/Font.php b/PhpOffice/PhpSpreadsheet/Style/Font.php index 3d7bc1b..627e56f 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Font.php +++ b/PhpOffice/PhpSpreadsheet/Style/Font.php @@ -376,13 +376,13 @@ class Font extends Supervisor */ public function setSize($sizeInPoints, bool $nullOk = false) { - if (is_string($sizeInPoints) || is_int($sizeInPoints)) { + if (\is_string($sizeInPoints) || \is_int($sizeInPoints)) { $sizeInPoints = (float) $sizeInPoints; // $pValue = 0 if given string is not numeric } // Size must be a positive floating point number // ECMA-376-1:2016, part 1, chapter 18.4.11 sz (Font Size), p. 1536 - if (!is_float($sizeInPoints) || !($sizeInPoints > 0)) { + if (!\is_float($sizeInPoints) || !($sizeInPoints > 0)) { if (!$nullOk || $sizeInPoints !== null) { $sizeInPoints = 10.0; } @@ -659,7 +659,7 @@ class Font extends Supervisor */ public function setUnderline($underlineStyle) { - if (is_bool($underlineStyle)) { + if (\is_bool($underlineStyle)) { $underlineStyle = ($underlineStyle) ? self::UNDERLINE_SINGLE : self::UNDERLINE_NONE; } elseif ($underlineStyle == '') { $underlineStyle = self::UNDERLINE_NONE; @@ -764,7 +764,7 @@ class Font extends Supervisor return $this->getSharedComponent()->getHashCode(); } - return md5( + return \md5( $this->name . $this->size . ($this->bold ? 't' : 'f') . @@ -774,7 +774,7 @@ class Font extends Supervisor $this->underline . ($this->strikethrough ? 't' : 'f') . $this->color->getHashCode() . - implode( + \implode( '*', [ $this->latin, diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat.php index c2b11a6..60f70fe 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat.php @@ -199,7 +199,7 @@ class NumberFormat extends Supervisor if ($this->isSupervisor) { return $this->getSharedComponent()->getFormatCode(); } - if (is_int($this->builtInFormatCode)) { + if (\is_int($this->builtInFormatCode)) { return self::builtInFormatCode($this->builtInFormatCode); } @@ -363,7 +363,7 @@ class NumberFormat extends Supervisor self::$builtInFormats[58] = '[$-411]ggge"年"m"月"d"日"'; // Flip array (for faster lookups) - self::$flippedBuiltInFormats = array_flip(self::$builtInFormats); + self::$flippedBuiltInFormats = \array_flip(self::$builtInFormats); } } @@ -403,7 +403,7 @@ class NumberFormat extends Supervisor self::fillBuiltInFormatCodes(); // Lookup format code - if (array_key_exists($formatCodeIndex, self::$flippedBuiltInFormats)) { + if (\array_key_exists($formatCodeIndex, self::$flippedBuiltInFormats)) { return self::$flippedBuiltInFormats[$formatCodeIndex]; } @@ -421,7 +421,7 @@ class NumberFormat extends Supervisor return $this->getSharedComponent()->getHashCode(); } - return md5( + return \md5( $this->formatCode . $this->builtInFormatCode . __CLASS__ diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/BaseFormatter.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/BaseFormatter.php index 7988143..156d908 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/BaseFormatter.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/BaseFormatter.php @@ -7,6 +7,6 @@ abstract class BaseFormatter protected static function stripQuotes(string $format): string { // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols - return str_replace(['"', '*'], '', $format); + return \str_replace(['"', '*'], '', $format); } } diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php index ba54b53..4e79d34 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php @@ -102,15 +102,15 @@ class DateFormatter private static function tryInterval(bool &$seekingBracket, string &$block, $value, string $format): void { if ($seekingBracket) { - if (false !== strpos($block, $format)) { - $hours = (string) (int) round( + if (false !== \strpos($block, $format)) { + $hours = (string) (int) \round( self::INTERVAL_MULTIPLIER[$format] * $value, self::INTERVAL_ROUND_PRECISION[$format] ); - if (strlen($hours) === 1 && in_array($format, self::INTERVAL_LEADING_ZERO, true)) { + if (\strlen($hours) === 1 && \in_array($format, self::INTERVAL_LEADING_ZERO, true)) { $hours = "0$hours"; } - $block = str_replace($format, $hours, $block); + $block = \str_replace($format, $hours, $block); $seekingBracket = false; } } @@ -123,21 +123,21 @@ class DateFormatter // general syntax: [$-] // language info is in hexadecimal // strip off chinese part like [DBNum1][$-804] - $format = (string) preg_replace('/^(\[DBNum\d\])*(\[\$[^\]]*\])/i', '', $format); + $format = (string) \preg_replace('/^(\[DBNum\d\])*(\[\$[^\]]*\])/i', '', $format); // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case; // but we don't want to change any quoted strings /** @var callable */ $callable = [self::class, 'setLowercaseCallback']; - $format = (string) preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', $callable, $format); + $format = (string) \preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', $callable, $format); // Only process the non-quoted blocks for date format characters - $blocks = explode('"', $format); + $blocks = \explode('"', $format); foreach ($blocks as $key => &$block) { if ($key % 2 == 0) { - $block = strtr($block, self::DATE_FORMAT_REPLACEMENTS); - if (!strpos($block, 'A')) { + $block = \strtr($block, self::DATE_FORMAT_REPLACEMENTS); + if (!\strpos($block, 'A')) { // 24-hour time format // when [h]:mm format, the [h] should replace to the hours of the value * 24 $seekingBracket = true; @@ -147,19 +147,19 @@ class DateFormatter self::tryInterval($seekingBracket, $block, $value, '[m]'); self::tryInterval($seekingBracket, $block, $value, '[s]'); self::tryInterval($seekingBracket, $block, $value, '[ss]'); - $block = strtr($block, self::DATE_FORMAT_REPLACEMENTS24); + $block = \strtr($block, self::DATE_FORMAT_REPLACEMENTS24); } else { // 12-hour time format - $block = strtr($block, self::DATE_FORMAT_REPLACEMENTS12); + $block = \strtr($block, self::DATE_FORMAT_REPLACEMENTS12); } } } - $format = implode('"', $blocks); + $format = \implode('"', $blocks); // escape any quoted characters so that DateTime format() will render them correctly /** @var callable */ $callback = [self::class, 'escapeQuotesCallback']; - $format = (string) preg_replace_callback('/"(.*)"/U', $callback, $format); + $format = (string) \preg_replace_callback('/"(.*)"/U', $callback, $format); $dateObj = Date::excelToDateTimeObject($value); // If the colon preceding minute had been quoted, as happens in @@ -172,11 +172,11 @@ class DateFormatter private static function setLowercaseCallback(array $matches): string { - return mb_strtolower($matches[0]); + return \mb_strtolower($matches[0]); } private static function escapeQuotesCallback(array $matches): string { - return '\\' . implode('\\', /** @scrutinizer ignore-type */ str_split($matches[1])); + return '\\' . \implode('\\', /** @scrutinizer ignore-type */ \str_split($matches[1])); } } diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/Formatter.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/Formatter.php index be195a8..c2fb3e8 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/Formatter.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/Formatter.php @@ -42,21 +42,21 @@ class Formatter // 2 sections: [POSITIVE/ZERO/TEXT] [NEGATIVE] // 3 sections: [POSITIVE/TEXT] [NEGATIVE] [ZERO] // 4 sections: [POSITIVE] [NEGATIVE] [ZERO] [TEXT] - $cnt = count($sections); - $color_regex = '/\\[(' . implode('|', Color::NAMED_COLORS) . ')\\]/mui'; + $cnt = \count($sections); + $color_regex = '/\\[(' . \implode('|', Color::NAMED_COLORS) . ')\\]/mui'; $cond_regex = '/\\[(>|>=|<|<=|=|<>)([+-]?\\d+([.]\\d+)?)\\]/'; $colors = ['', '', '', '', '']; $condops = ['', '', '', '', '']; $condvals = [0, 0, 0, 0, 0]; for ($idx = 0; $idx < $cnt; ++$idx) { - if (preg_match($color_regex, $sections[$idx], $matches)) { + if (\preg_match($color_regex, $sections[$idx], $matches)) { $colors[$idx] = $matches[0]; - $sections[$idx] = (string) preg_replace($color_regex, '', $sections[$idx]); + $sections[$idx] = (string) \preg_replace($color_regex, '', $sections[$idx]); } - if (preg_match($cond_regex, $sections[$idx], $matches)) { + if (\preg_match($cond_regex, $sections[$idx], $matches)) { $condops[$idx] = $matches[1]; $condvals[$idx] = $matches[2]; - $sections[$idx] = (string) preg_replace($cond_regex, '', $sections[$idx]); + $sections[$idx] = (string) \preg_replace($cond_regex, '', $sections[$idx]); } } $color = $colors[0]; @@ -64,7 +64,7 @@ class Formatter $absval = $value; switch ($cnt) { case 2: - $absval = abs($value); + $absval = \abs($value); if (!self::splitFormatCompare($value, $condops[0], $condvals[0], '>=', 0)) { $color = $colors[1]; $format = $sections[1]; @@ -73,7 +73,7 @@ class Formatter break; case 3: case 4: - $absval = abs($value); + $absval = \abs($value); if (!self::splitFormatCompare($value, $condops[0], $condvals[0], '>', 0)) { if (self::splitFormatCompare($value, $condops[1], $condvals[1], '<', 0)) { $color = $colors[1]; @@ -102,7 +102,7 @@ class Formatter public static function toFormattedString($value, $format, $callBack = null) { // For now we do not treat strings although section 4 of a format code affects strings - if (!is_numeric($value)) { + if (!\is_numeric($value)) { return $value; } @@ -113,38 +113,38 @@ class Formatter } // Ignore square-$-brackets prefix in format string, like "[$-411]ge.m.d", "[$-010419]0%", etc - $format = (string) preg_replace('/^\[\$-[^\]]*\]/', '', $format); + $format = (string) \preg_replace('/^\[\$-[^\]]*\]/', '', $format); - $format = (string) preg_replace_callback( + $format = (string) \preg_replace_callback( '/(["])(?:(?=(\\\\?))\\2.)*?\\1/u', function ($matches) { - return str_replace('.', chr(0x00), $matches[0]); + return \str_replace('.', \chr(0x00), $matches[0]); }, $format ); // Convert any other escaped characters to quoted strings, e.g. (\T to "T") - $format = (string) preg_replace('/(\\\(((.)(?!((AM\/PM)|(A\/P))))|([^ ])))(?=(?:[^"]|"[^"]*")*$)/ui', '"${2}"', $format); + $format = (string) \preg_replace('/(\\\(((.)(?!((AM\/PM)|(A\/P))))|([^ ])))(?=(?:[^"]|"[^"]*")*$)/ui', '"${2}"', $format); // Get the sections, there can be up to four sections, separated with a semi-colon (but only if not a quoted literal) - $sections = preg_split('/(;)(?=(?:[^"]|"[^"]*")*$)/u', $format); + $sections = \preg_split('/(;)(?=(?:[^"]|"[^"]*")*$)/u', $format); [$colors, $format, $value] = self::splitFormat($sections, $value); // In Excel formats, "_" is used to add spacing, // The following character indicates the size of the spacing, which we can't do in HTML, so we just use a standard space - $format = (string) preg_replace('/_.?/ui', ' ', $format); + $format = (string) \preg_replace('/_.?/ui', ' ', $format); // Let's begin inspecting the format and converting the value to a formatted string // Check for date/time characters (not inside quotes) - if (preg_match('/(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy](?=(?:[^"]|"[^"]*")*$)/miu', $format, $matches)) { + if (\preg_match('/(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy](?=(?:[^"]|"[^"]*")*$)/miu', $format, $matches)) { // datetime format $value = DateFormatter::format($value, $format); } else { - if (substr($format, 0, 1) === '"' && substr($format, -1, 1) === '"' && substr_count($format, '"') === 2) { - $value = substr($format, 1, -1); - } elseif (preg_match('/[0#, ]%/', $format)) { + if (\substr($format, 0, 1) === '"' && \substr($format, -1, 1) === '"' && \substr_count($format, '"') === 2) { + $value = \substr($format, 1, -1); + } elseif (\preg_match('/[0#, ]%/', $format)) { // % number format $value = PercentageFormatter::format($value, $format); } else { @@ -158,7 +158,7 @@ class Formatter $value = $writerInstance->$function($value, $colors); } - $value = str_replace(chr(0x00), '.', $value); + $value = \str_replace(\chr(0x00), '.', $value); return $value; } diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php index d1fc89f..d5c1645 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php @@ -13,17 +13,17 @@ class FractionFormatter extends BaseFormatter { $format = self::stripQuotes($format); $value = (float) $value; - $absValue = abs($value); + $absValue = \abs($value); $sign = ($value < 0.0) ? '-' : ''; - $integerPart = floor($absValue); + $integerPart = \floor($absValue); $decimalPart = self::getDecimal((string) $absValue); if ($decimalPart === '0') { return "{$sign}{$integerPart}"; } - $decimalLength = strlen($decimalPart); + $decimalLength = \strlen($decimalPart); $decimalDivisor = 10 ** $decimalLength; /** @var float */ @@ -34,15 +34,15 @@ class FractionFormatter extends BaseFormatter $adjustedDecimalPart = $decimalPartx / $GCD; $adjustedDecimalDivisor = $decimalDivisor / $GCD; - if ((strpos($format, '0') !== false)) { + if ((\strpos($format, '0') !== false)) { return "{$sign}{$integerPart} {$adjustedDecimalPart}/{$adjustedDecimalDivisor}"; - } elseif ((strpos($format, '#') !== false)) { + } elseif ((\strpos($format, '#') !== false)) { if ($integerPart == 0) { return "{$sign}{$adjustedDecimalPart}/{$adjustedDecimalDivisor}"; } return "{$sign}{$integerPart} {$adjustedDecimalPart}/{$adjustedDecimalDivisor}"; - } elseif ((substr($format, 0, 3) == '? ?')) { + } elseif ((\substr($format, 0, 3) == '? ?')) { if ($integerPart == 0) { $integerPart = ''; } @@ -58,7 +58,7 @@ class FractionFormatter extends BaseFormatter private static function getDecimal(string $value): string { $decimalPart = '0'; - if (preg_match('/^\\d*[.](\\d*[1-9])0*$/', $value, $matches) === 1) { + if (\preg_match('/^\\d*[.](\\d*[1-9])0*$/', $value, $matches) === 1) { $decimalPart = $matches[1]; } diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php index 989f33a..0d09d95 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php @@ -11,20 +11,20 @@ class NumberFormatter private static function mergeComplexNumberFormatMasks(array $numbers, array $masks): array { - $decimalCount = strlen($numbers[1]); + $decimalCount = \strlen($numbers[1]); $postDecimalMasks = []; do { - $tempMask = array_pop($masks); + $tempMask = \array_pop($masks); if ($tempMask !== null) { $postDecimalMasks[] = $tempMask; - $decimalCount -= strlen($tempMask); + $decimalCount -= \strlen($tempMask); } } while ($tempMask !== null && $decimalCount > 0); return [ - implode('.', $masks), - implode('.', array_reverse($postDecimalMasks)), + \implode('.', $masks), + \implode('.', \array_reverse($postDecimalMasks)), ]; } @@ -35,27 +35,27 @@ class NumberFormatter { /** @var string */ $result = $number; - $maskingBlockCount = preg_match_all('/0+/', $mask, $maskingBlocks, PREG_OFFSET_CAPTURE); + $maskingBlockCount = \preg_match_all('/0+/', $mask, $maskingBlocks, PREG_OFFSET_CAPTURE); if ($maskingBlockCount > 1) { - $maskingBlocks = array_reverse($maskingBlocks[0]); + $maskingBlocks = \array_reverse($maskingBlocks[0]); $offset = 0; foreach ($maskingBlocks as $block) { - $size = strlen($block[0]); + $size = \strlen($block[0]); $divisor = 10 ** $size; $offset = $block[1]; /** @var float */ $numberFloat = $number; - $blockValue = sprintf("%0{$size}d", fmod($numberFloat, $divisor)); - $number = floor($numberFloat / $divisor); - $mask = substr_replace($mask, $blockValue, $offset, $size); + $blockValue = \sprintf("%0{$size}d", \fmod($numberFloat, $divisor)); + $number = \floor($numberFloat / $divisor); + $mask = \substr_replace($mask, $blockValue, $offset, $size); } /** @var string */ $numberString = $number; if ($number > 0) { - $mask = substr_replace($mask, $numberString, $offset, 0); + $mask = \substr_replace($mask, $numberString, $offset, 0); } $result = $mask; } @@ -71,36 +71,36 @@ class NumberFormatter /** @var float */ $numberFloat = $number; if ($splitOnPoint) { - $masks = explode('.', $mask); - if (count($masks) <= 2) { + $masks = \explode('.', $mask); + if (\count($masks) <= 2) { $decmask = $masks[1] ?? ''; - $decpos = substr_count($decmask, '0'); - $numberFloat = round($numberFloat, $decpos); + $decpos = \substr_count($decmask, '0'); + $numberFloat = \round($numberFloat, $decpos); } } $sign = ($numberFloat < 0.0) ? '-' : ''; - $number = self::f2s(abs($numberFloat)); + $number = self::f2s(\abs($numberFloat)); - if ($splitOnPoint && strpos($mask, '.') !== false && strpos($number, '.') !== false) { - $numbers = explode('.', $number); - $masks = explode('.', $mask); - if (count($masks) > 2) { + if ($splitOnPoint && \strpos($mask, '.') !== false && \strpos($number, '.') !== false) { + $numbers = \explode('.', $number); + $masks = \explode('.', $mask); + if (\count($masks) > 2) { $masks = self::mergeComplexNumberFormatMasks($numbers, $masks); } $integerPart = self::complexNumberFormatMask($numbers[0], $masks[0], false); - $numlen = strlen($numbers[1]); - $msklen = strlen($masks[1]); + $numlen = \strlen($numbers[1]); + $msklen = \strlen($masks[1]); if ($numlen < $msklen) { - $numbers[1] .= str_repeat('0', $msklen - $numlen); + $numbers[1] .= \str_repeat('0', $msklen - $numlen); } - $decimalPart = strrev(self::complexNumberFormatMask(strrev($numbers[1]), strrev($masks[1]), false)); - $decimalPart = substr($decimalPart, 0, $msklen); + $decimalPart = \strrev(self::complexNumberFormatMask(\strrev($numbers[1]), \strrev($masks[1]), false)); + $decimalPart = \substr($decimalPart, 0, $msklen); return "{$sign}{$integerPart}.{$decimalPart}"; } - if (strlen($number) < strlen($mask)) { - $number = str_repeat('0', strlen($mask) - strlen($number)) . $number; + if (\strlen($number) < \strlen($mask)) { + $number = \str_repeat('0', \strlen($mask) - \strlen($number)) . $number; } $result = self::processComplexNumberFormatMask($number, $mask); @@ -118,20 +118,20 @@ class NumberFormatter // optional sign, single digit 1-9, // decimal point and digits (allowed to be omitted), // E (e permitted), optional sign, one or more digits - if (preg_match('/^([+-])?([1-9])([.]([0-9]+))?[eE]([+-]?[0-9]+)$/', $s, $matches) === 1) { + if (\preg_match('/^([+-])?([1-9])([.]([0-9]+))?[eE]([+-]?[0-9]+)$/', $s, $matches) === 1) { $exponent = (int) $matches[5]; $sign = ($matches[1] === '-') ? '-' : ''; if ($exponent >= 0) { $exponentPlus1 = $exponent + 1; $out = $matches[2] . $matches[4]; - $len = strlen($out); + $len = \strlen($out); if ($len < $exponentPlus1) { - $out .= str_repeat('0', $exponentPlus1 - $len); + $out .= \str_repeat('0', $exponentPlus1 - $len); } - $out = substr($out, 0, $exponentPlus1) . ((strlen($out) === $exponentPlus1) ? '' : ('.' . substr($out, $exponentPlus1))); + $out = \substr($out, 0, $exponentPlus1) . ((\strlen($out) === $exponentPlus1) ? '' : ('.' . \substr($out, $exponentPlus1))); $s = "$sign$out"; } else { - $s = $sign . '0.' . str_repeat('0', -$exponent - 1) . $matches[2] . $matches[4]; + $s = $sign . '0.' . \str_repeat('0', -$exponent - 1) . $matches[2] . $matches[4]; } } @@ -150,11 +150,11 @@ class NumberFormatter $right = $matches[3]; // minimun width of formatted number (including dot) - $minWidth = strlen($left) + strlen($dec) + strlen($right); + $minWidth = \strlen($left) + \strlen($dec) + \strlen($right); if ($useThousands) { - $value = number_format( + $value = \number_format( $valueFloat, - strlen($right), + \strlen($right), StringHelper::getDecimalSeparator(), StringHelper::getThousandsSeparator() ); @@ -162,16 +162,16 @@ class NumberFormatter return self::pregReplace(self::NUMBER_REGEX, $value, $format); } - if (preg_match('/[0#]E[+-]0/i', $format)) { + if (\preg_match('/[0#]E[+-]0/i', $format)) { // Scientific format - return sprintf('%5.2E', $valueFloat); - } elseif (preg_match('/0([^\d\.]+)0/', $format) || substr_count($format, '.') > 1) { - if ($valueFloat == floor($valueFloat) && substr_count($format, '.') === 1) { - $value *= 10 ** strlen(explode('.', $format)[1]); + return \sprintf('%5.2E', $valueFloat); + } elseif (\preg_match('/0([^\d\.]+)0/', $format) || \substr_count($format, '.') > 1) { + if ($valueFloat == \floor($valueFloat) && \substr_count($format, '.') === 1) { + $value *= 10 ** \strlen(\explode('.', $format)[1]); } $result = self::complexNumberFormatMask($value, $format); - if (strpos($result, 'E') !== false) { + if (\strpos($result, 'E') !== false) { // This is a hack and doesn't match Excel. // It will, at least, be an accurate representation, // even if formatted incorrectly. @@ -182,10 +182,10 @@ class NumberFormatter return $result; } - $sprintf_pattern = "%0$minWidth." . strlen($right) . 'f'; + $sprintf_pattern = "%0$minWidth." . \strlen($right) . 'f'; /** @var float */ $valueFloat = $value; - $value = sprintf($sprintf_pattern, round($valueFloat, strlen($right))); + $value = \sprintf($sprintf_pattern, \round($valueFloat, \strlen($right))); return self::pregReplace(self::NUMBER_REGEX, $value, $format); } @@ -203,12 +203,12 @@ class NumberFormatter //} // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols - $format = self::makeString(str_replace(['"', '*'], '', $format)); + $format = self::makeString(\str_replace(['"', '*'], '', $format)); // Find out if we need thousands separator // This is indicated by a comma enclosed by a digit placeholder: // #,# or 0,0 - $useThousands = (bool) preg_match('/(#,#|0,0)/', $format); + $useThousands = (bool) \preg_match('/(#,#|0,0)/', $format); if ($useThousands) { $format = self::pregReplace('/0,0/', '00', $format); $format = self::pregReplace('/#,#/', '##', $format); @@ -219,14 +219,14 @@ class NumberFormatter // #, or 0.0,, $scale = 1; // same as no scale $matches = []; - if (preg_match('/(#|0)(,+)/', $format, $matches)) { - $scale = 1000 ** strlen($matches[2]); + if (\preg_match('/(#|0)(,+)/', $format, $matches)) { + $scale = 1000 ** \strlen($matches[2]); // strip the commas $format = self::pregReplace('/0,+/', '0', $format); $format = self::pregReplace('/#,+/', '#', $format); } - if (preg_match('/#?.*\?\/\?/', $format, $m)) { + if (\preg_match('/#?.*\?\/\?/', $format, $m)) { $value = FractionFormatter::format($value, $format); } else { // Handle the number itself @@ -240,20 +240,20 @@ class NumberFormatter $n = '/\\[[^\\]]+\\]/'; $m = self::pregReplace($n, '', $format); - if (preg_match(self::NUMBER_REGEX, $m, $matches)) { + if (\preg_match(self::NUMBER_REGEX, $m, $matches)) { // There are placeholders for digits, so inject digits from the value into the mask $value = self::formatStraightNumericValue($value, $format, $matches, $useThousands); } elseif ($format !== NumberFormat::FORMAT_GENERAL) { // Yes, I know that this is basically just a hack; // if there's no placeholders for digits, just return the format mask "as is" - $value = self::makeString(str_replace('?', '', $format)); + $value = self::makeString(\str_replace('?', '', $format)); } } - if (preg_match('/\[\$(.*)\]/u', $format, $m)) { + if (\preg_match('/\[\$(.*)\]/u', $format, $m)) { // Currency or Accounting $currencyCode = $m[1]; - [$currencyCode] = explode('-', $currencyCode); + [$currencyCode] = \explode('-', $currencyCode); if ($currencyCode == '') { $currencyCode = StringHelper::getCurrencyCode(); } @@ -268,11 +268,11 @@ class NumberFormatter */ private static function makeString($value): string { - return is_array($value) ? '' : "$value"; + return \is_array($value) ? '' : "$value"; } private static function pregReplace(string $pattern, string $replacement, string $subject): string { - return self::makeString(preg_replace($pattern, $replacement, $subject) ?? ''); + return self::makeString(\preg_replace($pattern, $replacement, $subject) ?? ''); } } diff --git a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php index 74f3877..6a271bf 100755 --- a/PhpOffice/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php +++ b/PhpOffice/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php @@ -9,39 +9,39 @@ class PercentageFormatter extends BaseFormatter public static function format($value, string $format): string { if ($format === NumberFormat::FORMAT_PERCENTAGE) { - return round((100 * $value), 0) . '%'; + return \round((100 * $value), 0) . '%'; } $value *= 100; $format = self::stripQuotes($format); - [, $vDecimals] = explode('.', ((string) $value) . '.'); - $vDecimalCount = strlen(rtrim($vDecimals, '0')); + [, $vDecimals] = \explode('.', ((string) $value) . '.'); + $vDecimalCount = \strlen(\rtrim($vDecimals, '0')); - $format = str_replace('%', '%%', $format); - $wholePartSize = strlen((string) floor($value)); + $format = \str_replace('%', '%%', $format); + $wholePartSize = \strlen((string) \floor($value)); $decimalPartSize = 0; $placeHolders = ''; // Number of decimals - if (preg_match('/\.([?0]+)/u', $format, $matches)) { - $decimalPartSize = strlen($matches[1]); - $vMinDecimalCount = strlen(rtrim($matches[1], '?')); - $decimalPartSize = min(max($vMinDecimalCount, $vDecimalCount), $decimalPartSize); - $placeHolders = str_repeat(' ', strlen($matches[1]) - $decimalPartSize); + if (\preg_match('/\.([?0]+)/u', $format, $matches)) { + $decimalPartSize = \strlen($matches[1]); + $vMinDecimalCount = \strlen(\rtrim($matches[1], '?')); + $decimalPartSize = \min(\max($vMinDecimalCount, $vDecimalCount), $decimalPartSize); + $placeHolders = \str_repeat(' ', \strlen($matches[1]) - $decimalPartSize); } // Number of digits to display before the decimal - if (preg_match('/([#0,]+)\.?/u', $format, $matches)) { - $firstZero = preg_replace('/^[#,]*/', '', $matches[1]) ?? ''; - $wholePartSize = max($wholePartSize, strlen($firstZero)); + if (\preg_match('/([#0,]+)\.?/u', $format, $matches)) { + $firstZero = \preg_replace('/^[#,]*/', '', $matches[1]) ?? ''; + $wholePartSize = \max($wholePartSize, \strlen($firstZero)); } $wholePartSize += $decimalPartSize + (int) ($decimalPartSize > 0); $replacement = "0{$wholePartSize}.{$decimalPartSize}"; - $mask = (string) preg_replace('/[#0,]+\.?[?#0,]*/ui', "%{$replacement}f{$placeHolders}", $format); + $mask = (string) \preg_replace('/[#0,]+\.?[?#0,]*/ui', "%{$replacement}f{$placeHolders}", $format); /** @var float */ $valueFloat = $value; - return sprintf($mask, round($valueFloat, $decimalPartSize)); + return \sprintf($mask, \round($valueFloat, $decimalPartSize)); } } diff --git a/PhpOffice/PhpSpreadsheet/Style/Protection.php b/PhpOffice/PhpSpreadsheet/Style/Protection.php index 1c174e7..00e9d7f 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Protection.php +++ b/PhpOffice/PhpSpreadsheet/Style/Protection.php @@ -180,7 +180,7 @@ class Protection extends Supervisor return $this->getSharedComponent()->getHashCode(); } - return md5( + return \md5( $this->locked . $this->hidden . __CLASS__ diff --git a/PhpOffice/PhpSpreadsheet/Style/Style.php b/PhpOffice/PhpSpreadsheet/Style/Style.php index 506159d..13d33ef 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Style.php +++ b/PhpOffice/PhpSpreadsheet/Style/Style.php @@ -204,14 +204,14 @@ class Style extends Supervisor $pRange = $this->getSelectedCells(); // Uppercase coordinate - $pRange = strtoupper($pRange); + $pRange = \strtoupper($pRange); // Is it a cell range or a single cell? - if (strpos($pRange, ':') === false) { + if (\strpos($pRange, ':') === false) { $rangeA = $pRange; $rangeB = $pRange; } else { - [$rangeA, $rangeB] = explode(':', $pRange); + [$rangeA, $rangeB] = \explode(':', $pRange); } // Calculate range outer borders @@ -263,8 +263,8 @@ class Style extends Supervisor unset($styleArray['borders']['inside']); // not needed any more } // width and height characteristics of selection, 1, 2, or 3 (for 3 or more) - $xMax = min($rangeEndIndexes[0] - $rangeStartIndexes[0] + 1, 3); - $yMax = min($rangeEndIndexes[1] - $rangeStartIndexes[1] + 1, 3); + $xMax = \min($rangeEndIndexes[0] - $rangeStartIndexes[0] + 1, 3); + $yMax = \min($rangeEndIndexes[1] - $rangeStartIndexes[1] + 1, 3); // loop through up to 3 x 3 = 9 regions for ($x = 1; $x <= $xMax; ++$x) { @@ -313,7 +313,7 @@ class Style extends Supervisor unset($regionStyles['borders']['inside']); // what are the inner edges of the region when looking at the selection - $innerEdges = array_diff(['top', 'right', 'bottom', 'left'], $edges); + $innerEdges = \array_diff(['top', 'right', 'bottom', 'left'], $edges); // inner edges that are not touching the region should take the 'inside' border properties if they have been set foreach ($innerEdges as $innerEdge) { @@ -354,12 +354,12 @@ class Style extends Supervisor // SIMPLE MODE: // Selection type, inspect - if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) { + if (\preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) { $selectionType = 'COLUMN'; // Enable caching of styles self::$cachedStyles = ['hashByObjId' => [], 'styleByHash' => []]; - } elseif (preg_match('/^A\d+:XFD\d+$/', $pRange)) { + } elseif (\preg_match('/^A\d+:XFD\d+$/', $pRange)) { $selectionType = 'ROW'; // Enable caching of styles @@ -388,7 +388,7 @@ class Style extends Supervisor } else { // Style cache is stored by Style::getHashCode(). But calling this method is // expensive. So we cache the php obj id -> hash. - $objId = spl_object_id($style); + $objId = \spl_object_id($style); // Look for the original HashCode $styleHash = self::$cachedStyles['hashByObjId'][$objId] ?? null; @@ -687,7 +687,7 @@ class Style extends Supervisor */ public function getHashCode() { - return md5( + return \md5( $this->fill->getHashCode() . $this->font->getHashCode() . $this->borders->getHashCode() . diff --git a/PhpOffice/PhpSpreadsheet/Style/Supervisor.php b/PhpOffice/PhpSpreadsheet/Style/Supervisor.php index 8a5c350..40ef57f 100755 --- a/PhpOffice/PhpSpreadsheet/Style/Supervisor.php +++ b/PhpOffice/PhpSpreadsheet/Style/Supervisor.php @@ -105,9 +105,9 @@ abstract class Supervisor implements IComparable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if ((is_object($value)) && ($key != 'parent')) { + if ((\is_object($value)) && ($key != 'parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter.php b/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter.php index d604198..495f451 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter.php @@ -124,7 +124,7 @@ class AutoFilter return $this; } - if (ctype_digit($range) || ctype_alpha($range)) { + if (\ctype_digit($range) || \ctype_alpha($range)) { throw new Exception("{$range} is an invalid range for AutoFilter"); } @@ -146,7 +146,7 @@ class AutoFilter $this->evaluated = false; if ($this->workSheet !== null) { $thisrange = $this->range; - $range = (string) preg_replace('/\\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); + $range = (string) \preg_replace('/\\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); if ($range !== $thisrange) { $this->setRange($range); } @@ -243,22 +243,22 @@ class AutoFilter public function setColumn($columnObjectOrString) { $this->evaluated = false; - if ((is_string($columnObjectOrString)) && (!empty($columnObjectOrString))) { + if ((\is_string($columnObjectOrString)) && (!empty($columnObjectOrString))) { $column = $columnObjectOrString; - } elseif (is_object($columnObjectOrString) && ($columnObjectOrString instanceof AutoFilter\Column)) { + } elseif (\is_object($columnObjectOrString) && ($columnObjectOrString instanceof AutoFilter\Column)) { $column = $columnObjectOrString->getColumnIndex(); } else { throw new Exception('Column is not within the autofilter range.'); } $this->testColumnInRange($column); - if (is_string($columnObjectOrString)) { + if (\is_string($columnObjectOrString)) { $this->columns[$columnObjectOrString] = new AutoFilter\Column($columnObjectOrString, $this); } else { $columnObjectOrString->setParent($this); $this->columns[$column] = $columnObjectOrString; } - ksort($this->columns); + \ksort($this->columns); return $this; } @@ -297,8 +297,8 @@ class AutoFilter public function shiftColumn($fromColumn, $toColumn) { $this->evaluated = false; - $fromColumn = strtoupper($fromColumn); - $toColumn = strtoupper($toColumn); + $fromColumn = \strtoupper($fromColumn); + $toColumn = \strtoupper($toColumn); if (($fromColumn !== null) && (isset($this->columns[$fromColumn])) && ($toColumn !== null)) { $this->columns[$fromColumn]->setParent(); @@ -307,7 +307,7 @@ class AutoFilter $this->columns[$toColumn]->setParent($this); unset($this->columns[$fromColumn]); - ksort($this->columns); + \ksort($this->columns); } return $this; @@ -329,7 +329,7 @@ class AutoFilter return $blanks; } - return in_array($cellValue, $dataSetValues); + return \in_array($cellValue, $dataSetValues); } /** @@ -347,16 +347,16 @@ class AutoFilter if (($cellValue == '') || ($cellValue === null)) { return $blanks; } - $timeZone = new DateTimeZone('UTC'); + $timeZone = new \DateTimeZone('UTC'); - if (is_numeric($cellValue)) { + if (\is_numeric($cellValue)) { $dateTime = Date::excelToDateTimeObject((float) $cellValue, $timeZone); $cellValue = (float) $cellValue; if ($cellValue < 1) { // Just the time part $dtVal = $dateTime->format('His'); $dateSet = $dateSet['time']; - } elseif ($cellValue == floor($cellValue)) { + } elseif ($cellValue == \floor($cellValue)) { // Just the date part $dtVal = $dateTime->format('Ymd'); $dateSet = $dateSet['date']; @@ -367,7 +367,7 @@ class AutoFilter } foreach ($dateSet as $dateValue) { // Use of substr to extract value at the appropriate group level - if (substr($dtVal, 0, strlen($dateValue)) == $dateValue) { + if (\substr($dtVal, 0, \strlen($dateValue)) == $dateValue) { return true; } } @@ -407,9 +407,9 @@ class AutoFilter $cellValueString = $cellValue ?? ''; $retVal = false; - if (is_numeric($ruleValue)) { + if (\is_numeric($ruleValue)) { // Numeric values are tested using the appropriate operator - $numericTest = is_numeric($cellValue); + $numericTest = \is_numeric($cellValue); switch ($ruleOperator) { case Rule::AUTOFILTER_COLUMN_RULE_EQUAL: $retVal = $numericTest && ($cellValue == $ruleValue); @@ -455,27 +455,27 @@ class AutoFilter // String values are always tested for equality, factoring in for wildcards (hence a regexp test) switch ($ruleOperator) { case Rule::AUTOFILTER_COLUMN_RULE_EQUAL: - $retVal = (bool) preg_match('/^' . $ruleValue . '$/i', $cellValueString); + $retVal = (bool) \preg_match('/^' . $ruleValue . '$/i', $cellValueString); break; case Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL: - $retVal = !((bool) preg_match('/^' . $ruleValue . '$/i', $cellValueString)); + $retVal = !((bool) \preg_match('/^' . $ruleValue . '$/i', $cellValueString)); break; case Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN: - $retVal = strcasecmp($cellValueString, $ruleValue) > 0; + $retVal = \strcasecmp($cellValueString, $ruleValue) > 0; break; case Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL: - $retVal = strcasecmp($cellValueString, $ruleValue) >= 0; + $retVal = \strcasecmp($cellValueString, $ruleValue) >= 0; break; case Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN: - $retVal = strcasecmp($cellValueString, $ruleValue) < 0; + $retVal = \strcasecmp($cellValueString, $ruleValue) < 0; break; case Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL: - $retVal = strcasecmp($cellValueString, $ruleValue) <= 0; + $retVal = \strcasecmp($cellValueString, $ruleValue) <= 0; break; } @@ -516,10 +516,10 @@ class AutoFilter return false; } - if (is_numeric($cellValue)) { - $dateObject = Date::excelToDateTimeObject((float) $cellValue, new DateTimeZone('UTC')); + if (\is_numeric($cellValue)) { + $dateObject = Date::excelToDateTimeObject((float) $cellValue, new \DateTimeZone('UTC')); $dateValue = (int) $dateObject->format('m'); - if (in_array($dateValue, $monthSet)) { + if (\in_array($dateValue, $monthSet)) { return true; } } @@ -527,9 +527,9 @@ class AutoFilter return false; } - private static function makeDateObject(int $year, int $month, int $day, int $hour = 0, int $minute = 0, int $second = 0): DateTime + private static function makeDateObject(int $year, int $month, int $day, int $hour = 0, int $minute = 0, int $second = 0): \DateTime { - $baseDate = new DateTime(); + $baseDate = new \DateTime(); $baseDate->setDate($year, $month, $day); $baseDate->setTime($hour, $minute, $second); @@ -557,7 +557,7 @@ class AutoFilter private static function dynamicLastMonth(): array { - $maxval = new DateTime(); + $maxval = new \DateTime(); $year = (int) $maxval->format('Y'); $month = (int) $maxval->format('m'); $maxval->setDate($year, $month, 1); @@ -568,12 +568,12 @@ class AutoFilter return [$val, $maxval]; } - private static function firstDayOfQuarter(): DateTime + private static function firstDayOfQuarter(): \DateTime { - $val = new DateTime(); + $val = new \DateTime(); $year = (int) $val->format('Y'); $month = (int) $val->format('m'); - $month = 3 * intdiv($month - 1, 3) + 1; + $month = 3 * \intdiv($month - 1, 3) + 1; $val->setDate($year, $month, 1); $val->setTime(0, 0, 0); @@ -591,7 +591,7 @@ class AutoFilter private static function dynamicLastWeek(): array { - $val = new DateTime(); + $val = new \DateTime(); $val->setTime(0, 0, 0); $dayOfWeek = (int) $val->format('w'); // Sunday is 0 $subtract = $dayOfWeek + 7; // revert to prior Sunday @@ -604,7 +604,7 @@ class AutoFilter private static function dynamicLastYear(): array { - $val = new DateTime(); + $val = new \DateTime(); $year = (int) $val->format('Y'); $val = self::makeDateObject($year - 1, 1, 1); $maxval = self::makeDateObject($year, 1, 1); @@ -614,7 +614,7 @@ class AutoFilter private static function dynamicNextMonth(): array { - $val = new DateTime(); + $val = new \DateTime(); $year = (int) $val->format('Y'); $month = (int) $val->format('m'); $val->setDate($year, $month, 1); @@ -638,7 +638,7 @@ class AutoFilter private static function dynamicNextWeek(): array { - $val = new DateTime(); + $val = new \DateTime(); $val->setTime(0, 0, 0); $dayOfWeek = (int) $val->format('w'); // Sunday is 0 $add = 7 - $dayOfWeek; // move to next Sunday @@ -651,7 +651,7 @@ class AutoFilter private static function dynamicNextYear(): array { - $val = new DateTime(); + $val = new \DateTime(); $year = (int) $val->format('Y'); $val = self::makeDateObject($year + 1, 1, 1); $maxval = self::makeDateObject($year + 2, 1, 1); @@ -661,7 +661,7 @@ class AutoFilter private static function dynamicThisMonth(): array { - $baseDate = new DateTime(); + $baseDate = new \DateTime(); $baseDate->setTime(0, 0, 0); $year = (int) $baseDate->format('Y'); $month = (int) $baseDate->format('m'); @@ -683,7 +683,7 @@ class AutoFilter private static function dynamicThisWeek(): array { - $val = new DateTime(); + $val = new \DateTime(); $val->setTime(0, 0, 0); $dayOfWeek = (int) $val->format('w'); // Sunday is 0 $subtract = $dayOfWeek; // revert to Sunday @@ -696,7 +696,7 @@ class AutoFilter private static function dynamicThisYear(): array { - $val = new DateTime(); + $val = new \DateTime(); $year = (int) $val->format('Y'); $val = self::makeDateObject($year, 1, 1); $maxval = self::makeDateObject($year + 1, 1, 1); @@ -706,7 +706,7 @@ class AutoFilter private static function dynamicToday(): array { - $val = new DateTime(); + $val = new \DateTime(); $val->setTime(0, 0, 0); $maxval = clone $val; $maxval->modify('+1 day'); @@ -716,7 +716,7 @@ class AutoFilter private static function dynamicTomorrow(): array { - $val = new DateTime(); + $val = new \DateTime(); $val->setTime(0, 0, 0); $val->modify('+1 day'); $maxval = clone $val; @@ -727,7 +727,7 @@ class AutoFilter private static function dynamicYearToDate(): array { - $maxval = new DateTime(); + $maxval = new \DateTime(); $maxval->setTime(0, 0, 0); $val = self::makeDateObject((int) $maxval->format('Y'), 1, 1); $maxval->modify('+1 day'); @@ -737,7 +737,7 @@ class AutoFilter private static function dynamicYesterday(): array { - $maxval = new DateTime(); + $maxval = new \DateTime(); $maxval->setTime(0, 0, 0); $val = clone $maxval; $val->modify('-1 day'); @@ -760,7 +760,7 @@ class AutoFilter // Val is lowest permitted value. // Maxval is greater than highest permitted value $val = $maxval = 0; - if (is_callable($callBack)) { + if (\is_callable($callBack)) { [$val, $maxval] = $callBack(); } $val = Date::dateTimeToExcel($val); @@ -793,17 +793,17 @@ class AutoFilter $retVal = null; if ($this->workSheet !== null) { $dataValues = Functions::flattenArray($this->workSheet->rangeToArray($range, null, true, false)); - $dataValues = array_filter($dataValues); + $dataValues = \array_filter($dataValues); if ($ruleType == Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) { - rsort($dataValues); + \rsort($dataValues); } else { - sort($dataValues); + \sort($dataValues); } - $slice = array_slice($dataValues, 0, $ruleValue); + $slice = \array_slice($dataValues, 0, $ruleValue); - $retVal = array_pop($slice); + $retVal = \array_pop($slice); } return $retVal; @@ -838,8 +838,8 @@ class AutoFilter } // Test if we want to include blanks in our filter criteria $blanks = false; - $ruleDataSet = array_filter($ruleValues); - if (count($ruleValues) != count($ruleDataSet)) { + $ruleDataSet = \array_filter($ruleValues); + if (\count($ruleValues) != \count($ruleDataSet)) { $blanks = true; } if ($ruleType == Rule::AUTOFILTER_RULETYPE_FILTER) { @@ -856,7 +856,7 @@ class AutoFilter 'dateTime' => [], ]; foreach ($ruleDataSet as $ruleValue) { - if (!is_array($ruleValue)) { + if (!\is_array($ruleValue)) { continue; } $date = $time = ''; @@ -864,37 +864,37 @@ class AutoFilter (isset($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR])) && ($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR] !== '') ) { - $date .= sprintf('%04d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]); + $date .= \sprintf('%04d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]); } if ( (isset($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH])) && ($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH] != '') ) { - $date .= sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]); + $date .= \sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]); } if ( (isset($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY])) && ($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY] !== '') ) { - $date .= sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]); + $date .= \sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]); } if ( (isset($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR])) && ($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR] !== '') ) { - $time .= sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]); + $time .= \sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]); } if ( (isset($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE])) && ($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE] !== '') ) { - $time .= sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]); + $time .= \sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]); } if ( (isset($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND])) && ($ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND] !== '') ) { - $time .= sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]); + $time .= \sprintf('%02d', $ruleValue[Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]); } $dateTime = $date . $time; $arguments['date'][] = $date; @@ -902,9 +902,9 @@ class AutoFilter $arguments['dateTime'][] = $dateTime; } // Remove empty elements - $arguments['date'] = array_filter($arguments['date']); - $arguments['time'] = array_filter($arguments['time']); - $arguments['dateTime'] = array_filter($arguments['dateTime']); + $arguments['date'] = \array_filter($arguments['date']); + $arguments['time'] = \array_filter($arguments['time']); + $arguments['dateTime'] = \array_filter($arguments['dateTime']); $columnFilterTests[$columnID] = [ 'method' => 'filterTestInDateGroupSet', 'arguments' => ['filterValues' => $arguments, 'blanks' => $blanks], @@ -918,12 +918,12 @@ class AutoFilter // Build a list of the filter value selections foreach ($rules as $rule) { $ruleValue = $rule->getValue(); - if (!is_array($ruleValue) && !is_numeric($ruleValue)) { + if (!\is_array($ruleValue) && !\is_numeric($ruleValue)) { // Convert to a regexp allowing for regexp reserved characters, wildcards and escaped wildcards $ruleValue = WildcardMatch::wildcard($ruleValue); - if (trim($ruleValue) == '') { + if (\trim($ruleValue) == '') { $customRuleForBlanks = true; - $ruleValue = trim($ruleValue); + $ruleValue = \trim($ruleValue); } } $ruleValues[] = ['operator' => $rule->getOperator(), 'value' => $ruleValue]; @@ -949,8 +949,8 @@ class AutoFilter $averageFormula = '=AVERAGE(' . $columnID . ($rangeStart[1] + 1) . ':' . $columnID . $rangeEnd[1] . ')'; $spreadsheet = ($this->workSheet === null) ? null : $this->workSheet->getParent(); $average = Calculation::getInstance($spreadsheet)->calculateFormula($averageFormula, null, $this->workSheet->getCell('A1')); - while (is_array($average)) { - $average = array_pop($average); + while (\is_array($average)) { + $average = \array_pop($average); } // Set above/below rule based on greaterThan or LessTan $operator = ($dynamicRuleType === Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) @@ -970,14 +970,14 @@ class AutoFilter $periodType = ''; $period = 0; // Month or Quarter - sscanf($dynamicRuleType, '%[A-Z]%d', $periodType, $period); + \sscanf($dynamicRuleType, '%[A-Z]%d', $periodType, $period); if ($periodType == 'M') { $ruleValues = [$period]; } else { --$period; $periodEnd = (1 + $period) * 3; $periodStart = 1 + $period * 3; - $ruleValues = range($periodStart, $periodEnd); + $ruleValues = \range($periodStart, $periodEnd); } $columnFilterTests[$columnID] = [ 'method' => 'filterTestInPeriodDateSet', @@ -1006,13 +1006,13 @@ class AutoFilter $ruleValue = $rule->getValue(); $ruleOperator = $rule->getOperator(); } - if (is_numeric($ruleValue) && $ruleOperator === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) { - $ruleValue = floor((float) $ruleValue * ($dataRowCount / 100)); + if (\is_numeric($ruleValue) && $ruleOperator === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) { + $ruleValue = \floor((float) $ruleValue * ($dataRowCount / 100)); } - if (!is_array($ruleValue) && $ruleValue < 1) { + if (!\is_array($ruleValue) && $ruleValue < 1) { $ruleValue = 1; } - if (!is_array($ruleValue) && $ruleValue > 500) { + if (!\is_array($ruleValue) && $ruleValue > 500) { $ruleValue = 500; } @@ -1042,7 +1042,7 @@ class AutoFilter // Execute the filter test $result = // $result && // phpstan says $result is always true here // @phpstan-ignore-next-line - call_user_func_array([self::class, $columnFilterTest['method']], [$cellValue, $columnFilterTest['arguments']]); + \call_user_func_array([self::class, $columnFilterTest['method']], [$cellValue, $columnFilterTest['arguments']]); // If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests if (!$result) { break; @@ -1084,16 +1084,16 @@ class AutoFilter */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { if ($key === 'workSheet') { // Detach from worksheet $this->{$key} = null; } else { $this->{$key} = clone $value; } - } elseif ((is_array($value)) && ($key == 'columns')) { + } elseif ((\is_array($value)) && ($key == 'columns')) { // The columns array of \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\AutoFilter objects $this->{$key} = []; foreach ($value as $k => $v) { diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column.php b/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column.php index 076292f..0b44eaf 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column.php @@ -128,7 +128,7 @@ class Column { $this->setEvaluatedFalse(); // Uppercase coordinate - $column = strtoupper($column); + $column = \strtoupper($column); if ($this->parent !== null) { $this->parent->testColumnInRange($column); } @@ -181,10 +181,10 @@ class Column public function setFilterType($filterType) { $this->setEvaluatedFalse(); - if (!in_array($filterType, self::$filterTypes)) { + if (!\in_array($filterType, self::$filterTypes)) { throw new PhpSpreadsheetException('Invalid filter type for column AutoFilter.'); } - if ($filterType === self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER && count($this->ruleset) > 2) { + if ($filterType === self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER && \count($this->ruleset) > 2) { throw new PhpSpreadsheetException('No more than 2 rules are allowed in a Custom Filter'); } @@ -214,8 +214,8 @@ class Column { $this->setEvaluatedFalse(); // Lowercase And/Or - $join = strtolower($join); - if (!in_array($join, self::$ruleJoins)) { + $join = \strtolower($join); + if (!\in_array($join, self::$ruleJoins)) { throw new PhpSpreadsheetException('Invalid rule connection for column AutoFilter.'); } @@ -283,7 +283,7 @@ class Column public function ruleCount(): int { - return count($this->ruleset); + return \count($this->ruleset); } /** @@ -320,12 +320,12 @@ class Column public function createRule() { $this->setEvaluatedFalse(); - if ($this->filterType === self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER && count($this->ruleset) >= 2) { + if ($this->filterType === self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER && \count($this->ruleset) >= 2) { throw new PhpSpreadsheetException('No more than 2 rules are allowed in a Custom Filter'); } $this->ruleset[] = new Column\Rule($this); - return end($this->ruleset); + return \end($this->ruleset); } /** @@ -356,7 +356,7 @@ class Column if (isset($this->ruleset[$index])) { unset($this->ruleset[$index]); // If we've just deleted down to a single rule, then reset And/Or joining to Or - if (count($this->ruleset) <= 1) { + if (\count($this->ruleset) <= 1) { $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); } } @@ -383,7 +383,7 @@ class Column */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { if ($key === 'parent') { // Detach from autofilter parent diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php b/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php index 408dfb3..b93fac4 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php @@ -240,7 +240,7 @@ class Rule public function setRuleType($ruleType) { $this->setEvaluatedFalse(); - if (!in_array($ruleType, self::RULE_TYPES)) { + if (!\in_array($ruleType, self::RULE_TYPES)) { throw new PhpSpreadsheetException('Invalid rule type for column AutoFilter Rule.'); } @@ -269,19 +269,19 @@ class Rule public function setValue($value) { $this->setEvaluatedFalse(); - if (is_array($value)) { + if (\is_array($value)) { $grouping = -1; foreach ($value as $key => $v) { // Validate array entries - if (!in_array($key, self::DATE_TIME_GROUPS)) { + if (!\in_array($key, self::DATE_TIME_GROUPS)) { // Remove any invalid entries from the value array unset($value[$key]); } else { // Work out what the dateTime grouping will be - $grouping = max($grouping, array_search($key, self::DATE_TIME_GROUPS)); + $grouping = \max($grouping, \array_search($key, self::DATE_TIME_GROUPS)); } } - if (count($value) == 0) { + if (\count($value) == 0) { throw new PhpSpreadsheetException('Invalid rule value for column AutoFilter Rule.'); } // Set the dateTime grouping that we've anticipated @@ -316,8 +316,8 @@ class Rule $operator = self::AUTOFILTER_COLUMN_RULE_EQUAL; } if ( - (!in_array($operator, self::OPERATORS)) && - (!in_array($operator, self::TOP_TEN_VALUE)) + (!\in_array($operator, self::OPERATORS)) && + (!\in_array($operator, self::TOP_TEN_VALUE)) ) { throw new PhpSpreadsheetException('Invalid operator for column AutoFilter Rule.'); } @@ -348,9 +348,9 @@ class Rule $this->setEvaluatedFalse(); if ( ($grouping !== null) && - (!in_array($grouping, self::DATE_TIME_GROUPS)) && - (!in_array($grouping, self::DYNAMIC_TYPES)) && - (!in_array($grouping, self::TOP_TEN_TYPE)) + (!\in_array($grouping, self::DATE_TIME_GROUPS)) && + (!\in_array($grouping, self::DYNAMIC_TYPES)) && + (!\in_array($grouping, self::TOP_TEN_TYPE)) ) { throw new PhpSpreadsheetException('Invalid grouping for column AutoFilter Rule.'); } @@ -411,9 +411,9 @@ class Rule */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { if ($key == 'parent') { // this is only object // Detach from autofilter column parent $this->$key = null; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/BaseDrawing.php b/PhpOffice/PhpSpreadsheet/Worksheet/BaseDrawing.php index 5001346..7c3d3ff 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/BaseDrawing.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/BaseDrawing.php @@ -331,7 +331,7 @@ class BaseDrawing implements IComparable // Resize proportional? if ($this->resizeProportional && $width != 0) { $ratio = $this->height / ($this->width != 0 ? $this->width : 1); - $this->height = (int) round($ratio * $width); + $this->height = (int) \round($ratio * $width); } // Set width @@ -350,7 +350,7 @@ class BaseDrawing implements IComparable // Resize proportional? if ($this->resizeProportional && $height != 0) { $ratio = $this->width / ($this->height != 0 ? $this->height : 1); - $this->width = (int) round($ratio * $height); + $this->width = (int) \round($ratio * $height); } // Set height @@ -376,10 +376,10 @@ class BaseDrawing implements IComparable $yratio = $height / ($this->height != 0 ? $this->height : 1); if ($this->resizeProportional && !($width == 0 || $height == 0)) { if (($xratio * $this->height) < $height) { - $this->height = (int) ceil($xratio * $this->height); + $this->height = (int) \ceil($xratio * $this->height); $this->width = $width; } else { - $this->width = (int) ceil($yratio * $this->width); + $this->width = (int) \ceil($yratio * $this->width); $this->height = $height; } } else { @@ -433,7 +433,7 @@ class BaseDrawing implements IComparable */ public function getHashCode() { - return md5( + return \md5( $this->name . $this->description . (($this->worksheet === null) ? '' : $this->worksheet->getHashCode()) . @@ -456,11 +456,11 @@ class BaseDrawing implements IComparable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { if ($key == 'worksheet') { $this->worksheet = null; - } elseif (is_object($value)) { + } elseif (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; @@ -484,7 +484,7 @@ class BaseDrawing implements IComparable protected function setSizesAndType(string $path): void { if ($this->imageWidth === 0 && $this->imageHeight === 0 && $this->type === IMAGETYPE_UNKNOWN) { - $imageData = getimagesize($path); + $imageData = \getimagesize($path); if (!empty($imageData)) { $this->imageWidth = $imageData[0]; @@ -530,6 +530,6 @@ class BaseDrawing implements IComparable public function validEditAs(): bool { - return in_array($this->editAs, self::VALID_EDIT_AS, true); + return \in_array($this->editAs, self::VALID_EDIT_AS, true); } } diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Drawing.php b/PhpOffice/PhpSpreadsheet/Worksheet/Drawing.php index 7d95753..28ae46c 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Drawing.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Drawing.php @@ -48,7 +48,7 @@ class Drawing extends BaseDrawing */ public function getFilename() { - return basename($this->path); + return \basename($this->path); } /** @@ -56,7 +56,7 @@ class Drawing extends BaseDrawing */ public function getIndexedFilename(): string { - return md5($this->path) . '.' . $this->getExtension(); + return \md5($this->path) . '.' . $this->getExtension(); } /** @@ -66,9 +66,9 @@ class Drawing extends BaseDrawing */ public function getExtension() { - $exploded = explode('.', basename($this->path)); + $exploded = \explode('.', \basename($this->path)); - return $exploded[count($exploded) - 1]; + return $exploded[\count($exploded) - 1]; } /** @@ -78,11 +78,11 @@ class Drawing extends BaseDrawing */ public function getMediaFilename() { - if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { + if (!\array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.'); } - return sprintf('image%d%s', $this->getImageIndex(), $this->getImageFileExtensionForSave()); + return \sprintf('image%d%s', $this->getImageIndex(), $this->getImageFileExtensionForSave()); } /** @@ -100,32 +100,32 @@ class Drawing extends BaseDrawing * * @param string $path File path * @param bool $verifyFile Verify file - * @param ZipArchive $zip Zip archive instance + * @param \ZipArchive $zip Zip archive instance * * @return $this */ public function setPath($path, $verifyFile = true, $zip = null) { - if ($verifyFile && preg_match('~^data:image/[a-z]+;base64,~', $path) !== 1) { + if ($verifyFile && \preg_match('~^data:image/[a-z]+;base64,~', $path) !== 1) { // Check if a URL has been passed. https://stackoverflow.com/a/2058596/1252979 - if (filter_var($path, FILTER_VALIDATE_URL)) { + if (\filter_var($path, FILTER_VALIDATE_URL)) { $this->path = $path; // Implicit that it is a URL, rather store info than running check above on value in other places. $this->isUrl = true; - $imageContents = file_get_contents($path); - $filePath = tempnam(sys_get_temp_dir(), 'Drawing'); + $imageContents = \file_get_contents($path); + $filePath = \tempnam(\sys_get_temp_dir(), 'Drawing'); if ($filePath) { - file_put_contents($filePath, $imageContents); - if (file_exists($filePath)) { + \file_put_contents($filePath, $imageContents); + if (\file_exists($filePath)) { $this->setSizesAndType($filePath); - unlink($filePath); + \unlink($filePath); } } - } elseif (file_exists($path)) { + } elseif (\file_exists($path)) { $this->path = $path; $this->setSizesAndType($path); - } elseif ($zip instanceof ZipArchive) { - $zipPath = explode('#', $path)[1]; + } elseif ($zip instanceof \ZipArchive) { + $zipPath = \explode('#', $path)[1]; if ($zip->locateName($zipPath) !== false) { $this->path = $path; $this->setSizesAndType($path); @@ -167,7 +167,7 @@ class Drawing extends BaseDrawing */ public function getHashCode() { - return md5( + return \md5( $this->path . parent::getHashCode() . __CLASS__ @@ -179,7 +179,7 @@ class Drawing extends BaseDrawing */ public function getImageTypeForSave(): int { - if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { + if (!\array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.'); } @@ -191,11 +191,11 @@ class Drawing extends BaseDrawing */ public function getImageFileExtensionForSave(bool $includeDot = true): string { - if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { + if (!\array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.'); } - $result = image_type_to_extension(self::IMAGE_TYPES_CONVERTION_MAP[$this->type], $includeDot); + $result = \image_type_to_extension(self::IMAGE_TYPES_CONVERTION_MAP[$this->type], $includeDot); return "$result"; } @@ -205,10 +205,10 @@ class Drawing extends BaseDrawing */ public function getImageMimeType(): string { - if (!array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { + if (!\array_key_exists($this->type, self::IMAGE_TYPES_CONVERTION_MAP)) { throw new PhpSpreadsheetException('Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.'); } - return image_type_to_mime_type(self::IMAGE_TYPES_CONVERTION_MAP[$this->type]); + return \image_type_to_mime_type(self::IMAGE_TYPES_CONVERTION_MAP[$this->type]); } } diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Drawing/Shadow.php b/PhpOffice/PhpSpreadsheet/Worksheet/Drawing/Shadow.php index a461a51..e8b1890 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Drawing/Shadow.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Drawing/Shadow.php @@ -258,7 +258,7 @@ class Shadow implements IComparable */ public function getHashCode() { - return md5( + return \md5( ($this->visible ? 't' : 'f') . $this->blurRadius . $this->distance . @@ -275,9 +275,9 @@ class Shadow implements IComparable */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooter.php b/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooter.php index c3504d8..c65ca38 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooter.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooter.php @@ -478,9 +478,9 @@ class HeaderFooter */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php b/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php index b42c732..ef40528 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php @@ -11,7 +11,7 @@ class HeaderFooterDrawing extends Drawing */ public function getHashCode() { - return md5( + return \md5( $this->getPath() . $this->name . $this->offsetX . diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/MemoryDrawing.php b/PhpOffice/PhpSpreadsheet/Worksheet/MemoryDrawing.php index c1c4160..f2939f3 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/MemoryDrawing.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/MemoryDrawing.php @@ -29,7 +29,7 @@ class MemoryDrawing extends BaseDrawing /** * Image resource. * - * @var null|GdImage|resource + * @var null|\GdImage|resource */ private $imageResource; @@ -65,7 +65,7 @@ class MemoryDrawing extends BaseDrawing // Initialise values $this->renderingFunction = self::RENDERING_DEFAULT; $this->mimeType = self::MIMETYPE_DEFAULT; - $this->uniqueName = md5(mt_rand(0, 9999) . time() . mt_rand(0, 9999)); + $this->uniqueName = \md5(\mt_rand(0, 9999) . \time() . \mt_rand(0, 9999)); $this->alwaysNull = null; // Initialize parent @@ -75,7 +75,7 @@ class MemoryDrawing extends BaseDrawing public function __destruct() { if ($this->imageResource) { - $rslt = @imagedestroy($this->imageResource); + $rslt = @\imagedestroy($this->imageResource); // "Fix" for Scrutinizer $this->imageResource = $rslt ? null : $this->alwaysNull; } @@ -93,43 +93,43 @@ class MemoryDrawing extends BaseDrawing return; } - $width = (int) imagesx($this->imageResource); - $height = (int) imagesy($this->imageResource); + $width = (int) \imagesx($this->imageResource); + $height = (int) \imagesy($this->imageResource); - if (imageistruecolor($this->imageResource)) { - $clone = imagecreatetruecolor($width, $height); + if (\imageistruecolor($this->imageResource)) { + $clone = \imagecreatetruecolor($width, $height); if (!$clone) { throw new Exception('Could not clone image resource'); } - imagealphablending($clone, false); - imagesavealpha($clone, true); + \imagealphablending($clone, false); + \imagesavealpha($clone, true); } else { - $clone = imagecreate($width, $height); + $clone = \imagecreate($width, $height); if (!$clone) { throw new Exception('Could not clone image resource'); } // If the image has transparency... - $transparent = imagecolortransparent($this->imageResource); + $transparent = \imagecolortransparent($this->imageResource); if ($transparent >= 0) { - $rgb = imagecolorsforindex($this->imageResource, $transparent); + $rgb = \imagecolorsforindex($this->imageResource, $transparent); if (empty($rgb)) { throw new Exception('Could not get image colors'); } - imagesavealpha($clone, true); - $color = imagecolorallocatealpha($clone, $rgb['red'], $rgb['green'], $rgb['blue'], $rgb['alpha']); + \imagesavealpha($clone, true); + $color = \imagecolorallocatealpha($clone, $rgb['red'], $rgb['green'], $rgb['blue'], $rgb['alpha']); if ($color === false) { throw new Exception('Could not get image alpha color'); } - imagefill($clone, 0, 0, $color); + \imagefill($clone, 0, 0, $color); } } //Create the Clone!! - imagecopy($clone, $this->imageResource, 0, 0, 0, 0, $width, $height); + \imagecopy($clone, $this->imageResource, 0, 0, 0, 0, $width, $height); $this->imageResource = $clone; } @@ -141,7 +141,7 @@ class MemoryDrawing extends BaseDrawing */ public static function fromStream($imageStream): self { - $streamValue = stream_get_contents($imageStream); + $streamValue = \stream_get_contents($imageStream); if ($streamValue === false) { throw new Exception('Unable to read data from stream'); } @@ -156,7 +156,7 @@ class MemoryDrawing extends BaseDrawing */ public static function fromString(string $imageString): self { - $gdImage = @imagecreatefromstring($imageString); + $gdImage = @\imagecreatefromstring($imageString); if ($gdImage === false) { throw new Exception('Value cannot be converted to an image'); } @@ -192,32 +192,32 @@ class MemoryDrawing extends BaseDrawing private static function identifyMimeType(string $imageString): string { $temporaryFileName = File::temporaryFilename(); - file_put_contents($temporaryFileName, $imageString); + \file_put_contents($temporaryFileName, $imageString); $mimeType = self::identifyMimeTypeUsingExif($temporaryFileName); if ($mimeType !== null) { - unlink($temporaryFileName); + \unlink($temporaryFileName); return $mimeType; } $mimeType = self::identifyMimeTypeUsingGd($temporaryFileName); if ($mimeType !== null) { - unlink($temporaryFileName); + \unlink($temporaryFileName); return $mimeType; } - unlink($temporaryFileName); + \unlink($temporaryFileName); return self::MIMETYPE_DEFAULT; } private static function identifyMimeTypeUsingExif(string $temporaryFileName): ?string { - if (function_exists('exif_imagetype')) { - $imageType = @exif_imagetype($temporaryFileName); - $mimeType = ($imageType) ? image_type_to_mime_type($imageType) : null; + if (\function_exists('exif_imagetype')) { + $imageType = @\exif_imagetype($temporaryFileName); + $mimeType = ($imageType) ? \image_type_to_mime_type($imageType) : null; return self::supportedMimeTypes($mimeType); } @@ -227,9 +227,9 @@ class MemoryDrawing extends BaseDrawing private static function identifyMimeTypeUsingGd(string $temporaryFileName): ?string { - if (function_exists('getimagesize')) { - $imageSize = @getimagesize($temporaryFileName); - if (is_array($imageSize)) { + if (\function_exists('getimagesize')) { + $imageSize = @\getimagesize($temporaryFileName); + if (\is_array($imageSize)) { $mimeType = $imageSize['mime'] ?? null; return self::supportedMimeTypes($mimeType); @@ -241,7 +241,7 @@ class MemoryDrawing extends BaseDrawing private static function supportedMimeTypes(?string $mimeType = null): ?string { - if (in_array($mimeType, self::SUPPORTED_MIME_TYPES, true)) { + if (\in_array($mimeType, self::SUPPORTED_MIME_TYPES, true)) { return $mimeType; } @@ -251,7 +251,7 @@ class MemoryDrawing extends BaseDrawing /** * Get image resource. * - * @return null|GdImage|resource + * @return null|\GdImage|resource */ public function getImageResource() { @@ -261,7 +261,7 @@ class MemoryDrawing extends BaseDrawing /** * Set image resource. * - * @param GdImage|resource $value + * @param \GdImage|resource $value * * @return $this */ @@ -271,8 +271,8 @@ class MemoryDrawing extends BaseDrawing if ($this->imageResource !== null) { // Get width/height - $this->width = (int) imagesx($this->imageResource); - $this->height = (int) imagesy($this->imageResource); + $this->width = (int) \imagesx($this->imageResource); + $this->height = (int) \imagesy($this->imageResource); } return $this; @@ -331,8 +331,8 @@ class MemoryDrawing extends BaseDrawing */ public function getIndexedFilename(): string { - $extension = strtolower($this->getMimeType()); - $extension = explode('/', $extension); + $extension = \strtolower($this->getMimeType()); + $extension = \explode('/', $extension); $extension = $extension[1]; return $this->uniqueName . $this->getImageIndex() . '.' . $extension; @@ -345,7 +345,7 @@ class MemoryDrawing extends BaseDrawing */ public function getHashCode() { - return md5( + return \md5( $this->renderingFunction . $this->mimeType . $this->uniqueName . diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/PageMargins.php b/PhpOffice/PhpSpreadsheet/Worksheet/PageMargins.php index 34e1145..e43edf9 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/PageMargins.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/PageMargins.php @@ -202,9 +202,9 @@ class PageMargins */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/PageSetup.php b/PhpOffice/PhpSpreadsheet/Worksheet/PageSetup.php index 93030db..93b6d0c 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/PageSetup.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/PageSetup.php @@ -630,7 +630,7 @@ class PageSetup * Get print area. * * @param int $index Identifier for a specific print area range if several ranges have been set - * Default behaviour, or a index value of 0, will return all ranges as a comma-separated string + * Default behavior, or a index value of 0, will return all ranges as a comma-separated string * Otherwise, the specific range identified by the value of $index will be returned * Print areas are numbered from 1 * @@ -641,7 +641,7 @@ class PageSetup if ($index == 0) { return $this->printArea; } - $printAreas = explode(',', (string) $this->printArea); + $printAreas = \explode(',', (string) $this->printArea); if (isset($printAreas[$index - 1])) { return $printAreas[$index - 1]; } @@ -653,7 +653,7 @@ class PageSetup * Is print area set? * * @param int $index Identifier for a specific print area range if several ranges have been set - * Default behaviour, or an index value of 0, will identify whether any print range is set + * Default behavior, or an index value of 0, will identify whether any print range is set * Otherwise, existence of the range identified by the value of $index will be returned * Print areas are numbered from 1 * @@ -664,7 +664,7 @@ class PageSetup if ($index == 0) { return $this->printArea !== null; } - $printAreas = explode(',', (string) $this->printArea); + $printAreas = \explode(',', (string) $this->printArea); return isset($printAreas[$index - 1]); } @@ -673,7 +673,7 @@ class PageSetup * Clear a print area. * * @param int $index Identifier for a specific print area range if several ranges have been set - * Default behaviour, or an index value of 0, will clear all print ranges that are set + * Default behavior, or an index value of 0, will clear all print ranges that are set * Otherwise, the range identified by the value of $index will be removed from the series * Print areas are numbered from 1 * @@ -684,10 +684,10 @@ class PageSetup if ($index == 0) { $this->printArea = null; } else { - $printAreas = explode(',', (string) $this->printArea); + $printAreas = \explode(',', (string) $this->printArea); if (isset($printAreas[$index - 1])) { unset($printAreas[$index - 1]); - $this->printArea = implode(',', $printAreas); + $this->printArea = \implode(',', $printAreas); } } @@ -709,21 +709,21 @@ class PageSetup * list. * Print areas are numbered from 1 * @param string $method Determines the method used when setting multiple print areas - * Default behaviour, or the "O" method, overwrites existing print area + * Default behavior, or the "O" method, overwrites existing print area * The "I" method, inserts the new print area before any specified index, or at the end of the list * * @return $this */ public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) { - if (strpos($value, '!') !== false) { + if (\strpos($value, '!') !== false) { throw new PhpSpreadsheetException('Cell coordinate must not specify a worksheet.'); - } elseif (strpos($value, ':') === false) { + } elseif (\strpos($value, ':') === false) { throw new PhpSpreadsheetException('Cell coordinate must be a range of cells.'); - } elseif (strpos($value, '$') !== false) { + } elseif (\strpos($value, '$') !== false) { throw new PhpSpreadsheetException('Cell coordinate must not be absolute.'); } - $value = strtoupper($value); + $value = \strtoupper($value); if (!$this->printArea) { $index = 0; } @@ -732,29 +732,29 @@ class PageSetup if ($index == 0) { $this->printArea = $value; } else { - $printAreas = explode(',', (string) $this->printArea); + $printAreas = \explode(',', (string) $this->printArea); if ($index < 0) { - $index = count($printAreas) - abs($index) + 1; + $index = \count($printAreas) - \abs($index) + 1; } - if (($index <= 0) || ($index > count($printAreas))) { + if (($index <= 0) || ($index > \count($printAreas))) { throw new PhpSpreadsheetException('Invalid index for setting print range.'); } $printAreas[$index - 1] = $value; - $this->printArea = implode(',', $printAreas); + $this->printArea = \implode(',', $printAreas); } } elseif ($method == self::SETPRINTRANGE_INSERT) { if ($index == 0) { $this->printArea = $this->printArea ? ($this->printArea . ',' . $value) : $value; } else { - $printAreas = explode(',', (string) $this->printArea); + $printAreas = \explode(',', (string) $this->printArea); if ($index < 0) { - $index = (int) abs($index) - 1; + $index = (int) \abs($index) - 1; } - if ($index > count($printAreas)) { + if ($index > \count($printAreas)) { throw new PhpSpreadsheetException('Invalid index for setting print range.'); } - $printAreas = array_merge(array_slice($printAreas, 0, $index), [$value], array_slice($printAreas, $index)); - $this->printArea = implode(',', $printAreas); + $printAreas = \array_merge(\array_slice($printAreas, 0, $index), [$value], \array_slice($printAreas, $index)); + $this->printArea = \implode(',', $printAreas); } } else { throw new PhpSpreadsheetException('Invalid method for setting print range.'); @@ -799,7 +799,7 @@ class PageSetup * list. * Print areas are numbered from 1 * @param string $method Determines the method used when setting multiple print areas - * Default behaviour, or the "O" method, overwrites existing print area + * Default behavior, or the "O" method, overwrites existing print area * The "I" method, inserts the new print area before any specified index, or at the end of the list * * @return $this @@ -891,9 +891,9 @@ class PageSetup */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Protection.php b/PhpOffice/PhpSpreadsheet/Worksheet/Protection.php index 063a5cc..8c6cac6 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Protection.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Protection.php @@ -422,7 +422,7 @@ class Protection */ private function generateSalt(): string { - return base64_encode(random_bytes(16)); + return \base64_encode(\random_bytes(16)); } /** @@ -505,9 +505,9 @@ class Protection */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/SheetView.php b/PhpOffice/PhpSpreadsheet/Worksheet/SheetView.php index 13464c9..8dba4c4 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/SheetView.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/SheetView.php @@ -38,7 +38,7 @@ class SheetView /** * ShowZeros. * - * If true, "null" values from a calculation will be shown as "0". This is the default Excel behaviour and can be changed + * If true, "null" values from a calculation will be shown as "0". This is the default Excel behavior and can be changed * with the advanced worksheet option "Show a zero in cells that have zero value" * * @var bool @@ -167,7 +167,7 @@ class SheetView if ($sheetViewType === null) { $sheetViewType = self::SHEETVIEW_NORMAL; } - if (in_array($sheetViewType, self::SHEET_VIEW_TYPES)) { + if (\in_array($sheetViewType, self::SHEET_VIEW_TYPES)) { $this->sheetviewType = $sheetViewType; } else { throw new PhpSpreadsheetException('Invalid sheetview layout type.'); @@ -181,9 +181,9 @@ class SheetView */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Table.php b/PhpOffice/PhpSpreadsheet/Worksheet/Table.php index 4c25259..b13cee8 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Table.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Table.php @@ -107,10 +107,10 @@ class Table */ public function setName(string $name): self { - $name = trim($name); + $name = \trim($name); if (!empty($name)) { - if (strlen($name) === 1 && in_array($name, ['C', 'c', 'R', 'r'])) { + if (\strlen($name) === 1 && \in_array($name, ['C', 'c', 'R', 'r'])) { throw new PhpSpreadsheetException('The table name is invalid'); } if (StringHelper::countCharacters($name) > 255) { @@ -118,15 +118,15 @@ class Table } // Check for A1 or R1C1 cell reference notation if ( - preg_match(Coordinate::A1_COORDINATE_REGEX, $name) || - preg_match('/^R\[?\-?[0-9]*\]?C\[?\-?[0-9]*\]?$/i', $name) + \preg_match(Coordinate::A1_COORDINATE_REGEX, $name) || + \preg_match('/^R\[?\-?[0-9]*\]?C\[?\-?[0-9]*\]?$/i', $name) ) { throw new PhpSpreadsheetException('The table name can\'t be the same as a cell reference'); } - if (!preg_match('/^[\p{L}_\\\\]/iu', $name)) { + if (!\preg_match('/^[\p{L}_\\\\]/iu', $name)) { throw new PhpSpreadsheetException('The table name must begin a name with a letter, an underscore character (_), or a backslash (\)'); } - if (!preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) { + if (!\preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) { throw new PhpSpreadsheetException('The table name contains invalid characters'); } @@ -180,14 +180,14 @@ class Table private function updateStructuredReferencesInCells(Worksheet $worksheet, string $newName): void { - $pattern = '/' . preg_quote($this->name) . '\[/mui'; + $pattern = '/' . \preg_quote($this->name) . '\[/mui'; foreach ($worksheet->getCoordinates(false) as $coordinate) { $cell = $worksheet->getCell($coordinate); if ($cell->getDataType() === DataType::TYPE_FORMULA) { $formula = $cell->getValue(); - if (preg_match($pattern, $formula) === 1) { - $formula = preg_replace($pattern, "{$newName}[", $formula); + if (\preg_match($pattern, $formula) === 1) { + $formula = \preg_replace($pattern, "{$newName}[", $formula); $cell->setValueExplicit($formula, DataType::TYPE_FORMULA); } } @@ -196,12 +196,12 @@ class Table private function updateStructuredReferencesInNamedFormulae(Spreadsheet $spreadsheet, string $newName): void { - $pattern = '/' . preg_quote($this->name) . '\[/mui'; + $pattern = '/' . \preg_quote($this->name) . '\[/mui'; foreach ($spreadsheet->getNamedFormulae() as $namedFormula) { $formula = $namedFormula->getValue(); - if (preg_match($pattern, $formula) === 1) { - $formula = preg_replace($pattern, "{$newName}[", $formula); + if (\preg_match($pattern, $formula) === 1) { + $formula = \preg_replace($pattern, "{$newName}[", $formula); $namedFormula->setValue($formula); // @phpstan-ignore-line } } @@ -293,7 +293,7 @@ class Table return $this; } - if (strpos($range, ':') === false) { + if (\strpos($range, ':') === false) { throw new PhpSpreadsheetException('Table must be set on a range of cells.'); } @@ -324,7 +324,7 @@ class Table { if ($this->workSheet !== null) { $thisrange = $this->range; - $range = (string) preg_replace('/\\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); + $range = (string) \preg_replace('/\\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); if ($range !== $thisrange) { $this->setRange($range); } @@ -446,22 +446,22 @@ class Table */ public function setColumn($columnObjectOrString): self { - if ((is_string($columnObjectOrString)) && (!empty($columnObjectOrString))) { + if ((\is_string($columnObjectOrString)) && (!empty($columnObjectOrString))) { $column = $columnObjectOrString; - } elseif (is_object($columnObjectOrString) && ($columnObjectOrString instanceof Table\Column)) { + } elseif (\is_object($columnObjectOrString) && ($columnObjectOrString instanceof Table\Column)) { $column = $columnObjectOrString->getColumnIndex(); } else { throw new PhpSpreadsheetException('Column is not within the table range.'); } $this->isColumnInRange($column); - if (is_string($columnObjectOrString)) { + if (\is_string($columnObjectOrString)) { $this->columns[$columnObjectOrString] = new Table\Column($columnObjectOrString, $this); } else { $columnObjectOrString->setTable($this); $this->columns[$column] = $columnObjectOrString; } - ksort($this->columns); + \ksort($this->columns); return $this; } @@ -494,8 +494,8 @@ class Table */ public function shiftColumn($fromColumn, $toColumn): self { - $fromColumn = strtoupper($fromColumn); - $toColumn = strtoupper($toColumn); + $fromColumn = \strtoupper($fromColumn); + $toColumn = \strtoupper($toColumn); if (($fromColumn !== null) && (isset($this->columns[$fromColumn])) && ($toColumn !== null)) { $this->columns[$fromColumn]->setTable(); @@ -504,7 +504,7 @@ class Table $this->columns[$toColumn]->setTable($this); unset($this->columns[$fromColumn]); - ksort($this->columns); + \ksort($this->columns); } return $this; @@ -551,16 +551,16 @@ class Table */ public function __clone() { - $vars = get_object_vars($this); + $vars = \get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if (\is_object($value)) { if ($key === 'workSheet') { // Detach from worksheet $this->{$key} = null; } else { $this->{$key} = clone $value; } - } elseif ((is_array($value)) && ($key === 'columns')) { + } elseif ((\is_array($value)) && ($key === 'columns')) { // The columns array of \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\Table objects $this->{$key} = []; foreach ($value as $k => $v) { diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Table/Column.php b/PhpOffice/PhpSpreadsheet/Worksheet/Table/Column.php index 9fe19ec..a2c70b4 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Table/Column.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Table/Column.php @@ -87,7 +87,7 @@ class Column public function setColumnIndex($column): self { // Uppercase coordinate - $column = strtoupper($column); + $column = \strtoupper($column); if ($this->table !== null) { $this->table->isColumnInRange($column); } @@ -225,14 +225,14 @@ class Column private static function updateStructuredReferencesInCells(Worksheet $worksheet, string $oldTitle, string $newTitle): void { - $pattern = '/\[(@?)' . preg_quote($oldTitle) . '\]/mui'; + $pattern = '/\[(@?)' . \preg_quote($oldTitle) . '\]/mui'; foreach ($worksheet->getCoordinates(false) as $coordinate) { $cell = $worksheet->getCell($coordinate); if ($cell->getDataType() === DataType::TYPE_FORMULA) { $formula = $cell->getValue(); - if (preg_match($pattern, $formula) === 1) { - $formula = preg_replace($pattern, "[$1{$newTitle}]", $formula); + if (\preg_match($pattern, $formula) === 1) { + $formula = \preg_replace($pattern, "[$1{$newTitle}]", $formula); $cell->setValueExplicit($formula, DataType::TYPE_FORMULA); } } @@ -241,12 +241,12 @@ class Column private static function updateStructuredReferencesInNamedFormulae(Spreadsheet $spreadsheet, string $oldTitle, string $newTitle): void { - $pattern = '/\[(@?)' . preg_quote($oldTitle) . '\]/mui'; + $pattern = '/\[(@?)' . \preg_quote($oldTitle) . '\]/mui'; foreach ($spreadsheet->getNamedFormulae() as $namedFormula) { $formula = $namedFormula->getValue(); - if (preg_match($pattern, $formula) === 1) { - $formula = preg_replace($pattern, "[$1{$newTitle}]", $formula); + if (\preg_match($pattern, $formula) === 1) { + $formula = \preg_replace($pattern, "[$1{$newTitle}]", $formula); $namedFormula->setValue($formula); // @phpstan-ignore-line } } diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Validations.php b/PhpOffice/PhpSpreadsheet/Worksheet/Validations.php index 5e5cdf7..2c3e3ae 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Validations.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Validations.php @@ -17,16 +17,16 @@ class Validations */ public static function validateCellAddress($cellAddress): string { - if (is_string($cellAddress)) { + if (\is_string($cellAddress)) { [$worksheet, $address] = Worksheet::extractSheetTitle($cellAddress, true); // if (!empty($worksheet) && $worksheet !== $this->getTitle()) { // throw new Exception('Reference is not for this worksheet'); // } - return empty($worksheet) ? strtoupper("$address") : $worksheet . '!' . strtoupper("$address"); + return empty($worksheet) ? \strtoupper("$address") : $worksheet . '!' . \strtoupper("$address"); } - if (is_array($cellAddress)) { + if (\is_array($cellAddress)) { $cellAddress = CellAddress::fromColumnRowArray($cellAddress); } @@ -42,11 +42,11 @@ class Validations */ public static function validateCellOrCellRange($cellRange): string { - if (is_string($cellRange) || is_numeric($cellRange)) { + if (\is_string($cellRange) || \is_numeric($cellRange)) { // Convert a single column reference like 'A' to 'A:A', // a single row reference like '1' to '1:1' - $cellRange = (string) preg_replace('/^([A-Z]+|\d+)$/', '${1}:${1}', (string) $cellRange); - } elseif (is_object($cellRange) && $cellRange instanceof CellAddress) { + $cellRange = (string) \preg_replace('/^([A-Z]+|\d+)$/', '${1}:${1}', (string) $cellRange); + } elseif (\is_object($cellRange) && $cellRange instanceof CellAddress) { $cellRange = new CellRange($cellRange, $cellRange); } @@ -62,22 +62,22 @@ class Validations */ public static function validateCellRange($cellRange): string { - if (is_string($cellRange)) { + if (\is_string($cellRange)) { [$worksheet, $addressRange] = Worksheet::extractSheetTitle($cellRange, true); // Convert Column ranges like 'A:C' to 'A1:C1048576' // or Row ranges like '1:3' to 'A1:XFD3' - $addressRange = (string) preg_replace( + $addressRange = (string) \preg_replace( ['/^([A-Z]+):([A-Z]+)$/i', '/^(\\d+):(\\d+)$/'], ['${1}1:${2}1048576', 'A${1}:XFD${2}'], $addressRange ); - return empty($worksheet) ? strtoupper($addressRange) : $worksheet . '!' . strtoupper($addressRange); + return empty($worksheet) ? \strtoupper($addressRange) : $worksheet . '!' . \strtoupper($addressRange); } - if (is_array($cellRange)) { - switch (count($cellRange)) { + if (\is_array($cellRange)) { + switch (\count($cellRange)) { case 2: $from = [$cellRange[0], $cellRange[1]]; $to = [$cellRange[0], $cellRange[1]]; @@ -100,13 +100,13 @@ class Validations public static function definedNameToCoordinate(string $coordinate, Worksheet $worksheet): string { // Uppercase coordinate - $coordinate = strtoupper($coordinate); + $coordinate = \strtoupper($coordinate); // Eliminate leading equal sign - $testCoordinate = (string) preg_replace('/^=/', '', $coordinate); + $testCoordinate = (string) \preg_replace('/^=/', '', $coordinate); $defined = $worksheet->getParent()->getDefinedName($testCoordinate, $worksheet); if ($defined !== null) { if ($defined->getWorksheet() === $worksheet && !$defined->isFormula()) { - $coordinate = (string) preg_replace('/^=/', '', $defined->getValue()); + $coordinate = (string) \preg_replace('/^=/', '', $defined->getValue()); } } diff --git a/PhpOffice/PhpSpreadsheet/Worksheet/Worksheet.php b/PhpOffice/PhpSpreadsheet/Worksheet/Worksheet.php index d71bc38..fc72077 100755 --- a/PhpOffice/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/PhpOffice/PhpSpreadsheet/Worksheet/Worksheet.php @@ -106,21 +106,21 @@ class Worksheet implements IComparable /** * Collection of drawings. * - * @var ArrayObject + * @var \ArrayObject */ private $drawingCollection; /** * Collection of Chart objects. * - * @var ArrayObject + * @var \ArrayObject */ private $chartCollection; /** * Collection of Table objects. * - * @var ArrayObject + * @var \ArrayObject */ private $tableCollection; @@ -372,9 +372,9 @@ class Worksheet implements IComparable // Set sheet view $this->sheetView = new SheetView(); // Drawing collection - $this->drawingCollection = new ArrayObject(); + $this->drawingCollection = new \ArrayObject(); // Chart collection - $this->chartCollection = new ArrayObject(); + $this->chartCollection = new \ArrayObject(); // Protection $this->protection = new Protection(); // Default row dimension @@ -384,7 +384,7 @@ class Worksheet implements IComparable // AutoFilter $this->autoFilter = new AutoFilter('', $this); // Table collection - $this->tableCollection = new ArrayObject(); + $this->tableCollection = new \ArrayObject(); } /** @@ -449,7 +449,7 @@ class Worksheet implements IComparable } // Some of the printable ASCII characters are invalid: * : / \ ? [ ] and first and last characters cannot be a "'" if ( - (str_replace(self::$invalidCharacters, '', $sheetCodeName) !== $sheetCodeName) || + (\str_replace(self::$invalidCharacters, '', $sheetCodeName) !== $sheetCodeName) || (Shared\StringHelper::substring($sheetCodeName, -1, 1) == '\'') || (Shared\StringHelper::substring($sheetCodeName, 0, 1) == '\'') ) { @@ -474,7 +474,7 @@ class Worksheet implements IComparable private static function checkSheetTitle($sheetTitle) { // Some of the printable ASCII characters are invalid: * : / \ ? [ ] - if (str_replace(self::$invalidCharacters, '', $sheetTitle) !== $sheetTitle) { + if (\str_replace(self::$invalidCharacters, '', $sheetTitle) !== $sheetTitle) { throw new Exception('Invalid character found in sheet title'); } @@ -549,7 +549,7 @@ class Worksheet implements IComparable /** * Get collection of drawings. * - * @return ArrayObject + * @return \ArrayObject */ public function getDrawingCollection() { @@ -559,7 +559,7 @@ class Worksheet implements IComparable /** * Get collection of charts. * - * @return ArrayObject + * @return \ArrayObject */ public function getChartCollection() { @@ -581,7 +581,7 @@ class Worksheet implements IComparable } else { // Insert the chart at the requested index // @phpstan-ignore-next-line - array_splice(/** @scrutinizer ignore-type */ $this->chartCollection, $chartIndex, 0, [$chart]); + \array_splice(/** @scrutinizer ignore-type */ $this->chartCollection, $chartIndex, 0, [$chart]); } return $chart; @@ -594,7 +594,7 @@ class Worksheet implements IComparable */ public function getChartCount() { - return count($this->chartCollection); + return \count($this->chartCollection); } /** @@ -606,7 +606,7 @@ class Worksheet implements IComparable */ public function getChartByIndex($index) { - $chartCount = count($this->chartCollection); + $chartCount = \count($this->chartCollection); if ($chartCount == 0) { return false; } @@ -644,7 +644,7 @@ class Worksheet implements IComparable */ public function getChartByName($chartName) { - $chartCount = count($this->chartCollection); + $chartCount = \count($this->chartCollection); if ($chartCount == 0) { return false; } @@ -787,7 +787,7 @@ class Worksheet implements IComparable ); if ($cellValue !== null && $cellValue !== '') { - $autoSizes[$this->cellCollection->getCurrentColumn()] = max( + $autoSizes[$this->cellCollection->getCurrentColumn()] = \max( (float) $autoSizes[$this->cellCollection->getCurrentColumn()], (float) Shared\Font::calculateColumnWidth( $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(), @@ -1271,18 +1271,18 @@ class Worksheet implements IComparable $finalCoordinate = null; // Worksheet reference? - if (strpos($coordinate, '!') !== false) { + if (\strpos($coordinate, '!') !== false) { $worksheetReference = self::extractSheetTitle($coordinate, true); $sheet = $this->parent->getSheetByName($worksheetReference[0]); - $finalCoordinate = strtoupper($worksheetReference[1]); + $finalCoordinate = \strtoupper($worksheetReference[1]); if ($sheet === null) { throw new Exception('Sheet not found for name: ' . $worksheetReference[0]); } } elseif ( - !preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $coordinate) && - preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/iu', $coordinate) + !\preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $coordinate) && + \preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/iu', $coordinate) ) { // Named range? $namedRange = $this->validateNamedRange($coordinate, true); @@ -1293,19 +1293,19 @@ class Worksheet implements IComparable } /** @phpstan-ignore-next-line */ - $cellCoordinate = ltrim(substr($namedRange->getValue(), strrpos($namedRange->getValue(), '!')), '!'); - $finalCoordinate = str_replace('$', '', $cellCoordinate); + $cellCoordinate = \ltrim(\substr($namedRange->getValue(), \strrpos($namedRange->getValue(), '!')), '!'); + $finalCoordinate = \str_replace('$', '', $cellCoordinate); } } if ($sheet === null || $finalCoordinate === null) { $sheet = $this; - $finalCoordinate = strtoupper($coordinate); + $finalCoordinate = \strtoupper($coordinate); } if (Coordinate::coordinateIsRange($finalCoordinate)) { throw new Exception('Cell coordinate string can not be a range of cells.'); - } elseif (strpos($finalCoordinate, '$') !== false) { + } elseif (\strpos($finalCoordinate, '$') !== false) { throw new Exception('Cell coordinate must not be absolute.'); } @@ -1442,7 +1442,7 @@ class Worksheet implements IComparable if (!isset($this->rowDimensions[$row])) { $this->rowDimensions[$row] = new RowDimension($row); - $this->cachedHighestRow = max($this->cachedHighestRow, $row); + $this->cachedHighestRow = \max($this->cachedHighestRow, $row); } return $this->rowDimensions[$row]; @@ -1461,7 +1461,7 @@ class Worksheet implements IComparable public function getColumnDimension(string $column): ColumnDimension { // Uppercase coordinate - $column = strtoupper($column); + $column = \strtoupper($column); // Fetch dimensions if (!isset($this->columnDimensions[$column])) { @@ -1560,13 +1560,13 @@ class Worksheet implements IComparable */ public function getConditionalStyles(string $coordinate): array { - $coordinate = strtoupper($coordinate); - if (strpos($coordinate, ':') !== false) { + $coordinate = \strtoupper($coordinate); + if (\strpos($coordinate, ':') !== false) { return $this->conditionalStylesCollection[$coordinate] ?? []; } $cell = $this->getCell($coordinate); - foreach (array_keys($this->conditionalStylesCollection) as $conditionalRange) { + foreach (\array_keys($this->conditionalStylesCollection) as $conditionalRange) { if ($cell->isInRange($conditionalRange)) { return $this->conditionalStylesCollection[$conditionalRange]; } @@ -1577,9 +1577,9 @@ class Worksheet implements IComparable public function getConditionalRange(string $coordinate): ?string { - $coordinate = strtoupper($coordinate); + $coordinate = \strtoupper($coordinate); $cell = $this->getCell($coordinate); - foreach (array_keys($this->conditionalStylesCollection) as $conditionalRange) { + foreach (\array_keys($this->conditionalStylesCollection) as $conditionalRange) { if ($cell->isInRange($conditionalRange)) { return $conditionalRange; } @@ -1599,13 +1599,13 @@ class Worksheet implements IComparable */ public function conditionalStylesExists($coordinate): bool { - $coordinate = strtoupper($coordinate); - if (strpos($coordinate, ':') !== false) { + $coordinate = \strtoupper($coordinate); + if (\strpos($coordinate, ':') !== false) { return isset($this->conditionalStylesCollection[$coordinate]); } $cell = $this->getCell($coordinate); - foreach (array_keys($this->conditionalStylesCollection) as $conditionalRange) { + foreach (\array_keys($this->conditionalStylesCollection) as $conditionalRange) { if ($cell->isInRange($conditionalRange)) { return true; } @@ -1623,7 +1623,7 @@ class Worksheet implements IComparable */ public function removeConditionalStyles($coordinate) { - unset($this->conditionalStylesCollection[strtoupper($coordinate)]); + unset($this->conditionalStylesCollection[\strtoupper($coordinate)]); return $this; } @@ -1648,7 +1648,7 @@ class Worksheet implements IComparable */ public function setConditionalStyles($coordinate, $styles) { - $this->conditionalStylesCollection[strtoupper($coordinate)] = $styles; + $this->conditionalStylesCollection[\strtoupper($coordinate)] = $styles; return $this; } @@ -1793,7 +1793,7 @@ class Worksheet implements IComparable * @param AddressRange|array|string $range A simple string containing a Cell range like 'A1:E10' * or passing in an array of [$fromColumnIndex, $fromRow, $toColumnIndex, $toRow] (e.g. [3, 5, 6, 8]), * or an AddressRange. - * @param string $behaviour How the merged cells should behave. + * @param string $behavior How the merged cells should behave. * Possible values are: * MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells * MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells @@ -1801,15 +1801,15 @@ class Worksheet implements IComparable * * @return $this */ - public function mergeCells($range, $behaviour = self::MERGE_CELL_CONTENT_EMPTY) + public function mergeCells($range, $behavior = self::MERGE_CELL_CONTENT_EMPTY) { $range = Functions::trimSheetFromCellReference(Validations::validateCellRange($range)); - if (strpos($range, ':') === false) { + if (\strpos($range, ':') === false) { $range .= ":{$range}"; } - if (preg_match('/^([A-Z]+)(\\d+):([A-Z]+)(\\d+)$/', $range, $matches) !== 1) { + if (\preg_match('/^([A-Z]+)(\\d+):([A-Z]+)(\\d+)$/', $range, $matches) !== 1) { throw new Exception('Merge must be on a valid range of cells.'); } @@ -1833,21 +1833,21 @@ class Worksheet implements IComparable $this->getCell($upperLeft)->setValueExplicit(null, DataType::TYPE_NULL); } - if ($behaviour !== self::MERGE_CELL_CONTENT_HIDE) { + if ($behavior !== self::MERGE_CELL_CONTENT_HIDE) { // Blank out the rest of the cells in the range (if they exist) if ($numberRows > $numberColumns) { - $this->clearMergeCellsByColumn($firstColumn, $lastColumn, $firstRow, $lastRow, $upperLeft, $behaviour); + $this->clearMergeCellsByColumn($firstColumn, $lastColumn, $firstRow, $lastRow, $upperLeft, $behavior); } else { - $this->clearMergeCellsByRow($firstColumn, $lastColumnIndex, $firstRow, $lastRow, $upperLeft, $behaviour); + $this->clearMergeCellsByRow($firstColumn, $lastColumnIndex, $firstRow, $lastRow, $upperLeft, $behavior); } } return $this; } - private function clearMergeCellsByColumn(string $firstColumn, string $lastColumn, int $firstRow, int $lastRow, string $upperLeft, string $behaviour): void + private function clearMergeCellsByColumn(string $firstColumn, string $lastColumn, int $firstRow, int $lastRow, string $upperLeft, string $behavior): void { - $leftCellValue = ($behaviour === self::MERGE_CELL_CONTENT_MERGE) + $leftCellValue = ($behavior === self::MERGE_CELL_CONTENT_MERGE) ? [$this->getCell($upperLeft)->getFormattedValue()] : []; @@ -1860,19 +1860,19 @@ class Worksheet implements IComparable if ($row > $lastRow) { break; } - $leftCellValue = $this->mergeCellBehaviour($cell, $upperLeft, $behaviour, $leftCellValue); + $leftCellValue = $this->mergeCellBehaviour($cell, $upperLeft, $behavior, $leftCellValue); } } } - if ($behaviour === self::MERGE_CELL_CONTENT_MERGE) { - $this->getCell($upperLeft)->setValueExplicit(implode(' ', $leftCellValue), DataType::TYPE_STRING); + if ($behavior === self::MERGE_CELL_CONTENT_MERGE) { + $this->getCell($upperLeft)->setValueExplicit(\implode(' ', $leftCellValue), DataType::TYPE_STRING); } } - private function clearMergeCellsByRow(string $firstColumn, int $lastColumnIndex, int $firstRow, int $lastRow, string $upperLeft, string $behaviour): void + private function clearMergeCellsByRow(string $firstColumn, int $lastColumnIndex, int $firstRow, int $lastRow, string $upperLeft, string $behavior): void { - $leftCellValue = ($behaviour === self::MERGE_CELL_CONTENT_MERGE) + $leftCellValue = ($behavior === self::MERGE_CELL_CONTENT_MERGE) ? [$this->getCell($upperLeft)->getFormattedValue()] : []; @@ -1886,21 +1886,21 @@ class Worksheet implements IComparable if ($columnIndex > $lastColumnIndex) { break; } - $leftCellValue = $this->mergeCellBehaviour($cell, $upperLeft, $behaviour, $leftCellValue); + $leftCellValue = $this->mergeCellBehaviour($cell, $upperLeft, $behavior, $leftCellValue); } } } - if ($behaviour === self::MERGE_CELL_CONTENT_MERGE) { - $this->getCell($upperLeft)->setValueExplicit(implode(' ', $leftCellValue), DataType::TYPE_STRING); + if ($behavior === self::MERGE_CELL_CONTENT_MERGE) { + $this->getCell($upperLeft)->setValueExplicit(\implode(' ', $leftCellValue), DataType::TYPE_STRING); } } - public function mergeCellBehaviour(Cell $cell, string $upperLeft, string $behaviour, array $leftCellValue): array + public function mergeCellBehaviour(Cell $cell, string $upperLeft, string $behavior, array $leftCellValue): array { if ($cell->getCoordinate() !== $upperLeft) { Calculation::getInstance($cell->getWorksheet()->getParent())->flushInstance(); - if ($behaviour === self::MERGE_CELL_CONTENT_MERGE) { + if ($behavior === self::MERGE_CELL_CONTENT_MERGE) { $cellValue = $cell->getFormattedValue(); if ($cellValue !== '') { $leftCellValue[] = $cellValue; @@ -1925,7 +1925,7 @@ class Worksheet implements IComparable * @param int $row1 Numeric row coordinate of the first cell * @param int $columnIndex2 Numeric column coordinate of the last cell * @param int $row2 Numeric row coordinate of the last cell - * @param string $behaviour How the merged cells should behave. + * @param string $behavior How the merged cells should behave. * Possible values are: * MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells * MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells @@ -1933,14 +1933,14 @@ class Worksheet implements IComparable * * @return $this */ - public function mergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2, $behaviour = self::MERGE_CELL_CONTENT_EMPTY) + public function mergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2, $behavior = self::MERGE_CELL_CONTENT_EMPTY) { $cellRange = new CellRange( CellAddress::fromColumnAndRow($columnIndex1, $row1), CellAddress::fromColumnAndRow($columnIndex2, $row2) ); - return $this->mergeCells($cellRange, $behaviour); + return $this->mergeCells($cellRange, $behavior); } /** @@ -1956,7 +1956,7 @@ class Worksheet implements IComparable { $range = Functions::trimSheetFromCellReference(Validations::validateCellRange($range)); - if (strpos($range, ':') !== false) { + if (\strpos($range, ':') !== false) { if (isset($this->mergeCells[$range])) { unset($this->mergeCells[$range]); } else { @@ -2151,7 +2151,7 @@ class Worksheet implements IComparable */ public function setAutoFilter($autoFilterOrRange) { - if (is_object($autoFilterOrRange) && ($autoFilterOrRange instanceof AutoFilter)) { + if (\is_object($autoFilterOrRange) && ($autoFilterOrRange instanceof AutoFilter)) { $this->autoFilter = $autoFilterOrRange; } else { $cellRange = Functions::trimSheetFromCellReference(Validations::validateCellRange($autoFilterOrRange)); @@ -2201,7 +2201,7 @@ class Worksheet implements IComparable /** * Get collection of Tables. * - * @return ArrayObject + * @return \ArrayObject */ public function getTableCollection() { @@ -2289,7 +2289,7 @@ class Worksheet implements IComparable */ public function removeTableCollection(): self { - $this->tableCollection = new ArrayObject(); + $this->tableCollection = new \ArrayObject(); return $this; } @@ -2420,7 +2420,7 @@ class Worksheet implements IComparable */ public function insertNewColumnBefore($before, $numberOfColumns = 1) { - if (!is_numeric($before)) { + if (!\is_numeric($before)) { $objReferenceHelper = ReferenceHelper::getInstance(); $objReferenceHelper->insertNewBefore($before . '1', $numberOfColumns, 0, $this); } else { @@ -2513,7 +2513,7 @@ class Worksheet implements IComparable */ public function removeColumn($column, $numberOfColumns = 1) { - if (is_numeric($column)) { + if (\is_numeric($column)) { throw new Exception('Column references should not be numeric.'); } @@ -2535,7 +2535,7 @@ class Worksheet implements IComparable $maxPossibleColumnsToBeRemoved = $highestColumnIndex - $pColumnIndex + 1; - for ($c = 0, $n = min($maxPossibleColumnsToBeRemoved, $numberOfColumns); $c < $n; ++$c) { + for ($c = 0, $n = \min($maxPossibleColumnsToBeRemoved, $numberOfColumns); $c < $n; ++$c) { $this->getCellCollection()->removeColumn($highestColumn); $highestColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($highestColumn) - 1); } @@ -2730,7 +2730,7 @@ class Worksheet implements IComparable if (Coordinate::coordinateIsRange($cellAddress)) { throw new Exception('Cell coordinate string can not be a range of cells.'); - } elseif (strpos($cellAddress, '$') !== false) { + } elseif (\strpos($cellAddress, '$') !== false) { throw new Exception('Cell coordinate string must not be absolute.'); } elseif ($cellAddress == '') { throw new Exception('Cell coordinate can not be zero-length string.'); @@ -2755,7 +2755,7 @@ class Worksheet implements IComparable if (Coordinate::coordinateIsRange($cellAddress)) { throw new Exception('Cell coordinate string can not be a range of cells.'); - } elseif (strpos($cellAddress, '$') !== false) { + } elseif (\strpos($cellAddress, '$') !== false) { throw new Exception('Cell coordinate string must not be absolute.'); } elseif ($cellAddress == '') { throw new Exception('Cell coordinate can not be zero-length string.'); @@ -2832,7 +2832,7 @@ class Worksheet implements IComparable */ public function setSelectedCells($coordinate) { - if (is_string($coordinate)) { + if (\is_string($coordinate)) { $coordinate = Validations::definedNameToCoordinate($coordinate, $this); } $coordinate = Validations::validateCellOrCellRange($coordinate); @@ -2903,7 +2903,7 @@ class Worksheet implements IComparable public function fromArray(array $source, $nullValue = null, $startCell = 'A1', $strictNullComparison = false) { // Convert a 1-D array to 2-D (for ease of looping) - if (!is_array(end($source))) { + if (!\is_array(\end($source))) { $source = [$source]; } @@ -3052,8 +3052,8 @@ class Worksheet implements IComparable $namedRange = $this->validateNamedRange($definedName); $workSheet = $namedRange->getWorksheet(); /** @phpstan-ignore-next-line */ - $cellRange = ltrim(substr($namedRange->getValue(), strrpos($namedRange->getValue(), '!')), '!'); - $cellRange = str_replace('$', '', $cellRange); + $cellRange = \ltrim(\substr($namedRange->getValue(), \strrpos($namedRange->getValue(), '!')), '!'); + $cellRange = \str_replace('$', '', $cellRange); return $workSheet->rangeToArray($cellRange, $nullValue, $calculateFormulas, $formatData, $returnCellRef); } @@ -3125,12 +3125,12 @@ class Worksheet implements IComparable // Loop through column dimensions foreach ($this->columnDimensions as $dimension) { - $highestColumn = max($highestColumn, Coordinate::columnIndexFromString($dimension->getColumnIndex())); + $highestColumn = \max($highestColumn, Coordinate::columnIndexFromString($dimension->getColumnIndex())); } // Loop through row dimensions foreach ($this->rowDimensions as $dimension) { - $highestRow = max($highestRow, $dimension->getRowIndex()); + $highestRow = \max($highestRow, $dimension->getRowIndex()); } // Cache values @@ -3153,7 +3153,7 @@ class Worksheet implements IComparable public function getHashCode() { if ($this->dirty) { - $this->hash = md5($this->title . $this->autoFilter . ($this->protection->isProtectionEnabled() ? 't' : 'f') . __CLASS__); + $this->hash = \md5($this->title . $this->autoFilter . ($this->protection->isProtectionEnabled() ? 't' : 'f') . __CLASS__); $this->dirty = false; } @@ -3182,15 +3182,15 @@ class Worksheet implements IComparable } // Sheet title included? - if (($sep = strrpos($range, '!')) === false) { + if (($sep = \strrpos($range, '!')) === false) { return $returnRange ? ['', $range] : ''; } if ($returnRange) { - return [substr($range, 0, $sep), substr($range, $sep + 1)]; + return [\substr($range, 0, $sep), \substr($range, $sep + 1)]; } - return substr($range, $sep + 1); + return \substr($range, $sep + 1); } /** @@ -3326,7 +3326,7 @@ class Worksheet implements IComparable $maxRow = $this->getHighestRow(); $maxCol = Coordinate::columnIndexFromString($maxCol); - $rangeBlocks = explode(' ', $range); + $rangeBlocks = \explode(' ', $range); foreach ($rangeBlocks as &$rangeSet) { $rangeBoundaries = Coordinate::getRangeBoundaries($rangeSet); @@ -3346,7 +3346,7 @@ class Worksheet implements IComparable } unset($rangeSet); - return implode(' ', $rangeBlocks); + return \implode(' ', $rangeBlocks); } /** @@ -3466,15 +3466,15 @@ class Worksheet implements IComparable continue; } - if (is_object($val) || (is_array($val))) { + if (\is_object($val) || (\is_array($val))) { if ($key == 'cellCollection') { $newCollection = $this->cellCollection->cloneCellCollection($this); $this->cellCollection = $newCollection; } elseif ($key == 'drawingCollection') { $currentCollection = $this->drawingCollection; - $this->drawingCollection = new ArrayObject(); + $this->drawingCollection = new \ArrayObject(); foreach ($currentCollection as $item) { - if (is_object($item)) { + if (\is_object($item)) { $newDrawing = clone $item; $newDrawing->setWorksheet($this); } @@ -3484,7 +3484,7 @@ class Worksheet implements IComparable $this->autoFilter = $newAutoFilter; $this->autoFilter->setParent($this); } else { - $this->{$key} = unserialize(serialize($val)); + $this->{$key} = \unserialize(\serialize($val)); } } } @@ -3508,7 +3508,7 @@ class Worksheet implements IComparable } if ($validate) { - $codeName = str_replace(' ', '_', $codeName); //Excel does this automatically without flinching, we are doing the same + $codeName = \str_replace(' ', '_', $codeName); //Excel does this automatically without flinching, we are doing the same // Syntax check // throw an exception if not valid @@ -3570,6 +3570,6 @@ class Worksheet implements IComparable public static function nameRequiresQuotes(string $sheetName): bool { - return preg_match(self::SHEET_NAME_REQUIRES_NO_QUOTES, $sheetName) !== 1; + return \preg_match(self::SHEET_NAME_REQUIRES_NO_QUOTES, $sheetName) !== 1; } } diff --git a/PhpOffice/PhpSpreadsheet/Writer/BaseWriter.php b/PhpOffice/PhpSpreadsheet/Writer/BaseWriter.php index f903e93..985243c 100755 --- a/PhpOffice/PhpSpreadsheet/Writer/BaseWriter.php +++ b/PhpOffice/PhpSpreadsheet/Writer/BaseWriter.php @@ -79,7 +79,7 @@ abstract class BaseWriter implements IWriter $this->useDiskCaching = $useDiskCache; if ($cacheDirectory !== null) { - if (is_dir($cacheDirectory)) { + if (\is_dir($cacheDirectory)) { $this->diskCachingDirectory = $cacheDirectory; } else { throw new Exception("Directory does not exist: $cacheDirectory"); @@ -111,7 +111,7 @@ abstract class BaseWriter implements IWriter */ public function openFileHandle($filename): void { - if (is_resource($filename)) { + if (\is_resource($filename)) { $this->fileHandle = $filename; $this->shouldCloseFile = false; @@ -119,13 +119,13 @@ abstract class BaseWriter implements IWriter } $mode = 'wb'; - $scheme = parse_url($filename, PHP_URL_SCHEME); + $scheme = \parse_url($filename, PHP_URL_SCHEME); if ($scheme === 's3') { // @codeCoverageIgnoreStart $mode = 'w'; // @codeCoverageIgnoreEnd } - $fileHandle = $filename ? fopen($filename, $mode) : false; + $fileHandle = $filename ? \fopen($filename, $mode) : false; if ($fileHandle === false) { throw new Exception('Could not open file "' . $filename . '" for writing.'); } @@ -140,7 +140,7 @@ abstract class BaseWriter implements IWriter protected function maybeCloseFileHandle(): void { if ($this->shouldCloseFile) { - if (!fclose($this->fileHandle)) { + if (!\fclose($this->fileHandle)) { throw new Exception('Could not close file after writing.'); } } diff --git a/PhpOffice/PhpSpreadsheet/Writer/Csv.php b/PhpOffice/PhpSpreadsheet/Writer/Csv.php index 8f0ceda..01b3cba 100755 --- a/PhpOffice/PhpSpreadsheet/Writer/Csv.php +++ b/PhpOffice/PhpSpreadsheet/Writer/Csv.php @@ -109,12 +109,12 @@ class Csv extends BaseWriter if ($this->useBOM) { // Write the UTF-8 BOM code if required - fwrite($this->fileHandle, "\xEF\xBB\xBF"); + \fwrite($this->fileHandle, "\xEF\xBB\xBF"); } if ($this->includeSeparatorLine) { // Write the separator line if required - fwrite($this->fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding); + \fwrite($this->fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding); } // Identify the range that we need to extract from the worksheet @@ -273,7 +273,7 @@ class Csv extends BaseWriter */ private static function elementToString($element): string { - if (is_bool($element)) { + if (\is_bool($element)) { return $element ? 'TRUE' : 'FALSE'; } @@ -304,10 +304,10 @@ class Csv extends BaseWriter if ($enclosure) { // If enclosure is not required, use enclosure only if // element contains newline, delimiter, or enclosure. - if (!$this->enclosureRequired && strpbrk($element, "$delimiter$enclosure\n") === false) { + if (!$this->enclosureRequired && \strpbrk($element, "$delimiter$enclosure\n") === false) { $enclosure = ''; } else { - $element = str_replace($enclosure, $enclosure . $enclosure, $element); + $element = \str_replace($enclosure, $enclosure . $enclosure, $element); } } // Add enclosed string @@ -319,8 +319,8 @@ class Csv extends BaseWriter // Write to file if ($this->outputEncoding != '') { - $line = mb_convert_encoding($line, $this->outputEncoding); + $line = \mb_convert_encoding($line, $this->outputEncoding); } - fwrite($fileHandle, /** @scrutinizer ignore-type */ $line); + \fwrite($fileHandle, /** @scrutinizer ignore-type */ $line); } } diff --git a/PhpOffice/PhpSpreadsheet/Writer/Html.php b/PhpOffice/PhpSpreadsheet/Writer/Html.php index 0fef0f6..f7118ec 100755 --- a/PhpOffice/PhpSpreadsheet/Writer/Html.php +++ b/PhpOffice/PhpSpreadsheet/Writer/Html.php @@ -170,7 +170,7 @@ class Html extends BaseWriter $this->openFileHandle($filename); // Write html - fwrite($this->fileHandle, $this->generateHTMLAll()); + \fwrite($this->fileHandle, $this->generateHTMLAll()); // Close file $this->maybeCloseFileHandle(); @@ -279,7 +279,7 @@ class Html extends BaseWriter */ private function mapBorderStyle($borderStyle) { - return array_key_exists($borderStyle, self::BORDER_ARR) ? self::BORDER_ARR[$borderStyle] : '1px solid'; + return \array_key_exists($borderStyle, self::BORDER_ARR) ? self::BORDER_ARR[$borderStyle] : '1px solid'; } /** @@ -343,7 +343,7 @@ class Html extends BaseWriter private static function generateMeta(?string $val, string $desc): string { return $val - ? (' ' . PHP_EOL) + ? (' ' . PHP_EOL) : ''; } @@ -365,7 +365,7 @@ class Html extends BaseWriter $html .= ' ' . PHP_EOL; $html .= ' ' . PHP_EOL; $html .= ' ' . PHP_EOL; - $html .= ' ' . htmlspecialchars($properties->getTitle(), Settings::htmlEntityFlags()) . '' . PHP_EOL; + $html .= ' ' . \htmlspecialchars($properties->getTitle(), Settings::htmlEntityFlags()) . '' . PHP_EOL; $html .= self::generateMeta($properties->getCreator(), 'author'); $html .= self::generateMeta($properties->getTitle(), 'title'); $html .= self::generateMeta($properties->getDescription(), 'description'); @@ -450,7 +450,7 @@ class Html extends BaseWriter $html .= $this->generateTableHeader($sheet); // Get worksheet dimension - [$min, $max] = explode(':', $sheet->calculateWorksheetDataDimension()); + [$min, $max] = \explode(':', $sheet->calculateWorksheetDataDimension()); [$minCol, $minRow] = Coordinate::indexesFromString($min); [$maxCol, $maxRow] = Coordinate::indexesFromString($max); @@ -516,7 +516,7 @@ class Html extends BaseWriter $html = ''; // Only if there are more than 1 sheets - if (count($sheets) > 1) { + if (\count($sheets) > 1) { // Loop all sheets $sheetId = 0; @@ -619,9 +619,9 @@ class Html extends BaseWriter public static function winFileToUrl($filename, bool $mpdf = false) { // Windows filename - if (substr($filename, 1, 2) === ':\\') { + if (\substr($filename, 1, 2) === ':\\') { $protocol = $mpdf ? '' : 'file:///'; - $filename = $protocol . str_replace('\\', '/', $filename); + $filename = $protocol . \str_replace('\\', '/', $filename); } return $filename; @@ -646,31 +646,31 @@ class Html extends BaseWriter continue; } $filedesc = $drawing->getDescription(); - $filedesc = $filedesc ? htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded image'; + $filedesc = $filedesc ? \htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded image'; if ($drawing instanceof Drawing) { $filename = $drawing->getPath(); // Strip off eventual '.' - $filename = (string) preg_replace('/^[.]/', '', $filename); + $filename = (string) \preg_replace('/^[.]/', '', $filename); // Prepend images root $filename = $this->getImagesRoot() . $filename; // Strip off eventual '.' if followed by non-/ - $filename = (string) preg_replace('@^[.]([^/])@', '$1', $filename); + $filename = (string) \preg_replace('@^[.]([^/])@', '$1', $filename); // Convert UTF8 data to PCDATA - $filename = htmlspecialchars($filename, Settings::htmlEntityFlags()); + $filename = \htmlspecialchars($filename, Settings::htmlEntityFlags()); $html .= PHP_EOL; $imageData = self::winFileToUrl($filename, $this->isMPdf); - if ($this->embedImages || substr($imageData, 0, 6) === 'zip://') { - $picture = @file_get_contents($filename); + if ($this->embedImages || \substr($imageData, 0, 6) === 'zip://') { + $picture = @\file_get_contents($filename); if ($picture !== false) { - $imageDetails = getimagesize($filename) ?: []; + $imageDetails = \getimagesize($filename) ?: []; // base64 encode the binary data - $base64 = base64_encode($picture); + $base64 = \base64_encode($picture); $imageData = 'data:' . $imageDetails['mime'] . ';base64,' . $base64; } } @@ -682,12 +682,12 @@ class Html extends BaseWriter } elseif ($drawing instanceof MemoryDrawing) { $imageResource = $drawing->getImageResource(); if ($imageResource) { - ob_start(); // Let's start output buffering. - imagepng($imageResource); // This will normally output the image, but because of ob_start(), it won't. - $contents = (string) ob_get_contents(); // Instead, output above is saved to $contents - ob_end_clean(); // End the output buffer. + \ob_start(); // Let's start output buffering. + \imagepng($imageResource); // This will normally output the image, but because of ob_start(), it won't. + $contents = (string) \ob_get_contents(); // Instead, output above is saved to $contents + \ob_end_clean(); // End the output buffer. - $dataUri = 'data:image/png;base64,' . base64_encode($contents); + $dataUri = 'data:image/png;base64,' . \base64_encode($contents); // Because of the nature of tables, width is more important than height. // max-width: 100% ensures that image doesnt overflow containing cell @@ -716,24 +716,24 @@ class Html extends BaseWriter if ($chart instanceof Chart) { $chartCoordinates = $chart->getTopLeftPosition(); if ($chartCoordinates['cell'] == $coordinates) { - $chartFileName = File::sysGetTempDir() . '/' . uniqid('', true) . '.png'; + $chartFileName = File::sysGetTempDir() . '/' . \uniqid('', true) . '.png'; if (!$chart->render($chartFileName)) { return ''; } $html .= PHP_EOL; - $imageDetails = getimagesize($chartFileName) ?: []; + $imageDetails = \getimagesize($chartFileName) ?: []; $filedesc = $chart->getTitle(); $filedesc = $filedesc ? $filedesc->getCaptionText() : ''; - $filedesc = $filedesc ? htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded chart'; - $picture = file_get_contents($chartFileName); + $filedesc = $filedesc ? \htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded chart'; + $picture = \file_get_contents($chartFileName); if ($picture !== false) { - $base64 = base64_encode($picture); + $base64 = \base64_encode($picture); $imageData = 'data:' . $imageDetails['mime'] . ';base64,' . $base64; $html .= '' . $filedesc . '' . PHP_EOL; } - unlink($chartFileName); + \unlink($chartFileName); } } } @@ -760,7 +760,7 @@ class Html extends BaseWriter // Start styles if ($generateSurroundingHTML) { $html .= '